From 5af3b51d401dfe2ce5c00c3ec26f6eddeb21f666 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 1 Feb 2018 15:18:21 +0000 Subject: [PATCH 001/539] Added missing message class for HTTP demo. --- .../lec1/httplong/message/client/Cookie.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/client/Cookie.java diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/client/Cookie.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/client/Cookie.java new file mode 100644 index 000000000..fb672a646 --- /dev/null +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/client/Cookie.java @@ -0,0 +1,27 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package betty16.lec1.httplong.message.client; + +import betty16.lec1.httplong.HttpLong.Http.Http; +import betty16.lec1.httplong.message.HeaderField; + +public class Cookie extends HeaderField +{ + private static final long serialVersionUID = 1L; + + public Cookie(String val) + { + super(Http.COOKIE, val); + } +} From 7ea4f4c000ed08135919f5f8ad3a6887c52b426f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 14 Feb 2018 14:45:11 +0000 Subject: [PATCH 002/539] Initial -spin functionality. --- .../main/java/org/scribble/cli/CLArgFlag.java | 1 + .../java/org/scribble/cli/CLArgParser.java | 3 + .../java/org/scribble/cli/CommandLine.java | 8 +- .../java/org/scribble/main/MainContext.java | 14 +- .../scribble/del/global/GProtocolDeclDel.java | 177 +++++++++++++++++- .../src/main/java/org/scribble/main/Job.java | 4 +- .../java/org/scribble/model/MPrettyPrint.java | 2 +- .../java/org/scribble/model/MPrettyState.java | 4 +- .../org/scribble/model/endpoint/EGraph.java | 6 + .../org/scribble/model/endpoint/EState.java | 82 ++++++++ scribble-core/src/test/scrib/tmp/Test.scr | 58 +++++- 11 files changed, 338 insertions(+), 21 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java index e14cf7ded..052832dd5 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java @@ -31,6 +31,7 @@ public enum CLArgFlag AUT, NO_VALIDATION, INLINE_MAIN_MOD, + SPIN, // Non-unique flags PROJECT, diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java index e14bd49db..93f3c0ce3 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java @@ -37,6 +37,7 @@ public class CLArgParser public static final String AUT_FLAG = "-aut"; public static final String NO_VALIDATION_FLAG = "-novalid"; public static final String INLINE_MAIN_MOD_FLAG = "-inline"; + public static final String SPIN = "-spin"; // Non-unique flags public static final String PROJECT_FLAG = "-project"; @@ -70,6 +71,7 @@ public class CLArgParser CLArgParser.UNIQUE_FLAGS.put(CLArgParser.AUT_FLAG, CLArgFlag.AUT); CLArgParser.UNIQUE_FLAGS.put(CLArgParser.NO_VALIDATION_FLAG, CLArgFlag.NO_VALIDATION); CLArgParser.UNIQUE_FLAGS.put(CLArgParser.INLINE_MAIN_MOD_FLAG, CLArgFlag.INLINE_MAIN_MOD); + CLArgParser.UNIQUE_FLAGS.put(CLArgParser.SPIN, CLArgFlag.SPIN); } private static final Map NON_UNIQUE_FLAGS = new HashMap<>(); @@ -186,6 +188,7 @@ protected int parseFlag(int i) throws CommandLineException case CLArgParser.NO_LOCAL_CHOICE_SUBJECT_CHECK: case CLArgParser.NO_ACCEPT_CORRELATION_CHECK: case CLArgParser.NO_VALIDATION_FLAG: + case CLArgParser.SPIN: { checkAndAddNoArgUniqueFlag(flag); return i; diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 20f9ebfca..71528c40f 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -75,6 +75,7 @@ protected MainContext newMainContext() throws ScribParserException, ScribbleExce boolean noLocalChoiceSubjectCheck = this.args.containsKey(CLArgFlag.NO_LOCAL_CHOICE_SUBJECT_CHECK); boolean noAcceptCorrelationCheck = this.args.containsKey(CLArgFlag.NO_ACCEPT_CORRELATION_CHECK); boolean noValidation = this.args.containsKey(CLArgFlag.NO_VALIDATION); + boolean spin = this.args.containsKey(CLArgFlag.SPIN); List impaths = this.args.containsKey(CLArgFlag.IMPORT_PATH) ? CommandLine.parseImportPaths(this.args.get(CLArgFlag.IMPORT_PATH)[0]) @@ -83,14 +84,14 @@ protected MainContext newMainContext() throws ScribParserException, ScribbleExce if (this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) { return new MainContext(debug, locator, this.args.get(CLArgFlag.INLINE_MAIN_MOD)[0], useOldWF, noLiveness, minEfsm, fair, - noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation); + noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); } else { Path mainpath = CommandLine.parseMainPath(this.args.get(CLArgFlag.MAIN_MOD)[0]); //return new MainContext(jUnit, debug, locator, mainpath, useOldWF, noLiveness); return new MainContext(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, - noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation); + noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); } } @@ -283,7 +284,8 @@ private void printProjections(Job job) throws CommandLineException, ScribbleExce private void printEGraph(Job job, boolean forUser, boolean fair) throws ScribbleException, CommandLineException { JobContext jcontext = job.getContext(); - String[] args = forUser ? this.args.get(CLArgFlag.EFSM) : (fair ? this.args.get(CLArgFlag.VALIDATION_EFSM) : this.args.get(CLArgFlag.UNFAIR_EFSM)); + String[] args = forUser ? this.args.get(CLArgFlag.EFSM) : + (fair ? this.args.get(CLArgFlag.VALIDATION_EFSM) : this.args.get(CLArgFlag.UNFAIR_EFSM)); for (int i = 0; i < args.length; i += 2) { GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); diff --git a/scribble-cli/src/main/java/org/scribble/main/MainContext.java b/scribble-cli/src/main/java/org/scribble/main/MainContext.java index 09fb36260..048d6fa9b 100644 --- a/scribble-cli/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-cli/src/main/java/org/scribble/main/MainContext.java @@ -66,6 +66,7 @@ public class MainContext public final boolean noLocalChoiceSubjectCheck; public final boolean noAcceptCorrelationCheck; public final boolean noValidation; + public final boolean spin; private final ResourceLocator locator; // Path -> Resource private final ScribModuleLoader loader; // sesstype.ModuleName -> Pair @@ -78,7 +79,7 @@ public class MainContext // FIXME: make Path abstract as e.g. URI -- locator is abstract but Path is coupled to concrete DirectoryResourceLocator private MainContext(boolean debug, ResourceLocator locator, boolean useOldWF, boolean noLiveness, boolean minEfsm, - boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation) + boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) throws ScribParserException, ScribbleException { //this.jUnit = jUnit; @@ -90,6 +91,7 @@ private MainContext(boolean debug, ResourceLocator locator, boolean useOldWF, bo this.noLocalChoiceSubjectCheck = noLocalChoiceSubjectCheck; this.noAcceptCorrelationCheck = noAcceptCorrelationCheck; this.noValidation = noValidation; + this.spin = spin; this.locator = locator; this.loader = new ScribModuleLoader(this.locator, this.antlrParser, this.scribParser); @@ -97,10 +99,10 @@ private MainContext(boolean debug, ResourceLocator locator, boolean useOldWF, bo // Load main module from file system public MainContext(boolean debug, ResourceLocator locator, Path mainpath, boolean useOldWF, boolean noLiveness, boolean minEfsm, - boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation) + boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) throws ScribParserException, ScribbleException { - this(debug, locator, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation); + this(debug, locator, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); // FIXME: checking main module resource exists at specific location should be factored out to front-end (e.g. CommandLine) -- main module resource is specified at local front end level of abstraction, while MainContext uses abstract resource loading //Pair p = this.loader.loadMainModule(mainpath); @@ -113,10 +115,10 @@ public MainContext(boolean debug, ResourceLocator locator, Path mainpath, boolea // For inline module arg public MainContext(boolean debug, ResourceLocator locator, String inline, boolean useOldWF, boolean noLiveness, boolean minEfsm, - boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation) + boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) throws ScribParserException, ScribbleException { - this(debug, locator, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation); + this(debug, locator, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); Resource res = new InlineResource(inline); Module mod = (Module) this.scribParser.parse(this.antlrParser.parseAntlrTree(res), this.af); @@ -135,7 +137,7 @@ private void init(Resource res, Module mainmod) throws ScribParserException, Scr public Job newJob() { return new Job(this.debug, this.getParsedModules(), this.main, this.useOldWF, this.noLiveness, this.minEfsm, this.fair, - this.noLocalChoiceSubjectCheck, this.noAcceptCorrelationCheck, this.noValidation, + this.noLocalChoiceSubjectCheck, this.noAcceptCorrelationCheck, this.noValidation, this.spin, this.af, this.ef, this.sf); } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 1e39d9e5e..248139495 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -13,9 +13,16 @@ */ package org.scribble.del.global; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import org.scribble.ast.AstFactory; import org.scribble.ast.Module; @@ -35,14 +42,20 @@ import org.scribble.main.Job; import org.scribble.main.JobContext; import org.scribble.main.ScribbleException; +import org.scribble.model.MState; +import org.scribble.model.endpoint.EGraph; +import org.scribble.model.endpoint.EState; import org.scribble.model.global.SGraph; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.MessageId; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; +import org.scribble.util.ScribUtil; import org.scribble.visit.context.Projector; import org.scribble.visit.context.ProtocolDeclContextBuilder; import org.scribble.visit.context.env.ProjectionEnv; +import org.scribble.visit.util.MessageIdCollector; import org.scribble.visit.util.RoleCollector; import org.scribble.visit.validation.GProtocolValidator; @@ -141,20 +154,174 @@ public void enterValidation(ScribNode parent, ScribNode child, GProtocolValidato } GProtocolName fullname = gpd.getFullMemberName((Module) parent); - validate(checker.job, fullname, true); - if (!checker.job.fair) + if (checker.job.spin) { - checker.job.debugPrintln("(" + fullname + ") Validating with \"unfair\" output choices.. "); - validate(checker.job, fullname, false); // FIXME: only need to check progress, not full validation + if (checker.job.fair) + { + throw new RuntimeException("TODO"); + } + validateBySpin(checker.job, fullname); + } + else + { + validateByScribble(checker.job, fullname, true); + if (!checker.job.fair) + { + checker.job.debugPrintln("(" + fullname + ") Validating with \"unfair\" output choices.. "); + validateByScribble(checker.job, fullname, false); // FIXME: only need to check progress, not full validation + } } } - private static void validate(Job job, GProtocolName fullname, boolean fair) throws ScribbleException + private static void validateByScribble(Job job, GProtocolName fullname, boolean fair) throws ScribbleException { JobContext jc = job.getContext(); SGraph graph = (fair) ? jc.getSGraph(fullname) : jc.getUnfairSGraph(fullname); //graph.toModel().validate(job); job.sf.newSModel(graph).validate(job); } + + private static void validateBySpin(Job job, GProtocolName fullname) throws ScribbleException + { + JobContext jc = job.getContext(); + Module mod = jc.getModule(fullname.getPrefix()); + GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDecl(fullname.getSimpleName()); + + List rs = gpd.header.roledecls.getRoles().stream() + .sorted(Comparator.comparing(Role::toString)).collect(Collectors.toList()); + + MessageIdCollector coll = new MessageIdCollector(job, ((ModuleDel) mod.del()).getModuleContext()); + gpd.accept(coll); + Set> mids = coll.getNames(); + + String pml = ""; + pml += "mtype {" + mids.stream().map(mid -> mid.toString()).collect(Collectors.joining(", ")) + "};\n"; + + // FIXME: explicit + + pml += "\n"; + List pairs = new LinkedList<>(); + for (Role r1 : rs) + { + for (Role r2 : rs) + { + if (!r1.equals(r2)) + { + pairs.add(new Role[] {r1, r2}); + } + } + } + //for (Role[] p : (Iterable) () -> pairs.stream().sorted().iterator()) + for (Role[] p : pairs) + { + pml += "chan s_" + p[0] + "_" + p[1] + " = [1] of { mtype };\n"; + } + + for (Role r : rs) + { + pml += "\n\n" + jc.getEGraph(fullname, r).toPml(r); + } + + List labs = new LinkedList<>(); + for (Role r : rs) + { + Set tmp = new HashSet<>(); + EGraph g = jc.getEGraph(fullname, r); + tmp.add(g.init); + tmp.addAll(MState.getReachableStates(g.init)); + if (g.term != null) + { + tmp.remove(g.term); + } + tmp.forEach( // Throws exception, cannot use flatMap + s -> labs.add("!<>[]" + r + "@" + (s.isTerminal() ? "end" : "label") + r + s.id) // FIXME: factor out + ); + } + /*pml += "\n\nltl {\n" + labs.stream().collect(Collectors.joining(" && ")) + "\n" + "}"; + + System.out.println("aaa: " + pml + "\n"); + if (!runSpin(pml)) + { + throw new ScribbleException("Protocol not valid:\n" + gpd); + }*/ + System.out.println("aaa: " + pml + "\n"); + /*for (String lab : labs) + { + System.out.println("bbb: " + lab); + String run = pml + "\n\nltl {\n" + lab + "\n" + "}"; + if (!runSpin(run)) + { + throw new ScribbleException("Protocol not valid:\n" + gpd); + } + }*/ + int batch = 10; + for (int i = 0; i < labs.size(); ) + { + int j = (i+batch < labs.size()) ? i+batch : labs.size(); + String foo = labs.subList(i, j).stream().collect(Collectors.joining(" && ")); + System.out.println("bbb: " + foo); + String run = pml + "\n\nltl {\n" + foo + "\n" + "}"; + if (!runSpin(run)) + { + throw new ScribbleException("Protocol not valid:\n" + gpd); + } + i += batch; + } + } + + // FIXME: move + private static boolean runSpin(String pml) //throws ScribbleException + { + File tmp; + try + { + tmp = File.createTempFile("gpd.header.name", ".pml.tmp"); + try + { + String tmpName = tmp.getAbsolutePath(); + ScribUtil.writeToFile(tmpName, pml); + String[] res = ScribUtil.runProcess("spin", "-a", tmpName); + res[0] = res[0].replaceAll("(?m)^ltl.*$", ""); + res[1] = res[1].replace("'gcc-4' is not recognized as an internal or external command,\noperable program or batch file.", ""); + res[1] = res[1].replace("'gcc-3' is not recognized as an internal or external command,\noperable program or batch file.", ""); + res[0] = res[0].trim(); + res[1] = res[1].trim(); + if (!res[0].trim().isEmpty() || !res[1].trim().isEmpty()) + { + //throw new RuntimeException("[scrib] : " + Arrays.toString(res[0].getBytes()) + "\n" + Arrays.toString(res[1].getBytes())); + throw new RuntimeException("[scrib-Spin] [spin]: " + res[0] + "\n" + res[1]); + } + res = ScribUtil.runProcess("gcc", "-o", "pan", "pan.c"); + res[0] = res[0].trim(); + res[1] = res[1].trim(); + if (!res[0].isEmpty() || !res[1].isEmpty()) + { + throw new RuntimeException("[scrib-Spin] [gcc]: " + res[0] + "\n" + res[1]); + } + res = ScribUtil.runProcess("pan", "-a", "-f"); + res[1] = res[1].replace("warning: no accept labels are defined, so option -a has no effect (ignored)", ""); + res[0] = res[0].trim(); + res[1] = res[1].trim(); + if (res[0].contains("error,") || !res[1].isEmpty()) + { + throw new RuntimeException("[scrib-Spin] [pan]: " + res[0] + "\n" + res[1]); + } + int err = res[0].indexOf("errors: "); + return (res[0].charAt(err + 8) == '0'); + } + catch (ScribbleException e) + { + throw new RuntimeException(e); + } + finally + { + tmp.delete(); + } + } + catch (IOException e) + { + throw new RuntimeException(e); + } + } } diff --git a/scribble-core/src/main/java/org/scribble/main/Job.java b/scribble-core/src/main/java/org/scribble/main/Job.java index 8eeb02980..a3745c880 100644 --- a/scribble-core/src/main/java/org/scribble/main/Job.java +++ b/scribble-core/src/main/java/org/scribble/main/Job.java @@ -62,6 +62,7 @@ public class Job public final boolean noLocalChoiceSubjectCheck; public final boolean noAcceptCorrelationCheck; public final boolean noValidation; + public final boolean spin; private final JobContext jcontext; // Mutable (Visitor passes replace modules) @@ -75,7 +76,7 @@ public class Job //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) public Job(boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, - boolean noAcceptCorrelationCheck, boolean noValidation, + boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin, AstFactory af, EModelFactory ef, SModelFactory sf) { //this.jUnit = jUnit; @@ -87,6 +88,7 @@ public Job(boolean debug, Map parsed, ModuleName main, this.noLocalChoiceSubjectCheck = noLocalChoiceSubjectCheck; this.noAcceptCorrelationCheck = noAcceptCorrelationCheck; this.noValidation = noValidation; + this.spin = spin; this.af = af; this.ef = ef; diff --git a/scribble-core/src/main/java/org/scribble/model/MPrettyPrint.java b/scribble-core/src/main/java/org/scribble/model/MPrettyPrint.java index caf9335f2..8ddc261f1 100644 --- a/scribble-core/src/main/java/org/scribble/model/MPrettyPrint.java +++ b/scribble-core/src/main/java/org/scribble/model/MPrettyPrint.java @@ -16,5 +16,5 @@ public interface MPrettyPrint { String toDot(); - String toAut(); + String toAut(); // FIXME: should not be a pretty print method? } diff --git a/scribble-core/src/main/java/org/scribble/model/MPrettyState.java b/scribble-core/src/main/java/org/scribble/model/MPrettyState.java index 30f65b294..6454b51c9 100644 --- a/scribble-core/src/main/java/org/scribble/model/MPrettyState.java +++ b/scribble-core/src/main/java/org/scribble/model/MPrettyState.java @@ -34,10 +34,11 @@ public String toLongString() { String s = "\"" + this.id + "\":["; Iterator ss = this.succs.iterator(); - s += this.actions.stream().map((a) -> a + "=\"" + ss.next().id + "\"").collect(Collectors.joining(", ")); + s += this.actions.stream().map(a -> a + "=\"" + ss.next().id + "\"").collect(Collectors.joining(", ")); return s + "]"; } + // Move up to MState? @Override public final String toDot() { @@ -105,6 +106,7 @@ protected String getEdgeLabel(A msg) return "label=\"" + msg + "\""; } + // Move up to MState? @Override public final String toAut() { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraph.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraph.java index 19e2180e0..d83fb87f8 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraph.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraph.java @@ -14,6 +14,7 @@ package org.scribble.model.endpoint; import org.scribble.model.MPrettyPrint; +import org.scribble.type.name.Role; public class EGraph implements MPrettyPrint { @@ -31,6 +32,11 @@ public EFSM toFsm() { return new EFSM(this); } + + public String toPml(Role r) + { + return this.init.toPml(r); + } @Override public String toAut() diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java index 0c22bf16b..3e24e534b 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import org.scribble.main.ScribbleException; import org.scribble.model.MPrettyState; @@ -29,6 +30,7 @@ import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; // Label types used to be both RecVar and SubprotocolSigs; now using inlined protocol for FSM building so just RecVar public class EState extends MPrettyState @@ -38,6 +40,86 @@ protected EState(Set labs) super(labs); } + public String toPml(Role r) + { + Map seen = new HashMap<>(); + return + "active proctype " + r + "() {\n" + + toPml(seen, r) + "\n" + + "}\n"; + } + + protected String toPml(Map seen, Role r) + { + if (seen.containsKey(this.id)) + { + //return "goto " + getLabel(seen, this.id, r) + "\n"; + return ""; + } + + String lab = getLabel(seen, this, r); + Map tmp = new HashMap<>(seen); + tmp.put(this.id, lab); + + String res = lab + ":\n"; + EStateKind kind = getStateKind(); + List as = getActions(); + if (kind == EStateKind.OUTPUT) + { + if (as.stream().anyMatch(a -> !a.isSend())) + { + throw new RuntimeException("TODO: " + as); + } + + res += //"lab" + this.id + ":\n" + "if\n" + + as.stream().map(a -> + "::\n" + + "skip ->\n" + + "s_" + r + "_" + a.peer + "!" + a.mid + ";\n" + + "goto " + getLabel(seen, getSuccessor(a), r) + "\n" + ) + .collect(Collectors.joining("")) + + "fi\n"; + } + else if (kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) + { + res += + "if\n" + + as.stream().map(a -> + "::\n" + + "s_" + a.peer + "_" + r + "?[" + a.mid + "] ->\n" + + "s_" + a.peer + "_" + r + "?" + a.mid + ";\n" + + "goto " + getLabel(seen, getSuccessor(a), r) + "\n" + ) + .collect(Collectors.joining("")) + + "fi\n"; + } + else if (kind == EStateKind.TERMINAL) + { + res += "skip\n"; + } + else + { + throw new RuntimeException("TODO: " + kind); + } + + res += as.stream().map(a -> "\n" + getSuccessor(a).toPml(tmp, r)).collect(Collectors.joining("")); + + return res; + } + + private static String getLabel(Map seen, EState s, Role r) + { + if (seen.containsKey(s.id)) + { + return seen.get(s.id); + } + String lab = (s.isTerminal() ? "end" : "label") + r + s.id; + seen.put(s.id, lab); + return lab; + } + // To be overridden by subclasses, to obtain the subclass nodes // FIXME: remove labs arg, and modify the underlying Set if needed? protected EState cloneNode(EModelFactory ef, Set labs) diff --git a/scribble-core/src/test/scrib/tmp/Test.scr b/scribble-core/src/test/scrib/tmp/Test.scr index 2ffe71835..e910aaac2 100644 --- a/scribble-core/src/test/scrib/tmp/Test.scr +++ b/scribble-core/src/test/scrib/tmp/Test.scr @@ -9,7 +9,7 @@ //http://sandbox.kidstrythisathome.com/erdos/ -module Test; +module tmp.Test; // replace a lot of FACTORY name calls by clone // -minlts states IDs don't match validation output @@ -43,6 +43,53 @@ module Test; +type "System.UInt32" from "..." as int; + +global protocol SH(role P, role R, role C) +{ + plane(int, int, int, int) from P to R; + do Loop(P, R, C); +} + +aux global protocol Loop(role P, role R, role C) +{ + choice at P + { + Above(int) from P to R; + Res(int) from R to P; + Above(int) from P to R; + Res(int) from R to P; + choice at P + { + BothIn() from P to R; + BothIn(int) from P to C; + } + or + { + BothOut() from P to R; + BothOut() from P to C; + } + or + { + Intersect() from P to R; + Res(int) from R to P; + choice at P + { + One(int) from P to C; + } + or + { + Two(int, int) from P to C; + } + } + do Loop(P, R, C); + } + or + { + Close() from P to R; + Close() from P to C; + } +} @@ -50,18 +97,21 @@ module Test; +/* global protocol Proto1(role A, role B, role C) { rec X { choice at A { - 1() from A to B; + a() from A to B; + b() from B to C; continue X; } or { - 2() from A to B; - 2() from B to C; + c() from A to B; + d() from B to C; } } } +//*/ From 6f04320d7808f14d4bca74f43d9a4a03a2cc850d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 15 Feb 2018 14:34:02 +0000 Subject: [PATCH 003/539] Continued on -spin mode. --- .../scribble/del/global/GProtocolDeclDel.java | 75 ++++++++++++------- .../org/scribble/model/endpoint/EState.java | 4 +- 2 files changed, 48 insertions(+), 31 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 248139495..27d62264f 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -15,7 +15,6 @@ import java.io.File; import java.io.IOException; -import java.util.Arrays; import java.util.Comparator; import java.util.HashSet; import java.util.LinkedList; @@ -214,7 +213,18 @@ private static void validateBySpin(Job job, GProtocolName fullname) throws Scrib //for (Role[] p : (Iterable) () -> pairs.stream().sorted().iterator()) for (Role[] p : pairs) { - pml += "chan s_" + p[0] + "_" + p[1] + " = [1] of { mtype };\n"; + pml += "chan s_" + p[0] + "_" + p[1] + " = [1] of { mtype };\n" + + "chan r_" + p[0] + "_" + p[1] + " = [1] of { mtype };\n" + + "bool empty_" + p[0] + "_" + p[1] + " = false;\n" + + "active proctype chan_" + p[0] + "_" + p[1] + "() {\n" + + "mtype m;\n" + + "end_chan_" + p[0] + "_" + p[1] + ":\n" + + "do\n" + + "::\n" + + "atomic { s_" + p[0] + "_" + p[1] + "?m; empty_" + p[0] + "_" + p[1] + " = false }\n" + + "atomic { r_" + p[0] + "_" + p[1] + "!m; empty_" + p[0] + "_" + p[1] + " = true }\n" + + "od\n" + + "}\n"; } for (Role r : rs) @@ -237,35 +247,26 @@ private static void validateBySpin(Job job, GProtocolName fullname) throws Scrib s -> labs.add("!<>[]" + r + "@" + (s.isTerminal() ? "end" : "label") + r + s.id) // FIXME: factor out ); } - /*pml += "\n\nltl {\n" + labs.stream().collect(Collectors.joining(" && ")) + "\n" + "}"; - - System.out.println("aaa: " + pml + "\n"); - if (!runSpin(pml)) + if (job.debug) { - throw new ScribbleException("Protocol not valid:\n" + gpd); - }*/ - System.out.println("aaa: " + pml + "\n"); - /*for (String lab : labs) + System.out.println("[-spin]: Promela processes\n" + pml + "\n"); + } + + int batchSize = 10; // FIXME: factor out + for (int i = 0; i < labs.size(); ) { - System.out.println("bbb: " + lab); - String run = pml + "\n\nltl {\n" + lab + "\n" + "}"; - if (!runSpin(run)) + int j = (i+batchSize < labs.size()) ? i+batchSize : labs.size(); + String batch = labs.subList(i, j).stream().collect(Collectors.joining(" && ")); + String ltl = "ltl {\n" + batch + "\n" + "}"; + if (job.debug) { - throw new ScribbleException("Protocol not valid:\n" + gpd); + System.out.println("[-spin] Batched ltl:\n" + ltl + "\n"); } - }*/ - int batch = 10; - for (int i = 0; i < labs.size(); ) - { - int j = (i+batch < labs.size()) ? i+batch : labs.size(); - String foo = labs.subList(i, j).stream().collect(Collectors.joining(" && ")); - System.out.println("bbb: " + foo); - String run = pml + "\n\nltl {\n" + foo + "\n" + "}"; - if (!runSpin(run)) + if (!runSpin(pml + "\n\n" + ltl)) { throw new ScribbleException("Protocol not valid:\n" + gpd); } - i += batch; + i += batchSize; } } @@ -289,14 +290,25 @@ private static boolean runSpin(String pml) //throws ScribbleException if (!res[0].trim().isEmpty() || !res[1].trim().isEmpty()) { //throw new RuntimeException("[scrib] : " + Arrays.toString(res[0].getBytes()) + "\n" + Arrays.toString(res[1].getBytes())); - throw new RuntimeException("[scrib-Spin] [spin]: " + res[0] + "\n" + res[1]); + throw new RuntimeException("[-spin] [spin]: " + res[0] + "\n" + res[1]); + } + int procs = 0; + for (int i = 0; i < pml.length(); procs++) + { + i = pml.indexOf("proctype", i); + if (i == -1) + { + break; + } + i++; } - res = ScribUtil.runProcess("gcc", "-o", "pan", "pan.c"); + int dnfair = (procs <= 6) ? 2 : 3; // FIXME + res = ScribUtil.runProcess("gcc", "-o", "pan", "pan.c", "-DNFAIR=" + dnfair); res[0] = res[0].trim(); res[1] = res[1].trim(); if (!res[0].isEmpty() || !res[1].isEmpty()) { - throw new RuntimeException("[scrib-Spin] [gcc]: " + res[0] + "\n" + res[1]); + throw new RuntimeException("[-spin] [gcc]: " + res[0] + "\n" + res[1]); } res = ScribUtil.runProcess("pan", "-a", "-f"); res[1] = res[1].replace("warning: no accept labels are defined, so option -a has no effect (ignored)", ""); @@ -304,10 +316,15 @@ private static boolean runSpin(String pml) //throws ScribbleException res[1] = res[1].trim(); if (res[0].contains("error,") || !res[1].isEmpty()) { - throw new RuntimeException("[scrib-Spin] [pan]: " + res[0] + "\n" + res[1]); + throw new RuntimeException("[-spin] [pan]: " + res[0] + "\n" + res[1]); } int err = res[0].indexOf("errors: "); - return (res[0].charAt(err + 8) == '0'); + boolean valid = (res[0].charAt(err + 8) == '0'); + if (!valid) + { + System.err.println("[-spin] [pan] " + res[0] + "\n" + res[1]); + } + return valid; } catch (ScribbleException e) { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java index 3e24e534b..0719d45a1 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java @@ -88,8 +88,8 @@ else if (kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) "if\n" + as.stream().map(a -> "::\n" - + "s_" + a.peer + "_" + r + "?[" + a.mid + "] ->\n" - + "s_" + a.peer + "_" + r + "?" + a.mid + ";\n" + + "r_" + a.peer + "_" + r + "?[" + a.mid + "] ->\n" + + "r_" + a.peer + "_" + r + "?" + a.mid + ";\n" + "goto " + getLabel(seen, getSuccessor(a), r) + "\n" ) .collect(Collectors.joining("")) From cb35d8882b609e32af10282eabd0a9a4f037abe6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 15 Feb 2018 16:40:14 +0000 Subject: [PATCH 004/539] -spin working for eventual reception (not eventual stability). --- .../scribble/del/global/GProtocolDeclDel.java | 46 +++++++++++++++---- scribble-core/src/test/scrib/tmp/Test.scr | 4 +- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 27d62264f..69ab85ada 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -215,7 +215,7 @@ private static void validateBySpin(Job job, GProtocolName fullname) throws Scrib { pml += "chan s_" + p[0] + "_" + p[1] + " = [1] of { mtype };\n" + "chan r_" + p[0] + "_" + p[1] + " = [1] of { mtype };\n" - + "bool empty_" + p[0] + "_" + p[1] + " = false;\n" + + "bool empty_" + p[0] + "_" + p[1] + " = true;\n" + "active proctype chan_" + p[0] + "_" + p[1] + "() {\n" + "mtype m;\n" + "end_chan_" + p[0] + "_" + p[1] + ":\n" @@ -231,8 +231,12 @@ private static void validateBySpin(Job job, GProtocolName fullname) throws Scrib { pml += "\n\n" + jc.getEGraph(fullname, r).toPml(r); } + if (job.debug) + { + System.out.println("[-spin]: Promela processes\n" + pml + "\n"); + } - List labs = new LinkedList<>(); + List clauses = new LinkedList<>(); for (Role r : rs) { Set tmp = new HashSet<>(); @@ -244,19 +248,45 @@ private static void validateBySpin(Job job, GProtocolName fullname) throws Scrib tmp.remove(g.term); } tmp.forEach( // Throws exception, cannot use flatMap - s -> labs.add("!<>[]" + r + "@" + (s.isTerminal() ? "end" : "label") + r + s.id) // FIXME: factor out + s -> clauses.add("!<>[]" + r + "@label" + r + s.id) // FIXME: factor out ); } - if (job.debug) + //*/ + /*String roleProgress = ""; // This way is not faster + for (Role r : rs) { - System.out.println("[-spin]: Promela processes\n" + pml + "\n"); + Set tmp = new HashSet<>(); + EGraph g = jc.getEGraph(fullname, r); + tmp.add(g.init); + tmp.addAll(MState.getReachableStates(g.init)); + if (g.term != null) + { + tmp.remove(g.term); + } + roleProgress += (((roleProgress.isEmpty()) ? "" : " || ") + + tmp.stream().map(s -> r + "@label" + r + s.id).collect(Collectors.joining(" || "))); + } + roleProgress = "!<>[](" + roleProgress + ")"; + clauses.add(roleProgress);*/ + /*for (Role[] p : pairs) + { + clauses.add("[]<>(empty_" + p[0] + "_" + p[1] + ")"); + }*/ + String eventualStability = ""; + for (Role[] p : pairs) + { + //eventualStability += (((eventualStability.isEmpty()) ? "" : " && ") + "empty_" + p[0] + "_" + p[1]); + eventualStability += (((eventualStability.isEmpty()) ? "" : " && ") + "<>empty_" + p[0] + "_" + p[1]); } + //eventualStability = "[]<>(" + eventualStability + ")"; + eventualStability = "[](" + eventualStability + ")"; // FIXME: current "eventual reception", not eventual stability + clauses.add(eventualStability); int batchSize = 10; // FIXME: factor out - for (int i = 0; i < labs.size(); ) + for (int i = 0; i < clauses.size(); ) { - int j = (i+batchSize < labs.size()) ? i+batchSize : labs.size(); - String batch = labs.subList(i, j).stream().collect(Collectors.joining(" && ")); + int j = (i+batchSize < clauses.size()) ? i+batchSize : clauses.size(); + String batch = clauses.subList(i, j).stream().collect(Collectors.joining(" && ")); String ltl = "ltl {\n" + batch + "\n" + "}"; if (job.debug) { diff --git a/scribble-core/src/test/scrib/tmp/Test.scr b/scribble-core/src/test/scrib/tmp/Test.scr index e910aaac2..01faca309 100644 --- a/scribble-core/src/test/scrib/tmp/Test.scr +++ b/scribble-core/src/test/scrib/tmp/Test.scr @@ -43,6 +43,7 @@ module tmp.Test; +/* type "System.UInt32" from "..." as int; global protocol SH(role P, role R, role C) @@ -90,6 +91,7 @@ aux global protocol Loop(role P, role R, role C) Close() from P to C; } } +//*/ @@ -97,7 +99,7 @@ aux global protocol Loop(role P, role R, role C) -/* +//* global protocol Proto1(role A, role B, role C) { rec X { From a0843e68a7c182bb721547b6077028e1dc32f4f1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 28 Feb 2018 17:12:53 +0000 Subject: [PATCH 005/539] Minor. --- .../scribble/del/global/GProtocolDeclDel.java | 2 +- scribble-core/src/test/scrib/tmp/Test.scr | 15 +++++++++++- scribble-demos/scrib/smtp/src/smtp/SmtpC.java | 24 ++++++++++--------- .../smtp/src/smtp/message/SmtpMessage.java | 2 +- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 69ab85ada..0d3822429 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -157,7 +157,7 @@ public void enterValidation(ScribNode parent, ScribNode child, GProtocolValidato { if (checker.job.fair) { - throw new RuntimeException("TODO"); + throw new RuntimeException("[TODO]: -spin currently does not support fair ouput choices."); } validateBySpin(checker.job, fullname); } diff --git a/scribble-core/src/test/scrib/tmp/Test.scr b/scribble-core/src/test/scrib/tmp/Test.scr index 01faca309..2f3583d34 100644 --- a/scribble-core/src/test/scrib/tmp/Test.scr +++ b/scribble-core/src/test/scrib/tmp/Test.scr @@ -36,6 +36,19 @@ module tmp.Test; +//type "System.UInt32" from "..." as int; + +global protocol Proto1(role A, role B) +{ + choice at A + { + 1() from A to B; + } + or + { + 2() from A to B; + } +} @@ -99,7 +112,7 @@ aux global protocol Loop(role P, role R, role C) -//* +/* global protocol Proto1(role A, role B, role C) { rec X { diff --git a/scribble-demos/scrib/smtp/src/smtp/SmtpC.java b/scribble-demos/scrib/smtp/src/smtp/SmtpC.java index 5da6df415..219e240f3 100644 --- a/scribble-demos/scrib/smtp/src/smtp/SmtpC.java +++ b/scribble-demos/scrib/smtp/src/smtp/SmtpC.java @@ -40,6 +40,7 @@ import org.scribble.runtime.net.session.SocketChannelEndpoint; import smtp.Smtp.Smtp.Smtp; +import smtp.Smtp.Smtp.channels.C.EndSocket; import smtp.Smtp.Smtp.channels.C.Smtp_C_1; import smtp.Smtp.Smtp.channels.C.Smtp_C_10; import smtp.Smtp.Smtp.channels.C.Smtp_C_11_Cases; @@ -213,18 +214,19 @@ private Smtp_C_10 doAuth(Smtp_C_8 s8) throws Exception } } - private void sendMail(Smtp_C_12 s12) throws Exception + private EndSocket sendMail(Smtp_C_12 s12) throws Exception { - s12.send(S, new Rcpt(this.rcptFrom)) - .async(S, _250) - .send(S, new Data()) - .async(S, _354) - .send(S, new Subject(this.subj)) - .send(S, new DataLine(this.body)) - .send(S, new EndOfData()) - .receive(S, _250, new Buf<>()) - .send(S, new Quit()) - .receive(S, _221, new Buf<>()); + return + s12.send(S, new Rcpt(this.rcptFrom)) + .async(S, _250) + .send(S, new Data()) + .async(S, _354) + .send(S, new Subject(this.subj)) + .send(S, new DataLine(this.body)) + .send(S, new EndOfData()) + .receive(S, _250, new Buf<>()) + .send(S, new Quit()) + .receive(S, _221, new Buf<>()); } diff --git a/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessage.java b/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessage.java index a2a037cba..156d772d5 100644 --- a/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessage.java +++ b/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessage.java @@ -14,7 +14,7 @@ package smtp.message; import org.scribble.runtime.net.ScribMessage; -import org.scribble.sesstype.name.Op; +import org.scribble.type.name.Op; import org.scribble.util.Caller; import smtp.Smtp.Smtp.Smtp; From b3221309971c2682c691eea56fe244a81000bdf4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 28 Feb 2018 17:13:46 +0000 Subject: [PATCH 006/539] Moved test/scrib from core to test module. --- .../src/test/scrib/demo/fase17/intro/FirstL.scr | 0 .../src/test/scrib/demo/fase17/intro/FirstR.scr | 0 .../src/test/scrib/demo/fase17/overview/P1.scr | 0 .../src/test/scrib/demo/fase17/travel/TravelA.java | 0 .../src/test/scrib/demo/fase17/travel/TravelAgent.scr | 0 .../src/test/scrib/demo/fase17/travel/TravelC.java | 0 .../src/test/scrib/demo/fase17/travel/TravelS.java | 0 .../src/test/scrib/demo/fase17/travel2/Travel2A.java | 0 .../src/test/scrib/demo/fase17/travel2/Travel2C.java | 0 .../src/test/scrib/demo/fase17/travel2/Travel2S.java | 0 .../src/test/scrib/demo/fase17/travel2/TravelAgent2.scr | 0 .../src/test/scrib/demo/supplierinfo/SupplierInfo.scr | 0 .../src/test/scrib/demo/supplierinfo/SupplierInfoBasic.scr | 0 .../src/test/scrib/demo/supplierinfo/SupplierInfoDemo.scr | 0 .../src/test/scrib/demo/supplierinfo/SupplierInfoExper.scr | 0 .../src/test/scrib/demo/supplierinfo/SupplierInfoExplicit.scr | 0 .../src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr | 0 .../src/test/scrib/demo/supplierinfo/SupplierInfoNoFairBeta.scr | 0 .../src/test/scrib/demo/supplierinfo/SupplierInfoOrig.scr | 0 .../src/test/scrib/demo/supplierinfo/SupplierInfoSubprot.scr | 0 .../src/test/scrib/exercise/calculator/Client.java | 0 .../src/test/scrib/exercise/calculator/EProtocol.scr | 0 .../src/test/scrib/exercise/calculator/Server.java | 0 .../src/test/scrib/exercise/voting/EProtocol.scr | 0 .../src/test/scrib/exercise/voting/Server.java | 0 .../src/test/scrib/exercise/voting/Voter.java | 0 .../src/test/scrib/scratch/scratch1/MyC.java | 0 .../src/test/scrib/scratch/scratch1/MyS.java | 0 .../src/test/scrib/scratch/scratch1/Scratch1.scr | 0 {scribble-core => scribble-test}/src/test/scrib/test/foo/Foo.scr | 0 {scribble-core => scribble-test}/src/test/scrib/test/foo/MyA.java | 0 .../src/test/scrib/test/foo/MyBC.java | 0 .../src/test/scrib/test/test1/MyC.java | 0 .../src/test/scrib/test/test1/MyS.java | 0 .../src/test/scrib/test/test1/Test1.scr | 0 {scribble-core => scribble-test}/src/test/scrib/tmp/Betty.scr | 0 {scribble-core => scribble-test}/src/test/scrib/tmp/Demo.scr | 0 {scribble-core => scribble-test}/src/test/scrib/tmp/ExpConn.scr | 0 {scribble-core => scribble-test}/src/test/scrib/tmp/Fixme.scr | 0 {scribble-core => scribble-test}/src/test/scrib/tmp/Quirk.scr | 0 {scribble-core => scribble-test}/src/test/scrib/tmp/Test.scr | 0 {scribble-core => scribble-test}/src/test/scrib/tmp/Test2.scr | 0 42 files changed, 0 insertions(+), 0 deletions(-) rename {scribble-core => scribble-test}/src/test/scrib/demo/fase17/intro/FirstL.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/fase17/intro/FirstR.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/fase17/overview/P1.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/fase17/travel/TravelA.java (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/fase17/travel/TravelAgent.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/fase17/travel/TravelC.java (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/fase17/travel/TravelS.java (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/fase17/travel2/Travel2A.java (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/fase17/travel2/Travel2C.java (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/fase17/travel2/Travel2S.java (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/fase17/travel2/TravelAgent2.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/supplierinfo/SupplierInfo.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/supplierinfo/SupplierInfoBasic.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/supplierinfo/SupplierInfoDemo.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/supplierinfo/SupplierInfoExper.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/supplierinfo/SupplierInfoExplicit.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/supplierinfo/SupplierInfoNoFairBeta.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/supplierinfo/SupplierInfoOrig.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/demo/supplierinfo/SupplierInfoSubprot.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/exercise/calculator/Client.java (100%) rename {scribble-core => scribble-test}/src/test/scrib/exercise/calculator/EProtocol.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/exercise/calculator/Server.java (100%) rename {scribble-core => scribble-test}/src/test/scrib/exercise/voting/EProtocol.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/exercise/voting/Server.java (100%) rename {scribble-core => scribble-test}/src/test/scrib/exercise/voting/Voter.java (100%) rename {scribble-core => scribble-test}/src/test/scrib/scratch/scratch1/MyC.java (100%) rename {scribble-core => scribble-test}/src/test/scrib/scratch/scratch1/MyS.java (100%) rename {scribble-core => scribble-test}/src/test/scrib/scratch/scratch1/Scratch1.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/test/foo/Foo.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/test/foo/MyA.java (100%) rename {scribble-core => scribble-test}/src/test/scrib/test/foo/MyBC.java (100%) rename {scribble-core => scribble-test}/src/test/scrib/test/test1/MyC.java (100%) rename {scribble-core => scribble-test}/src/test/scrib/test/test1/MyS.java (100%) rename {scribble-core => scribble-test}/src/test/scrib/test/test1/Test1.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/tmp/Betty.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/tmp/Demo.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/tmp/ExpConn.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/tmp/Fixme.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/tmp/Quirk.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/tmp/Test.scr (100%) rename {scribble-core => scribble-test}/src/test/scrib/tmp/Test2.scr (100%) diff --git a/scribble-core/src/test/scrib/demo/fase17/intro/FirstL.scr b/scribble-test/src/test/scrib/demo/fase17/intro/FirstL.scr similarity index 100% rename from scribble-core/src/test/scrib/demo/fase17/intro/FirstL.scr rename to scribble-test/src/test/scrib/demo/fase17/intro/FirstL.scr diff --git a/scribble-core/src/test/scrib/demo/fase17/intro/FirstR.scr b/scribble-test/src/test/scrib/demo/fase17/intro/FirstR.scr similarity index 100% rename from scribble-core/src/test/scrib/demo/fase17/intro/FirstR.scr rename to scribble-test/src/test/scrib/demo/fase17/intro/FirstR.scr diff --git a/scribble-core/src/test/scrib/demo/fase17/overview/P1.scr b/scribble-test/src/test/scrib/demo/fase17/overview/P1.scr similarity index 100% rename from scribble-core/src/test/scrib/demo/fase17/overview/P1.scr rename to scribble-test/src/test/scrib/demo/fase17/overview/P1.scr diff --git a/scribble-core/src/test/scrib/demo/fase17/travel/TravelA.java b/scribble-test/src/test/scrib/demo/fase17/travel/TravelA.java similarity index 100% rename from scribble-core/src/test/scrib/demo/fase17/travel/TravelA.java rename to scribble-test/src/test/scrib/demo/fase17/travel/TravelA.java diff --git a/scribble-core/src/test/scrib/demo/fase17/travel/TravelAgent.scr b/scribble-test/src/test/scrib/demo/fase17/travel/TravelAgent.scr similarity index 100% rename from scribble-core/src/test/scrib/demo/fase17/travel/TravelAgent.scr rename to scribble-test/src/test/scrib/demo/fase17/travel/TravelAgent.scr diff --git a/scribble-core/src/test/scrib/demo/fase17/travel/TravelC.java b/scribble-test/src/test/scrib/demo/fase17/travel/TravelC.java similarity index 100% rename from scribble-core/src/test/scrib/demo/fase17/travel/TravelC.java rename to scribble-test/src/test/scrib/demo/fase17/travel/TravelC.java diff --git a/scribble-core/src/test/scrib/demo/fase17/travel/TravelS.java b/scribble-test/src/test/scrib/demo/fase17/travel/TravelS.java similarity index 100% rename from scribble-core/src/test/scrib/demo/fase17/travel/TravelS.java rename to scribble-test/src/test/scrib/demo/fase17/travel/TravelS.java diff --git a/scribble-core/src/test/scrib/demo/fase17/travel2/Travel2A.java b/scribble-test/src/test/scrib/demo/fase17/travel2/Travel2A.java similarity index 100% rename from scribble-core/src/test/scrib/demo/fase17/travel2/Travel2A.java rename to scribble-test/src/test/scrib/demo/fase17/travel2/Travel2A.java diff --git a/scribble-core/src/test/scrib/demo/fase17/travel2/Travel2C.java b/scribble-test/src/test/scrib/demo/fase17/travel2/Travel2C.java similarity index 100% rename from scribble-core/src/test/scrib/demo/fase17/travel2/Travel2C.java rename to scribble-test/src/test/scrib/demo/fase17/travel2/Travel2C.java diff --git a/scribble-core/src/test/scrib/demo/fase17/travel2/Travel2S.java b/scribble-test/src/test/scrib/demo/fase17/travel2/Travel2S.java similarity index 100% rename from scribble-core/src/test/scrib/demo/fase17/travel2/Travel2S.java rename to scribble-test/src/test/scrib/demo/fase17/travel2/Travel2S.java diff --git a/scribble-core/src/test/scrib/demo/fase17/travel2/TravelAgent2.scr b/scribble-test/src/test/scrib/demo/fase17/travel2/TravelAgent2.scr similarity index 100% rename from scribble-core/src/test/scrib/demo/fase17/travel2/TravelAgent2.scr rename to scribble-test/src/test/scrib/demo/fase17/travel2/TravelAgent2.scr diff --git a/scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfo.scr b/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfo.scr similarity index 100% rename from scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfo.scr rename to scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfo.scr diff --git a/scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfoBasic.scr b/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoBasic.scr similarity index 100% rename from scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfoBasic.scr rename to scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoBasic.scr diff --git a/scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfoDemo.scr b/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoDemo.scr similarity index 100% rename from scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfoDemo.scr rename to scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoDemo.scr diff --git a/scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfoExper.scr b/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoExper.scr similarity index 100% rename from scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfoExper.scr rename to scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoExper.scr diff --git a/scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfoExplicit.scr b/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoExplicit.scr similarity index 100% rename from scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfoExplicit.scr rename to scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoExplicit.scr diff --git a/scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr b/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr similarity index 100% rename from scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr rename to scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr diff --git a/scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfoNoFairBeta.scr b/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoNoFairBeta.scr similarity index 100% rename from scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfoNoFairBeta.scr rename to scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoNoFairBeta.scr diff --git a/scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfoOrig.scr b/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoOrig.scr similarity index 100% rename from scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfoOrig.scr rename to scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoOrig.scr diff --git a/scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfoSubprot.scr b/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoSubprot.scr similarity index 100% rename from scribble-core/src/test/scrib/demo/supplierinfo/SupplierInfoSubprot.scr rename to scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoSubprot.scr diff --git a/scribble-core/src/test/scrib/exercise/calculator/Client.java b/scribble-test/src/test/scrib/exercise/calculator/Client.java similarity index 100% rename from scribble-core/src/test/scrib/exercise/calculator/Client.java rename to scribble-test/src/test/scrib/exercise/calculator/Client.java diff --git a/scribble-core/src/test/scrib/exercise/calculator/EProtocol.scr b/scribble-test/src/test/scrib/exercise/calculator/EProtocol.scr similarity index 100% rename from scribble-core/src/test/scrib/exercise/calculator/EProtocol.scr rename to scribble-test/src/test/scrib/exercise/calculator/EProtocol.scr diff --git a/scribble-core/src/test/scrib/exercise/calculator/Server.java b/scribble-test/src/test/scrib/exercise/calculator/Server.java similarity index 100% rename from scribble-core/src/test/scrib/exercise/calculator/Server.java rename to scribble-test/src/test/scrib/exercise/calculator/Server.java diff --git a/scribble-core/src/test/scrib/exercise/voting/EProtocol.scr b/scribble-test/src/test/scrib/exercise/voting/EProtocol.scr similarity index 100% rename from scribble-core/src/test/scrib/exercise/voting/EProtocol.scr rename to scribble-test/src/test/scrib/exercise/voting/EProtocol.scr diff --git a/scribble-core/src/test/scrib/exercise/voting/Server.java b/scribble-test/src/test/scrib/exercise/voting/Server.java similarity index 100% rename from scribble-core/src/test/scrib/exercise/voting/Server.java rename to scribble-test/src/test/scrib/exercise/voting/Server.java diff --git a/scribble-core/src/test/scrib/exercise/voting/Voter.java b/scribble-test/src/test/scrib/exercise/voting/Voter.java similarity index 100% rename from scribble-core/src/test/scrib/exercise/voting/Voter.java rename to scribble-test/src/test/scrib/exercise/voting/Voter.java diff --git a/scribble-core/src/test/scrib/scratch/scratch1/MyC.java b/scribble-test/src/test/scrib/scratch/scratch1/MyC.java similarity index 100% rename from scribble-core/src/test/scrib/scratch/scratch1/MyC.java rename to scribble-test/src/test/scrib/scratch/scratch1/MyC.java diff --git a/scribble-core/src/test/scrib/scratch/scratch1/MyS.java b/scribble-test/src/test/scrib/scratch/scratch1/MyS.java similarity index 100% rename from scribble-core/src/test/scrib/scratch/scratch1/MyS.java rename to scribble-test/src/test/scrib/scratch/scratch1/MyS.java diff --git a/scribble-core/src/test/scrib/scratch/scratch1/Scratch1.scr b/scribble-test/src/test/scrib/scratch/scratch1/Scratch1.scr similarity index 100% rename from scribble-core/src/test/scrib/scratch/scratch1/Scratch1.scr rename to scribble-test/src/test/scrib/scratch/scratch1/Scratch1.scr diff --git a/scribble-core/src/test/scrib/test/foo/Foo.scr b/scribble-test/src/test/scrib/test/foo/Foo.scr similarity index 100% rename from scribble-core/src/test/scrib/test/foo/Foo.scr rename to scribble-test/src/test/scrib/test/foo/Foo.scr diff --git a/scribble-core/src/test/scrib/test/foo/MyA.java b/scribble-test/src/test/scrib/test/foo/MyA.java similarity index 100% rename from scribble-core/src/test/scrib/test/foo/MyA.java rename to scribble-test/src/test/scrib/test/foo/MyA.java diff --git a/scribble-core/src/test/scrib/test/foo/MyBC.java b/scribble-test/src/test/scrib/test/foo/MyBC.java similarity index 100% rename from scribble-core/src/test/scrib/test/foo/MyBC.java rename to scribble-test/src/test/scrib/test/foo/MyBC.java diff --git a/scribble-core/src/test/scrib/test/test1/MyC.java b/scribble-test/src/test/scrib/test/test1/MyC.java similarity index 100% rename from scribble-core/src/test/scrib/test/test1/MyC.java rename to scribble-test/src/test/scrib/test/test1/MyC.java diff --git a/scribble-core/src/test/scrib/test/test1/MyS.java b/scribble-test/src/test/scrib/test/test1/MyS.java similarity index 100% rename from scribble-core/src/test/scrib/test/test1/MyS.java rename to scribble-test/src/test/scrib/test/test1/MyS.java diff --git a/scribble-core/src/test/scrib/test/test1/Test1.scr b/scribble-test/src/test/scrib/test/test1/Test1.scr similarity index 100% rename from scribble-core/src/test/scrib/test/test1/Test1.scr rename to scribble-test/src/test/scrib/test/test1/Test1.scr diff --git a/scribble-core/src/test/scrib/tmp/Betty.scr b/scribble-test/src/test/scrib/tmp/Betty.scr similarity index 100% rename from scribble-core/src/test/scrib/tmp/Betty.scr rename to scribble-test/src/test/scrib/tmp/Betty.scr diff --git a/scribble-core/src/test/scrib/tmp/Demo.scr b/scribble-test/src/test/scrib/tmp/Demo.scr similarity index 100% rename from scribble-core/src/test/scrib/tmp/Demo.scr rename to scribble-test/src/test/scrib/tmp/Demo.scr diff --git a/scribble-core/src/test/scrib/tmp/ExpConn.scr b/scribble-test/src/test/scrib/tmp/ExpConn.scr similarity index 100% rename from scribble-core/src/test/scrib/tmp/ExpConn.scr rename to scribble-test/src/test/scrib/tmp/ExpConn.scr diff --git a/scribble-core/src/test/scrib/tmp/Fixme.scr b/scribble-test/src/test/scrib/tmp/Fixme.scr similarity index 100% rename from scribble-core/src/test/scrib/tmp/Fixme.scr rename to scribble-test/src/test/scrib/tmp/Fixme.scr diff --git a/scribble-core/src/test/scrib/tmp/Quirk.scr b/scribble-test/src/test/scrib/tmp/Quirk.scr similarity index 100% rename from scribble-core/src/test/scrib/tmp/Quirk.scr rename to scribble-test/src/test/scrib/tmp/Quirk.scr diff --git a/scribble-core/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr similarity index 100% rename from scribble-core/src/test/scrib/tmp/Test.scr rename to scribble-test/src/test/scrib/tmp/Test.scr diff --git a/scribble-core/src/test/scrib/tmp/Test2.scr b/scribble-test/src/test/scrib/tmp/Test2.scr similarity index 100% rename from scribble-core/src/test/scrib/tmp/Test2.scr rename to scribble-test/src/test/scrib/tmp/Test2.scr From 27625b64cab86f1dbf4946ee86728dab29825295 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 2 Mar 2018 00:31:56 +0000 Subject: [PATCH 007/539] Adding event-driven output API. --- .../main/java/org/scribble/cli/CLArgFlag.java | 1 + .../java/org/scribble/cli/CLArgParser.java | 4 + .../java/org/scribble/cli/CommandLine.java | 33 +++- .../eventdriven/EDApiGenConstants.java | 6 + .../eventdriven/EDEndpointApiGenerator.java | 166 ++++++++++++++++++ .../eventdriven/EDSessionApiBuilder.java | 19 ++ .../java/endpointapi/OutputSockGen.java | 2 +- .../java/endpointapi/SessionApiGenerator.java | 2 +- .../endpointapi/StateChannelApiGenerator.java | 2 +- .../scrib/smtp/src/smtp/SimpleSmtpC.java | 2 +- scribble-demos/scrib/smtp/src/smtp/SmtpC.java | 2 +- .../runtime/net/scribsock/OutputSocket.java | 2 +- .../net/session/EventDrivenEndpoint.java | 28 +++ .../runtime/net/session/MPSTEndpoint.java | 6 +- scribble-test/pom.xml | 4 + 15 files changed, 268 insertions(+), 11 deletions(-) create mode 100644 scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDApiGenConstants.java create mode 100644 scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java create mode 100644 scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDSessionApiBuilder.java create mode 100644 scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java index 052832dd5..8301351d9 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java @@ -49,4 +49,5 @@ public enum CLArgFlag API_GEN, SESS_API_GEN, SCHAN_API_GEN, + ED_API_GEN } diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java index 93f3c0ce3..6a989ee48 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java @@ -54,6 +54,8 @@ public class CLArgParser public static final String API_GEN_FLAG = "-api"; public static final String SESSION_API_GEN_FLAG = "-sessapi"; public static final String STATECHAN_API_GEN_FLAG = "-chanapi"; + + public static final String EVENTDRIVEN_API_GEN_FLAG = "-edapi"; private static final Map UNIQUE_FLAGS = new HashMap<>(); { @@ -90,6 +92,7 @@ public class CLArgParser CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.API_GEN_FLAG, CLArgFlag.API_GEN); CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.SESSION_API_GEN_FLAG, CLArgFlag.SESS_API_GEN); CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.STATECHAN_API_GEN_FLAG, CLArgFlag.SCHAN_API_GEN); + CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.EVENTDRIVEN_API_GEN_FLAG, CLArgFlag.ED_API_GEN); } private static final Map FLAGS = new HashMap<>(); @@ -229,6 +232,7 @@ protected int parseFlag(int i) throws CommandLineException case CLArgParser.UNFAIR_EFSM_FLAG: case CLArgParser.API_GEN_FLAG: case CLArgParser.STATECHAN_API_GEN_FLAG: + case CLArgParser.EVENTDRIVEN_API_GEN_FLAG: { return parseProtoAndRoleArgs(flag, i); } diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 71528c40f..6bc98a1fa 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -26,6 +26,7 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.global.GProtocolDecl; +import org.scribble.codegen.eventdriven.EDEndpointApiGenerator; import org.scribble.codegen.java.JEndpointApiGenerator; import org.scribble.main.AntlrSourceException; import org.scribble.main.Job; @@ -262,6 +263,10 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co { outputEndpointApi(job); } + if (this.args.containsKey(CLArgFlag.ED_API_GEN)) + { + outputEventDrivenApi(job); + } } // FIXME: option to write to file, like classes @@ -413,12 +418,36 @@ private void outputStateChannelApi(Job job) throws ScribbleException, CommandLin for (int i = 0; i < args.length; i += 2) { GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); - Role role = checkRoleArg(jcontext, fullname, args[i+1]); - Map classes = jgen.generateStateChannelApi(fullname, role, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); + Role self = checkRoleArg(jcontext, fullname, args[i+1]); + Map classes = jgen.generateStateChannelApi(fullname, self, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); outputClasses(classes); } } + private void outputEventDrivenApi(Job job) throws ScribbleException, CommandLineException + { + JobContext jcontext = job.getContext(); + String[] args = this.args.get(CLArgFlag.ED_API_GEN); + /*JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // FIXME: refactor (generalise -- use new API) + for (int i = 0; i < args.length; i += 2) + { + GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); + Map sessClasses = jgen.generateSessionApi(fullname); + outputClasses(sessClasses); + Role role = checkRoleArg(jcontext, fullname, args[i+1]); + Map scClasses = jgen.generateStateChannelApi(fullname, role, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); + outputClasses(scClasses); + }*/ + for (int i = 0; i < args.length; i += 2) + { + GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); + Role self = checkRoleArg(jcontext, fullname, args[i+1]); + EDEndpointApiGenerator edgen = new EDEndpointApiGenerator(job, fullname, self); + Map out = edgen.build(); + outputClasses(out); + } + } + // filepath -> class source protected void outputClasses(Map classes) throws ScribbleException { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDApiGenConstants.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDApiGenConstants.java new file mode 100644 index 000000000..73bcb5959 --- /dev/null +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDApiGenConstants.java @@ -0,0 +1,6 @@ +package org.scribble.codegen.eventdriven; + +public class EDApiGenConstants +{ + +} diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java new file mode 100644 index 000000000..e64d3b7ab --- /dev/null +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java @@ -0,0 +1,166 @@ +package org.scribble.codegen.eventdriven; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.codegen.java.endpointapi.SessionApiGenerator; +import org.scribble.main.Job; +import org.scribble.main.JobContext; +import org.scribble.main.ScribbleException; +import org.scribble.model.MState; +import org.scribble.model.endpoint.EState; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; + +// From ParamCoreEndpointApiGenerator +public class EDEndpointApiGenerator +{ + public final Job job; + public final GProtocolName proto; + public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral + + public EDEndpointApiGenerator(Job job, GProtocolName fullname, Role self) + { + this.job = job; + this.proto = fullname; + this.self = self; + } + + // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later + public Map build() throws ScribbleException + { + Map res = new HashMap<>(); // filepath -> source + res.putAll(buildSessionApi()); + return res; + } + + public Map buildSessionApi() throws ScribbleException // FIXME: factor out + { + this.job.debugPrintln("\n[param-core] Running " + EDEndpointApiGenerator.class + " for " + this.proto + "@" + this.self); + + Map res = new HashMap<>(); + res.putAll(new EDSessionApiBuilder(this.job, this.proto).generateApi()); + res.putAll(buildEndpointClass()); + return res; + } + + public Map buildEndpointClass() throws ScribbleException + { + JobContext jc = this.job.getContext(); + EState init = (this.job.minEfsm ? jc.getMinimisedEGraph(this.proto, this.self) : jc.getEGraph(this.proto, this.self)).init; // FIXME: factor out with StateChannelApiGenerator constructor + Set states = new HashSet<>(); + states.add(init); + states.addAll(MState.getReachableStates(init)); + + String pack = SessionApiGenerator.getEndpointApiRootPackageName(this.proto); + String name = this.proto.getSimpleName() + "_" + this.self; + String sess = pack + "." + this.proto.getSimpleName(); + String role = SessionApiGenerator.getRolesPackageName(this.proto) + "." + this.self; + String epClass = ""; + + epClass += "package " + pack + ".handlers." + this.self + ";\n"; + epClass += "\n"; + epClass += "import java.util.function.Function;\n"; + epClass += "import java.util.HashMap;\n"; + epClass += "import java.util.Map;\n"; + epClass += "\n"; + epClass += "public class " + name + " extends org.scribble.runtime.net.session.EventDrivenEndpoint<" + sess + ", " + role + "> {\n"; + epClass += "private final Map> outputs = new HashMap<>();\n"; + epClass += "\n"; + epClass += "public " + name + "(" + sess + " sess, " + role + + " self, org.scribble.runtime.net.ScribMessageFormatter smf) throws java.io.IOException, org.scribble.main.ScribbleRuntimeException {\n"; + epClass += "super(sess, self, smf);\n"; + epClass += "}\n"; + epClass += "\n"; + + /*epClass += "public enum State {" + states.stream().map(s -> getEDStateEnum(this.proto, this.self, s)) + "}\n"; + epClass += "\n";*/ + + epClass += states.stream().map(s -> generateRegister(this.proto, this.self, s)).collect(Collectors.joining("\n")); + /*epClass += "public void register(State s, Function h) {\n"; + epClass += "this.outputs.put(s, h)"; + epClass += "}\n"; + epClass += "\n"; + epClass += "public void register(State s, Function h) {\n"; + epClass += "this.outputs.put(s, h)"; + epClass += "}\n";*/ + + epClass += "}\n"; + + for (EState s : states) + { + epClass += "\n"; + epClass += "final class " + name + "_" + s.id + " {\n"; + epClass += "public static final " + name + "_" + s.id + " id = new " + name + "_" + s.id + "();\n"; + epClass += "private " + name + "_" + s.id + "() {} \n"; + epClass += "}\n"; + } + + Map res = new HashMap<>(); + String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/" + this.self + "/" ; // StateChannelApiGenerator#generateApi + res.put(prefix + name + ".java", epClass); + return res; + } + + /*// cf. StateChannelApiGenerator#newSocketClassName + public static String getEDStateEnum(GProtocolName gpn, Role self, EState s) + { + return gpn.getSimpleName() + "_" + self + "_" + s.id; + }*/ + + private String generateRegister(GProtocolName gpn, Role self, EState s) + { + String res = ""; + switch (s.getStateKind()) + { + case OUTPUT: + { + // FIXME: "untyped" + res += "public void register(" + gpn.getSimpleName() + "_" + self + "_" + s.id +" sid, Function h) {\n"; + res += "this.outputs.put(sid, h);\n"; + res += "}\n"; + break; + } + case UNARY_INPUT: + case POLY_INPUT: + break; + case TERMINAL: + break; + case ACCEPT: + case WRAP_SERVER: + throw new RuntimeException("[scrib] TODO: " + s); + default: + throw new RuntimeException("[scrib] Shouldn't get in here: " + s); + } + return res; + } + + /*public String generateRootPackageDecl() + { + return "package " + getRootPackage(); + } + + private String getRootPackage() // Derives only from proto name + { + //throw new RuntimeException("[param-core] TODO:"); + return this.proto.getSimpleName().toString(); + }*/ + + public String generateScribbleRuntimeImports() + { + return getScribbleRuntimeImports().stream().map(x -> "import \"" + x + "\"\n").collect(Collectors.joining()); + } + + private List getScribbleRuntimeImports() // FIXME: factor up + { + return Stream.of( + //EDApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "" + ).collect(Collectors.toList()); + } +} diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDSessionApiBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDSessionApiBuilder.java new file mode 100644 index 000000000..d31355dd5 --- /dev/null +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDSessionApiBuilder.java @@ -0,0 +1,19 @@ +package org.scribble.codegen.eventdriven; + +import org.scribble.codegen.java.endpointapi.SessionApiGenerator; +import org.scribble.main.Job; +import org.scribble.main.ScribbleException; +import org.scribble.type.name.GProtocolName; + +public class EDSessionApiBuilder extends SessionApiGenerator +{ + public EDSessionApiBuilder(Job job, GProtocolName fullname) throws ScribbleException + { + super(job, fullname); + } + + /*public Map build() // FIXME: factor out + { + return Collections.emptyMap(); + }*/ +} diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/OutputSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/OutputSockGen.java index 31dec434d..22380a9ca 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/OutputSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/OutputSockGen.java @@ -178,7 +178,7 @@ public static void setConnectHeaderWithoutReturnType(StateChannelApiGenerator ap { final String ROLE_PARAM = "role"; - mb.setName("connect"); + mb.setName("request"); mb.addModifiers(JavaBuilder.PUBLIC); mb.addExceptions(StateChannelApiGenerator.SCRIBBLERUNTIMEEXCEPTION_CLASS, "IOException"); mb.addParameters(SessionApiGenerator.getRoleClassName(a.obj) + " " + ROLE_PARAM); // More params added below diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/SessionApiGenerator.java index ac4b6d022..1bc58cde9 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/SessionApiGenerator.java @@ -72,7 +72,7 @@ public Map generateApi() Map map = new HashMap<>(); map.put(path, sb.toString()); - this.classes.keySet().stream().forEach((n) -> map.put(n, this.classes.get(n).build())); + this.classes.keySet().stream().forEach(n -> map.put(n, this.classes.get(n).build())); return map; } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/StateChannelApiGenerator.java index 11c7f703e..a3b5360b4 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/StateChannelApiGenerator.java @@ -83,7 +83,7 @@ public StateChannelApiGenerator(Job job, GProtocolName fullname, Role self) thro private static boolean skipIOInterfacesGeneration(EState init) { Set as = EState.getReachableActions(init); - if (as.stream().anyMatch((a) -> !a.isSend() && !a.isReceive())) // HACK FIXME (connect/disconnect) + if (as.stream().anyMatch(a -> !a.isSend() && !a.isReceive())) // HACK FIXME (connect/disconnect) { return true; } diff --git a/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java b/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java index 763817c04..90c08bfce 100644 --- a/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java +++ b/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java @@ -84,7 +84,7 @@ public void run() throws Exception Smtp smtp = new Smtp(); try (MPSTEndpoint se = new MPSTEndpoint<>(smtp, C, new SmtpMessageFormatter())) { - se.connect(S, SocketChannelEndpoint::new, host, port); + se.request(S, SocketChannelEndpoint::new, host, port); Smtp_C_11_Cases cases = doAuth( diff --git a/scribble-demos/scrib/smtp/src/smtp/SmtpC.java b/scribble-demos/scrib/smtp/src/smtp/SmtpC.java index 219e240f3..8b176302d 100644 --- a/scribble-demos/scrib/smtp/src/smtp/SmtpC.java +++ b/scribble-demos/scrib/smtp/src/smtp/SmtpC.java @@ -99,7 +99,7 @@ public void run() throws Exception try (MPSTEndpoint se = new MPSTEndpoint<>(smtp, C, new SmtpMessageFormatter())) { - se.connect(S, SocketChannelEndpoint::new, this.server, SmtpC.PORT); + se.request(S, SocketChannelEndpoint::new, this.server, SmtpC.PORT); Smtp_C_1 s1 = new Smtp_C_1(se); Smtp_C_2 s2 = s1.receive(S, _220, new Buf<>()); diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/OutputSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/OutputSocket.java index 9da68e16b..6aa8a84d3 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/OutputSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/OutputSocket.java @@ -52,7 +52,7 @@ protected void connect(Role role, Callable cons { use(); //this.se.connect(role, cons, host, port); - MPSTEndpoint.connect(this.se, role, cons, host, port); + MPSTEndpoint.request(this.se, role, cons, host, port); } // FIXME: check if MPST/ExplicitEndpoint diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java new file mode 100644 index 000000000..b514918e8 --- /dev/null +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java @@ -0,0 +1,28 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.runtime.net.session; + +import java.io.IOException; + +import org.scribble.main.ScribbleRuntimeException; +import org.scribble.runtime.net.ScribMessageFormatter; +import org.scribble.type.name.Role; + +public class EventDrivenEndpoint extends MPSTEndpoint +{ + public EventDrivenEndpoint(S sess, R self, ScribMessageFormatter smf) throws IOException, ScribbleRuntimeException + { + super(sess, self, smf); + } +} diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/MPSTEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/MPSTEndpoint.java index f323cf060..f97510eaf 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/MPSTEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/MPSTEndpoint.java @@ -31,13 +31,13 @@ public MPSTEndpoint(S sess, R self, ScribMessageFormatter smf) throws IOExceptio super(sess, self, smf); } - public void connect(Role role, Callable cons, String host, int port) throws ScribbleRuntimeException, UnknownHostException, IOException + public void request(Role role, Callable cons, String host, int port) throws ScribbleRuntimeException, UnknownHostException, IOException { - MPSTEndpoint.connect(this, role, cons, host, port); + MPSTEndpoint.request(this, role, cons, host, port); } // HACK FIXME: refactor (location, protected, etc) - public static void connect(SessionEndpoint se, Role role, Callable cons, String host, int port) throws ScribbleRuntimeException, UnknownHostException, IOException + public static void request(SessionEndpoint se, Role role, Callable cons, String host, int port) throws ScribbleRuntimeException, UnknownHostException, IOException { // Can connect unlimited, as long as not already used via init //if (this.init) diff --git a/scribble-test/pom.xml b/scribble-test/pom.xml index f9a56db5d..2eb1d7b4e 100644 --- a/scribble-test/pom.xml +++ b/scribble-test/pom.xml @@ -30,6 +30,10 @@ org.scribble scribble-cli + + org.scribble + scribble-runtime + junit junit From 7c8ba98cc8be5c2a0f976c2f815e2d4d573c6f6b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 6 Mar 2018 21:01:36 +0000 Subject: [PATCH 008/539] Continued on output-callback API. Fixed OpKind serialization. --- .../eventdriven/EDEndpointApiGenerator.java | 95 +++++++++-- .../org/scribble/type/kind/AbstractKind.java | 20 ++- .../org/scribble/type/kind/AmbigKind.java | 8 +- .../org/scribble/type/kind/DataTypeKind.java | 8 +- .../java/org/scribble/type/kind/Global.java | 8 +- .../java/org/scribble/type/kind/Local.java | 8 +- .../org/scribble/type/kind/ModuleKind.java | 8 +- .../java/org/scribble/type/kind/OpKind.java | 15 +- .../org/scribble/type/kind/PackageKind.java | 8 +- .../org/scribble/type/kind/RecVarKind.java | 8 +- .../java/org/scribble/type/kind/RoleKind.java | 8 +- .../org/scribble/type/kind/ScopeKind.java | 8 +- .../java/org/scribble/type/kind/SigKind.java | 8 +- .../org/scribble/type/name/AbstractName.java | 2 +- .../org/scribble/util/function/Function2.java | 7 + .../scribble/runtime/net/ScribMessage.java | 2 +- .../net/session/EventDrivenEndpoint.java | 151 +++++++++++++++++- .../runtime/net/state/ScribEndState.java | 17 ++ .../runtime/net/state/ScribEvent.java | 66 ++++++++ .../runtime/net/state/ScribInputState.java | 20 +++ .../runtime/net/state/ScribOutputState.java | 15 ++ .../runtime/net/state/ScribState.java | 43 +++++ .../src/test/scrib/test/test2/MyA.java | 65 ++++++++ .../src/test/scrib/test/test2/MyB.java | 95 +++++++++++ .../src/test/scrib/test/test2/Test2.scr | 18 +++ 25 files changed, 615 insertions(+), 96 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/util/function/Function2.java create mode 100644 scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEndState.java create mode 100644 scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEvent.java create mode 100644 scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribInputState.java create mode 100644 scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribOutputState.java create mode 100644 scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribState.java create mode 100644 scribble-test/src/test/scrib/test/test2/MyA.java create mode 100644 scribble-test/src/test/scrib/test/test2/MyB.java create mode 100644 scribble-test/src/test/scrib/test/test2/Test2.scr diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java index e64d3b7ab..23898093d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java @@ -14,6 +14,8 @@ import org.scribble.main.ScribbleException; import org.scribble.model.MState; import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.EStateKind; +import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; @@ -65,16 +67,18 @@ public Map buildEndpointClass() throws ScribbleException epClass += "package " + pack + ".handlers." + this.self + ";\n"; epClass += "\n"; - epClass += "import java.util.function.Function;\n"; + /*epClass += "import java.util.function.Function;\n"; epClass += "import java.util.HashMap;\n"; - epClass += "import java.util.Map;\n"; + epClass += "import java.util.Map;\n";*/ epClass += "\n"; epClass += "public class " + name + " extends org.scribble.runtime.net.session.EventDrivenEndpoint<" + sess + ", " + role + "> {\n"; - epClass += "private final Map> outputs = new HashMap<>();\n"; - epClass += "\n"; + + /*epClass += "private final Map> outputs = new HashMap<>();\n"; + epClass += "\n";*/ + epClass += "public " + name + "(" + sess + " sess, " + role + " self, org.scribble.runtime.net.ScribMessageFormatter smf) throws java.io.IOException, org.scribble.main.ScribbleRuntimeException {\n"; - epClass += "super(sess, self, smf);\n"; + epClass += "super(sess, self, smf, " + pack + ".states." + this.self + "." + name + "_" + init.id + ".id" + ");\n"; // FIXME: factor out epClass += "}\n"; epClass += "\n"; @@ -91,19 +95,50 @@ public Map buildEndpointClass() throws ScribbleException epClass += "}\n";*/ epClass += "}\n"; - - for (EState s : states) - { - epClass += "\n"; - epClass += "final class " + name + "_" + s.id + " {\n"; - epClass += "public static final " + name + "_" + s.id + " id = new " + name + "_" + s.id + "();\n"; - epClass += "private " + name + "_" + s.id + "() {} \n"; - epClass += "}\n"; - } Map res = new HashMap<>(); String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/" + this.self + "/" ; // StateChannelApiGenerator#generateApi res.put(prefix + name + ".java", epClass); + + prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/states/" + this.self + "/" ; // StateChannelApiGenerator#generateApi + for (EState s : states) + { + EStateKind kind = s.getStateKind(); + String stateId = (kind == EStateKind.TERMINAL) ? "End" : name + "_" + s.id; + String stateKind; + switch (kind) + { + case OUTPUT: stateKind = "org.scribble.runtime.net.state.ScribOutputState"; break; + case UNARY_INPUT: + case POLY_INPUT: stateKind = "org.scribble.runtime.net.state.ScribInputState"; break; + case TERMINAL: stateKind = "org.scribble.runtime.net.state.ScribEndState"; break; + case ACCEPT: + case WRAP_SERVER: + throw new RuntimeException("TODO"); + default: + throw new RuntimeException("TODO"); + } + String stateClass = ""; + stateClass += "package " + pack + ".states." + this.self + ";\n"; + stateClass += "\n"; + stateClass += "public final class " + stateId + " extends " + stateKind + " {\n"; + stateClass += "public static final " + stateId + " id = new " + stateId + "(" + + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + s.getActions().get(0).peer + "." + s.getActions().get(0).peer : "") + + ");\n"; + stateClass += "private " + stateId + "(" + + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? "org.scribble.type.name.Role peer" : "") + + ") {\n"; + stateClass += ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? "super(\"" + stateId + "\", peer);" : "super(\"" + stateId + "\");") + "\n"; + for (EAction a : s.getAllActions()) + { + stateClass += "this.succs.put(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + + ", " + ((s.getSuccessor(a).getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.getSuccessor(a).id) + ".id);\n"; + } + stateClass += "}\n"; + stateClass += "}\n"; + res.put(prefix + stateId + ".java", stateClass); + } + return res; } @@ -115,27 +150,55 @@ public static String getEDStateEnum(GProtocolName gpn, Role self, EState s) private String generateRegister(GProtocolName gpn, Role self, EState s) { + String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".states." + this.self + "." ; String res = ""; switch (s.getStateKind()) { case OUTPUT: { - // FIXME: "untyped" - res += "public void register(" + gpn.getSimpleName() + "_" + self + "_" + s.id +" sid, Function h) {\n"; + // FIXME: "untyped" (ScribEvent) -- need state-specific "enums" + res += "public void register(" + prefix + gpn.getSimpleName() + "_" + self + "_" + s.id +" sid, java.util.function.Function h) {\n"; res += "this.outputs.put(sid, h);\n"; res += "}\n"; break; } case UNARY_INPUT: case POLY_INPUT: + { + res += "public void register(" + prefix + gpn.getSimpleName() + "_" + self + "_" + s.id + " sid"; + for (EAction a : s.getAllActions()) + { + res += ", org.scribble.util.function.Function2<" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + + ", Object" + + ", Void> h_" + a.mid; + } + res += ") {\n"; + res += "java.util.Map> tmp = this.inputs.get(sid);\n"; + res += "if (tmp == null) {\n"; + res += "tmp = new java.util.HashMap<>();\n"; + res += "this.inputs.put(sid, tmp);\n"; + res += "}\n"; + for (EAction a : s.getAllActions()) + { + res += "tmp.put(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ", h_" + a.mid + ");\n"; + } + res += "}\n"; + res += "\n"; break; + } case TERMINAL: + { break; + } case ACCEPT: case WRAP_SERVER: + { throw new RuntimeException("[scrib] TODO: " + s); + } default: + { throw new RuntimeException("[scrib] Shouldn't get in here: " + s); + } } return res; } diff --git a/scribble-core/src/main/java/org/scribble/type/kind/AbstractKind.java b/scribble-core/src/main/java/org/scribble/type/kind/AbstractKind.java index bd839e5e3..2a527d653 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/AbstractKind.java +++ b/scribble-core/src/main/java/org/scribble/type/kind/AbstractKind.java @@ -15,9 +15,17 @@ public abstract class AbstractKind implements Kind { - public AbstractKind() + protected String kind; // Not final for easier serialiazation (OpKind) + + // For serialization + protected AbstractKind() { + + } + public AbstractKind(String kind) + { + this.kind = kind; } @Override @@ -25,10 +33,18 @@ public AbstractKind() public abstract boolean canEqual(Object o); // Not really needed due to singleton pattern + @Override + public int hashCode() + { + int hash = 7901; + hash = 31 * hash + this.kind.hashCode(); + return hash; + } + @Override public String toString() { String s = this.getClass().toString(); - return s.substring("class org.sribble.sesstype.kind.".length() + 1, s.length()); + return s.substring("class org.sribble.type.kind.".length() + 1, s.length()); // FIXME: factor out by reflection (in initialiser) } } diff --git a/scribble-core/src/main/java/org/scribble/type/kind/AmbigKind.java b/scribble-core/src/main/java/org/scribble/type/kind/AmbigKind.java index e5258eceb..73a09f581 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/AmbigKind.java +++ b/scribble-core/src/main/java/org/scribble/type/kind/AmbigKind.java @@ -20,13 +20,7 @@ public class AmbigKind extends AbstractKind implements NonRoleArgKind//, Payload protected AmbigKind() { - - } - - @Override - public int hashCode() - { - return super.hashCode(); + super("Ambig"); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/kind/DataTypeKind.java b/scribble-core/src/main/java/org/scribble/type/kind/DataTypeKind.java index 0fb05dc57..8eb6ca9ab 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/DataTypeKind.java +++ b/scribble-core/src/main/java/org/scribble/type/kind/DataTypeKind.java @@ -19,13 +19,7 @@ public class DataTypeKind extends AbstractKind implements PayloadTypeKind, Impor protected DataTypeKind() { - - } - - @Override - public int hashCode() - { - return super.hashCode(); + super("DataType"); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/kind/Global.java b/scribble-core/src/main/java/org/scribble/type/kind/Global.java index b3c6f5703..1be5e719e 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/Global.java +++ b/scribble-core/src/main/java/org/scribble/type/kind/Global.java @@ -19,13 +19,7 @@ public class Global extends AbstractKind implements ProtocolKind protected Global() { - - } - - @Override - public int hashCode() - { - return super.hashCode(); + super("Global"); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/kind/Local.java b/scribble-core/src/main/java/org/scribble/type/kind/Local.java index 7f7450692..68534e1c9 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/Local.java +++ b/scribble-core/src/main/java/org/scribble/type/kind/Local.java @@ -19,13 +19,7 @@ public class Local extends AbstractKind implements ProtocolKind, PayloadTypeKind protected Local() { - - } - - @Override - public int hashCode() - { - return super.hashCode(); + super("Local"); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/kind/ModuleKind.java b/scribble-core/src/main/java/org/scribble/type/kind/ModuleKind.java index 2d6391757..1a93f3be2 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/ModuleKind.java +++ b/scribble-core/src/main/java/org/scribble/type/kind/ModuleKind.java @@ -19,13 +19,7 @@ public class ModuleKind extends AbstractKind implements ImportKind protected ModuleKind() { - - } - - @Override - public int hashCode() - { - return super.hashCode(); + super("Module"); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/kind/OpKind.java b/scribble-core/src/main/java/org/scribble/type/kind/OpKind.java index 4a27b5566..a5a82d7fd 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/OpKind.java +++ b/scribble-core/src/main/java/org/scribble/type/kind/OpKind.java @@ -13,6 +13,7 @@ */ package org.scribble.type.kind; +import java.io.IOException; import java.io.Serializable; public class OpKind extends AbstractKind implements MessageIdKind, Serializable @@ -21,15 +22,19 @@ public class OpKind extends AbstractKind implements MessageIdKind, Serializable public static final OpKind KIND = new OpKind(); - protected OpKind() + public OpKind() { - + super("Op"); + } + + private void writeObject(java.io.ObjectOutputStream stream) throws IOException + { + stream.writeObject(this.kind); } - @Override - public int hashCode() + private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException { - return super.hashCode(); + this.kind = (String) stream.readObject(); // i.e. "Op" } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/kind/PackageKind.java b/scribble-core/src/main/java/org/scribble/type/kind/PackageKind.java index eabd07294..dd9acda4f 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/PackageKind.java +++ b/scribble-core/src/main/java/org/scribble/type/kind/PackageKind.java @@ -19,13 +19,7 @@ public class PackageKind extends AbstractKind protected PackageKind() { - - } - - @Override - public int hashCode() - { - return super.hashCode(); + super("Package"); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/kind/RecVarKind.java b/scribble-core/src/main/java/org/scribble/type/kind/RecVarKind.java index b7e9c9ebd..be96ba50d 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/RecVarKind.java +++ b/scribble-core/src/main/java/org/scribble/type/kind/RecVarKind.java @@ -19,13 +19,7 @@ public class RecVarKind extends AbstractKind protected RecVarKind() { - - } - - @Override - public int hashCode() - { - return super.hashCode(); + super("RecVar"); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/kind/RoleKind.java b/scribble-core/src/main/java/org/scribble/type/kind/RoleKind.java index 2325077b0..23313ada6 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/RoleKind.java +++ b/scribble-core/src/main/java/org/scribble/type/kind/RoleKind.java @@ -19,13 +19,7 @@ public class RoleKind extends AbstractKind implements ParamKind protected RoleKind() { - - } - - @Override - public int hashCode() - { - return super.hashCode(); + super("Role"); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/kind/ScopeKind.java b/scribble-core/src/main/java/org/scribble/type/kind/ScopeKind.java index 70293e71d..7fb1fd5a7 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/ScopeKind.java +++ b/scribble-core/src/main/java/org/scribble/type/kind/ScopeKind.java @@ -19,13 +19,7 @@ public class ScopeKind extends AbstractKind protected ScopeKind() { - - } - - @Override - public int hashCode() - { - return super.hashCode(); + super("Scope"); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/kind/SigKind.java b/scribble-core/src/main/java/org/scribble/type/kind/SigKind.java index b485b061a..45f495efd 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/SigKind.java +++ b/scribble-core/src/main/java/org/scribble/type/kind/SigKind.java @@ -22,13 +22,7 @@ public class SigKind extends AbstractKind implements NonRoleParamKind, MessageId protected SigKind() { - - } - - @Override - public int hashCode() - { - return super.hashCode(); + super("Sig"); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/name/AbstractName.java b/scribble-core/src/main/java/org/scribble/type/name/AbstractName.java index 12d2ca2ec..4e7f90e4a 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/AbstractName.java +++ b/scribble-core/src/main/java/org/scribble/type/name/AbstractName.java @@ -86,7 +86,7 @@ public boolean equals(Object o) return false; } AbstractName n = (AbstractName) o; - return n.canEqual(this) && this.kind.equals(n.kind) && Arrays.equals(this.elems, (n.elems)); + return n.canEqual(this) && this.kind.equals(n.kind) && Arrays.equals(this.elems, n.elems); } public abstract boolean canEqual(Object o); diff --git a/scribble-core/src/main/java/org/scribble/util/function/Function2.java b/scribble-core/src/main/java/org/scribble/util/function/Function2.java new file mode 100644 index 000000000..159559699 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/util/function/Function2.java @@ -0,0 +1,7 @@ +package org.scribble.util.function; + +@FunctionalInterface +public interface Function2 +{ + public R apply (A a, B b); +} \ No newline at end of file diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribMessage.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribMessage.java index 70a105011..cb901a0f1 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribMessage.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribMessage.java @@ -60,7 +60,7 @@ public int hashCode() { int hash = 73; //hash = 31 * hash + super.hashCode(); - hash = 31 * hash + op.hashCode(); + hash = 31 * hash + this.op.hashCode(); hash = 31 * hash + this.payload.hashCode(); return hash; } diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java index b514918e8..16ade7043 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java @@ -14,15 +14,164 @@ package org.scribble.runtime.net.session; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.function.Function; import org.scribble.main.ScribbleRuntimeException; +import org.scribble.runtime.net.ScribMessage; import org.scribble.runtime.net.ScribMessageFormatter; +import org.scribble.runtime.net.state.ScribEndState; +import org.scribble.runtime.net.state.ScribEvent; +import org.scribble.runtime.net.state.ScribInputState; +import org.scribble.runtime.net.state.ScribOutputState; +import org.scribble.runtime.net.state.ScribState; +import org.scribble.type.name.Op; import org.scribble.type.name.Role; +import org.scribble.util.function.Function2; public class EventDrivenEndpoint extends MPSTEndpoint { - public EventDrivenEndpoint(S sess, R self, ScribMessageFormatter smf) throws IOException, ScribbleRuntimeException + protected final ScribState init; + protected final Map> outputs = new HashMap<>(); + protected final Map>> inputs = new HashMap<>(); + + public EventDrivenEndpoint(S sess, R self, ScribMessageFormatter smf, ScribState init) throws IOException, ScribbleRuntimeException { super(sess, self, smf); + this.init = init; + } + + /*public void register() + { + + }*/ + + public Future run() + { + // FIXME: make linear + + Object[] res = new Object[1]; + + new Thread() + { + private final EventDrivenEndpoint edep; + + { + this.edep = EventDrivenEndpoint.this; + } + + public void run() + { + try + { + ScribState curr = this.edep.init; + while (!(curr instanceof ScribEndState)) + { + if (curr instanceof ScribOutputState) + { + ScribEvent m = this.edep.outputs.get(curr).apply(null); // FIXME: state object + getChannelEndpoint(m.peer).write(new ScribMessage(m.op, m.payload)); // FIXME: ScribEvent has extra Role + curr = ((ScribOutputState) curr).succs.get(m.op); + } + else if (curr instanceof ScribInputState) + { + try // cf. ReceiveSocket#readScribMessage + { + ScribMessage m = getChannelEndpoint(((ScribInputState) curr).peer).getFuture().get(); + this.edep.inputs.get(curr).get(m.op).apply(null, null); // FIXME: state object and received payloads -- null op OK? + curr = ((ScribInputState) curr).succs.get(m.op); + } + catch (InterruptedException e) + { + //throw new IOException(e); + res[0] = new IOException(e); + break; + } + catch (ExecutionException e) + { + //throw new IOException(e); + res[0] = new IOException(e); + break; + } + } + else + { + throw new RuntimeException("Shouldn't get in here: "); + } + } + } + catch (IOException e) + { + res[0] = e; + } + + if (res[0] == null) + { + res[0] = 0; + } + synchronized(res) + { + res.notify(); + } + } + }.start(); + + return new EventDrivenEndpointFuture(res); } } + +class EventDrivenEndpointFuture implements Future +{ + private final Object[] res; + + protected EventDrivenEndpointFuture(Object[] res) + { + this.res = res; + } + + @Override + public boolean cancel(boolean mayInterruptIfRunning) + { + throw new RuntimeException("TODO"); + } + + @Override + public Void get() throws InterruptedException, ExecutionException + { + while (this.res[0] == null) + { + synchronized (this.res) + { + this.res.wait(); + } + } + if (this.res[0] instanceof IOException) + { + throw new ExecutionException((IOException) this.res[0]); + } + return null; + } + + @Override + public Void get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException + { + throw new RuntimeException("TODO"); + } + + @Override + public boolean isCancelled() + { + throw new RuntimeException("TODO"); + } + + @Override + public boolean isDone() + { + return this.res[0] != null; + } +} \ No newline at end of file diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEndState.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEndState.java new file mode 100644 index 000000000..09b55d186 --- /dev/null +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEndState.java @@ -0,0 +1,17 @@ +package org.scribble.runtime.net.state; + +abstract public class ScribEndState extends ScribState +{ + //public ScribEndState() + public ScribEndState(String name) + { + //super("End"); + super(name); + } + + @Override + protected boolean canEqual(Object o) + { + return o instanceof ScribEndState; + } +} diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEvent.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEvent.java new file mode 100644 index 000000000..cb40bdc5a --- /dev/null +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEvent.java @@ -0,0 +1,66 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.runtime.net.state; + +import org.scribble.runtime.net.ScribMessage; +import org.scribble.type.name.Op; +import org.scribble.type.name.Role; + +public class ScribEvent extends ScribMessage +{ + private static final long serialVersionUID = 1L; + + public final Role peer; + + public ScribEvent(Role peer, Op op, Object... payload) // FIXME: factor out with EAction? + { + super(op, payload); + this.peer = peer; + } + + @Override + public int hashCode() + { + int hash = 7919; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.peer.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof ScribEvent)) + { + return false; + } + ScribEvent m = (ScribEvent) o; + return m.canEqual(this) && this.peer.equals(m.peer); + } + + public boolean canEqual(Object o) + { + return o instanceof ScribEvent; + } + + @Override + public String toString() + { + return this.peer + ":" + super.toString(); + } +} diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribInputState.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribInputState.java new file mode 100644 index 000000000..1a00ee13b --- /dev/null +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribInputState.java @@ -0,0 +1,20 @@ +package org.scribble.runtime.net.state; + +import org.scribble.type.name.Role; + +abstract public class ScribInputState extends ScribState +{ + public final Role peer; + + public ScribInputState(String name, Role peer) + { + super(name); + this.peer = peer; + } + + @Override + protected boolean canEqual(Object o) + { + return o instanceof ScribInputState; + } +} diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribOutputState.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribOutputState.java new file mode 100644 index 000000000..69c4240ee --- /dev/null +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribOutputState.java @@ -0,0 +1,15 @@ +package org.scribble.runtime.net.state; + +abstract public class ScribOutputState extends ScribState +{ + public ScribOutputState(String name) + { + super(name); + } + + @Override + protected boolean canEqual(Object o) + { + return o instanceof ScribOutputState; + } +} diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribState.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribState.java new file mode 100644 index 000000000..a12dae246 --- /dev/null +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribState.java @@ -0,0 +1,43 @@ +package org.scribble.runtime.net.state; + +import java.util.HashMap; +import java.util.Map; + +import org.scribble.type.name.Op; + +abstract public class ScribState +{ + public final String name; + + public final Map succs = new HashMap<>(); // FIXME + + public ScribState(String name) + { + this.name = name; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof ScribState)) + { + return false; + } + ScribState n = (ScribState) o; + return n.canEqual(this) && this.name.equals(n.name); + } + + protected abstract boolean canEqual(Object o); + + @Override + public int hashCode() + { + int hash = 7907; + hash = 31 * hash + this.name.hashCode(); + return hash; + } +} diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java new file mode 100644 index 000000000..74020c332 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -0,0 +1,65 @@ +package test.test2; + +import static test.test2.Test2.Proto1.Proto1.A; +import static test.test2.Test2.Proto1.Proto1.B; +import static test.test2.Test2.Proto1.Proto1._1; +import static test.test2.Test2.Proto1.Proto1._2; + +import java.io.IOException; +import java.util.concurrent.Future; + +import org.scribble.main.ScribbleRuntimeException; +import org.scribble.runtime.net.ObjectStreamFormatter; +import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.net.state.ScribEvent; + +import test.test2.Test2.Proto1.Proto1; +import test.test2.Test2.Proto1.channels.A.Proto1_A_1; +import test.test2.Test2.Proto1.handlers.A.Proto1_A; +import test.test2.Test2.Proto1.roles.A; +import test.test2.Test2.Proto1.states.A.Proto1_A_5;; + +public class MyA +{ + public static void main(String[] args) throws IOException, ScribbleRuntimeException + { + foo(); + } + + public static void foo() throws IOException, ScribbleRuntimeException + { + Proto1 P1 = new Proto1(); + try (Proto1_A a = new Proto1_A(P1, A, new ObjectStreamFormatter())) + { + a.request(B, SocketChannelEndpoint::new, "localhost", 8888); + a.register(Proto1_A_5.id, x -> new ScribEvent(B, _1)); + //a.register(Proto1_A_5.id, x -> new ScribEvent(B, _2)); + + Future f = a.run(); + f.get(); + + System.out.println("A done"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + public static void foo1() + { + Proto1 P1 = new Proto1(); + try (MPSTEndpoint a = new MPSTEndpoint<>(P1, A, new ObjectStreamFormatter())) + { + a.request(B, SocketChannelEndpoint::new, "localhost", 8888); + + new Proto1_A_1(a).send(B, _1); + //new Proto1_A_1(a).send(B, _2); + } + catch (Exception e) + { + e.printStackTrace(); + } + } +} diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java new file mode 100644 index 000000000..8fe85ef8f --- /dev/null +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -0,0 +1,95 @@ +package test.test2; + +import static test.test2.Test2.Proto1.Proto1.A; +import static test.test2.Test2.Proto1.Proto1.B; +import static test.test2.Test2.Proto1.Proto1._2; + +import java.io.IOException; +import java.util.concurrent.Future; + +import org.scribble.main.ScribbleRuntimeException; +import org.scribble.runtime.net.ObjectStreamFormatter; +import org.scribble.runtime.net.scribsock.ScribServerSocket; +import org.scribble.runtime.net.scribsock.SocketChannelServer; +import org.scribble.runtime.net.session.MPSTEndpoint; + +import test.test2.Test2.Proto1.Proto1; +import test.test2.Test2.Proto1.channels.B.EndSocket; +import test.test2.Test2.Proto1.channels.B.Proto1_B_1; +import test.test2.Test2.Proto1.channels.B.Proto1_B_1_Handler; +import test.test2.Test2.Proto1.handlers.B.Proto1_B; +import test.test2.Test2.Proto1.ops._1; +import test.test2.Test2.Proto1.ops._2; +import test.test2.Test2.Proto1.roles.B; +import test.test2.Test2.Proto1.states.B.Proto1_B_10; + +public class MyB +{ + public static void main(String[] args) throws IOException, ScribbleRuntimeException + { + foo(); + } + + public static void foo1() throws IOException, ScribbleRuntimeException + { + try (ScribServerSocket ss = new SocketChannelServer(8888)) + { + while (true) + { + Proto1 P1 = new Proto1(); + try (MPSTEndpoint b = new MPSTEndpoint<>(P1, B, new ObjectStreamFormatter())) + { + b.accept(ss, A); + + new Proto1_B_1(b).branch(A, new MyHandler()); + } + catch (Exception e)//ScribbleRuntimeException | IOException | ExecutionException | InterruptedException | ClassNotFoundException e) + { + e.printStackTrace(); + } + } + } + } + + public static void foo() throws IOException, ScribbleRuntimeException + { + try (ScribServerSocket ss = new SocketChannelServer(8888)) + { + while (true) + { + Proto1 P1 = new Proto1(); + try (Proto1_B b = new Proto1_B(P1, B, new ObjectStreamFormatter())) + { + b.accept(ss, A); + b.register(Proto1_B_10.id, + (op, sess) -> { System.out.println("Done 1"); return null; }, + (op, sess) -> { System.out.println("Done 2"); return null; }); + + Future f = b.run(); + f.get(); + + System.out.println("B done"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + } +} + +class MyHandler implements Proto1_B_1_Handler +{ + @Override + public void receive(EndSocket schan, _1 op) throws org.scribble.main.ScribbleRuntimeException, java.io.IOException, ClassNotFoundException + { + System.out.println("Done 1"); + } + + @Override + public void receive(EndSocket schan, _2 op) throws org.scribble.main.ScribbleRuntimeException, java.io.IOException, ClassNotFoundException + { + System.out.println("Done 1"); + } +} diff --git a/scribble-test/src/test/scrib/test/test2/Test2.scr b/scribble-test/src/test/scrib/test/test2/Test2.scr new file mode 100644 index 000000000..fe3c21093 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test2/Test2.scr @@ -0,0 +1,18 @@ +//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test2/Test2.scr -ip scribble-test/src/test/scrib/ -d scribble-test/src/test/scrib/ -api Proto1 A -V +//$ javadoc -cp scribble-cli/target/classes/';'scribble-test/target/classes';'scribble-parser/target/classes';'scribble-parser/lib/antlr-3.5.2-complete.jar';'scrib-core/src/test/scrib scrib-core/src/test/scrib/test/test2/Proto1*.java -d test/doc/test2 + +module test.test2.Test2; + +type "java.lang.Integer" from "rt.jar" as Integer; + +global protocol Proto1(role A, role B) +{ + choice at A + { + 1() from A to B; + } + or + { + 2() from A to B; + } +} From 2d9ea58efe4f66cad6fdc604f235013690548c37 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 6 Mar 2018 21:31:10 +0000 Subject: [PATCH 009/539] Minor. --- .../net/session/EventDrivenEndpoint.java | 1 + .../src/test/scrib/test/test2/MyA.java | 5 ++-- .../src/test/scrib/test/test2/MyB.java | 29 ++++++++++--------- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java index 16ade7043..3ccdc8282 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java @@ -118,6 +118,7 @@ else if (curr instanceof ScribInputState) { res.notify(); } + setCompleted(); } }.start(); diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index 74020c332..981286a3c 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -33,8 +33,9 @@ public static void foo() throws IOException, ScribbleRuntimeException try (Proto1_A a = new Proto1_A(P1, A, new ObjectStreamFormatter())) { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); - a.register(Proto1_A_5.id, x -> new ScribEvent(B, _1)); - //a.register(Proto1_A_5.id, x -> new ScribEvent(B, _2)); + //a.register(Proto1_A_5.id, x -> new ScribEvent(B, _1)); + a.register(Proto1_A_5.id, x -> new ScribEvent(B, _2)); + .// FIXME: type by Op; sort out session object Future f = a.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java index 8fe85ef8f..35f33930e 100644 --- a/scribble-test/src/test/scrib/test/test2/MyB.java +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -30,20 +30,27 @@ public static void main(String[] args) throws IOException, ScribbleRuntimeExcept foo(); } - public static void foo1() throws IOException, ScribbleRuntimeException + public static void foo() throws IOException, ScribbleRuntimeException { try (ScribServerSocket ss = new SocketChannelServer(8888)) { while (true) { Proto1 P1 = new Proto1(); - try (MPSTEndpoint b = new MPSTEndpoint<>(P1, B, new ObjectStreamFormatter())) + try (Proto1_B b = new Proto1_B(P1, B, new ObjectStreamFormatter())) { b.accept(ss, A); + b.register(Proto1_B_10.id, + (op, sess) -> { System.out.println("Done 1"); return null; }, + (op, sess) -> { System.out.println("Done 2"); return null; }); + .// FIXME: payloads - new Proto1_B_1(b).branch(A, new MyHandler()); + Future f = b.run(); + f.get(); + + System.out.println("B done"); } - catch (Exception e)//ScribbleRuntimeException | IOException | ExecutionException | InterruptedException | ClassNotFoundException e) + catch (Exception e) { e.printStackTrace(); } @@ -51,26 +58,20 @@ public static void foo1() throws IOException, ScribbleRuntimeException } } - public static void foo() throws IOException, ScribbleRuntimeException + public static void foo1() throws IOException, ScribbleRuntimeException { try (ScribServerSocket ss = new SocketChannelServer(8888)) { while (true) { Proto1 P1 = new Proto1(); - try (Proto1_B b = new Proto1_B(P1, B, new ObjectStreamFormatter())) + try (MPSTEndpoint b = new MPSTEndpoint<>(P1, B, new ObjectStreamFormatter())) { b.accept(ss, A); - b.register(Proto1_B_10.id, - (op, sess) -> { System.out.println("Done 1"); return null; }, - (op, sess) -> { System.out.println("Done 2"); return null; }); - Future f = b.run(); - f.get(); - - System.out.println("B done"); + new Proto1_B_1(b).branch(A, new MyHandler()); } - catch (Exception e) + catch (Exception e)//ScribbleRuntimeException | IOException | ExecutionException | InterruptedException | ClassNotFoundException e) { e.printStackTrace(); } From 270e63c2394aafb1cca8540b2083ae22788f8ea8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 7 Mar 2018 14:05:04 +0000 Subject: [PATCH 010/539] Continued. --- .../eventdriven/EDEndpointApiGenerator.java | 157 ++++++++++++++++-- .../net/session/EventDrivenEndpoint.java | 17 +- .../runtime/net/state/ScribBranch.java | 9 + .../runtime/net/state/ScribEvent.java | 16 +- .../net/state/ScribHandlerMessage.java | 14 ++ .../src/test/scrib/test/test2/MyA.java | 35 +++- .../src/test/scrib/test/test2/MyB.java | 82 ++++++--- 7 files changed, 274 insertions(+), 56 deletions(-) create mode 100644 scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribBranch.java create mode 100644 scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerMessage.java diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java index 23898093d..8124edf17 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java @@ -8,7 +8,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.scribble.ast.Module; +import org.scribble.ast.global.GProtocolDecl; import org.scribble.codegen.java.endpointapi.SessionApiGenerator; +import org.scribble.codegen.java.util.ClassBuilder; +import org.scribble.del.ModuleDel; import org.scribble.main.Job; import org.scribble.main.JobContext; import org.scribble.main.ScribbleException; @@ -16,8 +20,13 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.EStateKind; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.kind.Kind; +import org.scribble.type.name.DataType; import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.MessageId; +import org.scribble.type.name.PayloadElemType; import org.scribble.type.name.Role; +import org.scribble.visit.util.MessageIdCollector; // From ParamCoreEndpointApiGenerator public class EDEndpointApiGenerator @@ -59,6 +68,7 @@ public Map buildEndpointClass() throws ScribbleException states.add(init); states.addAll(MState.getReachableStates(init)); + // frontend handler class String pack = SessionApiGenerator.getEndpointApiRootPackageName(this.proto); String name = this.proto.getSimpleName() + "_" + this.self; String sess = pack + "." + this.proto.getSimpleName(); @@ -78,7 +88,7 @@ public Map buildEndpointClass() throws ScribbleException epClass += "public " + name + "(" + sess + " sess, " + role + " self, org.scribble.runtime.net.ScribMessageFormatter smf) throws java.io.IOException, org.scribble.main.ScribbleRuntimeException {\n"; - epClass += "super(sess, self, smf, " + pack + ".states." + this.self + "." + name + "_" + init.id + ".id" + ");\n"; // FIXME: factor out + epClass += "super(sess, self, smf, " + pack + ".handlers.states." + this.self + "." + name + "_" + init.id + ".id" + ");\n"; // FIXME: factor out epClass += "}\n"; epClass += "\n"; @@ -97,10 +107,11 @@ public Map buildEndpointClass() throws ScribbleException epClass += "}\n"; Map res = new HashMap<>(); - String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/" + this.self + "/" ; // StateChannelApiGenerator#generateApi + String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/" + this.self + "/"; // StateChannelApiGenerator#generateApi res.put(prefix + name + ".java", epClass); - prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/states/" + this.self + "/" ; // StateChannelApiGenerator#generateApi + // states + String sprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/states/" + this.self + "/"; // StateChannelApiGenerator#generateApi for (EState s : states) { EStateKind kind = s.getStateKind(); @@ -119,7 +130,7 @@ public Map buildEndpointClass() throws ScribbleException throw new RuntimeException("TODO"); } String stateClass = ""; - stateClass += "package " + pack + ".states." + this.self + ";\n"; + stateClass += "package " + pack + ".handlers.states." + this.self + ";\n"; stateClass += "\n"; stateClass += "public final class " + stateId + " extends " + stateKind + " {\n"; stateClass += "public static final " + stateId + " id = new " + stateId + "(" @@ -136,9 +147,127 @@ public Map buildEndpointClass() throws ScribbleException } stateClass += "}\n"; stateClass += "}\n"; - res.put(prefix + stateId + ".java", stateClass); + res.put(sprefix + stateId + ".java", stateClass); + + // messages + if (s.getStateKind() == EStateKind.OUTPUT) + { + String mprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/states/" + this.self + "/messages/"; + + String messageIfName = name + "_" + s.id + "_Message"; + String messageInterface = ""; + messageInterface += "package " + pack + ".handlers.states." + this.self + ".messages;\n"; + messageInterface += "\n"; + messageInterface += "public interface " + messageIfName + " extends org.scribble.runtime.net.state.ScribHandlerMessage {\n"; + messageInterface += "}\n"; + res.put(mprefix + messageIfName + ".java", messageInterface); + + for (EAction a : s.getAllActions()) + { + String messageName = name + "_" + s.id + "_" + SessionApiGenerator.getOpClassName(a.mid); + String messageClass = ""; + messageClass += "package " + pack + ".handlers.states." + this.self + ".messages;\n"; + messageClass += "\n"; + messageClass += "public class " + messageName + " implements " + messageIfName + " {\n"; + messageClass += "public final java.util.List pay = new java.util.LinkedList<>();\n"; + messageClass += "public " + messageName + "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " role"; + int i = 1; + for (PayloadElemType pet : a.payload.elems) + { + DataType dt = (DataType) pet; + messageClass += ", " + dt + " arg" + i++; + } + messageClass += ") {\n"; + for (int j = 1; j <= a.payload.elems.size(); j++) + { + messageClass += "this.pay.add(arg" + j + ");\n"; + } + messageClass += "}\n"; + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public org.scribble.type.name.Role getPeer() {\n"; + messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ";\n"; + messageClass += "}\n"; + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public org.scribble.type.name.Op getOp() {\n"; + messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";\n"; + messageClass += "}\n"; + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public java.util.List getPayload() {\n"; + messageClass += "return this.pay;\n"; + messageClass += "}\n"; + messageClass += "}\n"; + res.put(mprefix + messageName + ".java", messageClass); + } + } + + // branches + if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) + { + String bprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/" + this.self + "/"; + String branchName = name + "_" + s.id + "_Branch"; + String branchInterface = ""; + branchInterface += "package " + pack + ".handlers." + this.self + ";\n"; + branchInterface += ""; + branchInterface += "public abstract class " + branchName + " implements org.scribble.runtime.net.state.ScribBranch {\n"; + for (EAction a : s.getAllActions()) + { + branchInterface += "\npublic abstract void receive(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + " op"; + int i = 1; + for (PayloadElemType pet : a.payload.elems) + { + DataType dt = (DataType) pet; + branchInterface += ", " + dt + " arg" + i++; + } + branchInterface += ");\n"; + } + + branchInterface += "\n"; + branchInterface += "@Override\n"; + branchInterface += "public void dispatch(org.scribble.runtime.net.ScribMessage m) {\n"; + branchInterface += "switch (m.op.toString()) {\n"; + for (EAction a : s.getAllActions()) + { + branchInterface += "case \"" + SessionApiGenerator.getOpClassName(a.mid) + "\": receive("; + branchInterface += "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + ") m.op"; + int i = 0; + for (PayloadElemType pet : a.payload.elems) + { + DataType dt = (DataType) pet; + branchInterface += ", (" + dt + ") m.payload[" + i++ + "]"; + } + branchInterface += "); break;\n"; + } + branchInterface += "default: throw new RuntimeException(\"Shouldn't get in here: \" + m);\n"; + branchInterface += "}\n"; + branchInterface += "}\n"; + branchInterface += "}\n"; + + res.put(bprefix + branchName + ".java", branchInterface); + } } + /*// SessionApiGenerator#constructOpClasses + Module mod = this.job.getContext().getModule(this.proto.getPrefix()); + GProtocolName simpname = this.proto.getSimpleName(); + GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDecl(simpname); + MessageIdCollector coll = new MessageIdCollector(this.job, ((ModuleDel) mod.del()).getModuleContext()); + gpd.accept(coll); + for (MessageId mid : coll.getNames()) + { + String messageName = SessionApiGenerator.getOpClassName(mid); + String messageClass = ""; + messageClass += "package " + pack + ".handlers.messages;\n"; + messageClass += "\n"; + messageClass += "public class " + messageName + " {\n"; + messageClass += "public final java.util.List pay = new java.util.LinkedList<>();\n"; + messageClass += "public " + messageName + "(" + + ")"; + messageClass += "}\n"; + res.put(prefix + messageName + ".java", messageClass); + }*/ + return res; } @@ -150,14 +279,17 @@ public static String getEDStateEnum(GProtocolName gpn, Role self, EState s) private String generateRegister(GProtocolName gpn, Role self, EState s) { - String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".states." + this.self + "." ; + String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." ; String res = ""; + String name = gpn.getSimpleName() + "_" + self; switch (s.getStateKind()) { case OUTPUT: { // FIXME: "untyped" (ScribEvent) -- need state-specific "enums" - res += "public void register(" + prefix + gpn.getSimpleName() + "_" + self + "_" + s.id +" sid, java.util.function.Function h) {\n"; + res += "public void register(" + prefix + name + "_" + s.id + + " sid, java.util.function.Function h) {\n"; // FIXME: factor out res += "this.outputs.put(sid, h);\n"; res += "}\n"; break; @@ -165,25 +297,26 @@ private String generateRegister(GProtocolName gpn, Role self, EState s) case UNARY_INPUT: case POLY_INPUT: { - res += "public void register(" + prefix + gpn.getSimpleName() + "_" + self + "_" + s.id + " sid"; - for (EAction a : s.getAllActions()) + res += "public void register(" + prefix + name + "_" + s.id + " sid"; + /*for (EAction a : s.getAllActions()) { res += ", org.scribble.util.function.Function2<" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + ", Object" + ", Void> h_" + a.mid; } - res += ") {\n"; res += "java.util.Map> tmp = this.inputs.get(sid);\n"; res += "if (tmp == null) {\n"; res += "tmp = new java.util.HashMap<>();\n"; res += "this.inputs.put(sid, tmp);\n"; - res += "}\n"; for (EAction a : s.getAllActions()) { res += "tmp.put(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ", h_" + a.mid + ");\n"; } + res += "}\n";*/ + res += ", " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + "." + name + "_" + s.id + "_Branch b"; + res += ") {\n"; + res += "this.inputs.put(sid, b);\n"; res += "}\n"; - res += "\n"; break; } case TERMINAL: diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java index 3ccdc8282..36ae89c2e 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java @@ -25,20 +25,21 @@ import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.net.ScribMessage; import org.scribble.runtime.net.ScribMessageFormatter; +import org.scribble.runtime.net.state.ScribBranch; import org.scribble.runtime.net.state.ScribEndState; -import org.scribble.runtime.net.state.ScribEvent; +import org.scribble.runtime.net.state.ScribHandlerMessage; import org.scribble.runtime.net.state.ScribInputState; import org.scribble.runtime.net.state.ScribOutputState; import org.scribble.runtime.net.state.ScribState; import org.scribble.type.name.Op; import org.scribble.type.name.Role; -import org.scribble.util.function.Function2; public class EventDrivenEndpoint extends MPSTEndpoint { protected final ScribState init; - protected final Map> outputs = new HashMap<>(); - protected final Map>> inputs = new HashMap<>(); + protected final Map> outputs = new HashMap<>(); + //protected final Map>> inputs = new HashMap<>(); + protected final Map inputs = new HashMap<>(); public EventDrivenEndpoint(S sess, R self, ScribMessageFormatter smf, ScribState init) throws IOException, ScribbleRuntimeException { @@ -74,16 +75,16 @@ public void run() { if (curr instanceof ScribOutputState) { - ScribEvent m = this.edep.outputs.get(curr).apply(null); // FIXME: state object - getChannelEndpoint(m.peer).write(new ScribMessage(m.op, m.payload)); // FIXME: ScribEvent has extra Role - curr = ((ScribOutputState) curr).succs.get(m.op); + ScribHandlerMessage m = this.edep.outputs.get(curr).apply(null); // FIXME: state object + getChannelEndpoint(m.getPeer()).write(new ScribMessage(m.getOp(), m.getPayload())); // FIXME: ScribEvent has extra Role + curr = ((ScribOutputState) curr).succs.get(m.getOp()); } else if (curr instanceof ScribInputState) { try // cf. ReceiveSocket#readScribMessage { ScribMessage m = getChannelEndpoint(((ScribInputState) curr).peer).getFuture().get(); - this.edep.inputs.get(curr).get(m.op).apply(null, null); // FIXME: state object and received payloads -- null op OK? + this.edep.inputs.get(curr).dispatch(m); // FIXME: state object and received payloads -- null op OK? curr = ((ScribInputState) curr).succs.get(m.op); } catch (InterruptedException e) diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribBranch.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribBranch.java new file mode 100644 index 000000000..2ba9c25e0 --- /dev/null +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribBranch.java @@ -0,0 +1,9 @@ +package org.scribble.runtime.net.state; + +import org.scribble.runtime.net.ScribMessage; + +// FIXME: integrate with BranchSocket and Handlers +public interface ScribBranch +{ + public void dispatch(ScribMessage m); +} diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEvent.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEvent.java index cb40bdc5a..39fd1215a 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEvent.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEvent.java @@ -14,18 +14,19 @@ package org.scribble.runtime.net.state; import org.scribble.runtime.net.ScribMessage; -import org.scribble.type.name.Op; import org.scribble.type.name.Role; -public class ScribEvent extends ScribMessage +@Deprecated +public class ScribEvent extends ScribMessage { private static final long serialVersionUID = 1L; - public final Role peer; + public final R peer; - public ScribEvent(Role peer, Op op, Object... payload) // FIXME: factor out with EAction? + //public ScribEvent(Role peer, Op op, Object... payload) // FIXME: factor out with EAction? + public ScribEvent(R peer, M m) // FIXME: factor out with EAction? { - super(op, payload); + super(m.getOp(), m.getPayload()); this.peer = peer; } @@ -49,10 +50,11 @@ public boolean equals(Object o) { return false; } - ScribEvent m = (ScribEvent) o; - return m.canEqual(this) && this.peer.equals(m.peer); + ScribEvent m = (ScribEvent) o; + return super.equals(o) && this.peer.equals(m.peer); // Does canEqual } + @Override public boolean canEqual(Object o) { return o instanceof ScribEvent; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerMessage.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerMessage.java new file mode 100644 index 000000000..70fda5bc8 --- /dev/null +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerMessage.java @@ -0,0 +1,14 @@ +package org.scribble.runtime.net.state; + +import java.util.List; + +import org.scribble.type.name.Op; +import org.scribble.type.name.Role; + +// FIXME: integrate with ScribMessage (maybe rename latter to ScribRuntimeMessage) +public interface ScribHandlerMessage +{ + Role getPeer(); + Op getOp(); + List getPayload(); +} diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index 981286a3c..362c09199 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -3,7 +3,6 @@ import static test.test2.Test2.Proto1.Proto1.A; import static test.test2.Test2.Proto1.Proto1.B; import static test.test2.Test2.Proto1.Proto1._1; -import static test.test2.Test2.Proto1.Proto1._2; import java.io.IOException; import java.util.concurrent.Future; @@ -12,22 +11,42 @@ import org.scribble.runtime.net.ObjectStreamFormatter; import org.scribble.runtime.net.session.MPSTEndpoint; import org.scribble.runtime.net.session.SocketChannelEndpoint; -import org.scribble.runtime.net.state.ScribEvent; import test.test2.Test2.Proto1.Proto1; import test.test2.Test2.Proto1.channels.A.Proto1_A_1; import test.test2.Test2.Proto1.handlers.A.Proto1_A; -import test.test2.Test2.Proto1.roles.A; -import test.test2.Test2.Proto1.states.A.Proto1_A_5;; +import test.test2.Test2.Proto1.handlers.states.A.Proto1_A_5; +import test.test2.Test2.Proto1.handlers.states.A.messages.Proto1_A_5__2; +import test.test2.Test2.Proto1.roles.A;; public class MyA { public static void main(String[] args) throws IOException, ScribbleRuntimeException { - foo(); + foo3(); + } + + public static void foo3() throws IOException, ScribbleRuntimeException + { + Proto1 P1 = new Proto1(); + try (Proto1_A a = new Proto1_A(P1, A, new ObjectStreamFormatter())) + { + a.request(B, SocketChannelEndpoint::new, "localhost", 8888); + //a.register(Proto1_A_5.id, x -> new Proto1_A_5__1(B)); + a.register(Proto1_A_5.id, x -> new Proto1_A_5__2(B)); + + Future f = a.run(); + f.get(); + + System.out.println("A done"); + } + catch (Exception e) + { + e.printStackTrace(); + } } - public static void foo() throws IOException, ScribbleRuntimeException + /*public static void foo2() throws IOException, ScribbleRuntimeException { Proto1 P1 = new Proto1(); try (Proto1_A a = new Proto1_A(P1, A, new ObjectStreamFormatter())) @@ -35,7 +54,7 @@ public static void foo() throws IOException, ScribbleRuntimeException a.request(B, SocketChannelEndpoint::new, "localhost", 8888); //a.register(Proto1_A_5.id, x -> new ScribEvent(B, _1)); a.register(Proto1_A_5.id, x -> new ScribEvent(B, _2)); - .// FIXME: type by Op; sort out session object + // FIXME: type by Op (state-specific op enum for state-specific scribevent?); sort out session object Future f = a.run(); f.get(); @@ -46,7 +65,7 @@ public static void foo() throws IOException, ScribbleRuntimeException { e.printStackTrace(); } - } + }*/ public static void foo1() { diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java index 35f33930e..eac39233d 100644 --- a/scribble-test/src/test/scrib/test/test2/MyB.java +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -2,7 +2,6 @@ import static test.test2.Test2.Proto1.Proto1.A; import static test.test2.Test2.Proto1.Proto1.B; -import static test.test2.Test2.Proto1.Proto1._2; import java.io.IOException; import java.util.concurrent.Future; @@ -18,19 +17,60 @@ import test.test2.Test2.Proto1.channels.B.Proto1_B_1; import test.test2.Test2.Proto1.channels.B.Proto1_B_1_Handler; import test.test2.Test2.Proto1.handlers.B.Proto1_B; +import test.test2.Test2.Proto1.handlers.B.Proto1_B_10_Branch; +import test.test2.Test2.Proto1.handlers.states.B.Proto1_B_10; import test.test2.Test2.Proto1.ops._1; import test.test2.Test2.Proto1.ops._2; import test.test2.Test2.Proto1.roles.B; -import test.test2.Test2.Proto1.states.B.Proto1_B_10; public class MyB { public static void main(String[] args) throws IOException, ScribbleRuntimeException { - foo(); + foo3(); } - public static void foo() throws IOException, ScribbleRuntimeException + public static void foo3() throws IOException, ScribbleRuntimeException + { + class MyHandler extends Proto1_B_10_Branch + { + @Override + public void receive(_1 op) + { + System.out.println("Done 1"); + } + + @Override + public void receive(_2 op) + { + System.out.println("Done 2"); + } + } + + try (ScribServerSocket ss = new SocketChannelServer(8888)) + { + while (true) + { + Proto1 P1 = new Proto1(); + try (Proto1_B b = new Proto1_B(P1, B, new ObjectStreamFormatter())) + { + b.accept(ss, A); + b.register(Proto1_B_10.id, new MyHandler()); + + Future f = b.run(); + f.get(); + + System.out.println("B done"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + } + + /*public static void foo2() throws IOException, ScribbleRuntimeException { try (ScribServerSocket ss = new SocketChannelServer(8888)) { @@ -43,7 +83,7 @@ public static void foo() throws IOException, ScribbleRuntimeException b.register(Proto1_B_10.id, (op, sess) -> { System.out.println("Done 1"); return null; }, (op, sess) -> { System.out.println("Done 2"); return null; }); - .// FIXME: payloads + // FIXME: branch handler objects and payloads Future f = b.run(); f.get(); @@ -56,10 +96,25 @@ public static void foo() throws IOException, ScribbleRuntimeException } } } - } + }*/ public static void foo1() throws IOException, ScribbleRuntimeException { + class MyHandler implements Proto1_B_1_Handler + { + @Override + public void receive(EndSocket schan, _1 op) throws org.scribble.main.ScribbleRuntimeException, java.io.IOException, ClassNotFoundException + { + System.out.println("Done 1"); + } + + @Override + public void receive(EndSocket schan, _2 op) throws org.scribble.main.ScribbleRuntimeException, java.io.IOException, ClassNotFoundException + { + System.out.println("Done 1"); + } + } + try (ScribServerSocket ss = new SocketChannelServer(8888)) { while (true) @@ -79,18 +134,3 @@ public static void foo1() throws IOException, ScribbleRuntimeException } } } - -class MyHandler implements Proto1_B_1_Handler -{ - @Override - public void receive(EndSocket schan, _1 op) throws org.scribble.main.ScribbleRuntimeException, java.io.IOException, ClassNotFoundException - { - System.out.println("Done 1"); - } - - @Override - public void receive(EndSocket schan, _2 op) throws org.scribble.main.ScribbleRuntimeException, java.io.IOException, ClassNotFoundException - { - System.out.println("Done 1"); - } -} From 3b82fc572deb069bad1df1ea5aa9184c63335d93 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 7 Mar 2018 15:45:00 +0000 Subject: [PATCH 011/539] Added all-states-registered check to ED API run. --- .../eventdriven/EDEndpointApiGenerator.java | 21 ++++++++++++------- .../net/session/EventDrivenEndpoint.java | 4 +--- .../runtime/net/state/ScribState.java | 6 ++++++ .../src/test/scrib/test/test2/MyA.java | 5 +++-- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java index 8124edf17..50d13725b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java @@ -8,11 +8,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.ast.Module; -import org.scribble.ast.global.GProtocolDecl; import org.scribble.codegen.java.endpointapi.SessionApiGenerator; -import org.scribble.codegen.java.util.ClassBuilder; -import org.scribble.del.ModuleDel; import org.scribble.main.Job; import org.scribble.main.JobContext; import org.scribble.main.ScribbleException; @@ -20,13 +16,10 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.EStateKind; import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.kind.Kind; import org.scribble.type.name.DataType; import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.MessageId; import org.scribble.type.name.PayloadElemType; import org.scribble.type.name.Role; -import org.scribble.visit.util.MessageIdCollector; // From ParamCoreEndpointApiGenerator public class EDEndpointApiGenerator @@ -104,6 +97,20 @@ public Map buildEndpointClass() throws ScribbleException epClass += "this.outputs.put(s, h)"; epClass += "}\n";*/ + epClass += "@Override\n"; + epClass += "public java.util.concurrent.Future run() throws org.scribble.main.ScribbleRuntimeException {\n"; + epClass += "java.util.Set states = java.util.stream.Stream.of(" + states.stream().filter(s -> s.getStateKind() != EStateKind.TERMINAL).map(s -> + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." + this.proto.getSimpleName() + "_" + this.self + "_" + s.id + ".id").collect(Collectors.joining(", ")) + ").collect(java.util.stream.Collectors.toSet());\n"; + epClass += "java.util.Set regd = new java.util.HashSet<>();\n"; + epClass += "regd.addAll(this.inputs.keySet());\n"; + epClass += "regd.addAll(this.outputs.keySet());\n"; + epClass += "if (!states.equals(regd)) {\n"; + epClass += "states.removeAll(regd);\n"; + epClass += "throw new org.scribble.main.ScribbleRuntimeException(\"Missing state registrations: \" + states);\n"; + epClass += "}\n"; + epClass += "return super.run();\n"; + epClass += "}\n"; + epClass += "}\n"; Map res = new HashMap<>(); diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java index 36ae89c2e..0d955a37a 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java @@ -31,14 +31,12 @@ import org.scribble.runtime.net.state.ScribInputState; import org.scribble.runtime.net.state.ScribOutputState; import org.scribble.runtime.net.state.ScribState; -import org.scribble.type.name.Op; import org.scribble.type.name.Role; public class EventDrivenEndpoint extends MPSTEndpoint { protected final ScribState init; protected final Map> outputs = new HashMap<>(); - //protected final Map>> inputs = new HashMap<>(); protected final Map inputs = new HashMap<>(); public EventDrivenEndpoint(S sess, R self, ScribMessageFormatter smf, ScribState init) throws IOException, ScribbleRuntimeException @@ -52,7 +50,7 @@ public EventDrivenEndpoint(S sess, R self, ScribMessageFormatter smf, ScribState }*/ - public Future run() + public Future run() throws ScribbleRuntimeException { // FIXME: make linear diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribState.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribState.java index a12dae246..49cf68cc9 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribState.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribState.java @@ -16,6 +16,12 @@ public ScribState(String name) this.name = name; } + @Override + public String toString() + { + return this.name; + } + @Override public boolean equals(Object o) { diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index 362c09199..074e5a74d 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -32,8 +32,9 @@ public static void foo3() throws IOException, ScribbleRuntimeException try (Proto1_A a = new Proto1_A(P1, A, new ObjectStreamFormatter())) { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); - //a.register(Proto1_A_5.id, x -> new Proto1_A_5__1(B)); - a.register(Proto1_A_5.id, x -> new Proto1_A_5__2(B)); + a.register(Proto1_A_5.id, x -> + //new Proto1_A_5__1(B)); + new Proto1_A_5__2(B)); Future f = a.run(); f.get(); From 232845681208e7228417fbc3dd07b50c2ecd654b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 7 Mar 2018 16:17:17 +0000 Subject: [PATCH 012/539] Fixed payloads in ED API gen. --- .../eventdriven/EDEndpointApiGenerator.java | 15 ++++++++------- .../java/org/scribble/type/name/DataType.java | 1 + .../runtime/net/session/EventDrivenEndpoint.java | 2 +- scribble-test/src/test/scrib/test/test2/MyA.java | 4 ++-- scribble-test/src/test/scrib/test/test2/MyB.java | 8 ++++---- scribble-test/src/test/scrib/test/test2/Test2.scr | 7 ++++--- 6 files changed, 20 insertions(+), 17 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java index 50d13725b..a1c185c8c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java @@ -8,6 +8,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.scribble.ast.DataTypeDecl; import org.scribble.codegen.java.endpointapi.SessionApiGenerator; import org.scribble.main.Job; import org.scribble.main.JobContext; @@ -27,7 +28,7 @@ public class EDEndpointApiGenerator public final Job job; public final GProtocolName proto; public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral - + public EDEndpointApiGenerator(Job job, GProtocolName fullname, Role self) { this.job = job; @@ -181,8 +182,8 @@ public Map buildEndpointClass() throws ScribbleException int i = 1; for (PayloadElemType pet : a.payload.elems) { - DataType dt = (DataType) pet; - messageClass += ", " + dt + " arg" + i++; + DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + messageClass += ", " + dtd.extName + " arg" + i++; } messageClass += ") {\n"; for (int j = 1; j <= a.payload.elems.size(); j++) @@ -225,8 +226,8 @@ public Map buildEndpointClass() throws ScribbleException int i = 1; for (PayloadElemType pet : a.payload.elems) { - DataType dt = (DataType) pet; - branchInterface += ", " + dt + " arg" + i++; + DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + branchInterface += ", " + dtd.extName + " arg" + i++; } branchInterface += ");\n"; } @@ -242,8 +243,8 @@ public Map buildEndpointClass() throws ScribbleException int i = 0; for (PayloadElemType pet : a.payload.elems) { - DataType dt = (DataType) pet; - branchInterface += ", (" + dt + ") m.payload[" + i++ + "]"; + DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + branchInterface += ", (" + dtd.extName + ") m.payload[" + i++ + "]"; } branchInterface += "); break;\n"; } diff --git a/scribble-core/src/main/java/org/scribble/type/name/DataType.java b/scribble-core/src/main/java/org/scribble/type/name/DataType.java index 7e7aa6a8f..0f335debe 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/DataType.java +++ b/scribble-core/src/main/java/org/scribble/type/name/DataType.java @@ -17,6 +17,7 @@ // Potentially qualified/canonical payload type name; not the AST primitive identifier +// FIXME: record "external type name" from DataTypeDecl (for API gen)? cf. OutputSockGen#addSendOpParams public class DataType extends MemberName implements PayloadElemType { private static final long serialVersionUID = 1L; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java index 0d955a37a..31f6909c7 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java @@ -74,7 +74,7 @@ public void run() if (curr instanceof ScribOutputState) { ScribHandlerMessage m = this.edep.outputs.get(curr).apply(null); // FIXME: state object - getChannelEndpoint(m.getPeer()).write(new ScribMessage(m.getOp(), m.getPayload())); // FIXME: ScribEvent has extra Role + getChannelEndpoint(m.getPeer()).write(new ScribMessage(m.getOp(), m.getPayload().toArray(new Object[0]))); // FIXME: ScribEvent has extra Role curr = ((ScribOutputState) curr).succs.get(m.getOp()); } else if (curr instanceof ScribInputState) diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index 074e5a74d..cf1be93cb 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -33,8 +33,8 @@ public static void foo3() throws IOException, ScribbleRuntimeException { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); a.register(Proto1_A_5.id, x -> - //new Proto1_A_5__1(B)); - new Proto1_A_5__2(B)); + //new Proto1_A_5__1(B, 123)); + new Proto1_A_5__2(B, "abc")); Future f = a.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java index eac39233d..d6631fe5f 100644 --- a/scribble-test/src/test/scrib/test/test2/MyB.java +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -35,15 +35,15 @@ public static void foo3() throws IOException, ScribbleRuntimeException class MyHandler extends Proto1_B_10_Branch { @Override - public void receive(_1 op) + public void receive(_1 op, Integer arg1) { - System.out.println("Done 1"); + System.out.println("Done 1: " + arg1); } @Override - public void receive(_2 op) + public void receive(_2 op, String arg1) { - System.out.println("Done 2"); + System.out.println("Done 2: " + arg1); } } diff --git a/scribble-test/src/test/scrib/test/test2/Test2.scr b/scribble-test/src/test/scrib/test/test2/Test2.scr index fe3c21093..b7aae3cf3 100644 --- a/scribble-test/src/test/scrib/test/test2/Test2.scr +++ b/scribble-test/src/test/scrib/test/test2/Test2.scr @@ -3,16 +3,17 @@ module test.test2.Test2; -type "java.lang.Integer" from "rt.jar" as Integer; +type "java.lang.Integer" from "rt.jar" as Int; +type "java.lang.String" from "rt.jar" as Str; global protocol Proto1(role A, role B) { choice at A { - 1() from A to B; + 1(Int) from A to B; } or { - 2() from A to B; + 2(Str) from A to B; } } From 95d644458b7428dd2adf5f88957a0f92ff0ce1c9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 7 Mar 2018 19:43:57 +0000 Subject: [PATCH 013/539] Added basic (untyped) session state objects to ED API gen. --- .../eventdriven/EDEndpointApiGenerator.java | 22 ++++++++++++++----- .../net/session/EventDrivenEndpoint.java | 19 +++++++++------- .../runtime/net/state/ScribBranch.java | 2 +- .../runtime/net/state/ScribState.java | 3 ++- .../src/test/scrib/test/test2/MyA.java | 2 +- .../src/test/scrib/test/test2/MyB.java | 10 ++++----- .../src/test/scrib/test/test2/Test2.scr | 2 +- 7 files changed, 37 insertions(+), 23 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java index a1c185c8c..191f9fd2f 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java @@ -81,8 +81,13 @@ public Map buildEndpointClass() throws ScribbleException epClass += "\n";*/ epClass += "public " + name + "(" + sess + " sess, " + role - + " self, org.scribble.runtime.net.ScribMessageFormatter smf) throws java.io.IOException, org.scribble.main.ScribbleRuntimeException {\n"; - epClass += "super(sess, self, smf, " + pack + ".handlers.states." + this.self + "." + name + "_" + init.id + ".id" + ");\n"; // FIXME: factor out + + " self, org.scribble.runtime.net.ScribMessageFormatter smf, Object data) throws java.io.IOException, org.scribble.main.ScribbleRuntimeException {\n"; + epClass += "super(sess, self, smf, " + pack + ".handlers.states." + this.self + "." + name + "_" + init.id + ".id" + ", data);\n"; // FIXME: factor out + for (EState s : states) + { + String tmp = (s.getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.id; + epClass += "this.states.put(\"" + tmp + "\", " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." + tmp + ".id);\n"; + } epClass += "}\n"; epClass += "\n"; @@ -151,7 +156,12 @@ public Map buildEndpointClass() throws ScribbleException for (EAction a : s.getAllActions()) { stateClass += "this.succs.put(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) - + ", " + ((s.getSuccessor(a).getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.getSuccessor(a).id) + ".id);\n"; + + ", " + /*+ ((s.getSuccessor(a).id == s.id) + ? "this" + : ((s.getSuccessor(a).getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.getSuccessor(a).id) + ".id")*/ + + "\"" + ((s.getSuccessor(a).getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.getSuccessor(a).id) + "\"" + + ");\n"; } stateClass += "}\n"; stateClass += "}\n"; @@ -222,7 +232,7 @@ public Map buildEndpointClass() throws ScribbleException branchInterface += "public abstract class " + branchName + " implements org.scribble.runtime.net.state.ScribBranch {\n"; for (EAction a : s.getAllActions()) { - branchInterface += "\npublic abstract void receive(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + " op"; + branchInterface += "\npublic abstract void receive(Object data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + " op"; int i = 1; for (PayloadElemType pet : a.payload.elems) { @@ -234,11 +244,11 @@ public Map buildEndpointClass() throws ScribbleException branchInterface += "\n"; branchInterface += "@Override\n"; - branchInterface += "public void dispatch(org.scribble.runtime.net.ScribMessage m) {\n"; + branchInterface += "public void dispatch(Object data, org.scribble.runtime.net.ScribMessage m) {\n"; branchInterface += "switch (m.op.toString()) {\n"; for (EAction a : s.getAllActions()) { - branchInterface += "case \"" + SessionApiGenerator.getOpClassName(a.mid) + "\": receive("; + branchInterface += "case \"" + SessionApiGenerator.getOpClassName(a.mid) + "\": receive(data, "; branchInterface += "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + ") m.op"; int i = 0; for (PayloadElemType pet : a.payload.elems) diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java index 31f6909c7..65c85345f 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java @@ -38,11 +38,16 @@ public class EventDrivenEndpoint extends MPST protected final ScribState init; protected final Map> outputs = new HashMap<>(); protected final Map inputs = new HashMap<>(); + + protected Object data; + + protected final Map states = new HashMap<>(); // Bypass problem of mutual references and static field initialisation (class loading) - public EventDrivenEndpoint(S sess, R self, ScribMessageFormatter smf, ScribState init) throws IOException, ScribbleRuntimeException + public EventDrivenEndpoint(S sess, R self, ScribMessageFormatter smf, ScribState init, Object data) throws IOException, ScribbleRuntimeException { super(sess, self, smf); this.init = init; + this.data = data; } /*public void register() @@ -52,8 +57,6 @@ public EventDrivenEndpoint(S sess, R self, ScribMessageFormatter smf, ScribState public Future run() throws ScribbleRuntimeException { - // FIXME: make linear - Object[] res = new Object[1]; new Thread() @@ -73,17 +76,17 @@ public void run() { if (curr instanceof ScribOutputState) { - ScribHandlerMessage m = this.edep.outputs.get(curr).apply(null); // FIXME: state object + ScribHandlerMessage m = this.edep.outputs.get(curr).apply(this.edep.data); // FIXME: state object getChannelEndpoint(m.getPeer()).write(new ScribMessage(m.getOp(), m.getPayload().toArray(new Object[0]))); // FIXME: ScribEvent has extra Role - curr = ((ScribOutputState) curr).succs.get(m.getOp()); + curr = this.edep.states.get(((ScribOutputState) curr).succs.get(m.getOp())); } else if (curr instanceof ScribInputState) { try // cf. ReceiveSocket#readScribMessage { ScribMessage m = getChannelEndpoint(((ScribInputState) curr).peer).getFuture().get(); - this.edep.inputs.get(curr).dispatch(m); // FIXME: state object and received payloads -- null op OK? - curr = ((ScribInputState) curr).succs.get(m.op); + this.edep.inputs.get(curr).dispatch(this.edep.data, m); // FIXME: state object and received payloads -- null op OK? + curr = this.edep.states.get(((ScribInputState) curr).succs.get(m.op)); } catch (InterruptedException e) { @@ -100,7 +103,7 @@ else if (curr instanceof ScribInputState) } else { - throw new RuntimeException("Shouldn't get in here: "); + throw new RuntimeException("Shouldn't get in here: " + curr); } } } diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribBranch.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribBranch.java index 2ba9c25e0..29cdd5d3f 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribBranch.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribBranch.java @@ -5,5 +5,5 @@ // FIXME: integrate with BranchSocket and Handlers public interface ScribBranch { - public void dispatch(ScribMessage m); + public void dispatch(Object data, ScribMessage m); } diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribState.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribState.java index 49cf68cc9..f37e02000 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribState.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribState.java @@ -9,7 +9,8 @@ abstract public class ScribState { public final String name; - public final Map succs = new HashMap<>(); // FIXME + //public final Map succs = new HashMap<>(); // FIXME + public final Map succs = new HashMap<>(); public ScribState(String name) { diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index cf1be93cb..162cab54e 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -29,7 +29,7 @@ public static void main(String[] args) throws IOException, ScribbleRuntimeExcept public static void foo3() throws IOException, ScribbleRuntimeException { Proto1 P1 = new Proto1(); - try (Proto1_A a = new Proto1_A(P1, A, new ObjectStreamFormatter())) + try (Proto1_A a = new Proto1_A(P1, A, new ObjectStreamFormatter(), null)) { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); a.register(Proto1_A_5.id, x -> diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java index d6631fe5f..31f7dd4ec 100644 --- a/scribble-test/src/test/scrib/test/test2/MyB.java +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -35,15 +35,15 @@ public static void foo3() throws IOException, ScribbleRuntimeException class MyHandler extends Proto1_B_10_Branch { @Override - public void receive(_1 op, Integer arg1) + public void receive(Object data, _1 op, Integer arg1) { - System.out.println("Done 1: " + arg1); + System.out.println("(B) received 1: " + arg1); } @Override - public void receive(_2 op, String arg1) + public void receive(Object data, _2 op, String arg1) { - System.out.println("Done 2: " + arg1); + System.out.println("(B) received 2: " + arg1); } } @@ -52,7 +52,7 @@ public void receive(_2 op, String arg1) while (true) { Proto1 P1 = new Proto1(); - try (Proto1_B b = new Proto1_B(P1, B, new ObjectStreamFormatter())) + try (Proto1_B b = new Proto1_B(P1, B, new ObjectStreamFormatter(), null)) { b.accept(ss, A); b.register(Proto1_B_10.id, new MyHandler()); diff --git a/scribble-test/src/test/scrib/test/test2/Test2.scr b/scribble-test/src/test/scrib/test/test2/Test2.scr index b7aae3cf3..9cf9d0e41 100644 --- a/scribble-test/src/test/scrib/test/test2/Test2.scr +++ b/scribble-test/src/test/scrib/test/test2/Test2.scr @@ -1,4 +1,4 @@ -//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test2/Test2.scr -ip scribble-test/src/test/scrib/ -d scribble-test/src/test/scrib/ -api Proto1 A -V +//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test2/Test2.scr -d scribble-test/src/test/scrib/ -edapi Proto1 A -edapi Proto1 B //$ javadoc -cp scribble-cli/target/classes/';'scribble-test/target/classes';'scribble-parser/target/classes';'scribble-parser/lib/antlr-3.5.2-complete.jar';'scrib-core/src/test/scrib scrib-core/src/test/scrib/test/test2/Proto1*.java -d test/doc/test2 module test.test2.Test2; From 3cf79d37939633270fedab1693f6ff9d0e1bcedd Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 7 Mar 2018 19:44:51 +0000 Subject: [PATCH 014/539] Added an ED API gen test. --- .../src/test/scrib/test/test3/MyA.java | 39 ++++++++++ .../src/test/scrib/test/test3/MyB.java | 71 +++++++++++++++++++ .../src/test/scrib/test/test3/MyC.java | 62 ++++++++++++++++ .../src/test/scrib/test/test3/Test3.scr | 22 ++++++ 4 files changed, 194 insertions(+) create mode 100644 scribble-test/src/test/scrib/test/test3/MyA.java create mode 100644 scribble-test/src/test/scrib/test/test3/MyB.java create mode 100644 scribble-test/src/test/scrib/test/test3/MyC.java create mode 100644 scribble-test/src/test/scrib/test/test3/Test3.scr diff --git a/scribble-test/src/test/scrib/test/test3/MyA.java b/scribble-test/src/test/scrib/test/test3/MyA.java new file mode 100644 index 000000000..3a6022fdb --- /dev/null +++ b/scribble-test/src/test/scrib/test/test3/MyA.java @@ -0,0 +1,39 @@ +package test.test3; + +import static test.test3.Test3.Proto1.Proto1.A; +import static test.test3.Test3.Proto1.Proto1.B; + +import java.io.IOException; +import java.util.concurrent.Future; + +import org.scribble.main.ScribbleRuntimeException; +import org.scribble.runtime.net.ObjectStreamFormatter; +import org.scribble.runtime.net.session.SocketChannelEndpoint; + +import test.test3.Test3.Proto1.Proto1; +import test.test3.Test3.Proto1.handlers.A.Proto1_A; +import test.test3.Test3.Proto1.handlers.states.A.Proto1_A_6; +import test.test3.Test3.Proto1.handlers.states.A.messages.Proto1_A_6__1; +import test.test3.Test3.Proto1.handlers.states.A.messages.Proto1_A_6__3;; + +public class MyA +{ + public static void main(String[] args) throws IOException, ScribbleRuntimeException + { + Proto1 P1 = new Proto1(); + try (Proto1_A a = new Proto1_A(P1, A, new ObjectStreamFormatter(), new int[1])) + { + a.request(B, SocketChannelEndpoint::new, "localhost", 8888); + a.register(Proto1_A_6.id, x -> (((int[]) x)[0]++ < 3) ? new Proto1_A_6__1(B, 123) : new Proto1_A_6__3(B, "abc")); + + Future f = a.run(); + f.get(); + + System.out.println("A done"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } +} diff --git a/scribble-test/src/test/scrib/test/test3/MyB.java b/scribble-test/src/test/scrib/test/test3/MyB.java new file mode 100644 index 000000000..1a50fd494 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test3/MyB.java @@ -0,0 +1,71 @@ +package test.test3; + +import static test.test3.Test3.Proto1.Proto1.A; +import static test.test3.Test3.Proto1.Proto1.B; +import static test.test3.Test3.Proto1.Proto1.C; + +import java.io.IOException; +import java.util.concurrent.Future; + +import org.scribble.main.ScribbleRuntimeException; +import org.scribble.runtime.net.ObjectStreamFormatter; +import org.scribble.runtime.net.scribsock.ScribServerSocket; +import org.scribble.runtime.net.scribsock.SocketChannelServer; +import org.scribble.runtime.net.session.SocketChannelEndpoint; + +import test.test3.Test3.Proto1.Proto1; +import test.test3.Test3.Proto1.handlers.B.Proto1_B; +import test.test3.Test3.Proto1.handlers.B.Proto1_B_14_Branch; +import test.test3.Test3.Proto1.handlers.states.B.Proto1_B_14; +import test.test3.Test3.Proto1.handlers.states.B.Proto1_B_16; +import test.test3.Test3.Proto1.handlers.states.B.Proto1_B_17; +import test.test3.Test3.Proto1.handlers.states.B.messages.Proto1_B_16__2; +import test.test3.Test3.Proto1.handlers.states.B.messages.Proto1_B_17__4; +import test.test3.Test3.Proto1.ops._1; +import test.test3.Test3.Proto1.ops._3; + +public class MyB +{ + public static void main(String[] args) throws IOException, ScribbleRuntimeException + { + class MyHandler extends Proto1_B_14_Branch + { + @Override + public void receive(Object data, _1 op, Integer x) + { + System.out.println("(B) received 1: " + x); + } + + @Override + public void receive(Object data, _3 op, String x) + { + System.out.println("(B) received 3: " + x); + } + } + + try (ScribServerSocket ss = new SocketChannelServer(8888)) + { + while (true) + { + Proto1 P1 = new Proto1(); + try (Proto1_B b = new Proto1_B(P1, B, new ObjectStreamFormatter(), null)) + { + b.accept(ss, A); + b.request(C, SocketChannelEndpoint::new, "localhost", 9999); + b.register(Proto1_B_14.id, new MyHandler()); + b.register(Proto1_B_16.id, x -> new Proto1_B_16__2(C, 456)); + b.register(Proto1_B_17.id, x -> new Proto1_B_17__4(C, "def")); + + Future f = b.run(); + f.get(); + + System.out.println("B done"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + } +} diff --git a/scribble-test/src/test/scrib/test/test3/MyC.java b/scribble-test/src/test/scrib/test/test3/MyC.java new file mode 100644 index 000000000..d63ac52a2 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test3/MyC.java @@ -0,0 +1,62 @@ +package test.test3; + +import static test.test3.Test3.Proto1.Proto1.B; +import static test.test3.Test3.Proto1.Proto1.C; + +import java.io.IOException; +import java.util.concurrent.Future; + +import org.scribble.main.ScribbleRuntimeException; +import org.scribble.runtime.net.ObjectStreamFormatter; +import org.scribble.runtime.net.scribsock.ScribServerSocket; +import org.scribble.runtime.net.scribsock.SocketChannelServer; + +import test.test3.Test3.Proto1.Proto1; +import test.test3.Test3.Proto1.handlers.C.Proto1_C; +import test.test3.Test3.Proto1.handlers.C.Proto1_C_22_Branch; +import test.test3.Test3.Proto1.handlers.states.C.Proto1_C_22; +import test.test3.Test3.Proto1.ops._2; +import test.test3.Test3.Proto1.ops._4; + +public class MyC +{ + public static void main(String[] args) throws IOException, ScribbleRuntimeException + { + class MyHandler extends Proto1_C_22_Branch + { + @Override + public void receive(Object data, _2 op, Integer x) + { + System.out.println("(C) received 2: " + x); + } + + @Override + public void receive(Object data, _4 op, String x) + { + System.out.println("(C) received 4: " + x); + } + } + + try (ScribServerSocket ss = new SocketChannelServer(9999)) + { + while (true) + { + Proto1 P1 = new Proto1(); + try (Proto1_C b = new Proto1_C(P1, C, new ObjectStreamFormatter(), null)) + { + b.accept(ss, B); + b.register(Proto1_C_22.id, new MyHandler()); + + Future f = b.run(); + f.get(); + + System.out.println("C done"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + } +} diff --git a/scribble-test/src/test/scrib/test/test3/Test3.scr b/scribble-test/src/test/scrib/test/test3/Test3.scr new file mode 100644 index 000000000..e85398502 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test3/Test3.scr @@ -0,0 +1,22 @@ +//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test3/Test3.scr -d scribble-test/src/test/scrib/ -edapi Proto1 A -edapi Proto1 B -edapi Proto1 C +//$ javadoc -cp scribble-cli/target/classes/';'scribble-test/target/classes';'scribble-parser/target/classes';'scribble-parser/lib/antlr-3.5.2-complete.jar';'scrib-core/src/test/scrib scrib-core/src/test/scrib/test/test2/Proto1*.java -d test/doc/test2 + +module test.test3.Test3; + +type "java.lang.Integer" from "rt.jar" as Int; +type "java.lang.String" from "rt.jar" as Str; + +global protocol Proto1(role A, role B, role C) +{ + choice at A + { + 1(Int) from A to B; + 2(Int) from B to C; + do Proto1(A, B, C); + } + or + { + 3(Str) from A to B; + 4(Str) from B to C; + } +} From 69279e9be83383a0b6f1b0552941510b46c251c1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 7 Mar 2018 19:46:07 +0000 Subject: [PATCH 015/539] Minor. --- scribble-test/src/test/scrib/test/test2/MyA.java | 2 +- scribble-test/src/test/scrib/test/test2/MyB.java | 2 +- scribble-test/src/test/scrib/test/test3/MyA.java | 2 +- scribble-test/src/test/scrib/test/test3/MyB.java | 2 +- scribble-test/src/test/scrib/test/test3/MyC.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index 162cab54e..75ad4e6aa 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -39,7 +39,7 @@ public static void foo3() throws IOException, ScribbleRuntimeException Future f = a.run(); f.get(); - System.out.println("A done"); + System.out.println("(A) end"); } catch (Exception e) { diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java index 31f7dd4ec..81eec5749 100644 --- a/scribble-test/src/test/scrib/test/test2/MyB.java +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -60,7 +60,7 @@ public void receive(Object data, _2 op, String arg1) Future f = b.run(); f.get(); - System.out.println("B done"); + System.out.println("(B) end"); } catch (Exception e) { diff --git a/scribble-test/src/test/scrib/test/test3/MyA.java b/scribble-test/src/test/scrib/test/test3/MyA.java index 3a6022fdb..8f643261a 100644 --- a/scribble-test/src/test/scrib/test/test3/MyA.java +++ b/scribble-test/src/test/scrib/test/test3/MyA.java @@ -29,7 +29,7 @@ public static void main(String[] args) throws IOException, ScribbleRuntimeExcept Future f = a.run(); f.get(); - System.out.println("A done"); + System.out.println("(A) end"); } catch (Exception e) { diff --git a/scribble-test/src/test/scrib/test/test3/MyB.java b/scribble-test/src/test/scrib/test/test3/MyB.java index 1a50fd494..f40355723 100644 --- a/scribble-test/src/test/scrib/test/test3/MyB.java +++ b/scribble-test/src/test/scrib/test/test3/MyB.java @@ -59,7 +59,7 @@ public void receive(Object data, _3 op, String x) Future f = b.run(); f.get(); - System.out.println("B done"); + System.out.println("(B) end"); } catch (Exception e) { diff --git a/scribble-test/src/test/scrib/test/test3/MyC.java b/scribble-test/src/test/scrib/test/test3/MyC.java index d63ac52a2..649c99ad0 100644 --- a/scribble-test/src/test/scrib/test/test3/MyC.java +++ b/scribble-test/src/test/scrib/test/test3/MyC.java @@ -50,7 +50,7 @@ public void receive(Object data, _4 op, String x) Future f = b.run(); f.get(); - System.out.println("C done"); + System.out.println("(C) end"); } catch (Exception e) { From 452b65a28c521a256d69fe7ce4e77d9b340acc8c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 7 Mar 2018 20:00:19 +0000 Subject: [PATCH 016/539] Minor. --- scribble-test/src/test/scrib/test/test2/MyA.java | 5 ++--- scribble-test/src/test/scrib/test/test2/MyB.java | 4 ++-- scribble-test/src/test/scrib/test/test3/MyA.java | 3 +-- scribble-test/src/test/scrib/test/test3/MyB.java | 3 +-- scribble-test/src/test/scrib/test/test3/MyC.java | 3 +-- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index 75ad4e6aa..ae231cd5b 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -7,7 +7,6 @@ import java.io.IOException; import java.util.concurrent.Future; -import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.net.ObjectStreamFormatter; import org.scribble.runtime.net.session.MPSTEndpoint; import org.scribble.runtime.net.session.SocketChannelEndpoint; @@ -21,12 +20,12 @@ public class MyA { - public static void main(String[] args) throws IOException, ScribbleRuntimeException + public static void main(String[] args) throws IOException { foo3(); } - public static void foo3() throws IOException, ScribbleRuntimeException + public static void foo3() throws IOException { Proto1 P1 = new Proto1(); try (Proto1_A a = new Proto1_A(P1, A, new ObjectStreamFormatter(), null)) diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java index 81eec5749..3b20bcd62 100644 --- a/scribble-test/src/test/scrib/test/test2/MyB.java +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -25,12 +25,12 @@ public class MyB { - public static void main(String[] args) throws IOException, ScribbleRuntimeException + public static void main(String[] args) throws IOException { foo3(); } - public static void foo3() throws IOException, ScribbleRuntimeException + public static void foo3() throws IOException { class MyHandler extends Proto1_B_10_Branch { diff --git a/scribble-test/src/test/scrib/test/test3/MyA.java b/scribble-test/src/test/scrib/test/test3/MyA.java index 8f643261a..596417801 100644 --- a/scribble-test/src/test/scrib/test/test3/MyA.java +++ b/scribble-test/src/test/scrib/test/test3/MyA.java @@ -6,7 +6,6 @@ import java.io.IOException; import java.util.concurrent.Future; -import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.net.ObjectStreamFormatter; import org.scribble.runtime.net.session.SocketChannelEndpoint; @@ -18,7 +17,7 @@ public class MyA { - public static void main(String[] args) throws IOException, ScribbleRuntimeException + public static void main(String[] args) throws IOException { Proto1 P1 = new Proto1(); try (Proto1_A a = new Proto1_A(P1, A, new ObjectStreamFormatter(), new int[1])) diff --git a/scribble-test/src/test/scrib/test/test3/MyB.java b/scribble-test/src/test/scrib/test/test3/MyB.java index f40355723..eb545dea9 100644 --- a/scribble-test/src/test/scrib/test/test3/MyB.java +++ b/scribble-test/src/test/scrib/test/test3/MyB.java @@ -7,7 +7,6 @@ import java.io.IOException; import java.util.concurrent.Future; -import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.net.ObjectStreamFormatter; import org.scribble.runtime.net.scribsock.ScribServerSocket; import org.scribble.runtime.net.scribsock.SocketChannelServer; @@ -26,7 +25,7 @@ public class MyB { - public static void main(String[] args) throws IOException, ScribbleRuntimeException + public static void main(String[] args) throws IOException { class MyHandler extends Proto1_B_14_Branch { diff --git a/scribble-test/src/test/scrib/test/test3/MyC.java b/scribble-test/src/test/scrib/test/test3/MyC.java index 649c99ad0..0913978e4 100644 --- a/scribble-test/src/test/scrib/test/test3/MyC.java +++ b/scribble-test/src/test/scrib/test/test3/MyC.java @@ -6,7 +6,6 @@ import java.io.IOException; import java.util.concurrent.Future; -import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.net.ObjectStreamFormatter; import org.scribble.runtime.net.scribsock.ScribServerSocket; import org.scribble.runtime.net.scribsock.SocketChannelServer; @@ -20,7 +19,7 @@ public class MyC { - public static void main(String[] args) throws IOException, ScribbleRuntimeException + public static void main(String[] args) throws IOException { class MyHandler extends Proto1_C_22_Branch { From 056c1d57af9eadcd478b4609b57c9ef9692cb390 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 7 Mar 2018 21:02:29 +0000 Subject: [PATCH 017/539] Added generic parameter for session state object type to ED API gen. --- .../eventdriven/EDEndpointApiGenerator.java | 14 +++++++------- .../net/session/EventDrivenEndpoint.java | 17 ++++++----------- .../scribble/runtime/net/state/ScribBranch.java | 4 ++-- .../src/test/scrib/test/test2/MyA.java | 2 +- .../src/test/scrib/test/test2/MyB.java | 8 ++++---- .../src/test/scrib/test/test3/MyA.java | 4 ++-- .../src/test/scrib/test/test3/MyB.java | 14 ++++++++------ .../src/test/scrib/test/test3/MyC.java | 8 ++++---- 8 files changed, 34 insertions(+), 37 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java index 191f9fd2f..23d336010 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java @@ -75,13 +75,13 @@ public Map buildEndpointClass() throws ScribbleException epClass += "import java.util.HashMap;\n"; epClass += "import java.util.Map;\n";*/ epClass += "\n"; - epClass += "public class " + name + " extends org.scribble.runtime.net.session.EventDrivenEndpoint<" + sess + ", " + role + "> {\n"; + epClass += "public class " + name + " extends org.scribble.runtime.net.session.EventDrivenEndpoint<" + sess + ", " + role + ", D> {\n"; /*epClass += "private final Map> outputs = new HashMap<>();\n"; epClass += "\n";*/ epClass += "public " + name + "(" + sess + " sess, " + role - + " self, org.scribble.runtime.net.ScribMessageFormatter smf, Object data) throws java.io.IOException, org.scribble.main.ScribbleRuntimeException {\n"; + + " self, org.scribble.runtime.net.ScribMessageFormatter smf, D data) throws java.io.IOException, org.scribble.main.ScribbleRuntimeException {\n"; epClass += "super(sess, self, smf, " + pack + ".handlers.states." + this.self + "." + name + "_" + init.id + ".id" + ", data);\n"; // FIXME: factor out for (EState s : states) { @@ -229,10 +229,10 @@ public Map buildEndpointClass() throws ScribbleException String branchInterface = ""; branchInterface += "package " + pack + ".handlers." + this.self + ";\n"; branchInterface += ""; - branchInterface += "public abstract class " + branchName + " implements org.scribble.runtime.net.state.ScribBranch {\n"; + branchInterface += "public abstract class " + branchName + " implements org.scribble.runtime.net.state.ScribBranch {\n"; for (EAction a : s.getAllActions()) { - branchInterface += "\npublic abstract void receive(Object data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + " op"; + branchInterface += "\npublic abstract void receive(D data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + " op"; int i = 1; for (PayloadElemType pet : a.payload.elems) { @@ -244,7 +244,7 @@ public Map buildEndpointClass() throws ScribbleException branchInterface += "\n"; branchInterface += "@Override\n"; - branchInterface += "public void dispatch(Object data, org.scribble.runtime.net.ScribMessage m) {\n"; + branchInterface += "public void dispatch(D data, org.scribble.runtime.net.ScribMessage m) {\n"; branchInterface += "switch (m.op.toString()) {\n"; for (EAction a : s.getAllActions()) { @@ -306,7 +306,7 @@ private String generateRegister(GProtocolName gpn, Role self, EState s) { // FIXME: "untyped" (ScribEvent) -- need state-specific "enums" res += "public void register(" + prefix + name + "_" + s.id - + " sid, java.util.function.Function h) {\n"; // FIXME: factor out res += "this.outputs.put(sid, h);\n"; res += "}\n"; @@ -331,7 +331,7 @@ private String generateRegister(GProtocolName gpn, Role self, EState s) res += "tmp.put(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ", h_" + a.mid + ");\n"; } res += "}\n";*/ - res += ", " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + "." + name + "_" + s.id + "_Branch b"; + res += ", " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + "." + name + "_" + s.id + "_Branch b"; res += ") {\n"; res += "this.inputs.put(sid, b);\n"; res += "}\n"; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java index 65c85345f..e1d9c30bc 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java @@ -33,35 +33,30 @@ import org.scribble.runtime.net.state.ScribState; import org.scribble.type.name.Role; -public class EventDrivenEndpoint extends MPSTEndpoint +public class EventDrivenEndpoint extends MPSTEndpoint { protected final ScribState init; - protected final Map> outputs = new HashMap<>(); - protected final Map inputs = new HashMap<>(); + protected final Map> outputs = new HashMap<>(); + protected final Map> inputs = new HashMap<>(); - protected Object data; + protected final D data; protected final Map states = new HashMap<>(); // Bypass problem of mutual references and static field initialisation (class loading) - public EventDrivenEndpoint(S sess, R self, ScribMessageFormatter smf, ScribState init, Object data) throws IOException, ScribbleRuntimeException + public EventDrivenEndpoint(S sess, R self, ScribMessageFormatter smf, ScribState init, D data) throws IOException, ScribbleRuntimeException { super(sess, self, smf); this.init = init; this.data = data; } - /*public void register() - { - - }*/ - public Future run() throws ScribbleRuntimeException { Object[] res = new Object[1]; new Thread() { - private final EventDrivenEndpoint edep; + private final EventDrivenEndpoint edep; { this.edep = EventDrivenEndpoint.this; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribBranch.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribBranch.java index 29cdd5d3f..481f58f74 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribBranch.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribBranch.java @@ -3,7 +3,7 @@ import org.scribble.runtime.net.ScribMessage; // FIXME: integrate with BranchSocket and Handlers -public interface ScribBranch +public interface ScribBranch { - public void dispatch(Object data, ScribMessage m); + public void dispatch(D data, ScribMessage m); } diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index ae231cd5b..5c61d5b5a 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -28,7 +28,7 @@ public static void main(String[] args) throws IOException public static void foo3() throws IOException { Proto1 P1 = new Proto1(); - try (Proto1_A a = new Proto1_A(P1, A, new ObjectStreamFormatter(), null)) + try (Proto1_A a = new Proto1_A<>(P1, A, new ObjectStreamFormatter(), null)) { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); a.register(Proto1_A_5.id, x -> diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java index 3b20bcd62..32c44e58c 100644 --- a/scribble-test/src/test/scrib/test/test2/MyB.java +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -32,16 +32,16 @@ public static void main(String[] args) throws IOException public static void foo3() throws IOException { - class MyHandler extends Proto1_B_10_Branch + class MyHandler extends Proto1_B_10_Branch { @Override - public void receive(Object data, _1 op, Integer arg1) + public void receive(Void data, _1 op, Integer arg1) { System.out.println("(B) received 1: " + arg1); } @Override - public void receive(Object data, _2 op, String arg1) + public void receive(Void data, _2 op, String arg1) { System.out.println("(B) received 2: " + arg1); } @@ -52,7 +52,7 @@ public void receive(Object data, _2 op, String arg1) while (true) { Proto1 P1 = new Proto1(); - try (Proto1_B b = new Proto1_B(P1, B, new ObjectStreamFormatter(), null)) + try (Proto1_B b = new Proto1_B<>(P1, B, new ObjectStreamFormatter(), null)) { b.accept(ss, A); b.register(Proto1_B_10.id, new MyHandler()); diff --git a/scribble-test/src/test/scrib/test/test3/MyA.java b/scribble-test/src/test/scrib/test/test3/MyA.java index 596417801..dc10c4af8 100644 --- a/scribble-test/src/test/scrib/test/test3/MyA.java +++ b/scribble-test/src/test/scrib/test/test3/MyA.java @@ -20,10 +20,10 @@ public class MyA public static void main(String[] args) throws IOException { Proto1 P1 = new Proto1(); - try (Proto1_A a = new Proto1_A(P1, A, new ObjectStreamFormatter(), new int[1])) + try (Proto1_A a = new Proto1_A<>(P1, A, new ObjectStreamFormatter(), new int[1])) { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); - a.register(Proto1_A_6.id, x -> (((int[]) x)[0]++ < 3) ? new Proto1_A_6__1(B, 123) : new Proto1_A_6__3(B, "abc")); + a.register(Proto1_A_6.id, x -> (x[0]++ < 3) ? new Proto1_A_6__1(B, 123) : new Proto1_A_6__3(B, "abc")); Future f = a.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test3/MyB.java b/scribble-test/src/test/scrib/test/test3/MyB.java index eb545dea9..64ddaef91 100644 --- a/scribble-test/src/test/scrib/test/test3/MyB.java +++ b/scribble-test/src/test/scrib/test/test3/MyB.java @@ -27,18 +27,20 @@ public class MyB { public static void main(String[] args) throws IOException { - class MyHandler extends Proto1_B_14_Branch + class MyHandler extends Proto1_B_14_Branch { @Override - public void receive(Object data, _1 op, Integer x) + public void receive(int[] data, _1 op, Integer x) { - System.out.println("(B) received 1: " + x); + data[0]++; + System.out.println("(B) received 1: " + data[0] + ", " + x); } @Override - public void receive(Object data, _3 op, String x) + public void receive(int[] data, _3 op, String x) { - System.out.println("(B) received 3: " + x); + data[0]++; + System.out.println("(B) received 3: " + data[0] + ", " + x); } } @@ -47,7 +49,7 @@ public void receive(Object data, _3 op, String x) while (true) { Proto1 P1 = new Proto1(); - try (Proto1_B b = new Proto1_B(P1, B, new ObjectStreamFormatter(), null)) + try (Proto1_B b = new Proto1_B<>(P1, B, new ObjectStreamFormatter(), new int[1])) { b.accept(ss, A); b.request(C, SocketChannelEndpoint::new, "localhost", 9999); diff --git a/scribble-test/src/test/scrib/test/test3/MyC.java b/scribble-test/src/test/scrib/test/test3/MyC.java index 0913978e4..583843d05 100644 --- a/scribble-test/src/test/scrib/test/test3/MyC.java +++ b/scribble-test/src/test/scrib/test/test3/MyC.java @@ -21,16 +21,16 @@ public class MyC { public static void main(String[] args) throws IOException { - class MyHandler extends Proto1_C_22_Branch + class MyHandler extends Proto1_C_22_Branch { @Override - public void receive(Object data, _2 op, Integer x) + public void receive(Void data, _2 op, Integer x) { System.out.println("(C) received 2: " + x); } @Override - public void receive(Object data, _4 op, String x) + public void receive(Void data, _4 op, String x) { System.out.println("(C) received 4: " + x); } @@ -41,7 +41,7 @@ public void receive(Object data, _4 op, String x) while (true) { Proto1 P1 = new Proto1(); - try (Proto1_C b = new Proto1_C(P1, C, new ObjectStreamFormatter(), null)) + try (Proto1_C b = new Proto1_C<>(P1, C, new ObjectStreamFormatter(), null)) { b.accept(ss, B); b.register(Proto1_C_22.id, new MyHandler()); From 5dcba063fc8ac8e213492d0732beaf3061201029 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 7 Mar 2018 22:15:55 +0000 Subject: [PATCH 018/539] Refactored ScribHandlerMessage as subclass of ScribMessage. --- .../eventdriven/EDEndpointApiGenerator.java | 27 +++++++++++++------ .../net/session/EventDrivenEndpoint.java | 6 +++-- .../net/state/ScribHandlerMessage.java | 19 +++++++++---- .../src/test/scrib/test/test3/Test3.scr | 2 +- 4 files changed, 38 insertions(+), 16 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java index 23d336010..56bbb24ad 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java @@ -6,6 +6,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.IntStream; import java.util.stream.Stream; import org.scribble.ast.DataTypeDecl; @@ -176,7 +177,12 @@ public Map buildEndpointClass() throws ScribbleException String messageInterface = ""; messageInterface += "package " + pack + ".handlers.states." + this.self + ".messages;\n"; messageInterface += "\n"; - messageInterface += "public interface " + messageIfName + " extends org.scribble.runtime.net.state.ScribHandlerMessage {\n"; + messageInterface += "public abstract class " + messageIfName + " extends org.scribble.runtime.net.state.ScribHandlerMessage {\n"; + messageInterface += "private static final long serialVersionUID = 1L;\n"; + messageInterface += "\n"; + messageInterface += "public " + messageIfName + "(org.scribble.type.name.Role peer, org.scribble.type.name.Op op, Object... payload) {\n"; + messageInterface += "super(peer, op, payload);\n"; + messageInterface += "}\n"; messageInterface += "}\n"; res.put(mprefix + messageIfName + ".java", messageInterface); @@ -186,9 +192,11 @@ public Map buildEndpointClass() throws ScribbleException String messageClass = ""; messageClass += "package " + pack + ".handlers.states." + this.self + ".messages;\n"; messageClass += "\n"; - messageClass += "public class " + messageName + " implements " + messageIfName + " {\n"; - messageClass += "public final java.util.List pay = new java.util.LinkedList<>();\n"; - messageClass += "public " + messageName + "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " role"; + messageClass += "public class " + messageName + " extends " + messageIfName + " {\n"; + //messageClass += "public final java.util.List pay = new java.util.LinkedList<>();\n"; + messageClass += "private static final long serialVersionUID = 1L;\n"; + messageClass += "\n"; + messageClass += "public " + messageName + "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer"; int i = 1; for (PayloadElemType pet : a.payload.elems) { @@ -196,12 +204,15 @@ public Map buildEndpointClass() throws ScribbleException messageClass += ", " + dtd.extName + " arg" + i++; } messageClass += ") {\n"; - for (int j = 1; j <= a.payload.elems.size(); j++) + /*for (int j = 1; j <= a.payload.elems.size(); j++) { messageClass += "this.pay.add(arg" + j + ");\n"; - } + }*/ + messageClass += "super(peer, " + + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + + IntStream.rangeClosed(1, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining("")) + ");\n"; messageClass += "}\n"; - messageClass += "\n"; + /*messageClass += "\n"; messageClass += "@Override\n"; messageClass += "public org.scribble.type.name.Role getPeer() {\n"; messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ";\n"; @@ -215,7 +226,7 @@ public Map buildEndpointClass() throws ScribbleException messageClass += "@Override\n"; messageClass += "public java.util.List getPayload() {\n"; messageClass += "return this.pay;\n"; - messageClass += "}\n"; + messageClass += "}\n";*/ messageClass += "}\n"; res.put(mprefix + messageName + ".java", messageClass); } diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java index e1d9c30bc..77ff2f275 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java @@ -72,8 +72,10 @@ public void run() if (curr instanceof ScribOutputState) { ScribHandlerMessage m = this.edep.outputs.get(curr).apply(this.edep.data); // FIXME: state object - getChannelEndpoint(m.getPeer()).write(new ScribMessage(m.getOp(), m.getPayload().toArray(new Object[0]))); // FIXME: ScribEvent has extra Role - curr = this.edep.states.get(((ScribOutputState) curr).succs.get(m.getOp())); + /*getChannelEndpoint(m.getPeer()).write(new ScribMessage(m.getOp(), m.getPayload().toArray(new Object[0]))); // FIXME: ScribEvent has extra Role + curr = this.edep.states.get(((ScribOutputState) curr).succs.get(m.getOp()));*/ + getChannelEndpoint(m.peer).write(new ScribMessage(m.op, m.payload)); + curr = this.edep.states.get(((ScribOutputState) curr).succs.get(m.op)); } else if (curr instanceof ScribInputState) { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerMessage.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerMessage.java index 70fda5bc8..bd01db12d 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerMessage.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerMessage.java @@ -1,14 +1,23 @@ package org.scribble.runtime.net.state; -import java.util.List; - +import org.scribble.runtime.net.ScribMessage; import org.scribble.type.name.Op; import org.scribble.type.name.Role; // FIXME: integrate with ScribMessage (maybe rename latter to ScribRuntimeMessage) -public interface ScribHandlerMessage +public abstract class ScribHandlerMessage extends ScribMessage { - Role getPeer(); + private static final long serialVersionUID = 1L; + + public final Role peer; + + public ScribHandlerMessage(Role peer, Op op, Object... payload) + { + super(op, payload); + this.peer = peer; + } + + /*Role getPeer(); Op getOp(); - List getPayload(); + List getPayload();*/ } diff --git a/scribble-test/src/test/scrib/test/test3/Test3.scr b/scribble-test/src/test/scrib/test/test3/Test3.scr index e85398502..8a452b5ef 100644 --- a/scribble-test/src/test/scrib/test/test3/Test3.scr +++ b/scribble-test/src/test/scrib/test/test3/Test3.scr @@ -1,5 +1,5 @@ //$ bin/scribblec.sh scribble-test/src/test/scrib/test/test3/Test3.scr -d scribble-test/src/test/scrib/ -edapi Proto1 A -edapi Proto1 B -edapi Proto1 C -//$ javadoc -cp scribble-cli/target/classes/';'scribble-test/target/classes';'scribble-parser/target/classes';'scribble-parser/lib/antlr-3.5.2-complete.jar';'scrib-core/src/test/scrib scrib-core/src/test/scrib/test/test2/Proto1*.java -d test/doc/test2 +//$ javadoc -cp scribble-cli/target/classes/';'scribble-test/target/classes';'scribble-parser/target/classes';'scribble-parser/lib/antlr-3.5.2-complete.jar';'scrib-core/src/test/scrib scrib-core/src/test/scrib/test/test3/Proto1*.java -d test/doc/test3 module test.test3.Test3; From ae9bede96a8bce492a3acee38a8278ed4370fc1c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 7 Mar 2018 23:08:26 +0000 Subject: [PATCH 019/539] Adding sig support to ED API gen. --- .../eventdriven/EDEndpointApiGenerator.java | 50 ++++++++++++-- .../net/session/EventDrivenEndpoint.java | 10 ++- .../runtime/net/state/ScribEvent.java | 68 ------------------- .../runtime/net/state/ScribHandlerSig.java | 8 +++ 4 files changed, 62 insertions(+), 74 deletions(-) delete mode 100644 scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEvent.java create mode 100644 scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerSig.java diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java index 56bbb24ad..1e31b0d8d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java @@ -10,6 +10,8 @@ import java.util.stream.Stream; import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.NonProtocolDecl; import org.scribble.codegen.java.endpointapi.SessionApiGenerator; import org.scribble.main.Job; import org.scribble.main.JobContext; @@ -20,6 +22,7 @@ import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.MessageSigName; import org.scribble.type.name.PayloadElemType; import org.scribble.type.name.Role; @@ -188,20 +191,45 @@ public Map buildEndpointClass() throws ScribbleException for (EAction a : s.getAllActions()) { + boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); + MessageSigNameDecl msnd = null; + if (isSig) + { + msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() + .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); + } + String messageName = name + "_" + s.id + "_" + SessionApiGenerator.getOpClassName(a.mid); String messageClass = ""; messageClass += "package " + pack + ".handlers.states." + this.self + ".messages;\n"; messageClass += "\n"; - messageClass += "public class " + messageName + " extends " + messageIfName + " {\n"; + messageClass += "public class " + messageName + " extends " + messageIfName; + if (isSig) + { + messageClass += " implements org.scribble.runtime.net.state.ScribHandlerSig"; + } + messageClass += " {\n"; //messageClass += "public final java.util.List pay = new java.util.LinkedList<>();\n"; messageClass += "private static final long serialVersionUID = 1L;\n"; + if (isSig) + { + messageClass += "private final " + msnd.extName + " m;\n"; + } messageClass += "\n"; messageClass += "public " + messageName + "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer"; - int i = 1; - for (PayloadElemType pet : a.payload.elems) + if (isSig) { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); - messageClass += ", " + dtd.extName + " arg" + i++; + messageClass += ", " + msnd.extName + " m"; + } + else + { + int i = 1; + for (PayloadElemType pet : a.payload.elems) + { + DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + messageClass += ", " + dtd.extName + " arg" + i++; + } } messageClass += ") {\n"; /*for (int j = 1; j <= a.payload.elems.size(); j++) @@ -211,6 +239,10 @@ public Map buildEndpointClass() throws ScribbleException messageClass += "super(peer, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + IntStream.rangeClosed(1, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining("")) + ");\n"; + if (isSig) + { + messageClass += "this.m = m;\n"; + } messageClass += "}\n"; /*messageClass += "\n"; messageClass += "@Override\n"; @@ -227,6 +259,14 @@ public Map buildEndpointClass() throws ScribbleException messageClass += "public java.util.List getPayload() {\n"; messageClass += "return this.pay;\n"; messageClass += "}\n";*/ + if (isSig) + { + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public org.scribble.runtime.net.ScribMessage getSig() {\n"; + messageClass += "return this.m;\n"; + messageClass += "}\n"; + } messageClass += "}\n"; res.put(mprefix + messageName + ".java", messageClass); } diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java index 77ff2f275..10da59f2b 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java @@ -28,6 +28,7 @@ import org.scribble.runtime.net.state.ScribBranch; import org.scribble.runtime.net.state.ScribEndState; import org.scribble.runtime.net.state.ScribHandlerMessage; +import org.scribble.runtime.net.state.ScribHandlerSig; import org.scribble.runtime.net.state.ScribInputState; import org.scribble.runtime.net.state.ScribOutputState; import org.scribble.runtime.net.state.ScribState; @@ -74,7 +75,14 @@ public void run() ScribHandlerMessage m = this.edep.outputs.get(curr).apply(this.edep.data); // FIXME: state object /*getChannelEndpoint(m.getPeer()).write(new ScribMessage(m.getOp(), m.getPayload().toArray(new Object[0]))); // FIXME: ScribEvent has extra Role curr = this.edep.states.get(((ScribOutputState) curr).succs.get(m.getOp()));*/ - getChannelEndpoint(m.peer).write(new ScribMessage(m.op, m.payload)); + if (m instanceof ScribHandlerSig) + { + getChannelEndpoint(m.peer).write(((ScribHandlerSig) m).getSig()); + } + else + { + getChannelEndpoint(m.peer).write(new ScribMessage(m.op, m.payload)); + } curr = this.edep.states.get(((ScribOutputState) curr).succs.get(m.op)); } else if (curr instanceof ScribInputState) diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEvent.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEvent.java deleted file mode 100644 index 39fd1215a..000000000 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEvent.java +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.runtime.net.state; - -import org.scribble.runtime.net.ScribMessage; -import org.scribble.type.name.Role; - -@Deprecated -public class ScribEvent extends ScribMessage -{ - private static final long serialVersionUID = 1L; - - public final R peer; - - //public ScribEvent(Role peer, Op op, Object... payload) // FIXME: factor out with EAction? - public ScribEvent(R peer, M m) // FIXME: factor out with EAction? - { - super(m.getOp(), m.getPayload()); - this.peer = peer; - } - - @Override - public int hashCode() - { - int hash = 7919; - hash = 31 * hash + super.hashCode(); - hash = 31 * hash + this.peer.hashCode(); - return hash; - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof ScribEvent)) - { - return false; - } - ScribEvent m = (ScribEvent) o; - return super.equals(o) && this.peer.equals(m.peer); // Does canEqual - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof ScribEvent; - } - - @Override - public String toString() - { - return this.peer + ":" + super.toString(); - } -} diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerSig.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerSig.java new file mode 100644 index 000000000..0f3823f59 --- /dev/null +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerSig.java @@ -0,0 +1,8 @@ +package org.scribble.runtime.net.state; + +import org.scribble.runtime.net.ScribMessage; + +public interface ScribHandlerSig +{ + ScribMessage getSig(); +} From 62da7e8dd1a7556ade232da149919a2236ea69d5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 7 Mar 2018 23:23:32 +0000 Subject: [PATCH 020/539] Fixed sig support for branches in ED API gen. --- .../eventdriven/EDEndpointApiGenerator.java | 47 ++++++++++++++++--- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java index 1e31b0d8d..3fc11a294 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java @@ -283,12 +283,30 @@ public Map buildEndpointClass() throws ScribbleException branchInterface += "public abstract class " + branchName + " implements org.scribble.runtime.net.state.ScribBranch {\n"; for (EAction a : s.getAllActions()) { - branchInterface += "\npublic abstract void receive(D data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + " op"; - int i = 1; - for (PayloadElemType pet : a.payload.elems) + // FIXME: factor out + boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); + MessageSigNameDecl msnd = null; + if (isSig) { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); - branchInterface += ", " + dtd.extName + " arg" + i++; + msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() + .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); + } + + branchInterface += "\npublic abstract void receive(D data, "; + if (isSig) + { + branchInterface += msnd.extName + " m"; + } + else + { + branchInterface += SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + " op"; + int i = 1; + for (PayloadElemType pet : a.payload.elems) + { + DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + branchInterface += ", " + dtd.extName + " arg" + i++; + } } branchInterface += ");\n"; } @@ -299,8 +317,25 @@ public Map buildEndpointClass() throws ScribbleException branchInterface += "switch (m.op.toString()) {\n"; for (EAction a : s.getAllActions()) { + // FIXME: factor out + boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); + MessageSigNameDecl msnd = null; + if (isSig) + { + msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() + .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); + } + branchInterface += "case \"" + SessionApiGenerator.getOpClassName(a.mid) + "\": receive(data, "; - branchInterface += "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + ") m.op"; + if (isSig) + { + branchInterface += "(" + msnd.extName + ") m"; + } + else + { + branchInterface += "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + ") m.op"; + } int i = 0; for (PayloadElemType pet : a.payload.elems) { From c24e608589da05b3672fbac6346ad5952574fee5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 7 Mar 2018 23:55:28 +0000 Subject: [PATCH 021/539] Added a sig test for ED API gen. --- .../src/test/scrib/test/test4/MyA.java | 40 ++++++ .../src/test/scrib/test/test4/MyB.java | 63 +++++++++ .../src/test/scrib/test/test4/Test4.scr | 20 +++ .../src/test/scrib/test/test4/sig/Bar.java | 19 +++ .../src/test/scrib/test/test4/sig/Foo.java | 19 +++ .../scrib/test/test4/sig/Test4Formatter.java | 121 ++++++++++++++++++ .../scrib/test/test4/sig/Test4Message.java | 34 +++++ 7 files changed, 316 insertions(+) create mode 100644 scribble-test/src/test/scrib/test/test4/MyA.java create mode 100644 scribble-test/src/test/scrib/test/test4/MyB.java create mode 100644 scribble-test/src/test/scrib/test/test4/Test4.scr create mode 100644 scribble-test/src/test/scrib/test/test4/sig/Bar.java create mode 100644 scribble-test/src/test/scrib/test/test4/sig/Foo.java create mode 100644 scribble-test/src/test/scrib/test/test4/sig/Test4Formatter.java create mode 100644 scribble-test/src/test/scrib/test/test4/sig/Test4Message.java diff --git a/scribble-test/src/test/scrib/test/test4/MyA.java b/scribble-test/src/test/scrib/test/test4/MyA.java new file mode 100644 index 000000000..210d6864a --- /dev/null +++ b/scribble-test/src/test/scrib/test/test4/MyA.java @@ -0,0 +1,40 @@ +package test.test4; + +import static test.test4.Test4.Proto1.Proto1.A; +import static test.test4.Test4.Proto1.Proto1.B; + +import java.io.IOException; +import java.util.concurrent.Future; + +import org.scribble.runtime.net.session.SocketChannelEndpoint; + +import test.test4.Test4.Proto1.Proto1; +import test.test4.Test4.Proto1.handlers.A.Proto1_A; +import test.test4.Test4.Proto1.handlers.states.A.Proto1_A_6; +import test.test4.Test4.Proto1.handlers.states.A.messages.Proto1_A_6_Bar; +import test.test4.Test4.Proto1.handlers.states.A.messages.Proto1_A_6_Foo; +import test.test4.sig.Bar; +import test.test4.sig.Foo; +import test.test4.sig.Test4Formatter;; + +public class MyA +{ + public static void main(String[] args) throws IOException + { + Proto1 P1 = new Proto1(); + try (Proto1_A a = new Proto1_A<>(P1, A, new Test4Formatter(), new int[1])) + { + a.request(B, SocketChannelEndpoint::new, "localhost", 8888); + a.register(Proto1_A_6.id, x -> (x[0]++ < 5) ? new Proto1_A_6_Foo(B, new Foo("abc")) : new Proto1_A_6_Bar(B, new Bar(123))); + + Future f = a.run(); + f.get(); + + System.out.println("(A) end"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } +} diff --git a/scribble-test/src/test/scrib/test/test4/MyB.java b/scribble-test/src/test/scrib/test/test4/MyB.java new file mode 100644 index 000000000..59515e0b0 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test4/MyB.java @@ -0,0 +1,63 @@ +package test.test4; + +import static test.test4.Test4.Proto1.Proto1.A; +import static test.test4.Test4.Proto1.Proto1.B; + +import java.io.IOException; +import java.util.concurrent.Future; + +import org.scribble.runtime.net.scribsock.ScribServerSocket; +import org.scribble.runtime.net.scribsock.SocketChannelServer; + +import test.test4.Test4.Proto1.Proto1; +import test.test4.Test4.Proto1.handlers.B.Proto1_B; +import test.test4.Test4.Proto1.handlers.B.Proto1_B_12_Branch; +import test.test4.Test4.Proto1.handlers.states.B.Proto1_B_12; +import test.test4.sig.Bar; +import test.test4.sig.Foo; +import test.test4.sig.Test4Formatter; + +public class MyB +{ + public static void main(String[] args) throws IOException + { + class MyHandler extends Proto1_B_12_Branch + { + @Override + public void receive(int[] data, Foo m) + { + data[0]++; + System.out.println("(B) received Foo: " + m.getBody() + ", " + data[0]); + } + + @Override + public void receive(int[] data, Bar m) + { + data[0]++; + System.out.println("(B) received Bar: " + m.getBody() + ", " + data[0]); + } + } + + try (ScribServerSocket ss = new SocketChannelServer(8888)) + { + while (true) + { + Proto1 P1 = new Proto1(); + try (Proto1_B b = new Proto1_B<>(P1, B, new Test4Formatter(), new int[1])) + { + b.accept(ss, A); + b.register(Proto1_B_12.id, new MyHandler()); + + Future f = b.run(); + f.get(); + + System.out.println("(B) end"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + } +} diff --git a/scribble-test/src/test/scrib/test/test4/Test4.scr b/scribble-test/src/test/scrib/test/test4/Test4.scr new file mode 100644 index 000000000..f0cecfee5 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test4/Test4.scr @@ -0,0 +1,20 @@ +//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test4/Test4.scr -d scribble-test/src/test/scrib/ -edapi Proto1 A -edapi Proto1 B +//$ javadoc -cp scribble-cli/target/classes/';'scribble-test/target/classes';'scribble-parser/target/classes';'scribble-parser/lib/antlr-3.5.2-complete.jar';'scrib-core/src/test/scrib scrib-core/src/test/scrib/test/test4/Proto1*.java -d test/doc/test4 + +module test.test4.Test4; + +sig "test.test4.sig.Foo" from "test/test4/sig/Foo.java" as Foo; +sig "test.test4.sig.Bar" from "test/test4/sig/Bar.java" as Bar; + +global protocol Proto1(role A, role B) +{ + choice at A + { + Foo from A to B; + do Proto1(A, B); + } + or + { + Bar from A to B; + } +} diff --git a/scribble-test/src/test/scrib/test/test4/sig/Bar.java b/scribble-test/src/test/scrib/test/test4/sig/Bar.java new file mode 100644 index 000000000..9ee19e039 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test4/sig/Bar.java @@ -0,0 +1,19 @@ +package test.test4.sig; + +import test.test4.Test4.Proto1.Proto1; + +public class Bar extends Test4Message +{ + private static final long serialVersionUID = 1L; + + public Bar(int body) + { + super(Proto1.Bar, body); + } + + @Override + public Integer getBody() + { + return (Integer) this.payload[0]; + } +} diff --git a/scribble-test/src/test/scrib/test/test4/sig/Foo.java b/scribble-test/src/test/scrib/test/test4/sig/Foo.java new file mode 100644 index 000000000..ab7aa630f --- /dev/null +++ b/scribble-test/src/test/scrib/test/test4/sig/Foo.java @@ -0,0 +1,19 @@ +package test.test4.sig; + +import test.test4.Test4.Proto1.Proto1; + +public class Foo extends Test4Message +{ + private static final long serialVersionUID = 1L; + + public Foo(String body) + { + super(Proto1.Foo, body); + } + + @Override + public String getBody() + { + return (String) this.payload[0]; + } +} diff --git a/scribble-test/src/test/scrib/test/test4/sig/Test4Formatter.java b/scribble-test/src/test/scrib/test/test4/sig/Test4Formatter.java new file mode 100644 index 000000000..d0c33d2b1 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test4/sig/Test4Formatter.java @@ -0,0 +1,121 @@ +package test.test4.sig; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; + +import org.scribble.runtime.net.ScribMessage; +import org.scribble.runtime.net.ScribMessageFormatter; + +public class Test4Formatter implements ScribMessageFormatter +{ + public static Charset cs = Charset.forName("UTF8"); + + public Test4Formatter() + { + + } + + @Override + public byte[] toBytes(ScribMessage m) throws IOException + { + return ((Test4Message) m).toBytes(); + } + + @Override + public ScribMessage fromBytes(ByteBuffer bb) throws IOException, ClassNotFoundException + { + bb.flip(); + int rem = bb.remaining(); + if (rem < 3) + { + bb.compact(); + return null; + } + + int pos = bb.position(); + String m = new String(new byte[] { bb.get(pos), bb.get(pos + 1), bb.get(pos + 2) }, Test4Formatter.cs); + switch (m) + { + case "Foo": + { + String body = readLine(bb, pos + 3).trim(); // Whitespace already built into the message classes + bb.compact(); + if (body == null) + { + return null; + } + return new Foo(body); + } + case "Bar": + { + String body = readLine(bb, pos + 3).trim(); // Whitespace already built into the message classes + bb.compact(); + if (body == null) + { + return null; + } + return new Bar(Integer.parseInt(body)); + } + default: throw new RuntimeException("Deserialization error: " + m); + } + } + + private static String readLine(ByteBuffer bb, int i) throws IOException + { + StringBuilder sb = new StringBuilder(); + for (int limit = bb.limit(); i <= limit; ) + { + char c = (char) bb.get(i++); + sb.append(c); + if (c == '\n') + { + bb.position(i); + return sb.substring(0, sb.length() - 1).toString(); + } + } + return null; + } + + /*// Duplicated from HttpMessageFormatter // FIXME: factor out + private int isStatusCode(String front) + { + String code = ""; + for (int i = 0; i < 4; i++) + { + //char c = (char) bs[i]; + char c = front.charAt(i); + if (i < 3) + { + if (c < '0' || c > '9') + { + return -1; + } + code += c; + } + else + { + if (c != ' ' && c != '-') // HACK: hypen + { + return -1; + } + } + } + return Integer.parseInt(code); + }*/ + + + @Override + public void writeMessage(DataOutputStream dos, ScribMessage m) throws IOException + { + throw new RuntimeException("Deprecated: " + m); + } + + @Override + public Test4Message readMessage(DataInputStream dis) throws IOException + { + throw new RuntimeException("Deprecated: "); + } +} diff --git a/scribble-test/src/test/scrib/test/test4/sig/Test4Message.java b/scribble-test/src/test/scrib/test/test4/sig/Test4Message.java new file mode 100644 index 000000000..2d36c612c --- /dev/null +++ b/scribble-test/src/test/scrib/test/test4/sig/Test4Message.java @@ -0,0 +1,34 @@ +package test.test4.sig; + +import org.scribble.runtime.net.ScribMessage; +import org.scribble.type.name.Op; + +public abstract class Test4Message extends ScribMessage +{ + private static final long serialVersionUID = 1L; + + /*public Test4Message(Op op) + { + super(op); + }*/ + + public Test4Message(Op op, Object body) + { + super(op, body); + } + + public abstract Object getBody(); + + public byte[] toBytes() + { + // op is 3-char header (Foo/Bar) + byte[] bs = (this.op.toString() + getBody() + "\n").getBytes(Test4Formatter.cs); + return bs; + } + + @Override + public String toString() + { + return new String(toBytes()); + } +} From 58b110f152c01896a2cd239db76f3e53bb0a49db Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 8 Mar 2018 12:29:26 +0000 Subject: [PATCH 022/539] Added peer role to branch-receive signature in ED API gen. --- .../eventdriven/EDEndpointApiGenerator.java | 6 ++---- .../runtime/net/session/EventDrivenEndpoint.java | 5 +++-- scribble-test/src/test/scrib/test/test2/MyA.java | 14 ++++++++++++++ scribble-test/src/test/scrib/test/test2/MyB.java | 5 +++-- scribble-test/src/test/scrib/test/test3/MyB.java | 5 +++-- scribble-test/src/test/scrib/test/test3/MyC.java | 5 +++-- scribble-test/src/test/scrib/test/test4/MyA.java | 1 + scribble-test/src/test/scrib/test/test4/MyB.java | 6 ++++-- 8 files changed, 33 insertions(+), 14 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java index 3fc11a294..db96d8a58 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java @@ -11,7 +11,6 @@ import org.scribble.ast.DataTypeDecl; import org.scribble.ast.MessageSigNameDecl; -import org.scribble.ast.NonProtocolDecl; import org.scribble.codegen.java.endpointapi.SessionApiGenerator; import org.scribble.main.Job; import org.scribble.main.JobContext; @@ -22,7 +21,6 @@ import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.MessageSigName; import org.scribble.type.name.PayloadElemType; import org.scribble.type.name.Role; @@ -293,7 +291,7 @@ public Map buildEndpointClass() throws ScribbleException .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); } - branchInterface += "\npublic abstract void receive(D data, "; + branchInterface += "\npublic abstract void receive(D data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer, "; if (isSig) { branchInterface += msnd.extName + " m"; @@ -327,7 +325,7 @@ public Map buildEndpointClass() throws ScribbleException .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); } - branchInterface += "case \"" + SessionApiGenerator.getOpClassName(a.mid) + "\": receive(data, "; + branchInterface += "case \"" + SessionApiGenerator.getOpClassName(a.mid) + "\": receive(data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ", "; if (isSig) { branchInterface += "(" + msnd.extName + ") m"; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java index 10da59f2b..ed3d9cb3f 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java @@ -37,7 +37,8 @@ public class EventDrivenEndpoint extends MPSTEndpoint { protected final ScribState init; - protected final Map> outputs = new HashMap<>(); + //protected final Map> outputs = new HashMap<>(); + protected final Map> outputs = new HashMap<>(); protected final Map> inputs = new HashMap<>(); protected final D data; @@ -72,7 +73,7 @@ public void run() { if (curr instanceof ScribOutputState) { - ScribHandlerMessage m = this.edep.outputs.get(curr).apply(this.edep.data); // FIXME: state object + ScribHandlerMessage m = (ScribHandlerMessage) this.edep.outputs.get(curr).apply(this.edep.data); // FIXME: state object /*getChannelEndpoint(m.getPeer()).write(new ScribMessage(m.getOp(), m.getPayload().toArray(new Object[0]))); // FIXME: ScribEvent has extra Role curr = this.edep.states.get(((ScribOutputState) curr).succs.get(m.getOp()));*/ if (m instanceof ScribHandlerSig) diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index 5c61d5b5a..fcde8f623 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -5,6 +5,7 @@ import static test.test2.Test2.Proto1.Proto1._1; import java.io.IOException; +import java.util.List; import java.util.concurrent.Future; import org.scribble.runtime.net.ObjectStreamFormatter; @@ -25,6 +26,18 @@ public static void main(String[] args) throws IOException foo3(); } + interface I1 { } + interface I2 { } + void foo (T x) + { + + } + + void bar(List l) + { + + } + public static void foo3() throws IOException { Proto1 P1 = new Proto1(); @@ -34,6 +47,7 @@ public static void foo3() throws IOException a.register(Proto1_A_5.id, x -> //new Proto1_A_5__1(B, 123)); new Proto1_A_5__2(B, "abc")); + // FIXME: make "structural" nominal types for messages using roles+labs+pays, instead of sids Future f = a.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java index 32c44e58c..080cc0aa2 100644 --- a/scribble-test/src/test/scrib/test/test2/MyB.java +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -21,6 +21,7 @@ import test.test2.Test2.Proto1.handlers.states.B.Proto1_B_10; import test.test2.Test2.Proto1.ops._1; import test.test2.Test2.Proto1.ops._2; +import test.test2.Test2.Proto1.roles.A; import test.test2.Test2.Proto1.roles.B; public class MyB @@ -35,13 +36,13 @@ public static void foo3() throws IOException class MyHandler extends Proto1_B_10_Branch { @Override - public void receive(Void data, _1 op, Integer arg1) + public void receive(Void data, A peer, _1 op, Integer arg1) { System.out.println("(B) received 1: " + arg1); } @Override - public void receive(Void data, _2 op, String arg1) + public void receive(Void data, A peer, _2 op, String arg1) { System.out.println("(B) received 2: " + arg1); } diff --git a/scribble-test/src/test/scrib/test/test3/MyB.java b/scribble-test/src/test/scrib/test/test3/MyB.java index 64ddaef91..5cb1ce87b 100644 --- a/scribble-test/src/test/scrib/test/test3/MyB.java +++ b/scribble-test/src/test/scrib/test/test3/MyB.java @@ -22,6 +22,7 @@ import test.test3.Test3.Proto1.handlers.states.B.messages.Proto1_B_17__4; import test.test3.Test3.Proto1.ops._1; import test.test3.Test3.Proto1.ops._3; +import test.test3.Test3.Proto1.roles.A; public class MyB { @@ -30,14 +31,14 @@ public static void main(String[] args) throws IOException class MyHandler extends Proto1_B_14_Branch { @Override - public void receive(int[] data, _1 op, Integer x) + public void receive(int[] data, A peer, _1 op, Integer x) { data[0]++; System.out.println("(B) received 1: " + data[0] + ", " + x); } @Override - public void receive(int[] data, _3 op, String x) + public void receive(int[] data, A peer,_3 op, String x) { data[0]++; System.out.println("(B) received 3: " + data[0] + ", " + x); diff --git a/scribble-test/src/test/scrib/test/test3/MyC.java b/scribble-test/src/test/scrib/test/test3/MyC.java index 583843d05..af28eda5f 100644 --- a/scribble-test/src/test/scrib/test/test3/MyC.java +++ b/scribble-test/src/test/scrib/test/test3/MyC.java @@ -16,6 +16,7 @@ import test.test3.Test3.Proto1.handlers.states.C.Proto1_C_22; import test.test3.Test3.Proto1.ops._2; import test.test3.Test3.Proto1.ops._4; +import test.test3.Test3.Proto1.roles.B; public class MyC { @@ -24,13 +25,13 @@ public static void main(String[] args) throws IOException class MyHandler extends Proto1_C_22_Branch { @Override - public void receive(Void data, _2 op, Integer x) + public void receive(Void data, B peer, _2 op, Integer x) { System.out.println("(C) received 2: " + x); } @Override - public void receive(Void data, _4 op, String x) + public void receive(Void data, B peer, _4 op, String x) { System.out.println("(C) received 4: " + x); } diff --git a/scribble-test/src/test/scrib/test/test4/MyA.java b/scribble-test/src/test/scrib/test/test4/MyA.java index 210d6864a..5af2d5603 100644 --- a/scribble-test/src/test/scrib/test/test4/MyA.java +++ b/scribble-test/src/test/scrib/test/test4/MyA.java @@ -26,6 +26,7 @@ public static void main(String[] args) throws IOException { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); a.register(Proto1_A_6.id, x -> (x[0]++ < 5) ? new Proto1_A_6_Foo(B, new Foo("abc")) : new Proto1_A_6_Bar(B, new Bar(123))); + // FIXME: remove sid from message class for sigs Future f = a.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test4/MyB.java b/scribble-test/src/test/scrib/test/test4/MyB.java index 59515e0b0..341ff1574 100644 --- a/scribble-test/src/test/scrib/test/test4/MyB.java +++ b/scribble-test/src/test/scrib/test/test4/MyB.java @@ -13,6 +13,7 @@ import test.test4.Test4.Proto1.handlers.B.Proto1_B; import test.test4.Test4.Proto1.handlers.B.Proto1_B_12_Branch; import test.test4.Test4.Proto1.handlers.states.B.Proto1_B_12; +import test.test4.Test4.Proto1.roles.A; import test.test4.sig.Bar; import test.test4.sig.Foo; import test.test4.sig.Test4Formatter; @@ -21,17 +22,18 @@ public class MyB { public static void main(String[] args) throws IOException { + // FIXME: make "structural" nominal types for branches using roles+labs+pays, instead of sids class MyHandler extends Proto1_B_12_Branch { @Override - public void receive(int[] data, Foo m) + public void receive(int[] data, A peer, Foo m) { data[0]++; System.out.println("(B) received Foo: " + m.getBody() + ", " + data[0]); } @Override - public void receive(int[] data, Bar m) + public void receive(int[] data, A peer, Bar m) { data[0]++; System.out.println("(B) received Bar: " + m.getBody() + ", " + data[0]); From 846592d3388d72b2e2933efa86be0de2bf816f53 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 8 Mar 2018 18:08:05 +0000 Subject: [PATCH 023/539] Added basic "structural" interfaces for output-callbacks to ED API gen. --- .../eventdriven/EDEndpointApiGenerator.java | 79 +++++++++++++++---- .../smtp/message/SmtpMessageFormatter.java | 2 + .../net/state/ScribHandlerMessage.java | 3 +- .../src/test/scrib/test/test2/MyA.java | 2 +- .../src/test/scrib/test/test2/MyB.java | 3 +- .../src/test/scrib/test/test3/MyA.java | 5 +- .../src/test/scrib/test/test3/MyB.java | 3 +- .../src/test/scrib/test/test3/MyC.java | 1 + .../src/test/scrib/test/test4/MyA.java | 9 ++- .../src/test/scrib/test/test4/MyB.java | 4 +- .../scrib/test/test4/sig/Test4Formatter.java | 29 +------ 11 files changed, 89 insertions(+), 51 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java index db96d8a58..04363a32f 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java @@ -173,22 +173,41 @@ public Map buildEndpointClass() throws ScribbleException if (s.getStateKind() == EStateKind.OUTPUT) { String mprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/states/" + this.self + "/messages/"; - - String messageIfName = name + "_" + s.id + "_Message"; + + // FIXME: generate lattice -- cf. original handler i/f's (with "subtyping") + String messageIfName = name + + //a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()); + s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); String messageInterface = ""; - messageInterface += "package " + pack + ".handlers.states." + this.self + ".messages;\n"; + messageInterface += "package " + pack + ".handlers.states." + this.self + ".messages.interfaces;\n"; messageInterface += "\n"; - messageInterface += "public abstract class " + messageIfName + " extends org.scribble.runtime.net.state.ScribHandlerMessage {\n"; - messageInterface += "private static final long serialVersionUID = 1L;\n"; - messageInterface += "\n"; - messageInterface += "public " + messageIfName + "(org.scribble.type.name.Role peer, org.scribble.type.name.Op op, Object... payload) {\n"; - messageInterface += "super(peer, op, payload);\n"; - messageInterface += "}\n"; + messageInterface += "public interface " + messageIfName + " {\n"; messageInterface += "}\n"; - res.put(mprefix + messageIfName + ".java", messageInterface); + res.put(mprefix + "interfaces/" + messageIfName + ".java", messageInterface); + + String messageAbstractName = name + "_" + s.id + "_Message"; + String messageAbstract = ""; + messageAbstract += "package " + pack + ".handlers.states." + this.self + ".messages;\n"; + messageAbstract += "\n"; + messageAbstract += "public abstract class " + messageAbstractName + " extends org.scribble.runtime.net.state.ScribHandlerMessage implements " + pack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName + " {\n"; + messageAbstract += "private static final long serialVersionUID = 1L;\n"; + messageAbstract += "\n"; + messageAbstract += "public " + messageAbstractName + "(org.scribble.type.name.Role peer, org.scribble.type.name.Op op, Object... payload) {\n"; + messageAbstract += "super(peer, op, payload);\n"; + messageAbstract += "}\n"; + messageAbstract += "}\n"; + res.put(mprefix + messageAbstractName + ".java", messageAbstract); for (EAction a : s.getAllActions()) { + /*String messageIfName = name + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()); + String messageInterface = ""; + messageInterface += "package " + pack + ".handlers.states." + this.self + ".messages.interfaces;\n"; + messageInterface += "\n"; + messageInterface += "public interface " + messageIfName + " {\n"; + messageInterface += "}\n"; + res.put(mprefix + "interfaces/" + messageIfName + ".java", messageInterface);*/ + boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); MessageSigNameDecl msnd = null; @@ -198,11 +217,19 @@ public Map buildEndpointClass() throws ScribbleException .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); } - String messageName = name + "_" + s.id + "_" + SessionApiGenerator.getOpClassName(a.mid); + String messageName; + if (isSig) + { + messageName = name + "_" + SessionApiGenerator.getOpClassName(a.mid); + } + else + { + messageName = name + "_" + s.id + "_" + SessionApiGenerator.getOpClassName(a.mid); + } String messageClass = ""; messageClass += "package " + pack + ".handlers.states." + this.self + ".messages;\n"; messageClass += "\n"; - messageClass += "public class " + messageName + " extends " + messageIfName; + messageClass += "public class " + messageName + " extends " + messageAbstractName; //+ " implements " + pack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName; if (isSig) { messageClass += " implements org.scribble.runtime.net.state.ScribHandlerSig"; @@ -389,17 +416,40 @@ private String generateRegister(GProtocolName gpn, Role self, EState s) case OUTPUT: { // FIXME: "untyped" (ScribEvent) -- need state-specific "enums" - res += "public void register(" + prefix + name + "_" + s.id + res += "public " + name + " callback(" + prefix + name + "_" + s.id + " sid, java.util.function.Function h) {\n"; // FIXME: factor out + /*res += "this.outputs.put(sid, h);\n"; + res += "return this;\n";*/ + res += "return icallback(sid, h);\n"; + res += "}\n"; + res += "\n"; + /*for (EAction a : s.getAllActions()) + { + String messageIfName = name + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()); // FIXME: factor out; + res += "public " + name + " callback(" + prefix + name + "_" + s.id + + " sid, java.util.function.Function h) {\n"; + res += "this.outputs.put(sid, h);\n"; + res += "return this;\n"; + res += "}\n"; + res += "\n"; + }*/ + String messageIfName = name + + s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); + res += "public " + name + " icallback(" + prefix + name + "_" + s.id + + " sid, java.util.function.Function h) {\n"; // FIXME: factor out res += "this.outputs.put(sid, h);\n"; + res += "return this;\n"; res += "}\n"; + res += "\n"; break; } case UNARY_INPUT: case POLY_INPUT: { - res += "public void register(" + prefix + name + "_" + s.id + " sid"; + res += "public " + name + " callback(" + prefix + name + "_" + s.id + " sid"; /*for (EAction a : s.getAllActions()) { res += ", org.scribble.util.function.Function2<" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) @@ -418,6 +468,7 @@ private String generateRegister(GProtocolName gpn, Role self, EState s) res += ", " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + "." + name + "_" + s.id + "_Branch b"; res += ") {\n"; res += "this.inputs.put(sid, b);\n"; + res += "return this;\n"; res += "}\n"; break; } diff --git a/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessageFormatter.java b/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessageFormatter.java index 6195d77a5..459c34db1 100644 --- a/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessageFormatter.java +++ b/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessageFormatter.java @@ -275,6 +275,7 @@ private void readMinimumBytes(DataInputStream dis, int min) throws IOException } }*/ + @Deprecated @Override public void writeMessage(DataOutputStream dos, ScribMessage m) throws IOException { @@ -282,6 +283,7 @@ public void writeMessage(DataOutputStream dos, ScribMessage m) throws IOExceptio dos.flush(); } + @Deprecated @Override public SmtpMessage readMessage(DataInputStream dis) throws IOException { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerMessage.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerMessage.java index bd01db12d..287a54295 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerMessage.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerMessage.java @@ -4,7 +4,8 @@ import org.scribble.type.name.Op; import org.scribble.type.name.Role; -// FIXME: integrate with ScribMessage (maybe rename latter to ScribRuntimeMessage) +// FIXME: integrate with ScribMessage (maybe rename latter to ScribRuntimeMessage -- or rename this to ScribDirectedMessage) +// FIXME: not serializable due to RoleKind (in Role) public abstract class ScribHandlerMessage extends ScribMessage { private static final long serialVersionUID = 1L; diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index fcde8f623..ceb04f416 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -44,7 +44,7 @@ public static void foo3() throws IOException try (Proto1_A a = new Proto1_A<>(P1, A, new ObjectStreamFormatter(), null)) { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); - a.register(Proto1_A_5.id, x -> + a.callback(Proto1_A_5.id, x -> //new Proto1_A_5__1(B, 123)); new Proto1_A_5__2(B, "abc")); // FIXME: make "structural" nominal types for messages using roles+labs+pays, instead of sids diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java index 080cc0aa2..1509b792f 100644 --- a/scribble-test/src/test/scrib/test/test2/MyB.java +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -33,6 +33,7 @@ public static void main(String[] args) throws IOException public static void foo3() throws IOException { + // FIXME: make "structural" nominal types for branches using roles+labs+pays, instead of sids class MyHandler extends Proto1_B_10_Branch { @Override @@ -56,7 +57,7 @@ public void receive(Void data, A peer, _2 op, String arg1) try (Proto1_B b = new Proto1_B<>(P1, B, new ObjectStreamFormatter(), null)) { b.accept(ss, A); - b.register(Proto1_B_10.id, new MyHandler()); + b.callback(Proto1_B_10.id, new MyHandler()); Future f = b.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test3/MyA.java b/scribble-test/src/test/scrib/test/test3/MyA.java index dc10c4af8..4cdbe686d 100644 --- a/scribble-test/src/test/scrib/test/test3/MyA.java +++ b/scribble-test/src/test/scrib/test/test3/MyA.java @@ -23,7 +23,10 @@ public static void main(String[] args) throws IOException try (Proto1_A a = new Proto1_A<>(P1, A, new ObjectStreamFormatter(), new int[1])) { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); - a.register(Proto1_A_6.id, x -> (x[0]++ < 3) ? new Proto1_A_6__1(B, 123) : new Proto1_A_6__3(B, "abc")); + + a.register(Proto1_A_6.id, + x -> (x[0]++ < 3) ? new Proto1_A_6__1(B, 123) : new Proto1_A_6__3(B, "abc") + ); Future f = a.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test3/MyB.java b/scribble-test/src/test/scrib/test/test3/MyB.java index 5cb1ce87b..8a37588ad 100644 --- a/scribble-test/src/test/scrib/test/test3/MyB.java +++ b/scribble-test/src/test/scrib/test/test3/MyB.java @@ -38,7 +38,7 @@ public void receive(int[] data, A peer, _1 op, Integer x) } @Override - public void receive(int[] data, A peer,_3 op, String x) + public void receive(int[] data, A peer, _3 op, String x) { data[0]++; System.out.println("(B) received 3: " + data[0] + ", " + x); @@ -54,6 +54,7 @@ public void receive(int[] data, A peer,_3 op, String x) { b.accept(ss, A); b.request(C, SocketChannelEndpoint::new, "localhost", 9999); + b.register(Proto1_B_14.id, new MyHandler()); b.register(Proto1_B_16.id, x -> new Proto1_B_16__2(C, 456)); b.register(Proto1_B_17.id, x -> new Proto1_B_17__4(C, "def")); diff --git a/scribble-test/src/test/scrib/test/test3/MyC.java b/scribble-test/src/test/scrib/test/test3/MyC.java index af28eda5f..2a86b6a00 100644 --- a/scribble-test/src/test/scrib/test/test3/MyC.java +++ b/scribble-test/src/test/scrib/test/test3/MyC.java @@ -45,6 +45,7 @@ public void receive(Void data, B peer, _4 op, String x) try (Proto1_C b = new Proto1_C<>(P1, C, new ObjectStreamFormatter(), null)) { b.accept(ss, B); + b.register(Proto1_C_22.id, new MyHandler()); Future f = b.run(); diff --git a/scribble-test/src/test/scrib/test/test4/MyA.java b/scribble-test/src/test/scrib/test/test4/MyA.java index 5af2d5603..4e55008bc 100644 --- a/scribble-test/src/test/scrib/test/test4/MyA.java +++ b/scribble-test/src/test/scrib/test/test4/MyA.java @@ -11,8 +11,8 @@ import test.test4.Test4.Proto1.Proto1; import test.test4.Test4.Proto1.handlers.A.Proto1_A; import test.test4.Test4.Proto1.handlers.states.A.Proto1_A_6; -import test.test4.Test4.Proto1.handlers.states.A.messages.Proto1_A_6_Bar; -import test.test4.Test4.Proto1.handlers.states.A.messages.Proto1_A_6_Foo; +import test.test4.Test4.Proto1.handlers.states.A.messages.Proto1_A_Bar; +import test.test4.Test4.Proto1.handlers.states.A.messages.Proto1_A_Foo; import test.test4.sig.Bar; import test.test4.sig.Foo; import test.test4.sig.Test4Formatter;; @@ -25,7 +25,10 @@ public static void main(String[] args) throws IOException try (Proto1_A a = new Proto1_A<>(P1, A, new Test4Formatter(), new int[1])) { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); - a.register(Proto1_A_6.id, x -> (x[0]++ < 5) ? new Proto1_A_6_Foo(B, new Foo("abc")) : new Proto1_A_6_Bar(B, new Bar(123))); + + a.icallback(Proto1_A_6.id, + x -> (x[0]++ < 5) ? new Proto1_A_Foo(B, new Foo("abc")) : new Proto1_A_Bar(B, new Bar(123)) + ); // FIXME: remove sid from message class for sigs Future f = a.run(); diff --git a/scribble-test/src/test/scrib/test/test4/MyB.java b/scribble-test/src/test/scrib/test/test4/MyB.java index 341ff1574..6f5ab5ce0 100644 --- a/scribble-test/src/test/scrib/test/test4/MyB.java +++ b/scribble-test/src/test/scrib/test/test4/MyB.java @@ -22,7 +22,6 @@ public class MyB { public static void main(String[] args) throws IOException { - // FIXME: make "structural" nominal types for branches using roles+labs+pays, instead of sids class MyHandler extends Proto1_B_12_Branch { @Override @@ -48,7 +47,8 @@ public void receive(int[] data, A peer, Bar m) try (Proto1_B b = new Proto1_B<>(P1, B, new Test4Formatter(), new int[1])) { b.accept(ss, A); - b.register(Proto1_B_12.id, new MyHandler()); + + b.callback(Proto1_B_12.id, new MyHandler()); Future f = b.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test4/sig/Test4Formatter.java b/scribble-test/src/test/scrib/test/test4/sig/Test4Formatter.java index d0c33d2b1..c02a8b258 100644 --- a/scribble-test/src/test/scrib/test/test4/sig/Test4Formatter.java +++ b/scribble-test/src/test/scrib/test/test4/sig/Test4Formatter.java @@ -79,40 +79,15 @@ private static String readLine(ByteBuffer bb, int i) throws IOException return null; } - /*// Duplicated from HttpMessageFormatter // FIXME: factor out - private int isStatusCode(String front) - { - String code = ""; - for (int i = 0; i < 4; i++) - { - //char c = (char) bs[i]; - char c = front.charAt(i); - if (i < 3) - { - if (c < '0' || c > '9') - { - return -1; - } - code += c; - } - else - { - if (c != ' ' && c != '-') // HACK: hypen - { - return -1; - } - } - } - return Integer.parseInt(code); - }*/ - + @Deprecated @Override public void writeMessage(DataOutputStream dos, ScribMessage m) throws IOException { throw new RuntimeException("Deprecated: " + m); } + @Deprecated @Override public Test4Message readMessage(DataInputStream dis) throws IOException { From 59ed209fcbc05c99fb295ff4cd21f0e3de08483d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 8 Mar 2018 18:49:57 +0000 Subject: [PATCH 024/539] Added receive-interfaces to branch-callbacks in ED API gen. --- .../eventdriven/EDEndpointApiGenerator.java | 91 +++++++++++++++---- .../net/session/EventDrivenEndpoint.java | 6 +- .../src/test/scrib/test/test2/MyB.java | 2 +- .../src/test/scrib/test/test3/MyA.java | 2 +- .../src/test/scrib/test/test3/MyB.java | 6 +- .../src/test/scrib/test/test3/MyC.java | 2 +- .../src/test/scrib/test/test4/MyB.java | 2 +- 7 files changed, 82 insertions(+), 29 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java index 04363a32f..fa611d250 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java @@ -302,11 +302,14 @@ public Map buildEndpointClass() throws ScribbleException { String bprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/" + this.self + "/"; String branchName = name + "_" + s.id + "_Branch"; - String branchInterface = ""; - branchInterface += "package " + pack + ".handlers." + this.self + ";\n"; - branchInterface += ""; - branchInterface += "public abstract class " + branchName + " implements org.scribble.runtime.net.state.ScribBranch {\n"; - for (EAction a : s.getAllActions()) + String branchAbstract = ""; + branchAbstract += "package " + pack + ".handlers." + this.self + ";\n"; + branchAbstract += ""; + branchAbstract += "public abstract class " + branchName + " implements org.scribble.runtime.net.state.ScribBranch"; + branchAbstract += s.getAllActions().stream().map(a -> + ", " + pack + ".handlers." + this.self + ".interfaces." + name + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()) + "").collect(Collectors.joining("")); + branchAbstract += " {\n"; + /*for (EAction a : s.getAllActions()) { // FIXME: factor out boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() @@ -334,14 +337,19 @@ public Map buildEndpointClass() throws ScribbleException } } branchInterface += ");\n"; - } + }*/ - branchInterface += "\n"; - branchInterface += "@Override\n"; - branchInterface += "public void dispatch(D data, org.scribble.runtime.net.ScribMessage m) {\n"; - branchInterface += "switch (m.op.toString()) {\n"; + branchAbstract += "\n"; + branchAbstract += "@Override\n"; + branchAbstract += "public void dispatch(D data, org.scribble.runtime.net.ScribMessage m) {\n"; + branchAbstract += "switch (m.op.toString()) {\n"; for (EAction a : s.getAllActions()) { + String receiveIfName = name + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()); + String receiveInterface = ""; + receiveInterface += "package " + pack + ".handlers." + this.self + ".interfaces;\n"; + receiveInterface += "\n"; + receiveInterface += "public interface " + receiveIfName + " {\n"; // FIXME: factor out boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); @@ -352,29 +360,58 @@ public Map buildEndpointClass() throws ScribbleException .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); } - branchInterface += "case \"" + SessionApiGenerator.getOpClassName(a.mid) + "\": receive(data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ", "; + receiveInterface += "\npublic void receive(D data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer, "; if (isSig) { - branchInterface += "(" + msnd.extName + ") m"; + receiveInterface += msnd.extName + " m"; } else { - branchInterface += "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + ") m.op"; + receiveInterface += SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + " op"; + int i = 1; + for (PayloadElemType pet : a.payload.elems) + { + DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + receiveInterface += ", " + dtd.extName + " arg" + i++; + } + } + receiveInterface += ");\n"; + receiveInterface += "}\n"; + res.put(bprefix + "interfaces/" + receiveIfName + ".java", receiveInterface); + + // FIXME: factor out + /*boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); + MessageSigNameDecl msnd = null; + if (isSig) + { + msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() + .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); + }*/ + + branchAbstract += "case \"" + SessionApiGenerator.getOpClassName(a.mid) + "\": receive(data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ", "; + if (isSig) + { + branchAbstract += "(" + msnd.extName + ") m"; + } + else + { + branchAbstract += "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + ") m.op"; } int i = 0; for (PayloadElemType pet : a.payload.elems) { DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); - branchInterface += ", (" + dtd.extName + ") m.payload[" + i++ + "]"; + branchAbstract += ", (" + dtd.extName + ") m.payload[" + i++ + "]"; } - branchInterface += "); break;\n"; + branchAbstract += "); break;\n"; } - branchInterface += "default: throw new RuntimeException(\"Shouldn't get in here: \" + m);\n"; - branchInterface += "}\n"; - branchInterface += "}\n"; - branchInterface += "}\n"; + branchAbstract += "default: throw new RuntimeException(\"Shouldn't get in here: \" + m);\n"; + branchAbstract += "}\n"; + branchAbstract += "}\n"; + branchAbstract += "}\n"; - res.put(bprefix + branchName + ".java", branchInterface); + res.put(bprefix + branchName + ".java", branchAbstract); } } @@ -467,9 +504,23 @@ private String generateRegister(GProtocolName gpn, Role self, EState s) res += "}\n";*/ res += ", " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + "." + name + "_" + s.id + "_Branch b"; res += ") {\n"; + /*res += "this.inputs.put(sid, b);\n"; + res += "return this;\n";*/ + res += "return icallback(sid, b);\n"; + res += "}\n"; + res += "\n"; + String T = s.getAllActions().stream().map(a -> SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + ".interfaces." + name + "__" + a.peer + "_" + + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining("")) + "").collect(Collectors.joining(" & ")); + // FIXME: EventDrivenEndpoint will cast to Branch for dispatch -- not guaranteed by implementation of receive i/f's + res += "public " + "\n" + + name + " icallback(" + prefix + name + "_" + s.id + + " sid, T" + //+ SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + ".interfaces." + receiveIfName + " + + " b) {\n"; // FIXME: factor out res += "this.inputs.put(sid, b);\n"; res += "return this;\n"; res += "}\n"; + res += "\n"; break; } case TERMINAL: diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java index ed3d9cb3f..d0edae851 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java @@ -39,7 +39,8 @@ public class EventDrivenEndpoint extends M protected final ScribState init; //protected final Map> outputs = new HashMap<>(); protected final Map> outputs = new HashMap<>(); - protected final Map> inputs = new HashMap<>(); + //protected final Map> inputs = new HashMap<>(); + protected final Map inputs = new HashMap<>(); protected final D data; @@ -91,7 +92,8 @@ else if (curr instanceof ScribInputState) try // cf. ReceiveSocket#readScribMessage { ScribMessage m = getChannelEndpoint(((ScribInputState) curr).peer).getFuture().get(); - this.edep.inputs.get(curr).dispatch(this.edep.data, m); // FIXME: state object and received payloads -- null op OK? + // FIXME: generic cast + ((ScribBranch) this.edep.inputs.get(curr)).dispatch(this.edep.data, m); // FIXME: state object and received payloads -- null op OK? curr = this.edep.states.get(((ScribInputState) curr).succs.get(m.op)); } catch (InterruptedException e) diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java index 1509b792f..e41aef117 100644 --- a/scribble-test/src/test/scrib/test/test2/MyB.java +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -57,7 +57,7 @@ public void receive(Void data, A peer, _2 op, String arg1) try (Proto1_B b = new Proto1_B<>(P1, B, new ObjectStreamFormatter(), null)) { b.accept(ss, A); - b.callback(Proto1_B_10.id, new MyHandler()); + b.icallback(Proto1_B_10.id, new MyHandler()); Future f = b.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test3/MyA.java b/scribble-test/src/test/scrib/test/test3/MyA.java index 4cdbe686d..5572cbfce 100644 --- a/scribble-test/src/test/scrib/test/test3/MyA.java +++ b/scribble-test/src/test/scrib/test/test3/MyA.java @@ -24,7 +24,7 @@ public static void main(String[] args) throws IOException { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); - a.register(Proto1_A_6.id, + a.icallback(Proto1_A_6.id, x -> (x[0]++ < 3) ? new Proto1_A_6__1(B, 123) : new Proto1_A_6__3(B, "abc") ); diff --git a/scribble-test/src/test/scrib/test/test3/MyB.java b/scribble-test/src/test/scrib/test/test3/MyB.java index 8a37588ad..d900d9f96 100644 --- a/scribble-test/src/test/scrib/test/test3/MyB.java +++ b/scribble-test/src/test/scrib/test/test3/MyB.java @@ -55,9 +55,9 @@ public void receive(int[] data, A peer, _3 op, String x) b.accept(ss, A); b.request(C, SocketChannelEndpoint::new, "localhost", 9999); - b.register(Proto1_B_14.id, new MyHandler()); - b.register(Proto1_B_16.id, x -> new Proto1_B_16__2(C, 456)); - b.register(Proto1_B_17.id, x -> new Proto1_B_17__4(C, "def")); + b.icallback(Proto1_B_14.id, new MyHandler()); + b.icallback(Proto1_B_16.id, x -> new Proto1_B_16__2(C, 456)); + b.icallback(Proto1_B_17.id, x -> new Proto1_B_17__4(C, "def")); Future f = b.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test3/MyC.java b/scribble-test/src/test/scrib/test/test3/MyC.java index 2a86b6a00..735c145a6 100644 --- a/scribble-test/src/test/scrib/test/test3/MyC.java +++ b/scribble-test/src/test/scrib/test/test3/MyC.java @@ -46,7 +46,7 @@ public void receive(Void data, B peer, _4 op, String x) { b.accept(ss, B); - b.register(Proto1_C_22.id, new MyHandler()); + b.icallback(Proto1_C_22.id, new MyHandler()); Future f = b.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test4/MyB.java b/scribble-test/src/test/scrib/test/test4/MyB.java index 6f5ab5ce0..b0e1d6457 100644 --- a/scribble-test/src/test/scrib/test/test4/MyB.java +++ b/scribble-test/src/test/scrib/test/test4/MyB.java @@ -48,7 +48,7 @@ public void receive(int[] data, A peer, Bar m) { b.accept(ss, A); - b.callback(Proto1_B_12.id, new MyHandler()); + b.icallback(Proto1_B_12.id, new MyHandler()); Future f = b.run(); f.get(); From c8aa89aec62f8451b52c8ed3621c93cc7b0d0209 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 8 Mar 2018 18:51:30 +0000 Subject: [PATCH 025/539] Minor. --- .../scribble/codegen/eventdriven/EDEndpointApiGenerator.java | 1 + scribble-test/src/test/scrib/test/test2/MyA.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java index fa611d250..1d1abe702 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java @@ -175,6 +175,7 @@ public Map buildEndpointClass() throws ScribbleException String mprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/states/" + this.self + "/messages/"; // FIXME: generate lattice -- cf. original handler i/f's (with "subtyping") + // FIXME: sort cases String messageIfName = name + //a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()); s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index ceb04f416..0cafb7712 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -44,7 +44,7 @@ public static void foo3() throws IOException try (Proto1_A a = new Proto1_A<>(P1, A, new ObjectStreamFormatter(), null)) { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); - a.callback(Proto1_A_5.id, x -> + a.icallback(Proto1_A_5.id, x -> //new Proto1_A_5__1(B, 123)); new Proto1_A_5__2(B, "abc")); // FIXME: make "structural" nominal types for messages using roles+labs+pays, instead of sids From 5baac6e5dc4d9ea7ef36679595d15e94b0e4125a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 8 Mar 2018 21:19:35 +0000 Subject: [PATCH 026/539] Added more ED API gen tests. --- .../src/test/scrib/test/test5/MyA.java | 47 +++++++++++++ .../src/test/scrib/test/test5/MyB.java | 64 +++++++++++++++++ .../src/test/scrib/test/test5/MyC.java | 62 +++++++++++++++++ .../src/test/scrib/test/test5/Test5.scr | 22 ++++++ .../src/test/scrib/test/test6/MyA.java | 61 +++++++++++++++++ .../src/test/scrib/test/test6/MyB.java | 68 +++++++++++++++++++ .../src/test/scrib/test/test6/Test6.scr | 15 ++++ .../src/test/scrib/test/test7/MyA.java | 45 ++++++++++++ .../src/test/scrib/test/test7/MyB.java | 66 ++++++++++++++++++ .../src/test/scrib/test/test7/Test7.scr | 27 ++++++++ 10 files changed, 477 insertions(+) create mode 100644 scribble-test/src/test/scrib/test/test5/MyA.java create mode 100644 scribble-test/src/test/scrib/test/test5/MyB.java create mode 100644 scribble-test/src/test/scrib/test/test5/MyC.java create mode 100644 scribble-test/src/test/scrib/test/test5/Test5.scr create mode 100644 scribble-test/src/test/scrib/test/test6/MyA.java create mode 100644 scribble-test/src/test/scrib/test/test6/MyB.java create mode 100644 scribble-test/src/test/scrib/test/test6/Test6.scr create mode 100644 scribble-test/src/test/scrib/test/test7/MyA.java create mode 100644 scribble-test/src/test/scrib/test/test7/MyB.java create mode 100644 scribble-test/src/test/scrib/test/test7/Test7.scr diff --git a/scribble-test/src/test/scrib/test/test5/MyA.java b/scribble-test/src/test/scrib/test/test5/MyA.java new file mode 100644 index 000000000..65841e194 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test5/MyA.java @@ -0,0 +1,47 @@ +package test.test5; + +import static test.test5.Test5.Proto1.Proto1.A; +import static test.test5.Test5.Proto1.Proto1.B; +import static test.test5.Test5.Proto1.Proto1.C; + +import java.io.IOException; +import java.util.concurrent.Future; + +import org.scribble.runtime.net.ObjectStreamFormatter; +import org.scribble.runtime.net.session.SocketChannelEndpoint; + +import test.test5.Test5.Proto1.Proto1; +import test.test5.Test5.Proto1.handlers.A.Proto1_A; +import test.test5.Test5.Proto1.handlers.states.A.Proto1_A_10; +import test.test5.Test5.Proto1.handlers.states.A.Proto1_A_11; +import test.test5.Test5.Proto1.handlers.states.A.Proto1_A_8; +import test.test5.Test5.Proto1.handlers.states.A.messages.Proto1_A_10__2; +import test.test5.Test5.Proto1.handlers.states.A.messages.Proto1_A_11__4; +import test.test5.Test5.Proto1.handlers.states.A.messages.Proto1_A_8__1; +import test.test5.Test5.Proto1.handlers.states.A.messages.Proto1_A_8__3;; + +public class MyA +{ + public static void main(String[] args) throws IOException + { + Proto1 P1 = new Proto1(); + try (Proto1_A a = new Proto1_A<>(P1, A, new ObjectStreamFormatter(), new int[1])) + { + a.request(B, SocketChannelEndpoint::new, "localhost", 8888); + a.request(C, SocketChannelEndpoint::new, "localhost", 9999); + + a.register(Proto1_A_8.id, x -> (x[0]++ < 3) ? new Proto1_A_8__1(B, 123) : new Proto1_A_8__3(B, "abc")); + a.register(Proto1_A_10.id, x -> new Proto1_A_10__2(C, 456)); + a.register(Proto1_A_11.id, x -> new Proto1_A_11__4(C, "def")); + + Future f = a.run(); + f.get(); + + System.out.println("(A) end"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } +} diff --git a/scribble-test/src/test/scrib/test/test5/MyB.java b/scribble-test/src/test/scrib/test/test5/MyB.java new file mode 100644 index 000000000..830f803ae --- /dev/null +++ b/scribble-test/src/test/scrib/test/test5/MyB.java @@ -0,0 +1,64 @@ +package test.test5; + +import static test.test5.Test5.Proto1.Proto1.A; +import static test.test5.Test5.Proto1.Proto1.B; + +import java.io.IOException; +import java.util.concurrent.Future; + +import org.scribble.runtime.net.ObjectStreamFormatter; +import org.scribble.runtime.net.scribsock.ScribServerSocket; +import org.scribble.runtime.net.scribsock.SocketChannelServer; + +import test.test5.Test5.Proto1.Proto1; +import test.test5.Test5.Proto1.handlers.B.Proto1_B; +import test.test5.Test5.Proto1.handlers.B.Proto1_B_16_Branch; +import test.test5.Test5.Proto1.handlers.states.B.Proto1_B_16; +import test.test5.Test5.Proto1.ops._1; +import test.test5.Test5.Proto1.ops._3; +import test.test5.Test5.Proto1.roles.A; + +public class MyB +{ + public static void main(String[] args) throws IOException + { + class MyHandler extends Proto1_B_16_Branch + { + @Override + public void receive(int[] data, A peer, _1 op, Integer x) + { + data[0]++; + System.out.println("(B) received 1: " + data[0] + ", " + x); + } + + @Override + public void receive(int[] data, A peer, _3 op, String x) + { + data[0]++; + System.out.println("(B) received 3: " + data[0] + ", " + x); + } + } + + try (ScribServerSocket ss = new SocketChannelServer(8888)) + { + while (true) + { + Proto1 P1 = new Proto1(); + try (Proto1_B b = new Proto1_B<>(P1, B, new ObjectStreamFormatter(), new int[1])) + { + b.accept(ss, A); + b.register(Proto1_B_16.id, new MyHandler()); + + Future f = b.run(); + f.get(); + + System.out.println("(B) end"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + } +} diff --git a/scribble-test/src/test/scrib/test/test5/MyC.java b/scribble-test/src/test/scrib/test/test5/MyC.java new file mode 100644 index 000000000..c5d451bc2 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test5/MyC.java @@ -0,0 +1,62 @@ +package test.test5; + +import static test.test5.Test5.Proto1.Proto1.A; +import static test.test5.Test5.Proto1.Proto1.C; + +import java.io.IOException; +import java.util.concurrent.Future; + +import org.scribble.runtime.net.ObjectStreamFormatter; +import org.scribble.runtime.net.scribsock.ScribServerSocket; +import org.scribble.runtime.net.scribsock.SocketChannelServer; + +import test.test5.Test5.Proto1.Proto1; +import test.test5.Test5.Proto1.handlers.C.Proto1_C; +import test.test5.Test5.Proto1.handlers.C.Proto1_C_22_Branch; +import test.test5.Test5.Proto1.handlers.states.C.Proto1_C_22; +import test.test5.Test5.Proto1.ops._2; +import test.test5.Test5.Proto1.ops._4; +import test.test5.Test5.Proto1.roles.A; + +public class MyC +{ + public static void main(String[] args) throws IOException + { + class MyHandler extends Proto1_C_22_Branch + { + @Override + public void receive(Void data, A peer, _2 op, Integer x) + { + System.out.println("(C) received 2: " + x); + } + + @Override + public void receive(Void data, A peer, _4 op, String x) + { + System.out.println("(C) received 4: " + x); + } + } + + try (ScribServerSocket ss = new SocketChannelServer(9999)) + { + while (true) + { + Proto1 P1 = new Proto1(); + try (Proto1_C b = new Proto1_C<>(P1, C, new ObjectStreamFormatter(), null)) + { + b.accept(ss, A); + b.register(Proto1_C_22.id, new MyHandler()); + + Future f = b.run(); + f.get(); + + System.out.println("(C) end"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + } +} diff --git a/scribble-test/src/test/scrib/test/test5/Test5.scr b/scribble-test/src/test/scrib/test/test5/Test5.scr new file mode 100644 index 000000000..041332fb9 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test5/Test5.scr @@ -0,0 +1,22 @@ +//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test5/Test5.scr -d scribble-test/src/test/scrib/ -edapi Proto1 A -edapi Proto1 B -edapi Proto1 C +//$ javadoc -cp scribble-cli/target/classes/';'scribble-test/target/classes';'scribble-parser/target/classes';'scribble-parser/lib/antlr-3.5.2-complete.jar';'scrib-core/src/test/scrib scrib-core/src/test/scrib/test/test5/Proto1*.java -d test/doc/test5 + +module test.test5.Test5; + +type "java.lang.Integer" from "rt.jar" as Int; +type "java.lang.String" from "rt.jar" as Str; + +global protocol Proto1(role A, role B, role C) +{ + choice at A + { + 1(Int) from A to B; + 2(Int) from A to C; + do Proto1(A, B, C); + } + or + { + 3(Str) from A to B; + 4(Str) from A to C; + } +} diff --git a/scribble-test/src/test/scrib/test/test6/MyA.java b/scribble-test/src/test/scrib/test/test6/MyA.java new file mode 100644 index 000000000..41e5eb65f --- /dev/null +++ b/scribble-test/src/test/scrib/test/test6/MyA.java @@ -0,0 +1,61 @@ +package test.test6; + +import static test.test6.Test6.Proto1.Proto1.A; +import static test.test6.Test6.Proto1.Proto1.B; + +import java.io.IOException; +import java.util.concurrent.Future; +import java.util.function.Function; + +import org.scribble.runtime.net.ObjectStreamFormatter; +import org.scribble.runtime.net.session.SocketChannelEndpoint; + +import test.test6.Test6.Proto1.Proto1; +import test.test6.Test6.Proto1.handlers.A.Proto1_A; +import test.test6.Test6.Proto1.handlers.A.Proto1_A_10_Branch; +import test.test6.Test6.Proto1.handlers.states.A.Proto1_A_10; +import test.test6.Test6.Proto1.handlers.states.A.Proto1_A_11; +import test.test6.Test6.Proto1.handlers.states.A.Proto1_A_12; +import test.test6.Test6.Proto1.handlers.states.A.Proto1_A_8; +import test.test6.Test6.Proto1.handlers.states.A.messages.Proto1_A_8_Message; +import test.test6.Test6.Proto1.handlers.states.A.messages.Proto1_A_8__1; +import test.test6.Test6.Proto1.ops._2; +import test.test6.Test6.Proto1.roles.B;; + +public class MyA +{ + public static void main(String[] args) throws IOException + { + class MyHandler extends Proto1_A_10_Branch + { + @Override + public void receive(int[] data, B peer, _2 op, String arg1) + { + System.out.println("(A) received 2: " + arg1 + ", " + data[0]++); + } + } + + Proto1 P1 = new Proto1(); + try (Proto1_A a = new Proto1_A<>(P1, A, new ObjectStreamFormatter(), new int[1])) + { + a.request(B, SocketChannelEndpoint::new, "localhost", 8888); + + Function h1 = x -> new Proto1_A_8__1(B, x[0]++); + MyHandler h2 = new MyHandler(); + + a.icallback(Proto1_A_8.id, h1); + a.icallback(Proto1_A_10.id, h2); + a.icallback(Proto1_A_11.id, h1); + a.icallback(Proto1_A_12.id, h2); + + Future f = a.run(); + f.get(); + + System.out.println("(A) end"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } +} diff --git a/scribble-test/src/test/scrib/test/test6/MyB.java b/scribble-test/src/test/scrib/test/test6/MyB.java new file mode 100644 index 000000000..4a37e4712 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test6/MyB.java @@ -0,0 +1,68 @@ +package test.test6; + +import static test.test6.Test6.Proto1.Proto1.A; +import static test.test6.Test6.Proto1.Proto1.B; + +import java.io.IOException; +import java.util.concurrent.Future; +import java.util.function.Function; + +import org.scribble.runtime.net.ObjectStreamFormatter; +import org.scribble.runtime.net.scribsock.ScribServerSocket; +import org.scribble.runtime.net.scribsock.SocketChannelServer; + +import test.test6.Test6.Proto1.Proto1; +import test.test6.Test6.Proto1.handlers.B.Proto1_B; +import test.test6.Test6.Proto1.handlers.B.Proto1_B_19_Branch; +import test.test6.Test6.Proto1.handlers.states.B.Proto1_B_19; +import test.test6.Test6.Proto1.handlers.states.B.Proto1_B_21; +import test.test6.Test6.Proto1.handlers.states.B.Proto1_B_22; +import test.test6.Test6.Proto1.handlers.states.B.Proto1_B_23; +import test.test6.Test6.Proto1.handlers.states.B.messages.Proto1_B_21_Message; +import test.test6.Test6.Proto1.handlers.states.B.messages.Proto1_B_21__2; + +public class MyB +{ + public static void main(String[] args) throws IOException + { + class MyHandler extends Proto1_B_19_Branch + { + @Override + public void receive(String[] data, test.test6.Test6.Proto1.roles.A peer, test.test6.Test6.Proto1.ops._1 op, Integer arg1) + { + System.out.println("(B) received 1: " + arg1 + ", " + (data[0] += "a")); + + } + } + + try (ScribServerSocket ss = new SocketChannelServer(8888)) + { + while (true) + { + Proto1 P1 = new Proto1(); + String[] data = new String[] { "" }; + try (Proto1_B b = new Proto1_B<>(P1, B, new ObjectStreamFormatter(), data)) + { + b.accept(ss, A); + + MyHandler h1 = new MyHandler(); + Function h2 = x -> new Proto1_B_21__2(A, x[0] += "a"); + + b.icallback(Proto1_B_19.id, h1); + b.icallback(Proto1_B_21.id, h2); + b.icallback(Proto1_B_22.id, h1); + b.icallback(Proto1_B_23.id, h2); + + Future f = b.run(); + f.get(); + + System.out.println("(B) end"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + } +} diff --git a/scribble-test/src/test/scrib/test/test6/Test6.scr b/scribble-test/src/test/scrib/test/test6/Test6.scr new file mode 100644 index 000000000..9c43eecbf --- /dev/null +++ b/scribble-test/src/test/scrib/test/test6/Test6.scr @@ -0,0 +1,15 @@ +//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test6/Test6.scr -d scribble-test/src/test/scrib/ -edapi Proto1 A -edapi Proto1 B +//$ javadoc -cp scribble-cli/target/classes/';'scribble-test/target/classes';'scribble-parser/target/classes';'scribble-parser/lib/antlr-3.5.2-complete.jar';'scrib-core/src/test/scrib scrib-core/src/test/scrib/test/test6/Proto1*.java -d test/doc/test6 + +module test.test6.Test6; + +type "java.lang.Integer" from "rt.jar" as Int; +type "java.lang.String" from "rt.jar" as Str; + +global protocol Proto1(role A, role B) +{ + 1(Int) from A to B; + 2(Str) from B to A; + 1(Int) from A to B; + 2(Str) from B to A; +} diff --git a/scribble-test/src/test/scrib/test/test7/MyA.java b/scribble-test/src/test/scrib/test/test7/MyA.java new file mode 100644 index 000000000..06476af02 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test7/MyA.java @@ -0,0 +1,45 @@ +package test.test7; + +import static test.test7.Test7.Proto1.Proto1.A; +import static test.test7.Test7.Proto1.Proto1.B; + +import java.io.IOException; +import java.util.concurrent.Future; +import java.util.function.Function; + +import org.scribble.runtime.net.ObjectStreamFormatter; +import org.scribble.runtime.net.session.SocketChannelEndpoint; + +import test.test7.Test7.Proto1.Proto1; +import test.test7.Test7.Proto1.handlers.A.Proto1_A; +import test.test7.Test7.Proto1.handlers.states.A.Proto1_A_6; +import test.test7.Test7.Proto1.handlers.states.A.Proto1_A_8; +import test.test7.Test7.Proto1.handlers.states.A.messages.Proto1_A_6_Message; +import test.test7.Test7.Proto1.handlers.states.A.messages.Proto1_A_6__2;; + +public class MyA +{ + public static void main(String[] args) throws IOException + { + Proto1 P1 = new Proto1(); + String[] data = new String[] { "" }; + try (Proto1_A a = new Proto1_A<>(P1, A, new ObjectStreamFormatter(), data)) + { + a.request(B, SocketChannelEndpoint::new, "localhost", 8888); + + Function h = x -> new Proto1_A_6__2(B, (x[0] += "a")); + + a.icallback(Proto1_A_6.id, h); + a.icallback(Proto1_A_8.id, h); + + Future f = a.run(); + f.get(); + + System.out.println("(A) end"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } +} diff --git a/scribble-test/src/test/scrib/test/test7/MyB.java b/scribble-test/src/test/scrib/test/test7/MyB.java new file mode 100644 index 000000000..d0fb89850 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test7/MyB.java @@ -0,0 +1,66 @@ +package test.test7; + +import static test.test7.Test7.Proto1.Proto1.A; +import static test.test7.Test7.Proto1.Proto1.B; + +import java.io.IOException; +import java.util.concurrent.Future; + +import org.scribble.runtime.net.ObjectStreamFormatter; +import org.scribble.runtime.net.scribsock.ScribServerSocket; +import org.scribble.runtime.net.scribsock.SocketChannelServer; + +import test.test7.Test7.Proto1.Proto1; +import test.test7.Test7.Proto1.handlers.B.Proto1_B; +import test.test7.Test7.Proto1.handlers.B.Proto1_B_13_Branch; +import test.test7.Test7.Proto1.handlers.states.B.Proto1_B_13; +import test.test7.Test7.Proto1.handlers.states.B.Proto1_B_15; +import test.test7.Test7.Proto1.ops._1; +import test.test7.Test7.Proto1.ops._2; +import test.test7.Test7.Proto1.roles.A; + +public class MyB +{ + public static void main(String[] args) throws IOException + { + class MyHandler extends Proto1_B_13_Branch + { + @Override + public void receive(int[] data, A peer, _1 op, Integer arg1) + { + System.out.println("(B) received 1: " + arg1 + ", " + data[0]++); + } + + @Override + public void receive(int[] data, A peer, _2 op, String arg1) + { + System.out.println("(B) received 1: " + arg1 + ", " + data[0]++); + } + } + + try (ScribServerSocket ss = new SocketChannelServer(8888)) + { + while (true) + { + Proto1 P1 = new Proto1(); + try (Proto1_B b = new Proto1_B<>(P1, B, new ObjectStreamFormatter(), new int[1])) + { + b.accept(ss, A); + + MyHandler h = new MyHandler(); + b.icallback(Proto1_B_13.id, h); + b.icallback(Proto1_B_15.id, h); + + Future f = b.run(); + f.get(); + + System.out.println("(B) end"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + } +} diff --git a/scribble-test/src/test/scrib/test/test7/Test7.scr b/scribble-test/src/test/scrib/test/test7/Test7.scr new file mode 100644 index 000000000..22b8d7cdc --- /dev/null +++ b/scribble-test/src/test/scrib/test/test7/Test7.scr @@ -0,0 +1,27 @@ +//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test7/Test7.scr -d scribble-test/src/test/scrib/ -edapi Proto1 A -edapi Proto1 B +//$ javadoc -cp scribble-cli/target/classes/';'scribble-test/target/classes';'scribble-parser/target/classes';'scribble-parser/lib/antlr-3.5.2-complete.jar';'scrib-core/src/test/scrib scrib-core/src/test/scrib/test/test7/Proto1*.java -d test/doc/test7 + +module test.test7.Test7; + +type "java.lang.Integer" from "rt.jar" as Int; +type "java.lang.String" from "rt.jar" as Str; + +global protocol Proto1(role A, role B) +{ + choice at A + { + 1(Int) from A to B; + } + or + { + 2(Str) from A to B; + } + choice at A + { + 1(Int) from A to B; + } + or + { + 2(Str) from A to B; + } +} From 0f44eee38d26545fbfa68663fab6a18895d38c5f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 8 Mar 2018 21:38:22 +0000 Subject: [PATCH 027/539] Minor refactoring to ED API gen. --- .../eventdriven/EDEndpointApiGenerator.java | 14 ++++++------- .../net/{state => handlers}/ScribBranch.java | 2 +- .../ScribOutputEvent.java} | 6 +++--- .../ScribSigMessage.java} | 4 ++-- .../states}/ScribEndState.java | 2 +- .../states}/ScribInputState.java | 2 +- .../states}/ScribOutputState.java | 2 +- .../states}/ScribState.java | 2 +- .../runtime/net/scribsock/ScribSocket.java | 1 + .../net/session/EventDrivenEndpoint.java | 20 +++++++++---------- .../src/test/scrib/test/test2/MyA.java | 2 +- .../src/test/scrib/test/test2/MyB.java | 2 +- .../src/test/scrib/test/test3/MyB.java | 6 +++--- .../src/test/scrib/test/test5/MyA.java | 6 +++--- .../src/test/scrib/test/test5/MyB.java | 3 ++- .../src/test/scrib/test/test5/MyC.java | 3 ++- .../src/test/scrib/test/test6/MyA.java | 8 ++++---- .../src/test/scrib/test/test6/MyB.java | 8 ++++---- .../src/test/scrib/test/test7/MyA.java | 4 ++-- .../src/test/scrib/test/test7/MyB.java | 4 ++-- 20 files changed, 52 insertions(+), 49 deletions(-) rename scribble-runtime/src/main/java/org/scribble/runtime/net/{state => handlers}/ScribBranch.java (80%) rename scribble-runtime/src/main/java/org/scribble/runtime/net/{state/ScribHandlerMessage.java => handlers/ScribOutputEvent.java} (74%) rename scribble-runtime/src/main/java/org/scribble/runtime/net/{state/ScribHandlerSig.java => handlers/ScribSigMessage.java} (50%) rename scribble-runtime/src/main/java/org/scribble/runtime/net/{state => handlers/states}/ScribEndState.java (83%) rename scribble-runtime/src/main/java/org/scribble/runtime/net/{state => handlers/states}/ScribInputState.java (86%) rename scribble-runtime/src/main/java/org/scribble/runtime/net/{state => handlers/states}/ScribOutputState.java (81%) rename scribble-runtime/src/main/java/org/scribble/runtime/net/{state => handlers/states}/ScribState.java (94%) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java index 1d1abe702..ec927af9e 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java @@ -134,10 +134,10 @@ public Map buildEndpointClass() throws ScribbleException String stateKind; switch (kind) { - case OUTPUT: stateKind = "org.scribble.runtime.net.state.ScribOutputState"; break; + case OUTPUT: stateKind = "org.scribble.runtime.net.handlers.states.ScribOutputState"; break; case UNARY_INPUT: - case POLY_INPUT: stateKind = "org.scribble.runtime.net.state.ScribInputState"; break; - case TERMINAL: stateKind = "org.scribble.runtime.net.state.ScribEndState"; break; + case POLY_INPUT: stateKind = "org.scribble.runtime.net.handlers.states.ScribInputState"; break; + case TERMINAL: stateKind = "org.scribble.runtime.net.handlers.states.ScribEndState"; break; case ACCEPT: case WRAP_SERVER: throw new RuntimeException("TODO"); @@ -174,8 +174,8 @@ public Map buildEndpointClass() throws ScribbleException { String mprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/states/" + this.self + "/messages/"; - // FIXME: generate lattice -- cf. original handler i/f's (with "subtyping") // FIXME: sort cases + // FIXME: generate lattice -- cf. original handler i/f's (with "subtyping") String messageIfName = name + //a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()); s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); @@ -190,7 +190,7 @@ public Map buildEndpointClass() throws ScribbleException String messageAbstract = ""; messageAbstract += "package " + pack + ".handlers.states." + this.self + ".messages;\n"; messageAbstract += "\n"; - messageAbstract += "public abstract class " + messageAbstractName + " extends org.scribble.runtime.net.state.ScribHandlerMessage implements " + pack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName + " {\n"; + messageAbstract += "public abstract class " + messageAbstractName + " extends org.scribble.runtime.net.handlers.ScribOutputEvent implements " + pack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName + " {\n"; messageAbstract += "private static final long serialVersionUID = 1L;\n"; messageAbstract += "\n"; messageAbstract += "public " + messageAbstractName + "(org.scribble.type.name.Role peer, org.scribble.type.name.Op op, Object... payload) {\n"; @@ -233,7 +233,7 @@ public Map buildEndpointClass() throws ScribbleException messageClass += "public class " + messageName + " extends " + messageAbstractName; //+ " implements " + pack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName; if (isSig) { - messageClass += " implements org.scribble.runtime.net.state.ScribHandlerSig"; + messageClass += " implements org.scribble.runtime.net.handlers.ScribSigMessage"; } messageClass += " {\n"; //messageClass += "public final java.util.List pay = new java.util.LinkedList<>();\n"; @@ -306,7 +306,7 @@ public Map buildEndpointClass() throws ScribbleException String branchAbstract = ""; branchAbstract += "package " + pack + ".handlers." + this.self + ";\n"; branchAbstract += ""; - branchAbstract += "public abstract class " + branchName + " implements org.scribble.runtime.net.state.ScribBranch"; + branchAbstract += "public abstract class " + branchName + " implements org.scribble.runtime.net.handlers.ScribBranch"; branchAbstract += s.getAllActions().stream().map(a -> ", " + pack + ".handlers." + this.self + ".interfaces." + name + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()) + "").collect(Collectors.joining("")); branchAbstract += " {\n"; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribBranch.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribBranch.java similarity index 80% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribBranch.java rename to scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribBranch.java index 481f58f74..a11190a7d 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribBranch.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribBranch.java @@ -1,4 +1,4 @@ -package org.scribble.runtime.net.state; +package org.scribble.runtime.net.handlers; import org.scribble.runtime.net.ScribMessage; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerMessage.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribOutputEvent.java similarity index 74% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerMessage.java rename to scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribOutputEvent.java index 287a54295..479e152f5 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerMessage.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribOutputEvent.java @@ -1,4 +1,4 @@ -package org.scribble.runtime.net.state; +package org.scribble.runtime.net.handlers; import org.scribble.runtime.net.ScribMessage; import org.scribble.type.name.Op; @@ -6,13 +6,13 @@ // FIXME: integrate with ScribMessage (maybe rename latter to ScribRuntimeMessage -- or rename this to ScribDirectedMessage) // FIXME: not serializable due to RoleKind (in Role) -public abstract class ScribHandlerMessage extends ScribMessage +public abstract class ScribOutputEvent extends ScribMessage { private static final long serialVersionUID = 1L; public final Role peer; - public ScribHandlerMessage(Role peer, Op op, Object... payload) + public ScribOutputEvent(Role peer, Op op, Object... payload) { super(op, payload); this.peer = peer; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerSig.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribSigMessage.java similarity index 50% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerSig.java rename to scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribSigMessage.java index 0f3823f59..3a4ee5af0 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribHandlerSig.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribSigMessage.java @@ -1,8 +1,8 @@ -package org.scribble.runtime.net.state; +package org.scribble.runtime.net.handlers; import org.scribble.runtime.net.ScribMessage; -public interface ScribHandlerSig +public interface ScribSigMessage { ScribMessage getSig(); } diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEndState.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribEndState.java similarity index 83% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEndState.java rename to scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribEndState.java index 09b55d186..22f2923cb 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribEndState.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribEndState.java @@ -1,4 +1,4 @@ -package org.scribble.runtime.net.state; +package org.scribble.runtime.net.handlers.states; abstract public class ScribEndState extends ScribState { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribInputState.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribInputState.java similarity index 86% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribInputState.java rename to scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribInputState.java index 1a00ee13b..9ee72aabe 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribInputState.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribInputState.java @@ -1,4 +1,4 @@ -package org.scribble.runtime.net.state; +package org.scribble.runtime.net.handlers.states; import org.scribble.type.name.Role; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribOutputState.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribOutputState.java similarity index 81% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribOutputState.java rename to scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribOutputState.java index 69c4240ee..15b7556c4 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribOutputState.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribOutputState.java @@ -1,4 +1,4 @@ -package org.scribble.runtime.net.state; +package org.scribble.runtime.net.handlers.states; abstract public class ScribOutputState extends ScribState { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribState.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribState.java similarity index 94% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribState.java rename to scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribState.java index f37e02000..e2b220186 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/state/ScribState.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribState.java @@ -1,4 +1,4 @@ -package org.scribble.runtime.net.state; +package org.scribble.runtime.net.handlers.states; import java.util.HashMap; import java.util.Map; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/ScribSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/ScribSocket.java index fcbbcead3..4ea36827b 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/ScribSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/ScribSocket.java @@ -17,6 +17,7 @@ import org.scribble.runtime.net.session.SessionEndpoint; import org.scribble.type.name.Role; +// FIXME: rename package (and class?) to statechans -- cf., handlers package public abstract class ScribSocket { protected SessionEndpoint se; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java index d0edae851..5aeb5e4c7 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java @@ -25,13 +25,13 @@ import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.net.ScribMessage; import org.scribble.runtime.net.ScribMessageFormatter; -import org.scribble.runtime.net.state.ScribBranch; -import org.scribble.runtime.net.state.ScribEndState; -import org.scribble.runtime.net.state.ScribHandlerMessage; -import org.scribble.runtime.net.state.ScribHandlerSig; -import org.scribble.runtime.net.state.ScribInputState; -import org.scribble.runtime.net.state.ScribOutputState; -import org.scribble.runtime.net.state.ScribState; +import org.scribble.runtime.net.handlers.ScribBranch; +import org.scribble.runtime.net.handlers.ScribOutputEvent; +import org.scribble.runtime.net.handlers.ScribSigMessage; +import org.scribble.runtime.net.handlers.states.ScribEndState; +import org.scribble.runtime.net.handlers.states.ScribInputState; +import org.scribble.runtime.net.handlers.states.ScribOutputState; +import org.scribble.runtime.net.handlers.states.ScribState; import org.scribble.type.name.Role; public class EventDrivenEndpoint extends MPSTEndpoint @@ -74,12 +74,12 @@ public void run() { if (curr instanceof ScribOutputState) { - ScribHandlerMessage m = (ScribHandlerMessage) this.edep.outputs.get(curr).apply(this.edep.data); // FIXME: state object + ScribOutputEvent m = (ScribOutputEvent) this.edep.outputs.get(curr).apply(this.edep.data); // FIXME: state object /*getChannelEndpoint(m.getPeer()).write(new ScribMessage(m.getOp(), m.getPayload().toArray(new Object[0]))); // FIXME: ScribEvent has extra Role curr = this.edep.states.get(((ScribOutputState) curr).succs.get(m.getOp()));*/ - if (m instanceof ScribHandlerSig) + if (m instanceof ScribSigMessage) { - getChannelEndpoint(m.peer).write(((ScribHandlerSig) m).getSig()); + getChannelEndpoint(m.peer).write(((ScribSigMessage) m).getSig()); } else { diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index 0cafb7712..eb84ea9b0 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -44,10 +44,10 @@ public static void foo3() throws IOException try (Proto1_A a = new Proto1_A<>(P1, A, new ObjectStreamFormatter(), null)) { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); + a.icallback(Proto1_A_5.id, x -> //new Proto1_A_5__1(B, 123)); new Proto1_A_5__2(B, "abc")); - // FIXME: make "structural" nominal types for messages using roles+labs+pays, instead of sids Future f = a.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java index e41aef117..835c77bc8 100644 --- a/scribble-test/src/test/scrib/test/test2/MyB.java +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -33,7 +33,6 @@ public static void main(String[] args) throws IOException public static void foo3() throws IOException { - // FIXME: make "structural" nominal types for branches using roles+labs+pays, instead of sids class MyHandler extends Proto1_B_10_Branch { @Override @@ -57,6 +56,7 @@ public void receive(Void data, A peer, _2 op, String arg1) try (Proto1_B b = new Proto1_B<>(P1, B, new ObjectStreamFormatter(), null)) { b.accept(ss, A); + b.icallback(Proto1_B_10.id, new MyHandler()); Future f = b.run(); diff --git a/scribble-test/src/test/scrib/test/test3/MyB.java b/scribble-test/src/test/scrib/test/test3/MyB.java index d900d9f96..f6ad20fee 100644 --- a/scribble-test/src/test/scrib/test/test3/MyB.java +++ b/scribble-test/src/test/scrib/test/test3/MyB.java @@ -55,9 +55,9 @@ public void receive(int[] data, A peer, _3 op, String x) b.accept(ss, A); b.request(C, SocketChannelEndpoint::new, "localhost", 9999); - b.icallback(Proto1_B_14.id, new MyHandler()); - b.icallback(Proto1_B_16.id, x -> new Proto1_B_16__2(C, 456)); - b.icallback(Proto1_B_17.id, x -> new Proto1_B_17__4(C, "def")); + b.icallback(Proto1_B_14.id, new MyHandler()) + .icallback(Proto1_B_16.id, x -> new Proto1_B_16__2(C, 456)) + .icallback(Proto1_B_17.id, x -> new Proto1_B_17__4(C, "def")); Future f = b.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test5/MyA.java b/scribble-test/src/test/scrib/test/test5/MyA.java index 65841e194..b7678080d 100644 --- a/scribble-test/src/test/scrib/test/test5/MyA.java +++ b/scribble-test/src/test/scrib/test/test5/MyA.java @@ -30,9 +30,9 @@ public static void main(String[] args) throws IOException a.request(B, SocketChannelEndpoint::new, "localhost", 8888); a.request(C, SocketChannelEndpoint::new, "localhost", 9999); - a.register(Proto1_A_8.id, x -> (x[0]++ < 3) ? new Proto1_A_8__1(B, 123) : new Proto1_A_8__3(B, "abc")); - a.register(Proto1_A_10.id, x -> new Proto1_A_10__2(C, 456)); - a.register(Proto1_A_11.id, x -> new Proto1_A_11__4(C, "def")); + a.icallback(Proto1_A_8.id, x -> (x[0]++ < 3) ? new Proto1_A_8__1(B, 123) : new Proto1_A_8__3(B, "abc")) + .icallback(Proto1_A_10.id, x -> new Proto1_A_10__2(C, 456)) + .icallback(Proto1_A_11.id, x -> new Proto1_A_11__4(C, "def")); Future f = a.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test5/MyB.java b/scribble-test/src/test/scrib/test/test5/MyB.java index 830f803ae..f24d2754e 100644 --- a/scribble-test/src/test/scrib/test/test5/MyB.java +++ b/scribble-test/src/test/scrib/test/test5/MyB.java @@ -47,7 +47,8 @@ public void receive(int[] data, A peer, _3 op, String x) try (Proto1_B b = new Proto1_B<>(P1, B, new ObjectStreamFormatter(), new int[1])) { b.accept(ss, A); - b.register(Proto1_B_16.id, new MyHandler()); + + b.icallback(Proto1_B_16.id, new MyHandler()); Future f = b.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test5/MyC.java b/scribble-test/src/test/scrib/test/test5/MyC.java index c5d451bc2..fb2f433af 100644 --- a/scribble-test/src/test/scrib/test/test5/MyC.java +++ b/scribble-test/src/test/scrib/test/test5/MyC.java @@ -45,7 +45,8 @@ public void receive(Void data, A peer, _4 op, String x) try (Proto1_C b = new Proto1_C<>(P1, C, new ObjectStreamFormatter(), null)) { b.accept(ss, A); - b.register(Proto1_C_22.id, new MyHandler()); + + b.icallback(Proto1_C_22.id, new MyHandler()); Future f = b.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test6/MyA.java b/scribble-test/src/test/scrib/test/test6/MyA.java index 41e5eb65f..8002322b2 100644 --- a/scribble-test/src/test/scrib/test/test6/MyA.java +++ b/scribble-test/src/test/scrib/test/test6/MyA.java @@ -43,10 +43,10 @@ public void receive(int[] data, B peer, _2 op, String arg1) Function h1 = x -> new Proto1_A_8__1(B, x[0]++); MyHandler h2 = new MyHandler(); - a.icallback(Proto1_A_8.id, h1); - a.icallback(Proto1_A_10.id, h2); - a.icallback(Proto1_A_11.id, h1); - a.icallback(Proto1_A_12.id, h2); + a.icallback(Proto1_A_8.id, h1) + .icallback(Proto1_A_10.id, h2) + .icallback(Proto1_A_11.id, h1) + .icallback(Proto1_A_12.id, h2); Future f = a.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test6/MyB.java b/scribble-test/src/test/scrib/test/test6/MyB.java index 4a37e4712..edaee6593 100644 --- a/scribble-test/src/test/scrib/test/test6/MyB.java +++ b/scribble-test/src/test/scrib/test/test6/MyB.java @@ -48,10 +48,10 @@ public void receive(String[] data, test.test6.Test6.Proto1.roles.A peer, test.te MyHandler h1 = new MyHandler(); Function h2 = x -> new Proto1_B_21__2(A, x[0] += "a"); - b.icallback(Proto1_B_19.id, h1); - b.icallback(Proto1_B_21.id, h2); - b.icallback(Proto1_B_22.id, h1); - b.icallback(Proto1_B_23.id, h2); + b.icallback(Proto1_B_19.id, h1) + .icallback(Proto1_B_21.id, h2) + .icallback(Proto1_B_22.id, h1) + .icallback(Proto1_B_23.id, h2); Future f = b.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test7/MyA.java b/scribble-test/src/test/scrib/test/test7/MyA.java index 06476af02..ddef82eb0 100644 --- a/scribble-test/src/test/scrib/test/test7/MyA.java +++ b/scribble-test/src/test/scrib/test/test7/MyA.java @@ -29,8 +29,8 @@ public static void main(String[] args) throws IOException Function h = x -> new Proto1_A_6__2(B, (x[0] += "a")); - a.icallback(Proto1_A_6.id, h); - a.icallback(Proto1_A_8.id, h); + a.icallback(Proto1_A_6.id, h) + .icallback(Proto1_A_8.id, h); Future f = a.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test7/MyB.java b/scribble-test/src/test/scrib/test/test7/MyB.java index d0fb89850..fb6e097ad 100644 --- a/scribble-test/src/test/scrib/test/test7/MyB.java +++ b/scribble-test/src/test/scrib/test/test7/MyB.java @@ -48,8 +48,8 @@ public void receive(int[] data, A peer, _2 op, String arg1) b.accept(ss, A); MyHandler h = new MyHandler(); - b.icallback(Proto1_B_13.id, h); - b.icallback(Proto1_B_15.id, h); + b.icallback(Proto1_B_13.id, h) + .icallback(Proto1_B_15.id, h); Future f = b.run(); f.get(); From 026fb1ae067857740827247cd421ff26dca63dff Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 8 Mar 2018 22:07:09 +0000 Subject: [PATCH 028/539] Fixed ScribBranch generic cast in EventDrivenEndpoint. --- .../codegen/eventdriven/EDEndpointApiGenerator.java | 3 ++- .../java/org/scribble/type/SessionTypeFactory.java | 2 +- .../runtime/net/session/EventDrivenEndpoint.java | 10 ++++------ 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java index ec927af9e..45e3a28d2 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java @@ -511,7 +511,8 @@ private String generateRegister(GProtocolName gpn, Role self, EState s) res += "}\n"; res += "\n"; String T = s.getAllActions().stream().map(a -> SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + ".interfaces." + name + "__" + a.peer + "_" - + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining("")) + "").collect(Collectors.joining(" & ")); + + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining("")) + "").collect(Collectors.joining(" & ")) + + " & org.scribble.runtime.net.handlers.ScribBranch"; // FIXME: EventDrivenEndpoint will cast to Branch for dispatch -- not guaranteed by implementation of receive i/f's res += "public " + "\n" + name + " icallback(" + prefix + name + "_" + s.id diff --git a/scribble-core/src/main/java/org/scribble/type/SessionTypeFactory.java b/scribble-core/src/main/java/org/scribble/type/SessionTypeFactory.java index 0cc38a63b..4492496c2 100644 --- a/scribble-core/src/main/java/org/scribble/type/SessionTypeFactory.java +++ b/scribble-core/src/main/java/org/scribble/type/SessionTypeFactory.java @@ -19,7 +19,6 @@ import org.scribble.type.name.ModuleName; import org.scribble.type.name.PackageName; -@Deprecated public class SessionTypeFactory { public SessionTypeFactory() @@ -33,6 +32,7 @@ public SessionTypeFactory() return new ModuleName(elems); }*/ + // Currently used by generated Session API // From fullname public static GProtocolName parseGlobalProtocolName(String name) { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java index 5aeb5e4c7..ee667186e 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java @@ -37,10 +37,8 @@ public class EventDrivenEndpoint extends MPSTEndpoint { protected final ScribState init; - //protected final Map> outputs = new HashMap<>(); protected final Map> outputs = new HashMap<>(); - //protected final Map> inputs = new HashMap<>(); - protected final Map inputs = new HashMap<>(); + protected final Map> inputs = new HashMap<>(); protected final D data; @@ -57,6 +55,7 @@ public Future run() throws ScribbleRuntimeException { Object[] res = new Object[1]; + // FIXME: integrate with selector new Thread() { private final EventDrivenEndpoint edep; @@ -83,7 +82,7 @@ public void run() } else { - getChannelEndpoint(m.peer).write(new ScribMessage(m.op, m.payload)); + getChannelEndpoint(m.peer).write(new ScribMessage(m.op, m.payload)); // FIXME: ScribEvent has extra Role (RoleKind not serializable) } curr = this.edep.states.get(((ScribOutputState) curr).succs.get(m.op)); } @@ -92,8 +91,7 @@ else if (curr instanceof ScribInputState) try // cf. ReceiveSocket#readScribMessage { ScribMessage m = getChannelEndpoint(((ScribInputState) curr).peer).getFuture().get(); - // FIXME: generic cast - ((ScribBranch) this.edep.inputs.get(curr)).dispatch(this.edep.data, m); // FIXME: state object and received payloads -- null op OK? + this.edep.inputs.get(curr).dispatch(this.edep.data, m); curr = this.edep.states.get(((ScribInputState) curr).succs.get(m.op)); } catch (InterruptedException e) From 772700144841a55fe3cd3ae3b20c2976672f72da Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 8 Mar 2018 22:12:22 +0000 Subject: [PATCH 029/539] Minor. --- scribble-test/src/test/scrib/test/test2/MyA.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index eb84ea9b0..527d7633c 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -5,7 +5,6 @@ import static test.test2.Test2.Proto1.Proto1._1; import java.io.IOException; -import java.util.List; import java.util.concurrent.Future; import org.scribble.runtime.net.ObjectStreamFormatter; @@ -26,18 +25,6 @@ public static void main(String[] args) throws IOException foo3(); } - interface I1 { } - interface I2 { } - void foo (T x) - { - - } - - void bar(List l) - { - - } - public static void foo3() throws IOException { Proto1 P1 = new Proto1(); @@ -49,7 +36,7 @@ public static void foo3() throws IOException //new Proto1_A_5__1(B, 123)); new Proto1_A_5__2(B, "abc")); - Future f = a.run(); + Future f = a.run(); // Even if registration checks still dynamic, much better to check at "session init" than partway through session after potential side effects f.get(); System.out.println("(A) end"); From 339d8cb07ec015de2611f94660810db31c519219 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 8 Mar 2018 22:16:29 +0000 Subject: [PATCH 030/539] Minor. --- .gitignore | 8 ++++++++ .../src/main/java/org/scribble/cli/CommandLine.java | 2 +- .../codegen/eventdriven/EDEndpointApiGenerator.java | 10 +++++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index c6aa4d053..182296daf 100644 --- a/.gitignore +++ b/.gitignore @@ -54,6 +54,14 @@ scribble-core/src/test/scrib/test/test7/ scribble-core/src/test/scrib/test/test8/ scribble-core/src/test/scrib/test/test9/ +scribble-test/src/test/scrib/test/test2/Test2/ +scribble-test/src/test/scrib/test/test3/Test3/ +scribble-test/src/test/scrib/test/test4/Test4/ +scribble-test/src/test/scrib/test/test5/Test5/ +scribble-test/src/test/scrib/test/test6/Test6/ +scribble-test/src/test/scrib/test/test7/Test7/ + + bin/scribblec.sh permissions-fix.sh diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 6bc98a1fa..10dbe78c3 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -442,7 +442,7 @@ private void outputEventDrivenApi(Job job) throws ScribbleException, CommandLine { GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); Role self = checkRoleArg(jcontext, fullname, args[i+1]); - EDEndpointApiGenerator edgen = new EDEndpointApiGenerator(job, fullname, self); + EDEndpointApiGenerator edgen = new EDEndpointApiGenerator(job, fullname, self, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); Map out = edgen.build(); outputClasses(out); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java index 45e3a28d2..279629db2 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java @@ -30,12 +30,20 @@ public class EDEndpointApiGenerator public final Job job; public final GProtocolName proto; public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral + + private final boolean subtypes; - public EDEndpointApiGenerator(Job job, GProtocolName fullname, Role self) + public EDEndpointApiGenerator(Job job, GProtocolName fullname, Role self, boolean subtypes) { this.job = job; this.proto = fullname; this.self = self; + + this.subtypes = subtypes; + if (this.subtypes) + { + throw new RuntimeException("TODO: -subtypes"); + } } // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later From df9b3539c29fe3bb71b000772959fc76c6c8685a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 8 Mar 2018 22:16:58 +0000 Subject: [PATCH 031/539] Minor. --- .../main/java/org/scribble/util/function/Function2.java | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 scribble-core/src/main/java/org/scribble/util/function/Function2.java diff --git a/scribble-core/src/main/java/org/scribble/util/function/Function2.java b/scribble-core/src/main/java/org/scribble/util/function/Function2.java deleted file mode 100644 index 159559699..000000000 --- a/scribble-core/src/main/java/org/scribble/util/function/Function2.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.scribble.util.function; - -@FunctionalInterface -public interface Function2 -{ - public R apply (A a, B b); -} \ No newline at end of file From 839c5ec621f4b5f7f99de0850eee815fd6d36fb7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 8 Mar 2018 22:48:49 +0000 Subject: [PATCH 032/539] codegen and runtime module package refactoring. --- .../java/org/scribble/cli/CommandLine.java | 2 +- .../eventdriven/EDApiGenConstants.java | 6 ---- .../java/{endpointapi => }/ApiGen.java | 6 ++-- .../codegen/java/JEndpointApiGenerator.java | 6 ++-- .../EDEndpointApiGenerator.java | 35 ++++++++++--------- .../eventdrivenapi}/EDSessionApiBuilder.java | 5 +-- .../SessionApiGenerator.java | 5 +-- .../AcceptSockGen.java | 3 +- .../AuxStateChanTypeGen.java | 2 +- .../BranchSockGen.java | 11 +++--- .../CaseSockGen.java | 7 ++-- .../EndSockGen.java | 2 +- .../HandlerIfaceGen.java | 3 +- .../InputFutureGen.java | 5 +-- .../OutputSockGen.java | 3 +- .../ReceiveSockGen.java | 3 +- .../ScribSockGen.java | 32 +++++++++-------- .../StateChanTypeGen.java | 2 +- .../StateChannelApiGenerator.java | 6 ++-- .../ioifaces/ActionIfaceGen.java | 10 +++--- .../ioifaces/BranchIfaceGen.java | 8 ++--- .../ioifaces/CaseIfaceGen.java | 10 +++--- .../ioifaces/HandleIfaceGen.java | 8 ++--- .../ioifaces/IOIfaceGen.java | 6 ++-- .../ioifaces/IOInterfacesGenerator.java | 14 ++++---- .../ioifaces/IOStateIfaceGen.java | 6 ++-- .../ioifaces/ReceiveIfaceGen.java | 12 +++---- .../ioifaces/SelectIfaceGen.java | 4 +-- .../ioifaces/SuccessorIfaceGen.java | 4 +-- .../scrib/smtp/src/smtp/SimpleSmtpC.java | 10 +++--- scribble-demos/scrib/smtp/src/smtp/SmtpC.java | 8 ++--- .../smtp/src/smtp/message/SmtpMessage.java | 2 +- .../smtp/message/SmtpMessageFormatter.java | 4 +-- .../runtime/handlers/ScribBranch.java | 9 +++++ .../{net => }/handlers/ScribOutputEvent.java | 4 +-- .../runtime/handlers/ScribSigMessage.java | 8 +++++ .../handlers/states/ScribEndState.java | 2 +- .../handlers/states/ScribInputState.java | 2 +- .../handlers/states/ScribOutputState.java | 2 +- .../{net => }/handlers/states/ScribState.java | 2 +- .../ObjectStreamFormatter.java | 2 +- .../{net => message}/ScribInterrupt.java | 2 +- .../{net => message}/ScribMessage.java | 2 +- .../ScribMessageFormatter.java | 2 +- .../{session => }/BinaryChannelEndpoint.java | 9 ++--- .../{session => }/BinaryChannelWrapper.java | 4 ++- .../SSLSocketChannelServer.java | 5 ++- .../SSLSocketChannelWrapper.java | 2 +- .../{scribsock => }/ScribServerSocket.java | 5 ++- .../{session => }/SocketChannelEndpoint.java | 4 ++- .../{scribsock => }/SocketChannelServer.java | 5 ++- .../net/{session => }/SocketEndpoint.java | 5 +-- .../net/{session => }/SocketWrapper.java | 2 +- .../runtime/net/handlers/ScribBranch.java | 9 ----- .../runtime/net/handlers/ScribSigMessage.java | 8 ----- .../session/EndpointInputQueues.java | 6 ++-- .../session/EventDrivenEndpoint.java | 20 +++++------ .../{net => }/session/ExplicitEndpoint.java | 4 +-- .../{net => }/session/MPSTEndpoint.java | 7 ++-- .../runtime/{net => }/session/OpEnum.java | 2 +- .../runtime/{net => }/session/Principal.java | 2 +- .../{net => }/session/ScribInputSelector.java | 3 +- .../runtime/{net => }/session/Session.java | 2 +- .../{net => }/session/SessionEndpoint.java | 10 +++--- .../AcceptSocket.java | 9 ++--- .../AffineSocket.java | 6 ++-- .../BranchSocket.java | 6 ++-- .../scribsock => statechans}/CaseSocket.java | 6 ++-- .../ConnectSocket.java | 8 ++--- .../scribsock => statechans}/EndSocket.java | 6 ++-- .../scribsock => statechans}/InitSocket.java | 9 ++--- .../LinearSocket.java | 8 ++--- .../OutputSocket.java | 12 +++---- .../ReceiveSocket.java | 8 ++--- .../scribsock => statechans}/ScribSocket.java | 6 ++-- .../scribble/runtime/{net => util}/Buf.java | 2 +- .../runtime/{net => util}/ScribFuture.java | 4 ++- .../src/test/scrib/test/test2/MyA.java | 6 ++-- .../src/test/scrib/test/test2/MyB.java | 8 ++--- .../src/test/scrib/test/test3/MyA.java | 4 +-- .../src/test/scrib/test/test3/MyB.java | 8 ++--- .../src/test/scrib/test/test3/MyC.java | 6 ++-- .../src/test/scrib/test/test4/MyA.java | 2 +- .../src/test/scrib/test/test4/MyB.java | 4 +-- .../scrib/test/test4/sig/Test4Formatter.java | 4 +-- .../scrib/test/test4/sig/Test4Message.java | 2 +- .../src/test/scrib/test/test5/MyA.java | 4 +-- .../src/test/scrib/test/test5/MyB.java | 6 ++-- .../src/test/scrib/test/test5/MyC.java | 6 ++-- .../src/test/scrib/test/test6/MyA.java | 4 +-- .../src/test/scrib/test/test6/MyB.java | 6 ++-- .../src/test/scrib/test/test7/MyA.java | 4 +-- .../src/test/scrib/test/test7/MyB.java | 6 ++-- 93 files changed, 295 insertions(+), 276 deletions(-) delete mode 100644 scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDApiGenConstants.java rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => }/ApiGen.java (90%) rename scribble-codegen/src/main/java/org/scribble/codegen/{eventdriven => java/eventdrivenapi}/EDEndpointApiGenerator.java (94%) rename scribble-codegen/src/main/java/org/scribble/codegen/{eventdriven => java/eventdrivenapi}/EDSessionApiBuilder.java (68%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => sessionapi}/SessionApiGenerator.java (99%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/AcceptSockGen.java (95%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/AuxStateChanTypeGen.java (95%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/BranchSockGen.java (97%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/CaseSockGen.java (97%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/EndSockGen.java (95%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/HandlerIfaceGen.java (97%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/InputFutureGen.java (97%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/OutputSockGen.java (98%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/ReceiveSockGen.java (98%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/ScribSockGen.java (95%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/StateChanTypeGen.java (95%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/StateChannelApiGenerator.java (97%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/ioifaces/ActionIfaceGen.java (93%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/ioifaces/BranchIfaceGen.java (94%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/ioifaces/CaseIfaceGen.java (91%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/ioifaces/HandleIfaceGen.java (96%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/ioifaces/IOIfaceGen.java (81%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/ioifaces/IOInterfacesGenerator.java (98%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/ioifaces/IOStateIfaceGen.java (96%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/ioifaces/ReceiveIfaceGen.java (85%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/ioifaces/SelectIfaceGen.java (91%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{endpointapi => statechanapi}/ioifaces/SuccessorIfaceGen.java (92%) create mode 100644 scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribBranch.java rename scribble-runtime/src/main/java/org/scribble/runtime/{net => }/handlers/ScribOutputEvent.java (86%) create mode 100644 scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribSigMessage.java rename scribble-runtime/src/main/java/org/scribble/runtime/{net => }/handlers/states/ScribEndState.java (83%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net => }/handlers/states/ScribInputState.java (86%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net => }/handlers/states/ScribOutputState.java (81%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net => }/handlers/states/ScribState.java (94%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net => message}/ObjectStreamFormatter.java (98%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net => message}/ScribInterrupt.java (96%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net => message}/ScribMessage.java (98%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net => message}/ScribMessageFormatter.java (97%) rename scribble-runtime/src/main/java/org/scribble/runtime/net/{session => }/BinaryChannelEndpoint.java (96%) rename scribble-runtime/src/main/java/org/scribble/runtime/net/{session => }/BinaryChannelWrapper.java (96%) rename scribble-runtime/src/main/java/org/scribble/runtime/net/{scribsock => }/SSLSocketChannelServer.java (89%) rename scribble-runtime/src/main/java/org/scribble/runtime/net/{session => }/SSLSocketChannelWrapper.java (99%) rename scribble-runtime/src/main/java/org/scribble/runtime/net/{scribsock => }/ScribServerSocket.java (89%) rename scribble-runtime/src/main/java/org/scribble/runtime/net/{session => }/SocketChannelEndpoint.java (96%) rename scribble-runtime/src/main/java/org/scribble/runtime/net/{scribsock => }/SocketChannelServer.java (89%) rename scribble-runtime/src/main/java/org/scribble/runtime/net/{session => }/SocketEndpoint.java (95%) rename scribble-runtime/src/main/java/org/scribble/runtime/net/{session => }/SocketWrapper.java (97%) delete mode 100644 scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribBranch.java delete mode 100644 scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribSigMessage.java rename scribble-runtime/src/main/java/org/scribble/runtime/{net => }/session/EndpointInputQueues.java (96%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net => }/session/EventDrivenEndpoint.java (89%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net => }/session/ExplicitEndpoint.java (92%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net => }/session/MPSTEndpoint.java (94%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net => }/session/OpEnum.java (93%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net => }/session/Principal.java (97%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net => }/session/ScribInputSelector.java (97%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net => }/session/Session.java (99%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net => }/session/SessionEndpoint.java (97%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net/scribsock => statechans}/AcceptSocket.java (84%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net/scribsock => statechans}/AffineSocket.java (86%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net/scribsock => statechans}/BranchSocket.java (85%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net/scribsock => statechans}/CaseSocket.java (86%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net/scribsock => statechans}/ConnectSocket.java (87%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net/scribsock => statechans}/EndSocket.java (90%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net/scribsock => statechans}/InitSocket.java (91%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net/scribsock => statechans}/LinearSocket.java (94%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net/scribsock => statechans}/OutputSocket.java (90%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net/scribsock => statechans}/ReceiveSocket.java (91%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net/scribsock => statechans}/ScribSocket.java (85%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net => util}/Buf.java (95%) rename scribble-runtime/src/main/java/org/scribble/runtime/{net => util}/ScribFuture.java (96%) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 10dbe78c3..c9cd67c60 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -26,8 +26,8 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.codegen.eventdriven.EDEndpointApiGenerator; import org.scribble.codegen.java.JEndpointApiGenerator; +import org.scribble.codegen.java.eventdrivenapi.EDEndpointApiGenerator; import org.scribble.main.AntlrSourceException; import org.scribble.main.Job; import org.scribble.main.JobContext; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDApiGenConstants.java b/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDApiGenConstants.java deleted file mode 100644 index 73bcb5959..000000000 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDApiGenConstants.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.scribble.codegen.eventdriven; - -public class EDApiGenConstants -{ - -} diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ApiGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java similarity index 90% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ApiGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java index 206dc38e5..67393313b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ApiGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi; +package org.scribble.codegen.java; import java.util.Map; @@ -21,8 +21,8 @@ // Basic pattern: use TypeGenerators to create all necessary TypeBuilders and cache them, and generateApi should call build on all as a final step public abstract class ApiGen { - protected final Job job; - protected final GProtocolName gpn; // full name + public final Job job; + public final GProtocolName gpn; // full name public ApiGen(Job job, GProtocolName fullname) { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java index 6e5a4eed1..83f014e27 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java @@ -16,9 +16,9 @@ import java.util.HashMap; import java.util.Map; -import org.scribble.codegen.java.endpointapi.SessionApiGenerator; -import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator; -import org.scribble.codegen.java.endpointapi.ioifaces.IOInterfacesGenerator; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; +import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; +import org.scribble.codegen.java.statechanapi.ioifaces.IOInterfacesGenerator; import org.scribble.main.Job; import org.scribble.main.RuntimeScribbleException; import org.scribble.main.ScribbleException; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/eventdrivenapi/EDEndpointApiGenerator.java similarity index 94% rename from scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/eventdrivenapi/EDEndpointApiGenerator.java index 279629db2..158b6f81f 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/eventdrivenapi/EDEndpointApiGenerator.java @@ -1,4 +1,4 @@ -package org.scribble.codegen.eventdriven; +package org.scribble.codegen.java.eventdrivenapi; import java.util.HashMap; import java.util.HashSet; @@ -11,7 +11,7 @@ import org.scribble.ast.DataTypeDecl; import org.scribble.ast.MessageSigNameDecl; -import org.scribble.codegen.java.endpointapi.SessionApiGenerator; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.main.Job; import org.scribble.main.JobContext; import org.scribble.main.ScribbleException; @@ -24,6 +24,7 @@ import org.scribble.type.name.PayloadElemType; import org.scribble.type.name.Role; +// FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) // From ParamCoreEndpointApiGenerator public class EDEndpointApiGenerator { @@ -54,7 +55,7 @@ public Map build() throws ScribbleException return res; } - public Map buildSessionApi() throws ScribbleException // FIXME: factor out + public Map buildSessionApi() throws ScribbleException // FIXME: factor out -- integrate with JEndpointApiGenerator { this.job.debugPrintln("\n[param-core] Running " + EDEndpointApiGenerator.class + " for " + this.proto + "@" + this.self); @@ -85,13 +86,13 @@ public Map buildEndpointClass() throws ScribbleException epClass += "import java.util.HashMap;\n"; epClass += "import java.util.Map;\n";*/ epClass += "\n"; - epClass += "public class " + name + " extends org.scribble.runtime.net.session.EventDrivenEndpoint<" + sess + ", " + role + ", D> {\n"; + epClass += "public class " + name + " extends org.scribble.runtime.session.EventDrivenEndpoint<" + sess + ", " + role + ", D> {\n"; - /*epClass += "private final Map> outputs = new HashMap<>();\n"; + /*epClass += "private final Map> outputs = new HashMap<>();\n"; epClass += "\n";*/ epClass += "public " + name + "(" + sess + " sess, " + role - + " self, org.scribble.runtime.net.ScribMessageFormatter smf, D data) throws java.io.IOException, org.scribble.main.ScribbleRuntimeException {\n"; + + " self, org.scribble.runtime.message.ScribMessageFormatter smf, D data) throws java.io.IOException, org.scribble.main.ScribbleRuntimeException {\n"; epClass += "super(sess, self, smf, " + pack + ".handlers.states." + this.self + "." + name + "_" + init.id + ".id" + ", data);\n"; // FIXME: factor out for (EState s : states) { @@ -105,11 +106,11 @@ public Map buildEndpointClass() throws ScribbleException epClass += "\n";*/ epClass += states.stream().map(s -> generateRegister(this.proto, this.self, s)).collect(Collectors.joining("\n")); - /*epClass += "public void register(State s, Function h) {\n"; + /*epClass += "public void register(State s, Function h) {\n"; epClass += "this.outputs.put(s, h)"; epClass += "}\n"; epClass += "\n"; - epClass += "public void register(State s, Function h) {\n"; + epClass += "public void register(State s, Function h) {\n"; epClass += "this.outputs.put(s, h)"; epClass += "}\n";*/ @@ -142,10 +143,10 @@ public Map buildEndpointClass() throws ScribbleException String stateKind; switch (kind) { - case OUTPUT: stateKind = "org.scribble.runtime.net.handlers.states.ScribOutputState"; break; + case OUTPUT: stateKind = "org.scribble.runtime.handlers.states.ScribOutputState"; break; case UNARY_INPUT: - case POLY_INPUT: stateKind = "org.scribble.runtime.net.handlers.states.ScribInputState"; break; - case TERMINAL: stateKind = "org.scribble.runtime.net.handlers.states.ScribEndState"; break; + case POLY_INPUT: stateKind = "org.scribble.runtime.handlers.states.ScribInputState"; break; + case TERMINAL: stateKind = "org.scribble.runtime.handlers.states.ScribEndState"; break; case ACCEPT: case WRAP_SERVER: throw new RuntimeException("TODO"); @@ -198,7 +199,7 @@ public Map buildEndpointClass() throws ScribbleException String messageAbstract = ""; messageAbstract += "package " + pack + ".handlers.states." + this.self + ".messages;\n"; messageAbstract += "\n"; - messageAbstract += "public abstract class " + messageAbstractName + " extends org.scribble.runtime.net.handlers.ScribOutputEvent implements " + pack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName + " {\n"; + messageAbstract += "public abstract class " + messageAbstractName + " extends org.scribble.runtime.handlers.ScribOutputEvent implements " + pack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName + " {\n"; messageAbstract += "private static final long serialVersionUID = 1L;\n"; messageAbstract += "\n"; messageAbstract += "public " + messageAbstractName + "(org.scribble.type.name.Role peer, org.scribble.type.name.Op op, Object... payload) {\n"; @@ -241,7 +242,7 @@ public Map buildEndpointClass() throws ScribbleException messageClass += "public class " + messageName + " extends " + messageAbstractName; //+ " implements " + pack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName; if (isSig) { - messageClass += " implements org.scribble.runtime.net.handlers.ScribSigMessage"; + messageClass += " implements org.scribble.runtime.handlers.ScribSigMessage"; } messageClass += " {\n"; //messageClass += "public final java.util.List pay = new java.util.LinkedList<>();\n"; @@ -297,7 +298,7 @@ public Map buildEndpointClass() throws ScribbleException { messageClass += "\n"; messageClass += "@Override\n"; - messageClass += "public org.scribble.runtime.net.ScribMessage getSig() {\n"; + messageClass += "public org.scribble.runtime.message.ScribMessage getSig() {\n"; messageClass += "return this.m;\n"; messageClass += "}\n"; } @@ -314,7 +315,7 @@ public Map buildEndpointClass() throws ScribbleException String branchAbstract = ""; branchAbstract += "package " + pack + ".handlers." + this.self + ";\n"; branchAbstract += ""; - branchAbstract += "public abstract class " + branchName + " implements org.scribble.runtime.net.handlers.ScribBranch"; + branchAbstract += "public abstract class " + branchName + " implements org.scribble.runtime.handlers.ScribBranch"; branchAbstract += s.getAllActions().stream().map(a -> ", " + pack + ".handlers." + this.self + ".interfaces." + name + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()) + "").collect(Collectors.joining("")); branchAbstract += " {\n"; @@ -350,7 +351,7 @@ public Map buildEndpointClass() throws ScribbleException branchAbstract += "\n"; branchAbstract += "@Override\n"; - branchAbstract += "public void dispatch(D data, org.scribble.runtime.net.ScribMessage m) {\n"; + branchAbstract += "public void dispatch(D data, org.scribble.runtime.message.ScribMessage m) {\n"; branchAbstract += "switch (m.op.toString()) {\n"; for (EAction a : s.getAllActions()) { @@ -520,7 +521,7 @@ private String generateRegister(GProtocolName gpn, Role self, EState s) res += "\n"; String T = s.getAllActions().stream().map(a -> SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + ".interfaces." + name + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining("")) + "").collect(Collectors.joining(" & ")) - + " & org.scribble.runtime.net.handlers.ScribBranch"; + + " & org.scribble.runtime.handlers.ScribBranch"; // FIXME: EventDrivenEndpoint will cast to Branch for dispatch -- not guaranteed by implementation of receive i/f's res += "public " + "\n" + name + " icallback(" + prefix + name + "_" + s.id diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDSessionApiBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/eventdrivenapi/EDSessionApiBuilder.java similarity index 68% rename from scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDSessionApiBuilder.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/eventdrivenapi/EDSessionApiBuilder.java index d31355dd5..fb6b937a8 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/eventdriven/EDSessionApiBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/eventdrivenapi/EDSessionApiBuilder.java @@ -1,10 +1,11 @@ -package org.scribble.codegen.eventdriven; +package org.scribble.codegen.java.eventdrivenapi; -import org.scribble.codegen.java.endpointapi.SessionApiGenerator; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.main.Job; import org.scribble.main.ScribbleException; import org.scribble.type.name.GProtocolName; +// FIXME: deprecate -- same as SessionApiGenerator, just use that directly public class EDSessionApiBuilder extends SessionApiGenerator { public EDSessionApiBuilder(Job job, GProtocolName fullname) throws ScribbleException diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java similarity index 99% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/SessionApiGenerator.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index 1bc58cde9..555f2afe6 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi; +package org.scribble.codegen.java.sessionapi; import java.util.HashMap; import java.util.HashSet; @@ -22,6 +22,7 @@ import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; import org.scribble.codegen.java.util.JavaBuilder; +import org.scribble.codegen.java.ApiGen; import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.ConstructorBuilder; import org.scribble.codegen.java.util.FieldBuilder; @@ -39,7 +40,7 @@ public class SessionApiGenerator extends ApiGen public static final String GPROTOCOLNAME_CLASS = "org.scribble.type.name.GProtocolName"; public static final String OP_CLASS = "org.scribble.type.name.Op"; public static final String ROLE_CLASS = "org.scribble.type.name.Role"; - public static final String SESSION_CLASS = "org.scribble.runtime.net.session.Session"; + public static final String SESSION_CLASS = "org.scribble.runtime.session.Session"; public static final String SESSIONTYPEFACTORY_CLASS = "org.scribble.type.SessionTypeFactory"; private static final String IMPATH_FIELD = "IMPATH"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/AcceptSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AcceptSockGen.java similarity index 95% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/AcceptSockGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AcceptSockGen.java index dba2bde69..e4c38dce7 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/AcceptSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AcceptSockGen.java @@ -11,10 +11,11 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi; +package org.scribble.codegen.java.statechanapi; import java.util.List; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.model.endpoint.EState; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/AuxStateChanTypeGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AuxStateChanTypeGen.java similarity index 95% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/AuxStateChanTypeGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AuxStateChanTypeGen.java index db62e11cd..8cad5b6d5 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/AuxStateChanTypeGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AuxStateChanTypeGen.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi; +package org.scribble.codegen.java.statechanapi; import org.scribble.codegen.java.util.TypeBuilder; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/BranchSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java similarity index 97% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/BranchSockGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java index c10e803ed..9ee570d3e 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/BranchSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java @@ -11,17 +11,18 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi; +package org.scribble.codegen.java.statechanapi; import java.util.stream.Collectors; import org.scribble.ast.DataTypeDecl; import org.scribble.ast.MessageSigNameDecl; import org.scribble.ast.Module; -import org.scribble.codegen.java.endpointapi.ioifaces.BranchIfaceGen; -import org.scribble.codegen.java.endpointapi.ioifaces.HandleIfaceGen; -import org.scribble.codegen.java.endpointapi.ioifaces.IOStateIfaceGen; -import org.scribble.codegen.java.endpointapi.ioifaces.SuccessorIfaceGen; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; +import org.scribble.codegen.java.statechanapi.ioifaces.BranchIfaceGen; +import org.scribble.codegen.java.statechanapi.ioifaces.HandleIfaceGen; +import org.scribble.codegen.java.statechanapi.ioifaces.IOStateIfaceGen; +import org.scribble.codegen.java.statechanapi.ioifaces.SuccessorIfaceGen; import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.EnumBuilder; import org.scribble.codegen.java.util.JavaBuilder; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/CaseSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java similarity index 97% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/CaseSockGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java index e1802804e..41075aa82 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/CaseSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java @@ -11,14 +11,15 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi; +package org.scribble.codegen.java.statechanapi; import java.util.stream.Collectors; import org.scribble.ast.MessageSigNameDecl; import org.scribble.ast.Module; -import org.scribble.codegen.java.endpointapi.ioifaces.BranchIfaceGen; -import org.scribble.codegen.java.endpointapi.ioifaces.IOStateIfaceGen; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; +import org.scribble.codegen.java.statechanapi.ioifaces.BranchIfaceGen; +import org.scribble.codegen.java.statechanapi.ioifaces.IOStateIfaceGen; import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.FieldBuilder; import org.scribble.codegen.java.util.JavaBuilder; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/EndSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/EndSockGen.java similarity index 95% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/EndSockGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/EndSockGen.java index 74a7dc069..220d307f9 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/EndSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/EndSockGen.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi; +package org.scribble.codegen.java.statechanapi; import org.scribble.model.endpoint.EState; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/HandlerIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java similarity index 97% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/HandlerIfaceGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java index ff1357ce5..893f64173 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/HandlerIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java @@ -11,10 +11,11 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi; +package org.scribble.codegen.java.statechanapi; import org.scribble.ast.MessageSigNameDecl; import org.scribble.ast.Module; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.AbstractMethodBuilder; import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.InterfaceBuilder; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/InputFutureGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java similarity index 97% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/InputFutureGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java index 26ff607e5..da416974d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/InputFutureGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi; +package org.scribble.codegen.java.statechanapi; import java.util.LinkedList; import java.util.List; @@ -19,6 +19,7 @@ import org.scribble.ast.DataTypeDecl; import org.scribble.ast.MessageSigNameDecl; import org.scribble.ast.Module; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.ConstructorBuilder; import org.scribble.codegen.java.util.FieldBuilder; @@ -34,7 +35,7 @@ public class InputFutureGen extends AuxStateChanTypeGen { - protected static final String SCRIBFUTURE_CLASS = "org.scribble.runtime.net.ScribFuture"; + protected static final String SCRIBFUTURE_CLASS = "org.scribble.runtime.util.ScribFuture"; private final EAction a; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/OutputSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java similarity index 98% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/OutputSockGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java index 22380a9ca..492c0d6f1 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/OutputSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi; +package org.scribble.codegen.java.statechanapi; import java.util.Iterator; import java.util.List; @@ -21,6 +21,7 @@ import org.scribble.ast.DataTypeDecl; import org.scribble.ast.MessageSigNameDecl; import org.scribble.ast.Module; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.main.ScribbleException; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ReceiveSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java similarity index 98% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ReceiveSockGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java index 99e645e3d..ef6b2b0a6 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ReceiveSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java @@ -11,11 +11,12 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi; +package org.scribble.codegen.java.statechanapi; import org.scribble.ast.DataTypeDecl; import org.scribble.ast.MessageSigNameDecl; import org.scribble.ast.Module; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ScribSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java similarity index 95% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ScribSockGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java index d98a04023..efab47501 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ScribSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java @@ -11,12 +11,13 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi; +package org.scribble.codegen.java.statechanapi; import org.scribble.ast.DataTypeDecl; import org.scribble.ast.MessageSigNameDecl; import org.scribble.ast.NonProtocolDecl; import org.scribble.ast.global.GProtocolDecl; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.ConstructorBuilder; import org.scribble.codegen.java.util.FieldBuilder; @@ -33,22 +34,23 @@ public abstract class ScribSockGen extends StateChanTypeGen { public static final String JAVA_SCHEMA = "java"; // FIXME: factor out - public static final String SESSIONENDPOINT_CLASS = "org.scribble.runtime.net.session.SessionEndpoint"; - public static final String MPSTENDPOINT_CLASS = "org.scribble.runtime.net.session.MPSTEndpoint"; - public static final String EXPLICITENDPOINT_CLASS = "org.scribble.runtime.net.session.ExplicitEndpoint"; - public static final String BUF_CLASS = "org.scribble.runtime.net.Buf"; - public static final String OPENUM_INTERFACE = "org.scribble.runtime.net.session.OpEnum"; + public static final String SESSIONENDPOINT_CLASS = "org.scribble.runtime.session.SessionEndpoint"; + public static final String MPSTENDPOINT_CLASS = "org.scribble.runtime.session.MPSTEndpoint"; + public static final String EXPLICITENDPOINT_CLASS = "org.scribble.runtime.session.ExplicitEndpoint"; + public static final String OPENUM_INTERFACE = "org.scribble.runtime.session.OpEnum"; - //public static final String CONNECTSOCKET_CLASS = "org.scribble.net.scribsock.ConnectSocket"; - public static final String ACCEPTSOCKET_CLASS = "org.scribble.runtime.net.scribsock.AcceptSocket"; - //public static final String DISCONNECTSOCKET_CLASS = "org.scribble.net.scribsock.DisconnectSocket"; - public static final String OUTPUTSOCKET_CLASS = "org.scribble.runtime.net.scribsock.OutputSocket"; - public static final String RECEIVESOCKET_CLASS = "org.scribble.runtime.net.scribsock.ReceiveSocket"; - public static final String BRANCHSOCKET_CLASS = "org.scribble.runtime.net.scribsock.BranchSocket"; - public static final String CASESOCKET_CLASS = "org.scribble.runtime.net.scribsock.CaseSocket"; - public static final String ENDSOCKET_CLASS = "org.scribble.runtime.net.scribsock.EndSocket"; + public static final String BUF_CLASS = "org.scribble.runtime.util.Buf"; - public static final String SCRIBSERVERSOCKET_CLASS = "org.scribble.runtime.net.scribsock.ScribServerSocket"; + //public static final String CONNECTSOCKET_CLASS = "org.scribble.statechans.ConnectSocket"; + public static final String ACCEPTSOCKET_CLASS = "org.scribble.runtime.statechans.AcceptSocket"; + //public static final String DISCONNECTSOCKET_CLASS = "org.scribble.statechans.DisconnectSocket"; + public static final String OUTPUTSOCKET_CLASS = "org.scribble.runtime.statechans.OutputSocket"; + public static final String RECEIVESOCKET_CLASS = "org.scribble.runtime.statechans.ReceiveSocket"; + public static final String BRANCHSOCKET_CLASS = "org.scribble.runtime.statechans.BranchSocket"; + public static final String CASESOCKET_CLASS = "org.scribble.runtime.statechans.CaseSocket"; + public static final String ENDSOCKET_CLASS = "org.scribble.runtime.statechans.EndSocket"; + + public static final String SCRIBSERVERSOCKET_CLASS = "org.scribble.runtime.net.ScribServerSocket"; public static final String GENERATED_ENDSOCKET_NAME = "EndSocket"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/StateChanTypeGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChanTypeGen.java similarity index 95% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/StateChanTypeGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChanTypeGen.java index 07b6a556d..c1b04f396 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/StateChanTypeGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChanTypeGen.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi; +package org.scribble.codegen.java.statechanapi; import org.scribble.codegen.java.util.TypeBuilder; import org.scribble.main.ScribbleException; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java similarity index 97% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/StateChannelApiGenerator.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index a3b5360b4..8228ed96c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -11,13 +11,15 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi; +package org.scribble.codegen.java.statechanapi; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.scribble.ast.Module; +import org.scribble.codegen.java.ApiGen; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.TypeBuilder; import org.scribble.main.Job; @@ -37,7 +39,7 @@ // FIXME: consume futures before wrap/reconnect public class StateChannelApiGenerator extends ApiGen { - public static final String SCRIBMESSAGE_CLASS = "org.scribble.runtime.net.ScribMessage"; + public static final String SCRIBMESSAGE_CLASS = "org.scribble.runtime.message.ScribMessage"; public static final String SCRIBBLERUNTIMEEXCEPTION_CLASS = "org.scribble.main.ScribbleRuntimeException"; public static final String RECEIVE_OP_PARAM = "op"; public static final String SCRIBMESSAGE_OP_FIELD = "op"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/ActionIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java similarity index 93% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/ActionIfaceGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java index d1ff9f4e9..9347cbd92 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/ActionIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java @@ -11,12 +11,12 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi.ioifaces; +package org.scribble.codegen.java.statechanapi.ioifaces; -import org.scribble.codegen.java.endpointapi.ReceiveSockGen; -import org.scribble.codegen.java.endpointapi.OutputSockGen; -import org.scribble.codegen.java.endpointapi.SessionApiGenerator; -import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; +import org.scribble.codegen.java.statechanapi.OutputSockGen; +import org.scribble.codegen.java.statechanapi.ReceiveSockGen; +import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.util.AbstractMethodBuilder; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/BranchIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java similarity index 94% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/BranchIfaceGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java index 9eeb97be4..dd2aab942 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/BranchIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java @@ -11,16 +11,16 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi.ioifaces; +package org.scribble.codegen.java.statechanapi.ioifaces; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.scribble.codegen.java.endpointapi.ScribSockGen; -import org.scribble.codegen.java.endpointapi.SessionApiGenerator; -import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; +import org.scribble.codegen.java.statechanapi.ScribSockGen; +import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.util.AbstractMethodBuilder; import org.scribble.codegen.java.util.EnumBuilder; import org.scribble.codegen.java.util.InterfaceBuilder; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/CaseIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java similarity index 91% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/CaseIfaceGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java index 846be4c29..cd161355e 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/CaseIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java @@ -11,16 +11,16 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi.ioifaces; +package org.scribble.codegen.java.statechanapi.ioifaces; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import org.scribble.codegen.java.endpointapi.CaseSockGen; -import org.scribble.codegen.java.endpointapi.ScribSockGen; -import org.scribble.codegen.java.endpointapi.SessionApiGenerator; -import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; +import org.scribble.codegen.java.statechanapi.CaseSockGen; +import org.scribble.codegen.java.statechanapi.ScribSockGen; +import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.util.AbstractMethodBuilder; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/HandleIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java similarity index 96% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/HandleIfaceGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java index 3d0a2b5b3..8e08b5372 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/HandleIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java @@ -11,15 +11,15 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi.ioifaces; +package org.scribble.codegen.java.statechanapi.ioifaces; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import org.scribble.codegen.java.endpointapi.HandlerIfaceGen; -import org.scribble.codegen.java.endpointapi.ScribSockGen; -import org.scribble.codegen.java.endpointapi.SessionApiGenerator; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; +import org.scribble.codegen.java.statechanapi.HandlerIfaceGen; +import org.scribble.codegen.java.statechanapi.ScribSockGen; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/IOIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOIfaceGen.java similarity index 81% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/IOIfaceGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOIfaceGen.java index 527b61ce6..f861b08ba 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/IOIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOIfaceGen.java @@ -11,10 +11,10 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi.ioifaces; +package org.scribble.codegen.java.statechanapi.ioifaces; -import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator; -import org.scribble.codegen.java.endpointapi.StateChanTypeGen; +import org.scribble.codegen.java.statechanapi.StateChanTypeGen; +import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.model.endpoint.EState; public abstract class IOIfaceGen extends StateChanTypeGen diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java similarity index 98% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/IOInterfacesGenerator.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index 8bbe7007f..f78042a05 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi.ioifaces; +package org.scribble.codegen.java.statechanapi.ioifaces; import java.util.HashMap; import java.util.HashSet; @@ -24,12 +24,12 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.scribble.codegen.java.endpointapi.ApiGen; -import org.scribble.codegen.java.endpointapi.CaseSockGen; -import org.scribble.codegen.java.endpointapi.HandlerIfaceGen; -import org.scribble.codegen.java.endpointapi.ScribSockGen; -import org.scribble.codegen.java.endpointapi.SessionApiGenerator; -import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator; +import org.scribble.codegen.java.ApiGen; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; +import org.scribble.codegen.java.statechanapi.CaseSockGen; +import org.scribble.codegen.java.statechanapi.HandlerIfaceGen; +import org.scribble.codegen.java.statechanapi.ScribSockGen; +import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.util.AbstractMethodBuilder; import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.FieldBuilder; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/IOStateIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java similarity index 96% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/IOStateIfaceGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java index c51d98f09..6c1aacff3 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/IOStateIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi.ioifaces; +package org.scribble.codegen.java.statechanapi.ioifaces; import java.util.Collections; import java.util.Comparator; @@ -20,8 +20,8 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.scribble.codegen.java.endpointapi.SessionApiGenerator; -import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; +import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.util.FieldBuilder; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/ReceiveIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java similarity index 85% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/ReceiveIfaceGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java index 6567d5bc7..51f2211e1 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/ReceiveIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java @@ -11,15 +11,15 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi.ioifaces; +package org.scribble.codegen.java.statechanapi.ioifaces; import java.util.Map; -import org.scribble.codegen.java.endpointapi.InputFutureGen; -import org.scribble.codegen.java.endpointapi.ReceiveSockGen; -import org.scribble.codegen.java.endpointapi.ScribSockGen; -import org.scribble.codegen.java.endpointapi.SessionApiGenerator; -import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; +import org.scribble.codegen.java.statechanapi.InputFutureGen; +import org.scribble.codegen.java.statechanapi.ReceiveSockGen; +import org.scribble.codegen.java.statechanapi.ScribSockGen; +import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.main.ScribbleException; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/SelectIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java similarity index 91% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/SelectIfaceGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java index bc509e745..d3640d2d4 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/SelectIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java @@ -11,11 +11,11 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi.ioifaces; +package org.scribble.codegen.java.statechanapi.ioifaces; import java.util.Map; -import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator; +import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EState; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/SuccessorIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SuccessorIfaceGen.java similarity index 92% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/SuccessorIfaceGen.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SuccessorIfaceGen.java index e67cf1807..514a5670c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/endpointapi/ioifaces/SuccessorIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SuccessorIfaceGen.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.codegen.java.endpointapi.ioifaces; +package org.scribble.codegen.java.statechanapi.ioifaces; -import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator; +import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.model.endpoint.EState; diff --git a/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java b/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java index 90c08bfce..c00064ce6 100644 --- a/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java +++ b/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java @@ -31,11 +31,11 @@ import java.io.InputStreamReader; import java.util.Base64; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.scribsock.LinearSocket; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SSLSocketChannelWrapper; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.net.SSLSocketChannelWrapper; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.statechans.LinearSocket; +import org.scribble.runtime.util.Buf; import smtp.Smtp.Smtp.Smtp; import smtp.Smtp.Smtp.channels.C.Smtp_C_1; diff --git a/scribble-demos/scrib/smtp/src/smtp/SmtpC.java b/scribble-demos/scrib/smtp/src/smtp/SmtpC.java index 8b176302d..7813be0fe 100644 --- a/scribble-demos/scrib/smtp/src/smtp/SmtpC.java +++ b/scribble-demos/scrib/smtp/src/smtp/SmtpC.java @@ -34,10 +34,10 @@ import java.io.InputStreamReader; import java.util.Base64; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SSLSocketChannelWrapper; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.net.SSLSocketChannelWrapper; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import smtp.Smtp.Smtp.Smtp; import smtp.Smtp.Smtp.channels.C.EndSocket; diff --git a/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessage.java b/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessage.java index 156d772d5..4992c9714 100644 --- a/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessage.java +++ b/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessage.java @@ -13,7 +13,7 @@ */ package smtp.message; -import org.scribble.runtime.net.ScribMessage; +import org.scribble.runtime.message.ScribMessage; import org.scribble.type.name.Op; import org.scribble.util.Caller; diff --git a/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessageFormatter.java b/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessageFormatter.java index 459c34db1..c28f36091 100644 --- a/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessageFormatter.java +++ b/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessageFormatter.java @@ -19,8 +19,8 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.runtime.net.ScribMessageFormatter; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.runtime.message.ScribMessageFormatter; import smtp.message.server._220; import smtp.message.server._221; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribBranch.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribBranch.java new file mode 100644 index 000000000..4edb3f060 --- /dev/null +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribBranch.java @@ -0,0 +1,9 @@ +package org.scribble.runtime.handlers; + +import org.scribble.runtime.message.ScribMessage; + +// FIXME: integrate with BranchSocket and Handler I/f's +public interface ScribBranch +{ + public void dispatch(D data, ScribMessage m); +} diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribOutputEvent.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java similarity index 86% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribOutputEvent.java rename to scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java index 479e152f5..6a644769e 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribOutputEvent.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java @@ -1,6 +1,6 @@ -package org.scribble.runtime.net.handlers; +package org.scribble.runtime.handlers; -import org.scribble.runtime.net.ScribMessage; +import org.scribble.runtime.message.ScribMessage; import org.scribble.type.name.Op; import org.scribble.type.name.Role; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribSigMessage.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribSigMessage.java new file mode 100644 index 000000000..f84598f91 --- /dev/null +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribSigMessage.java @@ -0,0 +1,8 @@ +package org.scribble.runtime.handlers; + +import org.scribble.runtime.message.ScribMessage; + +public interface ScribSigMessage +{ + ScribMessage getSig(); +} diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribEndState.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribEndState.java similarity index 83% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribEndState.java rename to scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribEndState.java index 22f2923cb..4a56c1fd4 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribEndState.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribEndState.java @@ -1,4 +1,4 @@ -package org.scribble.runtime.net.handlers.states; +package org.scribble.runtime.handlers.states; abstract public class ScribEndState extends ScribState { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribInputState.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribInputState.java similarity index 86% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribInputState.java rename to scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribInputState.java index 9ee72aabe..45e104eed 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribInputState.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribInputState.java @@ -1,4 +1,4 @@ -package org.scribble.runtime.net.handlers.states; +package org.scribble.runtime.handlers.states; import org.scribble.type.name.Role; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribOutputState.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribOutputState.java similarity index 81% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribOutputState.java rename to scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribOutputState.java index 15b7556c4..03b3ebce4 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribOutputState.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribOutputState.java @@ -1,4 +1,4 @@ -package org.scribble.runtime.net.handlers.states; +package org.scribble.runtime.handlers.states; abstract public class ScribOutputState extends ScribState { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribState.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribState.java similarity index 94% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribState.java rename to scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribState.java index e2b220186..026eae866 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/states/ScribState.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribState.java @@ -1,4 +1,4 @@ -package org.scribble.runtime.net.handlers.states; +package org.scribble.runtime.handlers.states; import java.util.HashMap; import java.util.Map; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/ObjectStreamFormatter.java b/scribble-runtime/src/main/java/org/scribble/runtime/message/ObjectStreamFormatter.java similarity index 98% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/ObjectStreamFormatter.java rename to scribble-runtime/src/main/java/org/scribble/runtime/message/ObjectStreamFormatter.java index 7ccd6d80d..745fcd2dc 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/ObjectStreamFormatter.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/message/ObjectStreamFormatter.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net; +package org.scribble.runtime.message; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribInterrupt.java b/scribble-runtime/src/main/java/org/scribble/runtime/message/ScribInterrupt.java similarity index 96% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/ScribInterrupt.java rename to scribble-runtime/src/main/java/org/scribble/runtime/message/ScribInterrupt.java index e66694a34..0196e3946 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribInterrupt.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/message/ScribInterrupt.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net; +package org.scribble.runtime.message; import org.scribble.type.name.Op; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribMessage.java b/scribble-runtime/src/main/java/org/scribble/runtime/message/ScribMessage.java similarity index 98% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/ScribMessage.java rename to scribble-runtime/src/main/java/org/scribble/runtime/message/ScribMessage.java index cb901a0f1..898539c96 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribMessage.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/message/ScribMessage.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net; +package org.scribble.runtime.message; import java.io.Serializable; import java.util.Arrays; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribMessageFormatter.java b/scribble-runtime/src/main/java/org/scribble/runtime/message/ScribMessageFormatter.java similarity index 97% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/ScribMessageFormatter.java rename to scribble-runtime/src/main/java/org/scribble/runtime/message/ScribMessageFormatter.java index 20be87e7e..b46249ace 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribMessageFormatter.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/message/ScribMessageFormatter.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net; +package org.scribble.runtime.message; import java.io.DataInputStream; import java.io.DataOutputStream; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/BinaryChannelEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelEndpoint.java similarity index 96% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/session/BinaryChannelEndpoint.java rename to scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelEndpoint.java index d901c7d7f..20035bb7b 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/BinaryChannelEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelEndpoint.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.session; +package org.scribble.runtime.net; import java.io.IOException; import java.nio.ByteBuffer; @@ -22,8 +22,9 @@ import java.util.concurrent.ExecutionException; import org.scribble.main.RuntimeScribbleException; -import org.scribble.runtime.net.ScribInterrupt; -import org.scribble.runtime.net.ScribMessage; +import org.scribble.runtime.message.ScribInterrupt; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.runtime.session.SessionEndpoint; public abstract class BinaryChannelEndpoint { @@ -129,7 +130,7 @@ public synchronized CompletableFuture getFuture() return fut; } - protected void sync() throws IOException // Hacky + public void sync() throws IOException // Hacky { try { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/BinaryChannelWrapper.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelWrapper.java similarity index 96% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/session/BinaryChannelWrapper.java rename to scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelWrapper.java index 437dc61f7..ee63ed663 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/BinaryChannelWrapper.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelWrapper.java @@ -11,13 +11,15 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.session; +package org.scribble.runtime.net; import java.io.IOException; import java.nio.ByteBuffer; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; +import org.scribble.runtime.session.SessionEndpoint; + public abstract class BinaryChannelWrapper extends BinaryChannelEndpoint { // Use this in readUnwrappedBytesIntoBuffer (super.getBuffer used for read-but-still-wrapped -- decoded into here by unwrap) diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/SSLSocketChannelServer.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/SSLSocketChannelServer.java similarity index 89% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/SSLSocketChannelServer.java rename to scribble-runtime/src/main/java/org/scribble/runtime/net/SSLSocketChannelServer.java index 854f91e78..bb9d40870 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/SSLSocketChannelServer.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/SSLSocketChannelServer.java @@ -11,13 +11,12 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.scribsock; +package org.scribble.runtime.net; import java.io.IOException; import java.nio.channels.ServerSocketChannel; -import org.scribble.runtime.net.session.SessionEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.session.SessionEndpoint; // FIXME: public class SSLSocketChannelServer extends ScribServerSocket diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/SSLSocketChannelWrapper.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/SSLSocketChannelWrapper.java similarity index 99% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/session/SSLSocketChannelWrapper.java rename to scribble-runtime/src/main/java/org/scribble/runtime/net/SSLSocketChannelWrapper.java index a1534a5e9..78847bc7d 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/SSLSocketChannelWrapper.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/SSLSocketChannelWrapper.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.session; +package org.scribble.runtime.net; import java.io.IOException; import java.net.InetSocketAddress; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/ScribServerSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribServerSocket.java similarity index 89% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/ScribServerSocket.java rename to scribble-runtime/src/main/java/org/scribble/runtime/net/ScribServerSocket.java index 89cdb08c5..e1328ca48 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/ScribServerSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribServerSocket.java @@ -11,13 +11,12 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.scribsock; +package org.scribble.runtime.net; import java.io.IOException; import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.session.BinaryChannelEndpoint; -import org.scribble.runtime.net.session.SessionEndpoint; +import org.scribble.runtime.session.SessionEndpoint; public abstract class ScribServerSocket implements AutoCloseable { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/SocketChannelEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/SocketChannelEndpoint.java similarity index 96% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/session/SocketChannelEndpoint.java rename to scribble-runtime/src/main/java/org/scribble/runtime/net/SocketChannelEndpoint.java index a005b0b27..6b8eac311 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/SocketChannelEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/SocketChannelEndpoint.java @@ -11,13 +11,15 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.session; +package org.scribble.runtime.net; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; +import org.scribble.runtime.session.SessionEndpoint; + public class SocketChannelEndpoint extends BinaryChannelEndpoint { //private final SocketChannel s; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/SocketChannelServer.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/SocketChannelServer.java similarity index 89% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/SocketChannelServer.java rename to scribble-runtime/src/main/java/org/scribble/runtime/net/SocketChannelServer.java index eaecc6942..d301be0ce 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/SocketChannelServer.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/SocketChannelServer.java @@ -11,14 +11,13 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.scribsock; +package org.scribble.runtime.net; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.ServerSocketChannel; -import org.scribble.runtime.net.session.SessionEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.session.SessionEndpoint; public class SocketChannelServer extends ScribServerSocket { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/SocketEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/SocketEndpoint.java similarity index 95% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/session/SocketEndpoint.java rename to scribble-runtime/src/main/java/org/scribble/runtime/net/SocketEndpoint.java index 132e1e7c8..2f5883541 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/SocketEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/SocketEndpoint.java @@ -11,12 +11,13 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.session; +package org.scribble.runtime.net; import java.io.DataInputStream; import java.io.IOException; -import org.scribble.runtime.net.ScribMessage; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.runtime.session.MPSTEndpoint; import org.scribble.type.name.Role; // Read/write Objects on the binary connection to an endpoint in the session diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/SocketWrapper.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/SocketWrapper.java similarity index 97% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/session/SocketWrapper.java rename to scribble-runtime/src/main/java/org/scribble/runtime/net/SocketWrapper.java index b1fc29585..e53b92176 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/SocketWrapper.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/SocketWrapper.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.session; +package org.scribble.runtime.net; import java.io.DataInputStream; import java.io.DataOutputStream; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribBranch.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribBranch.java deleted file mode 100644 index a11190a7d..000000000 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribBranch.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.scribble.runtime.net.handlers; - -import org.scribble.runtime.net.ScribMessage; - -// FIXME: integrate with BranchSocket and Handlers -public interface ScribBranch -{ - public void dispatch(D data, ScribMessage m); -} diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribSigMessage.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribSigMessage.java deleted file mode 100644 index 3a4ee5af0..000000000 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/handlers/ScribSigMessage.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.scribble.runtime.net.handlers; - -import org.scribble.runtime.net.ScribMessage; - -public interface ScribSigMessage -{ - ScribMessage getSig(); -} diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EndpointInputQueues.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/EndpointInputQueues.java similarity index 96% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/session/EndpointInputQueues.java rename to scribble-runtime/src/main/java/org/scribble/runtime/session/EndpointInputQueues.java index a3ca8ae34..8e540a428 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EndpointInputQueues.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/EndpointInputQueues.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.session; +package org.scribble.runtime.session; import java.io.IOException; import java.util.HashMap; @@ -22,8 +22,8 @@ import org.scribble.main.RuntimeScribbleException; -import org.scribble.runtime.net.ScribInterrupt; -import org.scribble.runtime.net.ScribMessage; +import org.scribble.runtime.message.ScribInterrupt; +import org.scribble.runtime.message.ScribMessage; import org.scribble.type.name.Role; @Deprecated diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/EventDrivenEndpoint.java similarity index 89% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java rename to scribble-runtime/src/main/java/org/scribble/runtime/session/EventDrivenEndpoint.java index ee667186e..43de40a9d 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/EventDrivenEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/EventDrivenEndpoint.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.session; +package org.scribble.runtime.session; import java.io.IOException; import java.util.HashMap; @@ -23,15 +23,15 @@ import java.util.function.Function; import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.runtime.net.ScribMessageFormatter; -import org.scribble.runtime.net.handlers.ScribBranch; -import org.scribble.runtime.net.handlers.ScribOutputEvent; -import org.scribble.runtime.net.handlers.ScribSigMessage; -import org.scribble.runtime.net.handlers.states.ScribEndState; -import org.scribble.runtime.net.handlers.states.ScribInputState; -import org.scribble.runtime.net.handlers.states.ScribOutputState; -import org.scribble.runtime.net.handlers.states.ScribState; +import org.scribble.runtime.handlers.ScribBranch; +import org.scribble.runtime.handlers.ScribOutputEvent; +import org.scribble.runtime.handlers.ScribSigMessage; +import org.scribble.runtime.handlers.states.ScribEndState; +import org.scribble.runtime.handlers.states.ScribInputState; +import org.scribble.runtime.handlers.states.ScribOutputState; +import org.scribble.runtime.handlers.states.ScribState; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.runtime.message.ScribMessageFormatter; import org.scribble.type.name.Role; public class EventDrivenEndpoint extends MPSTEndpoint diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/ExplicitEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/ExplicitEndpoint.java similarity index 92% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/session/ExplicitEndpoint.java rename to scribble-runtime/src/main/java/org/scribble/runtime/session/ExplicitEndpoint.java index da68e9f1a..56cdccb27 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/ExplicitEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/ExplicitEndpoint.java @@ -11,12 +11,12 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.session; +package org.scribble.runtime.session; import java.io.IOException; import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.ScribMessageFormatter; +import org.scribble.runtime.message.ScribMessageFormatter; import org.scribble.type.name.Role; public class ExplicitEndpoint extends SessionEndpoint diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/MPSTEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/MPSTEndpoint.java similarity index 94% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/session/MPSTEndpoint.java rename to scribble-runtime/src/main/java/org/scribble/runtime/session/MPSTEndpoint.java index f97510eaf..e64fcada9 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/MPSTEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/MPSTEndpoint.java @@ -11,15 +11,16 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.session; +package org.scribble.runtime.session; import java.io.IOException; import java.net.UnknownHostException; import java.util.concurrent.Callable; import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.ScribMessageFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; +import org.scribble.runtime.message.ScribMessageFormatter; +import org.scribble.runtime.net.BinaryChannelEndpoint; +import org.scribble.runtime.net.ScribServerSocket; import org.scribble.type.name.Role; // FIXME: factor out between role-endpoint based socket and channel-endpoint sockets diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/OpEnum.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/OpEnum.java similarity index 93% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/session/OpEnum.java rename to scribble-runtime/src/main/java/org/scribble/runtime/session/OpEnum.java index c12567079..64419db70 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/OpEnum.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/OpEnum.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.session; +package org.scribble.runtime.session; public interface OpEnum { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/Principal.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/Principal.java similarity index 97% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/session/Principal.java rename to scribble-runtime/src/main/java/org/scribble/runtime/session/Principal.java index 1f13259c0..be683f158 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/Principal.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/Principal.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.session; +package org.scribble.runtime.session; import java.io.Serializable; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/ScribInputSelector.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/ScribInputSelector.java similarity index 97% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/session/ScribInputSelector.java rename to scribble-runtime/src/main/java/org/scribble/runtime/session/ScribInputSelector.java index 76db2d750..263570d1f 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/ScribInputSelector.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/ScribInputSelector.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.session; +package org.scribble.runtime.session; import java.io.IOException; import java.nio.channels.ClosedChannelException; @@ -20,6 +20,7 @@ import java.nio.channels.spi.AbstractSelectableChannel; import java.util.Set; +import org.scribble.runtime.net.BinaryChannelEndpoint; import org.scribble.type.name.Role; public class ScribInputSelector extends Thread diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/Session.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java similarity index 99% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/session/Session.java rename to scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java index f4acfd8f8..14b1e7cab 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/Session.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.session; +package org.scribble.runtime.session; import java.io.IOException; import java.util.HashMap; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/SessionEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java similarity index 97% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/session/SessionEndpoint.java rename to scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java index df02ea885..48f63017b 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/session/SessionEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.session; +package org.scribble.runtime.session; import java.io.IOException; import java.nio.channels.SelectionKey; @@ -22,9 +22,11 @@ import org.scribble.main.RuntimeScribbleException; import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ScribMessageFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; +import org.scribble.runtime.message.ScribMessageFormatter; +import org.scribble.runtime.net.BinaryChannelEndpoint; +import org.scribble.runtime.net.BinaryChannelWrapper; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.util.Buf; import org.scribble.type.name.Role; // FIXME: factor out between role-endpoint based socket and channel-endpoint sockets diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/AcceptSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/AcceptSocket.java similarity index 84% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/AcceptSocket.java rename to scribble-runtime/src/main/java/org/scribble/runtime/statechans/AcceptSocket.java index 64240bc1d..9479e3064 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/AcceptSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/AcceptSocket.java @@ -11,14 +11,15 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.scribsock; +package org.scribble.runtime.statechans; import java.io.IOException; import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.Session; -import org.scribble.runtime.net.session.SessionEndpoint; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.session.Session; +import org.scribble.runtime.session.SessionEndpoint; import org.scribble.type.name.Role; public abstract class AcceptSocket extends LinearSocket diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/AffineSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/AffineSocket.java similarity index 86% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/AffineSocket.java rename to scribble-runtime/src/main/java/org/scribble/runtime/statechans/AffineSocket.java index 905431653..13708e61f 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/AffineSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/AffineSocket.java @@ -11,10 +11,10 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.scribsock; +package org.scribble.runtime.statechans; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.Session; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.session.Session; import org.scribble.type.name.Role; @Deprecated diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/BranchSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/BranchSocket.java similarity index 85% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/BranchSocket.java rename to scribble-runtime/src/main/java/org/scribble/runtime/statechans/BranchSocket.java index c15f93d6a..24f07d24c 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/BranchSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/BranchSocket.java @@ -11,10 +11,10 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.scribsock; +package org.scribble.runtime.statechans; -import org.scribble.runtime.net.session.Session; -import org.scribble.runtime.net.session.SessionEndpoint; +import org.scribble.runtime.session.Session; +import org.scribble.runtime.session.SessionEndpoint; import org.scribble.type.name.Role; public abstract class BranchSocket extends ReceiveSocket diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/CaseSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/CaseSocket.java similarity index 86% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/CaseSocket.java rename to scribble-runtime/src/main/java/org/scribble/runtime/statechans/CaseSocket.java index 86b4a0126..f31a31166 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/CaseSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/CaseSocket.java @@ -11,10 +11,10 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.scribsock; +package org.scribble.runtime.statechans; -import org.scribble.runtime.net.session.Session; -import org.scribble.runtime.net.session.SessionEndpoint; +import org.scribble.runtime.session.Session; +import org.scribble.runtime.session.SessionEndpoint; import org.scribble.type.name.Role; // For "receiving" the payloads after a branch is done diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/ConnectSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ConnectSocket.java similarity index 87% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/ConnectSocket.java rename to scribble-runtime/src/main/java/org/scribble/runtime/statechans/ConnectSocket.java index 79a604520..4cf2a8309 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/ConnectSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ConnectSocket.java @@ -11,16 +11,16 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.scribsock; +package org.scribble.runtime.statechans; import java.io.IOException; import java.net.UnknownHostException; import java.util.concurrent.Callable; import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.session.BinaryChannelEndpoint; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.Session; +import org.scribble.runtime.net.BinaryChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.session.Session; import org.scribble.type.name.Role; @Deprecated diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/EndSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/EndSocket.java similarity index 90% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/EndSocket.java rename to scribble-runtime/src/main/java/org/scribble/runtime/statechans/EndSocket.java index 81d70d1aa..4b6fbe8d8 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/EndSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/EndSocket.java @@ -11,11 +11,11 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.scribsock; +package org.scribble.runtime.statechans; import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.session.Session; -import org.scribble.runtime.net.session.SessionEndpoint; +import org.scribble.runtime.session.Session; +import org.scribble.runtime.session.SessionEndpoint; import org.scribble.type.name.Role; public abstract class EndSocket extends ScribSocket diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/InitSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/InitSocket.java similarity index 91% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/InitSocket.java rename to scribble-runtime/src/main/java/org/scribble/runtime/statechans/InitSocket.java index 6a0d152f5..1856c1dc0 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/InitSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/InitSocket.java @@ -11,16 +11,17 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.scribsock; +package org.scribble.runtime.statechans; import java.io.IOException; import java.net.UnknownHostException; import java.util.concurrent.Callable; import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.session.BinaryChannelEndpoint; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.Session; +import org.scribble.runtime.net.BinaryChannelEndpoint; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.session.Session; import org.scribble.type.name.Role; // Establishing transport connections handled in here and wrapped up in SocketWrapper diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/LinearSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/LinearSocket.java similarity index 94% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/LinearSocket.java rename to scribble-runtime/src/main/java/org/scribble/runtime/statechans/LinearSocket.java index 8f4bb081f..b30172754 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/LinearSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/LinearSocket.java @@ -11,15 +11,15 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.scribsock; +package org.scribble.runtime.statechans; import java.io.IOException; import java.util.concurrent.Callable; import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.session.BinaryChannelWrapper; -import org.scribble.runtime.net.session.Session; -import org.scribble.runtime.net.session.SessionEndpoint; +import org.scribble.runtime.net.BinaryChannelWrapper; +import org.scribble.runtime.session.Session; +import org.scribble.runtime.session.SessionEndpoint; import org.scribble.type.name.Role; // Not AutoClosable -- leave that to InitSocket diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/OutputSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/OutputSocket.java similarity index 90% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/OutputSocket.java rename to scribble-runtime/src/main/java/org/scribble/runtime/statechans/OutputSocket.java index 6aa8a84d3..0132acdff 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/OutputSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/OutputSocket.java @@ -11,18 +11,18 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.scribsock; +package org.scribble.runtime.statechans; import java.io.IOException; import java.net.UnknownHostException; import java.util.concurrent.Callable; import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.runtime.net.session.BinaryChannelEndpoint; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.Session; -import org.scribble.runtime.net.session.SessionEndpoint; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.runtime.net.BinaryChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.session.Session; +import org.scribble.runtime.session.SessionEndpoint; import org.scribble.type.name.Op; import org.scribble.type.name.Role; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/ReceiveSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ReceiveSocket.java similarity index 91% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/ReceiveSocket.java rename to scribble-runtime/src/main/java/org/scribble/runtime/statechans/ReceiveSocket.java index 40ab017df..4847e504b 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/ReceiveSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ReceiveSocket.java @@ -11,16 +11,16 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.scribsock; +package org.scribble.runtime.statechans; import java.io.IOException; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.runtime.net.session.Session; -import org.scribble.runtime.net.session.SessionEndpoint; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.runtime.session.Session; +import org.scribble.runtime.session.SessionEndpoint; import org.scribble.type.name.Role; public abstract class ReceiveSocket extends LinearSocket diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/ScribSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ScribSocket.java similarity index 85% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/ScribSocket.java rename to scribble-runtime/src/main/java/org/scribble/runtime/statechans/ScribSocket.java index 4ea36827b..d8a7ba3d4 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/scribsock/ScribSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ScribSocket.java @@ -11,10 +11,10 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net.scribsock; +package org.scribble.runtime.statechans; -import org.scribble.runtime.net.session.Session; -import org.scribble.runtime.net.session.SessionEndpoint; +import org.scribble.runtime.session.Session; +import org.scribble.runtime.session.SessionEndpoint; import org.scribble.type.name.Role; // FIXME: rename package (and class?) to statechans -- cf., handlers package diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/Buf.java b/scribble-runtime/src/main/java/org/scribble/runtime/util/Buf.java similarity index 95% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/Buf.java rename to scribble-runtime/src/main/java/org/scribble/runtime/util/Buf.java index ca2cc038b..bd04b02ad 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/Buf.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/util/Buf.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net; +package org.scribble.runtime.util; public class Buf { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribFuture.java b/scribble-runtime/src/main/java/org/scribble/runtime/util/ScribFuture.java similarity index 96% rename from scribble-runtime/src/main/java/org/scribble/runtime/net/ScribFuture.java rename to scribble-runtime/src/main/java/org/scribble/runtime/util/ScribFuture.java index 74f85f8e4..3e2f9a7a2 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribFuture.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/util/ScribFuture.java @@ -11,12 +11,14 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.runtime.net; +package org.scribble.runtime.util; import java.io.IOException; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import org.scribble.runtime.message.ScribMessage; + // P is payload type as an array public abstract class ScribFuture //implements Future

{ diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index 527d7633c..813584228 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -7,9 +7,9 @@ import java.io.IOException; import java.util.concurrent.Future; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; import test.test2.Test2.Proto1.Proto1; import test.test2.Test2.Proto1.channels.A.Proto1_A_1; diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java index 835c77bc8..f7c8b52c5 100644 --- a/scribble-test/src/test/scrib/test/test2/MyB.java +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -7,10 +7,10 @@ import java.util.concurrent.Future; import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; import test.test2.Test2.Proto1.Proto1; import test.test2.Test2.Proto1.channels.B.EndSocket; diff --git a/scribble-test/src/test/scrib/test/test3/MyA.java b/scribble-test/src/test/scrib/test/test3/MyA.java index 5572cbfce..c4dd3e751 100644 --- a/scribble-test/src/test/scrib/test/test3/MyA.java +++ b/scribble-test/src/test/scrib/test/test3/MyA.java @@ -6,8 +6,8 @@ import java.io.IOException; import java.util.concurrent.Future; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; import test.test3.Test3.Proto1.Proto1; import test.test3.Test3.Proto1.handlers.A.Proto1_A; diff --git a/scribble-test/src/test/scrib/test/test3/MyB.java b/scribble-test/src/test/scrib/test/test3/MyB.java index f6ad20fee..2c36e0604 100644 --- a/scribble-test/src/test/scrib/test/test3/MyB.java +++ b/scribble-test/src/test/scrib/test/test3/MyB.java @@ -7,10 +7,10 @@ import java.io.IOException; import java.util.concurrent.Future; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.net.SocketChannelServer; import test.test3.Test3.Proto1.Proto1; import test.test3.Test3.Proto1.handlers.B.Proto1_B; diff --git a/scribble-test/src/test/scrib/test/test3/MyC.java b/scribble-test/src/test/scrib/test/test3/MyC.java index 735c145a6..48292bc9f 100644 --- a/scribble-test/src/test/scrib/test/test3/MyC.java +++ b/scribble-test/src/test/scrib/test/test3/MyC.java @@ -6,9 +6,9 @@ import java.io.IOException; import java.util.concurrent.Future; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; import test.test3.Test3.Proto1.Proto1; import test.test3.Test3.Proto1.handlers.C.Proto1_C; diff --git a/scribble-test/src/test/scrib/test/test4/MyA.java b/scribble-test/src/test/scrib/test/test4/MyA.java index 4e55008bc..9d5c08e03 100644 --- a/scribble-test/src/test/scrib/test/test4/MyA.java +++ b/scribble-test/src/test/scrib/test/test4/MyA.java @@ -6,7 +6,7 @@ import java.io.IOException; import java.util.concurrent.Future; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.net.SocketChannelEndpoint; import test.test4.Test4.Proto1.Proto1; import test.test4.Test4.Proto1.handlers.A.Proto1_A; diff --git a/scribble-test/src/test/scrib/test/test4/MyB.java b/scribble-test/src/test/scrib/test/test4/MyB.java index b0e1d6457..a6988131b 100644 --- a/scribble-test/src/test/scrib/test/test4/MyB.java +++ b/scribble-test/src/test/scrib/test/test4/MyB.java @@ -6,8 +6,8 @@ import java.io.IOException; import java.util.concurrent.Future; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; import test.test4.Test4.Proto1.Proto1; import test.test4.Test4.Proto1.handlers.B.Proto1_B; diff --git a/scribble-test/src/test/scrib/test/test4/sig/Test4Formatter.java b/scribble-test/src/test/scrib/test/test4/sig/Test4Formatter.java index c02a8b258..328939107 100644 --- a/scribble-test/src/test/scrib/test/test4/sig/Test4Formatter.java +++ b/scribble-test/src/test/scrib/test/test4/sig/Test4Formatter.java @@ -6,8 +6,8 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.runtime.net.ScribMessageFormatter; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.runtime.message.ScribMessageFormatter; public class Test4Formatter implements ScribMessageFormatter { diff --git a/scribble-test/src/test/scrib/test/test4/sig/Test4Message.java b/scribble-test/src/test/scrib/test/test4/sig/Test4Message.java index 2d36c612c..f1180d1a8 100644 --- a/scribble-test/src/test/scrib/test/test4/sig/Test4Message.java +++ b/scribble-test/src/test/scrib/test/test4/sig/Test4Message.java @@ -1,6 +1,6 @@ package test.test4.sig; -import org.scribble.runtime.net.ScribMessage; +import org.scribble.runtime.message.ScribMessage; import org.scribble.type.name.Op; public abstract class Test4Message extends ScribMessage diff --git a/scribble-test/src/test/scrib/test/test5/MyA.java b/scribble-test/src/test/scrib/test/test5/MyA.java index b7678080d..b2772fa03 100644 --- a/scribble-test/src/test/scrib/test/test5/MyA.java +++ b/scribble-test/src/test/scrib/test/test5/MyA.java @@ -7,8 +7,8 @@ import java.io.IOException; import java.util.concurrent.Future; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; import test.test5.Test5.Proto1.Proto1; import test.test5.Test5.Proto1.handlers.A.Proto1_A; diff --git a/scribble-test/src/test/scrib/test/test5/MyB.java b/scribble-test/src/test/scrib/test/test5/MyB.java index f24d2754e..045dc121d 100644 --- a/scribble-test/src/test/scrib/test/test5/MyB.java +++ b/scribble-test/src/test/scrib/test/test5/MyB.java @@ -6,9 +6,9 @@ import java.io.IOException; import java.util.concurrent.Future; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; import test.test5.Test5.Proto1.Proto1; import test.test5.Test5.Proto1.handlers.B.Proto1_B; diff --git a/scribble-test/src/test/scrib/test/test5/MyC.java b/scribble-test/src/test/scrib/test/test5/MyC.java index fb2f433af..246ed1a7e 100644 --- a/scribble-test/src/test/scrib/test/test5/MyC.java +++ b/scribble-test/src/test/scrib/test/test5/MyC.java @@ -6,9 +6,9 @@ import java.io.IOException; import java.util.concurrent.Future; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; import test.test5.Test5.Proto1.Proto1; import test.test5.Test5.Proto1.handlers.C.Proto1_C; diff --git a/scribble-test/src/test/scrib/test/test6/MyA.java b/scribble-test/src/test/scrib/test/test6/MyA.java index 8002322b2..c10b7effe 100644 --- a/scribble-test/src/test/scrib/test/test6/MyA.java +++ b/scribble-test/src/test/scrib/test/test6/MyA.java @@ -7,8 +7,8 @@ import java.util.concurrent.Future; import java.util.function.Function; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; import test.test6.Test6.Proto1.Proto1; import test.test6.Test6.Proto1.handlers.A.Proto1_A; diff --git a/scribble-test/src/test/scrib/test/test6/MyB.java b/scribble-test/src/test/scrib/test/test6/MyB.java index edaee6593..97f31574f 100644 --- a/scribble-test/src/test/scrib/test/test6/MyB.java +++ b/scribble-test/src/test/scrib/test/test6/MyB.java @@ -7,9 +7,9 @@ import java.util.concurrent.Future; import java.util.function.Function; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; import test.test6.Test6.Proto1.Proto1; import test.test6.Test6.Proto1.handlers.B.Proto1_B; diff --git a/scribble-test/src/test/scrib/test/test7/MyA.java b/scribble-test/src/test/scrib/test/test7/MyA.java index ddef82eb0..2b25e1eb5 100644 --- a/scribble-test/src/test/scrib/test/test7/MyA.java +++ b/scribble-test/src/test/scrib/test/test7/MyA.java @@ -7,8 +7,8 @@ import java.util.concurrent.Future; import java.util.function.Function; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; import test.test7.Test7.Proto1.Proto1; import test.test7.Test7.Proto1.handlers.A.Proto1_A; diff --git a/scribble-test/src/test/scrib/test/test7/MyB.java b/scribble-test/src/test/scrib/test/test7/MyB.java index fb6e097ad..2b72c727f 100644 --- a/scribble-test/src/test/scrib/test/test7/MyB.java +++ b/scribble-test/src/test/scrib/test/test7/MyB.java @@ -6,9 +6,9 @@ import java.io.IOException; import java.util.concurrent.Future; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; import test.test7.Test7.Proto1.Proto1; import test.test7.Test7.Proto1.handlers.B.Proto1_B; From 62b9304c3bb284149571fc8d29352c413229e834 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 8 Mar 2018 22:50:16 +0000 Subject: [PATCH 033/539] Minor. --- scribble-test/src/test/scrib/test/test2/MyA.java | 1 + 1 file changed, 1 insertion(+) diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index 813584228..f8f6d3d91 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -18,6 +18,7 @@ import test.test2.Test2.Proto1.handlers.states.A.messages.Proto1_A_5__2; import test.test2.Test2.Proto1.roles.A;; +// TODO: test interop between ED API and SC API (also for sig messages) public class MyA { public static void main(String[] args) throws IOException From cfa8f392d65191c5a37d131d312869cacc616984 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 8 Mar 2018 23:04:58 +0000 Subject: [PATCH 034/539] Minor demo updates for refactored packages. --- .../java/sessionapi/SessionApiGenerator.java | 2 +- .../StateChannelApiGenerator.java | 2 +- .../http/src/http/longvers/HttpLongC.java | 22 +++++++-------- .../http/src/http/longvers/HttpLongS.java | 14 +++++----- .../longvers/message/HttpLongMessage.java | 2 +- .../message/HttpLongMessageFormatter.java | 4 +-- .../http/src/http/shortvers/HttpShortC.java | 10 +++---- .../http/src/http/shortvers/HttpShortS.java | 12 ++++---- .../shortvers/message/HttpShortMessage.java | 2 +- .../message/HttpShortMessageFormatter.java | 4 +-- .../scrib/smtp/src/smtp/SimpleSmtpC.java | 22 +++++++-------- scribble-demos/scrib/smtp/src/smtp/SmtpC.java | 28 +++++++++---------- .../src/test/scrib/test/test2/MyA.java | 8 +++--- .../src/test/scrib/test/test2/MyB.java | 11 ++++---- 14 files changed, 72 insertions(+), 71 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index 555f2afe6..884b8110c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -271,7 +271,7 @@ public static String getOpsPackageName(GProtocolName gpn) public static String getStateChannelPackageName(GProtocolName gpn, Role self) { - return getEndpointApiRootPackageName(gpn) + ".channels." + self; + return getEndpointApiRootPackageName(gpn) + ".statechans." + self; } // Returns the simple Role Class name diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 8228ed96c..d2f6f16f5 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -98,7 +98,7 @@ public Map generateApi() { Map map = new HashMap(); // FIXME: factor out with ScribSocketBuilder.getPackageName - String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.gpn).replace('.', '/') + "/channels/" + this.self + "/" ; + String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.gpn).replace('.', '/') + "/statechans/" + this.self + "/" ; for (String s : this.types.keySet()) { String path = prefix + s + ".java"; diff --git a/scribble-demos/scrib/http/src/http/longvers/HttpLongC.java b/scribble-demos/scrib/http/src/http/longvers/HttpLongC.java index df6ebe762..f015d0a0f 100644 --- a/scribble-demos/scrib/http/src/http/longvers/HttpLongC.java +++ b/scribble-demos/scrib/http/src/http/longvers/HttpLongC.java @@ -30,19 +30,19 @@ import static http.longvers.HttpLong.Http.Http._200; import static http.longvers.HttpLong.Http.Http._404; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import org.scribble.util.Caller; import http.longvers.HttpLong.Http.Http; -import http.longvers.HttpLong.Http.channels.C.Http_C_1; -import http.longvers.HttpLong.Http.channels.C.Http_C_3; -import http.longvers.HttpLong.Http.channels.C.Http_C_4_Cases; -import http.longvers.HttpLong.Http.channels.C.Http_C_5; -import http.longvers.HttpLong.Http.channels.C.Http_C_5_Cases; -import http.longvers.HttpLong.Http.channels.C.ioifaces.Branch_C_S_200__S_404.Branch_C_S_200__S_404_Enum; import http.longvers.HttpLong.Http.roles.C; +import http.longvers.HttpLong.Http.statechans.C.Http_C_1; +import http.longvers.HttpLong.Http.statechans.C.Http_C_3; +import http.longvers.HttpLong.Http.statechans.C.Http_C_4_Cases; +import http.longvers.HttpLong.Http.statechans.C.Http_C_5; +import http.longvers.HttpLong.Http.statechans.C.Http_C_5_Cases; +import http.longvers.HttpLong.Http.statechans.C.ioifaces.Branch_C_S_200__S_404.Branch_C_S_200__S_404_Enum; import http.longvers.message.Body; import http.longvers.message.HttpLongMessageFormatter; import http.longvers.message.client.Host; @@ -72,7 +72,7 @@ public void run() throws Exception String host = "www.doc.ic.ac.uk"; int port = 80; //String host = "localhost"; int port = 8080; - client.connect(S, SocketChannelEndpoint::new, host, port); + client.request(S, SocketChannelEndpoint::new, host, port); doResponse( doRequest(new Http_C_1(client), host) @@ -138,7 +138,7 @@ public void run1() throws Exception String host = "www.doc.ic.ac.uk"; int port = 80; //String host = "localhost"; int port = 8080; - se.connect(S, SocketChannelEndpoint::new, host, port); + se.request(S, SocketChannelEndpoint::new, host, port); Http_C_1 s1 = new Http_C_1(se); diff --git a/scribble-demos/scrib/http/src/http/longvers/HttpLongS.java b/scribble-demos/scrib/http/src/http/longvers/HttpLongS.java index 3667964d8..375d8c8cf 100644 --- a/scribble-demos/scrib/http/src/http/longvers/HttpLongS.java +++ b/scribble-demos/scrib/http/src/http/longvers/HttpLongS.java @@ -13,16 +13,16 @@ */ package http.longvers; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import http.longvers.HttpLong.Http.Http; -import http.longvers.HttpLong.Http.channels.S.Http_S_1; -import http.longvers.HttpLong.Http.channels.S.Http_S_2; -import http.longvers.HttpLong.Http.channels.S.Http_S_2_Cases; import http.longvers.HttpLong.Http.roles.S; +import http.longvers.HttpLong.Http.statechans.S.Http_S_1; +import http.longvers.HttpLong.Http.statechans.S.Http_S_2; +import http.longvers.HttpLong.Http.statechans.S.Http_S_2_Cases; import http.longvers.message.Body; import http.longvers.message.HttpLongMessageFormatter; import http.longvers.message.client.Accept; diff --git a/scribble-demos/scrib/http/src/http/longvers/message/HttpLongMessage.java b/scribble-demos/scrib/http/src/http/longvers/message/HttpLongMessage.java index edad3cf62..661e6926a 100644 --- a/scribble-demos/scrib/http/src/http/longvers/message/HttpLongMessage.java +++ b/scribble-demos/scrib/http/src/http/longvers/message/HttpLongMessage.java @@ -13,7 +13,7 @@ */ package http.longvers.message; -import org.scribble.runtime.net.ScribMessage; +import org.scribble.runtime.message.ScribMessage; import org.scribble.type.name.Op; import http.longvers.HttpLong.Http.Http; diff --git a/scribble-demos/scrib/http/src/http/longvers/message/HttpLongMessageFormatter.java b/scribble-demos/scrib/http/src/http/longvers/message/HttpLongMessageFormatter.java index 02f1eb7df..450227d54 100644 --- a/scribble-demos/scrib/http/src/http/longvers/message/HttpLongMessageFormatter.java +++ b/scribble-demos/scrib/http/src/http/longvers/message/HttpLongMessageFormatter.java @@ -19,8 +19,8 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.runtime.net.ScribMessageFormatter; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.runtime.message.ScribMessageFormatter; import http.longvers.message.client.Accept; import http.longvers.message.client.AcceptEncoding; diff --git a/scribble-demos/scrib/http/src/http/shortvers/HttpShortC.java b/scribble-demos/scrib/http/src/http/shortvers/HttpShortC.java index 66056f347..5ed8838e6 100644 --- a/scribble-demos/scrib/http/src/http/shortvers/HttpShortC.java +++ b/scribble-demos/scrib/http/src/http/shortvers/HttpShortC.java @@ -17,12 +17,12 @@ import static http.shortvers.HttpShort.Http.Http.RESPONSE; import static http.shortvers.HttpShort.Http.Http.S; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.util.Buf; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.net.SocketChannelEndpoint; import http.shortvers.HttpShort.Http.Http; -import http.shortvers.HttpShort.Http.channels.C.Http_C_1; +import http.shortvers.HttpShort.Http.statechans.C.Http_C_1; import http.shortvers.HttpShort.Http.roles.C; import http.shortvers.message.HttpShortMessageFormatter; import http.shortvers.message.client.Request; @@ -48,7 +48,7 @@ public void run() throws Exception String host = "www.doc.ic.ac.uk"; int port = 80; //String host = "localhost"; int port = 8080; - client.connect(S, SocketChannelEndpoint::new, host, port); + client.request(S, SocketChannelEndpoint::new, host, port); Buf buf = new Buf<>(); new Http_C_1(client) diff --git a/scribble-demos/scrib/http/src/http/shortvers/HttpShortS.java b/scribble-demos/scrib/http/src/http/shortvers/HttpShortS.java index 7734305d4..014df49d8 100644 --- a/scribble-demos/scrib/http/src/http/shortvers/HttpShortS.java +++ b/scribble-demos/scrib/http/src/http/shortvers/HttpShortS.java @@ -20,14 +20,14 @@ import java.io.IOException; import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; import http.shortvers.HttpShort.Http.Http; -import http.shortvers.HttpShort.Http.channels.S.Http_S_1; -import http.shortvers.HttpShort.Http.channels.S.Http_S_2; +import http.shortvers.HttpShort.Http.statechans.S.Http_S_1; +import http.shortvers.HttpShort.Http.statechans.S.Http_S_2; import http.shortvers.HttpShort.Http.roles.S; import http.shortvers.message.HttpShortMessageFormatter; import http.shortvers.message.client.Request; diff --git a/scribble-demos/scrib/http/src/http/shortvers/message/HttpShortMessage.java b/scribble-demos/scrib/http/src/http/shortvers/message/HttpShortMessage.java index d6124ab35..b1fc73f39 100644 --- a/scribble-demos/scrib/http/src/http/shortvers/message/HttpShortMessage.java +++ b/scribble-demos/scrib/http/src/http/shortvers/message/HttpShortMessage.java @@ -13,7 +13,7 @@ */ package http.shortvers.message; -import org.scribble.runtime.net.ScribMessage; +import org.scribble.runtime.message.ScribMessage; import org.scribble.type.name.Op; import http.shortvers.HttpShort.Http.Http; diff --git a/scribble-demos/scrib/http/src/http/shortvers/message/HttpShortMessageFormatter.java b/scribble-demos/scrib/http/src/http/shortvers/message/HttpShortMessageFormatter.java index 17bf3b872..87ed0623c 100644 --- a/scribble-demos/scrib/http/src/http/shortvers/message/HttpShortMessageFormatter.java +++ b/scribble-demos/scrib/http/src/http/shortvers/message/HttpShortMessageFormatter.java @@ -20,8 +20,8 @@ import java.nio.charset.Charset; import java.util.Arrays; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.runtime.net.ScribMessageFormatter; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.runtime.message.ScribMessageFormatter; import http.shortvers.message.client.Request; import http.shortvers.message.server.Response; diff --git a/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java b/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java index c00064ce6..816018f1f 100644 --- a/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java +++ b/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java @@ -38,17 +38,17 @@ import org.scribble.runtime.util.Buf; import smtp.Smtp.Smtp.Smtp; -import smtp.Smtp.Smtp.channels.C.Smtp_C_1; -import smtp.Smtp.Smtp.channels.C.Smtp_C_10; -import smtp.Smtp.Smtp.channels.C.Smtp_C_11_Cases; -import smtp.Smtp.Smtp.channels.C.Smtp_C_4; -import smtp.Smtp.Smtp.channels.C.Smtp_C_6; -import smtp.Smtp.Smtp.channels.C.Smtp_C_8; -import smtp.Smtp.Smtp.channels.C.Smtp_C_9_Cases; -import smtp.Smtp.Smtp.channels.C.ioifaces.Branch_C_S_250__S_250d; -import smtp.Smtp.Smtp.channels.C.ioifaces.Case_C_S_250__S_250d; -import smtp.Smtp.Smtp.channels.C.ioifaces.Select_C_S_Ehlo; -import smtp.Smtp.Smtp.channels.C.ioifaces.Succ_In_S_250; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_1; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_10; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_11_Cases; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_4; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_6; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_8; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_9_Cases; +import smtp.Smtp.Smtp.statechans.C.ioifaces.Branch_C_S_250__S_250d; +import smtp.Smtp.Smtp.statechans.C.ioifaces.Case_C_S_250__S_250d; +import smtp.Smtp.Smtp.statechans.C.ioifaces.Select_C_S_Ehlo; +import smtp.Smtp.Smtp.statechans.C.ioifaces.Succ_In_S_250; import smtp.Smtp.Smtp.roles.C; import smtp.message.SmtpMessageFormatter; import smtp.message.client.Auth; diff --git a/scribble-demos/scrib/smtp/src/smtp/SmtpC.java b/scribble-demos/scrib/smtp/src/smtp/SmtpC.java index 7813be0fe..3a89c07cd 100644 --- a/scribble-demos/scrib/smtp/src/smtp/SmtpC.java +++ b/scribble-demos/scrib/smtp/src/smtp/SmtpC.java @@ -40,20 +40,20 @@ import org.scribble.runtime.util.Buf; import smtp.Smtp.Smtp.Smtp; -import smtp.Smtp.Smtp.channels.C.EndSocket; -import smtp.Smtp.Smtp.channels.C.Smtp_C_1; -import smtp.Smtp.Smtp.channels.C.Smtp_C_10; -import smtp.Smtp.Smtp.channels.C.Smtp_C_11_Cases; -import smtp.Smtp.Smtp.channels.C.Smtp_C_12; -import smtp.Smtp.Smtp.channels.C.Smtp_C_2; -import smtp.Smtp.Smtp.channels.C.Smtp_C_3; -import smtp.Smtp.Smtp.channels.C.Smtp_C_3_Cases; -import smtp.Smtp.Smtp.channels.C.Smtp_C_4; -import smtp.Smtp.Smtp.channels.C.Smtp_C_6; -import smtp.Smtp.Smtp.channels.C.Smtp_C_7; -import smtp.Smtp.Smtp.channels.C.Smtp_C_7_Cases; -import smtp.Smtp.Smtp.channels.C.Smtp_C_8; -import smtp.Smtp.Smtp.channels.C.Smtp_C_9_Cases; +import smtp.Smtp.Smtp.statechans.C.EndSocket; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_1; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_10; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_11_Cases; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_12; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_2; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_3; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_3_Cases; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_4; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_6; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_7; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_7_Cases; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_8; +import smtp.Smtp.Smtp.statechans.C.Smtp_C_9_Cases; import smtp.Smtp.Smtp.roles.C; import smtp.message.SmtpMessageFormatter; import smtp.message.client.Auth; diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index f8f6d3d91..5ea52f26a 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -12,11 +12,11 @@ import org.scribble.runtime.session.MPSTEndpoint; import test.test2.Test2.Proto1.Proto1; -import test.test2.Test2.Proto1.channels.A.Proto1_A_1; import test.test2.Test2.Proto1.handlers.A.Proto1_A; import test.test2.Test2.Proto1.handlers.states.A.Proto1_A_5; import test.test2.Test2.Proto1.handlers.states.A.messages.Proto1_A_5__2; -import test.test2.Test2.Proto1.roles.A;; +import test.test2.Test2.Proto1.roles.A; +import test.test2.Test2.Proto1.statechans.A.Proto1_A_1; // TODO: test interop between ED API and SC API (also for sig messages) public class MyA @@ -76,8 +76,8 @@ public static void foo1() { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); - new Proto1_A_1(a).send(B, _1); - //new Proto1_A_1(a).send(B, _2); + new Proto1_A_1(a).send(B, _1, 123); + //new Proto1_A_1(a).send(B, _2, "abc"); } catch (Exception e) { diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java index f7c8b52c5..fb39904cc 100644 --- a/scribble-test/src/test/scrib/test/test2/MyB.java +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -11,11 +11,9 @@ import org.scribble.runtime.net.ScribServerSocket; import org.scribble.runtime.net.SocketChannelServer; import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import test.test2.Test2.Proto1.Proto1; -import test.test2.Test2.Proto1.channels.B.EndSocket; -import test.test2.Test2.Proto1.channels.B.Proto1_B_1; -import test.test2.Test2.Proto1.channels.B.Proto1_B_1_Handler; import test.test2.Test2.Proto1.handlers.B.Proto1_B; import test.test2.Test2.Proto1.handlers.B.Proto1_B_10_Branch; import test.test2.Test2.Proto1.handlers.states.B.Proto1_B_10; @@ -23,6 +21,9 @@ import test.test2.Test2.Proto1.ops._2; import test.test2.Test2.Proto1.roles.A; import test.test2.Test2.Proto1.roles.B; +import test.test2.Test2.Proto1.statechans.B.EndSocket; +import test.test2.Test2.Proto1.statechans.B.Proto1_B_1; +import test.test2.Test2.Proto1.statechans.B.Proto1_B_1_Handler; public class MyB { @@ -105,13 +106,13 @@ public static void foo1() throws IOException, ScribbleRuntimeException class MyHandler implements Proto1_B_1_Handler { @Override - public void receive(EndSocket schan, _1 op) throws org.scribble.main.ScribbleRuntimeException, java.io.IOException, ClassNotFoundException + public void receive(EndSocket schan, _1 op, Buf arg1) throws ScribbleRuntimeException, IOException, ClassNotFoundException { System.out.println("Done 1"); } @Override - public void receive(EndSocket schan, _2 op) throws org.scribble.main.ScribbleRuntimeException, java.io.IOException, ClassNotFoundException + public void receive(EndSocket schan, _2 op, Buf arg1) throws ScribbleRuntimeException, IOException, ClassNotFoundException { System.out.println("Done 1"); } From ba21c27ed22c1b4f47d67d6723f0ee666453662b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 8 Mar 2018 23:10:55 +0000 Subject: [PATCH 035/539] Minor renaming of ED to CB. --- .../src/main/java/org/scribble/cli/CLArgParser.java | 2 +- .../src/main/java/org/scribble/cli/CommandLine.java | 4 ++-- .../CBEndpointApiGenerator.java} | 10 +++++----- .../CBSessionApiBuilder.java} | 6 +++--- .../{EventDrivenEndpoint.java => CBEndpoint.java} | 8 ++++---- 5 files changed, 15 insertions(+), 15 deletions(-) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{eventdrivenapi/EDEndpointApiGenerator.java => callbackapi/CBEndpointApiGenerator.java} (98%) rename scribble-codegen/src/main/java/org/scribble/codegen/java/{eventdrivenapi/EDSessionApiBuilder.java => callbackapi/CBSessionApiBuilder.java} (70%) rename scribble-runtime/src/main/java/org/scribble/runtime/session/{EventDrivenEndpoint.java => CBEndpoint.java} (93%) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java index 6a989ee48..cfe769aed 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java @@ -55,7 +55,7 @@ public class CLArgParser public static final String SESSION_API_GEN_FLAG = "-sessapi"; public static final String STATECHAN_API_GEN_FLAG = "-chanapi"; - public static final String EVENTDRIVEN_API_GEN_FLAG = "-edapi"; + public static final String EVENTDRIVEN_API_GEN_FLAG = "-cbapi"; private static final Map UNIQUE_FLAGS = new HashMap<>(); { diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index c9cd67c60..bc296536c 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -27,7 +27,7 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.global.GProtocolDecl; import org.scribble.codegen.java.JEndpointApiGenerator; -import org.scribble.codegen.java.eventdrivenapi.EDEndpointApiGenerator; +import org.scribble.codegen.java.callbackapi.CBEndpointApiGenerator; import org.scribble.main.AntlrSourceException; import org.scribble.main.Job; import org.scribble.main.JobContext; @@ -442,7 +442,7 @@ private void outputEventDrivenApi(Job job) throws ScribbleException, CommandLine { GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); Role self = checkRoleArg(jcontext, fullname, args[i+1]); - EDEndpointApiGenerator edgen = new EDEndpointApiGenerator(job, fullname, self, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); + CBEndpointApiGenerator edgen = new CBEndpointApiGenerator(job, fullname, self, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); Map out = edgen.build(); outputClasses(out); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/eventdrivenapi/EDEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java similarity index 98% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/eventdrivenapi/EDEndpointApiGenerator.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 158b6f81f..26cd2f16c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/eventdrivenapi/EDEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -1,4 +1,4 @@ -package org.scribble.codegen.java.eventdrivenapi; +package org.scribble.codegen.java.callbackapi; import java.util.HashMap; import java.util.HashSet; @@ -26,7 +26,7 @@ // FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) // From ParamCoreEndpointApiGenerator -public class EDEndpointApiGenerator +public class CBEndpointApiGenerator { public final Job job; public final GProtocolName proto; @@ -34,7 +34,7 @@ public class EDEndpointApiGenerator private final boolean subtypes; - public EDEndpointApiGenerator(Job job, GProtocolName fullname, Role self, boolean subtypes) + public CBEndpointApiGenerator(Job job, GProtocolName fullname, Role self, boolean subtypes) { this.job = job; this.proto = fullname; @@ -57,10 +57,10 @@ public Map build() throws ScribbleException public Map buildSessionApi() throws ScribbleException // FIXME: factor out -- integrate with JEndpointApiGenerator { - this.job.debugPrintln("\n[param-core] Running " + EDEndpointApiGenerator.class + " for " + this.proto + "@" + this.self); + this.job.debugPrintln("\n[param-core] Running " + CBEndpointApiGenerator.class + " for " + this.proto + "@" + this.self); Map res = new HashMap<>(); - res.putAll(new EDSessionApiBuilder(this.job, this.proto).generateApi()); + res.putAll(new CBSessionApiBuilder(this.job, this.proto).generateApi()); res.putAll(buildEndpointClass()); return res; } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/eventdrivenapi/EDSessionApiBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBSessionApiBuilder.java similarity index 70% rename from scribble-codegen/src/main/java/org/scribble/codegen/java/eventdrivenapi/EDSessionApiBuilder.java rename to scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBSessionApiBuilder.java index fb6b937a8..0abc9bab4 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/eventdrivenapi/EDSessionApiBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBSessionApiBuilder.java @@ -1,4 +1,4 @@ -package org.scribble.codegen.java.eventdrivenapi; +package org.scribble.codegen.java.callbackapi; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.main.Job; @@ -6,9 +6,9 @@ import org.scribble.type.name.GProtocolName; // FIXME: deprecate -- same as SessionApiGenerator, just use that directly -public class EDSessionApiBuilder extends SessionApiGenerator +public class CBSessionApiBuilder extends SessionApiGenerator { - public EDSessionApiBuilder(Job job, GProtocolName fullname) throws ScribbleException + public CBSessionApiBuilder(Job job, GProtocolName fullname) throws ScribbleException { super(job, fullname); } diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/EventDrivenEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java similarity index 93% rename from scribble-runtime/src/main/java/org/scribble/runtime/session/EventDrivenEndpoint.java rename to scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java index 43de40a9d..6561f8a1b 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/EventDrivenEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java @@ -34,7 +34,7 @@ import org.scribble.runtime.message.ScribMessageFormatter; import org.scribble.type.name.Role; -public class EventDrivenEndpoint extends MPSTEndpoint +public class CBEndpoint extends MPSTEndpoint { protected final ScribState init; protected final Map> outputs = new HashMap<>(); @@ -44,7 +44,7 @@ public class EventDrivenEndpoint extends M protected final Map states = new HashMap<>(); // Bypass problem of mutual references and static field initialisation (class loading) - public EventDrivenEndpoint(S sess, R self, ScribMessageFormatter smf, ScribState init, D data) throws IOException, ScribbleRuntimeException + public CBEndpoint(S sess, R self, ScribMessageFormatter smf, ScribState init, D data) throws IOException, ScribbleRuntimeException { super(sess, self, smf); this.init = init; @@ -58,10 +58,10 @@ public Future run() throws ScribbleRuntimeException // FIXME: integrate with selector new Thread() { - private final EventDrivenEndpoint edep; + private final CBEndpoint edep; { - this.edep = EventDrivenEndpoint.this; + this.edep = CBEndpoint.this; } public void run() From 4d414e285a7f84759525530742de4ceeb5427664 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 8 Mar 2018 23:30:12 +0000 Subject: [PATCH 036/539] Minor. --- .../codegen/java/callbackapi/CBEndpointApiGenerator.java | 1 - .../java/org/scribble/runtime/handlers/ScribOutputEvent.java | 2 +- .../src/main/java/org/scribble/runtime/session/CBEndpoint.java | 1 + scribble-test/src/test/scrib/test/test4/MyA.java | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 26cd2f16c..d07bff197 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -522,7 +522,6 @@ private String generateRegister(GProtocolName gpn, Role self, EState s) String T = s.getAllActions().stream().map(a -> SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + ".interfaces." + name + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining("")) + "").collect(Collectors.joining(" & ")) + " & org.scribble.runtime.handlers.ScribBranch"; - // FIXME: EventDrivenEndpoint will cast to Branch for dispatch -- not guaranteed by implementation of receive i/f's res += "public " + "\n" + name + " icallback(" + prefix + name + "_" + s.id + " sid, T" diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java index 6a644769e..dc414a40f 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java @@ -4,7 +4,7 @@ import org.scribble.type.name.Op; import org.scribble.type.name.Role; -// FIXME: integrate with ScribMessage (maybe rename latter to ScribRuntimeMessage -- or rename this to ScribDirectedMessage) +// FIXME: make interface and add to bounds of output icallback -- cf. CBEndpointApiGenerator // FIXME: not serializable due to RoleKind (in Role) public abstract class ScribOutputEvent extends ScribMessage { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java index 6561f8a1b..b4874e421 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java @@ -73,6 +73,7 @@ public void run() { if (curr instanceof ScribOutputState) { + // FIXME: make ScribOutputEvent an interface and add to bounds of output icallback (to preclude dynamic cast check) ScribOutputEvent m = (ScribOutputEvent) this.edep.outputs.get(curr).apply(this.edep.data); // FIXME: state object /*getChannelEndpoint(m.getPeer()).write(new ScribMessage(m.getOp(), m.getPayload().toArray(new Object[0]))); // FIXME: ScribEvent has extra Role curr = this.edep.states.get(((ScribOutputState) curr).succs.get(m.getOp()));*/ diff --git a/scribble-test/src/test/scrib/test/test4/MyA.java b/scribble-test/src/test/scrib/test/test4/MyA.java index 9d5c08e03..47188eeb5 100644 --- a/scribble-test/src/test/scrib/test/test4/MyA.java +++ b/scribble-test/src/test/scrib/test/test4/MyA.java @@ -27,7 +27,7 @@ public static void main(String[] args) throws IOException a.request(B, SocketChannelEndpoint::new, "localhost", 8888); a.icallback(Proto1_A_6.id, - x -> (x[0]++ < 5) ? new Proto1_A_Foo(B, new Foo("abc")) : new Proto1_A_Bar(B, new Bar(123)) + x -> (x[0]++ < 5) ? new Proto1_A_Foo(B, new Foo("abc" + x[0])) : new Proto1_A_Bar(B, new Bar(123)) ); // FIXME: remove sid from message class for sigs From 604dc3e1a346c1ce68de69decb8c5d55ee2573df Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 9 Mar 2018 12:10:16 +0000 Subject: [PATCH 037/539] Refactored ScribOutputEvent in CB API gen as an interface. --- .../callbackapi/CBEndpointApiGenerator.java | 30 ++++++++++--------- .../runtime/handlers/ScribOutputEvent.java | 17 ++--------- .../scribble/runtime/session/CBEndpoint.java | 10 +++---- .../src/test/scrib/test/test2/Test2.scr | 2 +- .../src/test/scrib/test/test3/Test3.scr | 2 +- .../src/test/scrib/test/test4/Test4.scr | 2 +- .../src/test/scrib/test/test5/Test5.scr | 2 +- .../src/test/scrib/test/test6/Test6.scr | 2 +- .../src/test/scrib/test/test7/Test7.scr | 2 +- 9 files changed, 30 insertions(+), 39 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index d07bff197..09250c5ac 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -86,7 +86,7 @@ public Map buildEndpointClass() throws ScribbleException epClass += "import java.util.HashMap;\n"; epClass += "import java.util.Map;\n";*/ epClass += "\n"; - epClass += "public class " + name + " extends org.scribble.runtime.session.EventDrivenEndpoint<" + sess + ", " + role + ", D> {\n"; + epClass += "public class " + name + " extends org.scribble.runtime.session.CBEndpoint<" + sess + ", " + role + ", D> {\n"; /*epClass += "private final Map> outputs = new HashMap<>();\n"; epClass += "\n";*/ @@ -199,12 +199,12 @@ public Map buildEndpointClass() throws ScribbleException String messageAbstract = ""; messageAbstract += "package " + pack + ".handlers.states." + this.self + ".messages;\n"; messageAbstract += "\n"; - messageAbstract += "public abstract class " + messageAbstractName + " extends org.scribble.runtime.handlers.ScribOutputEvent implements " + pack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName + " {\n"; - messageAbstract += "private static final long serialVersionUID = 1L;\n"; + messageAbstract += "public interface " + messageAbstractName + " extends org.scribble.runtime.handlers.ScribOutputEvent, " + pack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName + " {\n"; + /*messageAbstract += "private static final long serialVersionUID = 1L;\n"; messageAbstract += "\n"; messageAbstract += "public " + messageAbstractName + "(org.scribble.type.name.Role peer, org.scribble.type.name.Op op, Object... payload) {\n"; messageAbstract += "super(peer, op, payload);\n"; - messageAbstract += "}\n"; + messageAbstract += "}\n";*/ messageAbstract += "}\n"; res.put(mprefix + messageAbstractName + ".java", messageAbstract); @@ -239,10 +239,11 @@ public Map buildEndpointClass() throws ScribbleException String messageClass = ""; messageClass += "package " + pack + ".handlers.states." + this.self + ".messages;\n"; messageClass += "\n"; - messageClass += "public class " + messageName + " extends " + messageAbstractName; //+ " implements " + pack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName; + // extends ScribMessage just for convenience of storing payload (peer/op pre-known) -- instances of this class never "directly" sent, cf., CBEndpoint + messageClass += "public class " + messageName + " extends org.scribble.runtime.message.ScribMessage implements " + messageAbstractName; //+ " implements " + pack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName; if (isSig) { - messageClass += " implements org.scribble.runtime.handlers.ScribSigMessage"; + messageClass += ", org.scribble.runtime.handlers.ScribSigMessage"; } messageClass += " {\n"; //messageClass += "public final java.util.List pay = new java.util.LinkedList<>();\n"; @@ -271,7 +272,7 @@ public Map buildEndpointClass() throws ScribbleException { messageClass += "this.pay.add(arg" + j + ");\n"; }*/ - messageClass += "super(peer, " + messageClass += "super(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + IntStream.rangeClosed(1, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining("")) + ");\n"; if (isSig) @@ -279,7 +280,7 @@ public Map buildEndpointClass() throws ScribbleException messageClass += "this.m = m;\n"; } messageClass += "}\n"; - /*messageClass += "\n"; + messageClass += "\n"; messageClass += "@Override\n"; messageClass += "public org.scribble.type.name.Role getPeer() {\n"; messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ";\n"; @@ -291,9 +292,9 @@ public Map buildEndpointClass() throws ScribbleException messageClass += "}\n"; messageClass += "\n"; messageClass += "@Override\n"; - messageClass += "public java.util.List getPayload() {\n"; - messageClass += "return this.pay;\n"; - messageClass += "}\n";*/ + messageClass += "public Object[] getPayload() {\n"; + messageClass += "return this.payload;\n"; + messageClass += "}\n"; if (isSig) { messageClass += "\n"; @@ -484,9 +485,10 @@ private String generateRegister(GProtocolName gpn, Role self, EState s) }*/ String messageIfName = name + s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); - res += "public " + name + " icallback(" + prefix + name + "_" + s.id - + " sid, java.util.function.Function h) {\n"; // FIXME: factor out + res += "public\n" + + "\n" // FIXME: factor out + + name + " icallback(" + prefix + name + "_" + s.id + + " sid, java.util.function.Function h) {\n"; res += "this.outputs.put(sid, h);\n"; res += "return this;\n"; res += "}\n"; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java index dc414a40f..5b86f9132 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java @@ -1,24 +1,13 @@ package org.scribble.runtime.handlers; -import org.scribble.runtime.message.ScribMessage; import org.scribble.type.name.Op; import org.scribble.type.name.Role; // FIXME: make interface and add to bounds of output icallback -- cf. CBEndpointApiGenerator // FIXME: not serializable due to RoleKind (in Role) -public abstract class ScribOutputEvent extends ScribMessage +public interface ScribOutputEvent { - private static final long serialVersionUID = 1L; - - public final Role peer; - - public ScribOutputEvent(Role peer, Op op, Object... payload) - { - super(op, payload); - this.peer = peer; - } - - /*Role getPeer(); + Role getPeer(); Op getOp(); - List getPayload();*/ + Object[] getPayload(); } diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java index b4874e421..ac3a06f1d 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java @@ -37,7 +37,7 @@ public class CBEndpoint extends MPSTEndpoint { protected final ScribState init; - protected final Map> outputs = new HashMap<>(); + protected final Map> outputs = new HashMap<>(); protected final Map> inputs = new HashMap<>(); protected final D data; @@ -73,19 +73,19 @@ public void run() { if (curr instanceof ScribOutputState) { - // FIXME: make ScribOutputEvent an interface and add to bounds of output icallback (to preclude dynamic cast check) + // FIXME: make ScribOutputEvent an interface and add to bounds of output icallback (to preclude dynamic cast check) -- also make generated ..._Message an interface ScribOutputEvent m = (ScribOutputEvent) this.edep.outputs.get(curr).apply(this.edep.data); // FIXME: state object /*getChannelEndpoint(m.getPeer()).write(new ScribMessage(m.getOp(), m.getPayload().toArray(new Object[0]))); // FIXME: ScribEvent has extra Role curr = this.edep.states.get(((ScribOutputState) curr).succs.get(m.getOp()));*/ if (m instanceof ScribSigMessage) { - getChannelEndpoint(m.peer).write(((ScribSigMessage) m).getSig()); + getChannelEndpoint(m.getPeer()).write(((ScribSigMessage) m).getSig()); } else { - getChannelEndpoint(m.peer).write(new ScribMessage(m.op, m.payload)); // FIXME: ScribEvent has extra Role (RoleKind not serializable) + getChannelEndpoint(m.getPeer()).write(new ScribMessage(m.getOp(), m.getPayload())); // API gen extends ScribMessage, but no guarantee about user-defined types -- can only rely on ScribOutputEvent i/f } - curr = this.edep.states.get(((ScribOutputState) curr).succs.get(m.op)); + curr = this.edep.states.get(((ScribOutputState) curr).succs.get(m.getOp())); } else if (curr instanceof ScribInputState) { diff --git a/scribble-test/src/test/scrib/test/test2/Test2.scr b/scribble-test/src/test/scrib/test/test2/Test2.scr index 9cf9d0e41..33fda4133 100644 --- a/scribble-test/src/test/scrib/test/test2/Test2.scr +++ b/scribble-test/src/test/scrib/test/test2/Test2.scr @@ -1,4 +1,4 @@ -//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test2/Test2.scr -d scribble-test/src/test/scrib/ -edapi Proto1 A -edapi Proto1 B +//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test2/Test2.scr -d scribble-test/src/test/scrib/ -cbapi Proto1 A -cbapi Proto1 B //$ javadoc -cp scribble-cli/target/classes/';'scribble-test/target/classes';'scribble-parser/target/classes';'scribble-parser/lib/antlr-3.5.2-complete.jar';'scrib-core/src/test/scrib scrib-core/src/test/scrib/test/test2/Proto1*.java -d test/doc/test2 module test.test2.Test2; diff --git a/scribble-test/src/test/scrib/test/test3/Test3.scr b/scribble-test/src/test/scrib/test/test3/Test3.scr index 8a452b5ef..eda0bfd32 100644 --- a/scribble-test/src/test/scrib/test/test3/Test3.scr +++ b/scribble-test/src/test/scrib/test/test3/Test3.scr @@ -1,4 +1,4 @@ -//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test3/Test3.scr -d scribble-test/src/test/scrib/ -edapi Proto1 A -edapi Proto1 B -edapi Proto1 C +//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test3/Test3.scr -d scribble-test/src/test/scrib/ -cbapi Proto1 A -cbapi Proto1 B -cbapi Proto1 C //$ javadoc -cp scribble-cli/target/classes/';'scribble-test/target/classes';'scribble-parser/target/classes';'scribble-parser/lib/antlr-3.5.2-complete.jar';'scrib-core/src/test/scrib scrib-core/src/test/scrib/test/test3/Proto1*.java -d test/doc/test3 module test.test3.Test3; diff --git a/scribble-test/src/test/scrib/test/test4/Test4.scr b/scribble-test/src/test/scrib/test/test4/Test4.scr index f0cecfee5..2c729455a 100644 --- a/scribble-test/src/test/scrib/test/test4/Test4.scr +++ b/scribble-test/src/test/scrib/test/test4/Test4.scr @@ -1,4 +1,4 @@ -//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test4/Test4.scr -d scribble-test/src/test/scrib/ -edapi Proto1 A -edapi Proto1 B +//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test4/Test4.scr -d scribble-test/src/test/scrib/ -cbapi Proto1 A -cbapi Proto1 B //$ javadoc -cp scribble-cli/target/classes/';'scribble-test/target/classes';'scribble-parser/target/classes';'scribble-parser/lib/antlr-3.5.2-complete.jar';'scrib-core/src/test/scrib scrib-core/src/test/scrib/test/test4/Proto1*.java -d test/doc/test4 module test.test4.Test4; diff --git a/scribble-test/src/test/scrib/test/test5/Test5.scr b/scribble-test/src/test/scrib/test/test5/Test5.scr index 041332fb9..461dd018b 100644 --- a/scribble-test/src/test/scrib/test/test5/Test5.scr +++ b/scribble-test/src/test/scrib/test/test5/Test5.scr @@ -1,4 +1,4 @@ -//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test5/Test5.scr -d scribble-test/src/test/scrib/ -edapi Proto1 A -edapi Proto1 B -edapi Proto1 C +//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test5/Test5.scr -d scribble-test/src/test/scrib/ -cbapi Proto1 A -cbapi Proto1 B -cbapi Proto1 C //$ javadoc -cp scribble-cli/target/classes/';'scribble-test/target/classes';'scribble-parser/target/classes';'scribble-parser/lib/antlr-3.5.2-complete.jar';'scrib-core/src/test/scrib scrib-core/src/test/scrib/test/test5/Proto1*.java -d test/doc/test5 module test.test5.Test5; diff --git a/scribble-test/src/test/scrib/test/test6/Test6.scr b/scribble-test/src/test/scrib/test/test6/Test6.scr index 9c43eecbf..e375d4651 100644 --- a/scribble-test/src/test/scrib/test/test6/Test6.scr +++ b/scribble-test/src/test/scrib/test/test6/Test6.scr @@ -1,4 +1,4 @@ -//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test6/Test6.scr -d scribble-test/src/test/scrib/ -edapi Proto1 A -edapi Proto1 B +//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test6/Test6.scr -d scribble-test/src/test/scrib/ -cbapi Proto1 A -cbapi Proto1 B //$ javadoc -cp scribble-cli/target/classes/';'scribble-test/target/classes';'scribble-parser/target/classes';'scribble-parser/lib/antlr-3.5.2-complete.jar';'scrib-core/src/test/scrib scrib-core/src/test/scrib/test/test6/Proto1*.java -d test/doc/test6 module test.test6.Test6; diff --git a/scribble-test/src/test/scrib/test/test7/Test7.scr b/scribble-test/src/test/scrib/test/test7/Test7.scr index 22b8d7cdc..197730008 100644 --- a/scribble-test/src/test/scrib/test/test7/Test7.scr +++ b/scribble-test/src/test/scrib/test/test7/Test7.scr @@ -1,4 +1,4 @@ -//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test7/Test7.scr -d scribble-test/src/test/scrib/ -edapi Proto1 A -edapi Proto1 B +//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test7/Test7.scr -d scribble-test/src/test/scrib/ -cbapi Proto1 A -cbapi Proto1 B //$ javadoc -cp scribble-cli/target/classes/';'scribble-test/target/classes';'scribble-parser/target/classes';'scribble-parser/lib/antlr-3.5.2-complete.jar';'scrib-core/src/test/scrib scrib-core/src/test/scrib/test/test7/Proto1*.java -d test/doc/test7 module test.test7.Test7; From 502ad08959a7ca875c52eade393910d17a6a9017 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 17 Mar 2018 18:29:08 +0000 Subject: [PATCH 038/539] Removed CBSessionApiBuilder. --- .../callbackapi/CBEndpointApiGenerator.java | 2 +- .../java/callbackapi/CBSessionApiBuilder.java | 20 ------------------- .../ioifaces/IOInterfacesGenerator.java | 1 + .../src/test/scrib/test/test2/MyA.java | 3 +++ 4 files changed, 5 insertions(+), 21 deletions(-) delete mode 100644 scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBSessionApiBuilder.java diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 09250c5ac..b952ad03a 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -60,7 +60,7 @@ public Map buildSessionApi() throws ScribbleException // FIXME: this.job.debugPrintln("\n[param-core] Running " + CBEndpointApiGenerator.class + " for " + this.proto + "@" + this.self); Map res = new HashMap<>(); - res.putAll(new CBSessionApiBuilder(this.job, this.proto).generateApi()); + res.putAll(new SessionApiGenerator(this.job, this.proto).generateApi()); res.putAll(buildEndpointClass()); return res; } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBSessionApiBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBSessionApiBuilder.java deleted file mode 100644 index 0abc9bab4..000000000 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBSessionApiBuilder.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.scribble.codegen.java.callbackapi; - -import org.scribble.codegen.java.sessionapi.SessionApiGenerator; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; -import org.scribble.type.name.GProtocolName; - -// FIXME: deprecate -- same as SessionApiGenerator, just use that directly -public class CBSessionApiBuilder extends SessionApiGenerator -{ - public CBSessionApiBuilder(Job job, GProtocolName fullname) throws ScribbleException - { - super(job, fullname); - } - - /*public Map build() // FIXME: factor out - { - return Collections.emptyMap(); - }*/ -} diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index f78042a05..c5e1acfed 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -50,6 +50,7 @@ // TODO: concrete state channel "to" casts for supertype i/f's (the info is there in the Java type hierachy though) // Maybe record subtype hierarchy explicitly // TODO: check if generated subtypes scalability issue is just Eclipse or also javac +// FIXME: try I/O i/f's with "message decomposition" approach (split op and each payload as separate messages) -- should make nominal interfaces more manageable -- cf. Sig messages public class IOInterfacesGenerator extends ApiGen { private final boolean SUBTYPES; diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index 5ea52f26a..021385ffe 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -33,9 +33,12 @@ public static void foo3() throws IOException { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); + //TODO: test choice at A { 1() from A to B; 2() from A to C; } or { 1() from A to C; 3() from A to B; } + a.icallback(Proto1_A_5.id, x -> //new Proto1_A_5__1(B, 123)); new Proto1_A_5__2(B, "abc")); + // new IntPay<>(B, _1, 123)); // IntPay -- or StrPay Future f = a.run(); // Even if registration checks still dynamic, much better to check at "session init" than partway through session after potential side effects f.get(); From e1045d6d3c7cfce441126af59c5b345ee8bb6cf2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 18 Mar 2018 11:56:49 +0000 Subject: [PATCH 039/539] Revising CB API gen. --- .../java/org/scribble/cli/CommandLine.java | 4 +- .../callbackapi/CBEndpointApiGenerator2.java | 499 ++++++++++++++++++ 2 files changed, 501 insertions(+), 2 deletions(-) create mode 100644 scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index bc296536c..b323ac920 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -27,7 +27,7 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.global.GProtocolDecl; import org.scribble.codegen.java.JEndpointApiGenerator; -import org.scribble.codegen.java.callbackapi.CBEndpointApiGenerator; +import org.scribble.codegen.java.callbackapi.CBEndpointApiGenerator2; import org.scribble.main.AntlrSourceException; import org.scribble.main.Job; import org.scribble.main.JobContext; @@ -442,7 +442,7 @@ private void outputEventDrivenApi(Job job) throws ScribbleException, CommandLine { GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); Role self = checkRoleArg(jcontext, fullname, args[i+1]); - CBEndpointApiGenerator edgen = new CBEndpointApiGenerator(job, fullname, self, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); + CBEndpointApiGenerator2 edgen = new CBEndpointApiGenerator2(job, fullname, self, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); Map out = edgen.build(); outputClasses(out); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java new file mode 100644 index 000000000..f0035b6b7 --- /dev/null +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java @@ -0,0 +1,499 @@ +package org.scribble.codegen.java.callbackapi; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.MessageSigNameDecl; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; +import org.scribble.main.Job; +import org.scribble.main.JobContext; +import org.scribble.main.ScribbleException; +import org.scribble.model.MState; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.EStateKind; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.DataType; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.PayloadElemType; +import org.scribble.type.name.Role; + +// FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) +public class CBEndpointApiGenerator2 +{ + public final Job job; + public final GProtocolName proto; + public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral + + private final boolean subtypes; // Generate full hierarchy (states -> states, not just indivdual state -> cases) -- cf. ioifaces + + public CBEndpointApiGenerator2(Job job, GProtocolName fullname, Role self, boolean subtypes) + { + this.job = job; + this.proto = fullname; + this.self = self; + + this.subtypes = subtypes; + if (this.subtypes) + { + throw new RuntimeException("TODO: -subtypes"); + } + } + + // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later + public Map build() throws ScribbleException + { + Map res = new HashMap<>(); // filepath -> source + res.putAll(buildSessionApi()); + return res; + } + + // FIXME: factor out -- integrate with JEndpointApiGenerator + public Map buildSessionApi() throws ScribbleException + { + this.job.debugPrintln("\n[param-core] Running " + CBEndpointApiGenerator2.class + " for " + this.proto + "@" + this.self); + + Map res = new HashMap<>(); + res.putAll(new SessionApiGenerator(this.job, this.proto).generateApi()); + res.putAll(buildEndpointClass()); + return res; + } + + public Map buildEndpointClass() throws ScribbleException + { + JobContext jc = this.job.getContext(); + EState init = (this.job.minEfsm ? jc.getMinimisedEGraph(this.proto, this.self) : jc.getEGraph(this.proto, this.self)).init; // FIXME: factor out with StateChannelApiGenerator constructor + Set states = new HashSet<>(); + states.add(init); + states.addAll(MState.getReachableStates(init)); + + // frontend handler class + String rootPack = SessionApiGenerator.getEndpointApiRootPackageName(this.proto); + String endpointName = this.proto.getSimpleName() + "_" + this.self; + String sess = rootPack + "." + this.proto.getSimpleName(); + + Map res = new HashMap<>(); + String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/" + this.self + "/"; // StateChannelApiGenerator#generateApi + String epClass = generateEndpointClass(rootPack, endpointName, sess, init, states); + res.put(prefix + endpointName + ".java", epClass); + + // states + String sprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/states/" + this.self + "/"; // StateChannelApiGenerator#generateApi + for (EState s : states) + { + EStateKind kind = s.getStateKind(); + String stateId = (kind == EStateKind.TERMINAL) ? "End" : endpointName + "_" + s.id; + String stateClass = generateStateClass(s, rootPack, kind, stateId); + res.put(sprefix + stateId + ".java", stateClass); + + // messages + if (s.getStateKind() == EStateKind.OUTPUT) + { + String mprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/states/" + this.self + "/messages/"; + + String messageIfName = endpointName + + s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); + String messageInterface = generateMessageInterface(s, messageIfName, endpointName, rootPack, mprefix); + res.put(mprefix + "interfaces/" + messageIfName + ".java", messageInterface); + + String messageAbstractName = endpointName + "_" + s.id + "_Message"; + String messageAbstract = generateMessageAbstract(messageIfName, messageAbstractName, endpointName, rootPack, mprefix); + res.put(mprefix + messageAbstractName + ".java", messageAbstract); + + for (EAction a : s.getAllActions()) + { + boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); + + String messageName = isSig + ? endpointName + "_" + SessionApiGenerator.getOpClassName(a.mid) + : endpointName + "_" + s.id + "_" + SessionApiGenerator.getOpClassName(a.mid); + String messageClass = generateMessageClass(isSig, messageName, jc, s, a, messageIfName, rootPack, messageAbstractName); + res.put(mprefix + messageName + ".java", messageClass); + } + } + + // branches + if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) + { + String bprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/" + this.self + "/"; + String branchName = endpointName + "_" + s.id + "_Branch"; + + for (EAction a : s.getAllActions()) + { + // FIXME: factor out + boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); + MessageSigNameDecl msnd = null; + if (isSig) + { + msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() + .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); + } + + String receiveIfName = endpointName + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()); + String receiveInterface = generateReceiveInterface(isSig, msnd, jc, a, rootPack, receiveIfName); + res.put(bprefix + "interfaces/" + receiveIfName + ".java", receiveInterface); + } + + String branchAbstract = generateBranch(bprefix, jc, s, endpointName, rootPack, branchName); + res.put(bprefix + branchName + ".java", branchAbstract); + } + } + + return res; + } + + String generateEndpointClass(String rootPack, String endpointName, String sess, EState init, Set states) + { + String role = SessionApiGenerator.getRolesPackageName(this.proto) + "." + this.self; + String epClass = ""; + + epClass += "package " + rootPack + ".handlers." + this.self + ";\n"; + epClass += "\n"; + epClass += "\n"; + epClass += "public class " + endpointName + " extends org.scribble.runtime.session.CBEndpoint<" + sess + ", " + role + ", D> {\n"; + + epClass += "public " + endpointName + "(" + sess + " sess, " + role + + " self, org.scribble.runtime.message.ScribMessageFormatter smf, D data) throws java.io.IOException, org.scribble.main.ScribbleRuntimeException {\n"; + epClass += "super(sess, self, smf, " + rootPack + ".handlers.states." + this.self + "." + endpointName + "_" + init.id + ".id" + ", data);\n"; // FIXME: factor out + for (EState s : states) + { + String tmp = (s.getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.id; + epClass += "this.states.put(\"" + tmp + "\", " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." + tmp + ".id);\n"; + } + epClass += "}\n"; + epClass += "\n"; + + + epClass += states.stream().map(s -> generateRegister(this.proto, this.self, s)).collect(Collectors.joining("\n")); + + epClass += "@Override\n"; + epClass += "public java.util.concurrent.Future run() throws org.scribble.main.ScribbleRuntimeException {\n"; + epClass += "java.util.Set states = java.util.stream.Stream.of(" + states.stream().filter(s -> s.getStateKind() != EStateKind.TERMINAL).map(s -> + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." + this.proto.getSimpleName() + "_" + this.self + "_" + s.id + ".id").collect(Collectors.joining(", ")) + ").collect(java.util.stream.Collectors.toSet());\n"; + epClass += "java.util.Set regd = new java.util.HashSet<>();\n"; + epClass += "regd.addAll(this.inputs.keySet());\n"; + epClass += "regd.addAll(this.outputs.keySet());\n"; + epClass += "if (!states.equals(regd)) {\n"; + epClass += "states.removeAll(regd);\n"; + epClass += "throw new org.scribble.main.ScribbleRuntimeException(\"Missing state registrations: \" + states);\n"; + epClass += "}\n"; + epClass += "return super.run();\n"; + epClass += "}\n"; + + epClass += "}\n"; + + return epClass; + } + + String generateReceiveInterface(boolean isSig, MessageSigNameDecl msnd, JobContext jc, EAction a, String rootPack, String receiveIfName) + { + String receiveInterface = ""; + receiveInterface += "package " + rootPack + ".handlers." + this.self + ".interfaces;\n"; + receiveInterface += "\n"; + receiveInterface += "public interface " + receiveIfName + " {\n"; + + + receiveInterface += "\npublic void receive(D data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer, "; + if (isSig) + { + receiveInterface += msnd.extName + " m"; + } + else + { + receiveInterface += SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + " op"; + int i = 1; + for (PayloadElemType pet : a.payload.elems) + { + DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + receiveInterface += ", " + dtd.extName + " arg" + i++; + } + } + receiveInterface += ");\n"; + receiveInterface += "}\n"; + + return receiveInterface; + } + + String generateBranch(String bprefix, JobContext jc, EState s, String endpointName, String rootPack, String branchName) + { + String branchAbstract = ""; + branchAbstract += "package " + rootPack + ".handlers." + this.self + ";\n"; + branchAbstract += ""; + branchAbstract += "public abstract class " + branchName + " implements org.scribble.runtime.handlers.ScribBranch"; + branchAbstract += s.getAllActions().stream().map(a -> + ", " + rootPack + ".handlers." + this.self + ".interfaces." + endpointName + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()) + "").collect(Collectors.joining("")); + branchAbstract += " {\n"; + + branchAbstract += "\n"; + branchAbstract += "@Override\n"; + branchAbstract += "public void dispatch(D data, org.scribble.runtime.message.ScribMessage m) {\n"; + branchAbstract += "switch (m.op.toString()) {\n"; + for (EAction a : s.getAllActions()) + { + // FIXME: factor out + boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); + MessageSigNameDecl msnd = null; + if (isSig) + { + msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() + .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); + } + + branchAbstract += "case \"" + SessionApiGenerator.getOpClassName(a.mid) + "\": receive(data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ", "; + if (isSig) + { + branchAbstract += "(" + msnd.extName + ") m"; + } + else + { + branchAbstract += "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + ") m.op"; + } + int i = 0; + for (PayloadElemType pet : a.payload.elems) + { + DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + branchAbstract += ", (" + dtd.extName + ") m.payload[" + i++ + "]"; + } + branchAbstract += "); break;\n"; + } + branchAbstract += "default: throw new RuntimeException(\"Shouldn't get in here: \" + m);\n"; + branchAbstract += "}\n"; + branchAbstract += "}\n"; + branchAbstract += "}\n"; + + return branchAbstract; + } + + String generateMessageInterface(EState s, String messageIfName, String endpointName, String rootPack, String mprefix) + { + // FIXME: sort cases + // FIXME: generate lattice -- cf. original handler i/f's (with "subtyping") + String messageInterface = ""; + messageInterface += "package " + rootPack + ".handlers.states." + this.self + ".messages.interfaces;\n"; + messageInterface += "\n"; + messageInterface += "public interface " + messageIfName + " {\n"; + messageInterface += "}\n"; + return messageInterface; + } + + String generateMessageClass(boolean isSig, String messageName, JobContext jc, EState s, EAction a, String endpointName, String rootPack, String messageAbstractName) + { + MessageSigNameDecl msnd = null; + if (isSig) + { + msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() + .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); + } + + String messageClass = ""; + messageClass += "package " + rootPack + ".handlers.states." + this.self + ".messages;\n"; + messageClass += "\n"; + // extends ScribMessage just for convenience of storing payload (peer/op pre-known) -- instances of this class never "directly" sent, cf., CBEndpoint + messageClass += "public class " + messageName + " extends org.scribble.runtime.message.ScribMessage implements " + messageAbstractName; //+ " implements " + pack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName; + if (isSig) + { + messageClass += ", org.scribble.runtime.handlers.ScribSigMessage"; + } + messageClass += " {\n"; + messageClass += "private static final long serialVersionUID = 1L;\n"; + if (isSig) + { + messageClass += "private final " + msnd.extName + " m;\n"; + } + messageClass += "\n"; + messageClass += "public " + messageName + "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer"; + if (isSig) + { + messageClass += ", " + msnd.extName + " m"; + } + else + { + int i = 1; + for (PayloadElemType pet : a.payload.elems) + { + DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + messageClass += ", " + dtd.extName + " arg" + i++; + } + } + messageClass += ") {\n"; + messageClass += "super(" + + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + + IntStream.rangeClosed(1, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining("")) + ");\n"; + if (isSig) + { + messageClass += "this.m = m;\n"; + } + messageClass += "}\n"; + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public org.scribble.type.name.Role getPeer() {\n"; + messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ";\n"; + messageClass += "}\n"; + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public org.scribble.type.name.Op getOp() {\n"; + messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";\n"; + messageClass += "}\n"; + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public Object[] getPayload() {\n"; + messageClass += "return this.payload;\n"; + messageClass += "}\n"; + if (isSig) + { + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public org.scribble.runtime.message.ScribMessage getSig() {\n"; + messageClass += "return this.m;\n"; + messageClass += "}\n"; + } + messageClass += "}\n"; + + return messageClass; + } + + String generateMessageAbstract(String messageIfName, String messageAbstractName, String endpointName, String rootPack, String mprefix) + { + String messageAbstract = ""; + messageAbstract += "package " + rootPack + ".handlers.states." + this.self + ".messages;\n"; + messageAbstract += "\n"; + messageAbstract += "public interface " + messageAbstractName + " extends org.scribble.runtime.handlers.ScribOutputEvent, " + rootPack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName + " {\n"; + messageAbstract += "}\n"; + + return messageAbstract; + } + + String generateStateClass(EState s, String rootPack, EStateKind kind, String stateId) + { + String stateKind; + switch (kind) + { + case OUTPUT: stateKind = "org.scribble.runtime.handlers.states.ScribOutputState"; break; + case UNARY_INPUT: + case POLY_INPUT: stateKind = "org.scribble.runtime.handlers.states.ScribInputState"; break; + case TERMINAL: stateKind = "org.scribble.runtime.handlers.states.ScribEndState"; break; + case ACCEPT: + case WRAP_SERVER: + throw new RuntimeException("TODO"); + default: + throw new RuntimeException("TODO"); + } + String stateClass = ""; + stateClass += "package " + rootPack + ".handlers.states." + this.self + ";\n"; + stateClass += "\n"; + stateClass += "public final class " + stateId + " extends " + stateKind + " {\n"; + stateClass += "public static final " + stateId + " id = new " + stateId + "(" + + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + s.getActions().get(0).peer + "." + s.getActions().get(0).peer : "") + + ");\n"; + stateClass += "private " + stateId + "(" + + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? "org.scribble.type.name.Role peer" : "") + + ") {\n"; + stateClass += ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? "super(\"" + stateId + "\", peer);" : "super(\"" + stateId + "\");") + "\n"; + for (EAction a : s.getAllActions()) + { + stateClass += "this.succs.put(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + + ", " + /*+ ((s.getSuccessor(a).id == s.id) + ? "this" + : ((s.getSuccessor(a).getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.getSuccessor(a).id) + ".id")*/ + + "\"" + ((s.getSuccessor(a).getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.getSuccessor(a).id) + "\"" + + ");\n"; + } + stateClass += "}\n"; + stateClass += "}\n"; + + return stateClass; + } + + private String generateRegister(GProtocolName gpn, Role self, EState s) + { + String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." ; + String res = ""; + String name = gpn.getSimpleName() + "_" + self; + switch (s.getStateKind()) + { + case OUTPUT: + { + // FIXME: "untyped" (ScribEvent) -- need state-specific "enums" + res += "public " + name + " callback(" + prefix + name + "_" + s.id + + " sid, java.util.function.Function h) {\n"; // FIXME: factor out + /*res += "this.outputs.put(sid, h);\n"; + res += "return this;\n";*/ + res += "return icallback(sid, h);\n"; + res += "}\n"; + res += "\n"; + String messageIfName = name + + s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); + res += "public\n" + + "\n" // FIXME: factor out + + name + " icallback(" + prefix + name + "_" + s.id + + " sid, java.util.function.Function h) {\n"; + res += "this.outputs.put(sid, h);\n"; + res += "return this;\n"; + res += "}\n"; + res += "\n"; + break; + } + case UNARY_INPUT: + case POLY_INPUT: + { + res += "public " + name + " callback(" + prefix + name + "_" + s.id + " sid"; + res += ", " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + "." + name + "_" + s.id + "_Branch b"; + res += ") {\n"; + res += "return icallback(sid, b);\n"; + res += "}\n"; + res += "\n"; + String T = s.getAllActions().stream().map(a -> SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + ".interfaces." + name + "__" + a.peer + "_" + + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining("")) + "").collect(Collectors.joining(" & ")) + + " & org.scribble.runtime.handlers.ScribBranch"; + res += "public " + "\n" + + name + " icallback(" + prefix + name + "_" + s.id + + " sid, T" + //+ SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + ".interfaces." + receiveIfName + " + + " b) {\n"; // FIXME: factor out + res += "this.inputs.put(sid, b);\n"; + res += "return this;\n"; + res += "}\n"; + res += "\n"; + break; + } + case TERMINAL: + { + break; + } + case ACCEPT: + case WRAP_SERVER: + { + throw new RuntimeException("[scrib] TODO: " + s); + } + default: + { + throw new RuntimeException("[scrib] Shouldn't get in here: " + s); + } + } + return res; + } + + public String generateScribbleRuntimeImports() + { + return getScribbleRuntimeImports().stream().map(x -> "import \"" + x + "\"\n").collect(Collectors.joining()); + } + + private List getScribbleRuntimeImports() // FIXME: factor up + { + return Stream.of( + //EDApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "" + ).collect(Collectors.toList()); + } +} From b655d25311b08fafd3f01e50d5298accd4472177 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 18 Mar 2018 21:55:24 +0000 Subject: [PATCH 040/539] Continued revising CB API gen. --- .../callbackapi/CBEndpointApiGenerator.java | 1 - .../callbackapi/CBEndpointApiGenerator2.java | 368 +++++++++++++----- 2 files changed, 271 insertions(+), 98 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index b952ad03a..049ba75a1 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -47,7 +47,6 @@ public CBEndpointApiGenerator(Job job, GProtocolName fullname, Role self, boolea } } - // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later public Map build() throws ScribbleException { Map res = new HashMap<>(); // filepath -> source diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java index f0035b6b7..e25655e6c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java @@ -11,7 +11,13 @@ import org.scribble.ast.DataTypeDecl; import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.Module; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; +import org.scribble.codegen.java.util.ClassBuilder; +import org.scribble.codegen.java.util.ConstructorBuilder; +import org.scribble.codegen.java.util.FieldBuilder; +import org.scribble.codegen.java.util.InterfaceBuilder; +import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.main.Job; import org.scribble.main.JobContext; import org.scribble.main.ScribbleException; @@ -19,8 +25,10 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.EStateKind; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.Payload; import org.scribble.type.name.DataType; import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.MessageSigName; import org.scribble.type.name.PayloadElemType; import org.scribble.type.name.Role; @@ -31,7 +39,7 @@ public class CBEndpointApiGenerator2 public final GProtocolName proto; public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral - private final boolean subtypes; // Generate full hierarchy (states -> states, not just indivdual state -> cases) -- cf. ioifaces + //private final boolean subtypes; // Generate full hierarchy (states -> states, not just indivdual state -> cases) -- cf. ioifaces public CBEndpointApiGenerator2(Job job, GProtocolName fullname, Role self, boolean subtypes) { @@ -39,14 +47,13 @@ public CBEndpointApiGenerator2(Job job, GProtocolName fullname, Role self, boole this.proto = fullname; this.self = self; - this.subtypes = subtypes; - if (this.subtypes) + //this.subtypes = subtypes; + if (subtypes) { throw new RuntimeException("TODO: -subtypes"); } } - // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later public Map build() throws ScribbleException { Map res = new HashMap<>(); // filepath -> source @@ -64,9 +71,26 @@ public Map buildSessionApi() throws ScribbleException res.putAll(buildEndpointClass()); return res; } + + String getHandlersPackage() + { + return SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers"; + } + + String getHandlersSelfPackage() + { + return getHandlersPackage() + "." + this.self; + } + + String getStatesSelfPackage() + { + return getHandlersPackage() + ".states." + this.self; + } public Map buildEndpointClass() throws ScribbleException { + Map res = new HashMap<>(); + JobContext jc = this.job.getContext(); EState init = (this.job.minEfsm ? jc.getMinimisedEGraph(this.proto, this.self) : jc.getEGraph(this.proto, this.self)).init; // FIXME: factor out with StateChannelApiGenerator constructor Set states = new HashSet<>(); @@ -76,15 +100,74 @@ public Map buildEndpointClass() throws ScribbleException // frontend handler class String rootPack = SessionApiGenerator.getEndpointApiRootPackageName(this.proto); String endpointName = this.proto.getSimpleName() + "_" + this.self; - String sess = rootPack + "." + this.proto.getSimpleName(); - - Map res = new HashMap<>(); - String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/" + this.self + "/"; // StateChannelApiGenerator#generateApi - String epClass = generateEndpointClass(rootPack, endpointName, sess, init, states); - res.put(prefix + endpointName + ".java", epClass); + String initStateName = getStatesSelfPackage() + "." + endpointName + "_" + init.id; // FIXME: factor out + String sessClassName = rootPack + "." + this.proto.getSimpleName(); + String prefix = getHandlersSelfPackage().replace('.', '/') + "/"; // StateChannelApiGenerator#generateApi + + //String epClass = generateEndpointClass(rootPack, endpointName, sessClass, init, states); + ClassBuilder endpointClass = new ClassBuilder(endpointName); + endpointClass.setPackage(getHandlersSelfPackage()); + endpointClass.addModifiers("public"); + endpointClass.addParameters("D"); + endpointClass.setSuperClass("org.scribble.runtime.session.CBEndpoint<" + sessClassName + ", " + getRolesPackage() + "." + this.self + ", D>"); + ConstructorBuilder cb = endpointClass.newConstructor(sessClassName + " sess", getRolesPackage() + "." + this.self + " self", "org.scribble.runtime.message.ScribMessageFormatter smf", "D data"); + cb.addExceptions("java.io.IOException", "org.scribble.main.ScribbleRuntimeException"); + cb.addBodyLine("super(sess, self, smf, " + initStateName + ".id, data);"); + for (EState s : states) + { + String tmp = (s.getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.id; + cb.addBodyLine("this.states.put(\"" + tmp + "\", " + getStatesSelfPackage() + "." + tmp + ".id);"); + } + MethodBuilder mb = endpointClass.newMethod("run"); + mb.addModifiers("public"); + mb.setReturn("java.util.concurrent.Future"); + mb.addExceptions("org.scribble.main.ScribbleRuntimeException"); + mb.addAnnotations("@Override"); + mb.addBodyLine("java.util.Set states = java.util.stream.Stream.of(" + initStateName + ".id).collect(java.util.stream.Collectors.toSet());"); + mb.addBodyLine("java.util.Set regd = new java.util.HashSet<>();"); + mb.addBodyLine("regd.addAll(this.inputs.keySet());"); + mb.addBodyLine("regd.addAll(this.outputs.keySet());"); + mb.addBodyLine("if (!states.equals(regd)) {"); + mb.addBodyLine("states.removeAll(regd);"); + mb.addBodyLine("throw new org.scribble.main.ScribbleRuntimeException(\"Missing state registrations: \" + states);"); + mb.addBodyLine("}"); + mb.addBodyLine("return super.run();"); + for (EState s : states) + { + switch (s.getStateKind()) + { + case OUTPUT: + { + MethodBuilder callback = endpointClass.newMethod("callback"); + callback.addModifiers("public"); + callback.setReturn(endpointName + ""); + callback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", // FIXME: factor out + "java.util.function.Function cb"); // FIXME: factor out + callback.addBodyLine("this.outputs.put(sid, cb);"); + callback.addBodyLine("return this;"); + break; + } + case UNARY_INPUT: + case POLY_INPUT: + case WRAP_SERVER: + case ACCEPT: + { + throw new RuntimeException("TODO: " + s.getStateKind()); + } + case TERMINAL: + { + break; + } + default: + { + throw new RuntimeException("Shouldn't get in here: " + s.getStateKind()); + } + } + } + res.put(prefix + endpointName + ".java", endpointClass.build()); // states - String sprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/states/" + this.self + "/"; // StateChannelApiGenerator#generateApi + String sprefix = getStatesSelfPackage().replace('.', '/') + "/"; // StateChannelApiGenerator#generateApi for (EState s : states) { EStateKind kind = s.getStateKind(); @@ -95,31 +178,92 @@ public Map buildEndpointClass() throws ScribbleException // messages if (s.getStateKind() == EStateKind.OUTPUT) { - String mprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/states/" + this.self + "/messages/"; + String mprefix = getMessagesPackage(rootPack).replace('.', '/') + "/"; - String messageIfName = endpointName + + /*String messageIfName = endpointName + s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); String messageInterface = generateMessageInterface(s, messageIfName, endpointName, rootPack, mprefix); - res.put(mprefix + "interfaces/" + messageIfName + ".java", messageInterface); + res.put(mprefix + "interfaces/" + messageIfName + ".java", messageInterface);*/ - String messageAbstractName = endpointName + "_" + s.id + "_Message"; - String messageAbstract = generateMessageAbstract(messageIfName, messageAbstractName, endpointName, rootPack, mprefix); - res.put(mprefix + messageAbstractName + ".java", messageAbstract); + String messageAbstractName = getMessageAbstractName(endpointName, s); // FIXME: is interface + //String messageAbstract = generateMessageAbstract(messageIfName, messageAbstractName, endpointName, rootPack, mprefix); + InterfaceBuilder messageAbstract = new InterfaceBuilder(messageAbstractName); + messageAbstract.setPackage(getMessagesPackage(rootPack)); + messageAbstract.addModifiers("public"); + messageAbstract.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); + res.put(mprefix + messageAbstractName + ".java", messageAbstract.build()); + Module main = this.job.getContext().getMainModule(); + Map messageClasses = new HashMap<>(); // A class per Payload for this state for (EAction a : s.getAllActions()) { - boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() + boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() // FIXME .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); - String messageName = isSig + ClassBuilder messageClass; + if (!messageClasses.containsKey(a.payload)) + { + String name = //"Pay_" + + this.self + "_" + s.id + "_" // FIXME: factor out + + (a.payload.elems.isEmpty() + ? "Unit" + : a.payload.elems.stream().map(e -> + { + String extName = main.getDataTypeDecl((DataType) e).extName; + return (extName.indexOf(".") != -1) + ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) + : extName; + }).collect(Collectors.joining("_")) + ); // FIXME: extName sime // Not terminal + messageClass = new ClassBuilder(name); + messageClasses.put(a.payload, messageClass); + messageClass.setPackage(getMessagesPackage(rootPack)); + messageClass.addModifiers("public"); + messageClass.setSuperClass("org.scribble.runtime.message.ScribMessage"); + messageClass.addInterfaces(messageAbstractName); + MethodBuilder getPeer = messageClass.newMethod("getPeer"); + getPeer.addModifiers("public"); + getPeer.addAnnotations("@Override"); + getPeer.setReturn("org.scribble.type.name.Role"); + getPeer.addBodyLine("return " + getRolesPackage() + "." + this.self + "." + this.self + ";"); + MethodBuilder getOp = messageClass.newMethod("getOp"); + getOp.addModifiers("public"); + getOp.addAnnotations("@Override"); + getOp.setReturn("org.scribble.type.name.Op"); + getOp.addBodyLine("return " + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";"); + MethodBuilder getPayload = messageClass.newMethod("getPayload"); + getPayload.addModifiers("public"); + getPayload.addAnnotations("@Override"); + getPayload.setReturn("Object[]"); + getPayload.addBodyLine("return this.payload;"); + FieldBuilder fb = messageClass.newField("serialVersionUID"); + fb.addModifiers("private", "static", "final"); + fb.setType("long"); + fb.setExpression("1L"); + } + else + { + messageClass = messageClasses.get(a.payload); + } + + + /*String messageName = isSig ? endpointName + "_" + SessionApiGenerator.getOpClassName(a.mid) : endpointName + "_" + s.id + "_" + SessionApiGenerator.getOpClassName(a.mid); - String messageClass = generateMessageClass(isSig, messageName, jc, s, a, messageIfName, rootPack, messageAbstractName); - res.put(mprefix + messageName + ".java", messageClass); + String messageClass = generateMessageClass(isSig, messageName, s, a, messageIfName, rootPack, messageAbstractName); + res.put(mprefix + messageName + ".java", messageClass);*/ + int[] i = { 2 }; + String[] args = new String[a.payload.elems.size() + 2]; + args[0] = getRolesPackage() + "." + a.peer + " peer"; + args[1] = getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + " op"; + a.payload.elems.forEach(e -> args[i[0]++] = main.getDataTypeDecl((DataType) e).extName + " arg" + (i[0]-3)); + ConstructorBuilder ob = messageClass.newConstructor(args); + ob.addBodyLine("super(op" + IntStream.range(0, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining()) + ");"); } + messageClasses.values().forEach(c -> res.put(mprefix + c.getName() + ".java", c.build())); } - // branches + /*// branches if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) { String bprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/" + this.self + "/"; @@ -144,7 +288,7 @@ public Map buildEndpointClass() throws ScribbleException String branchAbstract = generateBranch(bprefix, jc, s, endpointName, rootPack, branchName); res.put(bprefix + branchName + ".java", branchAbstract); - } + }*/ } return res; @@ -285,83 +429,97 @@ String generateMessageInterface(EState s, String messageIfName, String endpoint return messageInterface; } - String generateMessageClass(boolean isSig, String messageName, JobContext jc, EState s, EAction a, String endpointName, String rootPack, String messageAbstractName) + MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) { - MessageSigNameDecl msnd = null; - if (isSig) - { - msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() - .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); - } - - String messageClass = ""; - messageClass += "package " + rootPack + ".handlers.states." + this.self + ".messages;\n"; - messageClass += "\n"; - // extends ScribMessage just for convenience of storing payload (peer/op pre-known) -- instances of this class never "directly" sent, cf., CBEndpoint - messageClass += "public class " + messageName + " extends org.scribble.runtime.message.ScribMessage implements " + messageAbstractName; //+ " implements " + pack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName; - if (isSig) - { - messageClass += ", org.scribble.runtime.handlers.ScribSigMessage"; - } - messageClass += " {\n"; - messageClass += "private static final long serialVersionUID = 1L;\n"; - if (isSig) - { - messageClass += "private final " + msnd.extName + " m;\n"; - } - messageClass += "\n"; - messageClass += "public " + messageName + "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer"; - if (isSig) - { - messageClass += ", " + msnd.extName + " m"; - } - else - { - int i = 1; - for (PayloadElemType pet : a.payload.elems) - { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); - messageClass += ", " + dtd.extName + " arg" + i++; - } - } - messageClass += ") {\n"; - messageClass += "super(" - + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) - + IntStream.rangeClosed(1, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining("")) + ");\n"; - if (isSig) - { - messageClass += "this.m = m;\n"; - } - messageClass += "}\n"; - messageClass += "\n"; - messageClass += "@Override\n"; - messageClass += "public org.scribble.type.name.Role getPeer() {\n"; - messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ";\n"; - messageClass += "}\n"; - messageClass += "\n"; - messageClass += "@Override\n"; - messageClass += "public org.scribble.type.name.Op getOp() {\n"; - messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";\n"; - messageClass += "}\n"; - messageClass += "\n"; - messageClass += "@Override\n"; - messageClass += "public Object[] getPayload() {\n"; - messageClass += "return this.payload;\n"; - messageClass += "}\n"; - if (isSig) - { - messageClass += "\n"; - messageClass += "@Override\n"; - messageClass += "public org.scribble.runtime.message.ScribMessage getSig() {\n"; - messageClass += "return this.m;\n"; - messageClass += "}\n"; - } - messageClass += "}\n"; - - return messageClass; + return (MessageSigNameDecl) + this.job.getContext().getMainModule().getNonProtocolDecls().stream() // FIXME: main module? + .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(mid.toString())) + .iterator().next(); } + + String getMessagesPackage(String rootPack) + { + return rootPack + ".handlers.states." + this.self + ".messages"; + } + + String generateMessageClass(boolean isSig, String messageName, EState s, + EAction a, String endpointName, String rootPack, String messageAbstractName) + { + MessageSigNameDecl msnd = null; + if (isSig) + { + msnd = getMessageSigNameDecl((MessageSigName) a.mid); + } - String generateMessageAbstract(String messageIfName, String messageAbstractName, String endpointName, String rootPack, String mprefix) + String messageClass = ""; + messageClass += "package " + getMessagesPackage(rootPack) + ";\n"; + messageClass += "\n"; + // extends ScribMessage just for convenience of storing payload (peer/op pre-known) -- instances of this class never "directly" sent, cf., CBEndpoint + messageClass += "public class " + messageName + " extends org.scribble.runtime.message.ScribMessage implements " + messageAbstractName; + if (isSig) + { + messageClass += ", org.scribble.runtime.handlers.ScribSigMessage"; + } + messageClass += " {\n"; + messageClass += "private static final long serialVersionUID = 1L;\n"; + if (isSig) + { + messageClass += "private final " + msnd.extName + " m;\n"; + } + messageClass += "\n"; + messageClass += "public " + messageName + "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer"; + if (isSig) + { + messageClass += ", " + msnd.extName + " m"; + } + else + { + int i = 1; + Module main = this.job.getContext().getMainModule(); + for (PayloadElemType pet : a.payload.elems) + { + DataTypeDecl dtd = main.getDataTypeDecl((DataType) pet); + messageClass += ", " + dtd.extName + " arg" + i++; + } + } + messageClass += ") {\n"; + messageClass += "super(" + + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + + IntStream.rangeClosed(1, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining("")) + ");\n"; + if (isSig) + { + messageClass += "this.m = m;\n"; + } + messageClass += "}\n"; + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public org.scribble.type.name.Role getPeer() {\n"; + messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ";\n"; + messageClass += "}\n"; + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public org.scribble.type.name.Op getOp() {\n"; + messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";\n"; + messageClass += "}\n"; + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public Object[] getPayload() {\n"; + messageClass += "return this.payload;\n"; + messageClass += "}\n"; + if (isSig) + { + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public org.scribble.runtime.message.ScribMessage getSig() {\n"; + messageClass += "return this.m;\n"; + messageClass += "}\n"; + } + messageClass += "}\n"; + + return messageClass; +} + +String generateMessageAbstract(String messageIfName, String messageAbstractName, String endpointName, String rootPack, String mprefix) { String messageAbstract = ""; messageAbstract += "package " + rootPack + ".handlers.states." + this.self + ".messages;\n"; @@ -483,6 +641,22 @@ private String generateRegister(GProtocolName gpn, Role self, EState s) } return res; } + + String getMessageAbstractName(String endpointName, EState s) + { + //return endpointName + "_" + s.id + "_Message"; + return "Pay_" + this.self + "_" + s.id; + } + + String getRolesPackage() + { + return SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles"; + } + + String getOpsPackage() + { + return SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops"; + } public String generateScribbleRuntimeImports() { From bb4229a4bc8bf6855b3429b881c4311420734910 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 18 Mar 2018 22:13:46 +0000 Subject: [PATCH 041/539] Continued revising CB API gen. --- .../callbackapi/CBEndpointApiGenerator2.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java index e25655e6c..8ec3ebc7e 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java @@ -111,6 +111,7 @@ public Map buildEndpointClass() throws ScribbleException endpointClass.addParameters("D"); endpointClass.setSuperClass("org.scribble.runtime.session.CBEndpoint<" + sessClassName + ", " + getRolesPackage() + "." + this.self + ", D>"); ConstructorBuilder cb = endpointClass.newConstructor(sessClassName + " sess", getRolesPackage() + "." + this.self + " self", "org.scribble.runtime.message.ScribMessageFormatter smf", "D data"); + cb.addModifiers("public"); cb.addExceptions("java.io.IOException", "org.scribble.main.ScribbleRuntimeException"); cb.addBodyLine("super(sess, self, smf, " + initStateName + ".id, data);"); for (EState s : states) @@ -149,6 +150,15 @@ public Map buildEndpointClass() throws ScribbleException } case UNARY_INPUT: case POLY_INPUT: + { + MethodBuilder callback = endpointClass.newMethod("callback"); + callback.addModifiers("public"); + callback.setReturn(endpointName + ""); + callback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", getHandlersSelfPackage() + "." + endpointName + "_" + s.id + "_Branch b"); // FIXME: factor out + callback.addBodyLine("this.inputs.put(sid, b);"); + callback.addBodyLine("return this;");; + break; + } case WRAP_SERVER: case ACCEPT: { @@ -225,7 +235,7 @@ public Map buildEndpointClass() throws ScribbleException getPeer.addModifiers("public"); getPeer.addAnnotations("@Override"); getPeer.setReturn("org.scribble.type.name.Role"); - getPeer.addBodyLine("return " + getRolesPackage() + "." + this.self + "." + this.self + ";"); + getPeer.addBodyLine("return " + getRolesPackage() + "." + a.peer + "." + a.peer + ";"); MethodBuilder getOp = messageClass.newMethod("getOp"); getOp.addModifiers("public"); getOp.addAnnotations("@Override"); @@ -258,12 +268,13 @@ public Map buildEndpointClass() throws ScribbleException args[1] = getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + " op"; a.payload.elems.forEach(e -> args[i[0]++] = main.getDataTypeDecl((DataType) e).extName + " arg" + (i[0]-3)); ConstructorBuilder ob = messageClass.newConstructor(args); + ob.addModifiers("public"); ob.addBodyLine("super(op" + IntStream.range(0, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining()) + ");"); } messageClasses.values().forEach(c -> res.put(mprefix + c.getName() + ".java", c.build())); } - /*// branches + // branches if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) { String bprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/" + this.self + "/"; @@ -288,7 +299,7 @@ public Map buildEndpointClass() throws ScribbleException String branchAbstract = generateBranch(bprefix, jc, s, endpointName, rootPack, branchName); res.put(bprefix + branchName + ".java", branchAbstract); - }*/ + } } return res; From 9bb8f72efb1dc1d65c0ad7d4b258274001fad244 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 18 Mar 2018 23:16:40 +0000 Subject: [PATCH 042/539] Continued revising CB API gen. --- scribble-cli/src/main/java/org/scribble/cli/CommandLine.java | 4 ++-- .../codegen/java/callbackapi/CBEndpointApiGenerator2.java | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index b323ac920..bc296536c 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -27,7 +27,7 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.global.GProtocolDecl; import org.scribble.codegen.java.JEndpointApiGenerator; -import org.scribble.codegen.java.callbackapi.CBEndpointApiGenerator2; +import org.scribble.codegen.java.callbackapi.CBEndpointApiGenerator; import org.scribble.main.AntlrSourceException; import org.scribble.main.Job; import org.scribble.main.JobContext; @@ -442,7 +442,7 @@ private void outputEventDrivenApi(Job job) throws ScribbleException, CommandLine { GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); Role self = checkRoleArg(jcontext, fullname, args[i+1]); - CBEndpointApiGenerator2 edgen = new CBEndpointApiGenerator2(job, fullname, self, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); + CBEndpointApiGenerator edgen = new CBEndpointApiGenerator(job, fullname, self, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); Map out = edgen.build(); outputClasses(out); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java index 8ec3ebc7e..93ad81101 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java @@ -256,7 +256,6 @@ public Map buildEndpointClass() throws ScribbleException messageClass = messageClasses.get(a.payload); } - /*String messageName = isSig ? endpointName + "_" + SessionApiGenerator.getOpClassName(a.mid) : endpointName + "_" + s.id + "_" + SessionApiGenerator.getOpClassName(a.mid); From 1ec0797f628c179c34981fff840156402170761c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Mar 2018 14:12:38 +0000 Subject: [PATCH 043/539] Continued revising CB gen API. --- .../callbackapi/CBEndpointApiGenerator2.java | 5 +- .../callbackapi/CBEndpointApiGenerator3.java | 714 ++++++++++++++++++ 2 files changed, 717 insertions(+), 2 deletions(-) create mode 100644 scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java index 93ad81101..ad9634949 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java @@ -33,6 +33,7 @@ import org.scribble.type.name.Role; // FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) +@Deprecated public class CBEndpointApiGenerator2 { public final Job job; @@ -207,8 +208,8 @@ public Map buildEndpointClass() throws ScribbleException Map messageClasses = new HashMap<>(); // A class per Payload for this state for (EAction a : s.getAllActions()) { - boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() // FIXME - .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); + /*boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() // FIXME + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString()));*/ ClassBuilder messageClass; if (!messageClasses.containsKey(a.payload)) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java new file mode 100644 index 000000000..77dbfa958 --- /dev/null +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -0,0 +1,714 @@ +package org.scribble.codegen.java.callbackapi; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.Module; +import org.scribble.codegen.java.sessionapi.SessionApiGenerator; +import org.scribble.codegen.java.util.ClassBuilder; +import org.scribble.codegen.java.util.ConstructorBuilder; +import org.scribble.codegen.java.util.FieldBuilder; +import org.scribble.codegen.java.util.InterfaceBuilder; +import org.scribble.codegen.java.util.MethodBuilder; +import org.scribble.main.Job; +import org.scribble.main.JobContext; +import org.scribble.main.ScribbleException; +import org.scribble.model.MState; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.EStateKind; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.Payload; +import org.scribble.type.name.DataType; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.MessageSigName; +import org.scribble.type.name.PayloadElemType; +import org.scribble.type.name.Role; + +// FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) +public class CBEndpointApiGenerator3 +{ + public final Job job; + public final GProtocolName proto; + public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral + + //private final boolean subtypes; // Generate full hierarchy (states -> states, not just indivdual state -> cases) -- cf. ioifaces + + public CBEndpointApiGenerator3(Job job, GProtocolName fullname, Role self, boolean subtypes) + { + this.job = job; + this.proto = fullname; + this.self = self; + + //this.subtypes = subtypes; + if (subtypes) + { + throw new RuntimeException("TODO: -subtypes"); + } + } + + public Map build() throws ScribbleException + { + Map res = new HashMap<>(); // filepath -> source + res.putAll(buildSessionApi()); + return res; + } + + // FIXME: factor out -- integrate with JEndpointApiGenerator + public Map buildSessionApi() throws ScribbleException + { + this.job.debugPrintln("\n[param-core] Running " + CBEndpointApiGenerator3.class + " for " + this.proto + "@" + this.self); + + Map res = new HashMap<>(); + res.putAll(new SessionApiGenerator(this.job, this.proto).generateApi()); + res.putAll(buildEndpointClass()); + return res; + } + + public Map buildEndpointClass() throws ScribbleException + { + Map res = new HashMap<>(); + + JobContext jc = this.job.getContext(); + EState init = (this.job.minEfsm ? jc.getMinimisedEGraph(this.proto, this.self) : jc.getEGraph(this.proto, this.self)).init; // FIXME: factor out with StateChannelApiGenerator constructor + Set states = new HashSet<>(); + states.add(init); + states.addAll(MState.getReachableStates(init)); + + // frontend handler class + String rootPack = SessionApiGenerator.getEndpointApiRootPackageName(this.proto); + String endpointName = this.proto.getSimpleName() + "_" + this.self; + String initStateName = getStatesSelfPackage() + "." + endpointName + "_" + init.id; // FIXME: factor out + String sessClassName = rootPack + "." + this.proto.getSimpleName(); + String prefix = getHandlersSelfPackage().replace('.', '/') + "/"; // StateChannelApiGenerator#generateApi + + //String epClass = generateEndpointClass(rootPack, endpointName, sessClass, init, states); + ClassBuilder endpointClass = new ClassBuilder(endpointName); + endpointClass.setPackage(getHandlersSelfPackage()); + endpointClass.addModifiers("public"); + endpointClass.addParameters("D"); + endpointClass.setSuperClass("org.scribble.runtime.session.CBEndpoint<" + sessClassName + ", " + getRolesPackage() + "." + this.self + ", D>"); + ConstructorBuilder cb = endpointClass.newConstructor(sessClassName + " sess", getRolesPackage() + "." + this.self + " self", "org.scribble.runtime.message.ScribMessageFormatter smf", "D data"); + cb.addModifiers("public"); + cb.addExceptions("java.io.IOException", "org.scribble.main.ScribbleRuntimeException"); + cb.addBodyLine("super(sess, self, smf, " + initStateName + ".id, data);"); + for (EState s : states) + { + String tmp = (s.getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.id; + cb.addBodyLine("this.states.put(\"" + tmp + "\", " + getStatesSelfPackage() + "." + tmp + ".id);"); + } + MethodBuilder mb = endpointClass.newMethod("run"); + mb.addModifiers("public"); + mb.setReturn("java.util.concurrent.Future"); + mb.addExceptions("org.scribble.main.ScribbleRuntimeException"); + mb.addAnnotations("@Override"); + mb.addBodyLine("java.util.Set states = java.util.stream.Stream.of(" + initStateName + ".id).collect(java.util.stream.Collectors.toSet());"); + mb.addBodyLine("java.util.Set regd = new java.util.HashSet<>();"); + mb.addBodyLine("regd.addAll(this.inputs.keySet());"); + mb.addBodyLine("regd.addAll(this.outputs.keySet());"); + mb.addBodyLine("if (!states.equals(regd)) {"); + mb.addBodyLine("states.removeAll(regd);"); + mb.addBodyLine("throw new org.scribble.main.ScribbleRuntimeException(\"Missing state registrations: \" + states);"); + mb.addBodyLine("}"); + mb.addBodyLine("return super.run();"); + for (EState s : states) + { + switch (s.getStateKind()) + { + case OUTPUT: + { + MethodBuilder callback = endpointClass.newMethod("callback"); + callback.addModifiers("public"); + callback.setReturn(endpointName + ""); + callback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", // FIXME: factor out + "java.util.function.Function cb"); // FIXME: factor out + callback.addBodyLine("this.outputs.put(sid, cb);"); + callback.addBodyLine("return this;"); + break; + } + case UNARY_INPUT: + case POLY_INPUT: + { + MethodBuilder callback = endpointClass.newMethod("callback"); + callback.addModifiers("public"); + callback.setReturn(endpointName + ""); + callback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", getHandlersSelfPackage() + "." + endpointName + "_" + s.id + "_Branch b"); // FIXME: factor out + callback.addBodyLine("this.inputs.put(sid, b);"); + callback.addBodyLine("return this;");; + break; + } + case WRAP_SERVER: + case ACCEPT: + { + throw new RuntimeException("TODO: " + s.getStateKind()); + } + case TERMINAL: + { + break; + } + default: + { + throw new RuntimeException("Shouldn't get in here: " + s.getStateKind()); + } + } + } + res.put(prefix + endpointName + ".java", endpointClass.build()); + + // states + String sprefix = getStatesSelfPackage().replace('.', '/') + "/"; // StateChannelApiGenerator#generateApi + for (EState s : states) + { + EStateKind kind = s.getStateKind(); + String stateId = (kind == EStateKind.TERMINAL) ? "End" : endpointName + "_" + s.id; + String stateClass = generateStateClass(s, rootPack, kind, stateId); + res.put(sprefix + stateId + ".java", stateClass); + + // messages + if (s.getStateKind() == EStateKind.OUTPUT) + { + String mprefix = getMessagesPackage(rootPack).replace('.', '/') + "/"; + + /*String messageIfName = endpointName + + s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); + String messageInterface = generateMessageInterface(s, messageIfName, endpointName, rootPack, mprefix); + res.put(mprefix + "interfaces/" + messageIfName + ".java", messageInterface);*/ + + String messageAbstractName = getMessageAbstractName(endpointName, s); // FIXME: is interface + //String messageAbstract = generateMessageAbstract(messageIfName, messageAbstractName, endpointName, rootPack, mprefix); + InterfaceBuilder messageAbstract = new InterfaceBuilder(messageAbstractName); + messageAbstract.setPackage(getMessagesPackage(rootPack)); + messageAbstract.addModifiers("public"); + messageAbstract.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); + res.put(mprefix + messageAbstractName + ".java", messageAbstract.build()); + + Module main = this.job.getContext().getMainModule(); + Map messageClasses = new HashMap<>(); // A class per Payload for this state + for (EAction a : s.getAllActions()) + { + /*boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() // FIXME + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString()));*/ + + ClassBuilder messageClass; + if (!messageClasses.containsKey(a.payload)) + { + String name = //"Pay_" + + this.self + "_" + s.id + "_" // FIXME: factor out + + (a.payload.elems.isEmpty() + ? "Unit" + : a.payload.elems.stream().map(e -> + { + String extName = main.getDataTypeDecl((DataType) e).extName; + return (extName.indexOf(".") != -1) + ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) + : extName; + }).collect(Collectors.joining("_")) + ); // FIXME: extName sime // Not terminal + messageClass = new ClassBuilder(name); + messageClasses.put(a.payload, messageClass); + messageClass.setPackage(getMessagesPackage(rootPack)); + messageClass.addModifiers("public"); + messageClass.setSuperClass("org.scribble.runtime.message.ScribMessage"); + messageClass.addInterfaces(messageAbstractName); + MethodBuilder getPeer = messageClass.newMethod("getPeer"); + getPeer.addModifiers("public"); + getPeer.addAnnotations("@Override"); + getPeer.setReturn("org.scribble.type.name.Role"); + getPeer.addBodyLine("return " + getRolesPackage() + "." + a.peer + "." + a.peer + ";"); + MethodBuilder getOp = messageClass.newMethod("getOp"); + getOp.addModifiers("public"); + getOp.addAnnotations("@Override"); + getOp.setReturn("org.scribble.type.name.Op"); + getOp.addBodyLine("return " + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";"); + MethodBuilder getPayload = messageClass.newMethod("getPayload"); + getPayload.addModifiers("public"); + getPayload.addAnnotations("@Override"); + getPayload.setReturn("Object[]"); + getPayload.addBodyLine("return this.payload;"); + FieldBuilder fb = messageClass.newField("serialVersionUID"); + fb.addModifiers("private", "static", "final"); + fb.setType("long"); + fb.setExpression("1L"); + } + else + { + messageClass = messageClasses.get(a.payload); + } + + /*String messageName = isSig + ? endpointName + "_" + SessionApiGenerator.getOpClassName(a.mid) + : endpointName + "_" + s.id + "_" + SessionApiGenerator.getOpClassName(a.mid); + String messageClass = generateMessageClass(isSig, messageName, s, a, messageIfName, rootPack, messageAbstractName); + res.put(mprefix + messageName + ".java", messageClass);*/ + int[] i = { 2 }; + String[] args = new String[a.payload.elems.size() + 2]; + args[0] = getRolesPackage() + "." + a.peer + " peer"; + args[1] = getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + " op"; + a.payload.elems.forEach(e -> args[i[0]++] = main.getDataTypeDecl((DataType) e).extName + " arg" + (i[0]-3)); + ConstructorBuilder ob = messageClass.newConstructor(args); + ob.addModifiers("public"); + ob.addBodyLine("super(op" + IntStream.range(0, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining()) + ");"); + } + messageClasses.values().forEach(c -> res.put(mprefix + c.getName() + ".java", c.build())); + } + + // branches + if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) + { + String bprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/" + this.self + "/"; + String branchName = endpointName + "_" + s.id + "_Branch"; + + for (EAction a : s.getAllActions()) + { + // FIXME: factor out + boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); + MessageSigNameDecl msnd = null; + if (isSig) + { + msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() + .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); + } + + String receiveIfName = endpointName + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()); + String receiveInterface = generateReceiveInterface(isSig, msnd, jc, a, rootPack, receiveIfName); + res.put(bprefix + "interfaces/" + receiveIfName + ".java", receiveInterface); + } + + String branchAbstract = generateBranch(bprefix, jc, s, endpointName, rootPack, branchName); + res.put(bprefix + branchName + ".java", branchAbstract); + } + } + + return res; + } + + String generateEndpointClass(String rootPack, String endpointName, String sess, EState init, Set states) + { + String role = SessionApiGenerator.getRolesPackageName(this.proto) + "." + this.self; + String epClass = ""; + + epClass += "package " + rootPack + ".handlers." + this.self + ";\n"; + epClass += "\n"; + epClass += "\n"; + epClass += "public class " + endpointName + " extends org.scribble.runtime.session.CBEndpoint<" + sess + ", " + role + ", D> {\n"; + + epClass += "public " + endpointName + "(" + sess + " sess, " + role + + " self, org.scribble.runtime.message.ScribMessageFormatter smf, D data) throws java.io.IOException, org.scribble.main.ScribbleRuntimeException {\n"; + epClass += "super(sess, self, smf, " + rootPack + ".handlers.states." + this.self + "." + endpointName + "_" + init.id + ".id" + ", data);\n"; // FIXME: factor out + for (EState s : states) + { + String tmp = (s.getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.id; + epClass += "this.states.put(\"" + tmp + "\", " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." + tmp + ".id);\n"; + } + epClass += "}\n"; + epClass += "\n"; + + + epClass += states.stream().map(s -> generateRegister(this.proto, this.self, s)).collect(Collectors.joining("\n")); + + epClass += "@Override\n"; + epClass += "public java.util.concurrent.Future run() throws org.scribble.main.ScribbleRuntimeException {\n"; + epClass += "java.util.Set states = java.util.stream.Stream.of(" + states.stream().filter(s -> s.getStateKind() != EStateKind.TERMINAL).map(s -> + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." + this.proto.getSimpleName() + "_" + this.self + "_" + s.id + ".id").collect(Collectors.joining(", ")) + ").collect(java.util.stream.Collectors.toSet());\n"; + epClass += "java.util.Set regd = new java.util.HashSet<>();\n"; + epClass += "regd.addAll(this.inputs.keySet());\n"; + epClass += "regd.addAll(this.outputs.keySet());\n"; + epClass += "if (!states.equals(regd)) {\n"; + epClass += "states.removeAll(regd);\n"; + epClass += "throw new org.scribble.main.ScribbleRuntimeException(\"Missing state registrations: \" + states);\n"; + epClass += "}\n"; + epClass += "return super.run();\n"; + epClass += "}\n"; + + epClass += "}\n"; + + return epClass; + } + + String generateReceiveInterface(boolean isSig, MessageSigNameDecl msnd, JobContext jc, EAction a, String rootPack, String receiveIfName) + { + String receiveInterface = ""; + receiveInterface += "package " + rootPack + ".handlers." + this.self + ".interfaces;\n"; + receiveInterface += "\n"; + receiveInterface += "public interface " + receiveIfName + " {\n"; + + + receiveInterface += "\npublic void receive(D data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer, "; + if (isSig) + { + receiveInterface += msnd.extName + " m"; + } + else + { + receiveInterface += SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + " op"; + int i = 1; + for (PayloadElemType pet : a.payload.elems) + { + DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + receiveInterface += ", " + dtd.extName + " arg" + i++; + } + } + receiveInterface += ");\n"; + receiveInterface += "}\n"; + + return receiveInterface; + } + + String generateBranch(String bprefix, JobContext jc, EState s, String endpointName, String rootPack, String branchName) + { + String branchAbstract = ""; + branchAbstract += "package " + rootPack + ".handlers." + this.self + ";\n"; + branchAbstract += ""; + branchAbstract += "public abstract class " + branchName + " implements org.scribble.runtime.handlers.ScribBranch"; + branchAbstract += s.getAllActions().stream().map(a -> + ", " + rootPack + ".handlers." + this.self + ".interfaces." + endpointName + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()) + "").collect(Collectors.joining("")); + branchAbstract += " {\n"; + + branchAbstract += "\n"; + branchAbstract += "@Override\n"; + branchAbstract += "public void dispatch(D data, org.scribble.runtime.message.ScribMessage m) {\n"; + branchAbstract += "switch (m.op.toString()) {\n"; + for (EAction a : s.getAllActions()) + { + // FIXME: factor out + boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); + MessageSigNameDecl msnd = null; + if (isSig) + { + msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() + .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); + } + + branchAbstract += "case \"" + SessionApiGenerator.getOpClassName(a.mid) + "\": receive(data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ", "; + if (isSig) + { + branchAbstract += "(" + msnd.extName + ") m"; + } + else + { + branchAbstract += "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + ") m.op"; + } + int i = 0; + for (PayloadElemType pet : a.payload.elems) + { + DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + branchAbstract += ", (" + dtd.extName + ") m.payload[" + i++ + "]"; + } + branchAbstract += "); break;\n"; + } + branchAbstract += "default: throw new RuntimeException(\"Shouldn't get in here: \" + m);\n"; + branchAbstract += "}\n"; + branchAbstract += "}\n"; + branchAbstract += "}\n"; + + return branchAbstract; + } + + String generateMessageInterface(EState s, String messageIfName, String endpointName, String rootPack, String mprefix) + { + // FIXME: sort cases + // FIXME: generate lattice -- cf. original handler i/f's (with "subtyping") + String messageInterface = ""; + messageInterface += "package " + rootPack + ".handlers.states." + this.self + ".messages.interfaces;\n"; + messageInterface += "\n"; + messageInterface += "public interface " + messageIfName + " {\n"; + messageInterface += "}\n"; + return messageInterface; + } + + MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) + { + return (MessageSigNameDecl) + this.job.getContext().getMainModule().getNonProtocolDecls().stream() // FIXME: main module? + .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(mid.toString())) + .iterator().next(); + } + + String getMessagesPackage(String rootPack) + { + return rootPack + ".handlers.states." + this.self + ".messages"; + } + + String generateMessageClass(boolean isSig, String messageName, EState s, + EAction a, String endpointName, String rootPack, String messageAbstractName) + { + MessageSigNameDecl msnd = null; + if (isSig) + { + msnd = getMessageSigNameDecl((MessageSigName) a.mid); + } + + String messageClass = ""; + messageClass += "package " + getMessagesPackage(rootPack) + ";\n"; + messageClass += "\n"; + // extends ScribMessage just for convenience of storing payload (peer/op pre-known) -- instances of this class never "directly" sent, cf., CBEndpoint + messageClass += "public class " + messageName + " extends org.scribble.runtime.message.ScribMessage implements " + messageAbstractName; + if (isSig) + { + messageClass += ", org.scribble.runtime.handlers.ScribSigMessage"; + } + messageClass += " {\n"; + messageClass += "private static final long serialVersionUID = 1L;\n"; + if (isSig) + { + messageClass += "private final " + msnd.extName + " m;\n"; + } + messageClass += "\n"; + messageClass += "public " + messageName + "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer"; + if (isSig) + { + messageClass += ", " + msnd.extName + " m"; + } + else + { + int i = 1; + Module main = this.job.getContext().getMainModule(); + for (PayloadElemType pet : a.payload.elems) + { + DataTypeDecl dtd = main.getDataTypeDecl((DataType) pet); + messageClass += ", " + dtd.extName + " arg" + i++; + } + } + messageClass += ") {\n"; + messageClass += "super(" + + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + + IntStream.rangeClosed(1, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining("")) + ");\n"; + if (isSig) + { + messageClass += "this.m = m;\n"; + } + messageClass += "}\n"; + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public org.scribble.type.name.Role getPeer() {\n"; + messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ";\n"; + messageClass += "}\n"; + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public org.scribble.type.name.Op getOp() {\n"; + messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";\n"; + messageClass += "}\n"; + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public Object[] getPayload() {\n"; + messageClass += "return this.payload;\n"; + messageClass += "}\n"; + if (isSig) + { + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public org.scribble.runtime.message.ScribMessage getSig() {\n"; + messageClass += "return this.m;\n"; + messageClass += "}\n"; + } + messageClass += "}\n"; + + return messageClass; +} + +String generateMessageAbstract(String messageIfName, String messageAbstractName, String endpointName, String rootPack, String mprefix) + { + String messageAbstract = ""; + messageAbstract += "package " + rootPack + ".handlers.states." + this.self + ".messages;\n"; + messageAbstract += "\n"; + messageAbstract += "public interface " + messageAbstractName + " extends org.scribble.runtime.handlers.ScribOutputEvent, " + rootPack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName + " {\n"; + messageAbstract += "}\n"; + + return messageAbstract; + } + + protected String generateStateClass(EState s, String rootPack, EStateKind kind, String stateName) + { + String stateKind; + switch (kind) + { + case OUTPUT: stateKind = "org.scribble.runtime.handlers.states.ScribOutputState"; break; + case UNARY_INPUT: + case POLY_INPUT: stateKind = "org.scribble.runtime.handlers.states.ScribInputState"; break; + case TERMINAL: stateKind = "org.scribble.runtime.handlers.states.ScribEndState"; break; + case ACCEPT: + case WRAP_SERVER: + throw new RuntimeException("TODO"); + default: + throw new RuntimeException("TODO"); + } + + ClassBuilder stateClass = new ClassBuilder(stateName); + stateClass.setPackage(getHandlersSelfPackage()); + stateClass.setSuperClass(stateKind); + stateClass.addModifiers("public", "final"); + FieldBuilder id = stateClass.newField("id"); + id.addModifiers("public", "static", "final"); + id.setType(stateName); + id.setExpression("new " + stateName + "(" + + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? getRolesPackage() + "." + this.self + "." + this.self : "") // FIXME: factor out + + ")"); + String[] params = (kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) + ? new String[] { "org.scribble.type.name.Role peer" } : new String[0]; + ConstructorBuilder cons = stateClass.newConstructor(params); + cons.addModifiers("private"); + cons.addBodyLine("super(\"" + stateName + "\"" + + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? ", peer" : "") + + ")"); + s.getAllActions().stream().forEach(a -> + { + EState succ = s.getSuccessor(a); + cons.addBodyLine("this.succs.put(" + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) // FIXME: factor out + + ", \"" + + ((succ.getStateKind() == EStateKind.TERMINAL) + ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + succ.id) // FIXME: factor out + + "\");" + ); + }); + return stateClass.build(); + + /*String stateClass = ""; + stateClass += "package " + rootPack + ".handlers.states." + this.self + ";\n"; + stateClass += "\n"; + stateClass += "public final class " + stateName + " extends " + stateKind + " {\n"; + stateClass += "public static final " + stateName + " id = new " + stateName + "(" + + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + s.getActions().get(0).peer + "." + s.getActions().get(0).peer : "") + + ");\n"; + stateClass += "private " + stateName + "(" + + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? "org.scribble.type.name.Role peer" : "") + + ") {\n"; + stateClass += ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? "super(\"" + stateName + "\", peer);" : "super(\"" + stateName + "\");") + "\n"; + for (EAction a : s.getAllActions()) + { + stateClass += "this.succs.put(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + + ", " + /*+ ((s.getSuccessor(a).id == s.id) + ? "this" + : ((s.getSuccessor(a).getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.getSuccessor(a).id) + ".id")* / + + "\"" + ((s.getSuccessor(a).getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.getSuccessor(a).id) + "\"" + + ");\n"; + } + stateClass += "}\n"; + stateClass += "}\n"; + + return stateClass;*/ + } + + private String generateRegister(GProtocolName gpn, Role self, EState s) + { + String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." ; + String res = ""; + String name = gpn.getSimpleName() + "_" + self; + switch (s.getStateKind()) + { + case OUTPUT: + { + // FIXME: "untyped" (ScribEvent) -- need state-specific "enums" + res += "public " + name + " callback(" + prefix + name + "_" + s.id + + " sid, java.util.function.Function h) {\n"; // FIXME: factor out + /*res += "this.outputs.put(sid, h);\n"; + res += "return this;\n";*/ + res += "return icallback(sid, h);\n"; + res += "}\n"; + res += "\n"; + String messageIfName = name + + s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); + res += "public\n" + + "\n" // FIXME: factor out + + name + " icallback(" + prefix + name + "_" + s.id + + " sid, java.util.function.Function h) {\n"; + res += "this.outputs.put(sid, h);\n"; + res += "return this;\n"; + res += "}\n"; + res += "\n"; + break; + } + case UNARY_INPUT: + case POLY_INPUT: + { + res += "public " + name + " callback(" + prefix + name + "_" + s.id + " sid"; + res += ", " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + "." + name + "_" + s.id + "_Branch b"; + res += ") {\n"; + res += "return icallback(sid, b);\n"; + res += "}\n"; + res += "\n"; + String T = s.getAllActions().stream().map(a -> SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + ".interfaces." + name + "__" + a.peer + "_" + + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining("")) + "").collect(Collectors.joining(" & ")) + + " & org.scribble.runtime.handlers.ScribBranch"; + res += "public " + "\n" + + name + " icallback(" + prefix + name + "_" + s.id + + " sid, T" + //+ SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + ".interfaces." + receiveIfName + " + + " b) {\n"; // FIXME: factor out + res += "this.inputs.put(sid, b);\n"; + res += "return this;\n"; + res += "}\n"; + res += "\n"; + break; + } + case TERMINAL: + { + break; + } + case ACCEPT: + case WRAP_SERVER: + { + throw new RuntimeException("[scrib] TODO: " + s); + } + default: + { + throw new RuntimeException("[scrib] Shouldn't get in here: " + s); + } + } + return res; + } + + public String generateScribbleRuntimeImports() + { + return getScribbleRuntimeImports().stream().map(x -> "import \"" + x + "\"\n").collect(Collectors.joining()); + } + + private List getScribbleRuntimeImports() // FIXME: factor up + { + return Stream.of( + //EDApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "" + ).collect(Collectors.toList()); + } + + + protected String getHandlersPackage() + { + return SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers"; + } + + protected String getHandlersSelfPackage() + { + return getHandlersPackage() + "." + this.self; + } + + protected String getStatesSelfPackage() + { + return getHandlersPackage() + ".states." + this.self; + } + + protected String getMessageAbstractName(String endpointName, EState s) + { + //return endpointName + "_" + s.id + "_Message"; + return "Pay_" + this.self + "_" + s.id; + } + + protected String getRolesPackage() + { + return SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles"; + } + + protected String getOpsPackage() + { + return SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops"; + } +} From f21255cf926cc22b8017397d2f01b292766bbeb3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Mar 2018 15:10:32 +0000 Subject: [PATCH 044/539] Continued revising CB gen API. --- .../java/org/scribble/cli/CommandLine.java | 4 +- .../callbackapi/CBEndpointApiGenerator3.java | 457 ++++++++++-------- .../codegen/java/util/TypeBuilder.java | 24 +- 3 files changed, 289 insertions(+), 196 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index bc296536c..ecb42a3c9 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -27,7 +27,7 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.global.GProtocolDecl; import org.scribble.codegen.java.JEndpointApiGenerator; -import org.scribble.codegen.java.callbackapi.CBEndpointApiGenerator; +import org.scribble.codegen.java.callbackapi.CBEndpointApiGenerator3; import org.scribble.main.AntlrSourceException; import org.scribble.main.Job; import org.scribble.main.JobContext; @@ -442,7 +442,7 @@ private void outputEventDrivenApi(Job job) throws ScribbleException, CommandLine { GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); Role self = checkRoleArg(jcontext, fullname, args[i+1]); - CBEndpointApiGenerator edgen = new CBEndpointApiGenerator(job, fullname, self, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); + CBEndpointApiGenerator3 edgen = new CBEndpointApiGenerator3(job, fullname, self, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); Map out = edgen.build(); outputClasses(out); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 77dbfa958..4308d1d4c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -25,7 +25,6 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.EStateKind; import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.Payload; import org.scribble.type.name.DataType; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.MessageSigName; @@ -85,81 +84,11 @@ public Map buildEndpointClass() throws ScribbleException // frontend handler class String rootPack = SessionApiGenerator.getEndpointApiRootPackageName(this.proto); String endpointName = this.proto.getSimpleName() + "_" + this.self; - String initStateName = getStatesSelfPackage() + "." + endpointName + "_" + init.id; // FIXME: factor out String sessClassName = rootPack + "." + this.proto.getSimpleName(); String prefix = getHandlersSelfPackage().replace('.', '/') + "/"; // StateChannelApiGenerator#generateApi - //String epClass = generateEndpointClass(rootPack, endpointName, sessClass, init, states); - ClassBuilder endpointClass = new ClassBuilder(endpointName); - endpointClass.setPackage(getHandlersSelfPackage()); - endpointClass.addModifiers("public"); - endpointClass.addParameters("D"); - endpointClass.setSuperClass("org.scribble.runtime.session.CBEndpoint<" + sessClassName + ", " + getRolesPackage() + "." + this.self + ", D>"); - ConstructorBuilder cb = endpointClass.newConstructor(sessClassName + " sess", getRolesPackage() + "." + this.self + " self", "org.scribble.runtime.message.ScribMessageFormatter smf", "D data"); - cb.addModifiers("public"); - cb.addExceptions("java.io.IOException", "org.scribble.main.ScribbleRuntimeException"); - cb.addBodyLine("super(sess, self, smf, " + initStateName + ".id, data);"); - for (EState s : states) - { - String tmp = (s.getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.id; - cb.addBodyLine("this.states.put(\"" + tmp + "\", " + getStatesSelfPackage() + "." + tmp + ".id);"); - } - MethodBuilder mb = endpointClass.newMethod("run"); - mb.addModifiers("public"); - mb.setReturn("java.util.concurrent.Future"); - mb.addExceptions("org.scribble.main.ScribbleRuntimeException"); - mb.addAnnotations("@Override"); - mb.addBodyLine("java.util.Set states = java.util.stream.Stream.of(" + initStateName + ".id).collect(java.util.stream.Collectors.toSet());"); - mb.addBodyLine("java.util.Set regd = new java.util.HashSet<>();"); - mb.addBodyLine("regd.addAll(this.inputs.keySet());"); - mb.addBodyLine("regd.addAll(this.outputs.keySet());"); - mb.addBodyLine("if (!states.equals(regd)) {"); - mb.addBodyLine("states.removeAll(regd);"); - mb.addBodyLine("throw new org.scribble.main.ScribbleRuntimeException(\"Missing state registrations: \" + states);"); - mb.addBodyLine("}"); - mb.addBodyLine("return super.run();"); - for (EState s : states) - { - switch (s.getStateKind()) - { - case OUTPUT: - { - MethodBuilder callback = endpointClass.newMethod("callback"); - callback.addModifiers("public"); - callback.setReturn(endpointName + ""); - callback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", // FIXME: factor out - "java.util.function.Function cb"); // FIXME: factor out - callback.addBodyLine("this.outputs.put(sid, cb);"); - callback.addBodyLine("return this;"); - break; - } - case UNARY_INPUT: - case POLY_INPUT: - { - MethodBuilder callback = endpointClass.newMethod("callback"); - callback.addModifiers("public"); - callback.setReturn(endpointName + ""); - callback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", getHandlersSelfPackage() + "." + endpointName + "_" + s.id + "_Branch b"); // FIXME: factor out - callback.addBodyLine("this.inputs.put(sid, b);"); - callback.addBodyLine("return this;");; - break; - } - case WRAP_SERVER: - case ACCEPT: - { - throw new RuntimeException("TODO: " + s.getStateKind()); - } - case TERMINAL: - { - break; - } - default: - { - throw new RuntimeException("Shouldn't get in here: " + s.getStateKind()); - } - } - } - res.put(prefix + endpointName + ".java", endpointClass.build()); + String epClass = generateEndpointClass(rootPack, endpointName, sessClassName, init, states); + res.put(prefix + endpointName + ".java", epClass); // states String sprefix = getStatesSelfPackage().replace('.', '/') + "/"; // StateChannelApiGenerator#generateApi @@ -170,93 +99,16 @@ public Map buildEndpointClass() throws ScribbleException String stateClass = generateStateClass(s, rootPack, kind, stateId); res.put(sprefix + stateId + ".java", stateClass); - // messages + /*// messages if (s.getStateKind() == EStateKind.OUTPUT) { String mprefix = getMessagesPackage(rootPack).replace('.', '/') + "/"; - - /*String messageIfName = endpointName + - s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); - String messageInterface = generateMessageInterface(s, messageIfName, endpointName, rootPack, mprefix); - res.put(mprefix + "interfaces/" + messageIfName + ".java", messageInterface);*/ - - String messageAbstractName = getMessageAbstractName(endpointName, s); // FIXME: is interface - //String messageAbstract = generateMessageAbstract(messageIfName, messageAbstractName, endpointName, rootPack, mprefix); - InterfaceBuilder messageAbstract = new InterfaceBuilder(messageAbstractName); - messageAbstract.setPackage(getMessagesPackage(rootPack)); - messageAbstract.addModifiers("public"); - messageAbstract.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); - res.put(mprefix + messageAbstractName + ".java", messageAbstract.build()); - - Module main = this.job.getContext().getMainModule(); - Map messageClasses = new HashMap<>(); // A class per Payload for this state - for (EAction a : s.getAllActions()) - { - /*boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() // FIXME - .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString()));*/ - - ClassBuilder messageClass; - if (!messageClasses.containsKey(a.payload)) - { - String name = //"Pay_" + - this.self + "_" + s.id + "_" // FIXME: factor out - + (a.payload.elems.isEmpty() - ? "Unit" - : a.payload.elems.stream().map(e -> - { - String extName = main.getDataTypeDecl((DataType) e).extName; - return (extName.indexOf(".") != -1) - ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) - : extName; - }).collect(Collectors.joining("_")) - ); // FIXME: extName sime // Not terminal - messageClass = new ClassBuilder(name); - messageClasses.put(a.payload, messageClass); - messageClass.setPackage(getMessagesPackage(rootPack)); - messageClass.addModifiers("public"); - messageClass.setSuperClass("org.scribble.runtime.message.ScribMessage"); - messageClass.addInterfaces(messageAbstractName); - MethodBuilder getPeer = messageClass.newMethod("getPeer"); - getPeer.addModifiers("public"); - getPeer.addAnnotations("@Override"); - getPeer.setReturn("org.scribble.type.name.Role"); - getPeer.addBodyLine("return " + getRolesPackage() + "." + a.peer + "." + a.peer + ";"); - MethodBuilder getOp = messageClass.newMethod("getOp"); - getOp.addModifiers("public"); - getOp.addAnnotations("@Override"); - getOp.setReturn("org.scribble.type.name.Op"); - getOp.addBodyLine("return " + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";"); - MethodBuilder getPayload = messageClass.newMethod("getPayload"); - getPayload.addModifiers("public"); - getPayload.addAnnotations("@Override"); - getPayload.setReturn("Object[]"); - getPayload.addBodyLine("return this.payload;"); - FieldBuilder fb = messageClass.newField("serialVersionUID"); - fb.addModifiers("private", "static", "final"); - fb.setType("long"); - fb.setExpression("1L"); - } - else - { - messageClass = messageClasses.get(a.payload); - } - - /*String messageName = isSig - ? endpointName + "_" + SessionApiGenerator.getOpClassName(a.mid) - : endpointName + "_" + s.id + "_" + SessionApiGenerator.getOpClassName(a.mid); - String messageClass = generateMessageClass(isSig, messageName, s, a, messageIfName, rootPack, messageAbstractName); - res.put(mprefix + messageName + ".java", messageClass);*/ - int[] i = { 2 }; - String[] args = new String[a.payload.elems.size() + 2]; - args[0] = getRolesPackage() + "." + a.peer + " peer"; - args[1] = getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + " op"; - a.payload.elems.forEach(e -> args[i[0]++] = main.getDataTypeDecl((DataType) e).extName + " arg" + (i[0]-3)); - ConstructorBuilder ob = messageClass.newConstructor(args); - ob.addModifiers("public"); - ob.addBodyLine("super(op" + IntStream.range(0, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining()) + ");"); - } + String messageAbstractName = getMessageAbstractName(endpointName, s); + String messageAbstractClass = generateMessageAbstractClass(messageAbstractName, rootPack, mprefix); + res.put(mprefix + messageAbstractName + ".java", messageAbstractClass); + Map messageClasses = generateMessageClasses(endpointName, s, mprefix, rootPack); messageClasses.values().forEach(c -> res.put(mprefix + c.getName() + ".java", c.build())); - } + }*/ // branches if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) @@ -289,9 +141,112 @@ public Map buildEndpointClass() throws ScribbleException return res; } - String generateEndpointClass(String rootPack, String endpointName, String sess, EState init, Set states) + /*String generateMessageAbstractClass(String messageAbstractName, String rootPack, String mprefix) { - String role = SessionApiGenerator.getRolesPackageName(this.proto) + "." + this.self; + InterfaceBuilder messageAbstract = new InterfaceBuilder( messageAbstractName); + messageAbstract.setPackage(getMessagesPackage(rootPack)); + messageAbstract.addModifiers("public"); + messageAbstract.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); + return messageAbstract.build(); + + /* //String messageIfName, String messageAbstractName, String endpointName, String rootPack, String mprefix) + String messageAbstract = ""; + messageAbstract += "package " + rootPack + ".handlers.states." + this.self + ".messages;\n"; + messageAbstract += "\n"; + messageAbstract += "public interface " + messageAbstractName + " extends org.scribble.runtime.handlers.ScribOutputEvent, " + rootPack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName + " {\n"; + messageAbstract += "}\n"; + + return messageAbstract;* / + } + + Map generateMessageClasses(String endpointName, EState s, String mprefix, String rootPack) + { + /*String messageIfName = endpointName + + s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); + String messageInterface = generateMessageInterface(s, messageIfName, endpointName, rootPack, mprefix); + res.put(mprefix + "interfaces/" + messageIfName + ".java", messageInterface);* / + + String messageAbstractName = getMessageAbstractName(endpointName, s); // FIXME: is interface -- factor out + //String messageAbstract = generateMessageAbstract(messageIfName, messageAbstractName, endpointName, rootPack, mprefix); + + Module main = this.job.getContext().getMainModule(); + Map messageClasses = new HashMap<>(); // A class per Payload for this state + for (EAction a : s.getAllActions()) + { + /*boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() // FIXME + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString()));* / + + ClassBuilder messageClass; + if (!messageClasses.containsKey(a.payload)) + { + messageClass = generateMessageClass(//isSig, messageName, + s, a, endpointName, rootPack, messageAbstractName); + messageClasses.put(a.payload, messageClass); + } + else + { + messageClass = messageClasses.get(a.payload); + } + + /*String messageName = isSig + ? endpointName + "_" + SessionApiGenerator.getOpClassName(a.mid) + : endpointName + "_" + s.id + "_" + SessionApiGenerator.getOpClassName(a.mid); + String messageClass = generateMessageClass(isSig, messageName, s, a, messageIfName, rootPack, messageAbstractName); + res.put(mprefix + messageName + ".java", messageClass);* / + int[] i = { 2 }; + String[] args = new String[a.payload.elems.size() + 2]; + args[0] = getRolesPackage() + "." + a.peer + " peer"; + args[1] = getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + " op"; + a.payload.elems.forEach(e -> args[i[0]++] = main.getDataTypeDecl((DataType) e).extName + " arg" + (i[0]-3)); + ConstructorBuilder ob = messageClass.newConstructor(args); + ob.addModifiers("public"); + ob.addBodyLine("super(op" + IntStream.range(0, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining()) + ");"); + } + return messageClasses; + }*/ + + String generateEndpointClass(String rootPack, String endpointName, String sessClassName, EState init, Set states) + { + String initStateName = getStatesSelfPackage() + "." + endpointName + "_" + init.id; // FIXME: factor out + + ClassBuilder endpointClass = new ClassBuilder(endpointName); + endpointClass.setPackage(getHandlersSelfPackage()); + endpointClass.addModifiers("public"); + endpointClass.addParameters("D"); + endpointClass.setSuperClass("org.scribble.runtime.session.CBEndpoint<" + sessClassName + ", " + getRolesPackage() + "." + this.self + ", D>"); + ConstructorBuilder cb = endpointClass.newConstructor(sessClassName + " sess", getRolesPackage() + "." + this.self + " self", "org.scribble.runtime.message.ScribMessageFormatter smf", "D data"); + cb.addModifiers("public"); + cb.addExceptions("java.io.IOException", "org.scribble.main.ScribbleRuntimeException"); + cb.addBodyLine("super(sess, self, smf, " + initStateName + ".id, data);"); + for (EState s : states) + { + String tmp = (s.getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.id; + cb.addBodyLine("this.states.put(\"" + tmp + "\", " + getStatesSelfPackage() + "." + tmp + ".id);"); + } + MethodBuilder mb = endpointClass.newMethod("run"); + mb.addModifiers("public"); + mb.setReturn("java.util.concurrent.Future"); + mb.addExceptions("org.scribble.main.ScribbleRuntimeException"); + mb.addAnnotations("@Override"); + mb.addBodyLine("java.util.Set states = java.util.stream.Stream.of(" + initStateName + ".id).collect(java.util.stream.Collectors.toSet());"); + mb.addBodyLine("java.util.Set regd = new java.util.HashSet<>();"); + mb.addBodyLine("regd.addAll(this.inputs.keySet());"); + mb.addBodyLine("regd.addAll(this.outputs.keySet());"); + mb.addBodyLine("if (!states.equals(regd)) {"); + mb.addBodyLine("states.removeAll(regd);"); + mb.addBodyLine("throw new org.scribble.main.ScribbleRuntimeException(\"Missing state registrations: \" + states);"); + mb.addBodyLine("}"); + mb.addBodyLine("return super.run();"); + for (EState s : states) + { + if (s.getStateKind() != EStateKind.TERMINAL) + { + generateRegister(endpointClass, endpointName, rootPack, s); + } + } + return endpointClass.build(); + + /*String role = SessionApiGenerator.getRolesPackageName(this.proto) + "." + this.self; String epClass = ""; epClass += "package " + rootPack + ".handlers." + this.self + ";\n"; @@ -329,7 +284,7 @@ String generateEndpointClass(String rootPack, String endpointName, String sess, epClass += "}\n"; - return epClass; + return epClass;*/ } String generateReceiveInterface(boolean isSig, MessageSigNameDecl msnd, JobContext jc, EAction a, String rootPack, String receiveIfName) @@ -437,10 +392,53 @@ String getMessagesPackage(String rootPack) return rootPack + ".handlers.states." + this.self + ".messages"; } - String generateMessageClass(boolean isSig, String messageName, EState s, - EAction a, String endpointName, String rootPack, String messageAbstractName) + ClassBuilder generateMessageClass(//boolean isSig, String messageName, + EState s, EAction a, String endpointName, String rootPack, String messageAbstractName) { - MessageSigNameDecl msnd = null; + Module main = this.job.getContext().getMainModule(); + + ClassBuilder messageClass; + String name = //"Pay_" + + this.self + "_" + s.id + "_" // FIXME: factor out + + (a.payload.elems.isEmpty() + ? "Unit" + : a.payload.elems.stream().map(e -> + { + String extName = main.getDataTypeDecl((DataType) e).extName; + return (extName.indexOf(".") != -1) + ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) + : extName; + }).collect(Collectors.joining("_")) + ); // FIXME: extName sime // Not terminal + messageClass = new ClassBuilder(name); + //messageClasses.put(a.payload, messageClass); + messageClass.setPackage(getMessagesPackage(rootPack)); + messageClass.addModifiers("public"); + messageClass.setSuperClass("org.scribble.runtime.message.ScribMessage"); + messageClass.addInterfaces(messageAbstractName); + MethodBuilder getPeer = messageClass.newMethod("getPeer"); + getPeer.addModifiers("public"); + getPeer.addAnnotations("@Override"); + getPeer.setReturn("org.scribble.type.name.Role"); + getPeer.addBodyLine("return " + getRolesPackage() + "." + a.peer + "." + a.peer + ";"); + MethodBuilder getOp = messageClass.newMethod("getOp"); + getOp.addModifiers("public"); + getOp.addAnnotations("@Override"); + getOp.setReturn("org.scribble.type.name.Op"); + getOp.addBodyLine("return " + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";"); + MethodBuilder getPayload = messageClass.newMethod("getPayload"); + getPayload.addModifiers("public"); + getPayload.addAnnotations("@Override"); + getPayload.setReturn("Object[]"); + getPayload.addBodyLine("return this.payload;"); + FieldBuilder fb = messageClass.newField("serialVersionUID"); + fb.addModifiers("private", "static", "final"); + fb.setType("long"); + fb.setExpression("1L"); + + return messageClass; + + /*MessageSigNameDecl msnd = null; if (isSig) { msnd = getMessageSigNameDecl((MessageSigName) a.mid); @@ -511,22 +509,13 @@ String generateMessageClass(boolean isSig, String messageName, EState s, } messageClass += "}\n"; - return messageClass; -} - -String generateMessageAbstract(String messageIfName, String messageAbstractName, String endpointName, String rootPack, String mprefix) - { - String messageAbstract = ""; - messageAbstract += "package " + rootPack + ".handlers.states." + this.self + ".messages;\n"; - messageAbstract += "\n"; - messageAbstract += "public interface " + messageAbstractName + " extends org.scribble.runtime.handlers.ScribOutputEvent, " + rootPack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName + " {\n"; - messageAbstract += "}\n"; - - return messageAbstract; + return messageClass;*/ } protected String generateStateClass(EState s, String rootPack, EStateKind kind, String stateName) { + Module main = this.job.getContext().getMainModule(); + String stateKind; switch (kind) { @@ -542,7 +531,7 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, } ClassBuilder stateClass = new ClassBuilder(stateName); - stateClass.setPackage(getHandlersSelfPackage()); + stateClass.setPackage(getStatesSelfPackage()); stateClass.setSuperClass(stateKind); stateClass.addModifiers("public", "final"); FieldBuilder id = stateClass.newField("id"); @@ -557,17 +546,62 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, cons.addModifiers("private"); cons.addBodyLine("super(\"" + stateName + "\"" + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? ", peer" : "") - + ")"); - s.getAllActions().stream().forEach(a -> - { - EState succ = s.getSuccessor(a); - cons.addBodyLine("this.succs.put(" + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) // FIXME: factor out - + ", \"" - + ((succ.getStateKind() == EStateKind.TERMINAL) - ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + succ.id) // FIXME: factor out - + "\");" - ); - }); + + ");"); + for (EAction a : s.getAllActions()) + { + EState succ = s.getSuccessor(a); + cons.addBodyLine("this.succs.put(" + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) // FIXME: factor out + + ", \"" + + ((succ.getStateKind() == EStateKind.TERMINAL) + ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + succ.id) // FIXME: factor out + + "\");" + ); + } + InterfaceBuilder messageIf = stateClass.newMemberInterface("Message"); // FIXME: factor out + messageIf.addModifiers("public", "static"); + messageIf.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); + s.getAllActions().stream().map(a -> a.peer).forEach(r -> + { + ClassBuilder roleClass = stateClass.newMemberClass(r.toString()); + roleClass.addModifiers("public", "static"); + ConstructorBuilder roleCons = roleClass.newConstructor(); + roleCons.addModifiers("private"); + s.getAllActions().stream().filter(a -> a.peer.equals(r)).forEach(a -> + { + String opName = SessionApiGenerator.getOpClassName(a.mid); + ClassBuilder opClass = roleClass.newMemberClass(opName); + opClass.addModifiers("public", "static"); + opClass.setSuperClass("org.scribble.runtime.message.ScribMessage"); + opClass.addInterfaces(stateName + ".Message"); // FIXME: factor out + FieldBuilder svu = opClass.newField("serialVersionUID"); + svu.addModifiers("private", "static", "final"); + svu.setType("long"); + svu.setExpression("1L"); + int[] i = { 0 }; + ConstructorBuilder opCons = opClass.newConstructor(a.payload.elems.stream().map(e -> + main.getDataTypeDecl((DataType) e).extName + " arg" + i[0]++ + ).collect(Collectors.joining(", "))); // FIXME: sig + opCons.addModifiers("public"); + opCons.addBodyLine("super(" + getOpsPackage() + "." + opName + "." + opName // CHECKME: different "op types" have same equals/hashCode -- OK? + + IntStream.range(0, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining("")) + + ");"); + MethodBuilder getPeer = opClass.newMethod("getPeer"); + getPeer.addModifiers("public"); + getPeer.addAnnotations("@Override"); + getPeer.setReturn("org.scribble.type.name.Role"); + getPeer.addBodyLine("return " + getRolesPackage() + "." + a.peer + "." + a.peer + ";"); + MethodBuilder getOp = opClass.newMethod("getOp"); + getOp.addModifiers("public"); + getOp.addAnnotations("@Override"); + getOp.setReturn("org.scribble.type.name.Op"); + getOp.addBodyLine("return " + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";"); + MethodBuilder getPayload = opClass.newMethod("getPayload"); + getPayload.addModifiers("public"); + getPayload.addAnnotations("@Override"); + getPayload.setReturn("Object[]"); + getPayload.addBodyLine("return this.payload;"); + }); + }); return stateClass.build(); /*String stateClass = ""; @@ -597,9 +631,52 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, return stateClass;*/ } - private String generateRegister(GProtocolName gpn, Role self, EState s) + //private String generateRegister(GProtocolName gpn, Role self, EState s) + private MethodBuilder generateRegister(ClassBuilder endpointClass, String endpointName, String rootPack, EState s) { - String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." ; + switch (s.getStateKind()) + { + case OUTPUT: + { + MethodBuilder callback = endpointClass.newMethod("callback"); + callback.addModifiers("public"); + callback.setReturn(endpointName + ""); + callback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", // FIXME: factor out + "java.util.function.Function cb" + ); + callback.addBodyLine("this.outputs.put(sid, cb);"); + callback.addBodyLine("return this;"); + return callback; + } + case UNARY_INPUT: + case POLY_INPUT: + { + MethodBuilder callback = endpointClass.newMethod("callback"); + callback.addModifiers("public"); + callback.setReturn(endpointName + ""); + callback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", + getHandlersSelfPackage() + "." + endpointName + "_" + s.id + "_Branch b" + ); // FIXME: factor out + callback.addBodyLine("this.inputs.put(sid, b);"); + callback.addBodyLine("return this;"); + return callback; + } + case WRAP_SERVER: + case ACCEPT: + { + throw new RuntimeException("TODO: " + s.getStateKind()); + } + case TERMINAL: + default: + { + throw new RuntimeException("Shouldn't get in here: " + s.getStateKind()); + } + } + + /*String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." ; String res = ""; String name = gpn.getSimpleName() + "_" + self; switch (s.getStateKind()) @@ -611,7 +688,7 @@ private String generateRegister(GProtocolName gpn, Role self, EState s) + " sid, java.util.function.Function h) {\n"; // FIXME: factor out /*res += "this.outputs.put(sid, h);\n"; - res += "return this;\n";*/ + res += "return this;\n";* / res += "return icallback(sid, h);\n"; res += "}\n"; res += "\n"; @@ -664,7 +741,7 @@ private String generateRegister(GProtocolName gpn, Role self, EState s) throw new RuntimeException("[scrib] Shouldn't get in here: " + s); } } - return res; + return res;*/ } public String generateScribbleRuntimeImports() diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/util/TypeBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/util/TypeBuilder.java index 8e7c68200..a2029706a 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/util/TypeBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/util/TypeBuilder.java @@ -167,6 +167,22 @@ public EnumBuilder newMemberEnum(String name) return eb; } + // Name may not be suitable -- inner? + public ClassBuilder newMemberClass(String name) + { + ClassBuilder cb = new ClassBuilder(name); + this.memberTypes.add(cb); + return cb; + } + + // Name may not be suitable -- inner? + public InterfaceBuilder newMemberInterface(String name) + { + InterfaceBuilder ib = new InterfaceBuilder(name); + this.memberTypes.add(ib); + return ib; + } + public ClassBuilder newTopLevelClass() { ClassBuilder cb = new ClassBuilder(); @@ -222,7 +238,7 @@ protected String buildFields(String clazz) if (!this.fields.isEmpty()) { clazz += "\n"; - clazz += this.fields.stream().map((fb) -> fb.build()).collect(Collectors.joining("\n")); + clazz += this.fields.stream().map(fb -> fb.build()).collect(Collectors.joining("\n")); } return clazz; } @@ -232,7 +248,7 @@ protected String buildMethods(String clazz) if (!this.methods.isEmpty()) { clazz += "\n\n"; - clazz += this.methods.stream().map((mb) -> mb.build()).collect(Collectors.joining("\n\n")); + clazz += this.methods.stream().map(mb -> mb.build()).collect(Collectors.joining("\n\n")); } return clazz; } @@ -242,7 +258,7 @@ protected String buildMemberTypes(String clazz) if (!this.memberTypes.isEmpty()) { clazz += "\n\n"; - clazz += this.memberTypes.stream().map((cb) -> cb.build()).collect(Collectors.joining("\n\n")); + clazz += this.memberTypes.stream().map(tb -> tb.build()).collect(Collectors.joining("\n\n")); } return clazz; } @@ -252,7 +268,7 @@ protected String buildTopLevelTypes(String clazz) if (!this.topLevelTypes.isEmpty()) { clazz += "\n\n"; - clazz += this.topLevelTypes.stream().map((cb) -> cb.build()).collect(Collectors.joining("\n\n")); + clazz += this.topLevelTypes.stream().map(tb -> tb.build()).collect(Collectors.joining("\n\n")); } return clazz; } From 9f48c688de026a11d828e9027f41a91b8e14ffa2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Mar 2018 15:15:47 +0000 Subject: [PATCH 045/539] Continued revising CB gen API. --- .../java/callbackapi/CBEndpointApiGenerator3.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 4308d1d4c..66f6b81ab 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -538,14 +538,15 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, id.addModifiers("public", "static", "final"); id.setType(stateName); id.setExpression("new " + stateName + "(" - + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? getRolesPackage() + "." + this.self + "." + this.self : "") // FIXME: factor out + //+ ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? getRolesPackage() + "." + this.self + "." + this.self : "") // FIXME: factor out + ")"); - String[] params = (kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) - ? new String[] { "org.scribble.type.name.Role peer" } : new String[0]; - ConstructorBuilder cons = stateClass.newConstructor(params); + /*String[] params = (kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) + ? new String[] { "org.scribble.type.name.Role peer" } : new String[0];*/ + ConstructorBuilder cons = stateClass.newConstructor(); cons.addModifiers("private"); + Role peer = (kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? s.getActions().iterator().next().peer : null; cons.addBodyLine("super(\"" + stateName + "\"" - + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? ", peer" : "") + + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? ", " + getRolesPackage() + "." + peer + "." + peer : "") // FIXME: factor out + ");"); for (EAction a : s.getAllActions()) { From 5da48f66c847e3e57b64bee2be9712e6e8c26189 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Mar 2018 15:24:44 +0000 Subject: [PATCH 046/539] Continued revising CB gen API. --- .../callbackapi/CBEndpointApiGenerator3.java | 781 +++++++++--------- 1 file changed, 390 insertions(+), 391 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 66f6b81ab..0aa535dd1 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -141,71 +141,7 @@ public Map buildEndpointClass() throws ScribbleException return res; } - /*String generateMessageAbstractClass(String messageAbstractName, String rootPack, String mprefix) - { - InterfaceBuilder messageAbstract = new InterfaceBuilder( messageAbstractName); - messageAbstract.setPackage(getMessagesPackage(rootPack)); - messageAbstract.addModifiers("public"); - messageAbstract.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); - return messageAbstract.build(); - - /* //String messageIfName, String messageAbstractName, String endpointName, String rootPack, String mprefix) - String messageAbstract = ""; - messageAbstract += "package " + rootPack + ".handlers.states." + this.self + ".messages;\n"; - messageAbstract += "\n"; - messageAbstract += "public interface " + messageAbstractName + " extends org.scribble.runtime.handlers.ScribOutputEvent, " + rootPack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName + " {\n"; - messageAbstract += "}\n"; - - return messageAbstract;* / - } - - Map generateMessageClasses(String endpointName, EState s, String mprefix, String rootPack) - { - /*String messageIfName = endpointName + - s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); - String messageInterface = generateMessageInterface(s, messageIfName, endpointName, rootPack, mprefix); - res.put(mprefix + "interfaces/" + messageIfName + ".java", messageInterface);* / - - String messageAbstractName = getMessageAbstractName(endpointName, s); // FIXME: is interface -- factor out - //String messageAbstract = generateMessageAbstract(messageIfName, messageAbstractName, endpointName, rootPack, mprefix); - - Module main = this.job.getContext().getMainModule(); - Map messageClasses = new HashMap<>(); // A class per Payload for this state - for (EAction a : s.getAllActions()) - { - /*boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() // FIXME - .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString()));* / - - ClassBuilder messageClass; - if (!messageClasses.containsKey(a.payload)) - { - messageClass = generateMessageClass(//isSig, messageName, - s, a, endpointName, rootPack, messageAbstractName); - messageClasses.put(a.payload, messageClass); - } - else - { - messageClass = messageClasses.get(a.payload); - } - - /*String messageName = isSig - ? endpointName + "_" + SessionApiGenerator.getOpClassName(a.mid) - : endpointName + "_" + s.id + "_" + SessionApiGenerator.getOpClassName(a.mid); - String messageClass = generateMessageClass(isSig, messageName, s, a, messageIfName, rootPack, messageAbstractName); - res.put(mprefix + messageName + ".java", messageClass);* / - int[] i = { 2 }; - String[] args = new String[a.payload.elems.size() + 2]; - args[0] = getRolesPackage() + "." + a.peer + " peer"; - args[1] = getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + " op"; - a.payload.elems.forEach(e -> args[i[0]++] = main.getDataTypeDecl((DataType) e).extName + " arg" + (i[0]-3)); - ConstructorBuilder ob = messageClass.newConstructor(args); - ob.addModifiers("public"); - ob.addBodyLine("super(op" + IntStream.range(0, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining()) + ");"); - } - return messageClasses; - }*/ - - String generateEndpointClass(String rootPack, String endpointName, String sessClassName, EState init, Set states) + protected String generateEndpointClass(String rootPack, String endpointName, String sessClassName, EState init, Set states) { String initStateName = getStatesSelfPackage() + "." + endpointName + "_" + init.id; // FIXME: factor out @@ -286,233 +222,121 @@ String generateEndpointClass(String rootPack, String endpointName, String sessCl return epClass;*/ } - - String generateReceiveInterface(boolean isSig, MessageSigNameDecl msnd, JobContext jc, EAction a, String rootPack, String receiveIfName) - { - String receiveInterface = ""; - receiveInterface += "package " + rootPack + ".handlers." + this.self + ".interfaces;\n"; - receiveInterface += "\n"; - receiveInterface += "public interface " + receiveIfName + " {\n"; - - receiveInterface += "\npublic void receive(D data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer, "; - if (isSig) - { - receiveInterface += msnd.extName + " m"; - } - else - { - receiveInterface += SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + " op"; - int i = 1; - for (PayloadElemType pet : a.payload.elems) - { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); - receiveInterface += ", " + dtd.extName + " arg" + i++; - } - } - receiveInterface += ");\n"; - receiveInterface += "}\n"; - - return receiveInterface; - } - - String generateBranch(String bprefix, JobContext jc, EState s, String endpointName, String rootPack, String branchName) + //private String generateRegister(GProtocolName gpn, Role self, EState s) + protected MethodBuilder generateRegister(ClassBuilder endpointClass, String endpointName, String rootPack, EState s) { - String branchAbstract = ""; - branchAbstract += "package " + rootPack + ".handlers." + this.self + ";\n"; - branchAbstract += ""; - branchAbstract += "public abstract class " + branchName + " implements org.scribble.runtime.handlers.ScribBranch"; - branchAbstract += s.getAllActions().stream().map(a -> - ", " + rootPack + ".handlers." + this.self + ".interfaces." + endpointName + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()) + "").collect(Collectors.joining("")); - branchAbstract += " {\n"; - - branchAbstract += "\n"; - branchAbstract += "@Override\n"; - branchAbstract += "public void dispatch(D data, org.scribble.runtime.message.ScribMessage m) {\n"; - branchAbstract += "switch (m.op.toString()) {\n"; - for (EAction a : s.getAllActions()) + switch (s.getStateKind()) + { + case OUTPUT: { - // FIXME: factor out - boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() - .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); - MessageSigNameDecl msnd = null; - if (isSig) - { - msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() - .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); - } - - branchAbstract += "case \"" + SessionApiGenerator.getOpClassName(a.mid) + "\": receive(data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ", "; - if (isSig) - { - branchAbstract += "(" + msnd.extName + ") m"; - } - else - { - branchAbstract += "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + ") m.op"; - } - int i = 0; - for (PayloadElemType pet : a.payload.elems) - { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); - branchAbstract += ", (" + dtd.extName + ") m.payload[" + i++ + "]"; - } - branchAbstract += "); break;\n"; + MethodBuilder callback = endpointClass.newMethod("callback"); + callback.addModifiers("public"); + callback.setReturn(endpointName + ""); + callback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", // FIXME: factor out + "java.util.function.Function cb" + ); + callback.addBodyLine("this.outputs.put(sid, cb);"); + callback.addBodyLine("return this;"); + return callback; } - branchAbstract += "default: throw new RuntimeException(\"Shouldn't get in here: \" + m);\n"; - branchAbstract += "}\n"; - branchAbstract += "}\n"; - branchAbstract += "}\n"; - - return branchAbstract; - } - - String generateMessageInterface(EState s, String messageIfName, String endpointName, String rootPack, String mprefix) - { - // FIXME: sort cases - // FIXME: generate lattice -- cf. original handler i/f's (with "subtyping") - String messageInterface = ""; - messageInterface += "package " + rootPack + ".handlers.states." + this.self + ".messages.interfaces;\n"; - messageInterface += "\n"; - messageInterface += "public interface " + messageIfName + " {\n"; - messageInterface += "}\n"; - return messageInterface; - } - - MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) - { - return (MessageSigNameDecl) - this.job.getContext().getMainModule().getNonProtocolDecls().stream() // FIXME: main module? - .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(mid.toString())) - .iterator().next(); - } - - String getMessagesPackage(String rootPack) - { - return rootPack + ".handlers.states." + this.self + ".messages"; + case UNARY_INPUT: + case POLY_INPUT: + { + MethodBuilder callback = endpointClass.newMethod("callback"); + callback.addModifiers("public"); + callback.setReturn(endpointName + ""); + callback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", + getHandlersSelfPackage() + "." + endpointName + "_" + s.id + "_Branch b" + ); // FIXME: factor out + callback.addBodyLine("this.inputs.put(sid, b);"); + callback.addBodyLine("return this;"); + return callback; + } + case WRAP_SERVER: + case ACCEPT: + { + throw new RuntimeException("TODO: " + s.getStateKind()); + } + case TERMINAL: + default: + { + throw new RuntimeException("Shouldn't get in here: " + s.getStateKind()); + } + } + + /*String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." ; + String res = ""; + String name = gpn.getSimpleName() + "_" + self; + switch (s.getStateKind()) + { + case OUTPUT: + { + // FIXME: "untyped" (ScribEvent) -- need state-specific "enums" + res += "public " + name + " callback(" + prefix + name + "_" + s.id + + " sid, java.util.function.Function h) {\n"; // FIXME: factor out + /*res += "this.outputs.put(sid, h);\n"; + res += "return this;\n";* / + res += "return icallback(sid, h);\n"; + res += "}\n"; + res += "\n"; + String messageIfName = name + + s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); + res += "public\n" + + "\n" // FIXME: factor out + + name + " icallback(" + prefix + name + "_" + s.id + + " sid, java.util.function.Function h) {\n"; + res += "this.outputs.put(sid, h);\n"; + res += "return this;\n"; + res += "}\n"; + res += "\n"; + break; + } + case UNARY_INPUT: + case POLY_INPUT: + { + res += "public " + name + " callback(" + prefix + name + "_" + s.id + " sid"; + res += ", " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + "." + name + "_" + s.id + "_Branch b"; + res += ") {\n"; + res += "return icallback(sid, b);\n"; + res += "}\n"; + res += "\n"; + String T = s.getAllActions().stream().map(a -> SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + ".interfaces." + name + "__" + a.peer + "_" + + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining("")) + "").collect(Collectors.joining(" & ")) + + " & org.scribble.runtime.handlers.ScribBranch"; + res += "public " + "\n" + + name + " icallback(" + prefix + name + "_" + s.id + + " sid, T" + //+ SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + ".interfaces." + receiveIfName + " + + " b) {\n"; // FIXME: factor out + res += "this.inputs.put(sid, b);\n"; + res += "return this;\n"; + res += "}\n"; + res += "\n"; + break; + } + case TERMINAL: + { + break; + } + case ACCEPT: + case WRAP_SERVER: + { + throw new RuntimeException("[scrib] TODO: " + s); + } + default: + { + throw new RuntimeException("[scrib] Shouldn't get in here: " + s); + } + } + return res;*/ } - ClassBuilder generateMessageClass(//boolean isSig, String messageName, - EState s, EAction a, String endpointName, String rootPack, String messageAbstractName) - { - Module main = this.job.getContext().getMainModule(); - - ClassBuilder messageClass; - String name = //"Pay_" + - this.self + "_" + s.id + "_" // FIXME: factor out - + (a.payload.elems.isEmpty() - ? "Unit" - : a.payload.elems.stream().map(e -> - { - String extName = main.getDataTypeDecl((DataType) e).extName; - return (extName.indexOf(".") != -1) - ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) - : extName; - }).collect(Collectors.joining("_")) - ); // FIXME: extName sime // Not terminal - messageClass = new ClassBuilder(name); - //messageClasses.put(a.payload, messageClass); - messageClass.setPackage(getMessagesPackage(rootPack)); - messageClass.addModifiers("public"); - messageClass.setSuperClass("org.scribble.runtime.message.ScribMessage"); - messageClass.addInterfaces(messageAbstractName); - MethodBuilder getPeer = messageClass.newMethod("getPeer"); - getPeer.addModifiers("public"); - getPeer.addAnnotations("@Override"); - getPeer.setReturn("org.scribble.type.name.Role"); - getPeer.addBodyLine("return " + getRolesPackage() + "." + a.peer + "." + a.peer + ";"); - MethodBuilder getOp = messageClass.newMethod("getOp"); - getOp.addModifiers("public"); - getOp.addAnnotations("@Override"); - getOp.setReturn("org.scribble.type.name.Op"); - getOp.addBodyLine("return " + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";"); - MethodBuilder getPayload = messageClass.newMethod("getPayload"); - getPayload.addModifiers("public"); - getPayload.addAnnotations("@Override"); - getPayload.setReturn("Object[]"); - getPayload.addBodyLine("return this.payload;"); - FieldBuilder fb = messageClass.newField("serialVersionUID"); - fb.addModifiers("private", "static", "final"); - fb.setType("long"); - fb.setExpression("1L"); - - return messageClass; - - /*MessageSigNameDecl msnd = null; - if (isSig) - { - msnd = getMessageSigNameDecl((MessageSigName) a.mid); - } - - String messageClass = ""; - messageClass += "package " + getMessagesPackage(rootPack) + ";\n"; - messageClass += "\n"; - // extends ScribMessage just for convenience of storing payload (peer/op pre-known) -- instances of this class never "directly" sent, cf., CBEndpoint - messageClass += "public class " + messageName + " extends org.scribble.runtime.message.ScribMessage implements " + messageAbstractName; - if (isSig) - { - messageClass += ", org.scribble.runtime.handlers.ScribSigMessage"; - } - messageClass += " {\n"; - messageClass += "private static final long serialVersionUID = 1L;\n"; - if (isSig) - { - messageClass += "private final " + msnd.extName + " m;\n"; - } - messageClass += "\n"; - messageClass += "public " + messageName + "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer"; - if (isSig) - { - messageClass += ", " + msnd.extName + " m"; - } - else - { - int i = 1; - Module main = this.job.getContext().getMainModule(); - for (PayloadElemType pet : a.payload.elems) - { - DataTypeDecl dtd = main.getDataTypeDecl((DataType) pet); - messageClass += ", " + dtd.extName + " arg" + i++; - } - } - messageClass += ") {\n"; - messageClass += "super(" - + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) - + IntStream.rangeClosed(1, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining("")) + ");\n"; - if (isSig) - { - messageClass += "this.m = m;\n"; - } - messageClass += "}\n"; - messageClass += "\n"; - messageClass += "@Override\n"; - messageClass += "public org.scribble.type.name.Role getPeer() {\n"; - messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ";\n"; - messageClass += "}\n"; - messageClass += "\n"; - messageClass += "@Override\n"; - messageClass += "public org.scribble.type.name.Op getOp() {\n"; - messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";\n"; - messageClass += "}\n"; - messageClass += "\n"; - messageClass += "@Override\n"; - messageClass += "public Object[] getPayload() {\n"; - messageClass += "return this.payload;\n"; - messageClass += "}\n"; - if (isSig) - { - messageClass += "\n"; - messageClass += "@Override\n"; - messageClass += "public org.scribble.runtime.message.ScribMessage getSig() {\n"; - messageClass += "return this.m;\n"; - messageClass += "}\n"; - } - messageClass += "}\n"; - - return messageClass;*/ - } - - protected String generateStateClass(EState s, String rootPack, EStateKind kind, String stateName) + protected String generateStateClass(EState s, String rootPack, EStateKind kind, String stateName) { Module main = this.job.getContext().getMainModule(); @@ -632,132 +456,281 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, return stateClass;*/ } - //private String generateRegister(GProtocolName gpn, Role self, EState s) - private MethodBuilder generateRegister(ClassBuilder endpointClass, String endpointName, String rootPack, EState s) + protected String generateBranch(String bprefix, JobContext jc, EState s, String endpointName, String rootPack, String branchName) { - switch (s.getStateKind()) - { - case OUTPUT: - { - MethodBuilder callback = endpointClass.newMethod("callback"); - callback.addModifiers("public"); - callback.setReturn(endpointName + ""); - callback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", // FIXME: factor out - "java.util.function.Function cb" - ); - callback.addBodyLine("this.outputs.put(sid, cb);"); - callback.addBodyLine("return this;"); - return callback; - } - case UNARY_INPUT: - case POLY_INPUT: - { - MethodBuilder callback = endpointClass.newMethod("callback"); - callback.addModifiers("public"); - callback.setReturn(endpointName + ""); - callback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", - getHandlersSelfPackage() + "." + endpointName + "_" + s.id + "_Branch b" - ); // FIXME: factor out - callback.addBodyLine("this.inputs.put(sid, b);"); - callback.addBodyLine("return this;"); - return callback; - } - case WRAP_SERVER: - case ACCEPT: - { - throw new RuntimeException("TODO: " + s.getStateKind()); - } - case TERMINAL: - default: - { - throw new RuntimeException("Shouldn't get in here: " + s.getStateKind()); - } - } - - /*String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." ; - String res = ""; - String name = gpn.getSimpleName() + "_" + self; - switch (s.getStateKind()) + String branchAbstract = ""; + branchAbstract += "package " + rootPack + ".handlers." + this.self + ";\n"; + branchAbstract += ""; + branchAbstract += "public abstract class " + branchName + " implements org.scribble.runtime.handlers.ScribBranch"; + branchAbstract += s.getAllActions().stream().map(a -> + ", " + rootPack + ".handlers." + this.self + ".interfaces." + endpointName + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()) + "").collect(Collectors.joining("")); + branchAbstract += " {\n"; + + branchAbstract += "\n"; + branchAbstract += "@Override\n"; + branchAbstract += "public void dispatch(D data, org.scribble.runtime.message.ScribMessage m) {\n"; + branchAbstract += "switch (m.op.toString()) {\n"; + for (EAction a : s.getAllActions()) { - case OUTPUT: + // FIXME: factor out + boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); + MessageSigNameDecl msnd = null; + if (isSig) { - // FIXME: "untyped" (ScribEvent) -- need state-specific "enums" - res += "public " + name + " callback(" + prefix + name + "_" + s.id - + " sid, java.util.function.Function h) {\n"; // FIXME: factor out - /*res += "this.outputs.put(sid, h);\n"; - res += "return this;\n";* / - res += "return icallback(sid, h);\n"; - res += "}\n"; - res += "\n"; - String messageIfName = name + - s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); - res += "public\n" - + "\n" // FIXME: factor out - + name + " icallback(" + prefix + name + "_" + s.id - + " sid, java.util.function.Function h) {\n"; - res += "this.outputs.put(sid, h);\n"; - res += "return this;\n"; - res += "}\n"; - res += "\n"; - break; + msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() + .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); } - case UNARY_INPUT: - case POLY_INPUT: + + branchAbstract += "case \"" + SessionApiGenerator.getOpClassName(a.mid) + "\": receive(data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ", "; + if (isSig) { - res += "public " + name + " callback(" + prefix + name + "_" + s.id + " sid"; - res += ", " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + "." + name + "_" + s.id + "_Branch b"; - res += ") {\n"; - res += "return icallback(sid, b);\n"; - res += "}\n"; - res += "\n"; - String T = s.getAllActions().stream().map(a -> SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + ".interfaces." + name + "__" + a.peer + "_" - + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining("")) + "").collect(Collectors.joining(" & ")) - + " & org.scribble.runtime.handlers.ScribBranch"; - res += "public " + "\n" - + name + " icallback(" + prefix + name + "_" + s.id - + " sid, T" - //+ SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + ".interfaces." + receiveIfName + " - + " b) {\n"; // FIXME: factor out - res += "this.inputs.put(sid, b);\n"; - res += "return this;\n"; - res += "}\n"; - res += "\n"; - break; + branchAbstract += "(" + msnd.extName + ") m"; } - case TERMINAL: + else { - break; + branchAbstract += "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + ") m.op"; } - case ACCEPT: - case WRAP_SERVER: + int i = 0; + for (PayloadElemType pet : a.payload.elems) { - throw new RuntimeException("[scrib] TODO: " + s); + DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + branchAbstract += ", (" + dtd.extName + ") m.payload[" + i++ + "]"; } - default: + branchAbstract += "); break;\n"; + } + branchAbstract += "default: throw new RuntimeException(\"Shouldn't get in here: \" + m);\n"; + branchAbstract += "}\n"; + branchAbstract += "}\n"; + branchAbstract += "}\n"; + + return branchAbstract; + } + + protected String generateReceiveInterface(boolean isSig, MessageSigNameDecl msnd, JobContext jc, EAction a, String rootPack, String receiveIfName) + { + String receiveInterface = ""; + receiveInterface += "package " + rootPack + ".handlers." + this.self + ".interfaces;\n"; + receiveInterface += "\n"; + receiveInterface += "public interface " + receiveIfName + " {\n"; + + + receiveInterface += "\npublic void receive(D data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer, "; + if (isSig) + { + receiveInterface += msnd.extName + " m"; + } + else + { + receiveInterface += SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + " op"; + int i = 1; + for (PayloadElemType pet : a.payload.elems) { - throw new RuntimeException("[scrib] Shouldn't get in here: " + s); + DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + receiveInterface += ", " + dtd.extName + " arg" + i++; } } - return res;*/ + receiveInterface += ");\n"; + receiveInterface += "}\n"; + + return receiveInterface; } - public String generateScribbleRuntimeImports() + /*String generateMessageAbstractClass(String messageAbstractName, String rootPack, String mprefix) { - return getScribbleRuntimeImports().stream().map(x -> "import \"" + x + "\"\n").collect(Collectors.joining()); + InterfaceBuilder messageAbstract = new InterfaceBuilder( messageAbstractName); + messageAbstract.setPackage(getMessagesPackage(rootPack)); + messageAbstract.addModifiers("public"); + messageAbstract.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); + return messageAbstract.build(); + + /* //String messageIfName, String messageAbstractName, String endpointName, String rootPack, String mprefix) + String messageAbstract = ""; + messageAbstract += "package " + rootPack + ".handlers.states." + this.self + ".messages;\n"; + messageAbstract += "\n"; + messageAbstract += "public interface " + messageAbstractName + " extends org.scribble.runtime.handlers.ScribOutputEvent, " + rootPack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName + " {\n"; + messageAbstract += "}\n"; + + return messageAbstract;* / } + + Map generateMessageClasses(String endpointName, EState s, String mprefix, String rootPack) + { + /*String messageIfName = endpointName + + s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); + String messageInterface = generateMessageInterface(s, messageIfName, endpointName, rootPack, mprefix); + res.put(mprefix + "interfaces/" + messageIfName + ".java", messageInterface);* / + + String messageAbstractName = getMessageAbstractName(endpointName, s); // FIXME: is interface -- factor out + //String messageAbstract = generateMessageAbstract(messageIfName, messageAbstractName, endpointName, rootPack, mprefix); - private List getScribbleRuntimeImports() // FIXME: factor up + Module main = this.job.getContext().getMainModule(); + Map messageClasses = new HashMap<>(); // A class per Payload for this state + for (EAction a : s.getAllActions()) + { + /*boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() // FIXME + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString()));* / + + ClassBuilder messageClass; + if (!messageClasses.containsKey(a.payload)) + { + messageClass = generateMessageClass(//isSig, messageName, + s, a, endpointName, rootPack, messageAbstractName); + messageClasses.put(a.payload, messageClass); + } + else + { + messageClass = messageClasses.get(a.payload); + } + + /*String messageName = isSig + ? endpointName + "_" + SessionApiGenerator.getOpClassName(a.mid) + : endpointName + "_" + s.id + "_" + SessionApiGenerator.getOpClassName(a.mid); + String messageClass = generateMessageClass(isSig, messageName, s, a, messageIfName, rootPack, messageAbstractName); + res.put(mprefix + messageName + ".java", messageClass);* / + int[] i = { 2 }; + String[] args = new String[a.payload.elems.size() + 2]; + args[0] = getRolesPackage() + "." + a.peer + " peer"; + args[1] = getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + " op"; + a.payload.elems.forEach(e -> args[i[0]++] = main.getDataTypeDecl((DataType) e).extName + " arg" + (i[0]-3)); + ConstructorBuilder ob = messageClass.newConstructor(args); + ob.addModifiers("public"); + ob.addBodyLine("super(op" + IntStream.range(0, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining()) + ");"); + } + return messageClasses; + } + + String generateMessageInterface(EState s, String messageIfName, String endpointName, String rootPack, String mprefix) { - return Stream.of( - //EDApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE - "" - ).collect(Collectors.toList()); + // FIXME: sort cases + // FIXME: generate lattice -- cf. original handler i/f's (with "subtyping") + String messageInterface = ""; + messageInterface += "package " + rootPack + ".handlers.states." + this.self + ".messages.interfaces;\n"; + messageInterface += "\n"; + messageInterface += "public interface " + messageIfName + " {\n"; + messageInterface += "}\n"; + return messageInterface; } + + ClassBuilder generateMessageClass(//boolean isSig, String messageName, + EState s, EAction a, String endpointName, String rootPack, String messageAbstractName) + { + Module main = this.job.getContext().getMainModule(); + + ClassBuilder messageClass; + String name = //"Pay_" + + this.self + "_" + s.id + "_" // FIXME: factor out + + (a.payload.elems.isEmpty() + ? "Unit" + : a.payload.elems.stream().map(e -> + { + String extName = main.getDataTypeDecl((DataType) e).extName; + return (extName.indexOf(".") != -1) + ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) + : extName; + }).collect(Collectors.joining("_")) + ); // FIXME: extName sime // Not terminal + messageClass = new ClassBuilder(name); + //messageClasses.put(a.payload, messageClass); + messageClass.setPackage(getMessagesPackage(rootPack)); + messageClass.addModifiers("public"); + messageClass.setSuperClass("org.scribble.runtime.message.ScribMessage"); + messageClass.addInterfaces(messageAbstractName); + MethodBuilder getPeer = messageClass.newMethod("getPeer"); + getPeer.addModifiers("public"); + getPeer.addAnnotations("@Override"); + getPeer.setReturn("org.scribble.type.name.Role"); + getPeer.addBodyLine("return " + getRolesPackage() + "." + a.peer + "." + a.peer + ";"); + MethodBuilder getOp = messageClass.newMethod("getOp"); + getOp.addModifiers("public"); + getOp.addAnnotations("@Override"); + getOp.setReturn("org.scribble.type.name.Op"); + getOp.addBodyLine("return " + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";"); + MethodBuilder getPayload = messageClass.newMethod("getPayload"); + getPayload.addModifiers("public"); + getPayload.addAnnotations("@Override"); + getPayload.setReturn("Object[]"); + getPayload.addBodyLine("return this.payload;"); + FieldBuilder fb = messageClass.newField("serialVersionUID"); + fb.addModifiers("private", "static", "final"); + fb.setType("long"); + fb.setExpression("1L"); + + return messageClass; + /*MessageSigNameDecl msnd = null; + if (isSig) + { + msnd = getMessageSigNameDecl((MessageSigName) a.mid); + } + + String messageClass = ""; + messageClass += "package " + getMessagesPackage(rootPack) + ";\n"; + messageClass += "\n"; + // extends ScribMessage just for convenience of storing payload (peer/op pre-known) -- instances of this class never "directly" sent, cf., CBEndpoint + messageClass += "public class " + messageName + " extends org.scribble.runtime.message.ScribMessage implements " + messageAbstractName; + if (isSig) + { + messageClass += ", org.scribble.runtime.handlers.ScribSigMessage"; + } + messageClass += " {\n"; + messageClass += "private static final long serialVersionUID = 1L;\n"; + if (isSig) + { + messageClass += "private final " + msnd.extName + " m;\n"; + } + messageClass += "\n"; + messageClass += "public " + messageName + "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer"; + if (isSig) + { + messageClass += ", " + msnd.extName + " m"; + } + else + { + int i = 1; + Module main = this.job.getContext().getMainModule(); + for (PayloadElemType pet : a.payload.elems) + { + DataTypeDecl dtd = main.getDataTypeDecl((DataType) pet); + messageClass += ", " + dtd.extName + " arg" + i++; + } + } + messageClass += ") {\n"; + messageClass += "super(" + + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + + IntStream.rangeClosed(1, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining("")) + ");\n"; + if (isSig) + { + messageClass += "this.m = m;\n"; + } + messageClass += "}\n"; + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public org.scribble.type.name.Role getPeer() {\n"; + messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ";\n"; + messageClass += "}\n"; + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public org.scribble.type.name.Op getOp() {\n"; + messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";\n"; + messageClass += "}\n"; + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public Object[] getPayload() {\n"; + messageClass += "return this.payload;\n"; + messageClass += "}\n"; + if (isSig) + { + messageClass += "\n"; + messageClass += "@Override\n"; + messageClass += "public org.scribble.runtime.message.ScribMessage getSig() {\n"; + messageClass += "return this.m;\n"; + messageClass += "}\n"; + } + messageClass += "}\n"; + + return messageClass;* / + }*/ protected String getHandlersPackage() { @@ -789,4 +762,30 @@ protected String getOpsPackage() { return SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops"; } + + protected String getMessagesPackage(String rootPack) + { + return rootPack + ".handlers.states." + this.self + ".messages"; + } + + protected MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) + { + return (MessageSigNameDecl) + this.job.getContext().getMainModule().getNonProtocolDecls().stream() // FIXME: main module? + .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(mid.toString())) + .iterator().next(); + } + + /*public String generateScribbleRuntimeImports() + { + return getScribbleRuntimeImports().stream().map(x -> "import \"" + x + "\"\n").collect(Collectors.joining()); + } + + private List getScribbleRuntimeImports() // FIXME: factor up + { + return Stream.of( + //EDApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "" + ).collect(Collectors.toList()); + }*/ } From cb9996db86dcaa4bfae20795fd36c40c31228e6f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Mar 2018 17:12:49 +0000 Subject: [PATCH 047/539] Continued revising CB gen API. --- .../callbackapi/CBEndpointApiGenerator3.java | 131 ++++++++++++++++-- .../codegen/java/util/MethodBuilder.java | 15 ++ 2 files changed, 131 insertions(+), 15 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 0aa535dd1..ad5fe167e 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -5,9 +5,9 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; -import java.util.stream.Stream; import org.scribble.ast.DataTypeDecl; import org.scribble.ast.MessageSigNameDecl; @@ -90,16 +90,73 @@ public Map buildEndpointClass() throws ScribbleException String epClass = generateEndpointClass(rootPack, endpointName, sessClassName, init, states); res.put(prefix + endpointName + ".java", epClass); + // output-choice message i/f's + Set outputCallbacks = new HashSet<>(); // e.g., Proto1_A__B__1_Int + Set outputChoices = new HashSet<>(); // e.g., Proto1_A__B__1_Int__C__2_Int__C__4_Str, i.e., { B__1_Int, C__2_Int, C__4_Str } + Map>> reg = new HashMap<>(); // e.g., Proto1_A__B__1_Int -> { Proto1_A__B__1_Int__C__2_Int__C__4_Str, ... } + for (EState s : states) + { + List as = s.getAllActions(); + Set set = as.stream().map(this.getCallbackSuffix).collect(Collectors.toSet()); + for (EAction a : as) + { + String callbackName = endpointName + "__" + this.getCallbackSuffix.apply(a); + outputCallbacks.add(callbackName); + if (set.size() > 1) + { + Set> tmp = reg.get(callbackName); + if (tmp == null) + { + tmp = new HashSet<>(); + reg.put(callbackName, tmp); + } + tmp.add(set); + } + } + if (as.size() > 1) + { + String outputChoiceName = endpointName + + as.stream().sorted().map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); + outputChoices.add(outputChoiceName); + } + } + for (String name : outputChoices) // TODO: full subtyping between outputChoice i/f's + { + InterfaceBuilder outputChoice = new InterfaceBuilder(name); + outputChoice.addModifiers("public"); + String pack = getHandlersSelfPackage() + ".callbacks.outputs.interfaces"; // FIXME: factor out + outputChoice.setPackage(pack); + res.put(pack.replace('.', '/') + "/" + name + ".java", outputChoice.build()); + } + for (String name : outputCallbacks) + { + InterfaceBuilder outputCallback = new InterfaceBuilder(name); + outputCallback.addModifiers("public"); + //outputCallback.addInterface("public"); + if (reg.containsKey(name)) + { + reg.get(name).forEach(iface -> + outputCallback.addInterfaces(endpointName + iface.stream().sorted().map(f -> "__" + f).collect(Collectors.joining())) + ); + } + String pack = getHandlersSelfPackage() + ".callbacks.outputs"; // FIXME: factor out + outputCallback.setPackage(pack); + res.put(pack.replace('.', '/') + "/" + name + ".java", outputCallback.build()); + } + // states String sprefix = getStatesSelfPackage().replace('.', '/') + "/"; // StateChannelApiGenerator#generateApi for (EState s : states) { EStateKind kind = s.getStateKind(); String stateId = (kind == EStateKind.TERMINAL) ? "End" : endpointName + "_" + s.id; - String stateClass = generateStateClass(s, rootPack, kind, stateId); + String stateClass = generateStateClass(s, rootPack, kind, stateId, endpointName); res.put(sprefix + stateId + ".java", stateClass); + } - /*// messages + /*// messages + for (EState s : states) + { if (s.getStateKind() == EStateKind.OUTPUT) { String mprefix = getMessagesPackage(rootPack).replace('.', '/') + "/"; @@ -108,9 +165,12 @@ public Map buildEndpointClass() throws ScribbleException res.put(mprefix + messageAbstractName + ".java", messageAbstractClass); Map messageClasses = generateMessageClasses(endpointName, s, mprefix, rootPack); messageClasses.values().forEach(c -> res.put(mprefix + c.getName() + ".java", c.build())); - }*/ + } + }*/ - // branches + // branches + for (EState s : states) + { if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) { String bprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/" + this.self + "/"; @@ -128,7 +188,8 @@ public Map buildEndpointClass() throws ScribbleException .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); } - String receiveIfName = endpointName + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()); + String receiveIfName = endpointName + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()); // FIXME: extName String receiveInterface = generateReceiveInterface(isSig, msnd, jc, a, rootPack, receiveIfName); res.put(bprefix + "interfaces/" + receiveIfName + ".java", receiveInterface); } @@ -224,7 +285,7 @@ protected String generateEndpointClass(String rootPack, String endpointName, Str } //private String generateRegister(GProtocolName gpn, Role self, EState s) - protected MethodBuilder generateRegister(ClassBuilder endpointClass, String endpointName, String rootPack, EState s) + protected void generateRegister(ClassBuilder endpointClass, String endpointName, String rootPack, EState s) { switch (s.getStateKind()) { @@ -239,9 +300,26 @@ protected MethodBuilder generateRegister(ClassBuilder endpointClass, String endp + getStatesSelfPackage() + "." + endpointName + "_" + s.id + ".Message" // FIXME: factor out -- messageIf + "> cb" ); - callback.addBodyLine("this.outputs.put(sid, cb);"); - callback.addBodyLine("return this;"); - return callback; + /*callback.addBodyLine("this.outputs.put(sid, cb);"); + callback.addBodyLine("return this;");*/ + callback.addBodyLine("return icallback(sid, cb);"); + + MethodBuilder icallback = endpointClass.newMethod("icallback"); + icallback.addModifiers("public"); + icallback.setReturn(endpointName + ""); + String iface = getHandlersSelfPackage() + + ((s.getAllActions().size() > 1) ? ".callbacks.outputs.interfaces" : ".callbacks.outputs.") // FIXME: factor out + + endpointName + s.getAllActions().stream().sorted().map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out + icallback.addTypeParameters("T extends " + iface + " & org.scribble.runtime.handlers.ScribOutputEvent"); + icallback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", // FIXME: factor out + "java.util.function.Function cb" + ); + icallback.addBodyLine("this.outputs.put(sid, cb);"); + icallback.addBodyLine("return this;"); + + break; } case UNARY_INPUT: case POLY_INPUT: @@ -254,7 +332,8 @@ protected MethodBuilder generateRegister(ClassBuilder endpointClass, String endp ); // FIXME: factor out callback.addBodyLine("this.inputs.put(sid, b);"); callback.addBodyLine("return this;"); - return callback; + + break; } case WRAP_SERVER: case ACCEPT: @@ -336,7 +415,7 @@ protected MethodBuilder generateRegister(ClassBuilder endpointClass, String endp return res;*/ } - protected String generateStateClass(EState s, String rootPack, EStateKind kind, String stateName) + protected String generateStateClass(EState s, String rootPack, EStateKind kind, String stateName, String endpointName) { Module main = this.job.getContext().getMainModule(); @@ -382,9 +461,16 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, + "\");" ); } - InterfaceBuilder messageIf = stateClass.newMemberInterface("Message"); // FIXME: factor out - messageIf.addModifiers("public", "static"); - messageIf.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); + if (s.getActions().size() > 0) + { + InterfaceBuilder messageIf = stateClass.newMemberInterface("Message"); // FIXME: factor out + messageIf.addModifiers("public", "static"); + messageIf.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); + String iface = getHandlersSelfPackage() // FIXME: factor out with generateRegister + + ((s.getAllActions().size() > 1) ? ".callbacks.outputs.interfaces" : ".callbacks.outputs.") + + endpointName + s.getAllActions().stream().sorted().map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out + messageIf.addInterfaces(iface); + } s.getAllActions().stream().map(a -> a.peer).forEach(r -> { ClassBuilder roleClass = stateClass.newMemberClass(r.toString()); @@ -398,6 +484,8 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, opClass.addModifiers("public", "static"); opClass.setSuperClass("org.scribble.runtime.message.ScribMessage"); opClass.addInterfaces(stateName + ".Message"); // FIXME: factor out + opClass.addInterfaces(getHandlersSelfPackage() + ".callbacks.outputs." // FIXME: factor out + + endpointName + "__" + this.getCallbackSuffix.apply(a)); FieldBuilder svu = opClass.newField("serialVersionUID"); svu.addModifiers("private", "static", "final"); svu.setType("long"); @@ -776,6 +864,19 @@ protected MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) .iterator().next(); } + //protected final Function, String> getExtName = e -> + protected String getExtName(PayloadElemType e) + { + String extName = this.job.getContext().getMainModule().getDataTypeDecl((DataType) e).extName; + return (extName.indexOf(".") != -1) + ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) + : extName; + }; + + protected final Function getCallbackSuffix = a -> + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + + a.payload.elems.stream().map(e -> "_" + getExtName(e)).collect(Collectors.joining("")); // FIXME: factor out + /*public String generateScribbleRuntimeImports() { return getScribbleRuntimeImports().stream().map(x -> "import \"" + x + "\"\n").collect(Collectors.joining()); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/util/MethodBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/util/MethodBuilder.java index 7dcaeff40..a8e9e02b9 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/util/MethodBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/util/MethodBuilder.java @@ -26,6 +26,7 @@ public class MethodBuilder extends JavaBuilder private final List pars = new LinkedList<>(); private final List exceptions = new LinkedList<>(); private final List body = new LinkedList<>(); + private final List typepars = new LinkedList<>(); // generic parameters protected MethodBuilder() { @@ -68,6 +69,16 @@ public List getParameters() { return this.pars; } + + public void addTypeParameters(String... par) + { + this.typepars.addAll(Arrays.asList(par)); + } + + public List getTypeParameters() + { + return this.typepars; + } public void addExceptions(String... exceptions) { @@ -110,6 +121,10 @@ protected String buildSignature(String meth) meth += this.mods.stream().collect(Collectors.joining(" ")); meth += " "; } + if (!this.typepars.isEmpty()) + { + meth += "<" + this.typepars.stream().collect(Collectors.joining(", ")) + "> "; + } if (this.ret != null) { meth += this.ret + " "; From 0c4c27977d64e52f17df5333d730c55af5aec5da Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Mar 2018 17:54:18 +0000 Subject: [PATCH 048/539] Continued revising CB gen API. --- .../callbackapi/CBEndpointApiGenerator3.java | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index ad5fe167e..8385c27a7 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -189,7 +189,7 @@ public Map buildEndpointClass() throws ScribbleException } String receiveIfName = endpointName + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) - + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()); // FIXME: extName + + a.payload.elems.stream().map(e -> "_" + getExtName(e)).collect(Collectors.joining()); // FIXME: factor out String receiveInterface = generateReceiveInterface(isSig, msnd, jc, a, rootPack, receiveIfName); res.put(bprefix + "interfaces/" + receiveIfName + ".java", receiveInterface); } @@ -330,9 +330,22 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, callback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", getHandlersSelfPackage() + "." + endpointName + "_" + s.id + "_Branch b" ); // FIXME: factor out - callback.addBodyLine("this.inputs.put(sid, b);"); - callback.addBodyLine("return this;"); + /*callback.addBodyLine("this.inputs.put(sid, b);"); + callback.addBodyLine("return this;");*/ + callback.addBodyLine("return icallback(sid, b);"); + MethodBuilder icallback = endpointClass.newMethod("icallback"); + icallback.addModifiers("public"); + icallback.setReturn(endpointName + ""); + String typepar = s.getAllActions().stream().map(a -> + getHandlersSelfPackage() + ".interfaces." + this.proto.getSimpleName() + "_" + this.self // FIXME: factor out + + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + + a.payload.elems.stream().map(e -> "_" + getExtName(e)).collect(Collectors.joining("")) + "" + ).collect(Collectors.joining(" &")); + icallback.addTypeParameters("T extends " + typepar + " & org.scribble.runtime.handlers.ScribBranch"); + icallback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", "T b"); // FIXME: factor out + icallback.addBodyLine("this.inputs.put(sid, b);"); + icallback.addBodyLine("return this;"); break; } case WRAP_SERVER: @@ -551,7 +564,9 @@ protected String generateBranch(String bprefix, JobContext jc, EState s, String branchAbstract += ""; branchAbstract += "public abstract class " + branchName + " implements org.scribble.runtime.handlers.ScribBranch"; branchAbstract += s.getAllActions().stream().map(a -> - ", " + rootPack + ".handlers." + this.self + ".interfaces." + endpointName + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()) + "").collect(Collectors.joining("")); + ", " + rootPack + ".handlers." + this.self + ".interfaces." + endpointName + "__" + a.peer + + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + getExtName(e)).collect(Collectors.joining()) + "" // FIXME: factor out + ).collect(Collectors.joining("")); branchAbstract += " {\n"; branchAbstract += "\n"; From 910f91599c1de33d1b80fb77b91b49b2ec1ce013 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Mar 2018 18:05:36 +0000 Subject: [PATCH 049/539] Continued revising CB gen API. --- .../callbackapi/CBEndpointApiGenerator3.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 8385c27a7..fc67cc284 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -32,6 +32,7 @@ import org.scribble.type.name.Role; // FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) +// FIXME: consider collecting up all interfaces as statics inside a container class public class CBEndpointApiGenerator3 { public final Job job; @@ -124,7 +125,7 @@ public Map buildEndpointClass() throws ScribbleException { InterfaceBuilder outputChoice = new InterfaceBuilder(name); outputChoice.addModifiers("public"); - String pack = getHandlersSelfPackage() + ".callbacks.outputs.interfaces"; // FIXME: factor out + String pack = getHandlersSelfPackage() + ".outputs.interfaces"; // FIXME: factor out outputChoice.setPackage(pack); res.put(pack.replace('.', '/') + "/" + name + ".java", outputChoice.build()); } @@ -139,7 +140,7 @@ public Map buildEndpointClass() throws ScribbleException outputCallback.addInterfaces(endpointName + iface.stream().sorted().map(f -> "__" + f).collect(Collectors.joining())) ); } - String pack = getHandlersSelfPackage() + ".callbacks.outputs"; // FIXME: factor out + String pack = getHandlersSelfPackage() + ".outputs"; // FIXME: factor out outputCallback.setPackage(pack); res.put(pack.replace('.', '/') + "/" + name + ".java", outputCallback.build()); } @@ -173,7 +174,7 @@ public Map buildEndpointClass() throws ScribbleException { if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) { - String bprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/" + this.self + "/"; + String bprefix = getHandlersSelfPackage().replace('.', '/') + "/"; String branchName = endpointName + "_" + s.id + "_Branch"; for (EAction a : s.getAllActions()) @@ -191,7 +192,7 @@ public Map buildEndpointClass() throws ScribbleException String receiveIfName = endpointName + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + getExtName(e)).collect(Collectors.joining()); // FIXME: factor out String receiveInterface = generateReceiveInterface(isSig, msnd, jc, a, rootPack, receiveIfName); - res.put(bprefix + "interfaces/" + receiveIfName + ".java", receiveInterface); + res.put((getHandlersSelfPackage() + ".inputs.").replace('.', '/') + receiveIfName + ".java", receiveInterface); } String branchAbstract = generateBranch(bprefix, jc, s, endpointName, rootPack, branchName); @@ -308,7 +309,7 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, icallback.addModifiers("public"); icallback.setReturn(endpointName + ""); String iface = getHandlersSelfPackage() - + ((s.getAllActions().size() > 1) ? ".callbacks.outputs.interfaces" : ".callbacks.outputs.") // FIXME: factor out + + ((s.getAllActions().size() > 1) ? ".outputs.interfaces" : ".outputs.") // FIXME: factor out + endpointName + s.getAllActions().stream().sorted().map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out icallback.addTypeParameters("T extends " + iface + " & org.scribble.runtime.handlers.ScribOutputEvent"); icallback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", // FIXME: factor out @@ -338,7 +339,7 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, icallback.addModifiers("public"); icallback.setReturn(endpointName + ""); String typepar = s.getAllActions().stream().map(a -> - getHandlersSelfPackage() + ".interfaces." + this.proto.getSimpleName() + "_" + this.self // FIXME: factor out + getHandlersSelfPackage() + ".inputs." + this.proto.getSimpleName() + "_" + this.self // FIXME: factor out + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + getExtName(e)).collect(Collectors.joining("")) + "" ).collect(Collectors.joining(" &")); @@ -480,7 +481,7 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, messageIf.addModifiers("public", "static"); messageIf.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); String iface = getHandlersSelfPackage() // FIXME: factor out with generateRegister - + ((s.getAllActions().size() > 1) ? ".callbacks.outputs.interfaces" : ".callbacks.outputs.") + + ((s.getAllActions().size() > 1) ? ".outputs.interfaces" : ".outputs.") + endpointName + s.getAllActions().stream().sorted().map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out messageIf.addInterfaces(iface); } @@ -497,7 +498,7 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, opClass.addModifiers("public", "static"); opClass.setSuperClass("org.scribble.runtime.message.ScribMessage"); opClass.addInterfaces(stateName + ".Message"); // FIXME: factor out - opClass.addInterfaces(getHandlersSelfPackage() + ".callbacks.outputs." // FIXME: factor out + opClass.addInterfaces(getHandlersSelfPackage() + ".outputs." // FIXME: factor out + endpointName + "__" + this.getCallbackSuffix.apply(a)); FieldBuilder svu = opClass.newField("serialVersionUID"); svu.addModifiers("private", "static", "final"); @@ -560,11 +561,11 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, protected String generateBranch(String bprefix, JobContext jc, EState s, String endpointName, String rootPack, String branchName) { String branchAbstract = ""; - branchAbstract += "package " + rootPack + ".handlers." + this.self + ";\n"; + branchAbstract += "package " + getHandlersSelfPackage() + ";\n"; branchAbstract += ""; branchAbstract += "public abstract class " + branchName + " implements org.scribble.runtime.handlers.ScribBranch"; branchAbstract += s.getAllActions().stream().map(a -> - ", " + rootPack + ".handlers." + this.self + ".interfaces." + endpointName + "__" + a.peer + ", " + getHandlersSelfPackage() + ".inputs." + endpointName + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + getExtName(e)).collect(Collectors.joining()) + "" // FIXME: factor out ).collect(Collectors.joining("")); branchAbstract += " {\n"; @@ -613,7 +614,7 @@ protected String generateBranch(String bprefix, JobContext jc, EState s, String protected String generateReceiveInterface(boolean isSig, MessageSigNameDecl msnd, JobContext jc, EAction a, String rootPack, String receiveIfName) { String receiveInterface = ""; - receiveInterface += "package " + rootPack + ".handlers." + this.self + ".interfaces;\n"; + receiveInterface += "package " + getHandlersSelfPackage() + ".inputs;\n"; receiveInterface += "\n"; receiveInterface += "public interface " + receiveIfName + " {\n"; @@ -837,7 +838,7 @@ ClassBuilder generateMessageClass(//boolean isSig, String messageName, protected String getHandlersPackage() { - return SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers"; + return SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".callbacks"; } protected String getHandlersSelfPackage() From a96cd0a7952be25a3e356a63ac3fd312cc805f1a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Mar 2018 18:13:01 +0000 Subject: [PATCH 050/539] Continued revising CB gen API. --- .../codegen/java/callbackapi/CBEndpointApiGenerator3.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index fc67cc284..dae8e4348 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -848,7 +848,7 @@ protected String getHandlersSelfPackage() protected String getStatesSelfPackage() { - return getHandlersPackage() + ".states." + this.self; + return getHandlersPackage() + "." + this.self + ".states"; } protected String getMessageAbstractName(String endpointName, EState s) @@ -869,7 +869,7 @@ protected String getOpsPackage() protected String getMessagesPackage(String rootPack) { - return rootPack + ".handlers.states." + this.self + ".messages"; + return rootPack + ".handlers." + this.self + ".states.messages"; } protected MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) From 0121bacc7ffcc7d92ef4647f1fd4efac0b77d896 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Mar 2018 18:23:06 +0000 Subject: [PATCH 051/539] Continued revising CB gen API. --- .../callbackapi/CBEndpointApiGenerator3.java | 19 ++++++++++++------- .../src/test/scrib/test/test2/MyA.java | 10 +++++----- .../src/test/scrib/test/test2/MyB.java | 6 +++--- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index dae8e4348..8334b2418 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -1,5 +1,6 @@ package org.scribble.codegen.java.callbackapi; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -117,7 +118,8 @@ public Map buildEndpointClass() throws ScribbleException if (as.size() > 1) { String outputChoiceName = endpointName - + as.stream().sorted().map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); + + as.stream().sorted(Comparator.comparing(a -> a.toString())) + .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); outputChoices.add(outputChoiceName); } } @@ -137,7 +139,8 @@ public Map buildEndpointClass() throws ScribbleException if (reg.containsKey(name)) { reg.get(name).forEach(iface -> - outputCallback.addInterfaces(endpointName + iface.stream().sorted().map(f -> "__" + f).collect(Collectors.joining())) + outputCallback.addInterfaces(getHandlersSelfPackage() + ".outputs.interfaces." + + endpointName + iface.stream().sorted().map(f -> "__" + f).collect(Collectors.joining())) ); } String pack = getHandlersSelfPackage() + ".outputs"; // FIXME: factor out @@ -309,8 +312,9 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, icallback.addModifiers("public"); icallback.setReturn(endpointName + ""); String iface = getHandlersSelfPackage() - + ((s.getAllActions().size() > 1) ? ".outputs.interfaces" : ".outputs.") // FIXME: factor out - + endpointName + s.getAllActions().stream().sorted().map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out + + ((s.getAllActions().size() > 1) ? ".outputs.interfaces." : ".outputs.") // FIXME: factor out + + endpointName + s.getAllActions().stream().sorted(Comparator.comparing(a -> a.toString())) + .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out icallback.addTypeParameters("T extends " + iface + " & org.scribble.runtime.handlers.ScribOutputEvent"); icallback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", // FIXME: factor out "java.util.function.Function 1) ? ".outputs.interfaces" : ".outputs.") - + endpointName + s.getAllActions().stream().sorted().map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out + + ((s.getAllActions().size() > 1) ? ".outputs.interfaces." : ".outputs.") + + endpointName + s.getAllActions().stream().sorted(Comparator.comparing(a -> a.toString())) + .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out messageIf.addInterfaces(iface); } - s.getAllActions().stream().map(a -> a.peer).forEach(r -> + s.getAllActions().stream().map(a -> a.peer).distinct().forEach(r -> { ClassBuilder roleClass = stateClass.newMemberClass(r.toString()); roleClass.addModifiers("public", "static"); diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index 021385ffe..4028107d5 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -12,9 +12,8 @@ import org.scribble.runtime.session.MPSTEndpoint; import test.test2.Test2.Proto1.Proto1; -import test.test2.Test2.Proto1.handlers.A.Proto1_A; -import test.test2.Test2.Proto1.handlers.states.A.Proto1_A_5; -import test.test2.Test2.Proto1.handlers.states.A.messages.Proto1_A_5__2; +import test.test2.Test2.Proto1.callbacks.A.Proto1_A; +import test.test2.Test2.Proto1.callbacks.A.states.Proto1_A_5; import test.test2.Test2.Proto1.roles.A; import test.test2.Test2.Proto1.statechans.A.Proto1_A_1; @@ -36,8 +35,9 @@ public static void foo3() throws IOException //TODO: test choice at A { 1() from A to B; 2() from A to C; } or { 1() from A to C; 3() from A to B; } a.icallback(Proto1_A_5.id, x -> - //new Proto1_A_5__1(B, 123)); - new Proto1_A_5__2(B, "abc")); + new Proto1_A_5.B._1(123) + //new Proto1_A_5.B._2("abc") + ); // new IntPay<>(B, _1, 123)); // IntPay -- or StrPay Future f = a.run(); // Even if registration checks still dynamic, much better to check at "session init" than partway through session after potential side effects diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java index fb39904cc..2fcb5a5c4 100644 --- a/scribble-test/src/test/scrib/test/test2/MyB.java +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -14,9 +14,9 @@ import org.scribble.runtime.util.Buf; import test.test2.Test2.Proto1.Proto1; -import test.test2.Test2.Proto1.handlers.B.Proto1_B; -import test.test2.Test2.Proto1.handlers.B.Proto1_B_10_Branch; -import test.test2.Test2.Proto1.handlers.states.B.Proto1_B_10; +import test.test2.Test2.Proto1.callbacks.B.Proto1_B; +import test.test2.Test2.Proto1.callbacks.B.Proto1_B_10_Branch; +import test.test2.Test2.Proto1.callbacks.B.states.Proto1_B_10; import test.test2.Test2.Proto1.ops._1; import test.test2.Test2.Proto1.ops._2; import test.test2.Test2.Proto1.roles.A; From 035191f63315e32703b0922ecbfe13fd4246be91 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Mar 2018 18:24:19 +0000 Subject: [PATCH 052/539] Continued revising CB gen API. --- .../codegen/java/callbackapi/CBEndpointApiGenerator3.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 8334b2418..530e801cb 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -127,7 +127,7 @@ public Map buildEndpointClass() throws ScribbleException { InterfaceBuilder outputChoice = new InterfaceBuilder(name); outputChoice.addModifiers("public"); - String pack = getHandlersSelfPackage() + ".outputs.interfaces"; // FIXME: factor out + String pack = getHandlersSelfPackage() + ".outputs.choices"; // FIXME: factor out outputChoice.setPackage(pack); res.put(pack.replace('.', '/') + "/" + name + ".java", outputChoice.build()); } @@ -139,7 +139,7 @@ public Map buildEndpointClass() throws ScribbleException if (reg.containsKey(name)) { reg.get(name).forEach(iface -> - outputCallback.addInterfaces(getHandlersSelfPackage() + ".outputs.interfaces." + outputCallback.addInterfaces(getHandlersSelfPackage() + ".outputs.choices." + endpointName + iface.stream().sorted().map(f -> "__" + f).collect(Collectors.joining())) ); } @@ -312,7 +312,7 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, icallback.addModifiers("public"); icallback.setReturn(endpointName + ""); String iface = getHandlersSelfPackage() - + ((s.getAllActions().size() > 1) ? ".outputs.interfaces." : ".outputs.") // FIXME: factor out + + ((s.getAllActions().size() > 1) ? ".outputs.choices." : ".outputs.") // FIXME: factor out + endpointName + s.getAllActions().stream().sorted(Comparator.comparing(a -> a.toString())) .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out icallback.addTypeParameters("T extends " + iface + " & org.scribble.runtime.handlers.ScribOutputEvent"); @@ -485,7 +485,7 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, messageIf.addModifiers("public", "static"); messageIf.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); String iface = getHandlersSelfPackage() // FIXME: factor out with generateRegister - + ((s.getAllActions().size() > 1) ? ".outputs.interfaces." : ".outputs.") + + ((s.getAllActions().size() > 1) ? ".outputs.choices." : ".outputs.") + endpointName + s.getAllActions().stream().sorted(Comparator.comparing(a -> a.toString())) .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out messageIf.addInterfaces(iface); From d241e342b6d29687a91ff8a5ca010de66d987394 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Mar 2018 18:32:03 +0000 Subject: [PATCH 053/539] Continued revising CB gen API. --- .../java/callbackapi/CBEndpointApiGenerator.java | 6 ++++-- .../callbackapi/CBEndpointApiGenerator3.java | 5 ++++- scribble-test/src/test/scrib/test/test3/MyA.java | 8 +++----- scribble-test/src/test/scrib/test/test3/MyB.java | 16 +++++++--------- scribble-test/src/test/scrib/test/test3/MyC.java | 6 +++--- 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 049ba75a1..225746110 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -115,8 +115,10 @@ public Map buildEndpointClass() throws ScribbleException epClass += "@Override\n"; epClass += "public java.util.concurrent.Future run() throws org.scribble.main.ScribbleRuntimeException {\n"; - epClass += "java.util.Set states = java.util.stream.Stream.of(" + states.stream().filter(s -> s.getStateKind() != EStateKind.TERMINAL).map(s -> - SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." + this.proto.getSimpleName() + "_" + this.self + "_" + s.id + ".id").collect(Collectors.joining(", ")) + ").collect(java.util.stream.Collectors.toSet());\n"; + epClass += "java.util.Set states = java.util.stream.Stream.of(" + + states.stream().filter(s -> s.getStateKind() != EStateKind.TERMINAL) + .map(s -> SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." + this.proto.getSimpleName() + "_" + this.self + "_" + s.id + ".id") + .collect(Collectors.joining(", ")) + ").collect(java.util.stream.Collectors.toSet());\n"; epClass += "java.util.Set regd = new java.util.HashSet<>();\n"; epClass += "regd.addAll(this.inputs.keySet());\n"; epClass += "regd.addAll(this.outputs.keySet());\n"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 530e801cb..2a50a042d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -229,7 +229,10 @@ protected String generateEndpointClass(String rootPack, String endpointName, Str mb.setReturn("java.util.concurrent.Future"); mb.addExceptions("org.scribble.main.ScribbleRuntimeException"); mb.addAnnotations("@Override"); - mb.addBodyLine("java.util.Set states = java.util.stream.Stream.of(" + initStateName + ".id).collect(java.util.stream.Collectors.toSet());"); + mb.addBodyLine("java.util.Set states = java.util.stream.Stream.of(" + + states.stream().filter(s -> s.getStateKind() != EStateKind.TERMINAL) + .map(s -> getStatesSelfPackage() + "." + endpointName + "_" + s.id + ".id") + .collect(Collectors.joining(", ")) + ").collect(java.util.stream.Collectors.toSet());\n"); mb.addBodyLine("java.util.Set regd = new java.util.HashSet<>();"); mb.addBodyLine("regd.addAll(this.inputs.keySet());"); mb.addBodyLine("regd.addAll(this.outputs.keySet());"); diff --git a/scribble-test/src/test/scrib/test/test3/MyA.java b/scribble-test/src/test/scrib/test/test3/MyA.java index c4dd3e751..906b5a3f6 100644 --- a/scribble-test/src/test/scrib/test/test3/MyA.java +++ b/scribble-test/src/test/scrib/test/test3/MyA.java @@ -10,10 +10,8 @@ import org.scribble.runtime.net.SocketChannelEndpoint; import test.test3.Test3.Proto1.Proto1; -import test.test3.Test3.Proto1.handlers.A.Proto1_A; -import test.test3.Test3.Proto1.handlers.states.A.Proto1_A_6; -import test.test3.Test3.Proto1.handlers.states.A.messages.Proto1_A_6__1; -import test.test3.Test3.Proto1.handlers.states.A.messages.Proto1_A_6__3;; +import test.test3.Test3.Proto1.callbacks.A.Proto1_A; +import test.test3.Test3.Proto1.callbacks.A.states.Proto1_A_6; public class MyA { @@ -25,7 +23,7 @@ public static void main(String[] args) throws IOException a.request(B, SocketChannelEndpoint::new, "localhost", 8888); a.icallback(Proto1_A_6.id, - x -> (x[0]++ < 3) ? new Proto1_A_6__1(B, 123) : new Proto1_A_6__3(B, "abc") + x -> (x[0]++ < 3) ? new Proto1_A_6.B._1(123) : new Proto1_A_6.B._3("abc") ); Future f = a.run(); diff --git a/scribble-test/src/test/scrib/test/test3/MyB.java b/scribble-test/src/test/scrib/test/test3/MyB.java index 2c36e0604..69e35dd9d 100644 --- a/scribble-test/src/test/scrib/test/test3/MyB.java +++ b/scribble-test/src/test/scrib/test/test3/MyB.java @@ -13,13 +13,11 @@ import org.scribble.runtime.net.SocketChannelServer; import test.test3.Test3.Proto1.Proto1; -import test.test3.Test3.Proto1.handlers.B.Proto1_B; -import test.test3.Test3.Proto1.handlers.B.Proto1_B_14_Branch; -import test.test3.Test3.Proto1.handlers.states.B.Proto1_B_14; -import test.test3.Test3.Proto1.handlers.states.B.Proto1_B_16; -import test.test3.Test3.Proto1.handlers.states.B.Proto1_B_17; -import test.test3.Test3.Proto1.handlers.states.B.messages.Proto1_B_16__2; -import test.test3.Test3.Proto1.handlers.states.B.messages.Proto1_B_17__4; +import test.test3.Test3.Proto1.callbacks.B.Proto1_B; +import test.test3.Test3.Proto1.callbacks.B.Proto1_B_14_Branch; +import test.test3.Test3.Proto1.callbacks.B.states.Proto1_B_14; +import test.test3.Test3.Proto1.callbacks.B.states.Proto1_B_16; +import test.test3.Test3.Proto1.callbacks.B.states.Proto1_B_17; import test.test3.Test3.Proto1.ops._1; import test.test3.Test3.Proto1.ops._3; import test.test3.Test3.Proto1.roles.A; @@ -56,8 +54,8 @@ public void receive(int[] data, A peer, _3 op, String x) b.request(C, SocketChannelEndpoint::new, "localhost", 9999); b.icallback(Proto1_B_14.id, new MyHandler()) - .icallback(Proto1_B_16.id, x -> new Proto1_B_16__2(C, 456)) - .icallback(Proto1_B_17.id, x -> new Proto1_B_17__4(C, "def")); + .icallback(Proto1_B_16.id, x -> new Proto1_B_16.C._2(456)) + .icallback(Proto1_B_17.id, x -> new Proto1_B_17.C._4("def")); Future f = b.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test3/MyC.java b/scribble-test/src/test/scrib/test/test3/MyC.java index 48292bc9f..27e192be7 100644 --- a/scribble-test/src/test/scrib/test/test3/MyC.java +++ b/scribble-test/src/test/scrib/test/test3/MyC.java @@ -11,9 +11,9 @@ import org.scribble.runtime.net.SocketChannelServer; import test.test3.Test3.Proto1.Proto1; -import test.test3.Test3.Proto1.handlers.C.Proto1_C; -import test.test3.Test3.Proto1.handlers.C.Proto1_C_22_Branch; -import test.test3.Test3.Proto1.handlers.states.C.Proto1_C_22; +import test.test3.Test3.Proto1.callbacks.C.Proto1_C; +import test.test3.Test3.Proto1.callbacks.C.Proto1_C_22_Branch; +import test.test3.Test3.Proto1.callbacks.C.states.Proto1_C_22; import test.test3.Test3.Proto1.ops._2; import test.test3.Test3.Proto1.ops._4; import test.test3.Test3.Proto1.roles.B; From e51e111c7191aba05d54e9dafab25393e37d8105 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Mar 2018 18:41:20 +0000 Subject: [PATCH 054/539] Continued revising CB gen API. --- .../callbackapi/CBEndpointApiGenerator3.java | 40 ++++++++++++------- .../src/test/scrib/test/test2/MyA.java | 9 ++--- .../src/test/scrib/test/test2/MyB.java | 11 +++-- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 2a50a042d..24c12b83b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -40,6 +40,8 @@ public class CBEndpointApiGenerator3 public final GProtocolName proto; public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral + protected final Map stateNames = new HashMap<>(); + //private final boolean subtypes; // Generate full hierarchy (states -> states, not just indivdual state -> cases) -- cf. ioifaces public CBEndpointApiGenerator3(Job job, GProtocolName fullname, Role self, boolean subtypes) @@ -57,6 +59,7 @@ public CBEndpointApiGenerator3(Job job, GProtocolName fullname, Role self, boole public Map build() throws ScribbleException { + this.stateNames.clear(); Map res = new HashMap<>(); // filepath -> source res.putAll(buildSessionApi()); return res; @@ -83,9 +86,17 @@ public Map buildEndpointClass() throws ScribbleException states.add(init); states.addAll(MState.getReachableStates(init)); + String endpointName = this.proto.getSimpleName() + "_" + this.self; + int i = 1; + for (EState s : states) + { + EStateKind kind = s.getStateKind(); + String stateName = (kind == EStateKind.TERMINAL) ? "End" : endpointName + "_" + i++; + this.stateNames.put(s.id, stateName); + } + // frontend handler class String rootPack = SessionApiGenerator.getEndpointApiRootPackageName(this.proto); - String endpointName = this.proto.getSimpleName() + "_" + this.self; String sessClassName = rootPack + "." + this.proto.getSimpleName(); String prefix = getHandlersSelfPackage().replace('.', '/') + "/"; // StateChannelApiGenerator#generateApi @@ -153,9 +164,9 @@ public Map buildEndpointClass() throws ScribbleException for (EState s : states) { EStateKind kind = s.getStateKind(); - String stateId = (kind == EStateKind.TERMINAL) ? "End" : endpointName + "_" + s.id; - String stateClass = generateStateClass(s, rootPack, kind, stateId, endpointName); - res.put(sprefix + stateId + ".java", stateClass); + String stateName = this.stateNames.get(s.id); + String stateClass = generateStateClass(s, rootPack, kind, stateName, endpointName); + res.put(sprefix + stateName + ".java", stateClass); } /*// messages @@ -178,7 +189,7 @@ public Map buildEndpointClass() throws ScribbleException if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) { String bprefix = getHandlersSelfPackage().replace('.', '/') + "/"; - String branchName = endpointName + "_" + s.id + "_Branch"; + String branchName = this.stateNames.get(s.id) + "_Branch"; for (EAction a : s.getAllActions()) { @@ -208,7 +219,7 @@ public Map buildEndpointClass() throws ScribbleException protected String generateEndpointClass(String rootPack, String endpointName, String sessClassName, EState init, Set states) { - String initStateName = getStatesSelfPackage() + "." + endpointName + "_" + init.id; // FIXME: factor out + String initStateName = getStatesSelfPackage() + "." + this.stateNames.get(init.id);//endpointName + "_" + init.id; // FIXME: factor out ClassBuilder endpointClass = new ClassBuilder(endpointName); endpointClass.setPackage(getHandlersSelfPackage()); @@ -221,7 +232,8 @@ protected String generateEndpointClass(String rootPack, String endpointName, Str cb.addBodyLine("super(sess, self, smf, " + initStateName + ".id, data);"); for (EState s : states) { - String tmp = (s.getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.id; + //String tmp = (s.getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.id; + String tmp = this.stateNames.get(s.id); cb.addBodyLine("this.states.put(\"" + tmp + "\", " + getStatesSelfPackage() + "." + tmp + ".id);"); } MethodBuilder mb = endpointClass.newMethod("run"); @@ -231,7 +243,7 @@ protected String generateEndpointClass(String rootPack, String endpointName, Str mb.addAnnotations("@Override"); mb.addBodyLine("java.util.Set states = java.util.stream.Stream.of(" + states.stream().filter(s -> s.getStateKind() != EStateKind.TERMINAL) - .map(s -> getStatesSelfPackage() + "." + endpointName + "_" + s.id + ".id") + .map(s -> getStatesSelfPackage() + "." + this.stateNames.get(s.id) + ".id") .collect(Collectors.joining(", ")) + ").collect(java.util.stream.Collectors.toSet());\n"); mb.addBodyLine("java.util.Set regd = new java.util.HashSet<>();"); mb.addBodyLine("regd.addAll(this.inputs.keySet());"); @@ -301,10 +313,10 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, MethodBuilder callback = endpointClass.newMethod("callback"); callback.addModifiers("public"); callback.setReturn(endpointName + ""); - callback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", // FIXME: factor out + callback.addParameters(getStatesSelfPackage() + "." + this.stateNames.get(s.id) + " sid", // FIXME: factor out "java.util.function.Function cb" ); /*callback.addBodyLine("this.outputs.put(sid, cb);"); @@ -319,7 +331,7 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, + endpointName + s.getAllActions().stream().sorted(Comparator.comparing(a -> a.toString())) .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out icallback.addTypeParameters("T extends " + iface + " & org.scribble.runtime.handlers.ScribOutputEvent"); - icallback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", // FIXME: factor out + icallback.addParameters(getStatesSelfPackage() + "." + this.stateNames.get(s.id) + " sid", // FIXME: factor out "java.util.function.Function cb" @@ -335,8 +347,8 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, MethodBuilder callback = endpointClass.newMethod("callback"); callback.addModifiers("public"); callback.setReturn(endpointName + ""); - callback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", - getHandlersSelfPackage() + "." + endpointName + "_" + s.id + "_Branch b" + callback.addParameters(getStatesSelfPackage() + "." + this.stateNames.get(s.id) + " sid", + getHandlersSelfPackage() + "." + this.stateNames.get(s.id) + "_Branch b" ); // FIXME: factor out /*callback.addBodyLine("this.inputs.put(sid, b);"); callback.addBodyLine("return this;");*/ @@ -351,7 +363,7 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, + a.payload.elems.stream().map(e -> "_" + getExtName(e)).collect(Collectors.joining("")) + "" ).collect(Collectors.joining(" &")); icallback.addTypeParameters("T extends " + typepar + " & org.scribble.runtime.handlers.ScribBranch"); - icallback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", "T b"); // FIXME: factor out + icallback.addParameters(getStatesSelfPackage() + "." + this.stateNames.get(s.id) + " sid", "T b"); // FIXME: factor out icallback.addBodyLine("this.inputs.put(sid, b);"); icallback.addBodyLine("return this;"); break; diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index 4028107d5..25ecfcf67 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -13,9 +13,8 @@ import test.test2.Test2.Proto1.Proto1; import test.test2.Test2.Proto1.callbacks.A.Proto1_A; -import test.test2.Test2.Proto1.callbacks.A.states.Proto1_A_5; +import test.test2.Test2.Proto1.callbacks.A.states.Proto1_A_1; import test.test2.Test2.Proto1.roles.A; -import test.test2.Test2.Proto1.statechans.A.Proto1_A_1; // TODO: test interop between ED API and SC API (also for sig messages) public class MyA @@ -34,8 +33,8 @@ public static void foo3() throws IOException //TODO: test choice at A { 1() from A to B; 2() from A to C; } or { 1() from A to C; 3() from A to B; } - a.icallback(Proto1_A_5.id, x -> - new Proto1_A_5.B._1(123) + a.icallback(Proto1_A_1.id, x -> + new Proto1_A_1.B._1(123) //new Proto1_A_5.B._2("abc") ); // new IntPay<>(B, _1, 123)); // IntPay -- or StrPay @@ -79,7 +78,7 @@ public static void foo1() { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); - new Proto1_A_1(a).send(B, _1, 123); + new test.test2.Test2.Proto1.statechans.A.Proto1_A_1(a).send(B, _1, 123); //new Proto1_A_1(a).send(B, _2, "abc"); } catch (Exception e) diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java index 2fcb5a5c4..4ecaff818 100644 --- a/scribble-test/src/test/scrib/test/test2/MyB.java +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -15,14 +15,13 @@ import test.test2.Test2.Proto1.Proto1; import test.test2.Test2.Proto1.callbacks.B.Proto1_B; -import test.test2.Test2.Proto1.callbacks.B.Proto1_B_10_Branch; -import test.test2.Test2.Proto1.callbacks.B.states.Proto1_B_10; +import test.test2.Test2.Proto1.callbacks.B.Proto1_B_1_Branch; +import test.test2.Test2.Proto1.callbacks.B.states.Proto1_B_1; import test.test2.Test2.Proto1.ops._1; import test.test2.Test2.Proto1.ops._2; import test.test2.Test2.Proto1.roles.A; import test.test2.Test2.Proto1.roles.B; import test.test2.Test2.Proto1.statechans.B.EndSocket; -import test.test2.Test2.Proto1.statechans.B.Proto1_B_1; import test.test2.Test2.Proto1.statechans.B.Proto1_B_1_Handler; public class MyB @@ -34,7 +33,7 @@ public static void main(String[] args) throws IOException public static void foo3() throws IOException { - class MyHandler extends Proto1_B_10_Branch + class MyHandler extends Proto1_B_1_Branch { @Override public void receive(Void data, A peer, _1 op, Integer arg1) @@ -58,7 +57,7 @@ public void receive(Void data, A peer, _2 op, String arg1) { b.accept(ss, A); - b.icallback(Proto1_B_10.id, new MyHandler()); + b.icallback(Proto1_B_1.id, new MyHandler()); Future f = b.run(); f.get(); @@ -127,7 +126,7 @@ public void receive(EndSocket schan, _2 op, Buf arg1) throws ScribbleRun { b.accept(ss, A); - new Proto1_B_1(b).branch(A, new MyHandler()); + new test.test2.Test2.Proto1.statechans.B.Proto1_B_1(b).branch(A, new MyHandler()); } catch (Exception e)//ScribbleRuntimeException | IOException | ExecutionException | InterruptedException | ClassNotFoundException e) { From 0c43924afba089df7b2c0029630e0bbfa633b507 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Mar 2018 18:44:25 +0000 Subject: [PATCH 055/539] Continued revising CB gen API. --- .../callbackapi/CBEndpointApiGenerator3.java | 5 +++-- scribble-test/src/test/scrib/test/test3/MyA.java | 8 ++++---- scribble-test/src/test/scrib/test/test3/MyB.java | 16 ++++++++-------- scribble-test/src/test/scrib/test/test3/MyC.java | 8 ++++---- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 24c12b83b..637d7155a 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -489,8 +489,9 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, EState succ = s.getSuccessor(a); cons.addBodyLine("this.succs.put(" + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) // FIXME: factor out + ", \"" - + ((succ.getStateKind() == EStateKind.TERMINAL) - ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + succ.id) // FIXME: factor out + /*+ ((succ.getStateKind() == EStateKind.TERMINAL) + ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + succ.id) // FIXME: factor out*/ + + this.stateNames.get(succ.id) + "\");" ); } diff --git a/scribble-test/src/test/scrib/test/test3/MyA.java b/scribble-test/src/test/scrib/test/test3/MyA.java index 906b5a3f6..ab60b6c63 100644 --- a/scribble-test/src/test/scrib/test/test3/MyA.java +++ b/scribble-test/src/test/scrib/test/test3/MyA.java @@ -11,7 +11,7 @@ import test.test3.Test3.Proto1.Proto1; import test.test3.Test3.Proto1.callbacks.A.Proto1_A; -import test.test3.Test3.Proto1.callbacks.A.states.Proto1_A_6; +import test.test3.Test3.Proto1.callbacks.A.states.Proto1_A_1; public class MyA { @@ -22,9 +22,9 @@ public static void main(String[] args) throws IOException { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); - a.icallback(Proto1_A_6.id, - x -> (x[0]++ < 3) ? new Proto1_A_6.B._1(123) : new Proto1_A_6.B._3("abc") - ); + a.icallback(Proto1_A_1.id, + x -> (x[0]++ < 3) ? new Proto1_A_1.B._1(123) : new Proto1_A_1.B._3("abc") + ); Future f = a.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test3/MyB.java b/scribble-test/src/test/scrib/test/test3/MyB.java index 69e35dd9d..82ab7c004 100644 --- a/scribble-test/src/test/scrib/test/test3/MyB.java +++ b/scribble-test/src/test/scrib/test/test3/MyB.java @@ -14,10 +14,10 @@ import test.test3.Test3.Proto1.Proto1; import test.test3.Test3.Proto1.callbacks.B.Proto1_B; -import test.test3.Test3.Proto1.callbacks.B.Proto1_B_14_Branch; -import test.test3.Test3.Proto1.callbacks.B.states.Proto1_B_14; -import test.test3.Test3.Proto1.callbacks.B.states.Proto1_B_16; -import test.test3.Test3.Proto1.callbacks.B.states.Proto1_B_17; +import test.test3.Test3.Proto1.callbacks.B.Proto1_B_1_Branch; +import test.test3.Test3.Proto1.callbacks.B.states.Proto1_B_1; +import test.test3.Test3.Proto1.callbacks.B.states.Proto1_B_2; +import test.test3.Test3.Proto1.callbacks.B.states.Proto1_B_3; import test.test3.Test3.Proto1.ops._1; import test.test3.Test3.Proto1.ops._3; import test.test3.Test3.Proto1.roles.A; @@ -26,7 +26,7 @@ public class MyB { public static void main(String[] args) throws IOException { - class MyHandler extends Proto1_B_14_Branch + class MyHandler extends Proto1_B_1_Branch { @Override public void receive(int[] data, A peer, _1 op, Integer x) @@ -53,9 +53,9 @@ public void receive(int[] data, A peer, _3 op, String x) b.accept(ss, A); b.request(C, SocketChannelEndpoint::new, "localhost", 9999); - b.icallback(Proto1_B_14.id, new MyHandler()) - .icallback(Proto1_B_16.id, x -> new Proto1_B_16.C._2(456)) - .icallback(Proto1_B_17.id, x -> new Proto1_B_17.C._4("def")); + b.icallback(Proto1_B_1.id, new MyHandler()) + .icallback(Proto1_B_2.id, x -> new Proto1_B_2.C._2(456)) + .icallback(Proto1_B_3.id, x -> new Proto1_B_3.C._4("def")); Future f = b.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test3/MyC.java b/scribble-test/src/test/scrib/test/test3/MyC.java index 27e192be7..74223e2c7 100644 --- a/scribble-test/src/test/scrib/test/test3/MyC.java +++ b/scribble-test/src/test/scrib/test/test3/MyC.java @@ -12,8 +12,8 @@ import test.test3.Test3.Proto1.Proto1; import test.test3.Test3.Proto1.callbacks.C.Proto1_C; -import test.test3.Test3.Proto1.callbacks.C.Proto1_C_22_Branch; -import test.test3.Test3.Proto1.callbacks.C.states.Proto1_C_22; +import test.test3.Test3.Proto1.callbacks.C.Proto1_C_1_Branch; +import test.test3.Test3.Proto1.callbacks.C.states.Proto1_C_1; import test.test3.Test3.Proto1.ops._2; import test.test3.Test3.Proto1.ops._4; import test.test3.Test3.Proto1.roles.B; @@ -22,7 +22,7 @@ public class MyC { public static void main(String[] args) throws IOException { - class MyHandler extends Proto1_C_22_Branch + class MyHandler extends Proto1_C_1_Branch { @Override public void receive(Void data, B peer, _2 op, Integer x) @@ -46,7 +46,7 @@ public void receive(Void data, B peer, _4 op, String x) { b.accept(ss, B); - b.icallback(Proto1_C_22.id, new MyHandler()); + b.icallback(Proto1_C_1.id, new MyHandler()); Future f = b.run(); f.get(); From bc470208d9c80c5d1267c717685f2f14d410e5b0 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Mar 2018 18:57:57 +0000 Subject: [PATCH 056/539] Continued revising CB gen API. --- .../src/test/scrib/test/test5/MyA.java | 18 +++++-------- .../src/test/scrib/test/test5/MyB.java | 10 +++---- .../src/test/scrib/test/test5/MyC.java | 10 +++---- .../src/test/scrib/test/test6/MyA.java | 26 +++++++++---------- .../src/test/scrib/test/test6/MyB.java | 26 +++++++++---------- .../src/test/scrib/test/test7/MyA.java | 14 +++++----- .../src/test/scrib/test/test7/MyB.java | 14 +++++----- 7 files changed, 54 insertions(+), 64 deletions(-) diff --git a/scribble-test/src/test/scrib/test/test5/MyA.java b/scribble-test/src/test/scrib/test/test5/MyA.java index b2772fa03..536b14c18 100644 --- a/scribble-test/src/test/scrib/test/test5/MyA.java +++ b/scribble-test/src/test/scrib/test/test5/MyA.java @@ -11,14 +11,10 @@ import org.scribble.runtime.net.SocketChannelEndpoint; import test.test5.Test5.Proto1.Proto1; -import test.test5.Test5.Proto1.handlers.A.Proto1_A; -import test.test5.Test5.Proto1.handlers.states.A.Proto1_A_10; -import test.test5.Test5.Proto1.handlers.states.A.Proto1_A_11; -import test.test5.Test5.Proto1.handlers.states.A.Proto1_A_8; -import test.test5.Test5.Proto1.handlers.states.A.messages.Proto1_A_10__2; -import test.test5.Test5.Proto1.handlers.states.A.messages.Proto1_A_11__4; -import test.test5.Test5.Proto1.handlers.states.A.messages.Proto1_A_8__1; -import test.test5.Test5.Proto1.handlers.states.A.messages.Proto1_A_8__3;; +import test.test5.Test5.Proto1.callbacks.A.Proto1_A; +import test.test5.Test5.Proto1.callbacks.A.states.Proto1_A_1; +import test.test5.Test5.Proto1.callbacks.A.states.Proto1_A_2; +import test.test5.Test5.Proto1.callbacks.A.states.Proto1_A_3; public class MyA { @@ -30,9 +26,9 @@ public static void main(String[] args) throws IOException a.request(B, SocketChannelEndpoint::new, "localhost", 8888); a.request(C, SocketChannelEndpoint::new, "localhost", 9999); - a.icallback(Proto1_A_8.id, x -> (x[0]++ < 3) ? new Proto1_A_8__1(B, 123) : new Proto1_A_8__3(B, "abc")) - .icallback(Proto1_A_10.id, x -> new Proto1_A_10__2(C, 456)) - .icallback(Proto1_A_11.id, x -> new Proto1_A_11__4(C, "def")); + a.icallback(Proto1_A_1.id, x -> (x[0]++ < 3) ? new Proto1_A_1.B._1(123) : new Proto1_A_1.B._3("abc")) + .icallback(Proto1_A_2.id, x -> new Proto1_A_2.C._2(456)) + .icallback(Proto1_A_3.id, x -> new Proto1_A_3.C._4("def")); Future f = a.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test5/MyB.java b/scribble-test/src/test/scrib/test/test5/MyB.java index 045dc121d..2b45af08a 100644 --- a/scribble-test/src/test/scrib/test/test5/MyB.java +++ b/scribble-test/src/test/scrib/test/test5/MyB.java @@ -11,9 +11,9 @@ import org.scribble.runtime.net.SocketChannelServer; import test.test5.Test5.Proto1.Proto1; -import test.test5.Test5.Proto1.handlers.B.Proto1_B; -import test.test5.Test5.Proto1.handlers.B.Proto1_B_16_Branch; -import test.test5.Test5.Proto1.handlers.states.B.Proto1_B_16; +import test.test5.Test5.Proto1.callbacks.B.Proto1_B; +import test.test5.Test5.Proto1.callbacks.B.Proto1_B_1_Branch; +import test.test5.Test5.Proto1.callbacks.B.states.Proto1_B_1; import test.test5.Test5.Proto1.ops._1; import test.test5.Test5.Proto1.ops._3; import test.test5.Test5.Proto1.roles.A; @@ -22,7 +22,7 @@ public class MyB { public static void main(String[] args) throws IOException { - class MyHandler extends Proto1_B_16_Branch + class MyHandler extends Proto1_B_1_Branch { @Override public void receive(int[] data, A peer, _1 op, Integer x) @@ -48,7 +48,7 @@ public void receive(int[] data, A peer, _3 op, String x) { b.accept(ss, A); - b.icallback(Proto1_B_16.id, new MyHandler()); + b.icallback(Proto1_B_1.id, new MyHandler()); Future f = b.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test5/MyC.java b/scribble-test/src/test/scrib/test/test5/MyC.java index 246ed1a7e..1a41cd793 100644 --- a/scribble-test/src/test/scrib/test/test5/MyC.java +++ b/scribble-test/src/test/scrib/test/test5/MyC.java @@ -11,9 +11,9 @@ import org.scribble.runtime.net.SocketChannelServer; import test.test5.Test5.Proto1.Proto1; -import test.test5.Test5.Proto1.handlers.C.Proto1_C; -import test.test5.Test5.Proto1.handlers.C.Proto1_C_22_Branch; -import test.test5.Test5.Proto1.handlers.states.C.Proto1_C_22; +import test.test5.Test5.Proto1.callbacks.C.Proto1_C; +import test.test5.Test5.Proto1.callbacks.C.Proto1_C_1_Branch; +import test.test5.Test5.Proto1.callbacks.C.states.Proto1_C_1; import test.test5.Test5.Proto1.ops._2; import test.test5.Test5.Proto1.ops._4; import test.test5.Test5.Proto1.roles.A; @@ -22,7 +22,7 @@ public class MyC { public static void main(String[] args) throws IOException { - class MyHandler extends Proto1_C_22_Branch + class MyHandler extends Proto1_C_1_Branch { @Override public void receive(Void data, A peer, _2 op, Integer x) @@ -46,7 +46,7 @@ public void receive(Void data, A peer, _4 op, String x) { b.accept(ss, A); - b.icallback(Proto1_C_22.id, new MyHandler()); + b.icallback(Proto1_C_1.id, new MyHandler()); Future f = b.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test6/MyA.java b/scribble-test/src/test/scrib/test/test6/MyA.java index c10b7effe..aaa246bde 100644 --- a/scribble-test/src/test/scrib/test/test6/MyA.java +++ b/scribble-test/src/test/scrib/test/test6/MyA.java @@ -11,14 +11,12 @@ import org.scribble.runtime.net.SocketChannelEndpoint; import test.test6.Test6.Proto1.Proto1; -import test.test6.Test6.Proto1.handlers.A.Proto1_A; -import test.test6.Test6.Proto1.handlers.A.Proto1_A_10_Branch; -import test.test6.Test6.Proto1.handlers.states.A.Proto1_A_10; -import test.test6.Test6.Proto1.handlers.states.A.Proto1_A_11; -import test.test6.Test6.Proto1.handlers.states.A.Proto1_A_12; -import test.test6.Test6.Proto1.handlers.states.A.Proto1_A_8; -import test.test6.Test6.Proto1.handlers.states.A.messages.Proto1_A_8_Message; -import test.test6.Test6.Proto1.handlers.states.A.messages.Proto1_A_8__1; +import test.test6.Test6.Proto1.callbacks.A.Proto1_A; +import test.test6.Test6.Proto1.callbacks.A.Proto1_A_2_Branch; +import test.test6.Test6.Proto1.callbacks.A.states.Proto1_A_1; +import test.test6.Test6.Proto1.callbacks.A.states.Proto1_A_2; +import test.test6.Test6.Proto1.callbacks.A.states.Proto1_A_3; +import test.test6.Test6.Proto1.callbacks.A.states.Proto1_A_4; import test.test6.Test6.Proto1.ops._2; import test.test6.Test6.Proto1.roles.B;; @@ -26,7 +24,7 @@ public class MyA { public static void main(String[] args) throws IOException { - class MyHandler extends Proto1_A_10_Branch + class MyHandler extends Proto1_A_2_Branch { @Override public void receive(int[] data, B peer, _2 op, String arg1) @@ -40,13 +38,13 @@ public void receive(int[] data, B peer, _2 op, String arg1) { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); - Function h1 = x -> new Proto1_A_8__1(B, x[0]++); + Function h1 = x -> new Proto1_A_1.B._1(x[0]++); MyHandler h2 = new MyHandler(); - a.icallback(Proto1_A_8.id, h1) - .icallback(Proto1_A_10.id, h2) - .icallback(Proto1_A_11.id, h1) - .icallback(Proto1_A_12.id, h2); + a.icallback(Proto1_A_1.id, h1) + .icallback(Proto1_A_2.id, h2) + .icallback(Proto1_A_3.id, h1) + .icallback(Proto1_A_4.id, h2); Future f = a.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test6/MyB.java b/scribble-test/src/test/scrib/test/test6/MyB.java index 97f31574f..f9074a0c1 100644 --- a/scribble-test/src/test/scrib/test/test6/MyB.java +++ b/scribble-test/src/test/scrib/test/test6/MyB.java @@ -12,20 +12,18 @@ import org.scribble.runtime.net.SocketChannelServer; import test.test6.Test6.Proto1.Proto1; -import test.test6.Test6.Proto1.handlers.B.Proto1_B; -import test.test6.Test6.Proto1.handlers.B.Proto1_B_19_Branch; -import test.test6.Test6.Proto1.handlers.states.B.Proto1_B_19; -import test.test6.Test6.Proto1.handlers.states.B.Proto1_B_21; -import test.test6.Test6.Proto1.handlers.states.B.Proto1_B_22; -import test.test6.Test6.Proto1.handlers.states.B.Proto1_B_23; -import test.test6.Test6.Proto1.handlers.states.B.messages.Proto1_B_21_Message; -import test.test6.Test6.Proto1.handlers.states.B.messages.Proto1_B_21__2; +import test.test6.Test6.Proto1.callbacks.B.Proto1_B; +import test.test6.Test6.Proto1.callbacks.B.Proto1_B_3_Branch; +import test.test6.Test6.Proto1.callbacks.B.states.Proto1_B_1; +import test.test6.Test6.Proto1.callbacks.B.states.Proto1_B_2; +import test.test6.Test6.Proto1.callbacks.B.states.Proto1_B_3; +import test.test6.Test6.Proto1.callbacks.B.states.Proto1_B_4; public class MyB { public static void main(String[] args) throws IOException { - class MyHandler extends Proto1_B_19_Branch + class MyHandler extends Proto1_B_3_Branch { @Override public void receive(String[] data, test.test6.Test6.Proto1.roles.A peer, test.test6.Test6.Proto1.ops._1 op, Integer arg1) @@ -46,12 +44,12 @@ public void receive(String[] data, test.test6.Test6.Proto1.roles.A peer, test.te b.accept(ss, A); MyHandler h1 = new MyHandler(); - Function h2 = x -> new Proto1_B_21__2(A, x[0] += "a"); + Function h2 = x -> new Proto1_B_4.A._2(x[0] += "a"); - b.icallback(Proto1_B_19.id, h1) - .icallback(Proto1_B_21.id, h2) - .icallback(Proto1_B_22.id, h1) - .icallback(Proto1_B_23.id, h2); + b.icallback(Proto1_B_1.id, h1) + .icallback(Proto1_B_2.id, h2) + .icallback(Proto1_B_3.id, h1) + .icallback(Proto1_B_4.id, h2); Future f = b.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test7/MyA.java b/scribble-test/src/test/scrib/test/test7/MyA.java index 2b25e1eb5..e085bd33e 100644 --- a/scribble-test/src/test/scrib/test/test7/MyA.java +++ b/scribble-test/src/test/scrib/test/test7/MyA.java @@ -11,11 +11,9 @@ import org.scribble.runtime.net.SocketChannelEndpoint; import test.test7.Test7.Proto1.Proto1; -import test.test7.Test7.Proto1.handlers.A.Proto1_A; -import test.test7.Test7.Proto1.handlers.states.A.Proto1_A_6; -import test.test7.Test7.Proto1.handlers.states.A.Proto1_A_8; -import test.test7.Test7.Proto1.handlers.states.A.messages.Proto1_A_6_Message; -import test.test7.Test7.Proto1.handlers.states.A.messages.Proto1_A_6__2;; +import test.test7.Test7.Proto1.callbacks.A.Proto1_A; +import test.test7.Test7.Proto1.callbacks.A.states.Proto1_A_1; +import test.test7.Test7.Proto1.callbacks.A.states.Proto1_A_2; public class MyA { @@ -27,10 +25,10 @@ public static void main(String[] args) throws IOException { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); - Function h = x -> new Proto1_A_6__2(B, (x[0] += "a")); + Function h = x -> new Proto1_A_1.B._2((x[0] += "a")); - a.icallback(Proto1_A_6.id, h) - .icallback(Proto1_A_8.id, h); + a.icallback(Proto1_A_1.id, h) + .icallback(Proto1_A_2.id, h); Future f = a.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test7/MyB.java b/scribble-test/src/test/scrib/test/test7/MyB.java index 2b72c727f..e11342e15 100644 --- a/scribble-test/src/test/scrib/test/test7/MyB.java +++ b/scribble-test/src/test/scrib/test/test7/MyB.java @@ -11,10 +11,10 @@ import org.scribble.runtime.net.SocketChannelServer; import test.test7.Test7.Proto1.Proto1; -import test.test7.Test7.Proto1.handlers.B.Proto1_B; -import test.test7.Test7.Proto1.handlers.B.Proto1_B_13_Branch; -import test.test7.Test7.Proto1.handlers.states.B.Proto1_B_13; -import test.test7.Test7.Proto1.handlers.states.B.Proto1_B_15; +import test.test7.Test7.Proto1.callbacks.B.Proto1_B; +import test.test7.Test7.Proto1.callbacks.B.Proto1_B_1_Branch; +import test.test7.Test7.Proto1.callbacks.B.states.Proto1_B_1; +import test.test7.Test7.Proto1.callbacks.B.states.Proto1_B_2; import test.test7.Test7.Proto1.ops._1; import test.test7.Test7.Proto1.ops._2; import test.test7.Test7.Proto1.roles.A; @@ -23,7 +23,7 @@ public class MyB { public static void main(String[] args) throws IOException { - class MyHandler extends Proto1_B_13_Branch + class MyHandler extends Proto1_B_1_Branch { @Override public void receive(int[] data, A peer, _1 op, Integer arg1) @@ -48,8 +48,8 @@ public void receive(int[] data, A peer, _2 op, String arg1) b.accept(ss, A); MyHandler h = new MyHandler(); - b.icallback(Proto1_B_13.id, h) - .icallback(Proto1_B_15.id, h); + b.icallback(Proto1_B_1.id, h) + .icallback(Proto1_B_2.id, h); Future f = b.run(); f.get(); From 0101258a46ca6ea15d8d29442cf17e12a8d0b37c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Mar 2018 19:20:16 +0000 Subject: [PATCH 057/539] Continued revising CB gen API. --- .../callbackapi/CBEndpointApiGenerator3.java | 44 ++++++++++++++++--- .../src/test/scrib/test/test3/MyA.java | 2 +- .../src/test/scrib/test/test3/MyB.java | 2 + .../src/test/scrib/test/test4/MyA.java | 12 +++-- .../src/test/scrib/test/test4/MyB.java | 10 ++--- 5 files changed, 51 insertions(+), 19 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 637d7155a..f5898a16d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -478,16 +478,16 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, + ")"); /*String[] params = (kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? new String[] { "org.scribble.type.name.Role peer" } : new String[0];*/ - ConstructorBuilder cons = stateClass.newConstructor(); - cons.addModifiers("private"); + ConstructorBuilder stateCons = stateClass.newConstructor(); + stateCons.addModifiers("private"); Role peer = (kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? s.getActions().iterator().next().peer : null; - cons.addBodyLine("super(\"" + stateName + "\"" + stateCons.addBodyLine("super(\"" + stateName + "\"" + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? ", " + getRolesPackage() + "." + peer + "." + peer : "") // FIXME: factor out + ");"); for (EAction a : s.getAllActions()) { EState succ = s.getSuccessor(a); - cons.addBodyLine("this.succs.put(" + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) // FIXME: factor out + stateCons.addBodyLine("this.succs.put(" + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) // FIXME: factor out + ", \"" /*+ ((succ.getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + succ.id) // FIXME: factor out*/ @@ -526,13 +526,45 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, svu.setType("long"); svu.setExpression("1L"); int[] i = { 0 }; - ConstructorBuilder opCons = opClass.newConstructor(a.payload.elems.stream().map(e -> + + // FIXME: factor out + boolean isSig = main.getNonProtocolDecls().stream() + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); + MessageSigNameDecl msnd = null; + if (isSig) + { + msnd = (MessageSigNameDecl) main.getNonProtocolDecls().stream() + .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); + FieldBuilder m = opClass.newField("m"); + m.addModifiers("private", "final"); + m.setType(msnd.extName); + } + + ConstructorBuilder opCons; + if (isSig) + { + opCons = opClass.newConstructor(msnd.extName + " m"); + opClass.addInterfaces("org.scribble.runtime.handlers.ScribSigMessage"); + } + else + { + opCons = opClass.newConstructor(a.payload.elems.stream().map(e -> main.getDataTypeDecl((DataType) e).extName + " arg" + i[0]++ - ).collect(Collectors.joining(", "))); // FIXME: sig + ).collect(Collectors.joining(", "))); + } opCons.addModifiers("public"); opCons.addBodyLine("super(" + getOpsPackage() + "." + opName + "." + opName // CHECKME: different "op types" have same equals/hashCode -- OK? + IntStream.range(0, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining("")) + ");"); + if (isSig) + { + opCons.addBodyLine("this.m = m;"); + MethodBuilder getSig = opClass.newMethod("getSig"); + getSig.addModifiers("public"); + getSig.addAnnotations("@Override"); + getSig.setReturn("org.scribble.runtime.message.ScribMessage"); + getSig.addBodyLine("return this.m;"); + } MethodBuilder getPeer = opClass.newMethod("getPeer"); getPeer.addModifiers("public"); getPeer.addAnnotations("@Override"); diff --git a/scribble-test/src/test/scrib/test/test3/MyA.java b/scribble-test/src/test/scrib/test/test3/MyA.java index ab60b6c63..80c4abddc 100644 --- a/scribble-test/src/test/scrib/test/test3/MyA.java +++ b/scribble-test/src/test/scrib/test/test3/MyA.java @@ -25,7 +25,7 @@ public static void main(String[] args) throws IOException a.icallback(Proto1_A_1.id, x -> (x[0]++ < 3) ? new Proto1_A_1.B._1(123) : new Proto1_A_1.B._3("abc") ); - + Future f = a.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test3/MyB.java b/scribble-test/src/test/scrib/test/test3/MyB.java index 82ab7c004..74acbd162 100644 --- a/scribble-test/src/test/scrib/test/test3/MyB.java +++ b/scribble-test/src/test/scrib/test/test3/MyB.java @@ -56,6 +56,8 @@ public void receive(int[] data, A peer, _3 op, String x) b.icallback(Proto1_B_1.id, new MyHandler()) .icallback(Proto1_B_2.id, x -> new Proto1_B_2.C._2(456)) .icallback(Proto1_B_3.id, x -> new Proto1_B_3.C._4("def")); + + //b.icallback(Proto1_B_2.id, x -> new Proto1_B_3.C._4("def")); Future f = b.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test4/MyA.java b/scribble-test/src/test/scrib/test/test4/MyA.java index 47188eeb5..319ce859a 100644 --- a/scribble-test/src/test/scrib/test/test4/MyA.java +++ b/scribble-test/src/test/scrib/test/test4/MyA.java @@ -9,10 +9,8 @@ import org.scribble.runtime.net.SocketChannelEndpoint; import test.test4.Test4.Proto1.Proto1; -import test.test4.Test4.Proto1.handlers.A.Proto1_A; -import test.test4.Test4.Proto1.handlers.states.A.Proto1_A_6; -import test.test4.Test4.Proto1.handlers.states.A.messages.Proto1_A_Bar; -import test.test4.Test4.Proto1.handlers.states.A.messages.Proto1_A_Foo; +import test.test4.Test4.Proto1.callbacks.A.Proto1_A; +import test.test4.Test4.Proto1.callbacks.A.states.Proto1_A_1; import test.test4.sig.Bar; import test.test4.sig.Foo; import test.test4.sig.Test4Formatter;; @@ -26,10 +24,10 @@ public static void main(String[] args) throws IOException { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); - a.icallback(Proto1_A_6.id, - x -> (x[0]++ < 5) ? new Proto1_A_Foo(B, new Foo("abc" + x[0])) : new Proto1_A_Bar(B, new Bar(123)) + a.icallback(Proto1_A_1.id, + x -> (x[0]++ < 5) ? new Proto1_A_1.B.Foo(new Foo("abc" + x[0])) : new Proto1_A_1.B.Bar(new Bar(123)) ); - // FIXME: remove sid from message class for sigs + // FIXME: "inline" Sig class constructor args directly as Op class constructor args Future f = a.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test4/MyB.java b/scribble-test/src/test/scrib/test/test4/MyB.java index a6988131b..0e3c72ee7 100644 --- a/scribble-test/src/test/scrib/test/test4/MyB.java +++ b/scribble-test/src/test/scrib/test/test4/MyB.java @@ -10,9 +10,9 @@ import org.scribble.runtime.net.SocketChannelServer; import test.test4.Test4.Proto1.Proto1; -import test.test4.Test4.Proto1.handlers.B.Proto1_B; -import test.test4.Test4.Proto1.handlers.B.Proto1_B_12_Branch; -import test.test4.Test4.Proto1.handlers.states.B.Proto1_B_12; +import test.test4.Test4.Proto1.callbacks.B.Proto1_B; +import test.test4.Test4.Proto1.callbacks.B.Proto1_B_1_Branch; +import test.test4.Test4.Proto1.callbacks.B.states.Proto1_B_1; import test.test4.Test4.Proto1.roles.A; import test.test4.sig.Bar; import test.test4.sig.Foo; @@ -22,7 +22,7 @@ public class MyB { public static void main(String[] args) throws IOException { - class MyHandler extends Proto1_B_12_Branch + class MyHandler extends Proto1_B_1_Branch { @Override public void receive(int[] data, A peer, Foo m) @@ -48,7 +48,7 @@ public void receive(int[] data, A peer, Bar m) { b.accept(ss, A); - b.icallback(Proto1_B_12.id, new MyHandler()); + b.icallback(Proto1_B_1.id, new MyHandler()); Future f = b.run(); f.get(); From 9570ffcc1cb68ea311a23e3cf145bf698f19f59b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Mar 2018 19:39:41 +0000 Subject: [PATCH 058/539] Continued revising CB gen API. --- .../src/test/scrib/test/test8/MyA.java | 67 ++++++++++++++++ .../src/test/scrib/test/test8/MyB.java | 79 +++++++++++++++++++ .../src/test/scrib/test/test8/MyC.java | 76 ++++++++++++++++++ .../src/test/scrib/test/test8/Test8.scr | 28 +++++++ 4 files changed, 250 insertions(+) create mode 100644 scribble-test/src/test/scrib/test/test8/MyA.java create mode 100644 scribble-test/src/test/scrib/test/test8/MyB.java create mode 100644 scribble-test/src/test/scrib/test/test8/MyC.java create mode 100644 scribble-test/src/test/scrib/test/test8/Test8.scr diff --git a/scribble-test/src/test/scrib/test/test8/MyA.java b/scribble-test/src/test/scrib/test/test8/MyA.java new file mode 100644 index 000000000..16972b2d8 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test8/MyA.java @@ -0,0 +1,67 @@ +package test.test8; + +import static test.test8.Test8.Proto1.Proto1.A; +import static test.test8.Test8.Proto1.Proto1.B; +import static test.test8.Test8.Proto1.Proto1.C; + +import java.io.IOException; +import java.util.concurrent.Future; + +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; + +import test.test8.Test8.Proto1.Proto1; +import test.test8.Test8.Proto1.callbacks.A.Proto1_A; +import test.test8.Test8.Proto1.callbacks.A.states.Proto1_A_1; +import test.test8.Test8.Proto1.callbacks.A.states.Proto1_A_2; +import test.test8.Test8.Proto1.callbacks.A.states.Proto1_A_3; +import test.test8.Test8.Proto1.callbacks.A.states.Proto1_A_4; +import test.test8.Test8.Proto1.callbacks.A.states.Proto1_A_5; + +public class MyA +{ + public static void main(String[] args) throws IOException + { + foo(); + } + + public static void foo() throws IOException + { + Proto1 P1 = new Proto1(); + try (Proto1_A a = new Proto1_A<>(P1, A, new ObjectStreamFormatter(), new int[] { 0 })) + { + a.request(B, SocketChannelEndpoint::new, "localhost", 8888); + a.request(C, SocketChannelEndpoint::new, "localhost", 9999); + + a.icallback(Proto1_A_1.id, + x -> (x[0]++ < 3) ? new Proto1_A_1.B._1(x[0]) : new Proto1_A_1.C._4("abc") + ); + a.icallback(Proto1_A_2.id, x -> new Proto1_A_2.B._1(123)); + a.icallback(Proto1_A_3.id, x -> new Proto1_A_3.C._3()); + a.icallback(Proto1_A_4.id, x -> new Proto1_A_4.B._3(456)); + a.icallback(Proto1_A_5.id, x -> new Proto1_A_5.B._4("def")); + + /*a.callback(Proto1_A_1.id, x -> new Proto1_A_1.B._1("abc")); + a.callback(Proto1_A_1.id, x -> new Proto1_A_1.B._2(123)); + a.callback(Proto1_A_1.id, x -> new Proto1_A_1.C._1(123)); + a.callback(Proto1_A_1.id, x -> new Proto1_A_5.B._4("def")); + + a.icallback(Proto1_A_1.id, x -> new Proto1_A_1.B._1("abc")); + a.icallback(Proto1_A_1.id, x -> new Proto1_A_1.B._2(123)); + a.icallback(Proto1_A_1.id, x -> new Proto1_A_1.C._1(123)); + a.icallback(Proto1_A_1.id, x -> new Proto1_A_5.B._4("def"));*/ + + //a.callback(Proto1_A_2.id, x -> new Proto1_A_1.B._1(123)); + a.icallback(Proto1_A_2.id, x -> new Proto1_A_1.B._1(123)); + + Future f = a.run(); + f.get(); + + System.out.println("(A) end"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } +} diff --git a/scribble-test/src/test/scrib/test/test8/MyB.java b/scribble-test/src/test/scrib/test/test8/MyB.java new file mode 100644 index 000000000..0863f5858 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test8/MyB.java @@ -0,0 +1,79 @@ +package test.test8; + +import static test.test8.Test8.Proto1.Proto1.A; +import static test.test8.Test8.Proto1.Proto1.B; + +import java.io.IOException; +import java.util.concurrent.Future; + +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; + +import test.test8.Test8.Proto1.Proto1; +import test.test8.Test8.Proto1.callbacks.B.Proto1_B; +import test.test8.Test8.Proto1.callbacks.B.Proto1_B_1_Branch; +import test.test8.Test8.Proto1.callbacks.B.states.Proto1_B_1; +import test.test8.Test8.Proto1.callbacks.B.states.Proto1_B_2; +import test.test8.Test8.Proto1.ops._1; +import test.test8.Test8.Proto1.ops._3; +import test.test8.Test8.Proto1.ops._4; +import test.test8.Test8.Proto1.roles.A; + +public class MyB +{ + public static void main(String[] args) throws IOException + { + foo(); + } + + public static void foo() throws IOException + { + class MyHandler extends Proto1_B_1_Branch + { + @Override + public void receive(Void data, A peer, _1 op, Integer arg1) + { + System.out.println("(B) received 1: " + arg1); + } + + @Override + public void receive(Void data, A peer, _3 op, Integer arg1) + { + System.out.println("(B) received 3: " + arg1); + } + + @Override + public void receive(Void data, A peer, _4 op, String arg1) + { + System.out.println("(B) received 4: " + arg1); + } + } + + try (ScribServerSocket ss = new SocketChannelServer(8888)) + { + while (true) + { + Proto1 P1 = new Proto1(); + try (Proto1_B b = new Proto1_B<>(P1, B, new ObjectStreamFormatter(), null)) + { + b.accept(ss, A); + + MyHandler h = new MyHandler(); + b.icallback(Proto1_B_1.id, h); + //b.callback(Proto1_B_2.id, h); + b.icallback(Proto1_B_2.id, h); + + Future f = b.run(); + f.get(); + + System.out.println("(B) end"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + } +} diff --git a/scribble-test/src/test/scrib/test/test8/MyC.java b/scribble-test/src/test/scrib/test/test8/MyC.java new file mode 100644 index 000000000..13d80c686 --- /dev/null +++ b/scribble-test/src/test/scrib/test/test8/MyC.java @@ -0,0 +1,76 @@ +package test.test8; + +import static test.test8.Test8.Proto1.Proto1.A; +import static test.test8.Test8.Proto1.Proto1.C; + +import java.io.IOException; +import java.util.concurrent.Future; + +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; + +import test.test8.Test8.Proto1.Proto1; +import test.test8.Test8.Proto1.callbacks.C.Proto1_C; +import test.test8.Test8.Proto1.callbacks.C.Proto1_C_1_Branch; +import test.test8.Test8.Proto1.callbacks.C.states.Proto1_C_1; +import test.test8.Test8.Proto1.ops._2; +import test.test8.Test8.Proto1.ops._3; +import test.test8.Test8.Proto1.ops._4; +import test.test8.Test8.Proto1.roles.A; + +public class MyC +{ + public static void main(String[] args) throws IOException + { + foo(); + } + + public static void foo() throws IOException + { + class MyHandler extends Proto1_C_1_Branch + { + @Override + public void receive(Void data, A peer, _3 op) + { + System.out.println("(C) received 3: "); + } + + @Override + public void receive(Void data, A peer, _2 op, Integer arg1) + { + System.out.println("(C) received 2: " + arg1); + } + + @Override + public void receive(Void data, A peer, _4 op, String arg1) + { + System.out.println("(C) received 4: " + arg1); + } + } + + try (ScribServerSocket ss = new SocketChannelServer(9999)) + { + while (true) + { + Proto1 P1 = new Proto1(); + try (Proto1_C b = new Proto1_C<>(P1, C, new ObjectStreamFormatter(), null)) + { + b.accept(ss, A); + + MyHandler h = new MyHandler(); + b.icallback(Proto1_C_1.id, h); + + Future f = b.run(); + f.get(); + + System.out.println("(C) end"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + } +} diff --git a/scribble-test/src/test/scrib/test/test8/Test8.scr b/scribble-test/src/test/scrib/test/test8/Test8.scr new file mode 100644 index 000000000..0f77b4e3d --- /dev/null +++ b/scribble-test/src/test/scrib/test/test8/Test8.scr @@ -0,0 +1,28 @@ +//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test8/Test8.scr -d scribble-test/src/test/scrib/ -cbapi Proto1 A -cbapi Proto1 B -cbapi Proto1 C +//$ javadoc -cp scribble-cli/target/classes/';'scribble-test/target/classes';'scribble-parser/target/classes';'scribble-parser/lib/antlr-3.5.2-complete.jar';'scrib-core/src/test/scrib scrib-core/src/test/scrib/test/test8/Proto1*.java -d test/doc/test8 + +module test.test8.Test8; + +type "java.lang.Integer" from "rt.jar" as Int; +type "java.lang.String" from "rt.jar" as Str; + +global protocol Proto1(role A, role B, role C) +{ + choice at A + { + 1(Int) from A to B; + 1(Int) from A to B; + 3() from A to C; + //1(Int) from A to C; + } + or + { + 2(Int) from A to C; + 3(Int) from A to B; + } + or + { + 4(Str) from A to C; + 4(Str) from A to B; + } +} From 88cd45ebfe92416309c03a240862875b71959413 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Mar 2018 19:47:12 +0000 Subject: [PATCH 059/539] Minor. --- .../codegen/java/callbackapi/CBEndpointApiGenerator3.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index f5898a16d..feec886eb 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -33,7 +33,7 @@ import org.scribble.type.name.Role; // FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) -// FIXME: consider collecting up all interfaces as statics inside a container class +// FIXME: consider collecting up all interfaces as statics inside a container class -- also states? public class CBEndpointApiGenerator3 { public final Job job; @@ -134,7 +134,7 @@ public Map buildEndpointClass() throws ScribbleException outputChoices.add(outputChoiceName); } } - for (String name : outputChoices) // TODO: full subtyping between outputChoice i/f's + for (String name : outputChoices) // TODO: -subtypes -- full subtyping between outputChoice i/f's { InterfaceBuilder outputChoice = new InterfaceBuilder(name); outputChoice.addModifiers("public"); @@ -146,7 +146,6 @@ public Map buildEndpointClass() throws ScribbleException { InterfaceBuilder outputCallback = new InterfaceBuilder(name); outputCallback.addModifiers("public"); - //outputCallback.addInterface("public"); if (reg.containsKey(name)) { reg.get(name).forEach(iface -> @@ -361,7 +360,7 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, getHandlersSelfPackage() + ".inputs." + this.proto.getSimpleName() + "_" + this.self // FIXME: factor out + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + getExtName(e)).collect(Collectors.joining("")) + "" - ).collect(Collectors.joining(" &")); + ).collect(Collectors.joining(" & ")); icallback.addTypeParameters("T extends " + typepar + " & org.scribble.runtime.handlers.ScribBranch"); icallback.addParameters(getStatesSelfPackage() + "." + this.stateNames.get(s.id) + " sid", "T b"); // FIXME: factor out icallback.addBodyLine("this.inputs.put(sid, b);"); From d1e821b25b95758652cb730a8d1d3272caeeb08e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 20 Mar 2018 09:58:02 +0000 Subject: [PATCH 060/539] Minor. --- .../callbackapi/CBEndpointApiGenerator3.java | 26 ++++++++++--------- .../scribble/runtime/session/CBEndpoint.java | 2 +- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index feec886eb..252663ef6 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -34,6 +34,8 @@ // FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) // FIXME: consider collecting up all interfaces as statics inside a container class -- also states? +// FIXME: integrate CB (branch) interfaces with old callback API +// FIXME: consider also "expanding" nested message constructors by op first? -- and consider "partial constructors" along expansions, can they be parameterised typed? public class CBEndpointApiGenerator3 { public final Job job; @@ -527,17 +529,17 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, int[] i = { 0 }; // FIXME: factor out - boolean isSig = main.getNonProtocolDecls().stream() - .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); - MessageSigNameDecl msnd = null; - if (isSig) - { - msnd = (MessageSigNameDecl) main.getNonProtocolDecls().stream() - .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); - FieldBuilder m = opClass.newField("m"); - m.addModifiers("private", "final"); - m.setType(msnd.extName); - } + boolean isSig = main.getNonProtocolDecls().stream() + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); + MessageSigNameDecl msnd = null; + if (isSig) + { + msnd = (MessageSigNameDecl) main.getNonProtocolDecls().stream() + .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); + FieldBuilder m = opClass.newField("m"); + m.addModifiers("private", "final"); + m.setType(msnd.extName); + } ConstructorBuilder opCons; if (isSig) @@ -610,6 +612,7 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, return stateClass;*/ } + // FIXME: refactor using TypeBuilder API protected String generateBranch(String bprefix, JobContext jc, EState s, String endpointName, String rootPack, String branchName) { String branchAbstract = ""; @@ -670,7 +673,6 @@ protected String generateReceiveInterface(boolean isSig, MessageSigNameDecl msnd receiveInterface += "\n"; receiveInterface += "public interface " + receiveIfName + " {\n"; - receiveInterface += "\npublic void receive(D data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer, "; if (isSig) { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java index ac3a06f1d..c82c01d0e 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java @@ -55,7 +55,7 @@ public Future run() throws ScribbleRuntimeException { Object[] res = new Object[1]; - // FIXME: integrate with selector + // FIXME: integrate with selector (or make Executor) new Thread() { private final CBEndpoint edep; From 7fa30583e1a7782f48666e1eb1043e75ff9a3788 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 20 Mar 2018 11:40:10 +0000 Subject: [PATCH 061/539] Continued revising CB gen API. --- .../callbackapi/CBEndpointApiGenerator3.java | 52 +++++++++++++------ 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 252663ef6..71b319abf 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -34,7 +34,7 @@ // FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) // FIXME: consider collecting up all interfaces as statics inside a container class -- also states? -// FIXME: integrate CB (branch) interfaces with old callback API +// FIXME: integrate CB (branch) interfaces with old iointerfacs/callback API // FIXME: consider also "expanding" nested message constructors by op first? -- and consider "partial constructors" along expansions, can they be parameterised typed? public class CBEndpointApiGenerator3 { @@ -115,7 +115,10 @@ public Map buildEndpointClass() throws ScribbleException Set set = as.stream().map(this.getCallbackSuffix).collect(Collectors.toSet()); for (EAction a : as) { - String callbackName = endpointName + "__" + this.getCallbackSuffix.apply(a); + String callbackName = + //endpointName + "OCallback_" + this.self // FIXME: factor out // Cf. ICAllback, has self (due to message expansion nesting) + + "__" + this.getCallbackSuffix.apply(a); outputCallbacks.add(callbackName); if (set.size() > 1) { @@ -130,7 +133,9 @@ public Map buildEndpointClass() throws ScribbleException } if (as.size() > 1) { - String outputChoiceName = endpointName + String outputChoiceName = + //endpointName + "Select_" + this.self // FIXME: factor out // Cf. original iointerfaces + as.stream().sorted(Comparator.comparing(a -> a.toString())) .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); outputChoices.add(outputChoiceName); @@ -152,7 +157,9 @@ public Map buildEndpointClass() throws ScribbleException { reg.get(name).forEach(iface -> outputCallback.addInterfaces(getHandlersSelfPackage() + ".outputs.choices." - + endpointName + iface.stream().sorted().map(f -> "__" + f).collect(Collectors.joining())) + //+ endpointName + + "Select_" + this.self // FIXME: factor out + + iface.stream().sorted().map(f -> "__" + f).collect(Collectors.joining())) ); } String pack = getHandlersSelfPackage() + ".outputs"; // FIXME: factor out @@ -204,7 +211,10 @@ public Map buildEndpointClass() throws ScribbleException .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); } - String receiveIfName = endpointName + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + String receiveIfName = + //endpointName + "__" + "ICallback__" + + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + getExtName(e)).collect(Collectors.joining()); // FIXME: factor out String receiveInterface = generateReceiveInterface(isSig, msnd, jc, a, rootPack, receiveIfName); res.put((getHandlersSelfPackage() + ".inputs.").replace('.', '/') + receiveIfName + ".java", receiveInterface); @@ -328,8 +338,10 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, icallback.addModifiers("public"); icallback.setReturn(endpointName + ""); String iface = getHandlersSelfPackage() - + ((s.getAllActions().size() > 1) ? ".outputs.choices." : ".outputs.") // FIXME: factor out - + endpointName + s.getAllActions().stream().sorted(Comparator.comparing(a -> a.toString())) + + ((s.getAllActions().size() > 1) ? ".outputs.choices.Select" : ".outputs.OCallback") // FIXME: factor out + //+ endpointName + + "_" + this.self + + s.getAllActions().stream().sorted(Comparator.comparing(a -> a.toString())) .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out icallback.addTypeParameters("T extends " + iface + " & org.scribble.runtime.handlers.ScribOutputEvent"); icallback.addParameters(getStatesSelfPackage() + "." + this.stateNames.get(s.id) + " sid", // FIXME: factor out @@ -359,7 +371,9 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, icallback.addModifiers("public"); icallback.setReturn(endpointName + ""); String typepar = s.getAllActions().stream().map(a -> - getHandlersSelfPackage() + ".inputs." + this.proto.getSimpleName() + "_" + this.self // FIXME: factor out + getHandlersSelfPackage() + ".inputs." + //+ this.proto.getSimpleName() + "_" + this.self // i.e, endpointName + + "ICallback" // FIXME: factor out + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + getExtName(e)).collect(Collectors.joining("")) + "" ).collect(Collectors.joining(" & ")); @@ -502,8 +516,10 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, messageIf.addModifiers("public", "static"); messageIf.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); String iface = getHandlersSelfPackage() // FIXME: factor out with generateRegister - + ((s.getAllActions().size() > 1) ? ".outputs.choices." : ".outputs.") - + endpointName + s.getAllActions().stream().sorted(Comparator.comparing(a -> a.toString())) + + ((s.getAllActions().size() > 1) ? ".outputs.choices.Select" : ".outputs.OCallback") // FIXME: factor out + //+ endpointName + + "_" + this.self + + s.getAllActions().stream().sorted(Comparator.comparing(a -> a.toString())) .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out messageIf.addInterfaces(iface); } @@ -521,7 +537,9 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, opClass.setSuperClass("org.scribble.runtime.message.ScribMessage"); opClass.addInterfaces(stateName + ".Message"); // FIXME: factor out opClass.addInterfaces(getHandlersSelfPackage() + ".outputs." // FIXME: factor out - + endpointName + "__" + this.getCallbackSuffix.apply(a)); + //+ endpointName + + "OCallback_" + this.self // FIXME: factor out + + "__" + this.getCallbackSuffix.apply(a)); FieldBuilder svu = opClass.newField("serialVersionUID"); svu.addModifiers("private", "static", "final"); svu.setType("long"); @@ -620,8 +638,11 @@ protected String generateBranch(String bprefix, JobContext jc, EState s, String branchAbstract += ""; branchAbstract += "public abstract class " + branchName + " implements org.scribble.runtime.handlers.ScribBranch"; branchAbstract += s.getAllActions().stream().map(a -> - ", " + getHandlersSelfPackage() + ".inputs." + endpointName + "__" + a.peer - + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + getExtName(e)).collect(Collectors.joining()) + "" // FIXME: factor out + ", " + getHandlersSelfPackage() + ".inputs." + //+ endpointName + + "ICallback" // FIXME: factor out + + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + + a.payload.elems.stream().map(e -> "_" + getExtName(e)).collect(Collectors.joining()) + "" // FIXME: factor out ).collect(Collectors.joining("")); branchAbstract += " {\n"; @@ -671,9 +692,10 @@ protected String generateReceiveInterface(boolean isSig, MessageSigNameDecl msnd String receiveInterface = ""; receiveInterface += "package " + getHandlersSelfPackage() + ".inputs;\n"; receiveInterface += "\n"; - receiveInterface += "public interface " + receiveIfName + " {\n"; + receiveInterface += "public interface " + receiveIfName + " {\n"; // Cf. original callback API, have extra parameter (o/w same) - receiveInterface += "\npublic void receive(D data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer, "; + // Cf. output-callback i/f, only specifies peer and message (not self) + receiveInterface += "\nvoid receive(D data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer, "; if (isSig) { receiveInterface += msnd.extName + " m"; From 55f6e1ba6d747f52102d02701be38a197262858b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 20 Mar 2018 11:47:10 +0000 Subject: [PATCH 062/539] Minor. --- .../codegen/java/callbackapi/CBEndpointApiGenerator3.java | 2 +- scribble-test/src/test/scrib/test/test4/MyA.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 71b319abf..4fddd9059 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -213,7 +213,7 @@ public Map buildEndpointClass() throws ScribbleException String receiveIfName = //endpointName + "__" - "ICallback__" + "ICallback__" // CHECKME: confusing against "icallback" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + getExtName(e)).collect(Collectors.joining()); // FIXME: factor out String receiveInterface = generateReceiveInterface(isSig, msnd, jc, a, rootPack, receiveIfName); diff --git a/scribble-test/src/test/scrib/test/test4/MyA.java b/scribble-test/src/test/scrib/test/test4/MyA.java index 319ce859a..f3b754916 100644 --- a/scribble-test/src/test/scrib/test/test4/MyA.java +++ b/scribble-test/src/test/scrib/test/test4/MyA.java @@ -27,7 +27,7 @@ public static void main(String[] args) throws IOException a.icallback(Proto1_A_1.id, x -> (x[0]++ < 5) ? new Proto1_A_1.B.Foo(new Foo("abc" + x[0])) : new Proto1_A_1.B.Bar(new Bar(123)) ); - // FIXME: "inline" Sig class constructor args directly as Op class constructor args + // FIXME: "inline" Sig class constructor args directly as Op class constructor args -- maybe by reflection Future f = a.run(); f.get(); From 8dbd57b8d3bf969a4ce29884708ab55eca380459 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 20 Mar 2018 11:56:01 +0000 Subject: [PATCH 063/539] Continued revising CB gen API. --- .../callbackapi/CBEndpointApiGenerator3.java | 225 +++++++++--------- 1 file changed, 116 insertions(+), 109 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 4fddd9059..52c68183d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -111,34 +111,37 @@ public Map buildEndpointClass() throws ScribbleException Map>> reg = new HashMap<>(); // e.g., Proto1_A__B__1_Int -> { Proto1_A__B__1_Int__C__2_Int__C__4_Str, ... } for (EState s : states) { - List as = s.getAllActions(); - Set set = as.stream().map(this.getCallbackSuffix).collect(Collectors.toSet()); - for (EAction a : as) + if (s.getStateKind() == EStateKind.OUTPUT) { - String callbackName = - //endpointName - "OCallback_" + this.self // FIXME: factor out // Cf. ICAllback, has self (due to message expansion nesting) - + "__" + this.getCallbackSuffix.apply(a); - outputCallbacks.add(callbackName); - if (set.size() > 1) + List as = s.getAllActions(); + Set set = as.stream().map(this.getCallbackSuffix).collect(Collectors.toSet()); + for (EAction a : as) { - Set> tmp = reg.get(callbackName); - if (tmp == null) + String callbackName = + //endpointName + "OCallback_" + this.self // FIXME: factor out // Cf. ICAllback, has self (due to message expansion nesting) + + "__" + this.getCallbackSuffix.apply(a); + outputCallbacks.add(callbackName); + if (set.size() > 1) { - tmp = new HashSet<>(); - reg.put(callbackName, tmp); + Set> tmp = reg.get(callbackName); + if (tmp == null) + { + tmp = new HashSet<>(); + reg.put(callbackName, tmp); + } + tmp.add(set); } - tmp.add(set); } - } - if (as.size() > 1) - { - String outputChoiceName = - //endpointName - "Select_" + this.self // FIXME: factor out // Cf. original iointerfaces - + as.stream().sorted(Comparator.comparing(a -> a.toString())) - .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); - outputChoices.add(outputChoiceName); + if (as.size() > 1) + { + String outputChoiceName = + //endpointName + "Select_" + this.self // FIXME: factor out // Cf. original iointerfaces + + as.stream().sorted(Comparator.comparing(a -> a.toString())) + .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); + outputChoices.add(outputChoiceName); + } } } for (String name : outputChoices) // TODO: -subtypes -- full subtyping between outputChoice i/f's @@ -510,97 +513,101 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, + "\");" ); } - if (s.getActions().size() > 0) - { - InterfaceBuilder messageIf = stateClass.newMemberInterface("Message"); // FIXME: factor out - messageIf.addModifiers("public", "static"); - messageIf.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); - String iface = getHandlersSelfPackage() // FIXME: factor out with generateRegister - + ((s.getAllActions().size() > 1) ? ".outputs.choices.Select" : ".outputs.OCallback") // FIXME: factor out - //+ endpointName - + "_" + this.self - + s.getAllActions().stream().sorted(Comparator.comparing(a -> a.toString())) - .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out - messageIf.addInterfaces(iface); - } - s.getAllActions().stream().map(a -> a.peer).distinct().forEach(r -> + + if (s.getStateKind() == EStateKind.OUTPUT) { - ClassBuilder roleClass = stateClass.newMemberClass(r.toString()); - roleClass.addModifiers("public", "static"); - ConstructorBuilder roleCons = roleClass.newConstructor(); - roleCons.addModifiers("private"); - s.getAllActions().stream().filter(a -> a.peer.equals(r)).forEach(a -> + if (s.getActions().size() > 0) { - String opName = SessionApiGenerator.getOpClassName(a.mid); - ClassBuilder opClass = roleClass.newMemberClass(opName); - opClass.addModifiers("public", "static"); - opClass.setSuperClass("org.scribble.runtime.message.ScribMessage"); - opClass.addInterfaces(stateName + ".Message"); // FIXME: factor out - opClass.addInterfaces(getHandlersSelfPackage() + ".outputs." // FIXME: factor out + InterfaceBuilder messageIf = stateClass.newMemberInterface("Message"); // FIXME: factor out + messageIf.addModifiers("public", "static"); + messageIf.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); + String iface = getHandlersSelfPackage() // FIXME: factor out with generateRegister + + ((s.getAllActions().size() > 1) ? ".outputs.choices.Select" : ".outputs.OCallback") // FIXME: factor out //+ endpointName - + "OCallback_" + this.self // FIXME: factor out - + "__" + this.getCallbackSuffix.apply(a)); - FieldBuilder svu = opClass.newField("serialVersionUID"); - svu.addModifiers("private", "static", "final"); - svu.setType("long"); - svu.setExpression("1L"); - int[] i = { 0 }; - - // FIXME: factor out - boolean isSig = main.getNonProtocolDecls().stream() - .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); - MessageSigNameDecl msnd = null; - if (isSig) - { - msnd = (MessageSigNameDecl) main.getNonProtocolDecls().stream() - .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); - FieldBuilder m = opClass.newField("m"); - m.addModifiers("private", "final"); - m.setType(msnd.extName); - } - - ConstructorBuilder opCons; - if (isSig) - { - opCons = opClass.newConstructor(msnd.extName + " m"); - opClass.addInterfaces("org.scribble.runtime.handlers.ScribSigMessage"); - } - else - { - opCons = opClass.newConstructor(a.payload.elems.stream().map(e -> - main.getDataTypeDecl((DataType) e).extName + " arg" + i[0]++ - ).collect(Collectors.joining(", "))); - } - opCons.addModifiers("public"); - opCons.addBodyLine("super(" + getOpsPackage() + "." + opName + "." + opName // CHECKME: different "op types" have same equals/hashCode -- OK? - + IntStream.range(0, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining("")) - + ");"); - if (isSig) + + "_" + this.self + + s.getAllActions().stream().sorted(Comparator.comparing(a -> a.toString())) + .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out + messageIf.addInterfaces(iface); + } + s.getAllActions().stream().map(a -> a.peer).distinct().forEach(r -> + { + ClassBuilder roleClass = stateClass.newMemberClass(r.toString()); + roleClass.addModifiers("public", "static"); + ConstructorBuilder roleCons = roleClass.newConstructor(); + roleCons.addModifiers("private"); + s.getAllActions().stream().filter(a -> a.peer.equals(r)).forEach(a -> { - opCons.addBodyLine("this.m = m;"); - MethodBuilder getSig = opClass.newMethod("getSig"); - getSig.addModifiers("public"); - getSig.addAnnotations("@Override"); - getSig.setReturn("org.scribble.runtime.message.ScribMessage"); - getSig.addBodyLine("return this.m;"); - } - MethodBuilder getPeer = opClass.newMethod("getPeer"); - getPeer.addModifiers("public"); - getPeer.addAnnotations("@Override"); - getPeer.setReturn("org.scribble.type.name.Role"); - getPeer.addBodyLine("return " + getRolesPackage() + "." + a.peer + "." + a.peer + ";"); - MethodBuilder getOp = opClass.newMethod("getOp"); - getOp.addModifiers("public"); - getOp.addAnnotations("@Override"); - getOp.setReturn("org.scribble.type.name.Op"); - getOp.addBodyLine("return " + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";"); - MethodBuilder getPayload = opClass.newMethod("getPayload"); - getPayload.addModifiers("public"); - getPayload.addAnnotations("@Override"); - getPayload.setReturn("Object[]"); - getPayload.addBodyLine("return this.payload;"); + String opName = SessionApiGenerator.getOpClassName(a.mid); + ClassBuilder opClass = roleClass.newMemberClass(opName); + opClass.addModifiers("public", "static"); + opClass.setSuperClass("org.scribble.runtime.message.ScribMessage"); + opClass.addInterfaces(stateName + ".Message"); // FIXME: factor out + opClass.addInterfaces(getHandlersSelfPackage() + ".outputs." // FIXME: factor out + //+ endpointName + + "OCallback_" + this.self // FIXME: factor out + + "__" + this.getCallbackSuffix.apply(a)); + FieldBuilder svu = opClass.newField("serialVersionUID"); + svu.addModifiers("private", "static", "final"); + svu.setType("long"); + svu.setExpression("1L"); + int[] i = { 0 }; + + // FIXME: factor out + boolean isSig = main.getNonProtocolDecls().stream() + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); + MessageSigNameDecl msnd = null; + if (isSig) + { + msnd = (MessageSigNameDecl) main.getNonProtocolDecls().stream() + .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); + FieldBuilder m = opClass.newField("m"); + m.addModifiers("private", "final"); + m.setType(msnd.extName); + } + + ConstructorBuilder opCons; + if (isSig) + { + opCons = opClass.newConstructor(msnd.extName + " m"); + opClass.addInterfaces("org.scribble.runtime.handlers.ScribSigMessage"); + } + else + { + opCons = opClass.newConstructor(a.payload.elems.stream().map(e -> + main.getDataTypeDecl((DataType) e).extName + " arg" + i[0]++ + ).collect(Collectors.joining(", "))); + } + opCons.addModifiers("public"); + opCons.addBodyLine("super(" + getOpsPackage() + "." + opName + "." + opName // CHECKME: different "op types" have same equals/hashCode -- OK? + + IntStream.range(0, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining("")) + + ");"); + if (isSig) + { + opCons.addBodyLine("this.m = m;"); + MethodBuilder getSig = opClass.newMethod("getSig"); + getSig.addModifiers("public"); + getSig.addAnnotations("@Override"); + getSig.setReturn("org.scribble.runtime.message.ScribMessage"); + getSig.addBodyLine("return this.m;"); + } + MethodBuilder getPeer = opClass.newMethod("getPeer"); + getPeer.addModifiers("public"); + getPeer.addAnnotations("@Override"); + getPeer.setReturn("org.scribble.type.name.Role"); + getPeer.addBodyLine("return " + getRolesPackage() + "." + a.peer + "." + a.peer + ";"); + MethodBuilder getOp = opClass.newMethod("getOp"); + getOp.addModifiers("public"); + getOp.addAnnotations("@Override"); + getOp.setReturn("org.scribble.type.name.Op"); + getOp.addBodyLine("return " + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";"); + MethodBuilder getPayload = opClass.newMethod("getPayload"); + getPayload.addModifiers("public"); + getPayload.addAnnotations("@Override"); + getPayload.setReturn("Object[]"); + getPayload.addBodyLine("return this.payload;"); + }); }); - }); + } return stateClass.build(); /*String stateClass = ""; From 88bb34f89d678e39a574722e9ade00998c9d35ff Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 20 Mar 2018 12:22:37 +0000 Subject: [PATCH 064/539] Minor. --- .../callbackapi/CBEndpointApiGenerator3.java | 54 +++++++++---------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 52c68183d..4dc5c6d9f 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -109,40 +109,37 @@ public Map buildEndpointClass() throws ScribbleException Set outputCallbacks = new HashSet<>(); // e.g., Proto1_A__B__1_Int Set outputChoices = new HashSet<>(); // e.g., Proto1_A__B__1_Int__C__2_Int__C__4_Str, i.e., { B__1_Int, C__2_Int, C__4_Str } Map>> reg = new HashMap<>(); // e.g., Proto1_A__B__1_Int -> { Proto1_A__B__1_Int__C__2_Int__C__4_Str, ... } - for (EState s : states) + for (EState s : (Iterable) states.stream().filter(x -> x.getStateKind() == EStateKind.OUTPUT)::iterator) { - if (s.getStateKind() == EStateKind.OUTPUT) + List as = s.getAllActions(); + Set set = as.stream().map(this.getCallbackSuffix).collect(Collectors.toSet()); + for (EAction a : as) { - List as = s.getAllActions(); - Set set = as.stream().map(this.getCallbackSuffix).collect(Collectors.toSet()); - for (EAction a : as) + String callbackName = + //endpointName + "OCallback_" + this.self // FIXME: factor out // Cf. ICAllback, has self (due to message expansion nesting) + + "__" + this.getCallbackSuffix.apply(a); + outputCallbacks.add(callbackName); + if (set.size() > 1) { - String callbackName = - //endpointName - "OCallback_" + this.self // FIXME: factor out // Cf. ICAllback, has self (due to message expansion nesting) - + "__" + this.getCallbackSuffix.apply(a); - outputCallbacks.add(callbackName); - if (set.size() > 1) + Set> tmp = reg.get(callbackName); + if (tmp == null) { - Set> tmp = reg.get(callbackName); - if (tmp == null) - { - tmp = new HashSet<>(); - reg.put(callbackName, tmp); - } - tmp.add(set); + tmp = new HashSet<>(); + reg.put(callbackName, tmp); } - } - if (as.size() > 1) - { - String outputChoiceName = - //endpointName - "Select_" + this.self // FIXME: factor out // Cf. original iointerfaces - + as.stream().sorted(Comparator.comparing(a -> a.toString())) - .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); - outputChoices.add(outputChoiceName); + tmp.add(set); } } + if (as.size() > 1) + { + String outputChoiceName = + //endpointName + "Select_" + this.self // FIXME: factor out // Cf. original iointerfaces + + as.stream().sorted(Comparator.comparing(a -> a.toString())) + .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); + outputChoices.add(outputChoiceName); + } } for (String name : outputChoices) // TODO: -subtypes -- full subtyping between outputChoice i/f's { @@ -514,7 +511,7 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, ); } - if (s.getStateKind() == EStateKind.OUTPUT) + if (s.getStateKind() == EStateKind.OUTPUT) // FIXME: factor out { if (s.getActions().size() > 0) { @@ -608,6 +605,7 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, }); }); } + return stateClass.build(); /*String stateClass = ""; From a693ee579d32c69b28952249227721ac40609729 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 20 Mar 2018 12:29:54 +0000 Subject: [PATCH 065/539] Minor. --- .../codegen/java/callbackapi/CBEndpointApiGenerator3.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 4dc5c6d9f..786ff2820 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -117,7 +117,7 @@ public Map buildEndpointClass() throws ScribbleException { String callbackName = //endpointName - "OCallback_" + this.self // FIXME: factor out // Cf. ICAllback, has self (due to message expansion nesting) + "OCallback_" + this.self // FIXME: factor out // Cf. ICallback, has self (due to message expansion nesting) -- but ScribMessage values of this type don't record self? -- Select i/f's have self in name though + "__" + this.getCallbackSuffix.apply(a); outputCallbacks.add(callbackName); if (set.size() > 1) From 4ea90427de1d751ad68c9b0a820a3fa98c76f686 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 20 Mar 2018 14:19:18 +0000 Subject: [PATCH 066/539] Minor. --- scribble-test/src/test/scrib/test/test5/MyA.java | 4 ++-- scribble-test/src/test/scrib/test/test5/MyB.java | 6 +++--- scribble-test/src/test/scrib/test/test5/MyC.java | 4 ++-- scribble-test/src/test/scrib/test/test5/Test5.scr | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/scribble-test/src/test/scrib/test/test5/MyA.java b/scribble-test/src/test/scrib/test/test5/MyA.java index 536b14c18..e16faec87 100644 --- a/scribble-test/src/test/scrib/test/test5/MyA.java +++ b/scribble-test/src/test/scrib/test/test5/MyA.java @@ -26,9 +26,9 @@ public static void main(String[] args) throws IOException a.request(B, SocketChannelEndpoint::new, "localhost", 8888); a.request(C, SocketChannelEndpoint::new, "localhost", 9999); - a.icallback(Proto1_A_1.id, x -> (x[0]++ < 3) ? new Proto1_A_1.B._1(123) : new Proto1_A_1.B._3("abc")) + a.icallback(Proto1_A_1.id, x -> (x[0]++ < 3) ? new Proto1_A_1.B._1(123) : new Proto1_A_1.C._3("abc")) .icallback(Proto1_A_2.id, x -> new Proto1_A_2.C._2(456)) - .icallback(Proto1_A_3.id, x -> new Proto1_A_3.C._4("def")); + .icallback(Proto1_A_3.id, x -> new Proto1_A_3.B._4("def")); Future f = a.run(); f.get(); diff --git a/scribble-test/src/test/scrib/test/test5/MyB.java b/scribble-test/src/test/scrib/test/test5/MyB.java index 2b45af08a..a712b8448 100644 --- a/scribble-test/src/test/scrib/test/test5/MyB.java +++ b/scribble-test/src/test/scrib/test/test5/MyB.java @@ -15,7 +15,7 @@ import test.test5.Test5.Proto1.callbacks.B.Proto1_B_1_Branch; import test.test5.Test5.Proto1.callbacks.B.states.Proto1_B_1; import test.test5.Test5.Proto1.ops._1; -import test.test5.Test5.Proto1.ops._3; +import test.test5.Test5.Proto1.ops._4; import test.test5.Test5.Proto1.roles.A; public class MyB @@ -32,10 +32,10 @@ public void receive(int[] data, A peer, _1 op, Integer x) } @Override - public void receive(int[] data, A peer, _3 op, String x) + public void receive(int[] data, A peer, _4 op, String x) { data[0]++; - System.out.println("(B) received 3: " + data[0] + ", " + x); + System.out.println("(B) received 4: " + data[0] + ", " + x); } } diff --git a/scribble-test/src/test/scrib/test/test5/MyC.java b/scribble-test/src/test/scrib/test/test5/MyC.java index 1a41cd793..d3d3536b2 100644 --- a/scribble-test/src/test/scrib/test/test5/MyC.java +++ b/scribble-test/src/test/scrib/test/test5/MyC.java @@ -15,7 +15,7 @@ import test.test5.Test5.Proto1.callbacks.C.Proto1_C_1_Branch; import test.test5.Test5.Proto1.callbacks.C.states.Proto1_C_1; import test.test5.Test5.Proto1.ops._2; -import test.test5.Test5.Proto1.ops._4; +import test.test5.Test5.Proto1.ops._3; import test.test5.Test5.Proto1.roles.A; public class MyC @@ -31,7 +31,7 @@ public void receive(Void data, A peer, _2 op, Integer x) } @Override - public void receive(Void data, A peer, _4 op, String x) + public void receive(Void data, A peer, _3 op, String x) { System.out.println("(C) received 4: " + x); } diff --git a/scribble-test/src/test/scrib/test/test5/Test5.scr b/scribble-test/src/test/scrib/test/test5/Test5.scr index 461dd018b..79b33211d 100644 --- a/scribble-test/src/test/scrib/test/test5/Test5.scr +++ b/scribble-test/src/test/scrib/test/test5/Test5.scr @@ -16,7 +16,7 @@ global protocol Proto1(role A, role B, role C) } or { - 3(Str) from A to B; - 4(Str) from A to C; + 3(Str) from A to C; + 4(Str) from A to B; } } From 7e578714219c90f25155e8bdd3a19416a83f9def Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 19 Jul 2018 12:22:45 +0100 Subject: [PATCH 067/539] Minor. --- scribble-test/src/test/scrib/test/test2/MyA.java | 6 +++++- scribble-test/src/test/scrib/test/test2/MyB.java | 5 +++-- scribble-test/src/test/scrib/test/test3/MyA.java | 7 +++++-- scribble-test/src/test/scrib/test/test3/Test3.scr | 2 +- scribble-test/src/test/scrib/tmp/Test.scr | 4 +++- 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index 25ecfcf67..f9dd0f6d0 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -21,6 +21,7 @@ public class MyA { public static void main(String[] args) throws IOException { + //foo1(); foo3(); } @@ -78,7 +79,10 @@ public static void foo1() { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); - new test.test2.Test2.Proto1.statechans.A.Proto1_A_1(a).send(B, _1, 123); + test.test2.Test2.Proto1.statechans.A.Proto1_A_1 s + = new test.test2.Test2.Proto1.statechans.A.Proto1_A_1(a); + s.send(B, _1, 123); + //new Proto1_A_1(a).send(B, _2, "abc"); } catch (Exception e) diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java index 4ecaff818..b54ba9216 100644 --- a/scribble-test/src/test/scrib/test/test2/MyB.java +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -26,9 +26,10 @@ public class MyB { - public static void main(String[] args) throws IOException + public static void main(String[] args) throws IOException, ScribbleRuntimeException { foo3(); + //foo1(); } public static void foo3() throws IOException @@ -113,7 +114,7 @@ public void receive(EndSocket schan, _1 op, Buf arg1) throws ScribbleRu @Override public void receive(EndSocket schan, _2 op, Buf arg1) throws ScribbleRuntimeException, IOException, ClassNotFoundException { - System.out.println("Done 1"); + System.out.println("Done 2"); } } diff --git a/scribble-test/src/test/scrib/test/test3/MyA.java b/scribble-test/src/test/scrib/test/test3/MyA.java index 80c4abddc..915d8cf3b 100644 --- a/scribble-test/src/test/scrib/test/test3/MyA.java +++ b/scribble-test/src/test/scrib/test/test3/MyA.java @@ -18,12 +18,15 @@ public class MyA public static void main(String[] args) throws IOException { Proto1 P1 = new Proto1(); - try (Proto1_A a = new Proto1_A<>(P1, A, new ObjectStreamFormatter(), new int[1])) + try (Proto1_A a + = new Proto1_A<>(P1, A, new ObjectStreamFormatter(), new int[1])) { a.request(B, SocketChannelEndpoint::new, "localhost", 8888); a.icallback(Proto1_A_1.id, - x -> (x[0]++ < 3) ? new Proto1_A_1.B._1(123) : new Proto1_A_1.B._3("abc") + x -> (x[0]++ < 3) + ? new Proto1_A_1.B._1(123) + : new Proto1_A_1.B._3("abc") ); Future f = a.run(); diff --git a/scribble-test/src/test/scrib/test/test3/Test3.scr b/scribble-test/src/test/scrib/test/test3/Test3.scr index eda0bfd32..9e9115639 100644 --- a/scribble-test/src/test/scrib/test/test3/Test3.scr +++ b/scribble-test/src/test/scrib/test/test3/Test3.scr @@ -10,7 +10,7 @@ global protocol Proto1(role A, role B, role C) { choice at A { - 1(Int) from A to B; + 1(Int) from A to B; //@ statename="mystatename" 2(Int) from B to C; do Proto1(A, B, C); } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 2f3583d34..67ca3d518 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -36,6 +36,7 @@ module tmp.Test; +/* //type "System.UInt32" from "..." as int; global protocol Proto1(role A, role B) @@ -49,6 +50,7 @@ global protocol Proto1(role A, role B) 2() from A to B; } } +//*/ @@ -56,7 +58,7 @@ global protocol Proto1(role A, role B) -/* +//* type "System.UInt32" from "..." as int; global protocol SH(role P, role R, role C) From 546c8f12b4cc68f27e77bc51973cc48918ea5f3d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 8 Aug 2018 17:12:12 +0100 Subject: [PATCH 068/539] Minor. --- .../scribble/del/global/GProtocolDeclDel.java | 9 +- scribble-test/src/test/scrib/tmp/Test.scr | 111 +++++++++++++++++- 2 files changed, 111 insertions(+), 9 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 0d3822429..e223d6115 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -282,7 +282,8 @@ private static void validateBySpin(Job job, GProtocolName fullname) throws Scrib eventualStability = "[](" + eventualStability + ")"; // FIXME: current "eventual reception", not eventual stability clauses.add(eventualStability); - int batchSize = 10; // FIXME: factor out + //int batchSize = 10; // FIXME: factor out + int batchSize = 6; // FIXME: factor out // FIXME: dynamic batch sizing based on previous batch duration? for (int i = 0; i < clauses.size(); ) { int j = (i+batchSize < clauses.size()) ? i+batchSize : clauses.size(); @@ -292,7 +293,7 @@ private static void validateBySpin(Job job, GProtocolName fullname) throws Scrib { System.out.println("[-spin] Batched ltl:\n" + ltl + "\n"); } - if (!runSpin(pml + "\n\n" + ltl)) + if (!runSpin(fullname.toString(), pml + "\n\n" + ltl)) { throw new ScribbleException("Protocol not valid:\n" + gpd); } @@ -301,12 +302,12 @@ private static void validateBySpin(Job job, GProtocolName fullname) throws Scrib } // FIXME: move - private static boolean runSpin(String pml) //throws ScribbleException + private static boolean runSpin(String prefix, String pml) //throws ScribbleException { File tmp; try { - tmp = File.createTempFile("gpd.header.name", ".pml.tmp"); + tmp = File.createTempFile(prefix, ".pml.tmp"); try { String tmpName = tmp.getAbsolutePath(); diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 67ca3d518..272389ec6 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -2,8 +2,8 @@ //$ java -cp modules/cli/target/classes/';'modules/core/target/classes';'modules/trace/target/classes';'modules/parser/target/classes';c:\Users\Raymond\.m2\repository\org\antlr\antlr-runtime\3.2\antlr-runtime-3.2.jar;'modules/validation/target/classes/';'modules/projection/target/classes/';C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.9.9\jackson-mapper-asl-1.9.9.jar;C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-core-asl\1.9.9\jackson-core-asl-1.9.9.jar' org.scribble.cli.CommandLine -path modules/core/src/test/scrib/ modules/core/src/test/scrib/Test.scr //$ java -cp modules/cli/target/classes/';'modules/core/target/classes';'modules/trace/target/classes';'modules/parser/target/classes';c:\Users\Raymond\.m2\repository\org\antlr\antlr-runtime\3.2\antlr-runtime-3.2.jar;'modules/validation/target/classes/';'modules/projection/target/classes/';C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.9.9\jackson-mapper-asl-1.9.9.jar;C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-core-asl\1.9.9\jackson-core-asl-1.9.9.jar' org.scribble2.cli.CommandLine -path modules/validation/src/test/scrib/src modules/validation/src/test/scrib/src/Test.scr -//$ bin/scribblec.sh -ip scribble-core/src/test/scrib/ -d scribble-core/src/test/scrib/tmp/ scribble-core/src/test/scrib/tmp/Test.scr -//$ bin/scribblec.sh -ip scribble-core/src/test/scrib/ -d scribble-core/src/test/scrib/tmp/ scribble-core/src/test/scrib/tmp/Test.scr -api Proto1 B +//$ bin/scribblec.sh -ip scribble-test/src/test/scrib/ -d scribble-test/src/test/scrib/tmp/ scribble-test/src/test/scrib/tmp/Test.scr +//$ bin/scribblec.sh -ip scribble-test/src/test/scrib/ -d scribble-test/src/test/scrib/tmp/ scribble-test/src/test/scrib/tmp/Test.scr -api Proto1 B //http://sandbox.kidstrythisathome.com/erdos/ @@ -41,19 +41,70 @@ module tmp.Test; global protocol Proto1(role A, role B) { - choice at A + Foo() from A to B; + /*choice at A { 1() from A to B; } or { 2() from A to B; - } + }* / } //*/ +/* +global protocol SH2(role P, role R, role C) +{ + plane(x1:int, x2:int, x3:int, x4:int) from P to R; + do Loop2(P, R, C); +} + +aux global protocol Loop2(role P, role R, role C) +{ + choice at P + { + Above(v1:int) from P to R; + Res(b1:int) from R to P; + Above(v2:int) from P to R; + Res(b2:int) from R to P; + choice at P + { + BothIn() from P to R; + BothIn(r1:int) from P to C; + do Loop2(P, R, C); + } + or + { + BothOut() from P to R; + BothOut() from P to C; + do Loop2(P, R, C); + } + or + { + Intersect() from P to R; + Res(i:int) from R to P; + choice at P + { + One(r2:int) from P to C; + do Loop2(P, R, C); + } + or + { + Two(r3:int, r4:int) from P to C; + do Loop2(P, R, C); + } + } + } + or + { + Close() from P to R; + Close() from P to C; + } +} +//*/ @@ -79,11 +130,13 @@ aux global protocol Loop(role P, role R, role C) { BothIn() from P to R; BothIn(int) from P to C; + //do Loop(P, R, C); } or { BothOut() from P to R; BothOut() from P to C; + //do Loop(P, R, C); } or { @@ -92,13 +145,15 @@ aux global protocol Loop(role P, role R, role C) choice at P { One(int) from P to C; + //do Loop(P, R, C); } or { Two(int, int) from P to C; + //do Loop(P, R, C); } } - do Loop(P, R, C); + do Loop(P, R, C); // FIXME: -spin fail if commented } or { @@ -149,6 +204,52 @@ global protocol Proto1(role A, role B, role C) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 045dcd2b55499c05fb5d0cb23ad348a2f769cb3a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 8 Aug 2018 17:30:33 +0100 Subject: [PATCH 069/539] Minor. --- scribble-core/src/main/java/org/scribble/model/MState.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scribble-core/src/main/java/org/scribble/model/MState.java b/scribble-core/src/main/java/org/scribble/model/MState.java index 0dae3bb73..5e602ccd9 100644 --- a/scribble-core/src/main/java/org/scribble/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/model/MState.java @@ -188,6 +188,7 @@ public boolean canReach(MState s) // Note: doesn't implicitly include start (only if start is explicitly reachable from start, of course) /*public static , S extends ModelState, K extends ProtocolKind> Set getAllReachable(S start)*/ + // FIXME: cache @SuppressWarnings("unchecked") public static , S extends MState, K extends ProtocolKind> Set getReachableStates(MState start) @@ -225,6 +226,7 @@ Set getReachableStates(MState start) } @SuppressWarnings("unchecked") + // FIXME: cache public static , S extends MState, K extends ProtocolKind> //Set getAllReachableActions(S start) Set getReachableActions(MState start) From 9f4385d428bf26438a9dfedc3450f92c04fb5f75 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Oct 2018 13:49:50 +0100 Subject: [PATCH 070/539] Minor patch to base scribblec.sh. --- scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java | 8 +++++--- scribble-demos/scrib/smtp/src/smtp/SmtpC.java | 7 +++---- .../scrib/smtp/src/smtp/message/SmtpMessage.java | 2 +- scribble-dist/src/main/resources/scribblec.sh | 2 +- scribble-test/pom.xml | 4 ++++ 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java b/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java index 763817c04..d6ddc1e81 100644 --- a/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java +++ b/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java @@ -11,7 +11,8 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -//$ java -cp modules/cli/target/classes/';'modules/core/target/classes';'modules/demos/target/classes smtp.SimpleSmtpC + +//$ java -cp scribble-runtime/target/classes/';'scribble-core/target/classes';'scribble-demos/target/classes smtp.SimpleSmtpC package smtp; @@ -19,6 +20,7 @@ import static smtp.Smtp.Smtp.Smtp.C; import static smtp.Smtp.Smtp.Smtp.S; import static smtp.Smtp.Smtp.Smtp._220; +import static smtp.Smtp.Smtp.Smtp._221; import static smtp.Smtp.Smtp.Smtp._235; import static smtp.Smtp.Smtp.Smtp._250; import static smtp.Smtp.Smtp.Smtp._250d; @@ -106,12 +108,12 @@ public void run() throws Exception .send(S, new DataLine(body)) .send(S, new EndOfData()) .receive(S, _250, new Buf<>()) - .send(S, new Quit()); + .send(S, new Quit()).async(S, _221); break; } case _501: { - cases.receive(_501).send(S, new Quit()); + cases.receive(_501).send(S, new Quit()).async(S, _221); } } } diff --git a/scribble-demos/scrib/smtp/src/smtp/SmtpC.java b/scribble-demos/scrib/smtp/src/smtp/SmtpC.java index 5da6df415..5c2a5e54a 100644 --- a/scribble-demos/scrib/smtp/src/smtp/SmtpC.java +++ b/scribble-demos/scrib/smtp/src/smtp/SmtpC.java @@ -12,8 +12,7 @@ * the License. */ - -//$ java -cp scribble-core/target/classes:scribble-runtime/target/classes:scribble-demos/target/classes smtp.SmtpC smtp.cc.ic.ac.uk foo@foo.com bar@bar.com subj body +//$ java -cp scribble-core/target/classes:scribble-runtime/target/classes:scribble-demos/target/classes smtp.SmtpC smtp.cc.ic.ac.uk recipient@foo.com sender@bar.com subj body package smtp; @@ -71,8 +70,8 @@ public class SmtpC private static final int PORT = 25; private final String server; // e.g., smtp.cc.ic.ac.uk; - private final String mailTo; // foo@foo.com - private final String rcptFrom; // bar@bar.com + private final String mailTo; // recipient@foo.com + private final String rcptFrom; // sender@bar.com private final String subj; private final String body; diff --git a/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessage.java b/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessage.java index a2a037cba..156d772d5 100644 --- a/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessage.java +++ b/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessage.java @@ -14,7 +14,7 @@ package smtp.message; import org.scribble.runtime.net.ScribMessage; -import org.scribble.sesstype.name.Op; +import org.scribble.type.name.Op; import org.scribble.util.Caller; import smtp.Smtp.Smtp.Smtp; diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index 5f2df50b3..8841ee7a8 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -25,7 +25,7 @@ # ANTLR 3 runtime location (if no lib jar) -ANTLR= +ANTLR='scribble-parser/lib/antlr-3.5.2-complete.jar' # e.g., '~/.m2/repository/org/antlr/antlr-runtime/3.4/antlr-runtime-3.4.jar' # or '/cygdrive/c/Users/[User]/.m2/repository/org/antlr/antlr-runtime/3.4/antlr-runtime-3.4.jar' # (i.e., the Maven install location) diff --git a/scribble-test/pom.xml b/scribble-test/pom.xml index f9a56db5d..2eb1d7b4e 100644 --- a/scribble-test/pom.xml +++ b/scribble-test/pom.xml @@ -30,6 +30,10 @@ org.scribble scribble-cli + + org.scribble + scribble-runtime + junit junit From fc3881d7cb47ec97eb29b3ced137e882fa75fb0f Mon Sep 17 00:00:00 2001 From: Fangyi Zhou Date: Wed, 17 Oct 2018 22:54:24 +0100 Subject: [PATCH 071/539] scribblec: Fix help text for modelpng Summary: In https://github.com/scribble/scribble-java/blob/19ea1dc1dfd5d08378e31a63c51a8d6a54d10f7a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java#L244 the argument parser invokes https://github.com/scribble/scribble-java/blob/19ea1dc1dfd5d08378e31a63c51a8d6a54d10f7a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java#L376 which requires a protocol and a file. The help says a protocol, a role and a file is expected, this is incorrect. --- scribble-dist/src/main/resources/scribblec.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index 8841ee7a8..dd29d513d 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -70,7 +70,7 @@ Options: -model Generate global model - -modelpng + -modelpng Draw global model as png (requires dot) -fair Assume fair output choices -umodel, -umodelpng (with appropriate args) "Unfair" variant From bc1e5f483778e8c4ffd0288f30fc47a23bf77b2f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 17 Jan 2019 20:46:27 +0000 Subject: [PATCH 072/539] Initial. --- .../java/org/scribble/ast/ScribNodeBase.java | 29 +++++++-- .../java/org/scribble/ast/name/NameNode.java | 4 ++ .../main/java/org/scribble/del/ModuleDel.java | 6 +- .../org/scribble/parser/antlr/Scribble.g | 5 +- .../parser/scribble/ScribTreeAdaptor.java | 61 +++++++++++++++++++ .../parser/scribble/ScribbleAntlrWrapper.java | 8 ++- .../scribble/ast/tree/MyCommonTree.java | 38 ++++++++++++ scribble-test/src/test/scrib/tmp/Test.scr | 6 +- 8 files changed, 146 insertions(+), 11 deletions(-) create mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java create mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/tree/MyCommonTree.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java index c8e4d0c4e..df16fb1f9 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -17,6 +17,7 @@ import java.util.function.Function; import java.util.stream.Collectors; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.del.ScribDel; import org.scribble.main.RuntimeScribbleException; @@ -32,19 +33,29 @@ * This is the generic object from which all Scribble model objects * are derived. */ -public abstract class ScribNodeBase implements ScribNode +public abstract class ScribNodeBase extends CommonTree implements ScribNode { protected final CommonTree source; // Consequently, core depends on Antlr // Used to be for parsed entities; null if not parsed // Now: for the original parsed entity for error blaming; should not be null unless a purely generated entity + // CHECKME: not needed any more? protected ScribDel del; - protected ScribNodeBase(CommonTree source) + // Used by (Scrib)TreeAdapator + public ScribNodeBase(Token payload) { - this.source = source; + super(payload); + this.source = this; // TODO: redundant } - + + // Copy constructor + protected ScribNodeBase(CommonTree node) + { + super(node); + this.source = node; // TODO: redundant + } + @Override public final CommonTree getSource() { @@ -55,7 +66,15 @@ public final CommonTree getSource() // Generally copy is only for shallow copy of object and "immediate" fields (not super fields), cf. ProtocolDecl, ProtocolDeclContext, etc protected abstract ScribNodeBase copy(); - // Deep clone + // FIXME: rework as ANTLR node (deep) copy (maybe "clone") + // FIXME TODO: rework children using ANTLR children + @Override + public ScribNodeBase dupNode() + { + return copy(); + } + + // Deep (tree) clone @Override public abstract ScribNodeBase clone(AstFactory af); diff --git a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java index b52014d9b..39ded5889 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java @@ -29,6 +29,10 @@ public abstract class NameNode extends ScribNodeBase implements public NameNode(CommonTree source, String... elems) { super(source); + if (source == null) + { + throw new RuntimeException("ccf"); + } this.elems = elems; } diff --git a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java b/scribble-core/src/main/java/org/scribble/del/ModuleDel.java index e1ef9744f..e2e6f0482 100644 --- a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ModuleDel.java @@ -22,6 +22,7 @@ import java.util.Set; import java.util.stream.Collectors; +import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.ImportDecl; import org.scribble.ast.Module; import org.scribble.ast.ModuleDecl; @@ -132,7 +133,10 @@ public Module createModuleForProjection(Projector proj, Module root, GProtocolDe for (Role role : deps.get(gpn)) { LProtocolName targetsimpname = Projector.projectSimpleProtocolName(gpn.getSimpleName(), role); - ModuleNameNode targetmodname = Projector.makeProjectedModuleNameNode(proj.job.af, null, // FIXME? projected import sources? + ModuleNameNode targetmodname = Projector.makeProjectedModuleNameNode(proj.job.af, //null, // FIXME? projected import sources? + + new CommonTree(), // FIXME -- + gpn.getPrefix(), targetsimpname); if (!targetmodname.toName().equals(modname.toName())) // Self dependency -- each projected local is in its own module now, so can compare module names { diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index df73fafd3..8f57cadc0 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -15,7 +15,8 @@ options { language = Java; output = AST; - ASTLabelType = CommonTree; + //ASTLabelType = MyCommonTree; + ASTLabelType = ScribNodeBase; //backtrack = true; // backtracking disabled by default? Is it bad to require this option? //memoize = true; } @@ -177,6 +178,8 @@ tokens package org.scribble.parser.antlr; //import org.scribble.main.RuntimeScribbleException; + //import org.scribble.parser.scribble.ast.tree.MyCommonTree; + import org.scribble.ast.ScribNodeBase; } @lexer::header diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java new file mode 100644 index 000000000..f60a07849 --- /dev/null +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -0,0 +1,61 @@ +package org.scribble.parser.scribble; + +import java.util.Collections; + +import org.antlr.runtime.Token; +import org.antlr.runtime.tree.CommonTree; +import org.antlr.runtime.tree.CommonTreeAdaptor; +import org.scribble.ast.AstFactory; +import org.scribble.ast.AstFactoryImpl; +import org.scribble.ast.Module; +import org.scribble.parser.scribble.ast.tree.MyCommonTree; + +public class ScribTreeAdaptor extends CommonTreeAdaptor +{ + private final AstFactory f = new AstFactoryImpl(); + + @Override + public Object create(Token payload) + { + if (payload == null) + { + //System.out.println("aaa: " + payload.getText()); + return new MyCommonTree(payload); + } + + /*if (payload != null) + { + return new MyCommonTree(payload); + }*/ + String lab = payload.getText(); + CommonTree empty = new CommonTree(payload); // CommonTree constr sets this.token = payload.token + switch (lab) + { + case "MODULE": return this.f.Module(empty, null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); + case "MODULEDECL": return this.f.ModuleDecl(empty, null); + case "GLOBALPROTOCOLDECL": return this.f.GProtocolDecl(empty, Collections.emptyList(), null, null); + case "GLOBALPROTOCOLHEADER": return this.f.GProtocolHeader(empty, null, null, null); + case "ROLEDECL": return this.f.RoleDecl(empty, null); + case "ROLEDECLLIST": return this.f.RoleDeclList(empty, Collections.emptyList()); + case "PARAMETERDECLLIST": return this.f.NonRoleParamDeclList(empty, Collections.emptyList()); + case "GLOBALPROTOCOLDEF": return this.f.GProtocolDef(empty, null); + case "GLOBALPROTOCOLBLOCK": return this.f.GProtocolBlock(empty, null); + case "GLOBALINTERACTIONSEQUENCE": return this.f.GInteractionSeq(empty, Collections.emptyList()); + case "GLOBALMESSAGETRANSFER": return this.f.GMessageTransfer(empty, null, null, Collections.emptyList()); + //case "QUALIFIEDNAME": return this.f.Q + //case "MESSAGESIGNATURE": return this.f.Me + //case "PAYLOAD": + /*case tmp + case Test + case Proto1 + case A + case B + case 1 + case A + case B*/ + default: //throw new RuntimeException("Shouldn't get here: " + lab); + return new MyCommonTree(payload); + //return empty; + } + } +} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java index 2a2a8a159..93f315ec4 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java @@ -45,10 +45,13 @@ protected Lexer getScribbleLexer(ANTLRStringStream ass) { return new ScribbleParser(cts); }*/ + + // Because no convenient way to expose an interface for all ScribbleParsers with top-level "module" method? protected CommonTree runScribbleParser(CommonTokenStream cts) throws RecognitionException { - // Because no convenient way to expose an interface for all ScribbleParsers with top-level "module" method? - return (CommonTree) new ScribbleParser(cts).module().getTree(); + ScribbleParser p = new ScribbleParser(cts); + p.setTreeAdaptor(new ScribTreeAdaptor()); + return (CommonTree) p.module().getTree(); } public CommonTree parseAntlrTree(Resource res) @@ -66,7 +69,6 @@ public CommonTree parseAntlrTree(Resource res) /*// FIXME: need an interface for Scribble top-level module method (ANTLR "grammar actions"?) Method m = c.getMethod("module"); return (CommonTree) ((ParserRuleReturnScope) m.invoke(parser)).getTree();*/ // No: reflection doesn't work well with ANTLR error handling - return runScribbleParser(new CommonTokenStream(lex)); } /*catch (NoSuchMethodException nsme) diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/tree/MyCommonTree.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/tree/MyCommonTree.java new file mode 100644 index 000000000..24d260d6e --- /dev/null +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/tree/MyCommonTree.java @@ -0,0 +1,38 @@ +package org.scribble.parser.scribble.ast.tree; + +import org.antlr.runtime.Token; +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.ScribNodeBase; + +@Deprecated +public class MyCommonTree extends ScribNodeBase +{ + public MyCommonTree(CommonTree node) + { + super(node); + } + + public MyCommonTree(Token t) + { + super(t); + } + + @Override + public ScribNodeBase dupNode() + { + return new MyCommonTree(this); + } + + @Override + protected ScribNodeBase copy() + { + return (ScribNodeBase) dupNode(); + } + + @Override + public ScribNodeBase clone(AstFactory af) + { + return (ScribNodeBase) dupNode(); + } +} diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 272389ec6..7ec07bbce 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -34,6 +34,10 @@ module tmp.Test; +global protocol Proto1(role A, role B) +{ + 1() from A to B; +} /* @@ -109,7 +113,7 @@ aux global protocol Loop2(role P, role R, role C) -//* +/* type "System.UInt32" from "..." as int; global protocol SH(role P, role R, role C) From 0b2d0f883bcd0c28568bfbbb7e4ba6b3dd53229d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 17 Jan 2019 21:27:20 +0000 Subject: [PATCH 073/539] Continued experimenting. --- .../org/scribble/ast/CompoundInteraction.java | 6 ++ .../org/scribble/ast/HeaderParamDecl.java | 6 ++ .../org/scribble/ast/HeaderParamDeclList.java | 7 ++ .../java/org/scribble/ast/InteractionSeq.java | 7 ++ .../org/scribble/ast/MessageTransfer.java | 9 +++ .../main/java/org/scribble/ast/Module.java | 12 +++- .../java/org/scribble/ast/ModuleDecl.java | 6 ++ .../java/org/scribble/ast/NameDeclNode.java | 7 ++ .../scribble/ast/NonRoleParamDeclList.java | 6 ++ .../java/org/scribble/ast/ProtocolBlock.java | 7 ++ .../java/org/scribble/ast/ProtocolDecl.java | 9 +++ .../java/org/scribble/ast/ProtocolDef.java | 7 ++ .../java/org/scribble/ast/ProtocolHeader.java | 8 +++ .../main/java/org/scribble/ast/RoleDecl.java | 6 ++ .../java/org/scribble/ast/RoleDeclList.java | 6 ++ .../scribble/ast/SimpleInteractionNode.java | 6 ++ .../scribble/ast/global/GInteractionSeq.java | 6 ++ .../scribble/ast/global/GMessageTransfer.java | 6 ++ .../scribble/ast/global/GProtocolBlock.java | 6 ++ .../scribble/ast/global/GProtocolDecl.java | 6 ++ .../org/scribble/ast/global/GProtocolDef.java | 6 ++ .../scribble/ast/global/GProtocolHeader.java | 6 ++ .../parser/scribble/ScribTreeAdaptor.java | 64 ++++++++++++------- 23 files changed, 192 insertions(+), 23 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/CompoundInteraction.java b/scribble-core/src/main/java/org/scribble/ast/CompoundInteraction.java index 6d359df19..acb227047 100644 --- a/scribble-core/src/main/java/org/scribble/ast/CompoundInteraction.java +++ b/scribble-core/src/main/java/org/scribble/ast/CompoundInteraction.java @@ -13,11 +13,17 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; // ProtocolBlock or CompoundInteractionNode public abstract class CompoundInteraction extends ScribNodeBase { + public CompoundInteraction(Token t) + { + super(t); + } + public CompoundInteraction(CommonTree source) { super(source); diff --git a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java index 4b248714e..55501c4b0 100644 --- a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java @@ -13,6 +13,7 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.SimpleNameNode; import org.scribble.main.ScribbleException; @@ -24,6 +25,11 @@ // RoleKind or (NonRole)ParamKind public abstract class HeaderParamDecl extends NameDeclNode { + public HeaderParamDecl(Token t) + { + super(t); + } + protected HeaderParamDecl(CommonTree source, SimpleNameNode name) { super(source, name); diff --git a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java index 2e4a538fd..23d14c662 100644 --- a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java +++ b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.stream.Collectors; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ParamKind; @@ -30,6 +31,12 @@ public abstract class HeaderParamDeclList extends ScribNode { private final List> decls; + public HeaderParamDeclList(Token t) + { + super(t); + this.decls = null; + } + protected HeaderParamDeclList(CommonTree source, List> decls) { super(source); diff --git a/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java b/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java index eb0684a56..e668656ee 100644 --- a/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java +++ b/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.stream.Collectors; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ProtocolKind; @@ -30,6 +31,12 @@ public abstract class InteractionSeq extends ScribNodeBa /*@SuppressWarnings("unchecked") private final Function> cast = (n) -> (InteractionNode) n;*/ + public InteractionSeq(Token t) + { + super(t); + this.inters = null; + } + protected InteractionSeq(CommonTree source, List> inters) { super(source); diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java index 626a3a77e..97c0e94c8 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.stream.Collectors; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; import org.scribble.main.ScribbleException; @@ -31,6 +32,14 @@ public abstract class MessageTransfer extends SimpleInte public final MessageNode msg; // FIXME: ambig may get resolved to an unexpected kind, e.g. DataTypeNode (cf. DoArg, PayloadElem wrappers) protected final List dests; + public MessageTransfer(Token t) + { + super(t); + this.src = null; + this.msg = null; + this.dests = null; + } + protected MessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List dests) { super(source); diff --git a/scribble-core/src/main/java/org/scribble/ast/Module.java b/scribble-core/src/main/java/org/scribble/ast/Module.java index f5797acbd..c5eaa2d66 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Module.java +++ b/scribble-core/src/main/java/org/scribble/ast/Module.java @@ -20,6 +20,7 @@ import java.util.function.Predicate; import java.util.stream.Collectors; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.local.LProtocolDecl; @@ -43,7 +44,16 @@ public class Module extends ScribNodeBase private final List> imports; private final List> data; private final List> protos; - + + public Module(Token payload) + { + super(payload); + this.moddecl = null; + this.imports = null; + this.data = null; + this.protos = null; + } + public Module(CommonTree source, ModuleDecl moddecl, List> imports, List> data, List> protos) { diff --git a/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java b/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java index af963bd06..8a6380efc 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java @@ -13,6 +13,7 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.main.ScribbleException; @@ -22,6 +23,11 @@ public class ModuleDecl extends NameDeclNode { + public ModuleDecl(Token t) + { + super(t); + } + public ModuleDecl(CommonTree source, ModuleNameNode fullmodname) { super(source, fullmodname); diff --git a/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java b/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java index 33e918aa0..8914106e3 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java @@ -13,6 +13,7 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; import org.scribble.type.kind.Kind; @@ -21,6 +22,12 @@ public abstract class NameDeclNode extends ScribNodeBase { public final NameNode name; + + public NameDeclNode(Token t) + { + super(t); + this.name = null; + } protected NameDeclNode(CommonTree source, NameNode name) { diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java index 774f80164..f5605761d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.stream.Collectors; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.del.ScribDel; import org.scribble.type.kind.NonRoleParamKind; @@ -27,6 +28,11 @@ // But OK because the NonRoleParamDecl nodes are immutable (the generic kind value is never rewritten after instantiation, only read) public class NonRoleParamDeclList extends HeaderParamDeclList { + public NonRoleParamDeclList(Token t) + { + super(t); + } + public NonRoleParamDeclList(CommonTree source, List> decls) { super(source, decls); diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java index 8b1ae830d..df6a2408e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java @@ -13,6 +13,7 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ProtocolKind; @@ -22,6 +23,12 @@ public abstract class ProtocolBlock extends CompoundInte { public final InteractionSeq seq; + public ProtocolBlock(Token t) + { + super(t); + this.seq = null; + } + public ProtocolBlock(CommonTree source, InteractionSeq seq) { super(source); diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java index d967bd3fd..14653ed16 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java @@ -16,6 +16,7 @@ import java.util.Collections; import java.util.List; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ProtocolKind; @@ -33,6 +34,14 @@ public static enum Modifiers { EXPLICIT, AUX } // FIXME: factor out? Header? public final ProtocolHeader header; public final ProtocolDef def; + protected ProtocolDecl(Token t) + { + super(t); + this.modifiers = null; + this.header = null; + this.def = null; + } + protected ProtocolDecl(CommonTree source, List modifiers, ProtocolHeader header, ProtocolDef def) { super(source); diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolDef.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolDef.java index 7df959ccc..8d53c425f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolDef.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolDef.java @@ -13,6 +13,7 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ProtocolKind; @@ -22,6 +23,12 @@ public abstract class ProtocolDef extends ScribNodeBase { public final ProtocolBlock block; + public ProtocolDef(Token t) + { + super(t); + this.block = null; + } + protected ProtocolDef(CommonTree source, ProtocolBlock block) { super(source); diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java index 01e60bc27..e97a226cb 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java @@ -13,6 +13,7 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; import org.scribble.ast.name.qualified.ProtocolNameNode; @@ -27,6 +28,13 @@ public abstract class ProtocolHeader extends NameDeclNod public final RoleDeclList roledecls; public final NonRoleParamDeclList paramdecls; + public ProtocolHeader(Token t) + { + super(t); + this.roledecls = null; + this.paramdecls = null; + } + protected ProtocolHeader(CommonTree source, NameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) { super(source, name); diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java b/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java index a1b60d183..60a0fd887 100644 --- a/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java @@ -13,6 +13,7 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SimpleNameNode; @@ -23,6 +24,11 @@ public class RoleDecl extends HeaderParamDecl { + public RoleDecl(Token t) + { + super(t); + } + public RoleDecl(CommonTree source, RoleNode name) { super(source, name); diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleDeclList.java b/scribble-core/src/main/java/org/scribble/ast/RoleDeclList.java index 74d273895..080910da4 100644 --- a/scribble-core/src/main/java/org/scribble/ast/RoleDeclList.java +++ b/scribble-core/src/main/java/org/scribble/ast/RoleDeclList.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.stream.Collectors; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.del.ScribDel; import org.scribble.type.kind.RoleKind; @@ -24,6 +25,11 @@ public class RoleDeclList extends HeaderParamDeclList { + public RoleDeclList(Token t) + { + super(t); + } + public RoleDeclList(CommonTree source, List decls) { super(source, decls); diff --git a/scribble-core/src/main/java/org/scribble/ast/SimpleInteractionNode.java b/scribble-core/src/main/java/org/scribble/ast/SimpleInteractionNode.java index fa6a10c69..1b537949f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/SimpleInteractionNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/SimpleInteractionNode.java @@ -13,6 +13,7 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.ProtocolKind; @@ -20,6 +21,11 @@ public abstract class SimpleInteractionNode extends ScribNodeBase implements InteractionNode { + public SimpleInteractionNode(Token t) + { + super(t); + } + protected SimpleInteractionNode(CommonTree source) { super(source); diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java b/scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java index 85f375026..93378e215 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.stream.Collectors; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.InteractionNode; @@ -29,6 +30,11 @@ public class GInteractionSeq extends InteractionSeq implements GNode { + public GInteractionSeq(Token t) + { + super(t); + } + public GInteractionSeq(CommonTree source, List actions) { super(source, actions); diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java index 944f8cedc..d9905195d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java @@ -17,6 +17,7 @@ import java.util.List; import java.util.stream.Collectors; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.Constants; @@ -34,6 +35,11 @@ public class GMessageTransfer extends MessageTransfer implements GSimpleInteractionNode { + public GMessageTransfer(Token t) + { + super(t); + } + public GMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List dests) { super(source, src, msg, dests); diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolBlock.java b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolBlock.java index c3092f49b..b0158ed5a 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolBlock.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolBlock.java @@ -13,6 +13,7 @@ */ package org.scribble.ast.global; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.InteractionSeq; @@ -25,6 +26,11 @@ public class GProtocolBlock extends ProtocolBlock implements GNode { + public GProtocolBlock(Token t) + { + super(t); + } + public GProtocolBlock(CommonTree source, GInteractionSeq seq) { super(source, seq); diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java index 6cb136bcb..ca429b7dc 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java @@ -15,6 +15,7 @@ import java.util.List; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.Module; @@ -33,6 +34,11 @@ public class GProtocolDecl extends ProtocolDecl implements GNode { + public GProtocolDecl(Token t) + { + super(t); + } + public GProtocolDecl(CommonTree source, List modifiers, GProtocolHeader header, GProtocolDef def) { super(source, modifiers, header, def); diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDef.java b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDef.java index 661822e2f..2d2b02df1 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDef.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDef.java @@ -13,6 +13,7 @@ */ package org.scribble.ast.global; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.ProtocolBlock; @@ -25,6 +26,11 @@ public class GProtocolDef extends ProtocolDef implements GNode { + public GProtocolDef(Token t) + { + super(t); + } + public GProtocolDef(CommonTree source, GProtocolBlock block) { super(source, block); diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolHeader.java b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolHeader.java index 992dcb811..d6d6163ba 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolHeader.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolHeader.java @@ -13,6 +13,7 @@ */ package org.scribble.ast.global; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.Constants; @@ -31,6 +32,11 @@ public class GProtocolHeader extends ProtocolHeader implements GNode { + public GProtocolHeader(Token t) + { + super(t); + } + public GProtocolHeader(CommonTree source, GProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) { super(source, name, roledecls, paramdecls); diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index f60a07849..7eccb8a67 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -1,13 +1,21 @@ package org.scribble.parser.scribble; -import java.util.Collections; - import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.antlr.runtime.tree.CommonTreeAdaptor; import org.scribble.ast.AstFactory; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.Module; +import org.scribble.ast.ModuleDecl; +import org.scribble.ast.NonRoleParamDeclList; +import org.scribble.ast.RoleDecl; +import org.scribble.ast.RoleDeclList; +import org.scribble.ast.global.GInteractionSeq; +import org.scribble.ast.global.GMessageTransfer; +import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ast.global.GProtocolDef; +import org.scribble.ast.global.GProtocolHeader; import org.scribble.parser.scribble.ast.tree.MyCommonTree; public class ScribTreeAdaptor extends CommonTreeAdaptor @@ -15,33 +23,45 @@ public class ScribTreeAdaptor extends CommonTreeAdaptor private final AstFactory f = new AstFactoryImpl(); @Override - public Object create(Token payload) + public Object create(Token t) { - if (payload == null) + /*if (payload == null) { //System.out.println("aaa: " + payload.getText()); return new MyCommonTree(payload); - } + }*/ - /*if (payload != null) + String lab = ""; + if (t != null) { - return new MyCommonTree(payload); - }*/ - String lab = payload.getText(); - CommonTree empty = new CommonTree(payload); // CommonTree constr sets this.token = payload.token + //return new MyCommonTree(payload); + lab = t.getText(); + } + CommonTree empty = new CommonTree(t); // CommonTree constr sets this.token = payload.token switch (lab) { - case "MODULE": return this.f.Module(empty, null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); - case "MODULEDECL": return this.f.ModuleDecl(empty, null); - case "GLOBALPROTOCOLDECL": return this.f.GProtocolDecl(empty, Collections.emptyList(), null, null); - case "GLOBALPROTOCOLHEADER": return this.f.GProtocolHeader(empty, null, null, null); - case "ROLEDECL": return this.f.RoleDecl(empty, null); - case "ROLEDECLLIST": return this.f.RoleDeclList(empty, Collections.emptyList()); - case "PARAMETERDECLLIST": return this.f.NonRoleParamDeclList(empty, Collections.emptyList()); - case "GLOBALPROTOCOLDEF": return this.f.GProtocolDef(empty, null); - case "GLOBALPROTOCOLBLOCK": return this.f.GProtocolBlock(empty, null); - case "GLOBALINTERACTIONSEQUENCE": return this.f.GInteractionSeq(empty, Collections.emptyList()); - case "GLOBALMESSAGETRANSFER": return this.f.GMessageTransfer(empty, null, null, Collections.emptyList()); + case "MODULE": //return this.f.Module(empty, null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); + return new Module(t); + case "MODULEDECL": //return this.f.ModuleDecl(empty, null); + return new ModuleDecl(t); + case "GLOBALPROTOCOLDECL": //return this.f.GProtocolDecl(empty, Collections.emptyList(), null, null); + return new GProtocolDecl(t); + case "GLOBALPROTOCOLHEADER": //return this.f.GProtocolHeader(empty, null, null, null); + return new GProtocolHeader(t); + case "ROLEDECL": //return this.f.RoleDecl(empty, null); + return new RoleDecl(t); + case "ROLEDECLLIST": //return this.f.RoleDeclList(empty, Collections.emptyList()); + return new RoleDeclList(t); + case "PARAMETERDECLLIST": //return this.f.NonRoleParamDeclList(empty, Collections.emptyList()); + return new NonRoleParamDeclList(t); + case "GLOBALPROTOCOLDEF": //return this.f.GProtocolDef(empty, null); + return new GProtocolDef(t); + case "GLOBALPROTOCOLBLOCK": //return this.f.GProtocolBlock(empty, null); + return new GProtocolBlock(t); + case "GLOBALINTERACTIONSEQUENCE": //return this.f.GInteractionSeq(empty, Collections.emptyList()); + return new GInteractionSeq(t); + case "GLOBALMESSAGETRANSFER": //return this.f.GMessageTransfer(empty, null, null, Collections.emptyList()); + return new GMessageTransfer(t); //case "QUALIFIEDNAME": return this.f.Q //case "MESSAGESIGNATURE": return this.f.Me //case "PAYLOAD": @@ -54,7 +74,7 @@ public Object create(Token payload) case A case B*/ default: //throw new RuntimeException("Shouldn't get here: " + lab); - return new MyCommonTree(payload); + return new MyCommonTree(t); //return empty; } } From a8f0c215f7500d45a63898d4e561661213afc1d6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 17 Jan 2019 22:56:29 +0000 Subject: [PATCH 074/539] Continued experimenting. --- .../java/org/scribble/ast/name/NameNode.java | 7 ++++++ .../ast/name/qualified/ModuleNameNode.java | 6 +++++ .../ast/name/qualified/QualifiedNameNode.java | 6 +++++ .../org/scribble/parser/antlr/Scribble.g | 14 ++++++++++- .../parser/scribble/ScribTreeAdaptor.java | 23 ++++++++++++++----- .../parser/scribble/ast/AntlrModuleDecl.java | 18 +++++++++++++-- 6 files changed, 65 insertions(+), 9 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java index 39ded5889..817a2ed8c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java @@ -15,6 +15,7 @@ import java.util.Arrays; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.ScribNodeBase; @@ -26,6 +27,12 @@ public abstract class NameNode extends ScribNodeBase implements { protected final String[] elems; + public NameNode(Token t) + { + super(t); + this.elems = null; + } + public NameNode(CommonTree source, String... elems) { super(source); diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java index 2580ceb05..c138ea3e6 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java @@ -13,6 +13,7 @@ */ package org.scribble.ast.name.qualified; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.type.kind.ModuleKind; @@ -21,6 +22,11 @@ public class ModuleNameNode extends QualifiedNameNode { + public ModuleNameNode(Token t) + { + super(t); + } + public ModuleNameNode(CommonTree source, String... ns) { super(source, ns); diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java index a31a2d5b0..77b19b379 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java @@ -13,12 +13,18 @@ */ package org.scribble.ast.name.qualified; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; import org.scribble.type.kind.Kind; public abstract class QualifiedNameNode extends NameNode { + public QualifiedNameNode(Token t) + { + super(t); + } + public QualifiedNameNode(CommonTree source, String... ns) { super(source, ns); diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 8f57cadc0..73ad88574 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -97,6 +97,9 @@ tokens //NAME = 'name'; AMBIGUOUSNAME = 'AMBIGUOUSNAME'; QUALIFIEDNAME = 'QUALIFIEDNAME'; + + MODULENAME = 'MODULENAME'; + //PACKAGENAME = 'package-name'; //FULLMODULENAME = 'full-module-name'; //SIMPLEMEMBERNAME = 'simple-member-name'; @@ -382,9 +385,16 @@ qualifiedname: ; packagename: qualifiedname; -modulename: qualifiedname; +//modulename: qualifiedname; membername: qualifiedname; +modulename: + IDENTIFIER ('.' IDENTIFIER)* +-> + ^(MODULENAME IDENTIFIER+) +; + + protocolname: membername; payloadtypename: membername; messagesignaturename: membername; @@ -403,6 +413,8 @@ module: /** * Section 3.2.3 Module Declarations */ +// MODULE_KW IDENTIFIER ('.' IDENTIFIER)* ';' +// ^(MODULEDECL IDENTIFIER+) moduledecl: MODULE_KW modulename ';' -> diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 7eccb8a67..615cb4823 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -1,7 +1,6 @@ package org.scribble.parser.scribble; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.antlr.runtime.tree.CommonTreeAdaptor; import org.scribble.ast.AstFactory; import org.scribble.ast.AstFactoryImpl; @@ -16,7 +15,9 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.global.GProtocolDef; import org.scribble.ast.global.GProtocolHeader; +import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.parser.scribble.ast.tree.MyCommonTree; +import org.scribble.type.name.ModuleName; public class ScribTreeAdaptor extends CommonTreeAdaptor { @@ -37,7 +38,7 @@ public Object create(Token t) //return new MyCommonTree(payload); lab = t.getText(); } - CommonTree empty = new CommonTree(t); // CommonTree constr sets this.token = payload.token + //CommonTree empty = new CommonTree(t); // CommonTree constr sets this.token = payload.token switch (lab) { case "MODULE": //return this.f.Module(empty, null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); @@ -62,9 +63,18 @@ public Object create(Token t) return new GInteractionSeq(t); case "GLOBALMESSAGETRANSFER": //return this.f.GMessageTransfer(empty, null, null, Collections.emptyList()); return new GMessageTransfer(t); - //case "QUALIFIEDNAME": return this.f.Q - //case "MESSAGESIGNATURE": return this.f.Me - //case "PAYLOAD": + //case "QUALIFIEDNAME": //return this.f.Q + case "MODULENAME": //return this.f.Q + //return new ModuleNameNode(t); + return new ModuleNameNode(t); /*.. HERE ambigname -- or qualifiedname? (ambigname currently singleton name) + -- or modulename just as identifiers? -- ANTLR uses every (leaf) token as singleton node + -- AntlrTokenTree? -- i.e. CommonTree (wrapper for Token)*/ + //..here: do for other names + + /*case "MESSAGESIGNATURE": //return this.f.Me + throw new RuntimeException("Shouldn't get here: " + lab); + case "PAYLOAD": + throw new RuntimeException("Shouldn't get here: " + lab);*/ /*case tmp case Test case Proto1 @@ -73,7 +83,8 @@ public Object create(Token t) case 1 case A case B*/ - default: //throw new RuntimeException("Shouldn't get here: " + lab); + default: + //throw new RuntimeException("Shouldn't get here: " + lab); return new MyCommonTree(t); //return empty; } diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModuleDecl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModuleDecl.java index dcc769ffd..ec1649793 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModuleDecl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModuleDecl.java @@ -13,11 +13,16 @@ */ package org.scribble.parser.scribble.ast; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.ModuleDecl; +import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.ast.name.AntlrQualifiedName; +import org.scribble.type.kind.ModuleKind; public class AntlrModuleDecl { @@ -25,7 +30,16 @@ public class AntlrModuleDecl public static ModuleDecl parseModuleDecl(AntlrToScribParser parser, CommonTree ct, AstFactory af) { - return af.ModuleDecl(ct, AntlrQualifiedName.toModuleNameNode(getModuleNameChild(ct), af)); + //return af.ModuleDecl(ct, AntlrQualifiedName.toModuleNameNode(getModuleNameChild(ct), af)); + + System.out.println("bbb: " + ct.getChildren().stream().map(x -> x.getClass().toString()).collect(Collectors.joining(""))); + System.out.println("ccc: " + ((CommonTree) ct.getChild(0)).getChildren().stream().map(x -> x.getClass().toString()).collect(Collectors.joining(""))); + + // HACK FIXME + //List collect = ((Stream) ct.getChildren().stream()).map(x -> ((CommonTree) x).getText()).collect(Collectors.toList()); + List collect = ((Stream) ((CommonTree) ct.getChild(0)).getChildren().stream()).map(x -> ((CommonTree) x).getText()).collect(Collectors.toList()); + + return af.ModuleDecl(ct, (ModuleNameNode) af.QualifiedNameNode(ct, ModuleKind.KIND, collect.toArray(new String[0]))); } public static CommonTree getModuleNameChild(CommonTree ct) From 91e63e1ee89af8091ea9f371293b1edc22f2fecb Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 18 Jan 2019 15:19:43 +0000 Subject: [PATCH 075/539] Continued experimenting. --- .../java/org/scribble/main/MainContext.java | 7 ++++- .../ast/name/qualified/MemberNameNode.java | 14 +++++++-- .../name/qualified/MessageSigNameNode.java | 30 ++++++++++++------- .../org/scribble/parser/antlr/Scribble.g | 4 ++- .../parser/scribble/ScribTreeAdaptor.java | 15 +++++----- 5 files changed, 47 insertions(+), 23 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/main/MainContext.java b/scribble-cli/src/main/java/org/scribble/main/MainContext.java index 048d6fa9b..f696d045c 100644 --- a/scribble-cli/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-cli/src/main/java/org/scribble/main/MainContext.java @@ -21,6 +21,7 @@ import java.util.Map.Entry; import java.util.stream.Collectors; +import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.ImportDecl; @@ -107,7 +108,11 @@ public MainContext(boolean debug, ResourceLocator locator, Path mainpath, boolea // FIXME: checking main module resource exists at specific location should be factored out to front-end (e.g. CommandLine) -- main module resource is specified at local front end level of abstraction, while MainContext uses abstract resource loading //Pair p = this.loader.loadMainModule(mainpath); Resource res = DirectoryResourceLocator.getResourceByFullPath(mainpath); // FIXME: hardcoded to DirectoryResourceLocator -- main module loading should be factored out to front end (e.g. CommandLine) - Module mod = (Module) this.scribParser.parse(this.antlrParser.parseAntlrTree(res), this.af); // FIXME: rename exceptions + CommonTree atree = this.antlrParser.parseAntlrTree(res); + + System.out.println("111: " + atree.getClass()); + + Module mod = (Module) this.scribParser.parse(atree, this.af); // FIXME: rename exceptions checkMainModuleName(mainpath, mod); init(res, mod); diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java index 26dc1025b..e8ac9a0f9 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java @@ -15,18 +15,25 @@ import java.util.Arrays; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.Kind; import org.scribble.type.name.ModuleName; import org.scribble.type.name.PackageName; -public abstract class MemberNameNode extends QualifiedNameNode +public abstract class MemberNameNode + extends QualifiedNameNode { + public MemberNameNode(Token t) + { + super(t); + } + public MemberNameNode(CommonTree source, String... ns) { super(source, ns); } - + protected ModuleName getModuleNamePrefix() { String[] prefix = getPrefixElements(); @@ -35,6 +42,7 @@ protected ModuleName getModuleNamePrefix() { return mn; } - return new ModuleName(new PackageName(Arrays.copyOf(prefix, prefix.length - 1)), mn); + return new ModuleName( + new PackageName(Arrays.copyOf(prefix, prefix.length - 1)), mn); } } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java index 0308973bf..b6e93b7e5 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java @@ -13,19 +13,26 @@ */ package org.scribble.ast.name.qualified; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.type.kind.SigKind; import org.scribble.type.name.MessageSigName; -public class MessageSigNameNode extends MemberNameNode implements MessageNode +public class MessageSigNameNode extends MemberNameNode + implements MessageNode { + public MessageSigNameNode(Token t) + { + super(t); + } + public MessageSigNameNode(CommonTree source, String... elems) { super(source, elems); } - + @Override public MessageNode project(AstFactory af) { @@ -37,19 +44,19 @@ protected MessageSigNameNode copy() { return new MessageSigNameNode(this.source, this.elems); } - + @Override public MessageSigNameNode clone(AstFactory af) { - return (MessageSigNameNode) af.QualifiedNameNode(this.source, SigKind.KIND, this.elems); + return (MessageSigNameNode) af.QualifiedNameNode(this.source, SigKind.KIND, + this.elems); } - + @Override public MessageSigName toName() { MessageSigName membname = new MessageSigName(getLastElement()); - return isPrefixed() - ? new MessageSigName(getModuleNamePrefix(), membname) + return isPrefixed() ? new MessageSigName(getModuleNamePrefix(), membname) : membname; } @@ -59,8 +66,9 @@ public boolean isMessageSigNameNode() return true; } + // Difference between toName and toMessage is scope? does that make sense? @Override - public MessageSigName toMessage() // Difference between toName and toMessage is scope? does that make sense? + public MessageSigName toMessage() { return toName(); } @@ -70,7 +78,7 @@ public MessageSigName toArg() { return toMessage(); } - + @Override public boolean equals(Object o) { @@ -84,13 +92,13 @@ public boolean equals(Object o) } return ((MessageSigNameNode) o).canEqual(this) && super.equals(o); } - + @Override public boolean canEqual(Object o) { return o instanceof MessageSigNameNode; } - + @Override public int hashCode() { diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 73ad88574..b93985620 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -22,6 +22,8 @@ options } +// FIXME: match tokens to keywords? + tokens { /* @@ -75,7 +77,7 @@ tokens * field) */ - // Purely util constants -- not parsed as node types + // Purely util constants -- not parsed as node types -- N.B. but are still "tokens" (FIXME: match with keywords) KIND_MESSAGESIGNATURE = 'KIND_MESSAGESIGNATURE'; KIND_PAYLOADTYPE = 'KIND_PAYLOADTYPE'; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 615cb4823..de43d0c0f 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -15,6 +15,7 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.global.GProtocolDef; import org.scribble.ast.global.GProtocolHeader; +import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.parser.scribble.ast.tree.MyCommonTree; import org.scribble.type.name.ModuleName; @@ -69,12 +70,10 @@ public Object create(Token t) return new ModuleNameNode(t); /*.. HERE ambigname -- or qualifiedname? (ambigname currently singleton name) -- or modulename just as identifiers? -- ANTLR uses every (leaf) token as singleton node -- AntlrTokenTree? -- i.e. CommonTree (wrapper for Token)*/ - //..here: do for other names - - /*case "MESSAGESIGNATURE": //return this.f.Me - throw new RuntimeException("Shouldn't get here: " + lab); + case "MESSAGESIGNATURE": //return this.f.Me + return new MessageSigNameNode(t); case "PAYLOAD": - throw new RuntimeException("Shouldn't get here: " + lab);*/ + return new MyCommonTree(t); // FIXME: placeholder for deleg, qualified or ambig /*case tmp case Test case Proto1 @@ -83,9 +82,11 @@ public Object create(Token t) case 1 case A case B*/ - default: - //throw new RuntimeException("Shouldn't get here: " + lab); + case "": // CHECKME ? return new MyCommonTree(t); + default: + //throw new RuntimeException("Shouldn't get here: " + lab + " ,, " + lab.length()); + return new MyCommonTree(t); // FIXME: rename ID //return empty; } } From fa6ee0e986ed6e6decde6a842183ed8a28af42dc Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 24 Jan 2019 18:26:05 +0000 Subject: [PATCH 076/539] WIP. --- .../java/org/scribble/cli/CommandLine.java | 8 +- .../java/org/scribble/main/MainContext.java | 6 +- .../callbackapi/CBEndpointApiGenerator.java | 14 +- .../callbackapi/CBEndpointApiGenerator2.java | 20 +- .../callbackapi/CBEndpointApiGenerator3.java | 22 +- .../java/sessionapi/SessionApiGenerator.java | 4 +- .../java/statechanapi/BranchSockGen.java | 8 +- .../java/statechanapi/CaseSockGen.java | 8 +- .../java/statechanapi/HandlerIfaceGen.java | 2 +- .../java/statechanapi/InputFutureGen.java | 4 +- .../java/statechanapi/OutputSockGen.java | 4 +- .../java/statechanapi/ReceiveSockGen.java | 8 +- .../java/statechanapi/ScribSockGen.java | 4 +- .../main/java/org/scribble/ast/Choice.java | 85 +++-- .../org/scribble/ast/CompoundInteraction.java | 17 +- .../scribble/ast/CompoundInteractionNode.java | 25 +- .../java/org/scribble/ast/DataTypeDecl.java | 77 +++-- .../src/main/java/org/scribble/ast/Do.java | 2 +- .../java/org/scribble/ast/ImportDecl.java | 73 +++- .../java/org/scribble/ast/ImportModule.java | 97 +++--- .../java/org/scribble/ast/InteractionSeq.java | 78 +++-- .../java/org/scribble/ast/MessageNode.java | 2 +- .../org/scribble/ast/MessageSigNameDecl.java | 74 +++-- .../org/scribble/ast/MessageTransfer.java | 94 ++++-- .../main/java/org/scribble/ast/Module.java | 312 +++++++++++------- .../java/org/scribble/ast/ModuleDecl.java | 80 ++++- .../java/org/scribble/ast/NameDeclNode.java | 68 +++- .../org/scribble/ast/NonProtocolDecl.java | 71 +++- .../org/scribble/ast/NonRoleParamDecl.java | 35 +- .../java/org/scribble/ast/ProtocolBlock.java | 62 +++- .../java/org/scribble/ast/ProtocolDecl.java | 89 +++-- .../java/org/scribble/ast/ProtocolDef.java | 49 ++- .../java/org/scribble/ast/ProtocolHeader.java | 82 +++-- .../main/java/org/scribble/ast/RoleDecl.java | 8 +- .../main/java/org/scribble/ast/ScribNode.java | 8 +- .../java/org/scribble/ast/ScribNodeBase.java | 69 +++- .../scribble/ast/SimpleInteractionNode.java | 16 + .../scribble/ast/context/ModuleContext.java | 26 +- .../java/org/scribble/ast/global/GChoice.java | 79 +++-- .../scribble/ast/global/GInteractionNode.java | 2 +- .../scribble/ast/global/GInteractionSeq.java | 62 ++-- .../scribble/ast/global/GMessageTransfer.java | 118 ++++--- .../scribble/ast/global/GProtocolBlock.java | 60 ++-- .../scribble/ast/global/GProtocolDecl.java | 101 ++++-- .../org/scribble/ast/global/GProtocolDef.java | 51 +-- .../scribble/ast/global/GProtocolHeader.java | 89 +++-- .../org/scribble/ast/global/GRecursion.java | 4 +- .../java/org/scribble/ast/local/LChoice.java | 110 +++--- .../main/java/org/scribble/ast/local/LDo.java | 4 +- .../scribble/ast/local/LInteractionSeq.java | 81 +++-- .../scribble/ast/local/LMessageTransfer.java | 21 ++ .../org/scribble/ast/local/LParallel.java | 2 +- .../scribble/ast/local/LProjectionDecl.java | 52 ++- .../scribble/ast/local/LProtocolBlock.java | 72 ++-- .../org/scribble/ast/local/LProtocolDecl.java | 95 ++++-- .../org/scribble/ast/local/LProtocolDef.java | 57 +++- .../scribble/ast/local/LProtocolHeader.java | 90 +++-- .../java/org/scribble/ast/local/LReceive.java | 4 +- .../org/scribble/ast/local/LRecursion.java | 2 +- .../java/org/scribble/ast/local/LSend.java | 6 +- .../java/org/scribble/ast/name/NameNode.java | 18 +- .../ast/name/qualified/DataTypeNode.java | 48 ++- .../ast/name/simple/AmbigNameNode.java | 57 +++- .../ast/name/simple/SimpleNameNode.java | 27 +- .../main/java/org/scribble/del/ChoiceDel.java | 4 +- .../java/org/scribble/del/DoArgListDel.java | 2 +- .../main/java/org/scribble/del/ModuleDel.java | 59 +++- .../main/java/org/scribble/del/ScribDel.java | 1 + .../org/scribble/del/global/GChoiceDel.java | 6 +- .../del/global/GDelegationElemDel.java | 6 +- .../del/global/GInteractionSeqDel.java | 12 +- .../scribble/del/global/GProtocolDeclDel.java | 6 +- .../org/scribble/del/local/LChoiceDel.java | 14 +- .../java/org/scribble/del/local/LDoDel.java | 2 +- .../del/local/LInteractionSeqDel.java | 20 +- .../del/local/LProjectionDeclDel.java | 4 +- .../org/scribble/del/local/LReceiveDel.java | 27 +- .../java/org/scribble/del/local/LSendDel.java | 2 +- .../src/main/java/org/scribble/main/Job.java | 2 +- .../java/org/scribble/main/JobContext.java | 6 +- .../java/org/scribble/util/ScribUtil.java | 28 +- .../visit/InlinedProtocolUnfolder.java | 2 +- .../scribble/visit/SubprotocolVisitor.java | 2 +- .../context/ProjectedChoiceDoPruner.java | 4 +- .../UnguardedChoiceDoProjectionChecker.java | 4 +- .../visit/wf/ExplicitCorrelationChecker.java | 2 +- .../scribble/visit/wf/WFChoiceChecker.java | 2 +- .../parser/scribble/AntlrToScribParser.java | 4 +- .../parser/scribble/ScribTreeAdaptor.java | 16 +- scribble-test/src/test/scrib/tmp/Test.scr | 4 +- 90 files changed, 2243 insertions(+), 1021 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index ecb42a3c9..57cbc235d 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -320,7 +320,7 @@ private EGraph getEGraph(Job job, GProtocolName fullname, Role role, boolean for throws ScribbleException, CommandLineException { JobContext jcontext = job.getContext(); - GProtocolDecl gpd = (GProtocolDecl) jcontext.getMainModule().getProtocolDecl(fullname.getSimpleName()); + GProtocolDecl gpd = (GProtocolDecl) jcontext.getMainModule().getProtocolDeclChild(fullname.getSimpleName()); if (gpd == null || !gpd.header.roledecls.getRoles().contains(role)) { throw new CommandLineException("Bad FSM construction args: " + Arrays.toString(this.args.get(CLArgFlag.DOT))); @@ -510,12 +510,12 @@ protected static GProtocolName checkGlobalProtocolArg(JobContext jcontext, Strin { throw new CommandLineException("Global protocol not found: " + simpname); } - ProtocolDecl pd = main.getProtocolDecl(simpgpn); + ProtocolDecl pd = main.getProtocolDeclChild(simpgpn); if (pd == null || !pd.isGlobal()) { throw new CommandLineException("Global protocol not found: " + simpname); } - if (pd.isAuxModifier()) // CHECKME: maybe don't check for all, e.g. -project + if (pd.isAux()) // CHECKME: maybe don't check for all, e.g. -project { throw new CommandLineException("Invalid aux protocol specified as root: " + simpname); } @@ -524,7 +524,7 @@ protected static GProtocolName checkGlobalProtocolArg(JobContext jcontext, Strin protected static Role checkRoleArg(JobContext jcontext, GProtocolName fullname, String rolename) throws CommandLineException { - ProtocolDecl pd = jcontext.getMainModule().getProtocolDecl(fullname.getSimpleName()); + ProtocolDecl pd = jcontext.getMainModule().getProtocolDeclChild(fullname.getSimpleName()); Role role = new Role(rolename); if (!pd.header.roledecls.getRoles().contains(role)) { diff --git a/scribble-cli/src/main/java/org/scribble/main/MainContext.java b/scribble-cli/src/main/java/org/scribble/main/MainContext.java index f696d045c..0c87be043 100644 --- a/scribble-cli/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-cli/src/main/java/org/scribble/main/MainContext.java @@ -174,7 +174,7 @@ protected SModelFactory newSModelFactory() private void loadAllModules(Pair module) throws ScribParserException, ScribbleException { this.parsed.put(module.right.getFullModuleName(), module); - for (ImportDecl id : module.right.getImportDecls()) + for (ImportDecl id : module.right.getImportDeclChildren()) { if (id.isImportModule()) { @@ -202,7 +202,9 @@ private void checkMainModuleName(Path mainpath, Module main) throws ScribbleExce { if (!tmp.equals(main.getFullModuleName().getSimpleName().toString())) // ModuleName.toString hack? { - throw new ScribbleException(main.moddecl.name.getSource(), "Simple module name at path " + path + " mismatch: " + main.getFullModuleName()); + CommonTree source = main.getModuleDeclChild().name.getSource(); + throw new ScribbleException(source, "Simple module name at path " + path + + " mismatch: " + main.getFullModuleName()); } } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 225746110..d37ba7020 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -219,12 +219,12 @@ public Map buildEndpointClass() throws ScribbleException messageInterface += "}\n"; res.put(mprefix + "interfaces/" + messageIfName + ".java", messageInterface);*/ - boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() + boolean isSig = jc.getMainModule().getNonProtoDeclChildren().stream() .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); MessageSigNameDecl msnd = null; if (isSig) { - msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() + msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtoDeclChildren().stream() .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); } @@ -264,7 +264,7 @@ public Map buildEndpointClass() throws ScribbleException int i = 1; for (PayloadElemType pet : a.payload.elems) { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + DataTypeDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); messageClass += ", " + dtd.extName + " arg" + i++; } } @@ -363,12 +363,12 @@ public Map buildEndpointClass() throws ScribbleException receiveInterface += "\n"; receiveInterface += "public interface " + receiveIfName + " {\n"; // FIXME: factor out - boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() + boolean isSig = jc.getMainModule().getNonProtoDeclChildren().stream() .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); MessageSigNameDecl msnd = null; if (isSig) { - msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() + msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtoDeclChildren().stream() .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); } @@ -383,7 +383,7 @@ public Map buildEndpointClass() throws ScribbleException int i = 1; for (PayloadElemType pet : a.payload.elems) { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + DataTypeDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); receiveInterface += ", " + dtd.extName + " arg" + i++; } } @@ -413,7 +413,7 @@ public Map buildEndpointClass() throws ScribbleException int i = 0; for (PayloadElemType pet : a.payload.elems) { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + DataTypeDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); branchAbstract += ", (" + dtd.extName + ") m.payload[" + i++ + "]"; } branchAbstract += "); break;\n"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java index ad9634949..27e6c5234 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java @@ -220,7 +220,7 @@ public Map buildEndpointClass() throws ScribbleException ? "Unit" : a.payload.elems.stream().map(e -> { - String extName = main.getDataTypeDecl((DataType) e).extName; + String extName = main.getDataTypeDeclChild((DataType) e).extName; return (extName.indexOf(".") != -1) ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) : extName; @@ -266,7 +266,7 @@ public Map buildEndpointClass() throws ScribbleException String[] args = new String[a.payload.elems.size() + 2]; args[0] = getRolesPackage() + "." + a.peer + " peer"; args[1] = getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + " op"; - a.payload.elems.forEach(e -> args[i[0]++] = main.getDataTypeDecl((DataType) e).extName + " arg" + (i[0]-3)); + a.payload.elems.forEach(e -> args[i[0]++] = main.getDataTypeDeclChild((DataType) e).extName + " arg" + (i[0]-3)); ConstructorBuilder ob = messageClass.newConstructor(args); ob.addModifiers("public"); ob.addBodyLine("super(op" + IntStream.range(0, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining()) + ");"); @@ -283,12 +283,12 @@ public Map buildEndpointClass() throws ScribbleException for (EAction a : s.getAllActions()) { // FIXME: factor out - boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() + boolean isSig = jc.getMainModule().getNonProtoDeclChildren().stream() .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); MessageSigNameDecl msnd = null; if (isSig) { - msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() + msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtoDeclChildren().stream() .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); } @@ -367,7 +367,7 @@ String generateReceiveInterface(boolean isSig, MessageSigNameDecl msnd, JobConte int i = 1; for (PayloadElemType pet : a.payload.elems) { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + DataTypeDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); receiveInterface += ", " + dtd.extName + " arg" + i++; } } @@ -394,12 +394,12 @@ String generateBranch(String bprefix, JobContext jc, EState s, String endpointNa for (EAction a : s.getAllActions()) { // FIXME: factor out - boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() + boolean isSig = jc.getMainModule().getNonProtoDeclChildren().stream() .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); MessageSigNameDecl msnd = null; if (isSig) { - msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() + msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtoDeclChildren().stream() .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); } @@ -415,7 +415,7 @@ String generateBranch(String bprefix, JobContext jc, EState s, String endpointNa int i = 0; for (PayloadElemType pet : a.payload.elems) { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + DataTypeDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); branchAbstract += ", (" + dtd.extName + ") m.payload[" + i++ + "]"; } branchAbstract += "); break;\n"; @@ -443,7 +443,7 @@ String generateMessageInterface(EState s, String messageIfName, String endpoint MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) { return (MessageSigNameDecl) - this.job.getContext().getMainModule().getNonProtocolDecls().stream() // FIXME: main module? + this.job.getContext().getMainModule().getNonProtoDeclChildren().stream() // FIXME: main module? .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(mid.toString())) .iterator().next(); } @@ -489,7 +489,7 @@ String generateMessageClass(boolean isSig, String messageName, EState s, Module main = this.job.getContext().getMainModule(); for (PayloadElemType pet : a.payload.elems) { - DataTypeDecl dtd = main.getDataTypeDecl((DataType) pet); + DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pet); messageClass += ", " + dtd.extName + " arg" + i++; } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 786ff2820..0a6c6e846 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -202,12 +202,12 @@ public Map buildEndpointClass() throws ScribbleException for (EAction a : s.getAllActions()) { // FIXME: factor out - boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() + boolean isSig = jc.getMainModule().getNonProtoDeclChildren().stream() .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); MessageSigNameDecl msnd = null; if (isSig) { - msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() + msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtoDeclChildren().stream() .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); } @@ -550,12 +550,12 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, int[] i = { 0 }; // FIXME: factor out - boolean isSig = main.getNonProtocolDecls().stream() + boolean isSig = main.getNonProtoDeclChildren().stream() .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); MessageSigNameDecl msnd = null; if (isSig) { - msnd = (MessageSigNameDecl) main.getNonProtocolDecls().stream() + msnd = (MessageSigNameDecl) main.getNonProtoDeclChildren().stream() .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); FieldBuilder m = opClass.newField("m"); m.addModifiers("private", "final"); @@ -571,7 +571,7 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, else { opCons = opClass.newConstructor(a.payload.elems.stream().map(e -> - main.getDataTypeDecl((DataType) e).extName + " arg" + i[0]++ + main.getDataTypeDeclChild((DataType) e).extName + " arg" + i[0]++ ).collect(Collectors.joining(", "))); } opCons.addModifiers("public"); @@ -658,12 +658,12 @@ protected String generateBranch(String bprefix, JobContext jc, EState s, String for (EAction a : s.getAllActions()) { // FIXME: factor out - boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() + boolean isSig = jc.getMainModule().getNonProtoDeclChildren().stream() .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); MessageSigNameDecl msnd = null; if (isSig) { - msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtocolDecls().stream() + msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtoDeclChildren().stream() .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); } @@ -679,7 +679,7 @@ protected String generateBranch(String bprefix, JobContext jc, EState s, String int i = 0; for (PayloadElemType pet : a.payload.elems) { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + DataTypeDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); branchAbstract += ", (" + dtd.extName + ") m.payload[" + i++ + "]"; } branchAbstract += "); break;\n"; @@ -711,7 +711,7 @@ protected String generateReceiveInterface(boolean isSig, MessageSigNameDecl msnd int i = 1; for (PayloadElemType pet : a.payload.elems) { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDecl((DataType) pet); + DataTypeDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); receiveInterface += ", " + dtd.extName + " arg" + i++; } } @@ -956,7 +956,7 @@ protected String getMessagesPackage(String rootPack) protected MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) { return (MessageSigNameDecl) - this.job.getContext().getMainModule().getNonProtocolDecls().stream() // FIXME: main module? + this.job.getContext().getMainModule().getNonProtoDeclChildren().stream() // FIXME: main module? .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(mid.toString())) .iterator().next(); } @@ -964,7 +964,7 @@ protected MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) //protected final Function, String> getExtName = e -> protected String getExtName(PayloadElemType e) { - String extName = this.job.getContext().getMainModule().getDataTypeDecl((DataType) e).extName; + String extName = this.job.getContext().getMainModule().getDataTypeDeclChild((DataType) e).extName; return (extName.indexOf(".") != -1) ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) : extName; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index 884b8110c..adb35742d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -183,7 +183,7 @@ private void constructOpClasses() throws ScribbleException { Module mod = this.job.getContext().getModule(this.gpn.getPrefix()); GProtocolName simpname = this.gpn.getSimpleName(); - GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDecl(simpname); + GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDeclChild(simpname); MessageIdCollector coll = new MessageIdCollector(this.job, ((ModuleDel) mod.del()).getModuleContext()); gpd.accept(coll); for (MessageId mid : coll.getNames()) @@ -199,7 +199,7 @@ private void constructRoleClasses() throws ScribbleException { Module mod = this.job.getContext().getModule(this.gpn.getPrefix()); GProtocolName simpname = this.gpn.getSimpleName(); - GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDecl(simpname); + GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDeclChild(simpname); for (Role r : gpd.header.roledecls.getRoles()) { //constructRoleClass(this.cb.newClass(), r); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java index 9ee570d3e..48e8cf822 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java @@ -293,14 +293,14 @@ private void addHandleMethod(final String ROLE_PARAM, final String MESSAGE_VAR, int i = 0; for (PayloadElemType pt : a.payload.elems) { - DataTypeDecl dtd = main.getDataTypeDecl((DataType) pt); // TODO: if not DataType + DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType ln += ", " + buffSuper + "(" + dtd.extName + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + i++ + "])"; } } } else { - MessageSigNameDecl msd = main.getMessageSigDecl(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module ln += ", " + JavaBuilder.NEW + " " + BUF_CLASS + "<>((" + msd.extName + ") " + RECEIVE_MESSAGE_PARAM //+ "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[0]" // CHECKME: betty16.lec2.smtp.SmtpC4 + ")"; @@ -380,14 +380,14 @@ private void addCallbackCases(MethodBuilder mb2, final String ROLE_PARAM, int i = 0; for (PayloadElemType pt : a.payload.elems) { - DataTypeDecl dtd = main.getDataTypeDecl((DataType) pt); // TODO: if not DataType + DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType ln += ", " + buffSuper + "(" + dtd.extName + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + i++ + "])"; } } } else { - MessageSigNameDecl msd = main.getMessageSigDecl(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module ln += ", " + JavaBuilder.NEW + " " + BUF_CLASS + "<>((" + msd.extName + ") " + RECEIVE_MESSAGE_PARAM //+ "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[0]" // CHECKME: betty16.lec2.smtp.SmtpC4 + ")"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java index 41075aa82..6bf27c23b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java @@ -138,7 +138,7 @@ private void addReceiveMethod(ClassBuilder cb, EAction a, EState succ) throws Sc } else //if (a.mid.isMessageSigName()) { - MessageSigNameDecl msd = main.getMessageSigDecl(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module mb.addBodyLine(JavaBuilder.SUPER + ".use();"); addBranchCheck(getSessionApiOpConstant(a.mid), mb, CASE_MESSAGE_FIELD); mb.addBodyLine(CASE_ARG_PREFIX + "." + BUFF_VAL_FIELD + " = (" + msd.extName + ") " + CASE_MESSAGE_FIELD + ";"); @@ -193,11 +193,11 @@ private void addCaseReceiveDiscardMethod(ClassBuilder cb, EAction a, EState succ if (a.mid.isOp()) { ln += a.payload.elems.stream() - .map((pt) -> getGarbageBuf(main.getDataTypeDecl(((DataType) pt)).extName)).collect(Collectors.joining(", ")) + ");"; + .map((pt) -> getGarbageBuf(main.getDataTypeDeclChild(((DataType) pt)).extName)).collect(Collectors.joining(", ")) + ");"; } else { - MessageSigNameDecl msd = main.getMessageSigDecl(((MessageSigName) a.mid).getSimpleName()); // Factor out? (send/receive/branchreceive/...) + MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // Factor out? (send/receive/branchreceive/...) ln += getGarbageBuf(msd.extName) + ");"; } mb.addBodyLine(ln); @@ -228,7 +228,7 @@ public static void setCaseReceiveHeaderWithoutReturnType(StateChannelApiGenerato } else //if (a.mid.isMessageSigName()) { - MessageSigNameDecl msd = main.getMessageSigDecl(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module ReceiveSockGen.addReceiveMessageSigNameParams(mb, msd, true); } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java index 893f64173..22c06fb5d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java @@ -106,7 +106,7 @@ public static void addHandleMethodOpAndPayloadParams(StateChannelApiGenerator ap } else //if (a.mid.isMessageSigName()) { - MessageSigNameDecl msd = main.getMessageSigDecl(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module ReceiveSockGen.addReceiveMessageSigNameParams(mb, msd, false); } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java index da416974d..b3aa5453a 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java @@ -80,7 +80,7 @@ public ClassBuilder generateType() throws ScribbleException { throw new ScribbleException("[TODO] API generation not supported for non- data type payloads: " + pt); } - DataTypeDecl dtd = main.getDataTypeDecl((DataType) pt); + DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); ScribSockGen.checkJavaDataTypeDecl(dtd); String type = dtd.extName; types.add(type); @@ -92,7 +92,7 @@ public ClassBuilder generateType() throws ScribbleException } else { - MessageSigNameDecl msd = main.getMessageSigDecl(((MessageSigName) a.mid).getSimpleName()); + MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); ScribSockGen.checkMessageSigNameDecl(msd); String type = msd.extName; types.add(type); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java index 492c0d6f1..502aae8ec 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java @@ -170,7 +170,7 @@ public static void setSendHeaderWithoutReturnType(StateChannelApiGenerator apige } else //if (a.mid.isMessageSigName()) { - MessageSigNameDecl msd = main.getMessageSigDecl(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module addSendMessageSigNameParams(mb, msd); } } @@ -222,7 +222,7 @@ protected static void addSendOpParams(StateChannelApiGenerator apigen, MethodBui { throw new ScribbleException("[TODO] API generation not supported for non- data type payloads: " + pt); } - DataTypeDecl dtd = main.getDataTypeDecl((DataType) pt); // FIXME: might not belong to main module // TODO: if not DataType + DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); // FIXME: might not belong to main module // TODO: if not DataType ScribSockGen.checkJavaDataTypeDecl(dtd); mb.addParameters(dtd.extName + " " + as.next()); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java index ef6b2b0a6..2e0c74336 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java @@ -84,7 +84,7 @@ private void makeReceiveMethod(EAction a, EState succ) throws ScribbleException } else //if (a.mid.isMessageSigName()) { - MessageSigNameDecl msd = main.getMessageSigDecl(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module //addReceiveMessageSigNameParams(mb, a, msd);*/ mb.addBodyLine(StateChannelApiGenerator.SCRIBMESSAGE_CLASS + " " + RECEIVE_MESSAGE_PARAM + " = " + JavaBuilder.SUPER + ".readScribMessage(" + getSessionApiRoleConstant(a.obj) + ");"); @@ -168,7 +168,7 @@ public static void setReceiveHeaderWithoutReturnType(StateChannelApiGenerator ap } else //if (a.mid.isMessageSigName()) { - MessageSigNameDecl msd = main.getMessageSigDecl(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module addReceiveMessageSigNameParams(mb, msd, true); } } @@ -186,7 +186,7 @@ protected static void addReceiveOpParams(MethodBuilder mb, Module main, EAction { throw new ScribbleException("[TODO] API generation not supported for non- data type payloads: " + pt); } - DataTypeDecl dtd = main.getDataTypeDecl((DataType) pt); // TODO: if not DataType + DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType ScribSockGen.checkJavaDataTypeDecl(dtd); mb.addParameters(buffSuper + dtd.extName + "> " + RECEIVE_ARG_PREFIX + i++); } @@ -200,7 +200,7 @@ protected static void addPayloadBuffSetters(Module main, EAction a, MethodBuilde int i = 1; for (PayloadElemType pt : a.payload.elems) // Could factor out this loop (arg names) with addReceiveOpParams (as for send) { - DataTypeDecl dtd = main.getDataTypeDecl((DataType) pt); // TODO: if not DataType + DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType mb.addBodyLine(RECEIVE_ARG_PREFIX + i + "." + BUFF_VAL_FIELD + " = (" + dtd.extName + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + (i++ - 1) +"];"); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java index efab47501..17ab9af3a 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java @@ -153,8 +153,8 @@ protected void addInitialStateConstructor() mb.addBodyLine(SESSIONENDPOINT_PARAM + ".init();"); mb.addBodyLine(ClassBuilder.RETURN + " " + ClassBuilder.NEW + " " + this.root + "(" + SESSIONENDPOINT_PARAM + ");");*/ - GProtocolDecl gpd = (GProtocolDecl) this.apigen.getJob().getContext().getModule(this.apigen.gpn.getPrefix()).getProtocolDecl(this.apigen.gpn.getSimpleName()); - String epClass = gpd.isExplicitModifier() ? EXPLICITENDPOINT_CLASS : MPSTENDPOINT_CLASS; + GProtocolDecl gpd = (GProtocolDecl) this.apigen.getJob().getContext().getModule(this.apigen.gpn.getPrefix()).getProtocolDeclChild(this.apigen.gpn.getSimpleName()); + String epClass = gpd.isExplicit() ? EXPLICITENDPOINT_CLASS : MPSTENDPOINT_CLASS; ConstructorBuilder ctor2 = cb.newConstructor(epClass + "<" + sess + ", " + role + "> " + SESSIONENDPOINT_PARAM); ctor2.addExceptions(StateChannelApiGenerator.SCRIBBLERUNTIMEEXCEPTION_CLASS); diff --git a/scribble-core/src/main/java/org/scribble/ast/Choice.java b/scribble-core/src/main/java/org/scribble/ast/Choice.java index 5559358a3..7be78affe 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Choice.java +++ b/scribble-core/src/main/java/org/scribble/ast/Choice.java @@ -13,56 +13,97 @@ */ package org.scribble.ast; -import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; public abstract class Choice extends CompoundInteractionNode { - public final RoleNode subj; - private final List> blocks; - // Factor up? And specialise to singleton for Recursion/Interruptible? Maybe too artificial -- could separate unaryblocked and multiblocked compound ops? + // ScribTreeAdaptor#create constructor + public Choice(Token t) + { + super(t); + this.subj = null; + this.blocks = null; + } - protected Choice(CommonTree source, RoleNode subj, List> blocks) + // Tree#dupNode constructor + protected Choice(Choice node) { - super(source); - this.subj = subj; - this.blocks = new LinkedList<>(blocks); + super(node); + this.subj = null; + this.blocks = null; } - public abstract Choice reconstruct(RoleNode subj, List> blocks); + public abstract Choice dupNode(); - @Override - public Choice visitChildren(AstVisitor nv) throws ScribbleException + public RoleNode getSubjectChild() { - RoleNode subj = (RoleNode) visitChild(this.subj, nv); - List> blocks = visitChildListWithClassEqualityCheck(this, this.blocks, nv); - return reconstruct(subj, blocks); + return (RoleNode) getChild(0); + } + + // Override in concrete sub for cast + public abstract List> getBlockChildren(); + + public Choice reconstruct(RoleNode subj, List> blocks) + { + Choice pd = dupNode(); + ScribDel del = del(); + pd.addChild(subj); + pd.addChildren(blocks); + pd.setDel(del); // No copy + return pd; } - public List> getBlocks() + @Override + public Choice visitChildren(AstVisitor nv) throws ScribbleException { - return Collections.unmodifiableList(this.blocks); + RoleNode subj = (RoleNode) visitChild(getSubjectChild(), nv); + List> blocks = + visitChildListWithClassEqualityCheck(this, getBlockChildren(), nv); + return reconstruct(subj, blocks); } @Override public String toString() { String sep = " " + Constants.OR_KW + " "; - return Constants.CHOICE_KW + " " + Constants.AT_KW + " " + this.subj + " " - + this.blocks.stream().map((b) -> b.toString()).collect(Collectors.joining(sep)); + return Constants.CHOICE_KW + " " + + Constants.AT_KW + " " + getSubjectChild() + " " + + getBlockChildren().stream().map(b -> b.toString()) + .collect(Collectors.joining(sep)); } - /*@Override - public Map getEnablingMessages() + + + + + + + + + + + + + + + private final RoleNode subj; + private final List> blocks; + // Factor up? And specialise to singleton for Recursion/Interruptible? Maybe too artificial -- could separate unaryblocked and multiblocked compound ops? + + protected Choice(CommonTree source, RoleNode subj, List> blocks) { - - }*/ + super(source); + this.subj = subj; + this.blocks = new LinkedList<>(blocks); + } } diff --git a/scribble-core/src/main/java/org/scribble/ast/CompoundInteraction.java b/scribble-core/src/main/java/org/scribble/ast/CompoundInteraction.java index acb227047..845c4621c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/CompoundInteraction.java +++ b/scribble-core/src/main/java/org/scribble/ast/CompoundInteraction.java @@ -17,13 +17,28 @@ import org.antlr.runtime.tree.CommonTree; // ProtocolBlock or CompoundInteractionNode -public abstract class CompoundInteraction extends ScribNodeBase +public abstract class CompoundInteraction extends ScribNodeBase { + // ScribTreeAdaptor#create constructor public CompoundInteraction(Token t) { super(t); } + // Tree#dupNode constructor + protected CompoundInteraction(CompoundInteraction node) + { + super(node); + } + + + + + + + + + public CompoundInteraction(CommonTree source) { super(source); diff --git a/scribble-core/src/main/java/org/scribble/ast/CompoundInteractionNode.java b/scribble-core/src/main/java/org/scribble/ast/CompoundInteractionNode.java index eafdb5574..d04b6f5ab 100644 --- a/scribble-core/src/main/java/org/scribble/ast/CompoundInteractionNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/CompoundInteractionNode.java @@ -13,13 +13,36 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.ProtocolKind; // Name should be read (Compound ( InteractionNode )) public abstract class CompoundInteractionNode - extends CompoundInteraction implements InteractionNode + extends CompoundInteraction implements InteractionNode { + // ScribTreeAdaptor#create constructor + public CompoundInteractionNode(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected CompoundInteractionNode(CompoundInteractionNode node) + { + super(node); + } + + + + + + + + + + + protected CompoundInteractionNode(CommonTree source) { super(source); diff --git a/scribble-core/src/main/java/org/scribble/ast/DataTypeDecl.java b/scribble-core/src/main/java/org/scribble/ast/DataTypeDecl.java index b0ee07221..950845069 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DataTypeDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/DataTypeDecl.java @@ -13,42 +13,46 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.ast.name.qualified.MemberNameNode; -import org.scribble.del.ScribDel; import org.scribble.type.kind.DataTypeKind; import org.scribble.type.name.DataType; import org.scribble.type.name.ModuleName; public class DataTypeDecl extends NonProtocolDecl { - public DataTypeDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name) + // ScribTreeAdaptor#create constructor + public DataTypeDecl(Token payload, String schema, String extName, + String extSource) { - super(source, schema, extName, extSource, name); + super(payload, schema, extName, extSource); } - @Override - protected ScribNodeBase copy() + // Tree#dupNode constructor + protected DataTypeDecl(DataTypeDecl node, String schema, String extName, + String extSource) { - return new DataTypeDecl(this.source, this.schema, this.extName, this.extSource, getNameNode()); + super(node, schema, extName, extSource); } - + + // Cf. CommonTree#dupNode @Override - public DataTypeDecl clone(AstFactory af) + public DataTypeDecl dupNode() { - DataTypeNode name = (DataTypeNode) this.name.clone(af); - return af.DataTypeDecl(this.source, this.schema, this.extName, this.extSource, name); + return new DataTypeDecl(this, this.schema, this.extName, this.extSource); } - @Override - public DataTypeDecl reconstruct(String schema, String extName, String extSource, MemberNameNode name) + /*@Override + public DataTypeDecl reconstruct(String schema, String extName, String extSource, //MemberNameNode name) + NameNode name) { + DataTypeDecl dtd = dupNode(); ScribDel del = del(); - DataTypeDecl dtd = new DataTypeDecl(this.source, schema, extName, extSource, (DataTypeNode) name); - dtd = (DataTypeDecl) dtd.del(del); + dtd.addChild(getNameNode()); + dtd.setDel(del); return dtd; - } + }*/ @Override public boolean isDataTypeDecl() @@ -57,15 +61,16 @@ public boolean isDataTypeDecl() } @Override - public DataTypeNode getNameNode() + public DataTypeNode getNameNodeChild() { - return (DataTypeNode) super.getNameNode(); + return (DataTypeNode) getChild(); } + // Simple name (ModuleDecl is the only NameDeclNode that uses qualified names) @Override public DataType getDeclName() { - return (DataType) super.getDeclName(); + return getNameNodeChild().toName(); } @Override @@ -80,6 +85,38 @@ public String toString() { return Constants.TYPE_KW + " <" + this.schema + "> " + this.extName + " " + Constants.FROM_KW + " " + this.extSource + " " - + Constants.AS_KW + " " + this.name + ";"; + + Constants.AS_KW + " " + getDeclName() + ";"; + } + + + + + + + + + + + + + + + + public DataTypeDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name) + { + super(source, schema, extName, extSource, name); } + + /*@Override + protected ScribNodeBase copy() + { + return new DataTypeDecl(this.source, this.schema, this.extName, this.extSource, getNameNode()); + } + + @Override + public DataTypeDecl clone(AstFactory af) + { + DataTypeNode name = (DataTypeNode) this.name.clone(af); + return af.DataTypeDecl(this.source, this.schema, this.extName, this.extSource, name); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/Do.java b/scribble-core/src/main/java/org/scribble/ast/Do.java index a9472b39c..a84c74145 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Do.java +++ b/scribble-core/src/main/java/org/scribble/ast/Do.java @@ -68,7 +68,7 @@ public ProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) public ProtocolDecl getTargetProtocolDecl(JobContext jcontext, ModuleContext mcontext) { ProtocolName fullname = getTargetProtocolDeclFullName(mcontext); - return jcontext.getModule(fullname.getPrefix()).getProtocolDecl(fullname.getSimpleName()); + return jcontext.getModule(fullname.getPrefix()).getProtocolDeclChild(fullname.getSimpleName()); } public Role getTargetRoleParameter(JobContext jcontext, ModuleContext mcontext, Role role) diff --git a/scribble-core/src/main/java/org/scribble/ast/ImportDecl.java b/scribble-core/src/main/java/org/scribble/ast/ImportDecl.java index 3360596cc..6d1baa53b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ImportDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/ImportDecl.java @@ -13,19 +13,32 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.del.ScribDel; +import org.scribble.main.ScribbleException; import org.scribble.type.kind.ImportKind; import org.scribble.type.name.Name; +import org.scribble.visit.AstVisitor; // TODO: factor out stuff from ImportModule and ImportMember into here, e.g. alias/name, reconstruct public abstract class ImportDecl extends ScribNodeBase//, ModuleMember //implements NameDeclaration { - protected ImportDecl(CommonTree source) + // ScribTreeAdaptor#create constructor + public ImportDecl(Token payload) { - super(source); + super(payload); + } + + // Tree#dupNode constructor + protected ImportDecl(ImportDecl node) + { + super(node); } - public abstract boolean isAliased(); + public abstract ImportDecl dupNode(); + public abstract Name getAlias(); //public abstract Name getVisibleName(); @@ -33,4 +46,58 @@ public boolean isImportModule() { return false; } + + public ModuleNameNode getModuleNameNodeChild() + { + return (ModuleNameNode) getChild(0); + } + + public ModuleNameNode getAliasNameNodeChild() + { + return (ModuleNameNode) getChild(1); + } + + public boolean isAliased() + { + //return this.alias != null; + return getChildCount() > 1; + } + + // alias == null if no alias + public ImportDecl reconstruct(ModuleNameNode modname, ModuleNameNode alias) + { + ImportDecl im = dupNode(); + ScribDel del = del(); + im.addChild(modname); + if (alias != null) + { + im.addChild(alias); + } + im.setDel(del); // No copy + return im; + } + + @Override + public ImportDecl visitChildren(AstVisitor nv) throws ScribbleException + { + ModuleNameNode modname = (ModuleNameNode) + visitChild(getModuleNameNodeChild(), nv); + ModuleNameNode alias = isAliased() + ? (ModuleNameNode) visitChild(getAliasNameNodeChild(), nv) + : null; + return reconstruct(modname, alias); + } + + + + + + + + + + protected ImportDecl(CommonTree source) + { + super(source); + } } diff --git a/scribble-core/src/main/java/org/scribble/ast/ImportModule.java b/scribble-core/src/main/java/org/scribble/ast/ImportModule.java index d2a46a235..e90ff5b24 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ImportModule.java +++ b/scribble-core/src/main/java/org/scribble/ast/ImportModule.java @@ -13,54 +13,35 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; import org.scribble.type.kind.ModuleKind; import org.scribble.type.name.ModuleName; -import org.scribble.visit.AstVisitor; public class ImportModule extends ImportDecl { - public final ModuleNameNode modname; - public final ModuleNameNode alias; // Factor up to ImportDecl - - public ImportModule(CommonTree source, ModuleNameNode modname, ModuleNameNode alias) + // ScribTreeAdaptor#create constructor + public ImportModule(Token payload) { - super(source); - this.modname = modname; - this.alias = alias; + super(payload); + this.modname = null; + this.alias = null; } - @Override - protected ImportModule copy() - { - return new ImportModule(this.source, this.modname, this.alias); - } - - @Override - public ImportModule clone(AstFactory af) - { - ModuleNameNode name = (ModuleNameNode) this.modname.clone(af); - ModuleNameNode alias = (ModuleNameNode) this.alias.clone(af); - return af.ImportModule(this.source, name, alias); - } - - public ImportModule reconstruct(ModuleNameNode modname, ModuleNameNode alias) // Factor up + // Tree#dupNode constructor + protected ImportModule(ImportModule node) { - ScribDel del = del(); - ImportModule im = new ImportModule(this.source, modname, alias); - im = (ImportModule) im.del(del); - return im; + super(node); + this.modname = null; + this.alias = null; } + // Cf. CommonTree#dupNode @Override - public ImportModule visitChildren(AstVisitor nv) throws ScribbleException + public ImportModule dupNode() { - ModuleNameNode modname = (ModuleNameNode) visitChild(this.modname, nv); - ModuleNameNode alias = (isAliased()) ? (ModuleNameNode) visitChild(this.alias, nv) : null; - return reconstruct(modname, alias); + return new ImportModule(this); } @Override @@ -69,12 +50,6 @@ public boolean isImportModule() return true; } - @Override - public boolean isAliased() - { - return this.alias != null; - } - /*@Override public ModuleName getVisibleName() { @@ -84,17 +59,55 @@ public ModuleName getVisibleName() @Override public ModuleName getAlias() { - return this.alias.toName(); + return getAliasNameNodeChild().toName(); } @Override public String toString() { - String s = Constants.IMPORT_KW + " " + this.modname; + String s = Constants.IMPORT_KW + " " + getModuleNameNodeChild(); if (isAliased()) { - s += " " + Constants.AS_KW + " " + this.alias; + s += " " + Constants.AS_KW + " " + getAlias(); } return s + ";"; } + + + + + + + + + + + + + + + + private final ModuleNameNode modname; + private final ModuleNameNode alias; // Factor up to ImportDecl + + public ImportModule(CommonTree source, ModuleNameNode modname, ModuleNameNode alias) + { + super(source); + this.modname = modname; + this.alias = alias; + } + + /*@Override + protected ImportModule copy() + { + return new ImportModule(this.source, this.modname, this.alias); + } + + @Override + public ImportModule clone(AstFactory af) + { + ModuleNameNode name = (ModuleNameNode) this.modname.clone(af); + ModuleNameNode alias = (ModuleNameNode) this.alias.clone(af); + return af.ImportModule(this.source, name, alias); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java b/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java index e668656ee..595eaa23a 100644 --- a/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java +++ b/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java @@ -13,58 +13,68 @@ */ package org.scribble.ast; -import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; -public abstract class InteractionSeq extends ScribNodeBase implements ProtocolKindNode +public abstract class InteractionSeq + extends ScribNodeBase implements ProtocolKindNode { - private final List> inters; - - /*@SuppressWarnings("unchecked") - private final Function> cast = (n) -> (InteractionNode) n;*/ - + // ScribTreeAdaptor#create constructor public InteractionSeq(Token t) { super(t); this.inters = null; } - protected InteractionSeq(CommonTree source, List> inters) + // Tree#dupNode constructor + public InteractionSeq(InteractionSeq node) { - super(source); - this.inters = inters; + super(node); + this.inters = null; } - public abstract InteractionSeq reconstruct(List> ins); + @Override + public abstract InteractionSeq dupNode(); - /*@SuppressWarnings("unchecked") - private final Function> KIND_CAST = (n) -> (ProtocolKindNode) n;*/ + public abstract List> getInteractNodeChildren(); + + public boolean isEmpty() + { + return getChildCount() == 0; //this.inters.isEmpty(); + } + + public InteractionSeq reconstruct(List> ins) + { + InteractionSeq pd = dupNode(); + ScribDel del = del(); + ins.forEach(x -> pd.addChild(x)); + pd.setDel(del); // No copy + return pd; + } @Override public ScribNode visitChildren(AstVisitor nv) throws ScribbleException { - //List> actions = visitChildListWithStrictClassCheck(this, this.actions, nv); - //List> actions = visitChildListWithCastCheck(this, this.inters, nv, InteractionNode.class, getKind(), this.cast); // Maybe too strict (e.g. rec unfolding maybe shouldn't return the rec) List> actions = new LinkedList<>(); - for (InteractionNode in : this.inters) + for (InteractionNode in : getInteractNodeChildren()) { //ProtocolKindNode visited = visitProtocolKindChildWithCastCheck(this, in, nv, ProtocolKindNode.class, in.getKind(), KIND_CAST); // No: ProjectedChoiceDoPruning (and others?) needs to return null; CastCheck doesn't allow that // CHECKME - // FIXME: make a unit test for this + // TODO: make a unit test for this ScribNode visited = visitChild(in, nv); if (visited instanceof InteractionSeq) { @SuppressWarnings("unchecked") InteractionSeq tmp = (InteractionSeq) visited; - actions.addAll(tmp.inters); + actions.addAll(tmp.getInteractNodeChildren()); } else { @@ -76,19 +86,33 @@ public ScribNode visitChildren(AstVisitor nv) throws ScribbleException return reconstruct(actions); } - public List> getInteractions() + @Override + public String toString() { - return Collections.unmodifiableList(this.inters); + return getInteractNodeChildren().stream().map(i -> i.toString()) + .collect(Collectors.joining("\n")); } - public boolean isEmpty() - { - return this.inters.isEmpty(); - } - @Override - public String toString() + + + + + + + + + + + + + + private final List> inters; + + protected InteractionSeq(CommonTree source, List> inters) { - return this.inters.stream().map((i) -> i.toString()).collect(Collectors.joining("\n")); + super(source); + this.inters = inters; } + } diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageNode.java b/scribble-core/src/main/java/org/scribble/ast/MessageNode.java index 508c53060..58aaf5d32 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/MessageNode.java @@ -20,7 +20,7 @@ public interface MessageNode extends NonRoleArgNode { Message toMessage(); - MessageNode clone(AstFactory af); + //MessageNode clone(AstFactory af); //Arg toArg(); // Not possible due to "diamond" with PayloadElemNameNode at AmbigNameNode diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageSigNameDecl.java b/scribble-core/src/main/java/org/scribble/ast/MessageSigNameDecl.java index 25463d228..5064c29f2 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageSigNameDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/MessageSigNameDecl.java @@ -13,59 +13,63 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.name.qualified.MemberNameNode; import org.scribble.ast.name.qualified.MessageSigNameNode; -import org.scribble.del.ScribDel; import org.scribble.type.kind.SigKind; import org.scribble.type.name.MessageSigName; import org.scribble.type.name.ModuleName; public class MessageSigNameDecl extends NonProtocolDecl { - public MessageSigNameDecl(CommonTree source, String schema, String extName, String extSource, MessageSigNameNode name) + // ScribTreeAdaptor#create constructor + public MessageSigNameDecl(Token payload, String schema, String extName, + String extSource) { - super(source, schema, extName, extSource, name); + super(payload, schema, extName, extSource); } - @Override - protected MessageSigNameDecl copy() + // Tree#dupNode constructor + protected MessageSigNameDecl(MessageSigNameDecl node, String schema, + String extName, String extSource) { - return new MessageSigNameDecl(this.source, this.schema, this.extName, this.extSource, getNameNode()); + super(node, schema, extName, extSource); } - + + // Cf. CommonTree#dupNode @Override - public MessageSigNameDecl clone(AstFactory af) + public MessageSigNameDecl dupNode() { - MessageSigNameNode name = (MessageSigNameNode) this.name.clone(af); - return af.MessageSigNameDecl(this.source, this.schema, this.extName, this.extSource, name); + return new MessageSigNameDecl(this, this.schema, this.extName, + this.extSource); } - @Override - public MessageSigNameDecl reconstruct(String schema, String extName, String extSource, MemberNameNode name) + /*@Override + public MessageSigNameDecl reconstruct(String schema, String extName, String extSource, //MemberNameNode name) + NameNode name) { ScribDel del = del(); MessageSigNameDecl msnd = new MessageSigNameDecl(this.source, schema, extName, extSource, (MessageSigNameNode) name); msnd = (MessageSigNameDecl) msnd.del(del); return msnd; - } + }*/ @Override public boolean isMessageSigNameDecl() { return true; } - + @Override - public MessageSigNameNode getNameNode() + public MessageSigNameNode getNameNodeChild() { - return (MessageSigNameNode) super.getNameNode(); + return (MessageSigNameNode) getChild(); } @Override public MessageSigName getDeclName() { - return (MessageSigName) super.getDeclName(); + return getNameNodeChild().toName(); } @Override @@ -80,6 +84,38 @@ public String toString() { return Constants.SIG_KW + " <" + this.schema + "> \"" + this.extName + "\" " + Constants.FROM_KW + " \"" + this.extSource + "\" " - + Constants.AS_KW + " " + this.name + ";"; + + Constants.AS_KW + " " + getDeclName() + ";"; + } + + + + + + + + + + + + + + + + public MessageSigNameDecl(CommonTree source, String schema, String extName, String extSource, MessageSigNameNode name) + { + super(source, schema, extName, extSource, name); } + + /*@Override + protected MessageSigNameDecl copy() + { + return new MessageSigNameDecl(this.source, this.schema, this.extName, this.extSource, getNameNode()); + } + + @Override + public MessageSigNameDecl clone(AstFactory af) + { + MessageSigNameNode name = (MessageSigNameNode) this.name.clone(af); + return af.MessageSigNameDecl(this.source, this.schema, this.extName, this.extSource, name); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java index 97c0e94c8..a5958f9ef 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java @@ -13,7 +13,6 @@ */ package org.scribble.ast; -import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; @@ -21,6 +20,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.Role; @@ -28,10 +28,7 @@ public abstract class MessageTransfer extends SimpleInteractionNode { - public final RoleNode src; - public final MessageNode msg; // FIXME: ambig may get resolved to an unexpected kind, e.g. DataTypeNode (cf. DoArg, PayloadElem wrappers) - protected final List dests; - + // ScribTreeAdaptor#create constructor public MessageTransfer(Token t) { super(t); @@ -40,35 +37,86 @@ public MessageTransfer(Token t) this.dests = null; } - protected MessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List dests) + // Tree#dupNode constructor + public MessageTransfer(MessageTransfer node) { - super(source); - this.src = src; - this.msg = msg; - this.dests = new LinkedList<>(dests); // FIXME: Collections.unmodifiable? + super(node); + this.src = null; + this.msg = null; + this.dests = null; } - - public abstract MessageTransfer reconstruct(RoleNode src, MessageNode msg, List dests); - - @Override - public MessageTransfer visitChildren(AstVisitor nv) throws ScribbleException + + public abstract MessageTransfer dupNode(); + + public MessageNode getMessageNodeChild() { - RoleNode src = (RoleNode) visitChild(this.src, nv); - MessageNode msg = (MessageNode) visitChild(this.msg, nv); - List dests = visitChildListWithClassEqualityCheck(this, this.dests, nv); - return reconstruct(src, msg, dests); + return (MessageNode) getChild(0); } - public List getDestinations() + public RoleNode getSourceChild() + { + return (RoleNode) getChild(1); + } + + public List getDestinationChildren() { - return Collections.unmodifiableList(this.dests); + //return Collections.unmodifiableList(this.dests); + List cs = getChildren(); + return cs.subList(2, cs.size()).stream().map(x -> (RoleNode) x) + .collect(Collectors.toList()); } - public List getDestinationRoles() + public final List getDestinationRoles() + { + return getDestinationChildren().stream().map(rn -> rn.toName()) + .collect(Collectors.toList()); + } + + public MessageTransfer reconstruct(RoleNode src, MessageNode msg, List dests) + { + MessageTransfer pd = dupNode(); + ScribDel del = del(); + pd.setDel(del); // No copy + return pd; + } + + @Override + public MessageTransfer visitChildren(AstVisitor nv) throws ScribbleException { - return this.dests.stream().map((rn) -> rn.toName()).collect(Collectors.toList()); + MessageNode msg = (MessageNode) visitChild(getMessageNodeChild(), nv); + RoleNode src = (RoleNode) visitChild(getSourceChild(), nv); + List dests = visitChildListWithClassEqualityCheck(this, + getDestinationChildren(), nv); + return reconstruct(src, msg, dests); } @Override public abstract String toString(); + + + + + + + + + + + + + + + private final RoleNode src; + private final MessageNode msg; // CHECKME: ambig may get resolved to an unexpected kind, e.g. DataTypeNode (cf. DoArg, PayloadElem wrappers) + private final List dests; + + protected MessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List dests) + { + super(source); + this.src = src; + this.msg = msg; + this.dests = new LinkedList<>(dests); // CHECKME: Collections.unmodifiable? + } + } + diff --git a/scribble-core/src/main/java/org/scribble/ast/Module.java b/scribble-core/src/main/java/org/scribble/ast/Module.java index c5eaa2d66..5b39f2aa6 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Module.java +++ b/scribble-core/src/main/java/org/scribble/ast/Module.java @@ -13,7 +13,6 @@ */ package org.scribble.ast; -import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.function.Function; @@ -33,18 +32,11 @@ import org.scribble.type.name.MessageSigName; import org.scribble.type.name.ModuleName; import org.scribble.type.name.ProtocolName; -import org.scribble.util.ScribUtil; import org.scribble.visit.AstVisitor; public class Module extends ScribNodeBase { - public final ModuleDecl moddecl; - - // Using (implicitly bounded) nested wildcards for mixed element lists (better practice to use separate lists?) - private final List> imports; - private final List> data; - private final List> protos; - + // ScribTreeAdaptor#create constructor public Module(Token payload) { super(payload); @@ -54,179 +46,249 @@ public Module(Token payload) this.protos = null; } - public Module(CommonTree source, ModuleDecl moddecl, List> imports, - List> data, List> protos) + // Tree#dupNode constructor + protected Module(Module node) { - super(source); - this.moddecl = moddecl; - this.imports = new LinkedList<>(imports); - this.data = new LinkedList<>(data); - this.protos = new LinkedList<>(protos); + super(node); + this.moddecl = null; + this.imports = null; + this.data = null; + this.protos = null; } - @Override - protected Module copy() + public ModuleName getFullModuleName() { - return new Module(this.source, this.moddecl, this.imports, this.data, this.protos); + //return this.moddecl.getFullModuleName(); + return getModuleDeclChild().getFullModuleName(); } - + + // Cf. CommonTree#dupNode @Override - public Module clone(AstFactory af) + public Module dupNode() { - ModuleDecl moddecl = (ModuleDecl) this.moddecl.clone(af); - List> imports = ScribUtil.cloneList(af, this.imports); - List> data = ScribUtil.cloneList(af, this.data); - List> protos = ScribUtil.cloneList(af, this.protos); - return af.Module(this.source, moddecl, imports, data, protos); + return new Module(this); } - public Module reconstruct(ModuleDecl moddecl, List> imports, List> data, List> protos) + // Set args as children on a dup of this -- children *not* cloned + protected Module reconstruct(ModuleDecl moddecl, List> imports, + List> data, List> protos) { + //Module m = new Module(this.source, moddecl, imports, data, protos); + Module m = dupNode(); ScribDel del = del(); - Module m = new Module(this.source, moddecl, imports, data, protos); - m = (Module) m.del(del); + List children = new LinkedList<>(); + children.add(moddecl); + children.addAll(imports); + children.addAll(data); + children.addAll(protos); + m.setChildren(children); + m.setDel(del); // No copy return m; } @Override public Module visitChildren(AstVisitor nv) throws ScribbleException { - ModuleDecl moddecl = (ModuleDecl) visitChild(this.moddecl, nv); - // class equality check probably too restrictive - List> imports = ScribNodeBase.visitChildListWithClassEqualityCheck(this, this.imports, nv); - List> data = ScribNodeBase.visitChildListWithClassEqualityCheck(this, this.data, nv); - List> protos = ScribNodeBase.visitChildListWithClassEqualityCheck(this, this.protos, nv); + ModuleDecl moddecl = (ModuleDecl) visitChild(getModuleDeclChild(), nv); + // class equality check probably too restrictive -- FIXME: remove class checks + List> imports = ScribNodeBase + .visitChildListWithClassEqualityCheck(this, getImportDeclChildren(), nv); + List> data = ScribNodeBase + .visitChildListWithClassEqualityCheck(this, getNonProtoDeclChildren(), nv); + List> protos = ScribNodeBase + .visitChildListWithClassEqualityCheck(this, getProtoDeclChildren(), nv); return reconstruct(moddecl, imports, data, protos); } - - public ModuleName getFullModuleName() + + public ModuleDecl getModuleDeclChild() + { + List tmp = getChildren().stream() + .filter(x -> x instanceof ModuleDecl).map(x -> (ModuleDecl) x) + .collect(Collectors.toList()); + if (tmp.size() != 1) + { + throw new RuntimeException("Shouldn't get in here: " + tmp); + } + return tmp.get(0); + } + + public List> getImportDeclChildren() { - return this.moddecl.getFullModuleName(); + return getChildren().stream().filter(x -> x instanceof ImportDecl) + .map(x -> (ImportDecl) x).collect(Collectors.toList()); } - @Override - public String toString() + public List> getNonProtoDeclChildren() { - String s = moddecl.toString(); - for (ImportDecl id : this.imports) - { - s += "\n" + id; - } - for (NonProtocolDecl dtd : this.data) - { - s += "\n" + dtd; - } - for (ProtocolDecl pd : this.protos) - { - s += "\n" + pd; - } - return s; + return getChildren().stream().filter(x -> x instanceof NonProtocolDecl) + .map(x -> (NonProtocolDecl) x).collect(Collectors.toList()); } - // ptn simple alias name - public DataTypeDecl getDataTypeDecl(DataType simpname) // Simple name (as for getProtocolDecl) + // Arg is alias simple name + public DataTypeDecl getDataTypeDeclChild(DataType simpname) // Simple name (as for getProtocolDecl) { - for (NonProtocolDecl dtd : this.data) + List> filt = getNonProtoDeclChildren().stream() + .filter(x -> ((NonProtocolDecl) x).isDataTypeDecl() + && x.getDeclName().equals(simpname)) + .collect(Collectors.toList()); + if (filt.size() != 1) { - if (dtd.isDataTypeDecl() && dtd.getDeclName().equals(simpname)) - { - return (DataTypeDecl) dtd; - } + throw new RuntimeException( + "Data type decl not found (or duplicate name): " + simpname); } - throw new RuntimeException("Data type not found: " + simpname); + return (DataTypeDecl) filt.get(0); } - // msn simple alias name - public MessageSigNameDecl getMessageSigDecl(MessageSigName simpname) + // Arg is alias simple name + public MessageSigNameDecl getMessageSigDeclChild(MessageSigName simpname) { - for (NonProtocolDecl dtd : this.data) + List> filt = getNonProtoDeclChildren().stream() + .filter(x -> ((NonProtocolDecl) x).isMessageSigNameDecl() + && x.getDeclName().equals(simpname)) + .collect(Collectors.toList()); + if (filt.size() != 1) { - if (dtd instanceof MessageSigNameDecl && dtd.getDeclName().equals(simpname)) - { - return (MessageSigNameDecl) dtd; - } + throw new RuntimeException( + "Message sig name not found (or duplicate name): " + simpname); } - throw new RuntimeException("Message signature not found: " + simpname); + return (MessageSigNameDecl) filt.get(0); } - public List> getImportDecls() + public List> getProtoDeclChildren() { - return Collections.unmodifiableList(this.imports); + //return Collections.unmodifiableList(this.protos); + return getChildren().stream().filter(x -> x instanceof ProtocolDecl) + .map(x -> (ProtocolDecl) x).collect(Collectors.toList()); } - - public List> getNonProtocolDecls() + + public boolean hasProtocolDecl( + ProtocolName simpname) { - return Collections.unmodifiableList(this.data); + List> pds = + simpname.getKind().equals(Global.KIND) + ? getGProtoDeclChildren() + : getLProtoDeclChildren(); + return pds.stream().anyMatch(x -> x.getHeaderChild().getDeclName().equals(simpname)); } - public List> getProtocolDecls() + // pn is simple name + // Pre: hasProtocolDecl(simpname) + // CHECKME: separate global/local? + public ProtocolDecl getProtocolDeclChild( + ProtocolName simpname) { - return Collections.unmodifiableList(this.protos); + List> pds = + simpname.getKind().equals(Global.KIND) + ? getGProtoDeclChildren() + : getLProtoDeclChildren(); + List> filt = pds.stream() + .filter(x -> x.getHeaderChild().getDeclName().equals(simpname)) + .collect(Collectors.toList()); + if (filt.size() != 1) + { + throw new RuntimeException("Protocol not found (or duplicate name): " + simpname); + } + @SuppressWarnings("unchecked") + ProtocolDecl res = (ProtocolDecl) filt.get(0); + return res; } - public List getGlobalProtocolDecls() + public List getGProtoDeclChildren() { - return getProtocolDecls(IS_GLOBALPROTOCOLDECL, TO_GLOBALPROTOCOLDECL); + return getChildren().stream().filter(IS_GPROTOCOLDECL).map(TO_GPROTOCOLDECL) + .collect(Collectors.toList()); } - public List getLocalProtocolDecls() + public List getLProtoDeclChildren() { - return getProtocolDecls(IS_LOCALPROTOCOLDECL, TO_LOCALPROTOCOLDECL); + return getChildren().stream().filter(IS_LPROTOCOLDECL).map(TO_LPROTOCOLDECL) + .collect(Collectors.toList()); } - private > - List getProtocolDecls(Predicate> filter, Function, T> cast) - { - return this.protos.stream().filter(filter).map(cast).collect(Collectors.toList()); - } - - public boolean hasProtocolDecl(ProtocolName simpname) - { - return hasProtocolDecl(this.protos, simpname); - } - - // pn is simple name - // separate into global/local? - public ProtocolDecl getProtocolDecl(ProtocolName simpname) - { - return getProtocolDecl(this.protos, simpname); - } + private static final Predicate IS_GPROTOCOLDECL = + pd -> (pd instanceof ProtocolDecl) && ((ProtocolDecl) pd).isGlobal(); - private static - boolean hasProtocolDecl(List> pds, ProtocolName simpname) - { - return pds.stream() - .filter((pd) -> pd.header.getDeclName().equals(simpname) - && (simpname.getKind().equals(Global.KIND)) ? pd.isGlobal() : pd.isLocal()) - .count() > 0; - } + private static final Predicate IS_LPROTOCOLDECL = + pd -> (pd instanceof ProtocolDecl) && ((ProtocolDecl) pd).isLocal(); - // pn is simple name - private static - ProtocolDecl getProtocolDecl(List> pds, ProtocolName simpname) + private static final Function TO_GPROTOCOLDECL = + pd -> (GProtocolDecl) pd; + + private static final Function TO_LPROTOCOLDECL = + pd -> (LProtocolDecl) pd; + + @Override + public String toString() { - List> filtered = pds.stream() - .filter((pd) -> pd.header.getDeclName().equals(simpname) - && (simpname.getKind().equals(Global.KIND)) ? pd.isGlobal() : pd.isLocal()) - .collect(Collectors.toList()); - if (filtered.size() == 0) + String s = getModuleDeclChild().toString(); + for (ImportDecl id : getImportDeclChildren()) { - throw new RuntimeException("Protocol not found: " + simpname); + s += "\n" + id; } - /*if (filtered.size() > 1) + for (NonProtocolDecl dtd : getNonProtoDeclChildren()) { - throw new RuntimeException("Found duplicate protocol decls: " + simpname); // Just return first -- allows Do/DoArgListDel name disambiguation to go through, and later caught on leaving Module - }*/ - @SuppressWarnings("unchecked") - ProtocolDecl res = (ProtocolDecl) filtered.get(0); - return res; + s += "\n" + dtd; + } + for (ProtocolDecl pd : getProtoDeclChildren()) + { + s += "\n" + pd; + } + return s; } + + + + + + + + + + + + + // Deprecate + + private final ModuleDecl moddecl; - private static final Predicate> IS_GLOBALPROTOCOLDECL = (pd) -> pd.isGlobal(); - - private static final Predicate> IS_LOCALPROTOCOLDECL = (pd) -> pd.isLocal(); + // Using (implicitly bounded) nested wildcards for mixed element lists (better practice to use separate lists?) + private final List> imports; + private final List> data; + private final List> protos; - private static final Function , GProtocolDecl> TO_GLOBALPROTOCOLDECL = (pd) -> (GProtocolDecl) pd; + public Module(CommonTree source, ModuleDecl moddecl, + List> imports, List> data, + List> protos) + { + super(source); + this.moddecl = moddecl; + this.imports = new LinkedList<>(imports); + this.data = new LinkedList<>(data); + this.protos = new LinkedList<>(protos); + } - private static final Function , LProtocolDecl> TO_LOCALPROTOCOLDECL = (pd) -> (LProtocolDecl) pd; + /*@Override + protected Module copy() + { + //return new Module(this.source, this.moddecl, this.imports, this.data, this.protos); + /*ModuleDecl md = getModuleDecl(); + List> ids = getImportDecls(); + List> npds = getNonProtocolDecls(); + List> pds = getProtocolDecls();* / + //return new Module(this.source, md, ids, npds, pds); + Module copy = dupNode(); + copy.setChildren(getChildren()); + return copy; + } + + @Override + public Module clone(AstFactory af) + { + ModuleDecl moddecl = (ModuleDecl) this.moddecl.clone(af); + List> imports = ScribUtil.cloneList(af, this.imports); + List> data = ScribUtil.cloneList(af, this.data); + List> protos = ScribUtil.cloneList(af, this.protos); + return af.Module(this.source, moddecl, imports, data, protos); + throw new RuntimeException("Deprecated"); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java b/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java index 8a6380efc..11ed8babe 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java @@ -13,9 +13,13 @@ */ package org.scribble.ast; +import java.util.LinkedList; +import java.util.List; + import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ModuleKind; import org.scribble.type.name.ModuleName; @@ -23,51 +27,93 @@ public class ModuleDecl extends NameDeclNode { + // ScribTreeAdaptor#create constructor public ModuleDecl(Token t) { super(t); } - public ModuleDecl(CommonTree source, ModuleNameNode fullmodname) + // Tree#dupNode constructor + protected ModuleDecl(ModuleDecl node) { - super(source, fullmodname); + super(node); } - @Override - protected ModuleDecl copy() + public ModuleName getFullModuleName() { - return new ModuleDecl(this.source, (ModuleNameNode) this.name); + return (ModuleName) getNameNodeChild().toName(); } - + + // Cf. CommonTree#dupNode @Override - public ModuleDecl clone(AstFactory af) + public ModuleDecl dupNode() { - ModuleNameNode modname = (ModuleNameNode) this.name.clone(af); - return af.ModuleDecl(this.source, modname); + return new ModuleDecl(this); + } + + protected ModuleDecl reconstruct(ModuleNameNode name) + { + ModuleDecl md = dupNode(); + ScribDel del = del(); + List children = new LinkedList<>(); + children.add(name); + md.setChildren(children); + md.setDel(del); // No copy + return md; } @Override public ModuleDecl visitChildren(AstVisitor nv) throws ScribbleException { - ModuleNameNode fullmodname = (ModuleNameNode) visitChild(this.name, nv); - return nv.job.af.ModuleDecl(this.source, fullmodname); // cf., reconstruct + ModuleNameNode name = (ModuleNameNode) visitChild(getNameNodeChild(), nv); + //return nv.job.af.ModuleDecl(this.source, fullmodname); // cf., reconstruct + return reconstruct(name); } - + @Override - public String toString() + public ModuleNameNode getNameNodeChild() { - return Constants.MODULE_KW + " " + this.name + ";"; + return (ModuleNameNode) getChild(); } @Override public ModuleName getDeclName() { //return (ModuleName) super.getDeclName(); // Would return full name - return ((ModuleName) super.getDeclName()).getSimpleName(); // Uniform with other NameDeclNodes wrt. returning simple name + //return ((ModuleName) super.getDeclName()).getSimpleName(); // Uniform with other NameDeclNodes wrt. returning simple name + return getNameNodeChild().toName().getSimpleName(); // Uniform with other NameDeclNodes wrt. returning simple name } - public ModuleName getFullModuleName() + @Override + public String toString() { - return (ModuleName) this.name.toName(); + return Constants.MODULE_KW + " " + getFullModuleName() + ";"; } + + + + + + + + + // Deprecate + + public ModuleDecl(CommonTree source, ModuleNameNode fullmodname) + { + super(source, fullmodname); + } + + /*@Override + protected ModuleDecl copy() + { + return new ModuleDecl(this.source, (ModuleNameNode) this.name); + }*/ + + /*@Override + public ModuleDecl clone(AstFactory af) + { + ModuleNameNode modname = (ModuleNameNode) this.name.clone(af); + return af.ModuleDecl(this.source, modname); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java b/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java index 8914106e3..2842f5661 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java @@ -21,22 +21,76 @@ public abstract class NameDeclNode extends ScribNodeBase { - public final NameNode name; - + // ScribTreeAdaptor#create constructor public NameDeclNode(Token t) { super(t); this.name = null; } + + // Tree#dupNode constructor + public NameDeclNode(NameDeclNode node) + { + super(node); + this.name = null; + } + + protected final NameNode getChild() + { + if (getChildCount() != 1) + { + throw new RuntimeException("Shouldn't get in here: " + this); + } + NameNode name = (NameNode) getChild(0); + return name; + } + + // Concrete subclasses should use getNameNodeChild() and cast + // (Avoids needing to explicitly record the kind, cf. NonRoleParamDecl) + // (Gets overridden anyway for return type) + public abstract NameNode getNameNodeChild(); + /*{ + if (getChildCount() != 1) + { + throw new RuntimeException("Shouldn't get in here: " + this); + } + NameNode name = (NameNode) getChild(0); + if (name.getK) + return name; + }*/ + + /*// Return: simple name (cf. ModuleDecl) + protected Name getName() + { + }*/ + + // Return: *simple* name (cf. ModuleDecl) + // Concrete subclasses should use getNameNode, toName (simple name) and cast + // (Gets overridden anyway for return type) + public abstract Name getDeclName(); + /*{ + //return this.name.toName(); + if (getChildCount() != 1) + { + throw new RuntimeException("Shouldn't get in here: " + this); + } + Name name = (Name) getChild(0); + return name; + }*/ + + + + + + + + + + private final NameNode name; protected NameDeclNode(CommonTree source, NameNode name) { super(source); this.name = name; } - - public Name getDeclName() - { - return this.name.toName(); - } } diff --git a/scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java index 5226e3486..f56da058b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java @@ -13,38 +13,43 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.name.qualified.MemberNameNode; +import org.scribble.ast.name.NameNode; +import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.kind.NonProtocolKind; -import org.scribble.type.name.MemberName; import org.scribble.visit.AstVisitor; // Rename to something better -public abstract class NonProtocolDecl extends NameDeclNode implements ModuleMember +public abstract class NonProtocolDecl + extends NameDeclNode implements ModuleMember { public final String schema; public final String extName; public final String extSource; - public NonProtocolDecl(CommonTree source, String schema, String extName, String extSource, MemberNameNode name) + // ScribTreeAdaptor#create constructor + public NonProtocolDecl(Token payload, String schema, String extName, + String extSource) { - super(source, name); + super(payload); this.schema = schema; this.extName = extName; this.extSource = extSource; } - - public abstract NonProtocolDecl reconstruct(String schema, String extName, String source, MemberNameNode name); - @Override - public NonProtocolDecl visitChildren(AstVisitor nv) throws ScribbleException + // Tree#dupNode constructor + protected NonProtocolDecl(NonProtocolDecl node, String schema, + String extName, String extSource) { - MemberNameNode name = (MemberNameNode) visitChildWithClassEqualityCheck(this, this.name, nv); - return reconstruct(this.schema, this.extName, this.extSource, name); + super(node); + this.schema = schema; + this.extName = extName; + this.extSource = extSource; } - // Maybe should be moved to ModuleMember + // CHECKME: maybe move to ModuleMember public boolean isDataTypeDecl() { return false; @@ -55,14 +60,48 @@ public boolean isMessageSigNameDecl() return false; } - public MemberNameNode getNameNode() + public abstract NonProtocolDecl dupNode(); + + public NonProtocolDecl reconstruct(String schema, String extName, + String source, // MemberNameNode name); + NameNode name) { - return (MemberNameNode) this.name; + NonProtocolDecl dtd = dupNode(); + ScribDel del = del(); + dtd.addChild(getNameNodeChild()); + dtd.setDel(del); + return dtd; } @Override - public MemberName getDeclName() + public NonProtocolDecl visitChildren(AstVisitor nv) + throws ScribbleException + { + //MemberNameNode name = (MemberNameNode) visitChildWithClassEqualityCheck(this, this.name, nv); + NameNode name = (NameNode) visitChildWithClassEqualityCheck(this, + getNameNodeChild(), nv); + return reconstruct(this.schema, this.extName, this.extSource, name); + } + + + + + + + + + + + + + public NonProtocolDecl(CommonTree source, String schema, String extName, + String extSource, // MemberNameNode name); + NameNode name) // Directly parsed decl names are simple names, but decl constructors take general name nodes which are member names, so base NameNode here -- cf. ProtocolHeader and G/LProtocolHeader { - return (MemberName) super.getDeclName(); // Simple name -- not consistent with ModuleDecl + super(source, name); + this.schema = schema; + this.extName = extName; + this.extSource = extSource; } + } diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java index ea83c2b43..eb75fa71c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java @@ -14,23 +14,56 @@ package org.scribble.ast; import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.name.NameNode; +import org.scribble.ast.name.qualified.DataTypeNode; +import org.scribble.ast.name.qualified.LProtocolNameNode; +import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.simple.NonRoleParamNode; import org.scribble.ast.name.simple.SimpleNameNode; import org.scribble.del.ScribDel; import org.scribble.type.kind.DataTypeKind; +import org.scribble.type.kind.Local; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.SigKind; +import org.scribble.type.name.DataType; +import org.scribble.type.name.LProtocolName; +import org.scribble.type.name.MessageSigName; +import org.scribble.type.name.Name; import org.scribble.type.name.Role; public class NonRoleParamDecl extends HeaderParamDecl { - public final K kind; + public final K kind; // CHECKME: factor up to super? public NonRoleParamDecl(CommonTree source, K kind, NonRoleParamNode name) { super(source, name); this.kind = kind; } + + @Override + public NameNode getNameNodeChild() + { + NameNode name = getNameNodeChild(); + if (this.kind.equals(SigKind.KIND) && name instanceof MessageSigNameNode + || this.kind.equals(DataTypeKind.KIND) && name instanceof DataTypeNode + || this.kind.equals(Local.KIND) && name instanceof LProtocolNameNode) + { + @SuppressWarnings("unchecked") + NameNode cast = (NameNode) name; + return cast; + } + else + { + throw new RuntimeException("Shouldn't get here: " + this); + } + } + + @Override + public Name getDeclName() + { + return getNameNodeChild().toName(); + } @Override public NonRoleParamDecl clone(AstFactory af) diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java index df6a2408e..34f86b253 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java @@ -15,48 +15,78 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; -public abstract class ProtocolBlock extends CompoundInteraction implements ProtocolKindNode +public abstract class ProtocolBlock + extends CompoundInteraction implements ProtocolKindNode { - public final InteractionSeq seq; - + // ScribTreeAdaptor#create constructor public ProtocolBlock(Token t) { super(t); this.seq = null; } - public ProtocolBlock(CommonTree source, InteractionSeq seq) + // Tree#dupNode constructor + protected ProtocolBlock(ProtocolBlock node) { - super(source); - this.seq = seq; + super(node); + this.seq = null; } @Override - public abstract ProtocolBlock clone(AstFactory af); + public abstract ProtocolBlock dupNode(); - public abstract ProtocolBlock reconstruct(InteractionSeq seq); + public abstract InteractionSeq getInteractSeqChild(); + + public boolean isEmpty() + { + return getInteractSeqChild().isEmpty(); + } - public abstract InteractionSeq getInteractionSeq(); + public ProtocolBlock reconstruct(InteractionSeq seq) + { + ProtocolBlock pd = dupNode(); + ScribDel del = del(); + pd.addChild(seq); + pd.setDel(del); // No copy + return pd; + } @Override public ProtocolBlock visitChildren(AstVisitor nv) throws ScribbleException { - InteractionSeq seq = visitChildWithClassEqualityCheck(this, this.seq, nv); + InteractionSeq seq = + visitChildWithClassEqualityCheck(this, getInteractSeqChild(), nv); return reconstruct(seq); } - - public boolean isEmpty() - { - return this.seq.isEmpty(); - } @Override public String toString() { - return "{\n" + this.seq + "\n}"; // Empty block will contain an blank line + return "{\n" + getInteractSeqChild() + "\n}"; // Empty block will contain an blank line + } + + + + + + + + + + + private final InteractionSeq seq; + + public ProtocolBlock(CommonTree source, InteractionSeq seq) + { + super(source); + this.seq = seq; } + + /*@Override + public abstract ProtocolBlock clone(AstFactory af);*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java index 14653ed16..74719b883 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java @@ -18,22 +18,20 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; // FIXME: visitChildren for modifiers -public abstract class ProtocolDecl extends ScribNodeBase implements ModuleMember, ProtocolKindNode +public abstract class ProtocolDecl extends ScribNodeBase + implements ModuleMember, ProtocolKindNode { - public static enum Modifiers { EXPLICIT, AUX } // FIXME: factor out? Header? + public static enum Modifiers { EXPLICIT, AUX } // CHECKME: factor out? Move to Header? - // FIXME: lookup routines, e.g. isExplicit public final List modifiers; - // Maybe just use standard pattern, make private with casting getters -- works better (e.g. to use overridden getName) - public final ProtocolHeader header; - public final ProtocolDef def; - + // ScribTreeAdaptor#create constructor protected ProtocolDecl(Token t) { super(t); @@ -41,43 +39,80 @@ protected ProtocolDecl(Token t) this.header = null; this.def = null; } + + // Tree#dupNode constructor + protected ProtocolDecl(ProtocolDecl node) + { + super(node); + this.modifiers = null; + this.header = null; + this.def = null; + } + + public abstract ProtocolDecl dupNode(); - protected ProtocolDecl(CommonTree source, List modifiers, ProtocolHeader header, ProtocolDef def) + public boolean isExplicit() { - super(source); - this.modifiers = Collections.unmodifiableList(modifiers); - this.header = header; - this.def = def; + return this.modifiers.contains(Modifiers.EXPLICIT); } - public abstract ProtocolDecl reconstruct(ProtocolHeader header, ProtocolDef def);//, ProtocolDeclContext pdcontext, Env env); + public boolean isAux() + { + return this.modifiers.contains(Modifiers.AUX); + } + + // Implement in subclasses to avoid generic cast + public abstract ProtocolHeader getHeaderChild(); + public abstract ProtocolDef getDefChild(); + + //public abstract ProtocolName getFullProtocolName(Module mod); + + public ProtocolDecl reconstruct(ProtocolHeader header, + ProtocolDef def) //, ProtocolDeclContext pdcontext, Env env); + { + ProtocolDecl pd = dupNode(); + ScribDel del = del(); + pd.addChild(header); + pd.addChild(def); + pd.setDel(del); // No copy + return pd; + } @Override public ProtocolDecl visitChildren(AstVisitor nv) throws ScribbleException { - ProtocolHeader header = visitChildWithClassEqualityCheck(this, this.header, nv); - ProtocolDef def = visitChildWithClassEqualityCheck(this, this.def, nv); + ProtocolHeader header = + visitChildWithClassEqualityCheck(this, getHeaderChild(), nv); + ProtocolDef def = visitChildWithClassEqualityCheck(this, getDefChild(), nv); return reconstruct(header, def); } - public abstract ProtocolHeader getHeader(); - public abstract ProtocolDef getDef(); - - //public abstract ProtocolName getFullProtocolName(Module mod); - @Override public String toString() { - return this.header + " " + this.def; + return getHeaderChild() + " " + getDefChild(); } - public boolean isExplicitModifier() - { - return this.modifiers.contains(Modifiers.EXPLICIT); - } + + + + + + + + + + + // Maybe just use standard pattern, make private with casting getters -- works better (e.g. to use overridden getName) + private final ProtocolHeader header; + private final ProtocolDef def; - public boolean isAuxModifier() + protected ProtocolDecl(CommonTree source, List modifiers, + ProtocolHeader header, ProtocolDef def) { - return this.modifiers.contains(Modifiers.AUX); + super(source); + this.modifiers = Collections.unmodifiableList(modifiers); + this.header = header; + this.def = def; } } diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolDef.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolDef.java index 8d53c425f..57a90f0e7 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolDef.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolDef.java @@ -15,40 +15,69 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; -public abstract class ProtocolDef extends ScribNodeBase implements ProtocolKindNode +public abstract class ProtocolDef extends ScribNodeBase + implements ProtocolKindNode { - public final ProtocolBlock block; - + // ScribTreeAdaptor#create constructor public ProtocolDef(Token t) { super(t); this.block = null; } - protected ProtocolDef(CommonTree source, ProtocolBlock block) + // Tree#dupNode constructor + protected ProtocolDef(ProtocolDef node) { - super(source); - this.block = block; + super(node); + this.block = null; } - public abstract ProtocolDef reconstruct(ProtocolBlock block); + public abstract ProtocolDef dupNode(); - public abstract ProtocolBlock getBlock(); + public abstract ProtocolBlock getBlockChild(); + + public ProtocolDef reconstruct(ProtocolBlock block) + { + ProtocolDef pd = dupNode(); + ScribDel del = del(); + pd.addChild(block); + pd.setDel(del); // No copy + return pd; + } @Override public ProtocolDef visitChildren(AstVisitor nv) throws ScribbleException { - ProtocolBlock block = visitChildWithClassEqualityCheck(this, this.block, nv); + ProtocolBlock block = + visitChildWithClassEqualityCheck(this, getBlockChild(), nv); return reconstruct(block); } @Override public String toString() { - return this.block.toString(); + return getBlockChild().toString(); + } + + + + + + + + + + + private final ProtocolBlock block; + + protected ProtocolDef(CommonTree source, ProtocolBlock block) + { + super(source); + this.block = block; } } diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java index e97a226cb..b86c1973d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java @@ -17,62 +17,104 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; import org.scribble.ast.name.qualified.ProtocolNameNode; +import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; import org.scribble.visit.AstVisitor; // TODO: parameterize on global/local name node and role decl list (i.e. self roles) -public abstract class ProtocolHeader extends NameDeclNode implements ProtocolKindNode +public abstract class ProtocolHeader + extends NameDeclNode implements ProtocolKindNode { - public final RoleDeclList roledecls; - public final NonRoleParamDeclList paramdecls; - + // ScribTreeAdaptor#create constructor public ProtocolHeader(Token t) { super(t); this.roledecls = null; this.paramdecls = null; } - - protected ProtocolHeader(CommonTree source, NameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) + + // Tree#dupNode constructor + protected ProtocolHeader(ProtocolHeader node) { - super(source, name); - this.roledecls = roledecls; - this.paramdecls = paramdecls; + super(node); + this.roledecls = null; + this.paramdecls = null; } - public abstract ProtocolHeader reconstruct(ProtocolNameNode name, RoleDeclList rdl, NonRoleParamDeclList pdl); + public abstract ProtocolHeader dupNode(); + + // Simple name + @Override + public abstract ProtocolNameNode getNameNodeChild(); + + public RoleDeclList getRoleDeclListChild() + { + return (RoleDeclList) getChild(1); + } + + public NonRoleParamDeclList getParamDeclListChild() + { + return (NonRoleParamDeclList) getChild(2); + } + + public ProtocolHeader reconstruct(ProtocolNameNode name, RoleDeclList rdl, NonRoleParamDeclList pdl) + { + ProtocolHeader pd = dupNode(); + ScribDel del = del(); + pd.addChild(name); + pd.addChild(rdl); + pd.addChild(pdl); + pd.setDel(del); // No copy + return pd; + } @Override public ProtocolHeader visitChildren(AstVisitor nv) throws ScribbleException { - RoleDeclList rdl = (RoleDeclList) visitChild(this.roledecls, nv); - NonRoleParamDeclList pdl = (NonRoleParamDeclList) visitChild(this.paramdecls, nv); - return reconstruct((ProtocolNameNode) this.name, rdl, pdl); + RoleDeclList rdl = (RoleDeclList) visitChild(getRoleDeclListChild(), nv); + NonRoleParamDeclList pdl = (NonRoleParamDeclList) + visitChild(getParamDeclListChild(), nv); + return reconstruct(getNameNodeChild(), rdl, pdl); } public boolean isParameterDeclListEmpty() { return this.paramdecls.isEmpty(); } - - public abstract ProtocolNameNode getNameNode(); - + @Override public ProtocolName getDeclName() { - return (ProtocolName) super.getDeclName(); + return getNameNodeChild().toName(); } @Override public String toString() { - String s = Constants.PROTOCOL_KW + " " + this.name; + String s = Constants.PROTOCOL_KW + " " + getNameNodeChild(); if (!isParameterDeclListEmpty()) { - s += this.paramdecls; + s += getParamDeclListChild(); } - return s + this.roledecls; + return s + getRoleDeclListChild(); + } + + + + + + + + private final RoleDeclList roledecls; + private final NonRoleParamDeclList paramdecls; + + // name = simple name + protected ProtocolHeader(CommonTree source, NameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) + { + super(source, name); + this.roledecls = roledecls; + this.paramdecls = paramdecls; } } diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java b/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java index 60a0fd887..525a9a402 100644 --- a/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java @@ -68,10 +68,16 @@ public RoleDecl project(AstFactory af, Role self) return af.RoleDecl(this.source, rn); } + @Override + public RoleNode getNameNodeChild() + { + return (RoleNode) getNameNodeChild(); + } + @Override public Role getDeclName() { - return (Role) super.getDeclName(); + return getNameNodeChild().toName(); } public boolean isSelfRoleDecl() diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNode.java b/scribble-core/src/main/java/org/scribble/ast/ScribNode.java index d0e06e0af..f1fabb9e6 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/ScribNode.java @@ -14,6 +14,7 @@ package org.scribble.ast; import org.antlr.runtime.tree.CommonTree; +import org.antlr.runtime.tree.Tree; import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.visit.AstVisitor; @@ -23,12 +24,15 @@ * This is the generic object from which all Scribble model objects * are derived. */ -public interface ScribNode +public interface ScribNode extends Tree { + //void setChildren(List children); // protected + // Returns a deep clone but with fresh dels (i.e. dels not copied) -- use the af to build with fresh dels // i.e. recursively using AstFactory to rebuild the whole subtree // Cf. node specific reconstructs, retain (i.e. share) the existing del -- so dels must be immutable (except for Envs) - ScribNode clone(AstFactory af); + //ScribNode clone(AstFactory af); + ScribNode clone(); ScribDel del(); ScribNode del(ScribDel del); diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java index df16fb1f9..4d933ea44 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; @@ -62,21 +63,57 @@ public final CommonTree getSource() return this.source; } - // Internal shallow copy for (immutable) ModelNodes -- does not keep the del (copy is used internally for del setter, and keeping the del needs knowledge of super fields) - // Generally copy is only for shallow copy of object and "immediate" fields (not super fields), cf. ProtocolDecl, ProtocolDeclContext, etc - protected abstract ScribNodeBase copy(); + @Override + public ScribNode getChild(int i) + { + return (ScribNode) super.getChild(i); + } + + @Override + public List getChildren() + { + return ((Stream) super.getChildren().stream()).map(x -> (ScribNode) x) + .collect(Collectors.toList()); + } + + // Non-defenseive + // CHECKME: "generic" visitChildren and reconstruct via get/setChildren? -- maybe too implicit, cannot easily see child visiting order + protected void setChildren(List children) + { + children.forEach(x -> + { + //x.setParent(this); // Not needed, cf. BaseTree#addChild(Tree) + addChild(x); + }); + } - // FIXME: rework as ANTLR node (deep) copy (maybe "clone") + // FIXME: rework as ANTLR node (deep) copy (maybe "clone") -- no: ANTLR dupNode is node only copy (actually, dupNode is node "shell" only, doesn't even keep children, let alone copy them) // FIXME TODO: rework children using ANTLR children + // N.B. does not copy children nor del @Override - public ScribNodeBase dupNode() + public abstract ScribNodeBase dupNode(); + + // Internal shallow copy for (immutable) ModelNodes -- does not keep the del (copy is used internally for del setter, and keeping the del needs knowledge of super fields) + // Generally copy is only for shallow copy of object and "immediate" fields (not super fields), cf. ProtocolDecl, ProtocolDeclContext, etc + @Deprecated + protected final ScribNodeBase copy() // Deprecated: because ANTLR Tree is not immutable (has a "parent" field) { - return copy(); + throw new RuntimeException("Deprecated"); } - // Deep (tree) clone - @Override - public abstract ScribNodeBase clone(AstFactory af); + // Deep (tree) clone, i.e., children also cloned + // Makes a new del via AF (i.e. fresh, not a copy of old del) -- cf. reconstruct, keeps old del (the same instance) + // EDIT: now just keep old del -- by default, del's are immutable + /*@Override + public abstract ScribNodeBase clone(AstFactory af);*/ + + public ScribNodeBase clone() + { + ScribNodeBase dup = (ScribNodeBase) dupNode(); + getChildren().forEach(x -> dup.addChild(x.clone())); + dup.del = this.del; + return dup; + } @Override public final ScribDel del() @@ -87,9 +124,19 @@ public final ScribDel del() @Override public final ScribNodeBase del(ScribDel del) { - ScribNodeBase copy = copy(); + /*ScribNodeBase copy = copy(); copy.del = del; - return copy; + return copy;*/ + ScribNodeBase clone = clone(); // Need full clone because parent field prevents immutable construction + //clone.del = del; + clone.setDel(del); + return clone; + } + + // Non-defensive + protected final void setDel(ScribDel del) + { + this.del = del; } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/SimpleInteractionNode.java b/scribble-core/src/main/java/org/scribble/ast/SimpleInteractionNode.java index 1b537949f..8c5e0f1e9 100644 --- a/scribble-core/src/main/java/org/scribble/ast/SimpleInteractionNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/SimpleInteractionNode.java @@ -21,11 +21,27 @@ public abstract class SimpleInteractionNode extends ScribNodeBase implements InteractionNode { + // ScribTreeAdaptor#create constructor public SimpleInteractionNode(Token t) { super(t); } + // Tree#dupNode constructor + public SimpleInteractionNode(SimpleInteractionNode node) + { + super(node); + } + + + + + + + + + + protected SimpleInteractionNode(CommonTree source) { super(source); diff --git a/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java b/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java index 2aed1551b..c617f0f51 100644 --- a/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java +++ b/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java @@ -58,7 +58,7 @@ public class ModuleContext public ModuleContext(JobContext jcontext, Module root) throws ScribbleException { ModuleName fullname = root.getFullModuleName(); - ModuleName simpname = root.moddecl.getDeclName(); + ModuleName simpname = root.getModuleDeclChild().getDeclName(); this.root = fullname; @@ -82,7 +82,7 @@ public ModuleContext(JobContext jcontext, Module root) throws ScribbleException private static void addModule(ScribNames names, Module mod, ModuleName modname) throws ScribbleException { names.modules.put(modname, mod.getFullModuleName()); - for (NonProtocolDecl npd : mod.getNonProtocolDecls()) + for (NonProtocolDecl npd : mod.getNonProtoDeclChildren()) { if (npd.isDataTypeDecl()) { @@ -97,14 +97,14 @@ private static void addModule(ScribNames names, Module mod, ModuleName modname) names.sigs.put(qualif, msnd.getFullMemberName(mod)); } } - for (GProtocolDecl gpd : mod.getGlobalProtocolDecls()) + for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) { - GProtocolName qualif = new GProtocolName(modname, gpd.getHeader().getDeclName()); + GProtocolName qualif = new GProtocolName(modname, gpd.getHeaderChild().getDeclName()); names.globals.put(qualif, gpd.getFullMemberName(mod)); } - for (LProtocolDecl lpd : mod.getLocalProtocolDecls()) + for (LProtocolDecl lpd : mod.getLProtoDeclChildren()) { - LProtocolName qualif = new LProtocolName(modname, lpd.getHeader().getDeclName()); + LProtocolName qualif = new LProtocolName(modname, lpd.getHeaderChild().getDeclName()); names.locals.put(qualif, lpd.getFullMemberName(mod)); } } @@ -112,7 +112,7 @@ private static void addModule(ScribNames names, Module mod, ModuleName modname) // Could move to ImportModule but would need a defensive copy setter, or cache info in builder and create on leave private void addImportDependencies(JobContext jcontext, Module mod) throws ScribbleException { - for (ImportDecl id : mod.getImportDecls()) + for (ImportDecl id : mod.getImportDeclChildren()) { if (id.isImportModule()) { @@ -137,7 +137,7 @@ private void addImportDependencies(JobContext jcontext, Module mod) throws Scrib private void addVisible(JobContext jcontext, Module root) throws ScribbleException { // Unlike for deps, visible is not done transitively - for (ImportDecl id : root.getImportDecls()) + for (ImportDecl id : root.getImportDeclChildren()) { if (id.isImportModule()) { @@ -157,7 +157,7 @@ private void addVisible(JobContext jcontext, Module root) throws ScribbleExcepti } } - for (NonProtocolDecl npd : root.getNonProtocolDecls()) + for (NonProtocolDecl npd : root.getNonProtoDeclChildren()) { if (npd.isDataTypeDecl()) { @@ -172,14 +172,14 @@ private void addVisible(JobContext jcontext, Module root) throws ScribbleExcepti this.visible.sigs.put(visname, msnd.getFullMemberName(root)); } } - for (GProtocolDecl gpd : root.getGlobalProtocolDecls()) + for (GProtocolDecl gpd : root.getGProtoDeclChildren()) { - GProtocolName visname = new GProtocolName(gpd.getHeader().getDeclName().toString()); + GProtocolName visname = new GProtocolName(gpd.getHeaderChild().getDeclName().toString()); this.visible.globals.put(visname, gpd.getFullMemberName(root)); } - for (LProtocolDecl lpd : root.getLocalProtocolDecls()) + for (LProtocolDecl lpd : root.getLProtoDeclChildren()) { - LProtocolName visname = new LProtocolName(lpd.getHeader().getDeclName().toString()); + LProtocolName visname = new LProtocolName(lpd.getHeaderChild().getDeclName().toString()); this.visible.locals.put(visname, lpd.getFullMemberName(root)); } } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java b/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java index 5718f822d..a5eaf5467 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java @@ -17,28 +17,47 @@ import java.util.List; import java.util.stream.Collectors; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.Choice; -import org.scribble.ast.ProtocolBlock; -import org.scribble.ast.ScribNodeBase; +import org.scribble.ast.ScribNode; import org.scribble.ast.local.LChoice; import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.ScribDel; import org.scribble.main.RuntimeScribbleException; import org.scribble.main.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; -import org.scribble.util.ScribUtil; public class GChoice extends Choice implements GCompoundInteractionNode { - public GChoice(CommonTree source, RoleNode subj, List blocks) + // ScribTreeAdaptor#create constructor + public GChoice(Token t) { - super(source, subj, blocks); + super(t); + } + + // Tree#dupNode constructor + protected GChoice(GChoice node) + { + super(node); } + @Override + public GChoice dupNode() + { + return new GChoice(this); + } + + @Override + public List getBlockChildren() + { + List cs = getChildren(); + return cs.subList(1, cs.size()).stream().map(x -> (GProtocolBlock) x) + .collect(Collectors.toList()); + } + // Similar pattern to reconstruct // Idea is, if extending the AST class (more fields), then reconstruct/project should also be extended (and called from extended del) public LChoice project(AstFactory af, Role self, List blocks) @@ -56,9 +75,14 @@ public LChoice project(AstFactory af, Role self, List blocks) blocks = blocks.stream().filter((b) -> !b.isEmpty()).collect(Collectors.toList()); if (!blocks.isEmpty()) { + RoleNode subj = getSubjectChild(); // FIXME? initially keep global subject, and later overwrite as necessary in projections? (algorithm currently checks for DUMMY) - RoleNode subj = self.equals(this.subj.toName()) ? this.subj.clone(af) : af.DummyProjectionRoleNode(); - List cs = blocks.stream().map(b -> af.LChoice(this.source, subj, Arrays.asList(b))).collect(Collectors.toList()); + RoleNode subj1 = self.equals(subj.toName()) + ? subj.clone(af) + : af.DummyProjectionRoleNode(); + List cs = blocks.stream() + .map(b -> af.LChoice(this.source, subj1, Arrays.asList(b))) + .collect(Collectors.toList()); // Hacky: keeping this.source for each LChoice (will end up as the source for the final merged LChoice) LChoice merged = cs.get(0); try @@ -77,8 +101,23 @@ public LChoice project(AstFactory af, Role self, List blocks) return projection; } + + + + + + + + + + - @Override + public GChoice(CommonTree source, RoleNode subj, List blocks) + { + super(source, subj, blocks); + } + + /*@Override protected ScribNodeBase copy() { return new GChoice(this.source, this.subj, getBlocks()); @@ -90,32 +129,14 @@ public GChoice clone(AstFactory af) RoleNode subj = this.subj.clone(af); List blocks = ScribUtil.cloneList(af, getBlocks()); return af.GChoice(this.source, subj, blocks); - } + }*/ - @Override + /*@Override public GChoice reconstruct(RoleNode subj, List> blocks) { ScribDel del = del(); GChoice gc = new GChoice(this.source, subj, castBlocks(blocks)); gc = (GChoice) gc.del(del); return gc; - } - - @Override - public List getBlocks() - { - return castBlocks(super.getBlocks()); - } - - private static List castBlocks(List> blocks) - { - return blocks.stream().map((b) -> (GProtocolBlock) b).collect(Collectors.toList()); - } - - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public Global getKind() - { - return GCompoundInteractionNode.super.getKind(); }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GInteractionNode.java b/scribble-core/src/main/java/org/scribble/ast/global/GInteractionNode.java index e38f4a4a3..8c20d3232 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GInteractionNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GInteractionNode.java @@ -19,5 +19,5 @@ // Alternatively to interface, use GlobalNode subclass with delegation to "super" base (e.g. Choice) classes public interface GInteractionNode extends InteractionNode, GNode { - + //public LInteractionSeq project(AstFactory af, Role self); // TODO } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java b/scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java index 93378e215..481c4a476 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java @@ -19,25 +19,30 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.InteractionNode; import org.scribble.ast.InteractionSeq; import org.scribble.ast.local.LInteractionNode; import org.scribble.ast.local.LInteractionSeq; -import org.scribble.del.ScribDel; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; -import org.scribble.util.ScribUtil; public class GInteractionSeq extends InteractionSeq implements GNode { + // ScribTreeAdaptor#create constructor public GInteractionSeq(Token t) { super(t); } - public GInteractionSeq(CommonTree source, List actions) + // Tree#dupNode constructor + public GInteractionSeq(GInteractionSeq node) { - super(source, actions); + super(node); + } + + @Override + public GInteractionSeq dupNode() + { + return new GInteractionSeq(this); } // Move node-specific projects to G nodes (not dels) and take child projections as params, bit like reconstruct @@ -46,17 +51,40 @@ public LInteractionSeq project(AstFactory af, Role self, List LInteractionSeq projection = af.LInteractionSeq(this.source, lis); return projection; } - + @Override + public List getInteractNodeChildren() + { + return getChildren().stream().map(n -> (GInteractionNode) n) + .collect(Collectors.toList()); + } + + + + + + + + + + + + + public GInteractionSeq(CommonTree source, List actions) + { + super(source, actions); + } + + /*@Override protected GInteractionSeq copy() { - return new GInteractionSeq(this.source, getInteractions()); + return new GInteractionSeq(this.source, getInteractNodeChildren()); } @Override public GInteractionSeq clone(AstFactory af) { - List gis = ScribUtil.cloneList(af, getInteractions()); + List gis = ScribUtil.cloneList(af, getInteractNodeChildren()); return af.GInteractionSeq(this.source, gis); } @@ -67,23 +95,5 @@ public GInteractionSeq reconstruct(List> ins) GInteractionSeq gis = new GInteractionSeq(this.source, castNodes(ins)); gis = (GInteractionSeq) gis.del(del); return gis; - } - - @Override - public List getInteractions() - { - return castNodes(super.getInteractions()); - } - - private static List castNodes(List> nodes) - { - return nodes.stream().map((n) -> (GInteractionNode) n).collect(Collectors.toList()); - } - - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public Global getKind() - { - return GNode.super.getKind(); }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java index d9905195d..0cc96b0c8 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java @@ -31,71 +31,69 @@ import org.scribble.type.kind.Global; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; -import org.scribble.util.ScribUtil; -public class GMessageTransfer extends MessageTransfer implements GSimpleInteractionNode +public class GMessageTransfer extends MessageTransfer + implements GSimpleInteractionNode { + // ScribTreeAdaptor#create constructor public GMessageTransfer(Token t) { super(t); } - public GMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List dests) + // Tree#dupNode constructor + public GMessageTransfer(GMessageTransfer node) { - super(source, src, msg, dests); + super(node); + } + + public GMessageTransfer dupNode() + { + return new GMessageTransfer(this); } public LNode project(AstFactory af, Role self) { - Role srcrole = this.src.toName(); - List destroles = this.getDestinationRoles(); - LNode projection = null; - if (srcrole.equals(self) || destroles.contains(self)) + RoleNode srcNode = getSourceChild(); + Role src = srcNode.toName(); + List dests = this.getDestinationRoles(); + LNode proj = null; + if (src.equals(self) || dests.contains(self)) { - RoleNode src = (RoleNode) af.SimpleNameNode(this.src.getSource(), RoleKind.KIND, this.src.toName().toString()); // clone? - MessageNode msg = (MessageNode) this.msg.project(af); // FIXME: need namespace prefix update? - List dests = - this.getDestinations().stream().map((rn) -> - (RoleNode) af.SimpleNameNode(rn.getSource(), RoleKind.KIND, rn.toName().toString())).collect(Collectors.toList()); - if (srcrole.equals(self)) + RoleNode srcNode1 = (RoleNode) af.SimpleNameNode(srcNode.getSource(), + RoleKind.KIND, src.toString()); // clone? + MessageNode msg = (MessageNode) + getMessageNodeChild().project(af); // CHECKME: need namespace prefix update? + List destNodes = + getDestinationChildren().stream() + .map(x -> (RoleNode) af.SimpleNameNode(x.getSource(), + RoleKind.KIND, x.toName().toString())) + .collect(Collectors.toList()); + if (src.equals(self)) { - projection = af.LSend(this.source, src, msg, dests); + proj = af.LSend(this.source, srcNode1, msg, destNodes); } - if (destroles.contains(self)) + if (dests.contains(self)) { - if (projection == null) + if (proj == null) { - projection = af.LReceive(this.source, src, msg, dests); + proj = af.LReceive(this.source, srcNode1, msg, destNodes); } else { - LReceive lr = af.LReceive(this.source, src, msg, dests); - List lis = Arrays.asList(new LInteractionNode[]{(LInteractionNode) projection, lr}); - projection = af.LInteractionSeq(this.source, lis); + LReceive lr = af.LReceive(this.source, srcNode1, msg, destNodes); + List lis = Arrays.asList( + new LInteractionNode[]{(LInteractionNode) proj, lr}); + proj = af.LInteractionSeq(this.source, lis); } } } - return projection; - } - - - @Override - protected GMessageTransfer copy() - { - return new GMessageTransfer(this.source, this.src, this.msg, getDestinations()); - } - - @Override - public GMessageTransfer clone(AstFactory af) - { - RoleNode src = this.src.clone(af); - MessageNode msg = this.msg.clone(af); - List dests = ScribUtil.cloneList(af, getDestinations()); - return af.GMessageTransfer(this.source, src, msg, dests); + return proj; } @Override - public GMessageTransfer reconstruct(RoleNode src, MessageNode msg, List dests) + public GMessageTransfer reconstruct(RoleNode src, MessageNode msg, + List dests) { ScribDel del = del(); GMessageTransfer gmt = new GMessageTransfer(this.source, src, msg, dests); @@ -106,14 +104,46 @@ public GMessageTransfer reconstruct(RoleNode src, MessageNode msg, List dest.toString()).collect(Collectors.joining(", ")) + ";"; + return getMessageNodeChild() + " " + Constants.FROM_KW + + " " + getSourceChild() + " " + Constants.TO_KW + + " " + + getDestinationChildren().stream().map(x -> x.toString()) + .collect(Collectors.joining(", ")) + + ";"; + } + + + + + + + + + + + + + + + + public GMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List dests) + { + super(source, src, msg, dests); } - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 + /*@Override + protected GMessageTransfer copy() + { + return new GMessageTransfer(this.source, this.src, this.msg, getDestinationChildren()); + } + @Override - public Global getKind() + public GMessageTransfer clone(AstFactory af) { - return GSimpleInteractionNode.super.getKind(); + RoleNode src = this.src.clone(af); + MessageNode msg = this.msg.clone(af); + List dests = ScribUtil.cloneList(af, getDestinationChildren()); + return af.GMessageTransfer(this.source, src, msg, dests); }*/ + } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolBlock.java b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolBlock.java index b0158ed5a..a3388b6e3 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolBlock.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolBlock.java @@ -16,24 +16,36 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.InteractionSeq; import org.scribble.ast.ProtocolBlock; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProtocolBlock; -import org.scribble.del.ScribDel; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; public class GProtocolBlock extends ProtocolBlock implements GNode { + // ScribTreeAdaptor#create constructor public GProtocolBlock(Token t) { super(t); } - public GProtocolBlock(CommonTree source, GInteractionSeq seq) + // Tree#dupNode constructor + protected GProtocolBlock(GProtocolBlock node) { - super(source, seq); + super(node); + } + + @Override + public GProtocolBlock dupNode() + { + return new GProtocolBlock(this); + } + + @Override + public GInteractionSeq getInteractSeqChild() + { + return (GInteractionSeq) getChild(0); } public LProtocolBlock project(AstFactory af, Role self, LInteractionSeq seq) @@ -41,39 +53,43 @@ public LProtocolBlock project(AstFactory af, Role self, LInteractionSeq seq) LProtocolBlock projection = af.LProtocolBlock(this.source, seq); return projection; } + + + + + + + + + + + + - @Override + public GProtocolBlock(CommonTree source, GInteractionSeq seq) + { + super(source, seq); + } + + /*@Override protected GProtocolBlock copy() { - return new GProtocolBlock(this.source, getInteractionSeq()); + return new GProtocolBlock(this.source, getInteractSeqChild()); } @Override public GProtocolBlock clone(AstFactory af) { - GInteractionSeq gis = getInteractionSeq().clone(af); + GInteractionSeq gis = getInteractSeqChild().clone(af); return af.GProtocolBlock(this.source, gis); - } + }*/ - @Override + /*@Override public GProtocolBlock reconstruct(InteractionSeq seq) { ScribDel del = del(); GProtocolBlock gpb = new GProtocolBlock(this.source, (GInteractionSeq) seq); gpb = (GProtocolBlock) gpb.del(del); return gpb; - } - - @Override - public GInteractionSeq getInteractionSeq() - { - return (GInteractionSeq) this.seq; - } - - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public Global getKind() - { - return GNode.super.getKind(); }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java index ca429b7dc..e42410cfa 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java @@ -20,12 +20,9 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ProtocolDef; -import org.scribble.ast.ProtocolHeader; import org.scribble.ast.local.LProjectionDecl; import org.scribble.ast.local.LProtocolDef; import org.scribble.ast.local.LProtocolHeader; -import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; @@ -34,17 +31,26 @@ public class GProtocolDecl extends ProtocolDecl implements GNode { + // ScribTreeAdaptor#create constructor public GProtocolDecl(Token t) { super(t); } + + // Tree#dupNode constructor + protected GProtocolDecl(GProtocolDecl node) + { + super(node); + } - public GProtocolDecl(CommonTree source, List modifiers, GProtocolHeader header, GProtocolDef def) + // Cf. CommonTree#dupNode + @Override + public GProtocolDecl dupNode() { - super(source, modifiers, header, def); + return new GProtocolDecl(this); } - // FIXME: project modifiers? + // CHECKME: project modifiers? public LProjectionDecl project(AstFactory af, Module mod, Role self, LProtocolHeader hdr, LProtocolDef def) throws ScribbleException // mod is just the parent? { /*//Role self = proj.peekSelf(); @@ -55,52 +61,30 @@ public LProjectionDecl project(AstFactory af, Module mod, Role self, LProtocolHe RoleDeclList roledecls = this.header.roledecls.project(af, self); NonRoleParamDeclList paramdecls = this.header.paramdecls.project(af, self); LProtocolHeader lph = af.LProtocolHeader(this.header.getSource(), pn, roledecls, paramdecls);*/ + GProtocolName gpn = this.getFullMemberName(mod); - LProjectionDecl proj = af.LProjectionDecl(this.source, this.modifiers, gpn, self, hdr, def); + LProjectionDecl proj = + af.LProjectionDecl(this.source, this.modifiers, gpn, self, hdr, def); return proj; } @Override - protected GProtocolDecl copy() + public GProtocolHeader getHeaderChild() { - return new GProtocolDecl(this.source, this.modifiers, getHeader(), getDef()); - } - - @Override - public GProtocolDecl clone(AstFactory af) - { - GProtocolHeader header = getHeader().clone(af); - GProtocolDef def = getDef().clone(af); - return af.GProtocolDecl(this.source, this.modifiers, header, def); + return (GProtocolHeader) getChild(0); } @Override - public GProtocolDecl reconstruct(ProtocolHeader header, ProtocolDef def) + public GProtocolDef getDefChild() { - - ScribDel del = del(); - GProtocolDecl gpd = new GProtocolDecl(this.source, this.modifiers, (GProtocolHeader) header, (GProtocolDef) def); - gpd = (GProtocolDecl) gpd.del(del); // FIXME: does another shallow copy - return gpd; - } - - @Override - public GProtocolHeader getHeader() - { - return (GProtocolHeader) this.header; - } - - @Override - public GProtocolDef getDef() - { - return (GProtocolDef) this.def; + return (GProtocolDef) getChild(1); } @Override public GProtocolName getFullMemberName(Module mod) { ModuleName fullmodname = mod.getFullModuleName(); - return new GProtocolName(fullmodname, this.header.getDeclName()); + return new GProtocolName(fullmodname, getHeaderChild().getDeclName()); } /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 @@ -116,4 +100,49 @@ public Global getKind() { return GNode.super.getKind(); }*/ + + + + + + + + + + + + + + + + + public GProtocolDecl(CommonTree source, List modifiers, GProtocolHeader header, GProtocolDef def) + { + super(source, modifiers, header, def); + } + + /*@Override + protected GProtocolDecl copy() + { + return new GProtocolDecl(this.source, this.modifiers, getHeaderChild(), getDefChild()); + } + + @Override + public GProtocolDecl clone(AstFactory af) + { + GProtocolHeader header = getHeaderChild().clone(af); + GProtocolDef def = getDefChild().clone(af); + return af.GProtocolDecl(this.source, this.modifiers, header, def); + }*/ + + /*@Override + public GProtocolDecl reconstruct(ProtocolHeader header, + ProtocolDef def) + { + + ScribDel del = del(); + GProtocolDecl gpd = new GProtocolDecl(this.source, this.modifiers, (GProtocolHeader) header, (GProtocolDef) def); + gpd = (GProtocolDecl) gpd.del(del); // FIXME: does another shallow copy + return gpd; + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDef.java b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDef.java index 2d2b02df1..59c9697b4 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDef.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDef.java @@ -15,28 +15,52 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.ProtocolBlock; import org.scribble.ast.ProtocolDef; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.ast.local.LProtocolDef; -import org.scribble.del.ScribDel; import org.scribble.type.kind.Global; -import org.scribble.type.name.Role; public class GProtocolDef extends ProtocolDef implements GNode { + // ScribTreeAdaptor#create constructor public GProtocolDef(Token t) { super(t); } + // Tree#dupNode constructor + protected GProtocolDef(GProtocolDef node) + { + super(node); + } + + @Override + public GProtocolDef dupNode() + { + return new GProtocolDef(this); + } + + @Override + public GProtocolBlock getBlockChild() + { + return (GProtocolBlock) getChild(0); + } + + + + + + + + + + + + public GProtocolDef(CommonTree source, GProtocolBlock block) { super(source, block); } - @Override + /*@Override protected GProtocolDef copy() { return new GProtocolDef(this.source, getBlock()); @@ -62,18 +86,5 @@ public GProtocolDef reconstruct(ProtocolBlock block) GProtocolDef gpd = new GProtocolDef(this.source, (GProtocolBlock) block); gpd = (GProtocolDef) gpd.del(del); return gpd; - } - - @Override - public GProtocolBlock getBlock() - { - return (GProtocolBlock) this.block; - } - - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public Global getKind() - { - return GNode.super.getKind(); }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolHeader.java b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolHeader.java index d6d6163ba..4854b6dd1 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolHeader.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolHeader.java @@ -20,73 +20,102 @@ import org.scribble.ast.NonRoleParamDeclList; import org.scribble.ast.ProtocolHeader; import org.scribble.ast.RoleDeclList; -import org.scribble.ast.ScribNodeBase; import org.scribble.ast.local.LProtocolHeader; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.ast.name.qualified.ProtocolNameNode; -import org.scribble.del.ScribDel; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; public class GProtocolHeader extends ProtocolHeader implements GNode { + // ScribTreeAdaptor#create constructor public GProtocolHeader(Token t) { super(t); } - - public GProtocolHeader(CommonTree source, GProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) + + // Tree#dupNode constructor + protected GProtocolHeader(GProtocolHeader node) { - super(source, name, roledecls, paramdecls); + super(node); } - @Override - protected ScribNodeBase copy() + public GProtocolHeader dupNode() { - return new GProtocolHeader(this.source, getNameNode(), this.roledecls, this.paramdecls); + return new GProtocolHeader(this); } @Override - public GProtocolHeader clone(AstFactory af) + public GProtocolNameNode getNameNodeChild() { - GProtocolNameNode name = getNameNode().clone(af); - RoleDeclList roledecls = this.roledecls.clone(af); - NonRoleParamDeclList paramdecls = this.paramdecls.clone(af); - return af.GProtocolHeader(this.source, name, roledecls, paramdecls); + return (GProtocolNameNode) getNameNodeChild(); } @Override - public GProtocolHeader reconstruct(ProtocolNameNode name, RoleDeclList rdl, NonRoleParamDeclList pdl) + public GProtocolName getDeclName() { - ScribDel del = del(); - GProtocolHeader gph = new GProtocolHeader(this.source, (GProtocolNameNode) name, rdl, pdl); - gph = (GProtocolHeader) gph.del(del); - return gph; + return getNameNodeChild().toName(); } - @Override - public GProtocolNameNode getNameNode() + // CHECKME: make a delegate and move there? + public LProtocolHeader project(AstFactory af, Role self, + LProtocolNameNode name, RoleDeclList roledecls, + NonRoleParamDeclList paramdecls) { - return (GProtocolNameNode) this.name; + return af.LProtocolHeader(this.source, name, roledecls, paramdecls); } @Override - public GProtocolName getDeclName() + public String toString() { - return (GProtocolName) super.getDeclName(); + return Constants.GLOBAL_KW + " " + super.toString(); } + + + + + + + + + + + + + + + + + - // FIXME: make a delegate and move there? - public LProtocolHeader project(AstFactory af, Role self, LProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) + public GProtocolHeader(CommonTree source, GProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) { - return af.LProtocolHeader(this.source, name, roledecls, paramdecls); + super(source, name, roledecls, paramdecls); + } + + /*@Override + protected ScribNodeBase copy() + { + return new GProtocolHeader(this.source, getNameNodeChild(), this.roledecls, this.paramdecls); } @Override - public String toString() + public GProtocolHeader clone(AstFactory af) { - return Constants.GLOBAL_KW + " " + super.toString(); - } + GProtocolNameNode name = getNameNodeChild().clone(af); + RoleDeclList roledecls = this.roledecls.clone(af); + NonRoleParamDeclList paramdecls = this.paramdecls.clone(af); + return af.GProtocolHeader(this.source, name, roledecls, paramdecls); + }*/ + + /*@Override + public GProtocolHeader reconstruct(ProtocolNameNode name, + RoleDeclList rdl, NonRoleParamDeclList pdl) + { + ScribDel del = del(); + GProtocolHeader gph = new GProtocolHeader(this.source, (GProtocolNameNode) name, rdl, pdl); + gph = (GProtocolHeader) gph.del(del); + return gph; + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java index 001552cda..689391f38 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java @@ -69,7 +69,7 @@ protected static LProtocolBlock prune(AstFactory af, LProtocolBlock block, Set lis = block.getInteractionSeq().getInteractions(); + List lis = block.getInteractSeqChild().getInteractNodeChildren(); if (lis.size() > 1) { return block; @@ -100,7 +100,7 @@ else if (lin instanceof MessageTransfer || lin instanceof Do || lin instan if (lin instanceof LChoice) { List pruned = new LinkedList(); - for (LProtocolBlock b : ((LChoice) lin).getBlocks()) + for (LProtocolBlock b : ((LChoice) lin).getBlockChildren()) { if (!prune(af, b, rvs).isEmpty()) { diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java b/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java index 68b176d2c..61081aa55 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java @@ -18,66 +18,52 @@ import java.util.Set; import java.util.stream.Collectors; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.Choice; -import org.scribble.ast.ProtocolBlock; -import org.scribble.ast.ScribNodeBase; +import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.Message; import org.scribble.type.kind.Local; import org.scribble.type.name.Role; -import org.scribble.util.ScribUtil; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LChoice extends Choice implements LCompoundInteractionNode { - public LChoice(CommonTree source, RoleNode subj, List blocks) + // ScribTreeAdaptor#create constructor + public LChoice(Token t) { - super(source, subj, blocks); + super(t); } - @Override - protected ScribNodeBase copy() + // Tree#dupNode constructor + protected LChoice(LChoice node) { - return new LChoice(this.source, this.subj, getBlocks()); + super(node); } @Override - public LChoice clone(AstFactory af) + public LChoice dupNode() { - RoleNode subj = this.subj.clone(af); - List blocks = ScribUtil.cloneList(af, getBlocks()); - return af.LChoice(this.source, subj, blocks); - } - - @Override - public LChoice reconstruct(RoleNode subj, List> blocks) - { - ScribDel del = del(); - LChoice lc = new LChoice(this.source, subj, castBlocks(blocks)); - lc = (LChoice) lc.del(del); - return lc; + return new LChoice(this); } - + @Override - public List getBlocks() + public List getBlockChildren() { - return castBlocks(super.getBlocks()); + List cs = getChildren(); + return cs.subList(1, cs.size()).stream().map(x -> (LProtocolBlock) x) + .collect(Collectors.toList()); } + // Pre: not inferring from a "continue X;" -- if choice is first statement in seq, continue must be guarded; if continue is not guarded, choice cannot be first statement in seq @Override public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { - // Relies on: will never be inferring from a "continue X;" -- if choice is first statement in seq, continue must be guarded; if continue is not guarded, choice cannot be first statement in seq - return getBlocks().get(0).getInteractionSeq().getInteractions().get(0).inferLocalChoiceSubject(fixer); - } - - private static List castBlocks(List> blocks) - { - return blocks.stream().map((b) -> (LProtocolBlock) b).collect(Collectors.toList()); + return getBlockChildren().get(0).getInteractSeqChild() + .getInteractNodeChildren().get(0).inferLocalChoiceSubject(fixer); } @Override @@ -85,18 +71,19 @@ public LChoice merge(AstFactory af, LInteractionNode ln) throws ScribbleExceptio { if (!(ln instanceof LChoice) || !this.canMerge(ln)) { - throw new ScribbleException("Cannot merge " + this.getClass() + " and " + ln.getClass() + ": " + this + ", " + ln); + throw new ScribbleException("Cannot merge " + this.getClass() + " and " + + ln.getClass() + ": " + this + ", " + ln); } - LChoice them = ((LChoice) ln); + LChoice them = (LChoice) ln; /*if (!this.subj.toName().equals(them.subj.toName())) // NO: pointless, always DummyProjectionRoleNode at this point -- maybe unnecessary? { throw new ScribbleException("Cannot merge choices for " + this.subj + " and " + them.subj + ": " + this + ", " + ln); }*/ List blocks = new LinkedList<>(); - getBlocks().forEach(b -> blocks.add(b.clone(af))); - them.getBlocks().forEach(b -> blocks.add(b.clone(af))); - return af.LChoice(this.source, this.subj, blocks); // Not reconstruct: leave context building to post-projection passes - // Hacky: this.source + getBlockChildren().forEach(b -> blocks.add(b.clone())); + them.getBlockChildren().forEach(b -> blocks.add(b.clone())); + return af.LChoice(this.source, getSubjectChild(), blocks); // Note: not reconstruct -- leave context building to post-projection passes + // FIXME: this.source } @Override @@ -109,13 +96,52 @@ public boolean canMerge(LInteractionNode ln) @Override public Set getEnabling() { - return getBlocks().stream().flatMap((b) -> b.getEnabling().stream()).collect(Collectors.toSet()); + return getBlockChildren().stream().flatMap((b) -> b.getEnabling().stream()).collect(Collectors.toSet()); } + + + + + + + + + + + + + + + + + + - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 + public LChoice(CommonTree source, RoleNode subj, List blocks) + { + super(source, subj, blocks); + } + + /*@Override + protected ScribNodeBase copy() + { + return new LChoice(this.source, this.subj, getBlockChildren()); + } + @Override - public Local getKind() + public LChoice clone(AstFactory af) + { + RoleNode subj = this.subj.clone(af); + List blocks = ScribUtil.cloneList(af, getBlockChildren()); + return af.LChoice(this.source, subj, blocks); + }*/ + + /*@Override + public LChoice reconstruct(RoleNode subj, List> blocks) { - return LCompoundInteractionNode.super.getKind(); + ScribDel del = del(); + LChoice lc = new LChoice(this.source, subj, castBlocks(blocks)); + lc = (LChoice) lc.del(del); + return lc; }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LDo.java b/scribble-core/src/main/java/org/scribble/ast/local/LDo.java index 3e195f22f..38eee1dc9 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LDo.java @@ -89,8 +89,8 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { ModuleContext mc = fixer.getModuleContext(); JobContext jc = fixer.job.getContext(); - Role subj = getTargetProtocolDecl(jc, mc).getDef().getBlock() - .getInteractionSeq().getInteractions().get(0).inferLocalChoiceSubject(fixer); + Role subj = getTargetProtocolDecl(jc, mc).getDefChild().getBlockChild() + .getInteractSeqChild().getInteractNodeChildren().get(0).inferLocalChoiceSubject(fixer); // FIXME: need equivalent of (e.g) rec X { continue X; } pruning (cf GRecursion.prune) for irrelevant recursive-do (e.g. proto(A, B, C) { choice at A {A->B.do Proto(A,B,C)} or {A->B.B->C} })) Iterator roleargs = this.roles.getRoles().iterator(); for (Role decl : getTargetProtocolDecl(jc, mc).header.roledecls.getRoles()) diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java b/scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java index 1c23d7c2c..9b9bc174d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java @@ -18,49 +18,37 @@ import java.util.Set; import java.util.stream.Collectors; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.InteractionNode; import org.scribble.ast.InteractionSeq; -import org.scribble.ast.ScribNodeBase; -import org.scribble.del.ScribDel; import org.scribble.type.Message; import org.scribble.type.kind.Local; -import org.scribble.util.ScribUtil; public class LInteractionSeq extends InteractionSeq implements LNode { - public LInteractionSeq(CommonTree source, List lis) + // ScribTreeAdaptor#create constructor + public LInteractionSeq(Token t) { - super(source, lis); + super(t); } - @Override - protected ScribNodeBase copy() + // Tree#dupNode constructor + public LInteractionSeq(LInteractionSeq node) { - return new LInteractionSeq(this.source, getInteractions()); + super(node); } @Override - public LInteractionSeq clone(AstFactory af) + public LInteractionSeq dupNode() { - List lis = ScribUtil.cloneList(af, getInteractions()); - return af.LInteractionSeq(this.source, lis); - } - - @Override - public LInteractionSeq reconstruct(List> actions) - { - ScribDel del = del(); - LInteractionSeq lis = new LInteractionSeq(this.source, castNodes(actions)); - lis = (LInteractionSeq) lis.del(del); - return lis; + return new LInteractionSeq(this); } @Override - public List getInteractions() + public List getInteractNodeChildren() { - return castNodes(super.getInteractions()); + return getChildren().stream().map(n -> (LInteractionNode) n) + .collect(Collectors.toList()); } @Override @@ -68,17 +56,12 @@ public boolean isLocal() { return true; } - - private static List castNodes(List> nodes) - { - return nodes.stream().map((n) -> (LInteractionNode) n).collect(Collectors.toList()); - } public Set getEnabling() { if (!this.isEmpty()) { - for (LInteractionNode ln : getInteractions()) + for (LInteractionNode ln : getInteractNodeChildren()) { Set enab = ln.getEnabling(); if (!enab.isEmpty()) @@ -90,10 +73,42 @@ public Set getEnabling() return Collections.emptySet(); } - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 + + + + + + + + + + + + + public LInteractionSeq(CommonTree source, List lis) + { + super(source, lis); + } + + /*@Override + protected ScribNodeBase copy() + { + return new LInteractionSeq(this.source, getInteractNodeChildren()); + } + + @Override + public LInteractionSeq clone(AstFactory af) + { + List lis = ScribUtil.cloneList(af, getInteractNodeChildren()); + return af.LInteractionSeq(this.source, lis); + } + @Override - public Local getKind() + public LInteractionSeq reconstruct(List> actions) { - return LNode.super.getKind(); + ScribDel del = del(); + LInteractionSeq lis = new LInteractionSeq(this.source, castNodes(actions)); + lis = (LInteractionSeq) lis.del(del); + return lis; }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LMessageTransfer.java b/scribble-core/src/main/java/org/scribble/ast/local/LMessageTransfer.java index 37da5e4dc..12a11ddd9 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LMessageTransfer.java @@ -15,6 +15,7 @@ import java.util.List; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.MessageNode; import org.scribble.ast.MessageTransfer; @@ -23,6 +24,26 @@ public abstract class LMessageTransfer extends MessageTransfer implements LSimpleInteractionNode { + // ScribTreeAdaptor#create constructor + public LMessageTransfer(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public LMessageTransfer(LMessageTransfer node) + { + super(node); + } + + + + + + + + + public LMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List dests) { super(source, src, msg, dests); diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LParallel.java b/scribble-core/src/main/java/org/scribble/ast/local/LParallel.java index b21a50c8b..1a1e934ea 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LParallel.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LParallel.java @@ -67,7 +67,7 @@ public List getBlocks() @Override public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { - return getBlocks().get(0).getInteractionSeq().getInteractions().get(0).inferLocalChoiceSubject(fixer); + return getBlocks().get(0).getInteractSeqChild().getInteractNodeChildren().get(0).inferLocalChoiceSubject(fixer); } private static List castBlocks(List> blocks) diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LProjectionDecl.java b/scribble-core/src/main/java/org/scribble/ast/local/LProjectionDecl.java index c17555ffd..3225ff44c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LProjectionDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LProjectionDecl.java @@ -15,33 +15,61 @@ import java.util.List; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.ProtocolDef; -import org.scribble.ast.ProtocolHeader; -import org.scribble.ast.ScribNodeBase; -import org.scribble.del.ScribDel; -import org.scribble.del.local.LProjectionDeclDel; -import org.scribble.type.kind.Local; +// A projected local proto -- cf. parsed public class LProjectionDecl extends LProtocolDecl { + // ScribTreeAdaptor#create constructor + public LProjectionDecl(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected LProjectionDecl(LProjectionDecl node) + { + super(node); + } + + // Cf. CommonTree#dupNode + @Override + public LProjectionDecl dupNode() + { + return new LProjectionDecl(this); + } + + + + + + + + + + + + + + + public LProjectionDecl(CommonTree source, List modifiers, LProtocolHeader header, LProtocolDef def) { super(source, modifiers, header, def); } - @Override + /*@Override protected ScribNodeBase copy() { - return new LProjectionDecl(this.source, this.modifiers, getHeader(), getDef()); + return new LProjectionDecl(this.source, this.modifiers, getHeaderChild(), getDefChild()); } @Override public LProjectionDecl clone(AstFactory af) { - LProtocolHeader header = getHeader().clone(af); - LProtocolDef def = getDef().clone(af); + LProtocolHeader header = getHeaderChild().clone(af); + LProtocolDef def = getDefChild().clone(af); LProjectionDeclDel del = (LProjectionDeclDel) del(); return af.LProjectionDecl(this.source, this.modifiers, del.getSourceProtocol(), del.getSelfRole(), header, def); } @@ -53,5 +81,5 @@ public LProjectionDecl reconstruct(ProtocolHeader header, ProtocolDef implements LNode { - public LProtocolBlock(CommonTree source, LInteractionSeq seq) + // ScribTreeAdaptor#create constructor + public LProtocolBlock(Token t) { - super(source, seq); + super(t); + } + + // Tree#dupNode constructor + protected LProtocolBlock(LProtocolBlock node) + { + super(node); } @Override - protected LProtocolBlock copy() + public LProtocolBlock dupNode() { - return new LProtocolBlock(this.source, getInteractionSeq()); + return new LProtocolBlock(this); } @Override - public LProtocolBlock clone(AstFactory af) + public LProtocolBlock clone() { - LInteractionSeq lis = getInteractionSeq().clone(af); - return af.LProtocolBlock(this.source, lis); + return (LProtocolBlock) super.clone(); } @Override - public LProtocolBlock reconstruct(InteractionSeq seq) + public LInteractionSeq getInteractSeqChild() { - ScribDel del = del(); - LProtocolBlock lpb = new LProtocolBlock(this.source, (LInteractionSeq) seq); - lpb = (LProtocolBlock) lpb.del(del); - return lpb; + return (LInteractionSeq) getChild(0); } - - @Override - public LInteractionSeq getInteractionSeq() + + public Set getEnabling() { - return (LInteractionSeq) this.seq; + return getInteractSeqChild().getEnabling(); } public LProtocolBlock merge(LProtocolBlock lpb) @@ -63,15 +63,39 @@ public LProtocolBlock merge(LProtocolBlock lpb) throw new RuntimeException("TODO: " + this + ", " + lpb); } - public Set getEnabling() + + + + + + + + + + public LProtocolBlock(CommonTree source, LInteractionSeq seq) + { + super(source, seq); + } + + /*@Override + protected LProtocolBlock copy() { - return getInteractionSeq().getEnabling(); + return new LProtocolBlock(this.source, getInteractSeqChild()); } - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 @Override - public Local getKind() + public LProtocolBlock clone(AstFactory af) { - return LNode.super.getKind(); + LInteractionSeq lis = getInteractSeqChild().clone(af); + return af.LProtocolBlock(this.source, lis); + } + + @Override + public LProtocolBlock reconstruct(InteractionSeq seq) + { + ScribDel del = del(); + LProtocolBlock lpb = new LProtocolBlock(this.source, (LInteractionSeq) seq); + lpb = (LProtocolBlock) lpb.del(del); + return lpb; }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDecl.java index 8894b6743..109ef7505 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDecl.java @@ -15,71 +15,104 @@ import java.util.List; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ProtocolDef; -import org.scribble.ast.ProtocolHeader; -import org.scribble.ast.ScribNodeBase; -import org.scribble.del.ScribDel; import org.scribble.type.kind.Local; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.ModuleName; import org.scribble.type.name.Role; -// Maybe make abstract with concrete parsed (LParsedDecl) and projected (LProjectionDecl) subclasses +// CHECKME: maybe make abstract with concrete parsed (LParsedDecl) and projected (LProjectionDecl) subclasses public class LProtocolDecl extends ProtocolDecl implements LNode { - public LProtocolDecl(CommonTree source, List modifiers, LProtocolHeader header, LProtocolDef def) - { - super(source, modifiers, header, def); - } - - @Override - protected ScribNodeBase copy() + // ScribTreeAdaptor#create constructor + public LProtocolDecl(Token t) { - return new LProtocolDecl(this.source, this.modifiers, getHeader(), getDef()); + super(t); } - @Override - public LProtocolDecl clone(AstFactory af) + // Tree#dupNode constructor + protected LProtocolDecl(LProtocolDecl node) { - LProtocolHeader header = getHeader().clone(af); - LProtocolDef def = getDef().clone(af); - return af.LProtocolDecl(this.source, this.modifiers, header, def); + super(node); } - + + // Cf. CommonTree#dupNode @Override - public LProtocolDecl reconstruct(ProtocolHeader header, ProtocolDef def) + public LProtocolDecl dupNode() { - ScribDel del = del(); - LProtocolDecl lpd = new LProtocolDecl(this.source, this.modifiers, (LProtocolHeader) header, (LProtocolDef) def); - lpd = (LProtocolDecl) lpd.del(del); - return lpd; + return new LProtocolDecl(this); } @Override - public LProtocolHeader getHeader() + public LProtocolHeader getHeaderChild() { - return (LProtocolHeader) this.header; + return (LProtocolHeader) getChild(0); } @Override - public LProtocolDef getDef() + public LProtocolDef getDefChild() { - return (LProtocolDef) this.def; + return (LProtocolDef) getChild(1); } @Override public LProtocolName getFullMemberName(Module mod) { ModuleName fullmodname = mod.getFullModuleName(); - return new LProtocolName(fullmodname, this.header.getDeclName()); + return new LProtocolName(fullmodname, getHeaderChild().getDeclName()); } public Role getSelfRole() { - return getHeader().getSelfRole(); + return getHeaderChild().getSelfRole(); + } + + + + + + + + + + + + + + + + + + + + public LProtocolDecl(CommonTree source, List modifiers, LProtocolHeader header, LProtocolDef def) + { + super(source, modifiers, header, def); + } + + /*@Override + protected ScribNodeBase copy() + { + return new LProtocolDecl(this.source, this.modifiers, getHeaderChild(), getDefChild()); } + + @Override + public LProtocolDecl clone(AstFactory af) + { + LProtocolHeader header = getHeaderChild().clone(af); + LProtocolDef def = getDefChild().clone(af); + return af.LProtocolDecl(this.source, this.modifiers, header, def); + } + + @Override + public LProtocolDecl reconstruct(ProtocolHeader header, ProtocolDef def) + { + ScribDel del = del(); + LProtocolDecl lpd = new LProtocolDecl(this.source, this.modifiers, (LProtocolHeader) header, (LProtocolDef) def); + lpd = (LProtocolDecl) lpd.del(del); + return lpd; + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDef.java b/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDef.java index 9166056bd..fa445b7a5 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDef.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDef.java @@ -13,21 +13,57 @@ */ package org.scribble.ast.local; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.ProtocolBlock; import org.scribble.ast.ProtocolDef; -import org.scribble.del.ScribDel; import org.scribble.type.kind.Local; public class LProtocolDef extends ProtocolDef implements LNode { + // ScribTreeAdaptor#create constructor + public LProtocolDef(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected LProtocolDef(LProtocolDef node) + { + super(node); + } + + @Override + public LProtocolDef dupNode() + { + return new LProtocolDef(this); + } + + @Override + public LProtocolBlock getBlockChild() + { + return (LProtocolBlock) getChild(0); + } + + + + + + + + + + + + + + + public LProtocolDef(CommonTree source, LProtocolBlock block) { super(source, block); } - @Override + /*@Override protected LProtocolDef copy() { return new LProtocolDef(this.source, getBlock()); @@ -47,18 +83,5 @@ public LProtocolDef reconstruct(ProtocolBlock block) LProtocolDef lpd = new LProtocolDef(this.source, (LProtocolBlock) block); lpd = (LProtocolDef) lpd.del(del); return lpd; - } - - @Override - public LProtocolBlock getBlock() - { - return (LProtocolBlock) this.block; - } - - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public Local getKind() - { - return LNode.super.getKind(); }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolHeader.java b/scribble-core/src/main/java/org/scribble/ast/local/LProtocolHeader.java index 58216baa3..590cda8e2 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolHeader.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LProtocolHeader.java @@ -13,18 +13,15 @@ */ package org.scribble.ast.local; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.Constants; import org.scribble.ast.NameDeclNode; import org.scribble.ast.NonRoleParamDeclList; import org.scribble.ast.ProtocolHeader; import org.scribble.ast.RoleDecl; import org.scribble.ast.RoleDeclList; -import org.scribble.ast.ScribNodeBase; import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.ast.name.qualified.ProtocolNameNode; -import org.scribble.del.ScribDel; import org.scribble.type.kind.Local; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.LProtocolName; @@ -32,38 +29,27 @@ public class LProtocolHeader extends ProtocolHeader implements LNode { - public LProtocolHeader(CommonTree source, LProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) - { - super(source, name, roledecls, paramdecls); - } - - @Override - protected ScribNodeBase copy() + // ScribTreeAdaptor#create constructor + public LProtocolHeader(Token t) { - return new LProtocolHeader(this.source, getNameNode(), this.roledecls, this.paramdecls); + super(t); } - @Override - public LProtocolHeader clone(AstFactory af) + // Tree#dupNode constructor + protected LProtocolHeader(LProtocolHeader node) { - LProtocolNameNode name = getNameNode().clone(af); - RoleDeclList roledecls = this.roledecls.clone(af); - NonRoleParamDeclList paramdecls = this.paramdecls.clone(af); - return af.LProtocolHeader(this.source, name, roledecls, paramdecls); + super(node); } - - @Override - public LProtocolHeader reconstruct(ProtocolNameNode name, RoleDeclList rdl, NonRoleParamDeclList pdl) + + public LProtocolHeader dupNode() { - ScribDel del = del(); - LProtocolHeader gph = new LProtocolHeader(this.source, (LProtocolNameNode) name, rdl, pdl); - gph = (LProtocolHeader) gph.del(del); - return gph; + return new LProtocolHeader(this); } public Role getSelfRole() { - for (NameDeclNode rd : this.roledecls.getDecls()) + RoleDeclList rdl = getRoleDeclListChild(); + for (NameDeclNode rd : rdl.getDecls()) { RoleDecl tmp = (RoleDecl) rd; if (tmp.isSelfRoleDecl()) @@ -71,19 +57,19 @@ public Role getSelfRole() return tmp.getDeclName(); } } - throw new RuntimeException("Shouldn't get here: " + this.roledecls); + throw new RuntimeException("Shouldn't get here: " + rdl); } - + @Override - public LProtocolNameNode getNameNode() + public LProtocolNameNode getNameNodeChild() { - return (LProtocolNameNode) this.name; + return (LProtocolNameNode) getNameNodeChild(); } - + @Override public LProtocolName getDeclName() { - return (LProtocolName) super.getDeclName(); + return getNameNodeChild().toName(); } @Override @@ -91,4 +77,44 @@ public String toString() { return Constants.LOCAL_KW + " " + super.toString(); } + + + + + + + + + + + + + public LProtocolHeader(CommonTree source, LProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) + { + super(source, name, roledecls, paramdecls); + } + + /*@Override + protected ScribNodeBase copy() + { + return new LProtocolHeader(this.source, getNameNodeChild(), this.roledecls, this.paramdecls); + } + + @Override + public LProtocolHeader clone(AstFactory af) + { + LProtocolNameNode name = getNameNodeChild().clone(af); + RoleDeclList roledecls = this.roledecls.clone(af); + NonRoleParamDeclList paramdecls = this.paramdecls.clone(af); + return af.LProtocolHeader(this.source, name, roledecls, paramdecls); + } + + @Override + public LProtocolHeader reconstruct(ProtocolNameNode name, RoleDeclList rdl, NonRoleParamDeclList pdl) + { + ScribDel del = del(); + LProtocolHeader gph = new LProtocolHeader(this.source, (LProtocolNameNode) name, rdl, pdl); + gph = (LProtocolHeader) gph.del(del); + return gph; + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java b/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java index 5cf1cfc92..35719e8a0 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java @@ -41,7 +41,7 @@ public LReceive(CommonTree source, RoleNode src, MessageNode msg, List @Override protected ScribNodeBase copy() { - return new LReceive(this.source, this.src, this.msg, getDestinations()); + return new LReceive(this.source, this.src, this.msg, getDestinationChildren()); } @Override @@ -49,7 +49,7 @@ public LReceive clone(AstFactory af) { RoleNode src = this.src.clone(af); MessageNode msg = this.msg.clone(af); - List dests = ScribUtil.cloneList(af, getDestinations()); + List dests = ScribUtil.cloneList(af, getDestinationChildren()); return af.LReceive(this.source, src, msg, dests); } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java index 3ed2457f0..94934dc84 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java @@ -67,7 +67,7 @@ public LProtocolBlock getBlock() public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { //fixer.pushRec(this.recvar.toName()); - return getBlock().getInteractionSeq().getInteractions().get(0).inferLocalChoiceSubject(fixer); + return getBlock().getInteractSeqChild().getInteractNodeChildren().get(0).inferLocalChoiceSubject(fixer); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LSend.java b/scribble-core/src/main/java/org/scribble/ast/local/LSend.java index 5b56a2409..066de89ff 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LSend.java @@ -43,7 +43,7 @@ public LSend(CommonTree source, RoleNode src, MessageNode msg, List de @Override protected ScribNodeBase copy() { - return new LSend(this.source, this.src, this.msg, getDestinations()); + return new LSend(this.source, this.src, this.msg, getDestinationChildren()); } @Override @@ -51,7 +51,7 @@ public LSend clone(AstFactory af) { RoleNode src = this.src.clone(af); MessageNode msg = this.msg.clone(af); - List dests = ScribUtil.cloneList(af, getDestinations()); + List dests = ScribUtil.cloneList(af, getDestinationChildren()); return af.LSend(this.source, src, msg, dests); } @@ -75,7 +75,7 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) public String toString() { return this.msg + " " + Constants.TO_KW + " " - + getDestinations().stream().map((dest) -> dest.toString()).collect(Collectors.joining(", ")) + ";"; + + getDestinationChildren().stream().map((dest) -> dest.toString()).collect(Collectors.joining(", ")) + ";"; } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java index 817a2ed8c..8975ebbb9 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java @@ -17,16 +17,16 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.ScribNodeBase; import org.scribble.type.kind.Kind; import org.scribble.type.name.Named; -// Kind parameter used for typing help, but NameNodes don't record kind as state (not part of the syntax) -- so kind doesn't affect e.g. equals (i.e. names nodes of different kinds are still only compared syntactically) +// Kind parameter used for typing help, but NameNodes don't record kind as state (not part of the syntax) -- so kind doesn't affect e.g. equals (i.e. name nodes of different kinds are still only compared syntactically) public abstract class NameNode extends ScribNodeBase implements Named { protected final String[] elems; + // ScribTreeAdaptor#create constructor public NameNode(Token t) { super(t); @@ -38,14 +38,11 @@ public NameNode(CommonTree source, String... elems) super(source); if (source == null) { - throw new RuntimeException("ccf"); + throw new RuntimeException("CHECKME"); } this.elems = elems; } - @Override - public abstract NameNode clone(AstFactory af); - public String[] getElements() { return Arrays.copyOf(this.elems, this.elems.length); @@ -106,4 +103,13 @@ public String toString() { return toName().toString(); } + + + + + + + + /*@Override + public abstract NameNode clone(AstFactory af);*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java index 4740e01db..a68faa811 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java @@ -13,31 +13,33 @@ */ package org.scribble.ast.name.qualified; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.name.PayloadElemNameNode; import org.scribble.type.Arg; import org.scribble.type.kind.DataTypeKind; import org.scribble.type.name.DataType; //public class DataTypeNode extends MemberNameNode implements PayloadElemNameNode -public class DataTypeNode extends MemberNameNode implements PayloadElemNameNode +public class DataTypeNode extends MemberNameNode + implements PayloadElemNameNode { - public DataTypeNode(CommonTree source, String... elems) + // ScribTreeAdaptor#create constructor + public DataTypeNode(Token t) { - super(source, elems); + super(t); } - @Override - protected DataTypeNode copy() + // Tree#dupNode constructor + protected DataTypeNode(DataTypeNode node, String... ns) { - return new DataTypeNode(this.source, this.elems); + super(node, ns); } @Override - public DataTypeNode clone(AstFactory af) + public DataTypeNode dupNode() { - return (DataTypeNode) af.QualifiedNameNode(this.source, DataTypeKind.KIND, this.elems); + return new DataTypeNode(this, getElements()); } @Override @@ -94,4 +96,32 @@ public int hashCode() hash = 31 * hash + this.elems.hashCode(); return hash; } + + + + + + + + + + + + + public DataTypeNode(CommonTree source, String... elems) + { + super(source, elems); + } + + /*@Override + protected DataTypeNode copy() + { + return new DataTypeNode(this.source, this.elems); + } + + @Override + public DataTypeNode clone(AstFactory af) + { + return (DataTypeNode) af.QualifiedNameNode(this.source, DataTypeKind.KIND, this.elems); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index e1730d08c..51aa2e0b4 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -13,6 +13,7 @@ */ package org.scribble.ast.name.simple; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; @@ -31,39 +32,42 @@ //public class AmbigNameNode extends SimpleNameNode implements MessageNode, PayloadElemNameNode public class AmbigNameNode extends SimpleNameNode implements MessageNode, PayloadElemNameNode // Currently hardcoded to DataTypeKind for payload elems { - public AmbigNameNode(CommonTree source, String identifier) + // ScribTreeAdaptor#create constructor + public AmbigNameNode(Token t) { - super(source, identifier); + super(t); } - - @Override - public MessageNode project(AstFactory af) + + // Tree#dupNode constructor + protected AmbigNameNode(AmbigNameNode node, String id) { - throw new RuntimeException("Shouldn't get in here: " + this); + super(node, id); } - + @Override - protected AmbigNameNode copy() + public AmbigNameNode dupNode() { - return new AmbigNameNode(this.source, getIdentifier()); + return new AmbigNameNode(this, getIdentifier()); } @Override - public AmbigNameNode clone(AstFactory af) + public MessageNode project(AstFactory af) { - return (AmbigNameNode) af.AmbiguousNameNode(this.source, getIdentifier()); + throw new RuntimeException("Shouldn't get in here: " + this); } @Override public Arg toArg() { - throw new RuntimeException("Ambiguous name node not disambiguated: " + this); + throw new RuntimeException( + "Ambiguous name node not disambiguated: " + this); } @Override public Message toMessage() { - throw new RuntimeException("Ambiguous name node not disambiguated: " + this); + throw new RuntimeException( + "Ambiguous name node not disambiguated: " + this); } @Override @@ -71,7 +75,8 @@ public Message toMessage() public PayloadElemType toPayloadType() // As a payload elem, currently hardcoded to expect only DataTypeKind (protocol payloads not supported) //public PayloadType toPayloadType() { - throw new RuntimeException("Ambiguous name node not disambiguated: " + this); + throw new RuntimeException( + "Ambiguous name node not disambiguated: " + this); } @Override @@ -107,4 +112,28 @@ public int hashCode() hash = 31 * super.hashCode(); return hash; } + + + + + + + + + public AmbigNameNode(CommonTree source, String id) + { + super(source, id); + } + + /*@Override + protected AmbigNameNode copy() + { + return new AmbigNameNode(this.source, getIdentifier()); + } + + @Override + public AmbigNameNode clone(AstFactory af) + { + return (AmbigNameNode) af.AmbiguousNameNode(this.source, getIdentifier()); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java index 15438f6c2..3585afac9 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java @@ -13,6 +13,7 @@ */ package org.scribble.ast.name.simple; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; import org.scribble.type.kind.Kind; @@ -20,13 +21,35 @@ // Parser Identifier public abstract class SimpleNameNode extends NameNode { - public SimpleNameNode(CommonTree source, String identifier) + // ScribTreeAdaptor#create constructor + public SimpleNameNode(Token t) { - super(source, new String[] { identifier }); + super(t); + } + + // Tree#dupNode constructor + protected SimpleNameNode(SimpleNameNode node, String id) + { + super(node, id); } public String getIdentifier() { return getLastElement(); } + + + + + + + + + + + + public SimpleNameNode(CommonTree source, String id) + { + super(source, new String[]{id}); + } } diff --git a/scribble-core/src/main/java/org/scribble/del/ChoiceDel.java b/scribble-core/src/main/java/org/scribble/del/ChoiceDel.java index d148fc4b4..23f01f3d6 100644 --- a/scribble-core/src/main/java/org/scribble/del/ChoiceDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ChoiceDel.java @@ -44,7 +44,7 @@ public Choice leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child { Choice cho = (Choice) visited; List benvs = - cho.getBlocks().stream().map((b) -> (UnfoldingEnv) b.del().env()).collect(Collectors.toList()); + cho.getBlockChildren().stream().map((b) -> (UnfoldingEnv) b.del().env()).collect(Collectors.toList()); UnfoldingEnv merged = unf.popEnv().mergeContexts(benvs); unf.pushEnv(merged); return (Choice) super.leaveInlinedProtocolUnfolding(parent, child, unf, visited); // Done merge of children here, super does merge into parent @@ -62,7 +62,7 @@ public Choice leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child { Choice cho = (Choice) visited; List benvs = - cho.getBlocks().stream().map((b) -> (ExplicitCorrelationEnv) b.del().env()).collect(Collectors.toList()); + cho.getBlockChildren().stream().map((b) -> (ExplicitCorrelationEnv) b.del().env()).collect(Collectors.toList()); ExplicitCorrelationEnv merged = checker.popEnv().mergeContexts(benvs); checker.pushEnv(merged); return (Choice) super.leaveExplicitCorrelationCheck(parent, child, checker, visited); // Done merge of children here, super does merge into parent diff --git a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java index c0b2d9b1b..d38860589 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java @@ -60,7 +60,7 @@ protected ProtocolDecl getTargetProtocolDecl(Do parent, NameDisambiguator throw new ScribbleException("Protocol decl not visible: " + simpname); }*/ ProtocolName fullname = mc.getVisibleProtocolDeclFullName(pn); // Lookup in visible names -- not deps, because do target name not disambiguated yet (will be done later this pass) - return jc.getModule(fullname.getPrefix()).getProtocolDecl(pn.getSimpleName()); + return jc.getModule(fullname.getPrefix()).getProtocolDeclChild(pn.getSimpleName()); } protected abstract HeaderParamDeclList getParamDeclList(ProtocolDecl pd); diff --git a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java b/scribble-core/src/main/java/org/scribble/del/ModuleDel.java index e2e6f0482..7844624c8 100644 --- a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ModuleDel.java @@ -56,45 +56,61 @@ private ModuleDel copy() } @Override - public void enterModuleContextBuilding(ScribNode parent, ScribNode child, ModuleContextBuilder builder) throws ScribbleException + public void enterModuleContextBuilding(ScribNode parent, ScribNode child, + ModuleContextBuilder builder) throws ScribbleException { builder.setModuleContext(new ModuleContext(builder.job.getContext(), (Module) child)); } // Maybe better to create on enter, so can be used during the context build pass (Context would need to be "cached" in the visitor to be accessed) @Override - public Module leaveModuleContextBuilding(ScribNode parent, ScribNode child, ModuleContextBuilder builder, ScribNode visited) throws ScribbleException + public Module leaveModuleContextBuilding(ScribNode parent, ScribNode child, + ModuleContextBuilder builder, ScribNode visited) throws ScribbleException { ModuleDel del = setModuleContext(builder.getModuleContext()); return (Module) visited.del(del); } @Override - public Module leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + public Module leaveDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb, ScribNode visited) throws ScribbleException { Module mod = (Module) visited; // Imports checked in ModuleContext -- that is built before disamb is run - List> npds = mod.getNonProtocolDecls(); - List npdnames = npds.stream().map((npd) -> npd.getDeclName().toString()).collect(Collectors.toList()); + List> npds = mod.getNonProtoDeclChildren(); + List npdnames = npds.stream() + .map(x -> x.getDeclName().toString()) + .collect(Collectors.toList()); // Have to use Strings, as can be different kinds (datatype, sig) final Set dups1 = getDuplicates(npdnames); //if (npds.size() != npdnames.stream().distinct().count()) if (!dups1.isEmpty()) { NonProtocolDecl first = - npds.stream().filter((npd) -> dups1.contains(npd.getDeclName().toString())).collect(Collectors.toList()).get(0); - throw new ScribbleException(first.getSource(), "Duplicate non-protocol decls: " + first.getDeclName()); + npds.stream() + .filter(x -> dups1.contains(x.getDeclName().toString())) + .collect(Collectors.toList()).get(0); + throw new ScribbleException(first.getSource(), + "Duplicate non-protocol decls: " + first.getDeclName()); } - List> pds = mod.getProtocolDecls(); - List pdnames = pds.stream().map((pd) -> pd.header.getDeclName().toString()).collect(Collectors.toList()); + List> pds = mod.getProtoDeclChildren(); + List pdnames = pds.stream() + .map(pd -> pd.getHeaderChild().getDeclName().toString()) + .collect(Collectors.toList()); // Have to use Strings, as can be different kinds (global, local) final Set dups2 = getDuplicates(pdnames); if (pds.size() != pdnames.stream().distinct().count()) if (!dups2.isEmpty()) { ProtocolDecl first = - pds.stream().filter((pd) -> dups2.contains(pd.header.getDeclName().toString())).collect(Collectors.toList()).get(0); - throw new ScribbleException(first.getSource(), "Duplicate protocol decls: " + first.header.getDeclName()); // Global and locals also required to be distinct + pds.stream() + .filter(x -> dups2 + .contains(x.getHeaderChild().getDeclName().toString())) + .collect(Collectors.toList()).get(0); + throw new ScribbleException(first.getSource(), + "Duplicate protocol decls: " + + first.getHeaderChild().getDeclName()); + // Global and locals also required to be distinct } return mod; } @@ -122,17 +138,23 @@ public Module leaveProjection(ScribNode parent, ScribNode child, Projector proj, } // lpd is the projected local protocol - public Module createModuleForProjection(Projector proj, Module root, GProtocolDecl gpd, LProtocolDecl lpd, Map> deps) + public Module createModuleForProjection(Projector proj, Module root, + GProtocolDecl gpd, LProtocolDecl lpd, Map> deps) { - ModuleNameNode modname = Projector.makeProjectedModuleNameNode(proj.job.af, root.moddecl.name.getSource(), // Or ignore blame source for purely generated? - root.moddecl.getFullModuleName(), lpd.getHeader().getDeclName()); - ModuleDecl moddecl = proj.job.af.ModuleDecl(root.moddecl.getSource(), modname); + ModuleDecl rootModDecl = root.getModuleDeclChild(); + ModuleNameNode modname = Projector.makeProjectedModuleNameNode(proj.job.af, + rootModDecl.getNameNodeChild().getSource(), + // Or ignore blame source for purely generated? + rootModDecl.getFullModuleName(), lpd.getHeaderChild().getDeclName()); + ModuleDecl modDecl = proj.job.af + .ModuleDecl(root.getModuleDeclChild().getSource(), modname); List> imports = new LinkedList<>(); for (GProtocolName gpn : deps.keySet()) { for (Role role : deps.get(gpn)) { - LProtocolName targetsimpname = Projector.projectSimpleProtocolName(gpn.getSimpleName(), role); + LProtocolName targetsimpname = Projector + .projectSimpleProtocolName(gpn.getSimpleName(), role); ModuleNameNode targetmodname = Projector.makeProjectedModuleNameNode(proj.job.af, //null, // FIXME? projected import sources? new CommonTree(), // FIXME -- @@ -145,9 +167,10 @@ public Module createModuleForProjection(Projector proj, Module root, GProtocolDe } } - List> data = new LinkedList<>(root.getNonProtocolDecls()); // FIXME: copy? // FIXME: only project the dependencies + List> data = new LinkedList<>(root.getNonProtoDeclChildren()); // FIXME: copy? // FIXME: only project the dependencies List> protos = Arrays.asList(lpd); - return proj.job.af.Module(gpd.header.getSource(), moddecl, imports, data, protos); + return proj.job.af.Module(gpd.getHeaderChild().getSource(), modDecl, + imports, data, protos); } @Override diff --git a/scribble-core/src/main/java/org/scribble/del/ScribDel.java b/scribble-core/src/main/java/org/scribble/del/ScribDel.java index 63a50f148..41e9e62f9 100644 --- a/scribble-core/src/main/java/org/scribble/del/ScribDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ScribDel.java @@ -41,6 +41,7 @@ // Parameterise by AstNode type? Would inhibit del sharing between types (but that's not currently needed) public interface ScribDel { + // "Transient" Env env(); void setEnv(Env env); // Non defensive diff --git a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java index 7fdf44fdf..fdd5b11e1 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -42,7 +42,7 @@ public class GChoiceDel extends ChoiceDel implements GCompoundInteractionNodeDel public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { GChoice gc = (GChoice) visited; - List blocks = gc.getBlocks().stream() + List blocks = gc.getBlockChildren().stream() .map(b -> (GProtocolBlock) ((InlineProtocolEnv) b.del().env()).getTranslation()).collect(Collectors.toList()); RoleNode subj = gc.subj.clone(inl.job.af); GChoice inlined = inl.job.af.GChoice(gc.getSource(), subj, blocks); @@ -72,7 +72,7 @@ public GChoice leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFCh // Enabled senders checked in GMessageTransferDel List all = - cho.getBlocks().stream().map(b -> (WFChoiceEnv) b.del().env()).collect(Collectors.toList()); + cho.getBlockChildren().stream().map(b -> (WFChoiceEnv) b.del().env()).collect(Collectors.toList()); if (checker.job.useOldWf) // **** { if (all.size() > 1) @@ -150,7 +150,7 @@ public GChoice leaveProjection(ScribNode parent, ScribNode child, Projector proj { GChoice gc = (GChoice) visited; List blocks = - gc.getBlocks().stream().map(b -> (LProtocolBlock) ((ProjectionEnv) b.del().env()).getProjection()).collect(Collectors.toList()); + gc.getBlockChildren().stream().map(b -> (LProtocolBlock) ((ProjectionEnv) b.del().env()).getProjection()).collect(Collectors.toList()); //gc.getBlocks().stream().map(b -> ((GProtocolBlockDel) b.del()).project(b, self)).collect(Collectors.toList()); LChoice projection = gc.project(proj.job.af, proj.peekSelf(), blocks); proj.pushEnv(proj.popEnv().setProjection(projection)); diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java index ba9656a43..8087fb0cc 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -65,7 +65,7 @@ public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, GDel GProtocolName fullname = (GProtocolName) mc.getVisibleProtocolDeclFullName(de.proto.toName()); Role rn = de.role.toName(); - ProtocolDecl gpd = disamb.job.getContext().getModule(fullname.getPrefix()).getProtocolDecl(fullname.getSimpleName()); + ProtocolDecl gpd = disamb.job.getContext().getModule(fullname.getPrefix()).getProtocolDeclChild(fullname.getSimpleName()); if (!gpd.header.roledecls.getRoles().contains(rn)) { throw new ScribbleException(de.role.getSource(), "Invalid delegation role: " + de); @@ -111,7 +111,7 @@ public void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, D } Set todo = new LinkedHashSet(); - ProtocolDecl targetgpd = checker.job.getContext().getModule(targetfullname.getPrefix()).getProtocolDecl(targetfullname.getSimpleName()); // target + ProtocolDecl targetgpd = checker.job.getContext().getModule(targetfullname.getPrefix()).getProtocolDeclChild(targetfullname.getSimpleName()); // target // FIXME: does this already contain transitive do-dependencies? But doesn't contain transitive delegation-dependencies..? Set init = ((GProtocolDeclDel) targetgpd.del()).getProtocolDeclContext().getDependencyMap().getDependencies() @@ -131,7 +131,7 @@ public void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, D { throw new ScribbleException(de.getSource(), "Recursive protocol dependencies not supported for delegation types: " + de); } - ProtocolDecl nextgpd = checker.job.getContext().getModule(targetfullname.getPrefix()).getProtocolDecl(nextfullname.getSimpleName()); + ProtocolDecl nextgpd = checker.job.getContext().getModule(targetfullname.getPrefix()).getProtocolDeclChild(nextfullname.getSimpleName()); Set tmp = ((GProtocolDeclDel) nextgpd.del()).getProtocolDeclContext().getDependencyMap().getDependencies() .values().stream().flatMap((v) -> v.keySet().stream()) diff --git a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java b/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java index d493b6699..c00f8354c 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java @@ -42,12 +42,12 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, Protoc { GInteractionSeq gis = (GInteractionSeq) visited; List gins = new LinkedList(); - for (GInteractionNode gi : gis.getInteractions()) + for (GInteractionNode gi : gis.getInteractNodeChildren()) { ScribNode inlined = ((InlineProtocolEnv) gi.del().env()).getTranslation(); if (inlined instanceof GInteractionSeq) // A do got inlined { - gins.addAll(((GInteractionSeq) inlined).getInteractions()); + gins.addAll(((GInteractionSeq) inlined).getInteractNodeChildren()); } else { @@ -70,14 +70,14 @@ public GInteractionSeq leaveProjection(ScribNode parent, ScribNode child, Projec { GInteractionSeq gis = (GInteractionSeq) visited; List lis = new LinkedList<>(); - for (GInteractionNode gi : gis.getInteractions()) // FIXME: rewrite using flatMap + for (GInteractionNode gi : gis.getInteractNodeChildren()) // FIXME: rewrite using flatMap { LNode ln = (LNode) ((ProjectionEnv) gi.del().env()).getProjection(); //LNode ln = ((GInteractionNodeDel) gi.del()).project(gi, self); // FIXME: won't work for do // FIXME: move node-specific projects to G nodes (not dels) and take child projections as params, bit like reconstruct if (ln instanceof LInteractionSeq) // Self comm sequence { - lis.addAll(((LInteractionSeq) ln).getInteractions()); + lis.addAll(((LInteractionSeq) ln).getInteractNodeChildren()); } else if (ln != null) // null is used for empty projection { @@ -127,9 +127,9 @@ public GInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, RecRem throws ScribbleException { GInteractionSeq gis = (GInteractionSeq) visited; - List gins = gis.getInteractions().stream().flatMap((gi) -> + List gins = gis.getInteractNodeChildren().stream().flatMap((gi) -> (gi instanceof GRecursion && rem.toRemove(((GRecursion) gi).recvar.toName())) - ? ((GRecursion) gi).getBlock().getInteractionSeq().getInteractions().stream() + ? ((GRecursion) gi).getBlock().getInteractSeqChild().getInteractNodeChildren().stream() : Stream.of(gi) ).collect(Collectors.toList()); return rem.job.af.GInteractionSeq(gis.getSource(), gins); diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index e223d6115..24486ec2d 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -120,7 +120,7 @@ public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, RoleColl Module root = proj.job.getContext().getModule(proj.getModuleContext().root); GProtocolDecl gpd = (GProtocolDecl) visited; - GProtocolHeader gph = gpd.getHeader(); + GProtocolHeader gph = gpd.getHeaderChild(); Role self = proj.peekSelf(); LProtocolNameNode pn = Projector.makeProjectedSimpleNameNode(af, gph.getSource(), gph.getDeclName(), self); @@ -147,7 +147,7 @@ protected Map> getGlobalProtocolDependencies(Role self) public void enterValidation(ScribNode parent, ScribNode child, GProtocolValidator checker) throws ScribbleException { GProtocolDecl gpd = (GProtocolDecl) child; - if (gpd.isAuxModifier()) + if (gpd.isAux()) { return; } @@ -184,7 +184,7 @@ private static void validateBySpin(Job job, GProtocolName fullname) throws Scrib { JobContext jc = job.getContext(); Module mod = jc.getModule(fullname.getPrefix()); - GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDecl(fullname.getSimpleName()); + GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDeclChild(fullname.getSimpleName()); List rs = gpd.header.roledecls.getRoles().stream() .sorted(Comparator.comparing(Role::toString)).collect(Collectors.toList()); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java b/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java index 1af4d110b..0b01a94bd 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java @@ -52,7 +52,7 @@ public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNo { Choice cho = (Choice) visited; List benvs = - cho.getBlocks().stream().map((b) -> (UnguardedChoiceDoEnv) b.del().env()).collect(Collectors.toList()); + cho.getBlockChildren().stream().map((b) -> (UnguardedChoiceDoEnv) b.del().env()).collect(Collectors.toList()); UnguardedChoiceDoEnv merged = checker.popEnv().mergeContexts(benvs); checker.pushEnv(merged); return (Choice) super.leaveUnguardedChoiceDoProjectionCheck(parent, child, checker, cho); // Done merge of children here, super does merge into parent @@ -62,7 +62,7 @@ public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNo public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, ScribNode child, ProjectedChoiceDoPruner pruner, ScribNode visited) throws ScribbleException { LChoice lc = (LChoice) visited; - List blocks = lc.getBlocks().stream().filter((b) -> !b.isEmpty()).collect(Collectors.toList()); + List blocks = lc.getBlockChildren().stream().filter((b) -> !b.isEmpty()).collect(Collectors.toList()); if (blocks.isEmpty()) { return null; @@ -74,10 +74,10 @@ public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, ScribNode child public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer, ScribNode visited) throws ScribbleException { LChoice lc = (LChoice) visited; - List blocks = lc.getBlocks(); + List blocks = lc.getBlockChildren(); Set subjs = blocks.stream() - .map((b) -> b.getInteractionSeq().getInteractions().get(0).inferLocalChoiceSubject(fixer)) + .map((b) -> b.getInteractSeqChild().getInteractNodeChildren().get(0).inferLocalChoiceSubject(fixer)) //.filter((r) -> !r.toString().equals(DummyProjectionRoleNode.DUMMY_PROJECTION_ROLE)) .collect(Collectors.toSet()); if (subjs.size() == 0) @@ -115,7 +115,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, Protoc { LChoice lc = (LChoice) visited; List blocks = - lc.getBlocks().stream().map((b) -> (LProtocolBlock) ((InlineProtocolEnv) b.del().env()).getTranslation()).collect(Collectors.toList()); + lc.getBlockChildren().stream().map((b) -> (LProtocolBlock) ((InlineProtocolEnv) b.del().env()).getTranslation()).collect(Collectors.toList()); RoleNode subj = lc.subj.clone(inl.job.af); LChoice inlined = inl.job.af.LChoice(lc.getSource(), subj, blocks); inl.pushEnv(inl.popEnv().setTranslation(inlined)); @@ -127,7 +127,7 @@ public LChoice leaveReachabilityCheck(ScribNode parent, ScribNode child, Reachab { LChoice cho = (LChoice) visited; List benvs = - cho.getBlocks().stream().map((b) -> (ReachabilityEnv) b.del().env()).collect(Collectors.toList()); + cho.getBlockChildren().stream().map((b) -> (ReachabilityEnv) b.del().env()).collect(Collectors.toList()); ReachabilityEnv merged = checker.popEnv().mergeForChoice(benvs); checker.pushEnv(merged); return (LChoice) LCompoundInteractionNodeDel.super.leaveReachabilityCheck(parent, child, checker, visited); // records the current checker Env to the current del; also pops and merges that env into the parent env @@ -144,7 +144,7 @@ public LChoice visitForFsmConversion(EGraphBuilder graph, LChoice child) { try { - for (LProtocolBlock block : child.getBlocks()) + for (LProtocolBlock block : child.getBlockChildren()) { graph.util.pushChoiceBlock(); block.accept(graph); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java index 38d4708b2..a7068bbfb 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java @@ -97,7 +97,7 @@ public LDo leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefI // Doing it off the global roledecls allows this to be done in one pass, but would probably be easier to split into two (e.g. 1st cache the proposed changes, 2nd write all changes -- the problem with a single pass is e.g. looking up the localdecl info while localdecls are being rewritten during the pass) // Could possibly factor out rolemap making with SubprotocolVisitor a bit, but there it maps to RoleNode and works off a root map GProtocolName source = ((LProjectionDeclDel) lpd.del()).getSourceProtocol(); - GProtocolDecl gpd = (GProtocolDecl) jc.getModule(source.getPrefix()).getProtocolDecl(source.getSimpleName()); + GProtocolDecl gpd = (GProtocolDecl) jc.getModule(source.getPrefix()).getProtocolDeclChild(source.getSimpleName()); Iterator roleargs = ld.roles.getDoArgs().iterator(); Map rolemap = gpd.header.roledecls.getRoles().stream().collect( Collectors.toMap(r -> r, r -> roleargs.next().val.toName())); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java b/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java index f0692a300..decc697f9 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java @@ -43,7 +43,7 @@ public class LInteractionSeqDel extends InteractionSeqDel public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, ScribNode child, ProjectedChoiceDoPruner pruner, ScribNode visited) throws ScribbleException { LInteractionSeq lc = (LInteractionSeq) visited; - List actions = lc.getInteractions().stream().filter((li) -> li != null).collect(Collectors.toList()); + List actions = lc.getInteractNodeChildren().stream().filter((li) -> li != null).collect(Collectors.toList()); return lc.reconstruct(actions); } @@ -53,12 +53,12 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, Protoc { LInteractionSeq lis = (LInteractionSeq) visited; List lins = new LinkedList(); - for (LInteractionNode li : lis.getInteractions()) + for (LInteractionNode li : lis.getInteractNodeChildren()) { ScribNode inlined = ((InlineProtocolEnv) li.del().env()).getTranslation(); if (inlined instanceof LInteractionSeq) { - lins.addAll(((LInteractionSeq) inlined).getInteractions()); + lins.addAll(((LInteractionSeq) inlined).getInteractNodeChildren()); } else { @@ -74,7 +74,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, Protoc public LInteractionSeq visitForReachabilityChecking(ReachabilityChecker checker, LInteractionSeq child) throws ScribbleException { List visited = new LinkedList<>(); - for (InteractionNode li : child.getInteractions()) + for (InteractionNode li : child.getInteractNodeChildren()) { ReachabilityEnv re = checker.peekEnv(); if (!re.isSequenceable()) @@ -107,19 +107,19 @@ public LInteractionSeq visitForFsmConversion(EGraphBuilder conv, LInteractionSeq child.getInteractions().get(i).accept(conv); } }*/ - for (int i = 0; i < child.getInteractions().size(); i++) + for (int i = 0; i < child.getInteractNodeChildren().size(); i++) { - if (i == child.getInteractions().size() - 1) + if (i == child.getInteractNodeChildren().size() - 1) { conv.util.setExit(exit); - child.getInteractions().get(i).accept(conv); + child.getInteractNodeChildren().get(i).accept(conv); } else { EState tmp = //conv.util.newState(Collections.emptySet()); conv.util.ef.newEState(Collections.emptySet()); conv.util.setExit(tmp); - child.getInteractions().get(i).accept(conv); + child.getInteractNodeChildren().get(i).accept(conv); conv.util.setEntry(conv.util.getExit()); // exit may not be tmp, entry/exit can be modified, e.g. continue } } @@ -139,9 +139,9 @@ public LInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, RecRem throws ScribbleException { LInteractionSeq lis = (LInteractionSeq) visited; - List lins = lis.getInteractions().stream().flatMap((li) -> + List lins = lis.getInteractNodeChildren().stream().flatMap((li) -> (li instanceof LRecursion && rem.toRemove(((LRecursion) li).recvar.toName())) - ? ((LRecursion) li).getBlock().getInteractionSeq().getInteractions().stream() + ? ((LRecursion) li).getBlock().getInteractSeqChild().getInteractNodeChildren().stream() : Stream.of(li) ).collect(Collectors.toList()); return rem.job.af.LInteractionSeq(lis.getSource(), lins); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java b/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java index ec0e46885..8813eec70 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java @@ -54,8 +54,8 @@ public ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, ScribNode child, List rds = lpd.header.roledecls.getDecls().stream().filter((rd) -> occs.contains(rd.getDeclName())).collect(Collectors.toList()); RoleDeclList rdl = fixer.job.af.RoleDeclList(lpd.header.roledecls.getSource(), rds); - LProtocolHeader tmp = lpd.getHeader(); - LProtocolHeader hdr = tmp.reconstruct(tmp.getNameNode(), rdl, tmp.paramdecls); + LProtocolHeader tmp = lpd.getHeaderChild(); + LProtocolHeader hdr = tmp.reconstruct(tmp.getNameNodeChild(), rdl, tmp.paramdecls); LProtocolDecl fixed = lpd.reconstruct(hdr, lpd.def); fixer.job.debugPrintln("\n[DEBUG] Projected " + getSourceProtocol() + " for " + getSelfRole() + ":\n" + fixed); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java b/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java index 801b8510b..a78d6cdc0 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java @@ -13,6 +13,7 @@ */ package org.scribble.del.local; +import org.scribble.ast.MessageNode; import org.scribble.ast.MessageSigNode; import org.scribble.ast.ScribNode; import org.scribble.ast.local.LReceive; @@ -28,32 +29,38 @@ public class LReceiveDel extends LMessageTransferDel { @Override - public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder builder, ScribNode visited) throws ScribbleException + public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, + EGraphBuilder builder, ScribNode visited) throws ScribbleException { LReceive lr = (LReceive) visited; - Role peer = lr.src.toName(); - MessageId mid = lr.msg.toMessage().getId(); - Payload payload = (lr.msg.isMessageSigNode()) // Hacky? - ? ((MessageSigNode) lr.msg).payloads.toPayload() + Role peer = lr.getSourceChild().toName(); + MessageNode msg = lr.getMessageNodeChild(); + MessageId mid = msg.toMessage().getId(); + Payload payload = (msg.isMessageSigNode()) // CHECKME: Hacky? + ? ((MessageSigNode) msg).payloads.toPayload() : Payload.EMPTY_PAYLOAD; - builder.util.addEdge(builder.util.getEntry(), builder.job.ef.newEReceive(peer, mid, payload), builder.util.getExit()); + builder.util.addEdge(builder.util.getEntry(), + builder.job.ef.newEReceive(peer, mid, payload), builder.util.getExit()); //builder.builder.addEdge(builder.builder.getEntry(), Receive.get(peer, mid, payload), builder.builder.getExit()); return (LReceive) super.leaveEGraphBuilding(parent, child, builder, lr); } @Override - public void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) + public void enterProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer) { - fixer.setChoiceSubject(((LReceive) child).src.toName()); + fixer.setChoiceSubject(((LReceive) child).getSourceChild().toName()); } @Override - public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker) throws ScribbleException + public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, + ScribNode child, UnguardedChoiceDoProjectionChecker checker) + throws ScribbleException { super.enterUnguardedChoiceDoProjectionCheck(parent, child, checker); LReceive lr = (LReceive) child; UnguardedChoiceDoEnv env = checker.popEnv(); - env = env.setChoiceSubject(lr.src.toName()); + env = env.setChoiceSubject(lr.getSourceChild().toName()); checker.pushEnv(env); } } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java b/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java index 9433e1a56..34d0388a9 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java @@ -35,7 +35,7 @@ public class LSendDel extends LMessageTransferDel public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder builder, ScribNode visited) throws ScribbleException { LSend ls = (LSend) visited; - List dests = ls.getDestinations(); + List dests = ls.getDestinationChildren(); if (dests.size() > 1) { throw new ScribbleException("[TODO] EFSM building for multicast not supported: " + ls); diff --git a/scribble-core/src/main/java/org/scribble/main/Job.java b/scribble-core/src/main/java/org/scribble/main/Job.java index a3745c880..025f522bd 100644 --- a/scribble-core/src/main/java/org/scribble/main/Job.java +++ b/scribble-core/src/main/java/org/scribble/main/Job.java @@ -199,7 +199,7 @@ public Map getProjections(GProtocolName fullname, Role ro { Module root = this.jcontext.getProjection(fullname, role); Map> dependencies = - ((LProtocolDeclDel) root.getLocalProtocolDecls().get(0).del()) + ((LProtocolDeclDel) root.getLProtoDeclChildren().get(0).del()) .getProtocolDeclContext().getDependencyMap().getDependencies().get(role); // Can ignore Set for projections (is singleton), as each projected proto is a dependency only for self (implicit in the protocoldecl) return dependencies.keySet().stream().collect( diff --git a/scribble-core/src/main/java/org/scribble/main/JobContext.java b/scribble-core/src/main/java/org/scribble/main/JobContext.java index c89b1496c..e95edf4d2 100644 --- a/scribble-core/src/main/java/org/scribble/main/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/main/JobContext.java @@ -172,7 +172,7 @@ public void addProjections(Map> projections) private void addProjection(Module mod) { - LProtocolName lpn = (LProtocolName) mod.getProtocolDecls().get(0).getFullMemberName(mod); + LProtocolName lpn = (LProtocolName) mod.getProtoDeclChildren().get(0).getFullMemberName(mod); this.projected.put(lpn, mod); } @@ -236,7 +236,7 @@ public SGraph getSGraph(GProtocolName fullname) throws ScribbleException SGraph graph = this.fairSGraphs.get(fullname); if (graph == null) { - GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()).getProtocolDecl(fullname.getSimpleName()); + GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()).getProtocolDeclChild(fullname.getSimpleName()); Map egraphs = getEGraphsForSGraphBuilding(fullname, gpd, true); boolean explicit = gpd.modifiers.contains(GProtocolDecl.Modifiers.EXPLICIT); //graph = SGraph.buildSGraph(egraphs, explicit, this.job, fullname); @@ -266,7 +266,7 @@ public SGraph getUnfairSGraph(GProtocolName fullname) throws ScribbleException SGraph graph = this.unfairSGraphs.get(fullname); if (graph == null) { - GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()).getProtocolDecl(fullname.getSimpleName()); + GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()).getProtocolDeclChild(fullname.getSimpleName()); Map egraphs = getEGraphsForSGraphBuilding(fullname, gpd, false); boolean explicit = gpd.modifiers.contains(GProtocolDecl.Modifiers.EXPLICIT); //graph = SGraph.buildSGraph(this.job, fullname, this.job.createInitialSConfig(job, egraphs, explicit)); diff --git a/scribble-core/src/main/java/org/scribble/util/ScribUtil.java b/scribble-core/src/main/java/org/scribble/util/ScribUtil.java index ba0ed752b..97679b62d 100644 --- a/scribble-core/src/main/java/org/scribble/util/ScribUtil.java +++ b/scribble-core/src/main/java/org/scribble/util/ScribUtil.java @@ -37,7 +37,8 @@ public static C checkNodeClassEquality(C c, ScribNode n) { if (!c.getClass().equals(n.getClass())) { - throw new RuntimeException("Node class not equal: " + c.getClass() + ", " + n.getClass()); + throw new RuntimeException( + "Node class not equal: " + c.getClass() + ", " + n.getClass()); } @SuppressWarnings("unchecked") C tmp = (C) n; @@ -49,16 +50,19 @@ public static C castNodeByClass(C cast, ScribNode n) { if (!cast.getClass().isAssignableFrom(n.getClass())) { - throw new RuntimeException("Node class cast error: " + cast.getClass() + ", " + n.getClass()); + throw new RuntimeException( + "Node class cast error: " + cast.getClass() + ", " + n.getClass()); } @SuppressWarnings("unchecked") C tmp = (C) n; return tmp; } - public static List cloneList(AstFactory af, List ns) + public static List cloneList(AstFactory af, + List ns) { - return ns.stream().map(n -> checkNodeClassEquality(n, n.clone(af))).collect(Collectors.toList()); + return ns.stream().map(n -> checkNodeClassEquality(n, // n.clone(af))) + n.clone())).collect(Collectors.toList()); } public static T handleLambdaScribbleException(Callable c) @@ -74,17 +78,20 @@ public static T handleLambdaScribbleException(Callable c) } // Returns [ stdout, stderr ] - public static String[] runProcess(String... cmdAndArgs) throws ScribbleException + public static String[] runProcess(String... cmdAndArgs) + throws ScribbleException { - try - { + try + { ProcessBuilder pb = new ProcessBuilder(cmdAndArgs); Process p = pb.start(); p.waitFor(); InputStream is = p.getInputStream(), eis = p.getErrorStream(); - InputStreamReader isr = new InputStreamReader(is), eisr = new InputStreamReader(eis); - BufferedReader br = new BufferedReader(isr), ebr = new BufferedReader(eisr); + InputStreamReader isr = new InputStreamReader(is); + InputStreamReader eisr = new InputStreamReader(eis); + BufferedReader br = new BufferedReader(isr); + BufferedReader ebr = new BufferedReader(eisr); String stdout = "", stderr = "", line; while ((line = br.readLine()) != null) { @@ -103,7 +110,8 @@ public static String[] runProcess(String... cmdAndArgs) throws ScribbleException } // Warning: doesn't check if file exists - public static void writeToFile(String path, String text) throws ScribbleException + public static void writeToFile(String path, String text) + throws ScribbleException { File file = new File(path); File parent = file.getParentFile(); diff --git a/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java b/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java index 5aaa86dc4..ff1a71b3c 100644 --- a/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java @@ -111,7 +111,7 @@ private ScribNode unfold(Recursion rec) throws Scrib //RecVarNode dummy = rec.recvar.clone(); ScribNode n = rec.reconstruct(dummy, ScribUtil.checkNodeClassEquality(pb, pb.accept(this))); // Returning a rec because it needs to go into the InteractionSeq // reconstruct makes sense here, actually reconstructing this rec with new label but same block (and keep the same del etc)*/ - InteractionSeq seq = pb.getInteractionSeq(); + InteractionSeq seq = pb.getInteractSeqChild(); ScribNode n = seq.accept(this); this.recsToUnfold.remove(rv); return n; diff --git a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java index ba3ea0491..67ac4063c 100644 --- a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java @@ -222,7 +222,7 @@ private void pushSubprotocolSig(ProtocolName fullname, List roleargs, L private void pushNameMaps(ProtocolName fullname, Do doo) { - ProtocolDecl pd = this.job.getContext().getModule(fullname.getPrefix()).getProtocolDecl(fullname.getSimpleName()); + ProtocolDecl pd = this.job.getContext().getModule(fullname.getPrefix()).getProtocolDeclChild(fullname.getSimpleName()); this.rolemaps.push(makeRoleSubsMap(this.rolemaps.get(0), doo.roles, pd.header.roledecls)); this.argmaps.push(makeNonRoleSubsMap(this.argmaps.get(0), doo.args, pd.header.paramdecls)); } diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java index 551258e1d..dbfea08c5 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java @@ -53,8 +53,8 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleExcepti { LChoice lc = (LChoice) parent; LProtocolBlock lb = (LProtocolBlock) child; - LInteractionSeq lis = lb.getInteractionSeq(); - List ins = lis.getInteractions(); + LInteractionSeq lis = lb.getInteractSeqChild(); + List ins = lis.getInteractNodeChildren(); if (ins.get(0) instanceof LDo) // Unlike GRecursion.prune, to-prune "do" could be followed by a continuation? { JobContext jc = this.job.getContext(); diff --git a/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java b/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java index 571e78ca0..63fc803cb 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java @@ -71,9 +71,9 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleExcepti private ScribNode visitOverrideForLDoPruning(ScribNode parent, LChoice lc) throws ScribbleException { - for (LProtocolBlock b : lc.getBlocks()) + for (LProtocolBlock b : lc.getBlockChildren()) { - LInteractionNode in = b.getInteractionSeq().getInteractions().get(0); + LInteractionNode in = b.getInteractSeqChild().getInteractNodeChildren().get(0); if (in instanceof LDo) { LDo ld = (LDo) in; diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java b/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java index 803d854f9..de4de810b 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java @@ -40,7 +40,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleExcepti if (child instanceof GProtocolDecl) { GProtocolDecl gpd = (GProtocolDecl) child; - if (!gpd.isAuxModifier() && gpd.isExplicitModifier()) + if (!gpd.isAux() && gpd.isExplicit()) { Module mod = (Module) parent; GProtocolName gpn = gpd.getFullMemberName(mod); diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java b/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java index 011f1f11e..5d5420ba7 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java @@ -54,7 +54,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleExcepti if (child instanceof GProtocolDecl) { GProtocolDecl gpd = (GProtocolDecl) child; - if (gpd.isAuxModifier()) + if (gpd.isAux()) { return child; // bypass aux protocols // FIXME: integrate bypass functionality into made enter/visit/leave pattern } diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java index 659e5e239..2dbecaa13 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java @@ -19,6 +19,7 @@ import org.antlr.runtime.tree.CommonErrorNode; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; +import org.scribble.ast.Module; import org.scribble.ast.ScribNode; import org.scribble.parser.scribble.ScribbleAntlrConstants.AntlrNodeType; import org.scribble.parser.scribble.ast.AntlrDataTypeDecl; @@ -68,7 +69,8 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException { case PAYLOAD: return AntlrPayloadElemList.parsePayloadElemList(this, ct, af); - case MODULE: return AntlrModule.parseModule(this, ct, af); + case MODULE: //return AntlrModule.parseModule(this, ct, af); + return (Module) ct; case MODULEDECL: return AntlrModuleDecl.parseModuleDecl(this, ct, af); case MESSAGESIGNATUREDECL: return AntlrMessageSigDecl.parseMessageSigDecl(this, ct, af); case PAYLOADTYPEDECL: return AntlrDataTypeDecl.parseDataTypeDecl(this, ct, af); diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index de43d0c0f..56d60a9a2 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -18,8 +18,8 @@ import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.parser.scribble.ast.tree.MyCommonTree; -import org.scribble.type.name.ModuleName; +// get/setType don't seem to be really used public class ScribTreeAdaptor extends CommonTreeAdaptor { private final AstFactory f = new AstFactoryImpl(); @@ -46,6 +46,12 @@ public Object create(Token t) return new Module(t); case "MODULEDECL": //return this.f.ModuleDecl(empty, null); return new ModuleDecl(t); + case "MODULENAME": //return this.f.Q + //return new ModuleNameNode(t); + return new ModuleNameNode(t); /*.. HERE ambigname -- or qualifiedname? (ambigname currently singleton name) + -- or modulename just as identifiers? -- ANTLR uses every (leaf) token as singleton node + -- AntlrTokenTree? -- i.e. CommonTree (wrapper for Token)*/ + case "GLOBALPROTOCOLDECL": //return this.f.GProtocolDecl(empty, Collections.emptyList(), null, null); return new GProtocolDecl(t); case "GLOBALPROTOCOLHEADER": //return this.f.GProtocolHeader(empty, null, null, null); @@ -60,20 +66,16 @@ public Object create(Token t) return new GProtocolDef(t); case "GLOBALPROTOCOLBLOCK": //return this.f.GProtocolBlock(empty, null); return new GProtocolBlock(t); + case "GLOBALINTERACTIONSEQUENCE": //return this.f.GInteractionSeq(empty, Collections.emptyList()); return new GInteractionSeq(t); case "GLOBALMESSAGETRANSFER": //return this.f.GMessageTransfer(empty, null, null, Collections.emptyList()); return new GMessageTransfer(t); - //case "QUALIFIEDNAME": //return this.f.Q - case "MODULENAME": //return this.f.Q - //return new ModuleNameNode(t); - return new ModuleNameNode(t); /*.. HERE ambigname -- or qualifiedname? (ambigname currently singleton name) - -- or modulename just as identifiers? -- ANTLR uses every (leaf) token as singleton node - -- AntlrTokenTree? -- i.e. CommonTree (wrapper for Token)*/ case "MESSAGESIGNATURE": //return this.f.Me return new MessageSigNameNode(t); case "PAYLOAD": return new MyCommonTree(t); // FIXME: placeholder for deleg, qualified or ambig + //case "QUALIFIEDNAME": //return this.f.Q /*case tmp case Test case Proto1 diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 7ec07bbce..8331f55b2 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -34,10 +34,10 @@ module tmp.Test; -global protocol Proto1(role A, role B) +/*global protocol Proto1(role A, role B) { 1() from A to B; -} +}*/ /* From 8f90f05b3420c96f160ca0a430714fa897e0c49d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 24 Jan 2019 19:10:00 +0000 Subject: [PATCH 077/539] Continued WIP. --- .../java/org/scribble/ast/ConnectAction.java | 118 ++++++++++++++++++ .../org/scribble/ast/ConnectionAction.java | 63 ---------- .../org/scribble/ast/DisconnectAction.java | 99 +++++++++++++++ .../org/scribble/ast/MessageTransfer.java | 12 +- .../org/scribble/ast/global/GConnect.java | 110 ++++++++++------ .../org/scribble/ast/global/GDisconnect.java | 92 +++++++++----- .../org/scribble/ast/global/GRecursion.java | 4 +- .../java/org/scribble/ast/global/GWrap.java | 73 +++++++---- .../java/org/scribble/ast/local/LAccept.java | 101 +++++++++------ .../scribble/ast/local/LConnectionAction.java | 32 ++++- .../org/scribble/ast/local/LDisconnect.java | 116 +++++++++++------ .../java/org/scribble/ast/local/LRequest.java | 105 ++++++++++------ .../org/scribble/ast/local/LWrapClient.java | 98 +++++++++------ .../org/scribble/ast/local/LWrapServer.java | 86 ++++++++----- .../org/scribble/del/ConnectionActionDel.java | 12 +- 15 files changed, 764 insertions(+), 357 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/ast/ConnectAction.java delete mode 100644 scribble-core/src/main/java/org/scribble/ast/ConnectionAction.java create mode 100644 scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java b/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java new file mode 100644 index 000000000..e5d432d64 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java @@ -0,0 +1,118 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast; + +import org.antlr.runtime.Token; +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.ScribDel; +import org.scribble.main.ScribbleException; +import org.scribble.type.kind.ProtocolKind; +import org.scribble.visit.AstVisitor; + +// TODO: factor with MessageTransfer +public abstract class ConnectAction extends SimpleInteractionNode +{ + // ScribTreeAdaptor#create constructor + public ConnectAction(Token t) + { + super(t); + this.src = null; + this.msg = null; + this.dest = null; + } + + // Tree#dupNode constructor + public ConnectAction(ConnectAction node) + { + super(node); + this.src = null; + this.msg = null; + this.dest = null; + } + + protected boolean isUnitMessage() + { + if (!this.msg.isMessageSigNode()) + { + return false; + } + MessageSigNode msn = (MessageSigNode) this.msg; + return msn.op.isEmpty() && msn.payloads.isEmpty(); + } + + public abstract ConnectAction dupNode(); + + public MessageNode getMessageNodeChild() + { + return (MessageNode) getChild(0); + } + + public RoleNode getSourceChild() + { + return (RoleNode) getChild(1); + } + + public RoleNode getDestinationChild() + { + return (RoleNode) getChild(2); + } + + public ConnectAction reconstruct(RoleNode src, MessageNode msg, RoleNode dest) + { + ConnectAction ca = dupNode(); + ca.addChild(msg); + ca.addChild(src); + ca.addChild(dest); + ScribDel del = del(); + ca.setDel(del); // No copy + return ca; + } + + @Override + public ConnectAction visitChildren(AstVisitor nv) + throws ScribbleException + { + RoleNode src = (RoleNode) visitChild(getSourceChild(), nv); + MessageNode msg = (MessageNode) visitChild(getMessageNodeChild(), nv); + RoleNode dest = (RoleNode) visitChild(getDestinationChild(), nv); + return reconstruct(src, msg, dest); + } + + @Override + public abstract String toString(); + + + + + + + + + + + + public final RoleNode src; + public final MessageNode msg; + public final RoleNode dest; + + protected ConnectAction(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) + //protected ConnectionAction(RoleNode src, RoleNode dest) + { + super(source); + this.src = src; + this.msg = msg; + this.dest = dest; + } +} diff --git a/scribble-core/src/main/java/org/scribble/ast/ConnectionAction.java b/scribble-core/src/main/java/org/scribble/ast/ConnectionAction.java deleted file mode 100644 index bbdb11151..000000000 --- a/scribble-core/src/main/java/org/scribble/ast/ConnectionAction.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.ScribbleException; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.visit.AstVisitor; - -// FIXME: factor with MessageTransfer -public abstract class ConnectionAction extends SimpleInteractionNode -{ - public final RoleNode src; - public final MessageNode msg; - public final RoleNode dest; - - protected ConnectionAction(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) - //protected ConnectionAction(RoleNode src, RoleNode dest) - { - super(source); - this.src = src; - this.msg = msg; - this.dest = dest; - } - - public abstract ConnectionAction reconstruct(RoleNode src, MessageNode msg, RoleNode dest); - //public abstract ConnectionAction reconstruct(RoleNode src, RoleNode dest); - - @Override - public ConnectionAction visitChildren(AstVisitor nv) throws ScribbleException - { - RoleNode src = (RoleNode) visitChild(this.src, nv); - MessageNode msg = (MessageNode) visitChild(this.msg, nv); - RoleNode dest = (RoleNode) visitChild(this.dest, nv); - return reconstruct(src, msg, dest); - //return reconstruct(src, dest); - } - - @Override - public abstract String toString(); - - protected boolean isUnitMessage() - { - if (!this.msg.isMessageSigNode()) - { - return false; - } - MessageSigNode msn = (MessageSigNode) this.msg; - return msn.op.isEmpty() && msn.payloads.isEmpty(); - } -} diff --git a/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java new file mode 100644 index 000000000..e73db018e --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java @@ -0,0 +1,99 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast; + +import org.antlr.runtime.Token; +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.ScribDel; +import org.scribble.main.ScribbleException; +import org.scribble.type.kind.ProtocolKind; +import org.scribble.visit.AstVisitor; + +// (G)Disconnect is symmetric (send/receive asymmetric/async; request/accept asymmetric/sync; (g)disconnect symmetric/async) +public abstract class DisconnectAction + extends SimpleInteractionNode +{ + // ScribTreeAdaptor#create constructor + public DisconnectAction(Token t) + { + super(t); + this.left = null; + this.right = null; + } + + // Tree#dupNode constructor + public DisconnectAction(DisconnectAction node) + { + super(node); + this.left = null; + this.right = null; + } + + public abstract DisconnectAction dupNode(); + + public RoleNode getLeftChild() + { + return (RoleNode) getChild(0); + } + + public RoleNode getRightChild() + { + return (RoleNode) getChild(1); + } + + public DisconnectAction reconstruct(RoleNode self, RoleNode peer) + { + DisconnectAction da = dupNode(); + da.addChild(self); + da.addChild(peer); + ScribDel del = del(); + da.setDel(del); // No copy + return da; + } + + @Override + public DisconnectAction visitChildren(AstVisitor nv) + throws ScribbleException + { + RoleNode src = (RoleNode) visitChild(getLeftChild(), nv); + RoleNode dest = (RoleNode) visitChild(getRightChild(), nv); + return reconstruct(src, dest); + } + + @Override + public abstract String toString(); + + + + + + + + + + + + + + public final RoleNode left; + public final RoleNode right; + + protected DisconnectAction(CommonTree source, RoleNode src, RoleNode dest) + { + super(source); + this.left = src; + this.right = dest; + } +} diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java index a5958f9ef..13faddb9e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java @@ -72,12 +72,16 @@ public final List getDestinationRoles() .collect(Collectors.toList()); } - public MessageTransfer reconstruct(RoleNode src, MessageNode msg, List dests) + public MessageTransfer reconstruct(RoleNode src, MessageNode msg, + List dests) { - MessageTransfer pd = dupNode(); + MessageTransfer mt = dupNode(); + mt.addChild(msg); + mt.addChild(src); + mt.addChildren(dests); ScribDel del = del(); - pd.setDel(del); // No copy - return pd; + mt.setDel(del); // No copy + return mt; } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java b/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java index 76d071700..6fd91c01f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java @@ -13,9 +13,10 @@ */ package org.scribble.ast.global; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.ConnectionAction; +import org.scribble.ast.ConnectAction; import org.scribble.ast.Constants; import org.scribble.ast.MessageNode; import org.scribble.ast.local.LNode; @@ -25,59 +26,59 @@ import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; -public class GConnect extends ConnectionAction implements GSimpleInteractionNode +// TODO: make GConnectionAction and factor this class with GWrap (cf. LConnectionAction) +public class GConnect extends ConnectAction + implements GSimpleInteractionNode { - public GConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) - //public GConnect(RoleNode src, RoleNode dest) + // ScribTreeAdaptor#create constructor + public GConnect(Token t) { - super(source, src, msg, dest); - //super(src, dest); + super(t); + } + + // Tree#dupNode constructor + public GConnect(GConnect node) + { + super(node); } public LNode project(AstFactory af, Role self) { - Role srcrole = this.src.toName(); - Role destrole = this.dest.toName(); - LNode projection = null; - if (srcrole.equals(self) || destrole.equals(self)) + Role src = this.src.toName(); + Role dest = this.dest.toName(); + LNode proj = null; + if (src.equals(self) || dest.equals(self)) { - if (srcrole.equals(destrole)) + if (src.equals(dest)) { - throw new RuntimeException("Shouldn't get in here (self-connection): " + this); + throw new RuntimeException( + "Shouldn't get in here (self-connection): " + this); } - RoleNode src = (RoleNode) af.SimpleNameNode(this.src.getSource(), RoleKind.KIND, this.src.toName().toString()); // clone? - MessageNode msg = (MessageNode) this.msg; // FIXME: need namespace prefix update? - RoleNode dest = (RoleNode) af.SimpleNameNode(this.dest.getSource(), RoleKind.KIND, this.dest.toName().toString()); - if (srcrole.equals(self)) + RoleNode srcNode = getSourceChild(); + RoleNode destNode = getDestinationChild(); + RoleNode srcNode1 = (RoleNode) af.SimpleNameNode(srcNode.getSource(), + RoleKind.KIND, srcNode.toName().toString()); // clone? + MessageNode msgNode1 = (MessageNode) this.msg; // FIXME: need namespace prefix update? + RoleNode destNode1 = (RoleNode) af.SimpleNameNode(destNode.getSource(), + RoleKind.KIND, destNode.toName().toString()); + if (src.equals(self)) { - projection = af.LConnect(this.source, src, msg, dest); + proj = af.LConnect(this.source, srcNode1, msgNode1, destNode1); //projection = AstFactoryImpl.FACTORY.LConnect(src, dest); // src and dest (not self and peer) } - if (destrole.equals(self)) + if (dest.equals(self)) { - projection = af.LAccept(this.source, src, msg, dest); + proj = af.LAccept(this.source, srcNode1, msgNode1, destNode1); //projection = AstFactoryImpl.FACTORY.LAccept(src, dest); } } - return projection; - } - - @Override - protected GConnect copy() - { - return new GConnect(this.source, this.src, this.msg, this.dest); - //return new GConnect(this.src, this.dest); + return proj; } - @Override - public GConnect clone(AstFactory af) + public GConnect dupNode() { - RoleNode src = this.src.clone(af); - MessageNode msg = this.msg.clone(af); - RoleNode dest = this.dest.clone(af); - return af.GConnect(this.source, src, msg, dest); - //return AstFactoryImpl.FACTORY.GConnect(src, dest); + return new GConnect(this); } @Override @@ -94,7 +95,8 @@ public GConnect reconstruct(RoleNode src, MessageNode msg, RoleNode dest) @Override public String toString() { - return (isUnitMessage() ? "" : this.msg + " ") + Constants.CONNECT_KW + " " + this.src + " " + Constants.TO_KW + " " + this.dest + ";"; + return (isUnitMessage() ? "" : this.msg + " ") + Constants.CONNECT_KW + " " + + this.src + " " + Constants.TO_KW + " " + this.dest + ";"; //return Constants.CONNECT_KW + " " + this.src + " " + Constants.TO_KW + " " + this.dest + ";"; } @@ -104,4 +106,42 @@ public Global getKind() { return GSimpleInteractionNode.super.getKind(); }*/ + + + + + + + + + + + + + + + + public GConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) + //public GConnect(RoleNode src, RoleNode dest) + { + super(source, src, msg, dest); + //super(src, dest); + } + + /*@Override + protected GConnect copy() + { + return new GConnect(this.source, this.src, this.msg, this.dest); + //return new GConnect(this.src, this.dest); + } + + @Override + public GConnect clone(AstFactory af) + { + RoleNode src = this.src.clone(af); + MessageNode msg = this.msg.clone(af); + RoleNode dest = this.dest.clone(af); + return af.GConnect(this.source, src, msg, dest); + //return AstFactoryImpl.FACTORY.GConnect(src, dest); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GDisconnect.java b/scribble-core/src/main/java/org/scribble/ast/global/GDisconnect.java index 315103fd1..224af06fd 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GDisconnect.java @@ -13,51 +13,90 @@ */ package org.scribble.ast.global; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.ConnectionAction; import org.scribble.ast.Constants; -import org.scribble.ast.MessageNode; -import org.scribble.ast.MessageSigNode; +import org.scribble.ast.DisconnectAction; import org.scribble.ast.local.LNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.ScribDel; import org.scribble.type.kind.Global; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; -public class GDisconnect extends ConnectionAction implements GSimpleInteractionNode +public class GDisconnect extends DisconnectAction implements GSimpleInteractionNode { + // ScribTreeAdaptor#create constructor + public GDisconnect(Token t) + { + super(t); + } - //public GDisconnect(CommonTree source, RoleNode src, RoleNode dest) - public GDisconnect(CommonTree source, MessageSigNode unit, RoleNode src, RoleNode dest) + // Tree#dupNode constructor + public GDisconnect(GDisconnect node) + { + super(node); + } + + @Override + public GDisconnect dupNode() { - super(source, src, unit, dest); + return new GDisconnect(this); } public LNode project(AstFactory af, Role self) { - Role srcrole = this.src.toName(); - Role destrole = this.dest.toName(); - LNode projection = null; - if (srcrole.equals(self) || destrole.equals(self)) + RoleNode leftNode = this.getLeftChild(); + RoleNode rightNode = this.getRightChild(); + Role left = leftNode.toName(); + Role right = rightNode.toName(); + LNode proj = null; + if (left.equals(self) || right.equals(self)) { - RoleNode src = (RoleNode) af.SimpleNameNode(this.src.getSource(), RoleKind.KIND, this.src.toName().toString()); // clone? - RoleNode dest = (RoleNode) af.SimpleNameNode(this.dest.getSource(), RoleKind.KIND, this.dest.toName().toString()); - if (srcrole.equals(self)) + RoleNode leftNode1 = (RoleNode) af.SimpleNameNode(leftNode.getSource(), + RoleKind.KIND, leftNode.toName().toString()); // clone? + RoleNode rightNode1 = (RoleNode) af.SimpleNameNode(rightNode.getSource(), + RoleKind.KIND, rightNode.toName().toString()); + if (left.equals(self)) { - projection = af.LDisconnect(this.source, src, dest); + proj = af.LDisconnect(this.source, leftNode1, rightNode1); } - if (destrole.equals(self)) + if (right.equals(self)) { - projection = af.LDisconnect(this.source, dest, src); + proj = af.LDisconnect(this.source, rightNode1, leftNode1); } } - return projection; + return proj; } - @Override + public String toString() + { + return Constants.DISCONNECT_KW + " " + getLeftChild() + + " " + Constants.TO_KW + " " + getRightChild() + ";"; + } + + + + + + + + + + + + + + + + //public GDisconnect(CommonTree source, RoleNode src, RoleNode dest) + public GDisconnect(CommonTree source, RoleNode left, RoleNode right) + { + super(source, left, right); + } + + /*@Override protected GDisconnect copy() { return new GDisconnect(this.source, (MessageSigNode) this.msg, this.src, this.dest); @@ -79,18 +118,5 @@ public GDisconnect reconstruct(RoleNode src, MessageNode msg, RoleNode dest) GDisconnect gd = new GDisconnect(this.source, (MessageSigNode) this.msg, src, dest); gd = (GDisconnect) gd.del(del); return gd; - } - - @Override - public String toString() - { - return Constants.DISCONNECT_KW + " " + this.src + " " + Constants.TO_KW + " " + this.dest + ";"; - } - - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public Global getKind() - { - return GSimpleInteractionNode.super.getKind(); }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java index 689391f38..b139020df 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java @@ -22,7 +22,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.ConnectionAction; +import org.scribble.ast.ConnectAction; import org.scribble.ast.Do; import org.scribble.ast.MessageTransfer; import org.scribble.ast.ProtocolBlock; @@ -91,7 +91,7 @@ protected static LProtocolBlock prune(AstFactory af, LProtocolBlock block, Set || lin instanceof Do || lin instanceof ConnectionAction) + else if (lin instanceof MessageTransfer || lin instanceof Do || lin instanceof ConnectAction) { return block; } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GWrap.java b/scribble-core/src/main/java/org/scribble/ast/global/GWrap.java index 94fbba094..0e630284a 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GWrap.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GWrap.java @@ -13,26 +13,30 @@ */ package org.scribble.ast.global; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.ConnectionAction; +import org.scribble.ast.ConnectAction; import org.scribble.ast.Constants; -import org.scribble.ast.MessageNode; import org.scribble.ast.MessageSigNode; import org.scribble.ast.local.LNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.ScribDel; import org.scribble.type.kind.Global; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; -public class GWrap extends ConnectionAction implements GSimpleInteractionNode +public class GWrap extends ConnectAction implements GSimpleInteractionNode { + // ScribTreeAdaptor#create constructor + public GWrap(Token t) + { + super(t); + } - //public GWrap(CommonTree source, RoleNode src, RoleNode dest) - public GWrap(CommonTree source, MessageSigNode unit, RoleNode src, RoleNode dest) + // Tree#dupNode constructor + public GWrap(GWrap node) { - super(source, src, unit, dest); + super(node); } public LNode project(AstFactory af, Role self) @@ -42,21 +46,55 @@ public LNode project(AstFactory af, Role self) LNode projection = null; if (srcrole.equals(self) || destrole.equals(self)) { - RoleNode src = (RoleNode) af.SimpleNameNode(this.src.getSource(), RoleKind.KIND, this.src.toName().toString()); // clone? - RoleNode dest = (RoleNode) af.SimpleNameNode(this.dest.getSource(), RoleKind.KIND, this.dest.toName().toString()); + RoleNode srcNode = this.src; + RoleNode destNode = this.dest; + RoleNode srcNode1 = (RoleNode) af.SimpleNameNode(srcNode.getSource(), + RoleKind.KIND, srcNode.toName().toString()); // clone? + RoleNode destNode1 = (RoleNode) af.SimpleNameNode(destNode.getSource(), + RoleKind.KIND, destNode.toName().toString()); if (srcrole.equals(self)) { - projection = af.LWrapClient(this.source, src, dest); // src and dest (not self and peer) + projection = af.LWrapClient(this.source, srcNode1, destNode1); // src and dest (not self and peer) } if (destrole.equals(self)) { - projection = af.LWrapServer(this.source, src, dest); + projection = af.LWrapServer(this.source, srcNode1, destNode1); } } return projection; } + + public GWrap dupNode() + { + return new GWrap(this); + } @Override + public String toString() + { + return Constants.WRAP_KW + " " + getSourceChild() + " " + Constants.TO_KW + + " " + getDestinationChild() + ";"; + } + + + + + + + + + + + + + + //public GWrap(CommonTree source, RoleNode src, RoleNode dest) + public GWrap(CommonTree source, MessageSigNode unit, RoleNode src, RoleNode dest) + { + super(source, src, unit, dest); + } + + /*@Override protected GWrap copy() { return new GWrap(this.source, (MessageSigNode) this.msg, this.src, this.dest); @@ -78,18 +116,5 @@ public GWrap reconstruct(RoleNode src, MessageNode msg, RoleNode dest) GWrap gc = new GWrap(this.source, (MessageSigNode) this.msg, src, dest); //this.msg); gc = (GWrap) gc.del(del); return gc; - } - - @Override - public String toString() - { - return Constants.WRAP_KW + " " + this.src + " " + Constants.TO_KW + " " + this.dest + ";"; - } - - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public Global getKind() - { - return GSimpleInteractionNode.super.getKind(); }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java b/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java index 4979a34bb..911537ba7 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java @@ -16,13 +16,12 @@ import java.util.Collections; import java.util.Set; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.Constants; import org.scribble.ast.MessageNode; -import org.scribble.ast.ScribNodeBase; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.ScribDel; import org.scribble.main.RuntimeScribbleException; import org.scribble.main.ScribbleException; import org.scribble.type.Message; @@ -31,76 +30,102 @@ public class LAccept extends LConnectionAction implements LSimpleInteractionNode { - public LAccept(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) - //public LAccept(RoleNode src, RoleNode dest) + // ScribTreeAdaptor#create constructor + public LAccept(Token t) { - super(source, src, msg, dest); - //super(src, dest); + super(t); } - @Override - protected ScribNodeBase copy() + // Tree#dupNode constructor + public LAccept(LAccept node) { - return new LAccept(this.source, this.src, this.msg, this.dest); - //return new LAccept(this.src, this.dest); + super(node); } @Override - public LAccept clone(AstFactory af) + public LAccept dupNode() { - RoleNode src = this.src.clone(af); - MessageNode msg = this.msg.clone(af); - RoleNode dest = this.dest.clone(af); - return af.LAccept(this.source, src, msg, dest); - //return AstFactoryImpl.FACTORY.LAccept(src, dest); + return new LAccept(this); } @Override - public LAccept reconstruct(RoleNode src, MessageNode msg, RoleNode dest) - //public LAccept reconstruct(RoleNode src, RoleNode dest) + public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { - ScribDel del = del(); - LAccept lr = new LAccept(this.source, src, msg, dest); - //LAccept lr = new LAccept(src, dest); - lr = (LAccept) lr.del(del); - return lr; + RoleNode src = getSourceChild(); + fixer.setChoiceSubject(src.toName()); + return src.toName(); } @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) + public LInteractionNode merge(AstFactory af, LInteractionNode ln) + throws ScribbleException { - fixer.setChoiceSubject(this.src.toName()); - return this.src.toName(); + throw new RuntimeScribbleException("Invalid merge on LAccept: " + this); } @Override - public String toString() + public boolean canMerge(LInteractionNode ln) { - return (isUnitMessage() ? "" : this.msg + " ") + Constants.ACCEPT_KW + " " + this.src + ";"; + return false; } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) throws ScribbleException + public Set getEnabling() { - throw new RuntimeScribbleException("Invalid merge on LAccept: " + this); + return Collections.emptySet(); } @Override - public boolean canMerge(LInteractionNode ln) + public String toString() { - return false; + return (isUnitMessage() ? "" : getMessageNodeChild() + " ") + + Constants.ACCEPT_KW + " " + getSourceChild() + ";"; } - @Override - public Set getEnabling() + + + + + + + + + + + + + + public LAccept(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) + //public LAccept(RoleNode src, RoleNode dest) { - return Collections.emptySet(); + super(source, src, msg, dest); + //super(src, dest); } - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 + /*@Override + protected ScribNodeBase copy() + { + return new LAccept(this.source, this.src, this.msg, this.dest); + //return new LAccept(this.src, this.dest); + } + @Override - public Local getKind() + public LAccept clone(AstFactory af) + { + RoleNode src = this.src.clone(af); + MessageNode msg = this.msg.clone(af); + RoleNode dest = this.dest.clone(af); + return af.LAccept(this.source, src, msg, dest); + //return AstFactoryImpl.FACTORY.LAccept(src, dest); + }*/ + + /*@Override + public LAccept reconstruct(RoleNode src, MessageNode msg, RoleNode dest) { - return LSimpleInteractionNode.super.getKind(); + ScribDel del = del(); + LAccept lr = new LAccept(this.source, src, msg, dest); + //LAccept lr = new LAccept(src, dest); + lr = (LAccept) lr.del(del); + return lr; }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LConnectionAction.java b/scribble-core/src/main/java/org/scribble/ast/local/LConnectionAction.java index 1b48dc421..f14aede2d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LConnectionAction.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LConnectionAction.java @@ -13,15 +13,41 @@ */ package org.scribble.ast.local; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.ConnectionAction; +import org.scribble.ast.ConnectAction; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.type.kind.Local; -public abstract class LConnectionAction extends ConnectionAction implements LSimpleInteractionNode +public abstract class LConnectionAction extends ConnectAction + implements LSimpleInteractionNode { - public LConnectionAction(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) + // ScribTreeAdaptor#create constructor + public LConnectionAction(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public LConnectionAction(LConnectionAction node) + { + super(node); + } + + + + + + + + + + + + + public LConnectionAction(CommonTree source, RoleNode src, MessageNode msg, + RoleNode dest) { super(source, src, msg, dest); } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java b/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java index 36461678a..ac67804ac 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java @@ -16,72 +16,57 @@ import java.util.HashSet; import java.util.Set; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.Constants; -import org.scribble.ast.MessageNode; +import org.scribble.ast.DisconnectAction; import org.scribble.ast.MessageSigNode; -import org.scribble.ast.ScribNodeBase; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.ScribDel; import org.scribble.main.RuntimeScribbleException; import org.scribble.main.ScribbleException; import org.scribble.type.Message; +import org.scribble.type.kind.Local; import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -public class LDisconnect extends LConnectionAction implements LSimpleInteractionNode +public class LDisconnect extends DisconnectAction implements LSimpleInteractionNode { - public final RoleNode self; // super.src - public final RoleNode peer; // super.dest - - public LDisconnect(CommonTree source, MessageSigNode unit, RoleNode self, RoleNode peer) + // ScribTreeAdaptor#create constructor + public LDisconnect(Token t) { - //super(source, self, GDisconnect.UNIT_MESSAGE_SIG_NODE, peer); - super(source, self, unit, peer); - this.self = self; - this.peer = peer; + super(t); + this.self = null; + this.peer = null; } - @Override - protected ScribNodeBase copy() + // Tree#dupNode constructor + public LDisconnect(LDisconnect node) { - return new LDisconnect(this.source, (MessageSigNode) this.msg, this.self, this.peer); + super(node); + this.self = null; + this.peer = null; } - @Override - public LDisconnect clone(AstFactory af) - { - RoleNode self = this.self.clone(af); - RoleNode peer = this.peer.clone(af); - return af.LDisconnect(this.source, self, peer); - } - - @Override - public LDisconnect reconstruct(RoleNode src, MessageNode msg, RoleNode dest) - //public LDisconnect reconstruct(RoleNode self, RoleNode peer) - { - ScribDel del = del(); - LDisconnect lr = new LDisconnect(this.source, (MessageSigNode) this.msg, this.self, this.peer); - lr = (LDisconnect) lr.del(del); - return lr; - } + HERE do self/peer getters (left self, right peer) @Override public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { - fixer.setChoiceSubject(this.self.toName()); - return this.self.toName(); + RoleNode src = getLeftChild(); + fixer.setChoiceSubject(src.toName()); + return src.toName(); } - + @Override - public String toString() + public LDisconnect dupNode() { - return Constants.DISCONNECT_KW + " " + this.peer + ";"; + return new LDisconnect(this); } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) throws ScribbleException + public LInteractionNode merge(AstFactory af, LInteractionNode ln) + throws ScribbleException { throw new RuntimeScribbleException("Invalid merge on LDisconnect: " + this); } @@ -100,10 +85,59 @@ public Set getEnabling() return enab; } - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 @Override - public Local getKind() + public String toString() + { + return Constants.DISCONNECT_KW + " " + getRightChild() + ";"; + } + + + + + + + + + + + + + + + + + private final RoleNode self; // super.src + private final RoleNode peer; // super.dest + + public LDisconnect(CommonTree source, MessageSigNode unit, RoleNode self, RoleNode peer) + { + //super(source, self, GDisconnect.UNIT_MESSAGE_SIG_NODE, peer); + super(source, self, peer); + this.self = self; + this.peer = peer; + } + + /*@Override + protected ScribNodeBase copy() + { + return new LDisconnect(this.source, (MessageSigNode) this.msg, this.self, this.peer); + } + + @Override + public LDisconnect clone(AstFactory af) + { + RoleNode self = this.self.clone(af); + RoleNode peer = this.peer.clone(af); + return af.LDisconnect(this.source, self, peer); + }*/ + + /*@Override + public LDisconnect reconstruct(RoleNode src, MessageNode msg, RoleNode dest) + //public LDisconnect reconstruct(RoleNode self, RoleNode peer) { - return LSimpleInteractionNode.super.getKind(); + ScribDel del = del(); + LDisconnect lr = new LDisconnect(this.source, (MessageSigNode) this.msg, this.self, this.peer); + lr = (LDisconnect) lr.del(del); + return lr; }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java b/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java index 33636538f..9b3f9261a 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java @@ -16,13 +16,9 @@ import java.util.Collections; import java.util.Set; -import org.antlr.runtime.tree.CommonTree; +import org.antlr.runtime.Token; import org.scribble.ast.AstFactory; import org.scribble.ast.Constants; -import org.scribble.ast.MessageNode; -import org.scribble.ast.ScribNodeBase; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.ScribDel; import org.scribble.main.RuntimeScribbleException; import org.scribble.main.ScribbleException; import org.scribble.type.Message; @@ -31,77 +27,104 @@ public class LRequest extends LConnectionAction implements LSimpleInteractionNode { - public LRequest(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) - //public LConnect(RoleNode src, RoleNode dest) + // ScribTreeAdaptor#create constructor + public LRequest(Token t) { - super(source, src, msg, dest); - //super(src, dest); + super(t); } - @Override - protected ScribNodeBase copy() + // Tree#dupNode constructor + public LRequest(LRequest node) { - return new LRequest(this.source, this.src, this.msg, this.dest); - //return new LConnect(this.src, this.dest); + super(node); } @Override - public LRequest clone(AstFactory af) + public LRequest dupNode() { - RoleNode src = this.src.clone(af); - MessageNode msg = this.msg.clone(af); - RoleNode dest = this.dest.clone(af); - return af.LConnect(this.source, src, msg, dest); - //return AstFactoryImpl.FACTORY.LConnect(src, dest); + return new LRequest(this); } + // Could make a LMessageTransfer to factor this out with LReceive @Override - public LRequest reconstruct(RoleNode src, MessageNode msg, RoleNode dest) - //public LConnect reconstruct(RoleNode src, RoleNode dest) + public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { - ScribDel del = del(); - LRequest ls = new LRequest(this.source, src, msg, dest); - //LConnect ls = new LConnect(src, dest); - ls = (LRequest) ls.del(del); - return ls; + return getSourceChild().toName(); + //throw new RuntimeException("TODO: " + this); } - // Could make a LMessageTransfer to factor this out with LReceive @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) + public LInteractionNode merge(AstFactory af, LInteractionNode ln) + throws ScribbleException { - return this.src.toName(); - //throw new RuntimeException("TODO: " + this); + throw new RuntimeScribbleException("Invalid merge on LRequest: " + this); } @Override - public String toString() + public boolean canMerge(LInteractionNode ln) { - return (isUnitMessage() ? "" : this.msg+ " ") + Constants.CONNECT_KW + " " + this.dest.toString() + ";"; + return false; } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) throws ScribbleException + public Set getEnabling() { - throw new RuntimeScribbleException("Invalid merge on LConnect: " + this); + return Collections.emptySet(); } @Override - public boolean canMerge(LInteractionNode ln) + public String toString() { - return false; + return (isUnitMessage() ? "" : getMessageNodeChild() + " ") + + Constants.CONNECT_KW + " " + getDestinationChild().toString() + ";"; + } + + + + + + + + + + + + + + + + /*public LRequest(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) + //public LConnect(RoleNode src, RoleNode dest) + { + super(source, src, msg, dest); + //super(src, dest); } @Override - public Set getEnabling() + protected ScribNodeBase copy() { - return Collections.emptySet(); + return new LRequest(this.source, this.src, this.msg, this.dest); + //return new LConnect(this.src, this.dest); + } + + @Override + public LRequest clone(AstFactory af) + { + RoleNode src = this.src.clone(af); + MessageNode msg = this.msg.clone(af); + RoleNode dest = this.dest.clone(af); + return af.LConnect(this.source, src, msg, dest); + //return AstFactoryImpl.FACTORY.LConnect(src, dest); } - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 @Override - public Local getKind() + public LRequest reconstruct(RoleNode src, MessageNode msg, RoleNode dest) + //public LConnect reconstruct(RoleNode src, RoleNode dest) { - return LSimpleInteractionNode.super.getKind(); + ScribDel del = del(); + LRequest ls = new LRequest(this.source, src, msg, dest); + //LConnect ls = new LConnect(src, dest); + ls = (LRequest) ls.del(del); + return ls; }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java b/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java index c9e70d83a..2edc7d3f4 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java @@ -16,68 +16,50 @@ import java.util.Collections; import java.util.Set; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.Constants; -import org.scribble.ast.MessageNode; import org.scribble.ast.MessageSigNode; -import org.scribble.ast.ScribNodeBase; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.ScribDel; import org.scribble.main.RuntimeScribbleException; import org.scribble.main.ScribbleException; import org.scribble.type.Message; import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -public class LWrapClient extends LConnectionAction implements LSimpleInteractionNode +public class LWrapClient extends LConnectionAction + implements LSimpleInteractionNode { - public LWrapClient(CommonTree source, MessageSigNode unit, RoleNode src, RoleNode dest) + // ScribTreeAdaptor#create constructor + public LWrapClient(Token t) { - //super(source, src, GWrap.UNIT_MESSAGE_SIG_NODE, dest); - super(source, src, unit, dest); + super(t); } - @Override - protected ScribNodeBase copy() + // Tree#dupNode constructor + public LWrapClient(LWrapClient node) { - return new LWrapClient(this.source, (MessageSigNode) this.msg, this.src, this.dest); + super(node); } @Override - public LWrapClient clone(AstFactory af) - { - RoleNode src = this.src.clone(af); - RoleNode dest = this.dest.clone(af); - return af.LWrapClient(this.source, src, dest); - } - - @Override - public LWrapClient reconstruct(RoleNode src, MessageNode msg, RoleNode dest) - //public LWrapClient reconstruct(RoleNode src, RoleNode dest) + public LWrapClient dupNode() { - ScribDel del = del(); - LWrapClient ls = new LWrapClient(this.source, (MessageSigNode) this.msg, src, dest); - ls = (LWrapClient) ls.del(del); - return ls; + return new LWrapClient(this); } // Could make a LMessageTransfer to factor this out with LReceive @Override public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { - return this.src.toName(); + return getSourceChild().toName(); //throw new RuntimeException("TODO: " + this); } @Override - public String toString() - { - return Constants.WRAP_KW + " " + Constants.TO_KW + " " + this.dest.toString() + ";"; - } - - @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) throws ScribbleException + public LInteractionNode merge(AstFactory af, LInteractionNode ln) + throws ScribbleException { throw new RuntimeScribbleException("Invalid merge on LWrapClient: " + this); } @@ -94,10 +76,56 @@ public Set getEnabling() return Collections.emptySet(); } - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 @Override - public Local getKind() + public String toString() { - return LSimpleInteractionNode.super.getKind(); + return Constants.WRAP_KW + " " + Constants.TO_KW + " " + + getDestinationChild().toString() + ";"; + } + + + + + + + + + + + + + + + + + + public LWrapClient(CommonTree source, MessageSigNode unit, RoleNode src, RoleNode dest) + { + //super(source, src, GWrap.UNIT_MESSAGE_SIG_NODE, dest); + super(source, src, unit, dest); + } + + /*@Override + protected ScribNodeBase copy() + { + return new LWrapClient(this.source, (MessageSigNode) this.msg, this.src, this.dest); + } + + @Override + public LWrapClient clone(AstFactory af) + { + RoleNode src = this.src.clone(af); + RoleNode dest = this.dest.clone(af); + return af.LWrapClient(this.source, src, dest); + } + + @Override + public LWrapClient reconstruct(RoleNode src, MessageNode msg, RoleNode dest) + //public LWrapClient reconstruct(RoleNode src, RoleNode dest) + { + ScribDel del = del(); + LWrapClient ls = new LWrapClient(this.source, (MessageSigNode) this.msg, src, dest); + ls = (LWrapClient) ls.del(del); + return ls; }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java b/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java index ffca9b18e..5b0cf6ac3 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java @@ -16,14 +16,12 @@ import java.util.Collections; import java.util.Set; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.Constants; -import org.scribble.ast.MessageNode; import org.scribble.ast.MessageSigNode; -import org.scribble.ast.ScribNodeBase; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.ScribDel; import org.scribble.main.RuntimeScribbleException; import org.scribble.main.ScribbleException; import org.scribble.type.Message; @@ -32,70 +30,94 @@ public class LWrapServer extends LConnectionAction implements LSimpleInteractionNode { - public LWrapServer(CommonTree source, MessageSigNode unit, RoleNode src, RoleNode dest) + // ScribTreeAdaptor#create constructor + public LWrapServer(Token t) { - super(source, src, unit, dest); + super(t); } - @Override - protected ScribNodeBase copy() + // Tree#dupNode constructor + public LWrapServer(LWrapServer node) { - return new LWrapServer(this.source, (MessageSigNode) this.msg, this.src, this.dest); + super(node); } @Override - public LWrapServer clone(AstFactory af) + public LWrapServer dupNode() { - RoleNode src = this.src.clone(af); - RoleNode dest = this.dest.clone(af); - return af.LWrapServer(this.source, src, dest); + return new LWrapServer(this); } @Override - public LWrapServer reconstruct(RoleNode src, MessageNode msg, RoleNode dest) - //public LWrapServer reconstruct(RoleNode src, RoleNode dest) + public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { - ScribDel del = del(); - LWrapServer lr = new LWrapServer(this.source, (MessageSigNode) this.msg, src, dest); - lr = (LWrapServer) lr.del(del); - return lr; + fixer.setChoiceSubject(getSourceChild().toName()); + return getSourceChild().toName(); } @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) + public LInteractionNode merge(AstFactory af, LInteractionNode ln) + throws ScribbleException { - fixer.setChoiceSubject(this.src.toName()); - return this.src.toName(); + throw new RuntimeScribbleException("Invalid merge on LWrapServer: " + this); } @Override - public String toString() + public boolean canMerge(LInteractionNode ln) { - return Constants.WRAP_KW + " " + Constants.FROM_KW + " " + this.src + ";"; + return false; } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) throws ScribbleException + public Set getEnabling() { - throw new RuntimeScribbleException("Invalid merge on LWrapServer: " + this); + return Collections.emptySet(); } @Override - public boolean canMerge(LInteractionNode ln) + public String toString() { - return false; + return Constants.WRAP_KW + " " + Constants.FROM_KW + " " + this.src + ";"; + } + + + + + + + + + + + + + + public LWrapServer(CommonTree source, MessageSigNode unit, RoleNode src, RoleNode dest) + { + super(source, src, unit, dest); } + /*@Override + protected ScribNodeBase copy() + { + return new LWrapServer(this.source, (MessageSigNode) this.msg, this.src, this.dest); + } + @Override - public Set getEnabling() + public LWrapServer clone(AstFactory af) { - return Collections.emptySet(); + RoleNode src = this.src.clone(af); + RoleNode dest = this.dest.clone(af); + return af.LWrapServer(this.source, src, dest); } - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 @Override - public Local getKind() + public LWrapServer reconstruct(RoleNode src, MessageNode msg, RoleNode dest) + //public LWrapServer reconstruct(RoleNode src, RoleNode dest) { - return LSimpleInteractionNode.super.getKind(); + ScribDel del = del(); + LWrapServer lr = new LWrapServer(this.source, (MessageSigNode) this.msg, src, dest); + lr = (LWrapServer) lr.del(del); + return lr; }*/ } diff --git a/scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java b/scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java index 18ebbff86..09044a74f 100644 --- a/scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java @@ -13,7 +13,7 @@ */ package org.scribble.del; -import org.scribble.ast.ConnectionAction; +import org.scribble.ast.ConnectAction; import org.scribble.ast.ScribNode; import org.scribble.main.ScribbleException; import org.scribble.visit.InlinedProtocolUnfolder; @@ -30,12 +30,12 @@ public ConnectionActionDel() } @Override - public ConnectionAction leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public ConnectAction leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { - ConnectionAction c = (ConnectionAction) visited; - ConnectionAction inlined = (ConnectionAction) c.clone(inl.job.af); + ConnectAction c = (ConnectAction) visited; + ConnectAction inlined = (ConnectAction) c.clone(inl.job.af); inl.pushEnv(inl.popEnv().setTranslation(inlined)); - return (ConnectionAction) super.leaveProtocolInlining(parent, child, inl, c); + return (ConnectAction) super.leaveProtocolInlining(parent, child, inl, c); } /*@Override @@ -57,7 +57,7 @@ public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, Inl @Override public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, RoleCollector coll, ScribNode visited) { - ConnectionAction c = (ConnectionAction) visited; + ConnectAction c = (ConnectAction) visited; coll.addName(c.src.toName()); coll.addName(c.dest.toName()); return visited; From f9043fcf0119c1502745a920f5995c710607b390 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 25 Jan 2019 17:55:22 +0000 Subject: [PATCH 078/539] Continued WIP. --- .../java/org/scribble/ast/AstFactory.java | 2 +- .../java/org/scribble/ast/AstFactoryImpl.java | 5 +- .../main/java/org/scribble/ast/Choice.java | 10 +- .../main/java/org/scribble/ast/Continue.java | 56 +++++++++-- .../org/scribble/ast/DisconnectAction.java | 7 +- .../main/java/org/scribble/ast/Recursion.java | 81 ++++++++++++--- .../org/scribble/ast/global/GConnect.java | 2 +- .../org/scribble/ast/global/GContinue.java | 43 ++++++-- .../org/scribble/ast/global/GDisconnect.java | 3 +- .../org/scribble/ast/global/GRecursion.java | 98 ++++++++++++------ .../org/scribble/ast/local/LContinue.java | 76 ++++++++++---- .../org/scribble/ast/local/LDisconnect.java | 18 +++- .../org/scribble/ast/local/LRecursion.java | 99 +++++++++++++------ .../java/org/scribble/ast/local/LRequest.java | 7 +- .../java/org/scribble/ast/name/NameNode.java | 27 +++-- .../ast/name/qualified/GProtocolNameNode.java | 43 ++++++-- .../ast/name/qualified/LProtocolNameNode.java | 56 ++++++++--- .../ast/name/qualified/MemberNameNode.java | 22 ++++- .../name/qualified/MessageSigNameNode.java | 49 ++++++--- .../ast/name/qualified/ModuleNameNode.java | 44 ++++++--- .../ast/name/qualified/ProtocolNameNode.java | 26 ++++- .../ast/name/qualified/QualifiedNameNode.java | 15 +++ .../ast/name/simple/AmbigNameNode.java | 4 +- .../name/simple/DummyProjectionRoleNode.java | 45 ++++++--- .../ast/name/simple/NonRoleParamNode.java | 62 +++++++++--- .../org/scribble/ast/name/simple/OpNode.java | 44 +++++++-- .../scribble/ast/name/simple/RecVarNode.java | 63 ++++++++---- .../scribble/ast/name/simple/RoleNode.java | 56 ++++++++--- .../scribble/ast/name/simple/ScopeNode.java | 74 -------------- .../ast/name/simple/SimpleNameNode.java | 2 +- .../java/org/scribble/del/ContinueDel.java | 16 +-- .../org/scribble/del/global/GChoiceDel.java | 87 ++++++++++------ .../org/scribble/del/global/GContinueDel.java | 12 ++- .../scribble/del/global/GDisconnectDel.java | 23 +++-- .../del/global/GInteractionSeqDel.java | 2 +- .../org/scribble/del/local/LContinueDel.java | 24 +++-- .../scribble/del/local/LDisconnectDel.java | 16 +-- .../del/local/LInteractionSeqDel.java | 2 +- .../visit/InlinedProtocolUnfolder.java | 2 +- .../org/scribble/visit/UnfoldingVisitor.java | 34 ++++--- .../context/ProjectedChoiceDoPruner.java | 27 +++-- .../scribble/ast/tree/MyCommonTree.java | 5 +- 42 files changed, 963 insertions(+), 426 deletions(-) delete mode 100644 scribble-core/src/main/java/org/scribble/ast/name/simple/ScopeNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/AstFactory.java b/scribble-core/src/main/java/org/scribble/ast/AstFactory.java index 44c2f2245..b0b0235aa 100644 --- a/scribble-core/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-core/src/main/java/org/scribble/ast/AstFactory.java @@ -140,7 +140,7 @@ public interface AstFactory LSend LSend(CommonTree source, RoleNode src, MessageNode msg, List dests); LReceive LReceive(CommonTree source, RoleNode src, MessageNode msg, List dests); - LRequest LConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest); + LRequest LRequest(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest); LAccept LAccept(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest); /*LConnect LConnect(CommonTree source, RoleNode src, RoleNode dest); LAccept LAccept(CommonTree source, RoleNode src, RoleNode dest);*/ diff --git a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java index b175f23ce..283d6ebea 100644 --- a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -344,7 +344,8 @@ public GConnect GConnect(CommonTree source, RoleNode src, MessageNode msg, RoleN @Override public GDisconnect GDisconnect(CommonTree source, RoleNode src, RoleNode dest) { - GDisconnect gc = new GDisconnect(source, UnitMessageSigNode(), src, dest); + GDisconnect gc = new GDisconnect(source, //UnitMessageSigNode(), + src, dest); gc = del(gc, new GDisconnectDel()); return gc; } @@ -600,7 +601,7 @@ public LReceive LReceive(CommonTree source, RoleNode src, MessageNode msg, List< } @Override - public LRequest LConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) + public LRequest LRequest(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) //public LConnect LConnect(RoleNode src, RoleNode dest) { LRequest lc = new LRequest(source, src, msg, dest); diff --git a/scribble-core/src/main/java/org/scribble/ast/Choice.java b/scribble-core/src/main/java/org/scribble/ast/Choice.java index 7be78affe..e308a68c0 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Choice.java +++ b/scribble-core/src/main/java/org/scribble/ast/Choice.java @@ -55,12 +55,12 @@ public RoleNode getSubjectChild() public Choice reconstruct(RoleNode subj, List> blocks) { - Choice pd = dupNode(); + Choice c = dupNode(); ScribDel del = del(); - pd.addChild(subj); - pd.addChildren(blocks); - pd.setDel(del); // No copy - return pd; + c.addChild(subj); + c.addChildren(blocks); + c.setDel(del); // No copy + return c; } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/Continue.java b/scribble-core/src/main/java/org/scribble/ast/Continue.java index 1df574667..71a6a20f0 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Continue.java +++ b/scribble-core/src/main/java/org/scribble/ast/Continue.java @@ -13,34 +13,74 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; -public abstract class Continue extends SimpleInteractionNode +public abstract class Continue + extends SimpleInteractionNode { - public final RecVarNode recvar; + // ScribTreeAdaptor#create constructor + public Continue(Token t) + { + super(t); + this.recvar = null; + } - protected Continue(CommonTree source, RecVarNode recvar) + // Tree#dupNode constructor + protected Continue(Continue node) { - super(source); - this.recvar = recvar; + super(node); + this.recvar = null; + } + + public abstract Continue dupNode(); + + public RecVarNode getRecVarChild() + { + return (RecVarNode) getChild(0); } - public abstract Continue reconstruct(RecVarNode recvar); + public Continue reconstruct(RecVarNode recvar) + { + Continue r = dupNode(); + ScribDel del = del(); + r.addChild(recvar); + r.setDel(del); // No copy + return r; + } @Override public Continue visitChildren(AstVisitor nv) throws ScribbleException { - RecVarNode recvar = (RecVarNode) visitChild(this.recvar, nv); + RecVarNode recvar = (RecVarNode) visitChild(getRecVarChild(), nv); return reconstruct(recvar); } @Override public String toString() { - return Constants.CONTINUE_KW + " " + this.recvar + ";"; + return Constants.CONTINUE_KW + " " + getRecVarChild() + ";"; + } + + + + + + + + + + + private final RecVarNode recvar; + + protected Continue(CommonTree source, RecVarNode recvar) + { + super(source); + this.recvar = recvar; } } diff --git a/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java index e73db018e..2d09783ef 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java @@ -22,6 +22,7 @@ import org.scribble.visit.AstVisitor; // (G)Disconnect is symmetric (send/receive asymmetric/async; request/accept asymmetric/sync; (g)disconnect symmetric/async) +// However, LDisconnect is "symmetric" but self-oriented -- "left" used for self public abstract class DisconnectAction extends SimpleInteractionNode { @@ -53,11 +54,11 @@ public RoleNode getRightChild() return (RoleNode) getChild(1); } - public DisconnectAction reconstruct(RoleNode self, RoleNode peer) + public DisconnectAction reconstruct(RoleNode left, RoleNode right) { DisconnectAction da = dupNode(); - da.addChild(self); - da.addChild(peer); + da.addChild(left); + da.addChild(right); ScribDel del = del(); da.setDel(del); // No copy return da; diff --git a/scribble-core/src/main/java/org/scribble/ast/Recursion.java b/scribble-core/src/main/java/org/scribble/ast/Recursion.java index f757c381e..47233dd8f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/ast/Recursion.java @@ -13,42 +13,91 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; -public abstract class Recursion extends CompoundInteractionNode +public abstract class Recursion + extends CompoundInteractionNode { - public final RecVarNode recvar; - public final ProtocolBlock block; - - protected Recursion(CommonTree source, RecVarNode recvar, ProtocolBlock block) + // ScribTreeAdaptor#create constructor + public Recursion(Token t) { - super(source); - this.recvar = recvar; - this.block = block; + super(t); + this.recvar = null; + this.block = null; } - public abstract Recursion reconstruct(RecVarNode recvar, ProtocolBlock block); + // Tree#dupNode constructor + protected Recursion(Recursion node) + { + super(node); + this.recvar = null; + this.block = null; + } - @Override - public abstract Recursion clone(AstFactory af); + public abstract Recursion dupNode(); + + public RecVarNode getRecVarChild() + { + return (RecVarNode) getChild(0); + } + + public abstract ProtocolBlock getBlockChild(); + + public Recursion reconstruct(RecVarNode recvar, ProtocolBlock block) + { + Recursion r = dupNode(); + ScribDel del = del(); + r.addChild(recvar); + r.addChild(block); + r.setDel(del); // No copy + return r; + } @Override public Recursion visitChildren(AstVisitor nv) throws ScribbleException { - RecVarNode recvar = (RecVarNode) visitChild(this.recvar, nv); - ProtocolBlock block = visitChildWithClassEqualityCheck(this, this.block, nv); + RecVarNode recvar = (RecVarNode) visitChild(getRecVarChild(), nv); + ProtocolBlock block = visitChildWithClassEqualityCheck(this, + getBlockChild(), nv); return reconstruct(recvar, block); } - - public abstract ProtocolBlock getBlock(); @Override public String toString() { - return Constants.REC_KW + " " + this.recvar + " " + this.block; + return Constants.REC_KW + " " + getRecVarChild() + " " + getBlockChild(); } + + + + + + + + + + + + + + + private final RecVarNode recvar; + private final ProtocolBlock block; + + protected Recursion(CommonTree source, RecVarNode recvar, ProtocolBlock block) + { + super(source); + this.recvar = recvar; + this.block = block; + } + + /*@Override + public abstract Recursion clone(AstFactory af);*/ + } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java b/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java index 6fd91c01f..f65b47347 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java @@ -64,7 +64,7 @@ public LNode project(AstFactory af, Role self) RoleKind.KIND, destNode.toName().toString()); if (src.equals(self)) { - proj = af.LConnect(this.source, srcNode1, msgNode1, destNode1); + proj = af.LRequest(this.source, srcNode1, msgNode1, destNode1); //projection = AstFactoryImpl.FACTORY.LConnect(src, dest); // src and dest (not self and peer) } if (dest.equals(self)) diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GContinue.java b/scribble-core/src/main/java/org/scribble/ast/global/GContinue.java index e694ba55f..e0f37459d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GContinue.java @@ -13,31 +13,60 @@ */ package org.scribble.ast.global; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.Continue; import org.scribble.ast.local.LContinue; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.del.ScribDel; import org.scribble.type.kind.Global; import org.scribble.type.kind.RecVarKind; import org.scribble.type.name.Role; public class GContinue extends Continue implements GSimpleInteractionNode { - public GContinue(CommonTree source, RecVarNode recvar) + // ScribTreeAdaptor#create constructor + public GContinue(Token t) { - super(source, recvar); + super(t); + } + + // Tree#dupNode constructor + protected GContinue(GContinue node) + { + super(node); + } + + @Override + public GContinue dupNode() + { + return new GContinue(this); } public LContinue project(AstFactory af, Role self) { - RecVarNode recvar = (RecVarNode) af.SimpleNameNode(this.recvar.getSource(), RecVarKind.KIND, this.recvar.toName().toString()); // clone? - LContinue projection = af.LContinue(this.source, recvar); + RecVarNode recvar = getRecVarChild(); + RecVarNode recvar1 = (RecVarNode) af.SimpleNameNode(recvar.getSource(), + RecVarKind.KIND, recvar.toName().toString()); // clone? + LContinue projection = af.LContinue(this.source, recvar1); return projection; } + + + + + + + + + - @Override + public GContinue(CommonTree source, RecVarNode recvar) + { + super(source, recvar); + } + + /*@Override protected GContinue copy() { return new GContinue(this.source, this.recvar); @@ -57,5 +86,5 @@ public GContinue reconstruct(RecVarNode recvar) GContinue gc = new GContinue(this.source, recvar); gc = (GContinue) gc.del(del); return gc; - } + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GDisconnect.java b/scribble-core/src/main/java/org/scribble/ast/global/GDisconnect.java index 224af06fd..2cf65c678 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GDisconnect.java @@ -57,11 +57,12 @@ public LNode project(AstFactory af, Role self) RoleKind.KIND, leftNode.toName().toString()); // clone? RoleNode rightNode1 = (RoleNode) af.SimpleNameNode(rightNode.getSource(), RoleKind.KIND, rightNode.toName().toString()); + // "left" of LDisconnect is used for self if (left.equals(self)) { proj = af.LDisconnect(this.source, leftNode1, rightNode1); } - if (right.equals(self)) + else if (right.equals(self)) // CHECKME: self-comm via self-connections? so self-disconn? { proj = af.LDisconnect(this.source, rightNode1, leftNode1); } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java index b139020df..6549f9d13 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java @@ -20,35 +20,55 @@ import java.util.List; import java.util.Set; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.ConnectAction; import org.scribble.ast.Do; import org.scribble.ast.MessageTransfer; -import org.scribble.ast.ProtocolBlock; import org.scribble.ast.Recursion; import org.scribble.ast.local.LChoice; import org.scribble.ast.local.LContinue; import org.scribble.ast.local.LInteractionNode; +import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.local.LRecursion; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.del.ScribDel; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; -public class GRecursion extends Recursion implements GCompoundInteractionNode +public class GRecursion extends Recursion + implements GCompoundInteractionNode { - public GRecursion(CommonTree source, RecVarNode recvar, GProtocolBlock block) + // ScribTreeAdaptor#create constructor + public GRecursion(Token t) { - super(source, recvar, block); + super(t); + } + + // Tree#dupNode constructor + protected GRecursion(GRecursion node) + { + super(node); + } + + @Override + public GRecursion dupNode() + { + return new GRecursion(this); + } + + @Override + public GProtocolBlock getBlockChild() + { + return (GProtocolBlock) getChild(1); } public LRecursion project(AstFactory af, Role self, LProtocolBlock block) { - RecVarNode recvar = this.recvar.clone(af); + RecVarNode recvar = getRecVarChild().clone(af); LRecursion projection = null; Set rvs = new HashSet<>(); rvs.add(recvar.toName()); @@ -62,14 +82,17 @@ public LRecursion project(AstFactory af, Role self, LProtocolBlock block) // Pruning must be considered here (at Recursion) due to unguarded recvars // Set should be unnecessary (singleton OK) -- *nested* irrelevant continues should already have been pruned - // FIXME? refactor and separate into dels? -- maybe not: since pruning is a bit too much of a "centralised algorithm" -- currently relying on TODO exception for unhandled cases - protected static LProtocolBlock prune(AstFactory af, LProtocolBlock block, Set rvs) // FIXME: Set unnecessary + // CHECKME? refactor and separate into dels? -- maybe not: since pruning is a bit too much of a "centralised algorithm" -- currently relying on TODO exception for unhandled cases + protected static LProtocolBlock prune(AstFactory af, LProtocolBlock block, + Set rvs) // FIXME: Set unnecessary { + LInteractionSeq seq = block.getInteractSeqChild(); if (block.isEmpty()) { return block; } - List lis = block.getInteractSeqChild().getInteractNodeChildren(); + List lis = block.getInteractSeqChild() + .getInteractNodeChildren(); if (lis.size() > 1) { return block; @@ -80,18 +103,19 @@ protected static LProtocolBlock prune(AstFactory af, LProtocolBlock block, Set || lin instanceof Do || lin instanceof ConnectAction) + else if (lin instanceof MessageTransfer || lin instanceof Do + || lin instanceof ConnectAction) { return block; } @@ -110,20 +134,22 @@ else if (lin instanceof MessageTransfer || lin instanceof Do || lin instan if (pruned.isEmpty()) { return af.LProtocolBlock(block.getSource(), - af.LInteractionSeq(block.seq.getSource(), Collections.emptyList())); + af.LInteractionSeq(seq.getSource(), Collections.emptyList())); } else { return af.LProtocolBlock(block.getSource(), - af.LInteractionSeq(block.seq.getSource(), Arrays.asList( - af.LChoice(lin.getSource(), ((LChoice) lin).subj, pruned)))); + af.LInteractionSeq(seq.getSource(), + Arrays.asList(af.LChoice(lin.getSource(), + ((LChoice) lin).getSubjectChild(), pruned)))); } } else if (lin instanceof LRecursion) { rvs = new HashSet<>(rvs); //rvs.add(((LRecursion) lin).recvar.toName()); // Set unnecessary - LProtocolBlock pruned = prune(af, ((LRecursion) lin).getBlock(), rvs); // Need to check if the current rec has any cases to prune in the nested rec (already pruned, but for the nested recvars only) + LProtocolBlock pruned = prune(af, ((LRecursion) lin).getBlockChild(), + rvs); // Need to check if the current rec has any cases to prune in the nested rec (already pruned, but for the nested recvars only) if (pruned.isEmpty()) { return pruned; @@ -131,8 +157,9 @@ else if (lin instanceof LRecursion) else { return af.LProtocolBlock(block.getSource(), - af.LInteractionSeq(block.seq.getSource(), Arrays.asList( - af.LRecursion(lin.getSource(), ((LRecursion) lin).recvar, pruned)))); + af.LInteractionSeq(seq.getSource(), + Arrays.asList(af.LRecursion(lin.getSource(), + ((LRecursion) lin).getRecVarChild(), pruned)))); } /*if (((LRecursion) lin).block.isEmpty()) { @@ -150,18 +177,39 @@ else if (lin instanceof LRecursion) } } } + + + + + + + + + + + + + + + + + + public GRecursion(CommonTree source, RecVarNode recvar, GProtocolBlock block) + { + super(source, recvar, block); + } - @Override + /*@Override protected GRecursion copy() { - return new GRecursion(this.source, this.recvar, getBlock()); + return new GRecursion(this.source, this.recvar, getBlockChild()); } @Override public GRecursion clone(AstFactory af) { RecVarNode recvar = this.recvar.clone(af); - GProtocolBlock block = getBlock().clone(af); + GProtocolBlock block = getBlockChild().clone(af); return af.GRecursion(this.source, recvar, block); } @@ -172,11 +220,5 @@ public GRecursion reconstruct(RecVarNode recvar, ProtocolBlock block) GRecursion gr = new GRecursion(this.source, recvar, (GProtocolBlock) block); gr = (GRecursion) gr.del(del); return gr; - } - - @Override - public GProtocolBlock getBlock() - { - return (GProtocolBlock) this.block; - } + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LContinue.java b/scribble-core/src/main/java/org/scribble/ast/local/LContinue.java index fc7514d03..0ab3d7581 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LContinue.java @@ -16,11 +16,11 @@ import java.util.Collections; import java.util.Set; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.Continue; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.Message; import org.scribble.type.kind.Local; @@ -29,54 +29,54 @@ public class LContinue extends Continue implements LSimpleInteractionNode { - public LContinue(CommonTree source, RecVarNode recvar) + // ScribTreeAdaptor#create constructor + public LContinue(Token t) { - super(source, recvar); + super(t); } - @Override - protected LContinue copy() + // Tree#dupNode constructor + protected LContinue(LContinue node) { - return new LContinue(this.source, this.recvar); + super(node); } @Override - public LContinue clone(AstFactory af) + public LContinue dupNode() { - RecVarNode rv = this.recvar.clone(af); - return af.LContinue(this.source, rv); + return new LContinue(this); } @Override - public LContinue reconstruct(RecVarNode recvar) + public LContinue clone() { - ScribDel del = del(); - LContinue lc = new LContinue(this.source, recvar); - lc = (LContinue) lc.del(del); - return lc; + return (LContinue) super.clone(); } @Override public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { //return new DummyProjectionRoleNode().toName(); // For e.g. rec X { 1() from A to B; choice at A { continue X; } or { 2() from A to B; } } - return fixer.createRecVarRole(this.recvar.toName()); // Never used? + return fixer.createRecVarRole(getRecVarChild().toName()); // Never used? //return null; } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) throws ScribbleException + public LInteractionNode merge(AstFactory af, LInteractionNode ln) + throws ScribbleException { if (!(ln instanceof LContinue) || !this.canMerge(ln)) { - throw new ScribbleException("Cannot merge " + this.getClass() + " and " + ln.getClass() + ": " + this + ", " + ln); + throw new ScribbleException("Cannot merge " + this.getClass() + " and " + + ln.getClass() + ": " + this + ", " + ln); } LContinue them = ((LContinue) ln); - if (!this.recvar.equals(them.recvar)) + if (!getRecVarChild().equals(them.getRecVarChild())) { - throw new ScribbleException("Cannot merge choices for " + this.recvar + " and " + them.recvar + ": " + this + ", " + ln); + throw new ScribbleException("Cannot merge choices for " + getRecVarChild() + + " and " + them.getRecVarChild() + ": " + this + ", " + ln); } - return clone(af); + return clone(); } @Override @@ -90,4 +90,40 @@ public Set getEnabling() { return Collections.emptySet(); } + + + + + + + + + + + public LContinue(CommonTree source, RecVarNode recvar) + { + super(source, recvar); + } + + /*@Override + protected LContinue copy() + { + return new LContinue(this.source, this.recvar); + } + + @Override + public LContinue clone(AstFactory af) + { + RecVarNode rv = this.recvar.clone(af); + return af.LContinue(this.source, rv); + } + + @Override + public LContinue reconstruct(RecVarNode recvar) + { + ScribDel del = del(); + LContinue lc = new LContinue(this.source, recvar); + lc = (LContinue) lc.del(del); + return lc; + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java b/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java index ac67804ac..d1aa66cf0 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java @@ -30,7 +30,9 @@ import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -public class LDisconnect extends DisconnectAction implements LSimpleInteractionNode +// "left" of LDisconnect is used for self +public class LDisconnect extends DisconnectAction + implements LSimpleInteractionNode { // ScribTreeAdaptor#create constructor public LDisconnect(Token t) @@ -48,12 +50,20 @@ public LDisconnect(LDisconnect node) this.peer = null; } - HERE do self/peer getters (left self, right peer) + public RoleNode getSelfChild() + { + return getLeftChild(); + } + + public RoleNode getPeerChild() + { + return getRightChild(); + } @Override public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { - RoleNode src = getLeftChild(); + RoleNode src = getSelfChild(); fixer.setChoiceSubject(src.toName()); return src.toName(); } @@ -88,7 +98,7 @@ public Set getEnabling() @Override public String toString() { - return Constants.DISCONNECT_KW + " " + getRightChild() + ";"; + return Constants.DISCONNECT_KW + " " + getPeerChild() + ";"; } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java index 94934dc84..33110895f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java @@ -15,12 +15,11 @@ import java.util.Set; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.ProtocolBlock; import org.scribble.ast.Recursion; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.Message; import org.scribble.type.kind.Local; @@ -29,60 +28,58 @@ public class LRecursion extends Recursion implements LCompoundInteractionNode { - public LRecursion(CommonTree source, RecVarNode recvar, LProtocolBlock block) - { - super(source, recvar, block); - } - - @Override - protected LRecursion copy() + // ScribTreeAdaptor#create constructor + public LRecursion(Token t) { - return new LRecursion(this.source, this.recvar, getBlock()); + super(t); } - @Override - public LRecursion reconstruct(RecVarNode recvar, ProtocolBlock block) + // Tree#dupNode constructor + protected LRecursion(LRecursion node) { - ScribDel del = del(); - LRecursion lr = new LRecursion(this.source, recvar, (LProtocolBlock) block); - lr = (LRecursion) lr.del(del); - return lr; + super(node); } @Override - public LRecursion clone(AstFactory af) + public LRecursion dupNode() { - RecVarNode recvar = this.recvar.clone(af); - LProtocolBlock block = getBlock().clone(af); - return af.LRecursion(this.source, recvar, block); + return new LRecursion(this); } - + @Override - public LProtocolBlock getBlock() + public LProtocolBlock getBlockChild() { - return (LProtocolBlock) this.block; + return (LProtocolBlock) getChild(1); } - + @Override public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { //fixer.pushRec(this.recvar.toName()); - return getBlock().getInteractSeqChild().getInteractNodeChildren().get(0).inferLocalChoiceSubject(fixer); + return getBlockChild().getInteractSeqChild().getInteractNodeChildren() + .get(0).inferLocalChoiceSubject(fixer); } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) throws ScribbleException + public LInteractionNode merge(AstFactory af, LInteractionNode ln) + throws ScribbleException { if (!(ln instanceof LRecursion) || !this.canMerge(ln)) { - throw new ScribbleException("Cannot merge " + this.getClass() + " and " + ln.getClass() + ": " + this + ", " + ln); + throw new ScribbleException("Cannot merge " + getClass() + " and " + + ln.getClass() + ": " + this + ", " + ln); } LRecursion them = ((LRecursion) ln); - if (!this.recvar.equals(them.recvar)) + if (!getRecVarChild().toName() + .equals(them.getRecVarChild().toName())) { - throw new ScribbleException("Cannot merge recursions for " + this.recvar + " and " + them.recvar + ": " + this + ", " + ln); + throw new ScribbleException( + "Cannot merge recursions for " + getRecVarChild() + " and " + + them.getRecVarChild() + ": " + this + ", " + ln); } - return af.LRecursion(this.source, this.recvar.clone(af), getBlock().merge(them.getBlock())); // Not reconstruct: leave context building to post-projection passes + return af.LRecursion(this.source, getRecVarChild().clone(af), + getBlockChild().merge(them.getBlockChild())); + // Not reconstruct: leave context building to post-projection passes // HACK: this source } @@ -95,6 +92,46 @@ public boolean canMerge(LInteractionNode ln) @Override public Set getEnabling() { - return getBlock().getEnabling(); + return getBlockChild().getEnabling(); + } + + + + + + + + + + + + + + public LRecursion(CommonTree source, RecVarNode recvar, LProtocolBlock block) + { + super(source, recvar, block); + } + + /*@Override + protected LRecursion copy() + { + return new LRecursion(this.source, this.recvar, getBlockChild()); + } + + @Override + public LRecursion reconstruct(RecVarNode recvar, ProtocolBlock block) + { + ScribDel del = del(); + LRecursion lr = new LRecursion(this.source, recvar, (LProtocolBlock) block); + lr = (LRecursion) lr.del(del); + return lr; } + + @Override + public LRecursion clone(AstFactory af) + { + RecVarNode recvar = this.recvar.clone(af); + LProtocolBlock block = getBlockChild().clone(af); + return af.LRecursion(this.source, recvar, block); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java b/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java index 9b3f9261a..d76900438 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java @@ -17,8 +17,11 @@ import java.util.Set; import org.antlr.runtime.Token; +import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.Constants; +import org.scribble.ast.MessageNode; +import org.scribble.ast.name.simple.RoleNode; import org.scribble.main.RuntimeScribbleException; import org.scribble.main.ScribbleException; import org.scribble.type.Message; @@ -93,14 +96,14 @@ public String toString() - /*public LRequest(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) + public LRequest(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) //public LConnect(RoleNode src, RoleNode dest) { super(source, src, msg, dest); //super(src, dest); } - @Override + /*@Override protected ScribNodeBase copy() { return new LRequest(this.source, this.src, this.msg, this.dest); diff --git a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java index 8975ebbb9..56003667a 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java @@ -22,7 +22,8 @@ import org.scribble.type.name.Named; // Kind parameter used for typing help, but NameNodes don't record kind as state (not part of the syntax) -- so kind doesn't affect e.g. equals (i.e. name nodes of different kinds are still only compared syntactically) -public abstract class NameNode extends ScribNodeBase implements Named +public abstract class NameNode extends ScribNodeBase + implements Named { protected final String[] elems; @@ -33,16 +34,15 @@ public NameNode(Token t) this.elems = null; } - public NameNode(CommonTree source, String... elems) + // Tree#dupNode constructor + protected NameNode(NameNode node, String...elems) { - super(source); - if (source == null) - { - throw new RuntimeException("CHECKME"); - } + super(node); this.elems = elems; } + public abstract NameNode dupNode(); + public String[] getElements() { return Arrays.copyOf(this.elems, this.elems.length); @@ -109,6 +109,19 @@ public String toString() + + + + + public NameNode(CommonTree source, String... elems) + { + super(source); + if (source == null) + { + throw new RuntimeException("CHECKME"); + } + this.elems = elems; + } /*@Override public abstract NameNode clone(AstFactory af);*/ diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java index edff75acd..7996fbced 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java @@ -13,28 +13,29 @@ */ package org.scribble.ast.name.qualified; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; public class GProtocolNameNode extends ProtocolNameNode { - public GProtocolNameNode(CommonTree source, String... ns) + // ScribTreeAdaptor#create constructor + public GProtocolNameNode(Token t) { - super(source, ns); + super(t); } - @Override - protected GProtocolNameNode copy() + // Tree#dupNode constructor + protected GProtocolNameNode(GProtocolNameNode node, String...elems) { - return new GProtocolNameNode(this.source, this.elems); + super(node); } - + @Override - public GProtocolNameNode clone(AstFactory af) + public GProtocolNameNode dupNode() { - return (GProtocolNameNode) af.QualifiedNameNode(this.source, Global.KIND, this.elems); + return new GProtocolNameNode(this, this.elems); } @Override @@ -73,4 +74,28 @@ public int hashCode() hash = 31 * hash + this.elems.hashCode(); return hash; } + + + + + + + + + public GProtocolNameNode(CommonTree source, String... ns) + { + super(source, ns); + } + + /*@Override + protected GProtocolNameNode copy() + { + return new GProtocolNameNode(this.source, this.elems); + } + + @Override + public GProtocolNameNode clone(AstFactory af) + { + return (GProtocolNameNode) af.QualifiedNameNode(this.source, Global.KIND, this.elems); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java index 1cc702d85..375aed4e9 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java @@ -13,8 +13,8 @@ */ package org.scribble.ast.name.qualified; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.name.PayloadElemNameNode; import org.scribble.type.Arg; import org.scribble.type.kind.Local; @@ -22,21 +22,22 @@ public class LProtocolNameNode extends ProtocolNameNode implements PayloadElemNameNode { - public LProtocolNameNode(CommonTree source, String... ns) + // ScribTreeAdaptor#create constructor + public LProtocolNameNode(Token t) { - super(source, ns); + super(t); } - @Override - protected LProtocolNameNode copy() + // Tree#dupNode constructor + protected LProtocolNameNode(LProtocolNameNode node, String...elems) { - return new LProtocolNameNode(this.source, this.elems); + super(node); } @Override - public LProtocolNameNode clone(AstFactory af) + public LProtocolNameNode dupNode() { - return (LProtocolNameNode) af.QualifiedNameNode(this.source, Local.KIND, this.elems); + return new LProtocolNameNode(this, this.elems); } @Override @@ -47,6 +48,18 @@ public LProtocolName toName() ? new LProtocolName(getModuleNamePrefix(), membname) : membname; } + + @Override + public LProtocolName toPayloadType() + { + return toName(); + } + + @Override + public Arg toArg() + { + return toPayloadType(); + } @Override public boolean equals(Object o) @@ -75,16 +88,29 @@ public int hashCode() hash = 31 * hash + this.elems.hashCode(); return hash; } - - @Override - public Arg toArg() + + + + + + + + + + public LProtocolNameNode(CommonTree source, String... ns) { - return toPayloadType(); + super(source, ns); } - @Override - public LProtocolName toPayloadType() + /*@Override + protected LProtocolNameNode copy() { - return toName(); + return new LProtocolNameNode(this.source, this.elems); } + + @Override + public LProtocolNameNode clone(AstFactory af) + { + return (LProtocolNameNode) af.QualifiedNameNode(this.source, Local.KIND, this.elems); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java index e8ac9a0f9..891618500 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java @@ -24,14 +24,16 @@ public abstract class MemberNameNode extends QualifiedNameNode { + // ScribTreeAdaptor#create constructor public MemberNameNode(Token t) { super(t); } - public MemberNameNode(CommonTree source, String... ns) + // Tree#dupNode constructor + protected MemberNameNode(MemberNameNode node, String...elems) { - super(source, ns); + super(node); } protected ModuleName getModuleNamePrefix() @@ -45,4 +47,20 @@ protected ModuleName getModuleNamePrefix() return new ModuleName( new PackageName(Arrays.copyOf(prefix, prefix.length - 1)), mn); } + + + + + + + + + + + + + public MemberNameNode(CommonTree source, String... ns) + { + super(source, ns); + } } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java index b6e93b7e5..9f18191c5 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java @@ -23,33 +23,28 @@ public class MessageSigNameNode extends MemberNameNode implements MessageNode { + // ScribTreeAdaptor#create constructor public MessageSigNameNode(Token t) { super(t); } - public MessageSigNameNode(CommonTree source, String... elems) - { - super(source, elems); - } - - @Override - public MessageNode project(AstFactory af) + // Tree#dupNode constructor + protected MessageSigNameNode(MessageSigNameNode node, String...elems) { - return this; + super(node); } - + @Override - protected MessageSigNameNode copy() + public MessageSigNameNode dupNode() { - return new MessageSigNameNode(this.source, this.elems); + return new MessageSigNameNode(this, this.elems); } @Override - public MessageSigNameNode clone(AstFactory af) + public MessageNode project(AstFactory af) { - return (MessageSigNameNode) af.QualifiedNameNode(this.source, SigKind.KIND, - this.elems); + return this; } @Override @@ -106,4 +101,30 @@ public int hashCode() hash = 31 * hash + this.elems.hashCode(); return hash; } + + + + + + + + + + public MessageSigNameNode(CommonTree source, String... elems) + { + super(source, elems); + } + + /*@Override + protected MessageSigNameNode copy() + { + return new MessageSigNameNode(this.source, this.elems); + } + + @Override + public MessageSigNameNode clone(AstFactory af) + { + return (MessageSigNameNode) af.QualifiedNameNode(this.source, SigKind.KIND, + this.elems); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java index c138ea3e6..689e6c83d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java @@ -15,33 +15,28 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.type.kind.ModuleKind; import org.scribble.type.name.ModuleName; import org.scribble.type.name.PackageName; public class ModuleNameNode extends QualifiedNameNode { + // ScribTreeAdaptor#create constructor public ModuleNameNode(Token t) { super(t); } - public ModuleNameNode(CommonTree source, String... ns) + // Tree#dupNode constructor + protected ModuleNameNode(ModuleNameNode node, String...elems) { - super(source, ns); - } - - @Override - protected ModuleNameNode copy() - { - return new ModuleNameNode(this.source, this.elems); + super(node); } @Override - public ModuleNameNode clone(AstFactory af) + public ModuleNameNode dupNode() { - return (ModuleNameNode) af.QualifiedNameNode(this.source, ModuleKind.KIND, this.elems); + return new ModuleNameNode(this, this.elems); } @Override @@ -80,4 +75,31 @@ public int hashCode() hash = 31 * hash + this.elems.hashCode(); return hash; } + + + + + + + + + + + + public ModuleNameNode(CommonTree source, String... ns) + { + super(source, ns); + } + + /*@Override + protected ModuleNameNode copy() + { + return new ModuleNameNode(this.source, this.elems); + } + + @Override + public ModuleNameNode clone(AstFactory af) + { + return (ModuleNameNode) af.QualifiedNameNode(this.source, ModuleKind.KIND, this.elems); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java index f2f1d6eda..97942fb25 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java @@ -13,16 +13,40 @@ */ package org.scribble.ast.name.qualified; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; public abstract class ProtocolNameNode extends MemberNameNode { + // ScribTreeAdaptor#create constructor + public ProtocolNameNode(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected ProtocolNameNode(ProtocolNameNode node, String...elems) + { + super(node, elems); + } + + public abstract ProtocolName toName(); + + + + + + + + + + + public ProtocolNameNode(CommonTree source, String... ns) { super(source, ns); } - public abstract ProtocolName toName(); } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java index 77b19b379..cabdad220 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java @@ -20,10 +20,25 @@ public abstract class QualifiedNameNode extends NameNode { + // ScribTreeAdaptor#create constructor public QualifiedNameNode(Token t) { super(t); } + + // Tree#dupNode constructor + protected QualifiedNameNode(QualifiedNameNode node, String...elems) + { + super(node, elems); + } + + + + + + + + public QualifiedNameNode(CommonTree source, String... ns) { diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index 51aa2e0b4..10dd931f9 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -30,7 +30,9 @@ // No counterpart needed for MessageNode because MessageSignature values can be syntactically distinguished from sig parameters //public class AmbigNameNode extends SimpleNameNode implements MessageNode, PayloadElemNameNode //public class AmbigNameNode extends SimpleNameNode implements MessageNode, PayloadElemNameNode -public class AmbigNameNode extends SimpleNameNode implements MessageNode, PayloadElemNameNode // Currently hardcoded to DataTypeKind for payload elems +public class AmbigNameNode extends SimpleNameNode + implements MessageNode, PayloadElemNameNode + // Currently hardcoded to DataTypeKind for payload elems { // ScribTreeAdaptor#create constructor public AmbigNameNode(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java index a45b6257d..cc9189f8a 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java @@ -13,7 +13,7 @@ */ package org.scribble.ast.name.simple; -import org.scribble.ast.AstFactory; +import org.antlr.runtime.Token; import org.scribble.del.ScribDel; import org.scribble.type.name.Role; import org.scribble.visit.Substitutor; @@ -23,21 +23,16 @@ public class DummyProjectionRoleNode extends RoleNode { public static final String DUMMY_PROJECTION_ROLE = "__DUMMY_ROLE"; - public DummyProjectionRoleNode() + // ScribTreeAdaptor#create constructor + public DummyProjectionRoleNode(Token t) { - super(null, DUMMY_PROJECTION_ROLE); + super(t); } - @Override - protected DummyProjectionRoleNode copy() - { - return new DummyProjectionRoleNode(); - } - - @Override - public DummyProjectionRoleNode clone(AstFactory af) + // Tree#dupNode constructor + protected DummyProjectionRoleNode(DummyProjectionRoleNode node, String id) { - return af.DummyProjectionRoleNode(); + super(node, id); } @Override @@ -89,4 +84,30 @@ public int hashCode() hash = 31 * super.hashCode(); return hash; } + + + + + + + + + + + public DummyProjectionRoleNode() + { + super(null, DUMMY_PROJECTION_ROLE); + } + + /*@Override + protected DummyProjectionRoleNode copy() + { + return new DummyProjectionRoleNode(); + } + + @Override + public DummyProjectionRoleNode clone(AstFactory af) + { + return af.DummyProjectionRoleNode(); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java index d7ca11b94..278741b78 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java @@ -13,6 +13,7 @@ */ package org.scribble.ast.name.simple; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; @@ -33,32 +34,36 @@ // An unambiguous kinded parameter (ambiguous parameters handled by disambiguation) that isn't a role -- e.g. DataType/MessageSigName param //public class NonRoleParamNode extends SimpleNameNode implements MessageNode, PayloadElemNameNode //public class NonRoleParamNode extends SimpleNameNode implements MessageNode, PayloadElemNameNode -public class NonRoleParamNode extends SimpleNameNode implements MessageNode, PayloadElemNameNode // As a payload, can only be a DataType (so hardcode) +public class NonRoleParamNode extends + SimpleNameNode implements MessageNode, PayloadElemNameNode + // As a payload, can only be a DataType (so hardcode) { public final K kind; - - public NonRoleParamNode(CommonTree source, K kind, String identifier) + + // ScribTreeAdaptor#create constructor + public NonRoleParamNode(Token t) { - super(source, identifier); - this.kind = kind; + super(t); + this.kind = null; // FIXME: how to set? (disamb?) -- probably do concrete data/sig subclasses? } - - @Override - public MessageNode project(AstFactory af) // MessageSigName params + + // Tree#dupNode constructor + protected NonRoleParamNode(NonRoleParamNode node, K kind, String id) { - return this; + super(node, id); + this.kind = kind; } - + @Override - protected NonRoleParamNode copy() + public NonRoleParamNode dupNode() { - return new NonRoleParamNode<>(this.source, this.kind, getIdentifier()); + return new NonRoleParamNode<>(this, this.kind, getIdentifier()); } @Override - public NonRoleParamNode clone(AstFactory af) + public MessageNode project(AstFactory af) // MessageSigName params { - return af.NonRoleParamNode(this.source, this.kind, getIdentifier()); + return this; } @Override @@ -179,4 +184,33 @@ public int hashCode() hash = 31 * super.hashCode(); return hash; } + + + + + + + + + + + + + public NonRoleParamNode(CommonTree source, K kind, String identifier) + { + super(source, identifier); + this.kind = kind; + } + + /*@Override + protected NonRoleParamNode copy() + { + return new NonRoleParamNode<>(this.source, this.kind, getIdentifier()); + } + + @Override + public NonRoleParamNode clone(AstFactory af) + { + return af.NonRoleParamNode(this.source, this.kind, getIdentifier()); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java index 2bdb3047d..097ac1d77 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java @@ -13,8 +13,8 @@ */ package org.scribble.ast.name.simple; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.type.kind.OpKind; import org.scribble.type.name.Op; @@ -22,22 +22,23 @@ public class OpNode extends SimpleNameNode { public static final String EMPTY_OPERATOR_IDENTIFIER = ""; - - public OpNode(CommonTree source, String identifier) + + // ScribTreeAdaptor#create constructor + public OpNode(Token t) { - super(source, identifier); + super(t); } - @Override - protected OpNode copy() + // Tree#dupNode constructor + protected OpNode(OpNode node, String id) { - return new OpNode(this.source, getIdentifier()); + super(node, id); } @Override - public OpNode clone(AstFactory af) + public OpNode dupNode() { - return (OpNode) af.SimpleNameNode(this.source, OpKind.KIND, getIdentifier()); + return new OpNode(this, getIdentifier()); } @Override @@ -78,4 +79,29 @@ public int hashCode() hash = 31 * super.hashCode(); return hash; } + + + + + + + + + + public OpNode(CommonTree source, String identifier) + { + super(source, identifier); + } + + /*@Override + protected OpNode copy() + { + return new OpNode(this.source, getIdentifier()); + } + + @Override + public OpNode clone(AstFactory af) + { + return (OpNode) af.SimpleNameNode(this.source, OpKind.KIND, getIdentifier()); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java index 4f0283826..1d14c3d51 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java @@ -13,38 +13,29 @@ */ package org.scribble.ast.name.simple; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.del.ScribDel; import org.scribble.type.kind.RecVarKind; import org.scribble.type.name.RecVar; public class RecVarNode extends SimpleNameNode { - public RecVarNode(CommonTree source, String identifier) + // ScribTreeAdaptor#create constructor + public RecVarNode(Token t) { - super(source, identifier); - } - - // Factor up to SimpleNameNode? - public RecVarNode reconstruct(String id) - { - ScribDel del = del(); - RecVarNode rv = new RecVarNode(this.source, id); - rv = (RecVarNode) rv.del(del); - return rv; + super(t); } - @Override - protected RecVarNode copy() + // Tree#dupNode constructor + protected RecVarNode(RecVarNode node, String id) { - return new RecVarNode(this.source, getIdentifier()); + super(node, id); } @Override - public RecVarNode clone(AstFactory af) + public RecVarNode dupNode() { - return (RecVarNode) af.SimpleNameNode(this.source, RecVarKind.KIND, getIdentifier()); + return new RecVarNode(this, getIdentifier()); } @Override @@ -80,4 +71,40 @@ public int hashCode() hash = 31 * super.hashCode(); return hash; } + + + + + + + + + + + + public RecVarNode(CommonTree source, String identifier) + { + super(source, identifier); + } + + /*// Factor up to SimpleNameNode? + public RecVarNode reconstruct(String id) + { + ScribDel del = del(); + RecVarNode rv = new RecVarNode(this.source, id); + rv = (RecVarNode) rv.del(del); + return rv; + } + + @Override + protected RecVarNode copy() + { + return new RecVarNode(this.source, getIdentifier()); + } + + @Override + public RecVarNode clone(AstFactory af) + { + return (RecVarNode) af.SimpleNameNode(this.source, RecVarKind.KIND, getIdentifier()); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java index 9f8c65069..e2f84556d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java @@ -13,8 +13,8 @@ */ package org.scribble.ast.name.simple; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.DoArgNode; import org.scribble.del.ScribDel; import org.scribble.type.kind.RoleKind; @@ -23,29 +23,31 @@ public class RoleNode extends SimpleNameNode implements DoArgNode //RoleDecl, RoleInstantiation { - public RoleNode(CommonTree source, String identifier) + // ScribTreeAdaptor#create constructor + public RoleNode(Token t) { - super(source, identifier); + super(t); } - @Override - protected RoleNode copy() + // Tree#dupNode constructor + protected RoleNode(RoleNode node, String id) { - return new RoleNode(this.source, getIdentifier()); + super(node, id); } @Override - public RoleNode clone(AstFactory af) + public RoleNode dupNode() { - return (RoleNode) af.SimpleNameNode(this.source, RoleKind.KIND, getIdentifier()); + return new RoleNode(this, getIdentifier()); } - protected RoleNode reconstruct(String identifier) + // RoleNode is the only NameNode with a reconstruct (so not factored up) + protected RoleNode reconstruct(String id) { - ScribDel del = del(); // Default delegate assigned in ModelFactoryImpl for all simple names - RoleNode rn = new RoleNode(this.source, identifier); - rn = (RoleNode) rn.del(del); - return rn; + RoleNode r = dupNode(); + ScribDel del = del(); // Default delegate assigned in ModelFactoryImpl for all simple names + r.setDel(del); // No copy + return r; } @Override @@ -88,4 +90,32 @@ public int hashCode() hash = 31 * super.hashCode(); return hash; } + + + + + + + + + + + + + public RoleNode(CommonTree source, String identifier) + { + super(source, identifier); + } + + /*@Override + protected RoleNode copy() + { + return new RoleNode(this.source, getIdentifier()); + } + + @Override + public RoleNode clone(AstFactory af) + { + return (RoleNode) af.SimpleNameNode(this.source, RoleKind.KIND, getIdentifier()); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/ScopeNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/ScopeNode.java deleted file mode 100644 index 3423fc362..000000000 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/ScopeNode.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.name.simple; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.type.kind.ScopeKind; -import org.scribble.type.name.Scope; - -// Currently unused (TODO: interruptible) -public class ScopeNode extends SimpleNameNode -{ - public ScopeNode(CommonTree source, String identifier) - { - super(source, identifier); - } - - @Override - protected ScopeNode copy() - { - return new ScopeNode(this.source, getIdentifier()); - } - - @Override - public ScopeNode clone(AstFactory af) - { - return (ScopeNode) af.SimpleNameNode(this.source, ScopeKind.KIND, getIdentifier()); - } - - @Override - public Scope toName() - { - return new Scope(getIdentifier()); - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof ScopeNode)) - { - return false; - } - return ((ScopeNode) o).canEqual(this) && super.equals(o); - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof ScopeNode; - } - - @Override - public int hashCode() - { - int hash = 359; - hash = 31 * super.hashCode(); - return hash; - } -} diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java index 3585afac9..f32ef1daa 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java @@ -18,7 +18,7 @@ import org.scribble.ast.name.NameNode; import org.scribble.type.kind.Kind; -// Parser Identifier +// "Identifier" in parser grammar public abstract class SimpleNameNode extends NameNode { // ScribTreeAdaptor#create constructor diff --git a/scribble-core/src/main/java/org/scribble/del/ContinueDel.java b/scribble-core/src/main/java/org/scribble/del/ContinueDel.java index 410a31836..bcaee0035 100644 --- a/scribble-core/src/main/java/org/scribble/del/ContinueDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ContinueDel.java @@ -38,10 +38,12 @@ public Continue leaveProtocolInlining(ScribNode parent, ScribNode child, Prot }*/ @Override - public ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) throws ScribbleException + public ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, + ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) + throws ScribbleException { Continue cont = (Continue) visited; - RecVar rv = cont.recvar.toName(); + RecVar rv = cont.getRecVarChild().toName(); if (unf.isContinueUnguarded(rv)) // Without this, graph building becomes sensitive to the order of choice blocks (specifically, the relative position were the side effect (re-set entry to rec state) of an unguarded continue is performed) { Recursion tmp = unf.getRecVar(rv); @@ -49,20 +51,20 @@ public ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child { return cont; } - return unf.getRecVar(rv).clone(unf.job.af); + return unf.getRecVar(rv).clone();//unf.job.af); } else if (unf.shouldUnfoldForUnguardedRec(rv)) { - return unf.getRecVar(rv).clone(unf.job.af); + return unf.getRecVar(rv).clone();//unf.job.af); } return cont; } @Override - public ScribNode leaveRecVarCollection(ScribNode parent, ScribNode child, RecVarCollector coll, ScribNode visited) - throws ScribbleException + public ScribNode leaveRecVarCollection(ScribNode parent, ScribNode child, + RecVarCollector coll, ScribNode visited) throws ScribbleException { - coll.removeName(((Continue) visited).recvar.toName()); + coll.removeName(((Continue) visited).getRecVarChild().toName()); return visited; } } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java index fdd5b11e1..6a5e6c07d 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -39,40 +39,48 @@ public class GChoiceDel extends ChoiceDel implements GCompoundInteractionNodeDel { @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { GChoice gc = (GChoice) visited; List blocks = gc.getBlockChildren().stream() - .map(b -> (GProtocolBlock) ((InlineProtocolEnv) b.del().env()).getTranslation()).collect(Collectors.toList()); - RoleNode subj = gc.subj.clone(inl.job.af); + .map(b -> (GProtocolBlock) ((InlineProtocolEnv) b.del().env()) + .getTranslation()) + .collect(Collectors.toList()); + RoleNode subj = gc.getSubjectChild().clone(inl.job.af); GChoice inlined = inl.job.af.GChoice(gc.getSource(), subj, blocks); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (GChoice) super.leaveProtocolInlining(parent, child, inl, gc); } @Override - public void enterInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker) throws ScribbleException + public void enterInlinedWFChoiceCheck(ScribNode parent, ScribNode child, + WFChoiceChecker checker) throws ScribbleException { // No super call -- replacing base routine with this one WFChoiceEnv env = checker.peekEnv().enterContext(); env = env.clear(); - env = env.enableChoiceSubject(((GChoice) child).subj.toName()); + env = env.enableChoiceSubject(((GChoice) child).getSubjectChild().toName()); checker.pushEnv(env); } @Override - public GChoice leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException + public GChoice leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, + WFChoiceChecker checker, ScribNode visited) throws ScribbleException { GChoice cho = (GChoice) visited; - Role subj = cho.subj.toName(); + RoleNode subjNode = cho.getSubjectChild(); + Role subj = subjNode.toName(); if (!checker.peekParentEnv().isEnabled(subj)) { - throw new ScribbleException(cho.subj.getSource(), "Subject not enabled: " + subj); + throw new ScribbleException(subjNode.getSource(), + "Subject not enabled: " + subj); } // Enabled senders checked in GMessageTransferDel List all = - cho.getBlockChildren().stream().map(b -> (WFChoiceEnv) b.del().env()).collect(Collectors.toList()); + cho.getBlockChildren().stream().map(b -> (WFChoiceEnv) b.del().env()) + .collect(Collectors.toList()); if (checker.job.useOldWf) // **** { if (all.size() > 1) @@ -84,37 +92,45 @@ public GChoice leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFCh Set dests = benv0.getEnabled().getDestinations(); // Same roles enabled in every block - benvs.stream().map(e -> e.getEnabled().getDestinations()).forEach((rs) -> - { - if (!dests.equals(rs)) + benvs.stream().map(e -> e.getEnabled().getDestinations()) + .forEach(rs -> { - throw new RuntimeScribbleException("Mismatched enabled roles: " + dests + ", " + rs); - } - }); + if (!dests.equals(rs)) + { + throw new RuntimeScribbleException( + "Mismatched enabled roles: " + dests + ", " + rs); + } + }); dests.remove(subj); for (Role dest : dests) { // Same enabler(s) for each enabled role Set srcs = benv0.getEnabled().getSources(dest); // Always singleton? - benvs.stream().map(e -> e.getEnabled().getSources(dest)).forEach((rs) -> - { - if (!srcs.equals(rs)) + benvs.stream().map(e -> e.getEnabled().getSources(dest)) + .forEach(rs -> { - throw new RuntimeScribbleException("Mismatched enabler roles for " + dest + ": " + srcs + ", " + rs); - } - }); + if (!srcs.equals(rs)) + { + throw new RuntimeScribbleException( + "Mismatched enabler roles for " + dest + ": " + srcs + + ", " + rs); + } + }); // Distinct enabling messages Set> mids = benv0.getEnabled().getMessages(dest); - benvs.stream().map(e -> e.getEnabled().getMessages(dest)).forEach((ms) -> - { - if (!Collections.disjoint(mids, ms)) + benvs.stream().map(e -> e.getEnabled().getMessages(dest)) + .forEach(ms -> { - throw new RuntimeScribbleException("Non disjoint enabling messages for " + dest + ": " + mids + ", " + ms); - } - mids.addAll(ms); - }); + if (!Collections.disjoint(mids, ms)) + { + throw new RuntimeScribbleException( + "Non disjoint enabling messages for " + dest + ": " + + mids + ", " + ms); + } + mids.addAll(ms); + }); } } catch (RuntimeScribbleException rse) // Lambda hack @@ -141,19 +157,26 @@ public GChoice leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFCh // In principle, for the envLeave we should only be doing the latter (as countpart to enterEnv), but it is much more convenient for the compound-node (choice) to collect all the child block envs and merge here, rather than each individual block env trying to (partially) merge into the parent-choice as they are visited WFChoiceEnv merged = checker.popEnv().mergeContexts(all); checker.pushEnv(merged); // Merges the child block envs into the current choice env; super call below merges this choice env into the parent env of the choice - return (GChoice) super.leaveInlinedWFChoiceCheck(parent, child, checker, visited); // Replaces base popAndSet to do pop, merge and set + return (GChoice) super.leaveInlinedWFChoiceCheck(parent, child, checker, + visited); + // Replaces base popAndSet to do pop, merge and set // super call, unlike enter -- only leave is overridden in CompoundInteractionNodeDel, to do the "single" merge (cf. the "multiple" merge done above here) } @Override - public GChoice leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException + public GChoice leaveProjection(ScribNode parent, ScribNode child, + Projector proj, ScribNode visited) throws ScribbleException { GChoice gc = (GChoice) visited; List blocks = - gc.getBlockChildren().stream().map(b -> (LProtocolBlock) ((ProjectionEnv) b.del().env()).getProjection()).collect(Collectors.toList()); + gc.getBlockChildren().stream() + .map(b -> (LProtocolBlock) ((ProjectionEnv) b.del().env()) + .getProjection()) + .collect(Collectors.toList()); //gc.getBlocks().stream().map(b -> ((GProtocolBlockDel) b.del()).project(b, self)).collect(Collectors.toList()); LChoice projection = gc.project(proj.job.af, proj.peekSelf(), blocks); proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GChoice) GCompoundInteractionNodeDel.super.leaveProjection(parent, child, proj, gc); + return (GChoice) GCompoundInteractionNodeDel.super.leaveProjection(parent, + child, proj, gc); } } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java b/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java index fa8d6796d..1debba0c0 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java @@ -26,10 +26,12 @@ public class GContinueDel extends ContinueDel implements GSimpleInteractionNodeDel { @Override - public GContinue leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public GContinue leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { GContinue gc = (GContinue) visited; - RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) gc.recvar.del().env()).getTranslation(); + RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) gc.getRecVarChild() + .del().env()).getTranslation(); GContinue inlined = inl.job.af.GContinue(gc.getSource(), recvar); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (GContinue) super.leaveProtocolInlining(parent, child, inl, gc); @@ -43,12 +45,14 @@ public GContinue leaveProtocolInlining(ScribNode parent, ScribNode child, Protoc }*/ @Override - public GContinue leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException + public GContinue leaveProjection(ScribNode parent, ScribNode child, + Projector proj, ScribNode visited) throws ScribbleException { GContinue gc = (GContinue) visited; //LContinue projection = project(proj.job.af, gc, proj.peekSelf()); LContinue projection = gc.project(proj.job.af, proj.peekSelf()); proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GContinue) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gc); + return (GContinue) GSimpleInteractionNodeDel.super.leaveProjection(parent, + child, proj, gc); } } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java index 9fad4b3f2..d6332eb9a 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java @@ -16,6 +16,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GDisconnect; import org.scribble.ast.local.LNode; +import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ConnectionActionDel; import org.scribble.main.ScribbleException; import org.scribble.type.name.Role; @@ -45,31 +46,33 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisa public GDisconnect leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException { GDisconnect gd = (GDisconnect) visited; + RoleNode leftNode = gd.getLeftChild(); + RoleNode rightNode = gd.getRightChild(); - Role src = gd.src.toName(); - if (!checker.peekEnv().isEnabled(src)) + Role left = leftNode.toName(); + if (!checker.peekEnv().isEnabled(left)) { - throw new ScribbleException(gd.src.getSource(), "Role not enabled: " + src); + throw new ScribbleException(leftNode.getSource(), "Role not enabled: " + left); } //Message msg = gd.msg.toMessage(); // Unit message WFChoiceEnv env = checker.popEnv(); //for (Role dest : gc.getDestinationRoles()) - Role dest = gd.dest.toName(); - if (!env.isEnabled(dest)) + Role right = rightNode.toName(); + if (!env.isEnabled(right)) { - throw new ScribbleException(gd.dest.getSource(), "Role not enabled: " + dest); + throw new ScribbleException(rightNode.getSource(), "Role not enabled: " + right); } { - if (src.equals(dest)) + if (left.equals(right)) { throw new ScribbleException(gd.getSource(), "[TODO] Self connections not supported: " + gd); // Would currently be subsumed by the below } - if (!env.isConnected(src, dest)) + if (!env.isConnected(left, right)) { - throw new ScribbleException(gd.getSource(), "Roles not (necessarily) connected: " + src + ", " + dest); + throw new ScribbleException(gd.getSource(), "Roles not (necessarily) connected: " + left + ", " + right); } - env = env.disconnect(src, dest);//.removeMessage(src, dest, ...); // Is remove really needed? + env = env.disconnect(left, right);//.removeMessage(src, dest, ...); // Is remove really needed? /*env = env .disconnect(src, dest) .removeMessage(src, dest, new MessageSig(Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD)); // FIXME: factor out dummy connection message with GConnect etc.*/ diff --git a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java b/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java index c00f8354c..6b42bbc6d 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java @@ -129,7 +129,7 @@ public GInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, RecRem GInteractionSeq gis = (GInteractionSeq) visited; List gins = gis.getInteractNodeChildren().stream().flatMap((gi) -> (gi instanceof GRecursion && rem.toRemove(((GRecursion) gi).recvar.toName())) - ? ((GRecursion) gi).getBlock().getInteractSeqChild().getInteractNodeChildren().stream() + ? ((GRecursion) gi).getBlockChild().getInteractSeqChild().getInteractNodeChildren().stream() : Stream.of(gi) ).collect(Collectors.toList()); return rem.job.af.GInteractionSeq(gis.getSource(), gins); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java b/scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java index 9fc081899..4f6cd0d53 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java @@ -33,35 +33,41 @@ import org.scribble.visit.wf.ReachabilityChecker; import org.scribble.visit.wf.env.ReachabilityEnv; -public class LContinueDel extends ContinueDel implements LSimpleInteractionNodeDel +public class LContinueDel extends ContinueDel + implements LSimpleInteractionNodeDel { @Override - public LContinue leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public LContinue leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { LContinue lc = (LContinue) visited; - RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) lc.recvar.del().env()).getTranslation(); + RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) lc.getRecVarChild() + .del().env()).getTranslation(); LContinue inlined = inl.job.af.LContinue(lc.getSource(), recvar); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (LContinue) super.leaveProtocolInlining(parent, child, inl, lc); } @Override - public LContinue leaveReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker, ScribNode visited) throws ScribbleException + public LContinue leaveReachabilityCheck(ScribNode parent, ScribNode child, + ReachabilityChecker checker, ScribNode visited) throws ScribbleException { // "Entering" the continue here in leave, where we can merge the new state into the parent Env // Generally: if side effecting Env state to be merged into the parent (not just popped and discarded), leave must be overridden to do so LContinue lc = (LContinue) visited; - ReachabilityEnv env = checker.popEnv().addContinueLabel(lc.recvar.toName()); + ReachabilityEnv env = checker.popEnv() + .addContinueLabel(lc.getRecVarChild().toName()); setEnv(env); // Env recording probably not needed for all LocalInteractionNodes, just the compound ones, like for WF-choice checking checker.pushEnv(checker.popEnv().mergeContext(env)); return lc; } @Override - public LContinue leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder graph, ScribNode visited) throws ScribbleException + public LContinue leaveEGraphBuilding(ScribNode parent, ScribNode child, + EGraphBuilder graph, ScribNode visited) throws ScribbleException { LContinue lr = (LContinue) visited; - RecVar rv = lr.recvar.toName(); + RecVar rv = lr.getRecVarChild().toName(); if (graph.util.isUnguardedInChoice()) { graph.util.addContinueEdge(graph.util.getEntry(), rv); @@ -86,7 +92,9 @@ public LContinue leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBu removed.add(tmp); graph.util.removeEdgeFromPredecessor(pred, prev); // Assumes pred is a predecessor, and removes pred from current predecessors.. } - graph.util.addRecursionEdge(pred, prev, graph.util.getRecursionEntry(rv)); // May be repeated for non-det, but OK // Combine with removeEdgeFromPredecessor? + graph.util.addRecursionEdge(pred, prev, + graph.util.getRecursionEntry(rv)); + // May be repeated for non-det, but OK // Combine with removeEdgeFromPredecessor? } } return (LContinue) super.leaveEGraphBuilding(parent, child, graph, lr); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LDisconnectDel.java b/scribble-core/src/main/java/org/scribble/del/local/LDisconnectDel.java index e3563ff51..010c4b777 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LDisconnectDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LDisconnectDel.java @@ -21,20 +21,24 @@ import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -public class LDisconnectDel extends ConnectionActionDel implements LSimpleInteractionNodeDel +public class LDisconnectDel extends ConnectionActionDel + implements LSimpleInteractionNodeDel { @Override - public LDisconnect leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder builder, ScribNode visited) throws ScribbleException + public LDisconnect leaveEGraphBuilding(ScribNode parent, ScribNode child, + EGraphBuilder builder, ScribNode visited) throws ScribbleException { LDisconnect ld = (LDisconnect) visited; - Role peer = ld.peer.toName(); - builder.util.addEdge(builder.util.getEntry(), builder.job.ef.newEDisconnect(peer), builder.util.getExit()); + Role peer = ld.getPeerChild().toName(); + builder.util.addEdge(builder.util.getEntry(), + builder.job.ef.newEDisconnect(peer), builder.util.getExit()); return (LDisconnect) super.leaveEGraphBuilding(parent, child, builder, ld); } @Override - public void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) + public void enterProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer) { - fixer.setChoiceSubject(((LDisconnect) child).src.toName()); + fixer.setChoiceSubject(((LDisconnect) child).getSelfChild().toName()); } } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java b/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java index decc697f9..8fee60c8b 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java @@ -141,7 +141,7 @@ public LInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, RecRem LInteractionSeq lis = (LInteractionSeq) visited; List lins = lis.getInteractNodeChildren().stream().flatMap((li) -> (li instanceof LRecursion && rem.toRemove(((LRecursion) li).recvar.toName())) - ? ((LRecursion) li).getBlock().getInteractSeqChild().getInteractNodeChildren().stream() + ? ((LRecursion) li).getBlockChild().getInteractSeqChild().getInteractNodeChildren().stream() : Stream.of(li) ).collect(Collectors.toList()); return rem.job.af.LInteractionSeq(lis.getSource(), lins); diff --git a/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java b/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java index ff1a71b3c..b3744a480 100644 --- a/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java @@ -139,7 +139,7 @@ public Recursion getRecVar(RecVar recvar) // Maybe possible to revise this algorithm to handle shadowed recs, but currently requires unique recvar names public void setRecVar(AstFactory af, RecVar recvar, Recursion rec) throws ScribbleException { - ProtocolBlock block = (ProtocolBlock) rec.getBlock().accept(this); + ProtocolBlock block = (ProtocolBlock) rec.getBlockChild().accept(this); RecVarNode rv = rec.recvar.clone(af); Recursion unfolded; if (rec.getKind() == Global.KIND) diff --git a/scribble-core/src/main/java/org/scribble/visit/UnfoldingVisitor.java b/scribble-core/src/main/java/org/scribble/visit/UnfoldingVisitor.java index 538f975ac..9093b87b1 100644 --- a/scribble-core/src/main/java/org/scribble/visit/UnfoldingVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/UnfoldingVisitor.java @@ -35,9 +35,10 @@ // FIXME: would be better to only unfold "as needed" (unguarded choice-recs) // N.B. so subclass should manually keep track of when to cut off visiting, as visiting the "unfolding" will eventually reach the same continue (e.g. an unguarded choice-continue) -- currently using pointer equality in e.g. InlinedWFChoice to cut off traversal on reaching the "same" choice again // Cf. InlinedProtocolUnfolder, statically unfolds unguarded recursions and continues "directly under" choices -public abstract class UnfoldingVisitor> extends InlinedProtocolVisitor +public abstract class UnfoldingVisitor> + extends InlinedProtocolVisitor { - private Map>> recs = new HashMap<>(); + private Map>> recs = new HashMap<>(); // Stack needed to handle bad reachability cases (e.g. ... continue X; continue Y; -- if rec Y inside unfolding of X, need to push again before popping so Y still in scope for continue) -- since reachability isn't checked until after projection // Also FIXME: recvar shadowing: though this stack should be enough private Set unfolded = new HashSet<>(); @@ -48,19 +49,21 @@ public UnfoldingVisitor(Job job) } @Override - public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleException + public ScribNode visit(ScribNode parent, ScribNode child) + throws ScribbleException { enter(parent, child); ScribNode visited = visitForUnfolding(parent, child); return leave(parent, child, visited); } - protected ScribNode visitForUnfolding(ScribNode parent, ScribNode child) throws ScribbleException + protected ScribNode visitForUnfolding(ScribNode parent, ScribNode child) + throws ScribbleException { if (child instanceof Continue) { Continue cont = (Continue) child; - RecVar rv = cont.recvar.toName(); + RecVar rv = cont.getRecVarChild().toName(); if (!this.unfolded.contains(rv)) { this.unfolded.add(rv); @@ -69,7 +72,8 @@ protected ScribNode visitForUnfolding(ScribNode parent, ScribNode child) throws // Also visitChildren, not accept (so not doing enter/exit for the seq) // Also not returning the seq, just the original continue (cf. do visiting) //this.recs.get(rv).peek().seq.clone().visitChildren(this); // No: e.g. InlinedWFChoiceChecker uses pointer equality to check if Choice already visited - this.recs.get(rv).peek().seq.visitChildren(this); // FIXME: ok to visit the same AST? any problems with dels/envs? -- maybe do proper equals/hashCode for AST classes + this.recs.get(rv).peek().getInteractSeqChild().visitChildren(this); + // CHECKME: ok to visit the same AST? any problems with dels/envs? -- maybe do proper equals/hashCode for AST classes this.unfolded.remove(rv); return cont; } @@ -78,31 +82,33 @@ protected ScribNode visitForUnfolding(ScribNode parent, ScribNode child) throws } @Override - protected final void inlinedEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected final void inlinedEnter(ScribNode parent, ScribNode child) + throws ScribbleException { super.inlinedEnter(parent, child); if (child instanceof Recursion) { Recursion rec = (Recursion) child; - RecVar rv = rec.recvar.toName(); + RecVar rv = rec.getRecVarChild().toName(); if (!this.recs.containsKey(rv)) { this.recs.put(rv, new LinkedList<>()); } Deque> blocks = this.recs.get(rv); - blocks.push(rec.block); + blocks.push(rec.getBlockChild()); } unfoldingEnter(parent, child); } @Override - protected final ScribNode inlinedLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected final ScribNode inlinedLeave(ScribNode parent, ScribNode child, + ScribNode visited) throws ScribbleException { ScribNode n = unfoldingLeave(parent, child, visited); if (child instanceof Recursion) { Recursion rec = (Recursion) child; - RecVar rv = rec.recvar.toName(); + RecVar rv = rec.getRecVarChild().toName(); Deque> blocks = this.recs.get(rv); blocks.pop(); /*if (blocks.isEmpty()) // Unnecessary? But tidier? @@ -113,12 +119,14 @@ protected final ScribNode inlinedLeave(ScribNode parent, ScribNode child, ScribN return super.inlinedLeave(parent, child, n); } - protected void unfoldingEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected void unfoldingEnter(ScribNode parent, ScribNode child) + throws ScribbleException { } - protected ScribNode unfoldingLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected ScribNode unfoldingLeave(ScribNode parent, ScribNode child, + ScribNode visited) throws ScribbleException { return visited; } diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java index dbfea08c5..f1e3306ac 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java @@ -39,7 +39,6 @@ public ProjectedChoiceDoPruner(Job job) super(job); } - /*@Override protected ProjectedSubprotocolPruningEnv makeRootProtocolDeclEnv(ProtocolDecl pd) { @@ -47,7 +46,8 @@ protected ProjectedSubprotocolPruningEnv makeRootProtocolDeclEnv(ProtocolDecl Date: Mon, 28 Jan 2019 15:42:04 +0000 Subject: [PATCH 079/539] Continued WIP. --- .../src/main/java/org/scribble/ast/Do.java | 123 +++++++++++------- .../src/main/java/org/scribble/ast/DoArg.java | 58 +++++++-- .../java/org/scribble/ast/MessageSigNode.java | 109 +++++++++++----- .../org/scribble/ast/MessageTransfer.java | 4 +- .../java/org/scribble/ast/NonRoleArg.java | 60 ++++++--- .../java/org/scribble/ast/NonRoleArgList.java | 8 +- .../main/java/org/scribble/ast/RoleArg.java | 66 +++++++--- .../java/org/scribble/ast/global/GDo.java | 87 +++++++++---- .../scribble/ast/global/GMessageTransfer.java | 21 ++- .../main/java/org/scribble/ast/local/LDo.java | 111 ++++++++++------ .../java/org/scribble/ast/local/LReceive.java | 88 ++++++++----- .../java/org/scribble/ast/local/LSend.java | 90 ++++++++----- .../name/simple/DummyProjectionRoleNode.java | 29 +++-- .../scribble/visit/SubprotocolVisitor.java | 109 +++++++++++----- 14 files changed, 651 insertions(+), 312 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/Do.java b/scribble-core/src/main/java/org/scribble/ast/Do.java index a84c74145..f8e3cdc8c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Do.java +++ b/scribble-core/src/main/java/org/scribble/ast/Do.java @@ -15,9 +15,11 @@ import java.util.Iterator; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.qualified.ProtocolNameNode; +import org.scribble.del.ScribDel; import org.scribble.main.JobContext; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ProtocolKind; @@ -25,33 +27,60 @@ import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; -public abstract class Do extends SimpleInteractionNode //implements ScopedNode +public abstract class Do + extends SimpleInteractionNode // implements ScopedNode { - //public final ScopeNode scope; - public final RoleArgList roles; - public final NonRoleArgList args; - public final ProtocolNameNode proto; // Maybe use an "Ambiguous" version until names resolved -- is a visible protocol, but not necessarily a simple or full member name + // ScribTreeAdaptor#create constructor + public Do(Token t) + { + super(t); + this.roles = null; + this.args = null; + this.proto = null; + } - protected Do(CommonTree source, RoleArgList roleinstans, NonRoleArgList arginstans, ProtocolNameNode proto) + // Tree#dupNode constructor + public Do(Do node) { - super(source); - //this.scope = scope; - this.roles = roleinstans; - this.args = arginstans; - this.proto = proto; + super(node); + this.roles = null; + this.args = null; + this.proto = null; + } + + // CHECKME: maybe wrap up role args and non-role args within the same container? + public RoleArgList getRoleListChild() + { + return (RoleArgList) getChild(0); } - public abstract Do reconstruct(RoleArgList roleinstans, NonRoleArgList arginstans, ProtocolNameNode proto); + public NonRoleArgList getArgListChild() + { + return (NonRoleArgList) getChild(1); + } public abstract ProtocolNameNode getProtocolNameNode(); + + public abstract Do dupNode(); + + public Do reconstruct(RoleArgList roles, NonRoleArgList args, ProtocolNameNode proto) + { + Do sig = dupNode(); + sig.addChild(roles); + sig.addChild(args); + sig.addChild(proto); + ScribDel del = del(); + sig.setDel(del); // No copy + return sig; + } @Override public Do visitChildren(AstVisitor nv) throws ScribbleException { - //ScopeNode scope = isScoped() ? (ScopeNode) visitChild(this.scope, nv) : null; - RoleArgList ril = (RoleArgList) visitChild(this.roles, nv); - NonRoleArgList al = (NonRoleArgList) visitChild(this.args, nv); - ProtocolNameNode proto = visitChildWithClassEqualityCheck(this, this.proto, nv); + RoleArgList ril = (RoleArgList) visitChild(getRoleListChild(), nv); + NonRoleArgList al = (NonRoleArgList) visitChild(getArgListChild(), nv); + ProtocolNameNode proto = visitChildWithClassEqualityCheck(this, + getProtocolNameNode(), nv); return reconstruct(ril, al, proto); } @@ -61,20 +90,24 @@ public Do visitChildren(AstVisitor nv) throws ScribbleException public ProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) { //return mcontext.checkProtocolDeclDependencyFullName(this.proto.toName()); - return this.proto.toName(); // Pre: use after name disambiguation (maybe drop FullName suffix) + return getProtocolNameNode().toName(); // Pre: use after name disambiguation (maybe drop FullName suffix) } // mcontext redundant because redundant for getTargetProtocolDeclFullName - public ProtocolDecl getTargetProtocolDecl(JobContext jcontext, ModuleContext mcontext) + public ProtocolDecl getTargetProtocolDecl(JobContext jcontext, + ModuleContext mcontext) { ProtocolName fullname = getTargetProtocolDeclFullName(mcontext); - return jcontext.getModule(fullname.getPrefix()).getProtocolDeclChild(fullname.getSimpleName()); + return jcontext.getModule(fullname.getPrefix()) + .getProtocolDeclChild(fullname.getSimpleName()); } - public Role getTargetRoleParameter(JobContext jcontext, ModuleContext mcontext, Role role) + public Role getTargetRoleParameter(JobContext jcontext, + ModuleContext mcontext, Role role) { - Iterator args = this.roles.getRoles().iterator(); - Iterator params = getTargetProtocolDecl(jcontext, mcontext).header.roledecls.getRoles().iterator(); + Iterator args = getRoleListChild().getRoles().iterator(); + Iterator params = getTargetProtocolDecl(jcontext, mcontext) + .getHeaderChild().getRoleDeclListChild().getRoles().iterator(); while (args.hasNext()) { Role arg = args.next(); @@ -86,34 +119,36 @@ public Role getTargetRoleParameter(JobContext jcontext, ModuleContext mcontext, } throw new RuntimeException("Not an argument role: " + role); } - - /*@Override - public boolean isEmptyScope() - { - return this.scope == null; - } @Override - //public Scope getScope() - public SimpleName getScopeElement() + public String toString() { - return this.scope.toName(); + String s = Constants.DO_KW + " "; + return s + getProtocolNameNode() + getArgListChild() + getRoleListChild() + + ";"; } - public boolean isScoped() - { - return this.scope != null; - }*/ + + + + + + + + + + + + + private final RoleArgList roles; + private final NonRoleArgList args; + private final ProtocolNameNode proto; // Maybe use an "Ambiguous" version until names resolved -- is a visible protocol, but not necessarily a simple or full member name - @Override - public String toString() + protected Do(CommonTree source, RoleArgList roleinstans, NonRoleArgList arginstans, ProtocolNameNode proto) { - String s = Constants.DO_KW + " "; - //if (!hasEmptyScopeNode()) - /*if (isScoped()) - { - s += this.scope + ":"; - }*/ - return s + this.proto + this.args + this.roles + ";"; + super(source); + this.roles = roleinstans; + this.args = arginstans; + this.proto = proto; } } diff --git a/scribble-core/src/main/java/org/scribble/ast/DoArg.java b/scribble-core/src/main/java/org/scribble/ast/DoArg.java index 6a7039d8c..3a82f3a68 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DoArg.java +++ b/scribble-core/src/main/java/org/scribble/ast/DoArg.java @@ -13,29 +13,51 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; +// TODO: rename better? DoArg, DoArgNode, ... +// CHECKME: make DoArg into an interface and have DoArgNode as direct children of Do? // Cf. NameDeclNode/HeaderParameterDecl, i.e. wrappers for param names/arg values // Simpler than NameDeclNode, doesn't constrain node-type correspondence for names public abstract class DoArg extends ScribNodeBase { - public final T val; + // ScribTreeAdaptor#create constructor + public DoArg(Token t) + { + super(t); + this.val = null; + } - protected DoArg(CommonTree source, T arg) + // Tree#dupNode constructor + public DoArg(DoArg node) { - super(source); - this.val = arg; + super(node); + this.val = null; } + + public abstract T getValChild(); + + public abstract DoArg dupNode(); - public abstract DoArg reconstruct(T arg); + public DoArg reconstruct(T arg) + { + DoArg sig = dupNode(); + sig.addChild(arg); + ScribDel del = del(); + sig.setDel(del); // No copy + return sig; + } @Override public DoArg visitChildren(AstVisitor nv) throws ScribbleException { - ScribNode visited = visitChild(this.val, nv); // Disambiguation will replace AmbiguousNameNodes*/ + ScribNode visited = visitChild(getValChild(), nv); // Disambiguation will replace AmbiguousNameNodes + // CHECKME: use visitChildWithClassEqualityCheck? if (!(visited instanceof DoArgNode)) { throw new RuntimeException("Shouldn't get in here: " + visited); @@ -44,11 +66,6 @@ public DoArg visitChildren(AstVisitor nv) throws ScribbleException T arg = (T) visited; return reconstruct(arg); } - - public T getVal() - { - return this.val; - } public abstract DoArg project(AstFactory af, Role self); @@ -57,4 +74,23 @@ public String toString() { return this.val.toString(); } + + + + + + + + + + + + private final T val; + + protected DoArg(CommonTree source, T arg) + { + super(source); + this.val = arg; + } + } diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java b/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java index 6eed9f625..6e5e6e4ee 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java @@ -13,6 +13,7 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.OpNode; import org.scribble.del.ScribDel; @@ -22,52 +23,63 @@ public class MessageSigNode extends ScribNodeBase implements MessageNode { - public final OpNode op; - public final PayloadElemList payloads; + // ScribTreeAdaptor#create constructor + public MessageSigNode(Token t) + { + super(t); + this.op = null; + this.payloads = null; + } - public MessageSigNode(CommonTree source, OpNode op, PayloadElemList payload) + // Tree#dupNode constructor + public MessageSigNode(MessageSigNode node) { - super(source); - this.op = op; - this.payloads = payload; + super(node); + this.op = null; + this.payloads = null; } - @Override - public MessageNode project(AstFactory af) // Currently outside of visitor/env pattern + public OpNode getOpChild() { - return af.MessageSigNode(this.source, this.op, this.payloads.project(af)); // Original del not retained by projection + return (OpNode) getChild(0); } - - @Override - protected MessageSigNode copy() - { - return new MessageSigNode(this.source, this.op, this.payloads); - } - - @Override - public MessageSigNode clone(AstFactory af) + + public PayloadElemList getPayloadListChild() { - OpNode op = this.op.clone(af); - PayloadElemList payload = this.payloads.clone(af); - return af.MessageSigNode(this.source, op, payload); + return (PayloadElemList) getChild(1); } + public MessageSigNode dupNode() + { + return new MessageSigNode(this); + } + public MessageSigNode reconstruct(OpNode op, PayloadElemList payload) { - ScribDel del = del(); - MessageSigNode msn = new MessageSigNode(this.source, op, payload); - msn = (MessageSigNode) msn.del(del); - return msn; + MessageSigNode sig = dupNode(); + sig.addChild(op); + sig.addChild(payload); + ScribDel del = del(); + sig.setDel(del); // No copy + return sig; } @Override public MessageSigNode visitChildren(AstVisitor nv) throws ScribbleException { - OpNode op = (OpNode) visitChild(this.op, nv); - PayloadElemList payload = (PayloadElemList) visitChild(this.payloads, nv); - return reconstruct(op, payload); + OpNode op = (OpNode) visitChild(getOpChild(), nv); + PayloadElemList pay = (PayloadElemList) + visitChild(getPayloadListChild(), nv); + return reconstruct(op, pay); } + @Override + public MessageNode project(AstFactory af) // Currently outside of visitor/env pattern + { + return af.MessageSigNode(this.source, getOpChild(), + getPayloadListChild().project(af)); + // Original del not retained by projection + } @Override public boolean isMessageSigNode() @@ -79,7 +91,8 @@ public boolean isMessageSigNode() @Override public MessageSig toArg() { - return new MessageSig(this.op.toName(), this.payloads.toPayload()); + return new MessageSig(getOpChild().toName(), + getPayloadListChild().toPayload()); } @Override @@ -91,6 +104,42 @@ public MessageSig toMessage() @Override public String toString() { - return this.op.toString() + this.payloads.toString(); + return getOpChild().toString() + getPayloadListChild().toString(); + } + + + + + + + + + + + + private final OpNode op; + private final PayloadElemList payloads; + + public MessageSigNode(CommonTree source, OpNode op, PayloadElemList payload) + { + super(source); + this.op = op; + this.payloads = payload; } + + /*@Override + protected MessageSigNode copy() + { + return new MessageSigNode(this.source, this.op, this.payloads); + } + + @Override + public MessageSigNode clone(AstFactory af) + { + OpNode op = this.op.clone(af); + PayloadElemList payload = this.payloads.clone(af); + return af.MessageSigNode(this.source, op, payload); + }*/ + + } diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java index 13faddb9e..3182c66d4 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java @@ -46,8 +46,6 @@ public MessageTransfer(MessageTransfer node) this.dests = null; } - public abstract MessageTransfer dupNode(); - public MessageNode getMessageNodeChild() { return (MessageNode) getChild(0); @@ -71,6 +69,8 @@ public final List getDestinationRoles() return getDestinationChildren().stream().map(rn -> rn.toName()) .collect(Collectors.toList()); } + + public abstract MessageTransfer dupNode(); public MessageTransfer reconstruct(RoleNode src, MessageNode msg, List dests) diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleArg.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleArg.java index c2bac6d55..dd2b92aac 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleArg.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleArg.java @@ -13,27 +13,65 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.del.ScribDel; import org.scribble.type.name.Role; public class NonRoleArg extends DoArg { + // ScribTreeAdaptor#create constructor + public NonRoleArg(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public NonRoleArg(NonRoleArg node) + { + super(node); + } + + @Override + public NonRoleArgNode getValChild() + { + return (NonRoleArgNode) getChild(0); + } + + @Override + public NonRoleArg dupNode() + { + return new NonRoleArg(this); + } + + @Override + public NonRoleArg project(AstFactory af, Role self) + { + return af.NonRoleArg(this.source, getValChild()); // arg needs projection? + } + + + + + + + + + public NonRoleArg(CommonTree source, NonRoleArgNode arg) { super(source, arg); } - @Override + /*@Override protected ScribNodeBase copy() { - return new NonRoleArg(this.source, getVal()); + return new NonRoleArg(this.source, getValChild()); } @Override public NonRoleArg clone(AstFactory af) { - NonRoleArgNode arg = (NonRoleArgNode) getVal().clone(af); + NonRoleArgNode arg = (NonRoleArgNode) getValChild().clone(af); return af.NonRoleArg(this.source, arg); } @@ -44,17 +82,5 @@ public NonRoleArg reconstruct(NonRoleArgNode arg) NonRoleArg ai = new NonRoleArg(this.source, arg); ai = (NonRoleArg) ai.del(del); return ai; - } - - @Override - public NonRoleArgNode getVal() - { - return (NonRoleArgNode) super.getVal(); - } - - @Override - public NonRoleArg project(AstFactory af, Role self) - { - return af.NonRoleArg(this.source, getVal()); // arg needs projection? - } + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java index 1278deedb..d5132ee7c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java @@ -68,18 +68,20 @@ public boolean isEmpty() public List getArgumentNodes() { - return getDoArgs().stream().map((ai) -> ai.val).collect(Collectors.toList()); + return getDoArgs().stream().map(ai -> ai.getValChild()) + .collect(Collectors.toList()); } public List> getArguments() { - return getDoArgs().stream().map((ai) -> ai.val.toArg()).collect(Collectors.toList()); + return getDoArgs().stream().map((ai) -> ai.getValChild().toArg()) + .collect(Collectors.toList()); } @Override public String toString() { - return (getDoArgs().isEmpty()) + return getDoArgs().isEmpty() ? "" : "<" + super.toString() + ">"; } diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleArg.java b/scribble-core/src/main/java/org/scribble/ast/RoleArg.java index c21472f23..0fc02baa1 100644 --- a/scribble-core/src/main/java/org/scribble/ast/RoleArg.java +++ b/scribble-core/src/main/java/org/scribble/ast/RoleArg.java @@ -13,15 +13,57 @@ */ package org.scribble.ast; -import org.antlr.runtime.tree.CommonTree; +import org.antlr.runtime.Token; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.ScribDel; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; public class RoleArg extends DoArg { - public RoleArg(CommonTree source, RoleNode arg) + // ScribTreeAdaptor#create constructor + public RoleArg(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public RoleArg(RoleArg node) + { + super(node); + } + + @Override + public RoleNode getValChild() + { + return (RoleNode) getChild(0); + } + + @Override + public RoleArg dupNode() + { + return new RoleArg(this); + } + + // CHECKME: move to delegate? + @Override + public RoleArg project(AstFactory af, Role self) + { + RoleNode r = getValChild(); + RoleNode rn = (RoleNode) af.SimpleNameNode(r.source, RoleKind.KIND, + r.toName().toString()); + return af.RoleArg(this.source, rn); + } + + + + + + + + + + + /*public RoleArg(CommonTree source, RoleNode arg) { super(source, arg); } @@ -29,13 +71,13 @@ public RoleArg(CommonTree source, RoleNode arg) @Override protected ScribNodeBase copy() { - return new RoleArg(this.source, getVal()); + return new RoleArg(this.source, getValChild()); } @Override public RoleArg clone(AstFactory af) { - RoleNode role = getVal().clone(af); + RoleNode role = getValChild().clone(af); return af.RoleArg(this.source, role); } @@ -49,16 +91,8 @@ public RoleArg reconstruct(RoleNode arg) } @Override - public RoleNode getVal() + public RoleNode getValChild() { - return (RoleNode) super.getVal(); - } - - // FIXME: move to delegate? - @Override - public RoleArg project(AstFactory af, Role self) - { - RoleNode rn = (RoleNode) af.SimpleNameNode(this.val.source, RoleKind.KIND, this.val.toName().toString()); - return af.RoleArg(this.source, rn); - } + return (RoleNode) super.getValChild(); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GDo.java b/scribble-core/src/main/java/org/scribble/ast/global/GDo.java index 2197d7bb7..8e4376d7d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GDo.java @@ -13,18 +13,16 @@ */ package org.scribble.ast.global; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.Do; import org.scribble.ast.NonRoleArgList; import org.scribble.ast.RoleArgList; -import org.scribble.ast.ScribNodeBase; import org.scribble.ast.context.ModuleContext; import org.scribble.ast.local.LDo; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.ast.name.qualified.ProtocolNameNode; -import org.scribble.del.ScribDel; import org.scribble.main.JobContext; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; @@ -32,20 +30,73 @@ public class GDo extends Do implements GSimpleInteractionNode { - public GDo(CommonTree source, RoleArgList roles, NonRoleArgList args, GProtocolNameNode proto) + // ScribTreeAdaptor#create constructor + public GDo(Token t) { - super(source, roles, args, proto); + super(t); + } + + // Tree#dupNode constructor + public GDo(GDo node) + { + super(node); + } + + @Override + public GProtocolNameNode getProtocolNameNode() + { + return (GProtocolNameNode) getChild(2); + } + + @Override + public GDo dupNode() + { + return new GDo(this); } public LDo project(AstFactory af, Role self, LProtocolNameNode fullname) { - RoleArgList roleinstans = this.roles.project(af, self); - NonRoleArgList arginstans = this.args.project(af, self); - LDo projection = af.LDo(this.source, roleinstans, arginstans, fullname); + RoleArgList roles = this.getRoleListChild().project(af, self); + NonRoleArgList args = this.getArgListChild().project(af, self); + LDo projection = af.LDo(this.source, roles, args, fullname); return projection; } @Override + public GProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) + { + return (GProtocolName) super.getTargetProtocolDeclFullName(mcontext); + } + + @Override + public GProtocolDecl getTargetProtocolDecl(JobContext jcontext, + ModuleContext mcontext) + { + return (GProtocolDecl) super.getTargetProtocolDecl(jcontext, mcontext); + } + + + + + + + + + + + + + + + + + + public GDo(CommonTree source, RoleArgList roles, NonRoleArgList args, GProtocolNameNode proto) + { + super(source, roles, args, proto); + } + + /*@Override protected ScribNodeBase copy() { return new GDo(this.source, this.roles, this.args, getProtocolNameNode()); @@ -67,23 +118,5 @@ public GDo reconstruct(RoleArgList roles, NonRoleArgList args, ProtocolNameNode< GDo gd = new GDo(this.source, roles, args, (GProtocolNameNode) proto); gd = (GDo) gd.del(del); return gd; - } - - @Override - public GProtocolNameNode getProtocolNameNode() - { - return (GProtocolNameNode) this.proto; - } - - @Override - public GProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) - { - return (GProtocolName) super.getTargetProtocolDeclFullName(mcontext); - } - - @Override - public GProtocolDecl getTargetProtocolDecl(JobContext jcontext, ModuleContext mcontext) - { - return (GProtocolDecl) super.getTargetProtocolDecl(jcontext, mcontext); - } + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java index 0cc96b0c8..ee218fcb8 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java @@ -27,7 +27,6 @@ import org.scribble.ast.local.LNode; import org.scribble.ast.local.LReceive; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.ScribDel; import org.scribble.type.kind.Global; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; @@ -47,6 +46,7 @@ public GMessageTransfer(GMessageTransfer node) super(node); } + @Override public GMessageTransfer dupNode() { return new GMessageTransfer(this); @@ -91,16 +91,6 @@ public LNode project(AstFactory af, Role self) return proj; } - @Override - public GMessageTransfer reconstruct(RoleNode src, MessageNode msg, - List dests) - { - ScribDel del = del(); - GMessageTransfer gmt = new GMessageTransfer(this.source, src, msg, dests); - gmt = (GMessageTransfer) gmt.del(del); - return gmt; - } - @Override public String toString() { @@ -146,4 +136,13 @@ public GMessageTransfer clone(AstFactory af) return af.GMessageTransfer(this.source, src, msg, dests); }*/ + /*@Override + public GMessageTransfer reconstruct(RoleNode src, MessageNode msg, + List dests) + { + ScribDel del = del(); + GMessageTransfer gmt = new GMessageTransfer(this.source, src, msg, dests); + gmt = (GMessageTransfer) gmt.del(del); + return gmt; + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LDo.java b/scribble-core/src/main/java/org/scribble/ast/local/LDo.java index 38eee1dc9..7a0fb7854 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LDo.java @@ -17,6 +17,7 @@ import java.util.Iterator; import java.util.Set; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.Do; @@ -24,8 +25,6 @@ import org.scribble.ast.RoleArgList; import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.ast.name.qualified.ProtocolNameNode; -import org.scribble.del.ScribDel; import org.scribble.main.JobContext; import org.scribble.main.RuntimeScribbleException; import org.scribble.main.ScribbleException; @@ -37,51 +36,28 @@ public class LDo extends Do implements LSimpleInteractionNode { - public LDo(CommonTree source, RoleArgList roleinstans, NonRoleArgList arginstans, LProtocolNameNode proto) + // ScribTreeAdaptor#create constructor + public LDo(Token t) { - super(source, roleinstans, arginstans, proto); + super(t); } - @Override - protected LDo copy() + // Tree#dupNode constructor + public LDo(LDo node) { - return new LDo(this.source, this.roles, this.args, getProtocolNameNode()); - } - - @Override - public LDo clone(AstFactory af) - { - RoleArgList roles = this.roles.clone(af); - NonRoleArgList args = this.args.clone(af); - LProtocolNameNode proto = this.getProtocolNameNode().clone(af); - return af.LDo(this.source, roles, args, proto); - } - - @Override - public LDo reconstruct(RoleArgList roles, NonRoleArgList args, ProtocolNameNode proto) - { - ScribDel del = del(); - LDo ld = new LDo(this.source, roles, args, (LProtocolNameNode) proto); - ld = (LDo) ld.del(del); - return ld; + super(node); } @Override public LProtocolNameNode getProtocolNameNode() { - return (LProtocolNameNode) this.proto; - } - - @Override - public LProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) - { - return (LProtocolName) super.getTargetProtocolDeclFullName(mcontext); + return (LProtocolNameNode) getChild(2); } - + @Override - public LProtocolDecl getTargetProtocolDecl(JobContext jcontext, ModuleContext mcontext) + public LDo dupNode() { - return (LProtocolDecl) super.getTargetProtocolDecl(jcontext, mcontext); + return new LDo(this); } @Override @@ -90,10 +66,12 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) ModuleContext mc = fixer.getModuleContext(); JobContext jc = fixer.job.getContext(); Role subj = getTargetProtocolDecl(jc, mc).getDefChild().getBlockChild() - .getInteractSeqChild().getInteractNodeChildren().get(0).inferLocalChoiceSubject(fixer); + .getInteractSeqChild().getInteractNodeChildren().get(0) + .inferLocalChoiceSubject(fixer); // FIXME: need equivalent of (e.g) rec X { continue X; } pruning (cf GRecursion.prune) for irrelevant recursive-do (e.g. proto(A, B, C) { choice at A {A->B.do Proto(A,B,C)} or {A->B.B->C} })) - Iterator roleargs = this.roles.getRoles().iterator(); - for (Role decl : getTargetProtocolDecl(jc, mc).header.roledecls.getRoles()) + Iterator roleargs = getRoleListChild().getRoles().iterator(); + for (Role decl : getTargetProtocolDecl(jc, mc).getHeaderChild() + .getRoleDeclListChild().getRoles()) { Role arg = roleargs.next(); if (decl.equals(subj)) @@ -105,7 +83,8 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) throws ScribbleException + public LInteractionNode merge(AstFactory af, LInteractionNode ln) + throws ScribbleException { throw new RuntimeScribbleException("Invalid merge on LDo: " + this); } @@ -121,4 +100,58 @@ public Set getEnabling() { return Collections.emptySet(); } + + @Override + public LProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) + { + return (LProtocolName) super.getTargetProtocolDeclFullName(mcontext); + } + + @Override + public LProtocolDecl getTargetProtocolDecl(JobContext jcontext, + ModuleContext mcontext) + { + return (LProtocolDecl) super.getTargetProtocolDecl(jcontext, mcontext); + } + + + + + + + + + + + + + + public LDo(CommonTree source, RoleArgList roleinstans, NonRoleArgList arginstans, LProtocolNameNode proto) + { + super(source, roleinstans, arginstans, proto); + } + + /*@Override + protected LDo copy() + { + return new LDo(this.source, this.roles, this.args, getProtocolNameNode()); + } + + @Override + public LDo clone(AstFactory af) + { + RoleArgList roles = this.roles.clone(af); + NonRoleArgList args = this.args.clone(af); + LProtocolNameNode proto = this.getProtocolNameNode().clone(af); + return af.LDo(this.source, roles, args, proto); + } + + @Override + public LDo reconstruct(RoleArgList roles, NonRoleArgList args, ProtocolNameNode proto) + { + ScribDel del = del(); + LDo ld = new LDo(this.source, roles, args, (LProtocolNameNode) proto); + ld = (LDo) ld.del(del); + return ld; + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java b/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java index 35719e8a0..5c714d199 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java @@ -17,88 +17,108 @@ import java.util.List; import java.util.Set; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.Constants; import org.scribble.ast.MessageNode; -import org.scribble.ast.ScribNodeBase; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.ScribDel; import org.scribble.main.RuntimeScribbleException; import org.scribble.main.ScribbleException; import org.scribble.type.Message; import org.scribble.type.name.Role; -import org.scribble.util.ScribUtil; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LReceive extends LMessageTransfer implements LSimpleInteractionNode { - public LReceive(CommonTree source, RoleNode src, MessageNode msg, List dests) + // ScribTreeAdaptor#create constructor + public LReceive(Token t) { - super(source, src, msg, dests); + super(t); } - @Override - protected ScribNodeBase copy() + // Tree#dupNode constructor + public LReceive(LReceive node) { - return new LReceive(this.source, this.src, this.msg, getDestinationChildren()); + super(node); } @Override - public LReceive clone(AstFactory af) + public LReceive dupNode() { - RoleNode src = this.src.clone(af); - MessageNode msg = this.msg.clone(af); - List dests = ScribUtil.cloneList(af, getDestinationChildren()); - return af.LReceive(this.source, src, msg, dests); + return new LReceive(this); } @Override - public LReceive reconstruct(RoleNode src, MessageNode msg, List dests) + public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { - ScribDel del = del(); - LReceive lr = new LReceive(this.source, src, msg, dests); - lr = (LReceive) lr.del(del); - return lr; + RoleNode src = this.getSourceChild(); + fixer.setChoiceSubject(src.toName()); + return src.toName(); } @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) + public LInteractionNode merge(AstFactory af, LInteractionNode ln) + throws ScribbleException { - fixer.setChoiceSubject(this.src.toName()); - return this.src.toName(); + throw new RuntimeScribbleException("Invalid merge on LReceive: " + this); } @Override - public String toString() + public boolean canMerge(LInteractionNode ln) { - return this.msg + " " + Constants.FROM_KW + " " + this.src + ";"; + return false; } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) throws ScribbleException + public Set getEnabling() { - throw new RuntimeScribbleException("Invalid merge on LReceive: " + this); + Set enab = new HashSet<>(); + enab.add(getMessageNodeChild().toMessage()); + return enab; } @Override - public boolean canMerge(LInteractionNode ln) + public String toString() { - return false; + return getMessageNodeChild() + " " + Constants.FROM_KW + " " + + getSourceChild() + ";"; } + + + + + + + + + public LReceive(CommonTree source, RoleNode src, MessageNode msg, List dests) + { + super(source, src, msg, dests); + } + + /*@Override + protected ScribNodeBase copy() + { + return new LReceive(this.source, this.src, this.msg, getDestinationChildren()); + } + @Override - public Set getEnabling() + public LReceive clone(AstFactory af) { - Set enab = new HashSet<>(); - enab.add(this.msg.toMessage()); - return enab; + RoleNode src = this.src.clone(af); + MessageNode msg = this.msg.clone(af); + List dests = ScribUtil.cloneList(af, getDestinationChildren()); + return af.LReceive(this.source, src, msg, dests); } - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 @Override - public Local getKind() + public LReceive reconstruct(RoleNode src, MessageNode msg, List dests) { - return LSimpleInteractionNode.super.getKind(); + ScribDel del = del(); + LReceive lr = new LReceive(this.source, src, msg, dests); + lr = (LReceive) lr.del(del); + return lr; }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LSend.java b/scribble-core/src/main/java/org/scribble/ast/local/LSend.java index 066de89ff..d728803be 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LSend.java @@ -18,88 +18,112 @@ import java.util.Set; import java.util.stream.Collectors; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.Constants; import org.scribble.ast.MessageNode; -import org.scribble.ast.ScribNodeBase; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.ScribDel; import org.scribble.main.RuntimeScribbleException; import org.scribble.main.ScribbleException; import org.scribble.type.Message; import org.scribble.type.name.Role; -import org.scribble.util.ScribUtil; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LSend extends LMessageTransfer implements LSimpleInteractionNode // Explicitly needed here for getKind { - public LSend(CommonTree source, RoleNode src, MessageNode msg, List dests) + // ScribTreeAdaptor#create constructor + public LSend(Token t) { - super(source, src, msg, dests); + super(t); } - @Override - protected ScribNodeBase copy() + // Tree#dupNode constructor + public LSend(LSend node) { - return new LSend(this.source, this.src, this.msg, getDestinationChildren()); + super(node); } @Override - public LSend clone(AstFactory af) + public LSend dupNode() { - RoleNode src = this.src.clone(af); - MessageNode msg = this.msg.clone(af); - List dests = ScribUtil.cloneList(af, getDestinationChildren()); - return af.LSend(this.source, src, msg, dests); + return new LSend(this); } + // Could make a LMessageTransfer to factor this out with LReceive @Override - public LSend reconstruct(RoleNode src, MessageNode msg, List dests) + public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { - ScribDel del = del(); - LSend ls = new LSend(this.source, src, msg, dests); - ls = (LSend) ls.del(del); - return ls; + return getSourceChild().toName(); } - // Could make a LMessageTransfer to factor this out with LReceive @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) + public LInteractionNode merge(AstFactory af, LInteractionNode ln) + throws ScribbleException { - return this.src.toName(); + throw new RuntimeScribbleException("Invalid merge on LSend: " + this); } @Override - public String toString() + public boolean canMerge(LInteractionNode ln) { - return this.msg + " " + Constants.TO_KW + " " - + getDestinationChildren().stream().map((dest) -> dest.toString()).collect(Collectors.joining(", ")) + ";"; + return false; } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) throws ScribbleException + public Set getEnabling() { - throw new RuntimeScribbleException("Invalid merge on LSend: " + this); + return Collections.emptySet(); } @Override - public boolean canMerge(LInteractionNode ln) + public String toString() { - return false; + return getMessageNodeChild() + " " + + Constants.TO_KW + " " + getDestinationChildren().stream() + .map(dest -> dest.toString()).collect(Collectors.joining(", ")) + + ";"; + } + + + + + + + + + + + + + + public LSend(CommonTree source, RoleNode src, MessageNode msg, List dests) + { + super(source, src, msg, dests); } + /*@Override + protected ScribNodeBase copy() + { + return new LSend(this.source, this.src, this.msg, getDestinationChildren()); + } + @Override - public Set getEnabling() + public LSend clone(AstFactory af) { - return Collections.emptySet(); + RoleNode src = this.src.clone(af); + MessageNode msg = this.msg.clone(af); + List dests = ScribUtil.cloneList(af, getDestinationChildren()); + return af.LSend(this.source, src, msg, dests); } - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 @Override - public Local getKind() + public LSend reconstruct(RoleNode src, MessageNode msg, List dests) { - return LSimpleInteractionNode.super.getKind(); + ScribDel del = del(); + LSend ls = new LSend(this.source, src, msg, dests); + ls = (LSend) ls.del(del); + return ls; }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java index cc9189f8a..c3ce2e4b2 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java @@ -14,7 +14,6 @@ package org.scribble.ast.name.simple; import org.antlr.runtime.Token; -import org.scribble.del.ScribDel; import org.scribble.type.name.Role; import org.scribble.visit.Substitutor; @@ -36,19 +35,22 @@ protected DummyProjectionRoleNode(DummyProjectionRoleNode node, String id) } @Override - public DummyProjectionRoleNode substituteNames(Substitutor subs) + public RoleNode dupNode() { - //throw new RuntimeException("Shouldn't get in here: " + this); - return reconstruct(null); // HACK: for ProjectedSubprotocolPruner, but maybe useful for others + return new RoleNode(this, getIdentifier()); } @Override - protected DummyProjectionRoleNode reconstruct(String identifier) + protected DummyProjectionRoleNode reconstruct(String id) { - ScribDel del = del(); - DummyProjectionRoleNode rn = new DummyProjectionRoleNode(); - rn = (DummyProjectionRoleNode) rn.del(del); - return rn; + return (DummyProjectionRoleNode) super.reconstruct(id); + } + + @Override + public DummyProjectionRoleNode substituteNames(Substitutor subs) + { + //throw new RuntimeException("Shouldn't get in here: " + this); + return reconstruct(null); // HACK: for ProjectedSubprotocolPruner, but maybe useful for others } @Override @@ -110,4 +112,13 @@ public DummyProjectionRoleNode clone(AstFactory af) { return af.DummyProjectionRoleNode(); }*/ + + /*@Override + protected DummyProjectionRoleNode reconstruct(String id) + { + ScribDel del = del(); + DummyProjectionRoleNode rn = new DummyProjectionRoleNode(); + rn = (DummyProjectionRoleNode) rn.del(del); + return rn; + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java index 67ac4063c..230f24dc1 100644 --- a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java @@ -27,6 +27,7 @@ import org.scribble.ast.NonRoleParamDecl; import org.scribble.ast.NonRoleParamDeclList; import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.ProtocolHeader; import org.scribble.ast.RoleArgList; import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScopedNode; @@ -65,22 +66,30 @@ public SubprotocolVisitor(Job job) // Pushes a subprotocol signature (i.e. on root entry) protected void enterRootProtocolDecl(ProtocolDecl pd) { - Map rolemap = makeRootRoleSubsMap(pd.header.roledecls); - Map, NonRoleArgNode> argmap = makeRootNonRoleSubsMap(pd.header.paramdecls); + ProtocolHeader hdr = pd.getHeaderChild(); + RoleDeclList rds = hdr.getRoleDeclListChild(); + NonRoleParamDeclList pds = hdr.getParamDeclListChild(); + + Map rolemap = makeRootRoleSubsMap(rds); + Map, NonRoleArgNode> argmap = makeRootNonRoleSubsMap( + pds); this.rolemaps.push(rolemap); this.argmaps.push(argmap); ModuleContext mcontext = getModuleContext(); - ProtocolName fullname = mcontext.getVisibleProtocolDeclFullName(pd.header.getDeclName()); - List roleargs = pd.header.roledecls.getRoles(); + ProtocolName fullname = mcontext + .getVisibleProtocolDeclFullName(hdr.getDeclName()); + List roleargs = rds.getRoles(); List> nonroleargs = - pd.header.paramdecls.getDecls().stream().map((param) -> paramDeclToArg(param)).collect(Collectors.toList()); + pds.getDecls().stream().map(param -> paramDeclToArg(param)) + .collect(Collectors.toList()); pushSubprotocolSig(fullname, roleargs, nonroleargs); } // Most subclasses will override visitForSubprotocols (e.g. ReachabilityChecker, FsmConstructor), but sometimes still want to change whole visit pattern (e.g. Projector) @Override - public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleException + public ScribNode visit(ScribNode parent, ScribNode child) + throws ScribbleException { enter(parent, child); ScribNode visited = visitForSubprotocols(parent, child); @@ -88,7 +97,8 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleExcepti } // Subclasses can override this to disable subprotocol visiting - protected ScribNode visitForSubprotocols(ScribNode parent, ScribNode child) throws ScribbleException + protected ScribNode visitForSubprotocols(ScribNode parent, ScribNode child) + throws ScribbleException { if (child instanceof Do) { @@ -102,15 +112,19 @@ protected ScribNode visitForSubprotocols(ScribNode parent, ScribNode child) thro } // The Do node itself is no longer visited -- FIXME: projection needs to visit it -- no: that's in enter/leave, visited means "visit children" - protected Do visitOverrideForDo(ScribNode parent, Do doo) throws ScribbleException + protected Do visitOverrideForDo(ScribNode parent, Do doo) + throws ScribbleException { if (!isCycle()) { JobContext jc = this.job.getContext(); ModuleContext mc = getModuleContext(); - ProtocolDecl pd = doo.getTargetProtocolDecl(jc, mc); + ProtocolDecl pd = + doo.getTargetProtocolDecl(jc, mc); // Target is cloned: fresh dels and envs, which will be discarded - ScribNode seq = applySubstitutions(pd.def.block.seq.clone(this.job.af)); // Visit the seq? -- or visit the interactions in the seq directly? + ScribNode seq = applySubstitutions(pd.getDefChild().getBlockChild() + .getInteractSeqChild().clone()); //this.job.af)); + // Visit the seq? -- or visit the interactions in the seq directly? // Visit seq/interactions under current environment seq.accept(this); // Result from visiting subprotocol body is discarded } @@ -130,7 +144,8 @@ protected ScribNode applySubstitutions(ScribNode n) } try { - return n.accept(new Substitutor(this.job, this.rolemaps.peek(), this.argmaps.peek())); + return n.accept( + new Substitutor(this.job, this.rolemaps.peek(), this.argmaps.peek())); } catch (ScribbleException e) { @@ -139,7 +154,8 @@ protected ScribNode applySubstitutions(ScribNode n) } @Override - protected final void envEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected final void envEnter(ScribNode parent, ScribNode child) + throws ScribbleException { super.envEnter(parent, child); @@ -164,7 +180,8 @@ protected final void envEnter(ScribNode parent, ScribNode child) throws Scribble } @Override - protected final ScribNode envLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected final ScribNode envLeave(ScribNode parent, ScribNode child, + ScribNode visited) throws ScribbleException { ScribNode n = subprotocolLeave(parent, child, visited); if (child instanceof ProtocolDecl) @@ -183,26 +200,32 @@ protected final ScribNode envLeave(ScribNode parent, ScribNode child, ScribNode } // Hack for OffsetSubprotocolVisitor - protected void envLeaveProtocolDeclOverride(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected void envLeaveProtocolDeclOverride(ScribNode parent, ScribNode child, + ScribNode visited) throws ScribbleException { leaveSubprotocol(); } - protected void subprotocolEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected void subprotocolEnter(ScribNode parent, ScribNode child) + throws ScribbleException { } - protected ScribNode subprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected ScribNode subprotocolLeave(ScribNode parent, ScribNode child, + ScribNode visited) throws ScribbleException { return visited; } private void enterSubprotocol(Do doo) { - ProtocolName fullname = getModuleContext().checkProtocolDeclDependencyFullName(doo.proto.toName()); + ProtocolName fullname = + getModuleContext().checkProtocolDeclDependencyFullName( + doo.getProtocolNameNode().toName()); // namedisamb should already have converted proto to the fullname -- in order for inlining to work - pushSubprotocolSig(fullname, doo.roles.getRoles(), doo.args.getArguments()); + pushSubprotocolSig(fullname, doo.getRoleListChild().getRoles(), + doo.getArgListChild().getArguments()); pushNameMaps(fullname, doo); } @@ -214,7 +237,8 @@ private void leaveSubprotocol() this.argmaps.pop(); } - private void pushSubprotocolSig(ProtocolName fullname, List roleargs, List> nonroleargs) + private void pushSubprotocolSig(ProtocolName fullname, List roleargs, + List> nonroleargs) { SubprotocolSig subsig = new SubprotocolSig(fullname, roleargs, nonroleargs); this.stack.add(subsig); @@ -222,14 +246,19 @@ private void pushSubprotocolSig(ProtocolName fullname, List roleargs, L private void pushNameMaps(ProtocolName fullname, Do doo) { - ProtocolDecl pd = this.job.getContext().getModule(fullname.getPrefix()).getProtocolDeclChild(fullname.getSimpleName()); - this.rolemaps.push(makeRoleSubsMap(this.rolemaps.get(0), doo.roles, pd.header.roledecls)); - this.argmaps.push(makeNonRoleSubsMap(this.argmaps.get(0), doo.args, pd.header.paramdecls)); + ProtocolDecl pd = this.job.getContext().getModule(fullname.getPrefix()) + .getProtocolDeclChild(fullname.getSimpleName()); + ProtocolHeader hdr = pd.getHeaderChild(); + this.rolemaps.push(makeRoleSubsMap(this.rolemaps.get(0), + doo.getRoleListChild(), hdr.getRoleDeclListChild())); + this.argmaps.push(makeNonRoleSubsMap(this.argmaps.get(0), + doo.getArgListChild(), hdr.getParamDeclListChild())); } public boolean isRootedCycle() { - return this.stack.size() > 1 && this.stack.get(0).equals(this.stack.get(this.stack.size() - 1)); + return this.stack.size() > 1 + && this.stack.get(0).equals(this.stack.get(this.stack.size() - 1)); } public boolean isCycle() @@ -245,7 +274,7 @@ public int getCycleEntryIndex() SubprotocolSig last = this.stack.get(size - 1); for (int i = size - 2; i >= 0; i--) { - if (this.stack.get(i).equals(last)) // FIXME: doesn't support recursive scoped subprotocols, i.e. cycle detection not general enough? + if (this.stack.get(i).equals(last)) // TODO CHECKME: doesn't support recursive scoped subprotocols, i.e. cycle detection not general enough? { return i; } @@ -278,33 +307,40 @@ protected void setScope(Scope scope) { this.scope = scope; } - + protected static Map makeRootRoleSubsMap(RoleDeclList rdl) { - return rdl.getDecls().stream() - .collect(Collectors.toMap((r) -> r.getDeclName(), (r) -> (RoleNode) r.name)); + return rdl.getDecls().stream().collect(Collectors + .toMap(r -> r.getDeclName(), r -> (RoleNode) r.getNameNodeChild())); } - protected static Map, NonRoleArgNode> makeRootNonRoleSubsMap(NonRoleParamDeclList pdl) + protected static Map, NonRoleArgNode> makeRootNonRoleSubsMap( + NonRoleParamDeclList pdl) { return pdl.getDecls().stream() - .collect(Collectors.toMap((p) -> (Arg) p.getDeclName(), (p) -> (NonRoleArgNode) p.name)); + .collect(Collectors.toMap(p -> (Arg) p.getDeclName(), + p -> (NonRoleArgNode) p.getNameNodeChild())); } - protected static Map makeRoleSubsMap(Map root, RoleArgList ral, RoleDeclList rdl) + protected static Map makeRoleSubsMap(Map root, + RoleArgList ral, RoleDeclList rdl) { Iterator roleargs = ral.getRoles().iterator(); - return rdl.getRoles().stream().collect(Collectors.toMap((r) -> r, (r) -> root.get(roleargs.next()))); + return rdl.getRoles().stream() + .collect(Collectors.toMap(r -> r, r -> root.get(roleargs.next()))); } - protected static Map, NonRoleArgNode> - makeNonRoleSubsMap(Map, NonRoleArgNode> root, NonRoleArgList nral, NonRoleParamDeclList nrpdl) + protected static Map, NonRoleArgNode> makeNonRoleSubsMap( + Map, NonRoleArgNode> root, + NonRoleArgList nral, NonRoleParamDeclList nrpdl) { Map, NonRoleArgNode> newmap = new HashMap<>(); // Using arg and argnode views of the arglist - Iterator> nonroleargs = nral.getArguments().iterator(); - Iterator nonroleargnodes = nral.getArgumentNodes().iterator(); + Iterator> nonroleargs = nral.getArguments() + .iterator(); + Iterator nonroleargnodes = nral.getArgumentNodes() + .iterator(); for (Name param : nrpdl.getParameters()) { Arg arg = nonroleargs.next(); @@ -324,7 +360,8 @@ protected static Map makeRoleSubsMap(Map root, R return newmap; } - private static Arg paramDeclToArg(NonRoleParamDecl pd) + private static Arg paramDeclToArg( + NonRoleParamDecl pd) { Name n = pd.getDeclName(); if (!(n instanceof Arg)) From ae29d2428fec0abd54d8d707ea7a2daca8fcaf0b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 28 Jan 2019 19:21:45 +0000 Subject: [PATCH 080/539] Continued WIP. --- .../main/java/org/scribble/ast/DoArgList.java | 66 +++- .../java/org/scribble/ast/MessageSigNode.java | 1 + .../java/org/scribble/ast/NonRoleArgList.java | 84 ++++-- .../java/org/scribble/ast/RoleArgList.java | 83 ++++-- .../java/org/scribble/ast/ScribNodeBase.java | 53 ++-- .../org/scribble/ast/UnaryPayloadElem.java | 128 +++++--- .../java/org/scribble/ast/global/GChoice.java | 4 +- .../scribble/ast/global/GDelegationElem.java | 110 +++++-- .../scribble/ast/global/GInterruptible.java | 282 ------------------ .../org/scribble/ast/global/GParallel.java | 73 ----- .../scribble/ast/local/LDelegationElem.java | 74 +++-- .../scribble/ast/local/LInterruptible.java | 160 ---------- .../org/scribble/ast/local/LParallel.java | 102 ------- .../scribble/ast/name/simple/RoleNode.java | 6 + .../java/org/scribble/del/DoArgListDel.java | 2 +- .../org/scribble/del/NonRoleArgListDel.java | 2 +- .../java/org/scribble/del/local/LDoDel.java | 4 +- 17 files changed, 428 insertions(+), 806 deletions(-) delete mode 100644 scribble-core/src/main/java/org/scribble/ast/global/GInterruptible.java delete mode 100644 scribble-core/src/main/java/org/scribble/ast/global/GParallel.java delete mode 100644 scribble-core/src/main/java/org/scribble/ast/local/LInterruptible.java delete mode 100644 scribble-core/src/main/java/org/scribble/ast/local/LParallel.java diff --git a/scribble-core/src/main/java/org/scribble/ast/DoArgList.java b/scribble-core/src/main/java/org/scribble/ast/DoArgList.java index 031cd326d..4dffc40f1 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DoArgList.java +++ b/scribble-core/src/main/java/org/scribble/ast/DoArgList.java @@ -13,12 +13,13 @@ */ package org.scribble.ast; -import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; @@ -28,39 +29,76 @@ // "? extends InstantiationNode" not enforced here (e.g. can put "? extends ModelNode"), because ultimately any instantiation of this class needs an actual instance of "Instantiation" which has to have a parameter that extends "InstantiationNode" public abstract class DoArgList> extends ScribNodeBase { - private final List args; + // ScribTreeAdaptor#create constructor + public DoArgList(Token t) + { + super(t); + this.args = null; + } - public DoArgList(CommonTree source, List is) + // Tree#dupNode constructor + public DoArgList(DoArgList node) { - super(source); - this.args = new LinkedList<>(is); + super(node); + this.args = null; } - public abstract DoArgList reconstruct(List instans); + protected List getRawArgChildren() + { + return getChildren(); + } - public abstract DoArgList project(AstFactory af, Role self); + public abstract List getArgChildren(); @Override - public DoArgList visitChildren(AstVisitor nv) throws ScribbleException + public abstract DoArgList dupNode(); + + public DoArgList reconstruct(List args) { - List nds = visitChildListWithClassEqualityCheck(this, this.args, nv); - return reconstruct(nds); + DoArgList argList = dupNode(); + argList.addChildren(args); + ScribDel del = del(); + argList.setDel(del); // No copy + return argList; } - public List getDoArgs() + public abstract DoArgList project(AstFactory af, Role self); + + @Override + public DoArgList visitChildren(AstVisitor nv) throws ScribbleException { - return Collections.unmodifiableList(this.args); + List nds = + visitChildListWithClassEqualityCheck(this, getArgChildren(), nv); + return reconstruct(nds); } public int length() { - return this.args.size(); + return getChildCount(); } // Like HeaderParamDeclList, without enclosing braces -- added by subclasses @Override public String toString() { - return this.args.stream().map((a) -> a.toString()).collect(Collectors.joining(", ")); + return this.args.stream().map(a -> a.toString()).collect(Collectors.joining(", ")); } + + + + + + + + + + + private final List args; + + public DoArgList(CommonTree source, List is) + { + super(source); + this.args = new LinkedList<>(is); + } + } diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java b/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java index 6e5e6e4ee..b1b705686 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java @@ -49,6 +49,7 @@ public PayloadElemList getPayloadListChild() return (PayloadElemList) getChild(1); } + @Override public MessageSigNode dupNode() { return new MessageSigNode(this); diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java index d5132ee7c..cb4f526b4 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java @@ -16,73 +16,107 @@ import java.util.List; import java.util.stream.Collectors; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.del.ScribDel; +import org.antlr.runtime.Token; import org.scribble.type.Arg; import org.scribble.type.kind.NonRoleArgKind; import org.scribble.type.name.Role; -import org.scribble.util.ScribUtil; // Cf. NonRoleParamDeclList public class NonRoleArgList extends DoArgList { - public NonRoleArgList(CommonTree source, List args) + // ScribTreeAdaptor#create constructor + public NonRoleArgList(Token t) { - super(source, args); + super(t); } - @Override - protected ScribNodeBase copy() + // Tree#dupNode constructor + public NonRoleArgList(NonRoleArgList node) { - return new NonRoleArgList(this.source, getDoArgs()); + super(node); } - + @Override - public NonRoleArgList clone(AstFactory af) + public List getArgChildren() { - List args = ScribUtil.cloneList(af, getDoArgs()); - return af.NonRoleArgList(this.source, args); + return getRawArgChildren().stream().map(x -> (NonRoleArg) x) + .collect(Collectors.toList()); } - + @Override - public DoArgList reconstruct(List instans) + public NonRoleArgList dupNode() { - ScribDel del = del(); - NonRoleArgList ail = new NonRoleArgList(this.source, instans); - ail = (NonRoleArgList) ail.del(del); - return ail; + return new NonRoleArgList(this); } @Override public NonRoleArgList project(AstFactory af, Role self) { - List instans = - getDoArgs().stream().map(ai -> ai.project(af, self)).collect(Collectors.toList()); - return af.NonRoleArgList(this.source, instans); + List args = getArgChildren().stream() + .map(ai -> ai.project(af, self)).collect(Collectors.toList()); + return af.NonRoleArgList(this.source, args); } public boolean isEmpty() { - return getDoArgs().isEmpty(); + return getArgChildren().isEmpty(); } public List getArgumentNodes() { - return getDoArgs().stream().map(ai -> ai.getValChild()) + return getArgChildren().stream().map(ai -> ai.getValChild()) .collect(Collectors.toList()); } public List> getArguments() { - return getDoArgs().stream().map((ai) -> ai.getValChild().toArg()) + return getArgChildren().stream().map(ai -> ai.getValChild().toArg()) .collect(Collectors.toList()); } @Override public String toString() { - return getDoArgs().isEmpty() + return getArgChildren().isEmpty() ? "" : "<" + super.toString() + ">"; } + + + + + + + + + + + + + /*public NonRoleArgList(CommonTree source, List args) + { + super(source, args); + } + + @Override + protected ScribNodeBase copy() + { + return new NonRoleArgList(this.source, getArgChildren()); + } + + @Override + public NonRoleArgList clone(AstFactory af) + { + List args = ScribUtil.cloneList(af, getArgChildren()); + return af.NonRoleArgList(this.source, args); + } + + @Override + public DoArgList reconstruct(List instans) + { + ScribDel del = del(); + NonRoleArgList ail = new NonRoleArgList(this.source, instans); + ail = (NonRoleArgList) ail.del(del); + return ail; + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleArgList.java b/scribble-core/src/main/java/org/scribble/ast/RoleArgList.java index b398ab562..6defa75d9 100644 --- a/scribble-core/src/main/java/org/scribble/ast/RoleArgList.java +++ b/scribble-core/src/main/java/org/scribble/ast/RoleArgList.java @@ -16,53 +16,52 @@ import java.util.List; import java.util.stream.Collectors; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.del.ScribDel; import org.scribble.type.name.Role; -import org.scribble.util.ScribUtil; public class RoleArgList extends DoArgList { - public RoleArgList(CommonTree source, List roles) + // ScribTreeAdaptor#create constructor + public RoleArgList(Token t) { - super(source, roles); + super(t); } - @Override - protected RoleArgList copy() + // Tree#dupNode constructor + public RoleArgList(RoleArgList node) { - return new RoleArgList(this.source, getDoArgs()); + super(node); } - + @Override - public RoleArgList clone(AstFactory af) + public List getArgChildren() { - List roles = ScribUtil.cloneList(af, getDoArgs()); - return af.RoleArgList(this.source, roles); + return getRawArgChildren().stream().map(x -> (RoleArg) x) + .collect(Collectors.toList()); } - + @Override - public RoleArgList reconstruct(List roles) + public RoleArgList dupNode() { - ScribDel del = del(); - RoleArgList rl = new RoleArgList(this.source, roles); - rl = (RoleArgList) rl.del(del); - return rl; + return new RoleArgList(this); } // Move to delegate? @Override public RoleArgList project(AstFactory af, Role self) { - List instans = - getDoArgs().stream().map(ri -> ri.project(af, self)).collect(Collectors.toList()); - return af.RoleArgList(this.source, instans); + List args = + getArgChildren().stream().map(ri -> ri.project(af, self)) + .collect(Collectors.toList()); + return af.RoleArgList(this.source, args); } // The role arguments public List getRoles() { - return getDoArgs().stream().map((ri) -> ri.val.toName()).collect(Collectors.toList()); + return getArgChildren().stream().map(ri -> ri.getValChild().toName()) + .collect(Collectors.toList()); } @Override @@ -70,4 +69,46 @@ public String toString() { return "(" + super.toString() + ")"; } + + + + + + + + + + + + + + + + + public RoleArgList(CommonTree source, List roles) + { + super(source, roles); + } + + /*@Override + protected RoleArgList copy() + { + return new RoleArgList(this.source, getArgChildren()); + } + + @Override + public RoleArgList clone(AstFactory af) + { + List roles = ScribUtil.cloneList(af, getArgChildren()); + return af.RoleArgList(this.source, roles); + } + + @Override + public RoleArgList reconstruct(List roles) + { + ScribDel del = del(); + RoleArgList rl = new RoleArgList(this.source, roles); + rl = (RoleArgList) rl.del(del); + return rl; + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java index 4d933ea44..abf09f477 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -34,7 +34,7 @@ * This is the generic object from which all Scribble model objects * are derived. */ -public abstract class ScribNodeBase extends CommonTree implements ScribNode +public abstract class ScribNodeBase extends CommonTree implements ScribNode { protected final CommonTree source; // Consequently, core depends on Antlr // Used to be for parsed entities; null if not parsed @@ -172,27 +172,29 @@ public ScribNode substituteNames(Substitutor subs) // FIXME: remove parent parameter, to make uniform with visitChild // Used when a generic cast would otherwise be needed (non-generic children casts don't need this) -- doesn't check any generic parameters, relies on concrete values being instances of non-parameterised types // Subtype constraint on visited could still be too restrictive, e.g. AmbigNameNodeDel (although it doesn't matter there), e.g. unfolding continue's into recursion's - protected final static - T visitChildWithClassEqualityCheck(ScribNode parent, T child, AstVisitor nv) throws ScribbleException + protected final static T visitChildWithClassEqualityCheck( + ScribNode parent, T child, AstVisitor nv) throws ScribbleException { ScribNode visited = ((ScribNodeBase) parent).visitChild(child, nv); // Same subtyping flexibility as standard cast return ScribUtil.checkNodeClassEquality(child, visited); } - protected final static - List visitChildListWithClassEqualityCheck(ScribNode parent, List children, AstVisitor nv) + protected final static List + visitChildListWithClassEqualityCheck( + ScribNode parent, List children, AstVisitor nv) throws ScribbleException { return visitChildListWith(parent, children, nv, (T t) -> ScribUtil.handleLambdaScribbleException( - () -> ScribNodeBase.visitChildWithClassEqualityCheck(parent, t, nv))); // -> T + () -> ScribNodeBase + .visitChildWithClassEqualityCheck(parent, t, nv))); // -> T } // Just a list-map with handling for promoted exceptions (via handleLambdaScribbleException) -- could move to Util (where handleLambdaScribbleException is) - private final static - List visitChildListWith(ScribNode parent, List children, AstVisitor nv, Function c) - throws ScribbleException + private final static List visitChildListWith( + ScribNode parent, List children, AstVisitor nv, Function c) + throws ScribbleException { /*List visited = new LinkedList<>(); for (T n : children) @@ -203,7 +205,8 @@ List visitChildListWith(ScribNode parent, List children, AstVisitor nv, Fu // Maybe this exception hack is not worth it? Better to throw directly as ScribbleException try { - return children.stream().map(n -> c.apply(n)).collect(Collectors.toList()); + return children.stream().map(n -> c.apply(n)) + .collect(Collectors.toList()); } catch (RuntimeScribbleException rse) { @@ -221,32 +224,38 @@ List visitChildListWith(ScribNode parent, List children, AstVisitor nv, Fu // Takes clazz+kind to handle generic ProtocolKindNodes -- cf. ScribUtil.castNodeByClass, for casting to ground class types // R is expected to be N, i.e. the generic (ProtocolKindNode) class N parameterised by K - protected final static , K extends ProtocolKind, R extends ProtocolKindNode> + protected final static , K extends ProtocolKind, + R extends ProtocolKindNode> R visitProtocolKindChildWithCastCheck( - ScribNode parent, ScribNode child, AstVisitor nv, Class clazz, K kind, Function cast) - throws ScribbleException + ScribNode parent, ScribNode child, AstVisitor nv, Class clazz, K kind, + Function cast) throws ScribbleException { ScribNode visited = ((ScribNodeBase) parent).visitChild(child, nv); if (!clazz.isAssignableFrom(visited.getClass())) { - throw new RuntimeException(nv.getClass() + " generic visit error: " + clazz + ", " + visited.getClass()); + throw new RuntimeException(nv.getClass() + " generic visit error: " + + clazz + ", " + visited.getClass()); } ProtocolKindNode pkn = (ProtocolKindNode) visited; - if ((pkn.isGlobal() && !kind.equals(Global.KIND)) || (pkn.isLocal() && !kind.equals(Local.KIND))) + if ((pkn.isGlobal() && !kind.equals(Global.KIND)) + || (pkn.isLocal() && !kind.equals(Local.KIND))) { - throw new RuntimeException(nv.getClass() + " generic visit error: " + pkn.getClass() + ", " + kind); + throw new RuntimeException(nv.getClass() + " generic visit error: " + + pkn.getClass() + ", " + kind); } return cast.apply(pkn); } - protected final static - , K extends ProtocolKind, R extends ProtocolKindNode> - List visitProtocolKindChildListWithCastCheck( - ScribNode parent, List children, AstVisitor nv, Class c, K k, Function f) - throws ScribbleException + protected final static , + K extends ProtocolKind, R extends ProtocolKindNode> + List visitProtocolKindChildListWithCastCheck( + ScribNode parent, List children, AstVisitor nv, Class c, K k, + Function f) throws ScribbleException { return visitChildListWith(parent, children, nv, (T t) -> ScribUtil.handleLambdaScribbleException( - () -> ScribNodeBase.visitProtocolKindChildWithCastCheck(parent, t, nv, c, k, f))); // -> R + () -> ScribNodeBase + .visitProtocolKindChildWithCastCheck(parent, t, nv, c, k, f))); + // -> R } } diff --git a/scribble-core/src/main/java/org/scribble/ast/UnaryPayloadElem.java b/scribble-core/src/main/java/org/scribble/ast/UnaryPayloadElem.java index 40e8d31e2..5484d208e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/UnaryPayloadElem.java +++ b/scribble-core/src/main/java/org/scribble/ast/UnaryPayloadElem.java @@ -13,27 +13,104 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.PayloadElemNameNode; import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.kind.PayloadTypeKind; import org.scribble.type.name.PayloadElemType; -import org.scribble.util.ScribUtil; import org.scribble.visit.AstVisitor; -// FIXME: make abstract, and make a DataTypeElem subclass with DataTypeKind parameter instance (alongside LDelegationElem) +// TODO: make abstract, and make a DataTypeElem subclass with DataTypeKind parameter instance (alongside LDelegationElem) // Cf. DoArg, wrapper for a (unary) name node of potentially unknown kind (needs disamb) // PayloadTypeKind is DataType or Local, but Local has its own special subclass (and protocol params not allowed), so this should implicitly be for DataType only // AST hierarchy requires unary and delegation (binary pair) payloads to be structurally distinguished //public class DataTypeElem extends PayloadElem -public class UnaryPayloadElem extends ScribNodeBase implements PayloadElem//extends PayloadElem +public class UnaryPayloadElem extends ScribNodeBase + implements PayloadElem// extends PayloadElem { - //public final PayloadElemNameNode name; - //public final DataTypeNode data; - public final PayloadElemNameNode name; // (Ambig.) DataTypeNode or parameter + // ScribTreeAdaptor#create constructor + public UnaryPayloadElem(Token t) + { + super(t); + this.name = null; + } + + // Tree#dupNode constructor + public UnaryPayloadElem(UnaryPayloadElem node) + { + super(node); + this.name = null; + } + + public PayloadElemNameNode getNameChild() + { + @SuppressWarnings("unchecked") + PayloadElemNameNode name = (PayloadElemNameNode) getChild(0); + // CHECKME: probably need to record an explicit kind token, for "cast checking" + // Cannot use ScribNodeBase.visitChildWithCastCheck because this is not a ProtocolKindNode + return name; + } + + @Override + public UnaryPayloadElem dupNode() + { + return new UnaryPayloadElem<>(this); + } + + public UnaryPayloadElem reconstruct(PayloadElemNameNode name) + { + UnaryPayloadElem elem = dupNode(); + elem.addChild(name); + ScribDel del = del(); + elem.setDel(del); // No copy + return elem; + } + + @Override + public UnaryPayloadElem visitChildren(AstVisitor nv) throws ScribbleException + { + @SuppressWarnings("unchecked") + PayloadElemNameNode name = (PayloadElemNameNode) visitChild(getNameChild(), nv); + // CHECKME: probably need to record an explicit kind token, for "cast checking" + // Cannot use ScribNodeBase.visitChildWithCastCheck because this is not a ProtocolKindNode + return reconstruct(name); + } + + @Override + public UnaryPayloadElem project(AstFactory af) + { + return this; + } + + @Override + public PayloadElemType toPayloadType() + { + return getNameChild().toPayloadType(); + } + + @Override + public String toString() + { + return getNameChild().toString(); + } + + + + + + + + + + + + + + private final PayloadElemNameNode name; // (Ambig.) DataTypeNode or parameter //public DataTypeElem(PayloadElemNameNode name) //public UnaryPayloadlem(DataTypeNode data) @@ -45,14 +122,8 @@ public UnaryPayloadElem(CommonTree source, PayloadElemNameNode name) super(source); this.name = name; } - - @Override - public UnaryPayloadElem project(AstFactory af) - { - return this; - } - @Override + /*@Override protected UnaryPayloadElem copy() { //return new UnaryPayloadElem(this.data); @@ -76,34 +147,5 @@ public UnaryPayloadElem reconstruct(PayloadElemNameNode name) UnaryPayloadElem elem = new UnaryPayloadElem<>(this.source, name); elem = ScribNodeBase.del(elem, del); return elem; - } - - @Override - public UnaryPayloadElem visitChildren(AstVisitor nv) throws ScribbleException - { - //PayloadElemNameNode name = (PayloadElemNameNode) visitChild(this.data, nv); - //DataTypeNode name = (PayloadElemNameNode) visitChild(this.data, nv); - @SuppressWarnings("unchecked") - PayloadElemNameNode name = (PayloadElemNameNode) visitChild(this.name, nv); - // FIXME: probably need to record an explicit kind token, for "cast checking" - // Cannot use ScribNodeBase.visitChildWithCastCheck because this is not a ProtocolKindNode - //PayloadElemNameNode name = (PayloadElemNameNode) visitChildWithClassEqualityCheck(this, this.name, nv); // No: can be initially Ambig - return reconstruct(name); - } - - @Override - public String toString() - { - //return this.data.toString(); - return this.name.toString(); - } - - @Override - //public PayloadType toPayloadType() // Currently can assume the only possible kind is DataTypeKind - //public PayloadType toPayloadType() // Currently can assume the only possible kind is DataTypeKind - public PayloadElemType toPayloadType() // Currently can assume the only possible kind is DataTypeKind - { - //return this.data.toPayloadType(); - return this.name.toPayloadType(); - } + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java b/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java index a5eaf5467..31dde9ea4 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java @@ -76,9 +76,9 @@ public LChoice project(AstFactory af, Role self, List blocks) if (!blocks.isEmpty()) { RoleNode subj = getSubjectChild(); - // FIXME? initially keep global subject, and later overwrite as necessary in projections? (algorithm currently checks for DUMMY) + // CHECKME: initially keep global subject, and later overwrite as necessary in projections? (algorithm currently checks for DUMMY) RoleNode subj1 = self.equals(subj.toName()) - ? subj.clone(af) + ? subj.clone()//af) : af.DummyProjectionRoleNode(); List cs = blocks.stream() .map(b -> af.LChoice(this.source, subj1, Arrays.asList(b))) diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GDelegationElem.java b/scribble-core/src/main/java/org/scribble/ast/global/GDelegationElem.java index f8e33532d..082b7ef3d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GDelegationElem.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GDelegationElem.java @@ -13,6 +13,7 @@ */ package org.scribble.ast.global; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.PayloadElem; @@ -33,42 +34,50 @@ //public class DelegationElem extends PayloadElem public class GDelegationElem extends ScribNodeBase implements PayloadElem { - // Currently no potential for ambiguity, cf. UnaryPayloadElem (DataTypeNameNode or ParameterNode) - public final GProtocolNameNode proto; // Becomes full name after disambiguation - public final RoleNode role; - - public GDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role) + // ScribTreeAdaptor#create constructor + public GDelegationElem(Token t) { - //super(proto); - super(source); - this.proto = proto; - this.role = role; + super(t); + this.proto = null; + this.role = null; } - - @Override - public LDelegationElem project(AstFactory af) + + // Tree#dupNode constructor + public GDelegationElem(GDelegationElem node) { - return af.LDelegationElem(this.source, Projector.makeProjectedFullNameNode(af, this.source, this.proto.toName(), this.role.toName())); + super(node); + this.proto = null; + this.role = null; } - @Override - public boolean isGlobalDelegationElem() + // Becomes full name after disambiguation + public GProtocolNameNode getProtocolChild() { - return true; + return (GProtocolNameNode) getChild(0); } - + + public RoleNode getRoleChild() + { + return (RoleNode) getChild(1); + } + @Override - protected GDelegationElem copy() + public GDelegationElem dupNode() { - return new GDelegationElem(this.source, this.proto, this.role); + return new GDelegationElem(this); } @Override - public GDelegationElem clone(AstFactory af) + public LDelegationElem project(AstFactory af) { - GProtocolNameNode name = (GProtocolNameNode) this.proto.clone(af); - RoleNode role = (RoleNode) this.role.clone(af); - return af.GDelegationElem(this.source, name, role); + return af.LDelegationElem(this.source, Projector.makeProjectedFullNameNode( + af, this.source, getProtocolChild().toName(), getRoleChild().toName())); + } + + @Override + public boolean isGlobalDelegationElem() + { + return true; } public GDelegationElem reconstruct(GProtocolNameNode proto, RoleNode role) @@ -82,20 +91,63 @@ public GDelegationElem reconstruct(GProtocolNameNode proto, RoleNode role) @Override public GDelegationElem visitChildren(AstVisitor nv) throws ScribbleException { - GProtocolNameNode name = (GProtocolNameNode) visitChild(this.proto, nv); - RoleNode role = (RoleNode) visitChild(this.role, nv); + GProtocolNameNode name = (GProtocolNameNode) + visitChild(getProtocolChild(), nv); + RoleNode role = (RoleNode) visitChild(getRoleChild(), nv); return reconstruct(name, role); } + + @Override + public PayloadElemType toPayloadType() + { + return new GDelegationType(getProtocolChild().toName(), + getRoleChild().toName()); + } @Override public String toString() { - return this.proto + "@" + this.role; + return getProtocolChild() + "@" + getRoleChild(); } - @Override - public PayloadElemType toPayloadType() + + + + + + + + + + + + + + + + // Currently no potential for ambiguity, cf. UnaryPayloadElem (DataTypeNameNode or ParameterNode) + private final GProtocolNameNode proto; // Becomes full name after disambiguation + private final RoleNode role; + + public GDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role) + { + //super(proto); + super(source); + this.proto = proto; + this.role = role; + } + + /*@Override + protected GDelegationElem copy() { - return new GDelegationType(this.proto.toName(), this.role.toName()); + return new GDelegationElem(this.source, this.proto, this.role); } + + @Override + public GDelegationElem clone(AstFactory af) + { + GProtocolNameNode name = (GProtocolNameNode) this.proto.clone(af); + RoleNode role = (RoleNode) this.role.clone(af); + return af.GDelegationElem(this.source, name, role); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GInterruptible.java b/scribble-core/src/main/java/org/scribble/ast/global/GInterruptible.java deleted file mode 100644 index 734cf5017..000000000 --- a/scribble-core/src/main/java/org/scribble/ast/global/GInterruptible.java +++ /dev/null @@ -1,282 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.global; - -import java.util.List; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.Interruptible; -import org.scribble.ast.ProtocolBlock; -import org.scribble.ast.ScribNodeBase; -import org.scribble.ast.name.simple.ScopeNode; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.ScopeKind; -import org.scribble.type.name.Name; - -//public class GlobalInterruptible extends Interruptible implements GlobalInteractionNode -public class GInterruptible extends Interruptible implements GCompoundInteractionNode -{ - /*public static final Function toGlobalInterrupt = - (Interrupt interr) - -> (GlobalInterrupt) interr; - - public static final Function, List> toGlobalInterruptList = - (List interrs) - -> interrs.stream().map(GlobalInterruptible.toGlobalInterrupt).collect(Collectors.toList());*/ - - //public GlobalInterruptible(GlobalProtocolBlock block, List interrs) - public GInterruptible(CommonTree source, ProtocolBlock block, List interrs) - { - //this(null, block, interrs, null, null); - this(source, null, block, interrs); - } - - //public GlobalInterruptible(ScopeNode scope, GlobalProtocolBlock block, List interrs) - public GInterruptible(CommonTree source, ScopeNode scope, ProtocolBlock block, List interrs) - { - //this(ct, scope, block, interrs, null, null); - super(source, scope, block, interrs); - } - - @Override - protected ScribNodeBase copy() - { - throw new RuntimeException("TODO: " + this); - } - - @Override - public GInterruptible clone(AstFactory af) - { - throw new RuntimeException("TODO: " + this); - } - - @Override - public boolean isEmptyScope() - { - throw new RuntimeException("TODO: " + this); - } - - @Override - public Name getScopeElement() - { - throw new RuntimeException("TODO: " + this); - } - - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public Global getKind() - { - return GCompoundInteractionNode.super.getKind(); - }*/ - - - - - - /*protected GlobalInterruptible(CommonTree ct, ScopeNode scope, GlobalProtocolBlock block, List interrs, CompoundInteractionNodeContext icontext) - { - super(ct, scope, block, interrs, icontext); - }* / - - protected GlobalInterruptible(CommonTree ct, ScopeNode scope, GlobalProtocolBlock block, List interrs, CompoundInteractionNodeContext icontext, Env env) - { - super(ct, scope, block, interrs, icontext, env); - } - - @Override - protected GlobalInterruptible reconstruct(CommonTree ct, ScopeNode scope, GlobalProtocolBlock block, List interrs, CompoundInteractionNodeContext icontext, Env env) - { - return new GlobalInterruptible(ct, scope, block, interrs, icontext, env); - } - - @Override - public GlobalInterruptible leaveDisambiguation(NameDisambiguator disamb) throws ScribbleException - { - ScopeNode scope = this.scope; - if (scope == null) - { - scope = disamb.getFreshScope(); - } - //return new GlobalInterruptible(this.ct, scope, this.block, this.interrs); - return reconstruct(this.ct, scope, this.block, this.interrs, getContext(), getEnv()); - } - - @Override - public GlobalInterruptible leaveContextBuilding(NodeContextBuilder builder) throws ScribbleException - { - Interruptible intt = super.leaveContextBuilding(builder); - ProtocolBlockContext bcontext = intt.block.getContext(); - // Interrupt dests building done here (in the parent) because visitor pattern for context building doesn't easily allow children (block and interrupts) to see each other's contexts - List interrs = new LinkedList(); - //ProtocolDeclContext pdcontext = builder.getProtocolDeclContext(); - for (GlobalInterrupt interr : intt.interrs) - { - Role src = interr.src.toName(); - List dests = new LinkedList<>(bcontext.getRoles()); - // FIXME: also include other interrupt sources? - dests.remove(src); - GlobalInterruptContext icontext = new GlobalInterruptContext(dests); - interrs.add(new GlobalInterrupt(interr.ct, interr.src, interr.msgs, icontext, interr.getEnv())); - CompoundInteractionContext cicontext = (CompoundInteractionContext) builder.peekContext(); - for (Role dest : dests) // Cannot do in super Interruptible because dest info not available yet - { - for (MessageNode mn : interr.msgs) - { - Message msg = mn.toMessage(); - //((CompoundInteractionContext) builder.peekContext()).addInterrupt(src, dest, msg); - //builder.replaceContext(((CompoundInteractionContext) builder.peekContext()).addInterrupt(src, dest, msg)); - cicontext = cicontext.addInterrupt(src, dest, msg); - } - } - builder.replaceContext(cicontext); - } - //return new GlobalInterruptible(intt.ct, intt.scope, intt.block, interrs, intt.getContext()); - return reconstruct(intt.ct, intt.scope, intt.block, interrs, intt.getContext(), getEnv()); - } - - @Override - public GlobalInterruptible leaveProjection(Projector proj) //throws ScribbleException - { - ScopeNode scope = new ScopeNode(null, this.scope.toName().toString()); // Inconsistent to copy role nodes manually, but do via children visiting for other children - LocalProtocolBlock block = (LocalProtocolBlock) ((ProjectionEnv) this.block.getEnv()).getProjection(); - /*List interrs = - this.interrs.stream().map(() -> (LocalInterrupt) ((ProjectionEnv) .getEnv()).getProjection()).collect(Collectors.toList());* / - LocalThrows thro = null; - List cats = new LinkedList<>(); - for (GlobalInterrupt gi : this.interrs) - { - LocalInterrupt li = (LocalInterrupt) ((ProjectionEnv) gi.getEnv()).getProjection(); - if (li != null) - { - if (li instanceof LocalThrows) - { - thro = (LocalThrows) li; - } - else - { - cats.add((LocalCatches) li); - } - } - } - LocalInterruptible projection = null; - if (!block.isEmpty() || thro != null) - { - projection = new LocalInterruptible(ct, scope, block, thro, cats); - } - this.setEnv(new ProjectionEnv(proj.getJobContext(), proj.getModuleContext(), projection)); - return this; - } - - /*@Override - public GlobalInterruptible leaveWFChoiceCheck(WellFormedChoiceChecker checker) throws ScribbleException - { - Interruptible intt = super.leaveWFChoiceCheck(checker); - return new GlobalInterruptible(intt.ct, intt.scope, intt.block, intt.interrs, intt.getContext(), intt.getEnv()); - }*/ - - /*@Override - public Env enter(EnvVisitor nv) throws ScribbleException - { - Env env = nv.getEnv(); - if (nv instanceof WellFormednessChecker) // Hacky - { - Scope scope = this.scope.toName(); - if (env.scopes.getScopes().contains(scope)) - { - throw new ScribbleException("Duplicate scope: " + scope); - } - } - return super.enter(nv); - } - - @Override - public GlobalInterruptible checkWellFormedness(WellFormednessChecker wfc) throws ScribbleException - { - GlobalInterruptible gi = (GlobalInterruptible) super.checkWellFormedness(wfc); // visitChildren - Env env = gi.block.getEnv(); - Set roles = new HashSet<>(); - for (Interrupt interr : gi.interrs) - { - //GlobalInterrupt interr = (GlobalInterrupt) foo; - Role src = interr.src.toName(); - if (roles.contains(src)) - { - throw new ScribbleException("Duplicate interrupt source role: " + src); - } - roles.add(src); - if (env.ops.getSources().contains(src)) - { - Set ops = new HashSet<>(env.ops.getAll(src)); - List tmp = interr.getOperators(env); - ops.retainAll(tmp); - if (!ops.isEmpty()) - { - throw new ScribbleException("Bad interrupt operators: " + tmp); - } - } - } - return gi; - } - - @Override - public LocalInterruptible project(Projector proj) throws ScribbleException - { - // Not calling super method (doing child visiting manually) - LocalProtocolBlock block = (LocalProtocolBlock) proj.visit(this.block); - LocalThrows thro = null; - List cats = new LinkedList<>(); - for (Interrupt interr : this.interrs) - { - if (!interr.dests.isEmpty()) // HACK: make more proper -- if no one to throw interr to, cannot throw (so don't project) - { - LocalNode ln = (LocalNode) proj.visit(interr); - if (ln != null) - { - if (block == null) - { - LocalInteractionSequence lis = new LocalInteractionSequence(null, Collections.emptyList()); - block = new LocalProtocolBlock(null, lis); - } - - if (ln instanceof LocalThrows) - { - if (thro != null) - { - throw new RuntimeException("Shouldn't get in here: " + this); - } - thro = (LocalThrows) ln; - } - else - { - cats.add((LocalCatches) ln); - } - } - } - } - if (block == null && thro == null && cats.isEmpty()) - { - return null; - } - return new LocalInterruptible(null, this.scope, block, thro, cats); - }*/ - - /*@Override - public GlobalInterruptible visitChildren(NodeVisitor nv) throws ScribbleException - { - Interruptible intt = super.visitChildren(nv); - //List interrs = GlobalInterruptible.toGlobalInterruptList.apply(intt.interrs); - return new GlobalInterruptible(intt.ct, intt.scope, intt.block, intt.interrs, intt.getContext(), intt.getEnv()); - }*/ -} diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GParallel.java b/scribble-core/src/main/java/org/scribble/ast/global/GParallel.java deleted file mode 100644 index c6e52ca2b..000000000 --- a/scribble-core/src/main/java/org/scribble/ast/global/GParallel.java +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.global; - -import java.util.List; -import java.util.stream.Collectors; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.Parallel; -import org.scribble.ast.ProtocolBlock; -import org.scribble.ast.ScribNodeBase; -import org.scribble.del.ScribDel; -import org.scribble.type.kind.Global; - -public class GParallel extends Parallel implements GCompoundInteractionNode -{ - public GParallel(CommonTree source, List blocks) - { - super(source, blocks); - } - - @Override - protected ScribNodeBase copy() - { - return new GParallel(this.source, getBlocks()); - } - - @Override - public GParallel clone(AstFactory af) - { - //List blocks = ScribUtil.cloneList(getBlocks()); - throw new RuntimeException("TODO: " + this); - } - - @Override - public GParallel reconstruct(List> blocks) - { - ScribDel del = del(); - GParallel gp = new GParallel(this.source, castBlocks(blocks)); - gp = (GParallel) gp.del(del); - return gp; - } - - @Override - public List getBlocks() - { - return castBlocks(super.getBlocks()); - } - - private static List castBlocks(List> blocks) - { - return blocks.stream().map((b) -> (GProtocolBlock) b).collect(Collectors.toList()); - } - - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public Global getKind() - { - return GCompoundInteractionNode.super.getKind(); - }*/ -} diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LDelegationElem.java b/scribble-core/src/main/java/org/scribble/ast/local/LDelegationElem.java index c156d6d65..a5cd56254 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LDelegationElem.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LDelegationElem.java @@ -13,23 +13,31 @@ */ package org.scribble.ast.local; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.UnaryPayloadElem; import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; import org.scribble.type.kind.Local; -import org.scribble.type.name.PayloadElemType; -import org.scribble.visit.AstVisitor; // N.B. extends UnaryPayloadElem, not DelegationElem public class LDelegationElem extends UnaryPayloadElem { - // Currently no potential for ambiguity because only generated, not parsed - public LDelegationElem(CommonTree source, LProtocolNameNode proto) + // ScribTreeAdaptor#create constructor + public LDelegationElem(Token t) { - super(source, proto); + super(t); + } + + // Tree#dupNode constructor + public LDelegationElem(LDelegationElem node) + { + super(node); + } + + @Override + public LDelegationElem dupNode() + { + return new LDelegationElem(this); } @Override @@ -38,7 +46,35 @@ public boolean isLocalDelegationElem() return true; } - @Override + /*@Override + public LDelegationElem visitChildren(AstVisitor nv) throws ScribbleException + { + LProtocolNameNode name = (LProtocolNameNode) visitChild(this.name, nv); + return reconstruct(name); + }*/ + + /*@Override + public PayloadElemType toPayloadType() + { + return getNameChild().toPayloadType(); + }*/ + + + + + + + + + + + // Currently no potential for ambiguity because only generated, not parsed + public LDelegationElem(CommonTree source, LProtocolNameNode proto) + { + super(source, proto); + } + + /*@Override protected LDelegationElem copy() { return new LDelegationElem(this.source, (LProtocolNameNode) this.name); @@ -57,25 +93,5 @@ public LDelegationElem reconstruct(LProtocolNameNode proto) LDelegationElem elem = new LDelegationElem(this.source, proto); elem = (LDelegationElem) elem.del(del); return elem; - } - - @Override - public LDelegationElem visitChildren(AstVisitor nv) throws ScribbleException - { - LProtocolNameNode name = (LProtocolNameNode) visitChild(this.name, nv); - return reconstruct(name); - } - - /*@Override - public String toString() - { - return this.proto + "@" + this.role; }*/ - - @Override - //public PayloadType toPayloadType() - public PayloadElemType toPayloadType() - { - return this.name.toPayloadType(); - } } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LInterruptible.java b/scribble-core/src/main/java/org/scribble/ast/local/LInterruptible.java deleted file mode 100644 index 8e664abdb..000000000 --- a/scribble-core/src/main/java/org/scribble/ast/local/LInterruptible.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import java.util.List; -import java.util.Set; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.Interruptible; -import org.scribble.ast.ProtocolBlock; -import org.scribble.ast.ScribNodeBase; -import org.scribble.ast.name.simple.ScopeNode; -import org.scribble.main.ScribbleException; -import org.scribble.type.Message; -import org.scribble.type.kind.Local; -import org.scribble.type.kind.ScopeKind; -import org.scribble.type.name.Name; -import org.scribble.type.name.Role; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; - -//public class LocalInterruptible extends Interruptible implements LocalInteractionNode -public class LInterruptible extends Interruptible implements LCompoundInteractionNode -{ - //protected LocalInterruptible(ScopeNode scope, LocalProtocolBlock block, List interrs) - protected LInterruptible(CommonTree source, ScopeNode scope, ProtocolBlock block, List interrs) - { - super(source, scope, block, interrs); - } - - @Override - protected ScribNodeBase copy() - { - throw new RuntimeException("TODO: " + this); - } - - @Override - public LInterruptible clone(AstFactory af) - { - throw new RuntimeException("TODO: " + this); - } - - @Override - public boolean isEmptyScope() - { - throw new RuntimeException("TODO: " + this); - } - - @Override - public Name getScopeElement() - { - throw new RuntimeException("TODO: " + this); - } - - @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) - { - throw new RuntimeException("TODO: " + this); - } - - @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) throws ScribbleException - { - throw new RuntimeException("TODO: " + this); - } - - @Override - public boolean canMerge(LInteractionNode ln) - { - throw new RuntimeException("TODO: " + this); - } - - @Override - public Set getEnabling() - { - throw new RuntimeException("TODO: " + this); - } - - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public Local getKind() - { - return LCompoundInteractionNode.super.getKind(); - }*/ - - - - - - - /*public LocalInterruptible(CommonTree ct, ScopeNode scope, LocalProtocolBlock block, LocalThrows thro, List cats) - { - this(ct, scope, block, compileInterrupts(thro, cats), null, null); - } - - /*public LocalInterruptible(CommonTree ct, ScopeNode scope, LocalProtocolBlock block, List interrs, CompoundInteractionNodeContext icontext) - { - super(ct, scope, block, interrs, icontext); - }* / - - protected LocalInterruptible(CommonTree ct, ScopeNode scope, LocalProtocolBlock block, List interrs, CompoundInteractionNodeContext icontext, Env env) - { - super(ct, scope, block, interrs, icontext, env); - } - - private static List compileInterrupts(LocalThrows thro, List cats) - { - List interrs = new LinkedList<>(); - if (thro != null) - { - interrs.add(thro); - } - interrs.addAll(cats); - return interrs; - } - - @Override - protected LocalInterruptible reconstruct(CommonTree ct, ScopeNode scope, LocalProtocolBlock block, List interrs, CompoundInteractionNodeContext icontext, Env env) - { - return new LocalInterruptible(ct, scope, block, interrs, icontext, env); - } - - @Override - public LocalInterruptible leaveGraphBuilding(GraphBuilder builder) - { - throw new RuntimeException("TODO: "); - } - - /*@Override - public LocalInterruptible leaveContextBuilding(Node parent, NodeContextBuilder builder) throws ScribbleException - { - Interruptible intt = super.leaveContextBuilding(parent, builder); - return new LocalInterruptible(intt.ct, intt.scope, intt.block, interrs, (CompoundInteractionNodeContext) intt.getContext()); - } - - @Override - public LocalInterruptible leaveWFChoiceCheck(WellFormedChoiceChecker checker) throws ScribbleException - { - Interruptible intt = super.leaveWFChoiceCheck(checker); - return new LocalInterruptible(intt.ct, intt.scope, intt.block, intt.interrs, (CompoundInteractionNodeContext) intt.getContext(), intt.getEnv()); - } - - @Override - public LocalInterruptible visitChildren(NodeVisitor nv) throws ScribbleException - { - Interruptible intt = super.visitChildren(nv); - return new LocalInterruptible(intt.ct, intt.scope, intt.block, intt.interrs, intt.getContext(), intt.getEnv()); - }*/ -} diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LParallel.java b/scribble-core/src/main/java/org/scribble/ast/local/LParallel.java deleted file mode 100644 index 1a1e934ea..000000000 --- a/scribble-core/src/main/java/org/scribble/ast/local/LParallel.java +++ /dev/null @@ -1,102 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.Parallel; -import org.scribble.ast.ProtocolBlock; -import org.scribble.ast.ScribNodeBase; -import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; -import org.scribble.type.Message; -import org.scribble.type.kind.Local; -import org.scribble.type.name.Role; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; - -public class LParallel extends Parallel implements LCompoundInteractionNode -{ - public LParallel(CommonTree source, List blocks) - { - super(source, blocks); - } - - @Override - protected ScribNodeBase copy() - { - return new LParallel(this.source, getBlocks()); - } - - @Override - public LParallel clone(AstFactory af) - { - //List<:ProtocolBlock> blocks = ScribUtil.cloneList(getBlocks()); - throw new RuntimeException("TODO: " + this); - } - - @Override - public LParallel reconstruct(List> blocks) - { - ScribDel del = del(); - LParallel lp = new LParallel(this.source, castBlocks(blocks)); - lp = (LParallel) lp.del(del); - return lp; - } - - @Override - public List getBlocks() - { - return castBlocks(super.getBlocks()); - } - - @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) - { - return getBlocks().get(0).getInteractSeqChild().getInteractNodeChildren().get(0).inferLocalChoiceSubject(fixer); - } - - private static List castBlocks(List> blocks) - { - return blocks.stream().map((b) -> (LProtocolBlock) b).collect(Collectors.toList()); - } - - @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) throws ScribbleException - { - throw new RuntimeException("TODO: " + this); - } - - @Override - public boolean canMerge(LInteractionNode ln) - { - throw new RuntimeException("TODO: " + this); - } - - @Override - public Set getEnabling() - { - throw new RuntimeException("TODO: " + this); - } - - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public Local getKind() - { - return LCompoundInteractionNode.super.getKind(); - }*/ -} diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java index e2f84556d..cf7a0f0d0 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java @@ -50,6 +50,12 @@ protected RoleNode reconstruct(String id) return r; } + @Override + public RoleNode clone() + { + return (RoleNode) clone(); + } + @Override public RoleNode substituteNames(Substitutor subs) { diff --git a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java index d38860589..44072f441 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java @@ -38,7 +38,7 @@ public DoArgListDel() public DoArgList leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException { DoArgList dal = (DoArgList) visited; - List args = dal.getDoArgs(); + List args = dal.getArgChildren(); ProtocolDecl pd = getTargetProtocolDecl((Do) parent, disamb); if (args.size() != getParamDeclList(pd).getDecls().size()) { diff --git a/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java b/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java index 79f7c93ed..cfff56f61 100644 --- a/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java @@ -44,7 +44,7 @@ public NonRoleArgList leaveDisambiguation(ScribNode parent, ScribNode child, Nam // Checks matching arity ProtocolDecl pd = getTargetProtocolDecl((Do) parent, disamb); - Iterator args = nral.getDoArgs().iterator(); + Iterator args = nral.getArgChildren().iterator(); for (NonRoleParamDecl param : pd.header.paramdecls.getDecls()) { NonRoleParamKind kind = param.kind; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java index a7068bbfb..401212e42 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java @@ -98,13 +98,13 @@ public LDo leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefI // Could possibly factor out rolemap making with SubprotocolVisitor a bit, but there it maps to RoleNode and works off a root map GProtocolName source = ((LProjectionDeclDel) lpd.del()).getSourceProtocol(); GProtocolDecl gpd = (GProtocolDecl) jc.getModule(source.getPrefix()).getProtocolDeclChild(source.getSimpleName()); - Iterator roleargs = ld.roles.getDoArgs().iterator(); + Iterator roleargs = ld.roles.getArgChildren().iterator(); Map rolemap = gpd.header.roledecls.getRoles().stream().collect( Collectors.toMap(r -> r, r -> roleargs.next().val.toName())); Set occs = ((LProtocolDeclDel) lpd.del()).getProtocolDeclContext().getRoleOccurrences().stream().map(r -> rolemap.get(r)).collect(Collectors.toSet()); - List ras = ld.roles.getDoArgs().stream().filter(ra -> occs.contains(ra.val.toName())).collect(Collectors.toList()); + List ras = ld.roles.getArgChildren().stream().filter(ra -> occs.contains(ra.val.toName())).collect(Collectors.toList()); RoleArgList roles = ld.roles.reconstruct(ras); return super.leaveProjectedRoleDeclFixing(parent, child, fixer, ld.reconstruct(roles, ld.args, ld.getProtocolNameNode())); } From e123de64fbf37a0e9255072c056b8993c70b8406 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 29 Jan 2019 17:43:36 +0000 Subject: [PATCH 081/539] Continued WIP. --- .../java/org/scribble/ast/ConnectAction.java | 20 +- .../java/org/scribble/ast/DataTypeDecl.java | 2 +- .../org/scribble/ast/HeaderParamDecl.java | 54 ++++- .../org/scribble/ast/HeaderParamDeclList.java | 53 +++-- .../main/java/org/scribble/ast/Interrupt.java | 149 ------------- .../java/org/scribble/ast/Interruptible.java | 128 ----------- .../org/scribble/ast/MessageSigNameDecl.java | 2 +- .../java/org/scribble/ast/ModuleDecl.java | 2 +- .../java/org/scribble/ast/NameDeclNode.java | 30 +-- .../java/org/scribble/ast/NonRoleArgList.java | 5 +- .../org/scribble/ast/NonRoleParamDecl.java | 115 ++++++---- .../scribble/ast/NonRoleParamDeclList.java | 80 ++++--- .../org/scribble/ast/PayloadElemList.java | 99 ++++++--- .../main/java/org/scribble/ast/RoleArg.java | 5 +- .../main/java/org/scribble/ast/RoleDecl.java | 82 +++++--- .../java/org/scribble/ast/RoleDeclList.java | 79 ++++--- .../org/scribble/ast/global/GInterrupt.java | 199 ------------------ .../org/scribble/ast/global/GRecursion.java | 2 +- .../java/org/scribble/ast/local/LCatches.java | 90 -------- .../org/scribble/ast/local/LInterrupt.java | 96 --------- .../scribble/ast/local/LProtocolHeader.java | 2 +- .../org/scribble/ast/local/LRecursion.java | 2 +- .../java/org/scribble/ast/local/LThrows.java | 96 --------- .../org/scribble/ast/local/SelfRoleDecl.java | 60 ++++-- .../scribble/ast/name/simple/RecVarNode.java | 6 + .../java/org/scribble/del/DoArgListDel.java | 2 +- .../scribble/del/HeaderParamDeclListDel.java | 2 +- .../org/scribble/del/MessageTransferDel.java | 2 +- .../org/scribble/del/NonRoleArgListDel.java | 2 +- .../org/scribble/del/local/LChoiceDel.java | 69 ++++-- .../org/scribble/del/local/LParallelDel.java | 21 -- .../del/local/LProjectionDeclDel.java | 2 +- .../scribble/visit/SubprotocolVisitor.java | 6 +- .../scribble/ast/global/AntlrGInterrupt.java | 55 ----- .../ast/global/AntlrGInterruptible.java | 73 ------- .../scribble/ast/global/AntlrGParallel.java | 46 ---- .../scribble/ast/name/AntlrSimpleName.java | 11 - 37 files changed, 509 insertions(+), 1240 deletions(-) delete mode 100644 scribble-core/src/main/java/org/scribble/ast/Interrupt.java delete mode 100644 scribble-core/src/main/java/org/scribble/ast/Interruptible.java delete mode 100644 scribble-core/src/main/java/org/scribble/ast/global/GInterrupt.java delete mode 100644 scribble-core/src/main/java/org/scribble/ast/local/LCatches.java delete mode 100644 scribble-core/src/main/java/org/scribble/ast/local/LInterrupt.java delete mode 100644 scribble-core/src/main/java/org/scribble/ast/local/LThrows.java delete mode 100644 scribble-core/src/main/java/org/scribble/del/local/LParallelDel.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGInterrupt.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGInterruptible.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGParallel.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java b/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java index e5d432d64..ddd6c0f6a 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java +++ b/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java @@ -42,16 +42,6 @@ public ConnectAction(ConnectAction node) this.dest = null; } - protected boolean isUnitMessage() - { - if (!this.msg.isMessageSigNode()) - { - return false; - } - MessageSigNode msn = (MessageSigNode) this.msg; - return msn.op.isEmpty() && msn.payloads.isEmpty(); - } - public abstract ConnectAction dupNode(); public MessageNode getMessageNodeChild() @@ -90,6 +80,16 @@ public ConnectAction visitChildren(AstVisitor nv) return reconstruct(src, msg, dest); } + protected boolean isUnitMessage() + { + if (!this.msg.isMessageSigNode()) + { + return false; + } + MessageSigNode msn = (MessageSigNode) this.msg; + return msn.getOpChild().isEmpty() && msn.getPayloadListChild().isEmpty(); + } + @Override public abstract String toString(); diff --git a/scribble-core/src/main/java/org/scribble/ast/DataTypeDecl.java b/scribble-core/src/main/java/org/scribble/ast/DataTypeDecl.java index 950845069..326ab8336 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DataTypeDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/DataTypeDecl.java @@ -63,7 +63,7 @@ public boolean isDataTypeDecl() @Override public DataTypeNode getNameNodeChild() { - return (DataTypeNode) getChild(); + return (DataTypeNode) getRawNameNodeChild(); } // Simple name (ModuleDecl is the only NameDeclNode that uses qualified names) diff --git a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java index 55501c4b0..c39c1a1ae 100644 --- a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java @@ -13,9 +13,13 @@ */ package org.scribble.ast; +import java.util.LinkedList; +import java.util.List; + import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.SimpleNameNode; +import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ParamKind; import org.scribble.type.name.Role; @@ -23,34 +27,68 @@ // Names that are declared in a protocol header (roles and parameters -- not the protocol name though) // RoleKind or (NonRole)ParamKind -public abstract class HeaderParamDecl extends NameDeclNode +public abstract class HeaderParamDecl + extends NameDeclNode { + // ScribTreeAdaptor#create constructor public HeaderParamDecl(Token t) { super(t); } - protected HeaderParamDecl(CommonTree source, SimpleNameNode name) + // Tree#dupNode constructor + public HeaderParamDecl(HeaderParamDecl node) { - super(source, name); + super(node); } + + @Override + public abstract SimpleNameNode getNameNodeChild(); + + public abstract HeaderParamDecl dupNode(); - public abstract HeaderParamDecl reconstruct(SimpleNameNode name); + public HeaderParamDecl reconstruct(SimpleNameNode name) + { + HeaderParamDecl pd = dupNode(); + ScribDel del = del(); + List children = new LinkedList<>(); + children.add(name); + pd.setDel(del); // No copy + return pd; + } @Override - public HeaderParamDecl visitChildren(AstVisitor nv) throws ScribbleException + public HeaderParamDecl visitChildren(AstVisitor nv) + throws ScribbleException { - SimpleNameNode name = visitChildWithClassEqualityCheck(this, (SimpleNameNode) this.name, nv); + SimpleNameNode name = + visitChildWithClassEqualityCheck(this, getNameNodeChild(), nv); return reconstruct(name); } - - public abstract HeaderParamDecl project(AstFactory af, Role self); // Move to delegate? public abstract String getKeyword(); + public abstract HeaderParamDecl project(AstFactory af, Role self); // Move to delegate? + @Override public String toString() { return getKeyword() + " " + getDeclName().toString(); } + + + + + + + + + + + + + protected HeaderParamDecl(CommonTree source, SimpleNameNode name) + { + super(source, name); + } } diff --git a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java index 23d14c662..57c7d2fbc 100644 --- a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java +++ b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java @@ -13,13 +13,13 @@ */ package org.scribble.ast; -import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ParamKind; import org.scribble.type.name.Role; @@ -29,35 +29,45 @@ // RoleKind or (NonRole)ParamKind public abstract class HeaderParamDeclList extends ScribNodeBase { - private final List> decls; - + // ScribTreeAdaptor#create constructor public HeaderParamDeclList(Token t) { super(t); this.decls = null; } - protected HeaderParamDeclList(CommonTree source, List> decls) + // Tree#dupNode constructor + public HeaderParamDeclList(HeaderParamDeclList node) { - super(source); - this.decls = new LinkedList<>(decls); + super(node); + this.decls = null; } - public abstract HeaderParamDeclList reconstruct(List> decls); + public abstract List> getParamDeclChildren(); @Override - public HeaderParamDeclList visitChildren(AstVisitor nv) throws ScribbleException + public abstract HeaderParamDeclList dupNode(); + + public HeaderParamDeclList reconstruct( + List> decls) { - List> nds = visitChildListWithClassEqualityCheck(this, this.decls, nv); - return reconstruct(nds); + HeaderParamDeclList sig = dupNode(); + sig.addChildren(decls); + ScribDel del = del(); + sig.setDel(del); // No copy + return sig; } - public List> getDecls() + @Override + public HeaderParamDeclList visitChildren(AstVisitor nv) + throws ScribbleException { - return Collections.unmodifiableList(this.decls); + List> nds = + visitChildListWithClassEqualityCheck(this, getParamDeclChildren(), nv); + return reconstruct(nds); } - public abstract HeaderParamDeclList project(AstFactory af, Role self); // FIXME: move to delegate + public abstract HeaderParamDeclList project(AstFactory af, Role self); // CHECKME: move to delegate? public int length() { @@ -73,6 +83,21 @@ public boolean isEmpty() @Override public String toString() { - return this.decls.stream().map((nd) -> nd.toString()).collect(Collectors.joining(", ")); + return this.decls.stream().map(nd -> nd.toString()).collect(Collectors.joining(", ")); + } + + + + + + + + + private final List> decls; + + protected HeaderParamDeclList(CommonTree source, List> decls) + { + super(source); + this.decls = new LinkedList<>(decls); } } diff --git a/scribble-core/src/main/java/org/scribble/ast/Interrupt.java b/scribble-core/src/main/java/org/scribble/ast/Interrupt.java deleted file mode 100644 index cbedda019..000000000 --- a/scribble-core/src/main/java/org/scribble/ast/Interrupt.java +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast; - -import java.util.LinkedList; -import java.util.List; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.name.simple.RoleNode; - -// Maybe factor out a base class with MessageTransfer (the list of dest roles has a different meaning though) -// Can't use abstract/reconstruct pattern, LocalInterrupt has different arguments -- add dummy dests field here to make reconstruct work? -public class Interrupt extends ScribNodeBase//AbstractSimpleInteractionNode -{ - public final RoleNode src; - private final List msgs; - - protected Interrupt(CommonTree source, RoleNode src, List msgs) - { - super(source); - this.src = src; - this.msgs = new LinkedList<>(msgs); - } - - @Override - protected ScribNodeBase copy() - { - // TODO Auto-generated method stub - throw new RuntimeException("TODO: " + this); - } - - @Override - public Interrupt clone(AstFactory af) - { - // TODO Auto-generated method stub - throw new RuntimeException("TODO: " + this); - } - - public List getMessages() - { - return this.msgs; - } - - //protected abstract Interrupt reconstruct(CommonTree ct, RoleNode src, List msgs, GlobalInterruptContext ncontext, Env env); - - /*@Override - public Interrupt leaveWFChoiceCheck(WellFormedChoiceChecker checker) throws ScribbleException - { - Role src = this.src.toName(); - WellFormedChoiceEnv env = checker.getEnv(); - for (Message msg : this.msgs.stream().map((mn) -> mn.toMessage()).collect(Collectors.toList())) - { - for (Role dest : ((GlobalInterruptContext) getContext()).getDestinations()) - { - // Recorded in the interruptible env (not the block or the parent) - //checker.setEnv(checker.getEnv().addInterrupt(src, dest, msg.toScopedMessage(checker.getScope()))); // No: src must be enabled, and if receiver may be enabled by this interrupt then it must also be receiving normally inside the interruptible block - //checker.getEnv().addMessage(src, dest, msg); - env = env.addInterrupt(src, dest, msg.toScopedMessage(checker.getScope())); - } - } - checker.setEnv(env); - return this; - } - - /*@Override - public Interrupt leave(EnvVisitor nv) throws ScribbleException - { - Interrupt gi = (Interrupt) super.leave(nv); - Env env = nv.getEnv(); - Role src = gi.src.toName(); - List tmp = new LinkedList<>(gi.dests); // For GlobalInterrupt, won't work till after well-formedness checked - tmp.remove(src); - for (MessageNode msg : this.msgs) - { - for (Role dest : tmp) - { - env.ops.addOperator(src, dest, msg.getOperator()); - } - } - return gi; - } - - @Override - public Interrupt substitute(Substitutor subs) throws ScribbleException - { - // Follows GlobalMessageTransfer - RoleNode src = subs.substituteRole(this.src.toName()); - List msgs = new LinkedList<>(); - for (MessageNode msg : this.msgs) - { - if (msg.isParameterNode()) - { - msgs.add((MessageNode) subs.substituteParameter(((ParameterNode) msg).toName())); - } - else - { - msgs.add((MessageNode) subs.visit((AbstractNode) msg)); - } - } - List dests = new LinkedList<>(); - for (Role dest : this.dests) - { - dests.add(subs.substituteRole(dest).toName()); - } - return new Interrupt(this.ct, src, msgs, dests); - }* / - - @Override - public Interrupt visitChildren(NodeVisitor nv) throws ScribbleException - { - RoleNode src = (RoleNode) visitChild(this.src, nv); - List msgs = new LinkedList<>(); - for (MessageNode msg : this.msgs) - { - //msgs.add(MessageTransfer.visitMessageNode(nv, msg)); - msgs.add((MessageNode) visitChild(msg, nv)); - } - return new Interrupt(this.ct, src, msgs, getContext(), getEnv());//, this.dests); - //return reconstruct(this.ct, src, msgs, getContext(), getEnv()); - } - - @Override - public GlobalInterruptContext getContext() - { - return (GlobalInterruptContext) super.getContext(); - }*/ - - /*public List getOperators(Env env) - { - List ops = new LinkedList<>(); - for (MessageNode msg : this.msgs) - { - // FIXME: factor out scope prefix manipulation - ops.add(new Operator(env.scopes.getCurrentPrefix() + msg.getOperator().text)); - } - return ops; - }*/ -} diff --git a/scribble-core/src/main/java/org/scribble/ast/Interruptible.java b/scribble-core/src/main/java/org/scribble/ast/Interruptible.java deleted file mode 100644 index 27cfee155..000000000 --- a/scribble-core/src/main/java/org/scribble/ast/Interruptible.java +++ /dev/null @@ -1,128 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast; - -import java.util.Collections; -import java.util.List; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.name.simple.ScopeNode; -import org.scribble.type.kind.ProtocolKind; - -public abstract class Interruptible extends CompoundInteractionNode implements ScopedNode -{ - public final ScopeNode scope; - public final ProtocolBlock block; - public final List interrs; - - protected Interruptible(CommonTree source, ScopeNode scope, ProtocolBlock block, List interrs) - { - super(source); - this.scope = scope; - this.block = block; - this.interrs = Collections.unmodifiableList(interrs); - } - - /*protected abstract Interruptible reconstruct(CommonTree ct, ScopeNode scope, T1 block, List interrs, CompoundInteractionNodeContext icontext, Env env); - - @Override - public NodeContextBuilder enterContextBuilding(NodeContextBuilder builder) throws ScribbleException - { - builder.pushContext(new CompoundInteractionNodeContext()); - return builder; - } - - @Override - public Interruptible leaveContextBuilding(NodeContextBuilder builder) throws ScribbleException - { - CompoundInteractionNodeContext icontext = (CompoundInteractionNodeContext) builder.popContext(); - builder.replaceContext(((CompoundInteractionContext) builder.peekContext()).merge(icontext)); - icontext = (CompoundInteractionNodeContext) icontext.merge(this.block.getContext()); - //return new Interruptible(this.ct, this.scope, this.block, this.interrs, icontext); - return reconstruct(this.ct, this.scope, this.block, this.interrs, icontext, getEnv()); - } - - @Override - public Interruptible leaveWFChoiceCheck(WellFormedChoiceChecker checker) throws ScribbleException - { - checker.getEnv().leave(this, checker); - return this; - - /*Role src = this.src.toName(); - for (Message msg : this.msgs.stream().map((mn) -> mn.toMessage()).collect(Collectors.toList())) - { - for (Role dest : ((GlobalInterruptContext) getContext()).getDestinations()) - { - //checker.getEnv().addInterrupt(src, dest, msg); // No: src must be enabled, and if receiver may be enabled by this interrupt then it must also be receiving normally inside the interruptible block - - System.out.println("2a: " + src + ", " + dest + ", " + msg); - - checker.getEnv().addMessage(src, dest, msg); - } - }* / - } - - @Override - public Interruptible leaveReachabilityCheck(ReachabilityChecker checker) throws ScribbleException - { - checker.getEnv().leave(this, checker); - return this; - } - - @Override - public Interruptible visitChildren(NodeVisitor nv) throws ScribbleException - { - ScopeNode scope = this.scope; - if (scope != null) - { - scope = (ScopeNode) visitChild(this.scope, nv); - } - //ProtocolBlock> block = (ProtocolBlock>) nv.visit(this.block); - T1 block = visitChildWithClassCheck(this, this.block, nv); - List interrs = visitChildListWithClassCheck(this, this.interrs, nv); - //return new Interruptible<>(this.ct, scope, block, interrs, getContext(), getEnv()); - return reconstruct(this.ct, scope, block, interrs, getContext(), getEnv()); - } - - @Override - public boolean isEmptyScope() - { - return false; - } - - @Override - //public Scope getScope() - public SimpleName getScopeElement() - { - return this.scope.toName(); - }*/ - - public boolean isScopeNodeImplicit() - { - return this.scope == null; - } - - /*@Override - public String toString() - { - String s = Constants.INTERRUPTIBLE_KW + " "; - if (!isScopeNodeImplicit()) - { - s += this.scope + ": "; - } - s += this.block + " " + Constants.WITH_KW + " {\n"; - s += this.interrs.stream().map((i) -> i.toString()).collect(Collectors.joining("\n")) + "\n"; - return s + "}"; - }*/ -} diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageSigNameDecl.java b/scribble-core/src/main/java/org/scribble/ast/MessageSigNameDecl.java index 5064c29f2..f30cce66d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageSigNameDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/MessageSigNameDecl.java @@ -63,7 +63,7 @@ public boolean isMessageSigNameDecl() @Override public MessageSigNameNode getNameNodeChild() { - return (MessageSigNameNode) getChild(); + return (MessageSigNameNode) getRawNameNodeChild(); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java b/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java index 11ed8babe..c2e5235bb 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java @@ -73,7 +73,7 @@ public ModuleDecl visitChildren(AstVisitor nv) throws ScribbleException @Override public ModuleNameNode getNameNodeChild() { - return (ModuleNameNode) getChild(); + return (ModuleNameNode) getRawNameNodeChild(); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java b/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java index 2842f5661..abb388239 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java @@ -35,7 +35,7 @@ public NameDeclNode(NameDeclNode node) this.name = null; } - protected final NameNode getChild() + protected final NameNode getRawNameNodeChild() { if (getChildCount() != 1) { @@ -45,40 +45,18 @@ protected final NameNode getChild() return name; } - // Concrete subclasses should use getNameNodeChild() and cast + // Concrete subclasses should use getRawNameNodeChild() and cast // (Avoids needing to explicitly record the kind, cf. NonRoleParamDecl) // (Gets overridden anyway for return type) public abstract NameNode getNameNodeChild(); - /*{ - if (getChildCount() != 1) - { - throw new RuntimeException("Shouldn't get in here: " + this); - } - NameNode name = (NameNode) getChild(0); - if (name.getK) - return name; - }*/ - - /*// Return: simple name (cf. ModuleDecl) - protected Name getName() - { - }*/ // Return: *simple* name (cf. ModuleDecl) // Concrete subclasses should use getNameNode, toName (simple name) and cast // (Gets overridden anyway for return type) public abstract Name getDeclName(); - /*{ - //return this.name.toName(); - if (getChildCount() != 1) - { - throw new RuntimeException("Shouldn't get in here: " + this); - } - Name name = (Name) getChild(0); - return name; - }*/ - + // reconstruct left to subclass-specific, extra fields + //protected abstract NameDeclNode reconstruct(NameNode name); diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java index cb4f526b4..6b3b9aef6 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java @@ -17,6 +17,7 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; +import org.antlr.runtime.tree.CommonTree; import org.scribble.type.Arg; import org.scribble.type.kind.NonRoleArgKind; import org.scribble.type.name.Role; @@ -93,12 +94,12 @@ public String toString() - /*public NonRoleArgList(CommonTree source, List args) + public NonRoleArgList(CommonTree source, List args) { super(source, args); } - @Override + /*@Override protected ScribNodeBase copy() { return new NonRoleArgList(this.source, getArgChildren()); diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java index eb75fa71c..7d8c94c4f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java @@ -13,50 +13,65 @@ */ package org.scribble.ast; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; -import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.simple.NonRoleParamNode; -import org.scribble.ast.name.simple.SimpleNameNode; -import org.scribble.del.ScribDel; import org.scribble.type.kind.DataTypeKind; import org.scribble.type.kind.Local; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.SigKind; -import org.scribble.type.name.DataType; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.MessageSigName; import org.scribble.type.name.Name; import org.scribble.type.name.Role; -public class NonRoleParamDecl extends HeaderParamDecl +// TODO: make concrete subclasses to "eliminate" generic parameter (e.g., for better child casting, etc.) +public class NonRoleParamDecl + extends HeaderParamDecl { public final K kind; // CHECKME: factor up to super? - public NonRoleParamDecl(CommonTree source, K kind, NonRoleParamNode name) + // ScribTreeAdaptor#create constructor + public NonRoleParamDecl(Token t, K kind) { - super(source, name); + super(t); this.kind = kind; } + // Tree#dupNode constructor + public NonRoleParamDecl(NonRoleParamDecl node, K kind) + { + super(node); + this.kind = kind; + } + + @Override + public NonRoleParamDecl dupNode() + { + return new NonRoleParamDecl<>(this, this.kind); + } + @Override - public NameNode getNameNodeChild() + public NonRoleParamNode getNameNodeChild() { - NameNode name = getNameNodeChild(); - if (this.kind.equals(SigKind.KIND) && name instanceof MessageSigNameNode - || this.kind.equals(DataTypeKind.KIND) && name instanceof DataTypeNode - || this.kind.equals(Local.KIND) && name instanceof LProtocolNameNode) + NameNode raw = getRawNameNodeChild(); + if (this.kind.equals(SigKind.KIND) || this.kind.equals(DataTypeKind.KIND) + || this.kind.equals(Local.KIND)) { + // Unchecked cast because this class not further subclassed for kind, nor the NameNodes -- unlike the Kind objects themselves @SuppressWarnings("unchecked") - NameNode cast = (NameNode) name; + NonRoleParamNode cast = (NonRoleParamNode) raw; return cast; } - else - { - throw new RuntimeException("Shouldn't get here: " + this); - } + throw new RuntimeException("Shouldn't get in here: " + this.kind); + } + + @Override + public NonRoleParamDecl project(AstFactory af, Role self) + { + NonRoleParamNode child = getNameNodeChild(); + NonRoleParamNode pn = af.NonRoleParamNode(child.source, this.kind, + child.toString()); + return af.NonRoleParamDecl(this.source, this.kind, pn); } @Override @@ -66,6 +81,38 @@ public Name getDeclName() } @Override + public String getKeyword() + { + if (this.kind.equals(SigKind.KIND)) + { + return Constants.SIG_KW; + } + else if (this.kind.equals(DataTypeKind.KIND)) + { + return Constants.TYPE_KW; + } + else // CHECKME: Local? + { + throw new RuntimeException("Shouldn't get in here: " + this.kind); + } + } + + + + + + + + + + + public NonRoleParamDecl(CommonTree source, K kind, NonRoleParamNode name) + { + super(source, name); + this.kind = kind; + } + + /*@Override public NonRoleParamDecl clone(AstFactory af) { NonRoleParamNode param = (NonRoleParamNode) this.name.clone(af); @@ -86,29 +133,5 @@ public NonRoleParamDecl reconstruct(SimpleNameNode name) protected NonRoleParamDecl copy() { return new NonRoleParamDecl<>(this.source, this.kind, (NonRoleParamNode) this.name); - } - - @Override - public NonRoleParamDecl project(AstFactory af, Role self) - { - NonRoleParamNode pn = af.NonRoleParamNode(this.name.source, this.kind, this.name.toString()); - return af.NonRoleParamDecl(this.source, this.kind, pn); - } - - @Override - public String getKeyword() - { - if (this.kind.equals(SigKind.KIND)) - { - return Constants.SIG_KW; - } - else if (this.kind.equals(DataTypeKind.KIND)) - { - return Constants.TYPE_KW; - } - else - { - throw new RuntimeException("Shouldn't get in here: " + this.kind); - } - } + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java index f5605761d..ef66d98f8 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java @@ -22,60 +22,62 @@ import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.Name; import org.scribble.type.name.Role; -import org.scribble.util.ScribUtil; // Typing a bit awkward that this list has to use NonRoleParamKind as the "concrete" kind, while the NonRoleParamDecl elements use the actual concrete kind // But OK because the NonRoleParamDecl nodes are immutable (the generic kind value is never rewritten after instantiation, only read) public class NonRoleParamDeclList extends HeaderParamDeclList { + // ScribTreeAdaptor#create constructor public NonRoleParamDeclList(Token t) { super(t); } - public NonRoleParamDeclList(CommonTree source, List> decls) + // Tree#dupNode constructor + public NonRoleParamDeclList(NonRoleParamDeclList node) { - super(source, decls); + super(node); } @Override - protected NonRoleParamDeclList copy() + public List> getParamDeclChildren() { - return new NonRoleParamDeclList(this.source, getDecls()); + @SuppressWarnings("unchecked") + List> cast = + ((List) getChildren()).stream() + .map(x -> (NonRoleParamDecl) x) + .collect(Collectors.toList()); + return cast; } - + @Override - public NonRoleParamDeclList clone(AstFactory af) + public NonRoleParamDeclList dupNode() { - List> decls = ScribUtil.cloneList(af, getDecls()); - return af.NonRoleParamDeclList(this.source, decls); + return new NonRoleParamDeclList(this); } @Override - public NonRoleParamDeclList reconstruct(List> decls) + public NonRoleParamDeclList reconstruct( + List> decls) { + NonRoleParamDeclList sig = dupNode(); + sig.addChildren(decls); ScribDel del = del(); - NonRoleParamDeclList rdl = new NonRoleParamDeclList(this.source, castParamDecls(decls)); - rdl = (NonRoleParamDeclList) rdl.del(del); - return rdl; + sig.setDel(del); // No copy + return sig; } - + + // CHECKME: move to delegate? @Override - public List> getDecls() + public NonRoleParamDeclList project(AstFactory af, Role self) { - return castParamDecls(super.getDecls()); + return af.NonRoleParamDeclList(this.source, getParamDeclChildren()); } public List> getParameters() { - return getDecls().stream().map((decl) -> decl.getDeclName()).collect(Collectors.toList()); - } - - // FIXME: move to delegate? - @Override - public NonRoleParamDeclList project(AstFactory af, Role self) - { - return af.NonRoleParamDeclList(this.source, getDecls()); + return getParamDeclChildren().stream().map(decl -> decl.getDeclName()) + .collect(Collectors.toList()); } @Override @@ -86,9 +88,33 @@ public String toString() : "<" + super.toString() + ">"; } - private static List> - castParamDecls(List> decls) + + + + + + + + + + + + + public NonRoleParamDeclList(CommonTree source, List> decls) { - return decls.stream().map((d) -> (NonRoleParamDecl) d).collect(Collectors.toList()); + super(source, decls); } + + /*@Override + protected NonRoleParamDeclList copy() + { + return new NonRoleParamDeclList(this.source, getParamDeclChildren()); + } + + @Override + public NonRoleParamDeclList clone(AstFactory af) + { + List> decls = ScribUtil.cloneList(af, getParamDeclChildren()); + return af.NonRoleParamDeclList(this.source, decls); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java b/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java index d6ba1fcce..30bd0e2df 100644 --- a/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java +++ b/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java @@ -13,11 +13,11 @@ */ package org.scribble.ast; -import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; @@ -29,73 +29,108 @@ // Cf. DoArgList, but here we don't need as much abstraction (cf. RoleArgList, NonRoleArgList) public class PayloadElemList extends ScribNodeBase { - //private final List elems; // FIXME: parameterise on Kind (cf. sesstypes) - private final List> elems; - - //public PayloadElemList(List elems) - public PayloadElemList(CommonTree source, List> elems) + // ScribTreeAdaptor#create constructor + public PayloadElemList(Token t) { - super(source); - this.elems = new LinkedList<>(elems); + super(t); + this.elems = null; } - - protected PayloadElemList project(AstFactory af) + + // Tree#dupNode constructor + public PayloadElemList(PayloadElemList node) { - return af.PayloadElemList(this.source, this.elems.stream().map(pe -> pe.project(af)).collect(Collectors.toList())); + super(node); + this.elems = null; } - @Override - protected PayloadElemList copy() + public PayloadElemList dupNode() { - return new PayloadElemList(this.source, this.elems); + return new PayloadElemList(this); } - @Override - public PayloadElemList clone(AstFactory af) + public List> getElementChildren() { - //List elems = ScribUtil.cloneList(this.elems); - List> elems = ScribUtil.cloneList(af, this.elems); - return af.PayloadElemList(this.source, elems); + return ((List) getChildren()).stream().map(x -> (PayloadElem) x) + .collect(Collectors.toList()); } - //protected PayloadElemList reconstruct(List elems) protected PayloadElemList reconstruct(List> elems) { + PayloadElemList pay = dupNode(); + pay.addChildren(elems); ScribDel del = del(); - PayloadElemList pel = new PayloadElemList(this.source, elems); - pel = (PayloadElemList) pel.del(del); - return pel; + pay.setDel(del); // No copy + return pay; } @Override public PayloadElemList visitChildren(AstVisitor nv) throws ScribbleException { - //List elems = visitChildListWithClassEqualityCheck(this, this.elems, nv); - List> elems = visitChildListWithClassEqualityCheck(this, this.elems, nv); + List> elems = + visitChildListWithClassEqualityCheck(this, getElementChildren(), nv); return reconstruct(elems); } - //public List getElements() - public List> getElements() + protected PayloadElemList project(AstFactory af) { - return Collections.unmodifiableList(this.elems); + return af.PayloadElemList(this.source, getElementChildren().stream() + .map(pe -> pe.project(af)).collect(Collectors.toList())); } public Payload toPayload() { - //List> pts = this.elems.stream().map((pe) -> pe.name.toPayloadType()).collect(Collectors.toList()); - List> pts = this.elems.stream().map((pe) -> pe.toPayloadType()).collect(Collectors.toList()); + List> pts = getElementChildren().stream() + .map(pe -> pe.toPayloadType()).collect(Collectors.toList()); return new Payload(pts); } public boolean isEmpty() { - return this.elems.isEmpty(); + return getChildCount() == 0; } @Override public String toString() { - return "(" + this.elems.stream().map((pe) -> pe.toString()).collect(Collectors.joining(", " )) + ")"; + return "(" + getElementChildren().stream().map(pe -> pe.toString()) + .collect(Collectors.joining(", ")) + ")"; } + + + + + + + + + + + + + + + + //private final List elems; // FIXME: parameterise on Kind (cf. sesstypes) + private final List> elems; + + //public PayloadElemList(List elems) + public PayloadElemList(CommonTree source, List> elems) + { + super(source); + this.elems = new LinkedList<>(elems); + } + + /*@Override + protected PayloadElemList copy() + { + return new PayloadElemList(this.source, this.elems); + } + + @Override + public PayloadElemList clone(AstFactory af) + { + //List elems = ScribUtil.cloneList(this.elems); + List> elems = ScribUtil.cloneList(af, this.elems); + return af.PayloadElemList(this.source, elems); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleArg.java b/scribble-core/src/main/java/org/scribble/ast/RoleArg.java index 0fc02baa1..565168794 100644 --- a/scribble-core/src/main/java/org/scribble/ast/RoleArg.java +++ b/scribble-core/src/main/java/org/scribble/ast/RoleArg.java @@ -14,6 +14,7 @@ package org.scribble.ast; import org.antlr.runtime.Token; +import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; @@ -63,12 +64,12 @@ public RoleArg project(AstFactory af, Role self) - /*public RoleArg(CommonTree source, RoleNode arg) + public RoleArg(CommonTree source, RoleNode arg) { super(source, arg); } - @Override + /*@Override protected ScribNodeBase copy() { return new RoleArg(this.source, getValChild()); diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java b/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java index 525a9a402..89849bce4 100644 --- a/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java @@ -16,62 +16,47 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.ast.name.simple.SimpleNameNode; -import org.scribble.del.ScribDel; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Name; import org.scribble.type.name.Role; public class RoleDecl extends HeaderParamDecl { + // ScribTreeAdaptor#create constructor public RoleDecl(Token t) { super(t); } - public RoleDecl(CommonTree source, RoleNode name) + // Tree#dupNode constructor + public RoleDecl(RoleDecl node) { - super(source, name); + super(node); } - + @Override - protected RoleDecl copy() + public RoleDecl dupNode() { - return new RoleDecl(this.source, (RoleNode) this.name); + return new RoleDecl(this); } @Override - public RoleDecl clone(AstFactory af) + public RoleNode getNameNodeChild() { - RoleNode role = (RoleNode) this.name.clone(af); - return af.RoleDecl(this.source, role); - } - - @Override - public RoleDecl reconstruct(SimpleNameNode name) - { - ScribDel del = del(); - RoleDecl rd = new RoleDecl(this.source, (RoleNode) name); - rd = (RoleDecl) rd.del(del); - return rd; + return (RoleNode) getRawNameNodeChild(); } @Override public RoleDecl project(AstFactory af, Role self) { - Name role = this.name.toName(); - RoleNode rn = (RoleNode) af.SimpleNameNode(this.name.source, RoleKind.KIND, role.toString()); + RoleNode name = getNameNodeChild(); + Name role = name.toName(); + RoleNode rn = (RoleNode) af.SimpleNameNode(name.source, RoleKind.KIND, role.toString()); if (role.equals(self)) { - return af.SelfRoleDecl(this.name.source, rn); + return af.SelfRoleDecl(name.source, rn); } - return af.RoleDecl(this.source, rn); - } - - @Override - public RoleNode getNameNodeChild() - { - return (RoleNode) getNameNodeChild(); + return af.RoleDecl(source, rn); } @Override @@ -90,4 +75,43 @@ public String getKeyword() { return Constants.ROLE_KW; } + + + + + + + + + + + + + public RoleDecl(CommonTree source, RoleNode name) + { + super(source, name); + } + + /*@Override + protected RoleDecl copy() + { + return new RoleDecl(this.source, (RoleNode) this.name); + } + + @Override + public RoleDecl clone(AstFactory af) + { + RoleNode role = (RoleNode) this.name.clone(af); + return af.RoleDecl(this.source, role); + } + + @Override + public RoleDecl reconstruct(SimpleNameNode name) + { + ScribDel del = del(); + RoleDecl rd = new RoleDecl(this.source, (RoleNode) name); + rd = (RoleDecl) rd.del(del); + return rd; + }*/ + } diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleDeclList.java b/scribble-core/src/main/java/org/scribble/ast/RoleDeclList.java index 080910da4..843793acb 100644 --- a/scribble-core/src/main/java/org/scribble/ast/RoleDeclList.java +++ b/scribble-core/src/main/java/org/scribble/ast/RoleDeclList.java @@ -18,71 +18,90 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.del.ScribDel; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; -import org.scribble.util.ScribUtil; public class RoleDeclList extends HeaderParamDeclList { + // ScribTreeAdaptor#create constructor public RoleDeclList(Token t) { super(t); } - public RoleDeclList(CommonTree source, List decls) + // Tree#dupNode constructor + public RoleDeclList(RoleDeclList node) { - super(source, decls); + super(node); } - + @Override - protected RoleDeclList copy() + public List getParamDeclChildren() { - return new RoleDeclList(this.source, getDecls()); + return ((List) getChildren()).stream().map(x -> (RoleDecl) x) + .collect(Collectors.toList()); } @Override - public RoleDeclList clone(AstFactory af) + public RoleDeclList dupNode() { - List decls = ScribUtil.cloneList(af, getDecls()); - return af.RoleDeclList(this.source, decls); + return new RoleDeclList(this); } + // CHECKME: Move to del? @Override - public HeaderParamDeclList reconstruct(List> decls) - { - ScribDel del = del(); - RoleDeclList rdl = new RoleDeclList(this.source, castRoleDecls(decls)); - rdl = (RoleDeclList) rdl.del(del); - return rdl; - } - - @Override - public List getDecls() + public RoleDeclList project(AstFactory af, Role self) { - return castRoleDecls(super.getDecls()); + return af.RoleDeclList(this.source, getParamDeclChildren()); } public List getRoles() { - return getDecls().stream().map((decl) -> decl.getDeclName()).collect(Collectors.toList()); + return getParamDeclChildren().stream().map(decl -> decl.getDeclName()) + .collect(Collectors.toList()); } - // Move to del? @Override - public RoleDeclList project(AstFactory af, Role self) + public String toString() { - return af.RoleDeclList(this.source, getDecls()); + return "(" + super.toString() + ")"; } + + + + + + + + + + + - @Override - public String toString() + public RoleDeclList(CommonTree source, List decls) { - return "(" + super.toString() + ")"; + super(source, decls); + } + + /*@Override + protected RoleDeclList copy() + { + return new RoleDeclList(this.source, getParamDeclChildren()); } - private static List castRoleDecls(List> decls) + @Override + public RoleDeclList clone(AstFactory af) { - return decls.stream().map((d) -> (RoleDecl) d).collect(Collectors.toList()); + List decls = ScribUtil.cloneList(af, getParamDeclChildren()); + return af.RoleDeclList(this.source, decls); } + + @Override + public HeaderParamDeclList reconstruct(List> decls) + { + ScribDel del = del(); + RoleDeclList rdl = new RoleDeclList(this.source, castRoleDecls(decls)); + rdl = (RoleDeclList) rdl.del(del); + return rdl; + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GInterrupt.java b/scribble-core/src/main/java/org/scribble/ast/global/GInterrupt.java deleted file mode 100644 index b49fe6689..000000000 --- a/scribble-core/src/main/java/org/scribble/ast/global/GInterrupt.java +++ /dev/null @@ -1,199 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.global; - -import java.util.List; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.Interrupt; -import org.scribble.ast.MessageNode; -import org.scribble.ast.name.simple.RoleNode; - -public class GInterrupt extends Interrupt implements GSimpleInteractionNode -{ - /*public static final Function toGlobalInterrupt = - (Interrupt interr) -> (GlobalInterrupt) interr;*/ - - public GInterrupt(CommonTree source, RoleNode src, List msgs) - { - //this(ct, src, msgs, null, null); - //this(t, src, msgs, null, null); - super(source, src, msgs); - } - - /*// Destination Roles is "type info", not a syntax element -- could wrap in a generic "type info" object - //public GlobalInterrupt(CommonTree ct, RoleNode src, List msgs)//, List dests) - public GlobalInterrupt(CommonTree ct, RoleNode src, List msgs, GlobalInterruptContext icontext) - { - //super(ct, src, msgs);//, dests); - super(ct, src, msgs, icontext); - }*/ - - /*protected GlobalInterrupt(CommonTree ct, RoleNode src, List msgs, GlobalInterruptContext icontext, Env env) - { - //super(ct, src, msgs);//, dests); - super(ct, src, msgs, icontext, env); - } - - //@Override // LocalInterrupt has a different signature - protected GlobalInterrupt reconstruct(CommonTree ct, RoleNode src, List msgs, GlobalInterruptContext icontext, Env env) - { - return new GlobalInterrupt(ct, src, msgs, icontext, env); - } - - @Override - public GlobalInterrupt leaveWFChoiceCheck(WellFormedChoiceChecker checker) throws ScribbleException - { - Role src = this.src.toName(); - if (!checker.getEnv().isEnabled(src)) - { - throw new ScribbleException("Role not enabled: " + src); - } - return (GlobalInterrupt) super.leaveWFChoiceCheck(checker); - /*Interrupt interr = super.leaveWFChoiceCheck(checker); - return new GlobalInterrupt(interr.ct, interr.src, interr.msgs, interr.getContext(), interr.getEnv());* / - } - - @Override - public GlobalInterrupt leaveProjection(Projector proj) //throws ScribbleException - { - Role self = proj.peekSelf(); - Role srcrole = this.src.toName(); - List destroles = ((GlobalInterruptContext) getContext()).getDestinations(); - LocalInterrupt projection = null; - if (srcrole.equals(self) || destroles.contains(self)) - { - RoleNode src = new RoleNode(null, this.src.toName().toString()); // FIXME: project by visiting - List msgs = - this.msgs.stream().map((m) -> (MessageNode) ((ProjectionEnv) m.getEnv()).getProjection()).collect(Collectors.toList()); - List dests = - destroles.stream().map((d) -> new RoleNode(null, d.toString())).collect(Collectors.toList()); - if (srcrole.equals(self)) - { - projection = new LocalThrows(null, src, msgs, dests); - } - else if (destroles.contains(self)) - { - projection = new LocalCatches(null, src, msgs, dests); - } - } - this.setEnv(new ProjectionEnv(proj.getJobContext(), proj.getModuleContext(), projection)); - return this; - } - - /*@Override - public GlobalInterrupt leaveContextBuilding(Node parent, NodeContextBuilder builder) throws ScribbleException - { - GlobalInterrupt interr = (GlobalInterrupt) super.leaveContextBuilding(parent, builder); - ProtocolBlockContext bcontext = (ProtocolBlockContext) ((GlobalInterruptible) parent).block.getContext(); - - System.out.println("3: " + bcontext); - - List dests = new LinkedList<>(bcontext.getRoles()); - // FIXME: also include other interrupt sources? (would be better to do in GlobalInterruptible) - dests.remove(this.src.toName()); - return new GlobalInterrupt(interr.ct, interr.src, interr.msgs, dests); - }*/ - - /*@Override - public GlobalInterrupt substitute(Substitutor subs) throws ScribbleException - { - Interrupt interr = super.substitute(subs); - return new GlobalInterrupt(interr.ct, interr.src, interr.msgs, interr.dests); - } - - @Override - public GlobalInterrupt checkWellFormedness(WellFormednessChecker wfc) throws ScribbleException - { - GlobalInterrupt gi = (GlobalInterrupt) super.checkWellFormedness(wfc); - Env env = wfc.getEnv(); - Role src = this.src.toName(); - if (!env.roles.isRoleEnabled(src)) - { - throw new ScribbleException("Interrupt role not enabled: " + src); - } - for (MessageNode msg : this.msgs) - { - // Duplicated from GlobalMesssageTransfer - if (msg.isParameterNode()) - { - //MessageSignatureParameter param = ((ParameterNode) msg).toMessageSignatureParameter(); - Parameter param = ((ParameterNode) msg).toName(); - if (!env.params.isParameterDeclared(param)) - { - throw new ScribbleException("Bad parameter: " + param); - } - ParameterDecl.Kind pdkind = env.params.getParameterKind(((ParameterNode) msg).toName()); - if (!pdkind.equals(ParameterDecl.Kind.SIG)) - { - throw new ScribbleException("GlobalMessageTransfer type parameter should be of SIG kind, not: " + pdkind); - } - } - } - Set dests = new HashSet<>(); - dests.addAll(env.ops.getSources()); - dests.addAll(env.ops.getAllDestinations()); - dests.remove(this.src.toName()); - return new GlobalInterrupt(gi.ct, gi.src, gi.msgs, new LinkedList<>(dests)); - } - - @Override - public LocalNode project(Projector proj) - { - Role role = proj.getRole(); - if (this.src.toName().equals(role)) - { - return new LocalThrows(null, this.src, this.msgs, this.dests); - } - else if (this.dests.contains(role)) - { - return new LocalCatches(null, this.src, this.msgs, this.dests); - } - return null; - } - - @Override - public GlobalInterrupt collectRoles(RoleCollector rc) throws ScribbleException - { - rc.addRole(this.src.toName()); - for (Role dest : this.dests) - { - rc.addRole(dest); - } - return (GlobalInterrupt) super.collectRoles(rc); - }* / - - @Override - public GlobalInterrupt visitChildren(NodeVisitor nv) throws ScribbleException - { - Interrupt interr = super.visitChildren(nv); - //return new GlobalInterrupt(interr.ct, interr.src, interr.msgs); //, interr.dests); - //return new GlobalInterrupt(interr.ct, interr.src, interr.msgs, interr.getContext(), interr.getEnv()); - return reconstruct(interr.ct, interr.src, interr.msgs, interr.getContext(), interr.getEnv()); - }*/ - - /*@Override - public String toString() - { - return this.getMessages().stream().map((msg) -> msg.toString()).collect(Collectors.joining(", ")) - + " " + Constants.BY_KW + " " + this.src + ";"; - }*/ - - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public Global getKind() - { - return GSimpleInteractionNode.super.getKind(); - }*/ -} diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java index 6549f9d13..e35b2eaed 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java @@ -68,7 +68,7 @@ public GProtocolBlock getBlockChild() public LRecursion project(AstFactory af, Role self, LProtocolBlock block) { - RecVarNode recvar = getRecVarChild().clone(af); + RecVarNode recvar = getRecVarChild().clone();//af); LRecursion projection = null; Set rvs = new HashSet<>(); rvs.add(recvar.toName()); diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LCatches.java b/scribble-core/src/main/java/org/scribble/ast/local/LCatches.java deleted file mode 100644 index 32e03e9c8..000000000 --- a/scribble-core/src/main/java/org/scribble/ast/local/LCatches.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import java.util.List; -import java.util.Set; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.MessageNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.ScribbleException; -import org.scribble.type.Message; - -public class LCatches extends LInterrupt -{ - protected LCatches(CommonTree source, RoleNode src, List msgs) - { - super(source, src, msgs); - } - - @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) throws ScribbleException - { - throw new RuntimeException("TODO: " + this); - } - - @Override - public boolean canMerge(LInteractionNode ln) - { - throw new RuntimeException("TODO: " + this); - } - - @Override - public Set getEnabling() - { - throw new RuntimeException("TODO: " + this); - } - - /*public LocalCatches(CommonTree ct, RoleNode src, List msgs, List dests) - { - this(ct, src, msgs, dests, null, null); - } - - protected LocalCatches(CommonTree ct, RoleNode src, List msgs, List dests, GlobalInterruptContext gicontext, Env env) - { - super(ct, src, msgs, dests, gicontext, env); - } - - @Override - protected LocalThrows reconstruct(CommonTree ct, RoleNode src, List msgs, List dests, GlobalInterruptContext icontext, Env env) - { - return new LocalThrows(ct, src, msgs, dests, icontext, env); - } - - /*@Override - public LocalCatches visitChildren(NodeVisitor nv) throws ScribbleException - { - LocalInterrupt interr = super.visitChildren(nv); - return new LocalCatches(interr.ct, interr.src, interr.msgs, interr.dests, (GlobalInterruptContext) interr.getContext()); - }* / - - @Override - public String toString() - { - String s = AntlrConstants.CATCHES_KW + " " + this.msgs.get(0).toString(); - for (MessageNode msg : this.msgs.subList(1, this.msgs.size())) - { - s += ", " + msg; - } - return s + " " + AntlrConstants.FROM_KW + " " + this.src.toName() + ";"; - } - - /*@Override - public void toGraph(GraphBuilder gb) - { - throw new RuntimeException("Shouldn't get in here."); - }*/ -} diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LInterrupt.java b/scribble-core/src/main/java/org/scribble/ast/local/LInterrupt.java deleted file mode 100644 index 86b8cd8e3..000000000 --- a/scribble-core/src/main/java/org/scribble/ast/local/LInterrupt.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import java.util.List; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.Interrupt; -import org.scribble.ast.MessageNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.type.name.Role; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; - -public abstract class LInterrupt extends Interrupt implements LSimpleInteractionNode -{ - protected LInterrupt(CommonTree source, RoleNode src, List msgs) - { - super(source, src, msgs); - } - - @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) - { - throw new RuntimeException("TODO: " + this); - } - - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public Local getKind() - { - return LSimpleInteractionNode.super.getKind(); - }*/ - - - - - - /*public final List dests; - - /*public LocalInterrupt(CommonTree ct, RoleNode src, List msgs, List dests) - { - this(ct, src, msgs, dests, null, null); - }* / - - protected LocalInterrupt(CommonTree ct, RoleNode src, List msgs, List dests, GlobalInterruptContext gicontext, Env env) - { - super(ct, src, msgs, gicontext, env); - this.dests = new LinkedList<>(dests); - } - - /* //@Override - protected LocalInterrupt reconstruct(CommonTree ct, RoleNode src, List msgs, List dests, GlobalInterruptContext icontext, Env env) - { - return new LocalInterrupt(ct, src, msgs, dests, icontext, env); - }* / - protected abstract LocalInterrupt reconstruct(CommonTree ct, RoleNode src, List msgs, List dests, GlobalInterruptContext icontext, Env env); - - @Override - public LocalInterrupt leaveContextBuilding(NodeContextBuilder builder) throws ScribbleException - { - LocalInterrupt intt = (LocalInterrupt) super.leaveContextBuilding(builder); - GlobalInterruptContext icontext = - new GlobalInterruptContext(intt.dests.stream().map((rn) -> rn.toName()).collect(Collectors.toList())); - //return new LocalInterrupt(intt.ct, intt.src, intt.msgs, intt.dests, icontext); - return reconstruct(intt.ct, intt.src, intt.msgs, intt.dests, icontext, getEnv()); - } - - @Override - public LocalInterrupt visitChildren(NodeVisitor nv) throws ScribbleException - { - RoleNode src = (RoleNode) visitChild(this.src, nv); - List msgs = new LinkedList<>(); - for (MessageNode msg : this.msgs) - { - msgs.add((MessageNode) visitChild(msg, nv)); - } - List dests = new LinkedList(); - for (RoleNode dest : this.dests) - { - dests.add((RoleNode) visitChild(dest, nv)); - } - //return new LocalInterrupt(this.ct, src, msgs, this.dests, getContext()); - return reconstruct(this.ct, src, msgs, this.dests, getContext(), getEnv()); - }*/ -} diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolHeader.java b/scribble-core/src/main/java/org/scribble/ast/local/LProtocolHeader.java index 590cda8e2..9d79f7c38 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolHeader.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LProtocolHeader.java @@ -49,7 +49,7 @@ public LProtocolHeader dupNode() public Role getSelfRole() { RoleDeclList rdl = getRoleDeclListChild(); - for (NameDeclNode rd : rdl.getDecls()) + for (NameDeclNode rd : rdl.getParamDeclChildren()) { RoleDecl tmp = (RoleDecl) rd; if (tmp.isSelfRoleDecl()) diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java index 33110895f..33f45f54b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java @@ -77,7 +77,7 @@ public LInteractionNode merge(AstFactory af, LInteractionNode ln) "Cannot merge recursions for " + getRecVarChild() + " and " + them.getRecVarChild() + ": " + this + ", " + ln); } - return af.LRecursion(this.source, getRecVarChild().clone(af), + return af.LRecursion(this.source, getRecVarChild().clone(),//af), getBlockChild().merge(them.getBlockChild())); // Not reconstruct: leave context building to post-projection passes // HACK: this source diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LThrows.java b/scribble-core/src/main/java/org/scribble/ast/local/LThrows.java deleted file mode 100644 index 90bdc83eb..000000000 --- a/scribble-core/src/main/java/org/scribble/ast/local/LThrows.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import java.util.List; -import java.util.Set; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.MessageNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.ScribbleException; -import org.scribble.type.Message; - -public class LThrows extends LInterrupt -{ - protected LThrows(CommonTree source, RoleNode src, List msgs) - { - super(source, src, msgs); - } - - @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) throws ScribbleException - { - throw new RuntimeException("TODO: " + this); - } - - @Override - public boolean canMerge(LInteractionNode ln) - { - throw new RuntimeException("TODO: " + this); - } - - @Override - public Set getEnabling() - { - throw new RuntimeException("TODO: " + this); - } - - /*public LocalThrows(CommonTree ct, RoleNode src, List msgs, List dests) - { - this(ct, src, msgs, dests, null, null); - } - - protected LocalThrows(CommonTree ct, RoleNode src, List msgs, List dests, GlobalInterruptContext gicontext, Env env) - { - super(ct, src, msgs, dests, gicontext, env); - } - - @Override - protected LocalThrows reconstruct(CommonTree ct, RoleNode src, List msgs, List dests, GlobalInterruptContext icontext, Env env) - { - return new LocalThrows(ct, src, msgs, dests, icontext, env); - } - - /*@Override - public LocalThrows visitChildren(NodeVisitor nv) throws ScribbleException - { - LocalInterrupt interr = super.visitChildren(nv); - //return new LocalThrows(interr.ct, interr.src, interr.msgs, interr.dests, (GlobalInterruptContext) interr.getContext()); - return reconstruct(interr.ct, interr.src, interr.msgs, interr.dests, (GlobalInterruptContext) interr.getContext(), getEnv()); - }* / - - @Override - public String toString() - { - String s = AntlrConstants.THROWS_KW + " " + this.msgs.get(0).toString(); - for (MessageNode msg : this.msgs.subList(1, this.msgs.size())) - { - s += ", " + msg; - } - s += " " + AntlrConstants.TO_KW + " " + this.dests.get(0); - for (RoleNode dest : this.dests.subList(1, this.dests.size())) - { - s += ", " + dest.toName(); - } - return s + ";"; - } - - /*@Override - public void toGraph(GraphBuilder gb) - { - throw new RuntimeException("Shouldn't get in here."); - }*/ -} diff --git a/scribble-core/src/main/java/org/scribble/ast/local/SelfRoleDecl.java b/scribble-core/src/main/java/org/scribble/ast/local/SelfRoleDecl.java index 0f4c8cda4..ccff2ce55 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/SelfRoleDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/SelfRoleDecl.java @@ -13,37 +13,33 @@ */ package org.scribble.ast.local; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.RoleDecl; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.ast.name.simple.SimpleNameNode; -import org.scribble.del.ScribDel; -import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; public class SelfRoleDecl extends RoleDecl { - public SelfRoleDecl(CommonTree source, RoleNode rn) + // ScribTreeAdaptor#create constructor + public SelfRoleDecl(Token t) { - super(source, rn); + super(t); } - @Override - protected SelfRoleDecl copy() + // Tree#dupNode constructor + public SelfRoleDecl(SelfRoleDecl node) { - return new SelfRoleDecl(this.source, (RoleNode) this.name); + super(node); } - + @Override - public RoleDecl reconstruct(SimpleNameNode name) + public SelfRoleDecl dupNode() { - ScribDel del = del(); - SelfRoleDecl rd = new SelfRoleDecl(this.source, (RoleNode) name); - rd = (SelfRoleDecl) rd.del(del); - return rd; + return new SelfRoleDecl(this); } - + @Override public SelfRoleDecl project(AstFactory af, Role self) { @@ -55,4 +51,38 @@ public boolean isSelfRoleDecl() { return true; } + + + + + + + + + + + + + + + + public SelfRoleDecl(CommonTree source, RoleNode rn) + { + super(source, rn); + } + + /*@Override + protected SelfRoleDecl copy() + { + return new SelfRoleDecl(this.source, (RoleNode) this.name); + } + + @Override + public RoleDecl reconstruct(SimpleNameNode name) + { + ScribDel del = del(); + SelfRoleDecl rd = new SelfRoleDecl(this.source, (RoleNode) name); + rd = (SelfRoleDecl) rd.del(del); + return rd; + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java index 1d14c3d51..e90dd269b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java @@ -38,6 +38,12 @@ public RecVarNode dupNode() return new RecVarNode(this, getIdentifier()); } + @Override + public RecVarNode clone() + { + return (RecVarNode) super.clone(); + } + @Override public RecVar toName() { diff --git a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java index 44072f441..f0897504b 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java @@ -40,7 +40,7 @@ public DoArgList leaveDisambiguation(ScribNode parent, ScribNode child, NameD DoArgList dal = (DoArgList) visited; List args = dal.getArgChildren(); ProtocolDecl pd = getTargetProtocolDecl((Do) parent, disamb); - if (args.size() != getParamDeclList(pd).getDecls().size()) + if (args.size() != getParamDeclList(pd).getParamDeclChildren().size()) { throw new ScribbleException(visited.getSource(), "Do arity mismatch for " + pd.header + ": " + args); } diff --git a/scribble-core/src/main/java/org/scribble/del/HeaderParamDeclListDel.java b/scribble-core/src/main/java/org/scribble/del/HeaderParamDeclListDel.java index 86642d82f..8e390f61d 100644 --- a/scribble-core/src/main/java/org/scribble/del/HeaderParamDeclListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/HeaderParamDeclListDel.java @@ -33,7 +33,7 @@ public HeaderParamDeclListDel() public HeaderParamDeclList leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException { HeaderParamDeclList pdl = (HeaderParamDeclList) visited; - List> decls = pdl.getDecls(); // grammar enforces RoleDeclList size > 0 + List> decls = pdl.getParamDeclChildren(); // grammar enforces RoleDeclList size > 0 if (decls.size() != decls.stream().map((d) -> d.getDeclName()).distinct().count()) { throw new ScribbleException(pdl.getSource(), "Duplicate header decls: " + pdl); diff --git a/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java b/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java index 4dba242a1..c5266040d 100644 --- a/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java +++ b/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java @@ -91,7 +91,7 @@ public MessageTransfer leaveProtocolDeclContextBuilding(ScribNode parent, Scr MessageTransfer mt = (MessageTransfer) visited; if (mt.msg.isMessageSigNode()) { - for (PayloadElem pe : ((MessageSigNode) mt.msg).payloads.getElements()) + for (PayloadElem pe : ((MessageSigNode) mt.msg).payloads.getElementChildren()) { if (pe.isGlobalDelegationElem()) // FIXME: should always be GMessageTransfer { diff --git a/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java b/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java index cfff56f61..15825a71c 100644 --- a/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java @@ -45,7 +45,7 @@ public NonRoleArgList leaveDisambiguation(ScribNode parent, ScribNode child, Nam ProtocolDecl pd = getTargetProtocolDecl((Do) parent, disamb); Iterator args = nral.getArgChildren().iterator(); - for (NonRoleParamDecl param : pd.header.paramdecls.getDecls()) + for (NonRoleParamDecl param : pd.header.paramdecls.getParamDeclChildren()) { NonRoleParamKind kind = param.kind; NonRoleArg arg = args.next(); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java b/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java index 0b01a94bd..b5ddfcbcc 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java @@ -48,36 +48,47 @@ public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode ch }*/ @Override - public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribbleException + public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, + ScribNode child, UnguardedChoiceDoProjectionChecker checker, + ScribNode visited) throws ScribbleException { Choice cho = (Choice) visited; - List benvs = - cho.getBlockChildren().stream().map((b) -> (UnguardedChoiceDoEnv) b.del().env()).collect(Collectors.toList()); + List benvs = cho.getBlockChildren().stream() + .map(b -> (UnguardedChoiceDoEnv) b.del().env()) + .collect(Collectors.toList()); UnguardedChoiceDoEnv merged = checker.popEnv().mergeContexts(benvs); checker.pushEnv(merged); - return (Choice) super.leaveUnguardedChoiceDoProjectionCheck(parent, child, checker, cho); // Done merge of children here, super does merge into parent + return (Choice) super.leaveUnguardedChoiceDoProjectionCheck(parent, + child, checker, cho); + // Done merge of children here, super does merge into parent } @Override - public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, ScribNode child, ProjectedChoiceDoPruner pruner, ScribNode visited) throws ScribbleException + public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, + ScribNode child, ProjectedChoiceDoPruner pruner, ScribNode visited) + throws ScribbleException { LChoice lc = (LChoice) visited; - List blocks = lc.getBlockChildren().stream().filter((b) -> !b.isEmpty()).collect(Collectors.toList()); + List blocks = lc.getBlockChildren().stream() + .filter(b -> !b.isEmpty()).collect(Collectors.toList()); if (blocks.isEmpty()) { return null; } - return lc.reconstruct(lc.subj, blocks); + return lc.reconstruct(lc.getSubjectChild(), blocks); } @Override - public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer, ScribNode visited) throws ScribbleException + public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer, ScribNode visited) + throws ScribbleException { LChoice lc = (LChoice) visited; List blocks = lc.getBlockChildren(); Set subjs = blocks.stream() - .map((b) -> b.getInteractSeqChild().getInteractNodeChildren().get(0).inferLocalChoiceSubject(fixer)) + .map(b -> b.getInteractSeqChild().getInteractNodeChildren().get(0) + .inferLocalChoiceSubject(fixer)) //.filter((r) -> !r.toString().equals(DummyProjectionRoleNode.DUMMY_PROJECTION_ROLE)) .collect(Collectors.toSet()); if (subjs.size() == 0) @@ -88,7 +99,10 @@ public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, ScribNode c else { subjs = subjs.stream() - .map((r) -> fixer.isRecVarRole(r) ? fixer.getChoiceSubject(new RecVar(r.toString())) : r) // Never needed? + .map(r -> fixer.isRecVarRole(r) + ? fixer.getChoiceSubject(new RecVar(r.toString())) + : r) + // Never needed? .collect(Collectors.toSet()); } @@ -98,11 +112,13 @@ public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, ScribNode c if (subjs.size() > 1) // Unnecessary: due to WF check in GChoiceDel.leaveInlinedPathCollection -- would be better as a check on locals than in projection anyway { String self = fixer.getModuleContext().root.getSimpleName().toString(); // HACK - self = self.substring(self.lastIndexOf('_')+1, self.length()); // FIXME: not sound (if role names include "_") - throw new ScribbleException(lc.getSource(), "Cannot project onto " + self + " due to inconsistent local choice subjects: " + subjs); // self not recorded -- can derive from LProtocolDecl RoleDeclList + self = self.substring(self.lastIndexOf('_')+1, self.length()); // FIXME: not comaptible with role names that include "_" + throw new ScribbleException(lc.getSource(), "Cannot project onto " + self + + " due to inconsistent local choice subjects: " + subjs); + // self not recorded -- can derive from LProtocolDecl RoleDeclList //throw new RuntimeException("Shouldn't get in here: " + subjs); } - RoleNode subj = (RoleNode) fixer.job.af.SimpleNameNode(null, RoleKind.KIND, // FIXME? null source OK? + RoleNode subj = (RoleNode) fixer.job.af.SimpleNameNode(null, RoleKind.KIND, // CHECKME? null source OK? //blocks.get(0).getInteractionSeq().getInteractions().get(0).inferLocalChoiceSubject(fixer).toString()); subjs.iterator().next().toString()); fixer.setChoiceSubject(subj.toName()); @@ -111,30 +127,40 @@ public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, ScribNode c } @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { LChoice lc = (LChoice) visited; List blocks = - lc.getBlockChildren().stream().map((b) -> (LProtocolBlock) ((InlineProtocolEnv) b.del().env()).getTranslation()).collect(Collectors.toList()); - RoleNode subj = lc.subj.clone(inl.job.af); + lc.getBlockChildren().stream() + .map(b -> (LProtocolBlock) ((InlineProtocolEnv) b.del().env()) + .getTranslation()) + .collect(Collectors.toList()); + RoleNode subj = lc.getSubjectChild().clone();//inl.job.af); LChoice inlined = inl.job.af.LChoice(lc.getSource(), subj, blocks); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (LChoice) super.leaveProtocolInlining(parent, child, inl, lc); } @Override - public LChoice leaveReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker, ScribNode visited) throws ScribbleException + public LChoice leaveReachabilityCheck(ScribNode parent, ScribNode child, + ReachabilityChecker checker, ScribNode visited) throws ScribbleException { LChoice cho = (LChoice) visited; List benvs = - cho.getBlockChildren().stream().map((b) -> (ReachabilityEnv) b.del().env()).collect(Collectors.toList()); + cho.getBlockChildren().stream() + .map(b -> (ReachabilityEnv) b.del().env()) + .collect(Collectors.toList()); ReachabilityEnv merged = checker.popEnv().mergeForChoice(benvs); checker.pushEnv(merged); - return (LChoice) LCompoundInteractionNodeDel.super.leaveReachabilityCheck(parent, child, checker, visited); // records the current checker Env to the current del; also pops and merges that env into the parent env + return (LChoice) LCompoundInteractionNodeDel.super.leaveReachabilityCheck( + parent, child, checker, visited); + // records the current checker Env to the current del; also pops and merges that env into the parent env } @Override - public void enterEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder graph) + public void enterEGraphBuilding(ScribNode parent, ScribNode child, + EGraphBuilder graph) { super.enterEGraphBuilding(parent, child, graph); graph.util.enterChoice(); @@ -159,7 +185,8 @@ public LChoice visitForFsmConversion(EGraphBuilder graph, LChoice child) } @Override - public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder graph, ScribNode visited) throws ScribbleException + public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, + EGraphBuilder graph, ScribNode visited) throws ScribbleException { graph.util.leaveChoice(); return super.leaveEGraphBuilding(parent, child, graph, visited); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LParallelDel.java b/scribble-core/src/main/java/org/scribble/del/local/LParallelDel.java deleted file mode 100644 index c6ef195c5..000000000 --- a/scribble-core/src/main/java/org/scribble/del/local/LParallelDel.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.del.local; - -import org.scribble.del.ParallelDel; - -public class LParallelDel extends ParallelDel implements LCompoundInteractionNodeDel -{ - -} diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java b/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java index 8813eec70..86db88223 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java @@ -51,7 +51,7 @@ public ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, ScribNode child, LProtocolDecl lpd = (LProtocolDecl) visited; // FIXME: ensure all role params are used, to avoid empty roledecllist Set occs = ((LProtocolDeclDel) lpd.del()).getProtocolDeclContext().getRoleOccurrences(); - List rds = lpd.header.roledecls.getDecls().stream().filter((rd) -> + List rds = lpd.header.roledecls.getParamDeclChildren().stream().filter((rd) -> occs.contains(rd.getDeclName())).collect(Collectors.toList()); RoleDeclList rdl = fixer.job.af.RoleDeclList(lpd.header.roledecls.getSource(), rds); LProtocolHeader tmp = lpd.getHeaderChild(); diff --git a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java index 230f24dc1..8189bca6b 100644 --- a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java @@ -81,7 +81,7 @@ protected void enterRootProtocolDecl(ProtocolDecl pd) .getVisibleProtocolDeclFullName(hdr.getDeclName()); List roleargs = rds.getRoles(); List> nonroleargs = - pds.getDecls().stream().map(param -> paramDeclToArg(param)) + pds.getParamDeclChildren().stream().map(param -> paramDeclToArg(param)) .collect(Collectors.toList()); pushSubprotocolSig(fullname, roleargs, nonroleargs); } @@ -310,14 +310,14 @@ protected void setScope(Scope scope) protected static Map makeRootRoleSubsMap(RoleDeclList rdl) { - return rdl.getDecls().stream().collect(Collectors + return rdl.getParamDeclChildren().stream().collect(Collectors .toMap(r -> r.getDeclName(), r -> (RoleNode) r.getNameNodeChild())); } protected static Map, NonRoleArgNode> makeRootNonRoleSubsMap( NonRoleParamDeclList pdl) { - return pdl.getDecls().stream() + return pdl.getParamDeclChildren().stream() .collect(Collectors.toMap(p -> (Arg) p.getDeclName(), p -> (NonRoleArgNode) p.getNameNodeChild())); } diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGInterrupt.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGInterrupt.java deleted file mode 100644 index 218acf38e..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGInterrupt.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.global; - -import java.util.List; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.global.GInterrupt; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.AntlrToScribParserUtil; -import org.scribble.util.ScribParserException; - - -public class AntlrGInterrupt -{ - public static final int SOURCE_CHILD_INDEX = 0; - public static final int MESSAGE_CHILDREN_START_INDEX = 1; - - public static GInterrupt parseGInterrupt(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - /*RoleNode src = AntlrSimpleName.toRoleNode(getSourceChild(ct)); - /*List msgs = - getMessageChildren(ct).stream().map((msg) -> AntlrGMessageTransfer.parseMessage(parser, msg)).collect(Collectors.toList()); - * / - List msgs = new LinkedList<>(); - for (CommonTree msg : getMessageChildren(ct)) - { - msgs.add(AntlrGMessageTransfer.parseMessage(parser, msg)); - } - //return new GInterrupt(src, msgs); // Destination roles set by later pass*/ - return null; - } - - public static CommonTree getSourceChild(CommonTree ct) - { - return (CommonTree) ct.getChild(SOURCE_CHILD_INDEX); - } - - public static List getMessageChildren(CommonTree ct) - { - return AntlrToScribParserUtil.toCommonTreeList(ct.getChildren().subList(MESSAGE_CHILDREN_START_INDEX, ct.getChildCount())); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGInterruptible.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGInterruptible.java deleted file mode 100644 index 149c63085..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGInterruptible.java +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.global; - -import java.util.List; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.global.GInterruptible; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.AntlrToScribParserUtil; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; -import org.scribble.util.ScribParserException; - -public class AntlrGInterruptible -{ - public static final int SCOPE_CHILD_INDEX = 0; - public static final int BLOCK_CHILD_INDEX = 1; - public static final int INTERRUPT_CHILDREN_START_INDEX = 2; - - public static GInterruptible parseGInterruptible(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - /*GProtocolBlock block = (GProtocolBlock) parser.parse(getBlockChild(ct)); - /*List interrs = - getInterruptChildren(ct).stream().map((interr) -> (GInterrupt) parser.parse(interr)).collect(Collectors.toList()); - * / - List interrs = new LinkedList<>(); - for (CommonTree interr : getInterruptChildren(ct)) - { - interrs.add((GInterrupt) parser.parse(interr)); - } - if (isScopeImplicit(ct)) - { - //return new GInterruptible(block, interrs); - return null; - } - ScopeNode scope = AntlrSimpleName.toScopeNode(getScopeChild(ct)); - //return new GInterruptible(scope, block, interrs);*/ - return null; - } - - public static boolean isScopeImplicit(CommonTree ct) - { - return AntlrSimpleName.toScopeNode(ct) == null; - } - - public static CommonTree getScopeChild(CommonTree ct) - { - return (CommonTree) ct.getChild(SCOPE_CHILD_INDEX); - } - - public static CommonTree getBlockChild(CommonTree ct) - { - return (CommonTree) ct.getChild(BLOCK_CHILD_INDEX); - } - - public static List getInterruptChildren(CommonTree ct) - { - List children = ct.getChildren(); - return AntlrToScribParserUtil.toCommonTreeList(children.subList(INTERRUPT_CHILDREN_START_INDEX, children.size())); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGParallel.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGParallel.java deleted file mode 100644 index 912d505f8..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGParallel.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.global; - -import java.util.LinkedList; -import java.util.List; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.global.GParallel; -import org.scribble.ast.global.GProtocolBlock; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.AntlrToScribParserUtil; -import org.scribble.util.ScribParserException; - -public class AntlrGParallel -{ - public static GParallel parseGParallel(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - /*List blocks = - getBlockChildren(ct).stream().map((b) -> (GProtocolBlock) parser.parse(b)).collect(Collectors.toList());*/ - List blocks = new LinkedList<>(); - for (CommonTree b : getBlockChildren(ct)) - { - blocks.add((GProtocolBlock) parser.parse(b, af)); - } - //return new GParallel(blocks); - return null; - } - - public static final List getBlockChildren(CommonTree ct) - { - return AntlrToScribParserUtil.toCommonTreeList(ct.getChildren()); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java index 0c66f75fa..91460204f 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java @@ -24,7 +24,6 @@ import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.ast.name.simple.ScopeNode; import org.scribble.parser.scribble.ScribbleAntlrConstants; import org.scribble.type.kind.DataTypeKind; import org.scribble.type.kind.Global; @@ -81,16 +80,6 @@ public static OpNode toOpNode(CommonTree ct, AstFactory af) : (OpNode) af.SimpleNameNode(ct, OpKind.KIND, getName(ct)); } - public static ScopeNode toScopeNode(CommonTree ct) - { - /*String scope = getName(ct); - if (scope.equals(ANTLR_NO_SCOPE)) - { - return null; - }*/ - throw new RuntimeException("TODO: " + ct); - } - public static RecVarNode toRecVarNode(CommonTree ct, AstFactory af) { return (RecVarNode) af.SimpleNameNode(ct, RecVarKind.KIND, getName(ct)); From 63cecf9b9c2fbdc2ee8fd9f075be6441c8f1088b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 29 Jan 2019 18:45:14 +0000 Subject: [PATCH 082/539] Continued WIP. --- .../java/org/scribble/cli/CommandLine.java | 178 ++++++++++++------ .../java/org/scribble/main/MainContext.java | 82 +++++--- .../java/org/scribble/ast/ConnectAction.java | 6 +- .../src/main/java/org/scribble/ast/Do.java | 6 +- .../java/org/scribble/ast/ProtocolDecl.java | 7 + .../java/org/scribble/ast/RoleArgList.java | 6 + .../scribble/ast/context/ModuleContext.java | 63 ++++--- .../org/scribble/ast/global/GConnect.java | 12 +- .../java/org/scribble/ast/global/GDo.java | 2 +- .../java/org/scribble/ast/global/GWrap.java | 8 +- .../org/scribble/ast/local/LWrapServer.java | 3 +- .../org/scribble/del/ConnectionActionDel.java | 51 +++-- .../java/org/scribble/del/DoArgListDel.java | 17 +- .../src/main/java/org/scribble/del/DoDel.java | 51 +++-- .../org/scribble/del/NonRoleArgListDel.java | 24 ++- .../org/scribble/del/ProtocolDeclDel.java | 34 ++-- .../java/org/scribble/del/RoleArgListDel.java | 8 +- .../main/java/org/scribble/del/ScribDel.java | 177 +++++++++++------ .../org/scribble/del/global/GConnectDel.java | 52 +++-- .../del/global/GDelegationElemDel.java | 138 +++++++++----- .../java/org/scribble/del/global/GDoDel.java | 37 ++-- .../scribble/del/global/GProtocolDeclDel.java | 110 +++++++---- .../java/org/scribble/del/local/LDoDel.java | 51 +++-- .../org/scribble/del/local/LReceiveDel.java | 2 +- .../org/scribble/del/local/LRequestDel.java | 21 ++- .../java/org/scribble/main/JobContext.java | 30 ++- .../visit/InlinedProtocolUnfolder.java | 33 ++-- .../visit/OffsetSubprotocolVisitor.java | 30 ++- .../scribble/visit/ProtocolDefInliner.java | 17 +- .../scribble/visit/SubprotocolVisitor.java | 4 +- .../java/org/scribble/visit/Substitutor.java | 14 +- .../context/ProjectedChoiceDoPruner.java | 7 +- .../org/scribble/visit/context/Projector.java | 72 +++++-- .../UnguardedChoiceDoProjectionChecker.java | 37 ++-- .../visit/wf/ExplicitCorrelationChecker.java | 23 +-- .../scribble/visit/wf/WFChoiceChecker.java | 27 ++- 36 files changed, 947 insertions(+), 493 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 57cbc235d..2c7969042 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -58,14 +58,16 @@ public CommandLine(String... args) throws CommandLineException { //this.args = new CLArgParser(args).getArgs(); this(new CLArgParser(args)); - if (!this.args.containsKey(CLArgFlag.MAIN_MOD) && !this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) + if (!this.args.containsKey(CLArgFlag.MAIN_MOD) + && !this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) { throw new CommandLineException("No main module has been specified\r\n"); } } // A Scribble extension should override newMainContext as appropriate. - protected MainContext newMainContext() throws ScribParserException, ScribbleException + protected MainContext newMainContext() + throws ScribParserException, ScribbleException { //boolean jUnit = this.args.containsKey(ArgFlag.JUNIT); boolean debug = this.args.containsKey(CLArgFlag.VERBOSE); // TODO: factor out (cf. MainContext fields) @@ -73,8 +75,10 @@ protected MainContext newMainContext() throws ScribParserException, ScribbleExce boolean noLiveness = this.args.containsKey(CLArgFlag.NO_LIVENESS); boolean minEfsm = this.args.containsKey(CLArgFlag.LTSCONVERT_MIN); boolean fair = this.args.containsKey(CLArgFlag.FAIR); - boolean noLocalChoiceSubjectCheck = this.args.containsKey(CLArgFlag.NO_LOCAL_CHOICE_SUBJECT_CHECK); - boolean noAcceptCorrelationCheck = this.args.containsKey(CLArgFlag.NO_ACCEPT_CORRELATION_CHECK); + boolean noLocalChoiceSubjectCheck = + this.args.containsKey(CLArgFlag.NO_LOCAL_CHOICE_SUBJECT_CHECK); + boolean noAcceptCorrelationCheck = + this.args.containsKey(CLArgFlag.NO_ACCEPT_CORRELATION_CHECK); boolean noValidation = this.args.containsKey(CLArgFlag.NO_VALIDATION); boolean spin = this.args.containsKey(CLArgFlag.SPIN); @@ -96,7 +100,8 @@ protected MainContext newMainContext() throws ScribParserException, ScribbleExce } } - public static void main(String[] args) throws CommandLineException, AntlrSourceException + public static void main(String[] args) + throws CommandLineException, AntlrSourceException { new CommandLine(args).run(); } @@ -111,7 +116,8 @@ public void run() throws CommandLineException, AntlrSourceException // Scribble } catch (ScribbleException e) // Wouldn't need to do this if not Runnable (so maybe change) { - if (this.args.containsKey(CLArgFlag.JUNIT) || this.args.containsKey(CLArgFlag.VERBOSE)) + if (this.args.containsKey(CLArgFlag.JUNIT) + || this.args.containsKey(CLArgFlag.VERBOSE)) { /*RuntimeScribbleException ee = new RuntimeScribbleException(e.getMessage()); ee.setStackTrace(e.getStackTrace()); @@ -137,7 +143,8 @@ public void run() throws CommandLineException, AntlrSourceException // Scribble } } - protected void runBody() throws ScribParserException, AntlrSourceException, CommandLineException + protected void runBody() + throws ScribParserException, AntlrSourceException, CommandLineException { MainContext mc = newMainContext(); Job job = mc.newJob(); @@ -174,8 +181,9 @@ protected void runBody() throws ScribParserException, AntlrSourceException, Comm } // AntlrSourceException super of ScribbleException -- needed for, e.g., AssrtCoreSyntaxException - protected void doValidationTasks(Job job) throws AntlrSourceException, ScribParserException, // Latter in case needed by subclasses - CommandLineException + protected void doValidationTasks(Job job) + throws AntlrSourceException, ScribParserException, // Latter in case needed by subclasses + CommandLineException { /*// Scribble extensions (custom Job passes) if (this.args.containsKey(F17CLArgFlag.F17)) @@ -191,7 +199,8 @@ protected void doValidationTasks(Job job) throws AntlrSourceException, ScribPars } } - protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleException + protected void tryOutputTasks(Job job) + throws CommandLineException, ScribbleException { // Following must be ordered appropriately -- ? if (this.args.containsKey(CLArgFlag.PROJECT)) @@ -222,12 +231,16 @@ protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleExce { drawEGraph(job, false, false); } - if (this.args.containsKey(CLArgFlag.SGRAPH) || this.args.containsKey(CLArgFlag.SGRAPH_PNG) - || this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH) || this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH_PNG)) + if (this.args.containsKey(CLArgFlag.SGRAPH) + || this.args.containsKey(CLArgFlag.SGRAPH_PNG) + || this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH) + || this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH_PNG)) { if (job.useOldWf) { - throw new CommandLineException("Global model flag(s) incompatible with: " + CLArgParser.OLD_WF_FLAG); + throw new CommandLineException( + "Global model flag(s) incompatible with: " + + CLArgParser.OLD_WF_FLAG); } if (this.args.containsKey(CLArgFlag.SGRAPH)) { @@ -248,8 +261,9 @@ protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleExce } } - // FIXME: rename - protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, CommandLineException + // TODO: rename + protected void doNonAttemptableOutputTasks(Job job) + throws ScribbleException, CommandLineException { if (this.args.containsKey(CLArgFlag.SESS_API_GEN)) { @@ -269,8 +283,9 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co } } - // FIXME: option to write to file, like classes - private void printProjections(Job job) throws CommandLineException, ScribbleException + // TODO: option to write to file, like classes + private void printProjections(Job job) + throws CommandLineException, ScribbleException { JobContext jcontext = job.getContext(); String[] args = this.args.get(CLArgFlag.PROJECT); @@ -278,33 +293,46 @@ private void printProjections(Job job) throws CommandLineException, ScribbleExce { GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); Role role = checkRoleArg(jcontext, fullname, args[i+1]); - Map projections = job.getProjections(fullname, role); - System.out.println("\n" + projections.values().stream().map((p) -> p.toString()).collect(Collectors.joining("\n\n"))); + Map projections = job.getProjections(fullname, + role); + System.out.println("\n" + projections.values().stream() + .map((p) -> p.toString()).collect(Collectors.joining("\n\n"))); } } // dot/aut text output // forUser: true means for API gen and general user info (may be minimised), false means for validation (non-minimised, fair or unfair) // (forUser && !fair) should not hold, i.e. unfair doesn't make sense if forUser - private void printEGraph(Job job, boolean forUser, boolean fair) throws ScribbleException, CommandLineException + private void printEGraph(Job job, boolean forUser, boolean fair) + throws ScribbleException, CommandLineException { JobContext jcontext = job.getContext(); - String[] args = forUser ? this.args.get(CLArgFlag.EFSM) : - (fair ? this.args.get(CLArgFlag.VALIDATION_EFSM) : this.args.get(CLArgFlag.UNFAIR_EFSM)); + String[] args = forUser + ? this.args.get(CLArgFlag.EFSM) + : (fair + ? this.args.get(CLArgFlag.VALIDATION_EFSM) + : this.args.get(CLArgFlag.UNFAIR_EFSM)); for (int i = 0; i < args.length; i += 2) { GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); Role role = checkRoleArg(jcontext, fullname, args[i+1]); EGraph fsm = getEGraph(job, fullname, role, forUser, fair); - String out = this.args.containsKey(CLArgFlag.AUT) ? fsm.toAut() : fsm.toDot(); + String out = this.args.containsKey(CLArgFlag.AUT) + ? fsm.toAut() + : fsm.toDot(); System.out.println("\n" + out); // Endpoint graphs are "inlined" (a single graph is built) } } - private void drawEGraph(Job job, boolean forUser, boolean fair) throws ScribbleException, CommandLineException + private void drawEGraph(Job job, boolean forUser, boolean fair) + throws ScribbleException, CommandLineException { JobContext jcontext = job.getContext(); - String[] args = forUser ? this.args.get(CLArgFlag.EFSM_PNG) : (fair ? this.args.get(CLArgFlag.VALIDATION_EFSM_PNG) : this.args.get(CLArgFlag.UNFAIR_EFSM_PNG)); + String[] args = forUser + ? this.args.get(CLArgFlag.EFSM_PNG) + : (fair + ? this.args.get(CLArgFlag.VALIDATION_EFSM_PNG) + : this.args.get(CLArgFlag.UNFAIR_EFSM_PNG)); for (int i = 0; i < args.length; i += 3) { GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); @@ -316,51 +344,66 @@ private void drawEGraph(Job job, boolean forUser, boolean fair) throws ScribbleE } // Endpoint graphs are "inlined", so only a single graph is built (cf. projection output) - private EGraph getEGraph(Job job, GProtocolName fullname, Role role, boolean forUser, boolean fair) + private EGraph getEGraph(Job job, GProtocolName fullname, Role role, + boolean forUser, boolean fair) throws ScribbleException, CommandLineException { JobContext jcontext = job.getContext(); - GProtocolDecl gpd = (GProtocolDecl) jcontext.getMainModule().getProtocolDeclChild(fullname.getSimpleName()); - if (gpd == null || !gpd.header.roledecls.getRoles().contains(role)) + GProtocolDecl gpd = (GProtocolDecl) jcontext.getMainModule() + .getProtocolDeclChild(fullname.getSimpleName()); + if (gpd == null || !gpd.getHeaderChild().getRoleDeclListChild().getRoles() + .contains(role)) { - throw new CommandLineException("Bad FSM construction args: " + Arrays.toString(this.args.get(CLArgFlag.DOT))); + throw new CommandLineException("Bad FSM construction args: " + + Arrays.toString(this.args.get(CLArgFlag.DOT))); } EGraph graph; if (forUser) // The (possibly minimised) user-output EFSM for API gen { graph = this.args.containsKey(CLArgFlag.LTSCONVERT_MIN) - ? jcontext.getMinimisedEGraph(fullname, role) : jcontext.getEGraph(fullname, role); + ? jcontext.getMinimisedEGraph(fullname, role) + : jcontext.getEGraph(fullname, role); } else // The (possibly unfair-transformed) internal EFSM for validation { graph = //(!this.args.containsKey(ArgFlag.FAIR) && !this.args.containsKey(ArgFlag.NO_LIVENESS)) // Cf. GlobalModelChecker.getEndpointFSMs !fair - ? jcontext.getUnfairEGraph(fullname, role) : jcontext.getEGraph(fullname, role); + ? jcontext.getUnfairEGraph(fullname, role) + : jcontext.getEGraph(fullname, role); } if (graph == null) { - throw new RuntimeScribbleException("Shouldn't see this: " + fullname); // Should be suppressed by an earlier failure + throw new RuntimeScribbleException("Shouldn't see this: " + fullname); + // Should be suppressed by an earlier failure } return graph; } - private void printSGraph(Job job, boolean fair) throws ScribbleException, CommandLineException + private void printSGraph(Job job, boolean fair) + throws ScribbleException, CommandLineException { JobContext jcontext = job.getContext(); - String[] args = fair ? this.args.get(CLArgFlag.SGRAPH) : this.args.get(CLArgFlag.UNFAIR_SGRAPH); + String[] args = fair + ? this.args.get(CLArgFlag.SGRAPH) + : this.args.get(CLArgFlag.UNFAIR_SGRAPH); for (int i = 0; i < args.length; i += 1) { GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); SGraph model = getSGraph(job, fullname, fair); - String out = this.args.containsKey(CLArgFlag.AUT) ? model.toAut() : model.toDot(); + String out = this.args.containsKey(CLArgFlag.AUT) + ? model.toAut() + : model.toDot(); System.out.println("\n" + out); } } - private void drawSGraph(Job job, boolean fair) throws ScribbleException, CommandLineException + private void drawSGraph(Job job, boolean fair) + throws ScribbleException, CommandLineException { JobContext jcontext = job.getContext(); - String[] args = fair ? this.args.get(CLArgFlag.SGRAPH_PNG) : this.args.get(CLArgFlag.UNFAIR_SGRAPH_PNG); + String[] args = fair + ? this.args.get(CLArgFlag.SGRAPH_PNG) + : this.args.get(CLArgFlag.UNFAIR_SGRAPH_PNG); for (int i = 0; i < args.length; i += 2) { GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); @@ -370,18 +413,23 @@ private void drawSGraph(Job job, boolean fair) throws ScribbleException, Command } } - private static SGraph getSGraph(Job job, GProtocolName fullname, boolean fair) throws ScribbleException + private static SGraph getSGraph(Job job, GProtocolName fullname, boolean fair) + throws ScribbleException { JobContext jcontext = job.getContext(); - SGraph model = fair ? jcontext.getSGraph(fullname) : jcontext.getUnfairSGraph(fullname); + SGraph model = fair + ? jcontext.getSGraph(fullname) + : jcontext.getUnfairSGraph(fullname); if (model == null) { - throw new RuntimeScribbleException("Shouldn't see this: " + fullname); // Should be suppressed by an earlier failure + throw new RuntimeScribbleException("Shouldn't see this: " + fullname); + // Should be suppressed by an earlier failure } return model; } - private void outputEndpointApi(Job job) throws ScribbleException, CommandLineException + private void outputEndpointApi(Job job) + throws ScribbleException, CommandLineException { JobContext jcontext = job.getContext(); String[] args = this.args.get(CLArgFlag.API_GEN); @@ -392,16 +440,18 @@ private void outputEndpointApi(Job job) throws ScribbleException, CommandLineExc Map sessClasses = jgen.generateSessionApi(fullname); outputClasses(sessClasses); Role role = checkRoleArg(jcontext, fullname, args[i+1]); - Map scClasses = jgen.generateStateChannelApi(fullname, role, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); + Map scClasses = jgen.generateStateChannelApi(fullname, + role, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); outputClasses(scClasses); } } - private void outputSessionApi(Job job) throws ScribbleException, CommandLineException + private void outputSessionApi(Job job) + throws ScribbleException, CommandLineException { JobContext jcontext = job.getContext(); String[] args = this.args.get(CLArgFlag.SESS_API_GEN); - JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // FIXME: refactor (generalise -- use new API) + JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // TODO: refactor (generalise -- use new API) for (String fullname : args) { GProtocolName gpn = checkGlobalProtocolArg(jcontext, fullname); @@ -410,21 +460,24 @@ private void outputSessionApi(Job job) throws ScribbleException, CommandLineExce } } - private void outputStateChannelApi(Job job) throws ScribbleException, CommandLineException + private void outputStateChannelApi(Job job) + throws ScribbleException, CommandLineException { JobContext jcontext = job.getContext(); String[] args = this.args.get(CLArgFlag.SCHAN_API_GEN); - JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // FIXME: refactor (generalise -- use new API) + JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // TODO: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) { GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); Role self = checkRoleArg(jcontext, fullname, args[i+1]); - Map classes = jgen.generateStateChannelApi(fullname, self, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); + Map classes = jgen.generateStateChannelApi(fullname, self, + this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); outputClasses(classes); } } - private void outputEventDrivenApi(Job job) throws ScribbleException, CommandLineException + private void outputEventDrivenApi(Job job) + throws ScribbleException, CommandLineException { JobContext jcontext = job.getContext(); String[] args = this.args.get(CLArgFlag.ED_API_GEN); @@ -442,14 +495,16 @@ private void outputEventDrivenApi(Job job) throws ScribbleException, CommandLine { GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); Role self = checkRoleArg(jcontext, fullname, args[i+1]); - CBEndpointApiGenerator3 edgen = new CBEndpointApiGenerator3(job, fullname, self, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); + CBEndpointApiGenerator3 edgen = new CBEndpointApiGenerator3(job, fullname, + self, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); Map out = edgen.build(); outputClasses(out); } } // filepath -> class source - protected void outputClasses(Map classes) throws ScribbleException + protected void outputClasses(Map classes) + throws ScribbleException { Consumer f; if (this.args.containsKey(CLArgFlag.API_OUTPUT)) @@ -472,7 +527,8 @@ protected void outputClasses(Map classes) throws ScribbleExcepti classes.keySet().stream().forEach(f); } - protected static void runDot(String dot, String png) throws ScribbleException, CommandLineException + protected static void runDot(String dot, String png) + throws ScribbleException, CommandLineException { String tmpName = png + ".tmp"; File tmp = new File(tmpName); @@ -499,10 +555,12 @@ protected static Path parseMainPath(String path) protected static List parseImportPaths(String paths) { - return Arrays.stream(paths.split(File.pathSeparator)).map((s) -> Paths.get(s)).collect(Collectors.toList()); + return Arrays.stream(paths.split(File.pathSeparator)).map(s -> Paths.get(s)) + .collect(Collectors.toList()); } - protected static GProtocolName checkGlobalProtocolArg(JobContext jcontext, String simpname) throws CommandLineException + protected static GProtocolName checkGlobalProtocolArg(JobContext jcontext, + String simpname) throws CommandLineException { GProtocolName simpgpn = new GProtocolName(simpname); Module main = jcontext.getMainModule(); @@ -517,18 +575,22 @@ protected static GProtocolName checkGlobalProtocolArg(JobContext jcontext, Strin } if (pd.isAux()) // CHECKME: maybe don't check for all, e.g. -project { - throw new CommandLineException("Invalid aux protocol specified as root: " + simpname); + throw new CommandLineException( + "Invalid aux protocol specified as root: " + simpname); } return new GProtocolName(jcontext.main, simpgpn); } - protected static Role checkRoleArg(JobContext jcontext, GProtocolName fullname, String rolename) throws CommandLineException + protected static Role checkRoleArg(JobContext jcontext, + GProtocolName fullname, String rolename) throws CommandLineException { - ProtocolDecl pd = jcontext.getMainModule().getProtocolDeclChild(fullname.getSimpleName()); + ProtocolDecl pd = jcontext.getMainModule() + .getProtocolDeclChild(fullname.getSimpleName()); Role role = new Role(rolename); - if (!pd.header.roledecls.getRoles().contains(role)) + if (!pd.getHeaderChild().getRoleDeclListChild().getRoles().contains(role)) { - throw new CommandLineException("Role not declared for " + fullname + ": " + role); + throw new CommandLineException( + "Role not declared for " + fullname + ": " + role); } return role; } diff --git a/scribble-cli/src/main/java/org/scribble/main/MainContext.java b/scribble-cli/src/main/java/org/scribble/main/MainContext.java index 0c87be043..fcf02afa8 100644 --- a/scribble-cli/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-cli/src/main/java/org/scribble/main/MainContext.java @@ -78,10 +78,12 @@ public class MainContext // Resource recorded for source path private final Map> parsed = new HashMap<>(); - // FIXME: make Path abstract as e.g. URI -- locator is abstract but Path is coupled to concrete DirectoryResourceLocator - private MainContext(boolean debug, ResourceLocator locator, boolean useOldWF, boolean noLiveness, boolean minEfsm, - boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) - throws ScribParserException, ScribbleException + // TODO: make Path abstract as e.g. URI -- locator is abstract but Path is coupled to concrete DirectoryResourceLocator + private MainContext(boolean debug, ResourceLocator locator, boolean useOldWF, + boolean noLiveness, boolean minEfsm, boolean fair, + boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, + boolean noValidation, boolean spin) + throws ScribParserException, ScribbleException { //this.jUnit = jUnit; this.debug = debug; @@ -95,35 +97,42 @@ private MainContext(boolean debug, ResourceLocator locator, boolean useOldWF, bo this.spin = spin; this.locator = locator; - this.loader = new ScribModuleLoader(this.locator, this.antlrParser, this.scribParser); + this.loader = new ScribModuleLoader(this.locator, this.antlrParser, + this.scribParser); } // Load main module from file system - public MainContext(boolean debug, ResourceLocator locator, Path mainpath, boolean useOldWF, boolean noLiveness, boolean minEfsm, - boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) - throws ScribParserException, ScribbleException + public MainContext(boolean debug, ResourceLocator locator, Path mainpath, + boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, + boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, + boolean noValidation, boolean spin) + throws ScribParserException, ScribbleException { - this(debug, locator, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); + this(debug, locator, useOldWF, noLiveness, minEfsm, fair, + noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, + spin); - // FIXME: checking main module resource exists at specific location should be factored out to front-end (e.g. CommandLine) -- main module resource is specified at local front end level of abstraction, while MainContext uses abstract resource loading + // TODO: checking main module resource exists at specific location should be factored out to front-end (e.g. CommandLine) -- main module resource is specified at local front end level of abstraction, while MainContext uses abstract resource loading //Pair p = this.loader.loadMainModule(mainpath); - Resource res = DirectoryResourceLocator.getResourceByFullPath(mainpath); // FIXME: hardcoded to DirectoryResourceLocator -- main module loading should be factored out to front end (e.g. CommandLine) + Resource res = DirectoryResourceLocator.getResourceByFullPath(mainpath); + // TODO: hardcoded to DirectoryResourceLocator -- main module loading should be factored out to front end (e.g. CommandLine) CommonTree atree = this.antlrParser.parseAntlrTree(res); - - System.out.println("111: " + atree.getClass()); - - Module mod = (Module) this.scribParser.parse(atree, this.af); // FIXME: rename exceptions + Module mod = (Module) this.scribParser.parse(atree, this.af); // TODO: rename exceptions checkMainModuleName(mainpath, mod); init(res, mod); } // For inline module arg - public MainContext(boolean debug, ResourceLocator locator, String inline, boolean useOldWF, boolean noLiveness, boolean minEfsm, - boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) - throws ScribParserException, ScribbleException + public MainContext(boolean debug, ResourceLocator locator, String inline, + boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, + boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, + boolean noValidation, boolean spin) + throws ScribParserException, ScribbleException { - this(debug, locator, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); + this(debug, locator, useOldWF, noLiveness, minEfsm, fair, + noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, + spin); Resource res = new InlineResource(inline); Module mod = (Module) this.scribParser.parse(this.antlrParser.parseAntlrTree(res), this.af); @@ -131,19 +140,22 @@ public MainContext(boolean debug, ResourceLocator locator, String inline, boolea init(res, mod); } - private void init(Resource res, Module mainmod) throws ScribParserException, ScribbleException + private void init(Resource res, Module mainmod) + throws ScribParserException, ScribbleException { Pair p = new Pair<>(res, mainmod); - this.main = p.right.getFullModuleName(); // FIXME: main modname comes from the inlined moddecl -- check for issues if this clashes with an existing file system resource + this.main = p.right.getFullModuleName(); + // TODO CHECKME: main modname comes from the inlined moddecl -- check for issues if this clashes with an existing file system resource loadAllModules(p); } // A Scribble extension should override these "new" methods as appropriate. public Job newJob() { - return new Job(this.debug, this.getParsedModules(), this.main, this.useOldWF, this.noLiveness, this.minEfsm, this.fair, - this.noLocalChoiceSubjectCheck, this.noAcceptCorrelationCheck, this.noValidation, this.spin, - this.af, this.ef, this.sf); + return new Job(this.debug, this.getParsedModules(), this.main, + this.useOldWF, this.noLiveness, this.minEfsm, this.fair, + this.noLocalChoiceSubjectCheck, this.noAcceptCorrelationCheck, + this.noValidation, this.spin, this.af, this.ef, this.sf); } protected ScribbleAntlrWrapper newAntlrParser() @@ -171,14 +183,16 @@ protected SModelFactory newSModelFactory() return new SModelFactoryImpl(); } - private void loadAllModules(Pair module) throws ScribParserException, ScribbleException + private void loadAllModules(Pair module) + throws ScribParserException, ScribbleException { this.parsed.put(module.right.getFullModuleName(), module); for (ImportDecl id : module.right.getImportDeclChildren()) { if (id.isImportModule()) { - ModuleName modname = ((ImportModule) id).modname.toName(); + ModuleName modname = + ((ImportModule) id).getModuleNameNodeChild().toName(); if (!this.parsed.containsKey(modname)) { loadAllModules(this.loader.loadModule(modname, af)); @@ -189,20 +203,26 @@ private void loadAllModules(Pair module) throws ScribParserExc public Map getParsedModules() { - return this.parsed.entrySet().stream().collect(Collectors.toMap(Entry::getKey, e -> e.getValue().right)); + return this.parsed.entrySet().stream() + .collect(Collectors.toMap(Entry::getKey, e -> e.getValue().right)); } // Hacky? But not Scribble tool's job to check nested directory location of module fully corresponds to the fullname of module? Cf. Java classes - private void checkMainModuleName(Path mainpath, Module main) throws ScribbleException + private void checkMainModuleName(Path mainpath, Module main) + throws ScribbleException { String path = mainpath.toString(); // FIXME: hack // FileSystems.getDefault().getSeparator() ? - String tmp = path.substring((path.lastIndexOf(File.separator) == -1) ? 0 : path.lastIndexOf(File.separator) + 1, path.lastIndexOf('.')); + String tmp = path.substring((path.lastIndexOf(File.separator) == -1) + ? 0 + : path.lastIndexOf(File.separator) + 1, path.lastIndexOf('.')); if (!this.noValidation) { - if (!tmp.equals(main.getFullModuleName().getSimpleName().toString())) // ModuleName.toString hack? + if (!tmp.equals(main.getFullModuleName().getSimpleName().toString())) + // ModuleName.toString hack? { - CommonTree source = main.getModuleDeclChild().name.getSource(); + CommonTree source = main.getModuleDeclChild().getNameNodeChild() + .getSource(); throw new ScribbleException(source, "Simple module name at path " + path + " mismatch: " + main.getFullModuleName()); } diff --git a/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java b/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java index ddd6c0f6a..82aad911e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java +++ b/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java @@ -103,9 +103,9 @@ protected boolean isUnitMessage() - public final RoleNode src; - public final MessageNode msg; - public final RoleNode dest; + private final RoleNode src; + private final MessageNode msg; + private final RoleNode dest; protected ConnectAction(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) //protected ConnectionAction(RoleNode src, RoleNode dest) diff --git a/scribble-core/src/main/java/org/scribble/ast/Do.java b/scribble-core/src/main/java/org/scribble/ast/Do.java index f8e3cdc8c..6eaa6ff82 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Do.java +++ b/scribble-core/src/main/java/org/scribble/ast/Do.java @@ -54,7 +54,7 @@ public RoleArgList getRoleListChild() return (RoleArgList) getChild(0); } - public NonRoleArgList getArgListChild() + public NonRoleArgList getNonRoleListChild() { return (NonRoleArgList) getChild(1); } @@ -78,7 +78,7 @@ public Do reconstruct(RoleArgList roles, NonRoleArgList args, ProtocolNameNod public Do visitChildren(AstVisitor nv) throws ScribbleException { RoleArgList ril = (RoleArgList) visitChild(getRoleListChild(), nv); - NonRoleArgList al = (NonRoleArgList) visitChild(getArgListChild(), nv); + NonRoleArgList al = (NonRoleArgList) visitChild(getNonRoleListChild(), nv); ProtocolNameNode proto = visitChildWithClassEqualityCheck(this, getProtocolNameNode(), nv); return reconstruct(ril, al, proto); @@ -124,7 +124,7 @@ public Role getTargetRoleParameter(JobContext jcontext, public String toString() { String s = Constants.DO_KW + " "; - return s + getProtocolNameNode() + getArgListChild() + getRoleListChild() + return s + getProtocolNameNode() + getNonRoleListChild() + getRoleListChild() + ";"; } diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java index 74719b883..1e904859e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java @@ -21,6 +21,7 @@ import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; // FIXME: visitChildren for modifiers @@ -87,6 +88,12 @@ public ProtocolDecl visitChildren(AstVisitor nv) throws ScribbleException return reconstruct(header, def); } + public List getRoles() + { + // WF disallows unused role declarations + return getHeaderChild().getRoleDeclListChild().getRoles(); + } + @Override public String toString() { diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleArgList.java b/scribble-core/src/main/java/org/scribble/ast/RoleArgList.java index 6defa75d9..8f976846f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/RoleArgList.java +++ b/scribble-core/src/main/java/org/scribble/ast/RoleArgList.java @@ -47,6 +47,12 @@ public RoleArgList dupNode() return new RoleArgList(this); } + @Override + public RoleArgList reconstruct(List args) + { + return (RoleArgList) super.reconstruct(args); + } + // Move to delegate? @Override public RoleArgList project(AstFactory af, Role self) diff --git a/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java b/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java index c617f0f51..6f1681a14 100644 --- a/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java +++ b/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java @@ -79,7 +79,8 @@ public ModuleContext(JobContext jcontext, Module root) throws ScribbleException // Register mod under name modname, modname could be the full module name or an import alias // Adds member names qualified by mod - private static void addModule(ScribNames names, Module mod, ModuleName modname) throws ScribbleException + private static void addModule(ScribNames names, Module mod, + ModuleName modname) throws ScribbleException { names.modules.put(modname, mod.getFullModuleName()); for (NonProtocolDecl npd : mod.getNonProtoDeclChildren()) @@ -99,25 +100,28 @@ private static void addModule(ScribNames names, Module mod, ModuleName modname) } for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) { - GProtocolName qualif = new GProtocolName(modname, gpd.getHeaderChild().getDeclName()); + GProtocolName qualif = new GProtocolName(modname, + gpd.getHeaderChild().getDeclName()); names.globals.put(qualif, gpd.getFullMemberName(mod)); } for (LProtocolDecl lpd : mod.getLProtoDeclChildren()) { - LProtocolName qualif = new LProtocolName(modname, lpd.getHeaderChild().getDeclName()); + LProtocolName qualif = new LProtocolName(modname, + lpd.getHeaderChild().getDeclName()); names.locals.put(qualif, lpd.getFullMemberName(mod)); } } // Could move to ImportModule but would need a defensive copy setter, or cache info in builder and create on leave - private void addImportDependencies(JobContext jcontext, Module mod) throws ScribbleException + private void addImportDependencies(JobContext jcontext, Module mod) + throws ScribbleException { for (ImportDecl id : mod.getImportDeclChildren()) { if (id.isImportModule()) { ImportModule im = (ImportModule) id; - ModuleName fullmodname = im.modname.toName(); + ModuleName fullmodname = im.getModuleNameNodeChild().toName(); if (!this.deps.modules.containsKey(fullmodname)) { Module imported = jcontext.getModule(fullmodname); @@ -134,7 +138,8 @@ private void addImportDependencies(JobContext jcontext, Module mod) throws Scrib // Adds "local" imports by alias or full name // Adds "local" members by simple names - private void addVisible(JobContext jcontext, Module root) throws ScribbleException + private void addVisible(JobContext jcontext, Module root) + throws ScribbleException { // Unlike for deps, visible is not done transitively for (ImportDecl id : root.getImportDeclChildren()) @@ -142,11 +147,13 @@ private void addVisible(JobContext jcontext, Module root) throws ScribbleExcepti if (id.isImportModule()) { ImportModule im = (ImportModule) id; - ModuleName fullname = im.modname.toName(); - ModuleName visname = (im.isAliased()) ? im.getAlias() : fullname; // getVisibleName doesn't use fullname + ModuleName fullname = im.getModuleNameNodeChild().toName(); + ModuleName visname = (im.isAliased()) ? im.getAlias() : fullname; + // getVisibleName doesn't use fullname if (this.visible.modules.containsKey(visname)) { - throw new ScribbleException(id.getSource(), "Duplicate visible module name: " + visname); + throw new ScribbleException(id.getSource(), + "Duplicate visible module name: " + visname); } Module imported = jcontext.getModule(fullname); addModule(this.visible, imported, visname); @@ -165,21 +172,24 @@ private void addVisible(JobContext jcontext, Module root) throws ScribbleExcepti DataType visname = new DataType(dtd.getDeclName().toString()); this.visible.data.put(visname, dtd.getFullMemberName(root)); } - else //if (npd.isMessageSigNameDecl()) + else // if (npd.isMessageSigNameDecl()) { MessageSigNameDecl msnd = (MessageSigNameDecl) npd; - MessageSigName visname = new MessageSigName(msnd.getDeclName().toString()); + MessageSigName visname = new MessageSigName( + msnd.getDeclName().toString()); this.visible.sigs.put(visname, msnd.getFullMemberName(root)); } } for (GProtocolDecl gpd : root.getGProtoDeclChildren()) { - GProtocolName visname = new GProtocolName(gpd.getHeaderChild().getDeclName().toString()); + GProtocolName visname = new GProtocolName( + gpd.getHeaderChild().getDeclName().toString()); this.visible.globals.put(visname, gpd.getFullMemberName(root)); } for (LProtocolDecl lpd : root.getLProtoDeclChildren()) { - LProtocolName visname = new LProtocolName(lpd.getHeaderChild().getDeclName().toString()); + LProtocolName visname = new LProtocolName( + lpd.getHeaderChild().getDeclName().toString()); this.visible.locals.put(visname, lpd.getFullMemberName(root)); } } @@ -194,10 +204,10 @@ public boolean isMessageSigNameDependency(Name signame) return this.deps.sigs.containsKey(signame); }*/ - // FIXME: deprecate -- now redundant: proto should already be full name by namedisamb (and this.deps only stores full names) + // TODO: deprecate -- now redundant: proto should already be full name by namedisamb (and this.deps only stores full names) // Refactored as a "check" for now (although still redundant, not actually checking anything) - //public ProtocolName getProtocolDeclDependencyFullName(ProtocolName proto) - public ProtocolName checkProtocolDeclDependencyFullName(ProtocolName proto) + public ProtocolName checkProtocolDeclDependencyFullName( + ProtocolName proto) { return getProtocolDeclFullName(this.deps, proto); } @@ -221,33 +231,38 @@ public boolean isVisibleDataType(DataType visname) { return this.visible.isVisibleDataType(visname); } - + public MessageSigName getVisibleMessageSigNameFullName(MessageSigName visname) { return getFullName(this.visible.sigs, visname); } - public ProtocolName getVisibleProtocolDeclFullName(ProtocolName visname) + public ProtocolName getVisibleProtocolDeclFullName( + ProtocolName visname) { return getProtocolDeclFullName(this.visible, visname); } - public boolean isVisibleProtocolDeclName(ProtocolName visname) + public boolean isVisibleProtocolDeclName( + ProtocolName visname) { return this.visible.isVisibleProtocolDeclName(visname); } - public static ProtocolName getProtocolDeclFullName(ScribNames names, ProtocolName proto) + public static ProtocolName getProtocolDeclFullName( + ScribNames names, ProtocolName proto) { - ProtocolName pn = (proto.getKind().equals(Global.KIND)) - ? getFullName(names.globals, (GProtocolName) proto) - : getFullName(names.locals, (LProtocolName) proto); + ProtocolName pn = (proto.getKind() + .equals(Global.KIND)) + ? getFullName(names.globals, (GProtocolName) proto) + : getFullName(names.locals, (LProtocolName) proto); @SuppressWarnings("unchecked") ProtocolName tmp = (ProtocolName) pn; return tmp; } - private static , K extends Kind> T getFullName(Map map, T visname) + private static , K extends Kind> T getFullName( + Map map, T visname) { if (!map.containsKey(visname)) { diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java b/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java index f65b47347..735930126 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java @@ -44,8 +44,9 @@ public GConnect(GConnect node) public LNode project(AstFactory af, Role self) { - Role src = this.src.toName(); - Role dest = this.dest.toName(); + Role src = this.getSourceChild().toName(); + MessageNode msgNode = this.getMessageNodeChild(); + Role dest = this.getDestinationChild().toName(); LNode proj = null; if (src.equals(self) || dest.equals(self)) { @@ -59,7 +60,7 @@ public LNode project(AstFactory af, Role self) RoleNode destNode = getDestinationChild(); RoleNode srcNode1 = (RoleNode) af.SimpleNameNode(srcNode.getSource(), RoleKind.KIND, srcNode.toName().toString()); // clone? - MessageNode msgNode1 = (MessageNode) this.msg; // FIXME: need namespace prefix update? + MessageNode msgNode1 = (MessageNode) msgNode; // CHECKME: need namespace prefix update? RoleNode destNode1 = (RoleNode) af.SimpleNameNode(destNode.getSource(), RoleKind.KIND, destNode.toName().toString()); if (src.equals(self)) @@ -95,8 +96,9 @@ public GConnect reconstruct(RoleNode src, MessageNode msg, RoleNode dest) @Override public String toString() { - return (isUnitMessage() ? "" : this.msg + " ") + Constants.CONNECT_KW + " " - + this.src + " " + Constants.TO_KW + " " + this.dest + ";"; + return (isUnitMessage() ? "" : getMessageNodeChild() + " ") + + Constants.CONNECT_KW + " " + getSourceChild() + " " + Constants.TO_KW + + " " + getDestinationChild() + ";"; //return Constants.CONNECT_KW + " " + this.src + " " + Constants.TO_KW + " " + this.dest + ";"; } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GDo.java b/scribble-core/src/main/java/org/scribble/ast/global/GDo.java index 8e4376d7d..de5f5d808 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GDo.java @@ -57,7 +57,7 @@ public GDo dupNode() public LDo project(AstFactory af, Role self, LProtocolNameNode fullname) { RoleArgList roles = this.getRoleListChild().project(af, self); - NonRoleArgList args = this.getArgListChild().project(af, self); + NonRoleArgList args = this.getNonRoleListChild().project(af, self); LDo projection = af.LDo(this.source, roles, args, fullname); return projection; } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GWrap.java b/scribble-core/src/main/java/org/scribble/ast/global/GWrap.java index 0e630284a..fcb6d6854 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GWrap.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GWrap.java @@ -41,13 +41,13 @@ public GWrap(GWrap node) public LNode project(AstFactory af, Role self) { - Role srcrole = this.src.toName(); - Role destrole = this.dest.toName(); + RoleNode srcNode = getSourceChild(); + RoleNode destNode = getDestinationChild(); + Role srcrole = srcNode.toName(); + Role destrole = destNode.toName(); LNode projection = null; if (srcrole.equals(self) || destrole.equals(self)) { - RoleNode srcNode = this.src; - RoleNode destNode = this.dest; RoleNode srcNode1 = (RoleNode) af.SimpleNameNode(srcNode.getSource(), RoleKind.KIND, srcNode.toName().toString()); // clone? RoleNode destNode1 = (RoleNode) af.SimpleNameNode(destNode.getSource(), diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java b/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java index 5b0cf6ac3..5f53382a9 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java @@ -77,7 +77,8 @@ public Set getEnabling() @Override public String toString() { - return Constants.WRAP_KW + " " + Constants.FROM_KW + " " + this.src + ";"; + return Constants.WRAP_KW + " " + Constants.FROM_KW + " " + + this.getSourceChild() + ";"; } diff --git a/scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java b/scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java index 09044a74f..5f0a12b80 100644 --- a/scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java @@ -21,7 +21,7 @@ import org.scribble.visit.env.UnfoldingEnv; import org.scribble.visit.util.RoleCollector; -// FIXME: factor with MessageTransferDel +// TODO: factor with MessageTransferDel public abstract class ConnectionActionDel extends SimpleInteractionNodeDel { public ConnectionActionDel() @@ -30,24 +30,19 @@ public ConnectionActionDel() } @Override - public ConnectAction leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public ConnectAction leaveProtocolInlining(ScribNode parent, + ScribNode child, ProtocolDefInliner inl, ScribNode visited) + throws ScribbleException { ConnectAction c = (ConnectAction) visited; - ConnectAction inlined = (ConnectAction) c.clone(inl.job.af); + ConnectAction inlined = (ConnectAction) c.clone();//inl.job.af); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (ConnectAction) super.leaveProtocolInlining(parent, child, inl, c); } - /*@Override - public void enterChoiceUnguardedSubprotocolCheck(ScribNode parent, ScribNode child, ChoiceUnguardedSubprotocolChecker checker) throws ScribbleException - { - ChoiceUnguardedSubprotocolEnv env = checker.popEnv(); - env = env.disablePrune(); - checker.pushEnv(env); - }*/ - @Override - public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf) throws ScribbleException + public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, + InlinedProtocolUnfolder unf) throws ScribbleException { UnfoldingEnv env = unf.popEnv(); env = env.disableUnfold(); @@ -55,14 +50,32 @@ public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, Inl } @Override - public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, RoleCollector coll, ScribNode visited) + public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, + RoleCollector coll, ScribNode visited) { ConnectAction c = (ConnectAction) visited; - coll.addName(c.src.toName()); - coll.addName(c.dest.toName()); + coll.addName(c.getSourceChild().toName()); + coll.addName(c.getDestinationChild().toName()); return visited; } + + + + + + + + + + + + + + + + + /*@Override public ScribNode leaveMessageIdCollection(ScribNode parent, ScribNode child, MessageIdCollector coll, ScribNode visited) { @@ -85,4 +98,12 @@ public ScribNode leaveEnablingMessageCollection(ScribNode parent, ScribNode chil coll.addEnabling(mt.src.toName(), mt.getDestinations().get(0).toName(), mt.msg.toMessage().getId()); // FIXME: multicast return visited; }*/ + + /*@Override + public void enterChoiceUnguardedSubprotocolCheck(ScribNode parent, ScribNode child, ChoiceUnguardedSubprotocolChecker checker) throws ScribbleException + { + ChoiceUnguardedSubprotocolEnv env = checker.popEnv(); + env = env.disablePrune(); + checker.pushEnv(env); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java index f0897504b..2008d0566 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java @@ -35,33 +35,38 @@ public DoArgListDel() // Doing in leave allows the arguments to be individually checked first @Override - public DoArgList leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + public DoArgList leaveDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb, ScribNode visited) throws ScribbleException { DoArgList dal = (DoArgList) visited; List args = dal.getArgChildren(); ProtocolDecl pd = getTargetProtocolDecl((Do) parent, disamb); if (args.size() != getParamDeclList(pd).getParamDeclChildren().size()) { - throw new ScribbleException(visited.getSource(), "Do arity mismatch for " + pd.header + ": " + args); + throw new ScribbleException(visited.getSource(), + "Do arity mismatch for " + pd.getHeaderChild() + ": " + args); } return dal; } // Not using Do#getTargetProtocolDecl, because that currently relies on namedisamb pass to convert targets to fullnames (because it just gets the full name dependency, it doesn't do visible name resolution) - protected ProtocolDecl getTargetProtocolDecl(Do parent, NameDisambiguator disamb) throws ScribbleException + protected ProtocolDecl getTargetProtocolDecl(Do parent, + NameDisambiguator disamb) throws ScribbleException { ModuleContext mc = disamb.getModuleContext(); JobContext jc = disamb.job.getContext(); Do doo = (Do) parent; - ProtocolName pn = doo.proto.toName(); + ProtocolName pn = doo.getProtocolNameNode().toName(); /*if (!mc.isVisibleProtocolDeclName(simpname)) // FIXME: should be checked somewhere else? earlier (do-entry?) -- done { throw new ScribbleException("Protocol decl not visible: " + simpname); }*/ ProtocolName fullname = mc.getVisibleProtocolDeclFullName(pn); // Lookup in visible names -- not deps, because do target name not disambiguated yet (will be done later this pass) - return jc.getModule(fullname.getPrefix()).getProtocolDeclChild(pn.getSimpleName()); + return jc.getModule(fullname.getPrefix()) + .getProtocolDeclChild(pn.getSimpleName()); } - protected abstract HeaderParamDeclList getParamDeclList(ProtocolDecl pd); + protected abstract HeaderParamDeclList getParamDeclList( + ProtocolDecl pd); } diff --git a/scribble-core/src/main/java/org/scribble/del/DoDel.java b/scribble-core/src/main/java/org/scribble/del/DoDel.java index ffb3ffe8c..f8110e9a3 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoDel.java @@ -35,54 +35,69 @@ public DoDel() } @Override - public void enterDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb) throws ScribbleException + public void enterDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb) throws ScribbleException { ModuleContext mc = disamb.getModuleContext(); Do doo = (Do) child; - ProtocolName simpname = doo.proto.toName(); - if (!mc.isVisibleProtocolDeclName(simpname)) // FIXME: do on entry here, before visiting DoArgListDel + ProtocolNameNode proto = doo.getProtocolNameNode(); + ProtocolName simpname = proto.toName(); + if (!mc.isVisibleProtocolDeclName(simpname)) // CHECKME: do on entry here, before visiting DoArgListDel { - throw new ScribbleException(doo.proto.getSource(), "Protocol decl not visible: " + simpname); + throw new ScribbleException(proto.getSource(), + "Protocol decl not visible: " + simpname); } } @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb, ScribNode visited) throws ScribbleException { - return leaveDisambiguationAux(parent, child, disamb, visited); // To introduce type parameter + return leaveDisambiguationAux(parent, child, disamb, visited); + // To introduce type parameter } // Convert all visible names to full names for protocol inlining: otherwise could get clashes if directly inlining external visible names under the root modulecontext // Not done in G/LProtocolNameNodeDel because it's only for do-targets that this is needed (cf. ProtocolHeader) - private ScribNode - leaveDisambiguationAux(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) - throws ScribbleException + private ScribNode leaveDisambiguationAux( + ScribNode parent, ScribNode child, NameDisambiguator disamb, + ScribNode visited) throws ScribbleException { @SuppressWarnings("unchecked") // Doesn't matter what K is, just need to propagate it down Do doo = (Do) visited; ModuleContext mc = disamb.getModuleContext(); - ProtocolName fullname = mc.getVisibleProtocolDeclFullName(doo.proto.toName()); - ProtocolNameNode pnn = (ProtocolNameNode) - disamb.job.af.QualifiedNameNode(doo.proto.getSource(), fullname.getKind(), fullname.getElements()); + ProtocolNameNode proto = doo.getProtocolNameNode(); + ProtocolName fullname = mc + .getVisibleProtocolDeclFullName(proto.toName()); + ProtocolNameNode pnn = (ProtocolNameNode) disamb.job.af + .QualifiedNameNode(proto.getSource(), fullname.getKind(), + fullname.getElements()); // Didn't keep original namenode del - return doo.reconstruct(doo.roles, doo.args, pnn); + return doo.reconstruct(doo.getRoleListChild(), doo.getNonRoleListChild(), pnn); } @Override - public Do leaveProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) throws ScribbleException + public Do leaveProtocolDeclContextBuilding(ScribNode parent, + ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) + throws ScribbleException { JobContext jcontext = builder.job.getContext(); ModuleContext mcontext = builder.getModuleContext(); Do doo = (Do) visited; - ProtocolName pn = doo.proto.toName(); // leaveDisambiguation has fully qualified the target name - doo.roles.getRoles().forEach(r -> addProtocolDependency(builder, r, pn, doo.getTargetRoleParameter(jcontext, mcontext, r))); + ProtocolName pn = doo.getProtocolNameNode().toName(); // leaveDisambiguation has fully qualified the target name + doo.getRoleListChild().getRoles() + .forEach(r -> addProtocolDependency(builder, r, pn, + doo.getTargetRoleParameter(jcontext, mcontext, r))); return doo; } - protected abstract void addProtocolDependency(ProtocolDeclContextBuilder builder, Role self, ProtocolName proto, Role target); + protected abstract void addProtocolDependency( + ProtocolDeclContextBuilder builder, Role self, ProtocolName proto, + Role target); @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribbleException + public void enterProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl) throws ScribbleException { super.enterProtocolInlining(parent, child, inl); if (!inl.isCycle()) diff --git a/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java b/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java index 15825a71c..f4207f40a 100644 --- a/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java @@ -18,6 +18,7 @@ import org.scribble.ast.Do; import org.scribble.ast.NonRoleArg; import org.scribble.ast.NonRoleArgList; +import org.scribble.ast.NonRoleArgNode; import org.scribble.ast.NonRoleParamDecl; import org.scribble.ast.NonRoleParamDeclList; import org.scribble.ast.ProtocolDecl; @@ -45,29 +46,34 @@ public NonRoleArgList leaveDisambiguation(ScribNode parent, ScribNode child, Nam ProtocolDecl pd = getTargetProtocolDecl((Do) parent, disamb); Iterator args = nral.getArgChildren().iterator(); - for (NonRoleParamDecl param : pd.header.paramdecls.getParamDeclChildren()) + for (NonRoleParamDecl param : pd.getHeaderChild().paramdecls + .getParamDeclChildren()) { NonRoleParamKind kind = param.kind; NonRoleArg arg = args.next(); - if (arg.val.isParamNode()) + NonRoleArgNode val = arg.getValChild(); + if (val.isParamNode()) { - if (!((NonRoleParamNode) arg.val).kind.equals(kind)) + if (!((NonRoleParamNode) val).kind.equals(kind)) { - throw new ScribbleException(arg.getSource(), "Bad arg " + arg + " for param kind: " + kind); + throw new ScribbleException(arg.getSource(), + "Bad arg " + arg + " for param kind: " + kind); } } else if (kind.equals(SigKind.KIND)) { - if (!arg.val.isMessageSigNode() && !arg.val.isMessageSigNameNode()) + if (!val.isMessageSigNode() && !val.isMessageSigNameNode()) { - throw new ScribbleException(arg.getSource(), "Bad arg " + arg + " for param kind: " + kind); + throw new ScribbleException(arg.getSource(), + "Bad arg " + arg + " for param kind: " + kind); } } else if (kind.equals(DataTypeKind.KIND)) { - if (!arg.val.isDataTypeNameNode()) + if (!val.isDataTypeNameNode()) { - throw new ScribbleException(arg.getSource(), "Bad arg " + arg + " for param kind: " + kind); + throw new ScribbleException(arg.getSource(), + "Bad arg " + arg + " for param kind: " + kind); } } else @@ -82,6 +88,6 @@ else if (kind.equals(DataTypeKind.KIND)) @Override protected NonRoleParamDeclList getParamDeclList(ProtocolDecl pd) { - return pd.header.paramdecls; + return pd.getHeaderChild().getParamDeclListChild(); } } diff --git a/scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java index 8d9a66ffc..bbaf4cf48 100644 --- a/scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java @@ -30,7 +30,8 @@ import org.scribble.visit.util.RoleCollector; import org.scribble.visit.wf.NameDisambiguator; -public abstract class ProtocolDeclDel extends ScribDelBase +public abstract class ProtocolDeclDel + extends ScribDelBase { private ProtocolDeclContext pdcontext; @@ -42,14 +43,17 @@ protected ProtocolDeclDel() protected abstract ProtocolDeclDel copy(); @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb, ScribNode visited) throws ScribbleException { disamb.clear(); return visited; } @Override - public void enterProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder) throws ScribbleException + public void enterProtocolDeclContextBuilding(ScribNode parent, + ScribNode child, ProtocolDeclContextBuilder builder) + throws ScribbleException { builder.clearProtocolDependencies(); // collect per protocoldecl all together, do not clear? @@ -57,31 +61,37 @@ public void enterProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDecl pd = (ProtocolDecl) child; MemberName pn = pd.getFullMemberName(main); // Is it really needed to add self protocoldecl dependencies? - pd.header.roledecls.getRoles().stream().forEach(r -> addSelfDependency(builder, (ProtocolName) pn, r)); + pd.getHeaderChild().getRoleDeclListChild().getRoles().stream() + .forEach(r -> addSelfDependency(builder, (ProtocolName) pn, r)); } - protected abstract void addSelfDependency(ProtocolDeclContextBuilder builder, ProtocolName proto, Role role); + protected abstract void addSelfDependency(ProtocolDeclContextBuilder builder, + ProtocolName proto, Role role); @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribbleException + public void enterProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl) throws ScribbleException { SubprotocolSig subsig = inl.peekStack(); // SubprotocolVisitor has already entered subprotocol inl.setSubprotocolRecVar(subsig); } @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { return visited; } @Override - public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, RoleCollector coll, ScribNode visited) throws ScribbleException + public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, + RoleCollector coll, ScribNode visited) throws ScribbleException { ProtocolDecl pd = (ProtocolDecl) visited; Set occs = coll.getNames(); // Needs ProtocolDeclContextBuilder to have built the context already - ProtocolDeclDel del = setProtocolDeclContext(getProtocolDeclContext().setRoleOccurrences(occs)); + ProtocolDeclDel del = setProtocolDeclContext( + getProtocolDeclContext().setRoleOccurrences(occs)); return pd.del(del); } @@ -90,9 +100,11 @@ public ProtocolDeclContext getProtocolDeclContext() return this.pdcontext; } - protected ProtocolDeclDel setProtocolDeclContext(ProtocolDeclContext pdcontext) + protected ProtocolDeclDel setProtocolDeclContext( + ProtocolDeclContext pdcontext) { - ProtocolDeclDel copy = copy(); // FIXME: should be a deep clone in principle -- but if any other children are immutable, they can be shared + ProtocolDeclDel copy = copy(); + // TODO: should be a deep clone in principle -- but if any other children are immutable, they can be shared copy.pdcontext = pdcontext; return copy; } diff --git a/scribble-core/src/main/java/org/scribble/del/RoleArgListDel.java b/scribble-core/src/main/java/org/scribble/del/RoleArgListDel.java index 74ac569e8..3187e3bd9 100644 --- a/scribble-core/src/main/java/org/scribble/del/RoleArgListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/RoleArgListDel.java @@ -31,7 +31,8 @@ public RoleArgListDel() } @Override - public RoleArgList leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + public RoleArgList leaveDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb, ScribNode visited) throws ScribbleException { visited = super.leaveDisambiguation(parent, child, disamb, visited); @@ -41,7 +42,8 @@ public RoleArgList leaveDisambiguation(ScribNode parent, ScribNode child, NameDi //if (roles.size() != new HashSet<>(roles).size()) if (roles.size() != roles.stream().distinct().count()) { - throw new ScribbleException(ral.getSource(), "Duplicate role args: " + roles); + throw new ScribbleException(ral.getSource(), + "Duplicate role args: " + roles); } return ral; } @@ -49,6 +51,6 @@ public RoleArgList leaveDisambiguation(ScribNode parent, ScribNode child, NameDi @Override protected RoleDeclList getParamDeclList(ProtocolDecl pd) { - return pd.header.roledecls; + return pd.getHeaderChild().getRoleDeclListChild(); } } diff --git a/scribble-core/src/main/java/org/scribble/del/ScribDel.java b/scribble-core/src/main/java/org/scribble/del/ScribDel.java index 41e9e62f9..68764448c 100644 --- a/scribble-core/src/main/java/org/scribble/del/ScribDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ScribDel.java @@ -43,205 +43,260 @@ public interface ScribDel { // "Transient" Env env(); - void setEnv(Env env); // Non defensive - default void enterModuleContextBuilding(ScribNode parent, ScribNode child, ModuleContextBuilder builder) throws ScribbleException + void setEnv(Env env); // Non defensive + + default void enterModuleContextBuilding(ScribNode parent, ScribNode child, + ModuleContextBuilder builder) throws ScribbleException { } - default ScribNode leaveModuleContextBuilding(ScribNode parent, ScribNode child, ModuleContextBuilder builder, ScribNode visited) throws ScribbleException + default ScribNode leaveModuleContextBuilding(ScribNode parent, + ScribNode child, ModuleContextBuilder builder, ScribNode visited) + throws ScribbleException { return visited; } - default void enterDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb) throws ScribbleException + default void enterDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb) throws ScribbleException { } - default ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + default ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb, ScribNode visited) throws ScribbleException { return visited; } - default void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, DelegationProtocolRefChecker checker) throws ScribbleException + default void enterDelegationProtocolRefCheck(ScribNode parent, + ScribNode child, DelegationProtocolRefChecker checker) + throws ScribbleException { } - default ScribNode leaveDelegationProtocolRefCheck(ScribNode parent, ScribNode child, DelegationProtocolRefChecker checker, ScribNode visited) throws ScribbleException + default ScribNode leaveDelegationProtocolRefCheck(ScribNode parent, + ScribNode child, DelegationProtocolRefChecker checker, ScribNode visited) + throws ScribbleException { return visited; } - default void enterProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder) throws ScribbleException + default void enterProtocolDeclContextBuilding(ScribNode parent, + ScribNode child, ProtocolDeclContextBuilder builder) + throws ScribbleException { } - default ScribNode leaveProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) throws ScribbleException + default ScribNode leaveProtocolDeclContextBuilding(ScribNode parent, + ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) + throws ScribbleException { return visited; } - default void enterRoleCollection(ScribNode parent, ScribNode child, RoleCollector coll) + default void enterRoleCollection(ScribNode parent, ScribNode child, + RoleCollector coll) { - + } - default ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, RoleCollector coll, ScribNode visited) throws ScribbleException + default ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, + RoleCollector coll, ScribNode visited) throws ScribbleException { return visited; } - default void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribbleException + default void enterProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl) throws ScribbleException { - + } - default ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + default ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { return visited; } - default void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf) throws ScribbleException + default void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, + InlinedProtocolUnfolder unf) throws ScribbleException { - + } - // These are for "choice-rec" unfolding, i.e. InlinedProtocolUnfolder -- cf. UnfoldingVisitor, which does continue unfolding by revisiting a clone of the rec body - default ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) throws ScribbleException + // These are for "choice-rec" unfolding, i.e. InlinedProtocolUnfolder -- cf. + // UnfoldingVisitor, which does continue unfolding by revisiting a clone of + // the rec body + default ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, + ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) + throws ScribbleException { return visited; } - default void enterInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker) throws ScribbleException + default void enterInlinedWFChoiceCheck(ScribNode parent, ScribNode child, + WFChoiceChecker checker) throws ScribbleException { - + } - default ScribNode leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException + default ScribNode leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, + WFChoiceChecker checker, ScribNode visited) throws ScribbleException { return visited; } - default void enterProjection(ScribNode parent, ScribNode child, Projector proj) throws ScribbleException + default void enterProjection(ScribNode parent, ScribNode child, + Projector proj) throws ScribbleException { } - - default ScribNode leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException + + default ScribNode leaveProjection(ScribNode parent, ScribNode child, + Projector proj, ScribNode visited) throws ScribbleException { return visited; } - default void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) + default void enterProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer) { - + } - default ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer, ScribNode visited) throws ScribbleException + default ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer, ScribNode visited) + throws ScribbleException { return visited; } - default void enterProjectedRoleDeclFixing(ScribNode parent, ScribNode child, ProjectedRoleDeclFixer fixer) + default void enterProjectedRoleDeclFixing(ScribNode parent, ScribNode child, + ProjectedRoleDeclFixer fixer) { - + } - default ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, ScribNode child, ProjectedRoleDeclFixer fixer, ScribNode visited) throws ScribbleException + default ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, + ScribNode child, ProjectedRoleDeclFixer fixer, ScribNode visited) + throws ScribbleException { return visited; } - default void enterReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker) throws ScribbleException + default void enterReachabilityCheck(ScribNode parent, ScribNode child, + ReachabilityChecker checker) throws ScribbleException { } - - default ScribNode leaveReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker, ScribNode visited) throws ScribbleException + + default ScribNode leaveReachabilityCheck(ScribNode parent, ScribNode child, + ReachabilityChecker checker, ScribNode visited) throws ScribbleException { return visited; } - default void enterEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder graph) + default void enterEGraphBuilding(ScribNode parent, ScribNode child, + EGraphBuilder graph) { - + } - default ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder graph, ScribNode visited) throws ScribbleException + default ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, + EGraphBuilder graph, ScribNode visited) throws ScribbleException { return visited; } - default void enterMessageIdCollection(ScribNode parent, ScribNode child, MessageIdCollector coll) + default void enterMessageIdCollection(ScribNode parent, ScribNode child, + MessageIdCollector coll) { - + } - default ScribNode leaveMessageIdCollection(ScribNode parent, ScribNode child, MessageIdCollector coll, ScribNode visited) + default ScribNode leaveMessageIdCollection(ScribNode parent, ScribNode child, + MessageIdCollector coll, ScribNode visited) { return visited; } - - default void enterValidation(ScribNode parent, ScribNode child, GProtocolValidator coll) throws ScribbleException + + default void enterValidation(ScribNode parent, ScribNode child, + GProtocolValidator coll) throws ScribbleException { - + } - default ScribNode leaveValidation(ScribNode parent, ScribNode child, GProtocolValidator coll, ScribNode visited) throws ScribbleException + default ScribNode leaveValidation(ScribNode parent, ScribNode child, + GProtocolValidator coll, ScribNode visited) throws ScribbleException { return visited; } - - default void enterProjectedChoiceDoPruning(ScribNode parent, ScribNode child, ProjectedChoiceDoPruner pruner) throws ScribbleException + + default void enterProjectedChoiceDoPruning(ScribNode parent, ScribNode child, + ProjectedChoiceDoPruner pruner) throws ScribbleException { - + } - default ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, ScribNode child, ProjectedChoiceDoPruner proj, ScribNode visited) throws ScribbleException + default ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, + ScribNode child, ProjectedChoiceDoPruner proj, ScribNode visited) + throws ScribbleException { return visited; } - - default void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker) throws ScribbleException + + default void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, + ScribNode child, UnguardedChoiceDoProjectionChecker checker) + throws ScribbleException { - + } - default ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribbleException + default ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, + ScribNode child, UnguardedChoiceDoProjectionChecker checker, + ScribNode visited) throws ScribbleException { return visited; } - default void enterExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker) throws ScribbleException + default void enterExplicitCorrelationCheck(ScribNode parent, ScribNode child, + ExplicitCorrelationChecker checker) throws ScribbleException { - + } - default ScribNode leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribbleException + default ScribNode leaveExplicitCorrelationCheck(ScribNode parent, + ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) + throws ScribbleException { return visited; } - default void enterRecVarCollection(ScribNode parent, ScribNode child, RecVarCollector coll) + default void enterRecVarCollection(ScribNode parent, ScribNode child, + RecVarCollector coll) { - + } - default ScribNode leaveRecVarCollection(ScribNode parent, ScribNode child, RecVarCollector coll, ScribNode visited) throws ScribbleException + default ScribNode leaveRecVarCollection(ScribNode parent, ScribNode child, + RecVarCollector coll, ScribNode visited) throws ScribbleException { return visited; } - default void enterRecRemoval(ScribNode parent, ScribNode child, RecRemover rem) + default void enterRecRemoval(ScribNode parent, ScribNode child, + RecRemover rem) { - + } - default ScribNode leaveRecRemoval(ScribNode parent, ScribNode child, RecRemover rem, ScribNode visited) throws ScribbleException + default ScribNode leaveRecRemoval(ScribNode parent, ScribNode child, + RecRemover rem, ScribNode visited) throws ScribbleException { return visited; } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java index 19bfe071e..6c8726b43 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java @@ -13,9 +13,11 @@ */ package org.scribble.del.global; +import org.scribble.ast.MessageNode; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GConnect; import org.scribble.ast.local.LNode; +import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ConnectionActionDel; import org.scribble.main.ScribbleException; import org.scribble.type.Message; @@ -25,7 +27,8 @@ import org.scribble.visit.wf.WFChoiceChecker; import org.scribble.visit.wf.env.WFChoiceEnv; -public class GConnectDel extends ConnectionActionDel implements GSimpleInteractionNodeDel +public class GConnectDel extends ConnectionActionDel + implements GSimpleInteractionNodeDel { public GConnectDel() { @@ -33,7 +36,8 @@ public GConnectDel() } @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb, ScribNode visited) throws ScribbleException { GConnect gc = (GConnect) visited; /*Role src = gc.src.toName(); @@ -42,27 +46,33 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisa } @Override - public GConnect leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException + public GConnect leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, + WFChoiceChecker checker, ScribNode visited) throws ScribbleException { GConnect gc = (GConnect) visited; - - Role src = gc.src.toName(); + RoleNode srcNode = gc.getSourceChild(); + MessageNode msgNode = gc.getMessageNodeChild(); + RoleNode destNode = gc.getDestinationChild(); + + Role src = srcNode.toName(); if (!checker.peekEnv().isEnabled(src)) { - throw new ScribbleException(gc.src.getSource(), "Role not enabled: " + src); + throw new ScribbleException(srcNode.getSource(), "Role not enabled: " + src); } - Message msg = gc.msg.toMessage(); + Message msg = msgNode.toMessage(); WFChoiceEnv env = checker.popEnv(); //for (Role dest : gc.getDestinationRoles()) - Role dest = gc.dest.toName(); + Role dest = destNode.toName(); { if (src.equals(dest)) { - throw new ScribbleException(gc.getSource(), "[TODO] Self connections not supported: " + gc); + throw new ScribbleException(gc.getSource(), + "[TODO] Self connections not supported: " + gc); } if (env.isConnected(src, dest)) { - throw new ScribbleException(gc.getSource(), "Roles (possibly) already connected: " + src + ", " + dest); + throw new ScribbleException(gc.getSource(), + "Roles (possibly) already connected: " + src + ", " + dest); } env = env.connect(src, dest).addMessage(src, dest, msg); @@ -75,15 +85,33 @@ public GConnect leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFC } @Override - public ScribNode leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException //throws ScribbleException + public ScribNode leaveProjection(ScribNode parent, ScribNode child, + Projector proj, ScribNode visited) throws ScribbleException // throws + // ScribbleException { GConnect gc = (GConnect) visited; Role self = proj.peekSelf(); LNode projection = gc.project(proj.job.af, self); proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GConnect) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gc); + return (GConnect) GSimpleInteractionNodeDel.super.leaveProjection(parent, + child, proj, gc); } + + + + + + + + + + + + + + + /*// Duplicated from GMessageTransferDel @Override public ScribNode leaveF17Parsing(ScribNode parent, ScribNode child, F17Parser parser, ScribNode visited) throws ScribbleException diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java index 8087fb0cc..d48a677d4 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -25,6 +25,7 @@ import org.scribble.ast.context.ModuleContext; import org.scribble.ast.global.GDelegationElem; import org.scribble.ast.name.qualified.GProtocolNameNode; +import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDelBase; import org.scribble.main.ScribbleException; import org.scribble.type.kind.Global; @@ -44,78 +45,90 @@ public GDelegationElemDel() // Duplicated from DoDel @Override - public void enterDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb) throws ScribbleException + public void enterDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb) throws ScribbleException { ModuleContext mc = disamb.getModuleContext(); GDelegationElem de = (GDelegationElem) child; - GProtocolName gpn = de.proto.toName(); + GProtocolNameNode proto = de.getProtocolChild(); + GProtocolName gpn = proto.toName(); if (!mc.isVisibleProtocolDeclName(gpn)) { - throw new ScribbleException(de.proto.getSource(), "Protocol decl not visible: " + gpn); + throw new ScribbleException(proto.getSource(), + "Protocol decl not visible: " + gpn); } } // Duplicated from DoDel //@Override - //public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException - public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, GDelegationElem de) throws ScribbleException + public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, + GDelegationElem de) throws ScribbleException { - //DelegationElem de = (DelegationElem) visited; ModuleContext mc = disamb.getModuleContext(); - GProtocolName fullname = (GProtocolName) mc.getVisibleProtocolDeclFullName(de.proto.toName()); + GProtocolName fullname = (GProtocolName) mc + .getVisibleProtocolDeclFullName(de.getProtocolChild().toName()); + RoleNode r = de.getRoleChild(); - Role rn = de.role.toName(); - ProtocolDecl gpd = disamb.job.getContext().getModule(fullname.getPrefix()).getProtocolDeclChild(fullname.getSimpleName()); - if (!gpd.header.roledecls.getRoles().contains(rn)) + Role rn = r.toName(); + ProtocolDecl gpd = disamb.job.getContext() + .getModule(fullname.getPrefix()) + .getProtocolDeclChild(fullname.getSimpleName()); + if (!gpd.getHeaderChild().getRoleDeclListChild().getRoles().contains(rn)) { - throw new ScribbleException(de.role.getSource(), "Invalid delegation role: " + de); + throw new ScribbleException(r.getSource(), "Invalid delegation role: " + de); } - GProtocolNameNode pnn = (GProtocolNameNode) disamb.job.af.QualifiedNameNode(de.proto.getSource(), fullname.getKind(), fullname.getElements()); // Not keeping original namenode del - return de.reconstruct(pnn, de.role); + GProtocolNameNode pnn = (GProtocolNameNode) disamb.job.af.QualifiedNameNode( + de.getProtocolChild().getSource(), fullname.getKind(), fullname.getElements()); + // Not keeping original namenode del + return de.reconstruct(pnn, r); } - /*// Is this needed? Or DataTypeNodes always created from AmbigNameNode? (in this same pass) - @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) - throws ScribbleException - { - ModuleContext mc = disamb.getModuleContext(); - DataTypeNode dtn = (DataTypeNode) visited; - DataType fullname = mc.getVisibleDataTypeFullName(dtn.toName()); - return (DataTypeNode) - AstFactoryImpl.FACTORY.QualifiedNameNode(DataTypeKind.KIND, fullname.getElements()); // Didn't keep original del - }*/ - //@Override //public DelegationElem leaveProtocolDeclContextBuilding(ScribNodeScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) throws ScribbleException // FIXME: cannot access MessageTransfer roles from here - // FIXME: apply this pattern (delegate from parent back to child class) to all other existing instances - // FIXME: should always be GMessageTransfer - public void leaveMessageTransferInProtocolDeclContextBuilding(MessageTransfer mt, GDelegationElem de, ProtocolDeclContextBuilder builder) throws ScribbleException + // TODO: apply this pattern (delegate from parent back to child class) to all other existing instances + // TODO: should always be GMessageTransfer + public void leaveMessageTransferInProtocolDeclContextBuilding( + MessageTransfer mt, GDelegationElem de, + ProtocolDeclContextBuilder builder) throws ScribbleException { - GProtocolName gpn = de.proto.toName(); // leaveDisambiguation has fully qualified the target name - builder.addGlobalProtocolDependency(mt.src.toName(), gpn, de.role.toName()); // FIXME: does it make sense to use projection role as dependency target role? (seems to be used for Job.getProjections) - mt.getDestinationRoles().forEach((r) -> builder.addGlobalProtocolDependency(r, gpn, de.role.toName())); + RoleNode role = de.getRoleChild(); + GProtocolName gpn = de.getProtocolChild().toName(); // leaveDisambiguation has fully qualified the target name + builder.addGlobalProtocolDependency(mt.getSourceChild().toName(), gpn, + role.toName()); + // CHECKME: does it make sense to use projection role as dependency target role? (seems to be used for Job.getProjections) + mt.getDestinationRoles().forEach( + r -> builder.addGlobalProtocolDependency(r, gpn, role.toName())); } @Override - public void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, DelegationProtocolRefChecker checker) throws ScribbleException + public void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, + DelegationProtocolRefChecker checker) throws ScribbleException { GDelegationElem de = (GDelegationElem) child; ModuleContext mc = checker.getModuleContext(); - GProtocolName targetfullname = (GProtocolName) mc.getVisibleProtocolDeclFullName(de.proto.toName()); - GProtocolName rootfullname = (GProtocolName) mc.getVisibleProtocolDeclFullName(checker.getProtocolDeclOnEntry().header.getDeclName()); - if (targetfullname.equals(rootfullname)) // Explicit check here because ProtocolDeclContextBuilder dependencies explicitly include self protocoldecl dependencies (cf. GProtocolDeclDel.addSelfDependency) + GProtocolName targetfullname = (GProtocolName) + mc.getVisibleProtocolDeclFullName(de.getProtocolChild().toName()); + GProtocolName rootfullname = (GProtocolName) + mc.getVisibleProtocolDeclFullName( + checker.getProtocolDeclOnEntry().getHeaderChild().getDeclName()); + if (targetfullname.equals(rootfullname)) + // Explicit check here because ProtocolDeclContextBuilder dependencies explicitly include self protocoldecl dependencies (cf. GProtocolDeclDel.addSelfDependency) { - throw new ScribbleException(de.getSource(), "Recursive protocol dependencies not supported for delegation types: " + de); + throw new ScribbleException(de.getSource(), + "Recursive protocol dependencies not supported for delegation types: " + + de); } Set todo = new LinkedHashSet(); - ProtocolDecl targetgpd = checker.job.getContext().getModule(targetfullname.getPrefix()).getProtocolDeclChild(targetfullname.getSimpleName()); // target - // FIXME: does this already contain transitive do-dependencies? But doesn't contain transitive delegation-dependencies..? - Set init = - ((GProtocolDeclDel) targetgpd.del()).getProtocolDeclContext().getDependencyMap().getDependencies() - .values().stream().flatMap((v) -> v.keySet().stream()).collect(Collectors.toSet()); + ProtocolDecl targetgpd = checker.job.getContext() + .getModule(targetfullname.getPrefix()) + .getProtocolDeclChild(targetfullname.getSimpleName()); // target + // CHECKME: does this already contain transitive do-dependencies? But doesn't contain transitive delegation-dependencies..? + Set init = ((GProtocolDeclDel) targetgpd.del()) + .getProtocolDeclContext().getDependencyMap().getDependencies().values() + .stream().flatMap(v -> v.keySet().stream()) + .collect(Collectors.toSet()); todo.addAll(init); Set seen = new HashSet<>(); @@ -126,18 +139,45 @@ public void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, D it.remove(); seen.add(next); - ProtocolName nextfullname = mc.getVisibleProtocolDeclFullName(next); + ProtocolName nextfullname = + mc.getVisibleProtocolDeclFullName(next); if (rootfullname.equals(nextfullname)) { - throw new ScribbleException(de.getSource(), "Recursive protocol dependencies not supported for delegation types: " + de); + throw new ScribbleException(de.getSource(), + "Recursive protocol dependencies not supported for delegation types: " + + de); } - ProtocolDecl nextgpd = checker.job.getContext().getModule(targetfullname.getPrefix()).getProtocolDeclChild(nextfullname.getSimpleName()); - Set tmp = - ((GProtocolDeclDel) nextgpd.del()).getProtocolDeclContext().getDependencyMap().getDependencies() - .values().stream().flatMap((v) -> v.keySet().stream()) - .filter((n) -> !seen.contains(n)) - .collect(Collectors.toSet()); + ProtocolDecl nextgpd = checker.job.getContext() + .getModule(targetfullname.getPrefix()) + .getProtocolDeclChild(nextfullname.getSimpleName()); + Set tmp = ((GProtocolDeclDel) nextgpd.del()) + .getProtocolDeclContext().getDependencyMap().getDependencies() + .values().stream().flatMap(v -> v.keySet().stream()) + .filter(n -> !seen.contains(n)).collect(Collectors.toSet()); todo.addAll(tmp); } } + + + + + + + + + + + + + /*// Is this needed? Or DataTypeNodes always created from AmbigNameNode? (in this same pass) + @Override + public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) + throws ScribbleException + { + ModuleContext mc = disamb.getModuleContext(); + DataTypeNode dtn = (DataTypeNode) visited; + DataType fullname = mc.getVisibleDataTypeFullName(dtn.toName()); + return (DataTypeNode) + AstFactoryImpl.FACTORY.QualifiedNameNode(DataTypeKind.KIND, fullname.getElements()); // Didn't keep original del + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java index f041f3ff1..dca95a375 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java @@ -40,7 +40,8 @@ public class GDoDel extends DoDel implements GSimpleInteractionNodeDel { // Part of context building @Override - protected void addProtocolDependency(ProtocolDeclContextBuilder builder, Role self, ProtocolName proto, Role target) + protected void addProtocolDependency(ProtocolDeclContextBuilder builder, + Role self, ProtocolName proto, Role target) { builder.addGlobalProtocolDependency(self, (GProtocolName) proto, target); } @@ -50,41 +51,47 @@ public GDo visitForSubprotocolInlining(ProtocolDefInliner builder, GDo child) { CommonTree blame = child.getSource(); SubprotocolSig subsig = builder.peekStack(); - RecVarNode recvar = (RecVarNode) builder.job.af.SimpleNameNode(blame, RecVarKind.KIND, builder.getSubprotocolRecVar(subsig).toString()); + RecVarNode recvar = (RecVarNode) builder.job.af.SimpleNameNode(blame, + RecVarKind.KIND, builder.getSubprotocolRecVar(subsig).toString()); GContinue inlined = builder.job.af.GContinue(blame, recvar); builder.pushEnv(builder.popEnv().setTranslation(inlined)); return child; } @Override - public GDo leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public GDo leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { if (!inl.isCycle()) { CommonTree blame = visited.getSource(); SubprotocolSig subsig = inl.peekStack(); - RecVarNode recvar = (RecVarNode) inl.job.af.SimpleNameNode(blame, RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString()); - GInteractionSeq gis = (GInteractionSeq) (((InlineProtocolEnv) inl.peekEnv()).getTranslation()); + RecVarNode recvar = (RecVarNode) inl.job.af.SimpleNameNode(blame, + RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString()); + GInteractionSeq gis = (GInteractionSeq) (((InlineProtocolEnv) inl + .peekEnv()).getTranslation()); GProtocolBlock gb = inl.job.af.GProtocolBlock(blame, gis); GRecursion inlined = inl.job.af.GRecursion(blame, recvar, gb); inl.pushEnv(inl.popEnv().setTranslation(inlined)); inl.removeSubprotocolRecVar(subsig); - } + } return (GDo) super.leaveProtocolInlining(parent, child, inl, visited); } @Override - public void enterProjection(ScribNode parent, ScribNode child, Projector proj) throws ScribbleException + public void enterProjection(ScribNode parent, ScribNode child, Projector proj) + throws ScribbleException { GSimpleInteractionNodeDel.super.enterProjection(parent, child, proj); GDo gd = (GDo) child; Role self = proj.peekSelf(); - if (gd.roles.getRoles().contains(self)) + if (gd.getRoleListChild().getRoles().contains(self)) { // For correct name mangling, need to use the parameter corresponding to the self argument // N.B. -- this depends on Projector not following the Subprotocol pattern, otherwise self is wrong - Role param = gd.getTargetRoleParameter(proj.job.getContext(), proj.getModuleContext(), self); + Role param = gd.getTargetRoleParameter(proj.job.getContext(), + proj.getModuleContext(), self); proj.pushSelf(param); } else @@ -94,21 +101,25 @@ public void enterProjection(ScribNode parent, ScribNode child, Projector proj) t } @Override - public GDo leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException //throws ScribbleException + public GDo leaveProjection(ScribNode parent, ScribNode child, Projector proj, + ScribNode visited) throws ScribbleException // throws ScribbleException { GDo gd = (GDo) visited; Role popped = proj.popSelf(); Role self = proj.peekSelf(); LDo projection = null; - if (gd.roles.getRoles().contains(self)) + if (gd.getRoleListChild().getRoles().contains(self)) { ModuleContext mc = proj.getModuleContext(); - LProtocolNameNode target = Projector.makeProjectedFullNameNode(proj.job.af, gd.proto.getSource(), gd.getTargetProtocolDeclFullName(mc), popped); + LProtocolNameNode target = Projector.makeProjectedFullNameNode( + proj.job.af, gd.getProtocolNameNode().getSource(), + gd.getTargetProtocolDeclFullName(mc), popped); projection = gd.project(proj.job.af, self, target); // FIXME: do guarded recursive subprotocol checking (i.e. role is used during chain) in reachability checking? -- required role-usage makes local choice subject inference easier, but is restrictive (e.g. proto(A, B, C) { choice at A {A->B.do Proto(A,B,C)} or {A->B.B->C} })) } proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GDo) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gd); + return (GDo) GSimpleInteractionNodeDel.super + .leaveProjection(parent, child, proj, gd); } } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 24486ec2d..5bcf29d57 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -78,43 +78,51 @@ protected GProtocolDeclDel copy() } @Override - protected void addSelfDependency(ProtocolDeclContextBuilder builder, ProtocolName proto, Role role) + protected void addSelfDependency(ProtocolDeclContextBuilder builder, + ProtocolName proto, Role role) { builder.addGlobalProtocolDependency(role, (GProtocolName) proto, role); } @Override public GProtocolDecl - leaveProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) throws ScribbleException + leaveProtocolDeclContextBuilding(ScribNode parent, ScribNode child, + ProtocolDeclContextBuilder builder, ScribNode visited) + throws ScribbleException { GProtocolDecl gpd = (GProtocolDecl) visited; - GProtocolDeclContext gcontext = new GProtocolDeclContext(builder.getGlobalProtocolDependencyMap()); + GProtocolDeclContext gcontext = new GProtocolDeclContext( + builder.getGlobalProtocolDependencyMap()); GProtocolDeclDel del = (GProtocolDeclDel) setProtocolDeclContext(gcontext); return (GProtocolDecl) gpd.del(del); } @Override - public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, RoleCollector coll, ScribNode visited) throws ScribbleException + public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, + RoleCollector coll, ScribNode visited) throws ScribbleException { GProtocolDecl gpd = (GProtocolDecl) visited; // Need to do here (e.g. RoleDeclList too early, def not visited yet) // Currently only done for global, local does roledecl fixing after role collection -- should separate this check to a later pass after context building // Maybe relax to check only occs.size() > 1 - List decls = gpd.header.roledecls.getRoles(); + List decls = gpd.getHeaderChild().getRoleDeclListChild().getRoles(); Set occs = coll.getNames(); if (occs.size() != decls.size()) { decls.removeAll(occs); - throw new ScribbleException(gpd.header.roledecls.getSource(), "Unused role decl(s) in " + gpd.header.name + ": " + decls); + throw new ScribbleException( + gpd.getHeaderChild().getRoleDeclListChild().getSource(), + "Unused role decl(s) in " + gpd.getHeaderChild().getDeclName() + ": " + + decls); } return super.leaveRoleCollection(parent, child, coll, gpd); } @Override - public GProtocolDecl - leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException + public GProtocolDecl leaveProjection(ScribNode parent, ScribNode child, + Projector proj, ScribNode visited) throws ScribbleException { AstFactory af = proj.job.af; @@ -123,16 +131,21 @@ public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, RoleColl GProtocolHeader gph = gpd.getHeaderChild(); Role self = proj.peekSelf(); - LProtocolNameNode pn = Projector.makeProjectedSimpleNameNode(af, gph.getSource(), gph.getDeclName(), self); - RoleDeclList roledecls = gph.roledecls.project(af, self); - NonRoleParamDeclList paramdecls = gph.paramdecls.project(af, self); + LProtocolNameNode pn = Projector.makeProjectedSimpleNameNode(af, + gph.getSource(), gph.getDeclName(), self); + RoleDeclList roledecls = gph.getRoleDeclListChild().project(af, self); + NonRoleParamDeclList paramdecls = gph.getParamDeclListChild().project(af, + self); //LProtocolHeader hdr = af.LProtocolHeader(gpd.header.getSource(), pn, roledecls, paramdecls); // FIXME: make a header del and move there? LProtocolHeader hdr = gph.project(af, self, pn, roledecls, paramdecls); - LProtocolDef def = (LProtocolDef) ((ProjectionEnv) gpd.def.del().env()).getProjection(); - LProtocolDecl lpd = gpd.project(af, root, self, hdr, def); // FIXME: is root (always) the correct module? (wrt. LProjectionDeclDel?) + LProtocolDef def = (LProtocolDef) ((ProjectionEnv) gpd.getDefChild().del() + .env()).getProjection(); + LProtocolDecl lpd = gpd.project(af, root, self, hdr, def); // CHECKME: is root (always) the correct module? (wrt. LProjectionDeclDel?) - Map> deps = ((GProtocolDeclDel) gpd.del()).getGlobalProtocolDependencies(self); - Module projected = ((ModuleDel) root.del()).createModuleForProjection(proj, root, gpd, lpd, deps); + Map> deps = ((GProtocolDeclDel) gpd.del()) + .getGlobalProtocolDependencies(self); + Module projected = ((ModuleDel) root.del()).createModuleForProjection(proj, + root, gpd, lpd, deps); proj.addProjection(gpd.getFullMemberName(root), self, projected); return gpd; } @@ -144,7 +157,8 @@ protected Map> getGlobalProtocolDependencies(Role self) } @Override - public void enterValidation(ScribNode parent, ScribNode child, GProtocolValidator checker) throws ScribbleException + public void enterValidation(ScribNode parent, ScribNode child, + GProtocolValidator checker) throws ScribbleException { GProtocolDecl gpd = (GProtocolDecl) child; if (gpd.isAux()) @@ -157,7 +171,8 @@ public void enterValidation(ScribNode parent, ScribNode child, GProtocolValidato { if (checker.job.fair) { - throw new RuntimeException("[TODO]: -spin currently does not support fair ouput choices."); + throw new RuntimeException( + "[TODO]: -spin currently does not support fair ouput choices."); } validateBySpin(checker.job, fullname); } @@ -166,35 +181,44 @@ public void enterValidation(ScribNode parent, ScribNode child, GProtocolValidato validateByScribble(checker.job, fullname, true); if (!checker.job.fair) { - checker.job.debugPrintln("(" + fullname + ") Validating with \"unfair\" output choices.. "); - validateByScribble(checker.job, fullname, false); // FIXME: only need to check progress, not full validation + checker.job.debugPrintln( + "(" + fullname + ") Validating with \"unfair\" output choices.. "); + validateByScribble(checker.job, fullname, false); // TODO: only need to check progress, not full validation } } } - private static void validateByScribble(Job job, GProtocolName fullname, boolean fair) throws ScribbleException + private static void validateByScribble(Job job, GProtocolName fullname, + boolean fair) throws ScribbleException { JobContext jc = job.getContext(); - SGraph graph = (fair) ? jc.getSGraph(fullname) : jc.getUnfairSGraph(fullname); + SGraph graph = (fair) + ? jc.getSGraph(fullname) + : jc.getUnfairSGraph(fullname); //graph.toModel().validate(job); job.sf.newSModel(graph).validate(job); } - private static void validateBySpin(Job job, GProtocolName fullname) throws ScribbleException + private static void validateBySpin(Job job, GProtocolName fullname) + throws ScribbleException { JobContext jc = job.getContext(); Module mod = jc.getModule(fullname.getPrefix()); - GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDeclChild(fullname.getSimpleName()); + GProtocolDecl gpd = (GProtocolDecl) mod + .getProtocolDeclChild(fullname.getSimpleName()); - List rs = gpd.header.roledecls.getRoles().stream() - .sorted(Comparator.comparing(Role::toString)).collect(Collectors.toList()); + List rs = gpd.getHeaderChild().getRoleDeclListChild().getRoles() + .stream().sorted(Comparator.comparing(Role::toString)) + .collect(Collectors.toList()); - MessageIdCollector coll = new MessageIdCollector(job, ((ModuleDel) mod.del()).getModuleContext()); + MessageIdCollector coll = new MessageIdCollector(job, + ((ModuleDel) mod.del()).getModuleContext()); gpd.accept(coll); Set> mids = coll.getNames(); String pml = ""; - pml += "mtype {" + mids.stream().map(mid -> mid.toString()).collect(Collectors.joining(", ")) + "};\n"; + pml += "mtype {" + mids.stream().map(mid -> mid.toString()) + .collect(Collectors.joining(", ")) + "};\n"; // FIXME: explicit @@ -214,17 +238,19 @@ private static void validateBySpin(Job job, GProtocolName fullname) throws Scrib for (Role[] p : pairs) { pml += "chan s_" + p[0] + "_" + p[1] + " = [1] of { mtype };\n" - + "chan r_" + p[0] + "_" + p[1] + " = [1] of { mtype };\n" - + "bool empty_" + p[0] + "_" + p[1] + " = true;\n" - + "active proctype chan_" + p[0] + "_" + p[1] + "() {\n" - + "mtype m;\n" - + "end_chan_" + p[0] + "_" + p[1] + ":\n" - + "do\n" - + "::\n" - + "atomic { s_" + p[0] + "_" + p[1] + "?m; empty_" + p[0] + "_" + p[1] + " = false }\n" - + "atomic { r_" + p[0] + "_" + p[1] + "!m; empty_" + p[0] + "_" + p[1] + " = true }\n" - + "od\n" - + "}\n"; + + "chan r_" + p[0] + "_" + p[1] + " = [1] of { mtype };\n" + + "bool empty_" + p[0] + "_" + p[1] + " = true;\n" + + "active proctype chan_" + p[0] + "_" + p[1] + "() {\n" + + "mtype m;\n" + + "end_chan_" + p[0] + "_" + p[1] + ":\n" + + "do\n" + + "::\n" + + "atomic { s_" + p[0] + "_" + p[1] + "?m; empty_" + p[0] + "_" + p[1] + + " = false }\n" + + "atomic { r_" + p[0] + "_" + p[1] + "!m; empty_" + p[0] + "_" + p[1] + + " = true }\n" + + "od\n" + + "}\n"; } for (Role r : rs) @@ -314,8 +340,12 @@ private static boolean runSpin(String prefix, String pml) //throws ScribbleExcep ScribUtil.writeToFile(tmpName, pml); String[] res = ScribUtil.runProcess("spin", "-a", tmpName); res[0] = res[0].replaceAll("(?m)^ltl.*$", ""); - res[1] = res[1].replace("'gcc-4' is not recognized as an internal or external command,\noperable program or batch file.", ""); - res[1] = res[1].replace("'gcc-3' is not recognized as an internal or external command,\noperable program or batch file.", ""); + res[1] = res[1].replace( + "'gcc-4' is not recognized as an internal or external command,\noperable program or batch file.", + ""); + res[1] = res[1].replace( + "'gcc-3' is not recognized as an internal or external command,\noperable program or batch file.", + ""); res[0] = res[0].trim(); res[1] = res[1].trim(); if (!res[0].trim().isEmpty() || !res[1].trim().isEmpty()) diff --git a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java index 401212e42..9cc60bf2a 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java @@ -50,7 +50,8 @@ public class LDoDel extends DoDel implements LSimpleInteractionNodeDel { // Part of context building @Override - protected void addProtocolDependency(ProtocolDeclContextBuilder builder, Role self, ProtocolName proto, Role target) + protected void addProtocolDependency(ProtocolDeclContextBuilder builder, + Role self, ProtocolName proto, Role target) { builder.addLocalProtocolDependency(self, (LProtocolName) proto, target); } @@ -68,14 +69,17 @@ public LDo visitForSubprotocolInlining(ProtocolDefInliner builder, LDo child) } @Override - public LDo leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner dinlr, ScribNode visited) throws ScribbleException + public LDo leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner dinlr, ScribNode visited) throws ScribbleException { if (!dinlr.isCycle()) { CommonTree blame = visited.getSource(); // Cf., GDoDel SubprotocolSig subsig = dinlr.peekStack(); - RecVarNode recvar = (RecVarNode) dinlr.job.af.SimpleNameNode(blame, RecVarKind.KIND, dinlr.getSubprotocolRecVar(subsig).toString()); - LInteractionSeq gis = (LInteractionSeq) (((InlineProtocolEnv) dinlr.peekEnv()).getTranslation()); + RecVarNode recvar = (RecVarNode) dinlr.job.af.SimpleNameNode(blame, + RecVarKind.KIND, dinlr.getSubprotocolRecVar(subsig).toString()); + LInteractionSeq gis = (LInteractionSeq) (((InlineProtocolEnv) dinlr + .peekEnv()).getTranslation()); LProtocolBlock gb = dinlr.job.af.LProtocolBlock(blame, gis); LRecursion inlined = dinlr.job.af.LRecursion(blame, recvar, gb); dinlr.pushEnv(dinlr.popEnv().setTranslation(inlined)); @@ -87,30 +91,41 @@ public LDo leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefI // Pre: this pass is only run on projections (LProjectionDeclDel has source global protocol info) @Override public ScribNode - leaveProjectedRoleDeclFixing(ScribNode parent, ScribNode child, ProjectedRoleDeclFixer fixer, ScribNode visited) throws ScribbleException + leaveProjectedRoleDeclFixing(ScribNode parent, ScribNode child, + ProjectedRoleDeclFixer fixer, ScribNode visited) + throws ScribbleException + // CHECKME: similar needed for non-role args? Or all params always known? (not ideal for distributed?) { JobContext jc = fixer.job.getContext(); LDo ld = (LDo) visited; + RoleArgList roleList = ld.getRoleListChild(); LProtocolDecl lpd = ld.getTargetProtocolDecl(jc, fixer.getModuleContext()); // do role args are currently as inherited from the global type -- so need to derive role map against the global protocol header // Doing it off the global roledecls allows this to be done in one pass, but would probably be easier to split into two (e.g. 1st cache the proposed changes, 2nd write all changes -- the problem with a single pass is e.g. looking up the localdecl info while localdecls are being rewritten during the pass) // Could possibly factor out rolemap making with SubprotocolVisitor a bit, but there it maps to RoleNode and works off a root map GProtocolName source = ((LProjectionDeclDel) lpd.del()).getSourceProtocol(); - GProtocolDecl gpd = (GProtocolDecl) jc.getModule(source.getPrefix()).getProtocolDeclChild(source.getSimpleName()); - Iterator roleargs = ld.roles.getArgChildren().iterator(); - Map rolemap = gpd.header.roledecls.getRoles().stream().collect( - Collectors.toMap(r -> r, r -> roleargs.next().val.toName())); - Set occs = ((LProtocolDeclDel) lpd.del()).getProtocolDeclContext().getRoleOccurrences().stream().map(r -> - rolemap.get(r)).collect(Collectors.toSet()); + GProtocolDecl gpd = (GProtocolDecl) jc.getModule(source.getPrefix()) + .getProtocolDeclChild(source.getSimpleName()); + Iterator i = roleList.getArgChildren().iterator(); + Map rolemap = gpd.getHeaderChild().getRoleDeclListChild().getRoles().stream().collect( + Collectors.toMap(r -> r, r -> i.next().getValChild().toName())); + Set occs = ((LProtocolDeclDel) lpd.del()).getProtocolDeclContext() + .getRoleOccurrences().stream().map(r -> rolemap.get(r)) + .collect(Collectors.toSet()); - List ras = ld.roles.getArgChildren().stream().filter(ra -> occs.contains(ra.val.toName())).collect(Collectors.toList()); - RoleArgList roles = ld.roles.reconstruct(ras); - return super.leaveProjectedRoleDeclFixing(parent, child, fixer, ld.reconstruct(roles, ld.args, ld.getProtocolNameNode())); + List roleArgs = roleList.getArgChildren().stream() + .filter(ra -> occs.contains(ra.getValChild().toName())) + .collect(Collectors.toList()); + RoleArgList roleList1 = roleList.reconstruct(roleArgs); + return super.leaveProjectedRoleDeclFixing(parent, child, fixer, + ld.reconstruct(roleList1, ld.getNonRoleListChild(), ld.getProtocolNameNode())); } @Override - public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribbleException + public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, + ScribNode child, UnguardedChoiceDoProjectionChecker checker, + ScribNode visited) throws ScribbleException { /*//if (checker.isCycle()) if (checker.isRootedCycle()) // ChoiceUnguardedSubprotocolChecker is a (regular) SubprotocolVisitor which pushes a subprotosig on root decl entry (ProjectedSubprotocolPruner.visit) @@ -131,13 +146,13 @@ public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNo //checker.enablePrune(); } }*/ - return super.leaveUnguardedChoiceDoProjectionCheck(parent, child, checker, visited); - + return super.leaveUnguardedChoiceDoProjectionCheck(parent, child, checker, + visited); // for each do: check shouldPrune condition by following the control flow: if terminates or cycles with no actions then prune // Let the main pruning visitor be a regular visitor, and use the subprotocol visitor to follow the calls for pruning analysis - //FIXME: maybe similar to project roledecl fixing? use role occurrences saved in protocoldecl? + //CHECKME: maybe similar to project roledecl fixing? use role occurrences saved in protocoldecl? // role occurrences collected by RoleCollector which is indeed subprotocol visitor // problem is RoleCollector currently comes after subject fixing... but maybe it doesn't need to collect subject roles in the end? due to WF enabling checks? diff --git a/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java b/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java index a78d6cdc0..5ace953db 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java @@ -37,7 +37,7 @@ public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, MessageNode msg = lr.getMessageNodeChild(); MessageId mid = msg.toMessage().getId(); Payload payload = (msg.isMessageSigNode()) // CHECKME: Hacky? - ? ((MessageSigNode) msg).payloads.toPayload() + ? ((MessageSigNode) msg).getPayloadListChild().toPayload() : Payload.EMPTY_PAYLOAD; builder.util.addEdge(builder.util.getEntry(), builder.job.ef.newEReceive(peer, mid, payload), builder.util.getExit()); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java b/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java index b4f49ad9c..95b99e49d 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java @@ -13,6 +13,7 @@ */ package org.scribble.del.local; +import org.scribble.ast.MessageNode; import org.scribble.ast.MessageSigNode; import org.scribble.ast.ScribNode; import org.scribble.ast.local.LRequest; @@ -27,24 +28,28 @@ public class LRequestDel extends LConnectionActionDel implements LSimpleInteractionNodeDel { @Override - public LRequest leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder builder, ScribNode visited) throws ScribbleException + public LRequest leaveEGraphBuilding(ScribNode parent, ScribNode child, + EGraphBuilder builder, ScribNode visited) throws ScribbleException { LRequest lc = (LRequest) visited; - RoleNode dest = lc.dest; + MessageNode msg = lc.getMessageNodeChild(); + RoleNode dest = lc.getDestinationChild(); Role peer = dest.toName(); - MessageId mid = lc.msg.toMessage().getId(); - Payload payload = lc.msg.isMessageSigNode() // Hacky? - ? ((MessageSigNode) lc.msg).payloads.toPayload() + MessageId mid = msg.toMessage().getId(); + Payload payload = msg.isMessageSigNode() // Hacky? + ? ((MessageSigNode) msg).getPayloadListChild().toPayload() : Payload.EMPTY_PAYLOAD; - builder.util.addEdge(builder.util.getEntry(), builder.job.ef.newERequest(peer, mid, payload), builder.util.getExit()); + builder.util.addEdge(builder.util.getEntry(), + builder.job.ef.newERequest(peer, mid, payload), builder.util.getExit()); //graph.builder.addEdge(graph.builder.getEntry(), new Connect(peer), graph.builder.getExit()); ////builder.builder.addEdge(builder.builder.getEntry(), Send.get(peer, mid, payload), builder.builder.getExit()); return (LRequest) super.leaveEGraphBuilding(parent, child, builder, lc); } @Override - public void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) + public void enterProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer) { - fixer.setChoiceSubject(((LRequest) child).src.toName()); + fixer.setChoiceSubject(((LRequest) child).getSourceChild().toName()); } } diff --git a/scribble-core/src/main/java/org/scribble/main/JobContext.java b/scribble-core/src/main/java/org/scribble/main/JobContext.java index e95edf4d2..64aa713aa 100644 --- a/scribble-core/src/main/java/org/scribble/main/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/main/JobContext.java @@ -236,9 +236,12 @@ public SGraph getSGraph(GProtocolName fullname) throws ScribbleException SGraph graph = this.fairSGraphs.get(fullname); if (graph == null) { - GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()).getProtocolDeclChild(fullname.getSimpleName()); - Map egraphs = getEGraphsForSGraphBuilding(fullname, gpd, true); - boolean explicit = gpd.modifiers.contains(GProtocolDecl.Modifiers.EXPLICIT); + GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()) + .getProtocolDeclChild(fullname.getSimpleName()); + Map egraphs = + getEGraphsForSGraphBuilding(fullname, gpd, true); + boolean explicit = + gpd.modifiers.contains(GProtocolDecl.Modifiers.EXPLICIT); //graph = SGraph.buildSGraph(egraphs, explicit, this.job, fullname); graph = this.job.buildSGraph(fullname, egraphs, explicit); addSGraph(fullname, graph); @@ -246,12 +249,15 @@ public SGraph getSGraph(GProtocolName fullname) throws ScribbleException return graph; } - private Map getEGraphsForSGraphBuilding(GProtocolName fullname, GProtocolDecl gpd, boolean fair) throws ScribbleException + private Map getEGraphsForSGraphBuilding(GProtocolName fullname, + GProtocolDecl gpd, boolean fair) throws ScribbleException { Map egraphs = new HashMap<>(); - for (Role self : gpd.header.roledecls.getRoles()) + for (Role self : gpd.getHeaderChild().getRoleDeclListChild().getRoles()) { - egraphs.put(self, fair ? getEGraph(fullname, self) : getUnfairEGraph(fullname, self)); + egraphs.put(self, fair + ? getEGraph(fullname, self) + : getUnfairEGraph(fullname, self)); } return egraphs; } @@ -266,7 +272,8 @@ public SGraph getUnfairSGraph(GProtocolName fullname) throws ScribbleException SGraph graph = this.unfairSGraphs.get(fullname); if (graph == null) { - GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()).getProtocolDeclChild(fullname.getSimpleName()); + GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()) + .getProtocolDeclChild(fullname.getSimpleName()); Map egraphs = getEGraphsForSGraphBuilding(fullname, gpd, false); boolean explicit = gpd.modifiers.contains(GProtocolDecl.Modifiers.EXPLICIT); //graph = SGraph.buildSGraph(this.job, fullname, this.job.createInitialSConfig(job, egraphs, explicit)); @@ -281,14 +288,16 @@ protected void addMinimisedEGraph(LProtocolName fullname, EGraph graph) this.minimisedEGraphs.put(fullname, graph); } - public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) throws ScribbleException + public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) + throws ScribbleException { LProtocolName fulllpn = Projector.projectFullProtocolName(fullname, role); EGraph minimised = this.minimisedEGraphs.get(fulllpn); if (minimised == null) { - String aut = runAut(getEGraph(fullname, role).init.toAut(), fulllpn + ".aut"); + String aut = runAut(getEGraph(fullname, role).init.toAut(), + fulllpn + ".aut"); minimised = new AutParser(this.job).parse(aut); addMinimisedEGraph(fulllpn, minimised); } @@ -309,7 +318,8 @@ private static String runAut(String fsm, String aut) throws ScribbleException try { ScribUtil.writeToFile(tmpName, fsm); - String[] res = ScribUtil.runProcess("ltsconvert", "-ebisim", "-iaut", "-oaut", tmpName); + String[] res = ScribUtil.runProcess("ltsconvert", "-ebisim", "-iaut", + "-oaut", tmpName); if (!res[1].isEmpty()) { throw new RuntimeException(res[1]); diff --git a/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java b/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java index b3744a480..c34e98c22 100644 --- a/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java @@ -39,7 +39,8 @@ // Statically unfolds unguarded recursions and continues "directly under" choices // N.B. cf. UnfoldingVisitor "lazily" unfolds every rec once on demand -public class InlinedProtocolUnfolder extends InlinedProtocolVisitor +public class InlinedProtocolUnfolder + extends InlinedProtocolVisitor { public static final String DUMMY_REC_LABEL = "__"; @@ -93,18 +94,21 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleExcepti { ProtocolDecl pd = (ProtocolDecl) visited; this.job.debugPrintln("\n[DEBUG] Unfolded inlined protocol " - + pd.getFullMemberName(this.job.getContext().getModule(getModuleContext().root)) + ":\n" - + ((ProtocolDefDel) pd.def.del()).getInlinedProtocolDef()); + + pd.getFullMemberName( + this.job.getContext().getModule(getModuleContext().root)) + + ":\n" + ((ProtocolDefDel) pd.getDefChild().del()) + .getInlinedProtocolDef()); } return visited; } } // Not doing the actual unfolding here: replace the rec with a dummy (i.e. alpha the original rec to another unused lab) and will do any actual unfolding inside the recursive child accept (upon Continue) - private ScribNode unfold(Recursion rec) throws ScribbleException + private ScribNode unfold(Recursion rec) + throws ScribbleException { - RecVar rv = rec.recvar.toName(); - ProtocolBlock pb = rec.block; + RecVar rv = rec.getRecVarChild().toName(); + ProtocolBlock pb = rec.getBlockChild(); // Clone unnecessary: can visit the original block, apart from any continues to substitute (done in InteractionSeqDel) this.recsToUnfold.add(rv); /*RecVarNode dummy = (RecVarNode) AstFactoryImpl.FACTORY.SimpleNameNode(RecVarKind.KIND, DUMMY_REC_LABEL); @@ -118,16 +122,19 @@ private ScribNode unfold(Recursion rec) throws Scrib } @Override - protected void inlinedEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected void inlinedEnter(ScribNode parent, ScribNode child) + throws ScribbleException { super.inlinedEnter(parent, child); child.del().enterInlinedProtocolUnfolding(parent, child, this); } @Override - protected ScribNode inlinedLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected ScribNode inlinedLeave(ScribNode parent, ScribNode child, + ScribNode visited) throws ScribbleException { - visited = visited.del().leaveInlinedProtocolUnfolding(parent, child, this, visited); + visited = visited.del().leaveInlinedProtocolUnfolding(parent, child, this, + visited); return super.inlinedLeave(parent, child, visited); } @@ -137,10 +144,12 @@ public Recursion getRecVar(RecVar recvar) } // Maybe possible to revise this algorithm to handle shadowed recs, but currently requires unique recvar names - public void setRecVar(AstFactory af, RecVar recvar, Recursion rec) throws ScribbleException + public void setRecVar(AstFactory af, RecVar recvar, Recursion rec) + throws ScribbleException { - ProtocolBlock block = (ProtocolBlock) rec.getBlockChild().accept(this); - RecVarNode rv = rec.recvar.clone(af); + ProtocolBlock block = (ProtocolBlock) rec.getBlockChild() + .accept(this); + RecVarNode rv = rec.getRecVarChild().clone();//af); Recursion unfolded; if (rec.getKind() == Global.KIND) { diff --git a/scribble-core/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java index 9525e8c88..ec3d9345e 100644 --- a/scribble-core/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java @@ -29,7 +29,8 @@ // Can probably be fully replaced by SubprotocolVisitor // Projector, ReachabilityChecker, etc don't need to be offset visitors -public abstract class OffsetSubprotocolVisitor> extends SubprotocolVisitor +public abstract class OffsetSubprotocolVisitor> + extends SubprotocolVisitor { public OffsetSubprotocolVisitor(Job job) { @@ -40,50 +41,59 @@ public OffsetSubprotocolVisitor(Job job) @Override protected void enterRootProtocolDecl(ProtocolDecl pd) { - Map rolemap = makeRootRoleSubsMap(pd.header.roledecls); - Map, NonRoleArgNode> argmap = makeRootNonRoleSubsMap(pd.header.paramdecls); + Map rolemap = makeRootRoleSubsMap( + pd.getHeaderChild().getRoleDeclListChild()); + Map, NonRoleArgNode> argmap = + makeRootNonRoleSubsMap(pd.getHeaderChild().getParamDeclListChild()); this.rolemaps.push(rolemap); this.argmaps.push(argmap); } @Override - protected final ScribNode visitForSubprotocols(ScribNode parent, ScribNode child) throws ScribbleException + protected final ScribNode visitForSubprotocols(ScribNode parent, + ScribNode child) throws ScribbleException { return visitForOffsetSubprotocols(parent, child); } - protected ScribNode visitForOffsetSubprotocols(ScribNode parent, ScribNode child) throws ScribbleException + protected ScribNode visitForOffsetSubprotocols(ScribNode parent, + ScribNode child) throws ScribbleException { return super.visitForSubprotocols(parent, child); } @Override - protected final void envLeaveProtocolDeclOverride(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected final void envLeaveProtocolDeclOverride(ScribNode parent, + ScribNode child, ScribNode visited) throws ScribbleException { this.rolemaps.pop(); this.argmaps.pop(); } @Override - protected final void subprotocolEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected final void subprotocolEnter(ScribNode parent, ScribNode child) + throws ScribbleException { super.subprotocolEnter(parent, child); offsetSubprotocolEnter(parent, child); } @Override - protected final ScribNode subprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected final ScribNode subprotocolLeave(ScribNode parent, ScribNode child, + ScribNode visited) throws ScribbleException { ScribNode n = offsetSubprotocolLeave(parent, child, visited); return super.subprotocolLeave(parent, child, n); } - protected void offsetSubprotocolEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected void offsetSubprotocolEnter(ScribNode parent, ScribNode child) + throws ScribbleException { } - protected ScribNode offsetSubprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected ScribNode offsetSubprotocolLeave(ScribNode parent, ScribNode child, + ScribNode visited) throws ScribbleException { return visited; } diff --git a/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java b/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java index 6c4679b84..b0de55308 100644 --- a/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java +++ b/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java @@ -62,7 +62,7 @@ public void removeSubprotocolRecVar(SubprotocolSig subsig) private String newSubprotocoolRecVarId(SubprotocolSig sig) { - // Hacky + // TODO: Hacky, reconsider return sig.toString() .replace('.', '_') .replace('<', '_') @@ -89,7 +89,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleExcepti ProtocolDecl pd = (ProtocolDecl) visited; this.job.debugPrintln("\n[DEBUG] Inlined root protocol " + pd.getFullMemberName(this.job.getContext().getModule(getModuleContext().root)) + ":\n" - + ((ProtocolDefDel) pd.def.del()).getInlinedProtocolDef()); + + ((ProtocolDefDel) pd.getDefChild().del()).getInlinedProtocolDef()); } return leave(parent, child, visited); } @@ -120,8 +120,11 @@ protected Do visitOverrideForDo(InteractionSeq parent, Do child) throws // Duplicated from SubprotocolVisitor#visitOverrideFoDo and modified to access discarded env -- FIXME: factor out this facility better JobContext jc = this.job.getContext(); ModuleContext mc = getModuleContext(); - ProtocolDecl pd = child.getTargetProtocolDecl(jc, mc); - ScribNode seq = applySubstitutions(pd.def.block.seq.clone(this.job.af)); + ProtocolDecl pd = + child.getTargetProtocolDecl(jc, mc); + ScribNode seq = applySubstitutions( + pd.getDefChild().getBlockChild().getInteractSeqChild().clone()); + //this.job.af)); seq = seq.accept(this); pushEnv(popEnv().setTranslation(((InlineProtocolEnv) seq.del().env()).getTranslation())); return child; @@ -134,14 +137,16 @@ protected Do visitOverrideForDo(InteractionSeq parent, Do child) throws } @Override - protected void subprotocolEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected void subprotocolEnter(ScribNode parent, ScribNode child) + throws ScribbleException { super.subprotocolEnter(parent, child); child.del().enterProtocolInlining(parent, child, this); } @Override - protected ScribNode subprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected ScribNode subprotocolLeave(ScribNode parent, ScribNode child, + ScribNode visited) throws ScribbleException { visited = visited.del().leaveProtocolInlining(parent, child, this, visited); return super.subprotocolLeave(parent, child, visited); diff --git a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java index 8189bca6b..94a231cfa 100644 --- a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java @@ -225,7 +225,7 @@ private void enterSubprotocol(Do doo) doo.getProtocolNameNode().toName()); // namedisamb should already have converted proto to the fullname -- in order for inlining to work pushSubprotocolSig(fullname, doo.getRoleListChild().getRoles(), - doo.getArgListChild().getArguments()); + doo.getNonRoleListChild().getArguments()); pushNameMaps(fullname, doo); } @@ -252,7 +252,7 @@ private void pushNameMaps(ProtocolName fullname, Do doo) this.rolemaps.push(makeRoleSubsMap(this.rolemaps.get(0), doo.getRoleListChild(), hdr.getRoleDeclListChild())); this.argmaps.push(makeNonRoleSubsMap(this.argmaps.get(0), - doo.getArgListChild(), hdr.getParamDeclListChild())); + doo.getNonRoleListChild(), hdr.getParamDeclListChild())); } public boolean isRootedCycle() diff --git a/scribble-core/src/main/java/org/scribble/visit/Substitutor.java b/scribble-core/src/main/java/org/scribble/visit/Substitutor.java index 0d12d04c0..b77f900ae 100644 --- a/scribble-core/src/main/java/org/scribble/visit/Substitutor.java +++ b/scribble-core/src/main/java/org/scribble/visit/Substitutor.java @@ -31,7 +31,8 @@ public class Substitutor extends AstVisitor private final Map rolemap; private final Map, NonRoleArgNode> argmap; - public Substitutor(Job job, Map rolemap, Map, NonRoleArgNode> argmap) + public Substitutor(Job job, Map rolemap, + Map, NonRoleArgNode> argmap) { super(job); this.rolemap = rolemap; @@ -39,18 +40,21 @@ public Substitutor(Job job, Map rolemap, Map arg) + public NonRoleArgNode getArgumentSubstitution( + Arg arg) { - return (NonRoleArgNode) this.argmap.get(arg).clone(this.job.af); // Makes new dels that will be discarded in NonRoleParamNode (just as calling the factory manually would) + return (NonRoleArgNode) this.argmap.get(arg).clone();//this.job.af); + // Makes new dels that will be discarded in NonRoleParamNode (just as calling the factory manually would) } } diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java index f1e3306ac..85a9c950c 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java @@ -31,7 +31,7 @@ // Basically infers all local choice subject candidates: if *none* are found for a given "choice-unguarded" do-call then the call is pruned (along with parent block and choice as necessary) // i.e. prune if no choice subject candidates, because that means (passive) role is never enabled and thus not involved -// FIXME: ambiguous choice subject (i.e. > 1 candidate) is checked subsequently by ProjectedChoiceSubjectFixer -- should be better integrated (e.g. reuse ChoiceUnguardedSubprotocolChecker, rather than adhoc LInteractionNode.inferLocalChoiceSubject) -- NOTE: but cannot do all pruning and fixing in one pass, as fixing the subject roles here will interfere with the pruning algorithm (currently it looks for dummy role choices) +// TODO: ambiguous choice subject (i.e. > 1 candidate) is checked subsequently by ProjectedChoiceSubjectFixer -- should be better integrated (e.g. reuse ChoiceUnguardedSubprotocolChecker, rather than adhoc LInteractionNode.inferLocalChoiceSubject) -- NOTE: but cannot do all pruning and fixing in one pass, as fixing the subject roles here will interfere with the pruning algorithm (currently it looks for dummy role choices) public class ProjectedChoiceDoPruner extends ModuleContextVisitor { public ProjectedChoiceDoPruner(Job job) @@ -63,8 +63,9 @@ public ScribNode visit(ScribNode parent, ScribNode child) UnguardedChoiceDoProjectionChecker checker = new UnguardedChoiceDoProjectionChecker( this.job, - ((ModuleDel) jc.getModule(ld.proto.toName().getPrefix()).del()) - .getModuleContext(), + ((ModuleDel) jc + .getModule(ld.getProtocolNameNode().toName().getPrefix()).del()) + .getModuleContext(), lc); lpd.accept(checker); diff --git a/scribble-core/src/main/java/org/scribble/visit/context/Projector.java b/scribble-core/src/main/java/org/scribble/visit/context/Projector.java index ee5d01c58..ceb597ffb 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/Projector.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/Projector.java @@ -51,19 +51,22 @@ public Projector(Job job) } @Override - protected ProjectionEnv makeRootProtocolDeclEnv(ProtocolDecl pd) + protected ProjectionEnv makeRootProtocolDeclEnv( + ProtocolDecl pd) { return new ProjectionEnv(); } @Override - public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleException + public ScribNode visit(ScribNode parent, ScribNode child) + throws ScribbleException { // "Override" SubprotocolVisitor visitChildrenInSubprotocols pattern, avoids adding visitForProjection to every ModelNode // Or else need to build in a "visit override" mechanism into the parent visitors if (child instanceof GProtocolDecl) { - return visitOverrideForGProtocolDecl((Module) parent, (GProtocolDecl) child); + return visitOverrideForGProtocolDecl((Module) parent, + (GProtocolDecl) child); } else { @@ -73,9 +76,10 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleExcepti // Projector uses this to "override" the base SubprotocolVisitor visitChildrenInSubprotocols pattern // Better to be in the visitor than in the del for visibility of visitor enter/leave -- also localises special visiting pattern inside the visitor, while keeping the del enter/leave methods uniform (e.g. GlobalProtocolDeclDelegate enter/leave relies on the same peekSelf API as for other nodes) - protected GProtocolDecl visitOverrideForGProtocolDecl(Module parent, GProtocolDecl child) throws ScribbleException + protected GProtocolDecl visitOverrideForGProtocolDecl(Module parent, + GProtocolDecl child) throws ScribbleException { - for (Role self : child.header.roledecls.getRoles()) + for (Role self : child.getRoles()) { pushSelf(self); enter(parent, child); @@ -87,14 +91,16 @@ protected GProtocolDecl visitOverrideForGProtocolDecl(Module parent, GProtocolDe } @Override - protected final void envEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected final void envEnter(ScribNode parent, ScribNode child) + throws ScribbleException { super.envEnter(parent, child); child.del().enterProjection(parent, child, this); } @Override - protected ScribNode envLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected ScribNode envLeave(ScribNode parent, ScribNode child, + ScribNode visited) throws ScribbleException { visited = visited.del().leaveProjection(parent, child, this, visited); return super.envLeave(parent, child, visited); @@ -132,42 +138,70 @@ public Map> getProjections() return this.projections; } - public static LProtocolName projectSimpleProtocolName(GProtocolName simpname, Role role) + public static LProtocolName projectSimpleProtocolName(GProtocolName simpname, + Role role) { return new LProtocolName(simpname.toString() + "_" + role.toString()); } // Role is the target subprotocol parameter (not the current projector self -- actually the self just popped) - public static LProtocolName projectFullProtocolName(GProtocolName fullname, Role role) + public static LProtocolName projectFullProtocolName(GProtocolName fullname, + Role role) { - LProtocolName simplename = projectSimpleProtocolName(fullname.getSimpleName(), role); + LProtocolName simplename = projectSimpleProtocolName( + fullname.getSimpleName(), role); ModuleName modname = projectModuleName(fullname.getPrefix(), simplename); return new LProtocolName(modname, simplename); } // fullname is the un-projected name; localname is the already projected simple name - public static ModuleName projectModuleName(ModuleName fullname, LProtocolName localname) + public static ModuleName projectModuleName(ModuleName fullname, + LProtocolName localname) { - ModuleName simpname = new ModuleName(fullname.getSimpleName().toString() + "_" + localname.toString()); - return new ModuleName(fullname.getPrefix(), simpname); // Supports unary fullname + ModuleName simpname = new ModuleName( + fullname.getSimpleName().toString() + "_" + localname.toString()); + return new ModuleName(fullname.getPrefix(), simpname); // Supports unary + // fullname } - public static LProtocolNameNode makeProjectedSimpleNameNode(AstFactory af, CommonTree source, GProtocolName simpname, Role role) + public static LProtocolNameNode makeProjectedSimpleNameNode(AstFactory af, + CommonTree source, GProtocolName simpname, Role role) { - return (LProtocolNameNode) af.QualifiedNameNode(source, Local.KIND, projectSimpleProtocolName(simpname, role).toString()); + return (LProtocolNameNode) af.QualifiedNameNode(source, Local.KIND, + projectSimpleProtocolName(simpname, role).toString()); } - public static LProtocolNameNode makeProjectedFullNameNode(AstFactory af, CommonTree source, GProtocolName fullname, Role role) + public static LProtocolNameNode makeProjectedFullNameNode(AstFactory af, + CommonTree source, GProtocolName fullname, Role role) { - return (LProtocolNameNode) af.QualifiedNameNode(source, Local.KIND, projectFullProtocolName(fullname, role).getElements()); + return (LProtocolNameNode) af.QualifiedNameNode(source, Local.KIND, + projectFullProtocolName(fullname, role).getElements()); } // fullname is the un-projected name; localname is the already projected simple name - public static ModuleNameNode makeProjectedModuleNameNode(AstFactory af, CommonTree source, ModuleName fullname, LProtocolName localname) + public static ModuleNameNode makeProjectedModuleNameNode(AstFactory af, + CommonTree source, ModuleName fullname, LProtocolName localname) { - return (ModuleNameNode) af.QualifiedNameNode(source, ModuleKind.KIND, projectModuleName(fullname, localname).getElements()); + return (ModuleNameNode) af.QualifiedNameNode(source, ModuleKind.KIND, + projectModuleName(fullname, localname).getElements()); } + + + + + + + + + + + + + + + + // Returns true if should ignore for projection /*public static boolean prune(LProtocolBlock block) { diff --git a/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java b/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java index 63fc803cb..544e804c7 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java @@ -28,15 +28,17 @@ import org.scribble.visit.SubprotocolVisitor; import org.scribble.visit.context.env.UnguardedChoiceDoEnv; -// FIXME: refactor as a choice subject candidate collector (i.e. NameCollector -- thought that is an OffsetSubprotocolCollector, does that make a difference?) -public class UnguardedChoiceDoProjectionChecker extends SubprotocolVisitor +// TODO: refactor as a choice subject candidate collector (i.e. NameCollector -- thought that is an OffsetSubprotocolCollector, does that make a difference?) +public class UnguardedChoiceDoProjectionChecker + extends SubprotocolVisitor //public class ChoiceUnguardedSubprotocolChecker extends NoEnvSubprotocolVisitor { //private final LChoice cho; // Useless: subprotocovisitor visits a role-substituted clone private boolean shouldPrune = false; // OK here, or reinstant in env? - public UnguardedChoiceDoProjectionChecker(Job job, ModuleContext mcontext, LChoice cho) + public UnguardedChoiceDoProjectionChecker(Job job, ModuleContext mcontext, + LChoice cho) { super(job); setModuleContext(mcontext); @@ -53,13 +55,15 @@ public boolean shouldCheckPrune() } @Override - protected UnguardedChoiceDoEnv makeRootProtocolDeclEnv(ProtocolDecl pd) + protected UnguardedChoiceDoEnv makeRootProtocolDeclEnv( + ProtocolDecl pd) { return new UnguardedChoiceDoEnv(); } @Override - public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleException + public ScribNode visit(ScribNode parent, ScribNode child) + throws ScribbleException { if (child instanceof LChoice) { @@ -69,16 +73,22 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleExcepti return super.visit(parent, child); } - private ScribNode visitOverrideForLDoPruning(ScribNode parent, LChoice lc) throws ScribbleException + private ScribNode visitOverrideForLDoPruning(ScribNode parent, LChoice lc) + throws ScribbleException { for (LProtocolBlock b : lc.getBlockChildren()) { - LInteractionNode in = b.getInteractSeqChild().getInteractNodeChildren().get(0); + LInteractionNode in = + b.getInteractSeqChild().getInteractNodeChildren().get(0); if (in instanceof LDo) { LDo ld = (LDo) in; - ProtocolName fullname = getModuleContext().checkProtocolDeclDependencyFullName(ld.proto.toName()); - SubprotocolSig sig = new SubprotocolSig(fullname, ld.roles.getRoles(), ld.args.getArguments()); + ProtocolName fullname = getModuleContext() + .checkProtocolDeclDependencyFullName( + ld.getProtocolNameNode().toName()); + SubprotocolSig sig = new SubprotocolSig(fullname, + ld.getRoleListChild().getRoles(), + ld.getNonRoleListChild().getArguments()); if (sig.equals(getStack().get(0))) // Cf. SubprotocolVisitor.isRootedCycle { @@ -101,16 +111,19 @@ private ScribNode visitOverrideForLDoPruning(ScribNode parent, LChoice lc) throw } @Override - protected void subprotocolEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected void subprotocolEnter(ScribNode parent, ScribNode child) + throws ScribbleException { super.subprotocolEnter(parent, child); child.del().enterUnguardedChoiceDoProjectionCheck(parent, child, this); } @Override - protected ScribNode subprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected ScribNode subprotocolLeave(ScribNode parent, ScribNode child, + ScribNode visited) throws ScribbleException { - visited = visited.del().leaveUnguardedChoiceDoProjectionCheck(parent, child, this, visited); + visited = visited.del().leaveUnguardedChoiceDoProjectionCheck(parent, child, + this, visited); return super.subprotocolLeave(parent, child, visited); } } diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java b/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java index de4de810b..067f708bd 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java @@ -25,8 +25,9 @@ import org.scribble.visit.SubprotocolVisitor; import org.scribble.visit.wf.env.ExplicitCorrelationEnv; -//public class ExplicitCorrelationChecker extends InlinedProtocolVisitor -public class ExplicitCorrelationChecker extends SubprotocolVisitor // Need to follow /unfolded/ subprotos (inlined is already unfolded by context building when this pass is run) +public class ExplicitCorrelationChecker + extends SubprotocolVisitor + // Need to follow /unfolded/ subprotos (inlined is already unfolded by context building when this pass is run) { public ExplicitCorrelationChecker(Job job) { @@ -35,7 +36,8 @@ public ExplicitCorrelationChecker(Job job) @Override - public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleException + public ScribNode visit(ScribNode parent, ScribNode child) + throws ScribbleException { if (child instanceof GProtocolDecl) { @@ -44,7 +46,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleExcepti { Module mod = (Module) parent; GProtocolName gpn = gpd.getFullMemberName(mod); - for (Role r : gpd.header.roledecls.getRoles()) + for (Role r : gpd.getHeaderChild().getRoleDeclListChild().getRoles()) { Module proj = this.job.getContext().getProjection(gpn, r); proj.accept(this); @@ -56,25 +58,24 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleExcepti } @Override - //public void inlinedEnter(ScribNode parent, ScribNode child) throws ScribbleException - public void subprotocolEnter(ScribNode parent, ScribNode child) throws ScribbleException + public void subprotocolEnter(ScribNode parent, ScribNode child) + throws ScribbleException { - //super.inlinedEnter(parent, child); super.subprotocolEnter(parent, child); child.del().enterExplicitCorrelationCheck(parent, child, this); } @Override - //public ScribNode inlinedLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException - public ScribNode subprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + public ScribNode subprotocolLeave(ScribNode parent, ScribNode child, + ScribNode visited) throws ScribbleException { visited = visited.del().leaveExplicitCorrelationCheck(parent, child, this, visited); - //return super.inlinedLeave(parent, child, visited); return super.subprotocolLeave(parent, child, visited); } @Override - protected ExplicitCorrelationEnv makeRootProtocolDeclEnv(ProtocolDecl pd) + protected ExplicitCorrelationEnv makeRootProtocolDeclEnv( + ProtocolDecl pd) { return new ExplicitCorrelationEnv(); } diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java b/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java index 5d5420ba7..709547605 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java @@ -42,14 +42,18 @@ public WFChoiceChecker(Job job) } @Override - protected WFChoiceEnv makeRootProtocolDeclEnv(ProtocolDecl pd) + protected WFChoiceEnv makeRootProtocolDeclEnv( + ProtocolDecl pd) { - return new WFChoiceEnv(new HashSet<>(pd.header.roledecls.getRoles()), - !(pd.isGlobal() && ((GProtocolDecl) pd).modifiers.contains(GProtocolDecl.Modifiers.EXPLICIT))); // FIXME: consider locals; also, explicit modifier should be carried over to local projections + return new WFChoiceEnv(new HashSet<>(pd.getRoles()), + !(pd.isGlobal() && ((GProtocolDecl) pd).modifiers + .contains(GProtocolDecl.Modifiers.EXPLICIT))); + // FIXME: consider locals; also, explicit modifier should be carried over to local projections } @Override - public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleException + public ScribNode visit(ScribNode parent, ScribNode child) + throws ScribbleException { if (child instanceof GProtocolDecl) { @@ -64,13 +68,15 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleExcepti { if (child instanceof Choice) // Only needed for old WF (for distinct enabling message checking) // FIXME: maybe move connectedness checking to a separate pass, i.e. vanilla UnfoldingVisitor (if retained as syntactic check) { - return visitOverrideForChoice((InteractionSeq) parent, (Choice) child); + return visitOverrideForChoice((InteractionSeq) parent, + (Choice) child); } } return super.visit(parent, child); } - private ScribNode visitOverrideForChoice(InteractionSeq parent, Choice child) throws ScribbleException + private ScribNode visitOverrideForChoice(InteractionSeq parent, + Choice child) throws ScribbleException { if (child instanceof Choice) { @@ -95,16 +101,19 @@ private ScribNode visitOverrideForChoice(InteractionSeq parent, Choice chi } @Override - protected void unfoldingEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected void unfoldingEnter(ScribNode parent, ScribNode child) + throws ScribbleException { super.unfoldingEnter(parent, child); child.del().enterInlinedWFChoiceCheck(parent, child, this); } @Override - protected ScribNode unfoldingLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected ScribNode unfoldingLeave(ScribNode parent, ScribNode child, + ScribNode visited) throws ScribbleException { - visited = visited.del().leaveInlinedWFChoiceCheck(parent, child, this, visited); + visited = visited.del().leaveInlinedWFChoiceCheck(parent, child, this, + visited); return super.unfoldingLeave(parent, child, visited); } } From 35f92fe9e40f9973bf23032997787871173a1bd8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 29 Jan 2019 19:11:16 +0000 Subject: [PATCH 083/539] Continued WIP. --- .../java/sessionapi/SessionApiGenerator.java | 2 +- .../org/scribble/ast/PayloadElemList.java | 1 - .../java/org/scribble/ast/ProtocolBlock.java | 2 +- .../java/org/scribble/ast/ProtocolHeader.java | 3 +- .../org/scribble/ast/global/GProtocolDef.java | 22 ++++---- .../org/scribble/ast/local/LProtocolDecl.java | 23 +++++--- .../scribble/ast/local/LProtocolHeader.java | 21 +++++--- .../org/scribble/del/MessageTransferDel.java | 54 +++++++++++++------ .../org/scribble/del/NonRoleArgListDel.java | 2 +- .../java/org/scribble/del/RecursionDel.java | 38 +++++++------ .../org/scribble/del/global/GChoiceDel.java | 2 +- .../del/global/GInteractionSeqDel.java | 27 ++++++---- .../del/global/GMessageTransferDel.java | 33 ++++++++---- .../del/global/GProtocolBlockDel.java | 15 ++++-- .../scribble/del/global/GProtocolDefDel.java | 26 +++++---- .../scribble/del/global/GRecursionDel.java | 40 ++++++++++---- .../org/scribble/del/global/GWrapDel.java | 39 +++++++++----- .../org/scribble/del/local/LAcceptDel.java | 33 +++++++----- .../del/local/LInteractionSeqDel.java | 41 ++++++++------ .../del/local/LProjectionDeclDel.java | 26 +++++---- .../scribble/del/local/LProtocolBlockDel.java | 17 ++++-- .../scribble/del/local/LProtocolDefDel.java | 17 +++--- .../org/scribble/del/local/LRecursionDel.java | 51 +++++++++++------- .../java/org/scribble/del/local/LSendDel.java | 20 ++++--- .../scribble/del/local/LWrapClientDel.java | 17 +++--- .../scribble/del/local/LWrapServerDel.java | 22 +++++--- .../parser/scribble/AntlrToScribParser.java | 7 +-- .../parser/scribble/ast/AntlrModuleDecl.java | 4 +- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 29 files changed, 398 insertions(+), 209 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index adb35742d..0af47cbae 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -200,7 +200,7 @@ private void constructRoleClasses() throws ScribbleException Module mod = this.job.getContext().getModule(this.gpn.getPrefix()); GProtocolName simpname = this.gpn.getSimpleName(); GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDeclChild(simpname); - for (Role r : gpd.header.roledecls.getRoles()) + for (Role r : gpd.getRoles()) { //constructRoleClass(this.cb.newClass(), r); //constructRoleClass(new ClassBuilder(), getEndpointApiRootPackageName(this.gpn), r); diff --git a/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java b/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java index 30bd0e2df..c41dc9036 100644 --- a/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java +++ b/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java @@ -23,7 +23,6 @@ import org.scribble.main.ScribbleException; import org.scribble.type.Payload; import org.scribble.type.name.PayloadElemType; -import org.scribble.util.ScribUtil; import org.scribble.visit.AstVisitor; // Cf. DoArgList, but here we don't need as much abstraction (cf. RoleArgList, NonRoleArgList) diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java index 34f86b253..30a5b5431 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java @@ -21,7 +21,7 @@ import org.scribble.visit.AstVisitor; public abstract class ProtocolBlock - extends CompoundInteraction implements ProtocolKindNode + extends CompoundInteraction implements ProtocolKindNode { // ScribTreeAdaptor#create constructor public ProtocolBlock(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java index b86c1973d..21535cf3c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java @@ -59,7 +59,8 @@ public NonRoleParamDeclList getParamDeclListChild() return (NonRoleParamDeclList) getChild(2); } - public ProtocolHeader reconstruct(ProtocolNameNode name, RoleDeclList rdl, NonRoleParamDeclList pdl) + public ProtocolHeader reconstruct(ProtocolNameNode name, + RoleDeclList rdl, NonRoleParamDeclList pdl) { ProtocolHeader pd = dupNode(); ScribDel del = del(); diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDef.java b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDef.java index 59c9697b4..901b4f36f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDef.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDef.java @@ -15,8 +15,12 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; import org.scribble.ast.ProtocolDef; +import org.scribble.ast.local.LProtocolBlock; +import org.scribble.ast.local.LProtocolDef; import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; public class GProtocolDef extends ProtocolDef implements GNode { @@ -31,6 +35,12 @@ protected GProtocolDef(GProtocolDef node) { super(node); } + + @Override + public GProtocolBlock getBlockChild() + { + return (GProtocolBlock) getChild(0); + } @Override public GProtocolDef dupNode() @@ -38,10 +48,10 @@ public GProtocolDef dupNode() return new GProtocolDef(this); } - @Override - public GProtocolBlock getBlockChild() + public LProtocolDef project(AstFactory af, Role self, LProtocolBlock block) { - return (GProtocolBlock) getChild(0); + LProtocolDef projection = af.LProtocolDef(this.source, block); + return projection; } @@ -65,12 +75,6 @@ protected GProtocolDef copy() { return new GProtocolDef(this.source, getBlock()); } - - public LProtocolDef project(AstFactory af, Role self, LProtocolBlock block) - { - LProtocolDef projection = af.LProtocolDef(this.source, block); - return projection; - } @Override public GProtocolDef clone(AstFactory af) diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDecl.java index 109ef7505..20cbd8695 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDecl.java @@ -19,6 +19,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.ProtocolDef; +import org.scribble.ast.ProtocolHeader; import org.scribble.type.kind.Local; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.ModuleName; @@ -39,13 +41,6 @@ protected LProtocolDecl(LProtocolDecl node) super(node); } - // Cf. CommonTree#dupNode - @Override - public LProtocolDecl dupNode() - { - return new LProtocolDecl(this); - } - @Override public LProtocolHeader getHeaderChild() { @@ -58,6 +53,20 @@ public LProtocolDef getDefChild() return (LProtocolDef) getChild(1); } + // Cf. CommonTree#dupNode + @Override + public LProtocolDecl dupNode() + { + return new LProtocolDecl(this); + } + + @Override + public LProtocolDecl reconstruct(ProtocolHeader header, + ProtocolDef def) + { + return (LProtocolDecl) super.reconstruct(header, def); + } + @Override public LProtocolName getFullMemberName(Module mod) { diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolHeader.java b/scribble-core/src/main/java/org/scribble/ast/local/LProtocolHeader.java index 9d79f7c38..7ad9fc074 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolHeader.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LProtocolHeader.java @@ -22,6 +22,7 @@ import org.scribble.ast.RoleDecl; import org.scribble.ast.RoleDeclList; import org.scribble.ast.name.qualified.LProtocolNameNode; +import org.scribble.ast.name.qualified.ProtocolNameNode; import org.scribble.type.kind.Local; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.LProtocolName; @@ -40,12 +41,26 @@ protected LProtocolHeader(LProtocolHeader node) { super(node); } + + @Override + public LProtocolNameNode getNameNodeChild() + { + return (LProtocolNameNode) getNameNodeChild(); + } + @Override public LProtocolHeader dupNode() { return new LProtocolHeader(this); } + @Override + public LProtocolHeader reconstruct(ProtocolNameNode name, + RoleDeclList rdl, NonRoleParamDeclList pdl) + { + return (LProtocolHeader) super.reconstruct(name, rdl, pdl); + } + public Role getSelfRole() { RoleDeclList rdl = getRoleDeclListChild(); @@ -59,12 +74,6 @@ public Role getSelfRole() } throw new RuntimeException("Shouldn't get here: " + rdl); } - - @Override - public LProtocolNameNode getNameNodeChild() - { - return (LProtocolNameNode) getNameNodeChild(); - } @Override public LProtocolName getDeclName() diff --git a/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java b/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java index c5266040d..b8c10b7ff 100644 --- a/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java +++ b/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java @@ -14,6 +14,7 @@ package org.scribble.del; +import org.scribble.ast.MessageNode; import org.scribble.ast.MessageSigNode; import org.scribble.ast.MessageTransfer; import org.scribble.ast.PayloadElem; @@ -37,10 +38,12 @@ public MessageTransferDel() } @Override - public MessageTransfer leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public MessageTransfer leaveProtocolInlining(ScribNode parent, + ScribNode child, ProtocolDefInliner inl, ScribNode visited) + throws ScribbleException { MessageTransfer lr = (MessageTransfer) visited; - MessageTransfer inlined = (MessageTransfer) lr.clone(inl.job.af); + MessageTransfer inlined = (MessageTransfer) lr.clone();//inl.job.af); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (MessageTransfer) super.leaveProtocolInlining(parent, child, inl, lr); } @@ -54,7 +57,8 @@ public void enterChoiceUnguardedSubprotocolCheck(ScribNode parent, ScribNode chi }*/ @Override - public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf) throws ScribbleException + public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, + InlinedProtocolUnfolder unf) throws ScribbleException { UnfoldingEnv env = unf.popEnv(); env = env.disableUnfold(); @@ -62,46 +66,66 @@ public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, Inl } @Override - public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, RoleCollector coll, ScribNode visited) + public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, + RoleCollector coll, ScribNode visited) { MessageTransfer mt = (MessageTransfer) visited; - coll.addName(mt.src.toName()); - mt.getDestinationRoles().stream().forEach((rd) -> coll.addName(rd)); + coll.addName(mt.getSourceChild().toName()); + mt.getDestinationRoles().stream().forEach(rd -> coll.addName(rd)); return visited; } @Override - public ScribNode leaveMessageIdCollection(ScribNode parent, ScribNode child, MessageIdCollector coll, ScribNode visited) + public ScribNode leaveMessageIdCollection(ScribNode parent, ScribNode child, + MessageIdCollector coll, ScribNode visited) { MessageTransfer mt = (MessageTransfer) visited; - if (mt.msg.isMessageSigNode() || mt.msg.isMessageSigNameNode()) + MessageNode msg = mt.getMessageNodeChild(); + if (msg.isMessageSigNode() || msg.isMessageSigNameNode()) { - coll.addName((MessageId) mt.msg.toMessage().getId()); + coll.addName((MessageId) msg.toMessage().getId()); } else { - throw new RuntimeException("Shouldn't get in here: " + mt.msg); + throw new RuntimeException("Shouldn't get in here: " + msg); } return visited; } @Override - public MessageTransfer leaveProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) throws ScribbleException + public MessageTransfer leaveProtocolDeclContextBuilding(ScribNode parent, + ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) + throws ScribbleException { MessageTransfer mt = (MessageTransfer) visited; - if (mt.msg.isMessageSigNode()) + MessageNode msg = mt.getMessageNodeChild(); + if (msg.isMessageSigNode()) { - for (PayloadElem pe : ((MessageSigNode) mt.msg).payloads.getElementChildren()) + for (PayloadElem pe : ((MessageSigNode) msg).getPayloadListChild() + .getElementChildren()) { - if (pe.isGlobalDelegationElem()) // FIXME: should always be GMessageTransfer + if (pe.isGlobalDelegationElem()) // TODO: should always be GMessageTransfer { - ((GDelegationElemDel) pe.del()).leaveMessageTransferInProtocolDeclContextBuilding(mt, (GDelegationElem) pe, builder); + ((GDelegationElemDel) pe.del()) + .leaveMessageTransferInProtocolDeclContextBuilding(mt, + (GDelegationElem) pe, builder); } } } return mt; } + + + + + + + + + + + /*@Override public ScribNode leaveEnablingMessageCollection(ScribNode parent, ScribNode child, EnablingMessageCollector coll, ScribNode visited) { diff --git a/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java b/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java index f4207f40a..1a2713722 100644 --- a/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java @@ -46,7 +46,7 @@ public NonRoleArgList leaveDisambiguation(ScribNode parent, ScribNode child, Nam ProtocolDecl pd = getTargetProtocolDecl((Do) parent, disamb); Iterator args = nral.getArgChildren().iterator(); - for (NonRoleParamDecl param : pd.getHeaderChild().paramdecls + for (NonRoleParamDecl param : pd.getHeaderChild().getParamDeclListChild() .getParamDeclChildren()) { NonRoleParamKind kind = param.kind; diff --git a/scribble-core/src/main/java/org/scribble/del/RecursionDel.java b/scribble-core/src/main/java/org/scribble/del/RecursionDel.java index 938d918ca..94972d55c 100644 --- a/scribble-core/src/main/java/org/scribble/del/RecursionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/RecursionDel.java @@ -31,10 +31,11 @@ public RecursionDel() } @Override - public void enterDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb) throws ScribbleException + public void enterDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb) throws ScribbleException { Recursion rec = (Recursion) child; - RecVar rv = rec.recvar.toName(); + RecVar rv = rec.getRecVarChild().toName(); /*if (disamb.isBoundRecVar(rv)) { throw new ScribbleException("Rec variable shadowing not currently allowed: " + rv); @@ -45,49 +46,55 @@ public void enterDisambiguation(ScribNode parent, ScribNode child, NameDisambigu } @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb, ScribNode visited) throws ScribbleException { Recursion rec = (Recursion) visited; /*RecVar rv = rec.recvar.toName(); disamb.popRecVar(rv);*/ - RecVar rv = ((Recursion) child).recvar.toName(); // visited may be already name mangled // Not any more (refactored to inlining) + RecVar rv = ((Recursion) child).getRecVarChild().toName(); // visited may be already name mangled // Not any more (refactored to inlining) disamb.popRecVar(rv); return rec; } @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inliner) throws ScribbleException + public void enterProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inliner) throws ScribbleException { super.enterProtocolInlining(parent, child, inliner); Recursion rec = (Recursion) child; - inliner.pushRecVar(rec.recvar.toName()); + inliner.pushRecVar(rec.getRecVarChild().toName()); } @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inliner, ScribNode visited) throws ScribbleException + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inliner, ScribNode visited) throws ScribbleException { //Recursion rec = (Recursion) visited; - RecVar origRV = ((Recursion) child).recvar.toName(); // visited may be already name mangled + RecVar origRV = ((Recursion) child).getRecVarChild().toName(); // visited may be already name mangled inliner.popRecVar(origRV); return super.leaveProtocolInlining(parent, child, inliner, visited); } @Override - public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf) throws ScribbleException + public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, + InlinedProtocolUnfolder unf) throws ScribbleException { super.enterInlinedProtocolUnfolding(parent, child, unf); Recursion lr = (Recursion) child; - RecVar recvar = lr.recvar.toName(); + RecVar recvar = lr.getRecVarChild().toName(); unf.setRecVar(unf.job.af, recvar, lr); // Cloned on use (on continue) } @Override - public Recursion leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) throws ScribbleException + public Recursion leaveInlinedProtocolUnfolding(ScribNode parent, + ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) + throws ScribbleException { Recursion rec = (Recursion) visited; - RecVar recvar = rec.recvar.toName(); + RecVar recvar = rec.getRecVarChild().toName(); unf.removeRecVar(recvar); - UnfoldingEnv merged = unf.popEnv().mergeContext((UnfoldingEnv) rec.block.del().env()); + UnfoldingEnv merged = unf.popEnv().mergeContext((UnfoldingEnv) rec.getBlockChild().del().env()); unf.pushEnv(merged); return (Recursion) super.leaveInlinedProtocolUnfolding(parent, child, unf, rec); } @@ -99,8 +106,9 @@ public void enterChoiceUnguardedSubprotocolCheck(ScribNode parent, ScribNode chi }*/ @Override - public void enterRecVarCollection(ScribNode parent, ScribNode child, RecVarCollector coll) + public void enterRecVarCollection(ScribNode parent, ScribNode child, + RecVarCollector coll) { - coll.addName(((Recursion) child).recvar.toName()); + coll.addName(((Recursion) child).getRecVarChild().toName()); } } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java index 6a5e6c07d..530eb51e8 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -47,7 +47,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, .map(b -> (GProtocolBlock) ((InlineProtocolEnv) b.del().env()) .getTranslation()) .collect(Collectors.toList()); - RoleNode subj = gc.getSubjectChild().clone(inl.job.af); + RoleNode subj = gc.getSubjectChild().clone();//inl.job.af); GChoice inlined = inl.job.af.GChoice(gc.getSource(), subj, blocks); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (GChoice) super.leaveProtocolInlining(parent, child, inl, gc); diff --git a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java b/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java index 6b42bbc6d..05aaef1e3 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java @@ -38,7 +38,8 @@ public class GInteractionSeqDel extends InteractionSeqDel { // enter in super @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { GInteractionSeq gis = (GInteractionSeq) visited; List gins = new LinkedList(); @@ -60,13 +61,15 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, Protoc } @Override - public void enterProjection(ScribNode parent, ScribNode child, Projector proj) throws ScribbleException + public void enterProjection(ScribNode parent, ScribNode child, Projector proj) + throws ScribbleException { ScribDelBase.pushVisitorEnv(this, proj); // Unlike WF-choice and Reachability, Projection uses an Env for InteractionSequences } @Override - public GInteractionSeq leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException + public GInteractionSeq leaveProjection(ScribNode parent, ScribNode child, + Projector proj, ScribNode visited) throws ScribbleException { GInteractionSeq gis = (GInteractionSeq) visited; List lis = new LinkedList<>(); @@ -74,7 +77,7 @@ public GInteractionSeq leaveProjection(ScribNode parent, ScribNode child, Projec { LNode ln = (LNode) ((ProjectionEnv) gi.del().env()).getProjection(); //LNode ln = ((GInteractionNodeDel) gi.del()).project(gi, self); // FIXME: won't work for do - // FIXME: move node-specific projects to G nodes (not dels) and take child projections as params, bit like reconstruct + // TODO: move node-specific projects to G nodes (not dels) and take child projections as params, bit like reconstruct if (ln instanceof LInteractionSeq) // Self comm sequence { lis.addAll(((LInteractionSeq) ln).getInteractNodeChildren()); @@ -123,15 +126,17 @@ public GInteractionSeq leaveF17Parsing(ScribNode parent, ScribNode child, F17Par }*/ @Override - public GInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, RecRemover rem, ScribNode visited) - throws ScribbleException + public GInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, + RecRemover rem, ScribNode visited) throws ScribbleException { GInteractionSeq gis = (GInteractionSeq) visited; - List gins = gis.getInteractNodeChildren().stream().flatMap((gi) -> - (gi instanceof GRecursion && rem.toRemove(((GRecursion) gi).recvar.toName())) - ? ((GRecursion) gi).getBlockChild().getInteractSeqChild().getInteractNodeChildren().stream() - : Stream.of(gi) - ).collect(Collectors.toList()); + List gins = gis.getInteractNodeChildren().stream() + .flatMap((gi) -> (gi instanceof GRecursion + && rem.toRemove(((GRecursion) gi).getRecVarChild().toName())) + ? ((GRecursion) gi).getBlockChild().getInteractSeqChild() + .getInteractNodeChildren().stream() + : Stream.of(gi)) + .collect(Collectors.toList()); return rem.job.af.GInteractionSeq(gis.getSource(), gins); } } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java index e605a16af..fcbab60e8 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -27,7 +27,8 @@ import org.scribble.visit.wf.WFChoiceChecker; import org.scribble.visit.wf.env.WFChoiceEnv; -public class GMessageTransferDel extends MessageTransferDel implements GSimpleInteractionNodeDel +public class GMessageTransferDel extends MessageTransferDel + implements GSimpleInteractionNodeDel { public GMessageTransferDel() { @@ -35,36 +36,43 @@ public GMessageTransferDel() } @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb, ScribNode visited) throws ScribbleException { GMessageTransfer gmt = (GMessageTransfer) visited; - Role src = gmt.src.toName(); + Role src = gmt.getSourceChild().toName(); List dests = gmt.getDestinationRoles(); if (dests.contains(src)) { - throw new ScribbleException(gmt.getSource(), "[TODO] Self connections not supported: " + gmt); // Would currently be subsumed by unconnected check + throw new ScribbleException(gmt.getSource(), + "[TODO] Self connections not supported: " + gmt); + // Would currently be subsumed by unconnected check } return gmt; } @Override - public GMessageTransfer leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException + public GMessageTransfer leaveInlinedWFChoiceCheck(ScribNode parent, + ScribNode child, WFChoiceChecker checker, ScribNode visited) + throws ScribbleException { GMessageTransfer gmt = (GMessageTransfer) visited; - Role src = gmt.src.toName(); + Role src = gmt.getSourceChild().toName(); if (!checker.peekEnv().isEnabled(src)) { - throw new ScribbleException(gmt.src.getSource(), "Role not enabled: " + src); + throw new ScribbleException(gmt.getSourceChild().getSource(), + "Role not enabled: " + src); } - Message msg = gmt.msg.toMessage(); + Message msg = gmt.getMessageNodeChild().toMessage(); WFChoiceEnv env = checker.popEnv(); for (Role dest : gmt.getDestinationRoles()) { // FIXME: better to check as global model error (role stuck on uncomnected send) if (!env.isConnected(src, dest)) { - throw new ScribbleException(gmt.getSource(), "Roles not (necessarily) connected: " + src + ", " + dest); + throw new ScribbleException(gmt.getSource(), + "Roles not (necessarily) connected: " + src + ", " + dest); } env = env.addMessage(src, dest, msg); @@ -77,13 +85,16 @@ public GMessageTransfer leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode ch @Override //public GMessageTransfer leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException //throws ScribbleException - public ScribNode leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException //throws ScribbleException + public ScribNode leaveProjection(ScribNode parent, ScribNode child, + Projector proj, ScribNode visited) throws ScribbleException + //throws ScribbleException { GMessageTransfer gmt = (GMessageTransfer) visited; Role self = proj.peekSelf(); LNode projection = gmt.project(proj.job.af, self); proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GMessageTransfer) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gmt); + return (GMessageTransfer) GSimpleInteractionNodeDel.super.leaveProjection( + parent, child, proj, gmt); } /*@Override diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java index 90c8f37ee..3dc11a4ce 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java @@ -30,27 +30,32 @@ public class GProtocolBlockDel extends ProtocolBlockDel { @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { GProtocolBlock gpb = (GProtocolBlock) visited; - GInteractionSeq seq = (GInteractionSeq) ((InlineProtocolEnv) gpb.seq.del().env()).getTranslation(); + GInteractionSeq seq = (GInteractionSeq) ((InlineProtocolEnv) gpb + .getInteractSeqChild().del().env()).getTranslation(); GProtocolBlock inlined = inl.job.af.GProtocolBlock(gpb.getSource(), seq); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (GProtocolBlock) ScribDelBase.popAndSetVisitorEnv(this, inl, gpb); } @Override - public void enterProjection(ScribNode parent, ScribNode child, Projector proj) throws ScribbleException + public void enterProjection(ScribNode parent, ScribNode child, Projector proj) + throws ScribbleException { ScribDelBase.pushVisitorEnv(this, proj); } @Override - public GProtocolBlock leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException + public GProtocolBlock leaveProjection(ScribNode parent, ScribNode child, + Projector proj, ScribNode visited) throws ScribbleException { GProtocolBlock gpb = (GProtocolBlock) visited; LInteractionSeq seq = - (LInteractionSeq) ((ProjectionEnv) gpb.seq.del().env()).getProjection(); + (LInteractionSeq) ((ProjectionEnv) gpb.getInteractSeqChild().del() + .env()).getProjection(); //((GInteractionSeqDel) gpb.seq.del()).project(gpb.getInteractionSeq(), self); LProtocolBlock projection = gpb.project(proj.job.af, proj.peekSelf(), seq); proj.pushEnv(proj.popEnv().setProjection(projection)); diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java index d9d2a84be..8fb90fda1 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java @@ -53,33 +53,41 @@ protected GProtocolDefDel copy() } @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { - CommonTree blame = ((GProtocolDecl) parent).header.getSource(); + CommonTree blame = ((GProtocolDecl) parent).getHeaderChild().getSource(); SubprotocolSig subsig = inl.peekStack(); GProtocolDef def = (GProtocolDef) visited; - GProtocolBlock block = (GProtocolBlock) ((InlineProtocolEnv) def.block.del().env()).getTranslation(); - RecVarNode recvar = (RecVarNode) inl.job.af.SimpleNameNode(blame, RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString()); + GProtocolBlock block = (GProtocolBlock) ((InlineProtocolEnv) def + .getBlockChild().del().env()).getTranslation(); + RecVarNode recvar = (RecVarNode) inl.job.af.SimpleNameNode(blame, + RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString()); GRecursion rec = inl.job.af.GRecursion(blame, recvar, block); GInteractionSeq gis = inl.job.af.GInteractionSeq(blame, Arrays.asList(rec)); - GProtocolDef inlined = inl.job.af.GProtocolDef(def.getSource(), inl.job.af.GProtocolBlock(blame, gis)); + GProtocolDef inlined = inl.job.af.GProtocolDef(def.getSource(), + inl.job.af.GProtocolBlock(blame, gis)); inl.pushEnv(inl.popEnv().setTranslation(inlined)); GProtocolDefDel copy = setInlinedProtocolDef(inlined); - return (GProtocolDef) ScribDelBase.popAndSetVisitorEnv(this, inl, (GProtocolDef) def.del(copy)); + return (GProtocolDef) ScribDelBase.popAndSetVisitorEnv(this, inl, + (GProtocolDef) def.del(copy)); } @Override - public void enterProjection(ScribNode parent, ScribNode child, Projector proj) throws ScribbleException + public void enterProjection(ScribNode parent, ScribNode child, Projector proj) + throws ScribbleException { //pushVisitorEnv(parent, child, proj); ScribDelBase.pushVisitorEnv(this, proj); } @Override - public GProtocolDef leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException + public GProtocolDef leaveProjection(ScribNode parent, ScribNode child, + Projector proj, ScribNode visited) throws ScribbleException { GProtocolDef gpd = (GProtocolDef) visited; - LProtocolBlock block = (LProtocolBlock) ((ProjectionEnv) gpd.block.del().env()).getProjection(); + LProtocolBlock block = (LProtocolBlock) ((ProjectionEnv) gpd.getBlockChild() + .del().env()).getProjection(); LProtocolDef projection = gpd.project(proj.job.af, proj.peekSelf(), block); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GProtocolDef) ScribDelBase.popAndSetVisitorEnv(this, proj, gpd); diff --git a/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java b/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java index 19a1eb678..9ceeafa0f 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java @@ -31,38 +31,60 @@ public class GRecursionDel extends RecursionDel implements GCompoundInteractionNodeDel { @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { GRecursion gr = (GRecursion) visited; //RecVarNode recvar = gr.recvar.clone(); - RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) gr.recvar.del().env()).getTranslation(); - GProtocolBlock block = (GProtocolBlock) ((InlineProtocolEnv) gr.block.del().env()).getTranslation(); + RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) gr.getRecVarChild() + .del().env()).getTranslation(); + GProtocolBlock block = (GProtocolBlock) ((InlineProtocolEnv) gr + .getBlockChild().del().env()).getTranslation(); GRecursion inlined = inl.job.af.GRecursion(gr.getSource(), recvar, block); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (GRecursion) super.leaveProtocolInlining(parent, child, inl, gr); } @Override - public GRecursion leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException + public GRecursion leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, + WFChoiceChecker checker, ScribNode visited) throws ScribbleException { GRecursion rec = (GRecursion) visited; - WFChoiceEnv merged = checker.popEnv().mergeContext((WFChoiceEnv) rec.block.del().env()); // Merge block child env into current rec env + WFChoiceEnv merged = checker.popEnv() + .mergeContext((WFChoiceEnv) rec.getBlockChild().del().env()); + // Merge block child env into current rec env checker.pushEnv(merged); - return (GRecursion) super.leaveInlinedWFChoiceCheck(parent, child, checker, rec); // Will merge current rec env into parent (and set env on del) + return (GRecursion) super.leaveInlinedWFChoiceCheck(parent, child, checker, + rec); + // Will merge current rec env into parent (and set env on del) } @Override - public GRecursion leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException + public GRecursion leaveProjection(ScribNode parent, ScribNode child, + Projector proj, ScribNode visited) throws ScribbleException { GRecursion gr = (GRecursion) visited; LProtocolBlock block = - (LProtocolBlock) ((ProjectionEnv) gr.block.del().env()).getProjection(); + (LProtocolBlock) ((ProjectionEnv) gr.getBlockChild().del().env()) + .getProjection(); //((GProtocolBlockDel) gr.block.del()).project(gr.getBlock(), self); LRecursion projection = gr.project(proj.job.af, proj.peekSelf(), block); proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GRecursion) GCompoundInteractionNodeDel.super.leaveProjection(parent, child, proj, gr); + return (GRecursion) GCompoundInteractionNodeDel.super.leaveProjection( + parent, child, proj, gr); } + + + + + + + + + + + /*@Override public void enterAnnotCheck(ScribNode parent, ScribNode child, AnnotationChecker checker) throws ScribbleException { diff --git a/scribble-core/src/main/java/org/scribble/del/global/GWrapDel.java b/scribble-core/src/main/java/org/scribble/del/global/GWrapDel.java index 7315fdb57..7047dee45 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GWrapDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GWrapDel.java @@ -16,6 +16,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GWrap; import org.scribble.ast.local.LNode; +import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ConnectionActionDel; import org.scribble.main.ScribbleException; import org.scribble.type.name.Role; @@ -24,8 +25,9 @@ import org.scribble.visit.wf.WFChoiceChecker; import org.scribble.visit.wf.env.WFChoiceEnv; -// FIXME: make WrapDel (cf., G/LMessageTransferDel) -public class GWrapDel extends ConnectionActionDel implements GSimpleInteractionNodeDel +// TODO: make WrapDel (cf., G/LMessageTransferDel) +public class GWrapDel extends ConnectionActionDel + implements GSimpleInteractionNodeDel { public GWrapDel() { @@ -33,38 +35,44 @@ public GWrapDel() } @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb, ScribNode visited) throws ScribbleException { GWrap gw = (GWrap) visited; - /*Role src = gw.src.toName(); - Role dest = gw.dest.toName();*/ return gw; } @Override - public GWrap leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException + public GWrap leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, + WFChoiceChecker checker, ScribNode visited) throws ScribbleException { GWrap gw = (GWrap) visited; - Role src = gw.src.toName(); - Role dest = gw.dest.toName(); + RoleNode srcNode = gw.getSourceChild(); + RoleNode destNode = gw.getDestinationChild(); + Role src = srcNode.toName(); + Role dest = destNode.toName(); if (!checker.peekEnv().isEnabled(src)) { - throw new ScribbleException(gw.src.getSource(), "Role not enabled: " + src); + throw new ScribbleException(srcNode.getSource(), + "Role not enabled: " + src); } if (!checker.peekEnv().isEnabled(dest)) { - throw new ScribbleException(gw.dest.getSource(), "Role not enabled: " + dest); + throw new ScribbleException(destNode.getSource(), + "Role not enabled: " + dest); } //Message msg = gw.msg.toMessage(); // Unit message if (src.equals(dest)) { - throw new ScribbleException(gw.getSource(), "[TODO] Self connections not supported: " + gw); + throw new ScribbleException(gw.getSource(), + "[TODO] Self connections not supported: " + gw); } WFChoiceEnv env = checker.popEnv(); if (!env.isConnected(src, dest)) { - throw new ScribbleException(gw.getSource(), "Roles not (necessarily) connected: " + src + ", " + dest); + throw new ScribbleException(gw.getSource(), + "Roles not (necessarily) connected: " + src + ", " + dest); } //env = env.addMessage(src, dest, msg); @@ -76,12 +84,15 @@ public GWrap leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoi } @Override - public ScribNode leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException //throws ScribbleException + public ScribNode leaveProjection(ScribNode parent, ScribNode child, + Projector proj, ScribNode visited) throws ScribbleException + // throwsScribbleException { GWrap gw = (GWrap) visited; Role self = proj.peekSelf(); LNode projection = gw.project(proj.job.af, self); proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GWrap) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gw); + return (GWrap) GSimpleInteractionNodeDel.super.leaveProjection(parent, + child, proj, gw); } } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java b/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java index 1f25ba9da..6d2402b35 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java @@ -13,9 +13,11 @@ */ package org.scribble.del.local; +import org.scribble.ast.MessageNode; import org.scribble.ast.MessageSigNode; import org.scribble.ast.ScribNode; import org.scribble.ast.local.LAccept; +import org.scribble.ast.name.simple.RoleNode; import org.scribble.main.ScribbleException; import org.scribble.type.Payload; import org.scribble.type.name.MessageId; @@ -33,35 +35,42 @@ public class LAcceptDel extends LConnectionActionDel implements LSimpleInteracti public LAccept leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder builder, ScribNode visited) throws ScribbleException { LAccept la = (LAccept) visited; - Role peer = la.src.toName(); - MessageId mid = la.msg.toMessage().getId(); - Payload payload = la.msg.isMessageSigNode() // Hacky? - ? ((MessageSigNode) la.msg).payloads.toPayload() + RoleNode src = la.getSourceChild(); + MessageNode msg = la.getMessageNodeChild(); + + Role peer = src.toName(); + MessageId mid = msg.toMessage().getId(); + Payload payload = msg.isMessageSigNode() // Hacky? + ? ((MessageSigNode) msg).getPayloadListChild().toPayload() : Payload.EMPTY_PAYLOAD; - builder.util.addEdge(builder.util.getEntry(), builder.job.ef.newEAccept(peer, mid, payload), builder.util.getExit()); - //builder.builder.addEdge(builder.builder.getEntry(), new Accept(peer), builder.builder.getExit()); - ////builder.builder.addEdge(builder.builder.getEntry(), Receive.get(peer, mid, payload), builder.builder.getExit()); + builder.util.addEdge(builder.util.getEntry(), + builder.job.ef.newEAccept(peer, mid, payload), builder.util.getExit()); return (LAccept) super.leaveEGraphBuilding(parent, child, builder, la); } @Override - public void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) + public void enterProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer) { - fixer.setChoiceSubject(((LAccept) child).src.toName()); + fixer.setChoiceSubject(((LAccept) child).getSourceChild().toName()); } @Override - public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker) throws ScribbleException + public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, + ScribNode child, UnguardedChoiceDoProjectionChecker checker) + throws ScribbleException { super.enterUnguardedChoiceDoProjectionCheck(parent, child, checker); LAccept la = (LAccept) child; UnguardedChoiceDoEnv env = checker.popEnv(); - env = env.setChoiceSubject(la.src.toName()); + env = env.setChoiceSubject(la.getSourceChild().toName()); checker.pushEnv(env); } @Override - public LAccept leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribbleException + public LAccept leaveExplicitCorrelationCheck(ScribNode parent, + ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) + throws ScribbleException { LAccept la = (LAccept) visited; ExplicitCorrelationEnv env = checker.popEnv(); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java b/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java index 8fee60c8b..969212cf3 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java @@ -40,16 +40,20 @@ public class LInteractionSeqDel extends InteractionSeqDel { @Override - public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, ScribNode child, ProjectedChoiceDoPruner pruner, ScribNode visited) throws ScribbleException + public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, + ScribNode child, ProjectedChoiceDoPruner pruner, ScribNode visited) + throws ScribbleException { LInteractionSeq lc = (LInteractionSeq) visited; - List actions = lc.getInteractNodeChildren().stream().filter((li) -> li != null).collect(Collectors.toList()); + List actions = lc.getInteractNodeChildren().stream() + .filter(li -> li != null).collect(Collectors.toList()); return lc.reconstruct(actions); } // enter in super @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { LInteractionSeq lis = (LInteractionSeq) visited; List lins = new LinkedList(); @@ -71,7 +75,9 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, Protoc } // Replaces visitChildrenInSubprotocols for LocalInteractionSequence - public LInteractionSeq visitForReachabilityChecking(ReachabilityChecker checker, LInteractionSeq child) throws ScribbleException + public LInteractionSeq visitForReachabilityChecking( + ReachabilityChecker checker, LInteractionSeq child) + throws ScribbleException { List visited = new LinkedList<>(); for (InteractionNode li : child.getInteractNodeChildren()) @@ -79,14 +85,16 @@ public LInteractionSeq visitForReachabilityChecking(ReachabilityChecker checker, ReachabilityEnv re = checker.peekEnv(); if (!re.isSequenceable()) { - throw new ScribbleException(li.getSource(), "Invalid/unreachable sequence to: " + li); + throw new ScribbleException(li.getSource(), + "Invalid/unreachable sequence to: " + li); } visited.add((LInteractionNode) li.accept(checker)); } return child; } - public LInteractionSeq visitForFsmConversion(EGraphBuilder conv, LInteractionSeq child) throws ScribbleException + public LInteractionSeq visitForFsmConversion(EGraphBuilder conv, + LInteractionSeq child) throws ScribbleException { EState entry = conv.util.getEntry(); EState exit = conv.util.getExit(); @@ -116,11 +124,12 @@ public LInteractionSeq visitForFsmConversion(EGraphBuilder conv, LInteractionSeq } else { - EState tmp = //conv.util.newState(Collections.emptySet()); + EState tmp = // conv.util.newState(Collections.emptySet()); conv.util.ef.newEState(Collections.emptySet()); conv.util.setExit(tmp); child.getInteractNodeChildren().get(i).accept(conv); - conv.util.setEntry(conv.util.getExit()); // exit may not be tmp, entry/exit can be modified, e.g. continue + conv.util.setEntry(conv.util.getExit()); + // exit may not be tmp, entry/exit can be modified, e.g. continue } } } @@ -135,15 +144,17 @@ public LInteractionSeq visitForFsmConversion(EGraphBuilder conv, LInteractionSeq // Duplicated from GInteractionSeq @Override - public LInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, RecRemover rem, ScribNode visited) - throws ScribbleException + public LInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, + RecRemover rem, ScribNode visited) throws ScribbleException { LInteractionSeq lis = (LInteractionSeq) visited; - List lins = lis.getInteractNodeChildren().stream().flatMap((li) -> - (li instanceof LRecursion && rem.toRemove(((LRecursion) li).recvar.toName())) - ? ((LRecursion) li).getBlockChild().getInteractSeqChild().getInteractNodeChildren().stream() - : Stream.of(li) - ).collect(Collectors.toList()); + List lins = lis.getInteractNodeChildren().stream() + .flatMap((li) -> (li instanceof LRecursion + && rem.toRemove(((LRecursion) li).getRecVarChild().toName())) + ? ((LRecursion) li).getBlockChild().getInteractSeqChild() + .getInteractNodeChildren().stream() + : Stream.of(li)) + .collect(Collectors.toList()); return rem.job.af.LInteractionSeq(lis.getSource(), lins); } } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java b/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java index 86db88223..5ce04f3b5 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java @@ -46,19 +46,27 @@ protected LProtocolDeclDel copy() } @Override - public ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, ScribNode child, ProjectedRoleDeclFixer fixer, ScribNode visited) throws ScribbleException + public ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, + ScribNode child, ProjectedRoleDeclFixer fixer, ScribNode visited) + throws ScribbleException { LProtocolDecl lpd = (LProtocolDecl) visited; - // FIXME: ensure all role params are used, to avoid empty roledecllist - Set occs = ((LProtocolDeclDel) lpd.del()).getProtocolDeclContext().getRoleOccurrences(); - List rds = lpd.header.roledecls.getParamDeclChildren().stream().filter((rd) -> - occs.contains(rd.getDeclName())).collect(Collectors.toList()); - RoleDeclList rdl = fixer.job.af.RoleDeclList(lpd.header.roledecls.getSource(), rds); + // TODO: ensure all role params are used, to avoid empty roledecllist + Set occs = ((LProtocolDeclDel) lpd.del()).getProtocolDeclContext() + .getRoleOccurrences(); + List rds = lpd.getHeaderChild().getRoleDeclListChild() + .getParamDeclChildren().stream() + .filter(rd -> occs.contains(rd.getDeclName())) + .collect(Collectors.toList()); LProtocolHeader tmp = lpd.getHeaderChild(); - LProtocolHeader hdr = tmp.reconstruct(tmp.getNameNodeChild(), rdl, tmp.paramdecls); - LProtocolDecl fixed = lpd.reconstruct(hdr, lpd.def); + RoleDeclList rdl = fixer.job.af + .RoleDeclList(tmp.getRoleDeclListChild().getSource(), rds); + LProtocolHeader hdr = tmp.reconstruct(tmp.getNameNodeChild(), rdl, + tmp.getParamDeclListChild()); + LProtocolDecl fixed = lpd.reconstruct(hdr, lpd.getDefChild()); - fixer.job.debugPrintln("\n[DEBUG] Projected " + getSourceProtocol() + " for " + getSelfRole() + ":\n" + fixed); + fixer.job.debugPrintln("\n[DEBUG] Projected " + getSourceProtocol() + + " for " + getSelfRole() + ":\n" + fixed); return super.leaveProjectedRoleDeclFixing(parent, child, fixer, fixed); } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProtocolBlockDel.java b/scribble-core/src/main/java/org/scribble/del/local/LProtocolBlockDel.java index 10df42053..fcea2e671 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LProtocolBlockDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LProtocolBlockDel.java @@ -26,24 +26,31 @@ public class LProtocolBlockDel extends ProtocolBlockDel { @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { LProtocolBlock lpb = (LProtocolBlock) visited; - LInteractionSeq seq = (LInteractionSeq) ((InlineProtocolEnv) lpb.seq.del().env()).getTranslation(); + LInteractionSeq seq = (LInteractionSeq) ((InlineProtocolEnv) lpb + .getInteractSeqChild().del().env()).getTranslation(); LProtocolBlock inlined = inl.job.af.LProtocolBlock(lpb.getSource(), seq); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (LProtocolBlock) ScribDelBase.popAndSetVisitorEnv(this, inl, lpb); } @Override - public void enterReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker) throws ScribbleException + public void enterReachabilityCheck(ScribNode parent, ScribNode child, + ReachabilityChecker checker) throws ScribbleException { ScribDelBase.pushVisitorEnv(this, checker); } @Override - public LProtocolBlock leaveReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker, ScribNode visited) throws ScribbleException + public LProtocolBlock leaveReachabilityCheck(ScribNode parent, + ScribNode child, ReachabilityChecker checker, ScribNode visited) + throws ScribbleException { - return (LProtocolBlock) ScribDelBase.popAndSetVisitorEnv(this, checker, visited); // records the current checker Env to the current del; also pops and merges that env into the parent env + return (LProtocolBlock) ScribDelBase.popAndSetVisitorEnv(this, checker, + visited); + // records the current checker Env to the current del; also pops and merges that env into the parent env } } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java b/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java index 623b48ffd..ebffa2bf7 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java @@ -49,20 +49,24 @@ protected LProtocolDefDel copy() } @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { - CommonTree blame = ((LProtocolDecl) parent).header.getSource(); // Cf., GProtocolDefDel + CommonTree blame = ((LProtocolDecl) parent).getHeaderChild().getSource(); // Cf., GProtocolDefDel SubprotocolSig subsig = inl.peekStack(); LProtocolDef def = (LProtocolDef) visited; - LProtocolBlock block = (LProtocolBlock) ((InlineProtocolEnv) def.block.del().env()).getTranslation(); + LProtocolBlock block = (LProtocolBlock) ((InlineProtocolEnv) def + .getBlockChild().del().env()).getTranslation(); RecVarNode recvar = (RecVarNode) inl.job.af.SimpleNameNode(blame, // The parent do would probably be the better source for blame RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString()); LRecursion rec = inl.job.af.LRecursion(blame, recvar, block); LInteractionSeq lis = inl.job.af.LInteractionSeq(blame, Arrays.asList(rec)); - LProtocolDef inlined = inl.job.af.LProtocolDef(def.getSource(), inl.job.af.LProtocolBlock(blame, lis)); + LProtocolDef inlined = inl.job.af.LProtocolDef(def.getSource(), + inl.job.af.LProtocolBlock(blame, lis)); inl.pushEnv(inl.popEnv().setTranslation(inlined)); LProtocolDefDel copy = setInlinedProtocolDef(inlined); - return (LProtocolDef) ScribDelBase.popAndSetVisitorEnv(this, inl, (LProtocolDef) def.del(copy)); + return (LProtocolDef) ScribDelBase.popAndSetVisitorEnv(this, inl, + (LProtocolDef) def.del(copy)); } @Override @@ -72,7 +76,8 @@ public LProtocolDef getInlinedProtocolDef() } @Override - public LProtocolDefDel setInlinedProtocolDef(ProtocolDef inlined) + public LProtocolDefDel setInlinedProtocolDef( + ProtocolDef inlined) { return (LProtocolDefDel) super.setInlinedProtocolDef(inlined); } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LRecursionDel.java b/scribble-core/src/main/java/org/scribble/del/local/LRecursionDel.java index 672744be9..8790437dd 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LRecursionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LRecursionDel.java @@ -33,42 +33,54 @@ public class LRecursionDel extends RecursionDel implements LCompoundInteractionNodeDel { @Override - public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribbleException + public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, + ScribNode child, UnguardedChoiceDoProjectionChecker checker, + ScribNode visited) throws ScribbleException { Recursion rec = (Recursion) visited; - UnguardedChoiceDoEnv merged = checker.popEnv().mergeContext((UnguardedChoiceDoEnv) rec.block.del().env()); + UnguardedChoiceDoEnv merged = checker.popEnv() + .mergeContext((UnguardedChoiceDoEnv) rec.getBlockChild().del().env()); checker.pushEnv(merged); - return (Recursion) super.leaveUnguardedChoiceDoProjectionCheck(parent, child, checker, rec); + return (Recursion) super.leaveUnguardedChoiceDoProjectionCheck(parent, + child, checker, rec); } @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { LRecursion lr = (LRecursion) visited; //RecVarNode recvar = lr.recvar.clone(); - RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) lr.recvar.del().env()).getTranslation(); - LProtocolBlock block = (LProtocolBlock) ((InlineProtocolEnv) lr.block.del().env()).getTranslation(); + RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) lr.getRecVarChild() + .del().env()).getTranslation(); + LProtocolBlock block = (LProtocolBlock) ((InlineProtocolEnv) lr + .getBlockChild().del().env()).getTranslation(); LRecursion inlined = inl.job.af.LRecursion(lr.getSource(), recvar, block); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (LRecursion) super.leaveProtocolInlining(parent, child, inl, lr); } @Override - public LRecursion leaveReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker, ScribNode visited) throws ScribbleException + public LRecursion leaveReachabilityCheck(ScribNode parent, ScribNode child, + ReachabilityChecker checker, ScribNode visited) throws ScribbleException { LRecursion lr = (LRecursion) visited; - ReachabilityEnv env = checker.popEnv().mergeContext((ReachabilityEnv) lr.block.del().env()); - env = env.removeContinueLabel(lr.recvar.toName()); + ReachabilityEnv env = checker.popEnv() + .mergeContext((ReachabilityEnv) lr.getBlockChild().del().env()); + env = env.removeContinueLabel(lr.getRecVarChild().toName()); checker.pushEnv(env); - return (LRecursion) LCompoundInteractionNodeDel.super.leaveReachabilityCheck(parent, child, checker, visited); // records the current checker Env to the current del; also pops and merges that env into the parent env + return (LRecursion) LCompoundInteractionNodeDel.super.leaveReachabilityCheck( + parent, child, checker, visited); + // records the current checker Env to the current del; also pops and merges that env into the parent env } @Override - public void enterEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder graph) + public void enterEGraphBuilding(ScribNode parent, ScribNode child, + EGraphBuilder graph) { super.enterEGraphBuilding(parent, child, graph); LRecursion lr = (LRecursion) child; - RecVar rv = lr.recvar.toName(); + RecVar rv = lr.getRecVarChild().toName(); // Update existing state, not replace it -- cf. LDoDel /*if (graph.builder.isUnguardedInChoice()) // Actually, not needed since unfoldings are enough to make graph building work (and this makes combined unguarded choice-rec and continue protocols work) { @@ -83,24 +95,27 @@ public void enterEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder } @Override - public LRecursion leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder graph, ScribNode visited) throws ScribbleException + public LRecursion leaveEGraphBuilding(ScribNode parent, ScribNode child, + EGraphBuilder graph, ScribNode visited) throws ScribbleException { LRecursion lr = (LRecursion) visited; - RecVar rv = lr.recvar.toName(); + RecVar rv = lr.getRecVarChild().toName(); graph.util.popRecursionEntry(rv); return (LRecursion) super.leaveEGraphBuilding(parent, child, graph, lr); } @Override - public void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) + public void enterProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer) { - fixer.pushRec(((LRecursion) child).recvar.toName()); + fixer.pushRec(((LRecursion) child).getRecVarChild().toName()); } @Override - public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer, ScribNode visited) + public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer, ScribNode visited) { - fixer.popRec(((LRecursion) child).recvar.toName()); + fixer.popRec(((LRecursion) child).getRecVarChild().toName()); return visited; } } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java b/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java index 34d0388a9..18b6ce1c3 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java @@ -15,6 +15,7 @@ import java.util.List; +import org.scribble.ast.MessageNode; import org.scribble.ast.MessageSigNode; import org.scribble.ast.ScribNode; import org.scribble.ast.local.LMessageTransfer; @@ -41,24 +42,29 @@ public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBu throw new ScribbleException("[TODO] EFSM building for multicast not supported: " + ls); } Role peer = dests.get(0).toName(); - MessageId mid = ls.msg.toMessage().getId(); - Payload payload = ls.msg.isMessageSigNode() // Hacky? - ? ((MessageSigNode) ls.msg).payloads.toPayload() + MessageNode msg = ls.getMessageNodeChild(); + MessageId mid = msg.toMessage().getId(); + Payload payload = msg.isMessageSigNode() // Hacky? + ? ((MessageSigNode) msg).getPayloadListChild().toPayload() : Payload.EMPTY_PAYLOAD; - builder.util.addEdge(builder.util.getEntry(), builder.job.ef.newESend(peer, mid, payload), builder.util.getExit()); + builder.util.addEdge(builder.util.getEntry(), + builder.job.ef.newESend(peer, mid, payload), builder.util.getExit()); //builder.builder.addEdge(builder.builder.getEntry(), Send.get(peer, mid, payload), builder.builder.getExit()); return (LSend) super.leaveEGraphBuilding(parent, child, builder, ls); } // Could make a LMessageTransferDel to factor this out with LReceiveDel @Override - public void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) + public void enterProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer) { - fixer.setChoiceSubject(((LSend) child).src.toName()); + fixer.setChoiceSubject(((LSend) child).getSourceChild().toName()); } @Override - public LMessageTransfer leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribbleException + public LMessageTransfer leaveExplicitCorrelationCheck(ScribNode parent, + ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) + throws ScribbleException { LMessageTransfer lmt = (LMessageTransfer) visited; checker.pushEnv(checker.popEnv().disableAccept()); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LWrapClientDel.java b/scribble-core/src/main/java/org/scribble/del/local/LWrapClientDel.java index 7891c4ced..69a5d5dd4 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LWrapClientDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LWrapClientDel.java @@ -22,21 +22,26 @@ import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -public class LWrapClientDel extends ConnectionActionDel implements LSimpleInteractionNodeDel +public class LWrapClientDel extends ConnectionActionDel + implements LSimpleInteractionNodeDel { @Override - public LWrapClient leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder builder, ScribNode visited) throws ScribbleException + public LWrapClient leaveEGraphBuilding(ScribNode parent, ScribNode child, + EGraphBuilder builder, ScribNode visited) throws ScribbleException { LWrapClient lc = (LWrapClient) visited; - RoleNode dest = lc.dest; + RoleNode dest = lc.getDestinationChild(); Role peer = dest.toName(); - builder.util.addEdge(builder.util.getEntry(), builder.job.ef.newEWrapClient(peer), builder.util.getExit()); + builder.util.addEdge(builder.util.getEntry(), + builder.job.ef.newEWrapClient(peer), builder.util.getExit()); return (LWrapClient) super.leaveEGraphBuilding(parent, child, builder, lc); } @Override - public void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) + public void enterProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer) { - fixer.setChoiceSubject(((LWrapClient) child).src.toName()); + fixer + .setChoiceSubject(((LWrapClient) child).getDestinationChild().toName()); } } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LWrapServerDel.java b/scribble-core/src/main/java/org/scribble/del/local/LWrapServerDel.java index ccd1163f2..9ea78dd35 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LWrapServerDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LWrapServerDel.java @@ -23,30 +23,36 @@ import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; import org.scribble.visit.context.env.UnguardedChoiceDoEnv; -public class LWrapServerDel extends ConnectionActionDel implements LSimpleInteractionNodeDel +public class LWrapServerDel extends ConnectionActionDel + implements LSimpleInteractionNodeDel { @Override - public LWrapServer leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder builder, ScribNode visited) throws ScribbleException + public LWrapServer leaveEGraphBuilding(ScribNode parent, ScribNode child, + EGraphBuilder builder, ScribNode visited) throws ScribbleException { LWrapServer la = (LWrapServer) visited; - Role peer = la.src.toName(); - builder.util.addEdge(builder.util.getEntry(), builder.job.ef.newEWrapServer(peer), builder.util.getExit()); + Role peer = la.getSourceChild().toName(); + builder.util.addEdge(builder.util.getEntry(), + builder.job.ef.newEWrapServer(peer), builder.util.getExit()); return (LWrapServer) super.leaveEGraphBuilding(parent, child, builder, la); } @Override - public void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) + public void enterProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer) { - fixer.setChoiceSubject(((LWrapServer) child).src.toName()); + fixer.setChoiceSubject(((LWrapServer) child).getSourceChild().toName()); } @Override - public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker) throws ScribbleException + public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, + ScribNode child, UnguardedChoiceDoProjectionChecker checker) + throws ScribbleException { super.enterUnguardedChoiceDoProjectionCheck(parent, child, checker); LWrapServer la = (LWrapServer) child; UnguardedChoiceDoEnv env = checker.popEnv(); - env = env.setChoiceSubject(la.src.toName()); + env = env.setChoiceSubject(la.getSourceChild().toName()); checker.pushEnv(env); } } diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java index 2dbecaa13..c777e114f 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java @@ -1,5 +1,7 @@ -/** - * Copyright 2008 The Scribble Authors +/**block + + * blockC +opyright 2008 The Scribble Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at @@ -26,7 +28,6 @@ import org.scribble.parser.scribble.ast.AntlrImportModule; import org.scribble.parser.scribble.ast.AntlrMessageSig; import org.scribble.parser.scribble.ast.AntlrMessageSigDecl; -import org.scribble.parser.scribble.ast.AntlrModule; import org.scribble.parser.scribble.ast.AntlrModuleDecl; import org.scribble.parser.scribble.ast.AntlrNonRoleArgList; import org.scribble.parser.scribble.ast.AntlrNonRoleParamDecl; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModuleDecl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModuleDecl.java index ec1649793..e0b4512db 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModuleDecl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModuleDecl.java @@ -32,8 +32,8 @@ public static ModuleDecl parseModuleDecl(AntlrToScribParser parser, CommonTree c { //return af.ModuleDecl(ct, AntlrQualifiedName.toModuleNameNode(getModuleNameChild(ct), af)); - System.out.println("bbb: " + ct.getChildren().stream().map(x -> x.getClass().toString()).collect(Collectors.joining(""))); - System.out.println("ccc: " + ((CommonTree) ct.getChild(0)).getChildren().stream().map(x -> x.getClass().toString()).collect(Collectors.joining(""))); + System.out.println("bbb: " + ((List) ct.getChildren()).stream().map(x -> x.getClass().toString()).collect(Collectors.joining(""))); + System.out.println("ccc: " + ((List) ((CommonTree) ct.getChild(0)).getChildren()).stream().map(x -> x.getClass().toString()).collect(Collectors.joining(""))); // HACK FIXME //List collect = ((Stream) ct.getChildren().stream()).map(x -> ((CommonTree) x).getText()).collect(Collectors.toList()); diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 8331f55b2..d00734edb 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -30,7 +30,7 @@ module tmp.Test; // Add a unit test for validation to bypass aux -// FIXME TODO: port forwarding version of P2 -- funny case of "session" persisting over full disconnect, should/how to correlate? +// TODO: port forwarding version of P2 -- funny case of "session" persisting over full disconnect, should/how to correlate? From 7dbde7f0e83c5d61baa042df5b3befc68a78d818 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 1 Feb 2019 18:04:52 +0000 Subject: [PATCH 084/539] Continued WIP. --- .../java/org/scribble/main/MainContext.java | 7 +++- .../org/scribble/ast/HeaderParamDeclList.java | 7 ++-- .../java/org/scribble/ast/NameDeclNode.java | 2 +- .../java/org/scribble/ast/ScribNodeBase.java | 10 ++++- .../scribble/ast/global/GProtocolHeader.java | 2 +- .../java/org/scribble/ast/name/NameNode.java | 41 ++++++++++++++----- .../ast/name/qualified/DataTypeNode.java | 2 +- .../ast/name/qualified/GProtocolNameNode.java | 4 +- .../ast/name/qualified/LProtocolNameNode.java | 4 +- .../name/qualified/MessageSigNameNode.java | 4 +- .../ast/name/qualified/ModuleNameNode.java | 4 +- .../visit/context/ModuleContextBuilder.java | 3 ++ .../org/scribble/parser/antlr/Scribble.g | 2 +- .../parser/scribble/AntlrToScribParser.java | 12 ++++-- .../parser/scribble/ScribTreeAdaptor.java | 5 ++- scribble-test/src/test/scrib/tmp/Test.scr | 4 +- 16 files changed, 79 insertions(+), 34 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/main/MainContext.java b/scribble-cli/src/main/java/org/scribble/main/MainContext.java index fcf02afa8..9485c5a46 100644 --- a/scribble-cli/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-cli/src/main/java/org/scribble/main/MainContext.java @@ -117,6 +117,10 @@ public MainContext(boolean debug, ResourceLocator locator, Path mainpath, Resource res = DirectoryResourceLocator.getResourceByFullPath(mainpath); // TODO: hardcoded to DirectoryResourceLocator -- main module loading should be factored out to front end (e.g. CommandLine) CommonTree atree = this.antlrParser.parseAntlrTree(res); + + System.out.println("bbb: " + atree.getClass() + " ,, " + atree.getChildren()); + // HERE: deprecate scribParser + Module mod = (Module) this.scribParser.parse(atree, this.af); // TODO: rename exceptions checkMainModuleName(mainpath, mod); @@ -135,7 +139,8 @@ public MainContext(boolean debug, ResourceLocator locator, String inline, spin); Resource res = new InlineResource(inline); - Module mod = (Module) this.scribParser.parse(this.antlrParser.parseAntlrTree(res), this.af); + Module mod = (Module) this.scribParser + .parse(this.antlrParser.parseAntlrTree(res), this.af); init(res, mod); } diff --git a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java index 57c7d2fbc..7c7572386 100644 --- a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java +++ b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java @@ -71,19 +71,20 @@ public HeaderParamDeclList visitChildren(AstVisitor nv) public int length() { - return this.decls.size(); + return getParamDeclChildren().size(); } public boolean isEmpty() { - return this.decls.isEmpty(); + return length() == 0; } // Without enclosing braces -- added by subclasses @Override public String toString() { - return this.decls.stream().map(nd -> nd.toString()).collect(Collectors.joining(", ")); + return getParamDeclChildren().stream().map(nd -> nd.toString()) + .collect(Collectors.joining(", ")); } diff --git a/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java b/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java index abb388239..104027eaf 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java @@ -39,7 +39,7 @@ protected final NameNode getRawNameNodeChild() { if (getChildCount() != 1) { - throw new RuntimeException("Shouldn't get in here: " + this); + throw new RuntimeException("Shouldn't get in here: " + getChildren()); } NameNode name = (NameNode) getChild(0); return name; diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java index abf09f477..eefc60810 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -13,6 +13,7 @@ */ package org.scribble.ast; +import java.util.Collections; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; @@ -69,9 +70,15 @@ public ScribNode getChild(int i) return (ScribNode) super.getChild(i); } + // N.B. "overriding" base ANTLR behaviour of (sometimes?) returning null when + // getChildCount() == 0 by returning an empty list instead @Override public List getChildren() { + if (getChildCount() == 0) + { + return Collections.emptyList(); + } return ((Stream) super.getChildren().stream()).map(x -> (ScribNode) x) .collect(Collectors.toList()); } @@ -158,7 +165,8 @@ protected ScribNode visitChild(ScribNode child, AstVisitor nv) throws ScribbleEx public static final T del(T n, ScribDel del) { - ScribNodeBase copy = ((ScribNodeBase) n).copy(); + //ScribNodeBase copy = ((ScribNodeBase) n).copy(); + ScribNodeBase copy = ((ScribNodeBase) n).clone(); // Need deep clone, since children have parent field copy.del = del; return ScribUtil.castNodeByClass(n, copy); } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolHeader.java b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolHeader.java index 4854b6dd1..09cecae8c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolHeader.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolHeader.java @@ -49,7 +49,7 @@ public GProtocolHeader dupNode() @Override public GProtocolNameNode getNameNodeChild() { - return (GProtocolNameNode) getNameNodeChild(); + return (GProtocolNameNode) getRawNameNodeChild(); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java index 56003667a..df5555fae 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java @@ -14,6 +14,8 @@ package org.scribble.ast.name; import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; @@ -25,8 +27,6 @@ public abstract class NameNode extends ScribNodeBase implements Named { - protected final String[] elems; - // ScribTreeAdaptor#create constructor public NameNode(Token t) { @@ -35,42 +35,59 @@ public NameNode(Token t) } // Tree#dupNode constructor - protected NameNode(NameNode node, String...elems) + protected NameNode(NameNode node)//, String...elems) { super(node); - this.elems = elems; + this.elems = null;//elems; } public abstract NameNode dupNode(); public String[] getElements() { - return Arrays.copyOf(this.elems, this.elems.length); + //return Arrays.copyOf(this.elems, this.elems.length); + return getSimpleNameList().toArray(new String[0]); + } + + protected List getSimpleNameList() + { + return ((List) getChildren()).stream() + .map(x -> ((CommonTree) x).getText()).collect(Collectors.toList()); + // CHECKME: factor out getText? } public int getElementCount() { - return this.elems.length; + //return this.elems.length; + return getChildCount(); } public boolean isEmpty() { - return this.elems.length == 0; + return getElementCount() == 0; } protected boolean isPrefixed() { - return this.elems.length > 1; + return getElementCount() > 1; } protected String[] getPrefixElements() { - return Arrays.copyOfRange(this.elems, 0, this.elems.length - 1); + //return Arrays.copyOfRange(this.elems, 0, this.elems.length - 1); + if (getElementCount() <= 1) + { + return new String[0]; + } + List names = getSimpleNameList(); + return names.subList(1, names.size()).toArray(new String[0]); } protected String getLastElement() { - return this.elems[this.elems.length - 1]; + //return getElements()[getElementCount() - 1]; + List names = getSimpleNameList(); + return names.get(names.size() - 1); } @Override @@ -94,7 +111,8 @@ public boolean equals(Object o) // FIXME: should NameNodes ever be used in an e public int hashCode() { int hash = 317; - hash = 31 * hash + this.elems.hashCode(); + hash = 31 * hash + Arrays.hashCode(getElements()); + // Hash the String values, not the actual Tree nodes return hash; } @@ -112,6 +130,7 @@ public String toString() + private final String[] elems; public NameNode(CommonTree source, String... elems) { diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java index a68faa811..33e5a1d1b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java @@ -93,7 +93,7 @@ public boolean canEqual(Object o) public int hashCode() { int hash = 409; - hash = 31 * hash + this.elems.hashCode(); + hash = 31 * hash + super.hashCode(); return hash; } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java index 7996fbced..e06cb34d5 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java @@ -35,7 +35,7 @@ protected GProtocolNameNode(GProtocolNameNode node, String...elems) @Override public GProtocolNameNode dupNode() { - return new GProtocolNameNode(this, this.elems); + return new GProtocolNameNode(this, getElements()); } @Override @@ -71,7 +71,7 @@ public boolean canEqual(Object o) public int hashCode() { int hash = 419; - hash = 31 * hash + this.elems.hashCode(); + hash = 31 * hash + super.hashCode(); return hash; } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java index 375aed4e9..c225b8b13 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java @@ -37,7 +37,7 @@ protected LProtocolNameNode(LProtocolNameNode node, String...elems) @Override public LProtocolNameNode dupNode() { - return new LProtocolNameNode(this, this.elems); + return new LProtocolNameNode(this, getElements()); } @Override @@ -85,7 +85,7 @@ public boolean canEqual(Object o) public int hashCode() { int hash = 421; - hash = 31 * hash + this.elems.hashCode(); + hash = 31 * hash + super.hashCode(); return hash; } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java index 9f18191c5..8e6a9489d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java @@ -38,7 +38,7 @@ protected MessageSigNameNode(MessageSigNameNode node, String...elems) @Override public MessageSigNameNode dupNode() { - return new MessageSigNameNode(this, this.elems); + return new MessageSigNameNode(this, getElements()); } @Override @@ -98,7 +98,7 @@ public boolean canEqual(Object o) public int hashCode() { int hash = 421; - hash = 31 * hash + this.elems.hashCode(); + hash = 31 * hash + super.hashCode(); return hash; } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java index 689e6c83d..148c2f701 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java @@ -36,7 +36,7 @@ protected ModuleNameNode(ModuleNameNode node, String...elems) @Override public ModuleNameNode dupNode() { - return new ModuleNameNode(this, this.elems); + return new ModuleNameNode(this, getElements()); } @Override @@ -72,7 +72,7 @@ public boolean canEqual(Object o) public int hashCode() { int hash = 409; - hash = 31 * hash + this.elems.hashCode(); + hash = 31 * hash + super.hashCode(); return hash; } diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java index cb66e8d61..efb0e40ad 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java @@ -32,6 +32,9 @@ public ModuleContextBuilder(Job job) @Override protected void enter(ScribNode parent, ScribNode child) throws ScribbleException { + System.out.println("aaa: " + child.getClass() + " ,, " + child.del()); + + child.del().enterModuleContextBuilding(parent, child, this); } diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index b93985620..0aa514963 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -22,7 +22,7 @@ options } -// FIXME: match tokens to keywords? +// CHECKME: match tokens to keywords? tokens { diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java index c777e114f..b64a7ff42 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java @@ -21,13 +21,13 @@ import org.antlr.runtime.tree.CommonErrorNode; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.Module; import org.scribble.ast.ScribNode; import org.scribble.parser.scribble.ScribbleAntlrConstants.AntlrNodeType; import org.scribble.parser.scribble.ast.AntlrDataTypeDecl; import org.scribble.parser.scribble.ast.AntlrImportModule; import org.scribble.parser.scribble.ast.AntlrMessageSig; import org.scribble.parser.scribble.ast.AntlrMessageSigDecl; +import org.scribble.parser.scribble.ast.AntlrModule; import org.scribble.parser.scribble.ast.AntlrModuleDecl; import org.scribble.parser.scribble.ast.AntlrNonRoleArgList; import org.scribble.parser.scribble.ast.AntlrNonRoleParamDecl; @@ -70,8 +70,14 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException { case PAYLOAD: return AntlrPayloadElemList.parsePayloadElemList(this, ct, af); - case MODULE: //return AntlrModule.parseModule(this, ct, af); - return (Module) ct; + case MODULE: + + // HERE + System.out.println("CCC1"); + + return AntlrModule.parseModule(this, ct, af); + //return (Module) ct; + case MODULEDECL: return AntlrModuleDecl.parseModuleDecl(this, ct, af); case MESSAGESIGNATUREDECL: return AntlrMessageSigDecl.parseMessageSigDecl(this, ct, af); case PAYLOADTYPEDECL: return AntlrDataTypeDecl.parseDataTypeDecl(this, ct, af); diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 56d60a9a2..03a97a8e0 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -22,7 +22,7 @@ // get/setType don't seem to be really used public class ScribTreeAdaptor extends CommonTreeAdaptor { - private final AstFactory f = new AstFactoryImpl(); + //private final AstFactory f = new AstFactoryImpl(); @Override public Object create(Token t) @@ -74,6 +74,9 @@ public Object create(Token t) case "MESSAGESIGNATURE": //return this.f.Me return new MessageSigNameNode(t); case "PAYLOAD": + + HERE: check MyCommonTree instantiation + return new MyCommonTree(t); // FIXME: placeholder for deleg, qualified or ambig //case "QUALIFIEDNAME": //return this.f.Q /*case tmp diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index d00734edb..2ba7dd46b 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -34,10 +34,10 @@ module tmp.Test; -/*global protocol Proto1(role A, role B) +global protocol Proto1(role A, role B) { 1() from A to B; -}*/ +} /* From c2d69ce45906a8c36ce5b657f41c3ff1559a1496 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 2 Feb 2019 22:17:18 +0000 Subject: [PATCH 085/539] Continued WIP. --- .../java/org/scribble/ast/NameDeclNode.java | 4 +- .../java/org/scribble/ast/ProtocolHeader.java | 6 +- .../main/java/org/scribble/ast/ScribNil.java | 25 +++++++++ .../java/org/scribble/ast/name/NameNode.java | 3 +- .../visit/context/ModuleContextBuilder.java | 2 +- .../org/scribble/parser/antlr/Scribble.g | 34 ++++++++---- .../parser/scribble/AntlrToScribParser.java | 8 +-- .../parser/scribble/ScribTreeAdaptor.java | 55 ++++++++++++++----- 8 files changed, 102 insertions(+), 35 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/ast/ScribNil.java diff --git a/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java b/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java index 104027eaf..3d2f3c1f8 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java @@ -37,9 +37,9 @@ public NameDeclNode(NameDeclNode node) protected final NameNode getRawNameNodeChild() { - if (getChildCount() != 1) + if (getChildCount() < 1) // E.g., ProtocolHeader two more children { - throw new RuntimeException("Shouldn't get in here: " + getChildren()); + throw new RuntimeException("Shouldn't get in here: " + getClass()); } NameNode name = (NameNode) getChild(0); return name; diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java index 21535cf3c..1167c9daa 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java @@ -51,12 +51,12 @@ protected ProtocolHeader(ProtocolHeader node) public RoleDeclList getRoleDeclListChild() { - return (RoleDeclList) getChild(1); + return (RoleDeclList) getChild(2); // TODO: swap order with paramdecllist (in grammar) } public NonRoleParamDeclList getParamDeclListChild() { - return (NonRoleParamDeclList) getChild(2); + return (NonRoleParamDeclList) getChild(1); } public ProtocolHeader reconstruct(ProtocolNameNode name, @@ -82,7 +82,7 @@ public ProtocolHeader visitChildren(AstVisitor nv) throws ScribbleException public boolean isParameterDeclListEmpty() { - return this.paramdecls.isEmpty(); + return getParamDeclListChild().isEmpty(); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNil.java b/scribble-core/src/main/java/org/scribble/ast/ScribNil.java new file mode 100644 index 000000000..28edb6d4c --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/ast/ScribNil.java @@ -0,0 +1,25 @@ +package org.scribble.ast; + +import org.antlr.runtime.Token; +import org.antlr.runtime.tree.CommonTree; + +public class ScribNil extends ScribNodeBase +{ + // Used by (Scrib)TreeAdapator + public ScribNil() + { + super((Token) null); + } + + // Copy constructor + protected ScribNil(CommonTree node) + { + super(node); + } + + @Override + public ScribNodeBase dupNode() + { + return new ScribNil(this); // nil can have children(?), so may need to actually copy + } +} diff --git a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java index df5555fae..37bb8b8e8 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java @@ -91,7 +91,8 @@ protected String getLastElement() } @Override - public boolean equals(Object o) // FIXME: should NameNodes ever be used in an equality checking context? (cf. other AST nodes) -- this work should be done using sesstype.Name instead? + public boolean equals(Object o) + // CHECKME: should NameNodes ever be used in an equality checking context? (cf. other AST nodes) -- this work should be done using sesstype.Name instead? { if (this == o) { diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java index efb0e40ad..dc9e54f19 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java @@ -32,7 +32,7 @@ public ModuleContextBuilder(Job job) @Override protected void enter(ScribNode parent, ScribNode child) throws ScribbleException { - System.out.println("aaa: " + child.getClass() + " ,, " + child.del()); + System.out.println("aaa: " + child.getClass() + " ,, " + child.del()); // FIXME: del decorator child.del().enterModuleContextBuilding(parent, child, this); diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 0aa514963..d180e7898 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -149,9 +149,6 @@ tokens GLOBALCHOICE = 'GLOBALCHOICE'; GLOBALRECURSION = 'GLOBALRECURSION'; GLOBALCONTINUE = 'GLOBALCONTINUE'; - /*GLOBALPARALLEL = 'GLOBALPARALLEL'; - GLOBALINTERRUPTIBLE = 'GLOBALINTERRUPTIBLE'; - GLOBALINTERRUPT = 'GLOBALINTERRUPT';*/ GLOBALDO = 'GLOBALDO'; /*LOCALPROTOCOLDECL = 'local-protocol-decl'; @@ -174,6 +171,11 @@ tokens LOCALCATCHES = 'local-catches'; LOCALSEND = 'local-send'; LOCALRECEIVE = 'local-receive';*/ + + + GPROTOCOLNAME = 'GPROTOCOLNAME'; + ROLENAME = 'ROLENAME'; + ID = 'ID'; } @@ -380,6 +382,9 @@ simplemessagesignaturename: simplename; simpleprotocolname: simplename; simplemembername: simplename; // Only for member declarations +gprotocolname: simplename; + + qualifiedname: IDENTIFIER ('.' IDENTIFIER)* -> @@ -395,6 +400,7 @@ modulename: -> ^(MODULENAME IDENTIFIER+) ; +// ^(MODULENAME ^(ID IDENTIFIER)+) protocolname: membername; @@ -558,15 +564,17 @@ globalprotocoldeclmodifiers: ^(GLOBALPROTOCOLDECLMODS AUX_KW) ; +// GLOBAL_KW PROTOCOL_KW simpleprotocolname roledecllist globalprotocolheader: - GLOBAL_KW PROTOCOL_KW simpleprotocolname roledecllist + GLOBAL_KW PROTOCOL_KW gprotocolname roledecllist -> - ^(GLOBALPROTOCOLHEADER simpleprotocolname ^(PARAMETERDECLLIST) roledecllist) + ^(GLOBALPROTOCOLHEADER ^(GPROTOCOLNAME gprotocolname) ^(PARAMETERDECLLIST) roledecllist) | - GLOBAL_KW PROTOCOL_KW simpleprotocolname parameterdecllist roledecllist + GLOBAL_KW PROTOCOL_KW gprotocolname parameterdecllist roledecllist -> - ^(GLOBALPROTOCOLHEADER simpleprotocolname parameterdecllist roledecllist) + ^(GLOBALPROTOCOLHEADER ^(GPROTOCOLNAME gprotocolname) parameterdecllist roledecllist) ; +// GLOBAL_KW PROTOCOL_KW simpleprotocolname parameterdecllist roledecllist roledecllist: '(' roledecl (',' roledecl)* ')' @@ -577,7 +585,7 @@ roledecllist: roledecl: ROLE_KW rolename -> - ^(ROLEDECL rolename) + ^(ROLEDECL ^(ROLENAME rolename)) ; parameterdecllist: @@ -653,9 +661,15 @@ globalinteraction: * Section 3.7.4 Global Message Transfer */ globalmessagetransfer: - message FROM_KW rolename TO_KW rolename (',' rolename )* ';' + message FROM_KW rolename TO_KW rolenamenode (',' rolenamenode )* ';' +-> + ^(GLOBALMESSAGETRANSFER message rolenamenode+) +; + +rolenamenode: + rolename -> - ^(GLOBALMESSAGETRANSFER message rolename rolename+) + ^(ROLENAME rolename) ; message: diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java index b64a7ff42..ba3ab5c91 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java @@ -21,13 +21,13 @@ import org.antlr.runtime.tree.CommonErrorNode; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; +import org.scribble.ast.Module; import org.scribble.ast.ScribNode; import org.scribble.parser.scribble.ScribbleAntlrConstants.AntlrNodeType; import org.scribble.parser.scribble.ast.AntlrDataTypeDecl; import org.scribble.parser.scribble.ast.AntlrImportModule; import org.scribble.parser.scribble.ast.AntlrMessageSig; import org.scribble.parser.scribble.ast.AntlrMessageSigDecl; -import org.scribble.parser.scribble.ast.AntlrModule; import org.scribble.parser.scribble.ast.AntlrModuleDecl; import org.scribble.parser.scribble.ast.AntlrNonRoleArgList; import org.scribble.parser.scribble.ast.AntlrNonRoleParamDecl; @@ -72,11 +72,11 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException case MODULE: - // HERE + // HERE deprecating Antlr->Scrib parsing System.out.println("CCC1"); - return AntlrModule.parseModule(this, ct, af); - //return (Module) ct; + //return AntlrModule.parseModule(this, ct, af); + return (Module) ct; case MODULEDECL: return AntlrModuleDecl.parseModuleDecl(this, ct, af); case MESSAGESIGNATUREDECL: return AntlrMessageSigDecl.parseMessageSigDecl(this, ct, af); diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 03a97a8e0..a8a76190d 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -2,28 +2,37 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTreeAdaptor; -import org.scribble.ast.AstFactory; -import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.Module; import org.scribble.ast.ModuleDecl; import org.scribble.ast.NonRoleParamDeclList; +import org.scribble.ast.PayloadElemList; import org.scribble.ast.RoleDecl; import org.scribble.ast.RoleDeclList; +import org.scribble.ast.ScribNil; import org.scribble.ast.global.GInteractionSeq; import org.scribble.ast.global.GMessageTransfer; import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.global.GProtocolDef; import org.scribble.ast.global.GProtocolHeader; +import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.parser.scribble.ast.tree.MyCommonTree; +import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.RoleNode; // get/setType don't seem to be really used public class ScribTreeAdaptor extends CommonTreeAdaptor { //private final AstFactory f = new AstFactoryImpl(); + // Generated parser seems to use nil to create "blank" nodes and then "fill them in" + @Override + public Object nil() + { + return new ScribNil(); + } + @Override public Object create(Token t) { @@ -33,12 +42,20 @@ public Object create(Token t) return new MyCommonTree(payload); }*/ - String lab = ""; + if (t == null) // E.g. nil() -- CHECKME: what are the nils being made for? + { + //return super.create(null); + //return nil(); + throw new RuntimeException("Shouldn't get in here: "); // null Token only for nil + } + + /*String lab = ""; if (t != null) { //return new MyCommonTree(payload); lab = t.getText(); - } + }*/ + String lab = t.getText(); //CommonTree empty = new CommonTree(t); // CommonTree constr sets this.token = payload.token switch (lab) { @@ -56,10 +73,14 @@ public Object create(Token t) return new GProtocolDecl(t); case "GLOBALPROTOCOLHEADER": //return this.f.GProtocolHeader(empty, null, null, null); return new GProtocolHeader(t); - case "ROLEDECL": //return this.f.RoleDecl(empty, null); - return new RoleDecl(t); + case "GPROTOCOLNAME": + return new GProtocolNameNode(t); case "ROLEDECLLIST": //return this.f.RoleDeclList(empty, Collections.emptyList()); return new RoleDeclList(t); + case "ROLEDECL": //return this.f.RoleDecl(empty, null); + return new RoleDecl(t); + case "ROLENAME": + return new RoleNode(t); case "PARAMETERDECLLIST": //return this.f.NonRoleParamDeclList(empty, Collections.emptyList()); return new NonRoleParamDeclList(t); case "GLOBALPROTOCOLDEF": //return this.f.GProtocolDef(empty, null); @@ -74,10 +95,9 @@ public Object create(Token t) case "MESSAGESIGNATURE": //return this.f.Me return new MessageSigNameNode(t); case "PAYLOAD": - - HERE: check MyCommonTree instantiation - - return new MyCommonTree(t); // FIXME: placeholder for deleg, qualified or ambig + return new PayloadElemList(t); + + //return new MyCommonTree(t); // FIXME: placeholder for deleg, qualified or ambig //case "QUALIFIEDNAME": //return this.f.Q /*case tmp case Test @@ -87,11 +107,18 @@ public Object create(Token t) case 1 case A case B*/ - case "": // CHECKME ? - return new MyCommonTree(t); + + //case "": // CHECKME ? nil? "If you want a flat tree (a list)" + /*MyCommonTree x = new MyCommonTree(t); + System.out.println("222: " + t + " ,, " + x); + return x;*/ + //return nil(); // CHECKME default: + System.out.println("333: " + t); //throw new RuntimeException("Shouldn't get here: " + lab + " ,, " + lab.length()); - return new MyCommonTree(t); // FIXME: rename ID + //return new MyCommonTree(t); + return + new AmbigNameNode(t); // FIXME: currently all name "leaf" nodes are there, so not ambig, more like ID //return empty; } } From e5928aef0efafef552f2da2a73e26933ba2266a1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 2 Feb 2019 22:24:54 +0000 Subject: [PATCH 086/539] Minor. --- .../java/org/scribble/main/MainContext.java | 5 ++++- .../java/org/scribble/ast/ScribNodeBase.java | 19 +++++++++++-------- .../parser/scribble/AntlrToScribParser.java | 9 +++------ 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/main/MainContext.java b/scribble-cli/src/main/java/org/scribble/main/MainContext.java index 9485c5a46..fccca67d7 100644 --- a/scribble-cli/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-cli/src/main/java/org/scribble/main/MainContext.java @@ -119,9 +119,12 @@ public MainContext(boolean debug, ResourceLocator locator, Path mainpath, CommonTree atree = this.antlrParser.parseAntlrTree(res); System.out.println("bbb: " + atree.getClass() + " ,, " + atree.getChildren()); - // HERE: deprecate scribParser + // FIXME HERE: deprecate scribParser -- move ANTLR error checking out Module mod = (Module) this.scribParser.parse(atree, this.af); // TODO: rename exceptions + + del decorator + checkMainModuleName(mainpath, mod); init(res, mod); diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java index eefc60810..57c0d13d8 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -128,6 +128,7 @@ public final ScribDel del() return this.del; } + // Defensive @Override public final ScribNodeBase del(ScribDel del) { @@ -145,6 +146,16 @@ protected final void setDel(ScribDel del) { this.del = del; } + + // Defensive helper with cast check + public static final T del(T n, ScribDel del) + { + //ScribNodeBase copy = ((ScribNodeBase) n).copy(); + ScribNodeBase copy = ((ScribNodeBase) n).clone(); // Need deep clone, since children have parent field + //copy.del = del; + copy.setDel(del); + return ScribUtil.castNodeByClass(n, copy); + } @Override public ScribNode accept(AstVisitor nv) throws ScribbleException @@ -163,14 +174,6 @@ protected ScribNode visitChild(ScribNode child, AstVisitor nv) throws ScribbleEx return nv.visit(this, child); } - public static final T del(T n, ScribDel del) - { - //ScribNodeBase copy = ((ScribNodeBase) n).copy(); - ScribNodeBase copy = ((ScribNodeBase) n).clone(); // Need deep clone, since children have parent field - copy.del = del; - return ScribUtil.castNodeByClass(n, copy); - } - @Override public ScribNode substituteNames(Substitutor subs) { diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java index ba3ab5c91..2f2eb9da3 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java @@ -68,7 +68,7 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException AntlrNodeType type = AntlrToScribParserUtil.getAntlrNodeType(ct); switch (type) { - case PAYLOAD: return AntlrPayloadElemList.parsePayloadElemList(this, ct, af); + //case PAYLOAD: return AntlrPayloadElemList.parsePayloadElemList(this, ct, af); case MODULE: @@ -78,7 +78,7 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException //return AntlrModule.parseModule(this, ct, af); return (Module) ct; - case MODULEDECL: return AntlrModuleDecl.parseModuleDecl(this, ct, af); + /*case MODULEDECL: return AntlrModuleDecl.parseModuleDecl(this, ct, af); case MESSAGESIGNATUREDECL: return AntlrMessageSigDecl.parseMessageSigDecl(this, ct, af); case PAYLOADTYPEDECL: return AntlrDataTypeDecl.parseDataTypeDecl(this, ct, af); case IMPORTMODULE: return AntlrImportModule.parseImportModule(this, ct, af); @@ -105,11 +105,8 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException case GLOBALCHOICE: return AntlrGChoice.parseGChoice(this, ct, af); case GLOBALRECURSION: return AntlrGRecursion.parseGRecursion(this, ct, af); case GLOBALCONTINUE: return AntlrGContinue.parseGContinue(this, ct, af); - /*case GLOBALPARALLEL: return AntlrGParallel.parseGParallel(this, ct, af); - case GLOBALINTERRUPTIBLE: return AntlrGInterruptible.parseGInterruptible(this, ct, af); - case GLOBALINTERRUPT: return AntlrGInterrupt.parseGInterrupt(this, ct, af);*/ case GLOBALDO: return AntlrGDo.parseGDo(this, ct, af); - case GLOBALWRAP: return AntlrGWrap.parseGWrap(this, ct, af); + case GLOBALWRAP: return AntlrGWrap.parseGWrap(this, ct, af);*/ default: throw new RuntimeException("Unknown ANTLR node type: " + type); } } From 6785731063f9008ade3a572bf7b118b5d812699d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 4 Feb 2019 18:58:14 +0000 Subject: [PATCH 087/539] Continued WIP. --- .../java/org/scribble/main/MainContext.java | 6 +- .../java/org/scribble/ast/AstFactoryImpl.java | 6 +- .../java/org/scribble/ast/DelDecorator.java | 116 +++ .../org/scribble/ast/DelDecoratorImpl.java | 699 ++++++++++++++++++ .../java/org/scribble/ast/NameDeclNode.java | 2 +- .../java/org/scribble/ast/ProtocolHeader.java | 2 + .../ast/name/qualified/DataTypeNode.java | 6 +- .../ast/name/qualified/GProtocolNameNode.java | 4 +- .../ast/name/qualified/LProtocolNameNode.java | 4 +- .../ast/name/qualified/MemberNameNode.java | 2 +- .../name/qualified/MessageSigNameNode.java | 4 +- .../ast/name/qualified/ModuleNameNode.java | 4 +- .../ast/name/qualified/ProtocolNameNode.java | 4 +- .../ast/name/qualified/QualifiedNameNode.java | 4 +- .../ast/name/simple/AmbigNameNode.java | 12 +- .../name/simple/DummyProjectionRoleNode.java | 6 +- .../ast/name/simple/NonRoleParamNode.java | 6 +- .../org/scribble/ast/name/simple/OpNode.java | 6 +- .../scribble/ast/name/simple/RecVarNode.java | 6 +- .../scribble/ast/name/simple/RoleNode.java | 11 +- .../ast/name/simple/SimpleNameNode.java | 4 +- .../org/scribble/parser/antlr/Scribble.g | 11 +- .../parser/scribble/AntlrToScribParser.java | 2 +- .../scribble/AntlrToScribParserUtil.java | 2 +- .../parser/scribble/ScribTreeAdaptor.java | 7 +- 25 files changed, 885 insertions(+), 51 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/ast/DelDecorator.java create mode 100644 scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java diff --git a/scribble-cli/src/main/java/org/scribble/main/MainContext.java b/scribble-cli/src/main/java/org/scribble/main/MainContext.java index fccca67d7..395bc1897 100644 --- a/scribble-cli/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-cli/src/main/java/org/scribble/main/MainContext.java @@ -24,6 +24,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.AstFactoryImpl; +import org.scribble.ast.DelDecoratorImpl; import org.scribble.ast.ImportDecl; import org.scribble.ast.ImportModule; import org.scribble.ast.Module; @@ -123,7 +124,10 @@ public MainContext(boolean debug, ResourceLocator locator, Path mainpath, Module mod = (Module) this.scribParser.parse(atree, this.af); // TODO: rename exceptions - del decorator + /*HERE del decorator + move ast to parser? and make core/lang*/ + + new DelDecoratorImpl().decorate(mod); checkMainModuleName(mainpath, mod); diff --git a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java index 283d6ebea..e3f233622 100644 --- a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -34,7 +34,6 @@ import org.scribble.ast.global.GWrap; import org.scribble.ast.local.LAccept; import org.scribble.ast.local.LChoice; -import org.scribble.ast.local.LRequest; import org.scribble.ast.local.LContinue; import org.scribble.ast.local.LDelegationElem; import org.scribble.ast.local.LDisconnect; @@ -48,6 +47,7 @@ import org.scribble.ast.local.LProtocolHeader; import org.scribble.ast.local.LReceive; import org.scribble.ast.local.LRecursion; +import org.scribble.ast.local.LRequest; import org.scribble.ast.local.LSend; import org.scribble.ast.local.LWrapClient; import org.scribble.ast.local.LWrapServer; @@ -91,7 +91,6 @@ import org.scribble.del.global.GWrapDel; import org.scribble.del.local.LAcceptDel; import org.scribble.del.local.LChoiceDel; -import org.scribble.del.local.LRequestDel; import org.scribble.del.local.LContinueDel; import org.scribble.del.local.LDisconnectDel; import org.scribble.del.local.LDoDel; @@ -102,6 +101,7 @@ import org.scribble.del.local.LProtocolDefDel; import org.scribble.del.local.LReceiveDel; import org.scribble.del.local.LRecursionDel; +import org.scribble.del.local.LRequestDel; import org.scribble.del.local.LSendDel; import org.scribble.del.local.LWrapClientDel; import org.scribble.del.local.LWrapServerDel; @@ -540,7 +540,7 @@ public LProtocolDecl LProtocolDecl(CommonTree source, List mods, GProtocolName fullname, Role self, LProtocolHeader header, LProtocolDef def) // del extends that of LProtocolDecl { LProjectionDecl lpd = new LProjectionDecl(source, mods, header, def); - lpd = ScribNodeBase.del(lpd, new LProjectionDeclDel(fullname, self)); + lpd = del(lpd, new LProjectionDeclDel(fullname, self)); return lpd; } diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java b/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java new file mode 100644 index 000000000..c89c79057 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java @@ -0,0 +1,116 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.global.GInteractionSeq; +import org.scribble.ast.global.GMessageTransfer; +import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ast.global.GProtocolDef; +import org.scribble.ast.global.GProtocolHeader; +import org.scribble.ast.name.qualified.DataTypeNode; +import org.scribble.ast.name.qualified.GProtocolNameNode; +import org.scribble.ast.name.qualified.LProtocolNameNode; +import org.scribble.ast.name.qualified.MessageSigNameNode; +import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.ast.name.simple.OpNode; +import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.ast.name.simple.RoleNode; + + +// ast package to access protected non-defensive del setter +public interface DelDecorator +{ + void decorate(CommonTree n); + + // TODO: make void return types to be more clear about non-defensiveness + Module Module(Module m); + + ModuleDecl ModuleDecl(ModuleDecl md); + ImportModule ImportModule(ImportModule im); + + /*MessageSigNameDecl MessageSigNameDecl(MessageSigNameDecl md); + DataTypeDecl DataTypeDecl(DataTypeDecl dd);*/ + + GProtocolDecl GProtocolDecl(GProtocolDecl gpd); + GProtocolHeader GProtocolHeader(GProtocolHeader gph); + + RoleDeclList RoleDeclList(RoleDeclList rds); + RoleDecl RoleDecl(RoleDecl rd); + NonRoleParamDeclList NonRoleParamDeclList(NonRoleParamDeclList pds); + // NonRoleParamDecl NonRoleParamDecl(CommonTree source, K kind, NonRoleParamNode name); + + GProtocolDef GProtocolDef(GProtocolDef gpd); + GProtocolBlock GProtocolBlock(GProtocolBlock gpb); + GInteractionSeq GInteractionSeq(GInteractionSeq gis); + + GMessageTransfer GMessageTransfer(GMessageTransfer gmt); + /*GConnect GConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest); + GDisconnect GDisconnect(CommonTree source, RoleNode src, RoleNode dest); + GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest); + GChoice GChoice(CommonTree source, RoleNode subj, List blocks); + GRecursion GRecursion(CommonTree source, RecVarNode recvar, GProtocolBlock block); + GContinue GContinue(CommonTree source, RecVarNode recvar); + GDo GDo(CommonTree source, RoleArgList roles, NonRoleArgList args, GProtocolNameNode proto);*/ + + MessageSigNode MessageSigNode(MessageSigNode n); + PayloadElemList PayloadElemList(PayloadElemList pay); + // UnaryPayloadElem UnaryPayloadElem(UnaryPayloadElem e); + + /*GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode name, RoleNode role); + LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode name); + + RoleArgList RoleArgList(CommonTree source, List roles); + RoleArg RoleArg(CommonTree source, RoleNode role); + NonRoleArgList NonRoleArgList(CommonTree source, List args); + NonRoleArg NonRoleArg(CommonTree source, NonRoleArgNode arg);*/ + + /* NameNode SimpleNameNode(CommonTree source, K kind, String identifier); + QualifiedNameNode QualifiedNameNode(CommonTree source, K kind, String... elems);*/ + + RecVarNode RecVarNode(RecVarNode rv); + RoleNode RoleNode(RoleNode r); + OpNode OpNode(OpNode op); + MessageSigNameNode MessageSigNameNode(MessageSigNameNode mn); + DataTypeNode DataTypeNode(DataTypeNode dn); + ModuleNameNode ModuleNameNode(ModuleNameNode mn); + GProtocolNameNode GProtocolNameNode(GProtocolNameNode gpn); + LProtocolNameNode LProtocolNameNode(LProtocolNameNode lpn); + + /*AmbigNameNode AmbiguousNameNode(CommonTree source, String identifier); + NonRoleParamNode NonRoleParamNode(CommonTree source, K kind, String identifier); + DummyProjectionRoleNode DummyProjectionRoleNode(); + + LProtocolDecl LProtocolDecl(CommonTree source, List modifiers, LProtocolHeader header, LProtocolDef def); // Not currently used -- local protos not parsed, only projected + LProjectionDecl LProjectionDecl(CommonTree source, List modifiers, GProtocolName fullname, Role self, LProtocolHeader header, LProtocolDef def); // del extends that of LProtocolDecl + + LProtocolHeader LProtocolHeader(CommonTree source, LProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls); + SelfRoleDecl SelfRoleDecl(CommonTree source, RoleNode namenode); + LProtocolDef LProtocolDef(CommonTree source, LProtocolBlock block); + LProtocolBlock LProtocolBlock(CommonTree source, LInteractionSeq seq); + LInteractionSeq LInteractionSeq(CommonTree source, List actions); + + LSend LSend(CommonTree source, RoleNode src, MessageNode msg, List dests); + LReceive LReceive(CommonTree source, RoleNode src, MessageNode msg, List dests); + LRequest LRequest(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest); + LAccept LAccept(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest); + LDisconnect LDisconnect(CommonTree source, RoleNode self, RoleNode peer); + LWrapClient LWrapClient(CommonTree source, RoleNode self, RoleNode peer); + LWrapServer LWrapServer(CommonTree source, RoleNode self, RoleNode peer); + LChoice LChoice(CommonTree source, RoleNode subj, List blocks); + LRecursion LRecursion(CommonTree source, RecVarNode recvar, LProtocolBlock block); + LContinue LContinue(CommonTree source, RecVarNode recvar); + LDo LDo(CommonTree source, RoleArgList roles, NonRoleArgList args, LProtocolNameNode proto);*/ +} diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java new file mode 100644 index 000000000..887453609 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java @@ -0,0 +1,699 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast; + +import java.util.List; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.global.GInteractionSeq; +import org.scribble.ast.global.GMessageTransfer; +import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ast.global.GProtocolDef; +import org.scribble.ast.global.GProtocolHeader; +import org.scribble.ast.name.qualified.DataTypeNode; +import org.scribble.ast.name.qualified.GProtocolNameNode; +import org.scribble.ast.name.qualified.LProtocolNameNode; +import org.scribble.ast.name.qualified.MessageSigNameNode; +import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.ast.name.simple.OpNode; +import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.DefaultDel; +import org.scribble.del.ImportModuleDel; +import org.scribble.del.ModuleDel; +import org.scribble.del.NonRoleParamDeclListDel; +import org.scribble.del.RoleDeclDel; +import org.scribble.del.RoleDeclListDel; +import org.scribble.del.ScribDel; +import org.scribble.del.global.GInteractionSeqDel; +import org.scribble.del.global.GMessageTransferDel; +import org.scribble.del.global.GProtocolBlockDel; +import org.scribble.del.global.GProtocolDeclDel; +import org.scribble.del.global.GProtocolDefDel; +import org.scribble.del.name.DataTypeNodeDel; +import org.scribble.del.name.MessageSigNameNodeDel; +import org.scribble.del.name.RecVarNodeDel; +import org.scribble.del.name.RoleNodeDel; + + +// ast package to access protected non-defensive del setter +public class DelDecoratorImpl implements DelDecorator +{ + public DelDecoratorImpl() + { + + } + + // TODO: refactor, cf. AntlrToScribParserUtil + // Visitor enter/leave framework uses dels -- DelDecorator is a proto visitor (akin to parsing) + public void decorate(CommonTree n) + { + + + String type = n.getToken().getText(); // CHECKME: do by Antlr Token, or at this point by Scib AST type? + + System.out.println("5555: " + n.getClass() + " ,, " + type + " ,, " + n); + + switch (type) + { + + case "MODULE": + Module((Module) n); + break; + case "MODULEDECL": + ModuleDecl((ModuleDecl) n); + break; + + //case IMPORTMODULE: + + /*case MESSAGESIGNATUREDECL: return AntlrMessageSigDecl.parseMessageSigDecl(this, ct, af); + case PAYLOADTYPEDECL: return AntlrDataTypeDecl.parseDataTypeDecl(this, ct, af);*/ + + case "GLOBALPROTOCOLDECL": + GProtocolDecl((GProtocolDecl) n); + break; + case "ROLEDECLLIST": + RoleDeclList((RoleDeclList) n); + break; + case "ROLEDECL": + RoleDecl((RoleDecl) n); + break; + case "PARAMETERDECLLIST": + //case EMPTY_PARAMETERDECLLST: + NonRoleParamDeclList((NonRoleParamDeclList) n); + break; + //case PARAMETERDECL: return AntlrNonRoleParamDecl.parseNonRoleParamDecl(this, ct, af);*/ + + case "GLOBALPROTOCOLHEADER": + GProtocolHeader((GProtocolHeader) n); + break; + case "GLOBALPROTOCOLDEF": + GProtocolDef((GProtocolDef) n); + break; + case "GLOBALPROTOCOLBLOCK": + GProtocolBlock((GProtocolBlock) n); + break; + case "GLOBALINTERACTIONSEQUENCE": + GInteractionSeq((GInteractionSeq) n); + break; + + case "MESSAGESIGNATURE": + MessageSigNode((MessageSigNode) n); + break; + case "PAYLOAD": + PayloadElemList((PayloadElemList) n); + break; + + /*case ROLEINSTANTIATIONLIST: return AntlrRoleArgList.parseRoleArgList(this, ct, af); + case ROLEINSTANTIATION: return AntlrRoleArg.parseRoleArg(this, ct, af); + case ARGUMENTINSTANTIATIONLIST: return AntlrNonRoleArgList.parseNonRoleArgList(this, ct, af);*/ + + case "GLOBALMESSAGETRANSFER": + GMessageTransfer((GMessageTransfer) n); + break; + /*case GLOBALCONNECT: return AntlrGConnect.parseGConnect(this, ct, af); + case GLOBALDISCONNECT: return AntlrGDisconnect.parseGDisconnect(this, ct, af); + case GLOBALCHOICE: return AntlrGChoice.parseGChoice(this, ct, af); + case GLOBALRECURSION: return AntlrGRecursion.parseGRecursion(this, ct, af); + case GLOBALCONTINUE: return AntlrGContinue.parseGContinue(this, ct, af); + case GLOBALDO: return AntlrGDo.parseGDo(this, ct, af); + case GLOBALWRAP: return AntlrGWrap.parseGWrap(this, ct, af);*/ + + case "ROLENAME": + RoleNode((RoleNode) n); + break; + case "OPNAME": + OpNode((OpNode) n); + break; + case "MODULENAME": + + System.out.println("5555b: " + n.getClass() + " ,, " + type + " ,, " + n); + System.out.println("4444:" + n + " ,, " + n.getChildren()); + + ModuleNameNode((ModuleNameNode) n); + break; + + default: // Leaf "ID" nodes + //throw new RuntimeException("Unknown ANTLR node type: " + type); + System.out.println("9999:" + n + " ,, " + n.getChildren()); + break; + } + + System.out.println("8888:" + n + " ,, " + n.getChildren()); + ((List) n.getChildren()).stream().map(x -> (CommonTree) x) + .forEach(x -> decorate(x)); + } + + /*@Override + public GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role) + { + GDelegationElem de = new GDelegationElem(source, proto, role); + //de = del(de, createDefaultDelegate()); + de = setDel(de, new GDelegationElemDel()); // FIXME: GDelegationElemDel + return de; + } + + @Override + public LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode proto) + { + LDelegationElem de = new LDelegationElem(source, proto); + de = setDel(de, createDefaultDelegate()); + return de; + }*/ + + @Override + public Module Module(Module m) + { + return setDel(m, new ModuleDel()); + } + + @Override + public ModuleDecl ModuleDecl(ModuleDecl md) + { + return setDel(md, createDefaultDelegate()); + } + + @Override + public ImportModule ImportModule(ImportModule im) + { + return setDel(im, new ImportModuleDel()); + } + + /*@Override + public MessageSigNameDecl MessageSigNameDecl(CommonTree source, String schema, String extName, String extSource, MessageSigNameNode alias) + { + MessageSigNameDecl msd = new MessageSigNameDecl(source, schema, extName, extSource, alias); + msd = setDel(msd, createDefaultDelegate()); + return msd; + } + + @Override + public DataTypeDecl DataTypeDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode alias) + { + DataTypeDecl dtd = new DataTypeDecl(source, schema, extName, extSource, alias); + dtd = setDel(dtd, createDefaultDelegate()); + return dtd; + }*/ + + @Override + public GProtocolDecl GProtocolDecl(GProtocolDecl gpd) + { + return setDel(gpd, new GProtocolDeclDel()); + } + + @Override + public GProtocolHeader GProtocolHeader(GProtocolHeader gph) + { + return setDel(gph, createDefaultDelegate()); + } + + @Override + public RoleDeclList RoleDeclList(RoleDeclList rds) + { + return setDel(rds, new RoleDeclListDel()); + } + + @Override + public RoleDecl RoleDecl(RoleDecl rd) + { + return setDel(rd, new RoleDeclDel()); + } + + @Override + public NonRoleParamDeclList NonRoleParamDeclList(NonRoleParamDeclList pds) + { + return setDel(pds, new NonRoleParamDeclListDel()); + } + + /*@Override + public NonRoleParamDecl NonRoleParamDecl(CommonTree source, K kind, NonRoleParamNode namenode) + { + NonRoleParamDecl pd = new NonRoleParamDecl(source, kind, namenode); + pd = setDel(pd, new NonRoleParamDeclDel()); + return pd; + }*/ + + @Override + public GProtocolDef GProtocolDef(GProtocolDef gpd) + { + return setDel(gpd, new GProtocolDefDel()); + } + + @Override + public GProtocolBlock GProtocolBlock(GProtocolBlock gpb) + { + return setDel(gpb, new GProtocolBlockDel()); + } + + @Override + public GInteractionSeq GInteractionSeq(GInteractionSeq gis) + { + return setDel(gis, new GInteractionSeqDel()); + } + + @Override + public GMessageTransfer GMessageTransfer(GMessageTransfer gmt) + { + return setDel(gmt, new GMessageTransferDel()); + } + + /*@Override + public GConnect GConnect(GConnect gc) + { + GConnect gc = new GConnect(source, src, msg, dest); + gc = setDel(gc, new GConnectDel()); + return gc; + } + + @Override + public GDisconnect GDisconnect(CommonTree source, RoleNode src, RoleNode dest) + { + GDisconnect gc = new GDisconnect(source, //UnitMessageSigNode(), + src, dest); + gc = setDel(gc, new GDisconnectDel()); + return gc; + } + + @Override + public GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest) + { + GWrap gw = new GWrap(source, UnitMessageSigNode(), src, dest); + gw = setDel(gw, new GWrapDel()); + return gw; + } + + @Override + public GChoice GChoice(CommonTree source, RoleNode subj, List blocks) + { + GChoice gc = new GChoice(source, subj, blocks); + gc = setDel(gc, new GChoiceDel()); + return gc; + } + + @Override + public GRecursion GRecursion(CommonTree source, RecVarNode recvar, GProtocolBlock block) + { + GRecursion gr = new GRecursion(source, recvar, block); + gr = setDel(gr, new GRecursionDel()); + return gr; + } + + @Override + public GContinue GContinue(CommonTree source, RecVarNode recvar) + { + GContinue gc = new GContinue(source, recvar); + gc = setDel(gc, new GContinueDel()); + return gc; + } + + @Override + public GDo GDo(CommonTree source, RoleArgList roleinstans, NonRoleArgList arginstans, GProtocolNameNode proto) + { + GDo gd = new GDo(source, roleinstans, arginstans, proto); + gd = setDel(gd, new GDoDel()); + return gd; + }*/ + + @Override + public MessageSigNode MessageSigNode(MessageSigNode mn) + { + return setDel(mn, createDefaultDelegate()); + } + + @Override + public PayloadElemList PayloadElemList(PayloadElemList pay) + { + return setDel(pay, createDefaultDelegate()); + } + + /*@Override + public UnaryPayloadElem UnaryPayloadElem(CommonTree source, PayloadElemNameNode name) + { + UnaryPayloadElem de= new UnaryPayloadElem<>(source, name); + de = del(de, createDefaultDelegate()); + return de; + }*/ + + /*@Override + public RoleArgList RoleArgList(CommonTree source, List ris) + { + RoleArgList rdl = new RoleArgList(source, ris); + rdl = setDel(rdl, new RoleArgListDel()); + return rdl; + } + + @Override + public RoleArg RoleArg(CommonTree source, RoleNode role) + { + RoleArg ri = new RoleArg(source, role); + ri = setDel(ri, createDefaultDelegate()); + return ri; + } + + @Override + public NonRoleArgList NonRoleArgList(CommonTree source, List ais) + { + NonRoleArgList rdl = new NonRoleArgList(source, ais); + rdl = setDel(rdl, new NonRoleArgListDel()); + return rdl; + } + + @Override + public NonRoleArg NonRoleArg(CommonTree source, NonRoleArgNode arg) + { + NonRoleArg ri = new NonRoleArg(source, arg); + ri = setDel(ri, createDefaultDelegate()); + return ri; + }*/ + + /*@Override + public NameNode SimpleNameNode(CommonTree source, K kind, String identifier) + { + NameNode snn = null; + + // "Custom" del's + if (kind.equals(RecVarKind.KIND)) + { + snn = new RecVarNode(source, identifier); + snn = setDel(snn, new RecVarNodeDel()); + } + else if (kind.equals(RoleKind.KIND)) + { + snn = new RoleNode(source, identifier); + snn = setDel(snn, new RoleNodeDel()); + } + if (snn != null) + { + return castNameNode(kind, snn); + } + + // Default del's + if (kind.equals(OpKind.KIND)) + { + snn = new OpNode(source, identifier); + } + else + { + throw new RuntimeException("Shouldn't get in here: " + kind); + } + return castNameNode(kind, setDel(snn, createDefaultDelegate())); + }*/ + + @Override + public RecVarNode RecVarNode(RecVarNode rv) + { + return setDel(rv, new RecVarNodeDel()); + } + + @Override + public RoleNode RoleNode(RoleNode r) + { + return setDel(r, new RoleNodeDel()); + } + + @Override + public OpNode OpNode(OpNode op) + { + return setDel(op, createDefaultDelegate()); + } + + @Override + public MessageSigNameNode MessageSigNameNode(MessageSigNameNode mn) + { + return setDel(mn, new MessageSigNameNodeDel()); + } + + @Override + public DataTypeNode DataTypeNode(DataTypeNode dn) + { + return setDel(dn, new DataTypeNodeDel()); + } + + @Override + public ModuleNameNode ModuleNameNode(ModuleNameNode mn) + { + return setDel(mn, createDefaultDelegate()); + } + + @Override + public GProtocolNameNode GProtocolNameNode(GProtocolNameNode gpn) + { + return setDel(gpn, createDefaultDelegate()); + } + + @Override + public LProtocolNameNode LProtocolNameNode(LProtocolNameNode lpn) + { + return setDel(lpn, createDefaultDelegate()); + } + + /*@Override + public QualifiedNameNode QualifiedNameNode(CommonTree source, K kind, String... elems) + { + QualifiedNameNode qnn = null; + if (kind.equals(SigKind.KIND)) + { + qnn = new MessageSigNameNode(source, elems); + qnn = setDel(qnn, new MessageSigNameNodeDel()); + } + else if (kind.equals(DataTypeKind.KIND)) + { + qnn = new DataTypeNode(source, elems); + qnn = setDel(qnn, new DataTypeNodeDel()); + } + if (qnn != null) + { + return castNameNode(kind, qnn); + } + + if (kind.equals(ModuleKind.KIND)) + { + qnn = new ModuleNameNode(source, elems); + } + else if (kind.equals(Global.KIND)) + { + qnn = new GProtocolNameNode(source, elems); + } + else if (kind.equals(Local.KIND)) + { + qnn = new LProtocolNameNode(source,elems); + } + else + { + throw new RuntimeException("Shouldn't get in here: " + kind); + } + return castNameNode(kind, setDel(qnn, createDefaultDelegate())); + } + + protected static , K extends Kind> T castNameNode(K kind, NameNode n) + { + if (!n.toName().getKind().equals(kind)) + { + throw new RuntimeException("Shouldn't get in here: " + kind + ", " + n); + } + @SuppressWarnings("unchecked") + T tmp = (T) n; + return tmp; + }*/ + + /*@Override + public AmbigNameNode AmbiguousNameNode(CommonTree source, String identifier) + { + AmbigNameNode ann = new AmbigNameNode(source, identifier); + ann = (AmbigNameNode) ann.del(new AmbigNameNodeDel()); + return ann; + } + + @Override + public NonRoleParamNode NonRoleParamNode(CommonTree source, K kind, String identifier) + { + NonRoleParamNode pn = new NonRoleParamNode(source, kind, identifier); + pn = setDel(pn, new ParamNodeDel()); + return pn; + } + + @Override + public DummyProjectionRoleNode DummyProjectionRoleNode() + { + DummyProjectionRoleNode dprn = new DummyProjectionRoleNode(); + dprn = (DummyProjectionRoleNode) dprn.del(createDefaultDelegate()); + return dprn; + }*/ + + /*@Override // Called from LProtocolDecl::clone, but currently never used -- local proto decls only projected, not parsed + public LProtocolDecl LProtocolDecl(CommonTree source, List mods, LProtocolHeader header, LProtocolDef def) + { + LProtocolDecl lpd = new LProtocolDecl(source, mods, header, def); + lpd = setDel(lpd, new LProtocolDeclDel()); + return lpd; + } + + @Override + public LProjectionDecl LProjectionDecl(CommonTree source, List mods, GProtocolName fullname, Role self, LProtocolHeader header, LProtocolDef def) // del extends that of LProtocolDecl + { + LProjectionDecl lpd = new LProjectionDecl(source, mods, header, def); + lpd = ScribNodeBase.setDel(lpd, new LProjectionDeclDel(fullname, self)); + return lpd; + } + + @Override + public LProtocolHeader LProtocolHeader(CommonTree source, LProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) + { + LProtocolHeader lph = new LProtocolHeader(source, name, roledecls, paramdecls); + lph = setDel(lph, createDefaultDelegate()); + return lph; + } + + @Override + public SelfRoleDecl SelfRoleDecl(CommonTree source, RoleNode namenode) + { + SelfRoleDecl rd = new SelfRoleDecl(source, namenode); + rd = setDel(rd, new RoleDeclDel()); + return rd; + } + + @Override + public LProtocolDef LProtocolDef(CommonTree source, LProtocolBlock block) + { + LProtocolDef lpd = new LProtocolDef(source, block); + lpd = setDel(lpd, new LProtocolDefDel()); + return lpd; + } + + @Override + public LProtocolBlock LProtocolBlock(CommonTree source, LInteractionSeq seq) + { + LProtocolBlock lpb = new LProtocolBlock(source, seq); + lpb = setDel(lpb, new LProtocolBlockDel()); + return lpb; + } + + @Override + public LInteractionSeq LInteractionSeq(CommonTree source, List actions) + { + LInteractionSeq lis = new LInteractionSeq(source, actions); + lis = setDel(lis, new LInteractionSeqDel()); + return lis; + } + + @Override + public LSend LSend(CommonTree source, RoleNode src, MessageNode msg, List dests) + { + LSend ls = new LSend(source, src, msg, dests); + ls = setDel(ls, new LSendDel()); + return ls; + } + + @Override + public LReceive LReceive(CommonTree source, RoleNode src, MessageNode msg, List dests) + { + LReceive ls = new LReceive(source, src, msg, dests); + ls = setDel(ls, new LReceiveDel()); + return ls; + } + + @Override + public LRequest LRequest(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) + //public LConnect LConnect(RoleNode src, RoleNode dest) + { + LRequest lc = new LRequest(source, src, msg, dest); + //LConnect lc = new LConnect(src, dest); + lc = setDel(lc, new LRequestDel()); + return lc; + } + + @Override + public LAccept LAccept(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) + //public LAccept LAccept(RoleNode src, RoleNode dest) + { + LAccept la = new LAccept(source, src, msg, dest); + //LAccept la = new LAccept(src, dest); + la = setDel(la, new LAcceptDel()); + return la; + } + + @Override + public LDisconnect LDisconnect(CommonTree source, RoleNode self, RoleNode peer) + { + LDisconnect lc = new LDisconnect(source, UnitMessageSigNode(), self, peer); + lc = setDel(lc, new LDisconnectDel()); + return lc; + } + + @Override + public LWrapClient LWrapClient(CommonTree source, RoleNode self, RoleNode peer) + { + LWrapClient lwc = new LWrapClient(source, UnitMessageSigNode(), self, peer); + lwc = setDel(lwc, new LWrapClientDel()); + return lwc; + } + + @Override + public LWrapServer LWrapServer(CommonTree source, RoleNode self, RoleNode peer) + { + LWrapServer lws = new LWrapServer(source, UnitMessageSigNode(), self, peer); + lws = setDel(lws, new LWrapServerDel()); + return lws; + } + + @Override + public LChoice LChoice(CommonTree source, RoleNode subj, List blocks) + { + LChoice lc = new LChoice(source, subj, blocks); + lc = setDel(lc, new LChoiceDel()); + return lc; + } + + @Override + public LRecursion LRecursion(CommonTree source, RecVarNode recvar, LProtocolBlock block) + { + LRecursion lr = new LRecursion(source, recvar, block); + lr = setDel(lr, new LRecursionDel()); + return lr; + } + + @Override + public LContinue LContinue(CommonTree source, RecVarNode recvar) + { + LContinue lc = new LContinue(source, recvar); + lc = setDel(lc, new LContinueDel()); + return lc; + } + + @Override + public LDo LDo(CommonTree source, RoleArgList roleinstans, NonRoleArgList arginstans, LProtocolNameNode proto) + { + LDo ld = new LDo(source, roleinstans, arginstans, proto); + ld = setDel(ld, new LDoDel()); + return ld; + }*/ + + protected ScribDel createDefaultDelegate() + { + return new DefaultDel(); + } + + // Non-defensive + protected static T setDel(T n, ScribDel del) + { + n.setDel(del); + return n; + /*// Defensive helper with cast check + ScribNodeBase copy = ((ScribNodeBase) n).clone(); // Need deep clone, since children have parent field + //copy.del = del; + copy.setDel(del); + return ScribUtil.castNodeByClass(n, copy);*/ + } +} diff --git a/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java b/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java index 3d2f3c1f8..2a685abc1 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java @@ -37,7 +37,7 @@ public NameDeclNode(NameDeclNode node) protected final NameNode getRawNameNodeChild() { - if (getChildCount() < 1) // E.g., ProtocolHeader two more children + if (getChildCount() < 1) // E.g., ProtocolHeader three children { throw new RuntimeException("Shouldn't get in here: " + getClass()); } diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java index 1167c9daa..c533c24cc 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java @@ -51,6 +51,8 @@ protected ProtocolHeader(ProtocolHeader node) public RoleDeclList getRoleDeclListChild() { + System.out.println("7777: " + getChildren()); + return (RoleDeclList) getChild(2); // TODO: swap order with paramdecllist (in grammar) } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java index 33e5a1d1b..b63763072 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java @@ -31,15 +31,15 @@ public DataTypeNode(Token t) } // Tree#dupNode constructor - protected DataTypeNode(DataTypeNode node, String... ns) + protected DataTypeNode(DataTypeNode node)//, String... ns) { - super(node, ns); + super(node); } @Override public DataTypeNode dupNode() { - return new DataTypeNode(this, getElements()); + return new DataTypeNode(this);//, getElements()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java index e06cb34d5..2771ebe75 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java @@ -27,7 +27,7 @@ public GProtocolNameNode(Token t) } // Tree#dupNode constructor - protected GProtocolNameNode(GProtocolNameNode node, String...elems) + protected GProtocolNameNode(GProtocolNameNode node)//, String...elems) { super(node); } @@ -35,7 +35,7 @@ protected GProtocolNameNode(GProtocolNameNode node, String...elems) @Override public GProtocolNameNode dupNode() { - return new GProtocolNameNode(this, getElements()); + return new GProtocolNameNode(this);//, getElements()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java index c225b8b13..86d026d8e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java @@ -29,7 +29,7 @@ public LProtocolNameNode(Token t) } // Tree#dupNode constructor - protected LProtocolNameNode(LProtocolNameNode node, String...elems) + protected LProtocolNameNode(LProtocolNameNode node)//, String...elems) { super(node); } @@ -37,7 +37,7 @@ protected LProtocolNameNode(LProtocolNameNode node, String...elems) @Override public LProtocolNameNode dupNode() { - return new LProtocolNameNode(this, getElements()); + return new LProtocolNameNode(this);//, getElements()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java index 891618500..54d70898d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java @@ -31,7 +31,7 @@ public MemberNameNode(Token t) } // Tree#dupNode constructor - protected MemberNameNode(MemberNameNode node, String...elems) + protected MemberNameNode(MemberNameNode node)//, String...elems) { super(node); } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java index 8e6a9489d..138447b28 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java @@ -30,7 +30,7 @@ public MessageSigNameNode(Token t) } // Tree#dupNode constructor - protected MessageSigNameNode(MessageSigNameNode node, String...elems) + protected MessageSigNameNode(MessageSigNameNode node)//, String...elems) { super(node); } @@ -38,7 +38,7 @@ protected MessageSigNameNode(MessageSigNameNode node, String...elems) @Override public MessageSigNameNode dupNode() { - return new MessageSigNameNode(this, getElements()); + return new MessageSigNameNode(this);//, getElements()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java index 148c2f701..7896a1be5 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java @@ -28,7 +28,7 @@ public ModuleNameNode(Token t) } // Tree#dupNode constructor - protected ModuleNameNode(ModuleNameNode node, String...elems) + protected ModuleNameNode(ModuleNameNode node)//, String...elems) { super(node); } @@ -36,7 +36,7 @@ protected ModuleNameNode(ModuleNameNode node, String...elems) @Override public ModuleNameNode dupNode() { - return new ModuleNameNode(this, getElements()); + return new ModuleNameNode(this);//, getElements()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java index 97942fb25..bb9b3bfea 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java @@ -27,9 +27,9 @@ public ProtocolNameNode(Token t) } // Tree#dupNode constructor - protected ProtocolNameNode(ProtocolNameNode node, String...elems) + protected ProtocolNameNode(ProtocolNameNode node)//, String...elems) { - super(node, elems); + super(node); } public abstract ProtocolName toName(); diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java index cabdad220..31054a42d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java @@ -27,9 +27,9 @@ public QualifiedNameNode(Token t) } // Tree#dupNode constructor - protected QualifiedNameNode(QualifiedNameNode node, String...elems) + protected QualifiedNameNode(QualifiedNameNode node)//, String...elems) { - super(node, elems); + super(node); } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index 10dd931f9..9bb4f7ed6 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -41,15 +41,21 @@ public AmbigNameNode(Token t) } // Tree#dupNode constructor - protected AmbigNameNode(AmbigNameNode node, String id) + protected AmbigNameNode(AmbigNameNode node)//, String id) { - super(node, id); + super(node); } @Override public AmbigNameNode dupNode() { - return new AmbigNameNode(this, getIdentifier()); + return new AmbigNameNode(this);//, getIdentifier()); + } + + @Override + public String getIdentifier() + { + return getToken().getText(); // CHECKME: ambig nodes are now leafs } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java index c3ce2e4b2..90b70676d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java @@ -29,15 +29,15 @@ public DummyProjectionRoleNode(Token t) } // Tree#dupNode constructor - protected DummyProjectionRoleNode(DummyProjectionRoleNode node, String id) + protected DummyProjectionRoleNode(DummyProjectionRoleNode node)//, String id) { - super(node, id); + super(node); } @Override public RoleNode dupNode() { - return new RoleNode(this, getIdentifier()); + return new RoleNode(this);//, getIdentifier()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java index 278741b78..5da3fc762 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java @@ -48,16 +48,16 @@ public NonRoleParamNode(Token t) } // Tree#dupNode constructor - protected NonRoleParamNode(NonRoleParamNode node, K kind, String id) + protected NonRoleParamNode(NonRoleParamNode node, K kind)//, String id) { - super(node, id); + super(node); this.kind = kind; } @Override public NonRoleParamNode dupNode() { - return new NonRoleParamNode<>(this, this.kind, getIdentifier()); + return new NonRoleParamNode<>(this, this.kind);//, getIdentifier()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java index 097ac1d77..6ce44425f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java @@ -30,15 +30,15 @@ public OpNode(Token t) } // Tree#dupNode constructor - protected OpNode(OpNode node, String id) + protected OpNode(OpNode node)//, String id) { - super(node, id); + super(node); } @Override public OpNode dupNode() { - return new OpNode(this, getIdentifier()); + return new OpNode(this);//, getIdentifier()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java index e90dd269b..58338e14e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java @@ -27,15 +27,15 @@ public RecVarNode(Token t) } // Tree#dupNode constructor - protected RecVarNode(RecVarNode node, String id) + protected RecVarNode(RecVarNode node)//, String id) { - super(node, id); + super(node); } @Override public RecVarNode dupNode() { - return new RecVarNode(this, getIdentifier()); + return new RecVarNode(this);//, getIdentifier()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java index cf7a0f0d0..7ecbf1c3b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java @@ -16,6 +16,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.DoArgNode; +import org.scribble.ast.ScribNode; import org.scribble.del.ScribDel; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; @@ -30,21 +31,23 @@ public RoleNode(Token t) } // Tree#dupNode constructor - protected RoleNode(RoleNode node, String id) + protected RoleNode(RoleNode node)//, String id) { - super(node, id); + super(node); } @Override public RoleNode dupNode() { - return new RoleNode(this, getIdentifier()); + return new RoleNode(this);//, getIdentifier()); } // RoleNode is the only NameNode with a reconstruct (so not factored up) protected RoleNode reconstruct(String id) { + ScribNode n = getChild(0); // TODO: factor out (ID -- currently ambignamenode?) RoleNode r = dupNode(); + r.addChild(n); ScribDel del = del(); // Default delegate assigned in ModelFactoryImpl for all simple names r.setDel(del); // No copy return r; @@ -53,7 +56,7 @@ protected RoleNode reconstruct(String id) @Override public RoleNode clone() { - return (RoleNode) clone(); + return (RoleNode) super.clone(); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java index f32ef1daa..efc73fe38 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java @@ -28,9 +28,9 @@ public SimpleNameNode(Token t) } // Tree#dupNode constructor - protected SimpleNameNode(SimpleNameNode node, String id) + protected SimpleNameNode(SimpleNameNode node)//, String id) { - super(node, id); + super(node); } public String getIdentifier() diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index d180e7898..fc3090e47 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -176,6 +176,7 @@ tokens GPROTOCOLNAME = 'GPROTOCOLNAME'; ROLENAME = 'ROLENAME'; ID = 'ID'; + OPNAME = 'OPNAME'; } @@ -493,20 +494,20 @@ messagesignaturedecl: messagesignature: '(' payload ')' -> - ^(MESSAGESIGNATURE EMPTY_OPERATOR payload) + ^(MESSAGESIGNATURE ^(OPNAME EMPTY_OPERATOR) payload) | //messageoperator '(' payload ')' // Doesn't work (conflict with IDENTIFIER?) IDENTIFIER '(' payload ')' -> - ^(MESSAGESIGNATURE IDENTIFIER payload) + ^(MESSAGESIGNATURE ^(OPNAME IDENTIFIER) payload) | '(' ')' -> - ^(MESSAGESIGNATURE EMPTY_OPERATOR ^(PAYLOAD)) + ^(MESSAGESIGNATURE ^(OPNAME EMPTY_OPERATOR) ^(PAYLOAD)) | IDENTIFIER '(' ')' -> - ^(MESSAGESIGNATURE IDENTIFIER ^(PAYLOAD)) + ^(MESSAGESIGNATURE ^(OPNAME IDENTIFIER) ^(PAYLOAD)) ; payload: @@ -661,7 +662,7 @@ globalinteraction: * Section 3.7.4 Global Message Transfer */ globalmessagetransfer: - message FROM_KW rolename TO_KW rolenamenode (',' rolenamenode )* ';' + message FROM_KW rolenamenode TO_KW rolenamenode (',' rolenamenode )* ';' -> ^(GLOBALMESSAGETRANSFER message rolenamenode+) ; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java index 2f2eb9da3..77edef5fc 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java @@ -68,7 +68,7 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException AntlrNodeType type = AntlrToScribParserUtil.getAntlrNodeType(ct); switch (type) { - //case PAYLOAD: return AntlrPayloadElemList.parsePayloadElemList(this, ct, af); + case PAYLOAD: return AntlrPayloadElemList.parsePayloadElemList(this, ct, af); case MODULE: diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParserUtil.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParserUtil.java index 456d8d865..c6afd910b 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParserUtil.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParserUtil.java @@ -23,7 +23,7 @@ public class AntlrToScribParserUtil { public static List toCommonTreeList(List list) { - return list.stream().map((x) -> (CommonTree) x).collect(Collectors.toList()); + return list.stream().map(x -> (CommonTree) x).collect(Collectors.toList()); } // Cf. Scribble.g output "node types" -- mapping to the AntlrNodeType enum diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index a8a76190d..d01e4558d 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -2,6 +2,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTreeAdaptor; +import org.scribble.ast.MessageSigNode; import org.scribble.ast.Module; import org.scribble.ast.ModuleDecl; import org.scribble.ast.NonRoleParamDeclList; @@ -16,9 +17,9 @@ import org.scribble.ast.global.GProtocolDef; import org.scribble.ast.global.GProtocolHeader; import org.scribble.ast.name.qualified.GProtocolNameNode; -import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RoleNode; // get/setType don't seem to be really used @@ -93,7 +94,9 @@ public Object create(Token t) case "GLOBALMESSAGETRANSFER": //return this.f.GMessageTransfer(empty, null, null, Collections.emptyList()); return new GMessageTransfer(t); case "MESSAGESIGNATURE": //return this.f.Me - return new MessageSigNameNode(t); + return new MessageSigNode(t); + case "OPNAME": + return new OpNode(t); case "PAYLOAD": return new PayloadElemList(t); From 51bb93fb7ea41fbcd9ffc1a44d7941cd1e573038 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 5 Feb 2019 11:22:50 +0000 Subject: [PATCH 088/539] Continued WIP. --- .../src/main/java/org/scribble/main/MainContext.java | 4 ++++ .../main/java/org/scribble/ast/DelDecoratorImpl.java | 8 ++++---- .../main/java/org/scribble/ast/HeaderParamDecl.java | 6 +----- .../main/java/org/scribble/ast/ProtocolHeader.java | 4 +--- .../src/main/java/org/scribble/ast/RoleDecl.java | 11 ++++++----- .../java/org/scribble/ast/name/simple/RoleNode.java | 12 ++++++------ .../src/main/java/org/scribble/main/Job.java | 4 ++++ .../scribble/visit/context/ModuleContextBuilder.java | 3 --- 8 files changed, 26 insertions(+), 26 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/main/MainContext.java b/scribble-cli/src/main/java/org/scribble/main/MainContext.java index 395bc1897..a4b2ef652 100644 --- a/scribble-cli/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-cli/src/main/java/org/scribble/main/MainContext.java @@ -128,6 +128,10 @@ public MainContext(boolean debug, ResourceLocator locator, Path mainpath, move ast to parser? and make core/lang*/ new DelDecoratorImpl().decorate(mod); + + System.out.println("bbb2: " + mod); + + //HERE: debug context building or name disamb (role node child lost) checkMainModuleName(mainpath, mod); diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java index 887453609..be52fb388 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java @@ -139,19 +139,19 @@ public void decorate(CommonTree n) break; case "MODULENAME": - System.out.println("5555b: " + n.getClass() + " ,, " + type + " ,, " + n); - System.out.println("4444:" + n + " ,, " + n.getChildren()); + //System.out.println("5555b: " + n.getClass() + " ,, " + type + " ,, " + n); + //System.out.println("4444:" + n + " ,, " + n.getChildren()); ModuleNameNode((ModuleNameNode) n); break; default: // Leaf "ID" nodes //throw new RuntimeException("Unknown ANTLR node type: " + type); - System.out.println("9999:" + n + " ,, " + n.getChildren()); + //System.out.println("9999:" + n + " ,, " + n.getChildren()); break; } - System.out.println("8888:" + n + " ,, " + n.getChildren()); + //System.out.println("8888:" + n + " ,, " + n.getChildren()); ((List) n.getChildren()).stream().map(x -> (CommonTree) x) .forEach(x -> decorate(x)); } diff --git a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java index c39c1a1ae..09c83130e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java @@ -13,9 +13,6 @@ */ package org.scribble.ast; -import java.util.LinkedList; -import java.util.List; - import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.SimpleNameNode; @@ -51,8 +48,7 @@ public HeaderParamDecl reconstruct(SimpleNameNode name) { HeaderParamDecl pd = dupNode(); ScribDel del = del(); - List children = new LinkedList<>(); - children.add(name); + pd.addChild(name); pd.setDel(del); // No copy return pd; } diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java index c533c24cc..3a8242378 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java @@ -51,8 +51,6 @@ protected ProtocolHeader(ProtocolHeader node) public RoleDeclList getRoleDeclListChild() { - System.out.println("7777: " + getChildren()); - return (RoleDeclList) getChild(2); // TODO: swap order with paramdecllist (in grammar) } @@ -67,8 +65,8 @@ public ProtocolHeader reconstruct(ProtocolNameNode name, ProtocolHeader pd = dupNode(); ScribDel del = del(); pd.addChild(name); + pd.addChild(pdl); // Cf. above TODO (rdl/pdl child order) pd.addChild(rdl); - pd.addChild(pdl); pd.setDel(del); // No copy return pd; } diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java b/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java index 89849bce4..db1675196 100644 --- a/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java @@ -35,15 +35,15 @@ public RoleDecl(RoleDecl node) } @Override - public RoleDecl dupNode() + public RoleNode getNameNodeChild() { - return new RoleDecl(this); + return (RoleNode) getRawNameNodeChild(); } @Override - public RoleNode getNameNodeChild() + public RoleDecl dupNode() { - return (RoleNode) getRawNameNodeChild(); + return new RoleDecl(this); } @Override @@ -51,7 +51,8 @@ public RoleDecl project(AstFactory af, Role self) { RoleNode name = getNameNodeChild(); Name role = name.toName(); - RoleNode rn = (RoleNode) af.SimpleNameNode(name.source, RoleKind.KIND, role.toString()); + RoleNode rn = (RoleNode) + af.SimpleNameNode(name.source, RoleKind.KIND, role.toString()); if (role.equals(self)) { return af.SelfRoleDecl(name.source, rn); diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java index 7ecbf1c3b..32d4c8616 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java @@ -41,6 +41,12 @@ public RoleNode dupNode() { return new RoleNode(this);//, getIdentifier()); } + + @Override + public RoleNode clone() + { + return (RoleNode) super.clone(); + } // RoleNode is the only NameNode with a reconstruct (so not factored up) protected RoleNode reconstruct(String id) @@ -53,12 +59,6 @@ protected RoleNode reconstruct(String id) return r; } - @Override - public RoleNode clone() - { - return (RoleNode) super.clone(); - } - @Override public RoleNode substituteNames(Substitutor subs) { diff --git a/scribble-core/src/main/java/org/scribble/main/Job.java b/scribble-core/src/main/java/org/scribble/main/Job.java index 025f522bd..09bb4d90b 100644 --- a/scribble-core/src/main/java/org/scribble/main/Job.java +++ b/scribble-core/src/main/java/org/scribble/main/Job.java @@ -127,7 +127,11 @@ public void checkWellFormedness() throws ScribbleException public void runContextBuildingPasses() throws ScribbleException { + System.out.println("fff1: " + this.jcontext.getMainModule()); runVisitorPassOnAllModules(ModuleContextBuilder.class); // Always done first (even if other contexts are built later) so that following passes can use ModuleContextVisitor + + System.out.println("fff2: " + this.jcontext.getMainModule()); + runVisitorPassOnAllModules(NameDisambiguator.class); // Includes validating names used in subprotocol calls.. runVisitorPassOnAllModules(ProtocolDeclContextBuilder.class); //..which this pass depends on. This pass basically builds protocol dependency info runVisitorPassOnAllModules(DelegationProtocolRefChecker.class); // Must come after ProtocolDeclContextBuilder diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java index dc9e54f19..cb66e8d61 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java @@ -32,9 +32,6 @@ public ModuleContextBuilder(Job job) @Override protected void enter(ScribNode parent, ScribNode child) throws ScribbleException { - System.out.println("aaa: " + child.getClass() + " ,, " + child.del()); // FIXME: del decorator - - child.del().enterModuleContextBuilding(parent, child, this); } From 6d6d102c2ebfe30ea8c646e93dce634c0b976ec2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 5 Feb 2019 19:16:22 +0000 Subject: [PATCH 089/539] Continued WIP. --- .../java/org/scribble/cli/CommandLine.java | 8 +- .../java/org/scribble/main/MainContext.java | 2 +- .../java/org/scribble/ast/DelDecorator.java | 44 ++++----- .../org/scribble/ast/DelDecoratorImpl.java | 99 +++++++++---------- .../main/java/org/scribble/ast/ScribNode.java | 2 +- .../java/org/scribble/ast/ScribNodeBase.java | 2 +- .../org/scribble/del/InterruptibleDel.java | 22 ----- .../java/org/scribble/del/ParallelDel.java | 22 ----- .../main/java/org/scribble/del/ScribDel.java | 1 + .../{GInterruptibleDel.java => GDel.java} | 16 ++- .../org/scribble/del/global/GParallelDel.java | 21 ---- .../scribble/del/global/GProtocolDefDel.java | 5 + .../main/java/org/scribble/lang/Choice.java | 45 +++++++++ .../src/main/java/org/scribble/lang/Do.java | 41 ++++++++ .../java/org/scribble/lang/LangConstants.java | 11 +++ .../org/scribble/lang/MessageTransfer.java | 46 +++++++++ .../main/java/org/scribble/lang/Protocol.java | 47 +++++++++ .../src/main/java/org/scribble/lang/Seq.java | 39 ++++++++ .../main/java/org/scribble/lang/SessType.java | 11 +++ .../org/scribble/lang/SessTypeTranslator.java | 20 ++++ .../org/scribble/lang/global/GChoice.java | 44 +++++++++ .../java/org/scribble/lang/global/GDo.java | 43 ++++++++ .../lang/global/GMessageTransfer.java | 45 +++++++++ .../org/scribble/lang/global/GProtocol.java | 44 +++++++++ .../java/org/scribble/lang/global/GSeq.java | 42 ++++++++ .../java/org/scribble/lang/global/GType.java | 9 ++ .../src/main/java/org/scribble/main/Job.java | 14 ++- .../java/org/scribble/visit/AstVisitor.java | 10 +- .../visit/context/ModuleContextVisitor.java | 8 +- .../parser/scribble/ScribTreeAdaptor.java | 1 - 30 files changed, 604 insertions(+), 160 deletions(-) delete mode 100644 scribble-core/src/main/java/org/scribble/del/InterruptibleDel.java delete mode 100644 scribble-core/src/main/java/org/scribble/del/ParallelDel.java rename scribble-core/src/main/java/org/scribble/del/global/{GInterruptibleDel.java => GDel.java} (59%) delete mode 100644 scribble-core/src/main/java/org/scribble/del/global/GParallelDel.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/Choice.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/Do.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/LangConstants.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/Protocol.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/Seq.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/SessType.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/SessTypeTranslator.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/global/GChoice.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/global/GDo.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/global/GSeq.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/global/GType.java diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 2c7969042..fee47c57c 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -146,12 +146,12 @@ public void run() throws CommandLineException, AntlrSourceException // Scribble protected void runBody() throws ScribParserException, AntlrSourceException, CommandLineException { - MainContext mc = newMainContext(); - Job job = mc.newJob(); + MainContext mc = newMainContext(); // Represents current instance of tooling for given CL args + Job job = mc.newJob(); // A Job is some series of passes performed on each Module in the MainContext (e.g., cf. Job::runVisitorPass) ScribbleException fail = null; try { - doValidationTasks(job); + doValidationTasks(job); // FIXME: refactor into job } catch (ScribbleException x) { @@ -161,7 +161,7 @@ protected void runBody() // Attempt certain "output tasks" even if above failed, in case can still do some useful output (hacky) try { - tryOutputTasks(job); + tryOutputTasks(job); // FIXME: refactor into job } catch (ScribbleException x) { diff --git a/scribble-cli/src/main/java/org/scribble/main/MainContext.java b/scribble-cli/src/main/java/org/scribble/main/MainContext.java index a4b2ef652..51fd2b2a2 100644 --- a/scribble-cli/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-cli/src/main/java/org/scribble/main/MainContext.java @@ -122,7 +122,7 @@ public MainContext(boolean debug, ResourceLocator locator, Path mainpath, System.out.println("bbb: " + atree.getClass() + " ,, " + atree.getChildren()); // FIXME HERE: deprecate scribParser -- move ANTLR error checking out - Module mod = (Module) this.scribParser.parse(atree, this.af); // TODO: rename exceptions + Module mod = (Module) atree;//this.scribParser.parse(atree, this.af); // TODO: rename exceptions /*HERE del decorator move ast to parser? and make core/lang*/ diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java b/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java index c89c79057..0bbff1622 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java @@ -36,27 +36,27 @@ public interface DelDecorator void decorate(CommonTree n); // TODO: make void return types to be more clear about non-defensiveness - Module Module(Module m); + void Module(Module m); - ModuleDecl ModuleDecl(ModuleDecl md); - ImportModule ImportModule(ImportModule im); + void ModuleDecl(ModuleDecl md); + void ImportModule(ImportModule im); /*MessageSigNameDecl MessageSigNameDecl(MessageSigNameDecl md); DataTypeDecl DataTypeDecl(DataTypeDecl dd);*/ - GProtocolDecl GProtocolDecl(GProtocolDecl gpd); - GProtocolHeader GProtocolHeader(GProtocolHeader gph); + void GProtocolDecl(GProtocolDecl gpd); + void GProtocolHeader(GProtocolHeader gph); - RoleDeclList RoleDeclList(RoleDeclList rds); - RoleDecl RoleDecl(RoleDecl rd); - NonRoleParamDeclList NonRoleParamDeclList(NonRoleParamDeclList pds); + void RoleDeclList(RoleDeclList rds); + void RoleDecl(RoleDecl rd); + void NonRoleParamDeclList(NonRoleParamDeclList pds); // NonRoleParamDecl NonRoleParamDecl(CommonTree source, K kind, NonRoleParamNode name); - GProtocolDef GProtocolDef(GProtocolDef gpd); - GProtocolBlock GProtocolBlock(GProtocolBlock gpb); - GInteractionSeq GInteractionSeq(GInteractionSeq gis); + void GProtocolDef(GProtocolDef gpd); + void GProtocolBlock(GProtocolBlock gpb); + void GInteractionSeq(GInteractionSeq gis); - GMessageTransfer GMessageTransfer(GMessageTransfer gmt); + void GMessageTransfer(GMessageTransfer gmt); /*GConnect GConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest); GDisconnect GDisconnect(CommonTree source, RoleNode src, RoleNode dest); GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest); @@ -65,8 +65,8 @@ public interface DelDecorator GContinue GContinue(CommonTree source, RecVarNode recvar); GDo GDo(CommonTree source, RoleArgList roles, NonRoleArgList args, GProtocolNameNode proto);*/ - MessageSigNode MessageSigNode(MessageSigNode n); - PayloadElemList PayloadElemList(PayloadElemList pay); + void MessageSigNode(MessageSigNode n); + void PayloadElemList(PayloadElemList pay); // UnaryPayloadElem UnaryPayloadElem(UnaryPayloadElem e); /*GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode name, RoleNode role); @@ -80,14 +80,14 @@ public interface DelDecorator /* NameNode SimpleNameNode(CommonTree source, K kind, String identifier); QualifiedNameNode QualifiedNameNode(CommonTree source, K kind, String... elems);*/ - RecVarNode RecVarNode(RecVarNode rv); - RoleNode RoleNode(RoleNode r); - OpNode OpNode(OpNode op); - MessageSigNameNode MessageSigNameNode(MessageSigNameNode mn); - DataTypeNode DataTypeNode(DataTypeNode dn); - ModuleNameNode ModuleNameNode(ModuleNameNode mn); - GProtocolNameNode GProtocolNameNode(GProtocolNameNode gpn); - LProtocolNameNode LProtocolNameNode(LProtocolNameNode lpn); + void RecVarNode(RecVarNode rv); + void RoleNode(RoleNode r); + void OpNode(OpNode op); + void MessageSigNameNode(MessageSigNameNode mn); + void DataTypeNode(DataTypeNode dn); + void ModuleNameNode(ModuleNameNode mn); + void GProtocolNameNode(GProtocolNameNode gpn); + void LProtocolNameNode(LProtocolNameNode lpn); /*AmbigNameNode AmbiguousNameNode(CommonTree source, String identifier); NonRoleParamNode NonRoleParamNode(CommonTree source, K kind, String identifier); diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java index be52fb388..2a36d908f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java @@ -60,15 +60,9 @@ public DelDecoratorImpl() // Visitor enter/leave framework uses dels -- DelDecorator is a proto visitor (akin to parsing) public void decorate(CommonTree n) { - - String type = n.getToken().getText(); // CHECKME: do by Antlr Token, or at this point by Scib AST type? - - System.out.println("5555: " + n.getClass() + " ,, " + type + " ,, " + n); - switch (type) { - case "MODULE": Module((Module) n); break; @@ -174,21 +168,21 @@ public LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode prot }*/ @Override - public Module Module(Module m) + public void Module(Module m) { - return setDel(m, new ModuleDel()); + setDel(m, new ModuleDel()); } @Override - public ModuleDecl ModuleDecl(ModuleDecl md) + public void ModuleDecl(ModuleDecl md) { - return setDel(md, createDefaultDelegate()); + setDel(md, createDefaultDelegate()); } @Override - public ImportModule ImportModule(ImportModule im) + public void ImportModule(ImportModule im) { - return setDel(im, new ImportModuleDel()); + setDel(im, new ImportModuleDel()); } /*@Override @@ -208,33 +202,33 @@ public DataTypeDecl DataTypeDecl(CommonTree source, String schema, String extNam }*/ @Override - public GProtocolDecl GProtocolDecl(GProtocolDecl gpd) + public void GProtocolDecl(GProtocolDecl gpd) { - return setDel(gpd, new GProtocolDeclDel()); + setDel(gpd, new GProtocolDeclDel()); } @Override - public GProtocolHeader GProtocolHeader(GProtocolHeader gph) + public void GProtocolHeader(GProtocolHeader gph) { - return setDel(gph, createDefaultDelegate()); + setDel(gph, createDefaultDelegate()); } @Override - public RoleDeclList RoleDeclList(RoleDeclList rds) + public void RoleDeclList(RoleDeclList rds) { - return setDel(rds, new RoleDeclListDel()); + setDel(rds, new RoleDeclListDel()); } @Override - public RoleDecl RoleDecl(RoleDecl rd) + public void RoleDecl(RoleDecl rd) { - return setDel(rd, new RoleDeclDel()); + setDel(rd, new RoleDeclDel()); } @Override - public NonRoleParamDeclList NonRoleParamDeclList(NonRoleParamDeclList pds) + public void NonRoleParamDeclList(NonRoleParamDeclList pds) { - return setDel(pds, new NonRoleParamDeclListDel()); + setDel(pds, new NonRoleParamDeclListDel()); } /*@Override @@ -246,27 +240,27 @@ public NonRoleParamDecl NonRoleParamDecl(CommonT }*/ @Override - public GProtocolDef GProtocolDef(GProtocolDef gpd) + public void GProtocolDef(GProtocolDef gpd) { - return setDel(gpd, new GProtocolDefDel()); + setDel(gpd, new GProtocolDefDel()); } @Override - public GProtocolBlock GProtocolBlock(GProtocolBlock gpb) + public void GProtocolBlock(GProtocolBlock gpb) { - return setDel(gpb, new GProtocolBlockDel()); + setDel(gpb, new GProtocolBlockDel()); } @Override - public GInteractionSeq GInteractionSeq(GInteractionSeq gis) + public void GInteractionSeq(GInteractionSeq gis) { - return setDel(gis, new GInteractionSeqDel()); + setDel(gis, new GInteractionSeqDel()); } @Override - public GMessageTransfer GMessageTransfer(GMessageTransfer gmt) + public void GMessageTransfer(GMessageTransfer gmt) { - return setDel(gmt, new GMessageTransferDel()); + setDel(gmt, new GMessageTransferDel()); } /*@Override @@ -327,15 +321,15 @@ public GDo GDo(CommonTree source, RoleArgList roleinstans, NonRoleArgList argins }*/ @Override - public MessageSigNode MessageSigNode(MessageSigNode mn) + public void MessageSigNode(MessageSigNode mn) { - return setDel(mn, createDefaultDelegate()); + setDel(mn, createDefaultDelegate()); } @Override - public PayloadElemList PayloadElemList(PayloadElemList pay) + public void PayloadElemList(PayloadElemList pay) { - return setDel(pay, createDefaultDelegate()); + setDel(pay, createDefaultDelegate()); } /*@Override @@ -412,51 +406,51 @@ else if (kind.equals(RoleKind.KIND)) }*/ @Override - public RecVarNode RecVarNode(RecVarNode rv) + public void RecVarNode(RecVarNode rv) { - return setDel(rv, new RecVarNodeDel()); + setDel(rv, new RecVarNodeDel()); } @Override - public RoleNode RoleNode(RoleNode r) + public void RoleNode(RoleNode r) { - return setDel(r, new RoleNodeDel()); + setDel(r, new RoleNodeDel()); } @Override - public OpNode OpNode(OpNode op) + public void OpNode(OpNode op) { - return setDel(op, createDefaultDelegate()); + setDel(op, createDefaultDelegate()); } @Override - public MessageSigNameNode MessageSigNameNode(MessageSigNameNode mn) + public void MessageSigNameNode(MessageSigNameNode mn) { - return setDel(mn, new MessageSigNameNodeDel()); + setDel(mn, new MessageSigNameNodeDel()); } @Override - public DataTypeNode DataTypeNode(DataTypeNode dn) + public void DataTypeNode(DataTypeNode dn) { - return setDel(dn, new DataTypeNodeDel()); + setDel(dn, new DataTypeNodeDel()); } @Override - public ModuleNameNode ModuleNameNode(ModuleNameNode mn) + public void ModuleNameNode(ModuleNameNode mn) { - return setDel(mn, createDefaultDelegate()); + setDel(mn, createDefaultDelegate()); } @Override - public GProtocolNameNode GProtocolNameNode(GProtocolNameNode gpn) + public void GProtocolNameNode(GProtocolNameNode gpn) { - return setDel(gpn, createDefaultDelegate()); + setDel(gpn, createDefaultDelegate()); } @Override - public LProtocolNameNode LProtocolNameNode(LProtocolNameNode lpn) + public void LProtocolNameNode(LProtocolNameNode lpn) { - return setDel(lpn, createDefaultDelegate()); + setDel(lpn, createDefaultDelegate()); } /*@Override @@ -686,10 +680,11 @@ protected ScribDel createDefaultDelegate() } // Non-defensive - protected static T setDel(T n, ScribDel del) + //protected static T setDel(T n, ScribDel del) + protected static void setDel(ScribNodeBase n, ScribDel del) { n.setDel(del); - return n; + //return n; /*// Defensive helper with cast check ScribNodeBase copy = ((ScribNodeBase) n).clone(); // Need deep clone, since children have parent field //copy.del = del; diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNode.java b/scribble-core/src/main/java/org/scribble/ast/ScribNode.java index f1fabb9e6..391fdb9c8 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/ScribNode.java @@ -37,7 +37,7 @@ public interface ScribNode extends Tree ScribDel del(); ScribNode del(ScribDel del); - ScribNode accept(AstVisitor nv) throws ScribbleException; + ScribNode accept(AstVisitor nv) throws ScribbleException; // The "top-level" method, e.g., module.accept(v) (cf. Job::runVisitorOnModule) ScribNode visitChildren(AstVisitor nv) throws ScribbleException; // Simple operations, not worth doing del enter/leave pattern for diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java index 57c0d13d8..c458d393b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -171,7 +171,7 @@ public ScribNode visitChildren(AstVisitor nv) throws ScribbleException protected ScribNode visitChild(ScribNode child, AstVisitor nv) throws ScribbleException { - return nv.visit(this, child); + return nv.visit(this, child); // cf. child.accept(nv) ? } @Override diff --git a/scribble-core/src/main/java/org/scribble/del/InterruptibleDel.java b/scribble-core/src/main/java/org/scribble/del/InterruptibleDel.java deleted file mode 100644 index 34bd99a91..000000000 --- a/scribble-core/src/main/java/org/scribble/del/InterruptibleDel.java +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.del; - -public abstract class InterruptibleDel extends CompoundInteractionNodeDel -{ - public InterruptibleDel() - { - - } -} diff --git a/scribble-core/src/main/java/org/scribble/del/ParallelDel.java b/scribble-core/src/main/java/org/scribble/del/ParallelDel.java deleted file mode 100644 index 05e6828a6..000000000 --- a/scribble-core/src/main/java/org/scribble/del/ParallelDel.java +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.del; - -public abstract class ParallelDel extends CompoundInteractionNodeDel -{ - public ParallelDel() - { - - } -} diff --git a/scribble-core/src/main/java/org/scribble/del/ScribDel.java b/scribble-core/src/main/java/org/scribble/del/ScribDel.java index 68764448c..168c69de8 100644 --- a/scribble-core/src/main/java/org/scribble/del/ScribDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ScribDel.java @@ -37,6 +37,7 @@ import org.scribble.visit.wf.ReachabilityChecker; import org.scribble.visit.wf.WFChoiceChecker; +// FIXME: refactor as appropriate into G/LDel // Immutable except for pass-specific Envs (by visitors) only -- Envs considered transient, not treated immutably (i.e. non defensive setter on del) // Parameterise by AstNode type? Would inhibit del sharing between types (but that's not currently needed) public interface ScribDel diff --git a/scribble-core/src/main/java/org/scribble/del/global/GInterruptibleDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDel.java similarity index 59% rename from scribble-core/src/main/java/org/scribble/del/global/GInterruptibleDel.java rename to scribble-core/src/main/java/org/scribble/del/global/GDel.java index 6b8cc83e2..fcd8e6204 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GInterruptibleDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDel.java @@ -13,9 +13,21 @@ */ package org.scribble.del.global; -import org.scribble.del.InterruptibleDel; +import org.scribble.ast.ScribNode; +import org.scribble.lang.SessTypeTranslator; +import org.scribble.main.ScribbleException; -public class GInterruptibleDel extends InterruptibleDel implements GCompoundInteractionNodeDel +public interface GDel { + default void enterSessTypeTranslation(ScribNode parent, ScribNode child, + SessTypeTranslator t) + { + } + + default ScribNode leaveSessTypeTranslation(ScribNode parent, ScribNode child, + SessTypeTranslator t, ScribNode visited) throws ScribbleException + { + return visited; + } } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GParallelDel.java b/scribble-core/src/main/java/org/scribble/del/global/GParallelDel.java deleted file mode 100644 index 9ddca9308..000000000 --- a/scribble-core/src/main/java/org/scribble/del/global/GParallelDel.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.del.global; - -import org.scribble.del.ParallelDel; - -public class GParallelDel extends ParallelDel implements GCompoundInteractionNodeDel -{ - -} diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java index 8fb90fda1..7409397cd 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java @@ -61,6 +61,11 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, GProtocolDef def = (GProtocolDef) visited; GProtocolBlock block = (GProtocolBlock) ((InlineProtocolEnv) def .getBlockChild().del().env()).getTranslation(); + + System.out.println("ccc1: " + child); + System.out.println("ccc2: " + visited); + //...HERE: update AF to ANTLR nodes + RecVarNode recvar = (RecVarNode) inl.job.af.SimpleNameNode(blame, RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString()); GRecursion rec = inl.job.af.GRecursion(blame, recvar, block); diff --git a/scribble-core/src/main/java/org/scribble/lang/Choice.java b/scribble-core/src/main/java/org/scribble/lang/Choice.java new file mode 100644 index 000000000..aedeb664a --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/Choice.java @@ -0,0 +1,45 @@ +package org.scribble.lang; + +import java.util.Collections; +import java.util.List; + +import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.Role; + +public abstract class Choice implements SessType +{ + public final Role subj; + public final List> blocks; // Pre: size > 0 + // CHECKME: rename? + + public Choice(Role subj, List> blocks) + { + this.subj = subj; + this.blocks = Collections.unmodifiableList(blocks); + } + + @Override + public int hashCode() + { + int hash = 1487; + hash = 31 * hash + this.subj.hashCode(); + hash = 31 * hash + this.blocks.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof Choice)) + { + return false; + } + Choice them = (Choice) o; + return them.canEquals(this) && this.subj.equals(them.subj) + && this.blocks.equals(them.blocks); + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/Do.java b/scribble-core/src/main/java/org/scribble/lang/Do.java new file mode 100644 index 000000000..fb42f7a31 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/Do.java @@ -0,0 +1,41 @@ +package org.scribble.lang; + +import java.util.Collections; +import java.util.List; + +import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.Role; + +public abstract class Do implements SessType +{ + public final List roles; // Ordered role args; pre: size > 1 + //public final List args; // CHECKME + + public Do(List roles) + { + this.roles = Collections.unmodifiableList(roles); + } + + @Override + public int hashCode() + { + int hash = 193; + hash = 31 * hash + this.roles.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof Do)) + { + return false; + } + Do them = (Do) o; + return them.canEquals(this) && this.roles.equals(them.roles); + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/LangConstants.java b/scribble-core/src/main/java/org/scribble/lang/LangConstants.java new file mode 100644 index 000000000..364596cec --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/LangConstants.java @@ -0,0 +1,11 @@ +package org.scribble.lang; + +public class LangConstants +{ + + public LangConstants() + { + // TODO Auto-generated constructor stub + } + +} diff --git a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java new file mode 100644 index 000000000..7b1ad5599 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java @@ -0,0 +1,46 @@ +package org.scribble.lang; + +import org.scribble.type.Message; +import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.Role; + +public abstract class MessageTransfer + implements SessType +{ + public final Role src; + public final Message msg; + public final Role dst; + + public MessageTransfer(Role src, Message msg, Role dst) + { + this.src = src; + this.msg = msg; + this.dst = dst; + } + + @Override + public int hashCode() + { + int hash = 17; + hash = 31 * hash + this.src.hashCode(); + hash = 31 * hash + this.msg.hashCode(); + hash = 31 * hash + this.dst.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof MessageTransfer)) + { + return false; + } + MessageTransfer them = (MessageTransfer) o; + return them.canEquals(this) && this.src.equals(them.src) + && this.msg.equals(them.msg) && this.dst.equals(them.dst); + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java new file mode 100644 index 000000000..374360a80 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -0,0 +1,47 @@ +package org.scribble.lang; + +import java.util.Collections; +import java.util.List; + +import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.Role; + +public abstract class Protocol implements SessType +{ + public final List roles; // Ordered role params; pre: size >= 2 + //public final List> params; // CHECKME + public final Seq body; + + public Protocol(List roles, //List params, + Seq body) + { + this.roles = Collections.unmodifiableList(roles); + this.body = body; + } + + @Override + public int hashCode() + { + int hash = 7; + hash = 31 * hash + this.roles.hashCode(); + hash = 31 * hash + this.body.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof Protocol)) + { + return false; + } + Protocol them = (Protocol) o; + return them.canEquals(this) && this.roles.equals(them.roles) + && this.body.equals(them.body); + } + +} diff --git a/scribble-core/src/main/java/org/scribble/lang/Seq.java b/scribble-core/src/main/java/org/scribble/lang/Seq.java new file mode 100644 index 000000000..f3124bbc5 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/Seq.java @@ -0,0 +1,39 @@ +package org.scribble.lang; + +import java.util.Collections; +import java.util.List; + +import org.scribble.type.kind.ProtocolKind; + +public abstract class Seq implements SessType +{ + public final List> elems; + + public Seq(List> elems) + { + this.elems = Collections.unmodifiableList(elems); + } + + @Override + public int hashCode() + { + int hash = 1483; + hash = 31 * hash + this.elems.hashCode(); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof Seq)) + { + return false; + } + Seq them = (Seq) obj; + return them.canEquals(this) && this.elems.equals(them.elems); + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/SessType.java b/scribble-core/src/main/java/org/scribble/lang/SessType.java new file mode 100644 index 000000000..590280d16 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/SessType.java @@ -0,0 +1,11 @@ +package org.scribble.lang; + +import org.scribble.type.kind.ProtocolKind; + +// CHECKME: move to type.sess? +// Generic works to "specialise" G/L subclasses (and works with immutable pattern) -- cf. not supported by contravariant method parameter subtyping for getters/setters +public interface SessType +{ + // Call this using: them.canEquals(this) + boolean canEquals(Object o); +} diff --git a/scribble-core/src/main/java/org/scribble/lang/SessTypeTranslator.java b/scribble-core/src/main/java/org/scribble/lang/SessTypeTranslator.java new file mode 100644 index 000000000..04dcb1785 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/SessTypeTranslator.java @@ -0,0 +1,20 @@ +package org.scribble.lang; + +import org.scribble.ast.global.GProtocolDecl; +import org.scribble.del.global.GDel; +import org.scribble.lang.global.GType; + +public class SessTypeTranslator +{ + public SessTypeTranslator() + { + + } + + public GType translate(GProtocolDecl gpd) + { + GDel del = (GDel) gpd.del(); + + return + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java new file mode 100644 index 000000000..e9f91841b --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -0,0 +1,44 @@ +package org.scribble.lang.global; + +import java.util.List; + +import org.scribble.lang.Choice; +import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; + +public class GChoice extends Choice implements GType +{ + public GChoice(Role subj, List blocks) + { + super(subj, blocks); + } + + @Override + public int hashCode() + { + int hash = 1487; + hash = 31 * hash + this.subj.hashCode(); + hash = 31 * hash + this.blocks.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof GChoice)) + { + return false; + } + return super.equals(o); + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof GChoice; + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java new file mode 100644 index 000000000..fe1f74c30 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -0,0 +1,43 @@ +package org.scribble.lang.global; + +import java.util.List; + +import org.scribble.lang.Do; +import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; + +public class GDo extends Do implements GType +{ + public GDo(List roles) + { + super(roles); + } + + @Override + public int hashCode() + { + int hash = 193; + hash = 31 * hash + this.roles.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof GDo)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof GDo; + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java new file mode 100644 index 000000000..98e07edfd --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java @@ -0,0 +1,45 @@ +package org.scribble.lang.global; + +import org.scribble.lang.MessageTransfer; +import org.scribble.type.Message; +import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; + +public class GMessageTransfer extends MessageTransfer + implements GType +{ + + public GMessageTransfer(Role src, Message msg, Role dst) + { + super(src, msg, dst); + } + + @Override + public int hashCode() + { + int hash = 1481; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof GMessageTransfer)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof GMessageTransfer; + } + +} diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java new file mode 100644 index 000000000..76ffdbb13 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -0,0 +1,44 @@ +package org.scribble.lang.global; + +import java.util.List; + +import org.scribble.lang.Protocol; +import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; + +public class GProtocol extends Protocol implements GType +{ + public GProtocol(List roles, //List params, + GSeq body) + { + super(roles, body); + } + + @Override + public int hashCode() + { + int hash = 11; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof GProtocol)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof GProtocol; + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java new file mode 100644 index 000000000..5bd1b7e5b --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -0,0 +1,42 @@ +package org.scribble.lang.global; + +import java.util.List; + +import org.scribble.lang.Seq; +import org.scribble.type.kind.Global; + +public class GSeq extends Seq implements GType +{ + public GSeq(List elems) + { + super(elems); + } + + @Override + public int hashCode() + { + int hash = 29; + hash = 31 * hash + this.elems.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof GSeq)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof GSeq; + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GType.java b/scribble-core/src/main/java/org/scribble/lang/global/GType.java new file mode 100644 index 000000000..13a2380f8 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/global/GType.java @@ -0,0 +1,9 @@ +package org.scribble.lang.global; + +import org.scribble.lang.SessType; +import org.scribble.type.kind.Global; + +public interface GType extends SessType +{ + +} diff --git a/scribble-core/src/main/java/org/scribble/main/Job.java b/scribble-core/src/main/java/org/scribble/main/Job.java index 09bb4d90b..98b8a31c7 100644 --- a/scribble-core/src/main/java/org/scribble/main/Job.java +++ b/scribble-core/src/main/java/org/scribble/main/Job.java @@ -53,6 +53,7 @@ public class Job { // FIXME: verbose/debug printing parameter: should be in MainContext, but currently cannot access that class directly from here + // TODO: simply keep a reference to MainContext instead? //public final boolean jUnit; public final boolean debug; public final boolean useOldWf; @@ -127,16 +128,18 @@ public void checkWellFormedness() throws ScribbleException public void runContextBuildingPasses() throws ScribbleException { - System.out.println("fff1: " + this.jcontext.getMainModule()); runVisitorPassOnAllModules(ModuleContextBuilder.class); // Always done first (even if other contexts are built later) so that following passes can use ModuleContextVisitor - - System.out.println("fff2: " + this.jcontext.getMainModule()); - runVisitorPassOnAllModules(NameDisambiguator.class); // Includes validating names used in subprotocol calls.. runVisitorPassOnAllModules(ProtocolDeclContextBuilder.class); //..which this pass depends on. This pass basically builds protocol dependency info runVisitorPassOnAllModules(DelegationProtocolRefChecker.class); // Must come after ProtocolDeclContextBuilder runVisitorPassOnAllModules(RoleCollector.class); // Actually, this is the second part of protocoldecl context building + + System.out.println("fff1: " + this.jcontext.getMainModule()); + runVisitorPassOnAllModules(ProtocolDefInliner.class); + + System.out.println("fff2: " + this.jcontext.getMainModule()); + //runUnfoldingPass(); } @@ -284,7 +287,8 @@ private void runVisitorPass(Set modnames, Class Date: Wed, 6 Feb 2019 19:19:25 +0000 Subject: [PATCH 090/539] Continued WIP. --- .../java/org/scribble/cli/CommandLine.java | 10 ++-- .../scribble/main/DefaultModuleLoader.java | 1 + .../java/org/scribble/main/MainContext.java | 24 +++++++-- .../java/org/scribble/main/ModuleLoader.java | 1 + .../org/scribble/main}/ScribModuleLoader.java | 5 +- .../scribble/main}/ScribbleAntlrWrapper.java | 3 +- .../main/resource/AbstractResource.java | 0 .../resource/DirectoryResourceLocator.java | 2 +- .../scribble/main/resource/FileResource.java | 0 .../main/resource/IResourceLocator.java | 2 +- .../main/resource/InlineResource.java | 0 .../org/scribble/main/resource/Resource.java | 2 + .../main/resource/ResourceLocator.java | 0 .../org/scribble/codegen/java/ApiGen.java | 2 +- .../codegen/java/JEndpointApiGenerator.java | 6 +-- .../callbackapi/CBEndpointApiGenerator.java | 6 +-- .../callbackapi/CBEndpointApiGenerator2.java | 6 +-- .../callbackapi/CBEndpointApiGenerator3.java | 6 +-- .../java/sessionapi/SessionApiGenerator.java | 4 +- .../java/statechanapi/BranchSockGen.java | 2 +- .../java/statechanapi/CaseSockGen.java | 2 +- .../java/statechanapi/HandlerIfaceGen.java | 2 +- .../java/statechanapi/InputFutureGen.java | 2 +- .../java/statechanapi/OutputSockGen.java | 2 +- .../java/statechanapi/ReceiveSockGen.java | 2 +- .../java/statechanapi/ScribSockGen.java | 2 +- .../java/statechanapi/StateChanTypeGen.java | 2 +- .../StateChannelApiGenerator.java | 6 +-- .../statechanapi/ioifaces/ActionIfaceGen.java | 2 +- .../statechanapi/ioifaces/BranchIfaceGen.java | 2 +- .../statechanapi/ioifaces/CaseIfaceGen.java | 2 +- .../statechanapi/ioifaces/HandleIfaceGen.java | 2 +- .../ioifaces/IOInterfacesGenerator.java | 6 +-- .../ioifaces/IOStateIfaceGen.java | 4 +- .../ioifaces/ReceiveIfaceGen.java | 2 +- .../statechanapi/ioifaces/SelectIfaceGen.java | 2 +- .../codegen/java/util/ConstructorBuilder.java | 2 +- .../codegen/java/util/EnumBuilder.java | 2 +- .../statetype/STStateChanAPIBuilder.java | 2 +- .../main/java/org/scribble/ast/Choice.java | 2 +- .../java/org/scribble/ast/ConnectAction.java | 2 +- .../main/java/org/scribble/ast/Continue.java | 2 +- .../org/scribble/ast/DisconnectAction.java | 2 +- .../src/main/java/org/scribble/ast/Do.java | 4 +- .../src/main/java/org/scribble/ast/DoArg.java | 2 +- .../main/java/org/scribble/ast/DoArgList.java | 2 +- .../org/scribble/ast/HeaderParamDecl.java | 2 +- .../org/scribble/ast/HeaderParamDeclList.java | 2 +- .../java/org/scribble/ast/ImportDecl.java | 2 +- .../java/org/scribble/ast/InteractionSeq.java | 2 +- .../java/org/scribble/ast/MessageSigNode.java | 2 +- .../org/scribble/ast/MessageTransfer.java | 2 +- .../main/java/org/scribble/ast/Module.java | 2 +- .../java/org/scribble/ast/ModuleDecl.java | 2 +- .../org/scribble/ast/NonProtocolDecl.java | 2 +- .../main/java/org/scribble/ast/Parallel.java | 2 +- .../org/scribble/ast/PayloadElemList.java | 2 +- .../java/org/scribble/ast/ProtocolBlock.java | 2 +- .../java/org/scribble/ast/ProtocolDecl.java | 2 +- .../java/org/scribble/ast/ProtocolDef.java | 2 +- .../java/org/scribble/ast/ProtocolHeader.java | 2 +- .../main/java/org/scribble/ast/Recursion.java | 2 +- .../main/java/org/scribble/ast/ScribNode.java | 14 +++-- .../java/org/scribble/ast/ScribNodeBase.java | 6 ++- .../org/scribble/ast/UnaryPayloadElem.java | 2 +- .../scribble/ast/context/ModuleContext.java | 24 +++++---- .../java/org/scribble/ast/global/GChoice.java | 4 +- .../scribble/ast/global/GDelegationElem.java | 2 +- .../java/org/scribble/ast/global/GDo.java | 2 +- .../scribble/ast/global/GProtocolDecl.java | 2 +- .../java/org/scribble/ast/local/LAccept.java | 4 +- .../java/org/scribble/ast/local/LChoice.java | 2 +- .../org/scribble/ast/local/LContinue.java | 2 +- .../org/scribble/ast/local/LDisconnect.java | 4 +- .../main/java/org/scribble/ast/local/LDo.java | 6 +-- .../scribble/ast/local/LInteractionNode.java | 2 +- .../java/org/scribble/ast/local/LReceive.java | 4 +- .../org/scribble/ast/local/LRecursion.java | 2 +- .../java/org/scribble/ast/local/LRequest.java | 4 +- .../java/org/scribble/ast/local/LSend.java | 4 +- .../org/scribble/ast/local/LWrapClient.java | 4 +- .../org/scribble/ast/local/LWrapServer.java | 4 +- .../main/java/org/scribble/del/ChoiceDel.java | 2 +- .../scribble/del/CompoundInteractionDel.java | 2 +- .../del/CompoundInteractionNodeDel.java | 2 +- .../org/scribble/del/ConnectionActionDel.java | 2 +- .../java/org/scribble/del/ContinueDel.java | 2 +- .../java/org/scribble/del/DoArgListDel.java | 4 +- .../src/main/java/org/scribble/del/DoDel.java | 4 +- .../scribble/del/HeaderParamDeclListDel.java | 2 +- .../org/scribble/del/InteractionSeqDel.java | 2 +- .../org/scribble/del/MessageTransferDel.java | 2 +- .../main/java/org/scribble/del/ModuleDel.java | 8 ++- .../org/scribble/del/NonRoleArgListDel.java | 2 +- .../org/scribble/del/NonRoleParamDeclDel.java | 2 +- .../org/scribble/del/ProtocolBlockDel.java | 2 +- .../org/scribble/del/ProtocolDeclDel.java | 2 +- .../java/org/scribble/del/ProtocolDefDel.java | 2 +- .../java/org/scribble/del/RecursionDel.java | 2 +- .../java/org/scribble/del/RoleArgListDel.java | 2 +- .../java/org/scribble/del/RoleDeclDel.java | 2 +- .../main/java/org/scribble/del/ScribDel.java | 3 +- .../del/SimpleInteractionNodeDel.java | 2 +- .../org/scribble/del/global/GChoiceDel.java | 4 +- .../org/scribble/del/global/GConnectDel.java | 2 +- .../org/scribble/del/global/GContinueDel.java | 2 +- .../java/org/scribble/del/global/GDel.java | 21 ++++---- .../del/global/GDelegationElemDel.java | 2 +- .../scribble/del/global/GDisconnectDel.java | 2 +- .../java/org/scribble/del/global/GDoDel.java | 2 +- .../del/global/GInteractionNodeDel.java | 4 +- .../del/global/GInteractionSeqDel.java | 21 +++++++- .../del/global/GMessageTransferDel.java | 20 ++++++- .../del/global/GProtocolBlockDel.java | 2 +- .../scribble/del/global/GProtocolDeclDel.java | 22 ++++++-- .../scribble/del/global/GProtocolDefDel.java | 2 +- .../scribble/del/global/GRecursionDel.java | 2 +- .../org/scribble/del/global/GWrapDel.java | 2 +- .../org/scribble/del/local/LAcceptDel.java | 2 +- .../org/scribble/del/local/LChoiceDel.java | 2 +- .../local/LCompoundInteractionNodeDel.java | 2 +- .../del/local/LConnectionActionDel.java | 2 +- .../org/scribble/del/local/LContinueDel.java | 2 +- .../scribble/del/local/LDisconnectDel.java | 2 +- .../java/org/scribble/del/local/LDoDel.java | 4 +- .../del/local/LInteractionNodeDel.java | 2 +- .../del/local/LInteractionSeqDel.java | 2 +- .../del/local/LMessageTransferDel.java | 2 +- .../del/local/LProjectionDeclDel.java | 2 +- .../scribble/del/local/LProtocolBlockDel.java | 2 +- .../scribble/del/local/LProtocolDeclDel.java | 2 +- .../scribble/del/local/LProtocolDefDel.java | 2 +- .../org/scribble/del/local/LReceiveDel.java | 2 +- .../org/scribble/del/local/LRecursionDel.java | 2 +- .../org/scribble/del/local/LRequestDel.java | 2 +- .../java/org/scribble/del/local/LSendDel.java | 2 +- .../scribble/del/local/LWrapClientDel.java | 2 +- .../scribble/del/local/LWrapServerDel.java | 2 +- .../scribble/del/name/AmbigNameNodeDel.java | 2 +- .../scribble/del/name/DataTypeNodeDel.java | 2 +- .../del/name/MessageSigNameNodeDel.java | 2 +- .../org/scribble/del/name/RecVarNodeDel.java | 2 +- .../org/scribble/del/name/RoleNodeDel.java | 2 +- .../{main => job}/AntlrSourceException.java | 2 +- .../java/org/scribble/{main => job}/Job.java | 6 +-- .../scribble/{main => job}/JobContext.java | 15 ++++-- .../RuntimeScribbleException.java | 2 +- .../{main => job}/ScribbleException.java | 2 +- .../java/org/scribble/{main => job}/Todo.java | 2 +- .../main/java/org/scribble/lang/Choice.java | 12 +++-- .../src/main/java/org/scribble/lang/Do.java | 10 ++-- .../org/scribble/lang/MessageTransfer.java | 12 +++-- .../main/java/org/scribble/lang/Protocol.java | 12 +++-- .../src/main/java/org/scribble/lang/Seq.java | 19 ++++--- .../main/java/org/scribble/lang/SessType.java | 4 ++ .../java/org/scribble/lang/SessTypeBase.java | 52 +++++++++++++++++++ .../org/scribble/lang/SessTypeTranslator.java | 20 ------- .../org/scribble/lang/global/GChoice.java | 5 +- .../java/org/scribble/lang/global/GDo.java | 4 +- .../lang/global/GMessageTransfer.java | 5 +- .../org/scribble/lang/global/GProtocol.java | 5 +- .../java/org/scribble/lang/global/GSeq.java | 6 ++- .../scribble/lang/global/GTypeTranslator.java | 22 ++++++++ .../org/scribble/model/GraphBuilderUtil.java | 2 +- .../main/java/org/scribble/model/MState.java | 4 +- .../scribble/model/endpoint/AutParser.java | 2 +- .../model/endpoint/EGraphBuilderUtil.java | 2 +- .../org/scribble/model/endpoint/EState.java | 2 +- .../model/global/SGraphBuilderUtil.java | 4 +- .../org/scribble/model/global/SModel.java | 4 +- .../java/org/scribble/util/ScribUtil.java | 4 +- .../java/org/scribble/visit/AstVisitor.java | 4 +- .../java/org/scribble/visit/EnvVisitor.java | 4 +- .../visit/InlinedProtocolUnfolder.java | 4 +- .../visit/InlinedProtocolVisitor.java | 4 +- .../visit/NoEnvInlinedProtocolVisitor.java | 2 +- .../visit/NoEnvOffsetSubprotocolVisitor.java | 2 +- .../visit/NoEnvSubprotocolVisitor.java | 2 +- .../scribble/visit/NoEnvUnfoldingVisitor.java | 2 +- .../visit/OffsetSubprotocolVisitor.java | 4 +- .../scribble/visit/ProtocolDefInliner.java | 6 +-- .../org/scribble/visit/SimpleVisitor.java | 34 ++++++++++++ .../scribble/visit/SubprotocolVisitor.java | 6 +-- .../java/org/scribble/visit/Substitutor.java | 4 +- .../org/scribble/visit/UnfoldingVisitor.java | 4 +- .../scribble/visit/context/EGraphBuilder.java | 4 +- .../visit/context/ModuleContextBuilder.java | 4 +- .../visit/context/ModuleContextVisitor.java | 5 +- .../context/ProjectedChoiceDoPruner.java | 6 +-- .../context/ProjectedChoiceSubjectFixer.java | 4 +- .../visit/context/ProjectedRoleDeclFixer.java | 4 +- .../org/scribble/visit/context/Projector.java | 4 +- .../context/ProtocolDeclContextBuilder.java | 4 +- .../scribble/visit/context/RecRemover.java | 4 +- .../UnguardedChoiceDoProjectionChecker.java | 4 +- .../main/java/org/scribble/visit/env/Env.java | 4 +- .../visit/util/MessageIdCollector.java | 4 +- .../scribble/visit/util/NameCollector.java | 2 +- .../scribble/visit/util/RecVarCollector.java | 4 +- .../scribble/visit/util/RoleCollector.java | 4 +- .../visit/validation/GProtocolValidator.java | 4 +- .../wf/DelegationProtocolRefChecker.java | 4 +- .../visit/wf/ExplicitCorrelationChecker.java | 4 +- .../scribble/visit/wf/NameDisambiguator.java | 4 +- .../visit/wf/ReachabilityChecker.java | 4 +- .../scribble/visit/wf/WFChoiceChecker.java | 4 +- .../runtime/net/BinaryChannelEndpoint.java | 2 +- .../runtime/session/EndpointInputQueues.java | 3 +- .../org/scribble/runtime/session/Session.java | 2 +- .../runtime/session/SessionEndpoint.java | 2 +- .../java/org/scribble/cli/ScribTestBase.java | 4 +- 211 files changed, 560 insertions(+), 352 deletions(-) rename {scribble-core => scribble-cli}/src/main/java/org/scribble/main/DefaultModuleLoader.java (97%) rename {scribble-core => scribble-cli}/src/main/java/org/scribble/main/ModuleLoader.java (97%) rename {scribble-parser/src/main/java/org/scribble/parser/scribble => scribble-cli/src/main/java/org/scribble/main}/ScribModuleLoader.java (94%) rename {scribble-parser/src/main/java/org/scribble/parser/scribble => scribble-cli/src/main/java/org/scribble/main}/ScribbleAntlrWrapper.java (98%) rename {scribble-core => scribble-cli}/src/main/java/org/scribble/main/resource/AbstractResource.java (100%) rename {scribble-core => scribble-cli}/src/main/java/org/scribble/main/resource/DirectoryResourceLocator.java (98%) rename {scribble-core => scribble-cli}/src/main/java/org/scribble/main/resource/FileResource.java (100%) rename {scribble-core => scribble-cli}/src/main/java/org/scribble/main/resource/IResourceLocator.java (96%) rename {scribble-core => scribble-cli}/src/main/java/org/scribble/main/resource/InlineResource.java (100%) rename {scribble-core => scribble-cli}/src/main/java/org/scribble/main/resource/Resource.java (93%) rename {scribble-core => scribble-cli}/src/main/java/org/scribble/main/resource/ResourceLocator.java (100%) rename scribble-core/src/main/java/org/scribble/{main => job}/AntlrSourceException.java (98%) rename scribble-core/src/main/java/org/scribble/{main => job}/Job.java (98%) rename scribble-core/src/main/java/org/scribble/{main => job}/JobContext.java (95%) rename scribble-core/src/main/java/org/scribble/{main => job}/RuntimeScribbleException.java (98%) rename scribble-core/src/main/java/org/scribble/{main => job}/ScribbleException.java (98%) rename scribble-core/src/main/java/org/scribble/{main => job}/Todo.java (99%) create mode 100644 scribble-core/src/main/java/org/scribble/lang/SessTypeBase.java delete mode 100644 scribble-core/src/main/java/org/scribble/lang/SessTypeTranslator.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java create mode 100644 scribble-core/src/main/java/org/scribble/visit/SimpleVisitor.java diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index fee47c57c..f2e88ae99 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -28,12 +28,12 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.codegen.java.JEndpointApiGenerator; import org.scribble.codegen.java.callbackapi.CBEndpointApiGenerator3; -import org.scribble.main.AntlrSourceException; -import org.scribble.main.Job; -import org.scribble.main.JobContext; +import org.scribble.job.AntlrSourceException; +import org.scribble.job.Job; +import org.scribble.job.JobContext; +import org.scribble.job.RuntimeScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.main.MainContext; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; import org.scribble.main.resource.DirectoryResourceLocator; import org.scribble.main.resource.ResourceLocator; import org.scribble.model.endpoint.EGraph; diff --git a/scribble-core/src/main/java/org/scribble/main/DefaultModuleLoader.java b/scribble-cli/src/main/java/org/scribble/main/DefaultModuleLoader.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/main/DefaultModuleLoader.java rename to scribble-cli/src/main/java/org/scribble/main/DefaultModuleLoader.java index 907dc8652..e5452aa89 100644 --- a/scribble-core/src/main/java/org/scribble/main/DefaultModuleLoader.java +++ b/scribble-cli/src/main/java/org/scribble/main/DefaultModuleLoader.java @@ -15,6 +15,7 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Module; +import org.scribble.job.ScribbleException; import org.scribble.main.resource.Resource; import org.scribble.type.name.ModuleName; import org.scribble.util.Pair; diff --git a/scribble-cli/src/main/java/org/scribble/main/MainContext.java b/scribble-cli/src/main/java/org/scribble/main/MainContext.java index 51fd2b2a2..1d1ff425b 100644 --- a/scribble-cli/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-cli/src/main/java/org/scribble/main/MainContext.java @@ -16,6 +16,7 @@ import java.io.File; import java.nio.file.Path; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -28,6 +29,9 @@ import org.scribble.ast.ImportDecl; import org.scribble.ast.ImportModule; import org.scribble.ast.Module; +import org.scribble.ast.context.ModuleContext; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.main.resource.DirectoryResourceLocator; import org.scribble.main.resource.InlineResource; import org.scribble.main.resource.Resource; @@ -36,8 +40,6 @@ import org.scribble.model.endpoint.EModelFactoryImpl; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.SModelFactoryImpl; -import org.scribble.parser.scribble.ScribbleAntlrWrapper; -import org.scribble.parser.scribble.ScribModuleLoader; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.type.name.ModuleName; import org.scribble.util.Pair; @@ -48,7 +50,6 @@ // Resource and ResourceLocator should be made abstract from (file)paths (cf. use of toPath in ScribbleModuleLoader) public class MainContext { - // Only "manually" used here for loading main module (which should be factored out to front end) -- otherwise, only used within loader protected final ScribbleAntlrWrapper antlrParser = newAntlrParser(); // Not encapsulated inside ScribbleParser, because ScribbleParser's main function is to "parse" ANTLR CommonTrees into ModelNodes protected final AntlrToScribParser scribParser = newScribParser(); @@ -73,7 +74,9 @@ public class MainContext private final ResourceLocator locator; // Path -> Resource private final ScribModuleLoader loader; // sesstype.ModuleName -> Pair - protected ModuleName main; + protected ModuleName main; // Full name + + protected Map mctxts; // Full names (like this.parsed) // ModuleName keys are full module names -- parsed are the modules read from file, distinguished from the generated projection modules // Resource recorded for source path @@ -162,7 +165,17 @@ private void init(Resource res, Module mainmod) Pair p = new Pair<>(res, mainmod); this.main = p.right.getFullModuleName(); // TODO CHECKME: main modname comes from the inlined moddecl -- check for issues if this clashes with an existing file system resource - loadAllModules(p); + loadAllModules(p); // Populates this.parsed + + Map tmp = this.parsed.entrySet().stream() + .collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue().right)); + Map map = new HashMap<>(); + for (ModuleName fullname : this.parsed.keySet()) + { + Pair e = this.parsed.get(fullname); + map.put(fullname, new ModuleContext(tmp, e.right)); + } + this.mctxts = Collections.unmodifiableMap(map); } // A Scribble extension should override these "new" methods as appropriate. @@ -199,6 +212,7 @@ protected SModelFactory newSModelFactory() return new SModelFactoryImpl(); } + // Populates this.parsed private void loadAllModules(Pair module) throws ScribParserException, ScribbleException { diff --git a/scribble-core/src/main/java/org/scribble/main/ModuleLoader.java b/scribble-cli/src/main/java/org/scribble/main/ModuleLoader.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/main/ModuleLoader.java rename to scribble-cli/src/main/java/org/scribble/main/ModuleLoader.java index 158900adf..0b92fc933 100644 --- a/scribble-core/src/main/java/org/scribble/main/ModuleLoader.java +++ b/scribble-cli/src/main/java/org/scribble/main/ModuleLoader.java @@ -15,6 +15,7 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Module; +import org.scribble.job.ScribbleException; import org.scribble.main.resource.Resource; import org.scribble.type.name.ModuleName; import org.scribble.util.Pair; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribModuleLoader.java b/scribble-cli/src/main/java/org/scribble/main/ScribModuleLoader.java similarity index 94% rename from scribble-parser/src/main/java/org/scribble/parser/scribble/ScribModuleLoader.java rename to scribble-cli/src/main/java/org/scribble/main/ScribModuleLoader.java index 31cdcc888..9ae44b74c 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribModuleLoader.java +++ b/scribble-cli/src/main/java/org/scribble/main/ScribModuleLoader.java @@ -11,14 +11,15 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.parser.scribble; +package org.scribble.main; import org.scribble.ast.AstFactory; import org.scribble.ast.Module; +import org.scribble.job.ScribbleException; import org.scribble.main.DefaultModuleLoader; -import org.scribble.main.ScribbleException; import org.scribble.main.resource.Resource; import org.scribble.main.resource.ResourceLocator; +import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.type.name.ModuleName; import org.scribble.util.Pair; import org.scribble.util.ScribParserException; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java b/scribble-cli/src/main/java/org/scribble/main/ScribbleAntlrWrapper.java similarity index 98% rename from scribble-parser/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java rename to scribble-cli/src/main/java/org/scribble/main/ScribbleAntlrWrapper.java index 93f315ec4..f32d38602 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java +++ b/scribble-cli/src/main/java/org/scribble/main/ScribbleAntlrWrapper.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.parser.scribble; +package org.scribble.main; import java.io.IOException; import java.io.InputStream; @@ -24,6 +24,7 @@ import org.scribble.main.resource.Resource; import org.scribble.parser.antlr.ScribbleLexer; import org.scribble.parser.antlr.ScribbleParser; +import org.scribble.parser.scribble.ScribTreeAdaptor; // Resource -> ANTLR CommonTree -- parses Resources into ANTLR CommonTrees // Wraps the ScribbleLexer and ScribbleParser generated by ANTLR from Scribble.g diff --git a/scribble-core/src/main/java/org/scribble/main/resource/AbstractResource.java b/scribble-cli/src/main/java/org/scribble/main/resource/AbstractResource.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/main/resource/AbstractResource.java rename to scribble-cli/src/main/java/org/scribble/main/resource/AbstractResource.java diff --git a/scribble-core/src/main/java/org/scribble/main/resource/DirectoryResourceLocator.java b/scribble-cli/src/main/java/org/scribble/main/resource/DirectoryResourceLocator.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/main/resource/DirectoryResourceLocator.java rename to scribble-cli/src/main/java/org/scribble/main/resource/DirectoryResourceLocator.java index b000a233a..aaa4f6105 100644 --- a/scribble-core/src/main/java/org/scribble/main/resource/DirectoryResourceLocator.java +++ b/scribble-cli/src/main/java/org/scribble/main/resource/DirectoryResourceLocator.java @@ -19,7 +19,7 @@ import java.util.LinkedList; import java.util.List; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; /** * This class provides a directory based resource locator. diff --git a/scribble-core/src/main/java/org/scribble/main/resource/FileResource.java b/scribble-cli/src/main/java/org/scribble/main/resource/FileResource.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/main/resource/FileResource.java rename to scribble-cli/src/main/java/org/scribble/main/resource/FileResource.java diff --git a/scribble-core/src/main/java/org/scribble/main/resource/IResourceLocator.java b/scribble-cli/src/main/java/org/scribble/main/resource/IResourceLocator.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/main/resource/IResourceLocator.java rename to scribble-cli/src/main/java/org/scribble/main/resource/IResourceLocator.java index 3b9ae463c..bbda4686a 100644 --- a/scribble-core/src/main/java/org/scribble/main/resource/IResourceLocator.java +++ b/scribble-cli/src/main/java/org/scribble/main/resource/IResourceLocator.java @@ -15,7 +15,7 @@ import java.nio.file.Path; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; /** diff --git a/scribble-core/src/main/java/org/scribble/main/resource/InlineResource.java b/scribble-cli/src/main/java/org/scribble/main/resource/InlineResource.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/main/resource/InlineResource.java rename to scribble-cli/src/main/java/org/scribble/main/resource/InlineResource.java diff --git a/scribble-core/src/main/java/org/scribble/main/resource/Resource.java b/scribble-cli/src/main/java/org/scribble/main/resource/Resource.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/main/resource/Resource.java rename to scribble-cli/src/main/java/org/scribble/main/resource/Resource.java index 8829ddc30..ccb388d6a 100644 --- a/scribble-core/src/main/java/org/scribble/main/resource/Resource.java +++ b/scribble-cli/src/main/java/org/scribble/main/resource/Resource.java @@ -17,6 +17,8 @@ /** * This class represents the resource. + * + * CHECKME: maybe refactor core Resource classes out of cli package (generalise) * */ public interface Resource diff --git a/scribble-core/src/main/java/org/scribble/main/resource/ResourceLocator.java b/scribble-cli/src/main/java/org/scribble/main/resource/ResourceLocator.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/main/resource/ResourceLocator.java rename to scribble-cli/src/main/java/org/scribble/main/resource/ResourceLocator.java diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java index 67393313b..b0fb6550d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java @@ -15,7 +15,7 @@ import java.util.Map; -import org.scribble.main.Job; +import org.scribble.job.Job; import org.scribble.type.name.GProtocolName; // Basic pattern: use TypeGenerators to create all necessary TypeBuilders and cache them, and generateApi should call build on all as a final step diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java index 83f014e27..d08a9449d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java @@ -19,9 +19,9 @@ import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.statechanapi.ioifaces.IOInterfacesGenerator; -import org.scribble.main.Job; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.RuntimeScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index d37ba7020..d1414e8f9 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -12,9 +12,9 @@ import org.scribble.ast.DataTypeDecl; import org.scribble.ast.MessageSigNameDecl; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; -import org.scribble.main.Job; -import org.scribble.main.JobContext; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.JobContext; +import org.scribble.job.ScribbleException; import org.scribble.model.MState; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.EStateKind; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java index 27e6c5234..008d12f31 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java @@ -18,9 +18,9 @@ import org.scribble.codegen.java.util.FieldBuilder; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.main.Job; -import org.scribble.main.JobContext; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.JobContext; +import org.scribble.job.ScribbleException; import org.scribble.model.MState; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.EStateKind; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 0a6c6e846..b2cad62fc 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -19,9 +19,9 @@ import org.scribble.codegen.java.util.FieldBuilder; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.main.Job; -import org.scribble.main.JobContext; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.JobContext; +import org.scribble.job.ScribbleException; import org.scribble.model.MState; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.EStateKind; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index 0af47cbae..78d208d53 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -28,8 +28,8 @@ import org.scribble.codegen.java.util.FieldBuilder; import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.del.ModuleDel; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java index 48e8cf822..13383ff0f 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java @@ -27,7 +27,7 @@ import org.scribble.codegen.java.util.EnumBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java index 6bf27c23b..2dfeda36c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java @@ -24,7 +24,7 @@ import org.scribble.codegen.java.util.FieldBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java index 22c06fb5d..88e0aed49 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java @@ -21,7 +21,7 @@ import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.GProtocolName; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java index b3aa5453a..e004361b1 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java @@ -26,7 +26,7 @@ import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; import org.scribble.type.name.GProtocolName; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java index 502aae8ec..f1a284f0f 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java @@ -24,7 +24,7 @@ import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java index 2e0c74336..e7950781f 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java @@ -20,7 +20,7 @@ import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java index 17ab9af3a..c2f526783 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java @@ -23,7 +23,7 @@ import org.scribble.codegen.java.util.FieldBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.MessageId; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChanTypeGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChanTypeGen.java index c1b04f396..3df9202a2 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChanTypeGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChanTypeGen.java @@ -14,7 +14,7 @@ package org.scribble.codegen.java.statechanapi; import org.scribble.codegen.java.util.TypeBuilder; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; // Build a (top-level) type declaration for the API generation output public abstract class StateChanTypeGen diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index d2f6f16f5..4bdad6246 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -22,9 +22,9 @@ import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.TypeBuilder; -import org.scribble.main.Job; -import org.scribble.main.JobContext; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.JobContext; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.GProtocolName; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java index 9347cbd92..f9db95b6a 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java @@ -20,7 +20,7 @@ import org.scribble.codegen.java.util.AbstractMethodBuilder; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.model.endpoint.actions.EReceive; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java index dd2aab942..b480a43e9 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java @@ -25,7 +25,7 @@ import org.scribble.codegen.java.util.EnumBuilder; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.Role; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java index cd161355e..5f3acb192 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java @@ -25,7 +25,7 @@ import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.GProtocolName; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java index 8e08b5372..52436caf3 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java @@ -23,7 +23,7 @@ import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.GProtocolName; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index c5e1acfed..64e429905 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -37,9 +37,9 @@ import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.codegen.java.util.TypeBuilder; -import org.scribble.main.JobContext; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; +import org.scribble.job.JobContext; +import org.scribble.job.RuntimeScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.EStateKind; import org.scribble.model.endpoint.actions.EAction; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java index 6c1aacff3..ca55affd4 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java @@ -26,8 +26,8 @@ import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.TypeBuilder; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; +import org.scribble.job.RuntimeScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.GProtocolName; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java index 51f2211e1..4cd6c6bcf 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java @@ -22,7 +22,7 @@ import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.GProtocolName; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java index d3640d2d4..f1946a9b4 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java @@ -17,7 +17,7 @@ import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.util.InterfaceBuilder; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/util/ConstructorBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/util/ConstructorBuilder.java index 4d54e3754..e76db47ce 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/util/ConstructorBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/util/ConstructorBuilder.java @@ -13,7 +13,7 @@ */ package org.scribble.codegen.java.util; -import org.scribble.main.RuntimeScribbleException; +import org.scribble.job.RuntimeScribbleException; public class ConstructorBuilder extends MethodBuilder { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/util/EnumBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/util/EnumBuilder.java index f54315023..7bcb5043b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/util/EnumBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/util/EnumBuilder.java @@ -18,7 +18,7 @@ import java.util.List; import java.util.stream.Collectors; -import org.scribble.main.RuntimeScribbleException; +import org.scribble.job.RuntimeScribbleException; public class EnumBuilder extends TypeBuilder { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index a158f719a..662c017ea 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -18,7 +18,7 @@ import java.util.Map; import java.util.Set; -import org.scribble.main.Job; +import org.scribble.job.Job; import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; diff --git a/scribble-core/src/main/java/org/scribble/ast/Choice.java b/scribble-core/src/main/java/org/scribble/ast/Choice.java index e308a68c0..cf13e3807 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Choice.java +++ b/scribble-core/src/main/java/org/scribble/ast/Choice.java @@ -21,7 +21,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java b/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java index 82aad911e..c27ca0214 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java +++ b/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java @@ -17,7 +17,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/Continue.java b/scribble-core/src/main/java/org/scribble/ast/Continue.java index 71a6a20f0..55a41db6d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Continue.java +++ b/scribble-core/src/main/java/org/scribble/ast/Continue.java @@ -17,7 +17,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java index 2d09783ef..cf93155f4 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java @@ -17,7 +17,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/Do.java b/scribble-core/src/main/java/org/scribble/ast/Do.java index 6eaa6ff82..95144dd4e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Do.java +++ b/scribble-core/src/main/java/org/scribble/ast/Do.java @@ -20,8 +20,8 @@ import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.qualified.ProtocolNameNode; import org.scribble.del.ScribDel; -import org.scribble.main.JobContext; -import org.scribble.main.ScribbleException; +import org.scribble.job.JobContext; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/ast/DoArg.java b/scribble-core/src/main/java/org/scribble/ast/DoArg.java index 3a82f3a68..329c96dbf 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DoArg.java +++ b/scribble-core/src/main/java/org/scribble/ast/DoArg.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/DoArgList.java b/scribble-core/src/main/java/org/scribble/ast/DoArgList.java index 4dffc40f1..216ef01ea 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DoArgList.java +++ b/scribble-core/src/main/java/org/scribble/ast/DoArgList.java @@ -20,7 +20,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java index 09c83130e..4bbdc2498 100644 --- a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java @@ -17,7 +17,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.SimpleNameNode; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ParamKind; import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java index 7c7572386..d9cdb0933 100644 --- a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java +++ b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java @@ -20,7 +20,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ParamKind; import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/ImportDecl.java b/scribble-core/src/main/java/org/scribble/ast/ImportDecl.java index 6d1baa53b..6904a2cc9 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ImportDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/ImportDecl.java @@ -17,7 +17,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ImportKind; import org.scribble.type.name.Name; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java b/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java index 595eaa23a..a97bdf5b4 100644 --- a/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java +++ b/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java @@ -20,7 +20,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java b/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java index b1b705686..c3f07ebdf 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java @@ -17,7 +17,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.OpNode; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.MessageSig; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java index 3182c66d4..1838e1880 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java @@ -21,7 +21,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/Module.java b/scribble-core/src/main/java/org/scribble/ast/Module.java index 5b39f2aa6..b08969260 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Module.java +++ b/scribble-core/src/main/java/org/scribble/ast/Module.java @@ -24,7 +24,7 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.local.LProtocolDecl; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.kind.Kind; import org.scribble.type.kind.ProtocolKind; diff --git a/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java b/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java index c2e5235bb..20cda42a9 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java @@ -20,7 +20,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ModuleKind; import org.scribble.type.name.ModuleName; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java index f56da058b..48388c861 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java @@ -17,7 +17,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.NonProtocolKind; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/Parallel.java b/scribble-core/src/main/java/org/scribble/ast/Parallel.java index 9b9289829..e02e06631 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Parallel.java +++ b/scribble-core/src/main/java/org/scribble/ast/Parallel.java @@ -18,7 +18,7 @@ import java.util.List; import org.antlr.runtime.tree.CommonTree; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java b/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java index c41dc9036..1d7b22ada 100644 --- a/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java +++ b/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java @@ -20,7 +20,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Payload; import org.scribble.type.name.PayloadElemType; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java index 30a5b5431..6829531c5 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java index 1e904859e..38e66044c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java @@ -19,7 +19,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolDef.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolDef.java index 57a90f0e7..d8331121f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolDef.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolDef.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java index 3a8242378..b64f19f1e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java @@ -18,7 +18,7 @@ import org.scribble.ast.name.NameNode; import org.scribble.ast.name.qualified.ProtocolNameNode; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/Recursion.java b/scribble-core/src/main/java/org/scribble/ast/Recursion.java index 47233dd8f..2500c4560 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/ast/Recursion.java @@ -17,7 +17,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNode.java b/scribble-core/src/main/java/org/scribble/ast/ScribNode.java index 391fdb9c8..78830b6d2 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/ScribNode.java @@ -16,8 +16,9 @@ import org.antlr.runtime.tree.CommonTree; import org.antlr.runtime.tree.Tree; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.AstVisitor; +import org.scribble.visit.SimpleVisitor; import org.scribble.visit.Substitutor; /** @@ -36,9 +37,11 @@ public interface ScribNode extends Tree ScribDel del(); ScribNode del(ScribDel del); - - ScribNode accept(AstVisitor nv) throws ScribbleException; // The "top-level" method, e.g., module.accept(v) (cf. Job::runVisitorOnModule) - ScribNode visitChildren(AstVisitor nv) throws ScribbleException; + + default T visitWith(SimpleVisitor v) throws ScribbleException // "Top-level" visitor entry method + { + return v.visit(this); // N.B. ScribNode has getParent + } // Simple operations, not worth doing del enter/leave pattern for // Rely on visitChildren reconstruction pattern to do recursive reconstruction @@ -48,4 +51,7 @@ public interface ScribNode extends Tree CommonTree getSource(); // Previously: for parsed entities, null if not parsed // Now: for the original parsed entity for error blaming; should not be null unless a "purely generated" entity + + ScribNode accept(AstVisitor nv) throws ScribbleException; // The "top-level" method, e.g., module.accept(v) (cf. Job::runVisitorOnModule) + ScribNode visitChildren(AstVisitor nv) throws ScribbleException; } diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java index c458d393b..d0ec2cc62 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -22,8 +22,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.del.ScribDel; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; +import org.scribble.job.RuntimeScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.kind.Local; import org.scribble.type.kind.ProtocolKind; @@ -34,6 +34,8 @@ /** * This is the generic object from which all Scribble model objects * are derived. + * + * ScribNodeBase is to ScribNode, as ANTLR CommonTree is to Tree. */ public abstract class ScribNodeBase extends CommonTree implements ScribNode { diff --git a/scribble-core/src/main/java/org/scribble/ast/UnaryPayloadElem.java b/scribble-core/src/main/java/org/scribble/ast/UnaryPayloadElem.java index 5484d208e..1675023fd 100644 --- a/scribble-core/src/main/java/org/scribble/ast/UnaryPayloadElem.java +++ b/scribble-core/src/main/java/org/scribble/ast/UnaryPayloadElem.java @@ -17,7 +17,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.PayloadElemNameNode; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.PayloadTypeKind; import org.scribble.type.name.PayloadElemType; import org.scribble.visit.AstVisitor; diff --git a/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java b/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java index 6f1681a14..ded20bf3a 100644 --- a/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java +++ b/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java @@ -24,8 +24,7 @@ import org.scribble.ast.NonProtocolDecl; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.local.LProtocolDecl; -import org.scribble.main.JobContext; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.kind.Kind; import org.scribble.type.kind.ProtocolKind; @@ -39,9 +38,10 @@ import org.scribble.type.name.ProtocolName; // Context information specific to each module as a root (wrt. to visitor passes) +// CHECKME: move to main package? public class ModuleContext { - public final ModuleName root; // full name + public final ModuleName root; // full name // The root Module for this ModuleContext (cf. the "main" root module from CLI) // All transitive name dependencies of this module: all names fully qualified // The ScribNames maps are basically just used as sets (identity map) @@ -55,7 +55,9 @@ public class ModuleContext // Made by ModuleContextBuilder // ModuleContext is the root context - public ModuleContext(JobContext jcontext, Module root) throws ScribbleException + public ModuleContext(//JobContext jcontext, + Map parsed, // From MainContext (N.B., in a different non-visible package) + Module root) throws ScribbleException { ModuleName fullname = root.getFullModuleName(); ModuleName simpname = root.getModuleDeclChild().getDeclName(); @@ -64,7 +66,7 @@ public ModuleContext(JobContext jcontext, Module root) throws ScribbleException // All transitive dependencies (for inlined and subprotocol visiting) addModule(this.deps, root, fullname); - addImportDependencies(jcontext, root); + addImportDependencies(parsed, root); // Names directly visible from this module addModule(this.visible, root, fullname); @@ -73,7 +75,7 @@ public ModuleContext(JobContext jcontext, Module root) throws ScribbleException addModule(this.visible, root, simpname); // Adds simple name of root as visible, and members qualified by simple name } - addVisible(jcontext, root); + addVisible(parsed, root); // Adds imports and members by their "direct" names (unqualified, except for no-alias imports) } @@ -113,7 +115,7 @@ private static void addModule(ScribNames names, Module mod, } // Could move to ImportModule but would need a defensive copy setter, or cache info in builder and create on leave - private void addImportDependencies(JobContext jcontext, Module mod) + private void addImportDependencies(Map parsed, Module mod) throws ScribbleException { for (ImportDecl id : mod.getImportDeclChildren()) @@ -124,9 +126,9 @@ private void addImportDependencies(JobContext jcontext, Module mod) ModuleName fullmodname = im.getModuleNameNodeChild().toName(); if (!this.deps.modules.containsKey(fullmodname)) { - Module imported = jcontext.getModule(fullmodname); + Module imported = parsed.get(fullmodname); // TODO: Can get from MainContext instead of JobContext? addModule(this.deps, imported, fullmodname); // Unlike for visible, only doing full names here - addImportDependencies(jcontext, imported); + addImportDependencies(parsed, imported); } } else @@ -138,7 +140,7 @@ private void addImportDependencies(JobContext jcontext, Module mod) // Adds "local" imports by alias or full name // Adds "local" members by simple names - private void addVisible(JobContext jcontext, Module root) + private void addVisible(Map parsed, Module root) throws ScribbleException { // Unlike for deps, visible is not done transitively @@ -155,7 +157,7 @@ private void addVisible(JobContext jcontext, Module root) throw new ScribbleException(id.getSource(), "Duplicate visible module name: " + visname); } - Module imported = jcontext.getModule(fullname); + Module imported = parsed.get(fullname); // TODO: Can get from MainContext instead of JobContext? addModule(this.visible, imported, visname); } else diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java b/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java index 31dde9ea4..b1a8d1bfd 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java @@ -25,8 +25,8 @@ import org.scribble.ast.local.LChoice; import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; +import org.scribble.job.RuntimeScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GDelegationElem.java b/scribble-core/src/main/java/org/scribble/ast/global/GDelegationElem.java index 082b7ef3d..e34576fe9 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GDelegationElem.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GDelegationElem.java @@ -22,7 +22,7 @@ import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.Local; import org.scribble.type.name.GDelegationType; import org.scribble.type.name.PayloadElemType; diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GDo.java b/scribble-core/src/main/java/org/scribble/ast/global/GDo.java index de5f5d808..77b44c2ac 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GDo.java @@ -23,7 +23,7 @@ import org.scribble.ast.local.LDo; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.main.JobContext; +import org.scribble.job.JobContext; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java index e42410cfa..5f9747137 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java @@ -23,7 +23,7 @@ import org.scribble.ast.local.LProjectionDecl; import org.scribble.ast.local.LProtocolDef; import org.scribble.ast.local.LProtocolHeader; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.ModuleName; diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java b/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java index 911537ba7..8af7cd8c8 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java @@ -22,8 +22,8 @@ import org.scribble.ast.Constants; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; +import org.scribble.job.RuntimeScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Message; import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java b/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java index 61081aa55..6fbba93f7 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java @@ -24,7 +24,7 @@ import org.scribble.ast.Choice; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Message; import org.scribble.type.kind.Local; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LContinue.java b/scribble-core/src/main/java/org/scribble/ast/local/LContinue.java index 0ab3d7581..732b5e13c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LContinue.java @@ -21,7 +21,7 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Continue; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Message; import org.scribble.type.kind.Local; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java b/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java index d1aa66cf0..b4fb3a0ac 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java @@ -23,8 +23,8 @@ import org.scribble.ast.DisconnectAction; import org.scribble.ast.MessageSigNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; +import org.scribble.job.RuntimeScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Message; import org.scribble.type.kind.Local; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LDo.java b/scribble-core/src/main/java/org/scribble/ast/local/LDo.java index 7a0fb7854..86db17208 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LDo.java @@ -25,9 +25,9 @@ import org.scribble.ast.RoleArgList; import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.main.JobContext; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; +import org.scribble.job.JobContext; +import org.scribble.job.RuntimeScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Message; import org.scribble.type.kind.Local; import org.scribble.type.name.LProtocolName; diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LInteractionNode.java b/scribble-core/src/main/java/org/scribble/ast/local/LInteractionNode.java index 9dbcaf4fc..8db975279 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LInteractionNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LInteractionNode.java @@ -17,7 +17,7 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.InteractionNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Message; import org.scribble.type.kind.Local; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java b/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java index 5c714d199..db712c636 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java @@ -23,8 +23,8 @@ import org.scribble.ast.Constants; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; +import org.scribble.job.RuntimeScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Message; import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java index 33f45f54b..93ed3170f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java @@ -20,7 +20,7 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Recursion; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Message; import org.scribble.type.kind.Local; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java b/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java index d76900438..48db66b76 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java @@ -22,8 +22,8 @@ import org.scribble.ast.Constants; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; +import org.scribble.job.RuntimeScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Message; import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LSend.java b/scribble-core/src/main/java/org/scribble/ast/local/LSend.java index d728803be..0863d1211 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LSend.java @@ -24,8 +24,8 @@ import org.scribble.ast.Constants; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; +import org.scribble.job.RuntimeScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Message; import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java b/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java index 2edc7d3f4..307be326d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java @@ -22,8 +22,8 @@ import org.scribble.ast.Constants; import org.scribble.ast.MessageSigNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; +import org.scribble.job.RuntimeScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Message; import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java b/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java index 5f53382a9..eb6f2120c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java @@ -22,8 +22,8 @@ import org.scribble.ast.Constants; import org.scribble.ast.MessageSigNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; +import org.scribble.job.RuntimeScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Message; import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-core/src/main/java/org/scribble/del/ChoiceDel.java b/scribble-core/src/main/java/org/scribble/del/ChoiceDel.java index 23f01f3d6..da4857467 100644 --- a/scribble-core/src/main/java/org/scribble/del/ChoiceDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ChoiceDel.java @@ -18,7 +18,7 @@ import org.scribble.ast.Choice; import org.scribble.ast.ScribNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.env.UnfoldingEnv; import org.scribble.visit.wf.ExplicitCorrelationChecker; diff --git a/scribble-core/src/main/java/org/scribble/del/CompoundInteractionDel.java b/scribble-core/src/main/java/org/scribble/del/CompoundInteractionDel.java index 53f42e34e..85f148857 100644 --- a/scribble-core/src/main/java/org/scribble/del/CompoundInteractionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/CompoundInteractionDel.java @@ -14,7 +14,7 @@ package org.scribble.del; import org.scribble.ast.ScribNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; import org.scribble.visit.wf.ExplicitCorrelationChecker; diff --git a/scribble-core/src/main/java/org/scribble/del/CompoundInteractionNodeDel.java b/scribble-core/src/main/java/org/scribble/del/CompoundInteractionNodeDel.java index 70035ebbb..1b239dbfb 100644 --- a/scribble-core/src/main/java/org/scribble/del/CompoundInteractionNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/CompoundInteractionNodeDel.java @@ -15,7 +15,7 @@ import org.scribble.ast.CompoundInteractionNode; import org.scribble.ast.ScribNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; diff --git a/scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java b/scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java index 5f0a12b80..7989e9da4 100644 --- a/scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java @@ -15,7 +15,7 @@ import org.scribble.ast.ConnectAction; import org.scribble.ast.ScribNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.env.UnfoldingEnv; diff --git a/scribble-core/src/main/java/org/scribble/del/ContinueDel.java b/scribble-core/src/main/java/org/scribble/del/ContinueDel.java index bcaee0035..caccd8e0f 100644 --- a/scribble-core/src/main/java/org/scribble/del/ContinueDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ContinueDel.java @@ -16,7 +16,7 @@ import org.scribble.ast.Continue; import org.scribble.ast.Recursion; import org.scribble.ast.ScribNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.name.RecVar; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.util.RecVarCollector; diff --git a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java index 2008d0566..f72668e68 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java @@ -21,8 +21,8 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.context.ModuleContext; -import org.scribble.main.JobContext; -import org.scribble.main.ScribbleException; +import org.scribble.job.JobContext; +import org.scribble.job.ScribbleException; import org.scribble.type.name.ProtocolName; import org.scribble.visit.wf.NameDisambiguator; diff --git a/scribble-core/src/main/java/org/scribble/del/DoDel.java b/scribble-core/src/main/java/org/scribble/del/DoDel.java index f8110e9a3..ab3485b9c 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoDel.java @@ -17,8 +17,8 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.qualified.ProtocolNameNode; -import org.scribble.main.JobContext; -import org.scribble.main.ScribbleException; +import org.scribble.job.JobContext; +import org.scribble.job.ScribbleException; import org.scribble.type.SubprotocolSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; diff --git a/scribble-core/src/main/java/org/scribble/del/HeaderParamDeclListDel.java b/scribble-core/src/main/java/org/scribble/del/HeaderParamDeclListDel.java index 8e390f61d..e969dae4c 100644 --- a/scribble-core/src/main/java/org/scribble/del/HeaderParamDeclListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/HeaderParamDeclListDel.java @@ -18,7 +18,7 @@ import org.scribble.ast.HeaderParamDecl; import org.scribble.ast.HeaderParamDeclList; import org.scribble.ast.ScribNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.wf.NameDisambiguator; public abstract class HeaderParamDeclListDel extends ScribDelBase diff --git a/scribble-core/src/main/java/org/scribble/del/InteractionSeqDel.java b/scribble-core/src/main/java/org/scribble/del/InteractionSeqDel.java index cfca6f341..f5b53bdca 100644 --- a/scribble-core/src/main/java/org/scribble/del/InteractionSeqDel.java +++ b/scribble-core/src/main/java/org/scribble/del/InteractionSeqDel.java @@ -14,7 +14,7 @@ package org.scribble.del; import org.scribble.ast.ScribNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.ProtocolDefInliner; public abstract class InteractionSeqDel extends ScribDelBase diff --git a/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java b/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java index b8c10b7ff..92985b736 100644 --- a/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java +++ b/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java @@ -21,7 +21,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GDelegationElem; import org.scribble.del.global.GDelegationElemDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.name.MessageId; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.ProtocolDefInliner; diff --git a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java b/scribble-core/src/main/java/org/scribble/del/ModuleDel.java index 7844624c8..dc1c82a63 100644 --- a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ModuleDel.java @@ -33,7 +33,7 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.local.LProtocolDecl; import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.Role; @@ -59,7 +59,11 @@ private ModuleDel copy() public void enterModuleContextBuilding(ScribNode parent, ScribNode child, ModuleContextBuilder builder) throws ScribbleException { - builder.setModuleContext(new ModuleContext(builder.job.getContext(), (Module) child)); + builder.setModuleContext(new ModuleContext( + builder.job.getContext().getParsed(), (Module) child)); + // ModuleContext building is done solely by "new ModuleContext" (no deeper visiting needed) + // The only thing ModuleContextBuilder really does is to set the ModuleContext in ModuleDel + // FIXME: obtain from MainContext instead of creating on entry by this visitor } // Maybe better to create on enter, so can be used during the context build pass (Context would need to be "cached" in the visitor to be accessed) diff --git a/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java b/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java index 1a2713722..e3e25115f 100644 --- a/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java @@ -24,7 +24,7 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.NonRoleParamNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.DataTypeKind; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.SigKind; diff --git a/scribble-core/src/main/java/org/scribble/del/NonRoleParamDeclDel.java b/scribble-core/src/main/java/org/scribble/del/NonRoleParamDeclDel.java index df710e241..51cf8b16c 100644 --- a/scribble-core/src/main/java/org/scribble/del/NonRoleParamDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/NonRoleParamDeclDel.java @@ -15,7 +15,7 @@ import org.scribble.ast.NonRoleParamDecl; import org.scribble.ast.ScribNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.wf.NameDisambiguator; public class NonRoleParamDeclDel extends ScribDelBase diff --git a/scribble-core/src/main/java/org/scribble/del/ProtocolBlockDel.java b/scribble-core/src/main/java/org/scribble/del/ProtocolBlockDel.java index 3c650e008..71ac8c3f4 100644 --- a/scribble-core/src/main/java/org/scribble/del/ProtocolBlockDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ProtocolBlockDel.java @@ -14,7 +14,7 @@ package org.scribble.del; import org.scribble.ast.ScribNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.ProtocolDefInliner; public abstract class ProtocolBlockDel extends CompoundInteractionDel diff --git a/scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java index bbaf4cf48..3403240e0 100644 --- a/scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java @@ -19,7 +19,7 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.context.ProtocolDeclContext; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.SubprotocolSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; diff --git a/scribble-core/src/main/java/org/scribble/del/ProtocolDefDel.java b/scribble-core/src/main/java/org/scribble/del/ProtocolDefDel.java index 487fc8032..eb52c5412 100644 --- a/scribble-core/src/main/java/org/scribble/del/ProtocolDefDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ProtocolDefDel.java @@ -15,7 +15,7 @@ import org.scribble.ast.ProtocolDef; import org.scribble.ast.ScribNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.RecRemover; diff --git a/scribble-core/src/main/java/org/scribble/del/RecursionDel.java b/scribble-core/src/main/java/org/scribble/del/RecursionDel.java index 94972d55c..7cff47696 100644 --- a/scribble-core/src/main/java/org/scribble/del/RecursionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/RecursionDel.java @@ -15,7 +15,7 @@ import org.scribble.ast.Recursion; import org.scribble.ast.ScribNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.name.RecVar; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.ProtocolDefInliner; diff --git a/scribble-core/src/main/java/org/scribble/del/RoleArgListDel.java b/scribble-core/src/main/java/org/scribble/del/RoleArgListDel.java index 3187e3bd9..eaa88270a 100644 --- a/scribble-core/src/main/java/org/scribble/del/RoleArgListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/RoleArgListDel.java @@ -19,7 +19,7 @@ import org.scribble.ast.RoleArgList; import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScribNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.name.Role; import org.scribble.visit.wf.NameDisambiguator; diff --git a/scribble-core/src/main/java/org/scribble/del/RoleDeclDel.java b/scribble-core/src/main/java/org/scribble/del/RoleDeclDel.java index 76aff676f..c95af33f7 100644 --- a/scribble-core/src/main/java/org/scribble/del/RoleDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/RoleDeclDel.java @@ -15,7 +15,7 @@ import org.scribble.ast.RoleDecl; import org.scribble.ast.ScribNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.name.Role; import org.scribble.visit.wf.NameDisambiguator; import org.scribble.visit.wf.WFChoiceChecker; diff --git a/scribble-core/src/main/java/org/scribble/del/ScribDel.java b/scribble-core/src/main/java/org/scribble/del/ScribDel.java index 168c69de8..525a39f22 100644 --- a/scribble-core/src/main/java/org/scribble/del/ScribDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ScribDel.java @@ -14,9 +14,10 @@ package org.scribble.del; import org.scribble.ast.ScribNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.ProtocolDefInliner; +import org.scribble.visit.SimpleVisitor; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ModuleContextBuilder; import org.scribble.visit.context.ProjectedChoiceDoPruner; diff --git a/scribble-core/src/main/java/org/scribble/del/SimpleInteractionNodeDel.java b/scribble-core/src/main/java/org/scribble/del/SimpleInteractionNodeDel.java index 07922660a..f5fd71adb 100644 --- a/scribble-core/src/main/java/org/scribble/del/SimpleInteractionNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/SimpleInteractionNodeDel.java @@ -14,7 +14,7 @@ package org.scribble.del; import org.scribble.ast.ScribNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.ProtocolDefInliner; public abstract class SimpleInteractionNodeDel extends ScribDelBase implements InteractionNodeDel diff --git a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java index 530eb51e8..384207b8a 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -25,8 +25,8 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ChoiceDel; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; +import org.scribble.job.RuntimeScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; import org.scribble.visit.ProtocolDefInliner; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java index 6c8726b43..c4f5838c8 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java @@ -19,7 +19,7 @@ import org.scribble.ast.local.LNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ConnectionActionDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Message; import org.scribble.type.name.Role; import org.scribble.visit.context.Projector; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java b/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java index 1debba0c0..707a914d3 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java @@ -18,7 +18,7 @@ import org.scribble.ast.local.LContinue; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.ContinueDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.env.InlineProtocolEnv; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDel.java index fcd8e6204..07a3affd5 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDel.java @@ -14,20 +14,17 @@ package org.scribble.del.global; import org.scribble.ast.ScribNode; -import org.scribble.lang.SessTypeTranslator; -import org.scribble.main.ScribbleException; +import org.scribble.del.ScribDel; +import org.scribble.job.ScribbleException; +import org.scribble.lang.global.GType; +import org.scribble.lang.global.GTypeTranslator; -public interface GDel +public interface GDel extends ScribDel { - default void enterSessTypeTranslation(ScribNode parent, ScribNode child, - SessTypeTranslator t) + // FIXME: remove default + default GType translate(ScribNode n, GTypeTranslator t) + throws ScribbleException { - - } - - default ScribNode leaveSessTypeTranslation(ScribNode parent, ScribNode child, - SessTypeTranslator t, ScribNode visited) throws ScribbleException - { - return visited; + throw new RuntimeException("TODO: " + n); } } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java index d48a677d4..b4c277505 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -27,7 +27,7 @@ import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDelBase; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.ProtocolName; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java index d6332eb9a..298c53b13 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java @@ -18,7 +18,7 @@ import org.scribble.ast.local.LNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ConnectionActionDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.name.Role; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java index dca95a375..0109077ce 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java @@ -25,7 +25,7 @@ import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.DoDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.SubprotocolSig; import org.scribble.type.kind.RecVarKind; import org.scribble.type.name.GProtocolName; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GInteractionNodeDel.java b/scribble-core/src/main/java/org/scribble/del/global/GInteractionNodeDel.java index 5bad89bd7..6d8c60740 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GInteractionNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GInteractionNodeDel.java @@ -16,10 +16,10 @@ import org.scribble.ast.ScribNode; import org.scribble.del.InteractionNodeDel; import org.scribble.del.ScribDelBase; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.context.Projector; -public interface GInteractionNodeDel extends InteractionNodeDel +public interface GInteractionNodeDel extends InteractionNodeDel, GDel { //public abstract LNode project(GNode n, Role self); // Generalised return, e.g. returning a seq diff --git a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java b/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java index 05aaef1e3..995514384 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java @@ -27,15 +27,32 @@ import org.scribble.ast.local.LNode; import org.scribble.del.InteractionSeqDel; import org.scribble.del.ScribDelBase; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; +import org.scribble.lang.global.GSeq; +import org.scribble.lang.global.GType; +import org.scribble.lang.global.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.context.RecRemover; import org.scribble.visit.context.env.ProjectionEnv; import org.scribble.visit.env.InlineProtocolEnv; -public class GInteractionSeqDel extends InteractionSeqDel +public class GInteractionSeqDel extends InteractionSeqDel implements GDel { + + @Override + public GSeq translate(ScribNode n, GTypeTranslator t) + throws ScribbleException + { + GInteractionSeq source = (GInteractionSeq) n; + List elems = new LinkedList<>(); + for (GInteractionNode c : source.getInteractNodeChildren()) + { + elems.add(c.visitWith(t)); // throws ScribbleException + } + return new GSeq(source, elems); + } + // enter in super @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, diff --git a/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java index fcbab60e8..772364344 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -18,8 +18,10 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GMessageTransfer; import org.scribble.ast.local.LNode; +import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.MessageTransferDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; +import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.Message; import org.scribble.type.name.Role; import org.scribble.visit.context.Projector; @@ -34,6 +36,22 @@ public GMessageTransferDel() { } + + @Override + public org.scribble.lang.global.GMessageTransfer translate(ScribNode n, + GTypeTranslator t) throws ScribbleException + { + GMessageTransfer source = (GMessageTransfer) n; + Role src = source.getSourceChild().toName(); + List ds = source.getDestinationChildren(); + if (ds.size() > 1) + { + throw new RuntimeException("TODO: multiple destination roles: " + source); + } + Role dst = ds.get(0).toName(); + Message msg = source.getMessageNodeChild().toMessage(); + return new org.scribble.lang.global.GMessageTransfer(source, src, msg, dst); + } @Override public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java index 3dc11a4ce..ffc68f712 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java @@ -20,7 +20,7 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.del.ProtocolBlockDel; import org.scribble.del.ScribDelBase; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.context.env.ProjectionEnv; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 5bcf29d57..f06ec8759 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -38,9 +38,12 @@ import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.del.ModuleDel; import org.scribble.del.ProtocolDeclDel; -import org.scribble.main.Job; -import org.scribble.main.JobContext; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.JobContext; +import org.scribble.job.ScribbleException; +import org.scribble.lang.global.GProtocol; +import org.scribble.lang.global.GSeq; +import org.scribble.lang.global.GTypeTranslator; import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; @@ -58,13 +61,24 @@ import org.scribble.visit.util.RoleCollector; import org.scribble.visit.validation.GProtocolValidator; -public class GProtocolDeclDel extends ProtocolDeclDel +public class GProtocolDeclDel extends ProtocolDeclDel implements GDel { public GProtocolDeclDel() { } + @Override + public GProtocol translate(ScribNode n, GTypeTranslator t) + throws ScribbleException + { + GProtocolDecl source = (GProtocolDecl) n; + List roles = source.getRoles(); + GSeq body = (GSeq) source.getDefChild().getBlockChild() + .getInteractSeqChild().visitWith(t); + return new GProtocol(source, roles, body); + } + @Override public GProtocolDeclContext getProtocolDeclContext() { diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java index 7409397cd..12d283860 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java @@ -28,7 +28,7 @@ import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.ProtocolDefDel; import org.scribble.del.ScribDelBase; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.SubprotocolSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.kind.RecVarKind; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java b/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java index 9ceeafa0f..7a7d1cc2e 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java @@ -20,7 +20,7 @@ import org.scribble.ast.local.LRecursion; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.RecursionDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.context.env.ProjectionEnv; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GWrapDel.java b/scribble-core/src/main/java/org/scribble/del/global/GWrapDel.java index 7047dee45..71ea2e900 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GWrapDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GWrapDel.java @@ -18,7 +18,7 @@ import org.scribble.ast.local.LNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ConnectionActionDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.name.Role; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java b/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java index 6d2402b35..ac8148b2a 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java @@ -18,7 +18,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LAccept; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java b/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java index b5ddfcbcc..b2a6f9cc9 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java @@ -23,7 +23,7 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ChoiceDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java b/scribble-core/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java index e6c263cd3..6c15adfa1 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java @@ -15,7 +15,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LCompoundInteractionNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.wf.ReachabilityChecker; import org.scribble.visit.wf.env.ReachabilityEnv; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LConnectionActionDel.java b/scribble-core/src/main/java/org/scribble/del/local/LConnectionActionDel.java index 1fcc2e7d3..1b6ae93ca 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LConnectionActionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LConnectionActionDel.java @@ -16,7 +16,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LConnectionAction; import org.scribble.del.ConnectionActionDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.wf.ExplicitCorrelationChecker; public abstract class LConnectionActionDel extends ConnectionActionDel implements LSimpleInteractionNodeDel diff --git a/scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java b/scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java index 4f6cd0d53..7bf980f81 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java @@ -23,7 +23,7 @@ import org.scribble.ast.local.LContinue; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.ContinueDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.RecVar; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LDisconnectDel.java b/scribble-core/src/main/java/org/scribble/del/local/LDisconnectDel.java index 010c4b777..1b772a24d 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LDisconnectDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LDisconnectDel.java @@ -16,7 +16,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LDisconnect; import org.scribble.del.ConnectionActionDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.name.Role; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java index 9cc60bf2a..47f1803de 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java @@ -32,8 +32,8 @@ import org.scribble.ast.local.LRecursion; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.DoDel; -import org.scribble.main.JobContext; -import org.scribble.main.ScribbleException; +import org.scribble.job.JobContext; +import org.scribble.job.ScribbleException; import org.scribble.type.SubprotocolSig; import org.scribble.type.kind.RecVarKind; import org.scribble.type.name.GProtocolName; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LInteractionNodeDel.java b/scribble-core/src/main/java/org/scribble/del/local/LInteractionNodeDel.java index ee5b965ba..d3f13b463 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LInteractionNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LInteractionNodeDel.java @@ -17,7 +17,7 @@ import org.scribble.ast.local.LInteractionNode; import org.scribble.del.InteractionNodeDel; import org.scribble.del.ScribDelBase; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.wf.ReachabilityChecker; public interface LInteractionNodeDel extends InteractionNodeDel diff --git a/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java b/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java index 969212cf3..6029efb3b 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java @@ -26,7 +26,7 @@ import org.scribble.ast.local.LRecursion; import org.scribble.del.InteractionSeqDel; import org.scribble.del.ScribDelBase; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.type.kind.Local; import org.scribble.visit.ProtocolDefInliner; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LMessageTransferDel.java b/scribble-core/src/main/java/org/scribble/del/local/LMessageTransferDel.java index ad26def9f..446a9cb6d 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LMessageTransferDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LMessageTransferDel.java @@ -16,7 +16,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LMessageTransfer; import org.scribble.del.MessageTransferDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.wf.ExplicitCorrelationChecker; public abstract class LMessageTransferDel extends MessageTransferDel implements LSimpleInteractionNodeDel diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java b/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java index 5ce04f3b5..3f971f385 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java @@ -22,7 +22,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LProtocolDecl; import org.scribble.ast.local.LProtocolHeader; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedRoleDeclFixer; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProtocolBlockDel.java b/scribble-core/src/main/java/org/scribble/del/local/LProtocolBlockDel.java index fcea2e671..bf064373b 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LProtocolBlockDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LProtocolBlockDel.java @@ -18,7 +18,7 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.del.ProtocolBlockDel; import org.scribble.del.ScribDelBase; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.env.InlineProtocolEnv; import org.scribble.visit.wf.ReachabilityChecker; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/local/LProtocolDeclDel.java index d619c4553..8d2863146 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LProtocolDeclDel.java @@ -19,7 +19,7 @@ import org.scribble.ast.context.local.LProtocolDeclContext; import org.scribble.ast.local.LProtocolDecl; import org.scribble.del.ProtocolDeclDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.Local; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.ProtocolName; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java b/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java index ebffa2bf7..22033a350 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java @@ -26,7 +26,7 @@ import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.ProtocolDefDel; import org.scribble.del.ScribDelBase; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.SubprotocolSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.kind.RecVarKind; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java b/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java index 5ace953db..9421eebb9 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java @@ -17,7 +17,7 @@ import org.scribble.ast.MessageSigNode; import org.scribble.ast.ScribNode; import org.scribble.ast.local.LReceive; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LRecursionDel.java b/scribble-core/src/main/java/org/scribble/del/local/LRecursionDel.java index 8790437dd..661e60683 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LRecursionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LRecursionDel.java @@ -19,7 +19,7 @@ import org.scribble.ast.local.LRecursion; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.RecursionDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.name.RecVar; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.EGraphBuilder; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java b/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java index 95b99e49d..0d9863f8c 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java @@ -18,7 +18,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LRequest; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java b/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java index 18b6ce1c3..db6c12a93 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java @@ -21,7 +21,7 @@ import org.scribble.ast.local.LMessageTransfer; import org.scribble.ast.local.LSend; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LWrapClientDel.java b/scribble-core/src/main/java/org/scribble/del/local/LWrapClientDel.java index 69a5d5dd4..1f34df136 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LWrapClientDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LWrapClientDel.java @@ -17,7 +17,7 @@ import org.scribble.ast.local.LWrapClient; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ConnectionActionDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.name.Role; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LWrapServerDel.java b/scribble-core/src/main/java/org/scribble/del/local/LWrapServerDel.java index 9ea78dd35..998f84d48 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LWrapServerDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LWrapServerDel.java @@ -16,7 +16,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LWrapServer; import org.scribble.del.ConnectionActionDel; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.name.Role; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-core/src/main/java/org/scribble/del/name/AmbigNameNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/AmbigNameNodeDel.java index 1524b2a1f..9647a5f52 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/AmbigNameNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/AmbigNameNodeDel.java @@ -19,7 +19,7 @@ import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.del.ScribDelBase; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.DataTypeKind; import org.scribble.type.kind.SigKind; import org.scribble.type.name.AmbigName; diff --git a/scribble-core/src/main/java/org/scribble/del/name/DataTypeNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/DataTypeNodeDel.java index fdbcfd783..2e28946cf 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/DataTypeNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/DataTypeNodeDel.java @@ -18,7 +18,7 @@ import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.del.ScribDelBase; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.DataTypeKind; import org.scribble.type.name.DataType; import org.scribble.visit.wf.NameDisambiguator; diff --git a/scribble-core/src/main/java/org/scribble/del/name/MessageSigNameNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/MessageSigNameNodeDel.java index c6311c825..3b8350631 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/MessageSigNameNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/MessageSigNameNodeDel.java @@ -18,7 +18,7 @@ import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.del.ScribDelBase; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.SigKind; import org.scribble.type.name.MessageSigName; import org.scribble.visit.wf.NameDisambiguator; diff --git a/scribble-core/src/main/java/org/scribble/del/name/RecVarNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/RecVarNodeDel.java index 383eeb27c..a89b5b315 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/RecVarNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/RecVarNodeDel.java @@ -16,7 +16,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.ScribDelBase; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.RecVarKind; import org.scribble.type.name.RecVar; import org.scribble.visit.ProtocolDefInliner; diff --git a/scribble-core/src/main/java/org/scribble/del/name/RoleNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/RoleNodeDel.java index de064d082..2ba72c753 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/RoleNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/RoleNodeDel.java @@ -16,7 +16,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDelBase; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.visit.wf.NameDisambiguator; public class RoleNodeDel extends ScribDelBase diff --git a/scribble-core/src/main/java/org/scribble/main/AntlrSourceException.java b/scribble-core/src/main/java/org/scribble/job/AntlrSourceException.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/main/AntlrSourceException.java rename to scribble-core/src/main/java/org/scribble/job/AntlrSourceException.java index 12c8f3599..eb127b415 100644 --- a/scribble-core/src/main/java/org/scribble/main/AntlrSourceException.java +++ b/scribble-core/src/main/java/org/scribble/job/AntlrSourceException.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.main; +package org.scribble.job; import java.util.stream.Collectors; import java.util.stream.IntStream; diff --git a/scribble-core/src/main/java/org/scribble/main/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/main/Job.java rename to scribble-core/src/main/java/org/scribble/job/Job.java index 98b8a31c7..be9491e76 100644 --- a/scribble-core/src/main/java/org/scribble/main/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.main; +package org.scribble.job; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; @@ -52,8 +52,8 @@ // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models public class Job { - // FIXME: verbose/debug printing parameter: should be in MainContext, but currently cannot access that class directly from here - // TODO: simply keep a reference to MainContext instead? + // FIXME: verbose/debug printing parameter + // These are duplicated from MainContext, because cannot access that class directly from here //public final boolean jUnit; public final boolean debug; public final boolean useOldWf; diff --git a/scribble-core/src/main/java/org/scribble/main/JobContext.java b/scribble-core/src/main/java/org/scribble/job/JobContext.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/main/JobContext.java rename to scribble-core/src/main/java/org/scribble/job/JobContext.java index 64aa713aa..d67aca2ba 100644 --- a/scribble-core/src/main/java/org/scribble/main/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/job/JobContext.java @@ -11,9 +11,10 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.main; +package org.scribble.job; import java.io.File; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -39,11 +40,13 @@ public class JobContext { private final Job job; - public final ModuleName main; + public final ModuleName main; // The "main" root module from MainContext + // Modules that were originally parsed (obtained from MainContext), but may be modified during the Job // ModuleName keys are full module names -- currently the modules read from file, distinguished from the generated projection modules private final Map parsed;// = new HashMap<>(); + // Projected (i.e., created) modules // LProtocolName is the full local protocol name (module name is the prefix) private final Map projected = new HashMap<>(); @@ -88,7 +91,7 @@ public Set getParsedFullModuleNames() public Set getProjectedFullModuleNames() { - return this.projected.keySet().stream().map((lpn) -> lpn.getPrefix()).collect(Collectors.toSet()); + return this.projected.keySet().stream().map(lpn -> lpn.getPrefix()).collect(Collectors.toSet()); } /*public boolean hasModule(ModuleName fullname) @@ -331,4 +334,10 @@ private static String runAut(String fsm, String aut) throws ScribbleException tmp.delete(); } } + + // HACK + public Map getParsed() + { + return Collections.unmodifiableMap(this.parsed); + } } diff --git a/scribble-core/src/main/java/org/scribble/main/RuntimeScribbleException.java b/scribble-core/src/main/java/org/scribble/job/RuntimeScribbleException.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/main/RuntimeScribbleException.java rename to scribble-core/src/main/java/org/scribble/job/RuntimeScribbleException.java index 22d09f88a..e91d533f6 100644 --- a/scribble-core/src/main/java/org/scribble/main/RuntimeScribbleException.java +++ b/scribble-core/src/main/java/org/scribble/job/RuntimeScribbleException.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.main; +package org.scribble.job; public class RuntimeScribbleException extends RuntimeException { diff --git a/scribble-core/src/main/java/org/scribble/main/ScribbleException.java b/scribble-core/src/main/java/org/scribble/job/ScribbleException.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/main/ScribbleException.java rename to scribble-core/src/main/java/org/scribble/job/ScribbleException.java index b231ba9e0..63c0369bd 100644 --- a/scribble-core/src/main/java/org/scribble/main/ScribbleException.java +++ b/scribble-core/src/main/java/org/scribble/job/ScribbleException.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.main; +package org.scribble.job; import org.antlr.runtime.tree.CommonTree; diff --git a/scribble-core/src/main/java/org/scribble/main/Todo.java b/scribble-core/src/main/java/org/scribble/job/Todo.java similarity index 99% rename from scribble-core/src/main/java/org/scribble/main/Todo.java rename to scribble-core/src/main/java/org/scribble/job/Todo.java index 55a875979..64ece6396 100644 --- a/scribble-core/src/main/java/org/scribble/main/Todo.java +++ b/scribble-core/src/main/java/org/scribble/job/Todo.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.main; +package org.scribble.job; // FIXME: project modifiers? diff --git a/scribble-core/src/main/java/org/scribble/lang/Choice.java b/scribble-core/src/main/java/org/scribble/lang/Choice.java index aedeb664a..1bbe75831 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Choice.java +++ b/scribble-core/src/main/java/org/scribble/lang/Choice.java @@ -6,14 +6,17 @@ import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.Role; -public abstract class Choice implements SessType +public abstract class Choice extends SessTypeBase + implements SessType { public final Role subj; public final List> blocks; // Pre: size > 0 // CHECKME: rename? - public Choice(Role subj, List> blocks) + public Choice(org.scribble.ast.Choice source, Role subj, + List> blocks) { + super(source); this.subj = subj; this.blocks = Collections.unmodifiableList(blocks); } @@ -22,6 +25,7 @@ public Choice(Role subj, List> blocks) public int hashCode() { int hash = 1487; + hash = 31 * hash + super.hashCode(); hash = 31 * hash + this.subj.hashCode(); hash = 31 * hash + this.blocks.hashCode(); return hash; @@ -39,7 +43,7 @@ public boolean equals(Object o) return false; } Choice them = (Choice) o; - return them.canEquals(this) && this.subj.equals(them.subj) - && this.blocks.equals(them.blocks); + return super.equals(this) // Does canEquals + && this.subj.equals(them.subj) && this.blocks.equals(them.blocks); } } diff --git a/scribble-core/src/main/java/org/scribble/lang/Do.java b/scribble-core/src/main/java/org/scribble/lang/Do.java index fb42f7a31..d6175214b 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Do.java +++ b/scribble-core/src/main/java/org/scribble/lang/Do.java @@ -6,13 +6,15 @@ import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.Role; -public abstract class Do implements SessType +public abstract class Do extends SessTypeBase + implements SessType { public final List roles; // Ordered role args; pre: size > 1 //public final List args; // CHECKME - public Do(List roles) + public Do(org.scribble.ast.Do source, List roles) { + super(source); this.roles = Collections.unmodifiableList(roles); } @@ -20,6 +22,7 @@ public Do(List roles) public int hashCode() { int hash = 193; + hash = 31 * hash + super.hashCode(); hash = 31 * hash + this.roles.hashCode(); return hash; } @@ -36,6 +39,7 @@ public boolean equals(Object o) return false; } Do them = (Do) o; - return them.canEquals(this) && this.roles.equals(them.roles); + return super.equals(this) // Does canEquals + && this.roles.equals(them.roles); } } diff --git a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java index 7b1ad5599..c790ac54e 100644 --- a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java @@ -5,14 +5,16 @@ import org.scribble.type.name.Role; public abstract class MessageTransfer - implements SessType + extends SessTypeBase implements SessType { public final Role src; public final Message msg; public final Role dst; - public MessageTransfer(Role src, Message msg, Role dst) + public MessageTransfer(org.scribble.ast.MessageTransfer source, Role src, + Message msg, Role dst) { + super(source); this.src = src; this.msg = msg; this.dst = dst; @@ -22,6 +24,7 @@ public MessageTransfer(Role src, Message msg, Role dst) public int hashCode() { int hash = 17; + hash = 31 * hash + super.hashCode(); hash = 31 * hash + this.src.hashCode(); hash = 31 * hash + this.msg.hashCode(); hash = 31 * hash + this.dst.hashCode(); @@ -40,7 +43,8 @@ public boolean equals(Object o) return false; } MessageTransfer them = (MessageTransfer) o; - return them.canEquals(this) && this.src.equals(them.src) - && this.msg.equals(them.msg) && this.dst.equals(them.dst); + return super.equals(this) // Does canEquals + && this.src.equals(them.src) && this.msg.equals(them.msg) + && this.dst.equals(them.dst); } } diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index 374360a80..fb574712b 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -3,18 +3,21 @@ import java.util.Collections; import java.util.List; +import org.scribble.ast.ProtocolDecl; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.Role; -public abstract class Protocol implements SessType +public abstract class Protocol extends SessTypeBase + implements SessType { public final List roles; // Ordered role params; pre: size >= 2 //public final List> params; // CHECKME public final Seq body; - public Protocol(List roles, //List params, + public Protocol(ProtocolDecl source, List roles, //List params, Seq body) { + super(source); this.roles = Collections.unmodifiableList(roles); this.body = body; } @@ -23,6 +26,7 @@ public Protocol(List roles, //List params, public int hashCode() { int hash = 7; + hash = 31 * hash + super.hashCode(); hash = 31 * hash + this.roles.hashCode(); hash = 31 * hash + this.body.hashCode(); return hash; @@ -40,8 +44,8 @@ public boolean equals(Object o) return false; } Protocol them = (Protocol) o; - return them.canEquals(this) && this.roles.equals(them.roles) - && this.body.equals(them.body); + return super.equals(this) // Does canEquals + && this.roles.equals(them.roles) && this.body.equals(them.body); } } diff --git a/scribble-core/src/main/java/org/scribble/lang/Seq.java b/scribble-core/src/main/java/org/scribble/lang/Seq.java index f3124bbc5..1f86df23c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Seq.java +++ b/scribble-core/src/main/java/org/scribble/lang/Seq.java @@ -3,14 +3,17 @@ import java.util.Collections; import java.util.List; +import org.scribble.ast.InteractionSeq; import org.scribble.type.kind.ProtocolKind; -public abstract class Seq implements SessType +public abstract class Seq extends SessTypeBase + implements SessType { public final List> elems; - public Seq(List> elems) + public Seq(InteractionSeq source, List> elems) { + super(source); this.elems = Collections.unmodifiableList(elems); } @@ -18,22 +21,24 @@ public Seq(List> elems) public int hashCode() { int hash = 1483; + hash = 31 * hash + super.hashCode(); hash = 31 * hash + this.elems.hashCode(); return hash; } @Override - public boolean equals(Object obj) + public boolean equals(Object o) { - if (this == obj) + if (this == o) { return true; } - if (!(obj instanceof Seq)) + if (!(o instanceof Seq)) { return false; } - Seq them = (Seq) obj; - return them.canEquals(this) && this.elems.equals(them.elems); + Seq them = (Seq) o; + return super.equals(this) // Does canEquals + && this.elems.equals(them.elems); } } diff --git a/scribble-core/src/main/java/org/scribble/lang/SessType.java b/scribble-core/src/main/java/org/scribble/lang/SessType.java index 590280d16..d25147d8d 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SessType.java +++ b/scribble-core/src/main/java/org/scribble/lang/SessType.java @@ -1,11 +1,15 @@ package org.scribble.lang; +import org.scribble.ast.ScribNodeBase; import org.scribble.type.kind.ProtocolKind; // CHECKME: move to type.sess? // Generic works to "specialise" G/L subclasses (and works with immutable pattern) -- cf. not supported by contravariant method parameter subtyping for getters/setters public interface SessType { + boolean hasSource(); // i.e., was parsed + ScribNodeBase getSource(); // Pre: hasSource + // Call this using: them.canEquals(this) boolean canEquals(Object o); } diff --git a/scribble-core/src/main/java/org/scribble/lang/SessTypeBase.java b/scribble-core/src/main/java/org/scribble/lang/SessTypeBase.java new file mode 100644 index 000000000..812b9c4d6 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/SessTypeBase.java @@ -0,0 +1,52 @@ +package org.scribble.lang; + +import org.scribble.ast.ScribNodeBase; +import org.scribble.type.kind.ProtocolKind; + +// SessTypeBase is to SessType as ScribNodeBase is to ScribNode +public abstract class SessTypeBase implements SessType +{ + private final ScribNodeBase source; + + public SessTypeBase(ScribNodeBase source) + { + this.source = source; + } + + @Override + public boolean hasSource() + { + return this.source != null; + } + + // Pre: hasSource + @Override + public ScribNodeBase getSource() + { + return this.source; + } + + // Does *not* include this.source -- equals/hashCode is for "surface-level" syntactic equality of SessType only + @Override + public int hashCode() + { + int hash = 1871; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof SessTypeBase)) + { + return false; + } + SessTypeBase them = (SessTypeBase) o; + return them.canEquals(this); + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/SessTypeTranslator.java b/scribble-core/src/main/java/org/scribble/lang/SessTypeTranslator.java deleted file mode 100644 index 04dcb1785..000000000 --- a/scribble-core/src/main/java/org/scribble/lang/SessTypeTranslator.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.scribble.lang; - -import org.scribble.ast.global.GProtocolDecl; -import org.scribble.del.global.GDel; -import org.scribble.lang.global.GType; - -public class SessTypeTranslator -{ - public SessTypeTranslator() - { - - } - - public GType translate(GProtocolDecl gpd) - { - GDel del = (GDel) gpd.del(); - - return - } -} diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java index e9f91841b..4f0ff2086 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -8,9 +8,10 @@ public class GChoice extends Choice implements GType { - public GChoice(Role subj, List blocks) + public GChoice(org.scribble.ast.global.GChoice source, Role subj, + List blocks) { - super(subj, blocks); + super(source, subj, blocks); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index fe1f74c30..440d0e98c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -8,9 +8,9 @@ public class GDo extends Do implements GType { - public GDo(List roles) + public GDo(org.scribble.ast.global.GDo source, List roles) { - super(roles); + super(source, roles); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java index 98e07edfd..def9a011f 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java @@ -9,9 +9,10 @@ public class GMessageTransfer extends MessageTransfer implements GType { - public GMessageTransfer(Role src, Message msg, Role dst) + public GMessageTransfer(org.scribble.ast.global.GMessageTransfer source, + Role src, Message msg, Role dst) { - super(src, msg, dst); + super(source, src, msg, dst); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index 76ffdbb13..62e6c2db5 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -2,16 +2,17 @@ import java.util.List; +import org.scribble.ast.global.GProtocolDecl; import org.scribble.lang.Protocol; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; public class GProtocol extends Protocol implements GType { - public GProtocol(List roles, //List params, + public GProtocol(GProtocolDecl source, List roles, //List params, GSeq body) { - super(roles, body); + super(source, roles, body); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java index 5bd1b7e5b..9f027dfca 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -2,14 +2,16 @@ import java.util.List; +import org.scribble.ast.global.GInteractionSeq; import org.scribble.lang.Seq; import org.scribble.type.kind.Global; public class GSeq extends Seq implements GType { - public GSeq(List elems) + // GInteractionSeq or GBlock better as source? + public GSeq(GInteractionSeq source, List elems) { - super(elems); + super(source, elems); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java b/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java new file mode 100644 index 000000000..7bbff73e4 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java @@ -0,0 +1,22 @@ +package org.scribble.lang.global; + +import org.scribble.ast.ScribNode; +import org.scribble.del.global.GDel; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; +import org.scribble.visit.SimpleVisitor; + +// CHECKME: move to visit package? +public class GTypeTranslator extends SimpleVisitor +{ + public GTypeTranslator(Job job) + { + super(job); + } + + @Override + public GType visit(ScribNode n) throws ScribbleException + { + return ((GDel) n.del()).translate(n, this); + } +} diff --git a/scribble-core/src/main/java/org/scribble/model/GraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/model/GraphBuilderUtil.java index 4915a322f..d372357ec 100644 --- a/scribble-core/src/main/java/org/scribble/model/GraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/model/GraphBuilderUtil.java @@ -13,7 +13,7 @@ */ package org.scribble.model; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; // Helper class for EndpointGraphBuilder -- can access the protected setters of S diff --git a/scribble-core/src/main/java/org/scribble/model/MState.java b/scribble-core/src/main/java/org/scribble/model/MState.java index 5e602ccd9..d0f8fac34 100644 --- a/scribble-core/src/main/java/org/scribble/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/model/MState.java @@ -25,8 +25,8 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; +import org.scribble.job.RuntimeScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; public abstract class MState< diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java b/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java index b4391dc4b..31596920a 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java @@ -26,7 +26,7 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.main.Job; +import org.scribble.job.Job; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.Payload; import org.scribble.type.name.DataType; diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java index d771f8b57..2355118d7 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java @@ -24,7 +24,7 @@ import java.util.Map; import java.util.Set; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.GraphBuilderUtil; import org.scribble.model.endpoint.actions.EAction; import org.scribble.model.global.SModelFactory; diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java index 0719d45a1..9947a6aed 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java @@ -24,7 +24,7 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.model.MPrettyState; import org.scribble.model.MState; import org.scribble.model.endpoint.actions.EAction; diff --git a/scribble-core/src/main/java/org/scribble/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/model/global/SGraphBuilderUtil.java index 0d9d099c6..5fa5ad421 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/model/global/SGraphBuilderUtil.java @@ -21,8 +21,8 @@ import java.util.Map.Entry; import java.util.stream.Collectors; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.model.GraphBuilderUtil; import org.scribble.model.endpoint.EFSM; import org.scribble.model.endpoint.EGraph; diff --git a/scribble-core/src/main/java/org/scribble/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/model/global/SModel.java index 7d59aa197..964f3b49e 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/model/global/SModel.java @@ -21,8 +21,8 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EFSM; import org.scribble.model.endpoint.actions.ESend; import org.scribble.model.global.actions.SAction; diff --git a/scribble-core/src/main/java/org/scribble/util/ScribUtil.java b/scribble-core/src/main/java/org/scribble/util/ScribUtil.java index 97679b62d..5a220b256 100644 --- a/scribble-core/src/main/java/org/scribble/util/ScribUtil.java +++ b/scribble-core/src/main/java/org/scribble/util/ScribUtil.java @@ -25,8 +25,8 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.ScribNode; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; +import org.scribble.job.RuntimeScribbleException; +import org.scribble.job.ScribbleException; public class ScribUtil { diff --git a/scribble-core/src/main/java/org/scribble/visit/AstVisitor.java b/scribble-core/src/main/java/org/scribble/visit/AstVisitor.java index feba04889..972bda649 100644 --- a/scribble-core/src/main/java/org/scribble/visit/AstVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/AstVisitor.java @@ -14,8 +14,8 @@ package org.scribble.visit; import org.scribble.ast.ScribNode; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; // Pattern: node accepts visitor and calls visitor back (standard visitor pattern -- adding a new operation doesn't affect the Ast classes), but then visitor delegates back to node delegate (so routines for handling each node type not centralised in visitor, but decentralised to delegates) public abstract class AstVisitor diff --git a/scribble-core/src/main/java/org/scribble/visit/EnvVisitor.java b/scribble-core/src/main/java/org/scribble/visit/EnvVisitor.java index 02741973b..ff0a5ba4b 100644 --- a/scribble-core/src/main/java/org/scribble/visit/EnvVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/EnvVisitor.java @@ -17,8 +17,8 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.context.ModuleContextVisitor; import org.scribble.visit.env.Env; diff --git a/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java b/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java index c34e98c22..da114dd63 100644 --- a/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java @@ -30,8 +30,8 @@ import org.scribble.ast.local.LRecursion; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.ProtocolDefDel; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.RecVar; diff --git a/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java index 5dec34618..0a480ac4e 100644 --- a/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java @@ -16,8 +16,8 @@ import org.scribble.ast.ProtocolDef; import org.scribble.ast.ScribNode; import org.scribble.del.ProtocolDefDel; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.visit.env.Env; public abstract class InlinedProtocolVisitor> extends EnvVisitor diff --git a/scribble-core/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java index dd308b876..c797c4e5c 100644 --- a/scribble-core/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java @@ -14,7 +14,7 @@ package org.scribble.visit; import org.scribble.ast.ProtocolDecl; -import org.scribble.main.Job; +import org.scribble.job.Job; import org.scribble.visit.env.DummyEnv; public abstract class NoEnvInlinedProtocolVisitor extends InlinedProtocolVisitor diff --git a/scribble-core/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java index 81df0f60f..0d91ac346 100644 --- a/scribble-core/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java @@ -14,7 +14,7 @@ package org.scribble.visit; import org.scribble.ast.ProtocolDecl; -import org.scribble.main.Job; +import org.scribble.job.Job; import org.scribble.visit.env.DummyEnv; public abstract class NoEnvOffsetSubprotocolVisitor extends OffsetSubprotocolVisitor diff --git a/scribble-core/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java index d28b58294..a467004df 100644 --- a/scribble-core/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java @@ -14,7 +14,7 @@ package org.scribble.visit; import org.scribble.ast.ProtocolDecl; -import org.scribble.main.Job; +import org.scribble.job.Job; import org.scribble.visit.env.DummyEnv; public abstract class NoEnvSubprotocolVisitor extends SubprotocolVisitor diff --git a/scribble-core/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java b/scribble-core/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java index c390ac994..1c2af199e 100644 --- a/scribble-core/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java @@ -14,7 +14,7 @@ package org.scribble.visit; import org.scribble.ast.ProtocolDecl; -import org.scribble.main.Job; +import org.scribble.job.Job; import org.scribble.visit.env.DummyEnv; public abstract class NoEnvUnfoldingVisitor extends UnfoldingVisitor diff --git a/scribble-core/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java index ec3d9345e..7091dd169 100644 --- a/scribble-core/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java @@ -19,8 +19,8 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.type.Arg; import org.scribble.type.kind.NonRoleArgKind; import org.scribble.type.kind.ProtocolKind; diff --git a/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java b/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java index b0de55308..490b5e90c 100644 --- a/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java +++ b/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java @@ -26,9 +26,9 @@ import org.scribble.del.ProtocolDefDel; import org.scribble.del.global.GDoDel; import org.scribble.del.local.LDoDel; -import org.scribble.main.Job; -import org.scribble.main.JobContext; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.JobContext; +import org.scribble.job.ScribbleException; import org.scribble.type.SubprotocolSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.RecVar; diff --git a/scribble-core/src/main/java/org/scribble/visit/SimpleVisitor.java b/scribble-core/src/main/java/org/scribble/visit/SimpleVisitor.java new file mode 100644 index 000000000..b6120ee61 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/visit/SimpleVisitor.java @@ -0,0 +1,34 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.visit; + +import org.scribble.ast.ScribNode; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; + +// Apart from delegating to del-specific visiting methods, SimpleVisitors are mainly for holding data and collecting common operations +// TODO CHECKME: refactor AstVisitor as a SimpleVisitor? i.e., T=ScribNode ? +public abstract class SimpleVisitor +{ + public final Job job; + + public SimpleVisitor(Job job) + { + this.job = job; + } + + // Override to delegate to del-specific method, e.g., n.del().visit(n, this) + // N.B. ScribNode has getParent + public abstract T visit(ScribNode n) throws ScribbleException; +} diff --git a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java index 94a231cfa..8d2e8a53c 100644 --- a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java @@ -34,9 +34,9 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.Job; -import org.scribble.main.JobContext; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.JobContext; +import org.scribble.job.ScribbleException; import org.scribble.type.Arg; import org.scribble.type.SubprotocolSig; import org.scribble.type.kind.NonRoleArgKind; diff --git a/scribble-core/src/main/java/org/scribble/visit/Substitutor.java b/scribble-core/src/main/java/org/scribble/visit/Substitutor.java index b77f900ae..cb31e4b20 100644 --- a/scribble-core/src/main/java/org/scribble/visit/Substitutor.java +++ b/scribble-core/src/main/java/org/scribble/visit/Substitutor.java @@ -18,8 +18,8 @@ import org.scribble.ast.NonRoleArgNode; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.type.Arg; import org.scribble.type.kind.NonRoleArgKind; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/visit/UnfoldingVisitor.java b/scribble-core/src/main/java/org/scribble/visit/UnfoldingVisitor.java index 9093b87b1..3e94502a5 100644 --- a/scribble-core/src/main/java/org/scribble/visit/UnfoldingVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/UnfoldingVisitor.java @@ -24,8 +24,8 @@ import org.scribble.ast.ProtocolBlock; import org.scribble.ast.Recursion; import org.scribble.ast.ScribNode; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.type.name.RecVar; import org.scribble.visit.env.Env; diff --git a/scribble-core/src/main/java/org/scribble/visit/context/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/visit/context/EGraphBuilder.java index ff33c9ee3..2b64028ad 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/EGraphBuilder.java @@ -19,8 +19,8 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.del.local.LChoiceDel; import org.scribble.del.local.LInteractionSeqDel; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EGraphBuilderUtil; import org.scribble.visit.NoEnvInlinedProtocolVisitor; diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java index cb66e8d61..cd3fd8712 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java @@ -15,8 +15,8 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.context.ModuleContext; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.visit.AstVisitor; // Disambiguates ambiguous PayloadTypeOrParameter names and inserts implicit Scope names diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java index b4ede4731..1c8ba8d24 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java @@ -17,10 +17,11 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.context.ModuleContext; import org.scribble.del.ModuleDel; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.visit.AstVisitor; +// A visitor that caches the ModuleContext from an entered Module, for later access public abstract class ModuleContextVisitor extends AstVisitor { private ModuleContext mcontext; // The "root" module context (different than the front-end "main" module) // Factor up to ModelVisitor? (would be null before context building) diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java index 85a9c950c..35a17b701 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java @@ -24,9 +24,9 @@ import org.scribble.ast.local.LProtocolDecl; import org.scribble.ast.name.simple.DummyProjectionRoleNode; import org.scribble.del.ModuleDel; -import org.scribble.main.Job; -import org.scribble.main.JobContext; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.JobContext; +import org.scribble.job.ScribbleException; import org.scribble.visit.context.env.UnguardedChoiceDoEnv; // Basically infers all local choice subject candidates: if *none* are found for a given "choice-unguarded" do-call then the call is pruned (along with parent block and choice as necessary) diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java index fe6ede9eb..b21c437b7 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java @@ -19,8 +19,8 @@ import java.util.Map; import org.scribble.ast.ScribNode; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java index 39ccb81d8..8bb363e4f 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java @@ -14,8 +14,8 @@ package org.scribble.visit.context; import org.scribble.ast.ScribNode; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; public class ProjectedRoleDeclFixer extends ModuleContextVisitor { diff --git a/scribble-core/src/main/java/org/scribble/visit/context/Projector.java b/scribble-core/src/main/java/org/scribble/visit/context/Projector.java index ceb597ffb..2e5952c45 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/Projector.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/Projector.java @@ -25,8 +25,8 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.Local; import org.scribble.type.kind.ModuleKind; import org.scribble.type.kind.ProtocolKind; diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java b/scribble-core/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java index 858d863be..f7f7d7b1d 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java @@ -16,8 +16,8 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.context.global.GDependencyMap; import org.scribble.ast.context.local.LDependencyMap; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/visit/context/RecRemover.java b/scribble-core/src/main/java/org/scribble/visit/context/RecRemover.java index f798d9744..00d29c92d 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/RecRemover.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/RecRemover.java @@ -17,8 +17,8 @@ import java.util.Set; import org.scribble.ast.ScribNode; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.type.name.RecVar; import org.scribble.visit.NoEnvInlinedProtocolVisitor; diff --git a/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java b/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java index 544e804c7..fb452f790 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java @@ -20,8 +20,8 @@ import org.scribble.ast.local.LDo; import org.scribble.ast.local.LInteractionNode; import org.scribble.ast.local.LProtocolBlock; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.type.SubprotocolSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; diff --git a/scribble-core/src/main/java/org/scribble/visit/env/Env.java b/scribble-core/src/main/java/org/scribble/visit/env/Env.java index 9158ec7ba..e1a704fa4 100644 --- a/scribble-core/src/main/java/org/scribble/visit/env/Env.java +++ b/scribble-core/src/main/java/org/scribble/visit/env/Env.java @@ -32,7 +32,7 @@ protected Env() public abstract E enterContext(); // copy by default // FIXME: it's always just copy, so not useful -- e.g., WFChoiceEnv just does enterContext (copy) and then manually enableChoiceSubject - // Mostly for merging a compound interaction node context into the parent block context + // Mostly for merging a *compound interaction node* context into the parent *block* context // Usually used in the base compound interaction node del when leaving and restoring the parent env in the visitor env stack (e.g. CompoundInteractionNodeDel for WF-choice) // By default: merge just discards the argument(s) -- not all EnvVisitors need to merge (e.g. projection) // FIXME: maybe not "expressive" enough -- e.g. has to be "overloaded" for "horizontal composition" and "vertical parent-child" merging of contexts (e.g. path collection) @@ -43,7 +43,7 @@ protected Env mergeContext(E env) } // Can't use vargs with parameterized types - // Mostly for merging child blocks contexts into the parent compound interaction node context + // Mostly for merging child *block* contexts into the parent *compound interaction node* context // Usually used in the parent compound interaction node del to update the parent context after visting each child block before leaving (e.g. GChoiceDel for WF-choice) // FIXME: deprecate (should use "compose" first on children, then "merge" to parent) -- or make a utility composeAndMerge method protected Env mergeContexts(List envs) diff --git a/scribble-core/src/main/java/org/scribble/visit/util/MessageIdCollector.java b/scribble-core/src/main/java/org/scribble/visit/util/MessageIdCollector.java index 92f5598c4..1dad428c2 100644 --- a/scribble-core/src/main/java/org/scribble/visit/util/MessageIdCollector.java +++ b/scribble-core/src/main/java/org/scribble/visit/util/MessageIdCollector.java @@ -15,8 +15,8 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.context.ModuleContext; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.type.name.MessageId; public class MessageIdCollector extends NameCollector> diff --git a/scribble-core/src/main/java/org/scribble/visit/util/NameCollector.java b/scribble-core/src/main/java/org/scribble/visit/util/NameCollector.java index efa8aa762..43b5fe0bb 100644 --- a/scribble-core/src/main/java/org/scribble/visit/util/NameCollector.java +++ b/scribble-core/src/main/java/org/scribble/visit/util/NameCollector.java @@ -17,7 +17,7 @@ import java.util.Set; import org.scribble.ast.context.ModuleContext; -import org.scribble.main.Job; +import org.scribble.job.Job; import org.scribble.type.name.Name; import org.scribble.visit.NoEnvOffsetSubprotocolVisitor; diff --git a/scribble-core/src/main/java/org/scribble/visit/util/RecVarCollector.java b/scribble-core/src/main/java/org/scribble/visit/util/RecVarCollector.java index e1438b091..f70a18281 100644 --- a/scribble-core/src/main/java/org/scribble/visit/util/RecVarCollector.java +++ b/scribble-core/src/main/java/org/scribble/visit/util/RecVarCollector.java @@ -16,8 +16,8 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.context.ModuleContext; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.type.name.RecVar; // Collects continues (not recs) diff --git a/scribble-core/src/main/java/org/scribble/visit/util/RoleCollector.java b/scribble-core/src/main/java/org/scribble/visit/util/RoleCollector.java index 87a16bfdc..483e0471f 100644 --- a/scribble-core/src/main/java/org/scribble/visit/util/RoleCollector.java +++ b/scribble-core/src/main/java/org/scribble/visit/util/RoleCollector.java @@ -16,8 +16,8 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.context.ModuleContext; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.type.name.Role; // Second pass for ProtocolDeclContext building diff --git a/scribble-core/src/main/java/org/scribble/visit/validation/GProtocolValidator.java b/scribble-core/src/main/java/org/scribble/visit/validation/GProtocolValidator.java index 9b81d94f9..60382807c 100644 --- a/scribble-core/src/main/java/org/scribble/visit/validation/GProtocolValidator.java +++ b/scribble-core/src/main/java/org/scribble/visit/validation/GProtocolValidator.java @@ -14,8 +14,8 @@ package org.scribble.visit.validation; import org.scribble.ast.ScribNode; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.visit.context.ModuleContextVisitor; public class GProtocolValidator extends ModuleContextVisitor diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java b/scribble-core/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java index 14c76f71c..ac87ccb6b 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java @@ -18,8 +18,8 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.visit.context.ModuleContextVisitor; // Checks for recursive protocoldecl dependencies in the presence of delegations (currently, both via the delegation, and in of the protocoldelcs themselves -- FIXME over restrictive) diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java b/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java index 067f708bd..08fd4435e 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java @@ -17,8 +17,8 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/NameDisambiguator.java b/scribble-core/src/main/java/org/scribble/visit/wf/NameDisambiguator.java index ccf03a897..eea6605c1 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/NameDisambiguator.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/NameDisambiguator.java @@ -21,8 +21,8 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GDelegationElem; import org.scribble.del.global.GDelegationElemDel; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.NonRoleArgKind; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.Name; diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java b/scribble-core/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java index 5d09e5296..cf2291b53 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java @@ -18,8 +18,8 @@ import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProtocolBlock; import org.scribble.del.local.LInteractionSeqDel; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.visit.UnfoldingVisitor; import org.scribble.visit.wf.env.ReachabilityEnv; diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java b/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java index 709547605..3dbb80744 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java @@ -21,8 +21,8 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.main.Job; -import org.scribble.main.ScribbleException; +import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.UnfoldingVisitor; import org.scribble.visit.wf.env.WFChoiceEnv; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelEndpoint.java index 20035bb7b..316412d9f 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelEndpoint.java @@ -21,7 +21,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -import org.scribble.main.RuntimeScribbleException; +import org.scribble.job.RuntimeScribbleException; import org.scribble.runtime.message.ScribInterrupt; import org.scribble.runtime.message.ScribMessage; import org.scribble.runtime.session.SessionEndpoint; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/EndpointInputQueues.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/EndpointInputQueues.java index 8e540a428..7f626d378 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/EndpointInputQueues.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/EndpointInputQueues.java @@ -20,8 +20,7 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; - -import org.scribble.main.RuntimeScribbleException; +import org.scribble.job.RuntimeScribbleException; import org.scribble.runtime.message.ScribInterrupt; import org.scribble.runtime.message.ScribMessage; import org.scribble.type.name.Role; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java index 14b1e7cab..2e348304d 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java @@ -19,7 +19,7 @@ import java.util.Map; import java.util.Random; -import org.scribble.main.ScribbleException; +import org.scribble.job.ScribbleException; import org.scribble.main.ScribbleRuntimeException; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java index 48f63017b..e3f19f4ec 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java @@ -20,7 +20,7 @@ import java.util.Map; import java.util.Set; -import org.scribble.main.RuntimeScribbleException; +import org.scribble.job.RuntimeScribbleException; import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.message.ScribMessageFormatter; import org.scribble.runtime.net.BinaryChannelEndpoint; diff --git a/scribble-test/src/test/java/org/scribble/cli/ScribTestBase.java b/scribble-test/src/test/java/org/scribble/cli/ScribTestBase.java index 5d9f3aaca..d40b340be 100644 --- a/scribble-test/src/test/java/org/scribble/cli/ScribTestBase.java +++ b/scribble-test/src/test/java/org/scribble/cli/ScribTestBase.java @@ -19,8 +19,8 @@ import org.junit.Assert; import org.junit.Test; -import org.scribble.main.AntlrSourceException; -import org.scribble.main.ScribbleException; +import org.scribble.job.AntlrSourceException; +import org.scribble.job.ScribbleException; /* * Packaging following pattern of putting tests into same package but different directory as classes being tested: From 6527c14a82e34d7dd2ff3886fe9f4a2212268559 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 6 Feb 2019 20:59:22 +0000 Subject: [PATCH 091/539] Continued WIP. --- .../java/org/scribble/cli/CommandLine.java | 4 +- .../java/org/scribble/main/MainContext.java | 63 +++++++++--------- .../callbackapi/CBEndpointApiGenerator.java | 6 +- .../callbackapi/CBEndpointApiGenerator2.java | 6 +- .../callbackapi/CBEndpointApiGenerator3.java | 6 +- .../StateChannelApiGenerator.java | 14 ++-- .../ioifaces/IOInterfacesGenerator.java | 4 +- .../src/main/java/org/scribble/del/DoDel.java | 5 +- .../main/java/org/scribble/del/ModuleDel.java | 18 ++++-- .../java/org/scribble/del/RecursionDel.java | 2 +- .../main/java/org/scribble/del/ScribDel.java | 1 - .../org/scribble/del/global/GChoiceDel.java | 6 +- .../org/scribble/del/global/GConnectDel.java | 2 +- .../org/scribble/del/global/GContinueDel.java | 4 +- .../del/global/GDelegationElemDel.java | 5 +- .../scribble/del/global/GDisconnectDel.java | 31 ++++++--- .../java/org/scribble/del/global/GDoDel.java | 14 ++-- .../del/global/GInteractionSeqDel.java | 8 ++- .../del/global/GMessageTransferDel.java | 2 +- .../del/global/GProtocolBlockDel.java | 6 +- .../scribble/del/global/GProtocolDeclDel.java | 14 ++-- .../scribble/del/global/GProtocolDefDel.java | 13 ++-- .../scribble/del/global/GRecursionDel.java | 6 +- .../org/scribble/del/global/GWrapDel.java | 2 +- .../org/scribble/del/local/LAcceptDel.java | 9 ++- .../org/scribble/del/local/LChoiceDel.java | 7 +- .../org/scribble/del/local/LContinueDel.java | 2 +- .../scribble/del/local/LDisconnectDel.java | 2 +- .../java/org/scribble/del/local/LDoDel.java | 10 +-- .../del/local/LInteractionSeqDel.java | 5 +- .../del/local/LProjectionDeclDel.java | 2 +- .../scribble/del/local/LProtocolBlockDel.java | 2 +- .../scribble/del/local/LProtocolDeclDel.java | 23 +++++-- .../scribble/del/local/LProtocolDefDel.java | 11 ++-- .../org/scribble/del/local/LReceiveDel.java | 3 +- .../org/scribble/del/local/LRecursionDel.java | 6 +- .../org/scribble/del/local/LRequestDel.java | 6 +- .../java/org/scribble/del/local/LSendDel.java | 9 ++- .../scribble/del/local/LWrapClientDel.java | 2 +- .../scribble/del/local/LWrapServerDel.java | 2 +- .../scribble/del/name/AmbigNameNodeDel.java | 23 ++++--- .../scribble/del/name/DataTypeNodeDel.java | 12 ++-- .../del/name/MessageSigNameNodeDel.java | 10 ++- .../org/scribble/del/name/RecVarNodeDel.java | 15 +++-- .../src/main/java/org/scribble/job/Job.java | 63 ++++-------------- .../main/java/org/scribble/job/JobConfig.java | 64 +++++++++++++++++++ .../java/org/scribble/job/JobContext.java | 12 ++-- .../scribble/model/endpoint/AutParser.java | 2 +- .../model/global/SGraphBuilderUtil.java | 29 ++++++--- .../org/scribble/model/global/SModel.java | 61 ++++++++++++------ .../context/ProjectedChoiceDoPruner.java | 5 +- .../scribble/visit/wf/WFChoiceChecker.java | 2 +- .../parser/scribble/AntlrToScribParser.java | 25 -------- 53 files changed, 389 insertions(+), 277 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/job/JobConfig.java diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index f2e88ae99..b78e71064 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -236,7 +236,7 @@ protected void tryOutputTasks(Job job) || this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH) || this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH_PNG)) { - if (job.useOldWf) + if (job.config.useOldWf) { throw new CommandLineException( "Global model flag(s) incompatible with: " @@ -578,7 +578,7 @@ protected static GProtocolName checkGlobalProtocolArg(JobContext jcontext, throw new CommandLineException( "Invalid aux protocol specified as root: " + simpname); } - return new GProtocolName(jcontext.main, simpgpn); + return new GProtocolName(jcontext.job.config.main, simpgpn); // TODO: take Job param instead of Jobcontext } protected static Role checkRoleArg(JobContext jcontext, diff --git a/scribble-cli/src/main/java/org/scribble/main/MainContext.java b/scribble-cli/src/main/java/org/scribble/main/MainContext.java index 1d1ff425b..f482587dd 100644 --- a/scribble-cli/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-cli/src/main/java/org/scribble/main/MainContext.java @@ -31,6 +31,7 @@ import org.scribble.ast.Module; import org.scribble.ast.context.ModuleContext; import org.scribble.job.Job; +import org.scribble.job.JobConfig; import org.scribble.job.ScribbleException; import org.scribble.main.resource.DirectoryResourceLocator; import org.scribble.main.resource.InlineResource; @@ -61,21 +62,11 @@ public class MainContext //protected final JScribbleApiGen jgen; // No: API gen depends on the Job //public final boolean jUnit; - public final boolean debug; // TODO: factor out with Job -- (cf. CommandLine.newMainContext) - public final boolean useOldWF; - public final boolean noLiveness; - public final boolean minEfsm; - public final boolean fair; - public final boolean noLocalChoiceSubjectCheck; - public final boolean noAcceptCorrelationCheck; - public final boolean noValidation; - public final boolean spin; + private JobConfig config; private final ResourceLocator locator; // Path -> Resource private final ScribModuleLoader loader; // sesstype.ModuleName -> Pair - protected ModuleName main; // Full name - protected Map mctxts; // Full names (like this.parsed) // ModuleName keys are full module names -- parsed are the modules read from file, distinguished from the generated projection modules @@ -89,17 +80,6 @@ private MainContext(boolean debug, ResourceLocator locator, boolean useOldWF, boolean noValidation, boolean spin) throws ScribParserException, ScribbleException { - //this.jUnit = jUnit; - this.debug = debug; - this.useOldWF = useOldWF; - this.noLiveness = noLiveness; - this.minEfsm = minEfsm; - this.fair = fair; - this.noLocalChoiceSubjectCheck = noLocalChoiceSubjectCheck; - this.noAcceptCorrelationCheck = noAcceptCorrelationCheck; - this.noValidation = noValidation; - this.spin = spin; - this.locator = locator; this.loader = new ScribModuleLoader(this.locator, this.antlrParser, this.scribParser); @@ -136,9 +116,14 @@ public MainContext(boolean debug, ResourceLocator locator, Path mainpath, //HERE: debug context building or name disamb (role node child lost) - checkMainModuleName(mainpath, mod); + checkMainModuleName(mainpath, mod, noValidation); - init(res, mod); + init( + debug, locator, useOldWF, + noLiveness, minEfsm, fair, + noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, + noValidation, spin, + res, mod); } // For inline module arg @@ -156,16 +141,31 @@ public MainContext(boolean debug, ResourceLocator locator, String inline, Module mod = (Module) this.scribParser .parse(this.antlrParser.parseAntlrTree(res), this.af); - init(res, mod); + init( + debug, locator, useOldWF, + noLiveness, minEfsm, fair, + noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, + noValidation, spin, + res, mod); } - private void init(Resource res, Module mainmod) + private void init( + boolean debug, ResourceLocator locator, + boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, + boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, + boolean noValidation, boolean spin, + + Resource res, Module mainmod) throws ScribParserException, ScribbleException { + Pair p = new Pair<>(res, mainmod); - this.main = p.right.getFullModuleName(); + ModuleName main = p.right.getFullModuleName(); // TODO CHECKME: main modname comes from the inlined moddecl -- check for issues if this clashes with an existing file system resource loadAllModules(p); // Populates this.parsed + + + this.config = new JobConfig(debug, main, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin, this.af, this.ef, this.sf); Map tmp = this.parsed.entrySet().stream() .collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue().right)); @@ -181,10 +181,7 @@ private void init(Resource res, Module mainmod) // A Scribble extension should override these "new" methods as appropriate. public Job newJob() { - return new Job(this.debug, this.getParsedModules(), this.main, - this.useOldWF, this.noLiveness, this.minEfsm, this.fair, - this.noLocalChoiceSubjectCheck, this.noAcceptCorrelationCheck, - this.noValidation, this.spin, this.af, this.ef, this.sf); + return new Job(this.getParsedModules(), this.config); } protected ScribbleAntlrWrapper newAntlrParser() @@ -238,7 +235,7 @@ public Map getParsedModules() } // Hacky? But not Scribble tool's job to check nested directory location of module fully corresponds to the fullname of module? Cf. Java classes - private void checkMainModuleName(Path mainpath, Module main) + private void checkMainModuleName(Path mainpath, Module main, boolean noValidation) throws ScribbleException { String path = mainpath.toString(); // FIXME: hack @@ -246,7 +243,7 @@ private void checkMainModuleName(Path mainpath, Module main) String tmp = path.substring((path.lastIndexOf(File.separator) == -1) ? 0 : path.lastIndexOf(File.separator) + 1, path.lastIndexOf('.')); - if (!this.noValidation) + if (!noValidation) // this.config not made yet { if (!tmp.equals(main.getFullModuleName().getSimpleName().toString())) // ModuleName.toString hack? diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index d1414e8f9..971f525be 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -67,7 +67,11 @@ public Map buildSessionApi() throws ScribbleException // FIXME: public Map buildEndpointClass() throws ScribbleException { JobContext jc = this.job.getContext(); - EState init = (this.job.minEfsm ? jc.getMinimisedEGraph(this.proto, this.self) : jc.getEGraph(this.proto, this.self)).init; // FIXME: factor out with StateChannelApiGenerator constructor + EState init = (this.job.config.minEfsm + ? jc.getMinimisedEGraph(this.proto, this.self) + : jc.getEGraph(this.proto, this.self) + ).init; + // TODO: factor out with StateChannelApiGenerator constructor Set states = new HashSet<>(); states.add(init); states.addAll(MState.getReachableStates(init)); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java index 008d12f31..24f5e5f9b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java @@ -93,7 +93,11 @@ public Map buildEndpointClass() throws ScribbleException Map res = new HashMap<>(); JobContext jc = this.job.getContext(); - EState init = (this.job.minEfsm ? jc.getMinimisedEGraph(this.proto, this.self) : jc.getEGraph(this.proto, this.self)).init; // FIXME: factor out with StateChannelApiGenerator constructor + EState init = (this.job.config.minEfsm + ? jc.getMinimisedEGraph(this.proto, this.self) + : jc.getEGraph(this.proto, this.self) + ).init; + // TODO: factor out with StateChannelApiGenerator constructor Set states = new HashSet<>(); states.add(init); states.addAll(MState.getReachableStates(init)); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index b2cad62fc..3af9985dc 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -83,7 +83,11 @@ public Map buildEndpointClass() throws ScribbleException Map res = new HashMap<>(); JobContext jc = this.job.getContext(); - EState init = (this.job.minEfsm ? jc.getMinimisedEGraph(this.proto, this.self) : jc.getEGraph(this.proto, this.self)).init; // FIXME: factor out with StateChannelApiGenerator constructor + EState init = (this.job.config.minEfsm + ? jc.getMinimisedEGraph(this.proto, this.self) + : jc.getEGraph(this.proto, this.self) + ).init; + // TODO: factor out with StateChannelApiGenerator constructor Set states = new HashSet<>(); states.add(init); states.addAll(MState.getReachableStates(init)); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 4bdad6246..11fceb52c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -56,7 +56,8 @@ public class StateChannelApiGenerator extends ApiGen private Map types = new HashMap<>(); // class/iface name key - public StateChannelApiGenerator(Job job, GProtocolName fullname, Role self) throws ScribbleException // FIXME: APIGenerationException? + public StateChannelApiGenerator(Job job, GProtocolName fullname, Role self) + throws ScribbleException // CHECKME: APIGenerationException? { super(job, fullname); @@ -64,7 +65,9 @@ public StateChannelApiGenerator(Job job, GProtocolName fullname, Role self) thro this.lpn = Projector.projectFullProtocolName(fullname, self); //this.init = job.getContext().getEndpointGraph(fullname, self).init; JobContext jc = job.getContext(); - this.init = job.minEfsm ? jc.getMinimisedEGraph(fullname, self).init : jc.getEGraph(fullname, self).init; + this.init = job.config.minEfsm + ? jc.getMinimisedEGraph(fullname, self).init + : jc.getEGraph(fullname, self).init; this.skipIOInterfacesGeneration = skipIOInterfacesGeneration(this.init); @@ -98,7 +101,8 @@ public Map generateApi() { Map map = new HashMap(); // FIXME: factor out with ScribSocketBuilder.getPackageName - String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.gpn).replace('.', '/') + "/statechans/" + this.self + "/" ; + String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.gpn) + .replace('.', '/') + "/statechans/" + this.self + "/"; for (String s : this.types.keySet()) { String path = prefix + s + ".java"; @@ -181,7 +185,9 @@ private ClassBuilder constructClass(EState curr) throws ScribbleException // FI } default: { - throw new RuntimeException("[TODO] State Channel API generation not supported for: " + curr.getStateKind() + ", " + curr.toLongString()); + throw new RuntimeException( + "[TODO] State Channel API generation not supported for: " + + curr.getStateKind() + ", " + curr.toLongString()); } } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index 64e429905..9d29a01e5 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -80,7 +80,9 @@ public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) Role self = getSelf(); //EndpointState init = this.job.getContext().getEndpointGraph(fullname, self).init; JobContext jc = this.job.getContext(); - EState init = this.job.minEfsm ? jc.getMinimisedEGraph(fullname, self).init : jc.getEGraph(fullname, self).init; + EState init = this.job.config.minEfsm + ? jc.getMinimisedEGraph(fullname, self).init + : jc.getEGraph(fullname, self).init; //if (IOInterfacesGenerator.skipIOInterfacesGeneration(init)) { diff --git a/scribble-core/src/main/java/org/scribble/del/DoDel.java b/scribble-core/src/main/java/org/scribble/del/DoDel.java index ab3485b9c..955b34389 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoDel.java @@ -69,11 +69,12 @@ private ScribNode leaveDisambiguationAux( ProtocolNameNode proto = doo.getProtocolNameNode(); ProtocolName fullname = mc .getVisibleProtocolDeclFullName(proto.toName()); - ProtocolNameNode pnn = (ProtocolNameNode) disamb.job.af + ProtocolNameNode pnn = (ProtocolNameNode) disamb.job.config.af .QualifiedNameNode(proto.getSource(), fullname.getKind(), fullname.getElements()); // Didn't keep original namenode del - return doo.reconstruct(doo.getRoleListChild(), doo.getNonRoleListChild(), pnn); + return doo.reconstruct(doo.getRoleListChild(), doo.getNonRoleListChild(), + pnn); } @Override diff --git a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java b/scribble-core/src/main/java/org/scribble/del/ModuleDel.java index dc1c82a63..516f7a530 100644 --- a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ModuleDel.java @@ -146,11 +146,11 @@ public Module createModuleForProjection(Projector proj, Module root, GProtocolDecl gpd, LProtocolDecl lpd, Map> deps) { ModuleDecl rootModDecl = root.getModuleDeclChild(); - ModuleNameNode modname = Projector.makeProjectedModuleNameNode(proj.job.af, - rootModDecl.getNameNodeChild().getSource(), + ModuleNameNode modname = Projector.makeProjectedModuleNameNode( + proj.job.config.af, rootModDecl.getNameNodeChild().getSource(), // Or ignore blame source for purely generated? rootModDecl.getFullModuleName(), lpd.getHeaderChild().getDeclName()); - ModuleDecl modDecl = proj.job.af + ModuleDecl modDecl = proj.job.config.af .ModuleDecl(root.getModuleDeclChild().getSource(), modname); List> imports = new LinkedList<>(); for (GProtocolName gpn : deps.keySet()) @@ -159,21 +159,25 @@ public Module createModuleForProjection(Projector proj, Module root, { LProtocolName targetsimpname = Projector .projectSimpleProtocolName(gpn.getSimpleName(), role); - ModuleNameNode targetmodname = Projector.makeProjectedModuleNameNode(proj.job.af, //null, // FIXME? projected import sources? + ModuleNameNode targetmodname = Projector.makeProjectedModuleNameNode(proj.job.config.af, //null, // CHECKME? projected import sources? new CommonTree(), // FIXME -- gpn.getPrefix(), targetsimpname); if (!targetmodname.toName().equals(modname.toName())) // Self dependency -- each projected local is in its own module now, so can compare module names { - imports.add(proj.job.af.ImportModule(null, targetmodname, null)); // FIXME? projected import sources? + imports + .add(proj.job.config.af.ImportModule(null, targetmodname, null)); + // CHECKME? projected import sources? } } } - List> data = new LinkedList<>(root.getNonProtoDeclChildren()); // FIXME: copy? // FIXME: only project the dependencies + List> data = + new LinkedList<>(root.getNonProtoDeclChildren()); + // CHECKME: copy? // FIXME: only project the dependencies List> protos = Arrays.asList(lpd); - return proj.job.af.Module(gpd.getHeaderChild().getSource(), modDecl, + return proj.job.config.af.Module(gpd.getHeaderChild().getSource(), modDecl, imports, data, protos); } diff --git a/scribble-core/src/main/java/org/scribble/del/RecursionDel.java b/scribble-core/src/main/java/org/scribble/del/RecursionDel.java index 7cff47696..fb739178e 100644 --- a/scribble-core/src/main/java/org/scribble/del/RecursionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/RecursionDel.java @@ -83,7 +83,7 @@ public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, super.enterInlinedProtocolUnfolding(parent, child, unf); Recursion lr = (Recursion) child; RecVar recvar = lr.getRecVarChild().toName(); - unf.setRecVar(unf.job.af, recvar, lr); // Cloned on use (on continue) + unf.setRecVar(unf.job.config.af, recvar, lr); // Cloned on use (on continue) } @Override diff --git a/scribble-core/src/main/java/org/scribble/del/ScribDel.java b/scribble-core/src/main/java/org/scribble/del/ScribDel.java index 525a39f22..c791b6550 100644 --- a/scribble-core/src/main/java/org/scribble/del/ScribDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ScribDel.java @@ -17,7 +17,6 @@ import org.scribble.job.ScribbleException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.SimpleVisitor; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ModuleContextBuilder; import org.scribble.visit.context.ProjectedChoiceDoPruner; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java index 384207b8a..236744343 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -48,7 +48,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, .getTranslation()) .collect(Collectors.toList()); RoleNode subj = gc.getSubjectChild().clone();//inl.job.af); - GChoice inlined = inl.job.af.GChoice(gc.getSource(), subj, blocks); + GChoice inlined = inl.job.config.af.GChoice(gc.getSource(), subj, blocks); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (GChoice) super.leaveProtocolInlining(parent, child, inl, gc); } @@ -81,7 +81,7 @@ public GChoice leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, List all = cho.getBlockChildren().stream().map(b -> (WFChoiceEnv) b.del().env()) .collect(Collectors.toList()); - if (checker.job.useOldWf) // **** + if (checker.job.config.useOldWf) // **** { if (all.size() > 1) { @@ -174,7 +174,7 @@ public GChoice leaveProjection(ScribNode parent, ScribNode child, .getProjection()) .collect(Collectors.toList()); //gc.getBlocks().stream().map(b -> ((GProtocolBlockDel) b.del()).project(b, self)).collect(Collectors.toList()); - LChoice projection = gc.project(proj.job.af, proj.peekSelf(), blocks); + LChoice projection = gc.project(proj.job.config.af, proj.peekSelf(), blocks); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GChoice) GCompoundInteractionNodeDel.super.leaveProjection(parent, child, proj, gc); diff --git a/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java index c4f5838c8..e445eb30b 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java @@ -91,7 +91,7 @@ public ScribNode leaveProjection(ScribNode parent, ScribNode child, { GConnect gc = (GConnect) visited; Role self = proj.peekSelf(); - LNode projection = gc.project(proj.job.af, self); + LNode projection = gc.project(proj.job.config.af, self); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GConnect) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gc); diff --git a/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java b/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java index 707a914d3..aae5c6a42 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java @@ -32,7 +32,7 @@ public GContinue leaveProtocolInlining(ScribNode parent, ScribNode child, GContinue gc = (GContinue) visited; RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) gc.getRecVarChild() .del().env()).getTranslation(); - GContinue inlined = inl.job.af.GContinue(gc.getSource(), recvar); + GContinue inlined = inl.job.config.af.GContinue(gc.getSource(), recvar); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (GContinue) super.leaveProtocolInlining(parent, child, inl, gc); } @@ -50,7 +50,7 @@ public GContinue leaveProjection(ScribNode parent, ScribNode child, { GContinue gc = (GContinue) visited; //LContinue projection = project(proj.job.af, gc, proj.peekSelf()); - LContinue projection = gc.project(proj.job.af, proj.peekSelf()); + LContinue projection = gc.project(proj.job.config.af, proj.peekSelf()); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GContinue) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gc); diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java index b4c277505..1d7aacab6 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -78,8 +78,9 @@ public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, throw new ScribbleException(r.getSource(), "Invalid delegation role: " + de); } - GProtocolNameNode pnn = (GProtocolNameNode) disamb.job.af.QualifiedNameNode( - de.getProtocolChild().getSource(), fullname.getKind(), fullname.getElements()); + GProtocolNameNode pnn = (GProtocolNameNode) disamb.job.config.af + .QualifiedNameNode(de.getProtocolChild().getSource(), + fullname.getKind(), fullname.getElements()); // Not keeping original namenode del return de.reconstruct(pnn, r); } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java index 298c53b13..72b987ab9 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java @@ -25,8 +25,9 @@ import org.scribble.visit.wf.WFChoiceChecker; import org.scribble.visit.wf.env.WFChoiceEnv; -// FIXME: make DisconnectDel (cf., G/LMessageTransferDel) -public class GDisconnectDel extends ConnectionActionDel implements GSimpleInteractionNodeDel +// TODO: make DisconnectDel (cf., G/LMessageTransferDel) +public class GDisconnectDel extends ConnectionActionDel + implements GSimpleInteractionNodeDel { public GDisconnectDel() { @@ -34,7 +35,8 @@ public GDisconnectDel() } @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb, ScribNode visited) throws ScribbleException { GDisconnect gc = (GDisconnect) visited; /*Role src = gc.src.toName(); @@ -43,7 +45,9 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisa } @Override - public GDisconnect leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException + public GDisconnect leaveInlinedWFChoiceCheck(ScribNode parent, + ScribNode child, WFChoiceChecker checker, ScribNode visited) + throws ScribbleException { GDisconnect gd = (GDisconnect) visited; RoleNode leftNode = gd.getLeftChild(); @@ -52,7 +56,8 @@ public GDisconnect leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, Role left = leftNode.toName(); if (!checker.peekEnv().isEnabled(left)) { - throw new ScribbleException(leftNode.getSource(), "Role not enabled: " + left); + throw new ScribbleException(leftNode.getSource(), + "Role not enabled: " + left); } //Message msg = gd.msg.toMessage(); // Unit message WFChoiceEnv env = checker.popEnv(); @@ -60,16 +65,21 @@ public GDisconnect leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, Role right = rightNode.toName(); if (!env.isEnabled(right)) { - throw new ScribbleException(rightNode.getSource(), "Role not enabled: " + right); + throw new ScribbleException(rightNode.getSource(), + "Role not enabled: " + right); } { if (left.equals(right)) { - throw new ScribbleException(gd.getSource(), "[TODO] Self connections not supported: " + gd); // Would currently be subsumed by the below + throw new ScribbleException(gd.getSource(), + "[TODO] Self connections not supported: " + gd); // Would currently + // be subsumed by + // the below } if (!env.isConnected(left, right)) { - throw new ScribbleException(gd.getSource(), "Roles not (necessarily) connected: " + left + ", " + right); + throw new ScribbleException(gd.getSource(), + "Roles not (necessarily) connected: " + left + ", " + right); } env = env.disconnect(left, right);//.removeMessage(src, dest, ...); // Is remove really needed? @@ -86,8 +96,9 @@ public ScribNode leaveProjection(ScribNode parent, ScribNode child, Projector pr { GDisconnect gd = (GDisconnect) visited; Role self = proj.peekSelf(); - LNode projection = gd.project(proj.job.af, self); + LNode projection = gd.project(proj.job.config.af, self); proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GDisconnect) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gd); + return (GDisconnect) GSimpleInteractionNodeDel.super.leaveProjection(parent, + child, proj, gd); } } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java index 0109077ce..1eee11bdd 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java @@ -51,9 +51,9 @@ public GDo visitForSubprotocolInlining(ProtocolDefInliner builder, GDo child) { CommonTree blame = child.getSource(); SubprotocolSig subsig = builder.peekStack(); - RecVarNode recvar = (RecVarNode) builder.job.af.SimpleNameNode(blame, + RecVarNode recvar = (RecVarNode) builder.job.config.af.SimpleNameNode(blame, RecVarKind.KIND, builder.getSubprotocolRecVar(subsig).toString()); - GContinue inlined = builder.job.af.GContinue(blame, recvar); + GContinue inlined = builder.job.config.af.GContinue(blame, recvar); builder.pushEnv(builder.popEnv().setTranslation(inlined)); return child; } @@ -66,12 +66,12 @@ public GDo leaveProtocolInlining(ScribNode parent, ScribNode child, { CommonTree blame = visited.getSource(); SubprotocolSig subsig = inl.peekStack(); - RecVarNode recvar = (RecVarNode) inl.job.af.SimpleNameNode(blame, + RecVarNode recvar = (RecVarNode) inl.job.config.af.SimpleNameNode(blame, RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString()); GInteractionSeq gis = (GInteractionSeq) (((InlineProtocolEnv) inl .peekEnv()).getTranslation()); - GProtocolBlock gb = inl.job.af.GProtocolBlock(blame, gis); - GRecursion inlined = inl.job.af.GRecursion(blame, recvar, gb); + GProtocolBlock gb = inl.job.config.af.GProtocolBlock(blame, gis); + GRecursion inlined = inl.job.config.af.GRecursion(blame, recvar, gb); inl.pushEnv(inl.popEnv().setTranslation(inlined)); inl.removeSubprotocolRecVar(subsig); } @@ -112,9 +112,9 @@ public GDo leaveProjection(ScribNode parent, ScribNode child, Projector proj, { ModuleContext mc = proj.getModuleContext(); LProtocolNameNode target = Projector.makeProjectedFullNameNode( - proj.job.af, gd.getProtocolNameNode().getSource(), + proj.job.config.af, gd.getProtocolNameNode().getSource(), gd.getTargetProtocolDeclFullName(mc), popped); - projection = gd.project(proj.job.af, self, target); + projection = gd.project(proj.job.config.af, self, target); // FIXME: do guarded recursive subprotocol checking (i.e. role is used during chain) in reachability checking? -- required role-usage makes local choice subject inference easier, but is restrictive (e.g. proto(A, B, C) { choice at A {A->B.do Proto(A,B,C)} or {A->B.B->C} })) } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java b/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java index 995514384..bb26398ad 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java @@ -72,7 +72,8 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, gins.add((GInteractionNode) inlined); } } - GInteractionSeq inlined = inl.job.af.GInteractionSeq(gis.getSource(), gins); + GInteractionSeq inlined = inl.job.config.af.GInteractionSeq(gis.getSource(), + gins); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (GInteractionSeq) ScribDelBase.popAndSetVisitorEnv(this, inl, gis); } @@ -111,7 +112,8 @@ else if (ln != null) // null is used for empty projection lis.clear(); } }*/ - LInteractionSeq projection = gis.project(proj.job.af, proj.peekSelf(), lis); + LInteractionSeq projection = gis.project(proj.job.config.af, + proj.peekSelf(), lis); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GInteractionSeq) ScribDelBase.popAndSetVisitorEnv(this, proj, gis); } @@ -154,6 +156,6 @@ public GInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, .getInteractNodeChildren().stream() : Stream.of(gi)) .collect(Collectors.toList()); - return rem.job.af.GInteractionSeq(gis.getSource(), gins); + return rem.job.config.af.GInteractionSeq(gis.getSource(), gins); } } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java index 772364344..75c3cf7e0 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -109,7 +109,7 @@ public ScribNode leaveProjection(ScribNode parent, ScribNode child, { GMessageTransfer gmt = (GMessageTransfer) visited; Role self = proj.peekSelf(); - LNode projection = gmt.project(proj.job.af, self); + LNode projection = gmt.project(proj.job.config.af, self); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GMessageTransfer) GSimpleInteractionNodeDel.super.leaveProjection( parent, child, proj, gmt); diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java index ffc68f712..c8e8fe5d1 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java @@ -36,7 +36,8 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, GProtocolBlock gpb = (GProtocolBlock) visited; GInteractionSeq seq = (GInteractionSeq) ((InlineProtocolEnv) gpb .getInteractSeqChild().del().env()).getTranslation(); - GProtocolBlock inlined = inl.job.af.GProtocolBlock(gpb.getSource(), seq); + GProtocolBlock inlined = + inl.job.config.af.GProtocolBlock(gpb.getSource(), seq); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (GProtocolBlock) ScribDelBase.popAndSetVisitorEnv(this, inl, gpb); } @@ -57,7 +58,8 @@ public GProtocolBlock leaveProjection(ScribNode parent, ScribNode child, (LInteractionSeq) ((ProjectionEnv) gpb.getInteractSeqChild().del() .env()).getProjection(); //((GInteractionSeqDel) gpb.seq.del()).project(gpb.getInteractionSeq(), self); - LProtocolBlock projection = gpb.project(proj.job.af, proj.peekSelf(), seq); + LProtocolBlock projection = + gpb.project(proj.job.config.af, proj.peekSelf(), seq); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GProtocolBlock) ScribDelBase.popAndSetVisitorEnv(this, proj, gpb); } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index f06ec8759..145bee39d 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -138,7 +138,7 @@ public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, public GProtocolDecl leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException { - AstFactory af = proj.job.af; + AstFactory af = proj.job.config.af; Module root = proj.job.getContext().getModule(proj.getModuleContext().root); GProtocolDecl gpd = (GProtocolDecl) visited; @@ -181,9 +181,9 @@ public void enterValidation(ScribNode parent, ScribNode child, } GProtocolName fullname = gpd.getFullMemberName((Module) parent); - if (checker.job.spin) + if (checker.job.config.spin) { - if (checker.job.fair) + if (checker.job.config.fair) { throw new RuntimeException( "[TODO]: -spin currently does not support fair ouput choices."); @@ -193,7 +193,7 @@ public void enterValidation(ScribNode parent, ScribNode child, else { validateByScribble(checker.job, fullname, true); - if (!checker.job.fair) + if (!checker.job.config.fair) { checker.job.debugPrintln( "(" + fullname + ") Validating with \"unfair\" output choices.. "); @@ -210,7 +210,7 @@ private static void validateByScribble(Job job, GProtocolName fullname, ? jc.getSGraph(fullname) : jc.getUnfairSGraph(fullname); //graph.toModel().validate(job); - job.sf.newSModel(graph).validate(job); + job.config.sf.newSModel(graph).validate(job); } private static void validateBySpin(Job job, GProtocolName fullname) @@ -271,7 +271,7 @@ private static void validateBySpin(Job job, GProtocolName fullname) { pml += "\n\n" + jc.getEGraph(fullname, r).toPml(r); } - if (job.debug) + if (job.config.debug) { System.out.println("[-spin]: Promela processes\n" + pml + "\n"); } @@ -329,7 +329,7 @@ private static void validateBySpin(Job job, GProtocolName fullname) int j = (i+batchSize < clauses.size()) ? i+batchSize : clauses.size(); String batch = clauses.subList(i, j).stream().collect(Collectors.joining(" && ")); String ltl = "ltl {\n" + batch + "\n" + "}"; - if (job.debug) + if (job.config.debug) { System.out.println("[-spin] Batched ltl:\n" + ltl + "\n"); } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java index 12d283860..76bec3df7 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java @@ -66,12 +66,12 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, System.out.println("ccc2: " + visited); //...HERE: update AF to ANTLR nodes - RecVarNode recvar = (RecVarNode) inl.job.af.SimpleNameNode(blame, + RecVarNode recvar = (RecVarNode) inl.job.config.af.SimpleNameNode(blame, RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString()); - GRecursion rec = inl.job.af.GRecursion(blame, recvar, block); - GInteractionSeq gis = inl.job.af.GInteractionSeq(blame, Arrays.asList(rec)); - GProtocolDef inlined = inl.job.af.GProtocolDef(def.getSource(), - inl.job.af.GProtocolBlock(blame, gis)); + GRecursion rec = inl.job.config.af.GRecursion(blame, recvar, block); + GInteractionSeq gis = inl.job.config.af.GInteractionSeq(blame, Arrays.asList(rec)); + GProtocolDef inlined = inl.job.config.af.GProtocolDef(def.getSource(), + inl.job.config.af.GProtocolBlock(blame, gis)); inl.pushEnv(inl.popEnv().setTranslation(inlined)); GProtocolDefDel copy = setInlinedProtocolDef(inlined); return (GProtocolDef) ScribDelBase.popAndSetVisitorEnv(this, inl, @@ -93,7 +93,8 @@ public GProtocolDef leaveProjection(ScribNode parent, ScribNode child, GProtocolDef gpd = (GProtocolDef) visited; LProtocolBlock block = (LProtocolBlock) ((ProjectionEnv) gpd.getBlockChild() .del().env()).getProjection(); - LProtocolDef projection = gpd.project(proj.job.af, proj.peekSelf(), block); + LProtocolDef projection = + gpd.project(proj.job.config.af, proj.peekSelf(), block); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GProtocolDef) ScribDelBase.popAndSetVisitorEnv(this, proj, gpd); } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java b/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java index 7a7d1cc2e..0e88e59cc 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java @@ -40,7 +40,8 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, .del().env()).getTranslation(); GProtocolBlock block = (GProtocolBlock) ((InlineProtocolEnv) gr .getBlockChild().del().env()).getTranslation(); - GRecursion inlined = inl.job.af.GRecursion(gr.getSource(), recvar, block); + GRecursion inlined = + inl.job.config.af.GRecursion(gr.getSource(), recvar, block); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (GRecursion) super.leaveProtocolInlining(parent, child, inl, gr); } @@ -68,7 +69,8 @@ public GRecursion leaveProjection(ScribNode parent, ScribNode child, (LProtocolBlock) ((ProjectionEnv) gr.getBlockChild().del().env()) .getProjection(); //((GProtocolBlockDel) gr.block.del()).project(gr.getBlock(), self); - LRecursion projection = gr.project(proj.job.af, proj.peekSelf(), block); + LRecursion projection = + gr.project(proj.job.config.af, proj.peekSelf(), block); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GRecursion) GCompoundInteractionNodeDel.super.leaveProjection( parent, child, proj, gr); diff --git a/scribble-core/src/main/java/org/scribble/del/global/GWrapDel.java b/scribble-core/src/main/java/org/scribble/del/global/GWrapDel.java index 71ea2e900..b401dec36 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GWrapDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GWrapDel.java @@ -90,7 +90,7 @@ public ScribNode leaveProjection(ScribNode parent, ScribNode child, { GWrap gw = (GWrap) visited; Role self = proj.peekSelf(); - LNode projection = gw.project(proj.job.af, self); + LNode projection = gw.project(proj.job.config.af, self); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GWrap) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gw); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java b/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java index ac8148b2a..5d61b35ba 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java @@ -29,10 +29,12 @@ import org.scribble.visit.wf.ExplicitCorrelationChecker; import org.scribble.visit.wf.env.ExplicitCorrelationEnv; -public class LAcceptDel extends LConnectionActionDel implements LSimpleInteractionNodeDel +public class LAcceptDel extends LConnectionActionDel + implements LSimpleInteractionNodeDel { @Override - public LAccept leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder builder, ScribNode visited) throws ScribbleException + public LAccept leaveEGraphBuilding(ScribNode parent, ScribNode child, + EGraphBuilder builder, ScribNode visited) throws ScribbleException { LAccept la = (LAccept) visited; RoleNode src = la.getSourceChild(); @@ -44,7 +46,8 @@ public LAccept leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuil ? ((MessageSigNode) msg).getPayloadListChild().toPayload() : Payload.EMPTY_PAYLOAD; builder.util.addEdge(builder.util.getEntry(), - builder.job.ef.newEAccept(peer, mid, payload), builder.util.getExit()); + builder.job.config.ef.newEAccept(peer, mid, payload), + builder.util.getExit()); return (LAccept) super.leaveEGraphBuilding(parent, child, builder, la); } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java b/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java index b2a6f9cc9..d633eedd8 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java @@ -118,11 +118,12 @@ public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, // self not recorded -- can derive from LProtocolDecl RoleDeclList //throw new RuntimeException("Shouldn't get in here: " + subjs); } - RoleNode subj = (RoleNode) fixer.job.af.SimpleNameNode(null, RoleKind.KIND, // CHECKME? null source OK? + RoleNode subj = (RoleNode) fixer.job.config.af.SimpleNameNode(null, RoleKind.KIND, // CHECKME? null source OK? //blocks.get(0).getInteractionSeq().getInteractions().get(0).inferLocalChoiceSubject(fixer).toString()); subjs.iterator().next().toString()); fixer.setChoiceSubject(subj.toName()); - LChoice projection = fixer.job.af.LChoice(lc.getSource(), subj, blocks); + LChoice projection = + fixer.job.config.af.LChoice(lc.getSource(), subj, blocks); return projection; } @@ -137,7 +138,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, .getTranslation()) .collect(Collectors.toList()); RoleNode subj = lc.getSubjectChild().clone();//inl.job.af); - LChoice inlined = inl.job.af.LChoice(lc.getSource(), subj, blocks); + LChoice inlined = inl.job.config.af.LChoice(lc.getSource(), subj, blocks); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (LChoice) super.leaveProtocolInlining(parent, child, inl, lc); } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java b/scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java index 7bf980f81..b65ce57f4 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java @@ -43,7 +43,7 @@ public LContinue leaveProtocolInlining(ScribNode parent, ScribNode child, LContinue lc = (LContinue) visited; RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) lc.getRecVarChild() .del().env()).getTranslation(); - LContinue inlined = inl.job.af.LContinue(lc.getSource(), recvar); + LContinue inlined = inl.job.config.af.LContinue(lc.getSource(), recvar); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (LContinue) super.leaveProtocolInlining(parent, child, inl, lc); } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LDisconnectDel.java b/scribble-core/src/main/java/org/scribble/del/local/LDisconnectDel.java index 1b772a24d..6d48aaa75 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LDisconnectDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LDisconnectDel.java @@ -31,7 +31,7 @@ public LDisconnect leaveEGraphBuilding(ScribNode parent, ScribNode child, LDisconnect ld = (LDisconnect) visited; Role peer = ld.getPeerChild().toName(); builder.util.addEdge(builder.util.getEntry(), - builder.job.ef.newEDisconnect(peer), builder.util.getExit()); + builder.job.config.ef.newEDisconnect(peer), builder.util.getExit()); return (LDisconnect) super.leaveEGraphBuilding(parent, child, builder, ld); } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java index 47f1803de..c1f012130 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java @@ -61,9 +61,9 @@ public LDo visitForSubprotocolInlining(ProtocolDefInliner builder, LDo child) { CommonTree blame = child.getSource(); // Cf., GDoDel SubprotocolSig subsig = builder.peekStack(); - RecVarNode recvar = (RecVarNode) builder.job.af.SimpleNameNode(blame, + RecVarNode recvar = (RecVarNode) builder.job.config.af.SimpleNameNode(blame, RecVarKind.KIND, builder.getSubprotocolRecVar(subsig).toString()); - LContinue inlined = builder.job.af.LContinue(blame, recvar); + LContinue inlined = builder.job.config.af.LContinue(blame, recvar); builder.pushEnv(builder.popEnv().setTranslation(inlined)); return child; } @@ -76,12 +76,12 @@ public LDo leaveProtocolInlining(ScribNode parent, ScribNode child, { CommonTree blame = visited.getSource(); // Cf., GDoDel SubprotocolSig subsig = dinlr.peekStack(); - RecVarNode recvar = (RecVarNode) dinlr.job.af.SimpleNameNode(blame, + RecVarNode recvar = (RecVarNode) dinlr.job.config.af.SimpleNameNode(blame, RecVarKind.KIND, dinlr.getSubprotocolRecVar(subsig).toString()); LInteractionSeq gis = (LInteractionSeq) (((InlineProtocolEnv) dinlr .peekEnv()).getTranslation()); - LProtocolBlock gb = dinlr.job.af.LProtocolBlock(blame, gis); - LRecursion inlined = dinlr.job.af.LRecursion(blame, recvar, gb); + LProtocolBlock gb = dinlr.job.config.af.LProtocolBlock(blame, gis); + LRecursion inlined = dinlr.job.config.af.LRecursion(blame, recvar, gb); dinlr.pushEnv(dinlr.popEnv().setTranslation(inlined)); dinlr.removeSubprotocolRecVar(subsig); } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java b/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java index 6029efb3b..aeb7c291f 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java @@ -69,7 +69,8 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, lins.add((LInteractionNode) inlined); } } - LInteractionSeq inlined = inl.job.af.LInteractionSeq(lis.getSource(), lins); + LInteractionSeq inlined = + inl.job.config.af.LInteractionSeq(lis.getSource(), lins); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (LInteractionSeq) ScribDelBase.popAndSetVisitorEnv(this, inl, lis); } @@ -155,6 +156,6 @@ public LInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, .getInteractNodeChildren().stream() : Stream.of(li)) .collect(Collectors.toList()); - return rem.job.af.LInteractionSeq(lis.getSource(), lins); + return rem.job.config.af.LInteractionSeq(lis.getSource(), lins); } } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java b/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java index 3f971f385..1dd92614b 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java @@ -59,7 +59,7 @@ public ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, .filter(rd -> occs.contains(rd.getDeclName())) .collect(Collectors.toList()); LProtocolHeader tmp = lpd.getHeaderChild(); - RoleDeclList rdl = fixer.job.af + RoleDeclList rdl = fixer.job.config.af .RoleDeclList(tmp.getRoleDeclListChild().getSource(), rds); LProtocolHeader hdr = tmp.reconstruct(tmp.getNameNodeChild(), rdl, tmp.getParamDeclListChild()); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProtocolBlockDel.java b/scribble-core/src/main/java/org/scribble/del/local/LProtocolBlockDel.java index bf064373b..26eefb3f4 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LProtocolBlockDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LProtocolBlockDel.java @@ -32,7 +32,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, LProtocolBlock lpb = (LProtocolBlock) visited; LInteractionSeq seq = (LInteractionSeq) ((InlineProtocolEnv) lpb .getInteractSeqChild().del().env()).getTranslation(); - LProtocolBlock inlined = inl.job.af.LProtocolBlock(lpb.getSource(), seq); + LProtocolBlock inlined = inl.job.config.af.LProtocolBlock(lpb.getSource(), seq); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (LProtocolBlock) ScribDelBase.popAndSetVisitorEnv(this, inl, lpb); } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/local/LProtocolDeclDel.java index 8d2863146..ac7f421a2 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LProtocolDeclDel.java @@ -41,34 +41,43 @@ protected LProtocolDeclDel copy() } @Override - protected void addSelfDependency(ProtocolDeclContextBuilder builder, ProtocolName proto, Role role) + protected void addSelfDependency(ProtocolDeclContextBuilder builder, + ProtocolName proto, Role role) { builder.addLocalProtocolDependency(role, (LProtocolName) proto, role); } @Override - public void enterProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder) throws ScribbleException + public void enterProtocolDeclContextBuilding(ScribNode parent, + ScribNode child, ProtocolDeclContextBuilder builder) + throws ScribbleException { super.enterProtocolDeclContextBuilding(parent, child, builder); } @Override - public LProtocolDecl leaveProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) throws ScribbleException + public LProtocolDecl leaveProtocolDeclContextBuilding(ScribNode parent, + ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) + throws ScribbleException { LProtocolDecl lpd = (LProtocolDecl) visited; - LProtocolDeclContext lcontext = new LProtocolDeclContext(builder.getLocalProtocolDependencyMap()); + LProtocolDeclContext lcontext = new LProtocolDeclContext( + builder.getLocalProtocolDependencyMap()); LProtocolDeclDel del = (LProtocolDeclDel) setProtocolDeclContext(lcontext); return (LProtocolDecl) lpd.del(del); } @Override - public void enterEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder builder) + public void enterEGraphBuilding(ScribNode parent, ScribNode child, + EGraphBuilder builder) { - builder.util.init(builder.job.ef.newEState(Collections.emptySet())); // Same util is used for multiple protos, need to (re-)init each time + builder.util.init(builder.job.config.ef.newEState(Collections.emptySet())); + // Same util is used for multiple protos, need to (re-)init each time } @Override - public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder graph, ScribNode visited) + public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, + EGraphBuilder graph, ScribNode visited) { /*LProtocolDecl lpd = (LProtocolDecl) visited; // Refactored into JobContext diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java b/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java index 22033a350..b97c1c3b5 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java @@ -57,12 +57,13 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, LProtocolDef def = (LProtocolDef) visited; LProtocolBlock block = (LProtocolBlock) ((InlineProtocolEnv) def .getBlockChild().del().env()).getTranslation(); - RecVarNode recvar = (RecVarNode) inl.job.af.SimpleNameNode(blame, // The parent do would probably be the better source for blame + RecVarNode recvar = (RecVarNode) inl.job.config.af.SimpleNameNode(blame, // The parent do would probably be the better source for blame RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString()); - LRecursion rec = inl.job.af.LRecursion(blame, recvar, block); - LInteractionSeq lis = inl.job.af.LInteractionSeq(blame, Arrays.asList(rec)); - LProtocolDef inlined = inl.job.af.LProtocolDef(def.getSource(), - inl.job.af.LProtocolBlock(blame, lis)); + LRecursion rec = inl.job.config.af.LRecursion(blame, recvar, block); + LInteractionSeq lis = + inl.job.config.af.LInteractionSeq(blame, Arrays.asList(rec)); + LProtocolDef inlined = inl.job.config.af.LProtocolDef(def.getSource(), + inl.job.config.af.LProtocolBlock(blame, lis)); inl.pushEnv(inl.popEnv().setTranslation(inlined)); LProtocolDefDel copy = setInlinedProtocolDef(inlined); return (LProtocolDef) ScribDelBase.popAndSetVisitorEnv(this, inl, diff --git a/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java b/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java index 9421eebb9..9da1c3be7 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java @@ -40,7 +40,8 @@ public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, ? ((MessageSigNode) msg).getPayloadListChild().toPayload() : Payload.EMPTY_PAYLOAD; builder.util.addEdge(builder.util.getEntry(), - builder.job.ef.newEReceive(peer, mid, payload), builder.util.getExit()); + builder.job.config.ef.newEReceive(peer, mid, payload), + builder.util.getExit()); //builder.builder.addEdge(builder.builder.getEntry(), Receive.get(peer, mid, payload), builder.builder.getExit()); return (LReceive) super.leaveEGraphBuilding(parent, child, builder, lr); } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LRecursionDel.java b/scribble-core/src/main/java/org/scribble/del/local/LRecursionDel.java index 661e60683..fe1265374 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LRecursionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LRecursionDel.java @@ -30,7 +30,8 @@ import org.scribble.visit.wf.ReachabilityChecker; import org.scribble.visit.wf.env.ReachabilityEnv; -public class LRecursionDel extends RecursionDel implements LCompoundInteractionNodeDel +public class LRecursionDel extends RecursionDel + implements LCompoundInteractionNodeDel { @Override public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, @@ -55,7 +56,8 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, .del().env()).getTranslation(); LProtocolBlock block = (LProtocolBlock) ((InlineProtocolEnv) lr .getBlockChild().del().env()).getTranslation(); - LRecursion inlined = inl.job.af.LRecursion(lr.getSource(), recvar, block); + LRecursion inlined = + inl.job.config.af.LRecursion(lr.getSource(), recvar, block); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (LRecursion) super.leaveProtocolInlining(parent, child, inl, lr); } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java b/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java index 0d9863f8c..854de0c9c 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java @@ -25,7 +25,8 @@ import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -public class LRequestDel extends LConnectionActionDel implements LSimpleInteractionNodeDel +public class LRequestDel extends LConnectionActionDel + implements LSimpleInteractionNodeDel { @Override public LRequest leaveEGraphBuilding(ScribNode parent, ScribNode child, @@ -40,7 +41,8 @@ public LRequest leaveEGraphBuilding(ScribNode parent, ScribNode child, ? ((MessageSigNode) msg).getPayloadListChild().toPayload() : Payload.EMPTY_PAYLOAD; builder.util.addEdge(builder.util.getEntry(), - builder.job.ef.newERequest(peer, mid, payload), builder.util.getExit()); + builder.job.config.ef.newERequest(peer, mid, payload), + builder.util.getExit()); //graph.builder.addEdge(graph.builder.getEntry(), new Connect(peer), graph.builder.getExit()); ////builder.builder.addEdge(builder.builder.getEntry(), Send.get(peer, mid, payload), builder.builder.getExit()); return (LRequest) super.leaveEGraphBuilding(parent, child, builder, lc); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java b/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java index db6c12a93..ca5ea5169 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java @@ -33,13 +33,15 @@ public class LSendDel extends LMessageTransferDel { @Override - public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder builder, ScribNode visited) throws ScribbleException + public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, + EGraphBuilder builder, ScribNode visited) throws ScribbleException { LSend ls = (LSend) visited; List dests = ls.getDestinationChildren(); if (dests.size() > 1) { - throw new ScribbleException("[TODO] EFSM building for multicast not supported: " + ls); + throw new ScribbleException( + "[TODO] EFSM building for multicast not supported: " + ls); } Role peer = dests.get(0).toName(); MessageNode msg = ls.getMessageNodeChild(); @@ -48,7 +50,8 @@ public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBu ? ((MessageSigNode) msg).getPayloadListChild().toPayload() : Payload.EMPTY_PAYLOAD; builder.util.addEdge(builder.util.getEntry(), - builder.job.ef.newESend(peer, mid, payload), builder.util.getExit()); + builder.job.config.ef.newESend(peer, mid, payload), + builder.util.getExit()); //builder.builder.addEdge(builder.builder.getEntry(), Send.get(peer, mid, payload), builder.builder.getExit()); return (LSend) super.leaveEGraphBuilding(parent, child, builder, ls); } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LWrapClientDel.java b/scribble-core/src/main/java/org/scribble/del/local/LWrapClientDel.java index 1f34df136..90017e0a0 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LWrapClientDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LWrapClientDel.java @@ -33,7 +33,7 @@ public LWrapClient leaveEGraphBuilding(ScribNode parent, ScribNode child, RoleNode dest = lc.getDestinationChild(); Role peer = dest.toName(); builder.util.addEdge(builder.util.getEntry(), - builder.job.ef.newEWrapClient(peer), builder.util.getExit()); + builder.job.config.ef.newEWrapClient(peer), builder.util.getExit()); return (LWrapClient) super.leaveEGraphBuilding(parent, child, builder, lc); } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LWrapServerDel.java b/scribble-core/src/main/java/org/scribble/del/local/LWrapServerDel.java index 998f84d48..a46808cb4 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LWrapServerDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LWrapServerDel.java @@ -33,7 +33,7 @@ public LWrapServer leaveEGraphBuilding(ScribNode parent, ScribNode child, LWrapServer la = (LWrapServer) visited; Role peer = la.getSourceChild().toName(); builder.util.addEdge(builder.util.getEntry(), - builder.job.ef.newEWrapServer(peer), builder.util.getExit()); + builder.job.config.ef.newEWrapServer(peer), builder.util.getExit()); return (LWrapServer) super.leaveEGraphBuilding(parent, child, builder, la); } diff --git a/scribble-core/src/main/java/org/scribble/del/name/AmbigNameNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/AmbigNameNodeDel.java index 9647a5f52..f8f72f7dd 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/AmbigNameNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/AmbigNameNodeDel.java @@ -34,7 +34,8 @@ public AmbigNameNodeDel() // Currently only in "message positions (see Scribble.g ambiguousname) @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb, ScribNode visited) throws ScribbleException { ModuleContext mcontext = disamb.getModuleContext(); AmbigNameNode ann = (AmbigNameNode) visited; @@ -45,22 +46,28 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisa { if (parent instanceof MessageTransfer) // FIXME HACK: MessageTransfer assumes MessageNode (cast in visitChildren), so this needs to be caught here // FIXME: other similar cases? { - throw new ScribbleException(ann.getSource(), "Invalid occurrence of data type: " + parent); + throw new ScribbleException(ann.getSource(), + "Invalid occurrence of data type: " + parent); } - return disamb.job.af.QualifiedNameNode(ann.getSource(), DataTypeKind.KIND, name.getElements()); + return disamb.job.config.af.QualifiedNameNode(ann.getSource(), + DataTypeKind.KIND, name.getElements()); } else if (mcontext.isMessageSigNameVisible(name.toMessageSigName())) { - if (parent instanceof PayloadElem) // FIXME HACK + if (parent instanceof PayloadElem) // FIXME HACK { - throw new ScribbleException(ann.getSource(), "Invalid occurrence of message signature name: " + parent); + throw new ScribbleException(ann.getSource(), + "Invalid occurrence of message signature name: " + parent); } - return disamb.job.af.QualifiedNameNode(ann.getSource(), SigKind.KIND, name.getElements()); + return disamb.job.config.af.QualifiedNameNode(ann.getSource(), + SigKind.KIND, name.getElements()); } else if (disamb.isBoundParameter(name)) { - return disamb.job.af.NonRoleParamNode(ann.getSource(), disamb.getParameterKind(name), name.toString()); + return disamb.job.config.af.NonRoleParamNode(ann.getSource(), + disamb.getParameterKind(name), name.toString()); } - throw new ScribbleException(ann.getSource(), "Cannot disambiguate name: " + name); + throw new ScribbleException(ann.getSource(), + "Cannot disambiguate name: " + name); } } diff --git a/scribble-core/src/main/java/org/scribble/del/name/DataTypeNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/DataTypeNodeDel.java index 2e28946cf..7fe3122c5 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/DataTypeNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/DataTypeNodeDel.java @@ -32,8 +32,8 @@ public DataTypeNodeDel() // Is this needed? Or DataTypeNodes always created from AmbigNameNode? (in this same pass) @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) - throws ScribbleException + public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb, ScribNode visited) throws ScribbleException { if (parent instanceof DataTypeDecl) // Hacky? don't want to do for decl simplenames (generally, don't do if parent is namedeclnode) { @@ -44,10 +44,12 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisa DataType dt = dtn.toName(); if (!mc.isVisibleDataType(dt)) { - throw new ScribbleException(dtn.getSource(), "Data type not visible: " + dt); + throw new ScribbleException(dtn.getSource(), + "Data type not visible: " + dt); } DataType fullname = mc.getVisibleDataTypeFullName(dt); - return (DataTypeNode) - disamb.job.af.QualifiedNameNode(dtn.getSource(), DataTypeKind.KIND, fullname.getElements()); // Didn't keep original del + return (DataTypeNode) disamb.job.config.af.QualifiedNameNode( + dtn.getSource(), DataTypeKind.KIND, fullname.getElements()); + // Didn't keep original del } } diff --git a/scribble-core/src/main/java/org/scribble/del/name/MessageSigNameNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/MessageSigNameNodeDel.java index 3b8350631..5b095a623 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/MessageSigNameNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/MessageSigNameNodeDel.java @@ -32,7 +32,8 @@ public MessageSigNameNodeDel() // Is this needed? Or DataTypeNodes always created from AmbigNameNode? (in this same pass) @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb, ScribNode visited) throws ScribbleException { if (parent instanceof MessageSigNameDecl) // Hacky? don't want to do for decl simplenames (generally, don't do if parent is namedeclnode) { @@ -40,7 +41,10 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisa } ModuleContext mc = disamb.getModuleContext(); MessageSigNameNode msnn = (MessageSigNameNode) visited; - MessageSigName fullname = mc.getVisibleMessageSigNameFullName(msnn.toName()); - return (MessageSigNameNode) disamb.job.af.QualifiedNameNode(msnn.getSource(), SigKind.KIND, fullname.getElements()); // Didn't keep original del + MessageSigName fullname = + mc.getVisibleMessageSigNameFullName(msnn.toName()); + return (MessageSigNameNode) disamb.job.config.af.QualifiedNameNode( + msnn.getSource(), SigKind.KIND, fullname.getElements()); + // Didn't keep original del } } diff --git a/scribble-core/src/main/java/org/scribble/del/name/RecVarNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/RecVarNodeDel.java index a89b5b315..215f12929 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/RecVarNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/RecVarNodeDel.java @@ -30,34 +30,39 @@ public RecVarNodeDel() } @Override - public RecVarNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + public RecVarNode leaveDisambiguation(ScribNode parent, ScribNode child, + NameDisambiguator disamb, ScribNode visited) throws ScribbleException { // Consistent with bound RoleNode checking RecVarNode rn = (RecVarNode) visited; RecVar rv = rn.toName(); if (!disamb.isBoundRecVar(rv)) { - throw new ScribbleException(rn.getSource(), "Rec variable not bound: " + rn); + throw new ScribbleException(rn.getSource(), + "Rec variable not bound: " + rn); } return (RecVarNode) super.leaveDisambiguation(parent, child, disamb, rn); //return super.leaveDisambiguation(parent, child, disamb, rn.reconstruct(disamb.getCanonicalRecVarName(rv))); } @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inliner) throws ScribbleException + public void enterProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inliner) throws ScribbleException { super.enterProtocolInlining(parent, child, inliner); ScribDelBase.pushVisitorEnv(this, inliner); } @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inliner, ScribNode visited) throws ScribbleException + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, + ProtocolDefInliner inliner, ScribNode visited) throws ScribbleException { RecVarNode rn = (RecVarNode) visited; RecVar rv = rn.toName(); //return super.leaveProtocolInlining(parent, child, inliner, rn.reconstruct(inliner.getCanonicalRecVarName(rv))); // No, affects the source AST //RecVarNode inlined = rn.reconstruct(inliner.getCanonicalRecVarName(rv)); - RecVarNode inlined = (RecVarNode) inliner.job.af.SimpleNameNode(rn.getSource(), RecVarKind.KIND, inliner.getCanonicalRecVarName(rv)); + RecVarNode inlined = (RecVarNode) inliner.job.config.af.SimpleNameNode( + rn.getSource(), RecVarKind.KIND, inliner.getCanonicalRecVarName(rv)); inliner.pushEnv(inliner.popEnv().setTranslation(inlined)); return ScribDelBase.popAndSetVisitorEnv(this, inliner, rn); // Not done by any super } diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index be9491e76..7408f204b 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -19,15 +19,12 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.ast.AstFactory; import org.scribble.ast.Module; import org.scribble.del.local.LProtocolDeclDel; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EGraphBuilderUtil; -import org.scribble.model.endpoint.EModelFactory; import org.scribble.model.global.SGraph; import org.scribble.model.global.SGraphBuilderUtil; -import org.scribble.model.global.SModelFactory; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.ModuleName; @@ -52,59 +49,25 @@ // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models public class Job { - // FIXME: verbose/debug printing parameter - // These are duplicated from MainContext, because cannot access that class directly from here - //public final boolean jUnit; - public final boolean debug; - public final boolean useOldWf; - public final boolean noProgress; // FIXME: deprecate - public final boolean minEfsm; // Currently only affects EFSM output (i.e. -fsm, -dot) and API gen -- doesn't affect model checking - public final boolean fair; - public final boolean noLocalChoiceSubjectCheck; - public final boolean noAcceptCorrelationCheck; - public final boolean noValidation; - public final boolean spin; - - private final JobContext jcontext; // Mutable (Visitor passes replace modules) - - public final AstFactory af; - public final EModelFactory ef; - public final SModelFactory sf; + public final JobConfig config; // Immutable + private final JobContext jcontext; // Mutable (Visitor passes replace modules) private final SGraphBuilderUtil sgbu; // Just take MainContext as arg? -- would need to fix Maven dependencies //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) - public Job(boolean debug, Map parsed, ModuleName main, - boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, - boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin, - AstFactory af, EModelFactory ef, SModelFactory sf) + public Job(Map parsed, JobConfig config) { - //this.jUnit = jUnit; - this.debug = debug; - this.useOldWf = useOldWF; - this.noProgress = noLiveness; - this.minEfsm = minEfsm; - this.fair = fair; - this.noLocalChoiceSubjectCheck = noLocalChoiceSubjectCheck; - this.noAcceptCorrelationCheck = noAcceptCorrelationCheck; - this.noValidation = noValidation; - this.spin = spin; - - this.af = af; - this.ef = ef; - this.sf = sf; - - this.sgbu = sf.newSGraphBuilderUtil(); - - this.jcontext = new JobContext(this, parsed, main); // Single instance per Job and should never be shared + this.config = config; + this.sgbu = config.sf.newSGraphBuilderUtil(); + this.jcontext = new JobContext(this, parsed); // Single instance per Job and should never be shared } // Scribble extensions should override these "new" methods // FIXME: move to MainContext::newJob? public EGraphBuilderUtil newEGraphBuilderUtil() { - return new EGraphBuilderUtil(this.ef); + return new EGraphBuilderUtil(this.config.ef); } //public SGraphBuilderUtil newSGraphBuilderUtil() // FIXME TODO global builder util @@ -151,12 +114,12 @@ public void runUnfoldingPass() throws ScribbleException public void runWellFormednessPasses() throws ScribbleException { - if (!this.noValidation) + if (!this.config.noValidation) { runVisitorPassOnAllModules(WFChoiceChecker.class); // For enabled roles and disjoint enabling messages -- includes connectedness checks runProjectionPasses(); runVisitorPassOnAllModules(ReachabilityChecker.class); // Moved before GlobalModelChecker.class, OK? - if (!this.useOldWf) + if (!this.config.useOldWf) { runVisitorPassOnAllModules(GProtocolValidator.class); } @@ -171,7 +134,7 @@ protected void runProjectionPasses() throws ScribbleException runVisitorPassOnAllModules(Projector.class); runProjectionContextBuildingPasses(); runProjectionUnfoldingPass(); - if (!noAcceptCorrelationCheck) + if (!this.config.noAcceptCorrelationCheck) { runVisitorPassOnParsedModules(ExplicitCorrelationChecker.class); } @@ -185,7 +148,7 @@ protected void runProjectionContextBuildingPasses() throws ScribbleException runVisitorPassOnProjectedModules(ProtocolDeclContextBuilder.class); runVisitorPassOnProjectedModules(RoleCollector.class); // NOTE: doesn't collect from choice subjects (may be invalid until projected choice subjs fixed) runVisitorPassOnProjectedModules(ProjectedChoiceDoPruner.class); - if (!this.noLocalChoiceSubjectCheck) + if (!this.config.noLocalChoiceSubjectCheck) { // Disabling ProjectedChoiceSubjectFixer (local choice subject inference) goes towards a general global WF, but is currently unsound runVisitorPassOnProjectedModules(ProjectedChoiceSubjectFixer.class); // Must come before other passes that need DUMMY role occurrences to be fixed @@ -301,7 +264,7 @@ public JobContext getContext() public boolean isDebug() { - return this.debug; + return this.config.debug; } public void warningPrintln(String s) @@ -311,7 +274,7 @@ public void warningPrintln(String s) public void debugPrintln(String s) { - if (this.debug) + if (this.config.debug) { System.out.println(s); } diff --git a/scribble-core/src/main/java/org/scribble/job/JobConfig.java b/scribble-core/src/main/java/org/scribble/job/JobConfig.java new file mode 100644 index 000000000..e303f5f2b --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/job/JobConfig.java @@ -0,0 +1,64 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.job; + +import org.scribble.ast.AstFactory; +import org.scribble.model.endpoint.EModelFactory; +import org.scribble.model.global.SModelFactory; +import org.scribble.type.name.ModuleName; + +// The "static" (constant) info for Jobs -- cf. JobContext "dynamic" state +public class JobConfig +{ + public final ModuleName main; // Full name + // CHECKME: verbose/debug printing parameter? + + public final boolean debug; + public final boolean useOldWf; + public final boolean noProgress; // TODO: deprecate + public final boolean minEfsm; // Currently only affects EFSM output (i.e. -fsm, -dot) and API gen -- doesn't affect model checking + public final boolean fair; + public final boolean noLocalChoiceSubjectCheck; + public final boolean noAcceptCorrelationCheck; + public final boolean noValidation; + public final boolean spin; + + public final AstFactory af; + public final EModelFactory ef; + public final SModelFactory sf; + + // N.B. MainContext is in a different non-visible (by Maven) package + public JobConfig(boolean debug, ModuleName main, boolean useOldWF, boolean noLiveness, boolean minEfsm, + boolean fair, boolean noLocalChoiceSubjectCheck, + boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin, + AstFactory af, EModelFactory ef, SModelFactory sf) + { + this.main = main; + + //this.jUnit = jUnit; + this.debug = debug; + this.useOldWf = useOldWF; + this.noProgress = noLiveness; + this.minEfsm = minEfsm; + this.fair = fair; + this.noLocalChoiceSubjectCheck = noLocalChoiceSubjectCheck; + this.noAcceptCorrelationCheck = noAcceptCorrelationCheck; + this.noValidation = noValidation; + this.spin = spin; + + this.af = af; + this.ef = ef; + this.sf = sf; + } +} diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext.java b/scribble-core/src/main/java/org/scribble/job/JobContext.java index d67aca2ba..7fbf5c4c4 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/job/JobContext.java @@ -38,9 +38,9 @@ // Mutable: projections, graphs, etc are added mutably later -- replaceModule also mutable setter -- "users" get this from the Job and expect to setter mutate "in place" public class JobContext { - private final Job job; + public final Job job; - public final ModuleName main; // The "main" root module from MainContext + //public final ModuleName main; // The "main" root module from MainContext // Modules that were originally parsed (obtained from MainContext), but may be modified during the Job // ModuleName keys are full module names -- currently the modules read from file, distinguished from the generated projection modules @@ -59,17 +59,17 @@ public class JobContext private final Map minimisedEGraphs = new HashMap<>(); // Toolchain currently depends on single instance of each graph (state id equality), e.g. cannot re-build or re-minimise, would not be the same graph instance // FIXME: currently only minimising "fair" graph, need to consider minimisation orthogonally to fairness -- NO: minimising (of fair) is for API gen only, unfair-transform does not use minimisation (regardless of user flag) for WF - protected JobContext(Job job, Map parsed, ModuleName main) + protected JobContext(Job job, Map parsed)//, ModuleName main) { this.job = job; this.parsed = new HashMap(parsed); - this.main = main; + //this.main = main; } public Module getMainModule() { - return getModule(this.main); + return getModule(this.job.config.main); } // Used by Job for pass running, includes projections (e.g. for reachability checking) @@ -223,7 +223,7 @@ public EGraph getUnfairEGraph(GProtocolName fullname, Role role) throws Scribble EGraph unfair = this.unfairEGraphs.get(fulllpn); if (unfair == null) { - unfair = getEGraph(fullname, role).init.unfairTransform(this.job.ef).toGraph(); + unfair = getEGraph(fullname, role).init.unfairTransform(this.job.config.ef).toGraph(); addUnfairEGraph(fulllpn, unfair); } return unfair; diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java b/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java index 31596920a..9e9b785cd 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java @@ -46,7 +46,7 @@ public AutParser(Job job) public EGraph parse(String aut) { - EModelFactory ef = job.ef; + EModelFactory ef = job.config.ef; //Map> edges = new HashMap<>(); Map> as = new HashMap<>(); diff --git a/scribble-core/src/main/java/org/scribble/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/model/global/SGraphBuilderUtil.java index 5fa5ad421..7b96b33e2 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/model/global/SGraphBuilderUtil.java @@ -73,9 +73,9 @@ public SGraph buildSGraph(Job job, GProtocolName fullname, Map egr SBuffers b0 = new SBuffers(job.ef, efsms.keySet(), !explicit);*/ //SConfig c0 = job.sf.newSConfig(efsms, b0); - SConfig c0 = createInitialSConfig(job.ef, egraphs, explicit); + SConfig c0 = createInitialSConfig(job.config.ef, egraphs, explicit); - SState init = job.sf.newSState(c0); + SState init = job.config.sf.newSState(c0); Map seen = new HashMap<>(); LinkedHashSet todo = new LinkedHashSet<>(); @@ -90,7 +90,7 @@ public SGraph buildSGraph(Job job, GProtocolName fullname, Map egr i.remove(); seen.put(curr.id, curr); - if (job.debug) + if (job.config.debug) { count++; if (count % 50 == 0) @@ -143,7 +143,8 @@ else if (k == EStateKind.UNARY_INPUT || k == EStateKind.POLY_INPUT || k == EStat { if (a.isSend() || a.isReceive() || a.isDisconnect()) { - getNextStates(job.sf, todo, seen, curr, a.toGlobal(job.sf, r), curr.fire(r, a)); + getNextStates(job.config.sf, todo, seen, curr, + a.toGlobal(job.config.sf, r), curr.fire(r, a)); } else if (a.isAccept() || a.isRequest()) { @@ -153,8 +154,12 @@ else if (a.isAccept() || a.isRequest()) { as.remove(d); // Removes one occurrence //getNextStates(seen, todo, curr.sync(r, a, a.peer, d)); - SAction g = (a.isRequest()) ? a.toGlobal(job.sf, r) : d.toGlobal(job.sf, a.peer); // Edge will be drawn as the connect, but should be read as the sync. of both -- something like "r1, r2: sync" may be more consistent (or take a set of actions as the edge label) - getNextStates(job.sf, todo, seen, curr, g, curr.sync(r, a, a.peer, d)); + SAction g = (a.isRequest()) + ? a.toGlobal(job.config.sf, r) + : d.toGlobal(job.config.sf, a.peer); + // Edge will be drawn as the connect, but should be read as the sync. of both -- something like "r1, r2: sync" may be more consistent (or take a set of actions as the edge label) + getNextStates(job.config.sf, todo, seen, curr, g, + curr.sync(r, a, a.peer, d)); } } else if (a.isWrapClient() || a.isWrapServer()) @@ -164,8 +169,10 @@ else if (a.isWrapClient() || a.isWrapServer()) if (as != null && as.contains(w)) { as.remove(w); // Removes one occurrence - SAction g = (a.isRequest()) ? a.toGlobal(job.sf, r) : w.toGlobal(job.sf, a.peer); - getNextStates(job.sf, todo, seen, curr, g, curr.sync(r, a, a.peer, w)); + SAction g = (a.isRequest()) + ? a.toGlobal(job.config.sf, r) + : w.toGlobal(job.config.sf, a.peer); + getNextStates(job.config.sf, todo, seen, curr, g, curr.sync(r, a, a.peer, w)); } } else @@ -176,9 +183,11 @@ else if (a.isWrapClient() || a.isWrapServer()) } } - SGraph graph = job.sf.newSGraph(fullname, seen, init); + SGraph graph = job.config.sf.newSGraph(fullname, seen, init); - job.debugPrintln("(" + fullname + ") Built global model..\n" + graph.init.toDot() + "\n(" + fullname + ") .." + graph.states.size() + " states"); + job.debugPrintln( + "(" + fullname + ") Built global model..\n" + graph.init.toDot() + "\n(" + + fullname + ") .." + graph.states.size() + " states"); return graph; } diff --git a/scribble-core/src/main/java/org/scribble/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/model/global/SModel.java index 964f3b49e..124bd7e30 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/model/global/SModel.java @@ -47,13 +47,14 @@ public void validate(Job job) throws ScribbleException int count = 0; for (SState s : states.values()) { - if (job.debug) + if (job.config.debug) { count++; if (count % 50 == 0) { //job.debugPrintln("(" + this.graph.proto + ") Checking safety: " + count + " states"); - job.debugPrintln("(" + this.graph.proto + ") Checking states: " + count); + job.debugPrintln( + "(" + this.graph.proto + ") Checking states: " + count); } } SStateErrors errors = s.getErrors(); @@ -62,14 +63,15 @@ public void validate(Job job) throws ScribbleException // FIXME: getTrace can get stuck when local choice subjects are disabled List trace = this.graph.getTrace(init, s); // FIXME: getTrace broken on non-det self loops? //errorMsg += "\nSafety violation(s) at " + s.toString() + ":\n Trace=" + trace; - errorMsg += "\nSafety violation(s) at session state " + s.id + ":\n Trace=" + trace; + errorMsg += "\nSafety violation(s) at session state " + s.id + + ":\n Trace=" + trace; } errorMsg = appendSafetyErrorMessages(errorMsg, errors); } job.debugPrintln("(" + this.graph.proto + ") Checked all states: " + count); // May include unsafe states //*/ - if (!job.noProgress) + if (!job.config.noProgress) { //job.debugPrintln("(" + this.graph.proto + ") Checking progress: "); // Incompatible with current errorMsg approach*/ @@ -80,8 +82,10 @@ public void validate(Job job) throws ScribbleException + termset.stream().map((i) -> new Integer(all.get(i).id).toString()).collect(Collectors.joining(","))); // Incompatible with current errorMsg approach*/ Set starved = checkRoleProgress(states, init, termset); - Map> ignored = checkEventualReception(states, init, termset); - errorMsg = appendProgressErrorMessages(errorMsg, starved, ignored, job, states, termset); + Map> ignored = + checkEventualReception(states, init, termset); + errorMsg = appendProgressErrorMessages(errorMsg, starved, ignored, job, + states, termset); } } @@ -93,7 +97,8 @@ public void validate(Job job) throws ScribbleException //job.debugPrintln("(" + this.graph.proto + ") Progress satisfied."); // Also safety... current errorMsg approach } - protected String appendSafetyErrorMessages(String errorMsg, SStateErrors errors) + protected String appendSafetyErrorMessages(String errorMsg, + SStateErrors errors) { if (!errors.stuck.isEmpty()) { @@ -114,35 +119,44 @@ protected String appendSafetyErrorMessages(String errorMsg, SStateErrors errors) return errorMsg; } - protected String appendProgressErrorMessages(String errorMsg, Set starved, Map> ignored, - Job job, Map states, Set termset) + protected String appendProgressErrorMessages(String errorMsg, + Set starved, Map> ignored, Job job, + Map states, Set termset) { if (!starved.isEmpty()) { - errorMsg += "\nRole progress violation for " + starved + " in session state terminal set:\n " + termSetToString(job, termset, states); + errorMsg += "\nRole progress violation for " + starved + + " in session state terminal set:\n " + + termSetToString(job, termset, states); } if (!ignored.isEmpty()) { - errorMsg += "\nEventual reception violation for " + ignored + " in session state terminal set:\n " + termSetToString(job, termset, states); + errorMsg += "\nEventual reception violation for " + ignored + + " in session state terminal set:\n " + + termSetToString(job, termset, states); } return errorMsg; } - protected String termSetToString(Job job, Set termset, Map all) + protected String termSetToString(Job job, Set termset, + Map all) { - return job.debug - ? termset.stream().map((i) -> all.get(i).toString()).collect(Collectors.joining(",")) - : termset.stream().map((i) -> new Integer(all.get(i).id).toString()).collect(Collectors.joining(",")); + return job.config.debug + ? termset.stream().map((i) -> all.get(i).toString()) + .collect(Collectors.joining(",")) + : termset.stream().map((i) -> new Integer(all.get(i).id).toString()) + .collect(Collectors.joining(",")); } // ** Could subsume terminal state check, if terminal sets included size 1 with reflexive reachability (but not a good approach) - protected static Set checkRoleProgress(Map states, SState init, Set termset) throws ScribbleException + protected static Set checkRoleProgress(Map states, + SState init, Set termset) throws ScribbleException { Set starved = new HashSet<>(); Iterator i = termset.iterator(); SState s = states.get(i.next()); Map ss = new HashMap<>(); - s.config.efsms.keySet().forEach((r) -> ss.put(r, s)); + s.config.efsms.keySet().forEach(r -> ss.put(r, s)); while (i.hasNext()) { SState next = states.get(i.next()); @@ -179,7 +193,8 @@ protected static Set checkRoleProgress(Map states, SState { if (!foo.config.canSafelyTerminate(r)) { - if (s.config.buffs.get(r).values().stream().allMatch((v) -> v == null)) + if (s.config.buffs.get(r).values().stream() + .allMatch((v) -> v == null)) { starved.add(r); } @@ -197,12 +212,16 @@ protected static Set checkRoleProgress(Map states, SState } // (eventual reception) - protected static Map> checkEventualReception(Map states, SState init, Set termset) throws ScribbleException + protected static Map> checkEventualReception( + Map states, SState init, Set termset) + throws ScribbleException { - Set roles = states.get(termset.iterator().next()).config.efsms.keySet(); + Set roles = states.get(termset.iterator().next()).config.efsms + .keySet(); Iterator i = termset.iterator(); - Map> b0 = states.get(i.next()).config.buffs.getBuffers(); + Map> b0 = states.get(i.next()).config.buffs + .getBuffers(); while (i.hasNext()) { SState s = states.get(i.next()); diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java index 35a17b701..efeb1788c 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java @@ -78,8 +78,9 @@ public ScribNode visit(ScribNode parent, ScribNode child) if (env.subjs.isEmpty()) // Prune check { // Supports singleton case - return this.job.af.LProtocolBlock(lb.getSource(), this.job.af - .LInteractionSeq(lis.getSource(), ins.subList(1, ins.size()))); + return this.job.config.af.LProtocolBlock(lb.getSource(), + this.job.config.af.LInteractionSeq(lis.getSource(), + ins.subList(1, ins.size()))); } } } diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java b/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java index 3dbb80744..fa458d0e9 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java @@ -64,7 +64,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) } } - if (this.job.useOldWf) + if (this.job.config.useOldWf) { if (child instanceof Choice) // Only needed for old WF (for distinct enabling message checking) // FIXME: maybe move connectedness checking to a separate pass, i.e. vanilla UnfoldingVisitor (if retained as syntactic check) { diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java index 77edef5fc..bd4859c5b 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java @@ -24,32 +24,7 @@ import org.scribble.ast.Module; import org.scribble.ast.ScribNode; import org.scribble.parser.scribble.ScribbleAntlrConstants.AntlrNodeType; -import org.scribble.parser.scribble.ast.AntlrDataTypeDecl; -import org.scribble.parser.scribble.ast.AntlrImportModule; -import org.scribble.parser.scribble.ast.AntlrMessageSig; -import org.scribble.parser.scribble.ast.AntlrMessageSigDecl; -import org.scribble.parser.scribble.ast.AntlrModuleDecl; -import org.scribble.parser.scribble.ast.AntlrNonRoleArgList; -import org.scribble.parser.scribble.ast.AntlrNonRoleParamDecl; -import org.scribble.parser.scribble.ast.AntlrNonRoleParamDeclList; import org.scribble.parser.scribble.ast.AntlrPayloadElemList; -import org.scribble.parser.scribble.ast.AntlrRoleArg; -import org.scribble.parser.scribble.ast.AntlrRoleArgList; -import org.scribble.parser.scribble.ast.AntlrRoleDecl; -import org.scribble.parser.scribble.ast.AntlrRoleDeclList; -import org.scribble.parser.scribble.ast.global.AntlrGChoice; -import org.scribble.parser.scribble.ast.global.AntlrGConnect; -import org.scribble.parser.scribble.ast.global.AntlrGContinue; -import org.scribble.parser.scribble.ast.global.AntlrGDisconnect; -import org.scribble.parser.scribble.ast.global.AntlrGDo; -import org.scribble.parser.scribble.ast.global.AntlrGInteractionSequence; -import org.scribble.parser.scribble.ast.global.AntlrGMessageTransfer; -import org.scribble.parser.scribble.ast.global.AntlrGProtocolBlock; -import org.scribble.parser.scribble.ast.global.AntlrGProtocolDecl; -import org.scribble.parser.scribble.ast.global.AntlrGProtocolDefinition; -import org.scribble.parser.scribble.ast.global.AntlrGProtocolHeader; -import org.scribble.parser.scribble.ast.global.AntlrGRecursion; -import org.scribble.parser.scribble.ast.global.AntlrGWrap; import org.scribble.util.ScribParserException; // ANTLR CommonTree -> ScribNode From 332e54c9ca1f510532dc1d4e73f7b10d3c6f04e3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 6 Feb 2019 23:15:11 +0000 Subject: [PATCH 092/539] Continued WIP. --- .../java/org/scribble/main/MainContext.java | 24 ++++---- .../scribble/del/global/GProtocolDeclDel.java | 5 +- .../src/main/java/org/scribble/job/Job.java | 56 ++++++++++++++----- .../java/org/scribble/job/JobContext.java | 40 ++++++++++--- .../main/java/org/scribble/lang/Protocol.java | 14 +++-- .../org/scribble/lang/global/GProtocol.java | 6 +- 6 files changed, 104 insertions(+), 41 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/main/MainContext.java b/scribble-cli/src/main/java/org/scribble/main/MainContext.java index f482587dd..2790938a1 100644 --- a/scribble-cli/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-cli/src/main/java/org/scribble/main/MainContext.java @@ -12,7 +12,6 @@ * the License. */ package org.scribble.main; // N.B. the same package is declared in core - // FIXME? should be in core org.scribble.main, but currently here due to Maven dependency restrictions import java.io.File; import java.nio.file.Path; @@ -51,6 +50,10 @@ // Resource and ResourceLocator should be made abstract from (file)paths (cf. use of toPath in ScribbleModuleLoader) public class MainContext { + + // HERE FIXME: refactor constructors/init + + // Only "manually" used here for loading main module (which should be factored out to front end) -- otherwise, only used within loader protected final ScribbleAntlrWrapper antlrParser = newAntlrParser(); // Not encapsulated inside ScribbleParser, because ScribbleParser's main function is to "parse" ANTLR CommonTrees into ModelNodes protected final AntlrToScribParser scribParser = newScribParser(); @@ -167,13 +170,12 @@ private void init( this.config = new JobConfig(debug, main, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin, this.af, this.ef, this.sf); - Map tmp = this.parsed.entrySet().stream() - .collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue().right)); + Map parsed = getParsedModules(); Map map = new HashMap<>(); for (ModuleName fullname : this.parsed.keySet()) { Pair e = this.parsed.get(fullname); - map.put(fullname, new ModuleContext(tmp, e.right)); + map.put(fullname, new ModuleContext(parsed, e.right)); } this.mctxts = Collections.unmodifiableMap(map); } @@ -181,7 +183,7 @@ private void init( // A Scribble extension should override these "new" methods as appropriate. public Job newJob() { - return new Job(this.getParsedModules(), this.config); + return new Job(this.getParsedModules(), this.mctxts, this.config); } protected ScribbleAntlrWrapper newAntlrParser() @@ -228,12 +230,6 @@ private void loadAllModules(Pair module) } } - public Map getParsedModules() - { - return this.parsed.entrySet().stream() - .collect(Collectors.toMap(Entry::getKey, e -> e.getValue().right)); - } - // Hacky? But not Scribble tool's job to check nested directory location of module fully corresponds to the fullname of module? Cf. Java classes private void checkMainModuleName(Path mainpath, Module main, boolean noValidation) throws ScribbleException @@ -255,4 +251,10 @@ private void checkMainModuleName(Path mainpath, Module main, boolean noValidatio } } } + + private Map getParsedModules() + { + return this.parsed.entrySet().stream() + .collect(Collectors.toMap(Entry::getKey, e -> e.getValue().right)); + } } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 145bee39d..83d1a5d97 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -73,10 +73,13 @@ public GProtocol translate(ScribNode n, GTypeTranslator t) throws ScribbleException { GProtocolDecl source = (GProtocolDecl) n; + Module mod = (Module) n.getParent(); + GProtocolName fullname = new GProtocolName(mod.getFullModuleName(), + source.getHeaderChild().getDeclName()); List roles = source.getRoles(); GSeq body = (GSeq) source.getDefChild().getBlockChild() .getInteractSeqChild().visitWith(t); - return new GProtocol(source, roles, body); + return new GProtocol(source, fullname, roles, body); } @Override diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 7408f204b..bf886e839 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -15,12 +15,17 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; +import java.util.Collections; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import org.scribble.ast.Module; +import org.scribble.ast.context.ModuleContext; +import org.scribble.ast.global.GProtocolDecl; import org.scribble.del.local.LProtocolDeclDel; +import org.scribble.lang.global.GType; +import org.scribble.lang.global.GTypeTranslator; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EGraphBuilderUtil; import org.scribble.model.global.SGraph; @@ -49,6 +54,8 @@ // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models public class Job { + private final Map mctxts; // CHECKME: constant? move to JobConfig? + public final JobConfig config; // Immutable private final JobContext jcontext; // Mutable (Visitor passes replace modules) @@ -56,27 +63,31 @@ public class Job // Just take MainContext as arg? -- would need to fix Maven dependencies //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) - public Job(Map parsed, JobConfig config) + public Job(Map parsed, + Map mctxts, JobConfig config) { + this.mctxts = Collections.unmodifiableMap(mctxts); this.config = config; this.sgbu = config.sf.newSGraphBuilderUtil(); this.jcontext = new JobContext(this, parsed); // Single instance per Job and should never be shared } // Scribble extensions should override these "new" methods - // FIXME: move to MainContext::newJob? + // CHECKME: move to MainContext::newJob? public EGraphBuilderUtil newEGraphBuilderUtil() { return new EGraphBuilderUtil(this.config.ef); } //public SGraphBuilderUtil newSGraphBuilderUtil() // FIXME TODO global builder util - public SGraph buildSGraph(GProtocolName fullname, Map egraphs, boolean explicit) throws ScribbleException + public SGraph buildSGraph(GProtocolName fullname, Map egraphs, + boolean explicit) throws ScribbleException { for (Role r : egraphs.keySet()) { // FIXME: refactor - debugPrintln("(" + fullname + ") Building global model using EFSM for " + r + ":\n" + egraphs.get(r).init.toDot()); + debugPrintln("(" + fullname + ") Building global model using EFSM for " + + r + ":\n" + egraphs.get(r).init.toDot()); } //return SGraph.buildSGraph(this, fullname, createInitialSConfig(this, egraphs, explicit)); return this.sgbu.buildSGraph(this, fullname, egraphs, explicit); // FIXME: factor out util @@ -96,6 +107,17 @@ public void runContextBuildingPasses() throws ScribbleException runVisitorPassOnAllModules(ProtocolDeclContextBuilder.class); //..which this pass depends on. This pass basically builds protocol dependency info runVisitorPassOnAllModules(DelegationProtocolRefChecker.class); // Must come after ProtocolDeclContextBuilder runVisitorPassOnAllModules(RoleCollector.class); // Actually, this is the second part of protocoldecl context building + + GTypeTranslator t = new GTypeTranslator(this); + for (ModuleName name : this.jcontext.getFullModuleNames()) + { + Module mod = this.jcontext.getModule(name); + for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) + { + GType g = gpd.visitWith(t); + System.out.println("\n" + gpd + "\n" + g); HERE toString + } + } System.out.println("fff1: " + this.jcontext.getMainModule()); @@ -165,15 +187,17 @@ protected void runProjectionUnfoldingPass() throws ScribbleException // Pre: checkWellFormedness // Returns: full proto name -> Module - public Map getProjections(GProtocolName fullname, Role role) throws ScribbleException + public Map getProjections(GProtocolName fullname, + Role role) throws ScribbleException { Module root = this.jcontext.getProjection(fullname, role); - Map> dependencies = - ((LProtocolDeclDel) root.getLProtoDeclChildren().get(0).del()) - .getProtocolDeclContext().getDependencyMap().getDependencies().get(role); + Map> dependencies = ((LProtocolDeclDel) root + .getLProtoDeclChildren().get(0).del()).getProtocolDeclContext() + .getDependencyMap().getDependencies().get(role); // Can ignore Set for projections (is singleton), as each projected proto is a dependency only for self (implicit in the protocoldecl) return dependencies.keySet().stream().collect( - Collectors.toMap((lpn) -> lpn, (lpn) -> this.jcontext.getModule(lpn.getPrefix()))); + Collectors.toMap(lpn -> lpn, + (lpn) -> this.jcontext.getModule(lpn.getPrefix()))); } /*public Map generateSessionApi(GProtocolName fullname) throws ScribbleException @@ -212,26 +236,30 @@ public Map generateStateChannelApi(GProtocolName fullname, Role } return api; }*/ - - public void runVisitorPassOnAllModules(Class c) throws ScribbleException + + public void runVisitorPassOnAllModules(Class c) + throws ScribbleException { debugPrintPass("Running " + c + " on all modules:"); runVisitorPass(this.jcontext.getFullModuleNames(), c); } - public void runVisitorPassOnParsedModules(Class c) throws ScribbleException + public void runVisitorPassOnParsedModules(Class c) + throws ScribbleException { debugPrintPass("Running " + c + " on parsed modules:"); runVisitorPass(this.jcontext.getParsedFullModuleNames(), c); } - public void runVisitorPassOnProjectedModules(Class c) throws ScribbleException + public void runVisitorPassOnProjectedModules(Class c) + throws ScribbleException { debugPrintPass("Running " + c + " on projected modules:"); runVisitorPass(this.jcontext.getProjectedFullModuleNames(), c); } - private void runVisitorPass(Set modnames, Class c) throws ScribbleException + private void runVisitorPass(Set modnames, + Class c) throws ScribbleException { try { diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext.java b/scribble-core/src/main/java/org/scribble/job/JobContext.java index 7fbf5c4c4..b643f9dd6 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/job/JobContext.java @@ -23,6 +23,7 @@ import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; +import org.scribble.lang.global.GType; import org.scribble.model.endpoint.AutParser; import org.scribble.model.endpoint.EGraph; import org.scribble.model.global.SGraph; @@ -49,6 +50,9 @@ public class JobContext // Projected (i.e., created) modules // LProtocolName is the full local protocol name (module name is the prefix) private final Map projected = new HashMap<>(); + + // "Directly" translated global protos, i.e., separate proto decls without any inlining/unfolding/etc + private final Map core = new HashMap<>(); // Keys are full names private final Map fairEGraphs = new HashMap<>(); private final Map fairSGraphs = new HashMap<>(); @@ -91,7 +95,8 @@ public Set getParsedFullModuleNames() public Set getProjectedFullModuleNames() { - return this.projected.keySet().stream().map(lpn -> lpn.getPrefix()).collect(Collectors.toSet()); + return this.projected.keySet().stream().map(lpn -> lpn.getPrefix()) + .collect(Collectors.toSet()); } /*public boolean hasModule(ModuleName fullname) @@ -118,8 +123,9 @@ public Module getModule(ModuleName fullname) } else if (isProjectedModule(fullname)) { - return this.projected.get( - this.projected.keySet().stream().filter((lpn) -> lpn.getPrefix().equals(fullname)).collect(Collectors.toList()).get(0)); + return this.projected.get(this.projected.keySet().stream() + .filter(lpn -> lpn.getPrefix().equals(fullname)) + .collect(Collectors.toList()).get(0)); } else { @@ -144,6 +150,16 @@ else if (isProjectedModule(fullname)) } } + public void addTranslation(GProtocolName fullname, GType g) + { + this.core.put(fullname, g); + } + + public GType getTranslation(GProtocolName fullname) + { + return this.core.get(fullname); + } + // Make context immutable? (will need to assign updated context back to Job) -- will also need to do for Module replacing public void addProjections(Map> projections) { @@ -175,17 +191,22 @@ public void addProjections(Map> projections) private void addProjection(Module mod) { - LProtocolName lpn = (LProtocolName) mod.getProtoDeclChildren().get(0).getFullMemberName(mod); + LProtocolName lpn = (LProtocolName) mod.getProtoDeclChildren().get(0) + .getFullMemberName(mod); this.projected.put(lpn, mod); } - public Module getProjection(GProtocolName fullname, Role role) throws ScribbleException + public Module getProjection(GProtocolName fullname, Role role) + throws ScribbleException { - Module proj = this.projected.get(Projector.projectFullProtocolName(fullname, role)); + Module proj = this.projected + .get(Projector.projectFullProtocolName(fullname, role)); if (proj == null) { - throw new ScribbleException("Projection not found: " + fullname + ", " + role); // E.g. disamb/enabling error before projection passes (e.g. CommandLine -fsm arg) - // FIXME: should not occur any more + throw new ScribbleException( + "Projection not found: " + fullname + ", " + role); + // E.g. disamb/enabling error before projection passes (e.g. CommandLine -fsm arg) + // CHECKME: should not occur any more } return proj; } @@ -195,7 +216,8 @@ protected void addEGraph(LProtocolName fullname, EGraph graph) this.fairEGraphs.put(fullname, graph); } - public EGraph getEGraph(GProtocolName fullname, Role role) throws ScribbleException + public EGraph getEGraph(GProtocolName fullname, Role role) + throws ScribbleException { LProtocolName fulllpn = Projector.projectFullProtocolName(fullname, role); // Moved form LProtocolDecl diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index fb574712b..189e46fcb 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -5,19 +5,23 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; public abstract class Protocol extends SessTypeBase implements SessType { + public final ProtocolName name; public final List roles; // Ordered role params; pre: size >= 2 - //public final List> params; // CHECKME - public final Seq body; + //public final List> params; // TODO + public final Seq body; // CHECKME: take "? extends Seq" as generic param? - public Protocol(ProtocolDecl source, List roles, //List params, + public Protocol(ProtocolDecl source, ProtocolName fullname, + List roles, // List params, Seq body) { super(source); + this.name = fullname; this.roles = Collections.unmodifiableList(roles); this.body = body; } @@ -27,6 +31,7 @@ public int hashCode() { int hash = 7; hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.name.hashCode(); hash = 31 * hash + this.roles.hashCode(); hash = 31 * hash + this.body.hashCode(); return hash; @@ -45,7 +50,8 @@ public boolean equals(Object o) } Protocol them = (Protocol) o; return super.equals(this) // Does canEquals - && this.roles.equals(them.roles) && this.body.equals(them.body); + && this.name.equals(them.name) && this.roles.equals(them.roles) + && this.body.equals(them.body); } } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index 62e6c2db5..56075ec09 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -5,14 +5,16 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.lang.Protocol; import org.scribble.type.kind.Global; +import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; public class GProtocol extends Protocol implements GType { - public GProtocol(GProtocolDecl source, List roles, //List params, + public GProtocol(GProtocolDecl source, GProtocolName fullname, + List roles, // List params, GSeq body) { - super(source, roles, body); + super(source, fullname, roles, body); } @Override From 48ba1b1916d19c448e820d0fbfe5772bf03979ca Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 7 Feb 2019 16:56:47 +0000 Subject: [PATCH 093/539] Continued WIP. --- .../java/org/scribble/ast/name/NameNode.java | 2 +- .../src/main/java/org/scribble/job/Job.java | 24 ++++++++----- .../java/org/scribble/job/JobContext.java | 24 +++++++++---- .../main/java/org/scribble/lang/Choice.java | 22 +++++++++--- .../src/main/java/org/scribble/lang/Do.java | 26 +++++++++++--- .../org/scribble/lang/MessageTransfer.java | 10 ++++++ .../main/java/org/scribble/lang/Protocol.java | 31 +++++++++++++---- .../src/main/java/org/scribble/lang/Seq.java | 17 ++++++++-- .../main/java/org/scribble/lang/SessType.java | 7 ++-- .../java/org/scribble/lang/SessTypeBase.java | 11 +++--- .../org/scribble/lang/global/GChoice.java | 30 ++++++++++++++-- .../java/org/scribble/lang/global/GDo.java | 29 ++++++++++++++-- .../lang/global/GMessageTransfer.java | 17 +++++++++- .../org/scribble/lang/global/GProtocol.java | 34 +++++++++++++++++-- .../java/org/scribble/lang/global/GSeq.java | 31 +++++++++++++++-- .../java/org/scribble/lang/global/GType.java | 7 ++-- 16 files changed, 267 insertions(+), 55 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java index 37bb8b8e8..e589f17ea 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java @@ -80,7 +80,7 @@ protected String[] getPrefixElements() return new String[0]; } List names = getSimpleNameList(); - return names.subList(1, names.size()).toArray(new String[0]); + return names.subList(0, names.size()-1).toArray(new String[0]); } protected String getLastElement() diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index bf886e839..3776009b9 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -24,7 +24,7 @@ import org.scribble.ast.context.ModuleContext; import org.scribble.ast.global.GProtocolDecl; import org.scribble.del.local.LProtocolDeclDel; -import org.scribble.lang.global.GType; +import org.scribble.lang.global.GProtocol; import org.scribble.lang.global.GTypeTranslator; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EGraphBuilderUtil; @@ -96,7 +96,7 @@ public SGraph buildSGraph(GProtocolName fullname, Map egraphs, public void checkWellFormedness() throws ScribbleException { runContextBuildingPasses(); - runUnfoldingPass(); + //runUnfoldingPass(); runWellFormednessPasses(); } @@ -108,20 +108,26 @@ public void runContextBuildingPasses() throws ScribbleException runVisitorPassOnAllModules(DelegationProtocolRefChecker.class); // Must come after ProtocolDeclContextBuilder runVisitorPassOnAllModules(RoleCollector.class); // Actually, this is the second part of protocoldecl context building + // FIXME TODO: refactor into a runVisitorPassOnAllModules for SimpleVisitor (and add operation to ModuleDel) GTypeTranslator t = new GTypeTranslator(this); - for (ModuleName name : this.jcontext.getFullModuleNames()) + for (ModuleName fullname : this.jcontext.getFullModuleNames()) { - Module mod = this.jcontext.getModule(name); + Module mod = this.jcontext.getModule(fullname); for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) { - GType g = gpd.visitWith(t); - System.out.println("\n" + gpd + "\n" + g); HERE toString + GProtocol g = (GProtocol) gpd.visitWith(t); + this.jcontext.addIntermediate(g.getFullName(), g); + System.out.println("\nparsed:\n" + gpd + "\nintermed:\n" + g); + + GProtocol inlined = g.getInlined(this); + System.out.println("inlined:\n" + inlined); + this.jcontext.addInlined(inlined.getFullName(), inlined); } } System.out.println("fff1: " + this.jcontext.getMainModule()); - runVisitorPassOnAllModules(ProtocolDefInliner.class); + //runVisitorPassOnAllModules(ProtocolDefInliner.class); System.out.println("fff2: " + this.jcontext.getMainModule()); @@ -136,7 +142,7 @@ public void runUnfoldingPass() throws ScribbleException public void runWellFormednessPasses() throws ScribbleException { - if (!this.config.noValidation) + /*if (!this.config.noValidation) { runVisitorPassOnAllModules(WFChoiceChecker.class); // For enabled roles and disjoint enabling messages -- includes connectedness checks runProjectionPasses(); @@ -145,7 +151,7 @@ public void runWellFormednessPasses() throws ScribbleException { runVisitorPassOnAllModules(GProtocolValidator.class); } - } + }*/ } // Due to Projector not being a subprotocol visitor, so "external" subprotocols may not be visible in ModuleContext building for the projections of the current root Module diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext.java b/scribble-core/src/main/java/org/scribble/job/JobContext.java index b643f9dd6..7ad8bb383 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/job/JobContext.java @@ -23,7 +23,7 @@ import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.lang.global.GType; +import org.scribble.lang.global.GProtocol; import org.scribble.model.endpoint.AutParser; import org.scribble.model.endpoint.EGraph; import org.scribble.model.global.SGraph; @@ -52,7 +52,8 @@ public class JobContext private final Map projected = new HashMap<>(); // "Directly" translated global protos, i.e., separate proto decls without any inlining/unfolding/etc - private final Map core = new HashMap<>(); // Keys are full names + private final Map intermed = new HashMap<>(); // Keys are full names (though GProtocol already includes full name) + private final Map inlined = new HashMap<>(); // Keys are full names (though GProtocol already includes full name) private final Map fairEGraphs = new HashMap<>(); private final Map fairSGraphs = new HashMap<>(); @@ -150,14 +151,25 @@ else if (isProjectedModule(fullname)) } } - public void addTranslation(GProtocolName fullname, GType g) + // TODO rename better + public void addIntermediate(GProtocolName fullname, GProtocol g) { - this.core.put(fullname, g); + this.intermed.put(fullname, g); } - public GType getTranslation(GProtocolName fullname) + public GProtocol getIntermediate(GProtocolName fullname) { - return this.core.get(fullname); + return this.intermed.get(fullname); + } + + public void addInlined(GProtocolName fullname, GProtocol g) + { + this.inlined.put(fullname, g); + } + + public GProtocol getInlined(GProtocolName fullname) + { + return this.inlined.get(fullname); } // Make context immutable? (will need to assign updated context back to Job) -- will also need to do for Module replacing diff --git a/scribble-core/src/main/java/org/scribble/lang/Choice.java b/scribble-core/src/main/java/org/scribble/lang/Choice.java index 1bbe75831..fbc021dc4 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Choice.java +++ b/scribble-core/src/main/java/org/scribble/lang/Choice.java @@ -2,25 +2,37 @@ import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.Role; -public abstract class Choice extends SessTypeBase - implements SessType +public abstract class Choice> + extends SessTypeBase implements SessType { public final Role subj; - public final List> blocks; // Pre: size > 0 + public final List blocks; // Pre: size > 0 // CHECKME: rename? public Choice(org.scribble.ast.Choice source, Role subj, - List> blocks) + List blocks) { super(source); this.subj = subj; this.blocks = Collections.unmodifiableList(blocks); } + public abstract Choice reconstruct(org.scribble.ast.Choice source, Role subj, + List blocks); + + @Override + public String toString() + { + return "choice at " + this.subj + " " + + this.blocks.stream().map(x -> "{\n" + x.toString() + "\n}") + .collect(Collectors.joining(" or ")); + } + @Override public int hashCode() { @@ -42,7 +54,7 @@ public boolean equals(Object o) { return false; } - Choice them = (Choice) o; + Choice them = (Choice) o; return super.equals(this) // Does canEquals && this.subj.equals(them.subj) && this.blocks.equals(them.blocks); } diff --git a/scribble-core/src/main/java/org/scribble/lang/Do.java b/scribble-core/src/main/java/org/scribble/lang/Do.java index d6175214b..fd8aa27ba 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Do.java +++ b/scribble-core/src/main/java/org/scribble/lang/Do.java @@ -2,27 +2,43 @@ import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; -public abstract class Do extends SessTypeBase - implements SessType +public abstract class Do> + extends SessTypeBase implements SessType { + public final N proto; public final List roles; // Ordered role args; pre: size > 1 //public final List args; // CHECKME - public Do(org.scribble.ast.Do source, List roles) + public Do(org.scribble.ast.Do source, N proto, + List roles) { super(source); + this.proto = proto; this.roles = Collections.unmodifiableList(roles); } + public abstract Do reconstruct(org.scribble.ast.Do source, + N proto, List roles); + + @Override + public String toString() + { + return "do " + this.proto + "(" + this.roles.stream().map(x -> x.toString()) + .collect(Collectors.joining(", ")) + ");"; + } + @Override public int hashCode() { int hash = 193; hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.proto.hashCode(); hash = 31 * hash + this.roles.hashCode(); return hash; } @@ -38,8 +54,8 @@ public boolean equals(Object o) { return false; } - Do them = (Do) o; + Do them = (Do) o; return super.equals(this) // Does canEquals - && this.roles.equals(them.roles); + && this.proto.equals(them.proto) && this.roles.equals(them.roles); } } diff --git a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java index c790ac54e..b84657d62 100644 --- a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java @@ -20,6 +20,16 @@ public MessageTransfer(org.scribble.ast.MessageTransfer source, Role src, this.dst = dst; } + public abstract MessageTransfer reconstruct( + org.scribble.ast.MessageTransfer source, Role src, Message msg, + Role dst); + + @Override + public String toString() + { + return this.msg + " from " + this.src + " to " + this.dst + ";"; + } + @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index 189e46fcb..3c98b2a8d 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -2,23 +2,24 @@ import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import org.scribble.ast.ProtocolDecl; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; -public abstract class Protocol extends SessTypeBase - implements SessType +public abstract class Protocol, B extends Seq> + extends SessTypeBase { - public final ProtocolName name; + public final N name; public final List roles; // Ordered role params; pre: size >= 2 //public final List> params; // TODO - public final Seq body; // CHECKME: take "? extends Seq" as generic param? + public final B body; // CHECKME: take "? extends Seq" as generic param? - public Protocol(ProtocolDecl source, ProtocolName fullname, + public Protocol(ProtocolDecl source, N fullname, List roles, // List params, - Seq body) + B body) { super(source); this.name = fullname; @@ -26,6 +27,22 @@ public Protocol(ProtocolDecl source, ProtocolName fullname, this.body = body; } + public abstract Protocol reconstruct(ProtocolDecl source, + N fullname, List roles, B body); + + public N getFullName() + { + return this.name; + } + + @Override + public String toString() + { + return " protocol " + this.name + "(" + this.roles.stream() + .map(x -> x.toString()).collect(Collectors.joining(", ")) + ")" + + " {\n" + this.body + "\n}"; + } + @Override public int hashCode() { @@ -48,7 +65,7 @@ public boolean equals(Object o) { return false; } - Protocol them = (Protocol) o; + Protocol them = (Protocol) o; return super.equals(this) // Does canEquals && this.name.equals(them.name) && this.roles.equals(them.roles) && this.body.equals(them.body); diff --git a/scribble-core/src/main/java/org/scribble/lang/Seq.java b/scribble-core/src/main/java/org/scribble/lang/Seq.java index 1f86df23c..7288e3a97 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Seq.java +++ b/scribble-core/src/main/java/org/scribble/lang/Seq.java @@ -2,20 +2,31 @@ import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import org.scribble.ast.InteractionSeq; import org.scribble.type.kind.ProtocolKind; -public abstract class Seq extends SessTypeBase - implements SessType +public abstract class Seq + extends SessTypeBase { - public final List> elems; + public final List> elems; // GType or LType public Seq(InteractionSeq source, List> elems) { super(source); this.elems = Collections.unmodifiableList(elems); } + + public abstract Seq reconstruct(InteractionSeq source, + List> elems); + + @Override + public String toString() + { + return this.elems.stream().map(x -> x.toString()) + .collect(Collectors.joining("\n")); + } @Override public int hashCode() diff --git a/scribble-core/src/main/java/org/scribble/lang/SessType.java b/scribble-core/src/main/java/org/scribble/lang/SessType.java index d25147d8d..d379896d2 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SessType.java +++ b/scribble-core/src/main/java/org/scribble/lang/SessType.java @@ -1,6 +1,7 @@ package org.scribble.lang; -import org.scribble.ast.ScribNodeBase; +import org.scribble.ast.ProtocolKindNode; +import org.scribble.job.Job; import org.scribble.type.kind.ProtocolKind; // CHECKME: move to type.sess? @@ -8,7 +9,9 @@ public interface SessType { boolean hasSource(); // i.e., was parsed - ScribNodeBase getSource(); // Pre: hasSource + ProtocolKindNode getSource(); // Pre: hasSource + + SessType getInlined(Job job); // Call this using: them.canEquals(this) boolean canEquals(Object o); diff --git a/scribble-core/src/main/java/org/scribble/lang/SessTypeBase.java b/scribble-core/src/main/java/org/scribble/lang/SessTypeBase.java index 812b9c4d6..71e12ebe5 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SessTypeBase.java +++ b/scribble-core/src/main/java/org/scribble/lang/SessTypeBase.java @@ -1,14 +1,15 @@ package org.scribble.lang; -import org.scribble.ast.ScribNodeBase; +import org.scribble.ast.ProtocolKindNode; import org.scribble.type.kind.ProtocolKind; // SessTypeBase is to SessType as ScribNodeBase is to ScribNode -public abstract class SessTypeBase implements SessType +public abstract class SessTypeBase + implements SessType { - private final ScribNodeBase source; + private final ProtocolKindNode source; - public SessTypeBase(ScribNodeBase source) + public SessTypeBase(ProtocolKindNode source) { this.source = source; } @@ -21,7 +22,7 @@ public boolean hasSource() // Pre: hasSource @Override - public ScribNodeBase getSource() + public ProtocolKindNode getSource() { return this.source; } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java index 4f0ff2086..ad5817f6a 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -1,18 +1,44 @@ package org.scribble.lang.global; import java.util.List; +import java.util.stream.Collectors; +import org.scribble.job.Job; import org.scribble.lang.Choice; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; -public class GChoice extends Choice implements GType +public class GChoice extends Choice implements GType { - public GChoice(org.scribble.ast.global.GChoice source, Role subj, + public GChoice(org.scribble.ast.Choice source, Role subj, List blocks) { super(source, subj, blocks); } + + @Override + public GChoice reconstruct(org.scribble.ast.Choice source, Role subj, + List blocks) + { + return new GChoice(source, subj, blocks); + } + + @Override + public GChoice getInlined(Job job) + { + org.scribble.ast.global.GChoice source = + (org.scribble.ast.global.GChoice) getSource(); + // CHECKME: or empty source? + List collect = this.blocks.stream().map(x -> x.getInlined(job)) + .collect(Collectors.toList()); + return new GChoice(source, this.subj, collect); + } + + @Override + public org.scribble.ast.global.GChoice getSource() + { + return (org.scribble.ast.global.GChoice) super.getSource(); + } @Override public int hashCode() diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index 440d0e98c..190a4558b 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -2,15 +2,37 @@ import java.util.List; +import org.scribble.job.Job; import org.scribble.lang.Do; import org.scribble.type.kind.Global; +import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; -public class GDo extends Do implements GType +public class GDo extends Do implements GType { - public GDo(org.scribble.ast.global.GDo source, List roles) + public GDo(org.scribble.ast.Do source, GProtocolName proto, + List roles) { - super(source, roles); + super(source, proto, roles); + } + + @Override + public GDo reconstruct(org.scribble.ast.Do source, + GProtocolName proto, List roles) + { + return new GDo(source, proto, roles); + } + + @Override + public GType getInlined(Job job) + { + throw new RuntimeException("TODO"); + } + + @Override + public org.scribble.ast.global.GDo getSource() + { + return (org.scribble.ast.global.GDo) super.getSource(); } @Override @@ -41,3 +63,4 @@ public boolean canEquals(Object o) return o instanceof GDo; } } + diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java index def9a011f..16a575091 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java @@ -1,5 +1,6 @@ package org.scribble.lang.global; +import org.scribble.job.Job; import org.scribble.lang.MessageTransfer; import org.scribble.type.Message; import org.scribble.type.kind.Global; @@ -9,11 +10,25 @@ public class GMessageTransfer extends MessageTransfer implements GType { - public GMessageTransfer(org.scribble.ast.global.GMessageTransfer source, + public GMessageTransfer(org.scribble.ast.MessageTransfer source, Role src, Message msg, Role dst) { super(source, src, msg, dst); } + + @Override + public GMessageTransfer reconstruct( + org.scribble.ast.MessageTransfer source, Role src, Message msg, + Role dst) + { + return new GMessageTransfer(source, src, msg, dst); + } + + @Override + public GType getInlined(Job job) + { + return this; + } @Override public int hashCode() diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index 56075ec09..adee92da9 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -2,21 +2,51 @@ import java.util.List; +import org.scribble.ast.ProtocolDecl; import org.scribble.ast.global.GProtocolDecl; +import org.scribble.job.Job; import org.scribble.lang.Protocol; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; -public class GProtocol extends Protocol implements GType +public class GProtocol extends + Protocol implements GType { - public GProtocol(GProtocolDecl source, GProtocolName fullname, + public GProtocol(ProtocolDecl source, GProtocolName fullname, List roles, // List params, GSeq body) { super(source, fullname, roles, body); } + @Override + public GProtocol reconstruct(ProtocolDecl source, + GProtocolName fullname, List roles, GSeq body) + { + return new GProtocol(source, fullname, roles, body); + } + + @Override + public GProtocol getInlined(Job job) + { + GProtocolDecl source = getSource(); // CHECKME: or empty source? + GSeq body = (GSeq) this.body.getInlined(job); + return reconstruct(source, getFullName(), this.roles, body); + } + + @Override + public GProtocolDecl getSource() + { + return (GProtocolDecl) super.getSource(); + } + + @Override + public String toString() + { + return "global" + super.toString(); + } + @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java index 9f027dfca..81b948e8c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -1,18 +1,45 @@ package org.scribble.lang.global; import java.util.List; +import java.util.stream.Collectors; +import org.scribble.ast.InteractionSeq; import org.scribble.ast.global.GInteractionSeq; +import org.scribble.job.Job; import org.scribble.lang.Seq; +import org.scribble.lang.SessType; import org.scribble.type.kind.Global; -public class GSeq extends Seq implements GType +public class GSeq extends Seq + implements GType { // GInteractionSeq or GBlock better as source? - public GSeq(GInteractionSeq source, List elems) + public GSeq(InteractionSeq source, List> elems) { super(source, elems); } + + @Override + public GSeq reconstruct(InteractionSeq source, + List> elems) + { + return new GSeq(source, elems); + } + + @Override + public GSeq getInlined(Job job) + { + GInteractionSeq source = getSource(); // CHECKME: or empty source? + List> elems = this.elems.stream() + .map(x -> x.getInlined(job)).collect(Collectors.toList()); + return reconstruct(source, elems); + } + + @Override + public GInteractionSeq getSource() + { + return (GInteractionSeq) super.getSource(); + } @Override public int hashCode() diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GType.java b/scribble-core/src/main/java/org/scribble/lang/global/GType.java index 13a2380f8..7e63f988c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GType.java @@ -1,9 +1,12 @@ package org.scribble.lang.global; +import org.scribble.job.Job; import org.scribble.lang.SessType; import org.scribble.type.kind.Global; -public interface GType extends SessType +public interface GType + extends SessType { - + @Override + GType getInlined(Job job); } From 6f5ee484564bb3ab356a366968701b29ae4dd515 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 7 Feb 2019 19:22:53 +0000 Subject: [PATCH 094/539] Continued WIP. --- .../java/org/scribble/ast/DelDecorator.java | 14 +++-- .../org/scribble/ast/DelDecoratorImpl.java | 52 +++++++++++-------- .../java/org/scribble/ast/InteractionSeq.java | 1 + .../org/scribble/del/global/GChoiceDel.java | 18 +++++++ .../del/global/GProtocolBlockDel.java | 11 +++- .../scribble/del/global/GProtocolDeclDel.java | 3 +- .../org/scribble/lang/global/GChoice.java | 3 +- .../scribble/visit/wf/WFChoiceChecker.java | 6 +-- .../org/scribble/parser/antlr/Scribble.g | 19 ++++--- .../parser/scribble/ScribTreeAdaptor.java | 18 ++++++- scribble-test/src/test/scrib/tmp/Test.scr | 10 +++- 11 files changed, 112 insertions(+), 43 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java b/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java index 0bbff1622..fd2bc5b19 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java @@ -14,12 +14,16 @@ package org.scribble.ast; import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.global.GChoice; +import org.scribble.ast.global.GContinue; +import org.scribble.ast.global.GDo; import org.scribble.ast.global.GInteractionSeq; import org.scribble.ast.global.GMessageTransfer; import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.global.GProtocolDef; import org.scribble.ast.global.GProtocolHeader; +import org.scribble.ast.global.GRecursion; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.qualified.LProtocolNameNode; @@ -59,11 +63,11 @@ public interface DelDecorator void GMessageTransfer(GMessageTransfer gmt); /*GConnect GConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest); GDisconnect GDisconnect(CommonTree source, RoleNode src, RoleNode dest); - GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest); - GChoice GChoice(CommonTree source, RoleNode subj, List blocks); - GRecursion GRecursion(CommonTree source, RecVarNode recvar, GProtocolBlock block); - GContinue GContinue(CommonTree source, RecVarNode recvar); - GDo GDo(CommonTree source, RoleArgList roles, NonRoleArgList args, GProtocolNameNode proto);*/ + GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest);*/ + void GChoice(GChoice gc); + void GRecursion(GRecursion gr); + void GContinue(GContinue gc); + void GDo(GDo gd); void MessageSigNode(MessageSigNode n); void PayloadElemList(PayloadElemList pay); diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java index 2a36d908f..5c32631e3 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java @@ -16,12 +16,16 @@ import java.util.List; import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.global.GChoice; +import org.scribble.ast.global.GContinue; +import org.scribble.ast.global.GDo; import org.scribble.ast.global.GInteractionSeq; import org.scribble.ast.global.GMessageTransfer; import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.global.GProtocolDef; import org.scribble.ast.global.GProtocolHeader; +import org.scribble.ast.global.GRecursion; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.qualified.LProtocolNameNode; @@ -37,11 +41,15 @@ import org.scribble.del.RoleDeclDel; import org.scribble.del.RoleDeclListDel; import org.scribble.del.ScribDel; +import org.scribble.del.global.GChoiceDel; +import org.scribble.del.global.GContinueDel; +import org.scribble.del.global.GDoDel; import org.scribble.del.global.GInteractionSeqDel; import org.scribble.del.global.GMessageTransferDel; import org.scribble.del.global.GProtocolBlockDel; import org.scribble.del.global.GProtocolDeclDel; import org.scribble.del.global.GProtocolDefDel; +import org.scribble.del.global.GRecursionDel; import org.scribble.del.name.DataTypeNodeDel; import org.scribble.del.name.MessageSigNameNodeDel; import org.scribble.del.name.RecVarNodeDel; @@ -119,11 +127,19 @@ public void decorate(CommonTree n) break; /*case GLOBALCONNECT: return AntlrGConnect.parseGConnect(this, ct, af); case GLOBALDISCONNECT: return AntlrGDisconnect.parseGDisconnect(this, ct, af); - case GLOBALCHOICE: return AntlrGChoice.parseGChoice(this, ct, af); - case GLOBALRECURSION: return AntlrGRecursion.parseGRecursion(this, ct, af); - case GLOBALCONTINUE: return AntlrGContinue.parseGContinue(this, ct, af); - case GLOBALDO: return AntlrGDo.parseGDo(this, ct, af); case GLOBALWRAP: return AntlrGWrap.parseGWrap(this, ct, af);*/ + case "GLOBALCHOICE": + GChoice((GChoice) n); + break; + case "GLOBALRECURSION": + GRecursion((GRecursion) n); + break; + case "GLOBALCONTINUE": + GContinue((GContinue) n); + break; + case "GLOBALDO": + GDo((GDo) n); + break; case "ROLENAME": RoleNode((RoleNode) n); @@ -286,39 +302,31 @@ public GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest) GWrap gw = new GWrap(source, UnitMessageSigNode(), src, dest); gw = setDel(gw, new GWrapDel()); return gw; - } + }*/ @Override - public GChoice GChoice(CommonTree source, RoleNode subj, List blocks) + public void GChoice(GChoice gc) { - GChoice gc = new GChoice(source, subj, blocks); - gc = setDel(gc, new GChoiceDel()); - return gc; + setDel(gc, new GChoiceDel()); } @Override - public GRecursion GRecursion(CommonTree source, RecVarNode recvar, GProtocolBlock block) + public void GRecursion(GRecursion gr) { - GRecursion gr = new GRecursion(source, recvar, block); - gr = setDel(gr, new GRecursionDel()); - return gr; + setDel(gr, new GRecursionDel()); } @Override - public GContinue GContinue(CommonTree source, RecVarNode recvar) + public void GContinue(GContinue gc) { - GContinue gc = new GContinue(source, recvar); - gc = setDel(gc, new GContinueDel()); - return gc; + setDel(gc, new GContinueDel()); } @Override - public GDo GDo(CommonTree source, RoleArgList roleinstans, NonRoleArgList arginstans, GProtocolNameNode proto) + public void GDo(GDo gd) { - GDo gd = new GDo(source, roleinstans, arginstans, proto); - gd = setDel(gd, new GDoDel()); - return gd; - }*/ + setDel(gd, new GDoDel()); + } @Override public void MessageSigNode(MessageSigNode mn) diff --git a/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java b/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java index a97bdf5b4..3041c28a8 100644 --- a/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java +++ b/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java @@ -89,6 +89,7 @@ public ScribNode visitChildren(AstVisitor nv) throws ScribbleException @Override public String toString() { + System.out.println("ttt: " + getChildren()); return getInteractNodeChildren().stream().map(i -> i.toString()) .collect(Collectors.joining("\n")); } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java index 236744343..a96e8fd92 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -14,6 +14,7 @@ package org.scribble.del.global; import java.util.Collections; +import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -27,6 +28,8 @@ import org.scribble.del.ChoiceDel; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; +import org.scribble.lang.global.GSeq; +import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; import org.scribble.visit.ProtocolDefInliner; @@ -38,6 +41,21 @@ public class GChoiceDel extends ChoiceDel implements GCompoundInteractionNodeDel { + + @Override + public org.scribble.lang.global.GChoice translate(ScribNode n, + GTypeTranslator t) throws ScribbleException + { + GChoice source = (GChoice) n; + Role subj = source.getSubjectChild().toName(); + List blocks = new LinkedList<>(); + for (GProtocolBlock b : source.getBlockChildren()) + { + blocks.add((GSeq) b.visitWith(t)); + } + return new org.scribble.lang.global.GChoice(source, subj, blocks); + } + @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java index c8e8fe5d1..ee1486b60 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java @@ -21,13 +21,22 @@ import org.scribble.del.ProtocolBlockDel; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; +import org.scribble.lang.global.GSeq; +import org.scribble.lang.global.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.context.env.ProjectionEnv; import org.scribble.visit.env.InlineProtocolEnv; -public class GProtocolBlockDel extends ProtocolBlockDel +public class GProtocolBlockDel extends ProtocolBlockDel implements GDel { + + @Override + public GSeq translate(ScribNode n, GTypeTranslator t) + throws ScribbleException + { + return (GSeq) ((GProtocolBlock) n).getInteractSeqChild().visitWith(t); + } @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 83d1a5d97..8b56dd3c9 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -77,8 +77,7 @@ public GProtocol translate(ScribNode n, GTypeTranslator t) GProtocolName fullname = new GProtocolName(mod.getFullModuleName(), source.getHeaderChild().getDeclName()); List roles = source.getRoles(); - GSeq body = (GSeq) source.getDefChild().getBlockChild() - .getInteractSeqChild().visitWith(t); + GSeq body = (GSeq) source.getDefChild().getBlockChild().visitWith(t); return new GProtocol(source, fullname, roles, body); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java index ad5817f6a..1507fc93b 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -27,8 +27,7 @@ public GChoice reconstruct(org.scribble.ast.Choice source, Role subj, public GChoice getInlined(Job job) { org.scribble.ast.global.GChoice source = - (org.scribble.ast.global.GChoice) getSource(); - // CHECKME: or empty source? + (org.scribble.ast.global.GChoice) getSource(); // CHECKME: or empty source? List collect = this.blocks.stream().map(x -> x.getInlined(job)) .collect(Collectors.toList()); return new GChoice(source, this.subj, collect); diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java b/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java index fa458d0e9..18d0c6cff 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java @@ -28,12 +28,12 @@ import org.scribble.visit.wf.env.WFChoiceEnv; // Note: now only used for choice subject and enabled checking -// FIXME: refactor as distinct enabling messages checker (cf. GChoiceDel, WFChoicePathChecker) +// TODO: refactor as distinct enabling messages checker (cf. GChoiceDel, WFChoicePathChecker) public class WFChoiceChecker extends UnfoldingVisitor { // N.B. using pointer equality for checking if choice previously visited // So UnfoldingVisitor cannot visit a clone - // equals method identity not suitable unless Ast nodes record additional info like syntactic position + // equals method identity not suitable unless AST nodes record additional info like syntactic position private Set> visited = new HashSet<>(); public WFChoiceChecker(Job job) @@ -60,7 +60,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) GProtocolDecl gpd = (GProtocolDecl) child; if (gpd.isAux()) { - return child; // bypass aux protocols // FIXME: integrate bypass functionality into made enter/visit/leave pattern + return child; // bypass aux protocols // TODO: integrate bypass functionality into made enter/visit/leave pattern } } diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index fc3090e47..ac612a200 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -177,6 +177,7 @@ tokens ROLENAME = 'ROLENAME'; ID = 'ID'; OPNAME = 'OPNAME'; + RECURSIONVAR = 'RECURSIONVAR'; } @@ -724,9 +725,9 @@ globalwrap: * Section 3.7.5 Global Choice */ globalchoice: - CHOICE_KW AT_KW rolename globalprotocolblock (OR_KW globalprotocolblock)* + CHOICE_KW AT_KW rolenamenode globalprotocolblock (OR_KW globalprotocolblock)* -> - ^(GLOBALCHOICE rolename globalprotocolblock+) + ^(GLOBALCHOICE rolenamenode globalprotocolblock+) ; @@ -734,15 +735,21 @@ globalchoice: * Section 3.7.6 Global Recursion */ globalrecursion: - REC_KW recursionvarname globalprotocolblock + REC_KW recursionvarnamenode globalprotocolblock -> - ^(GLOBALRECURSION recursionvarname globalprotocolblock) + ^(GLOBALRECURSION recursionvarnamenode globalprotocolblock) +; + +recursionvarnamenode: + recursionvarname +-> + ^(RECURSIONVAR recursionvarname) ; globalcontinue: - CONTINUE_KW recursionvarname ';' + CONTINUE_KW recursionvarnamenode ';' -> - ^(GLOBALCONTINUE recursionvarname) + ^(GLOBALCONTINUE recursionvarnamenode) ; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 95d4f096d..e497175c5 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -10,16 +10,21 @@ import org.scribble.ast.RoleDecl; import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScribNil; +import org.scribble.ast.global.GChoice; +import org.scribble.ast.global.GContinue; +import org.scribble.ast.global.GDo; import org.scribble.ast.global.GInteractionSeq; import org.scribble.ast.global.GMessageTransfer; import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.global.GProtocolDef; import org.scribble.ast.global.GProtocolHeader; +import org.scribble.ast.global.GRecursion; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.ast.name.simple.OpNode; +import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; // get/setType don't seem to be really used @@ -88,11 +93,22 @@ public Object create(Token t) return new GProtocolDef(t); case "GLOBALPROTOCOLBLOCK": //return this.f.GProtocolBlock(empty, null); return new GProtocolBlock(t); - case "GLOBALINTERACTIONSEQUENCE": //return this.f.GInteractionSeq(empty, Collections.emptyList()); return new GInteractionSeq(t); + case "GLOBALMESSAGETRANSFER": //return this.f.GMessageTransfer(empty, null, null, Collections.emptyList()); return new GMessageTransfer(t); + case "GLOBALCHOICE": + return new GChoice(t); + case "GLOBALRECURSION": + return new GRecursion(t); + case "GLOBALCONTINUE": + return new GContinue(t); + case "GLOBALDO": + return new GDo(t); + case "RECURSIONVAR": + return new RecVarNode(t); + case "MESSAGESIGNATURE": //return this.f.Me return new MessageSigNode(t); case "OPNAME": diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 2ba7dd46b..1e02a2a20 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -36,7 +36,15 @@ module tmp.Test; global protocol Proto1(role A, role B) { - 1() from A to B; + choice at A + { + 1() from A to B; + } + or + { + 2() from A to B; + 3() from B to A; + } } From 91d07c1419a95c19ce7dd8386e5b98ab65d2d0d4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 7 Feb 2019 19:57:42 +0000 Subject: [PATCH 095/539] Continued WIP. --- .../org/scribble/ast/DelDecoratorImpl.java | 14 ++-- .../java/org/scribble/ast/ProtocolHeader.java | 2 + .../org/scribble/del/global/GContinueDel.java | 12 ++++ .../java/org/scribble/del/global/GDel.java | 1 - .../scribble/del/global/GRecursionDel.java | 14 ++++ .../main/java/org/scribble/lang/Continue.java | 50 ++++++++++++++ .../java/org/scribble/lang/Recursion.java | 53 +++++++++++++++ .../org/scribble/lang/global/GChoice.java | 5 +- .../org/scribble/lang/global/GContinue.java | 63 ++++++++++++++++++ .../java/org/scribble/lang/global/GDo.java | 4 +- .../org/scribble/lang/global/GRecursion.java | 65 +++++++++++++++++++ .../java/org/scribble/lang/global/GSeq.java | 2 +- .../java/org/scribble/type/name/RecVar.java | 1 + scribble-test/src/test/scrib/tmp/Test.scr | 18 +++-- 14 files changed, 286 insertions(+), 18 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/lang/Continue.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/Recursion.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/global/GContinue.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java index 5c32631e3..8a1018fe8 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java @@ -101,6 +101,9 @@ public void decorate(CommonTree n) case "GLOBALPROTOCOLHEADER": GProtocolHeader((GProtocolHeader) n); break; + case "GPROTOCOLNAME": + GProtocolNameNode((GProtocolNameNode) n); + break; case "GLOBALPROTOCOLDEF": GProtocolDef((GProtocolDef) n); break; @@ -144,6 +147,9 @@ public void decorate(CommonTree n) case "ROLENAME": RoleNode((RoleNode) n); break; + case "RECURSIONVAR": + RecVarNode((RecVarNode) n); + break; case "OPNAME": OpNode((OpNode) n); break; @@ -414,15 +420,15 @@ else if (kind.equals(RoleKind.KIND)) }*/ @Override - public void RecVarNode(RecVarNode rv) + public void RoleNode(RoleNode r) { - setDel(rv, new RecVarNodeDel()); + setDel(r, new RoleNodeDel()); } @Override - public void RoleNode(RoleNode r) + public void RecVarNode(RecVarNode rv) { - setDel(r, new RoleNodeDel()); + setDel(rv, new RecVarNodeDel()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java index b64f19f1e..8653b9285 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java @@ -74,6 +74,8 @@ public ProtocolHeader reconstruct(ProtocolNameNode name, @Override public ProtocolHeader visitChildren(AstVisitor nv) throws ScribbleException { + /*ProtocolNameNode nameNodeChild = (ProtocolNameNode) visitChild( + getNameNodeChild(), nv);*/ // Don't really need to visit, and can avoid generic cast RoleDeclList rdl = (RoleDeclList) visitChild(getRoleDeclListChild(), nv); NonRoleParamDeclList pdl = (NonRoleParamDeclList) visitChild(getParamDeclListChild(), nv); diff --git a/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java b/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java index aae5c6a42..efe7c5916 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java @@ -19,12 +19,24 @@ import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.ContinueDel; import org.scribble.job.ScribbleException; +import org.scribble.lang.global.GTypeTranslator; +import org.scribble.type.name.RecVar; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.env.InlineProtocolEnv; public class GContinueDel extends ContinueDel implements GSimpleInteractionNodeDel { + + @Override + public org.scribble.lang.global.GContinue translate(ScribNode n, + GTypeTranslator t) throws ScribbleException + { + GContinue source = (GContinue) n; + RecVar recvar = source.getRecVarChild().toName(); + return new org.scribble.lang.global.GContinue(source, recvar); + } + @Override public GContinue leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDel.java index 07a3affd5..ac1fbf659 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDel.java @@ -21,7 +21,6 @@ public interface GDel extends ScribDel { - // FIXME: remove default default GType translate(ScribNode n, GTypeTranslator t) throws ScribbleException { diff --git a/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java b/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java index 0e88e59cc..ad5101245 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java @@ -21,6 +21,9 @@ import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.RecursionDel; import org.scribble.job.ScribbleException; +import org.scribble.lang.global.GSeq; +import org.scribble.lang.global.GTypeTranslator; +import org.scribble.type.name.RecVar; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.context.env.ProjectionEnv; @@ -30,6 +33,17 @@ public class GRecursionDel extends RecursionDel implements GCompoundInteractionNodeDel { + + @Override + public org.scribble.lang.global.GRecursion translate(ScribNode n, + GTypeTranslator t) throws ScribbleException + { + GRecursion source = (GRecursion) n; + RecVar recvar = source.getRecVarChild().toName(); + GSeq block = (GSeq) source.getBlockChild().visitWith(t); + return new org.scribble.lang.global.GRecursion(source, recvar, block); + } + @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException diff --git a/scribble-core/src/main/java/org/scribble/lang/Continue.java b/scribble-core/src/main/java/org/scribble/lang/Continue.java new file mode 100644 index 000000000..8f24206b0 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/Continue.java @@ -0,0 +1,50 @@ +package org.scribble.lang; + +import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.RecVar; + +public abstract class Continue + extends SessTypeBase implements SessType +{ + public final RecVar recvar; + + public Continue(org.scribble.ast.Continue source, RecVar recvar) + { + super(source); + this.recvar = recvar; + } + + public abstract Continue reconstruct( + org.scribble.ast.Continue source, RecVar recvar); + + @Override + public String toString() + { + return "continue " + this.recvar + ";"; + } + + @Override + public int hashCode() + { + int hash = 3217; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.recvar.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof Continue)) + { + return false; + } + Continue them = (Continue) o; + return super.equals(this) // Does canEquals + && this.recvar.equals(them.recvar); + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/Recursion.java b/scribble-core/src/main/java/org/scribble/lang/Recursion.java new file mode 100644 index 000000000..0f3d6cd2f --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/Recursion.java @@ -0,0 +1,53 @@ +package org.scribble.lang; + +import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.RecVar; + +public abstract class Recursion> + extends SessTypeBase implements SessType +{ + public final RecVar recvar; + public final B body; + + public Recursion(org.scribble.ast.Recursion source, RecVar recvar, B body) + { + super(source); + this.recvar = recvar; + this.body = body; + } + + public abstract Recursion reconstruct( + org.scribble.ast.Recursion source, RecVar recvar, B body); + + @Override + public String toString() + { + return "rec " + this.recvar + " {" + this.body + "}"; + } + + @Override + public int hashCode() + { + int hash = 1487; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.recvar.hashCode(); + hash = 31 * hash + this.body.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof Recursion)) + { + return false; + } + Recursion them = (Recursion) o; + return super.equals(this) // Does canEquals + && this.recvar.equals(them.recvar) && this.body.equals(them.body); + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java index 1507fc93b..5ebb3b1bc 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -42,9 +42,8 @@ public org.scribble.ast.global.GChoice getSource() @Override public int hashCode() { - int hash = 1487; - hash = 31 * hash + this.subj.hashCode(); - hash = 31 * hash + this.blocks.hashCode(); + int hash = 3067; + hash = 31 * hash + super.hashCode(); return hash; } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java new file mode 100644 index 000000000..edfde132d --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java @@ -0,0 +1,63 @@ +package org.scribble.lang.global; + +import org.scribble.job.Job; +import org.scribble.lang.Continue; +import org.scribble.type.kind.Global; +import org.scribble.type.name.RecVar; + +public class GContinue extends Continue implements GType +{ + public GContinue(org.scribble.ast.Continue source, RecVar recvar) + { + super(source, recvar); + } + + @Override + public GContinue reconstruct(org.scribble.ast.Continue source, + RecVar recvar) + { + return new GContinue(source, recvar); + } + + @Override + public GContinue getInlined(Job job) + { + org.scribble.ast.global.GContinue source = + (org.scribble.ast.global.GContinue) getSource(); // CHECKME: or empty source? + return new GContinue(source, this.recvar); + } + + @Override + public org.scribble.ast.global.GContinue getSource() + { + return (org.scribble.ast.global.GContinue) super.getSource(); + } + + @Override + public int hashCode() + { + int hash = 3457; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof GContinue)) + { + return false; + } + return super.equals(o); + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof GContinue; + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index 190a4558b..4bbb33439 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -38,8 +38,8 @@ public org.scribble.ast.global.GDo getSource() @Override public int hashCode() { - int hash = 193; - hash = 31 * hash + this.roles.hashCode(); + int hash = 1303; + hash = 31 * hash + super.hashCode(); return hash; } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java new file mode 100644 index 000000000..c962f6291 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java @@ -0,0 +1,65 @@ +package org.scribble.lang.global; + +import org.scribble.job.Job; +import org.scribble.lang.Recursion; +import org.scribble.type.kind.Global; +import org.scribble.type.name.RecVar; + +public class GRecursion extends Recursion implements GType +{ + public GRecursion(org.scribble.ast.Recursion source, RecVar recvar, + GSeq body) + { + super(source, recvar, body); + } + + @Override + public GRecursion reconstruct(org.scribble.ast.Recursion source, + RecVar recvar, GSeq block) + { + return new GRecursion(source, recvar, block); + } + + @Override + public GRecursion getInlined(Job job) + { + org.scribble.ast.global.GRecursion source = + (org.scribble.ast.global.GRecursion) getSource(); // CHECKME: or empty source? + GSeq body = this.body.getInlined(job); + return new GRecursion(source, this.recvar, body); + } + + @Override + public org.scribble.ast.global.GRecursion getSource() + { + return (org.scribble.ast.global.GRecursion) super.getSource(); + } + + @Override + public int hashCode() + { + int hash = 2309; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof GRecursion)) + { + return false; + } + return super.equals(o); + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof GRecursion; + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java index 81b948e8c..ca93c7c1f 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -45,7 +45,7 @@ public GInteractionSeq getSource() public int hashCode() { int hash = 29; - hash = 31 * hash + this.elems.hashCode(); + hash = 31 * hash + super.hashCode(); return hash; } diff --git a/scribble-core/src/main/java/org/scribble/type/name/RecVar.java b/scribble-core/src/main/java/org/scribble/type/name/RecVar.java index b69f8cde7..da419d06d 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/RecVar.java +++ b/scribble-core/src/main/java/org/scribble/type/name/RecVar.java @@ -15,6 +15,7 @@ import org.scribble.type.kind.RecVarKind; +// CHECKME: RecVar inconsistent with, e.g., G/LProtocolName? public class RecVar extends AbstractName //implements PathElement { private static final long serialVersionUID = 1L; diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 1e02a2a20..355060b39 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -36,14 +36,18 @@ module tmp.Test; global protocol Proto1(role A, role B) { - choice at A - { - 1() from A to B; - } - or + rec X { - 2() from A to B; - 3() from B to A; + choice at A + { + 1() from A to B; + } + or + { + 2() from A to B; + 3() from B to A; + continue X; + } } } From 483c2d4f731f11bddfcf65450d803e67cf05d946 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 9 Feb 2019 19:18:29 +0000 Subject: [PATCH 096/539] Continued WIP. --- .../java/org/scribble/cli/CommandLine.java | 22 ++++---- .../callbackapi/CBEndpointApiGenerator.java | 2 +- .../callbackapi/CBEndpointApiGenerator2.java | 8 +-- .../callbackapi/CBEndpointApiGenerator3.java | 8 +-- .../java/sessionapi/SessionApiGenerator.java | 4 +- .../java/statechanapi/ScribSockGen.java | 2 +- .../StateChannelApiGenerator.java | 4 +- .../ioifaces/IOInterfacesGenerator.java | 2 +- .../java/org/scribble/ast/AstFactoryImpl.java | 11 ++-- .../java/org/scribble/ast/DelDecorator.java | 10 ++-- .../org/scribble/ast/DelDecoratorImpl.java | 45 ++++++++-------- .../src/main/java/org/scribble/ast/Do.java | 7 +-- .../src/main/java/org/scribble/ast/DoArg.java | 2 +- .../main/java/org/scribble/ast/DoArgList.java | 3 +- .../java/org/scribble/ast/global/GDo.java | 2 +- .../main/java/org/scribble/ast/local/LDo.java | 2 +- .../ast/name/qualified/GProtocolNameNode.java | 3 +- .../java/org/scribble/del/DoArgListDel.java | 2 +- .../src/main/java/org/scribble/del/DoDel.java | 29 +++++++++-- .../main/java/org/scribble/del/ModuleDel.java | 4 +- .../del/global/GDelegationElemDel.java | 6 +-- .../java/org/scribble/del/global/GDoDel.java | 25 ++++++++- .../scribble/del/global/GProtocolDeclDel.java | 6 +-- .../java/org/scribble/del/local/LDoDel.java | 2 +- .../src/main/java/org/scribble/job/Job.java | 51 ++++++++++--------- .../scribble/lang/global/GTypeTranslator.java | 5 +- .../visit/InlinedProtocolUnfolder.java | 2 +- .../scribble/visit/ProtocolDefInliner.java | 4 +- .../org/scribble/visit/SimpleVisitor.java | 12 ++++- .../scribble/visit/SubprotocolVisitor.java | 4 +- .../context/ProjectedChoiceDoPruner.java | 2 +- .../visit/wf/ExplicitCorrelationChecker.java | 2 +- .../org/scribble/parser/antlr/Scribble.g | 26 ++++++---- .../parser/scribble/ScribTreeAdaptor.java | 12 +++++ scribble-test/src/test/scrib/tmp/Test.scr | 5 +- 35 files changed, 211 insertions(+), 125 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index b78e71064..ceba56a59 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -287,7 +287,7 @@ protected void doNonAttemptableOutputTasks(Job job) private void printProjections(Job job) throws CommandLineException, ScribbleException { - JobContext jcontext = job.getContext(); + JobContext jcontext = job.getJobContext(); String[] args = this.args.get(CLArgFlag.PROJECT); for (int i = 0; i < args.length; i += 2) { @@ -306,7 +306,7 @@ private void printProjections(Job job) private void printEGraph(Job job, boolean forUser, boolean fair) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); + JobContext jcontext = job.getJobContext(); String[] args = forUser ? this.args.get(CLArgFlag.EFSM) : (fair @@ -327,7 +327,7 @@ private void printEGraph(Job job, boolean forUser, boolean fair) private void drawEGraph(Job job, boolean forUser, boolean fair) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); + JobContext jcontext = job.getJobContext(); String[] args = forUser ? this.args.get(CLArgFlag.EFSM_PNG) : (fair @@ -348,7 +348,7 @@ private EGraph getEGraph(Job job, GProtocolName fullname, Role role, boolean forUser, boolean fair) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); + JobContext jcontext = job.getJobContext(); GProtocolDecl gpd = (GProtocolDecl) jcontext.getMainModule() .getProtocolDeclChild(fullname.getSimpleName()); if (gpd == null || !gpd.getHeaderChild().getRoleDeclListChild().getRoles() @@ -382,7 +382,7 @@ private EGraph getEGraph(Job job, GProtocolName fullname, Role role, private void printSGraph(Job job, boolean fair) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); + JobContext jcontext = job.getJobContext(); String[] args = fair ? this.args.get(CLArgFlag.SGRAPH) : this.args.get(CLArgFlag.UNFAIR_SGRAPH); @@ -400,7 +400,7 @@ private void printSGraph(Job job, boolean fair) private void drawSGraph(Job job, boolean fair) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); + JobContext jcontext = job.getJobContext(); String[] args = fair ? this.args.get(CLArgFlag.SGRAPH_PNG) : this.args.get(CLArgFlag.UNFAIR_SGRAPH_PNG); @@ -416,7 +416,7 @@ private void drawSGraph(Job job, boolean fair) private static SGraph getSGraph(Job job, GProtocolName fullname, boolean fair) throws ScribbleException { - JobContext jcontext = job.getContext(); + JobContext jcontext = job.getJobContext(); SGraph model = fair ? jcontext.getSGraph(fullname) : jcontext.getUnfairSGraph(fullname); @@ -431,7 +431,7 @@ private static SGraph getSGraph(Job job, GProtocolName fullname, boolean fair) private void outputEndpointApi(Job job) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); + JobContext jcontext = job.getJobContext(); String[] args = this.args.get(CLArgFlag.API_GEN); JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // FIXME: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) @@ -449,7 +449,7 @@ private void outputEndpointApi(Job job) private void outputSessionApi(Job job) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); + JobContext jcontext = job.getJobContext(); String[] args = this.args.get(CLArgFlag.SESS_API_GEN); JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // TODO: refactor (generalise -- use new API) for (String fullname : args) @@ -463,7 +463,7 @@ private void outputSessionApi(Job job) private void outputStateChannelApi(Job job) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); + JobContext jcontext = job.getJobContext(); String[] args = this.args.get(CLArgFlag.SCHAN_API_GEN); JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // TODO: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) @@ -479,7 +479,7 @@ private void outputStateChannelApi(Job job) private void outputEventDrivenApi(Job job) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); + JobContext jcontext = job.getJobContext(); String[] args = this.args.get(CLArgFlag.ED_API_GEN); /*JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // FIXME: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 971f525be..f81beec92 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -66,7 +66,7 @@ public Map buildSessionApi() throws ScribbleException // FIXME: public Map buildEndpointClass() throws ScribbleException { - JobContext jc = this.job.getContext(); + JobContext jc = this.job.getJobContext(); EState init = (this.job.config.minEfsm ? jc.getMinimisedEGraph(this.proto, this.self) : jc.getEGraph(this.proto, this.self) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java index 24f5e5f9b..4ca2a655d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java @@ -92,7 +92,7 @@ public Map buildEndpointClass() throws ScribbleException { Map res = new HashMap<>(); - JobContext jc = this.job.getContext(); + JobContext jc = this.job.getJobContext(); EState init = (this.job.config.minEfsm ? jc.getMinimisedEGraph(this.proto, this.self) : jc.getEGraph(this.proto, this.self) @@ -208,7 +208,7 @@ public Map buildEndpointClass() throws ScribbleException messageAbstract.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); res.put(mprefix + messageAbstractName + ".java", messageAbstract.build()); - Module main = this.job.getContext().getMainModule(); + Module main = this.job.getJobContext().getMainModule(); Map messageClasses = new HashMap<>(); // A class per Payload for this state for (EAction a : s.getAllActions()) { @@ -447,7 +447,7 @@ String generateMessageInterface(EState s, String messageIfName, String endpoint MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) { return (MessageSigNameDecl) - this.job.getContext().getMainModule().getNonProtoDeclChildren().stream() // FIXME: main module? + this.job.getJobContext().getMainModule().getNonProtoDeclChildren().stream() // FIXME: main module? .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(mid.toString())) .iterator().next(); } @@ -490,7 +490,7 @@ String generateMessageClass(boolean isSig, String messageName, EState s, else { int i = 1; - Module main = this.job.getContext().getMainModule(); + Module main = this.job.getJobContext().getMainModule(); for (PayloadElemType pet : a.payload.elems) { DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pet); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 3af9985dc..574b1d6a5 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -82,7 +82,7 @@ public Map buildEndpointClass() throws ScribbleException { Map res = new HashMap<>(); - JobContext jc = this.job.getContext(); + JobContext jc = this.job.getJobContext(); EState init = (this.job.config.minEfsm ? jc.getMinimisedEGraph(this.proto, this.self) : jc.getEGraph(this.proto, this.self) @@ -469,7 +469,7 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, protected String generateStateClass(EState s, String rootPack, EStateKind kind, String stateName, String endpointName) { - Module main = this.job.getContext().getMainModule(); + Module main = this.job.getJobContext().getMainModule(); String stateKind; switch (kind) @@ -960,7 +960,7 @@ protected String getMessagesPackage(String rootPack) protected MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) { return (MessageSigNameDecl) - this.job.getContext().getMainModule().getNonProtoDeclChildren().stream() // FIXME: main module? + this.job.getJobContext().getMainModule().getNonProtoDeclChildren().stream() // FIXME: main module? .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(mid.toString())) .iterator().next(); } @@ -968,7 +968,7 @@ protected MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) //protected final Function, String> getExtName = e -> protected String getExtName(PayloadElemType e) { - String extName = this.job.getContext().getMainModule().getDataTypeDeclChild((DataType) e).extName; + String extName = this.job.getJobContext().getMainModule().getDataTypeDeclChild((DataType) e).extName; return (extName.indexOf(".") != -1) ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) : extName; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index 78d208d53..a4d2f7925 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -181,7 +181,7 @@ private void addSingletonConstant(ClassBuilder cb, String subpack, String type) private void constructOpClasses() throws ScribbleException { - Module mod = this.job.getContext().getModule(this.gpn.getPrefix()); + Module mod = this.job.getJobContext().getModule(this.gpn.getPrefix()); GProtocolName simpname = this.gpn.getSimpleName(); GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDeclChild(simpname); MessageIdCollector coll = new MessageIdCollector(this.job, ((ModuleDel) mod.del()).getModuleContext()); @@ -197,7 +197,7 @@ private void constructOpClasses() throws ScribbleException private void constructRoleClasses() throws ScribbleException { - Module mod = this.job.getContext().getModule(this.gpn.getPrefix()); + Module mod = this.job.getJobContext().getModule(this.gpn.getPrefix()); GProtocolName simpname = this.gpn.getSimpleName(); GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDeclChild(simpname); for (Role r : gpd.getRoles()) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java index c2f526783..b156183da 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java @@ -153,7 +153,7 @@ protected void addInitialStateConstructor() mb.addBodyLine(SESSIONENDPOINT_PARAM + ".init();"); mb.addBodyLine(ClassBuilder.RETURN + " " + ClassBuilder.NEW + " " + this.root + "(" + SESSIONENDPOINT_PARAM + ");");*/ - GProtocolDecl gpd = (GProtocolDecl) this.apigen.getJob().getContext().getModule(this.apigen.gpn.getPrefix()).getProtocolDeclChild(this.apigen.gpn.getSimpleName()); + GProtocolDecl gpd = (GProtocolDecl) this.apigen.getJob().getJobContext().getModule(this.apigen.gpn.getPrefix()).getProtocolDeclChild(this.apigen.gpn.getSimpleName()); String epClass = gpd.isExplicit() ? EXPLICITENDPOINT_CLASS : MPSTENDPOINT_CLASS; ConstructorBuilder ctor2 = cb.newConstructor(epClass + "<" + sess + ", " + role + "> " + SESSIONENDPOINT_PARAM); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 11fceb52c..53642476c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -64,7 +64,7 @@ public StateChannelApiGenerator(Job job, GProtocolName fullname, Role self) this.self = self; this.lpn = Projector.projectFullProtocolName(fullname, self); //this.init = job.getContext().getEndpointGraph(fullname, self).init; - JobContext jc = job.getContext(); + JobContext jc = job.getJobContext(); this.init = job.config.minEfsm ? jc.getMinimisedEGraph(fullname, self).init : jc.getEGraph(fullname, self).init; @@ -209,7 +209,7 @@ protected EState getInitialState() protected Module getMainModule() { - return this.job.getContext().getMainModule(); + return this.job.getJobContext().getMainModule(); } protected void addTypeDecl(TypeBuilder tb) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index 9d29a01e5..5a2ea388d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -79,7 +79,7 @@ public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) GProtocolName fullname = apigen.getGProtocolName(); Role self = getSelf(); //EndpointState init = this.job.getContext().getEndpointGraph(fullname, self).init; - JobContext jc = this.job.getContext(); + JobContext jc = this.job.getJobContext(); EState init = this.job.config.minEfsm ? jc.getMinimisedEGraph(fullname, self).init : jc.getEGraph(fullname, self).init; diff --git a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java index e3f233622..3b4878bd5 100644 --- a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -13,6 +13,7 @@ */ package org.scribble.ast; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -423,7 +424,8 @@ public NonRoleArg NonRoleArg(CommonTree source, NonRoleArgNode arg) } @Override - public NameNode SimpleNameNode(CommonTree source, K kind, String identifier) + public NameNode SimpleNameNode(CommonTree source, K kind, + String identifier) { NameNode snn = null; @@ -456,7 +458,8 @@ else if (kind.equals(RoleKind.KIND)) } @Override - public QualifiedNameNode QualifiedNameNode(CommonTree source, K kind, String... elems) + public QualifiedNameNode QualifiedNameNode( + CommonTree source, K kind, String... elems) { QualifiedNameNode qnn = null; if (kind.equals(SigKind.KIND)) @@ -490,10 +493,12 @@ else if (kind.equals(Local.KIND)) { throw new RuntimeException("Shouldn't get in here: " + kind); } + System.out.println("rrrr: " + kind + " ,, " + Arrays.toString(elems)); return castNameNode(kind, del(qnn, createDefaultDelegate())); } - protected static , K extends Kind> T castNameNode(K kind, NameNode n) + protected static , K extends Kind> T castNameNode( + K kind, NameNode n) { if (!n.toName().getKind().equals(kind)) { diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java b/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java index fd2bc5b19..9c0d40183 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java @@ -74,12 +74,12 @@ public interface DelDecorator // UnaryPayloadElem UnaryPayloadElem(UnaryPayloadElem e); /*GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode name, RoleNode role); - LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode name); + LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode name);*/ - RoleArgList RoleArgList(CommonTree source, List roles); - RoleArg RoleArg(CommonTree source, RoleNode role); - NonRoleArgList NonRoleArgList(CommonTree source, List args); - NonRoleArg NonRoleArg(CommonTree source, NonRoleArgNode arg);*/ + void RoleArgList(RoleArgList rs); + void RoleArg(RoleArg r); + void NonRoleArgList(NonRoleArgList as); + void NonRoleArg(NonRoleArg a); /* NameNode SimpleNameNode(CommonTree source, K kind, String identifier); QualifiedNameNode QualifiedNameNode(CommonTree source, K kind, String... elems);*/ diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java index 8a1018fe8..17d39e7ca 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java @@ -37,7 +37,9 @@ import org.scribble.del.DefaultDel; import org.scribble.del.ImportModuleDel; import org.scribble.del.ModuleDel; +import org.scribble.del.NonRoleArgListDel; import org.scribble.del.NonRoleParamDeclListDel; +import org.scribble.del.RoleArgListDel; import org.scribble.del.RoleDeclDel; import org.scribble.del.RoleDeclListDel; import org.scribble.del.ScribDel; @@ -121,9 +123,18 @@ public void decorate(CommonTree n) PayloadElemList((PayloadElemList) n); break; - /*case ROLEINSTANTIATIONLIST: return AntlrRoleArgList.parseRoleArgList(this, ct, af); - case ROLEINSTANTIATION: return AntlrRoleArg.parseRoleArg(this, ct, af); - case ARGUMENTINSTANTIATIONLIST: return AntlrNonRoleArgList.parseNonRoleArgList(this, ct, af);*/ + case "ROLEINSTANTIATIONLIST": + RoleArgList((RoleArgList) n); + break; + case "ROLEINSTANTIATION": + RoleArg((RoleArg) n); + break; + case "ARGUMENTINSTANTIATIONLIST": + NonRoleArgList((NonRoleArgList) n); + break; + case "ARGUMENTINSTANTIATION": + NonRoleArg((NonRoleArg) n); + break; case "GLOBALMESSAGETRANSFER": GMessageTransfer((GMessageTransfer) n); @@ -354,37 +365,29 @@ public UnaryPayloadElem UnaryPayloadElem(CommonTr return de; }*/ - /*@Override - public RoleArgList RoleArgList(CommonTree source, List ris) + @Override + public void RoleArgList(RoleArgList rs) { - RoleArgList rdl = new RoleArgList(source, ris); - rdl = setDel(rdl, new RoleArgListDel()); - return rdl; + setDel(rs, new RoleArgListDel()); } @Override - public RoleArg RoleArg(CommonTree source, RoleNode role) + public void RoleArg(RoleArg r) { - RoleArg ri = new RoleArg(source, role); - ri = setDel(ri, createDefaultDelegate()); - return ri; + setDel(r, createDefaultDelegate()); } @Override - public NonRoleArgList NonRoleArgList(CommonTree source, List ais) + public void NonRoleArgList(NonRoleArgList as) { - NonRoleArgList rdl = new NonRoleArgList(source, ais); - rdl = setDel(rdl, new NonRoleArgListDel()); - return rdl; + setDel(as, new NonRoleArgListDel()); } @Override - public NonRoleArg NonRoleArg(CommonTree source, NonRoleArgNode arg) + public void NonRoleArg(NonRoleArg a) { - NonRoleArg ri = new NonRoleArg(source, arg); - ri = setDel(ri, createDefaultDelegate()); - return ri; - }*/ + setDel(a, createDefaultDelegate()); + } /*@Override public NameNode SimpleNameNode(CommonTree source, K kind, String identifier) diff --git a/scribble-core/src/main/java/org/scribble/ast/Do.java b/scribble-core/src/main/java/org/scribble/ast/Do.java index 95144dd4e..3ea8a17ad 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Do.java +++ b/scribble-core/src/main/java/org/scribble/ast/Do.java @@ -51,7 +51,7 @@ public Do(Do node) // CHECKME: maybe wrap up role args and non-role args within the same container? public RoleArgList getRoleListChild() { - return (RoleArgList) getChild(0); + return (RoleArgList) getChild(2); } public NonRoleArgList getNonRoleListChild() @@ -59,6 +59,7 @@ public NonRoleArgList getNonRoleListChild() return (NonRoleArgList) getChild(1); } + // getChild(0) public abstract ProtocolNameNode getProtocolNameNode(); public abstract Do dupNode(); @@ -66,9 +67,9 @@ public NonRoleArgList getNonRoleListChild() public Do reconstruct(RoleArgList roles, NonRoleArgList args, ProtocolNameNode proto) { Do sig = dupNode(); - sig.addChild(roles); + sig.addChild(proto); // Order re. getter indices sig.addChild(args); - sig.addChild(proto); + sig.addChild(roles); ScribDel del = del(); sig.setDel(del); // No copy return sig; diff --git a/scribble-core/src/main/java/org/scribble/ast/DoArg.java b/scribble-core/src/main/java/org/scribble/ast/DoArg.java index 329c96dbf..dae35e59a 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DoArg.java +++ b/scribble-core/src/main/java/org/scribble/ast/DoArg.java @@ -72,7 +72,7 @@ public DoArg visitChildren(AstVisitor nv) throws ScribbleException @Override public String toString() { - return this.val.toString(); + return getValChild().toString(); } diff --git a/scribble-core/src/main/java/org/scribble/ast/DoArgList.java b/scribble-core/src/main/java/org/scribble/ast/DoArgList.java index 216ef01ea..30a94957b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DoArgList.java +++ b/scribble-core/src/main/java/org/scribble/ast/DoArgList.java @@ -81,7 +81,8 @@ public int length() @Override public String toString() { - return this.args.stream().map(a -> a.toString()).collect(Collectors.joining(", ")); + return getArgChildren().stream().map(a -> a.toString()) + .collect(Collectors.joining(", ")); } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GDo.java b/scribble-core/src/main/java/org/scribble/ast/global/GDo.java index 77b44c2ac..611033936 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GDo.java @@ -45,7 +45,7 @@ public GDo(GDo node) @Override public GProtocolNameNode getProtocolNameNode() { - return (GProtocolNameNode) getChild(2); + return (GProtocolNameNode) getChild(0); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LDo.java b/scribble-core/src/main/java/org/scribble/ast/local/LDo.java index 86db17208..f1b5bbf38 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LDo.java @@ -64,7 +64,7 @@ public LDo dupNode() public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { ModuleContext mc = fixer.getModuleContext(); - JobContext jc = fixer.job.getContext(); + JobContext jc = fixer.job.getJobContext(); Role subj = getTargetProtocolDecl(jc, mc).getDefChild().getBlockChild() .getInteractSeqChild().getInteractNodeChildren().get(0) .inferLocalChoiceSubject(fixer); diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java index 2771ebe75..4582f44ec 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java @@ -27,7 +27,7 @@ public GProtocolNameNode(Token t) } // Tree#dupNode constructor - protected GProtocolNameNode(GProtocolNameNode node)//, String...elems) + public GProtocolNameNode(GProtocolNameNode node)//, String...elems) { super(node); } @@ -82,6 +82,7 @@ public int hashCode() + @Deprecated public GProtocolNameNode(CommonTree source, String... ns) { super(source, ns); diff --git a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java index f72668e68..a6376f741 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java @@ -55,7 +55,7 @@ protected ProtocolDecl getTargetProtocolDecl(Do parent, NameDisambiguator disamb) throws ScribbleException { ModuleContext mc = disamb.getModuleContext(); - JobContext jc = disamb.job.getContext(); + JobContext jc = disamb.job.getJobContext(); Do doo = (Do) parent; ProtocolName pn = doo.getProtocolNameNode().toName(); /*if (!mc.isVisibleProtocolDeclName(simpname)) // FIXME: should be checked somewhere else? earlier (do-entry?) -- done diff --git a/scribble-core/src/main/java/org/scribble/del/DoDel.java b/scribble-core/src/main/java/org/scribble/del/DoDel.java index 955b34389..b536981a7 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoDel.java @@ -13,10 +13,13 @@ */ package org.scribble.del; +import java.util.Arrays; + import org.scribble.ast.Do; import org.scribble.ast.ScribNode; import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.qualified.ProtocolNameNode; +import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.job.JobContext; import org.scribble.job.ScribbleException; import org.scribble.type.SubprotocolSig; @@ -27,6 +30,8 @@ import org.scribble.visit.context.ProtocolDeclContextBuilder; import org.scribble.visit.wf.NameDisambiguator; +import antlr.Token; + public abstract class DoDel extends SimpleInteractionNodeDel { public DoDel() @@ -59,6 +64,7 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, // Convert all visible names to full names for protocol inlining: otherwise could get clashes if directly inlining external visible names under the root modulecontext // Not done in G/LProtocolNameNodeDel because it's only for do-targets that this is needed (cf. ProtocolHeader) + // TODO: refactor into G/LDoDel to bypass generic cast issues private ScribNode leaveDisambiguationAux( ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException @@ -69,9 +75,26 @@ private ScribNode leaveDisambiguationAux( ProtocolNameNode proto = doo.getProtocolNameNode(); ProtocolName fullname = mc .getVisibleProtocolDeclFullName(proto.toName()); - ProtocolNameNode pnn = (ProtocolNameNode) disamb.job.config.af + + ProtocolNameNode pnn;/* = (ProtocolNameNode) disamb.job.config.af .QualifiedNameNode(proto.getSource(), fullname.getKind(), - fullname.getElements()); + fullname.getElements());*/ + + // FIXME: refactor, make an AST node and set its children -- rework AstFactory? + // FIXME: issue is to make an AST node, need a Token (but those are mainly obtained by parsing only) + /*pnn = (ProtocolNameNode) new GProtocolNameNode(proto.token); + pnn.addChildren(proto.getChildren());*/ + /*pnn = (ProtocolNameNode) proto.dupNode(); // Token and start/stopIndex + pnn.addChildren(Arrays.asList(fullname.getElements()).stream().map(x -> new AmbigNameNode(new Token(arg0, arg1))));*/ + pnn = proto; + /*(fullname.getKind().equals(Global.KIND) ? + new GProtocolNameNode(proto.getSource(), fullname.getElements()) : + new LProtocolNameNode(proto.getSource(), fullname.getElements()) + );*/ + + //HERE either hack Token to make new AST node, or redo proto context building on intermed -- consideration is projection output a la parsed AST subprotos, or from (inlined?) intermed + // probably hack Token for now -- or just skip protocol context building (do inlning and WF/valid first) + // Didn't keep original namenode del return doo.reconstruct(doo.getRoleListChild(), doo.getNonRoleListChild(), pnn); @@ -82,7 +105,7 @@ public Do leaveProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) throws ScribbleException { - JobContext jcontext = builder.job.getContext(); + JobContext jcontext = builder.job.getJobContext(); ModuleContext mcontext = builder.getModuleContext(); Do doo = (Do) visited; ProtocolName pn = doo.getProtocolNameNode().toName(); // leaveDisambiguation has fully qualified the target name diff --git a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java b/scribble-core/src/main/java/org/scribble/del/ModuleDel.java index 516f7a530..33971645d 100644 --- a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ModuleDel.java @@ -60,7 +60,7 @@ public void enterModuleContextBuilding(ScribNode parent, ScribNode child, ModuleContextBuilder builder) throws ScribbleException { builder.setModuleContext(new ModuleContext( - builder.job.getContext().getParsed(), (Module) child)); + builder.job.getJobContext().getParsed(), (Module) child)); // ModuleContext building is done solely by "new ModuleContext" (no deeper visiting needed) // The only thing ModuleContextBuilder really does is to set the ModuleContext in ModuleDel // FIXME: obtain from MainContext instead of creating on entry by this visitor @@ -137,7 +137,7 @@ private static Set getDuplicates(Collection ss) @Override public Module leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) { - proj.job.getContext().addProjections(proj.getProjections()); + proj.job.getJobContext().addProjections(proj.getProjections()); return (Module) visited; } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java index 1d7aacab6..02de33c5a 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -70,7 +70,7 @@ public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, RoleNode r = de.getRoleChild(); Role rn = r.toName(); - ProtocolDecl gpd = disamb.job.getContext() + ProtocolDecl gpd = disamb.job.getJobContext() .getModule(fullname.getPrefix()) .getProtocolDeclChild(fullname.getSimpleName()); if (!gpd.getHeaderChild().getRoleDeclListChild().getRoles().contains(rn)) @@ -122,7 +122,7 @@ public void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, } Set todo = new LinkedHashSet(); - ProtocolDecl targetgpd = checker.job.getContext() + ProtocolDecl targetgpd = checker.job.getJobContext() .getModule(targetfullname.getPrefix()) .getProtocolDeclChild(targetfullname.getSimpleName()); // target // CHECKME: does this already contain transitive do-dependencies? But doesn't contain transitive delegation-dependencies..? @@ -148,7 +148,7 @@ public void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, "Recursive protocol dependencies not supported for delegation types: " + de); } - ProtocolDecl nextgpd = checker.job.getContext() + ProtocolDecl nextgpd = checker.job.getJobContext() .getModule(targetfullname.getPrefix()) .getProtocolDeclChild(nextfullname.getSimpleName()); Set tmp = ((GProtocolDeclDel) nextgpd.del()) diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java index 1eee11bdd..d9322419b 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java @@ -13,6 +13,8 @@ */ package org.scribble.del.global; +import java.util.List; + import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.ScribNode; import org.scribble.ast.context.ModuleContext; @@ -26,6 +28,7 @@ import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.DoDel; import org.scribble.job.ScribbleException; +import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.SubprotocolSig; import org.scribble.type.kind.RecVarKind; import org.scribble.type.name.GProtocolName; @@ -38,6 +41,26 @@ public class GDoDel extends DoDel implements GSimpleInteractionNodeDel { + @Override + public org.scribble.lang.global.GDo translate(ScribNode n, + GTypeTranslator t) throws ScribbleException + { + GDo source = (GDo) n; + + // Resolve full name -- CHECKME: factor out? cf., NameDisambiguator, DoDel::enter/leaveDisambiguation + GProtocolName proto = source.getProtocolNameNode().toName(); + ModuleContext modc = t.getModuleContext(); + if (!modc.isVisibleProtocolDeclName(proto)) + { + throw new ScribbleException(source, + "Protocol decl not visible: " + proto); + } + GProtocolName fullname = (GProtocolName) modc + .getVisibleProtocolDeclFullName(proto); + List roles = source.getRoleListChild().getRoles(); + return new org.scribble.lang.global.GDo(source, fullname, roles); + } + // Part of context building @Override protected void addProtocolDependency(ProtocolDeclContextBuilder builder, @@ -90,7 +113,7 @@ public void enterProjection(ScribNode parent, ScribNode child, Projector proj) { // For correct name mangling, need to use the parameter corresponding to the self argument // N.B. -- this depends on Projector not following the Subprotocol pattern, otherwise self is wrong - Role param = gd.getTargetRoleParameter(proj.job.getContext(), + Role param = gd.getTargetRoleParameter(proj.job.getJobContext(), proj.getModuleContext(), self); proj.pushSelf(param); } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 8b56dd3c9..fc7532a48 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -142,7 +142,7 @@ public GProtocolDecl leaveProjection(ScribNode parent, ScribNode child, { AstFactory af = proj.job.config.af; - Module root = proj.job.getContext().getModule(proj.getModuleContext().root); + Module root = proj.job.getJobContext().getModule(proj.getModuleContext().root); GProtocolDecl gpd = (GProtocolDecl) visited; GProtocolHeader gph = gpd.getHeaderChild(); Role self = proj.peekSelf(); @@ -207,7 +207,7 @@ public void enterValidation(ScribNode parent, ScribNode child, private static void validateByScribble(Job job, GProtocolName fullname, boolean fair) throws ScribbleException { - JobContext jc = job.getContext(); + JobContext jc = job.getJobContext(); SGraph graph = (fair) ? jc.getSGraph(fullname) : jc.getUnfairSGraph(fullname); @@ -218,7 +218,7 @@ private static void validateByScribble(Job job, GProtocolName fullname, private static void validateBySpin(Job job, GProtocolName fullname) throws ScribbleException { - JobContext jc = job.getContext(); + JobContext jc = job.getJobContext(); Module mod = jc.getModule(fullname.getPrefix()); GProtocolDecl gpd = (GProtocolDecl) mod .getProtocolDeclChild(fullname.getSimpleName()); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java index c1f012130..e02d74adc 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java @@ -96,7 +96,7 @@ public LDo leaveProtocolInlining(ScribNode parent, ScribNode child, throws ScribbleException // CHECKME: similar needed for non-role args? Or all params always known? (not ideal for distributed?) { - JobContext jc = fixer.job.getContext(); + JobContext jc = fixer.job.getJobContext(); LDo ld = (LDo) visited; RoleArgList roleList = ld.getRoleListChild(); LProtocolDecl lpd = ld.getTargetProtocolDecl(jc, fixer.getModuleContext()); diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 3776009b9..625f1b973 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -44,21 +44,18 @@ import org.scribble.visit.context.Projector; import org.scribble.visit.context.ProtocolDeclContextBuilder; import org.scribble.visit.util.RoleCollector; -import org.scribble.visit.validation.GProtocolValidator; -import org.scribble.visit.wf.DelegationProtocolRefChecker; import org.scribble.visit.wf.ExplicitCorrelationChecker; import org.scribble.visit.wf.NameDisambiguator; -import org.scribble.visit.wf.ReachabilityChecker; -import org.scribble.visit.wf.WFChoiceChecker; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models public class Job { + // Keys are full names private final Map mctxts; // CHECKME: constant? move to JobConfig? public final JobConfig config; // Immutable - private final JobContext jcontext; // Mutable (Visitor passes replace modules) + private final JobContext jctxt; // Mutable (Visitor passes replace modules) private final SGraphBuilderUtil sgbu; // Just take MainContext as arg? -- would need to fix Maven dependencies @@ -69,7 +66,7 @@ public Job(Map parsed, this.mctxts = Collections.unmodifiableMap(mctxts); this.config = config; this.sgbu = config.sf.newSGraphBuilderUtil(); - this.jcontext = new JobContext(this, parsed); // Single instance per Job and should never be shared + this.jctxt = new JobContext(this, parsed); // Single instance per Job and should never be shared } // Scribble extensions should override these "new" methods @@ -104,32 +101,33 @@ public void runContextBuildingPasses() throws ScribbleException { runVisitorPassOnAllModules(ModuleContextBuilder.class); // Always done first (even if other contexts are built later) so that following passes can use ModuleContextVisitor runVisitorPassOnAllModules(NameDisambiguator.class); // Includes validating names used in subprotocol calls.. - runVisitorPassOnAllModules(ProtocolDeclContextBuilder.class); //..which this pass depends on. This pass basically builds protocol dependency info + + /*runVisitorPassOnAllModules(ProtocolDeclContextBuilder.class); //..which this pass depends on. This pass basically builds protocol dependency info runVisitorPassOnAllModules(DelegationProtocolRefChecker.class); // Must come after ProtocolDeclContextBuilder - runVisitorPassOnAllModules(RoleCollector.class); // Actually, this is the second part of protocoldecl context building + runVisitorPassOnAllModules(RoleCollector.class); // Actually, this is the second part of protocoldecl context building*/ // FIXME TODO: refactor into a runVisitorPassOnAllModules for SimpleVisitor (and add operation to ModuleDel) - GTypeTranslator t = new GTypeTranslator(this); - for (ModuleName fullname : this.jcontext.getFullModuleNames()) + for (ModuleName fullname : this.jctxt.getFullModuleNames()) { - Module mod = this.jcontext.getModule(fullname); + Module mod = this.jctxt.getModule(fullname); + GTypeTranslator t = new GTypeTranslator(this, fullname); for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) { GProtocol g = (GProtocol) gpd.visitWith(t); - this.jcontext.addIntermediate(g.getFullName(), g); + this.jctxt.addIntermediate(g.getFullName(), g); System.out.println("\nparsed:\n" + gpd + "\nintermed:\n" + g); GProtocol inlined = g.getInlined(this); System.out.println("inlined:\n" + inlined); - this.jcontext.addInlined(inlined.getFullName(), inlined); + this.jctxt.addInlined(inlined.getFullName(), inlined); } } - System.out.println("fff1: " + this.jcontext.getMainModule()); + System.out.println("fff1: " + this.jctxt.getMainModule()); //runVisitorPassOnAllModules(ProtocolDefInliner.class); - System.out.println("fff2: " + this.jcontext.getMainModule()); + System.out.println("fff2: " + this.jctxt.getMainModule()); //runUnfoldingPass(); } @@ -196,14 +194,14 @@ protected void runProjectionUnfoldingPass() throws ScribbleException public Map getProjections(GProtocolName fullname, Role role) throws ScribbleException { - Module root = this.jcontext.getProjection(fullname, role); + Module root = this.jctxt.getProjection(fullname, role); Map> dependencies = ((LProtocolDeclDel) root .getLProtoDeclChildren().get(0).del()).getProtocolDeclContext() .getDependencyMap().getDependencies().get(role); // Can ignore Set for projections (is singleton), as each projected proto is a dependency only for self (implicit in the protocoldecl) return dependencies.keySet().stream().collect( Collectors.toMap(lpn -> lpn, - (lpn) -> this.jcontext.getModule(lpn.getPrefix()))); + (lpn) -> this.jctxt.getModule(lpn.getPrefix()))); } /*public Map generateSessionApi(GProtocolName fullname) throws ScribbleException @@ -247,21 +245,21 @@ public void runVisitorPassOnAllModules(Class c) throws ScribbleException { debugPrintPass("Running " + c + " on all modules:"); - runVisitorPass(this.jcontext.getFullModuleNames(), c); + runVisitorPass(this.jctxt.getFullModuleNames(), c); } public void runVisitorPassOnParsedModules(Class c) throws ScribbleException { debugPrintPass("Running " + c + " on parsed modules:"); - runVisitorPass(this.jcontext.getParsedFullModuleNames(), c); + runVisitorPass(this.jctxt.getParsedFullModuleNames(), c); } public void runVisitorPassOnProjectedModules(Class c) throws ScribbleException { debugPrintPass("Running " + c + " on projected modules:"); - runVisitorPass(this.jcontext.getProjectedFullModuleNames(), c); + runVisitorPass(this.jctxt.getProjectedFullModuleNames(), c); } private void runVisitorPass(Set modnames, @@ -287,13 +285,18 @@ private void runVisitorPass(Set modnames, private void runVisitorOnModule(ModuleName modname, AstVisitor nv) throws ScribbleException { - Module visited = (Module) this.jcontext.getModule(modname).accept(nv); - this.jcontext.replaceModule(visited); + Module visited = (Module) this.jctxt.getModule(modname).accept(nv); + this.jctxt.replaceModule(visited); + } + + public JobContext getJobContext() + { + return this.jctxt; } - public JobContext getContext() + public ModuleContext getModuleContext(ModuleName fullname) { - return this.jcontext; + return this.mctxts.get(fullname); } public boolean isDebug() diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java b/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java index 7bbff73e4..a85d3bd8a 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java @@ -4,14 +4,15 @@ import org.scribble.del.global.GDel; import org.scribble.job.Job; import org.scribble.job.ScribbleException; +import org.scribble.type.name.ModuleName; import org.scribble.visit.SimpleVisitor; // CHECKME: move to visit package? public class GTypeTranslator extends SimpleVisitor { - public GTypeTranslator(Job job) + public GTypeTranslator(Job job, ModuleName mod) { - super(job); + super(job, mod); } @Override diff --git a/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java b/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java index da114dd63..28449130a 100644 --- a/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java @@ -95,7 +95,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleExcepti ProtocolDecl pd = (ProtocolDecl) visited; this.job.debugPrintln("\n[DEBUG] Unfolded inlined protocol " + pd.getFullMemberName( - this.job.getContext().getModule(getModuleContext().root)) + this.job.getJobContext().getModule(getModuleContext().root)) + ":\n" + ((ProtocolDefDel) pd.getDefChild().del()) .getInlinedProtocolDef()); } diff --git a/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java b/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java index 490b5e90c..3d7329fc3 100644 --- a/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java +++ b/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java @@ -88,7 +88,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleExcepti { ProtocolDecl pd = (ProtocolDecl) visited; this.job.debugPrintln("\n[DEBUG] Inlined root protocol " - + pd.getFullMemberName(this.job.getContext().getModule(getModuleContext().root)) + ":\n" + + pd.getFullMemberName(this.job.getJobContext().getModule(getModuleContext().root)) + ":\n" + ((ProtocolDefDel) pd.getDefChild().del()).getInlinedProtocolDef()); } return leave(parent, child, visited); @@ -118,7 +118,7 @@ protected Do visitOverrideForDo(InteractionSeq parent, Do child) throws { //return (GDo) super.visitForSubprotocols(parent, child); // Duplicated from SubprotocolVisitor#visitOverrideFoDo and modified to access discarded env -- FIXME: factor out this facility better - JobContext jc = this.job.getContext(); + JobContext jc = this.job.getJobContext(); ModuleContext mc = getModuleContext(); ProtocolDecl pd = child.getTargetProtocolDecl(jc, mc); diff --git a/scribble-core/src/main/java/org/scribble/visit/SimpleVisitor.java b/scribble-core/src/main/java/org/scribble/visit/SimpleVisitor.java index b6120ee61..8236a15c9 100644 --- a/scribble-core/src/main/java/org/scribble/visit/SimpleVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/SimpleVisitor.java @@ -14,21 +14,31 @@ package org.scribble.visit; import org.scribble.ast.ScribNode; +import org.scribble.ast.context.ModuleContext; import org.scribble.job.Job; import org.scribble.job.ScribbleException; +import org.scribble.type.name.ModuleName; +// A SimpleVisitor visits a Module (or some part of one) for a given Job // Apart from delegating to del-specific visiting methods, SimpleVisitors are mainly for holding data and collecting common operations // TODO CHECKME: refactor AstVisitor as a SimpleVisitor? i.e., T=ScribNode ? public abstract class SimpleVisitor { public final Job job; + public final ModuleName mod; // fullname - public SimpleVisitor(Job job) + public SimpleVisitor(Job job, ModuleName fullname) { this.job = job; + this.mod = fullname; } // Override to delegate to del-specific method, e.g., n.del().visit(n, this) // N.B. ScribNode has getParent public abstract T visit(ScribNode n) throws ScribbleException; + + public ModuleContext getModuleContext() + { + return this.job.getModuleContext(this.mod); + } } diff --git a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java index 8d2e8a53c..0f9bbac99 100644 --- a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java @@ -117,7 +117,7 @@ protected Do visitOverrideForDo(ScribNode parent, Do doo) { if (!isCycle()) { - JobContext jc = this.job.getContext(); + JobContext jc = this.job.getJobContext(); ModuleContext mc = getModuleContext(); ProtocolDecl pd = doo.getTargetProtocolDecl(jc, mc); @@ -246,7 +246,7 @@ private void pushSubprotocolSig(ProtocolName fullname, List roleargs, private void pushNameMaps(ProtocolName fullname, Do doo) { - ProtocolDecl pd = this.job.getContext().getModule(fullname.getPrefix()) + ProtocolDecl pd = this.job.getJobContext().getModule(fullname.getPrefix()) .getProtocolDeclChild(fullname.getSimpleName()); ProtocolHeader hdr = pd.getHeaderChild(); this.rolemaps.push(makeRoleSubsMap(this.rolemaps.get(0), diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java index efeb1788c..c6039348d 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java @@ -57,7 +57,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) List ins = lis.getInteractNodeChildren(); if (ins.get(0) instanceof LDo) // Unlike GRecursion.prune, to-prune "do" could be followed by a continuation? { - JobContext jc = this.job.getContext(); + JobContext jc = this.job.getJobContext(); LDo ld = (LDo) ins.get(0); LProtocolDecl lpd = ld.getTargetProtocolDecl(jc, getModuleContext()); diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java b/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java index 08fd4435e..5cf8a2f95 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java @@ -48,7 +48,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) GProtocolName gpn = gpd.getFullMemberName(mod); for (Role r : gpd.getHeaderChild().getRoleDeclListChild().getRoles()) { - Module proj = this.job.getContext().getProjection(gpn, r); + Module proj = this.job.getJobContext().getProjection(gpn, r); proj.accept(this); } } diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index ac612a200..f91483b07 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -568,16 +568,22 @@ globalprotocoldeclmodifiers: // GLOBAL_KW PROTOCOL_KW simpleprotocolname roledecllist globalprotocolheader: - GLOBAL_KW PROTOCOL_KW gprotocolname roledecllist + GLOBAL_KW PROTOCOL_KW gprotocolnamenode roledecllist -> - ^(GLOBALPROTOCOLHEADER ^(GPROTOCOLNAME gprotocolname) ^(PARAMETERDECLLIST) roledecllist) + ^(GLOBALPROTOCOLHEADER gprotocolnamenode ^(PARAMETERDECLLIST) roledecllist) | - GLOBAL_KW PROTOCOL_KW gprotocolname parameterdecllist roledecllist + GLOBAL_KW PROTOCOL_KW gprotocolnamenode parameterdecllist roledecllist -> - ^(GLOBALPROTOCOLHEADER ^(GPROTOCOLNAME gprotocolname) parameterdecllist roledecllist) + ^(GLOBALPROTOCOLHEADER gprotocolnamenode parameterdecllist roledecllist) ; // GLOBAL_KW PROTOCOL_KW simpleprotocolname parameterdecllist roledecllist +gprotocolnamenode: + gprotocolname +-> + ^(GPROTOCOLNAME gprotocolname) +; + roledecllist: '(' roledecl (',' roledecl)* ')' -> @@ -787,13 +793,13 @@ globalinterrupt: * Section 3.7.9 Global Do */ globaldo: - DO_KW protocolname roleinstantiationlist ';' + DO_KW gprotocolnamenode roleinstantiationlist ';' -> - ^(GLOBALDO protocolname ^(ARGUMENTINSTANTIATIONLIST) roleinstantiationlist) + ^(GLOBALDO gprotocolnamenode ^(ARGUMENTINSTANTIATIONLIST) roleinstantiationlist) | - DO_KW protocolname argumentinstantiationlist roleinstantiationlist ';' + DO_KW gprotocolnamenode argumentinstantiationlist roleinstantiationlist ';' -> - ^(GLOBALDO protocolname argumentinstantiationlist roleinstantiationlist) + ^(GLOBALDO gprotocolnamenode argumentinstantiationlist roleinstantiationlist) ; roleinstantiationlist: @@ -803,9 +809,9 @@ roleinstantiationlist: ; roleinstantiation: - rolename + rolenamenode -> - ^(ROLEINSTANTIATION rolename) // FIXME: not consistent with arginstas/payloadeles + ^(ROLEINSTANTIATION rolenamenode) // TODO: inconsistent with arginstas/payloadeles ; argumentinstantiationlist: diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index e497175c5..5357626c4 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -5,8 +5,11 @@ import org.scribble.ast.MessageSigNode; import org.scribble.ast.Module; import org.scribble.ast.ModuleDecl; +import org.scribble.ast.NonRoleArgList; import org.scribble.ast.NonRoleParamDeclList; import org.scribble.ast.PayloadElemList; +import org.scribble.ast.RoleArg; +import org.scribble.ast.RoleArgList; import org.scribble.ast.RoleDecl; import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScribNil; @@ -115,6 +118,15 @@ public Object create(Token t) return new OpNode(t); case "PAYLOAD": return new PayloadElemList(t); + + case "ROLEINSTANTIATIONLIST": + return new RoleArgList(t); + case "ROLEINSTANTIATION": + return new RoleArg(t); + case "ARGUMENTINSTANTIATIONLIST": + return new NonRoleArgList(t); + case "ARGUMENTINSTANTIATION": + throw new RuntimeException("TODO: " + t); //return new MyCommonTree(t); // FIXME: placeholder for deleg, qualified or ambig //case "QUALIFIEDNAME": //return this.f.Q diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 355060b39..a24bd39b3 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -36,8 +36,6 @@ module tmp.Test; global protocol Proto1(role A, role B) { - rec X - { choice at A { 1() from A to B; @@ -46,9 +44,8 @@ global protocol Proto1(role A, role B) { 2() from A to B; 3() from B to A; - continue X; + do Proto1(A, B); } - } } From 4f05dcd72ba5232da8bf5a7eb4f0791d03107e27 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 9 Feb 2019 20:15:26 +0000 Subject: [PATCH 097/539] Continued WIP. --- .../java/org/scribble/ast/InteractionSeq.java | 1 - .../src/main/java/org/scribble/del/DoDel.java | 4 +- .../org/scribble/del/ProtocolDeclDel.java | 4 +- .../java/org/scribble/del/global/GDoDel.java | 6 +-- .../scribble/del/global/GProtocolDefDel.java | 4 +- .../java/org/scribble/del/local/LDoDel.java | 6 +-- .../scribble/del/local/LProtocolDefDel.java | 4 +- .../src/main/java/org/scribble/job/Job.java | 7 +-- .../src/main/java/org/scribble/lang/Do.java | 2 +- .../main/java/org/scribble/lang/Protocol.java | 16 +++--- .../java/org/scribble/lang/Recursion.java | 2 +- .../main/java/org/scribble/lang/SessType.java | 8 ++- .../org/scribble/lang/global/GChoice.java | 6 ++- .../org/scribble/lang/global/GContinue.java | 5 +- .../java/org/scribble/lang/global/GDo.java | 16 +++++- .../lang/global/GMessageTransfer.java | 5 +- .../org/scribble/lang/global/GProtocol.java | 13 +++-- .../org/scribble/lang/global/GRecursion.java | 7 ++- .../java/org/scribble/lang/global/GSeq.java | 21 ++++++-- .../java/org/scribble/lang/global/GType.java | 8 +-- .../{SubprotocolSig.java => SubprotoSig.java} | 51 ++++++++++--------- .../scribble/visit/ProtocolDefInliner.java | 12 ++--- .../scribble/visit/SubprotocolVisitor.java | 12 ++--- .../UnguardedChoiceDoProjectionChecker.java | 4 +- scribble-test/src/test/scrib/tmp/Test.scr | 6 ++- 25 files changed, 143 insertions(+), 87 deletions(-) rename scribble-core/src/main/java/org/scribble/type/{SubprotocolSig.java => SubprotoSig.java} (51%) diff --git a/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java b/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java index 3041c28a8..a97bdf5b4 100644 --- a/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java +++ b/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java @@ -89,7 +89,6 @@ public ScribNode visitChildren(AstVisitor nv) throws ScribbleException @Override public String toString() { - System.out.println("ttt: " + getChildren()); return getInteractNodeChildren().stream().map(i -> i.toString()) .collect(Collectors.joining("\n")); } diff --git a/scribble-core/src/main/java/org/scribble/del/DoDel.java b/scribble-core/src/main/java/org/scribble/del/DoDel.java index b536981a7..a64b980f9 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoDel.java @@ -22,7 +22,7 @@ import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.job.JobContext; import org.scribble.job.ScribbleException; -import org.scribble.type.SubprotocolSig; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; @@ -126,7 +126,7 @@ public void enterProtocolInlining(ScribNode parent, ScribNode child, super.enterProtocolInlining(parent, child, inl); if (!inl.isCycle()) { - SubprotocolSig subsig = inl.peekStack(); // SubprotocolVisitor has already entered subprotocol + SubprotoSig subsig = inl.peekStack(); // SubprotocolVisitor has already entered subprotocol inl.setSubprotocolRecVar(subsig); } } diff --git a/scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java index 3403240e0..8da32ab3d 100644 --- a/scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java @@ -20,7 +20,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.context.ProtocolDeclContext; import org.scribble.job.ScribbleException; -import org.scribble.type.SubprotocolSig; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.ProtocolName; @@ -72,7 +72,7 @@ protected abstract void addSelfDependency(ProtocolDeclContextBuilder builder, public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribbleException { - SubprotocolSig subsig = inl.peekStack(); // SubprotocolVisitor has already entered subprotocol + SubprotoSig subsig = inl.peekStack(); // SubprotocolVisitor has already entered subprotocol inl.setSubprotocolRecVar(subsig); } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java index d9322419b..1d155311a 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java @@ -29,7 +29,7 @@ import org.scribble.del.DoDel; import org.scribble.job.ScribbleException; import org.scribble.lang.global.GTypeTranslator; -import org.scribble.type.SubprotocolSig; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.RecVarKind; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.ProtocolName; @@ -73,7 +73,7 @@ protected void addProtocolDependency(ProtocolDeclContextBuilder builder, public GDo visitForSubprotocolInlining(ProtocolDefInliner builder, GDo child) { CommonTree blame = child.getSource(); - SubprotocolSig subsig = builder.peekStack(); + SubprotoSig subsig = builder.peekStack(); RecVarNode recvar = (RecVarNode) builder.job.config.af.SimpleNameNode(blame, RecVarKind.KIND, builder.getSubprotocolRecVar(subsig).toString()); GContinue inlined = builder.job.config.af.GContinue(blame, recvar); @@ -88,7 +88,7 @@ public GDo leaveProtocolInlining(ScribNode parent, ScribNode child, if (!inl.isCycle()) { CommonTree blame = visited.getSource(); - SubprotocolSig subsig = inl.peekStack(); + SubprotoSig subsig = inl.peekStack(); RecVarNode recvar = (RecVarNode) inl.job.config.af.SimpleNameNode(blame, RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString()); GInteractionSeq gis = (GInteractionSeq) (((InlineProtocolEnv) inl diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java index 76bec3df7..2ab9b6992 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java @@ -29,7 +29,7 @@ import org.scribble.del.ProtocolDefDel; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; -import org.scribble.type.SubprotocolSig; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.kind.RecVarKind; import org.scribble.visit.ProtocolDefInliner; @@ -57,7 +57,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { CommonTree blame = ((GProtocolDecl) parent).getHeaderChild().getSource(); - SubprotocolSig subsig = inl.peekStack(); + SubprotoSig subsig = inl.peekStack(); GProtocolDef def = (GProtocolDef) visited; GProtocolBlock block = (GProtocolBlock) ((InlineProtocolEnv) def .getBlockChild().del().env()).getTranslation(); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java index e02d74adc..ab6ae47d9 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java @@ -34,7 +34,7 @@ import org.scribble.del.DoDel; import org.scribble.job.JobContext; import org.scribble.job.ScribbleException; -import org.scribble.type.SubprotocolSig; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.RecVarKind; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; @@ -60,7 +60,7 @@ protected void addProtocolDependency(ProtocolDeclContextBuilder builder, public LDo visitForSubprotocolInlining(ProtocolDefInliner builder, LDo child) { CommonTree blame = child.getSource(); // Cf., GDoDel - SubprotocolSig subsig = builder.peekStack(); + SubprotoSig subsig = builder.peekStack(); RecVarNode recvar = (RecVarNode) builder.job.config.af.SimpleNameNode(blame, RecVarKind.KIND, builder.getSubprotocolRecVar(subsig).toString()); LContinue inlined = builder.job.config.af.LContinue(blame, recvar); @@ -75,7 +75,7 @@ public LDo leaveProtocolInlining(ScribNode parent, ScribNode child, if (!dinlr.isCycle()) { CommonTree blame = visited.getSource(); // Cf., GDoDel - SubprotocolSig subsig = dinlr.peekStack(); + SubprotoSig subsig = dinlr.peekStack(); RecVarNode recvar = (RecVarNode) dinlr.job.config.af.SimpleNameNode(blame, RecVarKind.KIND, dinlr.getSubprotocolRecVar(subsig).toString()); LInteractionSeq gis = (LInteractionSeq) (((InlineProtocolEnv) dinlr diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java b/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java index b97c1c3b5..6bb4e1a52 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java @@ -27,7 +27,7 @@ import org.scribble.del.ProtocolDefDel; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; -import org.scribble.type.SubprotocolSig; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.kind.RecVarKind; import org.scribble.visit.ProtocolDefInliner; @@ -53,7 +53,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { CommonTree blame = ((LProtocolDecl) parent).getHeaderChild().getSource(); // Cf., GProtocolDefDel - SubprotocolSig subsig = inl.peekStack(); + SubprotoSig subsig = inl.peekStack(); LProtocolDef def = (LProtocolDef) visited; LProtocolBlock block = (LProtocolBlock) ((InlineProtocolEnv) def .getBlockChild().del().env()).getTranslation(); diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 625f1b973..95d49241d 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -16,6 +16,7 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Collections; +import java.util.LinkedList; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -114,12 +115,12 @@ public void runContextBuildingPasses() throws ScribbleException for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) { GProtocol g = (GProtocol) gpd.visitWith(t); - this.jctxt.addIntermediate(g.getFullName(), g); + this.jctxt.addIntermediate(g.fullname, g); System.out.println("\nparsed:\n" + gpd + "\nintermed:\n" + g); - GProtocol inlined = g.getInlined(this); + GProtocol inlined = g.getInlined(this, new LinkedList<>()); System.out.println("inlined:\n" + inlined); - this.jctxt.addInlined(inlined.getFullName(), inlined); + this.jctxt.addInlined(inlined.fullname, inlined); } } diff --git a/scribble-core/src/main/java/org/scribble/lang/Do.java b/scribble-core/src/main/java/org/scribble/lang/Do.java index fd8aa27ba..184bf2b9d 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Do.java +++ b/scribble-core/src/main/java/org/scribble/lang/Do.java @@ -11,7 +11,7 @@ public abstract class Do> extends SessTypeBase implements SessType { - public final N proto; + public final N proto; // Currently disamb'd to fullname by GTypeTranslator (see GDoDel::translate) public final List roles; // Ordered role args; pre: size > 1 //public final List args; // CHECKME diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index 3c98b2a8d..fb0be3848 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -12,7 +12,7 @@ public abstract class Protocol, B extends Seq> extends SessTypeBase { - public final N name; + public final N fullname; public final List roles; // Ordered role params; pre: size >= 2 //public final List> params; // TODO public final B body; // CHECKME: take "? extends Seq" as generic param? @@ -22,7 +22,7 @@ public Protocol(ProtocolDecl source, N fullname, B body) { super(source); - this.name = fullname; + this.fullname = fullname; this.roles = Collections.unmodifiableList(roles); this.body = body; } @@ -30,15 +30,15 @@ public Protocol(ProtocolDecl source, N fullname, public abstract Protocol reconstruct(ProtocolDecl source, N fullname, List roles, B body); - public N getFullName() + /*public N getFullName() { - return this.name; - } + return this.fullname; + }*/ @Override public String toString() { - return " protocol " + this.name + "(" + this.roles.stream() + return " protocol " + this.fullname + "(" + this.roles.stream() .map(x -> x.toString()).collect(Collectors.joining(", ")) + ")" + " {\n" + this.body + "\n}"; } @@ -48,7 +48,7 @@ public int hashCode() { int hash = 7; hash = 31 * hash + super.hashCode(); - hash = 31 * hash + this.name.hashCode(); + hash = 31 * hash + this.fullname.hashCode(); hash = 31 * hash + this.roles.hashCode(); hash = 31 * hash + this.body.hashCode(); return hash; @@ -67,7 +67,7 @@ public boolean equals(Object o) } Protocol them = (Protocol) o; return super.equals(this) // Does canEquals - && this.name.equals(them.name) && this.roles.equals(them.roles) + && this.fullname.equals(them.fullname) && this.roles.equals(them.roles) && this.body.equals(them.body); } diff --git a/scribble-core/src/main/java/org/scribble/lang/Recursion.java b/scribble-core/src/main/java/org/scribble/lang/Recursion.java index 0f3d6cd2f..7fbc07130 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/Recursion.java @@ -22,7 +22,7 @@ public abstract Recursion reconstruct( @Override public String toString() { - return "rec " + this.recvar + " {" + this.body + "}"; + return "rec " + this.recvar + " {\n" + this.body + "\n}"; } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/SessType.java b/scribble-core/src/main/java/org/scribble/lang/SessType.java index d379896d2..cea1f3446 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SessType.java +++ b/scribble-core/src/main/java/org/scribble/lang/SessType.java @@ -1,7 +1,10 @@ package org.scribble.lang; +import java.util.Deque; + import org.scribble.ast.ProtocolKindNode; import org.scribble.job.Job; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.ProtocolKind; // CHECKME: move to type.sess? @@ -11,7 +14,10 @@ public interface SessType boolean hasSource(); // i.e., was parsed ProtocolKindNode getSource(); // Pre: hasSource - SessType getInlined(Job job); + // Top-level call should be on a GProtocol with an empty stack + // stack is treated mutably + // Do stack.push to push the next sig onto the stack + SessType getInlined(Job job, Deque stack); // Call this using: them.canEquals(this) boolean canEquals(Object o); diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java index 5ebb3b1bc..fc57a82c7 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -1,10 +1,12 @@ package org.scribble.lang.global; +import java.util.Deque; import java.util.List; import java.util.stream.Collectors; import org.scribble.job.Job; import org.scribble.lang.Choice; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -24,11 +26,11 @@ public GChoice reconstruct(org.scribble.ast.Choice source, Role subj, } @Override - public GChoice getInlined(Job job) + public GChoice getInlined(Job job, Deque stack) { org.scribble.ast.global.GChoice source = (org.scribble.ast.global.GChoice) getSource(); // CHECKME: or empty source? - List collect = this.blocks.stream().map(x -> x.getInlined(job)) + List collect = this.blocks.stream().map(x -> x.getInlined(job, stack)) .collect(Collectors.toList()); return new GChoice(source, this.subj, collect); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java index edfde132d..e245a1fe7 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java @@ -1,7 +1,10 @@ package org.scribble.lang.global; +import java.util.Deque; + import org.scribble.job.Job; import org.scribble.lang.Continue; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; @@ -20,7 +23,7 @@ public GContinue reconstruct(org.scribble.ast.Continue source, } @Override - public GContinue getInlined(Job job) + public GContinue getInlined(Job job, Deque stack) { org.scribble.ast.global.GContinue source = (org.scribble.ast.global.GContinue) getSource(); // CHECKME: or empty source? diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index 4bbb33439..d1fde843e 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -1,9 +1,12 @@ package org.scribble.lang.global; +import java.util.Collections; +import java.util.Deque; import java.util.List; import org.scribble.job.Job; import org.scribble.lang.Do; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; @@ -24,9 +27,18 @@ public GDo reconstruct(org.scribble.ast.Do source, } @Override - public GType getInlined(Job job) + public GType getInlined(Job job, Deque stack) { - throw new RuntimeException("TODO"); + GProtocolName fullname = this.proto; + SubprotoSig sig = new SubprotoSig(fullname, this.roles, + Collections.emptyList()); // FIXME + if (stack.contains(sig)) + { + return this; + } + stack.push(sig); + return job.getJobContext().getIntermediate(fullname).body.getInlined(job, + stack); // i.e. returning a GSeq -- rely on parent GSeq to inline } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java index 16a575091..980f5badb 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java @@ -1,8 +1,11 @@ package org.scribble.lang.global; +import java.util.Deque; + import org.scribble.job.Job; import org.scribble.lang.MessageTransfer; import org.scribble.type.Message; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -25,7 +28,7 @@ public GMessageTransfer reconstruct( } @Override - public GType getInlined(Job job) + public GType getInlined(Job job, Deque stack) { return this; } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index adee92da9..edd1cd8c1 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -1,11 +1,14 @@ package org.scribble.lang.global; +import java.util.Collections; +import java.util.Deque; import java.util.List; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.global.GProtocolDecl; import org.scribble.job.Job; import org.scribble.lang.Protocol; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; @@ -27,12 +30,16 @@ public GProtocol reconstruct(ProtocolDecl source, return new GProtocol(source, fullname, roles, body); } + // Top-level call should give an empty stack + // But stack is non-empty for recursive calls with, e.g., permuted role args @Override - public GProtocol getInlined(Job job) + public GProtocol getInlined(Job job, Deque stack) { + stack.push(new SubprotoSig(this.fullname, this.roles, + Collections.emptyList())); // FIXME GProtocolDecl source = getSource(); // CHECKME: or empty source? - GSeq body = (GSeq) this.body.getInlined(job); - return reconstruct(source, getFullName(), this.roles, body); + GSeq body = (GSeq) this.body.getInlined(job, stack); + return reconstruct(source, this.fullname, this.roles, body); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java index c962f6291..e1e5773e6 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java @@ -1,7 +1,10 @@ package org.scribble.lang.global; +import java.util.Deque; + import org.scribble.job.Job; import org.scribble.lang.Recursion; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; @@ -21,11 +24,11 @@ public GRecursion reconstruct(org.scribble.ast.Recursion source, } @Override - public GRecursion getInlined(Job job) + public GRecursion getInlined(Job job, Deque stack) { org.scribble.ast.global.GRecursion source = (org.scribble.ast.global.GRecursion) getSource(); // CHECKME: or empty source? - GSeq body = this.body.getInlined(job); + GSeq body = this.body.getInlined(job, stack); return new GRecursion(source, this.recvar, body); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java index ca93c7c1f..99f8aa314 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -1,13 +1,15 @@ package org.scribble.lang.global; +import java.util.Deque; +import java.util.LinkedList; import java.util.List; -import java.util.stream.Collectors; import org.scribble.ast.InteractionSeq; import org.scribble.ast.global.GInteractionSeq; import org.scribble.job.Job; import org.scribble.lang.Seq; import org.scribble.lang.SessType; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; public class GSeq extends Seq @@ -27,11 +29,22 @@ public GSeq reconstruct(InteractionSeq source, } @Override - public GSeq getInlined(Job job) + public GSeq getInlined(Job job, Deque stack) { GInteractionSeq source = getSource(); // CHECKME: or empty source? - List> elems = this.elems.stream() - .map(x -> x.getInlined(job)).collect(Collectors.toList()); + List> elems = new LinkedList<>(); + for (SessType e : this.elems) + { + SessType e1 = e.getInlined(job, stack); + if (e1 instanceof GSeq) + { + elems.addAll(((GSeq) e1).elems); // Inline GSeq's returned by GDo::getInlined + } + else + { + elems.add(e1); + } + } return reconstruct(source, elems); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GType.java b/scribble-core/src/main/java/org/scribble/lang/global/GType.java index 7e63f988c..285f47cdc 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GType.java @@ -1,12 +1,14 @@ package org.scribble.lang.global; +import java.util.Deque; + import org.scribble.job.Job; import org.scribble.lang.SessType; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; -public interface GType - extends SessType +public interface GType extends SessType { @Override - GType getInlined(Job job); + GType getInlined(Job job, Deque stack); } diff --git a/scribble-core/src/main/java/org/scribble/type/SubprotocolSig.java b/scribble-core/src/main/java/org/scribble/type/SubprotoSig.java similarity index 51% rename from scribble-core/src/main/java/org/scribble/type/SubprotocolSig.java rename to scribble-core/src/main/java/org/scribble/type/SubprotoSig.java index 9d487adfd..7544852a7 100644 --- a/scribble-core/src/main/java/org/scribble/type/SubprotocolSig.java +++ b/scribble-core/src/main/java/org/scribble/type/SubprotoSig.java @@ -13,37 +13,37 @@ */ package org.scribble.type; -import java.util.LinkedList; +import java.util.Collections; import java.util.List; -import org.scribble.type.kind.Kind; -import org.scribble.type.kind.NonRoleArgKind; -import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; -public class SubprotocolSig +// Immutable +public class SubprotoSig { - public ProtocolName fmn; - //public Scope scope; - public List roles; - public List> args; + public final ProtocolName fullname; + // public Scope scope; + public final List roles; // i.e., roles (and args) are ordered + public final List> args; - //public SubprotocolSignature(ProtocolName fmn, Scope scope, List roles, List> args) - public SubprotocolSig(ProtocolName fmn, List roles, List> args) + // public SubprotocolSignature(ProtocolName fmn, Scope scope, List + // roles, List> args) + public SubprotoSig(ProtocolName fullname, + List roles, List> args) { - this.fmn = fmn; - //this.scope = scope; - this.roles = new LinkedList<>(roles); - this.args = new LinkedList<>(args); + this.fullname = fullname; + // this.scope = scope; + this.roles = Collections.unmodifiableList(roles); + this.args = Collections.unmodifiableList(args); } - + @Override public int hashCode() { int hash = 1093; - hash = 31 * hash + this.fmn.hashCode(); - //hash = 31 * hash + this.scope.hashCode(); + hash = 31 * hash + this.fullname.hashCode(); + // hash = 31 * hash + this.scope.hashCode(); hash = 31 * hash + this.roles.hashCode(); hash = 31 * hash + this.args.hashCode(); return hash; @@ -56,22 +56,23 @@ public boolean equals(Object o) { return true; } - //if (o == null || this.getClass() != o.getClass()) - if (!(o instanceof SubprotocolSig)) + if (!(o instanceof SubprotoSig)) { return false; } - SubprotocolSig subsig = (SubprotocolSig) o; - return this.fmn.equals(subsig.fmn) //&& this.scope.equals(subsig.scope) + SubprotoSig subsig = (SubprotoSig) o; + return this.fullname.equals(subsig.fullname) // && + // this.scope.equals(subsig.scope) && this.roles.equals(subsig.roles) && this.args.equals(subsig.args); } - + @Override public String toString() { String args = this.args.toString(); String roles = this.roles.toString(); - return //this.scope + ":" + - this.fmn + "<" + args.substring(1, args.length() - 1) + ">(" + roles.substring(1, roles.length() - 1) + ")"; + return // this.scope + ":" + + this.fullname + "<" + args.substring(1, args.length() - 1) + ">(" + + roles.substring(1, roles.length() - 1) + ")"; } } diff --git a/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java b/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java index 3d7329fc3..c154df2f6 100644 --- a/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java +++ b/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java @@ -29,14 +29,14 @@ import org.scribble.job.Job; import org.scribble.job.JobContext; import org.scribble.job.ScribbleException; -import org.scribble.type.SubprotocolSig; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.RecVar; import org.scribble.visit.env.InlineProtocolEnv; public class ProtocolDefInliner extends SubprotocolVisitor { - private Map subprotoRecVars = new HashMap<>(); // RecVars translation for subprotocol inlining + private Map subprotoRecVars = new HashMap<>(); // RecVars translation for subprotocol inlining private Map recvars = new HashMap<>(); // Original RecVars, nesting count @@ -45,22 +45,22 @@ public ProtocolDefInliner(Job job) super(job); } - public RecVar getSubprotocolRecVar(SubprotocolSig subsig) + public RecVar getSubprotocolRecVar(SubprotoSig subsig) { return this.subprotoRecVars.get(subsig); } - public void setSubprotocolRecVar(SubprotocolSig subsig) + public void setSubprotocolRecVar(SubprotoSig subsig) { this.subprotoRecVars.put(subsig, new RecVar(newSubprotocoolRecVarId(subsig))); } - public void removeSubprotocolRecVar(SubprotocolSig subsig) + public void removeSubprotocolRecVar(SubprotoSig subsig) { this.subprotoRecVars.remove(subsig); } - private String newSubprotocoolRecVarId(SubprotocolSig sig) + private String newSubprotocoolRecVarId(SubprotoSig sig) { // TODO: Hacky, reconsider return sig.toString() diff --git a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java index 0f9bbac99..88674442e 100644 --- a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java @@ -38,7 +38,7 @@ import org.scribble.job.JobContext; import org.scribble.job.ScribbleException; import org.scribble.type.Arg; -import org.scribble.type.SubprotocolSig; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.NonRoleArgKind; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.ProtocolKind; @@ -50,7 +50,7 @@ public abstract class SubprotocolVisitor> extends EnvVisitor { - protected List stack = new LinkedList<>(); + protected List stack = new LinkedList<>(); // name in the current protocoldecl scope -> the original name node in the root protocol decl protected Stack> rolemaps = new Stack<>(); @@ -240,7 +240,7 @@ private void leaveSubprotocol() private void pushSubprotocolSig(ProtocolName fullname, List roleargs, List> nonroleargs) { - SubprotocolSig subsig = new SubprotocolSig(fullname, roleargs, nonroleargs); + SubprotoSig subsig = new SubprotoSig(fullname, roleargs, nonroleargs); this.stack.add(subsig); } @@ -271,7 +271,7 @@ public int getCycleEntryIndex() int size = this.stack.size(); if (size > 1) { - SubprotocolSig last = this.stack.get(size - 1); + SubprotoSig last = this.stack.get(size - 1); for (int i = size - 2; i >= 0; i--) { if (this.stack.get(i).equals(last)) // TODO CHECKME: doesn't support recursive scoped subprotocols, i.e. cycle detection not general enough? @@ -283,7 +283,7 @@ public int getCycleEntryIndex() return -1; } - public List getStack() + public List getStack() { return this.stack; } @@ -293,7 +293,7 @@ public boolean isStackEmpty() return this.stack.isEmpty(); } - public SubprotocolSig peekStack() + public SubprotoSig peekStack() { return this.stack.get(this.stack.size() - 1); } diff --git a/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java b/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java index fb452f790..394b2751e 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java @@ -22,7 +22,7 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.job.Job; import org.scribble.job.ScribbleException; -import org.scribble.type.SubprotocolSig; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; import org.scribble.visit.SubprotocolVisitor; @@ -86,7 +86,7 @@ private ScribNode visitOverrideForLDoPruning(ScribNode parent, LChoice lc) ProtocolName fullname = getModuleContext() .checkProtocolDeclDependencyFullName( ld.getProtocolNameNode().toName()); - SubprotocolSig sig = new SubprotocolSig(fullname, + SubprotoSig sig = new SubprotoSig(fullname, ld.getRoleListChild().getRoles(), ld.getNonRoleListChild().getArguments()); diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index a24bd39b3..d487d3935 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -36,6 +36,8 @@ module tmp.Test; global protocol Proto1(role A, role B) { + rec X + { choice at A { 1() from A to B; @@ -44,8 +46,10 @@ global protocol Proto1(role A, role B) { 2() from A to B; 3() from B to A; - do Proto1(A, B); + //do Proto1(B, A); + continue X; } + } } From ecf41ac8409fa59edc3c552bd1f7a2a27662cb5c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 10 Feb 2019 22:41:01 +0000 Subject: [PATCH 098/539] Continued WIP. --- .../main/java/org/scribble/ast/ScribNode.java | 3 +- .../src/main/java/org/scribble/job/Job.java | 23 +++++++++---- .../java/org/scribble/job/JobContext.java | 8 +++-- .../main/java/org/scribble/lang/Continue.java | 31 ++++++++++++++++-- .../src/main/java/org/scribble/lang/Do.java | 12 +++++++ .../org/scribble/lang/MessageTransfer.java | 23 +++++++++++++ .../java/org/scribble/lang/Recursion.java | 7 ++-- .../src/main/java/org/scribble/lang/Seq.java | 15 +++++++++ .../main/java/org/scribble/lang/SessType.java | 12 +++++-- .../java/org/scribble/lang/SessTypeBase.java | 6 ++-- .../org/scribble/lang/global/GChoice.java | 14 ++++++-- .../org/scribble/lang/global/GContinue.java | 22 +++++++------ .../java/org/scribble/lang/global/GDo.java | 18 ++++++++--- .../lang/global/GMessageTransfer.java | 12 +++++-- .../org/scribble/lang/global/GProtocol.java | 32 +++++++++++++------ .../org/scribble/lang/global/GRecursion.java | 29 +++++++++-------- .../java/org/scribble/lang/global/GSeq.java | 13 ++++++-- .../java/org/scribble/lang/global/GType.java | 8 +++-- .../scribble/lang/global/GTypeTranslator.java | 20 ++++++++++++ scribble-test/src/test/scrib/tmp/Test.scr | 4 +-- 20 files changed, 241 insertions(+), 71 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNode.java b/scribble-core/src/main/java/org/scribble/ast/ScribNode.java index 78830b6d2..e82e9208d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/ScribNode.java @@ -29,10 +29,11 @@ public interface ScribNode extends Tree { //void setChildren(List children); // protected - // Returns a deep clone but with fresh dels (i.e. dels not copied) -- use the af to build with fresh dels + // Returns a deep clone but with fresh dels (i.e. dels not copied) -- use the af to build with fresh dels -- XXX // i.e. recursively using AstFactory to rebuild the whole subtree // Cf. node specific reconstructs, retain (i.e. share) the existing del -- so dels must be immutable (except for Envs) //ScribNode clone(AstFactory af); + ScribNode clone(); ScribDel del(); diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 95d49241d..30125bf0c 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -16,6 +16,7 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Collections; +import java.util.Deque; import java.util.LinkedList; import java.util.Map; import java.util.Set; @@ -26,11 +27,13 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.del.local.LProtocolDeclDel; import org.scribble.lang.global.GProtocol; +import org.scribble.lang.global.GRecursion; import org.scribble.lang.global.GTypeTranslator; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EGraphBuilderUtil; import org.scribble.model.global.SGraph; import org.scribble.model.global.SGraphBuilderUtil; +import org.scribble.type.SubprotoSig; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.ModuleName; @@ -106,6 +109,10 @@ public void runContextBuildingPasses() throws ScribbleException /*runVisitorPassOnAllModules(ProtocolDeclContextBuilder.class); //..which this pass depends on. This pass basically builds protocol dependency info runVisitorPassOnAllModules(DelegationProtocolRefChecker.class); // Must come after ProtocolDeclContextBuilder runVisitorPassOnAllModules(RoleCollector.class); // Actually, this is the second part of protocoldecl context building*/ + + System.out.println("\nfff1: " + this.jctxt.getMainModule()); + + //runVisitorPassOnAllModules(ProtocolDefInliner.class); // FIXME TODO: refactor into a runVisitorPassOnAllModules for SimpleVisitor (and add operation to ModuleDel) for (ModuleName fullname : this.jctxt.getFullModuleNames()) @@ -118,17 +125,19 @@ public void runContextBuildingPasses() throws ScribbleException this.jctxt.addIntermediate(g.fullname, g); System.out.println("\nparsed:\n" + gpd + "\nintermed:\n" + g); - GProtocol inlined = g.getInlined(this, new LinkedList<>()); + SubprotoSig sig = new SubprotoSig(g.fullname, g.roles, + Collections.emptyList()); // FIXME + Deque stack = new LinkedList<>(); + stack.push(sig); + GRecursion inlined = g.getInlined(t, stack); System.out.println("inlined:\n" + inlined); - this.jctxt.addInlined(inlined.fullname, inlined); + this.jctxt.addInlined(g.fullname, inlined); + + //HERE: convert proto/do to rec/continue, and dismab rec var names (use sig stack for ctxt) } } - - System.out.println("fff1: " + this.jctxt.getMainModule()); - - //runVisitorPassOnAllModules(ProtocolDefInliner.class); - System.out.println("fff2: " + this.jctxt.getMainModule()); + System.out.println("\nfff2: " + this.jctxt.getMainModule()); //runUnfoldingPass(); } diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext.java b/scribble-core/src/main/java/org/scribble/job/JobContext.java index 7ad8bb383..3efb08156 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/job/JobContext.java @@ -24,6 +24,7 @@ import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; import org.scribble.lang.global.GProtocol; +import org.scribble.lang.global.GRecursion; import org.scribble.model.endpoint.AutParser; import org.scribble.model.endpoint.EGraph; import org.scribble.model.global.SGraph; @@ -53,7 +54,8 @@ public class JobContext // "Directly" translated global protos, i.e., separate proto decls without any inlining/unfolding/etc private final Map intermed = new HashMap<>(); // Keys are full names (though GProtocol already includes full name) - private final Map inlined = new HashMap<>(); // Keys are full names (though GProtocol already includes full name) + + private final Map inlined = new HashMap<>(); // Keys are full names private final Map fairEGraphs = new HashMap<>(); private final Map fairSGraphs = new HashMap<>(); @@ -162,12 +164,12 @@ public GProtocol getIntermediate(GProtocolName fullname) return this.intermed.get(fullname); } - public void addInlined(GProtocolName fullname, GProtocol g) + public void addInlined(GProtocolName fullname, GRecursion g) { this.inlined.put(fullname, g); } - public GProtocol getInlined(GProtocolName fullname) + public GRecursion getInlined(GProtocolName fullname) { return this.inlined.get(fullname); } diff --git a/scribble-core/src/main/java/org/scribble/lang/Continue.java b/scribble-core/src/main/java/org/scribble/lang/Continue.java index 8f24206b0..2ac2adee8 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Continue.java +++ b/scribble-core/src/main/java/org/scribble/lang/Continue.java @@ -1,22 +1,49 @@ package org.scribble.lang; +import java.util.Deque; + +import org.scribble.ast.ProtocolKindNode; +import org.scribble.lang.global.GTypeTranslator; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; public abstract class Continue extends SessTypeBase implements SessType { public final RecVar recvar; - public Continue(org.scribble.ast.Continue source, RecVar recvar) + public Continue(//org.scribble.ast.Continue source, + ProtocolKindNode source, // Due to inlining, do -> continue + RecVar recvar) { super(source); this.recvar = recvar; } public abstract Continue reconstruct( - org.scribble.ast.Continue source, RecVar recvar); + org.scribble.ast.ProtocolKindNode source, RecVar recvar); + + @Override + public Continue substitute(Substitutions subs) + { + return reconstruct(getSource(), this.recvar); + } + + @Override + public Continue getInlined(GTypeTranslator t, Deque stack) + { + RecVar rv = t.makeRecVar(stack.peek(), this.recvar); + return reconstruct(getSource(), rv); + } + @Override + public org.scribble.ast.ProtocolKindNode getSource() + { + return (org.scribble.ast.ProtocolKindNode) super.getSource(); + } + @Override public String toString() { diff --git a/scribble-core/src/main/java/org/scribble/lang/Do.java b/scribble-core/src/main/java/org/scribble/lang/Do.java index 184bf2b9d..81a692ab5 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Do.java +++ b/scribble-core/src/main/java/org/scribble/lang/Do.java @@ -1,10 +1,14 @@ package org.scribble.lang; import java.util.Collections; +import java.util.Deque; import java.util.List; import java.util.stream.Collectors; +import org.scribble.lang.global.GTypeTranslator; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.GProtocolName; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; @@ -25,6 +29,14 @@ public Do(org.scribble.ast.Do source, N proto, public abstract Do reconstruct(org.scribble.ast.Do source, N proto, List roles); + + @Override + public Do substitute(Substitutions subs) + { + List roles = this.roles.stream().map(x -> subs.apply(x)) + .collect(Collectors.toList()); + return reconstruct((org.scribble.ast.Do) getSource(), this.proto, roles); + } @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java index b84657d62..75cd57c2f 100644 --- a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java @@ -1,6 +1,10 @@ package org.scribble.lang; +import java.util.Deque; + +import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.Message; +import org.scribble.type.SubprotoSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.Role; @@ -23,6 +27,25 @@ public MessageTransfer(org.scribble.ast.MessageTransfer source, Role src, public abstract MessageTransfer reconstruct( org.scribble.ast.MessageTransfer source, Role src, Message msg, Role dst); + + @Override + public MessageTransfer substitute(Substitutions subs) + { + return reconstruct(getSource(), subs.apply(this.src), this.msg, + subs.apply(this.dst)); + } + + @Override + public MessageTransfer getInlined(GTypeTranslator t, Deque stack) + { + return this; + } + + @Override + public org.scribble.ast.MessageTransfer getSource() + { + return (org.scribble.ast.MessageTransfer) super.getSource(); + } @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/lang/Recursion.java b/scribble-core/src/main/java/org/scribble/lang/Recursion.java index 7fbc07130..fca22ec6a 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/Recursion.java @@ -1,5 +1,6 @@ package org.scribble.lang; +import org.scribble.ast.ProtocolKindNode; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.RecVar; @@ -9,7 +10,9 @@ public abstract class Recursion> public final RecVar recvar; public final B body; - public Recursion(org.scribble.ast.Recursion source, RecVar recvar, B body) + public Recursion(//org.scribble.ast.Recursion source, + ProtocolKindNode source, // Due to inlining, protodecl -> rec + RecVar recvar, B body) { super(source); this.recvar = recvar; @@ -17,7 +20,7 @@ public Recursion(org.scribble.ast.Recursion source, RecVar recvar, B body) } public abstract Recursion reconstruct( - org.scribble.ast.Recursion source, RecVar recvar, B body); + org.scribble.ast.ProtocolKindNode source, RecVar recvar, B body); @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/lang/Seq.java b/scribble-core/src/main/java/org/scribble/lang/Seq.java index 7288e3a97..0b0763bea 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Seq.java +++ b/scribble-core/src/main/java/org/scribble/lang/Seq.java @@ -6,6 +6,7 @@ import org.scribble.ast.InteractionSeq; import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.Role; public abstract class Seq extends SessTypeBase @@ -20,6 +21,20 @@ public Seq(InteractionSeq source, List> elems) public abstract Seq reconstruct(InteractionSeq source, List> elems); + + @Override + public Seq substitute(Substitutions subs) + { + List> elems = this.elems.stream() + .map(x -> x.substitute(subs)).collect(Collectors.toList()); + return reconstruct(getSource(), elems); + } + + @Override + public InteractionSeq getSource() + { + return (InteractionSeq) super.getSource(); + } @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/lang/SessType.java b/scribble-core/src/main/java/org/scribble/lang/SessType.java index cea1f3446..911c1a02b 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SessType.java +++ b/scribble-core/src/main/java/org/scribble/lang/SessType.java @@ -3,9 +3,10 @@ import java.util.Deque; import org.scribble.ast.ProtocolKindNode; -import org.scribble.job.Job; +import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.Role; // CHECKME: move to type.sess? // Generic works to "specialise" G/L subclasses (and works with immutable pattern) -- cf. not supported by contravariant method parameter subtyping for getters/setters @@ -14,10 +15,15 @@ public interface SessType boolean hasSource(); // i.e., was parsed ProtocolKindNode getSource(); // Pre: hasSource - // Top-level call should be on a GProtocol with an empty stack + SessType substitute(Substitutions role); + + // Top-level call should be on a GProtocol with an empty stack -- XXX // stack is treated mutably // Do stack.push to push the next sig onto the stack - SessType getInlined(Job job, Deque stack); + // + // Pre: stack.peek gives call-site sig, i.e., call-site roles/args + // CHECKME: OK to (re-)use GTypeTranslator for inlining? + SessType getInlined(GTypeTranslator t, Deque stack); // FIXME: generalise for locals // Call this using: them.canEquals(this) boolean canEquals(Object o); diff --git a/scribble-core/src/main/java/org/scribble/lang/SessTypeBase.java b/scribble-core/src/main/java/org/scribble/lang/SessTypeBase.java index 71e12ebe5..a88d3339c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SessTypeBase.java +++ b/scribble-core/src/main/java/org/scribble/lang/SessTypeBase.java @@ -7,11 +7,13 @@ public abstract class SessTypeBase implements SessType { - private final ProtocolKindNode source; + private final ProtocolKindNode source; // Currently null for "generated" terms (cf. hasSource) public SessTypeBase(ProtocolKindNode source) { - this.source = source; + @SuppressWarnings("unchecked") // FIXME: + ProtocolKindNode clone = (ProtocolKindNode) source.clone(); // ScribNodes are mutable + this.source = clone; } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java index fc57a82c7..50bbf6591 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -4,8 +4,8 @@ import java.util.List; import java.util.stream.Collectors; -import org.scribble.job.Job; import org.scribble.lang.Choice; +import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -26,11 +26,19 @@ public GChoice reconstruct(org.scribble.ast.Choice source, Role subj, } @Override - public GChoice getInlined(Job job, Deque stack) + public GChoice substitute(Substitutions subs) + { + List blocks = this.blocks.stream().map(x -> x.substitute(subs)) + .collect(Collectors.toList()); + return reconstruct(getSource(), subs.apply(this.subj), blocks); + } + + @Override + public GChoice getInlined(GTypeTranslator t, Deque stack) { org.scribble.ast.global.GChoice source = (org.scribble.ast.global.GChoice) getSource(); // CHECKME: or empty source? - List collect = this.blocks.stream().map(x -> x.getInlined(job, stack)) + List collect = this.blocks.stream().map(x -> x.getInlined(t, stack)) .collect(Collectors.toList()); return new GChoice(source, this.subj, collect); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java index e245a1fe7..6428d67cf 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java @@ -2,38 +2,40 @@ import java.util.Deque; -import org.scribble.job.Job; +import org.scribble.ast.ProtocolKindNode; import org.scribble.lang.Continue; +import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; public class GContinue extends Continue implements GType { - public GContinue(org.scribble.ast.Continue source, RecVar recvar) + public GContinue(//org.scribble.ast.Continue source, + ProtocolKindNode source, // Due to inlining, do -> continue + RecVar recvar) { super(source, recvar); } @Override - public GContinue reconstruct(org.scribble.ast.Continue source, + public GContinue reconstruct(org.scribble.ast.ProtocolKindNode source, RecVar recvar) { return new GContinue(source, recvar); } @Override - public GContinue getInlined(Job job, Deque stack) + public GContinue substitute(Substitutions subs) { - org.scribble.ast.global.GContinue source = - (org.scribble.ast.global.GContinue) getSource(); // CHECKME: or empty source? - return new GContinue(source, this.recvar); + return (GContinue) super.substitute(subs); } - + @Override - public org.scribble.ast.global.GContinue getSource() + public GContinue getInlined(GTypeTranslator t, Deque stack) { - return (org.scribble.ast.global.GContinue) super.getSource(); + return (GContinue) super.getInlined(t, stack); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index d1fde843e..4de6aa8e6 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -4,11 +4,12 @@ import java.util.Deque; import java.util.List; -import org.scribble.job.Job; import org.scribble.lang.Do; +import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; public class GDo extends Do implements GType @@ -27,18 +28,25 @@ public GDo reconstruct(org.scribble.ast.Do source, } @Override - public GType getInlined(Job job, Deque stack) + public GDo substitute(Substitutions subs) + { + return (GDo) super.substitute(subs); + } + + @Override + public GType getInlined(GTypeTranslator t, Deque stack) { GProtocolName fullname = this.proto; SubprotoSig sig = new SubprotoSig(fullname, this.roles, Collections.emptyList()); // FIXME if (stack.contains(sig)) { - return this; + RecVar rv = t.makeRecVar(sig); + return new GContinue(getSource(), rv); } stack.push(sig); - return job.getJobContext().getIntermediate(fullname).body.getInlined(job, - stack); // i.e. returning a GSeq -- rely on parent GSeq to inline + return t.job.getJobContext().getIntermediate(fullname).body + .getInlined(t, stack); // i.e. returning a GSeq -- rely on parent GSeq to inline } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java index 980f5badb..dfb2dc11a 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java @@ -2,8 +2,8 @@ import java.util.Deque; -import org.scribble.job.Job; import org.scribble.lang.MessageTransfer; +import org.scribble.lang.Substitutions; import org.scribble.type.Message; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; @@ -28,9 +28,15 @@ public GMessageTransfer reconstruct( } @Override - public GType getInlined(Job job, Deque stack) + public GMessageTransfer substitute(Substitutions subs) { - return this; + return (GMessageTransfer) super.substitute(subs); + } + + @Override + public GMessageTransfer getInlined(GTypeTranslator t, Deque stack) + { + return (GMessageTransfer) super.getInlined(t, stack); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index edd1cd8c1..a28d38367 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -1,23 +1,25 @@ package org.scribble.lang.global; -import java.util.Collections; import java.util.Deque; import java.util.List; +import java.util.stream.Collectors; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.job.Job; import org.scribble.lang.Protocol; +import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; public class GProtocol extends Protocol implements GType { public GProtocol(ProtocolDecl source, GProtocolName fullname, - List roles, // List params, + List roles, + // List params, // TODO GSeq body) { super(source, fullname, roles, body); @@ -29,17 +31,27 @@ public GProtocol reconstruct(ProtocolDecl source, { return new GProtocol(source, fullname, roles, body); } + + @Override + public GType substitute(Substitutions subs) + { + List roles = this.roles.stream().map(x -> subs.apply(x)) + .collect(Collectors.toList()); + return reconstruct(getSource(), this.fullname, roles, + this.body.substitute(subs)); + } - // Top-level call should give an empty stack - // But stack is non-empty for recursive calls with, e.g., permuted role args + // Pre: stack.peek is the sig for the calling Do (or top-level entry) + // i.e., it gives the roles/args at the call-site @Override - public GProtocol getInlined(Job job, Deque stack) + public GRecursion getInlined(GTypeTranslator t, Deque stack) { - stack.push(new SubprotoSig(this.fullname, this.roles, - Collections.emptyList())); // FIXME + SubprotoSig sig = stack.peek(); + Substitutions subs = new Substitutions<>(this.roles, sig.roles); + GSeq body = this.body.substitute(subs).getInlined(t, stack); GProtocolDecl source = getSource(); // CHECKME: or empty source? - GSeq body = (GSeq) this.body.getInlined(job, stack); - return reconstruct(source, this.fullname, this.roles, body); + RecVar rv = t.makeRecVar(sig); + return new GRecursion(source, rv, body); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java index e1e5773e6..89caa72a1 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java @@ -2,40 +2,43 @@ import java.util.Deque; -import org.scribble.job.Job; +import org.scribble.ast.ProtocolKindNode; import org.scribble.lang.Recursion; +import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; public class GRecursion extends Recursion implements GType { - public GRecursion(org.scribble.ast.Recursion source, RecVar recvar, - GSeq body) + public GRecursion(//org.scribble.ast.Recursion source, + ProtocolKindNode source, // Due to inlining, protocoldecl -> rec + RecVar recvar, GSeq body) { super(source, recvar, body); } @Override - public GRecursion reconstruct(org.scribble.ast.Recursion source, + public GRecursion reconstruct(org.scribble.ast.ProtocolKindNode source, RecVar recvar, GSeq block) { return new GRecursion(source, recvar, block); } - + @Override - public GRecursion getInlined(Job job, Deque stack) + public GRecursion substitute(Substitutions subs) { - org.scribble.ast.global.GRecursion source = - (org.scribble.ast.global.GRecursion) getSource(); // CHECKME: or empty source? - GSeq body = this.body.getInlined(job, stack); - return new GRecursion(source, this.recvar, body); + return reconstruct(getSource(), this.recvar, this.body.substitute(subs)); } - + @Override - public org.scribble.ast.global.GRecursion getSource() + public GRecursion getInlined(GTypeTranslator t, Deque stack) { - return (org.scribble.ast.global.GRecursion) super.getSource(); + org.scribble.ast.ProtocolKindNode source = getSource(); // CHECKME: or empty source? + GSeq body = this.body.getInlined(t, stack); + RecVar rv = t.makeRecVar(stack.peek(), this.recvar); + return reconstruct(source, rv, body); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java index 99f8aa314..70768deaa 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -6,11 +6,12 @@ import org.scribble.ast.InteractionSeq; import org.scribble.ast.global.GInteractionSeq; -import org.scribble.job.Job; import org.scribble.lang.Seq; import org.scribble.lang.SessType; +import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; public class GSeq extends Seq implements GType @@ -29,13 +30,19 @@ public GSeq reconstruct(InteractionSeq source, } @Override - public GSeq getInlined(Job job, Deque stack) + public GSeq substitute(Substitutions subs) + { + return (GSeq) super.substitute(subs); + } + + @Override + public GSeq getInlined(GTypeTranslator t, Deque stack) { GInteractionSeq source = getSource(); // CHECKME: or empty source? List> elems = new LinkedList<>(); for (SessType e : this.elems) { - SessType e1 = e.getInlined(job, stack); + SessType e1 = e.getInlined(t, stack); if (e1 instanceof GSeq) { elems.addAll(((GSeq) e1).elems); // Inline GSeq's returned by GDo::getInlined diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GType.java b/scribble-core/src/main/java/org/scribble/lang/global/GType.java index 285f47cdc..74ac47c45 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GType.java @@ -2,13 +2,17 @@ import java.util.Deque; -import org.scribble.job.Job; import org.scribble.lang.SessType; +import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; public interface GType extends SessType { @Override - GType getInlined(Job job, Deque stack); + GType substitute(Substitutions subs); + + @Override + GType getInlined(GTypeTranslator t, Deque stack); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java b/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java index a85d3bd8a..3c1da9168 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java @@ -1,10 +1,14 @@ package org.scribble.lang.global; +import java.util.stream.Collectors; + import org.scribble.ast.ScribNode; import org.scribble.del.global.GDel; import org.scribble.job.Job; import org.scribble.job.ScribbleException; +import org.scribble.type.SubprotoSig; import org.scribble.type.name.ModuleName; +import org.scribble.type.name.RecVar; import org.scribble.visit.SimpleVisitor; // CHECKME: move to visit package? @@ -20,4 +24,20 @@ public GType visit(ScribNode n) throws ScribbleException { return ((GDel) n.del()).translate(n, this); } + + // sig is the for the current innermost proto + public RecVar makeRecVar(SubprotoSig sig) + { + String lab = "__" + sig.fullname + "__" + + sig.roles.stream().map(x -> x.toString()) + .collect(Collectors.joining("_")) + + "__" + sig.args.stream().map(x -> x.toString()) + .collect(Collectors.joining("_")); + return new RecVar(lab); + } + + public RecVar makeRecVar(SubprotoSig sig, RecVar rv) + { + return new RecVar(makeRecVar(sig).toString() + "__" + rv); + } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index d487d3935..edacbab8e 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -46,8 +46,8 @@ global protocol Proto1(role A, role B) { 2() from A to B; 3() from B to A; - //do Proto1(B, A); - continue X; + do Proto1(B, A); + //continue X; } } } From aec7b548814dc2b2f89b03de39364714dc99cda7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 12 Feb 2019 18:28:59 +0000 Subject: [PATCH 099/539] Continued WIP. --- .../java/org/scribble/del/ContinueDel.java | 2 +- .../src/main/java/org/scribble/job/Job.java | 12 +++- .../main/java/org/scribble/lang/SessType.java | 4 ++ .../org/scribble/lang/SessTypeUnfolder.java | 41 +++++++++++++ .../java/org/scribble/lang/Substitutions.java | 60 +++++++++++++++++++ .../org/scribble/lang/global/GChoice.java | 18 ++++-- .../org/scribble/lang/global/GContinue.java | 11 +++- .../java/org/scribble/lang/global/GDo.java | 6 +- .../lang/global/GMessageTransfer.java | 8 +++ .../org/scribble/lang/global/GProtocol.java | 2 +- .../org/scribble/lang/global/GRecursion.java | 17 +++++- .../java/org/scribble/lang/global/GSeq.java | 21 +++++++ .../java/org/scribble/lang/global/GType.java | 8 +++ .../scribble/lang/global/GTypeUnfolder.java | 14 +++++ .../org/scribble/visit/env/UnfoldingEnv.java | 1 + scribble-test/src/test/scrib/tmp/Test.scr | 38 +++++++++++- 16 files changed, 251 insertions(+), 12 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/lang/SessTypeUnfolder.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/Substitutions.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/global/GTypeUnfolder.java diff --git a/scribble-core/src/main/java/org/scribble/del/ContinueDel.java b/scribble-core/src/main/java/org/scribble/del/ContinueDel.java index caccd8e0f..ec61e82d1 100644 --- a/scribble-core/src/main/java/org/scribble/del/ContinueDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ContinueDel.java @@ -44,7 +44,7 @@ public ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, { Continue cont = (Continue) visited; RecVar rv = cont.getRecVarChild().toName(); - if (unf.isContinueUnguarded(rv)) // Without this, graph building becomes sensitive to the order of choice blocks (specifically, the relative position were the side effect (re-set entry to rec state) of an unguarded continue is performed) + if (unf.isContinueUnguarded(rv)) // Without this, graph building becomes sensitive to the order of choice blocks (specifically, the relative position where the side effect (re-set entry to rec state) of an unguarded continue is performed) { Recursion tmp = unf.getRecVar(rv); if (tmp == null) // Hacky? for recursive unfolding of cached blocks diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 30125bf0c..216e79e61 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -28,7 +28,9 @@ import org.scribble.del.local.LProtocolDeclDel; import org.scribble.lang.global.GProtocol; import org.scribble.lang.global.GRecursion; +import org.scribble.lang.global.GType; import org.scribble.lang.global.GTypeTranslator; +import org.scribble.lang.global.GTypeUnfolder; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EGraphBuilderUtil; import org.scribble.model.global.SGraph; @@ -130,10 +132,14 @@ public void runContextBuildingPasses() throws ScribbleException Deque stack = new LinkedList<>(); stack.push(sig); GRecursion inlined = g.getInlined(t, stack); - System.out.println("inlined:\n" + inlined); + System.out.println("\ninlined:\n" + inlined); this.jctxt.addInlined(g.fullname, inlined); - //HERE: convert proto/do to rec/continue, and dismab rec var names (use sig stack for ctxt) + GTypeUnfolder u1 = new GTypeUnfolder(); + //GTypeUnfolder u2 = new GTypeUnfolder(); + GType unf = (GType) inlined.unfoldAllOnce(u1);//.unfoldAllOnce(u2); CHECKME: twice unfolding? instead of "unguarded"-unfolding? + System.out.println("\nunfolded:\n" + unf); + } } @@ -160,6 +166,8 @@ public void runWellFormednessPasses() throws ScribbleException runVisitorPassOnAllModules(GProtocolValidator.class); } }*/ + + //HERE WF (unfolding? unguarded-unfolder -- and lazy-unfolder-with-choice-pruning, e.g., bad.wfchoice.enabling.threeparty.Test02), projection, validation } // Due to Projector not being a subprotocol visitor, so "external" subprotocols may not be visible in ModuleContext building for the projections of the current root Module diff --git a/scribble-core/src/main/java/org/scribble/lang/SessType.java b/scribble-core/src/main/java/org/scribble/lang/SessType.java index 911c1a02b..c6eefcb54 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SessType.java +++ b/scribble-core/src/main/java/org/scribble/lang/SessType.java @@ -23,8 +23,12 @@ public interface SessType // // Pre: stack.peek gives call-site sig, i.e., call-site roles/args // CHECKME: OK to (re-)use GTypeTranslator for inlining? + // Stack not "internalised", must be "manually" managed -- cf., SubprotocolVisitor SessType getInlined(GTypeTranslator t, Deque stack); // FIXME: generalise for locals + // FIXME: repeat recvar names, including non-shadowing (e.g., choice cases) + SessType unfoldAllOnce(SessTypeUnfolder> u); + // Call this using: them.canEquals(this) boolean canEquals(Object o); } diff --git a/scribble-core/src/main/java/org/scribble/lang/SessTypeUnfolder.java b/scribble-core/src/main/java/org/scribble/lang/SessTypeUnfolder.java new file mode 100644 index 000000000..2eb217f3a --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/SessTypeUnfolder.java @@ -0,0 +1,41 @@ +package org.scribble.lang; + +import java.util.HashMap; +import java.util.Map; + +import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.RecVar; + +public class SessTypeUnfolder> +{ + private final Map recs = new HashMap<>(); + + public SessTypeUnfolder() + { + + } + + public void pushRec(RecVar rv, B body) + { + if (this.recs.containsKey(rv)) + { + throw new RuntimeException("Shouldn't get here: " + rv); + } + this.recs.put(rv, body); + } + + public boolean hasRec(RecVar rv) + { + return this.recs.containsKey(rv); + } + + public B getRec(RecVar rv) + { + return this.recs.get(rv); + } + + /*public B popRec(RecVar rv) + { + return this.recs.remove(rv); + }*/ +} diff --git a/scribble-core/src/main/java/org/scribble/lang/Substitutions.java b/scribble-core/src/main/java/org/scribble/lang/Substitutions.java new file mode 100644 index 000000000..0da9757e4 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/Substitutions.java @@ -0,0 +1,60 @@ +package org.scribble.lang; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.scribble.type.name.Name; + +// CHECKME: move to util? +public class Substitutions> // CHECKME: too restricting? +{ + // Old name -> new name + private final Map subs = new HashMap<>(); + + public Substitutions(List old, List neu) + { + if (old.size() != neu.size()) + { + throw new RuntimeException("Unqeual sizes: " + old + " ; " + neu); + } + Iterator i = neu.iterator(); + for (N n : old) + { + this.subs.put(n, i.next()); + } + } + + /*public void put(N old, N neu) + { + this.subs.put(old, neu); + }*/ + + public N apply(N old) + { + return this.subs.get(old); + } + + @Override + public int hashCode() + { + int hash = 1889; + hash = 31 * hash + this.subs.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof Substitutions)) + { + return false; + } + return this.subs.equals(((Substitutions) o).subs); + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java index 50bbf6591..972417c16 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -5,6 +5,8 @@ import java.util.stream.Collectors; import org.scribble.lang.Choice; +import org.scribble.lang.Seq; +import org.scribble.lang.SessTypeUnfolder; import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; @@ -36,11 +38,19 @@ public GChoice substitute(Substitutions subs) @Override public GChoice getInlined(GTypeTranslator t, Deque stack) { - org.scribble.ast.global.GChoice source = - (org.scribble.ast.global.GChoice) getSource(); // CHECKME: or empty source? - List collect = this.blocks.stream().map(x -> x.getInlined(t, stack)) + org.scribble.ast.global.GChoice source = getSource(); // CHECKME: or empty source? + List blocks = this.blocks.stream().map(x -> x.getInlined(t, stack)) .collect(Collectors.toList()); - return new GChoice(source, this.subj, collect); + return reconstruct(source, this.subj, blocks); + } + + @Override + public GChoice unfoldAllOnce(SessTypeUnfolder> u) + { + org.scribble.ast.global.GChoice source = getSource(); // CHECKME: or empty source? + List blocks = this.blocks.stream().map(x -> x.unfoldAllOnce(u)) + .collect(Collectors.toList()); + return reconstruct(source, this.subj, blocks); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java index 6428d67cf..90c1de404 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java @@ -4,6 +4,8 @@ import org.scribble.ast.ProtocolKindNode; import org.scribble.lang.Continue; +import org.scribble.lang.Seq; +import org.scribble.lang.SessTypeUnfolder; import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; @@ -36,8 +38,15 @@ public GContinue substitute(Substitutions subs) public GContinue getInlined(GTypeTranslator t, Deque stack) { return (GContinue) super.getInlined(t, stack); - } + } + @Override + public GRecursion unfoldAllOnce(SessTypeUnfolder> u) + { + GTypeUnfolder gu = (GTypeUnfolder) u; + return new GRecursion(getSource(), this.recvar, gu.getRec(this.recvar)); // CHECKME: Continue (not Recursion) as the source of the unfolding + } + @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index 4de6aa8e6..0168ca03a 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -36,6 +36,8 @@ public GDo substitute(Substitutions subs) @Override public GType getInlined(GTypeTranslator t, Deque stack) { + Substitutions subs = + new Substitutions<>(this.roles, stack.peek().roles); // FIXME: args GProtocolName fullname = this.proto; SubprotoSig sig = new SubprotoSig(fullname, this.roles, Collections.emptyList()); // FIXME @@ -45,8 +47,10 @@ public GType getInlined(GTypeTranslator t, Deque stack) return new GContinue(getSource(), rv); } stack.push(sig); - return t.job.getJobContext().getIntermediate(fullname).body + GSeq inlined = t.job.getJobContext().getIntermediate(fullname).body.substitute(subs) .getInlined(t, stack); // i.e. returning a GSeq -- rely on parent GSeq to inline + stack.pop(); + return inlined; } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java index dfb2dc11a..9b2021a1b 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java @@ -3,6 +3,8 @@ import java.util.Deque; import org.scribble.lang.MessageTransfer; +import org.scribble.lang.Seq; +import org.scribble.lang.SessTypeUnfolder; import org.scribble.lang.Substitutions; import org.scribble.type.Message; import org.scribble.type.SubprotoSig; @@ -38,6 +40,12 @@ public GMessageTransfer getInlined(GTypeTranslator t, Deque stack) { return (GMessageTransfer) super.getInlined(t, stack); } + + @Override + public GMessageTransfer unfoldAllOnce(SessTypeUnfolder> u) + { + return this; + } @Override public int hashCode() diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index a28d38367..b0476c631 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -47,7 +47,7 @@ public GType substitute(Substitutions subs) public GRecursion getInlined(GTypeTranslator t, Deque stack) { SubprotoSig sig = stack.peek(); - Substitutions subs = new Substitutions<>(this.roles, sig.roles); + Substitutions subs = new Substitutions<>(this.roles, sig.roles); // FIXME: args GSeq body = this.body.substitute(subs).getInlined(t, stack); GProtocolDecl source = getSource(); // CHECKME: or empty source? RecVar rv = t.makeRecVar(sig); diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java index 89caa72a1..f0a76c5fa 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java @@ -4,6 +4,8 @@ import org.scribble.ast.ProtocolKindNode; import org.scribble.lang.Recursion; +import org.scribble.lang.Seq; +import org.scribble.lang.SessTypeUnfolder; import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; @@ -37,10 +39,23 @@ public GRecursion getInlined(GTypeTranslator t, Deque stack) { org.scribble.ast.ProtocolKindNode source = getSource(); // CHECKME: or empty source? GSeq body = this.body.getInlined(t, stack); - RecVar rv = t.makeRecVar(stack.peek(), this.recvar); + RecVar rv = t.makeRecVar(stack.peek(), this.recvar); // FIXME: make GTypeInliner, and record recvars to check freshness (e.g., rec X in two choice cases) return reconstruct(source, rv, body); } + @Override + public GType unfoldAllOnce(SessTypeUnfolder> u) + { + if (!u.hasRec(this.recvar)) + { + GTypeUnfolder gu = (GTypeUnfolder) u; + gu.pushRec(this.recvar, this.body); // Never "popped", relying on recvar disamb by inliner -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs + GType unf = (GType) this.body.unfoldAllOnce(gu); + return unf; + } + return this; + } + @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java index 70768deaa..c44617b0d 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -8,6 +8,7 @@ import org.scribble.ast.global.GInteractionSeq; import org.scribble.lang.Seq; import org.scribble.lang.SessType; +import org.scribble.lang.SessTypeUnfolder; import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; @@ -55,6 +56,26 @@ public GSeq getInlined(GTypeTranslator t, Deque stack) return reconstruct(source, elems); } + @Override + public GSeq unfoldAllOnce(SessTypeUnfolder> u) + { + GInteractionSeq source = getSource(); + List> elems = new LinkedList<>(); + for (SessType e : this.elems) + { + SessType e1 = e.unfoldAllOnce(u); + if (e1 instanceof Seq) + { + elems.addAll(((Seq) e1).elems); + } + else + { + elems.add(e1); + } + } + return reconstruct(source, elems); + } + @Override public GInteractionSeq getSource() { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GType.java b/scribble-core/src/main/java/org/scribble/lang/global/GType.java index 74ac47c45..e6b86876c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GType.java @@ -2,7 +2,9 @@ import java.util.Deque; +import org.scribble.lang.Seq; import org.scribble.lang.SessType; +import org.scribble.lang.SessTypeUnfolder; import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; @@ -15,4 +17,10 @@ public interface GType extends SessType @Override GType getInlined(GTypeTranslator t, Deque stack); + + @Override + default SessType unfoldAllOnce(SessTypeUnfolder> u) + { + throw new RuntimeException("Not supported for: " + this); + } } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GTypeUnfolder.java b/scribble-core/src/main/java/org/scribble/lang/global/GTypeUnfolder.java new file mode 100644 index 000000000..9902db874 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/global/GTypeUnfolder.java @@ -0,0 +1,14 @@ +package org.scribble.lang.global; + +import org.scribble.lang.SessTypeUnfolder; +import org.scribble.type.kind.Global; + +public class GTypeUnfolder extends SessTypeUnfolder +{ + + public GTypeUnfolder() + { + + } + +} diff --git a/scribble-core/src/main/java/org/scribble/visit/env/UnfoldingEnv.java b/scribble-core/src/main/java/org/scribble/visit/env/UnfoldingEnv.java index 2cd200902..cb727ef91 100644 --- a/scribble-core/src/main/java/org/scribble/visit/env/UnfoldingEnv.java +++ b/scribble-core/src/main/java/org/scribble/visit/env/UnfoldingEnv.java @@ -69,6 +69,7 @@ public UnfoldingEnv pushChoiceParent() return copy; } + // Disable unfold upon encountering a guarding action for current choice context public UnfoldingEnv disableUnfold() { UnfoldingEnv copy = copy(); diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index edacbab8e..667423a93 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -34,6 +34,40 @@ module tmp.Test; +/* +global protocol Proto1(role A, role B) +{ + choice at A + { + rec X + { + 1() from A to B; + continue X; + } + } + or + { + 2() from A to B; + } +} +//*/ + +//* +global protocol Proto1(role A, role B) +{ + 1() from A to B; + choice at A + { + do Proto1(A, B); + } + or + { + 2() from A to B; + } +} +//*/ + +/* global protocol Proto1(role A, role B) { rec X @@ -46,11 +80,13 @@ global protocol Proto1(role A, role B) { 2() from A to B; 3() from B to A; - do Proto1(B, A); + //do Proto1(A, B); //continue X; + do Proto1(B, A); } } } +//*/ /* From 773a1edb999b43ef95463b8f6f01a541f8a004ad Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 12 Feb 2019 18:47:40 +0000 Subject: [PATCH 100/539] Continued WIP. --- .../src/main/java/org/scribble/job/Job.java | 12 ++-- .../main/java/org/scribble/lang/Continue.java | 9 +-- .../src/main/java/org/scribble/lang/Do.java | 4 -- .../org/scribble/lang/MessageTransfer.java | 6 +- .../main/java/org/scribble/lang/SessType.java | 7 +-- .../org/scribble/lang/SessTypeInliner.java | 62 +++++++++++++++++++ .../org/scribble/lang/SessTypeUnfolder.java | 2 +- .../org/scribble/lang/global/GChoice.java | 7 +-- .../org/scribble/lang/global/GContinue.java | 8 +-- .../java/org/scribble/lang/global/GDo.java | 18 +++--- .../lang/global/GMessageTransfer.java | 8 +-- .../org/scribble/lang/global/GProtocol.java | 10 +-- .../org/scribble/lang/global/GRecursion.java | 11 ++-- .../java/org/scribble/lang/global/GSeq.java | 7 +-- .../java/org/scribble/lang/global/GType.java | 9 ++- .../scribble/lang/global/GTypeTranslator.java | 8 +-- 16 files changed, 112 insertions(+), 76 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/lang/SessTypeInliner.java diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 216e79e61..9519e8fb1 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -16,8 +16,6 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Collections; -import java.util.Deque; -import java.util.LinkedList; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -26,6 +24,7 @@ import org.scribble.ast.context.ModuleContext; import org.scribble.ast.global.GProtocolDecl; import org.scribble.del.local.LProtocolDeclDel; +import org.scribble.lang.SessTypeInliner; import org.scribble.lang.global.GProtocol; import org.scribble.lang.global.GRecursion; import org.scribble.lang.global.GType; @@ -129,9 +128,10 @@ public void runContextBuildingPasses() throws ScribbleException SubprotoSig sig = new SubprotoSig(g.fullname, g.roles, Collections.emptyList()); // FIXME - Deque stack = new LinkedList<>(); - stack.push(sig); - GRecursion inlined = g.getInlined(t, stack); + //Deque stack = new LinkedList<>(); + SessTypeInliner i = new SessTypeInliner(this); + i.pushSig(sig); // TODO: factor into constructor + GRecursion inlined = g.getInlined(i); System.out.println("\ninlined:\n" + inlined); this.jctxt.addInlined(g.fullname, inlined); @@ -167,7 +167,7 @@ public void runWellFormednessPasses() throws ScribbleException } }*/ - //HERE WF (unfolding? unguarded-unfolder -- and lazy-unfolder-with-choice-pruning, e.g., bad.wfchoice.enabling.threeparty.Test02), projection, validation + //HERE WF (unfolding? unguarded-unfolder -- and lazy-unfolder-with-choice-pruning, e.g., bad.wfchoice.enabling.threeparty.Test02), projection, validation } // Due to Projector not being a subprotocol visitor, so "external" subprotocols may not be visible in ModuleContext building for the projections of the current root Module diff --git a/scribble-core/src/main/java/org/scribble/lang/Continue.java b/scribble-core/src/main/java/org/scribble/lang/Continue.java index 2ac2adee8..80aa08194 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Continue.java +++ b/scribble-core/src/main/java/org/scribble/lang/Continue.java @@ -1,10 +1,6 @@ package org.scribble.lang; -import java.util.Deque; - import org.scribble.ast.ProtocolKindNode; -import org.scribble.lang.global.GTypeTranslator; -import org.scribble.type.SubprotoSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -32,9 +28,10 @@ public Continue substitute(Substitutions subs) } @Override - public Continue getInlined(GTypeTranslator t, Deque stack) + public Continue getInlined(SessTypeInliner i) { - RecVar rv = t.makeRecVar(stack.peek(), this.recvar); + RecVar rv = i.makeRecVar(//stack.peek(), + this.recvar); return reconstruct(getSource(), rv); } diff --git a/scribble-core/src/main/java/org/scribble/lang/Do.java b/scribble-core/src/main/java/org/scribble/lang/Do.java index 81a692ab5..660055714 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Do.java +++ b/scribble-core/src/main/java/org/scribble/lang/Do.java @@ -1,14 +1,10 @@ package org.scribble.lang; import java.util.Collections; -import java.util.Deque; import java.util.List; import java.util.stream.Collectors; -import org.scribble.lang.global.GTypeTranslator; -import org.scribble.type.SubprotoSig; import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.GProtocolName; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java index 75cd57c2f..157d9e39a 100644 --- a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java @@ -1,10 +1,6 @@ package org.scribble.lang; -import java.util.Deque; - -import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.Message; -import org.scribble.type.SubprotoSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.Role; @@ -36,7 +32,7 @@ public MessageTransfer substitute(Substitutions subs) } @Override - public MessageTransfer getInlined(GTypeTranslator t, Deque stack) + public MessageTransfer getInlined(SessTypeInliner i) { return this; } diff --git a/scribble-core/src/main/java/org/scribble/lang/SessType.java b/scribble-core/src/main/java/org/scribble/lang/SessType.java index c6eefcb54..966f9fb0d 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SessType.java +++ b/scribble-core/src/main/java/org/scribble/lang/SessType.java @@ -1,10 +1,6 @@ package org.scribble.lang; -import java.util.Deque; - import org.scribble.ast.ProtocolKindNode; -import org.scribble.lang.global.GTypeTranslator; -import org.scribble.type.SubprotoSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.Role; @@ -24,7 +20,8 @@ public interface SessType // Pre: stack.peek gives call-site sig, i.e., call-site roles/args // CHECKME: OK to (re-)use GTypeTranslator for inlining? // Stack not "internalised", must be "manually" managed -- cf., SubprotocolVisitor - SessType getInlined(GTypeTranslator t, Deque stack); // FIXME: generalise for locals + //SessType getInlined(GTypeTranslator t, Deque stack); // FIXME: generalise for locals + SessType getInlined(SessTypeInliner i); // FIXME: repeat recvar names, including non-shadowing (e.g., choice cases) SessType unfoldAllOnce(SessTypeUnfolder> u); diff --git a/scribble-core/src/main/java/org/scribble/lang/SessTypeInliner.java b/scribble-core/src/main/java/org/scribble/lang/SessTypeInliner.java new file mode 100644 index 000000000..6dd7330a1 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/SessTypeInliner.java @@ -0,0 +1,62 @@ +package org.scribble.lang; + +import java.util.Deque; +import java.util.LinkedList; +import java.util.stream.Collectors; + +import org.scribble.job.Job; +import org.scribble.type.SubprotoSig; +import org.scribble.type.name.RecVar; + +public class SessTypeInliner +{ + public final Job job; + + private final Deque stack = new LinkedList<>(); + + public SessTypeInliner(Job job) + { + this.job = job; + } + + public void pushSig(SubprotoSig sig) + { + if (this.stack.contains(sig)) + { + throw new RuntimeException("Shouldn't get here: " + sig); + } + this.stack.push(sig); + } + + public SubprotoSig peek() + { + return this.stack.peek(); + } + + public boolean hasSig(SubprotoSig sig) + { + return this.stack.contains(sig); + } + + public void popSig() + { + this.stack.pop(); + } + + // sig is the for the current innermost proto + public RecVar makeRecVar(SubprotoSig sig) + { + String lab = "__" + sig.fullname + "__" + + sig.roles.stream().map(x -> x.toString()) + .collect(Collectors.joining("_")) + + "__" + sig.args.stream().map(x -> x.toString()) + .collect(Collectors.joining("_")); + return new RecVar(lab); + } + + public RecVar makeRecVar(//SubprotoSig sig, + RecVar rv) + { + return new RecVar(makeRecVar(this.stack.peek()).toString() + "__" + rv); + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/SessTypeUnfolder.java b/scribble-core/src/main/java/org/scribble/lang/SessTypeUnfolder.java index 2eb217f3a..f9fe4ed3d 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SessTypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/lang/SessTypeUnfolder.java @@ -6,7 +6,7 @@ import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.RecVar; -public class SessTypeUnfolder> +public abstract class SessTypeUnfolder> { private final Map recs = new HashMap<>(); diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java index 972417c16..a277dc89a 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -1,14 +1,13 @@ package org.scribble.lang.global; -import java.util.Deque; import java.util.List; import java.util.stream.Collectors; import org.scribble.lang.Choice; import org.scribble.lang.Seq; +import org.scribble.lang.SessTypeInliner; import org.scribble.lang.SessTypeUnfolder; import org.scribble.lang.Substitutions; -import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -36,10 +35,10 @@ public GChoice substitute(Substitutions subs) } @Override - public GChoice getInlined(GTypeTranslator t, Deque stack) + public GChoice getInlined(SessTypeInliner i )//GTypeTranslator t, Deque stack) { org.scribble.ast.global.GChoice source = getSource(); // CHECKME: or empty source? - List blocks = this.blocks.stream().map(x -> x.getInlined(t, stack)) + List blocks = this.blocks.stream().map(x -> x.getInlined(i)) .collect(Collectors.toList()); return reconstruct(source, this.subj, blocks); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java index 90c1de404..e3f41856f 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java @@ -1,13 +1,11 @@ package org.scribble.lang.global; -import java.util.Deque; - import org.scribble.ast.ProtocolKindNode; import org.scribble.lang.Continue; import org.scribble.lang.Seq; +import org.scribble.lang.SessTypeInliner; import org.scribble.lang.SessTypeUnfolder; import org.scribble.lang.Substitutions; -import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -35,9 +33,9 @@ public GContinue substitute(Substitutions subs) } @Override - public GContinue getInlined(GTypeTranslator t, Deque stack) + public GContinue getInlined(SessTypeInliner i)//, Deque stack) { - return (GContinue) super.getInlined(t, stack); + return (GContinue) super.getInlined(i); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index 0168ca03a..955eb4b30 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -1,10 +1,10 @@ package org.scribble.lang.global; import java.util.Collections; -import java.util.Deque; import java.util.List; import org.scribble.lang.Do; +import org.scribble.lang.SessTypeInliner; import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; @@ -34,22 +34,22 @@ public GDo substitute(Substitutions subs) } @Override - public GType getInlined(GTypeTranslator t, Deque stack) + public GType getInlined(SessTypeInliner i)//, Deque stack) { Substitutions subs = - new Substitutions<>(this.roles, stack.peek().roles); // FIXME: args + new Substitutions<>(this.roles, i.peek().roles); // FIXME: args GProtocolName fullname = this.proto; SubprotoSig sig = new SubprotoSig(fullname, this.roles, Collections.emptyList()); // FIXME - if (stack.contains(sig)) + if (i.hasSig(sig)) { - RecVar rv = t.makeRecVar(sig); + RecVar rv = i.makeRecVar(sig); return new GContinue(getSource(), rv); } - stack.push(sig); - GSeq inlined = t.job.getJobContext().getIntermediate(fullname).body.substitute(subs) - .getInlined(t, stack); // i.e. returning a GSeq -- rely on parent GSeq to inline - stack.pop(); + i.pushSig(sig); + GSeq inlined = i.job.getJobContext().getIntermediate(fullname).body.substitute(subs) + .getInlined(i);//, stack); // i.e. returning a GSeq -- rely on parent GSeq to inline + i.popSig(); return inlined; } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java index 9b2021a1b..3eef0f16f 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java @@ -1,13 +1,11 @@ package org.scribble.lang.global; -import java.util.Deque; - import org.scribble.lang.MessageTransfer; import org.scribble.lang.Seq; +import org.scribble.lang.SessTypeInliner; import org.scribble.lang.SessTypeUnfolder; import org.scribble.lang.Substitutions; import org.scribble.type.Message; -import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -36,9 +34,9 @@ public GMessageTransfer substitute(Substitutions subs) } @Override - public GMessageTransfer getInlined(GTypeTranslator t, Deque stack) + public GMessageTransfer getInlined(SessTypeInliner i)//, Deque stack) { - return (GMessageTransfer) super.getInlined(t, stack); + return (GMessageTransfer) super.getInlined(i); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index b0476c631..05e013467 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -1,12 +1,12 @@ package org.scribble.lang.global; -import java.util.Deque; import java.util.List; import java.util.stream.Collectors; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.global.GProtocolDecl; import org.scribble.lang.Protocol; +import org.scribble.lang.SessTypeInliner; import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; @@ -44,13 +44,13 @@ public GType substitute(Substitutions subs) // Pre: stack.peek is the sig for the calling Do (or top-level entry) // i.e., it gives the roles/args at the call-site @Override - public GRecursion getInlined(GTypeTranslator t, Deque stack) + public GRecursion getInlined(SessTypeInliner i)//, Deque stack) { - SubprotoSig sig = stack.peek(); + SubprotoSig sig = i.peek(); Substitutions subs = new Substitutions<>(this.roles, sig.roles); // FIXME: args - GSeq body = this.body.substitute(subs).getInlined(t, stack); + GSeq body = this.body.substitute(subs).getInlined(i);//, stack); GProtocolDecl source = getSource(); // CHECKME: or empty source? - RecVar rv = t.makeRecVar(sig); + RecVar rv = i.makeRecVar(sig); return new GRecursion(source, rv, body); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java index f0a76c5fa..6d50bb26a 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java @@ -1,13 +1,11 @@ package org.scribble.lang.global; -import java.util.Deque; - import org.scribble.ast.ProtocolKindNode; import org.scribble.lang.Recursion; import org.scribble.lang.Seq; +import org.scribble.lang.SessTypeInliner; import org.scribble.lang.SessTypeUnfolder; import org.scribble.lang.Substitutions; -import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -35,11 +33,12 @@ public GRecursion substitute(Substitutions subs) } @Override - public GRecursion getInlined(GTypeTranslator t, Deque stack) + public GRecursion getInlined(SessTypeInliner i)//, Deque stack) { org.scribble.ast.ProtocolKindNode source = getSource(); // CHECKME: or empty source? - GSeq body = this.body.getInlined(t, stack); - RecVar rv = t.makeRecVar(stack.peek(), this.recvar); // FIXME: make GTypeInliner, and record recvars to check freshness (e.g., rec X in two choice cases) + GSeq body = this.body.getInlined(i);//, stack); + RecVar rv = i.makeRecVar(//stack.peek(), + this.recvar); // FIXME: make GTypeInliner, and record recvars to check freshness (e.g., rec X in two choice cases) return reconstruct(source, rv, body); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java index c44617b0d..1a052979d 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -1,6 +1,5 @@ package org.scribble.lang.global; -import java.util.Deque; import java.util.LinkedList; import java.util.List; @@ -8,9 +7,9 @@ import org.scribble.ast.global.GInteractionSeq; import org.scribble.lang.Seq; import org.scribble.lang.SessType; +import org.scribble.lang.SessTypeInliner; import org.scribble.lang.SessTypeUnfolder; import org.scribble.lang.Substitutions; -import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -37,13 +36,13 @@ public GSeq substitute(Substitutions subs) } @Override - public GSeq getInlined(GTypeTranslator t, Deque stack) + public GSeq getInlined(SessTypeInliner i)//, Deque stack) { GInteractionSeq source = getSource(); // CHECKME: or empty source? List> elems = new LinkedList<>(); for (SessType e : this.elems) { - SessType e1 = e.getInlined(t, stack); + SessType e1 = e.getInlined(i);//, stack); if (e1 instanceof GSeq) { elems.addAll(((GSeq) e1).elems); // Inline GSeq's returned by GDo::getInlined diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GType.java b/scribble-core/src/main/java/org/scribble/lang/global/GType.java index e6b86876c..8179c2809 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GType.java @@ -1,12 +1,10 @@ package org.scribble.lang.global; -import java.util.Deque; - import org.scribble.lang.Seq; import org.scribble.lang.SessType; +import org.scribble.lang.SessTypeInliner; import org.scribble.lang.SessTypeUnfolder; import org.scribble.lang.Substitutions; -import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -16,10 +14,11 @@ public interface GType extends SessType GType substitute(Substitutions subs); @Override - GType getInlined(GTypeTranslator t, Deque stack); + GType getInlined(SessTypeInliner i);//, Deque stack); @Override - default SessType unfoldAllOnce(SessTypeUnfolder> u) + default SessType unfoldAllOnce( + SessTypeUnfolder> u) { throw new RuntimeException("Not supported for: " + this); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java b/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java index 3c1da9168..86a3df428 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java @@ -1,14 +1,10 @@ package org.scribble.lang.global; -import java.util.stream.Collectors; - import org.scribble.ast.ScribNode; import org.scribble.del.global.GDel; import org.scribble.job.Job; import org.scribble.job.ScribbleException; -import org.scribble.type.SubprotoSig; import org.scribble.type.name.ModuleName; -import org.scribble.type.name.RecVar; import org.scribble.visit.SimpleVisitor; // CHECKME: move to visit package? @@ -25,7 +21,7 @@ public GType visit(ScribNode n) throws ScribbleException return ((GDel) n.del()).translate(n, this); } - // sig is the for the current innermost proto + /*// sig is the for the current innermost proto public RecVar makeRecVar(SubprotoSig sig) { String lab = "__" + sig.fullname + "__" @@ -39,5 +35,5 @@ public RecVar makeRecVar(SubprotoSig sig) public RecVar makeRecVar(SubprotoSig sig, RecVar rv) { return new RecVar(makeRecVar(sig).toString() + "__" + rv); - } + }*/ } From 1d0a6e87714179f1b233cf1fab58a938e4780594 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 13 Feb 2019 11:42:22 +0000 Subject: [PATCH 101/539] Continued WIP. --- .../src/main/java/org/scribble/job/Job.java | 9 ++++--- .../main/java/org/scribble/lang/Choice.java | 2 +- .../main/java/org/scribble/lang/Continue.java | 4 +-- .../src/main/java/org/scribble/lang/Do.java | 2 +- .../org/scribble/lang/MessageTransfer.java | 4 +-- .../main/java/org/scribble/lang/Protocol.java | 2 +- .../java/org/scribble/lang/Recursion.java | 2 +- .../lang/{SessType.java => SType.java} | 8 +++--- .../{SessTypeBase.java => STypeBase.java} | 10 +++---- ...SessTypeInliner.java => STypeInliner.java} | 4 +-- ...ssTypeUnfolder.java => STypeUnfolder.java} | 10 +++---- .../src/main/java/org/scribble/lang/Seq.java | 10 +++---- .../org/scribble/lang/global/GChoice.java | 9 +++---- .../org/scribble/lang/global/GContinue.java | 15 ++++++----- .../java/org/scribble/lang/global/GDo.java | 4 +-- .../lang/global/GMessageTransfer.java | 9 +++---- .../org/scribble/lang/global/GProtocol.java | 4 +-- .../org/scribble/lang/global/GRecursion.java | 14 +++++----- .../java/org/scribble/lang/global/GSeq.java | 26 +++++++++---------- .../java/org/scribble/lang/global/GType.java | 15 +++++------ .../scribble/lang/global/GTypeUnfolder.java | 14 ---------- .../java/org/scribble/type/name/Role.java | 1 + 22 files changed, 81 insertions(+), 97 deletions(-) rename scribble-core/src/main/java/org/scribble/lang/{SessType.java => SType.java} (83%) rename scribble-core/src/main/java/org/scribble/lang/{SessTypeBase.java => STypeBase.java} (82%) rename scribble-core/src/main/java/org/scribble/lang/{SessTypeInliner.java => STypeInliner.java} (95%) rename scribble-core/src/main/java/org/scribble/lang/{SessTypeUnfolder.java => STypeUnfolder.java} (68%) delete mode 100644 scribble-core/src/main/java/org/scribble/lang/global/GTypeUnfolder.java diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 9519e8fb1..b9702e4b9 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -24,17 +24,18 @@ import org.scribble.ast.context.ModuleContext; import org.scribble.ast.global.GProtocolDecl; import org.scribble.del.local.LProtocolDeclDel; -import org.scribble.lang.SessTypeInliner; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; import org.scribble.lang.global.GProtocol; import org.scribble.lang.global.GRecursion; import org.scribble.lang.global.GType; import org.scribble.lang.global.GTypeTranslator; -import org.scribble.lang.global.GTypeUnfolder; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EGraphBuilderUtil; import org.scribble.model.global.SGraph; import org.scribble.model.global.SGraphBuilderUtil; import org.scribble.type.SubprotoSig; +import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.ModuleName; @@ -129,13 +130,13 @@ public void runContextBuildingPasses() throws ScribbleException SubprotoSig sig = new SubprotoSig(g.fullname, g.roles, Collections.emptyList()); // FIXME //Deque stack = new LinkedList<>(); - SessTypeInliner i = new SessTypeInliner(this); + STypeInliner i = new STypeInliner(this); i.pushSig(sig); // TODO: factor into constructor GRecursion inlined = g.getInlined(i); System.out.println("\ninlined:\n" + inlined); this.jctxt.addInlined(g.fullname, inlined); - GTypeUnfolder u1 = new GTypeUnfolder(); + STypeUnfolder u1 = new STypeUnfolder<>(); //GTypeUnfolder u2 = new GTypeUnfolder(); GType unf = (GType) inlined.unfoldAllOnce(u1);//.unfoldAllOnce(u2); CHECKME: twice unfolding? instead of "unguarded"-unfolding? System.out.println("\nunfolded:\n" + unf); diff --git a/scribble-core/src/main/java/org/scribble/lang/Choice.java b/scribble-core/src/main/java/org/scribble/lang/Choice.java index fbc021dc4..84a48d311 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Choice.java +++ b/scribble-core/src/main/java/org/scribble/lang/Choice.java @@ -8,7 +8,7 @@ import org.scribble.type.name.Role; public abstract class Choice> - extends SessTypeBase implements SessType + extends STypeBase implements SType { public final Role subj; public final List blocks; // Pre: size > 0 diff --git a/scribble-core/src/main/java/org/scribble/lang/Continue.java b/scribble-core/src/main/java/org/scribble/lang/Continue.java index 80aa08194..e03c7f9d5 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Continue.java +++ b/scribble-core/src/main/java/org/scribble/lang/Continue.java @@ -6,7 +6,7 @@ import org.scribble.type.name.Role; public abstract class Continue - extends SessTypeBase implements SessType + extends STypeBase implements SType { public final RecVar recvar; @@ -28,7 +28,7 @@ public Continue substitute(Substitutions subs) } @Override - public Continue getInlined(SessTypeInliner i) + public Continue getInlined(STypeInliner i) { RecVar rv = i.makeRecVar(//stack.peek(), this.recvar); diff --git a/scribble-core/src/main/java/org/scribble/lang/Do.java b/scribble-core/src/main/java/org/scribble/lang/Do.java index 660055714..4fab43572 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Do.java +++ b/scribble-core/src/main/java/org/scribble/lang/Do.java @@ -9,7 +9,7 @@ import org.scribble.type.name.Role; public abstract class Do> - extends SessTypeBase implements SessType + extends STypeBase implements SType { public final N proto; // Currently disamb'd to fullname by GTypeTranslator (see GDoDel::translate) public final List roles; // Ordered role args; pre: size > 1 diff --git a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java index 157d9e39a..cb4395d51 100644 --- a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java @@ -5,7 +5,7 @@ import org.scribble.type.name.Role; public abstract class MessageTransfer - extends SessTypeBase implements SessType + extends STypeBase implements SType { public final Role src; public final Message msg; @@ -32,7 +32,7 @@ public MessageTransfer substitute(Substitutions subs) } @Override - public MessageTransfer getInlined(SessTypeInliner i) + public MessageTransfer getInlined(STypeInliner i) { return this; } diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index fb0be3848..ce8229f62 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -10,7 +10,7 @@ import org.scribble.type.name.Role; public abstract class Protocol, B extends Seq> - extends SessTypeBase + extends STypeBase { public final N fullname; public final List roles; // Ordered role params; pre: size >= 2 diff --git a/scribble-core/src/main/java/org/scribble/lang/Recursion.java b/scribble-core/src/main/java/org/scribble/lang/Recursion.java index fca22ec6a..d40539f85 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/Recursion.java @@ -5,7 +5,7 @@ import org.scribble.type.name.RecVar; public abstract class Recursion> - extends SessTypeBase implements SessType + extends STypeBase implements SType { public final RecVar recvar; public final B body; diff --git a/scribble-core/src/main/java/org/scribble/lang/SessType.java b/scribble-core/src/main/java/org/scribble/lang/SType.java similarity index 83% rename from scribble-core/src/main/java/org/scribble/lang/SessType.java rename to scribble-core/src/main/java/org/scribble/lang/SType.java index 966f9fb0d..221f8e7d2 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SessType.java +++ b/scribble-core/src/main/java/org/scribble/lang/SType.java @@ -6,12 +6,12 @@ // CHECKME: move to type.sess? // Generic works to "specialise" G/L subclasses (and works with immutable pattern) -- cf. not supported by contravariant method parameter subtyping for getters/setters -public interface SessType +public interface SType { boolean hasSource(); // i.e., was parsed ProtocolKindNode getSource(); // Pre: hasSource - SessType substitute(Substitutions role); + SType substitute(Substitutions role); // Top-level call should be on a GProtocol with an empty stack -- XXX // stack is treated mutably @@ -21,10 +21,10 @@ public interface SessType // CHECKME: OK to (re-)use GTypeTranslator for inlining? // Stack not "internalised", must be "manually" managed -- cf., SubprotocolVisitor //SessType getInlined(GTypeTranslator t, Deque stack); // FIXME: generalise for locals - SessType getInlined(SessTypeInliner i); + SType getInlined(STypeInliner i); // FIXME: repeat recvar names, including non-shadowing (e.g., choice cases) - SessType unfoldAllOnce(SessTypeUnfolder> u); + SType unfoldAllOnce(STypeUnfolder u); // Call this using: them.canEquals(this) boolean canEquals(Object o); diff --git a/scribble-core/src/main/java/org/scribble/lang/SessTypeBase.java b/scribble-core/src/main/java/org/scribble/lang/STypeBase.java similarity index 82% rename from scribble-core/src/main/java/org/scribble/lang/SessTypeBase.java rename to scribble-core/src/main/java/org/scribble/lang/STypeBase.java index a88d3339c..c31fe092e 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SessTypeBase.java +++ b/scribble-core/src/main/java/org/scribble/lang/STypeBase.java @@ -4,12 +4,12 @@ import org.scribble.type.kind.ProtocolKind; // SessTypeBase is to SessType as ScribNodeBase is to ScribNode -public abstract class SessTypeBase - implements SessType +public abstract class STypeBase + implements SType { private final ProtocolKindNode source; // Currently null for "generated" terms (cf. hasSource) - public SessTypeBase(ProtocolKindNode source) + public STypeBase(ProtocolKindNode source) { @SuppressWarnings("unchecked") // FIXME: ProtocolKindNode clone = (ProtocolKindNode) source.clone(); // ScribNodes are mutable @@ -45,11 +45,11 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof SessTypeBase)) + if (!(o instanceof STypeBase)) { return false; } - SessTypeBase them = (SessTypeBase) o; + STypeBase them = (STypeBase) o; return them.canEquals(this); } } diff --git a/scribble-core/src/main/java/org/scribble/lang/SessTypeInliner.java b/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/lang/SessTypeInliner.java rename to scribble-core/src/main/java/org/scribble/lang/STypeInliner.java index 6dd7330a1..f42ae5668 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SessTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java @@ -8,13 +8,13 @@ import org.scribble.type.SubprotoSig; import org.scribble.type.name.RecVar; -public class SessTypeInliner +public class STypeInliner { public final Job job; private final Deque stack = new LinkedList<>(); - public SessTypeInliner(Job job) + public STypeInliner(Job job) { this.job = job; } diff --git a/scribble-core/src/main/java/org/scribble/lang/SessTypeUnfolder.java b/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java similarity index 68% rename from scribble-core/src/main/java/org/scribble/lang/SessTypeUnfolder.java rename to scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java index f9fe4ed3d..f9778ac95 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SessTypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java @@ -6,16 +6,16 @@ import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.RecVar; -public abstract class SessTypeUnfolder> +public class STypeUnfolder { - private final Map recs = new HashMap<>(); + private final Map> recs = new HashMap<>(); - public SessTypeUnfolder() + public STypeUnfolder() { } - public void pushRec(RecVar rv, B body) + public void pushRec(RecVar rv, Seq body) { if (this.recs.containsKey(rv)) { @@ -29,7 +29,7 @@ public boolean hasRec(RecVar rv) return this.recs.containsKey(rv); } - public B getRec(RecVar rv) + public Seq getRec(RecVar rv) { return this.recs.get(rv); } diff --git a/scribble-core/src/main/java/org/scribble/lang/Seq.java b/scribble-core/src/main/java/org/scribble/lang/Seq.java index 0b0763bea..34efb6b44 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Seq.java +++ b/scribble-core/src/main/java/org/scribble/lang/Seq.java @@ -9,23 +9,23 @@ import org.scribble.type.name.Role; public abstract class Seq - extends SessTypeBase + extends STypeBase { - public final List> elems; // GType or LType + public final List> elems; // GType or LType - public Seq(InteractionSeq source, List> elems) + public Seq(InteractionSeq source, List> elems) { super(source); this.elems = Collections.unmodifiableList(elems); } public abstract Seq reconstruct(InteractionSeq source, - List> elems); + List> elems); @Override public Seq substitute(Substitutions subs) { - List> elems = this.elems.stream() + List> elems = this.elems.stream() .map(x -> x.substitute(subs)).collect(Collectors.toList()); return reconstruct(getSource(), elems); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java index a277dc89a..030161584 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -4,9 +4,8 @@ import java.util.stream.Collectors; import org.scribble.lang.Choice; -import org.scribble.lang.Seq; -import org.scribble.lang.SessTypeInliner; -import org.scribble.lang.SessTypeUnfolder; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -35,7 +34,7 @@ public GChoice substitute(Substitutions subs) } @Override - public GChoice getInlined(SessTypeInliner i )//GTypeTranslator t, Deque stack) + public GChoice getInlined(STypeInliner i )//GTypeTranslator t, Deque stack) { org.scribble.ast.global.GChoice source = getSource(); // CHECKME: or empty source? List blocks = this.blocks.stream().map(x -> x.getInlined(i)) @@ -44,7 +43,7 @@ public GChoice getInlined(SessTypeInliner i )//GTypeTranslator t, Deque> u) + public GChoice unfoldAllOnce(STypeUnfolder u) { org.scribble.ast.global.GChoice source = getSource(); // CHECKME: or empty source? List blocks = this.blocks.stream().map(x -> x.unfoldAllOnce(u)) diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java index e3f41856f..46cac4eb5 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java @@ -2,9 +2,8 @@ import org.scribble.ast.ProtocolKindNode; import org.scribble.lang.Continue; -import org.scribble.lang.Seq; -import org.scribble.lang.SessTypeInliner; -import org.scribble.lang.SessTypeUnfolder; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; @@ -33,16 +32,18 @@ public GContinue substitute(Substitutions subs) } @Override - public GContinue getInlined(SessTypeInliner i)//, Deque stack) + public GContinue getInlined(STypeInliner i)//, Deque stack) { return (GContinue) super.getInlined(i); } @Override - public GRecursion unfoldAllOnce(SessTypeUnfolder> u) + public GRecursion unfoldAllOnce( + STypeUnfolder u) { - GTypeUnfolder gu = (GTypeUnfolder) u; - return new GRecursion(getSource(), this.recvar, gu.getRec(this.recvar)); // CHECKME: Continue (not Recursion) as the source of the unfolding + return new GRecursion(getSource(), this.recvar, + (GSeq) u.getRec(this.recvar)); + // CHECKME: Continue (not Recursion) as the source of the unfolding } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index 955eb4b30..c317b2dc8 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -4,7 +4,7 @@ import java.util.List; import org.scribble.lang.Do; -import org.scribble.lang.SessTypeInliner; +import org.scribble.lang.STypeInliner; import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; @@ -34,7 +34,7 @@ public GDo substitute(Substitutions subs) } @Override - public GType getInlined(SessTypeInliner i)//, Deque stack) + public GType getInlined(STypeInliner i)//, Deque stack) { Substitutions subs = new Substitutions<>(this.roles, i.peek().roles); // FIXME: args diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java index 3eef0f16f..bebf6ae8c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java @@ -1,9 +1,8 @@ package org.scribble.lang.global; import org.scribble.lang.MessageTransfer; -import org.scribble.lang.Seq; -import org.scribble.lang.SessTypeInliner; -import org.scribble.lang.SessTypeUnfolder; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; import org.scribble.type.Message; import org.scribble.type.kind.Global; @@ -34,13 +33,13 @@ public GMessageTransfer substitute(Substitutions subs) } @Override - public GMessageTransfer getInlined(SessTypeInliner i)//, Deque stack) + public GMessageTransfer getInlined(STypeInliner i)//, Deque stack) { return (GMessageTransfer) super.getInlined(i); } @Override - public GMessageTransfer unfoldAllOnce(SessTypeUnfolder> u) + public GMessageTransfer unfoldAllOnce(STypeUnfolder u) { return this; } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index 05e013467..a7d25e41a 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -6,7 +6,7 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.global.GProtocolDecl; import org.scribble.lang.Protocol; -import org.scribble.lang.SessTypeInliner; +import org.scribble.lang.STypeInliner; import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; @@ -44,7 +44,7 @@ public GType substitute(Substitutions subs) // Pre: stack.peek is the sig for the calling Do (or top-level entry) // i.e., it gives the roles/args at the call-site @Override - public GRecursion getInlined(SessTypeInliner i)//, Deque stack) + public GRecursion getInlined(STypeInliner i)//, Deque stack) { SubprotoSig sig = i.peek(); Substitutions subs = new Substitutions<>(this.roles, sig.roles); // FIXME: args diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java index 6d50bb26a..9604df457 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java @@ -2,9 +2,8 @@ import org.scribble.ast.ProtocolKindNode; import org.scribble.lang.Recursion; -import org.scribble.lang.Seq; -import org.scribble.lang.SessTypeInliner; -import org.scribble.lang.SessTypeUnfolder; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; @@ -33,7 +32,7 @@ public GRecursion substitute(Substitutions subs) } @Override - public GRecursion getInlined(SessTypeInliner i)//, Deque stack) + public GRecursion getInlined(STypeInliner i)//, Deque stack) { org.scribble.ast.ProtocolKindNode source = getSource(); // CHECKME: or empty source? GSeq body = this.body.getInlined(i);//, stack); @@ -43,13 +42,12 @@ public GRecursion getInlined(SessTypeInliner i)//, Deque stack) } @Override - public GType unfoldAllOnce(SessTypeUnfolder> u) + public GType unfoldAllOnce(STypeUnfolder u) { if (!u.hasRec(this.recvar)) { - GTypeUnfolder gu = (GTypeUnfolder) u; - gu.pushRec(this.recvar, this.body); // Never "popped", relying on recvar disamb by inliner -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs - GType unf = (GType) this.body.unfoldAllOnce(gu); + u.pushRec(this.recvar, this.body); // Never "popped", relying on recvar disamb by inliner -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs + GType unf = (GType) this.body.unfoldAllOnce(u); return unf; } return this; diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java index 1a052979d..b62a5a668 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -6,9 +6,9 @@ import org.scribble.ast.InteractionSeq; import org.scribble.ast.global.GInteractionSeq; import org.scribble.lang.Seq; -import org.scribble.lang.SessType; -import org.scribble.lang.SessTypeInliner; -import org.scribble.lang.SessTypeUnfolder; +import org.scribble.lang.SType; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -17,14 +17,14 @@ public class GSeq extends Seq implements GType { // GInteractionSeq or GBlock better as source? - public GSeq(InteractionSeq source, List> elems) + public GSeq(InteractionSeq source, List> elems) { super(source, elems); } @Override public GSeq reconstruct(InteractionSeq source, - List> elems) + List> elems) { return new GSeq(source, elems); } @@ -36,13 +36,13 @@ public GSeq substitute(Substitutions subs) } @Override - public GSeq getInlined(SessTypeInliner i)//, Deque stack) + public GSeq getInlined(STypeInliner i)//, Deque stack) { GInteractionSeq source = getSource(); // CHECKME: or empty source? - List> elems = new LinkedList<>(); - for (SessType e : this.elems) + List> elems = new LinkedList<>(); + for (SType e : this.elems) { - SessType e1 = e.getInlined(i);//, stack); + SType e1 = e.getInlined(i);//, stack); if (e1 instanceof GSeq) { elems.addAll(((GSeq) e1).elems); // Inline GSeq's returned by GDo::getInlined @@ -56,13 +56,13 @@ public GSeq getInlined(SessTypeInliner i)//, Deque stack) } @Override - public GSeq unfoldAllOnce(SessTypeUnfolder> u) + public GSeq unfoldAllOnce(STypeUnfolder u) { GInteractionSeq source = getSource(); - List> elems = new LinkedList<>(); - for (SessType e : this.elems) + List> elems = new LinkedList<>(); + for (SType e : this.elems) { - SessType e1 = e.unfoldAllOnce(u); + SType e1 = e.unfoldAllOnce(u); if (e1 instanceof Seq) { elems.addAll(((Seq) e1).elems); diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GType.java b/scribble-core/src/main/java/org/scribble/lang/global/GType.java index 8179c2809..b2474ed9b 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GType.java @@ -1,24 +1,23 @@ package org.scribble.lang.global; -import org.scribble.lang.Seq; -import org.scribble.lang.SessType; -import org.scribble.lang.SessTypeInliner; -import org.scribble.lang.SessTypeUnfolder; +import org.scribble.lang.SType; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; -public interface GType extends SessType +public interface GType extends SType { @Override GType substitute(Substitutions subs); @Override - GType getInlined(SessTypeInliner i);//, Deque stack); + GType getInlined(STypeInliner i);//, Deque stack); @Override - default SessType unfoldAllOnce( - SessTypeUnfolder> u) + default SType unfoldAllOnce( + STypeUnfolder u) { throw new RuntimeException("Not supported for: " + this); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GTypeUnfolder.java b/scribble-core/src/main/java/org/scribble/lang/global/GTypeUnfolder.java deleted file mode 100644 index 9902db874..000000000 --- a/scribble-core/src/main/java/org/scribble/lang/global/GTypeUnfolder.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.scribble.lang.global; - -import org.scribble.lang.SessTypeUnfolder; -import org.scribble.type.kind.Global; - -public class GTypeUnfolder extends SessTypeUnfolder -{ - - public GTypeUnfolder() - { - - } - -} diff --git a/scribble-core/src/main/java/org/scribble/type/name/Role.java b/scribble-core/src/main/java/org/scribble/type/name/Role.java index fa537fa51..218a3b7db 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/Role.java +++ b/scribble-core/src/main/java/org/scribble/type/name/Role.java @@ -19,6 +19,7 @@ public class Role extends AbstractName { public static final Role EMPTY_ROLE = new Role(); + public static final Role SELF = new Role("self"); // TODO Factor out constant private static final long serialVersionUID = 1L; From 6ab2ada21e9bcf65d8fe0af54704f763c6759cae Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 13 Feb 2019 11:42:48 +0000 Subject: [PATCH 102/539] Continued WIP. --- .../java/org/scribble/lang/local/LChoice.java | 87 ++++++++++++++ .../org/scribble/lang/local/LContinue.java | 75 ++++++++++++ .../java/org/scribble/lang/local/LDo.java | 91 ++++++++++++++ .../org/scribble/lang/local/LProtocol.java | 96 +++++++++++++++ .../java/org/scribble/lang/local/LRcv.java | 82 +++++++++++++ .../org/scribble/lang/local/LRecursion.java | 83 +++++++++++++ .../java/org/scribble/lang/local/LSend.java | 82 +++++++++++++ .../java/org/scribble/lang/local/LSeq.java | 111 ++++++++++++++++++ .../java/org/scribble/lang/local/LType.java | 25 ++++ 9 files changed, 732 insertions(+) create mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LChoice.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LContinue.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LDo.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LRcv.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LSend.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LSeq.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LType.java diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java new file mode 100644 index 000000000..047b772ea --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java @@ -0,0 +1,87 @@ +package org.scribble.lang.local; + +import java.util.List; +import java.util.stream.Collectors; + +import org.scribble.lang.Choice; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.Substitutions; +import org.scribble.type.kind.Local; +import org.scribble.type.name.Role; + +public class LChoice extends Choice implements LType +{ + public LChoice(org.scribble.ast.Choice source, Role subj, + List blocks) + { + super(source, subj, blocks); + } + + @Override + public LChoice reconstruct(org.scribble.ast.Choice source, Role subj, + List blocks) + { + return new LChoice(source, subj, blocks); + } + + @Override + public LChoice substitute(Substitutions subs) + { + List blocks = this.blocks.stream().map(x -> x.substitute(subs)) + .collect(Collectors.toList()); + return reconstruct(getSource(), subs.apply(this.subj), blocks); + } + + @Override + public LChoice getInlined(STypeInliner i )//GTypeTranslator t, Deque stack) + { + org.scribble.ast.local.LChoice source = getSource(); // CHECKME: or empty source? + List blocks = this.blocks.stream().map(x -> x.getInlined(i)) + .collect(Collectors.toList()); + return reconstruct(source, this.subj, blocks); + } + + @Override + public LChoice unfoldAllOnce(STypeUnfolder u) + { + org.scribble.ast.local.LChoice source = getSource(); // CHECKME: or empty source? + List blocks = this.blocks.stream().map(x -> x.unfoldAllOnce(u)) + .collect(Collectors.toList()); + return reconstruct(source, this.subj, blocks); + } + + @Override + public org.scribble.ast.local.LChoice getSource() + { + return (org.scribble.ast.local.LChoice) super.getSource(); + } + + @Override + public int hashCode() + { + int hash = 3067; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof LChoice)) + { + return false; + } + return super.equals(o); + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof LChoice; + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java new file mode 100644 index 000000000..d84881bf0 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java @@ -0,0 +1,75 @@ +package org.scribble.lang.local; + +import org.scribble.ast.ProtocolKindNode; +import org.scribble.lang.Continue; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.Substitutions; +import org.scribble.type.kind.Local; +import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; + +public class LContinue extends Continue implements LType +{ + public LContinue(//org.scribble.ast.Continue source, + ProtocolKindNode source, // Due to inlining, do -> continue + RecVar recvar) + { + super(source, recvar); + } + + @Override + public LContinue reconstruct(org.scribble.ast.ProtocolKindNode source, + RecVar recvar) + { + return new LContinue(source, recvar); + } + + @Override + public LContinue substitute(Substitutions subs) + { + return (LContinue) super.substitute(subs); + } + + @Override + public LContinue getInlined(STypeInliner i)//, Deque stack) + { + return (LContinue) super.getInlined(i); + } + + @Override + public LRecursion unfoldAllOnce(STypeUnfolder u) + { + return new LRecursion(getSource(), this.recvar, // CHECKME: Continue (not Recursion) as the source of the unfolding + (LSeq) u.getRec(this.recvar)); + + } + + @Override + public int hashCode() + { + int hash = 3457; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof LContinue)) + { + return false; + } + return super.equals(o); + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof LContinue; + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LDo.java b/scribble-core/src/main/java/org/scribble/lang/local/LDo.java new file mode 100644 index 000000000..e98fa17d0 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/local/LDo.java @@ -0,0 +1,91 @@ +package org.scribble.lang.local; + +import java.util.Collections; +import java.util.List; + +import org.scribble.lang.Do; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.Substitutions; +import org.scribble.type.SubprotoSig; +import org.scribble.type.kind.Local; +import org.scribble.type.name.LProtocolName; +import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; + +public class LDo extends Do implements LType +{ + public LDo(org.scribble.ast.Do source, LProtocolName proto, + List roles) + { + super(source, proto, roles); + } + + @Override + public LDo reconstruct(org.scribble.ast.Do source, + LProtocolName proto, List roles) + { + return new LDo(source, proto, roles); + } + + @Override + public LDo substitute(Substitutions subs) + { + return (LDo) super.substitute(subs); + } + + @Override + public LType getInlined(STypeInliner i)//, Deque stack) + { + Substitutions subs = + new Substitutions<>(this.roles, i.peek().roles); // FIXME: args + LProtocolName fullname = this.proto; + SubprotoSig sig = new SubprotoSig(fullname, this.roles, + Collections.emptyList()); // FIXME + if (i.hasSig(sig)) + { + RecVar rv = i.makeRecVar(sig); + return new LContinue(getSource(), rv); + } + i.pushSig(sig); + /*LSeq inlined = i.job.getJobContext().getIntermediate(fullname).body.substitute(subs) + .getInlined(i);//, stack); // i.e. returning a GSeq -- rely on parent GSeq to inline + i.popSig(); + return inlined;*/ + throw new RuntimeException("TODO?"); + } + + @Override + public org.scribble.ast.local.LDo getSource() + { + return (org.scribble.ast.local.LDo) super.getSource(); + } + + @Override + public int hashCode() + { + int hash = 1303; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof LDo)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof LDo; + } +} + diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java new file mode 100644 index 000000000..04cb20b4c --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -0,0 +1,96 @@ +package org.scribble.lang.local; + +import java.util.List; +import java.util.stream.Collectors; + +import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.local.LProtocolDecl; +import org.scribble.lang.Protocol; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.Substitutions; +import org.scribble.type.SubprotoSig; +import org.scribble.type.kind.Local; +import org.scribble.type.name.LProtocolName; +import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; + +public class LProtocol extends + Protocol implements LType +{ + public LProtocol(ProtocolDecl source, LProtocolName fullname, + List roles, + // List params, // TODO + LSeq body) + { + super(source, fullname, roles, body); + } + + @Override + public LProtocol reconstruct(ProtocolDecl source, + LProtocolName fullname, List roles, LSeq body) + { + return new LProtocol(source, fullname, roles, body); + } + + @Override + public LType substitute(Substitutions subs) + { + List roles = this.roles.stream().map(x -> subs.apply(x)) + .collect(Collectors.toList()); + return reconstruct(getSource(), this.fullname, roles, + this.body.substitute(subs)); + } + + // Pre: stack.peek is the sig for the calling Do (or top-level entry) + // i.e., it gives the roles/args at the call-site + @Override + public LRecursion getInlined(STypeInliner i)//, Deque stack) + { + SubprotoSig sig = i.peek(); + Substitutions subs = new Substitutions<>(this.roles, sig.roles); // FIXME: args + LSeq body = this.body.substitute(subs).getInlined(i);//, stack); + LProtocolDecl source = getSource(); // CHECKME: or empty source? + RecVar rv = i.makeRecVar(sig); + return new LRecursion(source, rv, body); + } + + @Override + public LProtocolDecl getSource() + { + return (LProtocolDecl) super.getSource(); + } + + @Override + public String toString() + { + return "global" + super.toString(); + } + + @Override + public int hashCode() + { + int hash = 11; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof LProtocol)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof LProtocol; + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java b/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java new file mode 100644 index 000000000..31f0e221a --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java @@ -0,0 +1,82 @@ +package org.scribble.lang.local; + +import org.scribble.lang.MessageTransfer; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.Substitutions; +import org.scribble.type.Message; +import org.scribble.type.kind.Local; +import org.scribble.type.name.Role; + +public class LRcv extends MessageTransfer + implements LType +{ + + public LRcv(org.scribble.ast.MessageTransfer source, + Role src, Message msg) + { + super(source, src, msg, Role.SELF); + } + + // FIXME: unnecessary dst + @Override + public LRcv reconstruct( + org.scribble.ast.MessageTransfer source, Role src, Message msg, + Role dst) + { + return new LRcv(source, src, msg); + } + + @Override + public LRcv substitute(Substitutions subs) + { + return (LRcv) super.substitute(subs); + } + + @Override + public LRcv getInlined(STypeInliner i)//, Deque stack) + { + return (LRcv) super.getInlined(i); + } + + @Override + public LRcv unfoldAllOnce(STypeUnfolder u) + { + return this; + } + + @Override + public String toString() + { + return this.msg + " from " + this.src + ";"; + } + + @Override + public int hashCode() + { + int hash = 1481; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof LRcv)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof LRcv; + } + +} diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java new file mode 100644 index 000000000..1f75ec2e0 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java @@ -0,0 +1,83 @@ +package org.scribble.lang.local; + +import org.scribble.ast.ProtocolKindNode; +import org.scribble.lang.Recursion; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.Substitutions; +import org.scribble.type.kind.Local; +import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; + +public class LRecursion extends Recursion implements LType +{ + public LRecursion(//org.scribble.ast.Recursion source, + ProtocolKindNode source, // Due to inlining, protocoldecl -> rec + RecVar recvar, LSeq body) + { + super(source, recvar, body); + } + + @Override + public LRecursion reconstruct(org.scribble.ast.ProtocolKindNode source, + RecVar recvar, LSeq block) + { + return new LRecursion(source, recvar, block); + } + + @Override + public LRecursion substitute(Substitutions subs) + { + return reconstruct(getSource(), this.recvar, this.body.substitute(subs)); + } + + @Override + public LRecursion getInlined(STypeInliner i)//, Deque stack) + { + org.scribble.ast.ProtocolKindNode source = getSource(); // CHECKME: or empty source? + LSeq body = this.body.getInlined(i);//, stack); + RecVar rv = i.makeRecVar(//stack.peek(), + this.recvar); // FIXME: make GTypeInliner, and record recvars to check freshness (e.g., rec X in two choice cases) + return reconstruct(source, rv, body); + } + + @Override + public LType unfoldAllOnce(STypeUnfolder u) + { + if (!u.hasRec(this.recvar)) + { + u.pushRec(this.recvar, this.body); // Never "popped", relying on recvar disamb by inliner -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs + LType unf = (LType) this.body.unfoldAllOnce(u); + return unf; + } + return this; + } + + @Override + public int hashCode() + { + int hash = 2309; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof LRecursion)) + { + return false; + } + return super.equals(o); + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof LRecursion; + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSend.java b/scribble-core/src/main/java/org/scribble/lang/local/LSend.java new file mode 100644 index 000000000..c1671b516 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSend.java @@ -0,0 +1,82 @@ +package org.scribble.lang.local; + +import org.scribble.lang.MessageTransfer; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.Substitutions; +import org.scribble.type.Message; +import org.scribble.type.kind.Local; +import org.scribble.type.name.Role; + +public class LSend extends MessageTransfer + implements LType +{ + + public LSend(org.scribble.ast.MessageTransfer source, + Message msg, Role dst) + { + super(source, Role.SELF, msg, dst); + } + + // FIXME: unnecessary src + @Override + public LSend reconstruct( + org.scribble.ast.MessageTransfer source, Role src, Message msg, + Role dst) + { + return new LSend(source, msg, dst); + } + + @Override + public LSend substitute(Substitutions subs) + { + return (LSend) super.substitute(subs); + } + + @Override + public LSend getInlined(STypeInliner i)//, Deque stack) + { + return (LSend) super.getInlined(i); + } + + @Override + public LSend unfoldAllOnce(STypeUnfolder u) + { + return this; + } + + @Override + public String toString() + { + return this.msg + " to " + this.dst + ";"; + } + + @Override + public int hashCode() + { + int hash = 1481; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof LSend)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof LSend; + } + +} diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java new file mode 100644 index 000000000..a9110ab60 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java @@ -0,0 +1,111 @@ +package org.scribble.lang.local; + +import java.util.LinkedList; +import java.util.List; + +import org.scribble.ast.InteractionSeq; +import org.scribble.ast.local.LInteractionSeq; +import org.scribble.lang.Seq; +import org.scribble.lang.SType; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.Substitutions; +import org.scribble.type.kind.Local; +import org.scribble.type.name.Role; + +public class LSeq extends Seq + implements LType +{ + // GInteractionSeq or GBlock better as source? + public LSeq(InteractionSeq source, List> elems) + { + super(source, elems); + } + + @Override + public LSeq reconstruct(InteractionSeq source, + List> elems) + { + return new LSeq(source, elems); + } + + @Override + public LSeq substitute(Substitutions subs) + { + return (LSeq) super.substitute(subs); + } + + @Override + public LSeq getInlined(STypeInliner i)//, Deque stack) + { + LInteractionSeq source = getSource(); // CHECKME: or empty source? + List> elems = new LinkedList<>(); + for (SType e : this.elems) + { + SType e1 = e.getInlined(i);//, stack); + if (e1 instanceof LSeq) + { + elems.addAll(((LSeq) e1).elems); // Inline GSeq's returned by GDo::getInlined + } + else + { + elems.add(e1); + } + } + return reconstruct(source, elems); + } + + @Override + public LSeq unfoldAllOnce(STypeUnfolder u) + { + LInteractionSeq source = getSource(); + List> elems = new LinkedList<>(); + for (SType e : this.elems) + { + SType e1 = e.unfoldAllOnce(u); + if (e1 instanceof Seq) + { + elems.addAll(((Seq) e1).elems); + } + else + { + elems.add(e1); + } + } + return reconstruct(source, elems); + } + + @Override + public LInteractionSeq getSource() + { + return (LInteractionSeq) super.getSource(); + } + + @Override + public int hashCode() + { + int hash = 29; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof LSeq)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof LSeq; + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LType.java b/scribble-core/src/main/java/org/scribble/lang/local/LType.java new file mode 100644 index 000000000..a6368ce7f --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/local/LType.java @@ -0,0 +1,25 @@ +package org.scribble.lang.local; + +import org.scribble.lang.SType; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.Substitutions; +import org.scribble.type.kind.Local; +import org.scribble.type.name.Role; + +public interface LType extends SType +{ + + @Override + LType substitute(Substitutions subs); + + @Override + LType getInlined(STypeInliner i);//, Deque stack); + + @Override + default SType unfoldAllOnce( + STypeUnfolder u) + { + throw new RuntimeException("Not supported for: " + this); + } +} From 0dbcc2bcca0f6b4fa92b5315bc4dddbe17f99023 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 13 Feb 2019 16:03:11 +0000 Subject: [PATCH 103/539] Continued WIP. --- .../src/main/java/org/scribble/job/Job.java | 12 +- .../java/org/scribble/job/JobContext.java | 7 +- .../main/java/org/scribble/lang/Choice.java | 10 ++ .../main/java/org/scribble/lang/Continue.java | 9 ++ .../src/main/java/org/scribble/lang/Do.java | 6 + .../org/scribble/lang/MessageTransfer.java | 11 ++ .../main/java/org/scribble/lang/Protocol.java | 21 ++-- .../java/org/scribble/lang/Recursion.java | 9 ++ .../main/java/org/scribble/lang/SType.java | 7 ++ .../java/org/scribble/lang/STypeBase.java | 5 +- .../src/main/java/org/scribble/lang/Seq.java | 13 +++ .../org/scribble/lang/global/GChoice.java | 18 +++ .../org/scribble/lang/global/GContinue.java | 7 ++ .../java/org/scribble/lang/global/GDo.java | 10 +- .../lang/global/GMessageTransfer.java | 25 +++++ .../org/scribble/lang/global/GProtocol.java | 46 ++++++-- .../org/scribble/lang/global/GRecursion.java | 16 +++ .../java/org/scribble/lang/global/GSeq.java | 34 ++++-- .../java/org/scribble/lang/global/GType.java | 3 + .../java/org/scribble/lang/local/LDo.java | 91 --------------- .../org/scribble/lang/local/LProjection.java | 104 ++++++++++++++++++ .../org/scribble/lang/local/LProtocol.java | 22 ++-- .../java/org/scribble/lang/local/LSkip.java | 64 +++++++++++ scribble-test/src/test/scrib/tmp/Test.scr | 9 +- 24 files changed, 423 insertions(+), 136 deletions(-) delete mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LDo.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LProjection.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LSkip.java diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index b9702e4b9..3b3778f22 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -27,9 +27,9 @@ import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.global.GProtocol; -import org.scribble.lang.global.GRecursion; import org.scribble.lang.global.GType; import org.scribble.lang.global.GTypeTranslator; +import org.scribble.lang.local.LProtocol; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EGraphBuilderUtil; import org.scribble.model.global.SGraph; @@ -132,7 +132,7 @@ public void runContextBuildingPasses() throws ScribbleException //Deque stack = new LinkedList<>(); STypeInliner i = new STypeInliner(this); i.pushSig(sig); // TODO: factor into constructor - GRecursion inlined = g.getInlined(i); + GProtocol inlined = g.getInlined(i); System.out.println("\ninlined:\n" + inlined); this.jctxt.addInlined(g.fullname, inlined); @@ -141,6 +141,14 @@ public void runContextBuildingPasses() throws ScribbleException GType unf = (GType) inlined.unfoldAllOnce(u1);//.unfoldAllOnce(u2); CHECKME: twice unfolding? instead of "unguarded"-unfolding? System.out.println("\nunfolded:\n" + unf); + for (Role self : g.roles) + { + LProtocol proj = inlined.project(self); + System.out.println("\nprojected onto " + self + ":\n" + proj); + + Set roles = proj.def.getRoles(); + System.out.println("\nRoles " + roles); + } } } diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext.java b/scribble-core/src/main/java/org/scribble/job/JobContext.java index 3efb08156..73f94ca4d 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/job/JobContext.java @@ -24,7 +24,6 @@ import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; import org.scribble.lang.global.GProtocol; -import org.scribble.lang.global.GRecursion; import org.scribble.model.endpoint.AutParser; import org.scribble.model.endpoint.EGraph; import org.scribble.model.global.SGraph; @@ -55,7 +54,7 @@ public class JobContext // "Directly" translated global protos, i.e., separate proto decls without any inlining/unfolding/etc private final Map intermed = new HashMap<>(); // Keys are full names (though GProtocol already includes full name) - private final Map inlined = new HashMap<>(); // Keys are full names + private final Map inlined = new HashMap<>(); // Keys are full names private final Map fairEGraphs = new HashMap<>(); private final Map fairSGraphs = new HashMap<>(); @@ -164,12 +163,12 @@ public GProtocol getIntermediate(GProtocolName fullname) return this.intermed.get(fullname); } - public void addInlined(GProtocolName fullname, GRecursion g) + public void addInlined(GProtocolName fullname, GProtocol g) { this.inlined.put(fullname, g); } - public GRecursion getInlined(GProtocolName fullname) + public GProtocol getInlined(GProtocolName fullname) { return this.inlined.get(fullname); } diff --git a/scribble-core/src/main/java/org/scribble/lang/Choice.java b/scribble-core/src/main/java/org/scribble/lang/Choice.java index 84a48d311..eae4e349f 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Choice.java +++ b/scribble-core/src/main/java/org/scribble/lang/Choice.java @@ -2,7 +2,9 @@ import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.Role; @@ -25,6 +27,14 @@ public Choice(org.scribble.ast.Choice source, Role subj, public abstract Choice reconstruct(org.scribble.ast.Choice source, Role subj, List blocks); + @Override + public Set getRoles() + { + Set res = Stream.of(this.subj).collect(Collectors.toSet()); + this.blocks.forEach(x -> res.addAll(x.getRoles())); + return res; + } + @Override public String toString() { diff --git a/scribble-core/src/main/java/org/scribble/lang/Continue.java b/scribble-core/src/main/java/org/scribble/lang/Continue.java index e03c7f9d5..a231cd22e 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Continue.java +++ b/scribble-core/src/main/java/org/scribble/lang/Continue.java @@ -1,5 +1,8 @@ package org.scribble.lang; +import java.util.Collections; +import java.util.Set; + import org.scribble.ast.ProtocolKindNode; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.RecVar; @@ -20,6 +23,12 @@ public Continue(//org.scribble.ast.Continue source, public abstract Continue reconstruct( org.scribble.ast.ProtocolKindNode source, RecVar recvar); + + @Override + public Set getRoles() + { + return Collections.emptySet(); + } @Override public Continue substitute(Substitutions subs) diff --git a/scribble-core/src/main/java/org/scribble/lang/Do.java b/scribble-core/src/main/java/org/scribble/lang/Do.java index 4fab43572..58b2d2e99 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Do.java +++ b/scribble-core/src/main/java/org/scribble/lang/Do.java @@ -25,6 +25,12 @@ public Do(org.scribble.ast.Do source, N proto, public abstract Do reconstruct(org.scribble.ast.Do source, N proto, List roles); + + /*@Override + public List getRoles() + { + return this.roles; // Depends: maybe need to do actual subproto visiting, e.g., for projection + }*/ @Override public Do substitute(Substitutions subs) diff --git a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java index cb4395d51..c8b6901c8 100644 --- a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java @@ -1,5 +1,9 @@ package org.scribble.lang; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import org.scribble.type.Message; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.Role; @@ -24,6 +28,13 @@ public abstract MessageTransfer reconstruct( org.scribble.ast.MessageTransfer source, Role src, Message msg, Role dst); + @Override + public Set getRoles() + { + // Inlcudes self + return Stream.of(this.src, this.dst).collect(Collectors.toSet()); + } + @Override public MessageTransfer substitute(Substitutions subs) { diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index ce8229f62..a35023e26 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -15,32 +15,33 @@ public abstract class Protocol public final N fullname; public final List roles; // Ordered role params; pre: size >= 2 //public final List> params; // TODO - public final B body; // CHECKME: take "? extends Seq" as generic param? + public final B def; // CHECKME: take "? extends Seq" as generic param? public Protocol(ProtocolDecl source, N fullname, List roles, // List params, - B body) + B def) { super(source); this.fullname = fullname; this.roles = Collections.unmodifiableList(roles); - this.body = body; + this.def = def; } public abstract Protocol reconstruct(ProtocolDecl source, - N fullname, List roles, B body); + N fullname, List roles, B def); - /*public N getFullName() + @Override + public ProtocolDecl getSource() { - return this.fullname; - }*/ + return (ProtocolDecl) super.getSource(); + } @Override public String toString() { return " protocol " + this.fullname + "(" + this.roles.stream() .map(x -> x.toString()).collect(Collectors.joining(", ")) + ")" - + " {\n" + this.body + "\n}"; + + " {\n" + this.def + "\n}"; } @Override @@ -50,7 +51,7 @@ public int hashCode() hash = 31 * hash + super.hashCode(); hash = 31 * hash + this.fullname.hashCode(); hash = 31 * hash + this.roles.hashCode(); - hash = 31 * hash + this.body.hashCode(); + hash = 31 * hash + this.def.hashCode(); return hash; } @@ -68,7 +69,7 @@ public boolean equals(Object o) Protocol them = (Protocol) o; return super.equals(this) // Does canEquals && this.fullname.equals(them.fullname) && this.roles.equals(them.roles) - && this.body.equals(them.body); + && this.def.equals(them.def); } } diff --git a/scribble-core/src/main/java/org/scribble/lang/Recursion.java b/scribble-core/src/main/java/org/scribble/lang/Recursion.java index d40539f85..ca56f1963 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/Recursion.java @@ -1,8 +1,11 @@ package org.scribble.lang; +import java.util.Set; + import org.scribble.ast.ProtocolKindNode; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; public abstract class Recursion> extends STypeBase implements SType @@ -22,6 +25,12 @@ public Recursion(//org.scribble.ast.Recursion source, public abstract Recursion reconstruct( org.scribble.ast.ProtocolKindNode source, RecVar recvar, B body); + @Override + public Set getRoles() + { + return this.body.getRoles(); + } + @Override public String toString() { diff --git a/scribble-core/src/main/java/org/scribble/lang/SType.java b/scribble-core/src/main/java/org/scribble/lang/SType.java index 221f8e7d2..3a9579118 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SType.java +++ b/scribble-core/src/main/java/org/scribble/lang/SType.java @@ -1,5 +1,7 @@ package org.scribble.lang; +import java.util.Set; + import org.scribble.ast.ProtocolKindNode; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.Role; @@ -10,6 +12,11 @@ public interface SType { boolean hasSource(); // i.e., was parsed ProtocolKindNode getSource(); // Pre: hasSource + + default Set getRoles() + { + throw new RuntimeException("Unsupported for: " + this); + } SType substitute(Substitutions role); diff --git a/scribble-core/src/main/java/org/scribble/lang/STypeBase.java b/scribble-core/src/main/java/org/scribble/lang/STypeBase.java index c31fe092e..bd9fff952 100644 --- a/scribble-core/src/main/java/org/scribble/lang/STypeBase.java +++ b/scribble-core/src/main/java/org/scribble/lang/STypeBase.java @@ -12,7 +12,10 @@ public abstract class STypeBase public STypeBase(ProtocolKindNode source) { @SuppressWarnings("unchecked") // FIXME: - ProtocolKindNode clone = (ProtocolKindNode) source.clone(); // ScribNodes are mutable + ProtocolKindNode clone = (source == null) + ? null + : (ProtocolKindNode) source.clone(); + // ScribNodes are mutable this.source = clone; } diff --git a/scribble-core/src/main/java/org/scribble/lang/Seq.java b/scribble-core/src/main/java/org/scribble/lang/Seq.java index 34efb6b44..08f898e97 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Seq.java +++ b/scribble-core/src/main/java/org/scribble/lang/Seq.java @@ -2,6 +2,7 @@ import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import org.scribble.ast.InteractionSeq; @@ -22,6 +23,13 @@ public Seq(InteractionSeq source, List> elems) public abstract Seq reconstruct(InteractionSeq source, List> elems); + @Override + public Set getRoles() + { + return this.elems.stream().flatMap(x -> x.getRoles().stream()) + .collect(Collectors.toSet()); + } + @Override public Seq substitute(Substitutions subs) { @@ -29,6 +37,11 @@ public Seq substitute(Substitutions subs) .map(x -> x.substitute(subs)).collect(Collectors.toList()); return reconstruct(getSource(), elems); } + + public boolean isEmpty() + { + return this.elems.isEmpty(); + } @Override public InteractionSeq getSource() diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java index 030161584..3fdaaa4fe 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -7,6 +7,10 @@ import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.LChoice; +import org.scribble.lang.local.LSeq; +import org.scribble.lang.local.LSkip; +import org.scribble.lang.local.LType; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -51,6 +55,20 @@ public GChoice unfoldAllOnce(STypeUnfolder u) return reconstruct(source, this.subj, blocks); } + @Override + public LType project(Role self) + { + Role subj = this.subj.equals(self) ? Role.SELF : this.subj; + List blocks = this.blocks.stream().map(x -> x.project(self)) + .filter(x -> !x.isEmpty()) + .collect(Collectors.toList()); + if (blocks.isEmpty()) + { + return LSkip.SKIP; // CHECKME: OK, or "empty" choice at subj still important? + } + return new LChoice(null, subj, blocks); + } + @Override public org.scribble.ast.global.GChoice getSource() { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java index 46cac4eb5..39d1f96d2 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java @@ -1,6 +1,7 @@ package org.scribble.lang.global; import org.scribble.ast.ProtocolKindNode; +import org.scribble.lang.local.LContinue; import org.scribble.lang.Continue; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -45,6 +46,12 @@ public GRecursion unfoldAllOnce( (GSeq) u.getRec(this.recvar)); // CHECKME: Continue (not Recursion) as the source of the unfolding } + + @Override + public LContinue project(Role self) + { + return new LContinue(null, this.recvar); + } @Override public int hashCode() diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index c317b2dc8..0028c44d0 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -6,6 +6,7 @@ import org.scribble.lang.Do; import org.scribble.lang.STypeInliner; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.LType; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; @@ -47,12 +48,19 @@ public GType getInlined(STypeInliner i)//, Deque stack) return new GContinue(getSource(), rv); } i.pushSig(sig); - GSeq inlined = i.job.getJobContext().getIntermediate(fullname).body.substitute(subs) + GSeq inlined = i.job.getJobContext().getIntermediate(fullname).def.substitute(subs) .getInlined(i);//, stack); // i.e. returning a GSeq -- rely on parent GSeq to inline i.popSig(); return inlined; } + @Override + public LType project(Role self) + { + // TODO: consider role fixing and do pruning + throw new RuntimeException("TODO: " + this); + } + @Override public org.scribble.ast.global.GDo getSource() { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java index bebf6ae8c..6bfd890e8 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java @@ -4,6 +4,10 @@ import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.LRcv; +import org.scribble.lang.local.LSend; +import org.scribble.lang.local.LSkip; +import org.scribble.lang.local.LType; import org.scribble.type.Message; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -44,6 +48,27 @@ public GMessageTransfer unfoldAllOnce(STypeUnfolder u) return this; } + @Override + public LType project(Role self) + { + if (this.src.equals(self)) + { + /*if (this.dst.equals(self)) + { + // Already checked? + }*/ + return new LSend(null, this.msg, this.dst); + } + else if (this.dst.equals(self)) + { + return new LRcv(null, this.src, this.msg); + } + else + { + return LSkip.SKIP; + } + } + @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index a7d25e41a..fc70af514 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -1,16 +1,22 @@ package org.scribble.lang.global; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.global.GProtocolDecl; import org.scribble.lang.Protocol; import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.LProjection; +import org.scribble.lang.local.LSeq; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.LProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -20,16 +26,16 @@ public class GProtocol extends public GProtocol(ProtocolDecl source, GProtocolName fullname, List roles, // List params, // TODO - GSeq body) + GSeq def) { - super(source, fullname, roles, body); + super(source, fullname, roles, def); } @Override public GProtocol reconstruct(ProtocolDecl source, - GProtocolName fullname, List roles, GSeq body) + GProtocolName fullname, List roles, GSeq def) { - return new GProtocol(source, fullname, roles, body); + return new GProtocol(source, fullname, roles, def); } @Override @@ -38,20 +44,42 @@ public GType substitute(Substitutions subs) List roles = this.roles.stream().map(x -> subs.apply(x)) .collect(Collectors.toList()); return reconstruct(getSource(), this.fullname, roles, - this.body.substitute(subs)); + this.def.substitute(subs)); } // Pre: stack.peek is the sig for the calling Do (or top-level entry) // i.e., it gives the roles/args at the call-site @Override - public GRecursion getInlined(STypeInliner i)//, Deque stack) + public GProtocol getInlined(STypeInliner i)//, Deque stack) { SubprotoSig sig = i.peek(); Substitutions subs = new Substitutions<>(this.roles, sig.roles); // FIXME: args - GSeq body = this.body.substitute(subs).getInlined(i);//, stack); - GProtocolDecl source = getSource(); // CHECKME: or empty source? + GSeq body = this.def.substitute(subs).getInlined(i);//, stack); RecVar rv = i.makeRecVar(sig); - return new GRecursion(source, rv, body); + GRecursion rec = new GRecursion(null, rv, body); // CHECKME: or protodecl source? + GProtocolDecl source = getSource(); + GSeq def = new GSeq(null, Stream.of(rec).collect(Collectors.toList())); + return new GProtocol(source, fullname, this.roles, def); + } + + @Override + public GProtocol unfoldAllOnce(STypeUnfolder u) + { + GSeq unf = (GSeq) this.def.unfoldAllOnce(u); + return reconstruct(getSource(), this.fullname, this.roles, unf); + } + + // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) + @Override + public LProjection project(Role self) + { + LProtocolName fullname = new LProtocolName(this.fullname + "_" + self); + LSeq body = (LSeq) this.def.project(self); + Set tmp = body.getRoles(); + List roles = this.roles.stream() + .map(x -> x.equals(self) ? Role.SELF : x).filter(x -> tmp.contains(x)) + .collect(Collectors.toList()); + return new LProjection(this.fullname, self, fullname, roles, body); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java index 9604df457..2edba7333 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java @@ -5,6 +5,10 @@ import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.LRecursion; +import org.scribble.lang.local.LSeq; +import org.scribble.lang.local.LSkip; +import org.scribble.lang.local.LType; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -53,6 +57,18 @@ public GType unfoldAllOnce(STypeUnfolder u) return this; } + @Override + public LType project(Role self) + { + LSeq body = this.body.project(self); + if (body.isEmpty() + || (body.elems.size() == 1 && (body.elems.get(0) instanceof RecVar))) + { + return LSkip.SKIP; + } + return new LRecursion(null, this.recvar, body); + } + @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java index b62a5a668..44feac067 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -2,22 +2,26 @@ import java.util.LinkedList; import java.util.List; +import java.util.stream.Collectors; import org.scribble.ast.InteractionSeq; import org.scribble.ast.global.GInteractionSeq; -import org.scribble.lang.Seq; import org.scribble.lang.SType; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.Seq; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.LSeq; +import org.scribble.lang.local.LSkip; +import org.scribble.lang.local.LType; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; -public class GSeq extends Seq - implements GType +public class GSeq extends Seq implements GType { // GInteractionSeq or GBlock better as source? - public GSeq(InteractionSeq source, List> elems) + public GSeq(InteractionSeq source, + List> elems) { super(source, elems); } @@ -36,16 +40,17 @@ public GSeq substitute(Substitutions subs) } @Override - public GSeq getInlined(STypeInliner i)//, Deque stack) + public GSeq getInlined(STypeInliner i)// , Deque stack) { - GInteractionSeq source = getSource(); // CHECKME: or empty source? + GInteractionSeq source = getSource(); // CHECKME: or empty source? List> elems = new LinkedList<>(); for (SType e : this.elems) { - SType e1 = e.getInlined(i);//, stack); + SType e1 = e.getInlined(i);// , stack); if (e1 instanceof GSeq) { - elems.addAll(((GSeq) e1).elems); // Inline GSeq's returned by GDo::getInlined + elems.addAll(((GSeq) e1).elems); // Inline GSeq's returned by + // GDo::getInlined } else { @@ -75,12 +80,21 @@ public GSeq unfoldAllOnce(STypeUnfolder u) return reconstruct(source, elems); } + @Override + public LSeq project(Role self) + { + List elems = this.elems.stream().map(x -> ((GType) x).project(self)) + .filter(x -> !x.equals(LSkip.SKIP)) + .collect(Collectors.toList()); + return new LSeq(null, elems); + } + @Override public GInteractionSeq getSource() { return (GInteractionSeq) super.getSource(); } - + @Override public int hashCode() { @@ -100,7 +114,7 @@ public boolean equals(Object o) { return false; } - return super.equals(o); // Does canEquals + return super.equals(o); // Does canEquals } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GType.java b/scribble-core/src/main/java/org/scribble/lang/global/GType.java index b2474ed9b..3824b55d0 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GType.java @@ -4,6 +4,7 @@ import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.LType; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -21,4 +22,6 @@ default SType unfoldAllOnce( { throw new RuntimeException("Not supported for: " + this); } + + LType project(Role self); } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LDo.java b/scribble-core/src/main/java/org/scribble/lang/local/LDo.java deleted file mode 100644 index e98fa17d0..000000000 --- a/scribble-core/src/main/java/org/scribble/lang/local/LDo.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.scribble.lang.local; - -import java.util.Collections; -import java.util.List; - -import org.scribble.lang.Do; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.Substitutions; -import org.scribble.type.SubprotoSig; -import org.scribble.type.kind.Local; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; - -public class LDo extends Do implements LType -{ - public LDo(org.scribble.ast.Do source, LProtocolName proto, - List roles) - { - super(source, proto, roles); - } - - @Override - public LDo reconstruct(org.scribble.ast.Do source, - LProtocolName proto, List roles) - { - return new LDo(source, proto, roles); - } - - @Override - public LDo substitute(Substitutions subs) - { - return (LDo) super.substitute(subs); - } - - @Override - public LType getInlined(STypeInliner i)//, Deque stack) - { - Substitutions subs = - new Substitutions<>(this.roles, i.peek().roles); // FIXME: args - LProtocolName fullname = this.proto; - SubprotoSig sig = new SubprotoSig(fullname, this.roles, - Collections.emptyList()); // FIXME - if (i.hasSig(sig)) - { - RecVar rv = i.makeRecVar(sig); - return new LContinue(getSource(), rv); - } - i.pushSig(sig); - /*LSeq inlined = i.job.getJobContext().getIntermediate(fullname).body.substitute(subs) - .getInlined(i);//, stack); // i.e. returning a GSeq -- rely on parent GSeq to inline - i.popSig(); - return inlined;*/ - throw new RuntimeException("TODO?"); - } - - @Override - public org.scribble.ast.local.LDo getSource() - { - return (org.scribble.ast.local.LDo) super.getSource(); - } - - @Override - public int hashCode() - { - int hash = 1303; - hash = 31 * hash + super.hashCode(); - return hash; - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof LDo)) - { - return false; - } - return super.equals(o); // Does canEquals - } - - @Override - public boolean canEquals(Object o) - { - return o instanceof LDo; - } -} - diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java new file mode 100644 index 000000000..f148c85e1 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java @@ -0,0 +1,104 @@ +package org.scribble.lang.local; + +import java.util.List; +import java.util.stream.Collectors; + +import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.local.LProtocolDecl; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.Substitutions; +import org.scribble.type.SubprotoSig; +import org.scribble.type.kind.Local; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.LProtocolName; +import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; + +public class LProjection extends + LProtocol +{ + public final GProtocolName parent; + public final Role self; + + public LProjection(GProtocolName parent, Role self, LProtocolName fullname, + List roles, + // List params, // TODO + LSeq body) + { + super(null, fullname, roles, body); + this.parent = parent; + this.self = self; + } + + @Override + public LProjection reconstruct(ProtocolDecl source, + LProtocolName fullname, List roles, LSeq body) + { + return new LProjection(this.parent, this.self, fullname, roles, body); + } + + @Override + public LType substitute(Substitutions subs) + { + List roles = this.roles.stream().map(x -> subs.apply(x)) + .collect(Collectors.toList()); + return reconstruct(getSource(), this.fullname, roles, + this.def.substitute(subs)); + } + + // Pre: stack.peek is the sig for the calling Do (or top-level entry) + // i.e., it gives the roles/args at the call-site + @Override + public LRecursion getInlined(STypeInliner i)//, Deque stack) + { + SubprotoSig sig = i.peek(); + Substitutions subs = new Substitutions<>(this.roles, sig.roles); // FIXME: args + LSeq body = this.def.substitute(subs).getInlined(i);//, stack); + LProtocolDecl source = getSource(); // CHECKME: or empty source? + RecVar rv = i.makeRecVar(sig); + return new LRecursion(source, rv, body); + } + + @Override + public LProtocolDecl getSource() + { + return (LProtocolDecl) super.getSource(); + } + + @Override + public String toString() + { + return "local protocol " + this.fullname + " projects " + this.parent + + "@" + this.self + "(" + this.roles.stream().map(x -> x.toString()) + .collect(Collectors.joining(", ")) + + ")" + " {\n" + this.def + "\n}"; + } + + @Override + public int hashCode() + { + int hash = 3167; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof LProjection)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof LProjection; + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index 04cb20b4c..8d8f6878b 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -7,6 +7,7 @@ import org.scribble.ast.local.LProtocolDecl; import org.scribble.lang.Protocol; import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Local; @@ -20,16 +21,16 @@ public class LProtocol extends public LProtocol(ProtocolDecl source, LProtocolName fullname, List roles, // List params, // TODO - LSeq body) + LSeq def) { - super(source, fullname, roles, body); + super(source, fullname, roles, def); } @Override public LProtocol reconstruct(ProtocolDecl source, - LProtocolName fullname, List roles, LSeq body) + LProtocolName fullname, List roles, LSeq def) { - return new LProtocol(source, fullname, roles, body); + return new LProtocol(source, fullname, roles, def); } @Override @@ -38,7 +39,7 @@ public LType substitute(Substitutions subs) List roles = this.roles.stream().map(x -> subs.apply(x)) .collect(Collectors.toList()); return reconstruct(getSource(), this.fullname, roles, - this.body.substitute(subs)); + this.def.substitute(subs)); } // Pre: stack.peek is the sig for the calling Do (or top-level entry) @@ -48,12 +49,19 @@ public LRecursion getInlined(STypeInliner i)//, Deque stack) { SubprotoSig sig = i.peek(); Substitutions subs = new Substitutions<>(this.roles, sig.roles); // FIXME: args - LSeq body = this.body.substitute(subs).getInlined(i);//, stack); + LSeq body = this.def.substitute(subs).getInlined(i);//, stack); LProtocolDecl source = getSource(); // CHECKME: or empty source? RecVar rv = i.makeRecVar(sig); return new LRecursion(source, rv, body); } + @Override + public LProtocol unfoldAllOnce(STypeUnfolder u) + { + LSeq unf = (LSeq) this.def.unfoldAllOnce(u); + return reconstruct(getSource(), this.fullname, this.roles, unf); + } + @Override public LProtocolDecl getSource() { @@ -63,7 +71,7 @@ public LProtocolDecl getSource() @Override public String toString() { - return "global" + super.toString(); + return "local" + super.toString(); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java new file mode 100644 index 000000000..2611b8ee3 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java @@ -0,0 +1,64 @@ +package org.scribble.lang.local; + +import org.scribble.lang.STypeBase; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.Substitutions; +import org.scribble.type.kind.Local; +import org.scribble.type.name.Role; + +public class LSkip extends STypeBase implements LType +{ + public static final LSkip SKIP = new LSkip(); + + private LSkip() + { + super(null); + } + + @Override + public LSkip substitute(Substitutions subs) + { + return this; + } + + @Override + public LSkip getInlined(STypeInliner i) + { + return this; + } + + @Override + public org.scribble.ast.local.LNode getSource() + { + return null; + } + + @Override + public int hashCode() + { + int hash = 2833; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof LSkip)) + { + return false; + } + return ((LSkip) o).canEquals(this); + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof LSkip; + } +} + diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 667423a93..57921efcc 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -33,6 +33,13 @@ module tmp.Test; // TODO: port forwarding version of P2 -- funny case of "session" persisting over full disconnect, should/how to correlate? +global protocol Proto1(role A, role B, role C) +{ + 1() from A to B; + 2() from B to C; + 3() from C to A; +} + /* global protocol Proto1(role A, role B) @@ -52,7 +59,7 @@ global protocol Proto1(role A, role B) } //*/ -//* +/* global protocol Proto1(role A, role B) { 1() from A to B; From 0ba4fc2e034d20b25b1ad41d85a4c65050401e71 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 18 Feb 2019 19:10:35 +0000 Subject: [PATCH 104/539] Continued WIP. --- .../main/java/org/scribble/del/ScribDel.java | 2 +- .../del/local/LInteractionSeqDel.java | 20 +- .../src/main/java/org/scribble/job/Job.java | 13 +- .../java/org/scribble/job/JobContext.java | 27 +- .../main/java/org/scribble/lang/Choice.java | 2 + .../src/main/java/org/scribble/lang/Seq.java | 3 + .../java/org/scribble/lang/global/GSeq.java | 11 +- .../java/org/scribble/lang/local/LChoice.java | 58 +++ .../org/scribble/lang/local/LContinue.java | 37 ++ .../org/scribble/lang/local/LProtocol.java | 22 + .../java/org/scribble/lang/local/LRcv.java | 16 + .../org/scribble/lang/local/LRecursion.java | 10 + .../java/org/scribble/lang/local/LSend.java | 18 +- .../java/org/scribble/lang/local/LSeq.java | 50 +- .../java/org/scribble/lang/local/LSkip.java | 14 + .../java/org/scribble/lang/local/LType.java | 7 + .../main/java/org/scribble/model/MState.java | 104 ++-- .../model/endpoint/EGraphBuilderUtil.java | 60 --- .../model/endpoint/EGraphBuilderUtil2.java | 457 ++++++++++++++++++ .../org/scribble/model/endpoint/EState.java | 19 + .../endpoint/IntermediateContinueEdge.java | 63 +++ .../org/scribble/model/global/SState.java | 19 + .../main/java/org/scribble/type/Message.java | 10 + .../java/org/scribble/type/MessageSig.java | 6 + 24 files changed, 925 insertions(+), 123 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java create mode 100644 scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateContinueEdge.java diff --git a/scribble-core/src/main/java/org/scribble/del/ScribDel.java b/scribble-core/src/main/java/org/scribble/del/ScribDel.java index c791b6550..823203bea 100644 --- a/scribble-core/src/main/java/org/scribble/del/ScribDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ScribDel.java @@ -209,7 +209,7 @@ default void enterEGraphBuilding(ScribNode parent, ScribNode child, } default ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder graph, ScribNode visited) throws ScribbleException + EGraphBuilder gb, ScribNode visited) throws ScribbleException { return visited; } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java b/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java index aeb7c291f..7d5652fe1 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java @@ -94,11 +94,11 @@ public LInteractionSeq visitForReachabilityChecking( return child; } - public LInteractionSeq visitForFsmConversion(EGraphBuilder conv, + public LInteractionSeq visitForFsmConversion(EGraphBuilder gb, LInteractionSeq child) throws ScribbleException { - EState entry = conv.util.getEntry(); - EState exit = conv.util.getExit(); + EState entry = gb.util.getEntry(); + EState exit = gb.util.getExit(); //try { /*for (int i = child.getInteractions().size() - 1; i >= 0; i--) // Backwards for "tau-less" continue @@ -120,16 +120,16 @@ public LInteractionSeq visitForFsmConversion(EGraphBuilder conv, { if (i == child.getInteractNodeChildren().size() - 1) { - conv.util.setExit(exit); - child.getInteractNodeChildren().get(i).accept(conv); + gb.util.setExit(exit); + child.getInteractNodeChildren().get(i).accept(gb); } else { EState tmp = // conv.util.newState(Collections.emptySet()); - conv.util.ef.newEState(Collections.emptySet()); - conv.util.setExit(tmp); - child.getInteractNodeChildren().get(i).accept(conv); - conv.util.setEntry(conv.util.getExit()); + gb.util.ef.newEState(Collections.emptySet()); + gb.util.setExit(tmp); + child.getInteractNodeChildren().get(i).accept(gb); + gb.util.setEntry(gb.util.getExit()); // exit may not be tmp, entry/exit can be modified, e.g. continue } } @@ -139,7 +139,7 @@ public LInteractionSeq visitForFsmConversion(EGraphBuilder conv, throw new RuntimeException("Shouldn't get in here: " + e); }*/ //conv.builder.setExit(exit); - conv.util.setEntry(entry); + gb.util.setEntry(entry); return child; } diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 3b3778f22..fdb93105e 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -17,6 +17,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.Collections; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; @@ -144,11 +145,21 @@ public void runContextBuildingPasses() throws ScribbleException for (Role self : g.roles) { LProtocol proj = inlined.project(self); + this.jctxt.addProjected(proj.fullname, proj); System.out.println("\nprojected onto " + self + ":\n" + proj); Set roles = proj.def.getRoles(); System.out.println("\nRoles " + roles); } + + for (Entry e : + this.jctxt.getProjections().entrySet()) + { + //LProtocolName lname = e.getKey(); + LProtocol proj = e.getValue(); + EGraph graph = proj.toEGraph(this); + System.out.println("\ngraph:\n" + graph.toDot()); + } } } @@ -228,7 +239,7 @@ public Map getProjections(GProtocolName fullname, // Can ignore Set for projections (is singleton), as each projected proto is a dependency only for self (implicit in the protocoldecl) return dependencies.keySet().stream().collect( Collectors.toMap(lpn -> lpn, - (lpn) -> this.jctxt.getModule(lpn.getPrefix()))); + lpn -> this.jctxt.getModule(lpn.getPrefix()))); } /*public Map generateSessionApi(GProtocolName fullname) throws ScribbleException diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext.java b/scribble-core/src/main/java/org/scribble/job/JobContext.java index 73f94ca4d..f88753762 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/job/JobContext.java @@ -24,6 +24,7 @@ import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; import org.scribble.lang.global.GProtocol; +import org.scribble.lang.local.LProtocol; import org.scribble.model.endpoint.AutParser; import org.scribble.model.endpoint.EGraph; import org.scribble.model.global.SGraph; @@ -32,7 +33,6 @@ import org.scribble.type.name.ModuleName; import org.scribble.type.name.Role; import org.scribble.util.ScribUtil; -import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.Projector; // Global "static" context information for a Job -- single instance per Job, should not be shared between Jobs @@ -53,8 +53,10 @@ public class JobContext // "Directly" translated global protos, i.e., separate proto decls without any inlining/unfolding/etc private final Map intermed = new HashMap<>(); // Keys are full names (though GProtocol already includes full name) + private final Map iprojected = new HashMap<>(); // From intermediates; keys are full names - private final Map inlined = new HashMap<>(); // Keys are full names + // CHECKME: "global WF" only? + private final Map inlined = new HashMap<>(); // Keys are full names (though GProtocol already includes full name) private final Map fairEGraphs = new HashMap<>(); private final Map fairSGraphs = new HashMap<>(); @@ -173,6 +175,21 @@ public GProtocol getInlined(GProtocolName fullname) return this.inlined.get(fullname); } + public void addProjected(LProtocolName fullname, LProtocol l) + { + this.iprojected.put(fullname, l); + } + + public LProtocol getProjected(LProtocolName fullname) + { + return this.iprojected.get(fullname); + } + + public Map getProjections() + { + return Collections.unmodifiableMap(this.iprojected); + } + // Make context immutable? (will need to assign updated context back to Job) -- will also need to do for Module replacing public void addProjections(Map> projections) { @@ -229,6 +246,7 @@ protected void addEGraph(LProtocolName fullname, EGraph graph) this.fairEGraphs.put(fullname, graph); } + // N.B. graphs built from inlined (not unfolded) public EGraph getEGraph(GProtocolName fullname, Role role) throws ScribbleException { @@ -237,11 +255,12 @@ public EGraph getEGraph(GProtocolName fullname, Role role) EGraph graph = this.fairEGraphs.get(fulllpn); if (graph == null) { - Module proj = getProjection(fullname, role); // Projected module contains a single protocol + /*Module proj = getProjection(fullname, role); // Projected module contains a single protocol EGraphBuilder builder = new EGraphBuilder(this.job); // Obtains an EGraphBuilderUtil from Job proj.accept(builder); graph = builder.util.finalise(); - addEGraph(fulllpn, graph); + addEGraph(fulllpn, graph);*/ + throw new RuntimeException("Shouldn't get in here: "); } return graph; } diff --git a/scribble-core/src/main/java/org/scribble/lang/Choice.java b/scribble-core/src/main/java/org/scribble/lang/Choice.java index eae4e349f..6907c2b1f 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Choice.java +++ b/scribble-core/src/main/java/org/scribble/lang/Choice.java @@ -34,6 +34,8 @@ public Set getRoles() this.blocks.forEach(x -> res.addAll(x.getRoles())); return res; } + + //public abstract List getBlocks(); @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/lang/Seq.java b/scribble-core/src/main/java/org/scribble/lang/Seq.java index 08f898e97..097d7667a 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Seq.java +++ b/scribble-core/src/main/java/org/scribble/lang/Seq.java @@ -9,6 +9,7 @@ import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.Role; +// Could add B extends STTypeBase, K>, but it inflates type params quite a bit (e.g., Protocol) public abstract class Seq extends STypeBase { @@ -37,6 +38,8 @@ public Seq substitute(Substitutions subs) .map(x -> x.substitute(subs)).collect(Collectors.toList()); return reconstruct(getSource(), elems); } + + public abstract List> getElements(); public boolean isEmpty() { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java index 44feac067..38d488aaa 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -86,7 +86,16 @@ public LSeq project(Role self) List elems = this.elems.stream().map(x -> ((GType) x).project(self)) .filter(x -> !x.equals(LSkip.SKIP)) .collect(Collectors.toList()); - return new LSeq(null, elems); + return new LSeq(null, elems); + // Empty seqs converted to LSkip by GChoice/Recursion projection + // And a WF top-level protocol cannot produce empty LSeq + // So a projection never contains an empty LSeq + } + + @Override + public List> getElements() + { + return this.elems.stream().map(x -> (GType) x).collect(Collectors.toList()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java index 047b772ea..b344af87f 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java @@ -7,6 +7,10 @@ import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.model.endpoint.EGraph; +import org.scribble.model.endpoint.EGraphBuilderUtil2; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.kind.Local; import org.scribble.type.name.Role; @@ -51,6 +55,60 @@ public LChoice unfoldAllOnce(STypeUnfolder u) return reconstruct(source, this.subj, blocks); } + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + b.enterChoice(); + for (LSeq block : this.blocks) + { + List elems = block.getElements(); + LType first = elems.get(0); + if (first instanceof LRecursion) // CHECKME + { + EGraphBuilderUtil2 b1 = new EGraphBuilderUtil2(b); + // "Inherits" b.recvars, for continue edge building (to "outer" recs) + if (elems.size() == 1) + { + b1.setExit(b.getExit()); + first.buildGraph(b1); + EGraph nested = b1.finalise(); + EState init = nested.init; + //for (EAction a : first.getEnabling()) + for (EAction a : (Iterable) + init.getAllActions().stream().distinct()::iterator) + // Enabling actions + { + for (EState s : init.getSuccessors(a)) + { + b.addEdge(b.getEntry(), a, s); + } + } + } + else + { + first.buildGraph(b1); + EGraph nested = b1.finalise(); + b.setEntry(nested.term); // Must be non null + LSeq tail = new LSeq(null, elems.subList(1, elems.size())); + tail.buildGraph(b); + } + } + else + { + b.pushChoiceBlock(); // CHECKME: still needed? LContinue doesn't check isUnguardedInChoice any more + block.buildGraph(b); + b.popChoiceBlock(); + } + } + b.leaveChoice(); + } + + /*@Override + public List getBlocks() + { + return this.blocks; + }*/ + @Override public org.scribble.ast.local.LChoice getSource() { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java index d84881bf0..6d8a86855 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java @@ -5,6 +5,7 @@ import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -44,6 +45,42 @@ public LRecursion unfoldAllOnce(STypeUnfolder u) (LSeq) u.getRec(this.recvar)); } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + //if (b.isUnguardedInChoice()) + { + b.addContinueEdge(b.getEntry(), this.recvar); + return; + } + + /*// ** "Overwrites" previous edge built by send/receive(s) leading to this continue + Iterator preds = b.getPredecessors().iterator(); + Iterator prevs = b.getPreviousActions().iterator(); + EState entry = b.getEntry(); + + Set> removed = new HashSet<>(); + // HACK: for identical edges, i.e. same pred/prev/succ (e.g. rec X { choice at A { A->B:1 } or { A->B:1 } continue X; }) + // FIXME: do here, or refactor into GraphBuilder? + // + // Because duplicate edges preemptively pruned by ModelState.addEdge, but corresponding predecessors not pruned + // FIXME: make uniform + while (preds.hasNext()) + { + EState pred = preds.next(); + EAction prev = prevs.next(); + List tmp = Arrays.asList(pred, prev, entry); + if (!removed.contains(tmp)) + { + removed.add(tmp); + b.removeEdgeFromPredecessor(pred, prev); // Assumes pred is a predecessor, and removes pred from current predecessors.. + } + b.addRecursionEdge(pred, prev, + b.getRecursionEntry(this.recvar)); + // May be repeated for non-det, but OK // Combine with removeEdgeFromPredecessor? + }*/ + } @Override public int hashCode() diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index 8d8f6878b..9f8af1a2c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -1,14 +1,18 @@ package org.scribble.lang.local; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.local.LProtocolDecl; +import org.scribble.job.Job; import org.scribble.lang.Protocol; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.model.endpoint.EGraph; +import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Local; import org.scribble.type.name.LProtocolName; @@ -61,6 +65,24 @@ public LProtocol unfoldAllOnce(STypeUnfolder u) LSeq unf = (LSeq) this.def.unfoldAllOnce(u); return reconstruct(getSource(), this.fullname, this.roles, unf); } + + public EGraph toEGraph(Job job) + { + EGraphBuilderUtil2 b = new EGraphBuilderUtil2(job.config.ef); + b.init(job.config.ef.newEState(Collections.emptySet())); + this.def.buildGraph(b); + EGraph g = b.finalise(); + return g; + /*EState init = toGraph(b); + EState term = init.getTerminal(); + return new EGraph(init, term);*/ + } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + this.def.buildGraph(b); + } @Override public LProtocolDecl getSource() diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java b/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java index 31f0e221a..10ca89065 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java @@ -4,14 +4,19 @@ import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.Message; +import org.scribble.type.MessageSig; +import org.scribble.type.Payload; import org.scribble.type.kind.Local; +import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; public class LRcv extends MessageTransfer implements LType { + // this.dst == Role.SELF public LRcv(org.scribble.ast.MessageTransfer source, Role src, Message msg) { @@ -45,6 +50,17 @@ public LRcv unfoldAllOnce(STypeUnfolder u) return this; } + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + Role peer = this.src; + MessageId mid = this.msg.getId(); + Payload payload = this.msg.isMessageSig() // CHECKME: generalise? (e.g., hasPayload) + ? ((MessageSig) msg).payload + : Payload.EMPTY_PAYLOAD; + b.addEdge(b.getEntry(), b.ef.newEReceive(peer, mid, payload), b.getExit()); + } + @Override public String toString() { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java index 1f75ec2e0..5a163fc6b 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java @@ -5,6 +5,7 @@ import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -52,6 +53,15 @@ public LType unfoldAllOnce(STypeUnfolder u) } return this; } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + b.addEntryLabel(this.recvar); + b.pushRecursionEntry(this.recvar, b.getEntry()); + this.body.buildGraph(b); + b.popRecursionEntry(this.recvar); + } @Override public int hashCode() diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSend.java b/scribble-core/src/main/java/org/scribble/lang/local/LSend.java index c1671b516..bc44a05f6 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSend.java @@ -4,21 +4,26 @@ import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.Message; +import org.scribble.type.MessageSig; +import org.scribble.type.Payload; import org.scribble.type.kind.Local; +import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; public class LSend extends MessageTransfer implements LType { + // this.src == Role.SELF public LSend(org.scribble.ast.MessageTransfer source, Message msg, Role dst) { super(source, Role.SELF, msg, dst); } - // FIXME: unnecessary src + // CHECKME: remove unnecessary src ? @Override public LSend reconstruct( org.scribble.ast.MessageTransfer source, Role src, Message msg, @@ -44,6 +49,17 @@ public LSend unfoldAllOnce(STypeUnfolder u) { return this; } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + Role peer = this.dst; + MessageId mid = this.msg.getId(); + Payload payload = this.msg.isMessageSig() // CHECKME: generalise? (e.g., hasPayload) + ? ((MessageSig) msg).payload + : Payload.EMPTY_PAYLOAD; + b.addEdge(b.getEntry(), b.ef.newESend(peer, mid, payload), b.getExit()); + } @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java index a9110ab60..736b72a4c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java @@ -1,15 +1,21 @@ package org.scribble.lang.local; +import java.util.Collections; +import java.util.Deque; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.stream.Collectors; import org.scribble.ast.InteractionSeq; import org.scribble.ast.local.LInteractionSeq; -import org.scribble.lang.Seq; import org.scribble.lang.SType; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.Seq; import org.scribble.lang.Substitutions; +import org.scribble.model.endpoint.EGraphBuilderUtil2; +import org.scribble.model.endpoint.EState; import org.scribble.type.kind.Local; import org.scribble.type.name.Role; @@ -75,6 +81,48 @@ public LSeq unfoldAllOnce(STypeUnfolder u) return reconstruct(source, elems); } + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + EState entry = b.getEntry(); + EState exit = b.getExit(); + List elems = getElements(); + if (elems.isEmpty()) + { + throw new RuntimeException("Shouldn't get here: " + this); + } + //int size = elems.size(); + //for (int i = 0; i < size; i++) + for (Iterator i = ((Deque) new LinkedList<>(elems)) // To avoid generic cast... + .descendingIterator(); i.hasNext(); ) + { + LType next = i.next(); + //if (i == size - 1) + if (!i.hasNext()) + { + b.setExit(exit); + //elems.get(i).toGraph(b); + next.buildGraph(b); + } + else + { + EState tmp = b.ef.newEState(Collections.emptySet()); + b.setExit(tmp); + //elems.get(i).toGraph(b); + next.buildGraph(b); + b.setEntry(b.getExit()); + // CHECKME: exit may not be tmp, entry/exit can be modified, e.g. continue + } + } + b.setEntry(entry); + } + + @Override + public List getElements() + { + return this.elems.stream().map(x -> (LType) x).collect(Collectors.toList()); + } + @Override public LInteractionSeq getSource() { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java index 2611b8ee3..afaa4d455 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java @@ -3,9 +3,11 @@ import org.scribble.lang.STypeBase; import org.scribble.lang.STypeInliner; import org.scribble.lang.Substitutions; +import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.Role; +// Used during projection -- filtered out by GSeq::projection public class LSkip extends STypeBase implements LType { public static final LSkip SKIP = new LSkip(); @@ -33,6 +35,18 @@ public org.scribble.ast.local.LNode getSource() return null; } + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + throw new RuntimeException("Unsupported for: " + this); + } + + @Override + public String toString() + { + return "[skip];"; + } + @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LType.java b/scribble-core/src/main/java/org/scribble/lang/local/LType.java index a6368ce7f..712e9c732 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LType.java @@ -4,6 +4,7 @@ import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.Role; @@ -22,4 +23,10 @@ default SType unfoldAllOnce( { throw new RuntimeException("Not supported for: " + this); } + + // Uses b to builds graph "progressively" (working graph is mutable) + // Use EGraphBuilderUtil2::finalise for final result + void buildGraph(EGraphBuilderUtil2 b); + + //List getEnabling(); } diff --git a/scribble-core/src/main/java/org/scribble/model/MState.java b/scribble-core/src/main/java/org/scribble/model/MState.java index d0f8fac34..7bfaa6361 100644 --- a/scribble-core/src/main/java/org/scribble/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/model/MState.java @@ -101,7 +101,9 @@ protected final void removeEdge(A a, S s) throws ScribbleException } } //throw new RuntimeException("No such transition to remove: " + a + "->" + s); - throw new ScribbleException("No such transition to remove: " + a + "->" + s); // Hack? EFSM building on bad-reachability protocols now done before actual reachability check + throw new ScribbleException( + "No such transition to remove: " + a + "->" + s); + // Hack? EFSM building on bad-reachability protocols now done before actual reachability check } // The "deterministic" variant, cf., getAllActions @@ -110,7 +112,9 @@ public final List getActions() Set as = new HashSet<>(this.actions); if (as.size() != this.actions.size()) { - throw new RuntimeScribbleException("[TODO] Non-deterministic state: " + this.actions + " (Try -minlts if available)"); // This getter checks for determinism -- affects e.g. API generation + throw new RuntimeScribbleException("[TODO] Non-deterministic state: " + + this.actions + " (Try -minlts if available)"); + // This getter checks for determinism -- affects e.g. API generation } //return as; return getAllActions(); @@ -141,7 +145,9 @@ public final List getSuccessors() Set as = new HashSet<>(this.actions); if (as.size() != this.actions.size()) { - throw new RuntimeScribbleException("[TODO] Non-deterministic state: " + this.actions + " (Try -minlts if available)"); // This getter checks for determinism -- affects e.g. API generation + throw new RuntimeScribbleException("[TODO] Non-deterministic state: " + + this.actions + " (Try -minlts if available)"); + // This getter checks for determinism -- affects e.g. API generation } return getAllSuccessors(); } @@ -150,8 +156,8 @@ public final List getSuccessors() public final List getSuccessors(A a) { return IntStream.range(0, this.actions.size()) - .filter((i) -> this.actions.get(i).equals(a)) - .mapToObj((i) -> this.succs.get(i)) + .filter(i -> this.actions.get(i).equals(a)) + .mapToObj(i -> this.succs.get(i)) .collect(Collectors.toList()); } @@ -164,7 +170,50 @@ public final boolean isTerminal() { return this.actions.isEmpty(); } + + public boolean canReach(MState s) + { + return MState.getReachableStates(this).contains(s); + } + + @Override + public String toString() + { + return Integer.toString(this.id); // CHECKME: ? + } + + @Override + public int hashCode() + { + int hash = 73; + hash = 31 * hash + this.id; // N.B. using state ID only + return hash; + } + + // N.B. Based only on state ID + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof MState)) + { + return false; + } + return ((MState) o).canEquals(this) + && this.id == ((MState) o).id; + // Good to use id, due to edge mutability + } + + protected abstract boolean canEquals(MState s); + + public abstract S getTerminal(); + public abstract Set getReachableStates(); + public abstract Set getReachableActions(); + // TODO: make protected public static , S extends MState, K extends ProtocolKind> S getTerminal(S start) { @@ -172,23 +221,20 @@ S getTerminal(S start) { return start; } - Set terms = MState.getReachableStates(start).stream().filter((s) -> s.isTerminal()).collect(Collectors.toSet()); + Set terms = MState.getReachableStates(start).stream() + .filter(s -> s.isTerminal()).collect(Collectors.toSet()); if (terms.size() > 1) { throw new RuntimeException("Shouldn't get in here: " + terms); } return (terms.isEmpty()) ? null : terms.iterator().next(); // FIXME: return empty Set instead of null? } - - public boolean canReach(MState s) - { - return MState.getReachableStates(this).contains(s); - } // Note: doesn't implicitly include start (only if start is explicitly reachable from start, of course) /*public static , S extends ModelState, K extends ProtocolKind> Set getAllReachable(S start)*/ - // FIXME: cache + // TODO: make protected + // CHECKME: cache results? @SuppressWarnings("unchecked") public static , S extends MState, K extends ProtocolKind> Set getReachableStates(MState start) @@ -226,7 +272,8 @@ Set getReachableStates(MState start) } @SuppressWarnings("unchecked") - // FIXME: cache + // TODO: make protected + // CHECKME: cache results? public static , S extends MState, K extends ProtocolKind> //Set getAllReachableActions(S start) Set getReachableActions(MState start) @@ -241,35 +288,4 @@ Set getReachableActions(MState start) } return as; } - - @Override - public int hashCode() - { - int hash = 73; - hash = 31 * hash + this.id; // N.B. using state ID only - return hash; - } - - // N.B. Based only on state ID - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof MState)) - { - return false; - } - return ((MState) o).canEquals(this) && this.id == ((MState) o).id; // Good to use id, due to edge mutability - } - - protected abstract boolean canEquals(MState s); - - @Override - public String toString() - { - return Integer.toString(this.id); // FIXME -- ? - } } diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java index 2355118d7..9fdf18bf3 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java @@ -27,13 +27,8 @@ import org.scribble.job.ScribbleException; import org.scribble.model.GraphBuilderUtil; import org.scribble.model.endpoint.actions.EAction; -import org.scribble.model.global.SModelFactory; -import org.scribble.model.global.actions.SAction; -import org.scribble.type.Payload; import org.scribble.type.kind.Local; -import org.scribble.type.name.Op; import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; // Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) // Tailored to support graph building from syntactic local protocol choice and recursion @@ -446,58 +441,3 @@ private EState getNext(Map map, EState succ) return next; } } - - -class IntermediateContinueEdge extends EAction -{ - public IntermediateContinueEdge(EModelFactory ef, RecVar rv) - { - super(ef, Role.EMPTY_ROLE, new Op(rv.toString()), Payload.EMPTY_PAYLOAD); // HACK - } - - @Override - public EAction toDual(Role self) - { - throw new RuntimeException("Shouldn't get in here: " + this); - } - - @Override - public SAction toGlobal(SModelFactory sf, Role self) - { - throw new RuntimeException("Shouldn't get in here: " + this); - } - - @Override - protected String getCommSymbol() - { - return "#"; - } - - @Override - public int hashCode() - { - int hash = 1021; - hash = 31 * hash + super.hashCode(); - return hash; - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof IntermediateContinueEdge)) - { - return false; - } - return ((IntermediateContinueEdge) o).canEqual(this) && super.equals(o); - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof IntermediateContinueEdge; - } -} diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java new file mode 100644 index 000000000..2e79303df --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java @@ -0,0 +1,457 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.model.endpoint; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Deque; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.scribble.job.ScribbleException; +import org.scribble.model.GraphBuilderUtil; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.kind.Local; +import org.scribble.type.name.RecVar; + +// Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) +// Tailored to support graph building from syntactic local protocol choice and recursion +public class EGraphBuilderUtil2 extends GraphBuilderUtil +{ + public final EModelFactory ef; + + private final Map> recvars = new HashMap<>(); // CHECKME: Deque is for shadowing? + + // First action(s) inside a rec scope ("enacting" means how to enact an unguarded choice-continue) + //private final Map>> enacting = new HashMap<>(); + private final Map>> enacting = new HashMap<>(); + // CHECKME: Set sufficient? or List? (consider non-determinism -- does it matter?) + + //private final Map>> enactingMap = new HashMap<>(); // Record enacting per-recvar, since a state could have multi-recvars + private final Map>> enactingMap = new HashMap<>(); + + private final Deque> pred = new LinkedList<>(); + private final Deque> prev = new LinkedList<>(); + + public EGraphBuilderUtil2(EModelFactory ef) + { + this.ef = ef; + ////clear(); + //reset(); + } + + // FIXME: cannot be reused for different protos, because of recvars and clear/reset + // CHECKME: refactor as factory method? (e.g., push?) + public EGraphBuilderUtil2(EGraphBuilderUtil2 b) + { + this.ef = b.ef; + init(ef.newEState(Collections.emptySet())); + b.recvars.entrySet().forEach(x -> + this.recvars.put(x.getKey(), new LinkedList<>(x.getValue()))); + } + + // N.B. must be called before every "new visit", including first + @Override + public void init(EState init) + { + clear(); + reset(this.ef.newEState(Collections.emptySet()), this.ef.newEState(Collections.emptySet())); + } + + protected void clear() + { + this.recvars.clear(); + this.enacting.clear(); + + this.pred.clear(); + this.pred.push(new LinkedList<>()); + + this.prev.clear(); + this.prev.push(new LinkedList<>()); + + this.enactingMap.clear(); + } + + /*@Override + public EState newState(Set labs) + { + return new EState(labs); + }*/ + + // Records 's' as predecessor state, and 'a' as previous action and the "enacting action" for "fresh" recursion scopes + @Override + public void addEdge(EState s, EAction a, EState succ) + { + addEdgeAux(s, a, succ); + + //if (!this.pred.isEmpty()) + { + this.pred.pop(); + this.prev.pop(); + } + this.pred.push(new LinkedList<>(Arrays.asList(s))); + this.prev.push(new LinkedList<>(Arrays.asList(a))); + + //for (Deque> ens : this.enacting.values()) + for (Deque> ens : this.enacting.values()) + { + if (!ens.isEmpty()) // Unnecessary? + { + //Set tmp = ens.peek(); + List tmp = ens.peek(); + if (tmp.isEmpty()) + { + tmp.add(a); + } + } + } + } + + + /* + * Dealing with Choice contexts + */ + public void enterChoice() + { + this.pred.push(new LinkedList<>()); + this.prev.push(new LinkedList<>()); + + for (RecVar rv : this.enacting.keySet()) + { + ////Deque> tmp = this.enacting.get(rv); + Deque> tmp = this.enacting.get(rv); + ////tmp.push(new HashSet<>(tmp.peek())); + //tmp.push(new HashSet<>()); // Initially empty to record nested enablings in choice blocks + tmp.push(new LinkedList<>()); // Initially empty to record nested enablings in choice blocks + } + } + + public void leaveChoice() + { + List pred = this.pred.pop(); + List prev = this.prev.pop(); + if (!pred.isEmpty()) + { + this.pred.pop(); + this.prev.pop(); + this.pred.push(pred); + this.prev.push(prev); + } + + for (RecVar rv : this.enacting.keySet()) + { + /*Set pop = this.enacting.get(rv).pop(); + Set peek = this.enacting.get(rv).peek();*/ + List pop = this.enacting.get(rv).pop(); + List peek = this.enacting.get(rv).peek(); + if (peek.isEmpty()) // Cf. addEdge + { + peek.addAll(pop); + } + } + } + + public void pushChoiceBlock() + { + this.pred.push(null); // Signifies following statement is "unguarded" in this choice block + this.prev.push(null); + + for (RecVar rv : this.enacting.keySet()) + { + //Deque> tmp = this.enacting.get(rv); + Deque> tmp = this.enacting.get(rv); + //tmp.push(new HashSet<>()); // Must be empty for addEdge to record (nested) enabling + tmp.push(new LinkedList<>()); + } + } + + public void popChoiceBlock() + { + List pred = this.pred.pop(); + List prev = this.prev.pop(); + + if (pred != null) // Unguarded choice-continue? + { + List peek1 = this.pred.peek(); + if (peek1 == null) + { + this.pred.pop(); + peek1 = new LinkedList<>(); + this.pred.push(peek1); + } + peek1.addAll(pred); + } + + if (prev != null) + { + List peek2 = this.prev.peek(); + if (peek2 == null) + { + this.prev.pop(); + peek2 = new LinkedList<>(); + this.prev.push(peek2); + } + peek2.addAll(prev); + } + + for (RecVar rv : this.enacting.keySet()) + { + /*Set pop = this.enacting.get(rv).pop(); + Set peek = this.enacting.get(rv).peek();*/ + List pop = this.enacting.get(rv).pop(); + List peek = this.enacting.get(rv).peek(); + //if (peek.isEmpty()) + { + peek.addAll(pop); + } + } + } + + + /* + * Dealing with Recursion contexts + */ + public void pushRecursionEntry(RecVar recvar, EState entry) + { + /*if (!isUnguardedInChoice()) // Don't record rec entry if it is an unguarded choice-rec + { + this.entry.addLabel(recvar); + }*/ + //this.recvars.put(recvar, this.entry); + Deque tmp = this.recvars.get(recvar); + if (tmp == null) + { + tmp = new LinkedList<>(); + this.recvars.put(recvar, tmp); + } + /*if (isUnguardedInChoice()) + { + tmp.push(tmp.peek()); // Works because unguarded recs unfolded (including nested recvar shadowing -- if unguarded choice-rec, it will be unfolded and rec entry recorded for guarded unfolding) + } + else + { + tmp.push(this.entry); + }*/ + tmp.push(entry); + + //Deque> tmp2 = this.enacting.get(recvar); + Deque> tmp2 = this.enacting.get(recvar); + if (tmp2 == null) + { + tmp2 = new LinkedList<>(); // New Stack for this recvar + this.enacting.put(recvar, tmp2); + } + //tmp2.push(new HashSet<>()); // Push new Set element onto stack + tmp2.push(new LinkedList<>()); // Push new Set element onto stack + } + + public void popRecursionEntry(RecVar recvar) + { + this.recvars.get(recvar).pop(); // Pop the entry of this rec + + //Set pop = this.enacting.get(recvar).pop(); + List pop = this.enacting.get(recvar).pop(); + if (this.enacting.get(recvar).isEmpty()) // All Sets popped from the stack of this recvar + { + this.enacting.remove(recvar); + } + + EState curr = getEntry(); + //Map> tmp = this.enactingMap.get(curr); + Map> tmp = this.enactingMap.get(curr); + if (tmp == null) + { + tmp = new HashMap<>(); + this.enactingMap.put(curr, tmp); + } + tmp.put(recvar, pop); + } + + + /* + * Edge construction for Continues + */ + public boolean isUnguardedInChoice() + //public boolean isUnguardedInChoice(RecVar rv) + { + return + ////!this.entry.equals(this.root) && // Hacky? for protocols that start with unguarded choice-rec, e.g. choice at A { rec X { ... at root + //!this.pred.isEmpty() && // This and above fixed by initialising non-null pred/prev? + this.pred.peek() == null; + } + + // Choice-unguarded continues -- fixed in finalise pass + public void addContinueEdge(EState s, RecVar rv) + { + /*this.contStates.add(s); + this.contRecVars.add(rv);*/ + EState entry = getRecursionEntry(rv); + addEdgeAux(s, new IntermediateContinueEdge(this.ef, rv), entry); + //addEdge(s, new IntermediateContinueEdge(rv), entry); // **FIXME: broken on purpose for testing + } + + // Doesn't set predecessor, cf. addEdge (and cf. addEdgeAux) + // Choice-guarded continues (can be done in one pass) + public void addRecursionEdge(EState s, EAction a, EState succ) // Cf. LGraphBuilder.addContinueEdge, for choice-unguarded cases -- addRecursionEdge, for guarded cases, should also be in LGraphBuilder, but here for convenience (private state) + { + addEdgeAux(s, a, succ); + + // Still needed here? + //for (Deque> ens : this.enacting.values()) + for (Deque> ens : this.enacting.values()) + { + if (!ens.isEmpty()) + { + //Set tmp = ens.peek(); + List tmp = ens.peek(); + if (tmp.isEmpty()) + { + tmp.add(a); + } + } + } + } + + // succ assumed to be this.getEntry() + public void removeEdgeFromPredecessor(EState s, EAction a) throws ScribbleException // Removing prev edge, to be replaced by addRecursionEdge + { + //s.removeEdge(a, this.getEntry()); + removeEdgeAux(s, a, this.getEntry()); + //this.pred.peek().remove(s); // Need to update both preds and prevs accordingly (consider non-det) + Iterator preds = this.pred.peek().iterator(); + Iterator prevs = this.prev.peek().iterator(); + while (preds.hasNext()) + { + EState nexts = preds.next(); + EAction nexta = prevs.next(); + if (nexts.equals(s) && nexta.equals(a)) + { + preds.remove(); + prevs.remove(); + return; + } + } + throw new RuntimeException("Shouldn't get in here: " + s + ", " + a); + } + + public List getPredecessors() + { + //return this.pred.peek(); + return new LinkedList<>(this.pred.peek()); // Cf. removeEdgeFromPredecessor + } + + public List getPreviousActions() + { + //return this.prev.peek(); + return new LinkedList<>(this.prev.peek()); + } + + public EState getRecursionEntry(RecVar recvar) + { + return this.recvars.get(recvar).peek(); + } + + + /* + * Finalise graph by treating IntermediateContinueEdges + */ + public EGraph finalise() + { + /*EState res = new EState(this.entry.getLabels()); + EState resTerm = new EState(this.exit.getLabels());*/ + EState res = this.entry.cloneNode(this.ef, this.entry.getLabels()); //this.ef.newEState(this.entry.getLabels()); + EState resTerm = this.exit.cloneNode(this.ef, this.exit.getLabels()); //this.ef.newEState(this.exit.getLabels()); + + Map map = new HashMap<>(); + map.put(this.entry, res); + map.put(this.exit, resTerm); + Set seen = new HashSet<>(); + fixContinueEdges(seen, map, this.entry, res); + if (!seen.contains(this.exit)) + { + resTerm = null; + } + + /*Map all = getAllStates(res); + EndpointState dfa = determinise(all, res, resTerm); + System.out.println("111: " + dfa.toDot());*/ + + return new EGraph(res, resTerm); + } + + // FIXME: incomplete -- won't fully correctly handle situations involving, e.g., transitive continue-edge fixing? + protected void fixContinueEdges(Set seen, Map map, EState curr, EState res) + { + if (seen.contains(curr)) + { + return; + } + seen.add(curr); + Iterator as = curr.getAllActions().iterator(); + Iterator ss = curr.getAllSuccessors().iterator(); + while (as.hasNext()) + { + EAction a = as.next(); + EState succ = ss.next(); + EState next; + next = getNext(map, succ); + + if (!(a instanceof IntermediateContinueEdge)) + { + addEdgeAux(res, a, next); + + fixContinueEdges(seen, map, succ, next); + } + else + { + IntermediateContinueEdge ice = (IntermediateContinueEdge) a; + //for (IOAction e : this.enactingMap.get(succ)) + RecVar rv = new RecVar(ice.mid.toString()); + for (EAction e : this.enactingMap.get(succ).get(rv)) + { + for (EState n : succ.getSuccessors(e)) + { + next = getNext(map, n); + addEdgeAux(res, e, next); + + fixContinueEdges(seen, map, succ, next); + } + } + } + } + } + + private EState getNext(Map map, EState succ) + { + EState next; + if (map.containsKey(succ)) + { + next = map.get(succ); + } + else + { + //next = this.ef.newEState(succ.getLabels()); + next = succ.cloneNode(this.ef, succ.getLabels()); + map.put(succ, next); + } + return next; + } +} + + diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java index 9947a6aed..78a1b06b8 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java @@ -377,6 +377,25 @@ else if (as.size() == 1 && as.get(0).isWrapServer()) } } + @Override + public EState getTerminal() + { + return MState.getTerminal(this); + } + + @Override + public Set getReachableStates() + { + + return MState.getReachableStates(this); + } + + @Override + public Set getReachableActions() + { + return MState.getReachableActions(this); + } + @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateContinueEdge.java b/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateContinueEdge.java new file mode 100644 index 000000000..654a0e1f8 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateContinueEdge.java @@ -0,0 +1,63 @@ +package org.scribble.model.endpoint; + +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.model.global.SModelFactory; +import org.scribble.model.global.actions.SAction; +import org.scribble.type.Payload; +import org.scribble.type.name.Op; +import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; + +class IntermediateContinueEdge extends EAction +{ + public IntermediateContinueEdge(EModelFactory ef, RecVar rv) + { + super(ef, Role.EMPTY_ROLE, new Op(rv.toString()), Payload.EMPTY_PAYLOAD); // HACK + } + + @Override + public EAction toDual(Role self) + { + throw new RuntimeException("Shouldn't get in here: " + this); + } + + @Override + public SAction toGlobal(SModelFactory sf, Role self) + { + throw new RuntimeException("Shouldn't get in here: " + this); + } + + @Override + protected String getCommSymbol() + { + return "#"; + } + + @Override + public int hashCode() + { + int hash = 1021; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof IntermediateContinueEdge)) + { + return false; + } + return ((IntermediateContinueEdge) o).canEqual(this) && super.equals(o); + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof IntermediateContinueEdge; + } +} \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/model/global/SState.java b/scribble-core/src/main/java/org/scribble/model/global/SState.java index 32dd7bb2c..3a7fe06ce 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SState.java +++ b/scribble-core/src/main/java/org/scribble/model/global/SState.java @@ -80,6 +80,25 @@ protected String getNodeLabel() String labs = this.config.toString(); return "label=\"" + this.id + ":" + labs.substring(1, labs.length() - 1) + "\""; } + + @Override + public SState getTerminal() + { + return MState.getTerminal(this); + } + + @Override + public Set getReachableStates() + { + + return MState.getReachableStates(this); + } + + @Override + public Set getReachableActions() + { + return MState.getReachableActions(this); + } // FIXME? doesn't use super.hashCode (cf., equals) @Override diff --git a/scribble-core/src/main/java/org/scribble/type/Message.java b/scribble-core/src/main/java/org/scribble/type/Message.java index b4d485772..f3a70913d 100644 --- a/scribble-core/src/main/java/org/scribble/type/Message.java +++ b/scribble-core/src/main/java/org/scribble/type/Message.java @@ -23,4 +23,14 @@ public interface Message extends Arg { MessageId getId(); + + default boolean isMessageSig() + { + return false; + } + + default boolean isMessageSigName() + { + return false; + } } diff --git a/scribble-core/src/main/java/org/scribble/type/MessageSig.java b/scribble-core/src/main/java/org/scribble/type/MessageSig.java index 43c8fa37c..9080f3019 100644 --- a/scribble-core/src/main/java/org/scribble/type/MessageSig.java +++ b/scribble-core/src/main/java/org/scribble/type/MessageSig.java @@ -29,6 +29,12 @@ public MessageSig(Op op, Payload payload) this.payload = payload; } + @Override + public boolean isMessageSig() + { + return true; + } + @Override public SigKind getKind() { From 4a7926054e7e0dd21acf6bfb892123e641cb021d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 18 Feb 2019 19:13:50 +0000 Subject: [PATCH 105/539] Minor. --- .../java/org/scribble/lang/global/GSeq.java | 2 +- .../model/endpoint/EGraphBuilderUtil.java | 13 ++++++++---- .../model/endpoint/EGraphBuilderUtil2.java | 13 ++++++++---- .../scribble/visit/context/EGraphBuilder.java | 21 ++++++++++++------- 4 files changed, 33 insertions(+), 16 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java index 38d488aaa..923b0bb6f 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -89,7 +89,7 @@ public LSeq project(Role self) return new LSeq(null, elems); // Empty seqs converted to LSkip by GChoice/Recursion projection // And a WF top-level protocol cannot produce empty LSeq - // So a projection never contains an empty LSeq + // So a projection never contains an empty LSeq -- i.e., "empty choice/rec" pruning unnecessary } @Override diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java index 9fdf18bf3..15bf4b0bd 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java @@ -32,7 +32,8 @@ // Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) // Tailored to support graph building from syntactic local protocol choice and recursion -public class EGraphBuilderUtil extends GraphBuilderUtil +public class EGraphBuilderUtil + extends GraphBuilderUtil { public final EModelFactory ef; @@ -59,7 +60,8 @@ public EGraphBuilderUtil(EModelFactory ef) public void init(EState init) { clear(); - reset(this.ef.newEState(Collections.emptySet()), this.ef.newEState(Collections.emptySet())); + reset(this.ef.newEState(Collections.emptySet()), + this.ef.newEState(Collections.emptySet())); } protected void clear() @@ -317,7 +319,9 @@ public void addRecursionEdge(EState s, EAction a, EState succ) // Cf. LGraphBui } // succ assumed to be this.getEntry() - public void removeEdgeFromPredecessor(EState s, EAction a) throws ScribbleException // Removing prev edge, to be replaced by addRecursionEdge + public void removeEdgeFromPredecessor(EState s, EAction a) + throws ScribbleException + // Removing prev edge, to be replaced by addRecursionEdge { //s.removeEdge(a, this.getEntry()); removeEdgeAux(s, a, this.getEntry()); @@ -384,7 +388,8 @@ public EGraph finalise() } // FIXME: incomplete -- won't fully correctly handle situations involving, e.g., transitive continue-edge fixing? - protected void fixContinueEdges(Set seen, Map map, EState curr, EState res) + protected void fixContinueEdges(Set seen, Map map, + EState curr, EState res) { if (seen.contains(curr)) { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java index 2e79303df..cb5368e63 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java @@ -32,7 +32,8 @@ // Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) // Tailored to support graph building from syntactic local protocol choice and recursion -public class EGraphBuilderUtil2 extends GraphBuilderUtil +public class EGraphBuilderUtil2 + extends GraphBuilderUtil { public final EModelFactory ef; @@ -71,7 +72,8 @@ public EGraphBuilderUtil2(EGraphBuilderUtil2 b) public void init(EState init) { clear(); - reset(this.ef.newEState(Collections.emptySet()), this.ef.newEState(Collections.emptySet())); + reset(this.ef.newEState(Collections.emptySet()), + this.ef.newEState(Collections.emptySet())); } protected void clear() @@ -329,7 +331,9 @@ public void addRecursionEdge(EState s, EAction a, EState succ) // Cf. LGraphBui } // succ assumed to be this.getEntry() - public void removeEdgeFromPredecessor(EState s, EAction a) throws ScribbleException // Removing prev edge, to be replaced by addRecursionEdge + public void removeEdgeFromPredecessor(EState s, EAction a) + throws ScribbleException + // Removing prev edge, to be replaced by addRecursionEdge { //s.removeEdge(a, this.getEntry()); removeEdgeAux(s, a, this.getEntry()); @@ -396,7 +400,8 @@ public EGraph finalise() } // FIXME: incomplete -- won't fully correctly handle situations involving, e.g., transitive continue-edge fixing? - protected void fixContinueEdges(Set seen, Map map, EState curr, EState res) + protected void fixContinueEdges(Set seen, Map map, + EState curr, EState res) { if (seen.contains(curr)) { diff --git a/scribble-core/src/main/java/org/scribble/visit/context/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/visit/context/EGraphBuilder.java index 2b64028ad..9f1dbd563 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/EGraphBuilder.java @@ -39,11 +39,13 @@ public EGraphBuilder(Job job) // Override visitInlinedProtocol -- not visit, or else enter/exit is lost @Override - public ScribNode visitInlinedProtocol(ScribNode parent, ScribNode child) throws ScribbleException + public ScribNode visitInlinedProtocol(ScribNode parent, ScribNode child) + throws ScribbleException { if (child instanceof LInteractionSeq) { - return visitOverrideForLInteractionSeq((LProtocolBlock) parent, (LInteractionSeq) child); + return visitOverrideForLInteractionSeq((LProtocolBlock) parent, + (LInteractionSeq) child); } else if (child instanceof LChoice) { @@ -55,18 +57,22 @@ else if (child instanceof LChoice) } } - protected LInteractionSeq visitOverrideForLInteractionSeq(LProtocolBlock parent, LInteractionSeq child) throws ScribbleException + protected LInteractionSeq visitOverrideForLInteractionSeq( + LProtocolBlock parent, LInteractionSeq child) throws ScribbleException { - return ((LInteractionSeqDel) child.del()).visitForFsmConversion(this, child); + return ((LInteractionSeqDel) child.del()).visitForFsmConversion(this, + child); } - protected LChoice visitOverrideForLChoice(LInteractionSeq parent, LChoice child) + protected LChoice visitOverrideForLChoice(LInteractionSeq parent, + LChoice child) { return ((LChoiceDel) child.del()).visitForFsmConversion(this, child); } @Override - protected final void inlinedEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected final void inlinedEnter(ScribNode parent, ScribNode child) + throws ScribbleException //protected final void unfoldingEnter(ScribNode parent, ScribNode child) throws ScribbleException { super.inlinedEnter(parent, child); @@ -75,7 +81,8 @@ protected final void inlinedEnter(ScribNode parent, ScribNode child) throws Scri } @Override - protected ScribNode inlinedLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected ScribNode inlinedLeave(ScribNode parent, ScribNode child, + ScribNode visited) throws ScribbleException //protected ScribNode unfoldingLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException { visited = visited.del().leaveEGraphBuilding(parent, child, this, visited); From ee9afa9bc032d455a2f6efd0bcdb8931ecea3707 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 19 Feb 2019 11:45:04 +0000 Subject: [PATCH 106/539] Continued WIP. --- .../main/java/org/scribble/lang/local/LSeq.java | 9 +-------- scribble-test/src/test/scrib/tmp/Test.scr | 15 +++++++++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java index 736b72a4c..56982fc95 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java @@ -1,7 +1,6 @@ package org.scribble.lang.local; import java.util.Collections; -import java.util.Deque; import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -91,24 +90,18 @@ public void buildGraph(EGraphBuilderUtil2 b) { throw new RuntimeException("Shouldn't get here: " + this); } - //int size = elems.size(); - //for (int i = 0; i < size; i++) - for (Iterator i = ((Deque) new LinkedList<>(elems)) // To avoid generic cast... - .descendingIterator(); i.hasNext(); ) + for (Iterator i = getElements().iterator(); i.hasNext(); ) { LType next = i.next(); - //if (i == size - 1) if (!i.hasNext()) { b.setExit(exit); - //elems.get(i).toGraph(b); next.buildGraph(b); } else { EState tmp = b.ef.newEState(Collections.emptySet()); b.setExit(tmp); - //elems.get(i).toGraph(b); next.buildGraph(b); b.setEntry(b.getExit()); // CHECKME: exit may not be tmp, entry/exit can be modified, e.g. continue diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 57921efcc..5696010f0 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -33,11 +33,18 @@ module tmp.Test; // TODO: port forwarding version of P2 -- funny case of "session" persisting over full disconnect, should/how to correlate? -global protocol Proto1(role A, role B, role C) +global protocol Proto1(role A, role B) { - 1() from A to B; - 2() from B to C; - 3() from C to A; + choice at A + { + 1() from A to B; + } + or + { + 2() from A to B; + 3() from A to B; + } + 4() from A to B; } From 1914d0a5b36b82c79051134b3e2fae13a91f43a8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 19 Feb 2019 18:59:43 +0000 Subject: [PATCH 107/539] Continued WIP. --- .../java/org/scribble/ast/AstFactory.java | 162 +++++++++---- .../java/org/scribble/ast/AstFactoryImpl.java | 135 +++++++---- .../java/org/scribble/ast/DelDecorator.java | 5 +- .../org/scribble/ast/DelDecoratorImpl.java | 24 +- .../java/org/scribble/ast/ProtocolDecl.java | 27 ++- .../java/org/scribble/ast/ProtocolMod.java | 3 + .../org/scribble/ast/ProtocolModList.java | 93 ++++++++ .../scribble/ast/global/GProtocolDecl.java | 11 +- .../scribble/ast/local/LProjectionDecl.java | 3 +- .../org/scribble/ast/local/LProtocolDecl.java | 15 +- .../java/org/scribble/ast/name/NameNode.java | 3 +- .../del/local/LProjectionDeclDel.java | 4 +- .../src/main/java/org/scribble/job/Job.java | 1 + .../java/org/scribble/job/JobContext.java | 5 +- .../scribble/visit/wf/WFChoiceChecker.java | 3 +- .../org/scribble/parser/antlr/Scribble.g | 217 +----------------- .../parser/scribble/ScribTreeAdaptor.java | 3 + .../ast/global/AntlrGProtocolDecl.java | 18 +- scribble-test/src/test/scrib/tmp/Test.scr | 2 + 19 files changed, 389 insertions(+), 345 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java create mode 100644 scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java diff --git a/scribble-core/src/main/java/org/scribble/ast/AstFactory.java b/scribble-core/src/main/java/org/scribble/ast/AstFactory.java index b0b0235aa..491325a23 100644 --- a/scribble-core/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-core/src/main/java/org/scribble/ast/AstFactory.java @@ -33,7 +33,6 @@ import org.scribble.ast.global.GWrap; import org.scribble.ast.local.LAccept; import org.scribble.ast.local.LChoice; -import org.scribble.ast.local.LRequest; import org.scribble.ast.local.LContinue; import org.scribble.ast.local.LDelegationElem; import org.scribble.ast.local.LDisconnect; @@ -47,6 +46,7 @@ import org.scribble.ast.local.LProtocolHeader; import org.scribble.ast.local.LReceive; import org.scribble.ast.local.LRecursion; +import org.scribble.ast.local.LRequest; import org.scribble.ast.local.LSend; import org.scribble.ast.local.LWrapClient; import org.scribble.ast.local.LWrapServer; @@ -74,81 +74,155 @@ public interface AstFactory { - Module Module(CommonTree source, ModuleDecl moddecl, List> imports, List> data, List> protos); - - MessageSigNode MessageSigNode(CommonTree source, OpNode op, PayloadElemList payload); + Module Module(CommonTree source, ModuleDecl moddecl, + List> imports, List> data, + List> protos); + + MessageSigNode MessageSigNode(CommonTree source, OpNode op, + PayloadElemList payload); + + GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode name, + RoleNode role); - GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode name, RoleNode role); LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode name); - //PayloadElemList PayloadElemList(List> payloadelems); - PayloadElemList PayloadElemList(CommonTree source, List> payloadelems); - //PayloadElem PayloadElem(PayloadElemNameNode name); - //UnaryPayloadElem DataTypeElem(PayloadElemNameNode name); - //UnaryPayloadElem UnaryPayloadElem(PayloadElemNameNode name); - UnaryPayloadElem UnaryPayloadElem(CommonTree source, PayloadElemNameNode name); + // PayloadElemList PayloadElemList(List> payloadelems); + PayloadElemList PayloadElemList(CommonTree source, + List> payloadelems); + + // PayloadElem PayloadElem(PayloadElemNameNode name); + // UnaryPayloadElem DataTypeElem(PayloadElemNameNode name); + // UnaryPayloadElem UnaryPayloadElem(PayloadElemNameNode name); + UnaryPayloadElem UnaryPayloadElem( + CommonTree source, PayloadElemNameNode name); ModuleDecl ModuleDecl(CommonTree source, ModuleNameNode fullmodname); - ImportModule ImportModule(CommonTree source, ModuleNameNode modname, ModuleNameNode alias); - - MessageSigNameDecl MessageSigNameDecl(CommonTree source, String schema, String extName, String extSource, MessageSigNameNode name); - DataTypeDecl DataTypeDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name); - GProtocolDecl GProtocolDecl(CommonTree source, List modifiers, GProtocolHeader header, GProtocolDef def); - GProtocolHeader GProtocolHeader(CommonTree source, GProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls); + ImportModule ImportModule(CommonTree source, ModuleNameNode modname, + ModuleNameNode alias); + + MessageSigNameDecl MessageSigNameDecl(CommonTree source, String schema, + String extName, String extSource, MessageSigNameNode name); + + DataTypeDecl DataTypeDecl(CommonTree source, String schema, String extName, + String extSource, DataTypeNode name); + + GProtocolDecl GProtocolDecl(CommonTree source, List modifiers, + GProtocolHeader header, GProtocolDef def); + + GProtocolHeader GProtocolHeader(CommonTree source, GProtocolNameNode name, + RoleDeclList roledecls, NonRoleParamDeclList paramdecls); RoleDeclList RoleDeclList(CommonTree source, List rds); + RoleDecl RoleDecl(CommonTree source, RoleNode role); - //ConnectDecl ConnectDecl(CommonTree source, RoleNode src, RoleNode role); - NonRoleParamDeclList NonRoleParamDeclList(CommonTree source, List> pds); - NonRoleParamDecl NonRoleParamDecl(CommonTree source, K kind, NonRoleParamNode name); - + + // ConnectDecl ConnectDecl(CommonTree source, RoleNode src, RoleNode role); + NonRoleParamDeclList NonRoleParamDeclList(CommonTree source, + List> pds); + + NonRoleParamDecl NonRoleParamDecl( + CommonTree source, K kind, NonRoleParamNode name); + GProtocolDef GProtocolDef(CommonTree source, GProtocolBlock block); + GProtocolBlock GProtocolBlock(CommonTree source, GInteractionSeq gis); - GInteractionSeq GInteractionSeq(CommonTree source, List gis); - GMessageTransfer GMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List dests); - GConnect GConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest); - //GConnect GConnect(CommonTree source, RoleNode src, RoleNode dest); + GInteractionSeq GInteractionSeq(CommonTree source, + List gis); + + GMessageTransfer GMessageTransfer(CommonTree source, RoleNode src, + MessageNode msg, List dests); + + GConnect GConnect(CommonTree source, RoleNode src, MessageNode msg, + RoleNode dest); + + // GConnect GConnect(CommonTree source, RoleNode src, RoleNode dest); GDisconnect GDisconnect(CommonTree source, RoleNode src, RoleNode dest); + GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest); - GChoice GChoice(CommonTree source, RoleNode subj, List blocks); - GRecursion GRecursion(CommonTree source, RecVarNode recvar, GProtocolBlock block); + + GChoice GChoice(CommonTree source, RoleNode subj, + List blocks); + + GRecursion GRecursion(CommonTree source, RecVarNode recvar, + GProtocolBlock block); + GContinue GContinue(CommonTree source, RecVarNode recvar); - GDo GDo(CommonTree source, RoleArgList roles, NonRoleArgList args, GProtocolNameNode proto); - + + GDo GDo(CommonTree source, RoleArgList roles, NonRoleArgList args, + GProtocolNameNode proto); + RoleArgList RoleArgList(CommonTree source, List roles); + RoleArg RoleArg(CommonTree source, RoleNode role); + NonRoleArgList NonRoleArgList(CommonTree source, List args); + NonRoleArg NonRoleArg(CommonTree source, NonRoleArgNode arg); - NameNode SimpleNameNode(CommonTree source, K kind, String identifier); - QualifiedNameNode QualifiedNameNode(CommonTree source, K kind, String... elems); - + NameNode SimpleNameNode(CommonTree source, K kind, + String identifier); + + QualifiedNameNode QualifiedNameNode(CommonTree source, + K kind, String... elems); + AmbigNameNode AmbiguousNameNode(CommonTree source, String identifier); - NonRoleParamNode NonRoleParamNode(CommonTree source, K kind, String identifier); + + NonRoleParamNode NonRoleParamNode( + CommonTree source, K kind, String identifier); + DummyProjectionRoleNode DummyProjectionRoleNode(); - LProtocolDecl LProtocolDecl(CommonTree source, List modifiers, LProtocolHeader header, LProtocolDef def); // Not currently used -- local protos not parsed, only projected - LProjectionDecl LProjectionDecl(CommonTree source, List modifiers, GProtocolName fullname, Role self, LProtocolHeader header, LProtocolDef def); // del extends that of LProtocolDecl + LProtocolDecl LProtocolDecl(CommonTree source, List modifiers, + LProtocolHeader header, LProtocolDef def); + // Not currently used -- local protos not parsed, only projected + + LProjectionDecl LProjectionDecl(CommonTree source, + List modifiers, GProtocolName fullname, Role self, + LProtocolHeader header, LProtocolDef def); + // del extends that of LProtocolDecl + + LProtocolHeader LProtocolHeader(CommonTree source, LProtocolNameNode name, + RoleDeclList roledecls, NonRoleParamDeclList paramdecls); - LProtocolHeader LProtocolHeader(CommonTree source, LProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls); SelfRoleDecl SelfRoleDecl(CommonTree source, RoleNode namenode); + LProtocolDef LProtocolDef(CommonTree source, LProtocolBlock block); + LProtocolBlock LProtocolBlock(CommonTree source, LInteractionSeq seq); - LInteractionSeq LInteractionSeq(CommonTree source, List actions); - LSend LSend(CommonTree source, RoleNode src, MessageNode msg, List dests); - LReceive LReceive(CommonTree source, RoleNode src, MessageNode msg, List dests); - LRequest LRequest(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest); - LAccept LAccept(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest); + LInteractionSeq LInteractionSeq(CommonTree source, + List actions); + + LSend LSend(CommonTree source, RoleNode src, MessageNode msg, + List dests); + + LReceive LReceive(CommonTree source, RoleNode src, MessageNode msg, + List dests); + + LRequest LRequest(CommonTree source, RoleNode src, MessageNode msg, + RoleNode dest); + + LAccept LAccept(CommonTree source, RoleNode src, MessageNode msg, + RoleNode dest); + /*LConnect LConnect(CommonTree source, RoleNode src, RoleNode dest); LAccept LAccept(CommonTree source, RoleNode src, RoleNode dest);*/ LDisconnect LDisconnect(CommonTree source, RoleNode self, RoleNode peer); + LWrapClient LWrapClient(CommonTree source, RoleNode self, RoleNode peer); + LWrapServer LWrapServer(CommonTree source, RoleNode self, RoleNode peer); - LChoice LChoice(CommonTree source, RoleNode subj, List blocks); - LRecursion LRecursion(CommonTree source, RecVarNode recvar, LProtocolBlock block); + + LChoice LChoice(CommonTree source, RoleNode subj, + List blocks); + + LRecursion LRecursion(CommonTree source, RecVarNode recvar, + LProtocolBlock block); + LContinue LContinue(CommonTree source, RecVarNode recvar); - LDo LDo(CommonTree source, RoleArgList roles, NonRoleArgList args, LProtocolNameNode proto); + + LDo LDo(CommonTree source, RoleArgList roles, NonRoleArgList args, + LProtocolNameNode proto); } diff --git a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java index 3b4878bd5..548192efa 100644 --- a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -146,14 +146,18 @@ protected MessageSigNode UnitMessageSigNode() { if (UNIT_MESSAGE_SIG_NODE == null) { - UNIT_MESSAGE_SIG_NODE = MessageSigNode(null, (OpNode) SimpleNameNode(null, OpKind.KIND, Op.EMPTY_OPERATOR.toString()), - PayloadElemList(null, Collections.emptyList())); // Payload.EMPTY_PAYLOAD? + UNIT_MESSAGE_SIG_NODE = MessageSigNode(null, + (OpNode) SimpleNameNode(null, OpKind.KIND, + Op.EMPTY_OPERATOR.toString()), + PayloadElemList(null, Collections.emptyList())); + // Payload.EMPTY_PAYLOAD? } return UNIT_MESSAGE_SIG_NODE; } @Override - public MessageSigNode MessageSigNode(CommonTree source, OpNode op, PayloadElemList payload) + public MessageSigNode MessageSigNode(CommonTree source, OpNode op, + PayloadElemList payload) { MessageSigNode msn = new MessageSigNode(source, op, payload); msn = del(msn, createDefaultDelegate()); @@ -162,7 +166,8 @@ public MessageSigNode MessageSigNode(CommonTree source, OpNode op, PayloadElemLi @Override //public PayloadElemList PayloadElemList(List payloadelems) - public PayloadElemList PayloadElemList(CommonTree source, List> payloadelems) + public PayloadElemList PayloadElemList(CommonTree source, + List> payloadelems) { PayloadElemList p = new PayloadElemList(source, payloadelems); p = del(p, createDefaultDelegate()); @@ -180,7 +185,8 @@ public PayloadElem PayloadElem(PayloadElemNameNode name) @Override //public UnaryPayloadElem DataTypeElem(PayloadElemNameNode name) //public UnaryPayloadElem UnaryPayloadElem(PayloadElemNameNode name) - public UnaryPayloadElem UnaryPayloadElem(CommonTree source, PayloadElemNameNode name) + public UnaryPayloadElem UnaryPayloadElem( + CommonTree source, PayloadElemNameNode name) { UnaryPayloadElem de= new UnaryPayloadElem<>(source, name); de = del(de, createDefaultDelegate()); @@ -188,7 +194,8 @@ public UnaryPayloadElem UnaryPayloadElem(CommonTr } @Override - public GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role) + public GDelegationElem GDelegationElem(CommonTree source, + GProtocolNameNode proto, RoleNode role) { GDelegationElem de = new GDelegationElem(source, proto, role); //de = del(de, createDefaultDelegate()); @@ -197,7 +204,8 @@ public GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode prot } @Override - public LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode proto) + public LDelegationElem LDelegationElem(CommonTree source, + LProtocolNameNode proto) { LDelegationElem de = new LDelegationElem(source, proto); de = del(de, createDefaultDelegate()); @@ -205,7 +213,9 @@ public LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode prot } @Override - public Module Module(CommonTree source, ModuleDecl moddecl, List> imports, List> data, List> protos) + public Module Module(CommonTree source, ModuleDecl moddecl, + List> imports, List> data, + List> protos) { Module module = new Module(source, moddecl, imports, data, protos); module = del(module, new ModuleDel()); @@ -221,31 +231,37 @@ public ModuleDecl ModuleDecl(CommonTree source, ModuleNameNode fullmodname) } @Override - public ImportModule ImportModule(CommonTree source, ModuleNameNode modname, ModuleNameNode alias) + public ImportModule ImportModule(CommonTree source, ModuleNameNode modname, + ModuleNameNode alias) { ImportModule im = new ImportModule(source, modname, alias); im = del(im, new ImportModuleDel()); return im; } - + @Override - public MessageSigNameDecl MessageSigNameDecl(CommonTree source, String schema, String extName, String extSource, MessageSigNameNode alias) + public MessageSigNameDecl MessageSigNameDecl(CommonTree source, String schema, + String extName, String extSource, MessageSigNameNode alias) { - MessageSigNameDecl msd = new MessageSigNameDecl(source, schema, extName, extSource, alias); + MessageSigNameDecl msd = new MessageSigNameDecl(source, schema, extName, + extSource, alias); msd = del(msd, createDefaultDelegate()); return msd; } @Override - public DataTypeDecl DataTypeDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode alias) + public DataTypeDecl DataTypeDecl(CommonTree source, String schema, + String extName, String extSource, DataTypeNode alias) { - DataTypeDecl dtd = new DataTypeDecl(source, schema, extName, extSource, alias); + DataTypeDecl dtd = new DataTypeDecl(source, schema, extName, extSource, + alias); dtd = del(dtd, createDefaultDelegate()); return dtd; } @Override - public GProtocolDecl GProtocolDecl(CommonTree source, List mods, GProtocolHeader header, GProtocolDef def) + public GProtocolDecl GProtocolDecl(CommonTree source, List mods, + GProtocolHeader header, GProtocolDef def) { GProtocolDecl gpd = new GProtocolDecl(source, mods, header, def); gpd = del(gpd, new GProtocolDeclDel()); @@ -253,9 +269,12 @@ public GProtocolDecl GProtocolDecl(CommonTree source, List> pds) + public NonRoleParamDeclList NonRoleParamDeclList(CommonTree source, + List> pds) { NonRoleParamDeclList pdl = new NonRoleParamDeclList(source, pds); pdl = del(pdl, new NonRoleParamDeclListDel()); @@ -293,7 +313,8 @@ public NonRoleParamDeclList NonRoleParamDeclList(CommonTree source, List NonRoleParamDecl NonRoleParamDecl(CommonTree source, K kind, NonRoleParamNode namenode) + public NonRoleParamDecl NonRoleParamDecl( + CommonTree source, K kind, NonRoleParamNode namenode) { NonRoleParamDecl pd = new NonRoleParamDecl(source, kind, namenode); pd = del(pd, new NonRoleParamDeclDel()); @@ -317,7 +338,8 @@ public GProtocolBlock GProtocolBlock(CommonTree source, GInteractionSeq seq) } @Override - public GInteractionSeq GInteractionSeq(CommonTree source, List actions) + public GInteractionSeq GInteractionSeq(CommonTree source, + List actions) { GInteractionSeq gis = new GInteractionSeq(source, actions); gis = del(gis, new GInteractionSeqDel()); @@ -325,7 +347,8 @@ public GInteractionSeq GInteractionSeq(CommonTree source, List } @Override - public GMessageTransfer GMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List dests) + public GMessageTransfer GMessageTransfer(CommonTree source, RoleNode src, + MessageNode msg, List dests) { GMessageTransfer gmt = new GMessageTransfer(source, src, msg, dests); gmt = del(gmt, new GMessageTransferDel()); @@ -360,7 +383,8 @@ public GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest) } @Override - public GChoice GChoice(CommonTree source, RoleNode subj, List blocks) + public GChoice GChoice(CommonTree source, RoleNode subj, + List blocks) { GChoice gc = new GChoice(source, subj, blocks); gc = del(gc, new GChoiceDel()); @@ -368,7 +392,8 @@ public GChoice GChoice(CommonTree source, RoleNode subj, List bl } @Override - public GRecursion GRecursion(CommonTree source, RecVarNode recvar, GProtocolBlock block) + public GRecursion GRecursion(CommonTree source, RecVarNode recvar, + GProtocolBlock block) { GRecursion gr = new GRecursion(source, recvar, block); gr = del(gr, new GRecursionDel()); @@ -384,7 +409,8 @@ public GContinue GContinue(CommonTree source, RecVarNode recvar) } @Override - public GDo GDo(CommonTree source, RoleArgList roleinstans, NonRoleArgList arginstans, GProtocolNameNode proto) + public GDo GDo(CommonTree source, RoleArgList roleinstans, + NonRoleArgList arginstans, GProtocolNameNode proto) { GDo gd = new GDo(source, roleinstans, arginstans, proto); gd = del(gd, new GDoDel()); @@ -422,13 +448,13 @@ public NonRoleArg NonRoleArg(CommonTree source, NonRoleArgNode arg) ri = del(ri, createDefaultDelegate()); return ri; } - + @Override public NameNode SimpleNameNode(CommonTree source, K kind, String identifier) { NameNode snn = null; - + // "Custom" del's if (kind.equals(RecVarKind.KIND)) { @@ -487,7 +513,7 @@ else if (kind.equals(Global.KIND)) } else if (kind.equals(Local.KIND)) { - qnn = new LProtocolNameNode(source,elems); + qnn = new LProtocolNameNode(source, elems); } else { @@ -496,7 +522,7 @@ else if (kind.equals(Local.KIND)) System.out.println("rrrr: " + kind + " ,, " + Arrays.toString(elems)); return castNameNode(kind, del(qnn, createDefaultDelegate())); } - + protected static , K extends Kind> T castNameNode( K kind, NameNode n) { @@ -512,13 +538,14 @@ protected static , K extends Kind> T castNameNode( @Override public AmbigNameNode AmbiguousNameNode(CommonTree source, String identifier) { - AmbigNameNode ann = new AmbigNameNode(source, identifier); + AmbigNameNode ann = new AmbigNameNode(source, identifier); ann = (AmbigNameNode) ann.del(new AmbigNameNodeDel()); return ann; } @Override - public NonRoleParamNode NonRoleParamNode(CommonTree source, K kind, String identifier) + public NonRoleParamNode NonRoleParamNode( + CommonTree source, K kind, String identifier) { NonRoleParamNode pn = new NonRoleParamNode(source, kind, identifier); pn = del(pn, new ParamNodeDel()); @@ -534,7 +561,8 @@ public DummyProjectionRoleNode DummyProjectionRoleNode() } @Override // Called from LProtocolDecl::clone, but currently never used -- local proto decls only projected, not parsed - public LProtocolDecl LProtocolDecl(CommonTree source, List mods, LProtocolHeader header, LProtocolDef def) + public LProtocolDecl LProtocolDecl(CommonTree source, List mods, + LProtocolHeader header, LProtocolDef def) { LProtocolDecl lpd = new LProtocolDecl(source, mods, header, def); lpd = del(lpd, new LProtocolDeclDel()); @@ -542,7 +570,10 @@ public LProtocolDecl LProtocolDecl(CommonTree source, List mods, GProtocolName fullname, Role self, LProtocolHeader header, LProtocolDef def) // del extends that of LProtocolDecl + public LProjectionDecl LProjectionDecl(CommonTree source, + List mods, GProtocolName fullname, Role self, + LProtocolHeader header, LProtocolDef def) + // del extends that of LProtocolDecl { LProjectionDecl lpd = new LProjectionDecl(source, mods, header, def); lpd = del(lpd, new LProjectionDeclDel(fullname, self)); @@ -550,9 +581,12 @@ public LProjectionDecl LProjectionDecl(CommonTree source, List actions) + public LInteractionSeq LInteractionSeq(CommonTree source, + List actions) { LInteractionSeq lis = new LInteractionSeq(source, actions); lis = del(lis, new LInteractionSeqDel()); @@ -590,7 +625,8 @@ public LInteractionSeq LInteractionSeq(CommonTree source, List } @Override - public LSend LSend(CommonTree source, RoleNode src, MessageNode msg, List dests) + public LSend LSend(CommonTree source, RoleNode src, MessageNode msg, + List dests) { LSend ls = new LSend(source, src, msg, dests); ls = del(ls, new LSendDel()); @@ -598,7 +634,8 @@ public LSend LSend(CommonTree source, RoleNode src, MessageNode msg, List dests) + public LReceive LReceive(CommonTree source, RoleNode src, MessageNode msg, + List dests) { LReceive ls = new LReceive(source, src, msg, dests); ls = del(ls, new LReceiveDel()); @@ -606,7 +643,8 @@ public LReceive LReceive(CommonTree source, RoleNode src, MessageNode msg, List< } @Override - public LRequest LRequest(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) + public LRequest LRequest(CommonTree source, RoleNode src, MessageNode msg, + RoleNode dest) //public LConnect LConnect(RoleNode src, RoleNode dest) { LRequest lc = new LRequest(source, src, msg, dest); @@ -616,7 +654,8 @@ public LRequest LRequest(CommonTree source, RoleNode src, MessageNode msg, RoleN } @Override - public LAccept LAccept(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) + public LAccept LAccept(CommonTree source, RoleNode src, MessageNode msg, + RoleNode dest) //public LAccept LAccept(RoleNode src, RoleNode dest) { LAccept la = new LAccept(source, src, msg, dest); @@ -626,7 +665,8 @@ public LAccept LAccept(CommonTree source, RoleNode src, MessageNode msg, RoleNod } @Override - public LDisconnect LDisconnect(CommonTree source, RoleNode self, RoleNode peer) + public LDisconnect LDisconnect(CommonTree source, RoleNode self, + RoleNode peer) { LDisconnect lc = new LDisconnect(source, UnitMessageSigNode(), self, peer); lc = del(lc, new LDisconnectDel()); @@ -634,7 +674,8 @@ public LDisconnect LDisconnect(CommonTree source, RoleNode self, RoleNode peer) } @Override - public LWrapClient LWrapClient(CommonTree source, RoleNode self, RoleNode peer) + public LWrapClient LWrapClient(CommonTree source, RoleNode self, + RoleNode peer) { LWrapClient lwc = new LWrapClient(source, UnitMessageSigNode(), self, peer); lwc = del(lwc, new LWrapClientDel()); @@ -642,7 +683,8 @@ public LWrapClient LWrapClient(CommonTree source, RoleNode self, RoleNode peer) } @Override - public LWrapServer LWrapServer(CommonTree source, RoleNode self, RoleNode peer) + public LWrapServer LWrapServer(CommonTree source, RoleNode self, + RoleNode peer) { LWrapServer lws = new LWrapServer(source, UnitMessageSigNode(), self, peer); lws = del(lws, new LWrapServerDel()); @@ -650,7 +692,8 @@ public LWrapServer LWrapServer(CommonTree source, RoleNode self, RoleNode peer) } @Override - public LChoice LChoice(CommonTree source, RoleNode subj, List blocks) + public LChoice LChoice(CommonTree source, RoleNode subj, + List blocks) { LChoice lc = new LChoice(source, subj, blocks); lc = del(lc, new LChoiceDel()); @@ -658,7 +701,8 @@ public LChoice LChoice(CommonTree source, RoleNode subj, List bl } @Override - public LRecursion LRecursion(CommonTree source, RecVarNode recvar, LProtocolBlock block) + public LRecursion LRecursion(CommonTree source, RecVarNode recvar, + LProtocolBlock block) { LRecursion lr = new LRecursion(source, recvar, block); lr = del(lr, new LRecursionDel()); @@ -674,7 +718,8 @@ public LContinue LContinue(CommonTree source, RecVarNode recvar) } @Override - public LDo LDo(CommonTree source, RoleArgList roleinstans, NonRoleArgList arginstans, LProtocolNameNode proto) + public LDo LDo(CommonTree source, RoleArgList roleinstans, + NonRoleArgList arginstans, LProtocolNameNode proto) { LDo ld = new LDo(source, roleinstans, arginstans, proto); ld = del(ld, new LDoDel()); diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java b/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java index 9c0d40183..ec984fa4e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java @@ -34,7 +34,7 @@ import org.scribble.ast.name.simple.RoleNode; -// ast package to access protected non-defensive del setter +// In ast package to access protected non-defensive del setter public interface DelDecorator { void decorate(CommonTree n); @@ -49,8 +49,9 @@ public interface DelDecorator DataTypeDecl DataTypeDecl(DataTypeDecl dd);*/ void GProtocolDecl(GProtocolDecl gpd); - void GProtocolHeader(GProtocolHeader gph); + void ProtocolModList(ProtocolModList mods); + void GProtocolHeader(GProtocolHeader gph); void RoleDeclList(RoleDeclList rds); void RoleDecl(RoleDecl rd); void NonRoleParamDeclList(NonRoleParamDeclList pds); diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java index 17d39e7ca..a8c5819a7 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java @@ -58,7 +58,7 @@ import org.scribble.del.name.RoleNodeDel; -// ast package to access protected non-defensive del setter +// In ast package to access protected non-defensive del setter public class DelDecoratorImpl implements DelDecorator { public DelDecoratorImpl() @@ -88,6 +88,16 @@ public void decorate(CommonTree n) case "GLOBALPROTOCOLDECL": GProtocolDecl((GProtocolDecl) n); break; + case "GLOBALPROTOCOLDECLMODS": + ProtocolModList((ProtocolModList) n); + break; + + case "GLOBALPROTOCOLHEADER": + GProtocolHeader((GProtocolHeader) n); + break; + case "GPROTOCOLNAME": + GProtocolNameNode((GProtocolNameNode) n); + break; case "ROLEDECLLIST": RoleDeclList((RoleDeclList) n); break; @@ -100,12 +110,6 @@ public void decorate(CommonTree n) break; //case PARAMETERDECL: return AntlrNonRoleParamDecl.parseNonRoleParamDecl(this, ct, af);*/ - case "GLOBALPROTOCOLHEADER": - GProtocolHeader((GProtocolHeader) n); - break; - case "GPROTOCOLNAME": - GProtocolNameNode((GProtocolNameNode) n); - break; case "GLOBALPROTOCOLDEF": GProtocolDef((GProtocolDef) n); break; @@ -240,6 +244,12 @@ public void GProtocolDecl(GProtocolDecl gpd) setDel(gpd, new GProtocolDeclDel()); } + @Override + public void ProtocolModList(ProtocolModList mods) + { + setDel(mods, createDefaultDelegate()); + } + @Override public void GProtocolHeader(GProtocolHeader gph) { diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java index 38e66044c..4dbc79646 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java @@ -24,13 +24,10 @@ import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; -// FIXME: visitChildren for modifiers +// CHECKME: visitChildren for modifiers public abstract class ProtocolDecl extends ScribNodeBase implements ModuleMember, ProtocolKindNode { - public static enum Modifiers { EXPLICIT, AUX } // CHECKME: factor out? Move to Header? - - public final List modifiers; // ScribTreeAdaptor#create constructor protected ProtocolDecl(Token t) @@ -54,25 +51,32 @@ protected ProtocolDecl(ProtocolDecl node) public boolean isExplicit() { - return this.modifiers.contains(Modifiers.EXPLICIT); + return getModifierListChild().getModList().contains(ProtocolMod.EXPLICIT); } public boolean isAux() { - return this.modifiers.contains(Modifiers.AUX); + return getModifierListChild().getModList().contains(ProtocolMod.AUX); } + public ProtocolModList getModifierListChild() + { + return (ProtocolModList) getChild(0); + } + // Implement in subclasses to avoid generic cast public abstract ProtocolHeader getHeaderChild(); public abstract ProtocolDef getDefChild(); //public abstract ProtocolName getFullProtocolName(Module mod); - public ProtocolDecl reconstruct(ProtocolHeader header, - ProtocolDef def) //, ProtocolDeclContext pdcontext, Env env); + public ProtocolDecl reconstruct(ProtocolModList mods, + ProtocolHeader header, ProtocolDef def) + //, ProtocolDeclContext pdcontext, Env env); { ProtocolDecl pd = dupNode(); ScribDel del = del(); + pd.addChild(mods); pd.addChild(header); pd.addChild(def); pd.setDel(del); // No copy @@ -82,10 +86,12 @@ public ProtocolDecl reconstruct(ProtocolHeader header, @Override public ProtocolDecl visitChildren(AstVisitor nv) throws ScribbleException { + ProtocolModList mods = visitChildWithClassEqualityCheck(this, + getModifierListChild(), nv); ProtocolHeader header = visitChildWithClassEqualityCheck(this, getHeaderChild(), nv); ProtocolDef def = visitChildWithClassEqualityCheck(this, getDefChild(), nv); - return reconstruct(header, def); + return reconstruct(mods, header, def); } public List getRoles() @@ -111,10 +117,11 @@ public String toString() // Maybe just use standard pattern, make private with casting getters -- works better (e.g. to use overridden getName) + public final List modifiers; private final ProtocolHeader header; private final ProtocolDef def; - protected ProtocolDecl(CommonTree source, List modifiers, + protected ProtocolDecl(CommonTree source, List modifiers, ProtocolHeader header, ProtocolDef def) { super(source); diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java new file mode 100644 index 000000000..20dfd2ea8 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java @@ -0,0 +1,3 @@ +package org.scribble.ast; + +public enum ProtocolMod { AUX, EXPLICIT } // CHECKME: move to Header? \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java new file mode 100644 index 000000000..df127abfd --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java @@ -0,0 +1,93 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast; + +import java.util.List; +import java.util.stream.Collectors; + +import org.antlr.runtime.Token; +import org.antlr.runtime.tree.CommonTree; +import org.scribble.job.ScribbleException; +import org.scribble.visit.AstVisitor; + +// (Currently) a list of mod leaf nodes as AmbigNameNodes (cf., NameNode "elements") +public class ProtocolModList extends ScribNodeBase +{ + // ScribTreeAdaptor#create constructor + public ProtocolModList(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected ProtocolModList(ProtocolModList node) + { + super(node); + } + + @Override + public ProtocolModList dupNode() + { + return new ProtocolModList(this); + } + + @Override + public ProtocolModList visitChildren(AstVisitor nv) throws ScribbleException + { + // CHECKME: + return this; + } + + // Cf., NameNode::getSimpleNameList + public List getModList() + { + return ((List) getChildren()).stream() + .map(x -> parseModifier(((CommonTree) x).getText())) + .collect(Collectors.toList()); + // CHECKME: currently AmbigNameNode(?) + // CHECKME: factor out getText? + } + + public boolean isAux() + { + return getModList().contains(ProtocolMod.AUX); + } + + public boolean isExplicit() + { + return getModList().contains(ProtocolMod.EXPLICIT); + } + + public boolean isEmpty() + { + return getChildCount() == 0; + } + + @Override + public String toString() + { + return getModList().stream().map(x -> x.toString()) + .collect(Collectors.joining(" ")); + } + + private ProtocolMod parseModifier(String mod) + { + switch (mod) + { + case "aux": return ProtocolMod.AUX; + case "explicit": return ProtocolMod.EXPLICIT; + default: throw new RuntimeException("Invalid modifier: " + mod); + } + } +} diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java index 5f9747137..8ff927c5c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java @@ -20,6 +20,7 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.ProtocolMod; import org.scribble.ast.local.LProjectionDecl; import org.scribble.ast.local.LProtocolDef; import org.scribble.ast.local.LProtocolHeader; @@ -51,7 +52,9 @@ public GProtocolDecl dupNode() } // CHECKME: project modifiers? - public LProjectionDecl project(AstFactory af, Module mod, Role self, LProtocolHeader hdr, LProtocolDef def) throws ScribbleException // mod is just the parent? + public LProjectionDecl project(AstFactory af, Module mod, Role self, + LProtocolHeader hdr, LProtocolDef def) throws ScribbleException + // mod is just the parent? { /*//Role self = proj.peekSelf(); GProtocolHeader gph = getHeader(); @@ -71,13 +74,13 @@ public LProjectionDecl project(AstFactory af, Module mod, Role self, LProtocolHe @Override public GProtocolHeader getHeaderChild() { - return (GProtocolHeader) getChild(0); + return (GProtocolHeader) getChild(1); } @Override public GProtocolDef getDefChild() { - return (GProtocolDef) getChild(1); + return (GProtocolDef) getChild(2); } @Override @@ -116,7 +119,7 @@ public Global getKind() - public GProtocolDecl(CommonTree source, List modifiers, GProtocolHeader header, GProtocolDef def) + public GProtocolDecl(CommonTree source, List modifiers, GProtocolHeader header, GProtocolDef def) { super(source, modifiers, header, def); } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LProjectionDecl.java b/scribble-core/src/main/java/org/scribble/ast/local/LProjectionDecl.java index 3225ff44c..cfb328b4d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LProjectionDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LProjectionDecl.java @@ -17,6 +17,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.ProtocolMod; // A projected local proto -- cf. parsed public class LProjectionDecl extends LProtocolDecl @@ -54,7 +55,7 @@ public LProjectionDecl dupNode() - public LProjectionDecl(CommonTree source, List modifiers, LProtocolHeader header, LProtocolDef def) + public LProjectionDecl(CommonTree source, List modifiers, LProtocolHeader header, LProtocolDef def) { super(source, modifiers, header, def); } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDecl.java index 20cbd8695..b172c7892 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDecl.java @@ -21,6 +21,8 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ProtocolDef; import org.scribble.ast.ProtocolHeader; +import org.scribble.ast.ProtocolMod; +import org.scribble.ast.ProtocolModList; import org.scribble.type.kind.Local; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.ModuleName; @@ -44,13 +46,13 @@ protected LProtocolDecl(LProtocolDecl node) @Override public LProtocolHeader getHeaderChild() { - return (LProtocolHeader) getChild(0); + return (LProtocolHeader) getChild(1); } @Override public LProtocolDef getDefChild() { - return (LProtocolDef) getChild(1); + return (LProtocolDef) getChild(2); } // Cf. CommonTree#dupNode @@ -61,10 +63,10 @@ public LProtocolDecl dupNode() } @Override - public LProtocolDecl reconstruct(ProtocolHeader header, - ProtocolDef def) + public LProtocolDecl reconstruct(ProtocolModList mods, + ProtocolHeader header, ProtocolDef def) { - return (LProtocolDecl) super.reconstruct(header, def); + return (LProtocolDecl) super.reconstruct(mods, header, def); } @Override @@ -97,7 +99,8 @@ public Role getSelfRole() - public LProtocolDecl(CommonTree source, List modifiers, LProtocolHeader header, LProtocolDef def) + public LProtocolDecl(CommonTree source, List modifiers, + LProtocolHeader header, LProtocolDef def) { super(source, modifiers, header, def); } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java index e589f17ea..335d932c9 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java @@ -52,7 +52,8 @@ public String[] getElements() protected List getSimpleNameList() { return ((List) getChildren()).stream() - .map(x -> ((CommonTree) x).getText()).collect(Collectors.toList()); + .map(x -> ((CommonTree) x).getText()).collect(Collectors.toList()); + // CHECKME: currently AmbigNameNode(?) // CHECKME: factor out getText? } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java b/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java index 1dd92614b..f574ec023 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java @@ -17,6 +17,7 @@ import java.util.Set; import java.util.stream.Collectors; +import org.scribble.ast.ProtocolModList; import org.scribble.ast.RoleDecl; import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScribNode; @@ -63,7 +64,8 @@ public ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, .RoleDeclList(tmp.getRoleDeclListChild().getSource(), rds); LProtocolHeader hdr = tmp.reconstruct(tmp.getNameNodeChild(), rdl, tmp.getParamDeclListChild()); - LProtocolDecl fixed = lpd.reconstruct(hdr, lpd.getDefChild()); + ProtocolModList mods = lpd.getModifierListChild(); // CHECKME: erase source? + LProtocolDecl fixed = lpd.reconstruct(mods, hdr, lpd.getDefChild()); fixer.job.debugPrintln("\n[DEBUG] Projected " + getSourceProtocol() + " for " + getSelfRole() + ":\n" + fixed); diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index fdb93105e..5ee431acc 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -158,6 +158,7 @@ public void runContextBuildingPasses() throws ScribbleException //LProtocolName lname = e.getKey(); LProtocol proj = e.getValue(); EGraph graph = proj.toEGraph(this); + this.jctxt.addEGraph(proj.fullname, graph); System.out.println("\ngraph:\n" + graph.toDot()); } } diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext.java b/scribble-core/src/main/java/org/scribble/job/JobContext.java index f88753762..77d6b23a0 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/job/JobContext.java @@ -22,6 +22,7 @@ import java.util.stream.Collectors; import org.scribble.ast.Module; +import org.scribble.ast.ProtocolMod; import org.scribble.ast.global.GProtocolDecl; import org.scribble.lang.global.GProtocol; import org.scribble.lang.local.LProtocol; @@ -298,7 +299,7 @@ public SGraph getSGraph(GProtocolName fullname) throws ScribbleException Map egraphs = getEGraphsForSGraphBuilding(fullname, gpd, true); boolean explicit = - gpd.modifiers.contains(GProtocolDecl.Modifiers.EXPLICIT); + gpd.modifiers.contains(ProtocolMod.EXPLICIT); //graph = SGraph.buildSGraph(egraphs, explicit, this.job, fullname); graph = this.job.buildSGraph(fullname, egraphs, explicit); addSGraph(fullname, graph); @@ -332,7 +333,7 @@ public SGraph getUnfairSGraph(GProtocolName fullname) throws ScribbleException GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()) .getProtocolDeclChild(fullname.getSimpleName()); Map egraphs = getEGraphsForSGraphBuilding(fullname, gpd, false); - boolean explicit = gpd.modifiers.contains(GProtocolDecl.Modifiers.EXPLICIT); + boolean explicit = gpd.modifiers.contains(ProtocolMod.EXPLICIT); //graph = SGraph.buildSGraph(this.job, fullname, this.job.createInitialSConfig(job, egraphs, explicit)); graph = this.job.buildSGraph(fullname, egraphs, explicit); addUnfairSGraph(fullname, graph); diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java b/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java index 18d0c6cff..6de55192c 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java @@ -19,6 +19,7 @@ import org.scribble.ast.Choice; import org.scribble.ast.InteractionSeq; import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.ProtocolMod; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GProtocolDecl; import org.scribble.job.Job; @@ -47,7 +48,7 @@ protected WFChoiceEnv makeRootProtocolDeclEnv( { return new WFChoiceEnv(new HashSet<>(pd.getRoles()), !(pd.isGlobal() && ((GProtocolDecl) pd).modifiers - .contains(GProtocolDecl.Modifiers.EXPLICIT))); + .contains(ProtocolMod.EXPLICIT))); // FIXME: consider locals; also, explicit modifier should be carried over to local projections } diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index f91483b07..241a4e068 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -150,28 +150,6 @@ tokens GLOBALRECURSION = 'GLOBALRECURSION'; GLOBALCONTINUE = 'GLOBALCONTINUE'; GLOBALDO = 'GLOBALDO'; - - /*LOCALPROTOCOLDECL = 'local-protocol-decl'; - LOCALROLEDECLLIST = 'local-role-decl-list'; - LOCALROLEDECL = 'local-role-decl'; - SELFDECL = 'self-decl'; - LOCALPROTOCOLDEF = 'local-protocol-def'; - LOCALPROTOCOLINSTANCE = 'local-protocol-instance'; - LOCALPROTOCOLBLOCK = 'local-protocol-block'; - LOCALINTERACTIONSEQUENCE = 'local-interaction-sequence'; - LOCALMESSAGETRANSFER = 'local-message-transfer'; - LOCALCHOICE = 'local-choice'; - LOCALRECURSION = 'local-recursion'; - LOCALCONTINUE = 'local-continue'; - LOCALPARALLEL = 'local-parallel'; - LOCALINTERRUPTIBLE = 'local-interruptible'; - LOCALINTERRUPT = 'local-interrupt'; - LOCALDO = 'local-do'; - LOCALTHROWS = 'local-throws'; - LOCALCATCHES = 'local-catches'; - LOCALSEND = 'local-send'; - LOCALRECEIVE = 'local-receive';*/ - GPROTOCOLNAME = 'GPROTOCOLNAME'; ROLENAME = 'ROLENAME'; @@ -534,8 +512,6 @@ payloadelement: */ protocoldecl: globalprotocoldecl -/*| - localprotocoldecl*/ ; @@ -545,11 +521,11 @@ protocoldecl: globalprotocoldecl: globalprotocolheader globalprotocoldefinition -> - ^(GLOBALPROTOCOLDECL globalprotocolheader globalprotocoldefinition) + ^(GLOBALPROTOCOLDECL ^(GLOBALPROTOCOLDECLMODS) globalprotocolheader globalprotocoldefinition) | - globalprotocoldeclmodifiers globalprotocolheader globalprotocoldefinition // HACK: backwards compat for "implicit" connections + globalprotocoldeclmodifiers globalprotocolheader globalprotocoldefinition -> - ^(GLOBALPROTOCOLDECL globalprotocolheader globalprotocoldefinition globalprotocoldeclmodifiers) + ^(GLOBALPROTOCOLDECL globalprotocoldeclmodifiers globalprotocolheader globalprotocoldefinition) ; globalprotocoldeclmodifiers: @@ -831,190 +807,3 @@ argumentinstantiation: qualifiedname ; - -/* - * Section 3.8 Local Protocol Declarations - * / -localprotocoldecl: - localprotocolheader localprotocoldefinition --> - ^(LOCALPROTOCOLDECL localprotocolheader localprotocoldefinition) -; - -localprotocolheader: - LOCAL_KW PROTOCOL_KW simpleprotocolname localroledecllist --> - //simpleprotocolname EMPTY_PARAMETERDECLLIST localroledecllist - simpleprotocolname ^(PARAMETERDECLLIST) localroledecllist -| - LOCAL_KW PROTOCOL_KW simpleprotocolname parameterdecllist localroledecllist --> - simpleprotocolname parameterdecllist localroledecllist -; - -localroledecllist: - '(' localroledecl (',' localroledecl)* ')' --> - ^(LOCALROLEDECLLIST localroledecl+) -; - -localroledecl: - roledecl -| - SELF_KW rolename --> - ^(SELFDECL rolename) -; - - -/** - * Section 3.8.1 Local Protocol Definitions - * / -localprotocoldefinition: - localprotocolblock --> - ^(LOCALPROTOCOLDEF localprotocolblock) -; - - -/** - * Section 3.8.3 Local Interaction Blocks and Sequences - * / -localprotocolblock: - '{' localinteractionsequence '}' --> - ^(LOCALPROTOCOLBLOCK localinteractionsequence) -; - -localinteractionsequence: - (localinteraction)* --> - ^(LOCALINTERACTIONSEQUENCE localinteraction*) -; - -localinteraction: - localsend -| - localreceive -| - localchoice -| - localparallel -| - localrecursion -| - localcontinue -| - localinterruptible -| - localdo -; - - -/** - * Section 3.8.4 Local Send and Receive - * / -localsend: - message TO_KW rolename (',' rolename)* ';' --> - ^(LOCALSEND message rolename+) -; - -localreceive: - message FROM_KW IDENTIFIER ';' --> - ^(LOCALRECEIVE message IDENTIFIER) -; - - -/** - * Section 3.8.5 Local Choice - * / -localchoice: - CHOICE_KW AT_KW rolename localprotocolblock (OR_KW localprotocolblock)* --> - ^(LOCALCHOICE rolename localprotocolblock+) -; - - -/** - * Section 3.8.6 Local Recursion - * / -localrecursion: - REC_KW recursionvarname localprotocolblock --> - ^(LOCALRECURSION recursionvarname localprotocolblock) -; - -localcontinue: - CONTINUE_KW recursionvarname ';' --> - ^(LOCALCONTINUE recursionvarname) -; - - -/** - * Section 3.8.7 Local Parallel - * / -localparallel: - PAR_KW localprotocolblock (AND_KW localprotocolblock)* --> - ^(LOCALPARALLEL localprotocolblock+) -; - - -/** - * Section 3.8.8 Local Interruptible - * / -localinterruptible: - INTERRUPTIBLE_KW scopename localprotocolblock WITH_KW '{' localcatches* '}' --> - ^(LOCALINTERRUPTIBLE scopename localprotocolblock EMPTY_LOCALTHROW localcatches*) -| - INTERRUPTIBLE_KW scopename localprotocolblock WITH_KW '{' localthrows localcatches* '}' --> - ^(LOCALINTERRUPTIBLE scopename localprotocolblock localthrows localcatches*) -; - -/*localthrowandorcatch: - localthrow (localcatch)* -| - (localcatch)+ -;* / - -localthrows: - THROWS_KW message (',' message)* TO_KW rolename (',' rolename)* ';' --> - ^(LOCALTHROWS rolename+ TO_KW message+) -; - -localcatches: - CATCHES_KW message (',' message)* FROM_KW rolename ';' --> - ^(LOCALCATCHES rolename message+) -; - - -/** - * Section 3.8.9 Local Do - * / -localdo: - DO_KW protocolname roleinstantiationlist ';' --> - //^(LOCALDO NO_SCOPE protocolname EMPTY_ARGUMENTINSTANTIATIONLIST roleinstantiationlist) - ^(LOCALDO NO_SCOPE protocolname ^(ARGUMENTINSTANTIATIONLIST) roleinstantiationlist) -| - DO_KW protocolname argumentinstantiationlist roleinstantiationlist ';' --> - ^(LOCALDO NO_SCOPE protocolname argumentinstantiationlist roleinstantiationlist) -| - DO_KW scopename ':' protocolname roleinstantiationlist ';' --> - //^(LOCALDO scopename protocolname EMPTY_ARGUMENTINSTANTIATIONLIST roleinstantiationlist) - ^(LOCALDO scopename protocolname ^(ARGUMENTINSTANTIATIONLIST) roleinstantiationlist) -| - DO_KW scopename ':' protocolname argumentinstantiationlist roleinstantiationlist ';' --> - ^(LOCALDO scopename protocolname argumentinstantiationlist roleinstantiationlist) -; -*/ diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 5357626c4..81a1043f3 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -8,6 +8,7 @@ import org.scribble.ast.NonRoleArgList; import org.scribble.ast.NonRoleParamDeclList; import org.scribble.ast.PayloadElemList; +import org.scribble.ast.ProtocolModList; import org.scribble.ast.RoleArg; import org.scribble.ast.RoleArgList; import org.scribble.ast.RoleDecl; @@ -80,6 +81,8 @@ public Object create(Token t) case "GLOBALPROTOCOLDECL": //return this.f.GProtocolDecl(empty, Collections.emptyList(), null, null); return new GProtocolDecl(t); + case "GLOBALPROTOCOLDECLMODS": + return new ProtocolModList(t); case "GLOBALPROTOCOLHEADER": //return this.f.GProtocolHeader(empty, null, null, null); return new GProtocolHeader(t); case "GPROTOCOLNAME": diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDecl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDecl.java index 263dd03d3..38990326e 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDecl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDecl.java @@ -19,6 +19,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; +import org.scribble.ast.ProtocolMod; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.global.GProtocolDef; import org.scribble.ast.global.GProtocolHeader; @@ -32,11 +33,13 @@ public class AntlrGProtocolDecl //public static final int EXPLICIT_CONNECTIONS_FLAG_INDEX = 2; public static final int MODIFIERS_CHILD_INDEX = 2; - public static GProtocolDecl parseGPrototocolDecl(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException + public static GProtocolDecl parseGPrototocolDecl(AntlrToScribParser parser, + CommonTree ct, AstFactory af) throws ScribParserException { - GProtocolHeader header = (GProtocolHeader) parser.parse(getHeaderChild(ct), af); + GProtocolHeader header = (GProtocolHeader) + parser.parse(getHeaderChild(ct), af); GProtocolDef def = (GProtocolDef) parser.parse(getBodyChild(ct), af); - List modifiers = new LinkedList<>(); + List modifiers = new LinkedList<>(); /*if (isExplicitConnections(ct)) { modifiers.add(GProtocolDecl.Modifiers.EXPLICIT); @@ -47,8 +50,8 @@ public static GProtocolDecl parseGPrototocolDecl(AntlrToScribParser parser, Comm { switch (mod.getText()) { - case "aux": modifiers.add(GProtocolDecl.Modifiers.AUX); break; - case "explicit": modifiers.add(GProtocolDecl.Modifiers.EXPLICIT); break; + case "aux": modifiers.add(ProtocolMod.AUX); break; + case "explicit": modifiers.add(ProtocolMod.EXPLICIT); break; default: throw new RuntimeException("TODO: " + mod); } } @@ -74,8 +77,9 @@ public static boolean hasModifiersChild(CommonTree ct) public static List getModifierChildren(CommonTree ct) { //return (CommonTree) ct.getChild(MODIFIERS_CHILD_INDEX); - return ((List) ((CommonTree) ct.getChild(MODIFIERS_CHILD_INDEX)).getChildren()).stream() - .map((c) -> (CommonTree) c).collect(Collectors.toList()); + return ((List) ((CommonTree) ct.getChild(MODIFIERS_CHILD_INDEX)) + .getChildren()).stream().map(c -> (CommonTree) c) + .collect(Collectors.toList()); } /*public static boolean isExplicitConnections(CommonTree ct) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 5696010f0..658a23e7b 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -35,9 +35,11 @@ module tmp.Test; global protocol Proto1(role A, role B) { + 0() from A to B; choice at A { 1() from A to B; + do Proto1(A, B); } or { From 4923c7ec75aa931337e39c3c0b6bca5672247213 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 11 Mar 2019 06:29:06 +0000 Subject: [PATCH 108/539] Continued: fixed do-arg substitution bug. --- .../java/org/scribble/main/MainContext.java | 3 - .../java/org/scribble/ast/AstFactoryImpl.java | 2 +- .../org/scribble/ast/name/simple/OpNode.java | 6 +- .../src/main/java/org/scribble/job/Job.java | 78 ++++++++++--------- .../java/org/scribble/job/JobContext.java | 13 ++++ .../java/org/scribble/lang/Substitutions.java | 6 ++ .../java/org/scribble/lang/global/GDo.java | 9 ++- .../org/scribble/lang/local/LProjection.java | 9 ++- .../model/endpoint/actions/EDisconnect.java | 2 +- .../model/endpoint/actions/EWrapClient.java | 2 +- .../model/endpoint/actions/EWrapServer.java | 2 +- .../model/global/actions/SDisconnect.java | 2 +- .../model/global/actions/SWrapClient.java | 2 +- .../model/global/actions/SWrapServer.java | 2 +- .../java/org/scribble/type/SubprotoSig.java | 2 +- .../main/java/org/scribble/type/name/Op.java | 2 +- .../org/scribble/parser/antlr/Scribble.g | 34 -------- .../scribble/ast/name/AntlrSimpleName.java | 2 +- scribble-test/src/test/scrib/tmp/Test.scr | 12 +++ 19 files changed, 94 insertions(+), 96 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/main/MainContext.java b/scribble-cli/src/main/java/org/scribble/main/MainContext.java index 2790938a1..513b63c6d 100644 --- a/scribble-cli/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-cli/src/main/java/org/scribble/main/MainContext.java @@ -105,7 +105,6 @@ public MainContext(boolean debug, ResourceLocator locator, Path mainpath, // TODO: hardcoded to DirectoryResourceLocator -- main module loading should be factored out to front end (e.g. CommandLine) CommonTree atree = this.antlrParser.parseAntlrTree(res); - System.out.println("bbb: " + atree.getClass() + " ,, " + atree.getChildren()); // FIXME HERE: deprecate scribParser -- move ANTLR error checking out Module mod = (Module) atree;//this.scribParser.parse(atree, this.af); // TODO: rename exceptions @@ -115,8 +114,6 @@ public MainContext(boolean debug, ResourceLocator locator, Path mainpath, new DelDecoratorImpl().decorate(mod); - System.out.println("bbb2: " + mod); - //HERE: debug context building or name disamb (role node child lost) checkMainModuleName(mainpath, mod, noValidation); diff --git a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java index 548192efa..03f008006 100644 --- a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -148,7 +148,7 @@ protected MessageSigNode UnitMessageSigNode() { UNIT_MESSAGE_SIG_NODE = MessageSigNode(null, (OpNode) SimpleNameNode(null, OpKind.KIND, - Op.EMPTY_OPERATOR.toString()), + Op.EMPTY_OP.toString()), PayloadElemList(null, Collections.emptyList())); // Payload.EMPTY_PAYLOAD? } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java index 6ce44425f..bfa58230e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java @@ -21,7 +21,7 @@ public class OpNode extends SimpleNameNode { - public static final String EMPTY_OPERATOR_IDENTIFIER = ""; + public static final String EMPTY_OP_IDENTIFIER = "EMPTY_OPERATOR"; // ScribTreeAdaptor#create constructor public OpNode(Token t) @@ -45,9 +45,9 @@ public OpNode dupNode() public Op toName() { String id = getIdentifier(); - if (id.equals(EMPTY_OPERATOR_IDENTIFIER)) + if (id.equals(EMPTY_OP_IDENTIFIER)) { - return Op.EMPTY_OPERATOR; + return Op.EMPTY_OP; } return new Op(id); } diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 5ee431acc..3fbccd7d9 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -112,61 +112,63 @@ public void runContextBuildingPasses() throws ScribbleException /*runVisitorPassOnAllModules(ProtocolDeclContextBuilder.class); //..which this pass depends on. This pass basically builds protocol dependency info runVisitorPassOnAllModules(DelegationProtocolRefChecker.class); // Must come after ProtocolDeclContextBuilder runVisitorPassOnAllModules(RoleCollector.class); // Actually, this is the second part of protocoldecl context building*/ - - System.out.println("\nfff1: " + this.jctxt.getMainModule()); - //runVisitorPassOnAllModules(ProtocolDefInliner.class); // FIXME TODO: refactor into a runVisitorPassOnAllModules for SimpleVisitor (and add operation to ModuleDel) - for (ModuleName fullname : this.jctxt.getFullModuleNames()) + Set fullmodnames = this.jctxt.getFullModuleNames(); + for (ModuleName fullmodname : fullmodnames) { - Module mod = this.jctxt.getModule(fullname); - GTypeTranslator t = new GTypeTranslator(this, fullname); + Module mod = this.jctxt.getModule(fullmodname); + GTypeTranslator t = new GTypeTranslator(this, fullmodname); for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) { GProtocol g = (GProtocol) gpd.visitWith(t); this.jctxt.addIntermediate(g.fullname, g); - System.out.println("\nparsed:\n" + gpd + "\nintermed:\n" + g); + System.out.println("\nparsed:\n" + gpd + "\n\nintermed:\n" + g); + } + } - SubprotoSig sig = new SubprotoSig(g.fullname, g.roles, - Collections.emptyList()); // FIXME - //Deque stack = new LinkedList<>(); - STypeInliner i = new STypeInliner(this); - i.pushSig(sig); // TODO: factor into constructor - GProtocol inlined = g.getInlined(i); - System.out.println("\ninlined:\n" + inlined); - this.jctxt.addInlined(g.fullname, inlined); + for (GProtocol g : this.jctxt.getIntermediates()) + { + SubprotoSig sig = new SubprotoSig(g.fullname, g.roles, + Collections.emptyList()); // FIXME + //Deque stack = new LinkedList<>(); + STypeInliner i = new STypeInliner(this); + i.pushSig(sig); // TODO: factor into constructor + GProtocol inlined = g.getInlined(i); + System.out.println("\ninlined:\n" + inlined); + this.jctxt.addInlined(g.fullname, inlined); + } + //runUnfoldingPass(); + for (GProtocol inlined : this.jctxt.getInlined()) + { STypeUnfolder u1 = new STypeUnfolder<>(); //GTypeUnfolder u2 = new GTypeUnfolder(); GType unf = (GType) inlined.unfoldAllOnce(u1);//.unfoldAllOnce(u2); CHECKME: twice unfolding? instead of "unguarded"-unfolding? System.out.println("\nunfolded:\n" + unf); + } - for (Role self : g.roles) - { - LProtocol proj = inlined.project(self); - this.jctxt.addProjected(proj.fullname, proj); - System.out.println("\nprojected onto " + self + ":\n" + proj); - - Set roles = proj.def.getRoles(); - System.out.println("\nRoles " + roles); - } - - for (Entry e : - this.jctxt.getProjections().entrySet()) - { - //LProtocolName lname = e.getKey(); - LProtocol proj = e.getValue(); - EGraph graph = proj.toEGraph(this); - this.jctxt.addEGraph(proj.fullname, graph); - System.out.println("\ngraph:\n" + graph.toDot()); - } + for (GProtocol g : this.jctxt.getIntermediates()) + { + for (Role self : g.roles) + { + GProtocol inlined = this.jctxt.getInlined(g.fullname); + LProtocol proj = inlined.project(self); + this.jctxt.addProjected(proj.fullname, proj); + System.out.println("\nprojected onto " + self + ":\n" + proj); } } - - System.out.println("\nfff2: " + this.jctxt.getMainModule()); - - //runUnfoldingPass(); + + for (Entry e : + this.jctxt.getProjections().entrySet()) + { + //LProtocolName lname = e.getKey(); + LProtocol proj = e.getValue(); + EGraph graph = proj.toEGraph(this); + this.jctxt.addEGraph(proj.fullname, graph); + System.out.println("\ngraph for " + proj.fullname + ":\n" + graph.toDot()); + } } // "Second part" of context building (separated for extensions to work on non-unfolded protos -- e.g., Assrt/F17CommandLine) diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext.java b/scribble-core/src/main/java/org/scribble/job/JobContext.java index 77d6b23a0..b0fb7c736 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/job/JobContext.java @@ -14,6 +14,7 @@ package org.scribble.job; import java.io.File; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -165,6 +166,13 @@ public GProtocol getIntermediate(GProtocolName fullname) { return this.intermed.get(fullname); } + + //public Map getIntermediates() + public Collection getIntermediates() + { + //return Collections.unmodifiableMap(this.intermed); + return Collections.unmodifiableCollection(this.intermed.values()); + } public void addInlined(GProtocolName fullname, GProtocol g) { @@ -175,6 +183,11 @@ public GProtocol getInlined(GProtocolName fullname) { return this.inlined.get(fullname); } + + public Collection getInlined() + { + return Collections.unmodifiableCollection(this.inlined.values()); + } public void addProjected(LProtocolName fullname, LProtocol l) { diff --git a/scribble-core/src/main/java/org/scribble/lang/Substitutions.java b/scribble-core/src/main/java/org/scribble/lang/Substitutions.java index 0da9757e4..b5ce86c37 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Substitutions.java +++ b/scribble-core/src/main/java/org/scribble/lang/Substitutions.java @@ -36,6 +36,12 @@ public N apply(N old) return this.subs.get(old); } + @Override + public String toString() + { + return this.subs.toString(); + } + @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index 0028c44d0..72b3c474d 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -37,8 +37,6 @@ public GDo substitute(Substitutions subs) @Override public GType getInlined(STypeInliner i)//, Deque stack) { - Substitutions subs = - new Substitutions<>(this.roles, i.peek().roles); // FIXME: args GProtocolName fullname = this.proto; SubprotoSig sig = new SubprotoSig(fullname, this.roles, Collections.emptyList()); // FIXME @@ -48,8 +46,11 @@ public GType getInlined(STypeInliner i)//, Deque stack) return new GContinue(getSource(), rv); } i.pushSig(sig); - GSeq inlined = i.job.getJobContext().getIntermediate(fullname).def.substitute(subs) - .getInlined(i);//, stack); // i.e. returning a GSeq -- rely on parent GSeq to inline + GProtocol g = i.job.getJobContext().getIntermediate(fullname); + Substitutions subs = + new Substitutions<>(g.roles, i.peek().roles); // FIXME: args + GSeq inlined = g.def.substitute(subs).getInlined(i);//, stack); + // i.e. returning a GSeq -- rely on parent GSeq to inline i.popSig(); return inlined; } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java index f148c85e1..b5aac8473 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java @@ -68,10 +68,11 @@ public LProtocolDecl getSource() @Override public String toString() { - return "local protocol " + this.fullname + " projects " + this.parent - + "@" + this.self + "(" + this.roles.stream().map(x -> x.toString()) - .collect(Collectors.joining(", ")) - + ")" + " {\n" + this.def + "\n}"; + return "local protocol " + this.fullname + + "(" + this.roles.stream().map(x -> x.toString()) + .collect(Collectors.joining(", ")) + ")" + + " projects " + this.parent + + "@" + this.self + " {\n" + this.def + "\n}"; } @Override diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EDisconnect.java b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EDisconnect.java index 684129510..19f219f78 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EDisconnect.java @@ -24,7 +24,7 @@ public class EDisconnect extends EAction { public EDisconnect(EModelFactory ef, Role peer) { - super(ef, peer, Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD); // Must correspond with GDisconnect.UNIT_MESSAGE_SIG_NODE + super(ef, peer, Op.EMPTY_OP, Payload.EMPTY_PAYLOAD); // Must correspond with GDisconnect.UNIT_MESSAGE_SIG_NODE } @Override diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapClient.java b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapClient.java index 558784b38..0566d618f 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapClient.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapClient.java @@ -25,7 +25,7 @@ public class EWrapClient extends EAction { public EWrapClient(EModelFactory ef, Role peer) { - super(ef, peer, Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD); // Must correspond with GWrap.UNIT_MESSAGE_SIG_NODE + super(ef, peer, Op.EMPTY_OP, Payload.EMPTY_PAYLOAD); // Must correspond with GWrap.UNIT_MESSAGE_SIG_NODE } @Override diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapServer.java b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapServer.java index a45cb32c7..e99f3fff7 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapServer.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapServer.java @@ -25,7 +25,7 @@ public class EWrapServer extends EAction { public EWrapServer(EModelFactory ef, Role peer) { - super(ef, peer, Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD); // Must correspond with GWrap.UNIT_MESSAGE_SIG_NODE + super(ef, peer, Op.EMPTY_OP, Payload.EMPTY_PAYLOAD); // Must correspond with GWrap.UNIT_MESSAGE_SIG_NODE } @Override diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SDisconnect.java b/scribble-core/src/main/java/org/scribble/model/global/actions/SDisconnect.java index b7cdd3446..d4d3a596a 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/model/global/actions/SDisconnect.java @@ -21,7 +21,7 @@ public class SDisconnect extends SAction { public SDisconnect(Role subj, Role obj) { - super(subj, obj, Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD); + super(subj, obj, Op.EMPTY_OP, Payload.EMPTY_PAYLOAD); } @Override diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapClient.java b/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapClient.java index 48f004961..c0540d3fe 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapClient.java +++ b/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapClient.java @@ -21,7 +21,7 @@ public class SWrapClient extends SAction { public SWrapClient(Role subj, Role obj) { - super(subj, obj, Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD); + super(subj, obj, Op.EMPTY_OP, Payload.EMPTY_PAYLOAD); } @Override diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapServer.java b/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapServer.java index 2793b0bf9..448fdb2cd 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapServer.java +++ b/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapServer.java @@ -21,7 +21,7 @@ public class SWrapServer extends SAction { public SWrapServer(Role subj, Role obj) { - super(subj, obj, Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD); + super(subj, obj, Op.EMPTY_OP, Payload.EMPTY_PAYLOAD); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/SubprotoSig.java b/scribble-core/src/main/java/org/scribble/type/SubprotoSig.java index 7544852a7..30854536b 100644 --- a/scribble-core/src/main/java/org/scribble/type/SubprotoSig.java +++ b/scribble-core/src/main/java/org/scribble/type/SubprotoSig.java @@ -69,8 +69,8 @@ public boolean equals(Object o) @Override public String toString() { - String args = this.args.toString(); String roles = this.roles.toString(); + String args = this.args.toString(); return // this.scope + ":" + this.fullname + "<" + args.substring(1, args.length() - 1) + ">(" + roles.substring(1, roles.length() - 1) + ")"; diff --git a/scribble-core/src/main/java/org/scribble/type/name/Op.java b/scribble-core/src/main/java/org/scribble/type/name/Op.java index 56720b373..2f4292134 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/Op.java +++ b/scribble-core/src/main/java/org/scribble/type/name/Op.java @@ -19,7 +19,7 @@ public class Op extends AbstractName implements MessageId { private static final long serialVersionUID = 1L; - public static final Op EMPTY_OPERATOR = new Op(); + public static final Op EMPTY_OP = new Op(); protected Op() { diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 241a4e068..937f1fe6f 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -86,15 +86,11 @@ tokens // "Node type" constants -- but not parsed "directly" by AntlrToScribParser EMPTY_ALIAS = 'EMTPY_ALIAS'; - /*EMPTY_SCOPENAME = '__empty_scopename'; - NO_SCOPE = '__no_scope';*/ //EMPTY_PACKAGENAME = '__empty_packagebame'; EMPTY_OPERATOR = 'EMPTY_OPERATOR'; //EMPTY_PARAMETERDECLLIST = '__empty_parameterdecllist'; //EMPTY_ARGUMENTINSTANTIATIONLIST = '__empty_argumentinstantiationlist'; - /*EMPTY_LOCALTHROW = '__empty_localthrow'; - EMPTY_LOCAL_CATCHES = '__empty_local_catch';*/ //NAME = 'name'; AMBIGUOUSNAME = 'AMBIGUOUSNAME'; @@ -735,36 +731,6 @@ globalcontinue: ; -/* - * Section 3.7.7 Global Parallel - * / -globalparallel: - PAR_KW globalprotocolblock (AND_KW globalprotocolblock)* --> - ^(GLOBALPARALLEL globalprotocolblock+) -;*/ - - -/* - * Section 3.7.8 Global Interruptible - * / -globalinterruptible: - INTERRUPTIBLE_KW globalprotocolblock WITH_KW '{' globalinterrupt* '}' --> - ^(GLOBALINTERRUPTIBLE EMPTY_SCOPENAME globalprotocolblock globalinterrupt*) -| - INTERRUPTIBLE_KW scopename globalprotocolblock WITH_KW '{' (globalinterrupt)* '}' --> - ^(GLOBALINTERRUPTIBLE scopename globalprotocolblock globalinterrupt*) -; - -globalinterrupt: - message (',' message)* BY_KW rolename ';' --> - ^(GLOBALINTERRUPT rolename message+) -;*/ - - /** * Section 3.7.9 Global Do */ diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java index 91460204f..722706f06 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java @@ -76,7 +76,7 @@ public static OpNode toOpNode(CommonTree ct, AstFactory af) { String op = getName(ct); return op.equals(ScribbleAntlrConstants.ANTLR_EMPTY_OPERATOR) - ? (OpNode) af.SimpleNameNode(ct, OpKind.KIND, OpNode.EMPTY_OPERATOR_IDENTIFIER) + ? (OpNode) af.SimpleNameNode(ct, OpKind.KIND, OpNode.EMPTY_OP_IDENTIFIER) : (OpNode) af.SimpleNameNode(ct, OpKind.KIND, getName(ct)); } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 658a23e7b..656b237a4 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -33,6 +33,17 @@ module tmp.Test; // TODO: port forwarding version of P2 -- funny case of "session" persisting over full disconnect, should/how to correlate? +global protocol Proto1(role A, role B) +{ + do Proto1Aux(A, B); +} + +global protocol Proto1Aux(role AA, role BB) +{ + () from AA to BB; +} + +/* global protocol Proto1(role A, role B) { 0() from A to B; @@ -48,6 +59,7 @@ global protocol Proto1(role A, role B) } 4() from A to B; } +//*/ /* From 627c85d22e59d025cc7797013bb061df78989174 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 11 Mar 2019 12:56:31 +0000 Subject: [PATCH 109/539] Continued. --- .../src/main/java/org/scribble/job/Job.java | 14 ++++ .../src/main/java/org/scribble/lang/Do.java | 17 +++-- .../main/java/org/scribble/lang/Protocol.java | 6 ++ .../main/java/org/scribble/lang/SType.java | 7 +- .../org/scribble/lang/global/GChoice.java | 64 +++++++++++++++++++ .../org/scribble/lang/global/GContinue.java | 19 +++++- .../java/org/scribble/lang/global/GDo.java | 16 +++++ .../lang/global/GMessageTransfer.java | 37 ++++++++++- .../org/scribble/lang/global/GProtocol.java | 31 +++++++++ .../org/scribble/lang/global/GRecursion.java | 17 +++++ .../java/org/scribble/lang/global/GSeq.java | 26 +++++++- .../java/org/scribble/lang/global/GType.java | 23 +++++-- .../org/scribble/lang/local/LProjection.java | 3 +- .../java/org/scribble/lang/local/LSkip.java | 14 ++++ .../java/org/scribble/lang/local/LType.java | 6 +- scribble-test/src/test/scrib/tmp/Test.scr | 25 ++++++++ 16 files changed, 301 insertions(+), 24 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 3fbccd7d9..1334c6f15 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -191,6 +191,20 @@ public void runWellFormednessPasses() throws ScribbleException }*/ //HERE WF (unfolding? unguarded-unfolder -- and lazy-unfolder-with-choice-pruning, e.g., bad.wfchoice.enabling.threeparty.Test02), projection, validation + + for (GProtocol inlined : this.jctxt.getInlined()) + { + Set unused = inlined.roles.stream() + .filter(x -> !inlined.def.getRoles().contains(x)) + .collect(Collectors.toSet()); + if (!unused.isEmpty()) + { + throw new ScribbleException( + "Unused roles in " + inlined.fullname + ": " + unused); + } + inlined.checkRoleEnabling(); + inlined.checkExtChoiceConsistency(); + } } // Due to Projector not being a subprotocol visitor, so "external" subprotocols may not be visible in ModuleContext building for the projections of the current root Module diff --git a/scribble-core/src/main/java/org/scribble/lang/Do.java b/scribble-core/src/main/java/org/scribble/lang/Do.java index 58b2d2e99..1759b105d 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Do.java +++ b/scribble-core/src/main/java/org/scribble/lang/Do.java @@ -2,6 +2,7 @@ import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import org.scribble.type.kind.ProtocolKind; @@ -25,12 +26,12 @@ public Do(org.scribble.ast.Do source, N proto, public abstract Do reconstruct(org.scribble.ast.Do source, N proto, List roles); - - /*@Override - public List getRoles() + + @Override + public Set getRoles() { - return this.roles; // Depends: maybe need to do actual subproto visiting, e.g., for projection - }*/ + throw new RuntimeException("Unsupported for Do: " + this); + } @Override public Do substitute(Substitutions subs) @@ -39,6 +40,12 @@ public Do substitute(Substitutions subs) .collect(Collectors.toList()); return reconstruct((org.scribble.ast.Do) getSource(), this.proto, roles); } + + @Override + public SType unfoldAllOnce(STypeUnfolder u) + { + throw new RuntimeException("Unsupported for Do: " + this); + } @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index a35023e26..ee3ca93af 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -2,6 +2,7 @@ import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import org.scribble.ast.ProtocolDecl; @@ -30,6 +31,11 @@ public Protocol(ProtocolDecl source, N fullname, public abstract Protocol reconstruct(ProtocolDecl source, N fullname, List roles, B def); + public Set getRoles() + { + throw new RuntimeException("Unsupported for Protocol: " + this); + } + @Override public ProtocolDecl getSource() { diff --git a/scribble-core/src/main/java/org/scribble/lang/SType.java b/scribble-core/src/main/java/org/scribble/lang/SType.java index 3a9579118..9d00b2056 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SType.java +++ b/scribble-core/src/main/java/org/scribble/lang/SType.java @@ -13,10 +13,8 @@ public interface SType boolean hasSource(); // i.e., was parsed ProtocolKindNode getSource(); // Pre: hasSource - default Set getRoles() - { - throw new RuntimeException("Unsupported for: " + this); - } + // Unsupported for Protocol/Do + Set getRoles(); SType substitute(Substitutions role); @@ -30,6 +28,7 @@ default Set getRoles() //SessType getInlined(GTypeTranslator t, Deque stack); // FIXME: generalise for locals SType getInlined(STypeInliner i); + // Unsupported for Do // FIXME: repeat recvar names, including non-shadowing (e.g., choice cases) SType unfoldAllOnce(STypeUnfolder u); diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java index 3fdaaa4fe..bec0e8d47 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -1,8 +1,17 @@ package org.scribble.lang.global; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.scribble.job.ScribbleException; import org.scribble.lang.Choice; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -69,6 +78,61 @@ public LType project(Role self) return new LChoice(null, subj, blocks); } + @Override + public Set checkRoleEnabling(Set enabled) throws ScribbleException + { + if (!enabled.contains(this.subj)) + { + throw new ScribbleException("Subject not enabled: " + this.subj); + } + Set subj = Stream.of(this.subj).collect(Collectors.toSet()); + List> blocks = new LinkedList<>(); + for (GSeq block : this.blocks) + { + blocks.add(block.checkRoleEnabling(subj)); + } + Set res = new HashSet<>(enabled); + Set tmp = blocks.stream().flatMap(x -> x.stream()) + .filter(x -> blocks.stream().allMatch(y -> y.contains(x))) + .collect(Collectors.toSet()); + res.addAll(tmp); + return Collections.unmodifiableSet(res); + } + + @Override + public Map checkExtChoiceConsistency(Map enablers) + throws ScribbleException + { + Map subj = Stream.of(this.subj) + .collect(Collectors.toMap(x -> x, x -> x)); + List> blocks = new LinkedList<>(); + for (GSeq block : this.blocks) + { + blocks.add(block.checkExtChoiceConsistency(subj)); + } + Map res = new HashMap<>(enablers); + Set> tmp = blocks.stream() + .flatMap(x -> x.entrySet().stream()).collect(Collectors.toSet()); + for (Entry e : tmp) + { + Role enabled = e.getKey(); + Role enabler = e.getValue(); + if (tmp.stream().anyMatch( + x -> x.getKey().equals(enabled) && !x.getValue().equals(enabler))) + { + throw new ScribbleException( + "Inconsistent external choice subjects for " + enabled + ": " + + tmp.stream().filter(x -> x.getKey().equals(enabled)) + .collect(Collectors.toList())); + } + if (!res.containsKey(enabled)) + { + res.put(enabled, enabler); + } + } + return Collections.unmodifiableMap(res); + } + @Override public org.scribble.ast.global.GChoice getSource() { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java index 39d1f96d2..690e9a15b 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java @@ -1,11 +1,15 @@ package org.scribble.lang.global; +import java.util.Map; +import java.util.Set; + import org.scribble.ast.ProtocolKindNode; -import org.scribble.lang.local.LContinue; +import org.scribble.job.ScribbleException; import org.scribble.lang.Continue; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.LContinue; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -52,6 +56,19 @@ public LContinue project(Role self) { return new LContinue(null, this.recvar); } + + @Override + public Set checkRoleEnabling(Set enabled) throws ScribbleException + { + return enabled; + } + + @Override + public Map checkExtChoiceConsistency(Map enablers) + throws ScribbleException + { + return enablers; + } @Override public int hashCode() diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index 72b3c474d..bd4ee4bec 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -2,7 +2,10 @@ import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.Set; +import org.scribble.job.ScribbleException; import org.scribble.lang.Do; import org.scribble.lang.STypeInliner; import org.scribble.lang.Substitutions; @@ -62,6 +65,19 @@ public LType project(Role self) throw new RuntimeException("TODO: " + this); } + @Override + public Set checkRoleEnabling(Set enabled) throws ScribbleException + { + throw new RuntimeException("Unsupported for Do: " + this); + } + + @Override + public Map checkExtChoiceConsistency(Map enablers) + throws ScribbleException + { + throw new RuntimeException("Unsupported for Do: " + this); + } + @Override public org.scribble.ast.global.GDo getSource() { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java index 6bfd890e8..00ece037e 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java @@ -1,5 +1,12 @@ package org.scribble.lang.global; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.scribble.job.ScribbleException; import org.scribble.lang.MessageTransfer; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -69,6 +76,35 @@ else if (this.dst.equals(self)) } } + @Override + public Set checkRoleEnabling(Set enabled) throws ScribbleException + { + if (!enabled.contains(this.src)) + { + throw new ScribbleException("Source role not enabled: " + this.src); + } + if (enabled.contains(this.dst)) + { + return enabled; + } + Set tmp = new HashSet<>(enabled); + tmp.add(this.dst); + return Collections.unmodifiableSet(tmp); + } + + @Override + public Map checkExtChoiceConsistency(Map enablers) + throws ScribbleException + { + if (enablers.containsKey(this.dst)) + { + return enablers; + } + Map tmp = new HashMap<>(enablers); + tmp.put(this.dst, this.src); + return Collections.unmodifiableMap(tmp); + } + @Override public int hashCode() { @@ -96,5 +132,4 @@ public boolean canEquals(Object o) { return o instanceof GMessageTransfer; } - } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index fc70af514..0e0f4865c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -1,12 +1,15 @@ package org.scribble.lang.global; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.global.GProtocolDecl; +import org.scribble.job.ScribbleException; import org.scribble.lang.Protocol; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -81,6 +84,34 @@ public LProjection project(Role self) .collect(Collectors.toList()); return new LProjection(this.fullname, self, fullname, roles, body); } + + @Override + public Set checkRoleEnabling(Set enabled) throws ScribbleException + { + throw new RuntimeException("Unsupported for Protocol: " + this); + } + + // CHECKME: refactor Protocol out of SType? Also Do -- but harder because Do needs to be in Seq + public Set checkRoleEnabling() throws ScribbleException + { + Set tmp = //Collections.unmodifiableSet( + new HashSet<>(this.roles); + return this.def.checkRoleEnabling(tmp); + } + + @Override + public Map checkExtChoiceConsistency(Map enablers) + throws ScribbleException + { + throw new RuntimeException("Unsupported for Protocol: " + this); + } + + public Map checkExtChoiceConsistency() throws ScribbleException + { + Map tmp = this.roles.stream() + .collect(Collectors.toMap(x -> x, x -> x)); + return this.def.checkExtChoiceConsistency(tmp); + } @Override public GProtocolDecl getSource() diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java index 2edba7333..63fc82116 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java @@ -1,6 +1,10 @@ package org.scribble.lang.global; +import java.util.Map; +import java.util.Set; + import org.scribble.ast.ProtocolKindNode; +import org.scribble.job.ScribbleException; import org.scribble.lang.Recursion; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -69,6 +73,19 @@ public LType project(Role self) return new LRecursion(null, this.recvar, body); } + @Override + public Set checkRoleEnabling(Set enabled) throws ScribbleException + { + return this.body.checkRoleEnabling(enabled); + } + + @Override + public Map checkExtChoiceConsistency(Map enablers) + throws ScribbleException + { + return this.body.checkExtChoiceConsistency(enablers); + } + @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java index 923b0bb6f..793e76154 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -2,10 +2,13 @@ import java.util.LinkedList; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import org.scribble.ast.InteractionSeq; import org.scribble.ast.global.GInteractionSeq; +import org.scribble.job.ScribbleException; import org.scribble.lang.SType; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -93,7 +96,28 @@ public LSeq project(Role self) } @Override - public List> getElements() + public Set checkRoleEnabling(Set enabled) throws ScribbleException + { + for (GType elem : getElements()) + { + enabled = elem.checkRoleEnabling(enabled); + } + return enabled; + } + + @Override + public Map checkExtChoiceConsistency(Map enablers) + throws ScribbleException + { + for (GType elem : getElements()) + { + enablers = elem.checkExtChoiceConsistency(enablers); + } + return enablers; + } + + @Override + public List getElements() { return this.elems.stream().map(x -> (GType) x).collect(Collectors.toList()); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GType.java b/scribble-core/src/main/java/org/scribble/lang/global/GType.java index 3824b55d0..8c60cc558 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GType.java @@ -1,5 +1,9 @@ package org.scribble.lang.global; +import java.util.Map; +import java.util.Set; + +import org.scribble.job.ScribbleException; import org.scribble.lang.SType; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -17,11 +21,20 @@ public interface GType extends SType GType getInlined(STypeInliner i);//, Deque stack); @Override - default SType unfoldAllOnce( - STypeUnfolder u) - { - throw new RuntimeException("Not supported for: " + this); - } + SType unfoldAllOnce(STypeUnfolder u); // Not GType return, o/w need to override again in GDo LType project(Role self); + + // Pre: use on inlined or later (unsupported for Do, also Protocol) + // enabled treated immutably + // Returns enabled post visiting + Set checkRoleEnabling(Set enabled) throws ScribbleException; + + // Pre: use on inlined or later (unsupported for Do, also Protocol) + // Pre: checkRoleEnabling + // enablers: enabled -> enabler -- treated immutably + // Returns enablers post visiting + Map checkExtChoiceConsistency(Map enablers) + throws ScribbleException; } + diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java index b5aac8473..e4a3ed1b9 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java @@ -14,8 +14,7 @@ import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; -public class LProjection extends - LProtocol +public class LProjection extends LProtocol { public final GProtocolName parent; public final Role self; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java index afaa4d455..f2bc90941 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java @@ -1,7 +1,10 @@ package org.scribble.lang.local; +import java.util.Set; + import org.scribble.lang.STypeBase; import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; @@ -16,6 +19,11 @@ private LSkip() { super(null); } + + public Set getRoles() + { + throw new RuntimeException("Unsupported for Skip: " + this); + } @Override public LSkip substitute(Substitutions subs) @@ -29,6 +37,12 @@ public LSkip getInlined(STypeInliner i) return this; } + @Override + public LType unfoldAllOnce(STypeUnfolder u) + { + throw new RuntimeException("Unsupported for Skip: " + this); + } + @Override public org.scribble.ast.local.LNode getSource() { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LType.java b/scribble-core/src/main/java/org/scribble/lang/local/LType.java index 712e9c732..ccf0a3efd 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LType.java @@ -18,11 +18,7 @@ public interface LType extends SType LType getInlined(STypeInliner i);//, Deque stack); @Override - default SType unfoldAllOnce( - STypeUnfolder u) - { - throw new RuntimeException("Not supported for: " + this); - } + SType unfoldAllOnce(STypeUnfolder u); // Uses b to builds graph "progressively" (working graph is mutable) // Use EGraphBuilderUtil2::finalise for final result diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 656b237a4..fa0f58ef2 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -33,6 +33,29 @@ module tmp.Test; // TODO: port forwarding version of P2 -- funny case of "session" persisting over full disconnect, should/how to correlate? +//* +global protocol Proto1(role A, role B, role C) +{ + + FIXME B unused + + choice at A + { + //1() from A to B; + 1() from A to C; + } + or + { + //2() from C to A; + //2() from A to B; + 2() from A to C; + //2() from B to C; + } +} +//*/ + + +/* global protocol Proto1(role A, role B) { do Proto1Aux(A, B); @@ -42,6 +65,8 @@ global protocol Proto1Aux(role AA, role BB) { () from AA to BB; } +//*/ + /* global protocol Proto1(role A, role B) From 4a54cead61e32d15fb60ab0765b6cf6a83653cee Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 12 Mar 2019 05:04:42 +0000 Subject: [PATCH 110/539] Continued: added top-level empty protocol special case to graph building. --- .../src/main/java/org/scribble/job/Job.java | 6 +++++- .../java/org/scribble/lang/local/LProtocol.java | 6 ++++++ .../main/java/org/scribble/lang/local/LSeq.java | 3 +-- .../org/scribble/model/GraphBuilderUtil.java | 1 + .../model/endpoint/EGraphBuilderUtil2.java | 16 +++++++++------- scribble-test/src/test/scrib/tmp/Test.scr | 3 --- 6 files changed, 22 insertions(+), 13 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 1334c6f15..80ca5e759 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -194,14 +194,18 @@ public void runWellFormednessPasses() throws ScribbleException for (GProtocol inlined : this.jctxt.getInlined()) { + /* TODO: relegate to "warning" + // Check unused roles + Set used = inlined.def.getRoles(); Set unused = inlined.roles.stream() - .filter(x -> !inlined.def.getRoles().contains(x)) + .filter(x -> !used.contains(x)) .collect(Collectors.toSet()); if (!unused.isEmpty()) { throw new ScribbleException( "Unused roles in " + inlined.fullname + ": " + unused); } + */ inlined.checkRoleEnabling(); inlined.checkExtChoiceConsistency(); } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index 9f8af1a2c..398c1aed0 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -13,6 +13,7 @@ import org.scribble.lang.Substitutions; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EGraphBuilderUtil2; +import org.scribble.model.endpoint.EState; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Local; import org.scribble.type.name.LProtocolName; @@ -70,6 +71,11 @@ public EGraph toEGraph(Job job) { EGraphBuilderUtil2 b = new EGraphBuilderUtil2(job.config.ef); b.init(job.config.ef.newEState(Collections.emptySet())); + if (this.def.isEmpty()) // Empty Seq special case for top-level -- in general, Seq must be non-empty, cf. LSeq::buildGraph entry/exit + { + EState s = b.getEntry(); + return new EGraph(s, s); + } this.def.buildGraph(b); EGraph g = b.finalise(); return g; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java index 56982fc95..65f1f92fa 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java @@ -18,8 +18,7 @@ import org.scribble.type.kind.Local; import org.scribble.type.name.Role; -public class LSeq extends Seq - implements LType +public class LSeq extends Seq implements LType { // GInteractionSeq or GBlock better as source? public LSeq(InteractionSeq source, List> elems) diff --git a/scribble-core/src/main/java/org/scribble/model/GraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/model/GraphBuilderUtil.java index d372357ec..29ec4ff99 100644 --- a/scribble-core/src/main/java/org/scribble/model/GraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/model/GraphBuilderUtil.java @@ -17,6 +17,7 @@ import org.scribble.type.kind.ProtocolKind; // Helper class for EndpointGraphBuilder -- can access the protected setters of S +// N.B. must call init before every "new visit", including first public abstract class GraphBuilderUtil , // Action type: labels on edges diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java index cb5368e63..c87ee7dd1 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java @@ -30,6 +30,7 @@ import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; +// FIXME TODO replace EGraphBuilderUtil // Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) // Tailored to support graph building from syntactic local protocol choice and recursion public class EGraphBuilderUtil2 @@ -68,6 +69,7 @@ public EGraphBuilderUtil2(EGraphBuilderUtil2 b) } // N.B. must be called before every "new visit", including first + // FIXME: now cannot be reused for different protos, because of recvars and clear/reset @Override public void init(EState init) { @@ -379,24 +381,24 @@ public EGraph finalise() { /*EState res = new EState(this.entry.getLabels()); EState resTerm = new EState(this.exit.getLabels());*/ - EState res = this.entry.cloneNode(this.ef, this.entry.getLabels()); //this.ef.newEState(this.entry.getLabels()); - EState resTerm = this.exit.cloneNode(this.ef, this.exit.getLabels()); //this.ef.newEState(this.exit.getLabels()); + EState entry = this.entry.cloneNode(this.ef, this.entry.getLabels()); //this.ef.newEState(this.entry.getLabels()); + EState exit = this.exit.cloneNode(this.ef, this.exit.getLabels()); //this.ef.newEState(this.exit.getLabels()); Map map = new HashMap<>(); - map.put(this.entry, res); - map.put(this.exit, resTerm); + map.put(this.entry, entry); + map.put(this.exit, exit); Set seen = new HashSet<>(); - fixContinueEdges(seen, map, this.entry, res); + fixContinueEdges(seen, map, this.entry, entry); if (!seen.contains(this.exit)) { - resTerm = null; + exit = null; } /*Map all = getAllStates(res); EndpointState dfa = determinise(all, res, resTerm); System.out.println("111: " + dfa.toDot());*/ - return new EGraph(res, resTerm); + return new EGraph(entry, exit); } // FIXME: incomplete -- won't fully correctly handle situations involving, e.g., transitive continue-edge fixing? diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index fa0f58ef2..5f5b765de 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -36,9 +36,6 @@ module tmp.Test; //* global protocol Proto1(role A, role B, role C) { - - FIXME B unused - choice at A { //1() from A to B; From f0999a3438182b77f572cecfee6824143de14a06 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 12 Mar 2019 08:10:30 +0000 Subject: [PATCH 111/539] Continued: added projection reachability checking. --- .../src/main/java/org/scribble/del/DoDel.java | 5 ---- .../local/LCompoundInteractionNodeDel.java | 4 ++- .../src/main/java/org/scribble/job/Job.java | 5 ++++ .../java/org/scribble/lang/local/LChoice.java | 19 ++++++++++++++ .../org/scribble/lang/local/LContinue.java | 13 ++++++++++ .../org/scribble/lang/local/LProtocol.java | 15 +++++++++++ .../java/org/scribble/lang/local/LRcv.java | 8 ++++++ .../org/scribble/lang/local/LRecursion.java | 18 +++++++++++++ .../java/org/scribble/lang/local/LSend.java | 8 ++++++ .../java/org/scribble/lang/local/LSeq.java | 17 ++++++++++++ .../java/org/scribble/lang/local/LSkip.java | 10 ++++++- .../java/org/scribble/lang/local/LType.java | 4 ++- .../visit/wf/ReachabilityChecker.java | 23 ++++++++++------ .../visit/wf/env/ReachabilityEnv.java | 16 ++++++------ scribble-test/src/test/scrib/tmp/Test.scr | 26 ++++++++++++++++++- 15 files changed, 166 insertions(+), 25 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/del/DoDel.java b/scribble-core/src/main/java/org/scribble/del/DoDel.java index a64b980f9..3b40943fc 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoDel.java @@ -13,13 +13,10 @@ */ package org.scribble.del; -import java.util.Arrays; - import org.scribble.ast.Do; import org.scribble.ast.ScribNode; import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.qualified.ProtocolNameNode; -import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.job.JobContext; import org.scribble.job.ScribbleException; import org.scribble.type.SubprotoSig; @@ -30,8 +27,6 @@ import org.scribble.visit.context.ProtocolDeclContextBuilder; import org.scribble.visit.wf.NameDisambiguator; -import antlr.Token; - public abstract class DoDel extends SimpleInteractionNodeDel { public DoDel() diff --git a/scribble-core/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java b/scribble-core/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java index 6c15adfa1..4220b49ed 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java @@ -22,7 +22,9 @@ public interface LCompoundInteractionNodeDel extends LInteractionNodeDel { @Override - default LCompoundInteractionNode leaveReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker, ScribNode visited) throws ScribbleException + default LCompoundInteractionNode leaveReachabilityCheck(ScribNode parent, + ScribNode child, ReachabilityChecker checker, ScribNode visited) + throws ScribbleException { // Following CompoundInteractionNodeDel#leaveInlinedProtocolUnfolding/leaveWFChoiceCheck ReachabilityEnv visited_env = checker.popEnv(); diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 80ca5e759..4d0643792 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -209,6 +209,11 @@ public void runWellFormednessPasses() throws ScribbleException inlined.checkRoleEnabling(); inlined.checkExtChoiceConsistency(); } + + for (LProtocol proj : this.jctxt.getProjections().values()) + { + proj.checkReachability(); + } } // Due to Projector not being a subprotocol visitor, so "external" subprotocols may not be visible in ModuleContext building for the projections of the current root Module diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java index b344af87f..9f329390d 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java @@ -1,8 +1,11 @@ package org.scribble.lang.local; +import java.util.LinkedList; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; +import org.scribble.job.ScribbleException; import org.scribble.lang.Choice; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -12,6 +15,7 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.kind.Local; +import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; public class LChoice extends Choice implements LType @@ -103,6 +107,21 @@ public void buildGraph(EGraphBuilderUtil2 b) b.leaveChoice(); } + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribbleException + { + List blocks = new LinkedList<>(); + for (LSeq block : this.blocks) + { + blocks.add(block.checkReachability(env)); + } + boolean postcont = blocks.stream().allMatch(x -> x.postcont); // i.e., no exits + Set recvars = blocks.stream().flatMap(x -> x.recvars.stream()) + .collect(Collectors.toSet()); + return new ReachabilityEnv(postcont, recvars); + } + /*@Override public List getBlocks() { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java index 6d8a86855..7e2c9792f 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java @@ -1,6 +1,10 @@ package org.scribble.lang.local; +import java.util.HashSet; +import java.util.Set; + import org.scribble.ast.ProtocolKindNode; +import org.scribble.job.ScribbleException; import org.scribble.lang.Continue; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -81,6 +85,15 @@ public void buildGraph(EGraphBuilderUtil2 b) // May be repeated for non-det, but OK // Combine with removeEdgeFromPredecessor? }*/ } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribbleException + { + Set tmp = new HashSet<>(env.recvars); + tmp.add(this.recvar); + return new ReachabilityEnv(true, tmp); + } @Override public int hashCode() diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index 398c1aed0..e841aa16c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -7,6 +7,7 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.local.LProtocolDecl; import org.scribble.job.Job; +import org.scribble.job.ScribbleException; import org.scribble.lang.Protocol; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -89,6 +90,20 @@ public void buildGraph(EGraphBuilderUtil2 b) { this.def.buildGraph(b); } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribbleException + { + throw new RuntimeException("Unsupported for Protocol: " + this); + } + + public ReachabilityEnv checkReachability() + throws ScribbleException + { + return this.def + .checkReachability(new ReachabilityEnv(false, Collections.emptySet())); + } @Override public LProtocolDecl getSource() diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java b/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java index 10ca89065..53ae757ab 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java @@ -1,5 +1,6 @@ package org.scribble.lang.local; +import org.scribble.job.ScribbleException; import org.scribble.lang.MessageTransfer; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -61,6 +62,13 @@ public void buildGraph(EGraphBuilderUtil2 b) b.addEdge(b.getEntry(), b.ef.newEReceive(peer, mid, payload), b.getExit()); } + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribbleException + { + return env; + } + @Override public String toString() { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java index 5a163fc6b..513449d78 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java @@ -1,6 +1,10 @@ package org.scribble.lang.local; +import java.util.HashSet; +import java.util.Set; + import org.scribble.ast.ProtocolKindNode; +import org.scribble.job.ScribbleException; import org.scribble.lang.Recursion; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -63,6 +67,20 @@ public void buildGraph(EGraphBuilderUtil2 b) b.popRecursionEntry(this.recvar); } + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribbleException + { + env = this.body.checkReachability(env); + if (env.recvars.contains(this.recvar)) + { + Set tmp = new HashSet<>(env.recvars); + tmp.remove(this.recvar); + env = new ReachabilityEnv(env.postcont, tmp); + } + return env; + } + @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSend.java b/scribble-core/src/main/java/org/scribble/lang/local/LSend.java index bc44a05f6..4713dcc67 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSend.java @@ -1,5 +1,6 @@ package org.scribble.lang.local; +import org.scribble.job.ScribbleException; import org.scribble.lang.MessageTransfer; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -60,6 +61,13 @@ public void buildGraph(EGraphBuilderUtil2 b) : Payload.EMPTY_PAYLOAD; b.addEdge(b.getEntry(), b.ef.newESend(peer, mid, payload), b.getExit()); } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribbleException + { + return env; + } @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java index 65f1f92fa..67a043622 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java @@ -8,6 +8,7 @@ import org.scribble.ast.InteractionSeq; import org.scribble.ast.local.LInteractionSeq; +import org.scribble.job.ScribbleException; import org.scribble.lang.SType; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -109,6 +110,22 @@ public void buildGraph(EGraphBuilderUtil2 b) b.setEntry(entry); } + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribbleException + { + for (Iterator i = getElements().iterator(); i.hasNext(); ) + { + LType next = i.next(); + if (!env.isSeqable()) + { + throw new ScribbleException("Illegal sequence to: " + next); + } + env = next.checkReachability(env); + } + return env; + } + @Override public List getElements() { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java index f2bc90941..d005697d2 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java @@ -2,6 +2,7 @@ import java.util.Set; +import org.scribble.job.ScribbleException; import org.scribble.lang.STypeBase; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -10,7 +11,7 @@ import org.scribble.type.kind.Local; import org.scribble.type.name.Role; -// Used during projection -- filtered out by GSeq::projection +// Used only *during* projection -- filtered out by GSeq::projection public class LSkip extends STypeBase implements LType { public static final LSkip SKIP = new LSkip(); @@ -54,6 +55,13 @@ public void buildGraph(EGraphBuilderUtil2 b) { throw new RuntimeException("Unsupported for: " + this); } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribbleException + { + throw new RuntimeException("Unsupported for: " + this); + } @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LType.java b/scribble-core/src/main/java/org/scribble/lang/local/LType.java index ccf0a3efd..0aae84399 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LType.java @@ -1,5 +1,6 @@ package org.scribble.lang.local; +import org.scribble.job.ScribbleException; import org.scribble.lang.SType; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -24,5 +25,6 @@ public interface LType extends SType // Use EGraphBuilderUtil2::finalise for final result void buildGraph(EGraphBuilderUtil2 b); - //List getEnabling(); + ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribbleException; } diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java b/scribble-core/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java index cf2291b53..e1e09398c 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java @@ -39,11 +39,13 @@ protected ReachabilityEnv makeRootProtocolDeclEnv(ProtocolDecl pd) // Following Projector visit pattern -- for overriding base enter/visit/leave pattern @Override - protected ScribNode visitForUnfolding(ScribNode parent, ScribNode child) throws ScribbleException + protected ScribNode visitForUnfolding(ScribNode parent, ScribNode child) + throws ScribbleException { if (child instanceof LInteractionSeq) { - return visitOverrideForLInteractionSequence((LProtocolBlock) parent, (LInteractionSeq) child); + return visitOverrideForLInteractionSequence((LProtocolBlock) parent, + (LInteractionSeq) child); } else { @@ -51,22 +53,27 @@ protected ScribNode visitForUnfolding(ScribNode parent, ScribNode child) throws } } - protected LInteractionSeq visitOverrideForLInteractionSequence(LProtocolBlock parent, LInteractionSeq child) throws ScribbleException + protected LInteractionSeq visitOverrideForLInteractionSequence( + LProtocolBlock parent, LInteractionSeq child) throws ScribbleException { - return ((LInteractionSeqDel) child.del()).visitForReachabilityChecking(this, (LInteractionSeq) child); + return ((LInteractionSeqDel) child.del()).visitForReachabilityChecking(this, + (LInteractionSeq) child); } @Override - protected void unfoldingEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected void unfoldingEnter(ScribNode parent, ScribNode child) + throws ScribbleException { super.unfoldingEnter(parent, child); child.del().enterReachabilityCheck(parent, child, this); } - + @Override - protected ScribNode unfoldingLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected ScribNode unfoldingLeave(ScribNode parent, ScribNode child, + ScribNode visited) throws ScribbleException { - visited = visited.del().leaveReachabilityCheck(parent, child, this, visited); + visited = visited.del().leaveReachabilityCheck(parent, child, this, + visited); return super.unfoldingLeave(parent, child, visited); } } diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java b/scribble-core/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java index 0b30a9014..8e1ae3eff 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java @@ -24,9 +24,8 @@ public class ReachabilityEnv extends Env { - private boolean seqable; - // For checking bad sequencing of unreachable code: false after a continue; true if choice has an exit (false inherited for all other constructs) - private final Set contlabs; // For checking "reachable code" satisfies tail recursion (in the presence of sequencing) + private boolean seqable; // For checking bad sequencing of unreachable code: false after a continue; true if choice has an exit (false inherited for all other constructs) + private final Set contlabs; // For checking "reachable code" satisfies tail recursion (in the presence of sequencing, e.g., after choice) public ReachabilityEnv() { @@ -71,14 +70,15 @@ public ReachabilityEnv mergeForChoice(List children) } // Does merge depend on choice/par etc? - private ReachabilityEnv merge(boolean isChoice, List children) + private ReachabilityEnv merge(boolean isChoice, + List children) { ReachabilityEnv copy = copy(); copy.seqable = - (isChoice) - ? children.stream().filter((e) -> e.seqable).count() > 0 - : children.stream().filter((e) -> !e.seqable).count() == 0; - children.stream().forEach((e) -> copy.contlabs.addAll(e.contlabs)); + isChoice + ? children.stream().filter(e -> e.seqable).count() > 0 + : children.stream().filter(e -> !e.seqable).count() == 0; + children.forEach(e -> copy.contlabs.addAll(e.contlabs)); return copy; } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 5f5b765de..620918c41 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -33,7 +33,31 @@ module tmp.Test; // TODO: port forwarding version of P2 -- funny case of "session" persisting over full disconnect, should/how to correlate? -//* +/* +global protocol Proto1(role A, role B) +{ + rec X + { + 0() from A to B; + choice at A + { + 1() from A to B; + //do Proto1(A, B); + continue X; + //3() from A to B; + } + or + { + 2() from A to B; + } + //4() from A to B; + } + 5() from A to B; +} +//*/ + + +/* global protocol Proto1(role A, role B, role C) { choice at A From 35797020653be9b3a80fce0d40647fef4016ec09 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 15 Mar 2019 09:32:06 +0000 Subject: [PATCH 112/539] Continued: revising graph building. --- .../scribble/del/global/GProtocolDeclDel.java | 8 +- .../org/scribble/del/local/LContinueDel.java | 3 +- .../src/main/java/org/scribble/job/Job.java | 22 ++- .../main/java/org/scribble/lang/Protocol.java | 24 ++- .../java/org/scribble/lang/global/GDo.java | 4 +- .../org/scribble/lang/global/GProtocol.java | 26 ++-- .../java/org/scribble/lang/local/LChoice.java | 40 +++-- .../org/scribble/lang/local/LContinue.java | 46 +++--- .../org/scribble/lang/local/LProjection.java | 15 +- .../org/scribble/lang/local/LProtocol.java | 19 +-- .../java/org/scribble/lang/local/LSeq.java | 2 +- .../scribble/lang/local/ReachabilityEnv.java | 23 +++ .../org/scribble/model/GraphBuilderUtil.java | 2 +- .../model/endpoint/EGraphBuilderUtil.java | 2 +- .../model/endpoint/EGraphBuilderUtil2.java | 140 ++++++++++++------ .../model/endpoint/IntermediateRecEdge.java | 67 +++++++++ scribble-test/src/test/scrib/tmp/Test.scr | 75 ++++++++++ 17 files changed, 385 insertions(+), 133 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/lang/local/ReachabilityEnv.java create mode 100644 scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index fc7532a48..3443b687c 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -26,6 +26,7 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Module; import org.scribble.ast.NonRoleParamDeclList; +import org.scribble.ast.ProtocolMod; import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScribNode; import org.scribble.ast.context.DependencyMap; @@ -73,12 +74,13 @@ public GProtocol translate(ScribNode n, GTypeTranslator t) throws ScribbleException { GProtocolDecl source = (GProtocolDecl) n; - Module mod = (Module) n.getParent(); - GProtocolName fullname = new GProtocolName(mod.getFullModuleName(), + Module m = (Module) n.getParent(); + List mods = source.getModifierListChild().getModList(); + GProtocolName fullname = new GProtocolName(m.getFullModuleName(), source.getHeaderChild().getDeclName()); List roles = source.getRoles(); GSeq body = (GSeq) source.getDefChild().getBlockChild().visitWith(t); - return new GProtocol(source, fullname, roles, body); + return new GProtocol(source, mods, fullname, roles, body); } @Override diff --git a/scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java b/scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java index b65ce57f4..42c41cad7 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java @@ -72,9 +72,8 @@ public LContinue leaveEGraphBuilding(ScribNode parent, ScribNode child, { graph.util.addContinueEdge(graph.util.getEntry(), rv); } - else + else // ** "Overwrites" previous edge built by send/receive(s) leading to this continue { - // ** "Overwrites" previous edge built by send/receive(s) leading to this continue Iterator preds = graph.util.getPredecessors().iterator(); Iterator prevs = graph.util.getPreviousActions().iterator(); EState entry = graph.util.getEntry(); diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 4d0643792..af4f1d4ed 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -37,6 +37,7 @@ import org.scribble.model.global.SGraphBuilderUtil; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; +import org.scribble.type.kind.Local; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.ModuleName; @@ -143,9 +144,9 @@ public void runContextBuildingPasses() throws ScribbleException //runUnfoldingPass(); for (GProtocol inlined : this.jctxt.getInlined()) { - STypeUnfolder u1 = new STypeUnfolder<>(); - //GTypeUnfolder u2 = new GTypeUnfolder(); - GType unf = (GType) inlined.unfoldAllOnce(u1);//.unfoldAllOnce(u2); CHECKME: twice unfolding? instead of "unguarded"-unfolding? + STypeUnfolder unf1 = new STypeUnfolder<>(); + //GTypeUnfolder unf2 = new GTypeUnfolder(); + GType unf = (GType) inlined.unfoldAllOnce(unf1);//.unfoldAllOnce(unf2); CHECKME: twice unfolding? instead of "unguarded"-unfolding? System.out.println("\nunfolded:\n" + unf); } @@ -154,7 +155,9 @@ public void runContextBuildingPasses() throws ScribbleException for (Role self : g.roles) { GProtocol inlined = this.jctxt.getInlined(g.fullname); - LProtocol proj = inlined.project(self); + LProtocol proj = inlined.project(self); // Projection and inling commutative? + STypeUnfolder unf = new STypeUnfolder<>(); + //proj = proj.unfoldAllOnce(unf); this.jctxt.addProjected(proj.fullname, proj); System.out.println("\nprojected onto " + self + ":\n" + proj); } @@ -165,6 +168,9 @@ public void runContextBuildingPasses() throws ScribbleException { //LProtocolName lname = e.getKey(); LProtocol proj = e.getValue(); + + System.out.println("sss1: " + proj); + EGraph graph = proj.toEGraph(this); this.jctxt.addEGraph(proj.fullname, graph); System.out.println("\ngraph for " + proj.fullname + ":\n" + graph.toDot()); @@ -206,12 +212,20 @@ public void runWellFormednessPasses() throws ScribbleException "Unused roles in " + inlined.fullname + ": " + unused); } */ + if (inlined.isAux()) + { + continue; + } inlined.checkRoleEnabling(); inlined.checkExtChoiceConsistency(); } for (LProtocol proj : this.jctxt.getProjections().values()) { + if (proj.isAux()) // CHECKME? + { + continue; + } proj.checkReachability(); } } diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index ee3ca93af..a5cae3435 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -6,6 +6,7 @@ import java.util.stream.Collectors; import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.ProtocolMod; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; @@ -13,23 +14,35 @@ public abstract class Protocol, B extends Seq> extends STypeBase { + public final List mods; public final N fullname; public final List roles; // Ordered role params; pre: size >= 2 //public final List> params; // TODO public final B def; // CHECKME: take "? extends Seq" as generic param? - public Protocol(ProtocolDecl source, N fullname, + public Protocol(ProtocolDecl source, List mods, N fullname, List roles, // List params, B def) { super(source); + this.mods = Collections.unmodifiableList(mods); this.fullname = fullname; this.roles = Collections.unmodifiableList(roles); this.def = def; } public abstract Protocol reconstruct(ProtocolDecl source, - N fullname, List roles, B def); + List mods, N fullname, List roles, B def); + + public boolean isAux() + { + return this.mods.contains(ProtocolMod.AUX); + } + + public boolean isExplicit() + { + return this.mods.contains(ProtocolMod.EXPLICIT); + } public Set getRoles() { @@ -50,11 +63,13 @@ public String toString() + " {\n" + this.def + "\n}"; } + // CHECKME: only should/need to use fullname? @Override public int hashCode() { int hash = 7; hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.mods.hashCode(); hash = 31 * hash + this.fullname.hashCode(); hash = 31 * hash + this.roles.hashCode(); hash = 31 * hash + this.def.hashCode(); @@ -74,8 +89,7 @@ public boolean equals(Object o) } Protocol them = (Protocol) o; return super.equals(this) // Does canEquals - && this.fullname.equals(them.fullname) && this.roles.equals(them.roles) - && this.def.equals(them.def); + && this.mods.equals(them.mods) && this.fullname.equals(them.fullname) + && this.roles.equals(them.roles) && this.def.equals(them.def); } - } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index bd4ee4bec..76fadaf78 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -43,9 +43,9 @@ public GType getInlined(STypeInliner i)//, Deque stack) GProtocolName fullname = this.proto; SubprotoSig sig = new SubprotoSig(fullname, this.roles, Collections.emptyList()); // FIXME + RecVar rv = i.makeRecVar(sig); if (i.hasSig(sig)) { - RecVar rv = i.makeRecVar(sig); return new GContinue(getSource(), rv); } i.pushSig(sig); @@ -55,7 +55,7 @@ public GType getInlined(STypeInliner i)//, Deque stack) GSeq inlined = g.def.substitute(subs).getInlined(i);//, stack); // i.e. returning a GSeq -- rely on parent GSeq to inline i.popSig(); - return inlined; + return new GRecursion(null, rv, inlined); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index 0e0f4865c..2774ab7b2 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -8,6 +8,7 @@ import java.util.stream.Stream; import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.ProtocolMod; import org.scribble.ast.global.GProtocolDecl; import org.scribble.job.ScribbleException; import org.scribble.lang.Protocol; @@ -22,23 +23,24 @@ import org.scribble.type.name.LProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.visit.context.Projector; public class GProtocol extends Protocol implements GType { - public GProtocol(ProtocolDecl source, GProtocolName fullname, - List roles, - // List params, // TODO + public GProtocol(ProtocolDecl source, List mods, + GProtocolName fullname, List roles, // List params, // TODO GSeq def) { - super(source, fullname, roles, def); + super(source, mods, fullname, roles, def); } @Override public GProtocol reconstruct(ProtocolDecl source, - GProtocolName fullname, List roles, GSeq def) + List mods, GProtocolName fullname, List roles, + GSeq def) { - return new GProtocol(source, fullname, roles, def); + return new GProtocol(source, mods, fullname, roles, def); } @Override @@ -46,7 +48,7 @@ public GType substitute(Substitutions subs) { List roles = this.roles.stream().map(x -> subs.apply(x)) .collect(Collectors.toList()); - return reconstruct(getSource(), this.fullname, roles, + return reconstruct(getSource(), this.mods, this.fullname, roles, this.def.substitute(subs)); } @@ -62,27 +64,28 @@ public GProtocol getInlined(STypeInliner i)//, Deque stack) GRecursion rec = new GRecursion(null, rv, body); // CHECKME: or protodecl source? GProtocolDecl source = getSource(); GSeq def = new GSeq(null, Stream.of(rec).collect(Collectors.toList())); - return new GProtocol(source, fullname, this.roles, def); + return new GProtocol(source, this.mods, this.fullname, this.roles, def); } @Override public GProtocol unfoldAllOnce(STypeUnfolder u) { GSeq unf = (GSeq) this.def.unfoldAllOnce(u); - return reconstruct(getSource(), this.fullname, this.roles, unf); + return reconstruct(getSource(), this.mods, this.fullname, this.roles, unf); } // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) @Override public LProjection project(Role self) { - LProtocolName fullname = new LProtocolName(this.fullname + "_" + self); + LProtocolName fullname = Projector.projectFullProtocolName(this.fullname, self); LSeq body = (LSeq) this.def.project(self); Set tmp = body.getRoles(); List roles = this.roles.stream() .map(x -> x.equals(self) ? Role.SELF : x).filter(x -> tmp.contains(x)) .collect(Collectors.toList()); - return new LProjection(this.fullname, self, fullname, roles, body); + return new LProjection(this.mods, this.fullname, self, fullname, roles, + body); } @Override @@ -91,6 +94,7 @@ public Set checkRoleEnabling(Set enabled) throws ScribbleException throw new RuntimeException("Unsupported for Protocol: " + this); } + // FIXME: top-level overriding pattern inconsistent with, e.g., getInlined -- though maybe should be fixing the latter // CHECKME: refactor Protocol out of SType? Also Do -- but harder because Do needs to be in Seq public Set checkRoleEnabling() throws ScribbleException { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java index 9f329390d..8144d309e 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java @@ -67,35 +67,45 @@ public void buildGraph(EGraphBuilderUtil2 b) { List elems = block.getElements(); LType first = elems.get(0); - if (first instanceof LRecursion) // CHECKME + if (first instanceof LRecursion) // CHECKME: do this here? refactor into builderutil? { EGraphBuilderUtil2 b1 = new EGraphBuilderUtil2(b); - // "Inherits" b.recvars, for continue edge building (to "outer" recs) + // "Inherits" b.recvars, for continue edge building (to "outer" recs) + EGraph nested; if (elems.size() == 1) { b1.setExit(b.getExit()); first.buildGraph(b1); - EGraph nested = b1.finalise(); - EState init = nested.init; - //for (EAction a : first.getEnabling()) - for (EAction a : (Iterable) - init.getAllActions().stream().distinct()::iterator) - // Enabling actions - { - for (EState s : init.getSuccessors(a)) - { - b.addEdge(b.getEntry(), a, s); - } - } + nested = b1.finalise(); } else { + //HERE.. and fix -dotpng + first.buildGraph(b1); - EGraph nested = b1.finalise(); + nested = b1.finalise(); b.setEntry(nested.term); // Must be non null LSeq tail = new LSeq(null, elems.subList(1, elems.size())); tail.buildGraph(b); } + EState init = nested.init; + //for (EAction a : first.getEnabling()) + for (EAction a : (Iterable) + init.getAllActions().stream().distinct()::iterator) + // Enabling actions + { + for (EState s : init.getSuccessors(a)) + { + b.addEdge(b.getEntry(), a, s); + } + } + } + else if (first instanceof LContinue) + { + // Cannot treat choice-unguarded-continue in "a single pass" because may not have built all recursion enacting edges yet + // (Single-pass building would be sensitive to order of choice block visiting) + LContinue cont = (LContinue) first; // First and only element + b.addContinueEdge(b.getEntry(), cont.recvar); } else { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java index 7e2c9792f..247ade2a6 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java @@ -10,6 +10,8 @@ import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; import org.scribble.model.endpoint.EGraphBuilderUtil2; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -53,37 +55,25 @@ public LRecursion unfoldAllOnce(STypeUnfolder u) @Override public void buildGraph(EGraphBuilderUtil2 b) { - //if (b.isUnguardedInChoice()) + // CHECKME: identical edges, i.e. same pred/prev/succ (e.g. rec X { choice at A { A->B:1 } or { A->B:1 } continue X; }) + // Choice-guarded continue -- choice-unguarded continue detected and handled in LChoice + EState curr = b.getEntry(); + for (EState pred : b.getPredecessors(curr)) // Does getAllSuccessors { - b.addContinueEdge(b.getEntry(), this.recvar); - return; - } - - /*// ** "Overwrites" previous edge built by send/receive(s) leading to this continue - Iterator preds = b.getPredecessors().iterator(); - Iterator prevs = b.getPreviousActions().iterator(); - EState entry = b.getEntry(); - - Set> removed = new HashSet<>(); - // HACK: for identical edges, i.e. same pred/prev/succ (e.g. rec X { choice at A { A->B:1 } or { A->B:1 } continue X; }) - // FIXME: do here, or refactor into GraphBuilder? - // - // Because duplicate edges preemptively pruned by ModelState.addEdge, but corresponding predecessors not pruned - // FIXME: make uniform - while (preds.hasNext()) - { - EState pred = preds.next(); - EAction prev = prevs.next(); - List tmp = Arrays.asList(pred, prev, entry); - if (!removed.contains(tmp)) + for (EAction a : pred.getAllActions()) { - removed.add(tmp); - b.removeEdgeFromPredecessor(pred, prev); // Assumes pred is a predecessor, and removes pred from current predecessors.. + try + { + b.removeEdge(pred, a, curr); //b.removeEdgeFromPredecessor(pred, prev); + //b.addEdge(pred, a, entry); //b.addRecursionEdge(pred, prev, b.getRecursionEntry(this.recvar)); + b.addRecursionEdge(pred, a, this.recvar); + } + catch (ScribbleException e) // CHECKME + { + throw new RuntimeException(e); + } } - b.addRecursionEdge(pred, prev, - b.getRecursionEntry(this.recvar)); - // May be repeated for non-det, but OK // Combine with removeEdgeFromPredecessor? - }*/ + } } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java index e4a3ed1b9..34baf72e5 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java @@ -4,6 +4,7 @@ import java.util.stream.Collectors; import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.ProtocolMod; import org.scribble.ast.local.LProtocolDecl; import org.scribble.lang.STypeInliner; import org.scribble.lang.Substitutions; @@ -19,21 +20,21 @@ public class LProjection extends LProtocol public final GProtocolName parent; public final Role self; - public LProjection(GProtocolName parent, Role self, LProtocolName fullname, - List roles, - // List params, // TODO + public LProjection(List mods, GProtocolName parent, Role self, + LProtocolName fullname, List roles, // List params, // TODO LSeq body) { - super(null, fullname, roles, body); + super(null, mods, fullname, roles, body); this.parent = parent; this.self = self; } @Override public LProjection reconstruct(ProtocolDecl source, - LProtocolName fullname, List roles, LSeq body) + List mods, LProtocolName fullname, List roles, + LSeq body) { - return new LProjection(this.parent, this.self, fullname, roles, body); + return new LProjection(mods, this.parent, this.self, fullname, roles, body); } @Override @@ -41,7 +42,7 @@ public LType substitute(Substitutions subs) { List roles = this.roles.stream().map(x -> subs.apply(x)) .collect(Collectors.toList()); - return reconstruct(getSource(), this.fullname, roles, + return reconstruct(getSource(), this.mods, this.fullname, roles, this.def.substitute(subs)); } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index e841aa16c..5edc15c29 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -5,6 +5,7 @@ import java.util.stream.Collectors; import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.ProtocolMod; import org.scribble.ast.local.LProtocolDecl; import org.scribble.job.Job; import org.scribble.job.ScribbleException; @@ -24,19 +25,19 @@ public class LProtocol extends Protocol implements LType { - public LProtocol(ProtocolDecl source, LProtocolName fullname, - List roles, - // List params, // TODO + public LProtocol(ProtocolDecl source, List mods, + LProtocolName fullname, List roles, // List params, // TODO LSeq def) { - super(source, fullname, roles, def); + super(source, mods, fullname, roles, def); } @Override public LProtocol reconstruct(ProtocolDecl source, - LProtocolName fullname, List roles, LSeq def) + List mods, LProtocolName fullname, List roles, + LSeq def) { - return new LProtocol(source, fullname, roles, def); + return new LProtocol(source, mods, fullname, roles, def); } @Override @@ -44,7 +45,7 @@ public LType substitute(Substitutions subs) { List roles = this.roles.stream().map(x -> subs.apply(x)) .collect(Collectors.toList()); - return reconstruct(getSource(), this.fullname, roles, + return reconstruct(getSource(), this.mods, this.fullname, roles, this.def.substitute(subs)); } @@ -65,13 +66,13 @@ public LRecursion getInlined(STypeInliner i)//, Deque stack) public LProtocol unfoldAllOnce(STypeUnfolder u) { LSeq unf = (LSeq) this.def.unfoldAllOnce(u); - return reconstruct(getSource(), this.fullname, this.roles, unf); + return reconstruct(getSource(), this.mods, this.fullname, this.roles, unf); } public EGraph toEGraph(Job job) { EGraphBuilderUtil2 b = new EGraphBuilderUtil2(job.config.ef); - b.init(job.config.ef.newEState(Collections.emptySet())); + b.init(null); // FIXME: init param not used if (this.def.isEmpty()) // Empty Seq special case for top-level -- in general, Seq must be non-empty, cf. LSeq::buildGraph entry/exit { EState s = b.getEntry(); diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java index 67a043622..146fb06aa 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java @@ -100,7 +100,7 @@ public void buildGraph(EGraphBuilderUtil2 b) } else { - EState tmp = b.ef.newEState(Collections.emptySet()); + EState tmp = b.newState(Collections.emptySet()); b.setExit(tmp); next.buildGraph(b); b.setEntry(b.getExit()); diff --git a/scribble-core/src/main/java/org/scribble/lang/local/ReachabilityEnv.java b/scribble-core/src/main/java/org/scribble/lang/local/ReachabilityEnv.java new file mode 100644 index 000000000..f92a85d63 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/local/ReachabilityEnv.java @@ -0,0 +1,23 @@ +package org.scribble.lang.local; + +import java.util.Collections; +import java.util.Set; + +import org.scribble.type.name.RecVar; + +public class ReachabilityEnv +{ + public final boolean postcont; // For checking bad sequencing of unreachable code: false after a continue; true if choice has an exit (false inherited for all other constructs) + public final Set recvars; // For checking "reachable code" also satisfies tail recursion (e.g., after choice-with-exit) + + public ReachabilityEnv(boolean postcont, Set recvars) + { + this.postcont = postcont; + this.recvars = Collections.unmodifiableSet(recvars); + } + + public boolean isSeqable() + { + return !this.postcont && this.recvars.isEmpty(); + } +} diff --git a/scribble-core/src/main/java/org/scribble/model/GraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/model/GraphBuilderUtil.java index 29ec4ff99..62734eeb3 100644 --- a/scribble-core/src/main/java/org/scribble/model/GraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/model/GraphBuilderUtil.java @@ -60,7 +60,7 @@ protected final void addEdgeAux(S s, A a, S succ) s.addEdge(a, succ); } - protected final void removeEdgeAux(S s, A a, S succ) throws ScribbleException // Exception necessary? + protected void removeEdgeAux(S s, A a, S succ) throws ScribbleException // Exception necessary? { s.removeEdge(a, succ); } diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java index 15bf4b0bd..9cddfc4d0 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java @@ -57,7 +57,7 @@ public EGraphBuilderUtil(EModelFactory ef) // N.B. must be called before every "new visit", including first @Override - public void init(EState init) + public void init(EState init) // FIXME: init not used? { clear(); reset(this.ef.newEState(Collections.emptySet()), diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java index c87ee7dd1..a0ba2030f 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java @@ -23,6 +23,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.job.ScribbleException; import org.scribble.model.GraphBuilderUtil; @@ -36,8 +38,9 @@ public class EGraphBuilderUtil2 extends GraphBuilderUtil { - public final EModelFactory ef; + public final EModelFactory ef; // N.B. new states should be made by this.newState, not this.ef.newEState + private final Map outerRecvars = new HashMap<>(); private final Map> recvars = new HashMap<>(); // CHECKME: Deque is for shadowing? // First action(s) inside a rec scope ("enacting" means how to enact an unguarded choice-continue) @@ -63,19 +66,22 @@ public EGraphBuilderUtil2(EModelFactory ef) public EGraphBuilderUtil2(EGraphBuilderUtil2 b) { this.ef = b.ef; - init(ef.newEState(Collections.emptySet())); + init(null); // FIXME: init param not used + b.outerRecvars.entrySet().forEach(x -> + this.outerRecvars.put(x.getKey(), x.getValue())); b.recvars.entrySet().forEach(x -> - this.recvars.put(x.getKey(), new LinkedList<>(x.getValue()))); + this.outerRecvars.put(x.getKey(), x.getValue().peek())); } // N.B. must be called before every "new visit", including first // FIXME: now cannot be reused for different protos, because of recvars and clear/reset @Override - public void init(EState init) + public void init(EState init) // FIXME: init not used (but inherited from super) { clear(); - reset(this.ef.newEState(Collections.emptySet()), - this.ef.newEState(Collections.emptySet())); + /*reset(this.ef.newEState(Collections.emptySet()), + this.ef.newEState(Collections.emptySet()));*/ + reset(newState(Collections.emptySet()), newState(Collections.emptySet())); } protected void clear() @@ -90,13 +96,22 @@ protected void clear() this.prev.push(new LinkedList<>()); this.enactingMap.clear(); + + this.states.clear(); } - /*@Override + private final Set states = new HashSet<>(); + + // For the util to additionally record states + // CHECKME: make interface less messy w.r.t. this.ef.newEState + //@Override public EState newState(Set labs) { - return new EState(labs); - }*/ + //return new EState(labs); + EState s = this.ef.newEState(labs); + this.states.add(s); + return s; + } // Records 's' as predecessor state, and 'a' as previous action and the "enacting action" for "fresh" recursion scopes @Override @@ -231,18 +246,18 @@ public void popChoiceBlock() /* * Dealing with Recursion contexts */ - public void pushRecursionEntry(RecVar recvar, EState entry) + public void pushRecursionEntry(RecVar rv, EState entry) { /*if (!isUnguardedInChoice()) // Don't record rec entry if it is an unguarded choice-rec { this.entry.addLabel(recvar); }*/ //this.recvars.put(recvar, this.entry); - Deque tmp = this.recvars.get(recvar); + Deque tmp = this.recvars.get(rv); if (tmp == null) { tmp = new LinkedList<>(); - this.recvars.put(recvar, tmp); + this.recvars.put(rv, tmp); } /*if (isUnguardedInChoice()) { @@ -255,25 +270,25 @@ public void pushRecursionEntry(RecVar recvar, EState entry) tmp.push(entry); //Deque> tmp2 = this.enacting.get(recvar); - Deque> tmp2 = this.enacting.get(recvar); + Deque> tmp2 = this.enacting.get(rv); if (tmp2 == null) { tmp2 = new LinkedList<>(); // New Stack for this recvar - this.enacting.put(recvar, tmp2); + this.enacting.put(rv, tmp2); } //tmp2.push(new HashSet<>()); // Push new Set element onto stack tmp2.push(new LinkedList<>()); // Push new Set element onto stack } - public void popRecursionEntry(RecVar recvar) + public void popRecursionEntry(RecVar rv) { - this.recvars.get(recvar).pop(); // Pop the entry of this rec + this.recvars.get(rv).pop(); // Pop the entry of this rec //Set pop = this.enacting.get(recvar).pop(); - List pop = this.enacting.get(recvar).pop(); - if (this.enacting.get(recvar).isEmpty()) // All Sets popped from the stack of this recvar + List pop = this.enacting.get(rv).pop(); + if (this.enacting.get(rv).isEmpty()) // All Sets popped from the stack of this recvar { - this.enacting.remove(recvar); + this.enacting.remove(rv); } EState curr = getEntry(); @@ -284,7 +299,7 @@ public void popRecursionEntry(RecVar recvar) tmp = new HashMap<>(); this.enactingMap.put(curr, tmp); } - tmp.put(recvar, pop); + tmp.put(rv, pop); } @@ -301,6 +316,7 @@ public boolean isUnguardedInChoice() } // Choice-unguarded continues -- fixed in finalise pass + // Now currently used for all continues, cf. LContinue::buildGraph public void addContinueEdge(EState s, RecVar rv) { /*this.contStates.add(s); @@ -331,6 +347,21 @@ public void addRecursionEdge(EState s, EAction a, EState succ) // Cf. LGraphBui } } } + + // Cf. add ContinueEdge + public void addRecursionEdge(EState s, EAction a, RecVar rv) + { + if (this.recvars.containsKey(rv)) + { + EState entry = getRecursionEntry(rv); + addEdge(s, a, entry); + } + else + { + addEdgeAux(s, new IntermediateRecEdge(this.ef, a, rv), + newState(Stream.of(rv).collect(Collectors.toSet()))); + } + } // succ assumed to be this.getEntry() public void removeEdgeFromPredecessor(EState s, EAction a) @@ -355,6 +386,13 @@ public void removeEdgeFromPredecessor(EState s, EAction a) } throw new RuntimeException("Shouldn't get in here: " + s + ", " + a); } + + // CHECKME handle preds/prevs like above (cf. this.addEdge) + public void removeEdge(EState s, EAction a, EState succ) + throws ScribbleException + { + removeEdgeAux(s, a, succ); + } public List getPredecessors() { @@ -373,6 +411,12 @@ public EState getRecursionEntry(RecVar recvar) return this.recvars.get(recvar).peek(); } + public Set getPredecessors(EState s) + { + return this.states.stream().filter(x -> x.getAllSuccessors().contains(s)) + .collect(Collectors.toSet()); + } + /* * Finalise graph by treating IntermediateContinueEdges @@ -402,62 +446,70 @@ public EGraph finalise() } // FIXME: incomplete -- won't fully correctly handle situations involving, e.g., transitive continue-edge fixing? - protected void fixContinueEdges(Set seen, Map map, - EState curr, EState res) + protected void fixContinueEdges(Set seen, Map clones, + EState orig, EState clone) { - if (seen.contains(curr)) + if (seen.contains(orig)) { return; } - seen.add(curr); - Iterator as = curr.getAllActions().iterator(); - Iterator ss = curr.getAllSuccessors().iterator(); + seen.add(orig); + Iterator as = orig.getAllActions().iterator(); + Iterator ss = orig.getAllSuccessors().iterator(); while (as.hasNext()) { EAction a = as.next(); - EState succ = ss.next(); - EState next; - next = getNext(map, succ); + EState origSucc = ss.next(); + EState cloneSucc = getClone(clones, origSucc); - if (!(a instanceof IntermediateContinueEdge)) + if (!(a instanceof IntermediateContinueEdge) && !(a instanceof IntermediateRecEdge)) { - addEdgeAux(res, a, next); + addEdgeAux(clone, a, cloneSucc); - fixContinueEdges(seen, map, succ, next); + fixContinueEdges(seen, clones, origSucc, cloneSucc); + } + else if (a instanceof IntermediateRecEdge) + { + addEdgeAux(clone, ((IntermediateRecEdge) a).action, + this.outerRecvars.get(origSucc.getLabels().iterator().next())); + // N.B. no recursive call, i.e., don't follow intermediate rec edge successors } else { IntermediateContinueEdge ice = (IntermediateContinueEdge) a; //for (IOAction e : this.enactingMap.get(succ)) RecVar rv = new RecVar(ice.mid.toString()); - for (EAction e : this.enactingMap.get(succ).get(rv)) + + System.out.println("sss2: " + rv); + + for (EAction e : this.enactingMap.get(origSucc).get(rv)) { - for (EState n : succ.getSuccessors(e)) + for (EState n : origSucc.getSuccessors(e)) { - next = getNext(map, n); - addEdgeAux(res, e, next); + cloneSucc = getClone(clones, n); + addEdgeAux(clone, e, cloneSucc); - fixContinueEdges(seen, map, succ, next); + fixContinueEdges(seen, clones, origSucc, cloneSucc); } } } } } - private EState getNext(Map map, EState succ) + private EState getClone(Map clones, EState orig) { - EState next; - if (map.containsKey(succ)) + EState res; + if (clones.containsKey(orig)) { - next = map.get(succ); + res = clones.get(orig); } else { //next = this.ef.newEState(succ.getLabels()); - next = succ.cloneNode(this.ef, succ.getLabels()); - map.put(succ, next); + res = orig.cloneNode(this.ef, orig.getLabels()); + clones.put(orig, res); } - return next; + return res; } } diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java b/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java new file mode 100644 index 000000000..5458fb25a --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java @@ -0,0 +1,67 @@ +package org.scribble.model.endpoint; + +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.model.global.SModelFactory; +import org.scribble.model.global.actions.SAction; +import org.scribble.type.Payload; +import org.scribble.type.name.Op; +import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; + +// FIXME rename better (it's an "external rec" continue edge) +class IntermediateRecEdge extends EAction +{ + public final EAction action; + + public IntermediateRecEdge(EModelFactory ef, EAction a, RecVar rv) + { + super(ef, Role.EMPTY_ROLE, new Op(rv.toString()), Payload.EMPTY_PAYLOAD); // HACK + this.action = a; + } + + @Override + public EAction toDual(Role self) + { + throw new RuntimeException("Shouldn't get in here: " + this); + } + + @Override + public SAction toGlobal(SModelFactory sf, Role self) + { + throw new RuntimeException("Shouldn't get in here: " + this); + } + + @Override + protected String getCommSymbol() + { + return "&"; + } + + @Override + public int hashCode() + { + int hash = 6037; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof IntermediateRecEdge)) + { + return false; + } + return ((IntermediateRecEdge) o).canEqual(this) && super.equals(o); + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof IntermediateRecEdge; + } +} diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 620918c41..876e8177e 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -33,6 +33,81 @@ module tmp.Test; // TODO: port forwarding version of P2 -- funny case of "session" persisting over full disconnect, should/how to correlate? + +// FIXME: good.liveness.Test02, reachability check (empty rec projection) + + + +//* +global protocol Proto1(role A, role B) +{ + rec X + { + 1() from A to B; + choice at A + { + rec Y + { + 0() from A to B; + //do Proto1(A, B); + continue X; + } + } + } +} +//*/ + + + +/* +global protocol Proto1(role A, role B) +{ + choice at A + { + rec X + { + 1() from A to B; + continue X; + } + } +} +//*/ + + +/* +global protocol Proto1(role A, role B) +{ + 1() from A to B; + choice at A + { + do Proto1Aux(A, B); + //do Proto1(A, B); + } + //or + //{ + // do Proto1Aux2(A, B); + //} + //or + //{ + // 2() from A to B; + //} +} + +aux global protocol Proto1Aux(role A, role B) +{ + 0() from A to B; + do Proto1(A, B); + //do Proto1Aux(A, B); +} + +//global protocol Proto1Aux2(role A, role B) +//{ +// 3() from A to B; +// do Proto1Aux2(A, B); +//} +//*/ + + /* global protocol Proto1(role A, role B) { From cb8e53cdc78cd1d5ba3d370a7e5aae37674bc7b6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 15 Mar 2019 09:37:08 +0000 Subject: [PATCH 113/539] Minor. --- .../model/endpoint/EGraphBuilderUtil2.java | 3 ++ scribble-test/src/test/scrib/tmp/Test.scr | 28 +++++++++---------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java index a0ba2030f..c81c9a0f4 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java @@ -470,6 +470,9 @@ protected void fixContinueEdges(Set seen, Map clones, } else if (a instanceof IntermediateRecEdge) { + // TODO FIXME: won't handle deeper nesting of int-rev-edges -- need to keep int-rec-edge if succ is from futher out than parent level + // So need to record recvars as a stack of Maps + addEdgeAux(clone, ((IntermediateRecEdge) a).action, this.outerRecvars.get(origSucc.getLabels().iterator().next())); // N.B. no recursive call, i.e., don't follow intermediate rec edge successors diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 876e8177e..36f4d9fa7 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -38,7 +38,7 @@ module tmp.Test; -//* +/* global protocol Proto1(role A, role B) { rec X @@ -83,14 +83,14 @@ global protocol Proto1(role A, role B) do Proto1Aux(A, B); //do Proto1(A, B); } - //or - //{ - // do Proto1Aux2(A, B); - //} - //or - //{ - // 2() from A to B; - //} + or + { + do Proto1Aux2(A, B); + } + or + { + 2() from A to B; + } } aux global protocol Proto1Aux(role A, role B) @@ -100,11 +100,11 @@ aux global protocol Proto1Aux(role A, role B) //do Proto1Aux(A, B); } -//global protocol Proto1Aux2(role A, role B) -//{ -// 3() from A to B; -// do Proto1Aux2(A, B); -//} +global protocol Proto1Aux2(role A, role B) +{ + 3() from A to B; + do Proto1Aux2(A, B); +} //*/ From 17a92e501535026c19b8e25321df013ec57bc55c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 15 Mar 2019 09:56:50 +0000 Subject: [PATCH 114/539] Continued: fixed GRecursion project bug. --- .../main/java/org/scribble/lang/global/GRecursion.java | 3 ++- .../src/main/java/org/scribble/lang/local/LChoice.java | 2 -- .../src/main/java/org/scribble/lang/local/LContinue.java | 7 ++++--- .../src/main/java/org/scribble/lang/local/LSeq.java | 8 ++++++-- .../org/scribble/model/endpoint/EGraphBuilderUtil2.java | 5 +++-- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java index 63fc82116..4c9ebe467 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java @@ -9,6 +9,7 @@ import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.LContinue; import org.scribble.lang.local.LRecursion; import org.scribble.lang.local.LSeq; import org.scribble.lang.local.LSkip; @@ -66,7 +67,7 @@ public LType project(Role self) { LSeq body = this.body.project(self); if (body.isEmpty() - || (body.elems.size() == 1 && (body.elems.get(0) instanceof RecVar))) + || (body.elems.size() == 1 && (body.elems.get(0) instanceof LContinue))) { return LSkip.SKIP; } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java index 8144d309e..a287cbd9a 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java @@ -80,8 +80,6 @@ public void buildGraph(EGraphBuilderUtil2 b) } else { - //HERE.. and fix -dotpng - first.buildGraph(b1); nested = b1.finalise(); b.setEntry(nested.term); // Must be non null diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java index 247ade2a6..c83b0fcc1 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java @@ -1,6 +1,7 @@ package org.scribble.lang.local; import java.util.HashSet; +import java.util.LinkedList; import java.util.Set; import org.scribble.ast.ProtocolKindNode; @@ -58,9 +59,9 @@ public void buildGraph(EGraphBuilderUtil2 b) // CHECKME: identical edges, i.e. same pred/prev/succ (e.g. rec X { choice at A { A->B:1 } or { A->B:1 } continue X; }) // Choice-guarded continue -- choice-unguarded continue detected and handled in LChoice EState curr = b.getEntry(); - for (EState pred : b.getPredecessors(curr)) // Does getAllSuccessors + for (EState pred : b.getAllPredecessors(curr)) // Does getAllSuccessors { - for (EAction a : pred.getAllActions()) + for (EAction a : new LinkedList<>(pred.getAllActions())) { try { @@ -68,7 +69,7 @@ public void buildGraph(EGraphBuilderUtil2 b) //b.addEdge(pred, a, entry); //b.addRecursionEdge(pred, prev, b.getRecursionEntry(this.recvar)); b.addRecursionEdge(pred, a, this.recvar); } - catch (ScribbleException e) // CHECKME + catch (ScribbleException e) // CHECKME: necessary for removeEdge to have throws? { throw new RuntimeException(e); } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java index 146fb06aa..fe3be4e4e 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java @@ -114,12 +114,16 @@ public void buildGraph(EGraphBuilderUtil2 b) public ReachabilityEnv checkReachability(ReachabilityEnv env) throws ScribbleException { + LType prev = null; + LType next = null; for (Iterator i = getElements().iterator(); i.hasNext(); ) { - LType next = i.next(); + prev = next; + next = i.next(); if (!env.isSeqable()) { - throw new ScribbleException("Illegal sequence to: " + next); + throw new ScribbleException( + "Illegal sequence: " + (prev == null ? "" : prev + "\n") + next); } env = next.checkReachability(env); } diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java index c81c9a0f4..17811ab3f 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java @@ -411,10 +411,11 @@ public EState getRecursionEntry(RecVar recvar) return this.recvars.get(recvar).peek(); } - public Set getPredecessors(EState s) + // Returns List, cf. getAllSucessors/Actions + public List getAllPredecessors(EState s) { return this.states.stream().filter(x -> x.getAllSuccessors().contains(s)) - .collect(Collectors.toSet()); + .collect(Collectors.toList()); } From e90a24609cb40a5214770dba9d968c2c79afad49 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 15 Mar 2019 16:59:34 +0000 Subject: [PATCH 115/539] Continued: refactored (removed) nested graph building. --- .../java/org/scribble/lang/local/LChoice.java | 39 +++++++++++++------ .../model/endpoint/EGraphBuilderUtil2.java | 6 +-- .../model/endpoint/IntermediateRecEdge.java | 1 + scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java index a287cbd9a..c43ac5af4 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java @@ -1,5 +1,6 @@ package org.scribble.lang.local; +import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Set; @@ -10,7 +11,6 @@ import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; -import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -69,34 +69,51 @@ public void buildGraph(EGraphBuilderUtil2 b) LType first = elems.get(0); if (first instanceof LRecursion) // CHECKME: do this here? refactor into builderutil? { - EGraphBuilderUtil2 b1 = new EGraphBuilderUtil2(b); + //EGraphBuilderUtil2 b1 = new EGraphBuilderUtil2(b); // "Inherits" b.recvars, for continue edge building (to "outer" recs) - EGraph nested; + //EGraph nested; + EState entry = b.getEntry(); + EState exit = b.getExit(); + + EState nestedEntry = b.newState(Collections.emptySet()); + b.setEntry(nestedEntry); if (elems.size() == 1) { - b1.setExit(b.getExit()); + /*b1.setExit(b.getExit()); first.buildGraph(b1); - nested = b1.finalise(); + nested = b1.finalise();*/ + first.buildGraph(b); } else { - first.buildGraph(b1); - nested = b1.finalise(); - b.setEntry(nested.term); // Must be non null + //.. HERE reuse existing b for nested (set entry/exit), and fix module imports and FQ names + + /*first.buildGraph(b1); + nested = b1.finalise();*/ + EState nestedExit = b.newState(Collections.emptySet()); + b.setExit(nestedExit); + first.buildGraph(b); + + b.setEntry(nestedExit); // Must be non null + b.setExit(exit); LSeq tail = new LSeq(null, elems.subList(1, elems.size())); tail.buildGraph(b); } - EState init = nested.init; - //for (EAction a : first.getEnabling()) + //EState init = nested.init; + EState init = nestedEntry; + ////for (EAction a : first.getEnabling()) for (EAction a : (Iterable) init.getAllActions().stream().distinct()::iterator) // Enabling actions { for (EState s : init.getSuccessors(a)) { - b.addEdge(b.getEntry(), a, s); + b.addEdge(entry, a, s); } } + + b.setEntry(entry); + b.setExit(exit); } else if (first instanceof LContinue) { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java index 17811ab3f..5669cb0a2 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java @@ -61,7 +61,7 @@ public EGraphBuilderUtil2(EModelFactory ef) //reset(); } - // FIXME: cannot be reused for different protos, because of recvars and clear/reset + /*// FIXME: cannot be reused for different protos, because of recvars and clear/reset // CHECKME: refactor as factory method? (e.g., push?) public EGraphBuilderUtil2(EGraphBuilderUtil2 b) { @@ -71,7 +71,7 @@ public EGraphBuilderUtil2(EGraphBuilderUtil2 b) this.outerRecvars.put(x.getKey(), x.getValue())); b.recvars.entrySet().forEach(x -> this.outerRecvars.put(x.getKey(), x.getValue().peek())); - } + }*/ // N.B. must be called before every "new visit", including first // FIXME: now cannot be reused for different protos, because of recvars and clear/reset @@ -356,7 +356,7 @@ public void addRecursionEdge(EState s, EAction a, RecVar rv) EState entry = getRecursionEntry(rv); addEdge(s, a, entry); } - else + else // FIXME: should now be obsolete { addEdgeAux(s, new IntermediateRecEdge(this.ef, a, rv), newState(Stream.of(rv).collect(Collectors.toSet()))); diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java b/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java index 5458fb25a..bf090a024 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java @@ -9,6 +9,7 @@ import org.scribble.type.name.Role; // FIXME rename better (it's an "external rec" continue edge) +@Deprecated class IntermediateRecEdge extends EAction { public final EAction action; diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 36f4d9fa7..bd1ee6db3 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -38,7 +38,7 @@ module tmp.Test; -/* +//* global protocol Proto1(role A, role B) { rec X From eaa5f1fec98a75fc4b69074aefa7246d5740176b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 15 Mar 2019 17:17:12 +0000 Subject: [PATCH 116/539] Continued: fixed direct-continue-edge graph building bug for non-det actions. --- .../org/scribble/lang/local/LContinue.java | 24 ++++++++++++------- .../model/endpoint/EGraphBuilderUtil2.java | 2 +- scribble-test/src/test/scrib/tmp/Test.scr | 20 ++++++++++++++++ 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java index c83b0fcc1..d98030f12 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java @@ -63,15 +63,23 @@ public void buildGraph(EGraphBuilderUtil2 b) { for (EAction a : new LinkedList<>(pred.getAllActions())) { - try + // Following is because pred.getSuccessor doesn't support non-det edges + // FIXME: refactor actions/successor Lists in MState to list of edges? + for (EState succ : pred.getSuccessors(a)) { - b.removeEdge(pred, a, curr); //b.removeEdgeFromPredecessor(pred, prev); - //b.addEdge(pred, a, entry); //b.addRecursionEdge(pred, prev, b.getRecursionEntry(this.recvar)); - b.addRecursionEdge(pred, a, this.recvar); - } - catch (ScribbleException e) // CHECKME: necessary for removeEdge to have throws? - { - throw new RuntimeException(e); + if (succ.equals(curr)) + { + try + { + b.removeEdge(pred, a, curr); //b.removeEdgeFromPredecessor(pred, prev); + //b.addEdge(pred, a, entry); //b.addRecursionEdge(pred, prev, b.getRecursionEntry(this.recvar)); + b.addRecursionEdge(pred, a, this.recvar); + } + catch (ScribbleException e) // CHECKME: necessary for removeEdge to have throws? + { + throw new RuntimeException(e); + } + } } } } diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java index 5669cb0a2..4609caa01 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java @@ -40,7 +40,7 @@ public class EGraphBuilderUtil2 { public final EModelFactory ef; // N.B. new states should be made by this.newState, not this.ef.newEState - private final Map outerRecvars = new HashMap<>(); + private final Map outerRecvars = new HashMap<>(); // FIXME: deprecate private final Map> recvars = new HashMap<>(); // CHECKME: Deque is for shadowing? // First action(s) inside a rec scope ("enacting" means how to enact an unguarded choice-continue) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index bd1ee6db3..2e937e0c3 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -40,6 +40,26 @@ module tmp.Test; //* global protocol Proto1(role A, role B) +{ + rec X + { + 1() from A to B; + choice at A + { + continue X; + } + or + { + 2() from A to B; + continue X; + } + } +} +//*/ + + +/* +global protocol Proto1(role A, role B) { rec X { From e93bb330a23308641717184fcd4c66fa65a8d459 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 15 Mar 2019 17:27:39 +0000 Subject: [PATCH 117/539] Continued: fixed gprotocolnamenode parsing to compound names. --- .../main/antlr3/org/scribble/parser/antlr/Scribble.g | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 937f1fe6f..73dec5e1c 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -358,7 +358,8 @@ simplemessagesignaturename: simplename; simpleprotocolname: simplename; simplemembername: simplename; // Only for member declarations -gprotocolname: simplename; +// FIXME TODO: do for all other relevant names +//gprotocolname: simplename; qualifiedname: @@ -551,10 +552,13 @@ globalprotocolheader: // GLOBAL_KW PROTOCOL_KW simpleprotocolname parameterdecllist roledecllist gprotocolnamenode: - gprotocolname --> - ^(GPROTOCOLNAME gprotocolname) + IDENTIFIER ('.' IDENTIFIER)* + -> + ^(GPROTOCOLNAME IDENTIFIER+) ; +/* gprotocolname +-> + ^(GPROTOCOLNAME gprotocolname)*/ roledecllist: '(' roledecl (',' roledecl)* ')' From b6e1df31781601e8c59fa4c84fd743f75c2a51dc Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 16 Mar 2019 15:20:50 +0000 Subject: [PATCH 118/539] Continued: refactoring type/sig decls and params. --- .../java/org/scribble/ast/AstFactoryImpl.java | 6 +- .../java/org/scribble/ast/DataTypeDecl.java | 39 ++++------ .../java/org/scribble/ast/DelDecorator.java | 6 +- .../org/scribble/ast/DelDecoratorImpl.java | 51 +++++++++---- .../org/scribble/ast/HeaderParamDecl.java | 7 +- .../java/org/scribble/ast/ImportDecl.java | 10 +-- .../org/scribble/ast/MessageSigNameDecl.java | 39 ++++------ .../java/org/scribble/ast/NameDeclNode.java | 2 +- .../org/scribble/ast/NonProtocolDecl.java | 75 ++++++++++++------- .../org/scribble/ast/NonRoleParamDecl.java | 29 ++++--- .../org/scribble/ast/ProtocolModList.java | 5 +- .../main/java/org/scribble/ast/RoleArg.java | 1 + .../java/org/scribble/ast/SigParamDecl.java | 65 ++++++++++++++++ .../java/org/scribble/ast/TypeParamDecl.java | 65 ++++++++++++++++ .../ast/name/simple/AmbigNameNode.java | 1 + .../visit/context/ModuleContextBuilder.java | 1 + .../org/scribble/parser/antlr/Scribble.g | 71 ++++++++++++++---- .../parser/scribble/ScribTreeAdaptor.java | 21 +++++- 18 files changed, 358 insertions(+), 136 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/ast/SigParamDecl.java create mode 100644 scribble-core/src/main/java/org/scribble/ast/TypeParamDecl.java diff --git a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java index 03f008006..4a059bc61 100644 --- a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -71,7 +71,6 @@ import org.scribble.del.ImportModuleDel; import org.scribble.del.ModuleDel; import org.scribble.del.NonRoleArgListDel; -import org.scribble.del.NonRoleParamDeclDel; import org.scribble.del.NonRoleParamDeclListDel; import org.scribble.del.RoleArgListDel; import org.scribble.del.RoleDeclDel; @@ -316,9 +315,10 @@ public NonRoleParamDeclList NonRoleParamDeclList(CommonTree source, public NonRoleParamDecl NonRoleParamDecl( CommonTree source, K kind, NonRoleParamNode namenode) { - NonRoleParamDecl pd = new NonRoleParamDecl(source, kind, namenode); + /*NonRoleParamDecl pd = new NonRoleParamDecl(source, kind, namenode); pd = del(pd, new NonRoleParamDeclDel()); - return pd; + return pd;*/ + throw new RuntimeException("Deprecated"); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/DataTypeDecl.java b/scribble-core/src/main/java/org/scribble/ast/DataTypeDecl.java index 326ab8336..49e1c9ddf 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DataTypeDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/DataTypeDecl.java @@ -23,36 +23,29 @@ public class DataTypeDecl extends NonProtocolDecl { // ScribTreeAdaptor#create constructor - public DataTypeDecl(Token payload, String schema, String extName, - String extSource) + public DataTypeDecl(Token payload) { - super(payload, schema, extName, extSource); + super(payload); } // Tree#dupNode constructor - protected DataTypeDecl(DataTypeDecl node, String schema, String extName, - String extSource) + protected DataTypeDecl(DataTypeDecl node) { - super(node, schema, extName, extSource); + super(node); } // Cf. CommonTree#dupNode @Override public DataTypeDecl dupNode() { - return new DataTypeDecl(this, this.schema, this.extName, this.extSource); + return new DataTypeDecl(this); } - /*@Override - public DataTypeDecl reconstruct(String schema, String extName, String extSource, //MemberNameNode name) - NameNode name) + @Override + public DataTypeNode getNameNodeChild() { - DataTypeDecl dtd = dupNode(); - ScribDel del = del(); - dtd.addChild(getNameNode()); - dtd.setDel(del); - return dtd; - }*/ + return (DataTypeNode) getRawNameNodeChild(); + } @Override public boolean isDataTypeDecl() @@ -60,12 +53,6 @@ public boolean isDataTypeDecl() return true; } - @Override - public DataTypeNode getNameNodeChild() - { - return (DataTypeNode) getRawNameNodeChild(); - } - // Simple name (ModuleDecl is the only NameDeclNode that uses qualified names) @Override public DataType getDeclName() @@ -83,9 +70,11 @@ public DataType getFullMemberName(Module mod) @Override public String toString() { - return Constants.TYPE_KW + " <" + this.schema + "> " + this.extName - + " " + Constants.FROM_KW + " " + this.extSource + " " - + Constants.AS_KW + " " + getDeclName() + ";"; + return Constants.TYPE_KW + " <" + getSchemaNodeChild() + "> " + + getExtNameNodeChild() + " " + + Constants.FROM_KW + " " + getExtSourceNodeChild() + " " + + Constants.AS_KW + " " + getDeclName() + + ";"; } diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java b/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java index ec984fa4e..85d030c64 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java @@ -45,8 +45,8 @@ public interface DelDecorator void ModuleDecl(ModuleDecl md); void ImportModule(ImportModule im); - /*MessageSigNameDecl MessageSigNameDecl(MessageSigNameDecl md); - DataTypeDecl DataTypeDecl(DataTypeDecl dd);*/ + void MessageSigNameDecl(MessageSigNameDecl sd); + void DataTypeDecl(DataTypeDecl td); void GProtocolDecl(GProtocolDecl gpd); void ProtocolModList(ProtocolModList mods); @@ -56,6 +56,8 @@ public interface DelDecorator void RoleDecl(RoleDecl rd); void NonRoleParamDeclList(NonRoleParamDeclList pds); // NonRoleParamDecl NonRoleParamDecl(CommonTree source, K kind, NonRoleParamNode name); + void TypeDecl(TypeParamDecl td); + void SigDecl(SigParamDecl sd); void GProtocolDef(GProtocolDef gpd); void GProtocolBlock(GProtocolBlock gpb); diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java index a8c5819a7..5c2f1f0b4 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java @@ -38,6 +38,7 @@ import org.scribble.del.ImportModuleDel; import org.scribble.del.ModuleDel; import org.scribble.del.NonRoleArgListDel; +import org.scribble.del.NonRoleParamDeclDel; import org.scribble.del.NonRoleParamDeclListDel; import org.scribble.del.RoleArgListDel; import org.scribble.del.RoleDeclDel; @@ -58,6 +59,7 @@ import org.scribble.del.name.RoleNodeDel; +//FIXME TODO: refactor decoration methods into AST interface, to ensure they are implemented and called // In ast package to access protected non-defensive del setter public class DelDecoratorImpl implements DelDecorator { @@ -82,8 +84,12 @@ public void decorate(CommonTree n) //case IMPORTMODULE: - /*case MESSAGESIGNATUREDECL: return AntlrMessageSigDecl.parseMessageSigDecl(this, ct, af); - case PAYLOADTYPEDECL: return AntlrDataTypeDecl.parseDataTypeDecl(this, ct, af);*/ + case "MESSAGESIGNATUREDECL": //return AntlrMessageSigDecl.parseMessageSigDecl(this, ct, af); + MessageSigNameDecl((MessageSigNameDecl) n); + break; + case "PAYLOADTYPEDECL": //return AntlrDataTypeDecl.parseDataTypeDecl(this, ct, af);*/ + DataTypeDecl((DataTypeDecl) n); + break; case "GLOBALPROTOCOLDECL": GProtocolDecl((GProtocolDecl) n); @@ -108,7 +114,12 @@ public void decorate(CommonTree n) //case EMPTY_PARAMETERDECLLST: NonRoleParamDeclList((NonRoleParamDeclList) n); break; - //case PARAMETERDECL: return AntlrNonRoleParamDecl.parseNonRoleParamDecl(this, ct, af);*/ + case "TYPEDECL": + TypeDecl((TypeParamDecl) n); + break; + case "SIGDECL": + SigDecl((SigParamDecl) n); + break; case "GLOBALPROTOCOLDEF": GProtocolDef((GProtocolDef) n); @@ -162,6 +173,12 @@ public void decorate(CommonTree n) case "ROLENAME": RoleNode((RoleNode) n); break; + case "TYPENAME": + DataTypeNode((DataTypeNode) n); + break; + case "SIGNAME": + MessageSigNameNode((MessageSigNameNode) n); + break; case "RECURSIONVAR": RecVarNode((RecVarNode) n); break; @@ -222,21 +239,17 @@ public void ImportModule(ImportModule im) setDel(im, new ImportModuleDel()); } - /*@Override - public MessageSigNameDecl MessageSigNameDecl(CommonTree source, String schema, String extName, String extSource, MessageSigNameNode alias) + @Override + public void MessageSigNameDecl(MessageSigNameDecl sd) { - MessageSigNameDecl msd = new MessageSigNameDecl(source, schema, extName, extSource, alias); - msd = setDel(msd, createDefaultDelegate()); - return msd; + setDel(sd, createDefaultDelegate()); } @Override - public DataTypeDecl DataTypeDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode alias) + public void DataTypeDecl(DataTypeDecl td) { - DataTypeDecl dtd = new DataTypeDecl(source, schema, extName, extSource, alias); - dtd = setDel(dtd, createDefaultDelegate()); - return dtd; - }*/ + setDel(td, createDefaultDelegate()); + } @Override public void GProtocolDecl(GProtocolDecl gpd) @@ -282,6 +295,18 @@ public NonRoleParamDecl NonRoleParamDecl(CommonT return pd; }*/ + @Override + public void TypeDecl(TypeParamDecl td) + { + setDel(td, new NonRoleParamDeclDel()); + } + + @Override + public void SigDecl(SigParamDecl sd) + { + setDel(sd, new NonRoleParamDeclDel()); + } + @Override public void GProtocolDef(GProtocolDef gpd) { diff --git a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java index 4bbdc2498..df2ffad08 100644 --- a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java @@ -15,6 +15,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.name.NameNode; import org.scribble.ast.name.simple.SimpleNameNode; import org.scribble.del.ScribDel; import org.scribble.job.ScribbleException; @@ -40,11 +41,11 @@ public HeaderParamDecl(HeaderParamDecl node) } @Override - public abstract SimpleNameNode getNameNodeChild(); + public abstract NameNode getNameNodeChild(); // Always a "simple" name (e.g., like Role), but Type/Sig names are not SimpleNames public abstract HeaderParamDecl dupNode(); - public HeaderParamDecl reconstruct(SimpleNameNode name) + public HeaderParamDecl reconstruct(NameNode name) // Always a "simple" name (e.g., like Role), but Type/Sig names are not SimpleNames { HeaderParamDecl pd = dupNode(); ScribDel del = del(); @@ -57,7 +58,7 @@ public HeaderParamDecl reconstruct(SimpleNameNode name) public HeaderParamDecl visitChildren(AstVisitor nv) throws ScribbleException { - SimpleNameNode name = + NameNode name = visitChildWithClassEqualityCheck(this, getNameNodeChild(), nv); return reconstruct(name); } diff --git a/scribble-core/src/main/java/org/scribble/ast/ImportDecl.java b/scribble-core/src/main/java/org/scribble/ast/ImportDecl.java index 6904a2cc9..0ee064f76 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ImportDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/ImportDecl.java @@ -42,11 +42,6 @@ protected ImportDecl(ImportDecl node) public abstract Name getAlias(); //public abstract Name getVisibleName(); - public boolean isImportModule() - { - return false; - } - public ModuleNameNode getModuleNameNodeChild() { return (ModuleNameNode) getChild(0); @@ -57,6 +52,11 @@ public ModuleNameNode getAliasNameNodeChild() return (ModuleNameNode) getChild(1); } + public boolean isImportModule() + { + return false; + } + public boolean isAliased() { //return this.alias != null; diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageSigNameDecl.java b/scribble-core/src/main/java/org/scribble/ast/MessageSigNameDecl.java index f30cce66d..91bc0bf7f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageSigNameDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/MessageSigNameDecl.java @@ -23,47 +23,34 @@ public class MessageSigNameDecl extends NonProtocolDecl { // ScribTreeAdaptor#create constructor - public MessageSigNameDecl(Token payload, String schema, String extName, - String extSource) + public MessageSigNameDecl(Token payload) { - super(payload, schema, extName, extSource); + super(payload); } // Tree#dupNode constructor - protected MessageSigNameDecl(MessageSigNameDecl node, String schema, - String extName, String extSource) + protected MessageSigNameDecl(MessageSigNameDecl node) { - super(node, schema, extName, extSource); + super(node); } // Cf. CommonTree#dupNode @Override public MessageSigNameDecl dupNode() { - return new MessageSigNameDecl(this, this.schema, this.extName, - this.extSource); + return new MessageSigNameDecl(this); } - - /*@Override - public MessageSigNameDecl reconstruct(String schema, String extName, String extSource, //MemberNameNode name) - NameNode name) - { - ScribDel del = del(); - MessageSigNameDecl msnd = new MessageSigNameDecl(this.source, schema, extName, extSource, (MessageSigNameNode) name); - msnd = (MessageSigNameDecl) msnd.del(del); - return msnd; - }*/ @Override - public boolean isMessageSigNameDecl() + public MessageSigNameNode getNameNodeChild() { - return true; + return (MessageSigNameNode) getRawNameNodeChild(); } @Override - public MessageSigNameNode getNameNodeChild() + public boolean isMessageSigNameDecl() { - return (MessageSigNameNode) getRawNameNodeChild(); + return true; } @Override @@ -82,9 +69,11 @@ public MessageSigName getFullMemberName(Module mod) @Override public String toString() { - return Constants.SIG_KW + " <" + this.schema + "> \"" + this.extName - + "\" " + Constants.FROM_KW + " \"" + this.extSource + "\" " - + Constants.AS_KW + " " + getDeclName() + ";"; + return Constants.SIG_KW + " <" + getSchemaNodeChild() + "> " + + getExtNameNodeChild() + " " + + Constants.FROM_KW + " " + getExtSourceNodeChild() + " " + + Constants.AS_KW + " " + getDeclName() + + ";"; } diff --git a/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java b/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java index 2a685abc1..c56fbc165 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java @@ -41,7 +41,7 @@ protected final NameNode getRawNameNodeChild() { throw new RuntimeException("Shouldn't get in here: " + getClass()); } - NameNode name = (NameNode) getChild(0); + NameNode name = (NameNode) getChild(0); // CHECKME: currently always AmbigNameNode? return name; } diff --git a/scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java index 48388c861..f3ca19213 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java @@ -16,6 +16,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; +import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.del.ScribDel; import org.scribble.job.ScribbleException; import org.scribble.type.kind.NonProtocolKind; @@ -25,28 +26,39 @@ public abstract class NonProtocolDecl extends NameDeclNode implements ModuleMember { - public final String schema; - public final String extName; - public final String extSource; - // ScribTreeAdaptor#create constructor - public NonProtocolDecl(Token payload, String schema, String extName, - String extSource) + public NonProtocolDecl(Token payload) { super(payload); - this.schema = schema; - this.extName = extName; - this.extSource = extSource; + this.schema = null; + this.extName = null; + this.extSource = null; } // Tree#dupNode constructor - protected NonProtocolDecl(NonProtocolDecl node, String schema, - String extName, String extSource) + protected NonProtocolDecl(NonProtocolDecl node) { super(node); - this.schema = schema; - this.extName = extName; - this.extSource = extSource; + this.schema = null; + this.extName = null; + this.extSource = null; + } + + public abstract NonProtocolDecl dupNode(); + + public AmbigNameNode getSchemaNodeChild() + { + return (AmbigNameNode) getChild(1); + } + + public AmbigNameNode getExtNameNodeChild() + { + return (AmbigNameNode) getChild(2); + } + + public AmbigNameNode getExtSourceNodeChild() + { + return (AmbigNameNode) getChild(3); } // CHECKME: maybe move to ModuleMember @@ -60,27 +72,34 @@ public boolean isMessageSigNameDecl() return false; } - public abstract NonProtocolDecl dupNode(); - - public NonProtocolDecl reconstruct(String schema, String extName, - String source, // MemberNameNode name); - NameNode name) + public NonProtocolDecl reconstruct( + NameNode name, + //String schema, String extName, String source, + AmbigNameNode schema, AmbigNameNode extName, AmbigNameNode extSource) // FIXME: { - NonProtocolDecl dtd = dupNode(); + NonProtocolDecl npd = dupNode(); ScribDel del = del(); - dtd.addChild(getNameNodeChild()); - dtd.setDel(del); - return dtd; + npd.addChild(name); + npd.addChild(schema); + npd.addChild(extName); + npd.addChild(extSource); + npd.setDel(del); // No copy + return npd; } @Override public NonProtocolDecl visitChildren(AstVisitor nv) throws ScribbleException { - //MemberNameNode name = (MemberNameNode) visitChildWithClassEqualityCheck(this, this.name, nv); NameNode name = (NameNode) visitChildWithClassEqualityCheck(this, getNameNodeChild(), nv); - return reconstruct(this.schema, this.extName, this.extSource, name); + AmbigNameNode schema = //(AmbigNameNode) visitChildWithClassEqualityCheck(this, getSchemaNodeChild(), nv); + getSchemaNodeChild(); // AmbigNameNode currently have no del, so not visited + AmbigNameNode extName = //(AmbigNameNode) visitChildWithClassEqualityCheck(this, getExtNameNodeChild(), nv); + getExtNameNodeChild(); + AmbigNameNode extSource = //(AmbigNameNode) visitChildWithClassEqualityCheck(this, getExtSourceNodeChild(), nv); + getExtNameNodeChild(); + return reconstruct(name, schema, extName, extSource); } @@ -91,8 +110,14 @@ public NonProtocolDecl visitChildren(AstVisitor nv) + + + + public final String schema; + public final String extName; + public final String extSource; public NonProtocolDecl(CommonTree source, String schema, String extName, String extSource, // MemberNameNode name); diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java index 7d8c94c4f..c6e2249e9 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java @@ -15,21 +15,18 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.name.NameNode; import org.scribble.ast.name.simple.NonRoleParamNode; -import org.scribble.type.kind.DataTypeKind; -import org.scribble.type.kind.Local; import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.kind.SigKind; import org.scribble.type.name.Name; -import org.scribble.type.name.Role; // TODO: make concrete subclasses to "eliminate" generic parameter (e.g., for better child casting, etc.) -public class NonRoleParamDecl +public abstract class NonRoleParamDecl extends HeaderParamDecl { public final K kind; // CHECKME: factor up to super? + //..HERE make this abstract with concrete type/sig subclasses -- and fix parser accordingly + // ScribTreeAdaptor#create constructor public NonRoleParamDecl(Token t, K kind) { @@ -38,19 +35,19 @@ public NonRoleParamDecl(Token t, K kind) } // Tree#dupNode constructor - public NonRoleParamDecl(NonRoleParamDecl node, K kind) + public NonRoleParamDecl(NonRoleParamDecl node) { super(node); - this.kind = kind; + this.kind = node.kind; } - @Override + /*@Override public NonRoleParamDecl dupNode() { return new NonRoleParamDecl<>(this, this.kind); - } + }*/ - @Override + /*@Override public NonRoleParamNode getNameNodeChild() { NameNode raw = getRawNameNodeChild(); @@ -63,16 +60,16 @@ public NonRoleParamNode getNameNodeChild() return cast; } throw new RuntimeException("Shouldn't get in here: " + this.kind); - } + }*/ - @Override + /*@Override public NonRoleParamDecl project(AstFactory af, Role self) { NonRoleParamNode child = getNameNodeChild(); NonRoleParamNode pn = af.NonRoleParamNode(child.source, this.kind, child.toString()); return af.NonRoleParamDecl(this.source, this.kind, pn); - } + }*/ @Override public Name getDeclName() @@ -80,7 +77,7 @@ public Name getDeclName() return getNameNodeChild().toName(); } - @Override + /*@Override public String getKeyword() { if (this.kind.equals(SigKind.KIND)) @@ -95,7 +92,7 @@ else if (this.kind.equals(DataTypeKind.KIND)) { throw new RuntimeException("Shouldn't get in here: " + this.kind); } - } + }*/ diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java index df127abfd..236fcf1a0 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java @@ -39,13 +39,14 @@ protected ProtocolModList(ProtocolModList node) @Override public ProtocolModList dupNode() { - return new ProtocolModList(this); + //return new ProtocolModList(this); // Doesn't include children? + return this; } @Override public ProtocolModList visitChildren(AstVisitor nv) throws ScribbleException { - // CHECKME: + // CHECKME: no child visiting, no reconstruct? return this; } diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleArg.java b/scribble-core/src/main/java/org/scribble/ast/RoleArg.java index 565168794..cd0c02690 100644 --- a/scribble-core/src/main/java/org/scribble/ast/RoleArg.java +++ b/scribble-core/src/main/java/org/scribble/ast/RoleArg.java @@ -19,6 +19,7 @@ import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; +// CHECKME: can this be simplified to an interface? (also NonRoleArg) public class RoleArg extends DoArg { // ScribTreeAdaptor#create constructor diff --git a/scribble-core/src/main/java/org/scribble/ast/SigParamDecl.java b/scribble-core/src/main/java/org/scribble/ast/SigParamDecl.java new file mode 100644 index 000000000..78a73ba9d --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/ast/SigParamDecl.java @@ -0,0 +1,65 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast; + +import org.antlr.runtime.Token; +import org.scribble.ast.name.qualified.MessageSigNameNode; +import org.scribble.type.kind.SigKind; +import org.scribble.type.name.Name; +import org.scribble.type.name.Role; + +public class SigParamDecl extends NonRoleParamDecl +{ + // ScribTreeAdaptor#create constructor + public SigParamDecl(Token t) + { + super(t, SigKind.KIND); + } + + // Tree#dupNode constructor + public SigParamDecl(SigParamDecl node) + { + super(node); + } + + @Override + public SigParamDecl dupNode() + { + return new SigParamDecl(this); + } + + @Override + public MessageSigNameNode getNameNodeChild() + { + return (MessageSigNameNode) getRawNameNodeChild(); // CHECKME: make Type/Sig(Param)Node? + } + + @Override + public SigParamDecl project(AstFactory af, Role self) + { + return dupNode(); + } + + @Override + public Name getDeclName() + { + return getNameNodeChild().toName(); + } + + @Override + public String getKeyword() + { + return Constants.SIG_KW; + } +} diff --git a/scribble-core/src/main/java/org/scribble/ast/TypeParamDecl.java b/scribble-core/src/main/java/org/scribble/ast/TypeParamDecl.java new file mode 100644 index 000000000..f71582cd0 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/ast/TypeParamDecl.java @@ -0,0 +1,65 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast; + +import org.antlr.runtime.Token; +import org.scribble.ast.name.qualified.DataTypeNode; +import org.scribble.type.kind.DataTypeKind; +import org.scribble.type.name.Name; +import org.scribble.type.name.Role; + +public class TypeParamDecl extends NonRoleParamDecl +{ + // ScribTreeAdaptor#create constructor + public TypeParamDecl(Token t) + { + super(t, DataTypeKind.KIND); + } + + // Tree#dupNode constructor + public TypeParamDecl(TypeParamDecl node) + { + super(node); + } + + @Override + public TypeParamDecl dupNode() + { + return new TypeParamDecl(this); + } + + @Override + public DataTypeNode getNameNodeChild() + { + return (DataTypeNode) getRawNameNodeChild(); // CHECKME: make Type/SigParamNode? + } + + @Override + public TypeParamDecl project(AstFactory af, Role self) + { + return dupNode(); + } + + @Override + public Name getDeclName() + { + return getNameNodeChild().toName(); + } + + @Override + public String getKeyword() + { + return Constants.TYPE_KW; + } +} diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index 9bb4f7ed6..ecba51314 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -26,6 +26,7 @@ import org.scribble.type.name.AmbigName; import org.scribble.type.name.PayloadElemType; +// N.B. no del attached, so not currently visited // Primitive payload type, MessageSigName or parameter names only: if name is parsed as a CompoundNameNodes, it must be a payload type (not ambiguous in this case) // No counterpart needed for MessageNode because MessageSignature values can be syntactically distinguished from sig parameters //public class AmbigNameNode extends SimpleNameNode implements MessageNode, PayloadElemNameNode diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java index cd3fd8712..c9f228e23 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java @@ -32,6 +32,7 @@ public ModuleContextBuilder(Job job) @Override protected void enter(ScribNode parent, ScribNode child) throws ScribbleException { + System.out.println("sss4: " + ((parent != null) ? parent.getClass() : "") + " ,, " + child.getClass()); child.del().enterModuleContextBuilding(parent, child, this); } diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 73dec5e1c..890ddff37 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -125,11 +125,13 @@ tokens ROLEDECLLIST = 'ROLEDECLLIST'; ROLEDECL = 'ROLEDECL'; PARAMETERDECLLIST = 'PARAMETERDECLLIST'; - PARAMETERDECL = 'PARAMETERDECL'; + //PARAMETERDECL = 'PARAMETERDECL'; + TYPEDECL = 'TYPEDECL'; + SIGDECL = 'SIGDECL'; ROLEINSTANTIATIONLIST = 'ROLEINSTANTIATIONLIST'; ROLEINSTANTIATION = 'ROLEINSTANTIATION'; // FIXME: not consistent with arginstas/payloadeles ARGUMENTINSTANTIATIONLIST = 'ARGUMENTINSTANTIATIONLIST'; - //ARGUMENTINSTANTIATION = 'argument-instantiation'; + ARGUMENTINSTANTIATION = 'ARGUMENTINSTANTIATION'; //CONNECTDECL = 'connect-decl'; GLOBALPROTOCOLDECL = 'GLOBALPROTOCOLDECL'; @@ -149,9 +151,14 @@ tokens GPROTOCOLNAME = 'GPROTOCOLNAME'; ROLENAME = 'ROLENAME'; + TYPENAME = 'TYPENAME'; + SIGNAME = 'SIGNAME'; ID = 'ID'; OPNAME = 'OPNAME'; RECURSIONVAR = 'RECURSIONVAR'; + + TYPENAME = 'TYPENAME'; + SIGNAME = 'SIGNAME'; } @@ -353,8 +360,8 @@ ambiguousname: */ simplemodulename: simplename; -simplepayloadtypename: simplename; -simplemessagesignaturename: simplename; +//simplepayloadtypename: simplename; +//simplemessagesignaturename: simplename; simpleprotocolname: simplename; simplemembername: simplename; // Only for member declarations @@ -382,7 +389,13 @@ modulename: protocolname: membername; payloadtypename: membername; -messagesignaturename: membername; +//messagesignaturename: membername; + +messagesignaturename: + IDENTIFIER ('.' IDENTIFIER)* +-> + ^(SIGNAME IDENTIFIER+) +; /** @@ -450,13 +463,27 @@ datatypedecl: payloadtypedecl: TYPE_KW '<' IDENTIFIER '>' EXTIDENTIFIER FROM_KW EXTIDENTIFIER AS_KW simplepayloadtypename ';' -> - ^(PAYLOADTYPEDECL IDENTIFIER EXTIDENTIFIER EXTIDENTIFIER simplepayloadtypename) + ^(PAYLOADTYPEDECL simplepayloadtypename IDENTIFIER EXTIDENTIFIER EXTIDENTIFIER) +; +// alias first to be uniform with other NameDeclNode (getRawNameNodeChild) + +simplepayloadtypename: + IDENTIFIER +-> + ^(TYPENAME IDENTIFIER) // TODO factor out with typedecl? ; messagesignaturedecl: SIG_KW '<' IDENTIFIER '>' EXTIDENTIFIER FROM_KW EXTIDENTIFIER AS_KW simplemessagesignaturename ';' -> - ^(MESSAGESIGNATUREDECL IDENTIFIER EXTIDENTIFIER EXTIDENTIFIER simplemessagesignaturename) + ^(MESSAGESIGNATUREDECL simplemessagesignaturename IDENTIFIER EXTIDENTIFIER EXTIDENTIFIER) +; +// alias first to be uniform with other NameDeclNode (getRawNameNodeChild) + +simplemessagesignaturename: + IDENTIFIER +-> + ^(SIGNAME IDENTIFIER) // TODO factor out with sigdecl? ; @@ -579,13 +606,23 @@ parameterdecllist: ; parameterdecl: - TYPE_KW parametername --> - ^(PARAMETERDECL KIND_PAYLOADTYPE parametername) + typedecl | - SIG_KW parametername + sigdecl +; + +// cf. roledecl +typedecl: + TYPE_KW parametername +-> + ^(TYPEDECL ^(TYPENAME parametername)) +; + +// cf. roledecl +sigdecl: + SIG_KW parametername -> - ^(PARAMETERDECL KIND_MESSAGESIGNATURE parametername) + ^(SIGDECL ^(SIGNAME parametername)) ; @@ -658,11 +695,11 @@ rolenamenode: message: messagesignature +/* + ambiguousname // FIXME: qualified name*/ | - ambiguousname // FIXME: qualified name -/*| messagesignaturename // qualified messagesignaturename subsumes parametername case -| +/*| parametername*/ ; @@ -771,9 +808,13 @@ argumentinstantiation: //message // Grammatically same as message, but argument case can also be a payload type messagesignature +-> + ^(ARGUMENTINSTANTIATION messagesignature) /*| ambiguousname // As for payloadelement: parser doesn't distinguish simple from qualified properly, even with backtrack*/ | qualifiedname +-> + ^(ARGUMENTINSTANTIATION qualifiedname) ; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 81a1043f3..fd22c5cc1 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -2,9 +2,12 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTreeAdaptor; +import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.MessageSigNameDecl; import org.scribble.ast.MessageSigNode; import org.scribble.ast.Module; import org.scribble.ast.ModuleDecl; +import org.scribble.ast.NonRoleArg; import org.scribble.ast.NonRoleArgList; import org.scribble.ast.NonRoleParamDeclList; import org.scribble.ast.PayloadElemList; @@ -14,6 +17,8 @@ import org.scribble.ast.RoleDecl; import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScribNil; +import org.scribble.ast.SigParamDecl; +import org.scribble.ast.TypeParamDecl; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GContinue; import org.scribble.ast.global.GDo; @@ -24,7 +29,9 @@ import org.scribble.ast.global.GProtocolDef; import org.scribble.ast.global.GProtocolHeader; import org.scribble.ast.global.GRecursion; +import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.qualified.GProtocolNameNode; +import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.ast.name.simple.OpNode; @@ -78,6 +85,10 @@ public Object create(Token t) return new ModuleNameNode(t); /*.. HERE ambigname -- or qualifiedname? (ambigname currently singleton name) -- or modulename just as identifiers? -- ANTLR uses every (leaf) token as singleton node -- AntlrTokenTree? -- i.e. CommonTree (wrapper for Token)*/ + case "PAYLOADTYPEDECL": + return new DataTypeDecl(t); + case "MESSAGESIGNATUREDECL": + return new MessageSigNameDecl(t); case "GLOBALPROTOCOLDECL": //return this.f.GProtocolDecl(empty, Collections.emptyList(), null, null); return new GProtocolDecl(t); @@ -95,6 +106,14 @@ public Object create(Token t) return new RoleNode(t); case "PARAMETERDECLLIST": //return this.f.NonRoleParamDeclList(empty, Collections.emptyList()); return new NonRoleParamDeclList(t); + case "TYPEDECL": + return new TypeParamDecl(t); + case "TYPENAME": + return new DataTypeNode(t); + case "SIGDECL": + return new SigParamDecl(t); + case "SIGNAME": + return new MessageSigNameNode(t); case "GLOBALPROTOCOLDEF": //return this.f.GProtocolDef(empty, null); return new GProtocolDef(t); case "GLOBALPROTOCOLBLOCK": //return this.f.GProtocolBlock(empty, null); @@ -129,7 +148,7 @@ public Object create(Token t) case "ARGUMENTINSTANTIATIONLIST": return new NonRoleArgList(t); case "ARGUMENTINSTANTIATION": - throw new RuntimeException("TODO: " + t); + return new NonRoleArg(t); //return new MyCommonTree(t); // FIXME: placeholder for deleg, qualified or ambig //case "QUALIFIEDNAME": //return this.f.Q From 8d48b9caa9e17af9092ac0e7455de72e0c9926ec Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 16 Mar 2019 15:38:54 +0000 Subject: [PATCH 119/539] Continued: separated ambig names from identifiers. --- .../org/scribble/ast/NonProtocolDecl.java | 22 ++-- .../ast/name/simple/AmbigNameNode.java | 7 +- .../name/simple/DummyProjectionRoleNode.java | 2 +- .../org/scribble/ast/name/simple/IdNode.java | 105 ++++++++++++++++++ .../ast/name/simple/NonRoleParamNode.java | 2 +- .../org/scribble/ast/name/simple/OpNode.java | 2 +- .../scribble/ast/name/simple/RecVarNode.java | 2 +- .../scribble/ast/name/simple/RoleNode.java | 2 +- .../ast/name/simple/SimpleNameNode.java | 2 +- .../org/scribble/type/kind/AbstractKind.java | 10 +- .../java/org/scribble/type/kind/IdKind.java | 45 ++++++++ .../org/scribble/type/name/AmbigName.java | 2 +- .../org/scribble/type/name/Identifier.java | 54 +++++++++ .../parser/scribble/ScribTreeAdaptor.java | 4 +- 14 files changed, 232 insertions(+), 29 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/ast/name/simple/IdNode.java create mode 100644 scribble-core/src/main/java/org/scribble/type/kind/IdKind.java create mode 100644 scribble-core/src/main/java/org/scribble/type/name/Identifier.java diff --git a/scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java index f3ca19213..cb94d4114 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; -import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.IdNode; import org.scribble.del.ScribDel; import org.scribble.job.ScribbleException; import org.scribble.type.kind.NonProtocolKind; @@ -46,19 +46,19 @@ protected NonProtocolDecl(NonProtocolDecl node) public abstract NonProtocolDecl dupNode(); - public AmbigNameNode getSchemaNodeChild() + public IdNode getSchemaNodeChild() { - return (AmbigNameNode) getChild(1); + return (IdNode) getChild(1); } - public AmbigNameNode getExtNameNodeChild() + public IdNode getExtNameNodeChild() { - return (AmbigNameNode) getChild(2); + return (IdNode) getChild(2); } - public AmbigNameNode getExtSourceNodeChild() + public IdNode getExtSourceNodeChild() { - return (AmbigNameNode) getChild(3); + return (IdNode) getChild(3); } // CHECKME: maybe move to ModuleMember @@ -75,7 +75,7 @@ public boolean isMessageSigNameDecl() public NonProtocolDecl reconstruct( NameNode name, //String schema, String extName, String source, - AmbigNameNode schema, AmbigNameNode extName, AmbigNameNode extSource) // FIXME: + IdNode schema, IdNode extName, IdNode extSource) // FIXME: { NonProtocolDecl npd = dupNode(); ScribDel del = del(); @@ -93,11 +93,11 @@ public NonProtocolDecl visitChildren(AstVisitor nv) { NameNode name = (NameNode) visitChildWithClassEqualityCheck(this, getNameNodeChild(), nv); - AmbigNameNode schema = //(AmbigNameNode) visitChildWithClassEqualityCheck(this, getSchemaNodeChild(), nv); + IdNode schema = //(AmbigNameNode) visitChildWithClassEqualityCheck(this, getSchemaNodeChild(), nv); getSchemaNodeChild(); // AmbigNameNode currently have no del, so not visited - AmbigNameNode extName = //(AmbigNameNode) visitChildWithClassEqualityCheck(this, getExtNameNodeChild(), nv); + IdNode extName = //(AmbigNameNode) visitChildWithClassEqualityCheck(this, getExtNameNodeChild(), nv); getExtNameNodeChild(); - AmbigNameNode extSource = //(AmbigNameNode) visitChildWithClassEqualityCheck(this, getExtSourceNodeChild(), nv); + IdNode extSource = //(AmbigNameNode) visitChildWithClassEqualityCheck(this, getExtSourceNodeChild(), nv); getExtNameNodeChild(); return reconstruct(name, schema, extName, extSource); } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index ecba51314..7a5621320 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -26,7 +26,6 @@ import org.scribble.type.name.AmbigName; import org.scribble.type.name.PayloadElemType; -// N.B. no del attached, so not currently visited // Primitive payload type, MessageSigName or parameter names only: if name is parsed as a CompoundNameNodes, it must be a payload type (not ambiguous in this case) // No counterpart needed for MessageNode because MessageSignature values can be syntactically distinguished from sig parameters //public class AmbigNameNode extends SimpleNameNode implements MessageNode, PayloadElemNameNode @@ -54,7 +53,7 @@ public AmbigNameNode dupNode() } @Override - public String getIdentifier() + public String getText() { return getToken().getText(); // CHECKME: ambig nodes are now leafs } @@ -91,7 +90,7 @@ public PayloadElemType toPayloadType() // As a payload elem, curr @Override public AmbigName toName() { - return new AmbigName(getIdentifier()); + return new AmbigName(getText()); } @Override @@ -117,7 +116,7 @@ public boolean canEqual(Object o) @Override public int hashCode() { - int hash = 331; + int hash = 3659; hash = 31 * super.hashCode(); return hash; } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java index 90b70676d..5a9947c51 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java @@ -56,7 +56,7 @@ public DummyProjectionRoleNode substituteNames(Substitutor subs) @Override public Role toName() { - return new Role(getIdentifier()); + return new Role(getText()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/IdNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/IdNode.java new file mode 100644 index 000000000..677869fbb --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/IdNode.java @@ -0,0 +1,105 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.name.simple; + +import org.antlr.runtime.Token; +import org.antlr.runtime.tree.CommonTree; +import org.scribble.type.kind.IdKind; +import org.scribble.type.name.Identifier; + +// N.B. no del attached, so not currently visited +public class IdNode extends SimpleNameNode +{ + // ScribTreeAdaptor#create constructor + public IdNode(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected IdNode(IdNode node)//, String id) + { + super(node); + } + + @Override + public IdNode dupNode() + { + return new IdNode(this);//, getIdentifier()); + } + + @Override + public String getText() + { + return getToken().getText(); // CHECKME: ambig nodes are now leafs + } + + @Override + public Identifier toName() + { + return new Identifier(getText()); + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof IdNode)) + { + return false; + } + return ((IdNode) o).canEqual(this) && super.equals(o); + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof IdNode; + } + + @Override + public int hashCode() + { + int hash = 331; + hash = 31 * super.hashCode(); + return hash; + } + + + + + + + + + public IdNode(CommonTree source, String id) + { + super(source, id); + } + + /*@Override + protected AmbigNameNode copy() + { + return new AmbigNameNode(this.source, getIdentifier()); + } + + @Override + public AmbigNameNode clone(AstFactory af) + { + return (AmbigNameNode) af.AmbiguousNameNode(this.source, getIdentifier()); + }*/ +} diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java index 5da3fc762..cb53593f9 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java @@ -88,7 +88,7 @@ public NonRoleArgNode substituteNames(Substitutor subs) @Override public Name toName() { - String id = getIdentifier(); + String id = getText(); if (this.kind.equals(SigKind.KIND)) { return Kind.castName(this.kind, new MessageSigName(id)); diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java index bfa58230e..976f33172 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java @@ -44,7 +44,7 @@ public OpNode dupNode() @Override public Op toName() { - String id = getIdentifier(); + String id = getText(); if (id.equals(EMPTY_OP_IDENTIFIER)) { return Op.EMPTY_OP; diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java index 58338e14e..0b6345ed0 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java @@ -47,7 +47,7 @@ public RecVarNode clone() @Override public RecVar toName() { - return new RecVar(getIdentifier()); + return new RecVar(getText()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java index 32d4c8616..acae2c669 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java @@ -69,7 +69,7 @@ public RoleNode substituteNames(Substitutor subs) @Override public Role toName() { - return new Role(getIdentifier()); + return new Role(getText()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java index efc73fe38..4157056b7 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java @@ -33,7 +33,7 @@ protected SimpleNameNode(SimpleNameNode node)//, String id) super(node); } - public String getIdentifier() + public String getText() { return getLastElement(); } diff --git a/scribble-core/src/main/java/org/scribble/type/kind/AbstractKind.java b/scribble-core/src/main/java/org/scribble/type/kind/AbstractKind.java index 2a527d653..40ba9717b 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/AbstractKind.java +++ b/scribble-core/src/main/java/org/scribble/type/kind/AbstractKind.java @@ -27,11 +27,6 @@ public AbstractKind(String kind) { this.kind = kind; } - - @Override - public abstract boolean equals(Object o); - - public abstract boolean canEqual(Object o); // Not really needed due to singleton pattern @Override public int hashCode() @@ -40,6 +35,11 @@ public int hashCode() hash = 31 * hash + this.kind.hashCode(); return hash; } + + @Override + public abstract boolean equals(Object o); + + public abstract boolean canEqual(Object o); // Not really needed due to singleton pattern @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/type/kind/IdKind.java b/scribble-core/src/main/java/org/scribble/type/kind/IdKind.java new file mode 100644 index 000000000..2af157d42 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/type/kind/IdKind.java @@ -0,0 +1,45 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.type.kind; + + +public class IdKind extends AbstractKind +{ + public static final IdKind KIND = new IdKind(); + + protected IdKind() + { + super("Id"); + } + + @Override + public boolean equals(Object o) + { + if (o == this) + { + return true; + } + if (!(o instanceof IdKind)) + { + return false; + } + return ((IdKind) o).canEqual(this); + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof IdKind; + } +} diff --git a/scribble-core/src/main/java/org/scribble/type/name/AmbigName.java b/scribble-core/src/main/java/org/scribble/type/name/AmbigName.java index 7e71c4b2d..d8f0ce9a0 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/AmbigName.java +++ b/scribble-core/src/main/java/org/scribble/type/name/AmbigName.java @@ -57,7 +57,7 @@ public boolean canEqual(Object o) @Override public int hashCode() { - int hash = 2753; + int hash = 4073; hash = 31 * super.hashCode(); return hash; } diff --git a/scribble-core/src/main/java/org/scribble/type/name/Identifier.java b/scribble-core/src/main/java/org/scribble/type/name/Identifier.java new file mode 100644 index 000000000..763767b03 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/type/name/Identifier.java @@ -0,0 +1,54 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.type.name; + +import org.scribble.type.kind.IdKind; + +public class Identifier extends AbstractName +{ + private static final long serialVersionUID = 1L; + + public Identifier(String text) + { + super(IdKind.KIND, text); + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof Identifier)) + { + return false; + } + Identifier n = (Identifier) o; + return n.canEqual(this) && super.equals(o); + } + + public boolean canEqual(Object o) + { + return o instanceof Identifier; + } + + @Override + public int hashCode() + { + int hash = 2753; + hash = 31 * super.hashCode(); + return hash; + } +} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index fd22c5cc1..6626f71a0 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -33,7 +33,7 @@ import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; @@ -170,7 +170,7 @@ public Object create(Token t) //throw new RuntimeException("Shouldn't get here: " + lab + " ,, " + lab.length()); //return new MyCommonTree(t); return - new AmbigNameNode(t); // FIXME: currently all name "leaf" nodes are there, so not ambig, more like ID + new IdNode(t); // FIXME: currently all name "leaf" nodes are there, so not ambig, more like ID //return empty; } } From c8ce452dd716cbeb3a88ee4d03bef134c629295a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 17 Mar 2019 09:54:43 +0000 Subject: [PATCH 120/539] Continued: ambig name refactoring. --- .../java/org/scribble/ast/AstFactoryImpl.java | 13 ++++- .../java/org/scribble/ast/DelDecorator.java | 17 +++++-- .../org/scribble/ast/DelDecoratorImpl.java | 49 +++++++++++++----- .../java/org/scribble/ast/NonRoleArgNode.java | 7 ++- .../org/scribble/ast/NonRoleParamDecl.java | 2 +- .../scribble/ast/NonRoleParamDeclList.java | 5 +- .../java/org/scribble/ast/SigParamDecl.java | 6 +-- .../ast/name/simple/AmbigNameNode.java | 7 +-- .../ast/name/simple/NonRoleParamNode.java | 50 +++++++------------ .../ast/name/simple/SimpleNameNode.java | 2 +- .../org/scribble/del/NonRoleArgListDel.java | 8 +-- .../main/java/org/scribble/del/ScribDel.java | 1 + .../scribble/del/name/AmbigNameNodeDel.java | 36 ++++++++++--- .../org/scribble/del/name/RoleNodeDel.java | 2 +- .../visit/context/ModuleContextBuilder.java | 1 - .../org/scribble/parser/antlr/Scribble.g | 26 +++++----- .../parser/scribble/ScribTreeAdaptor.java | 24 ++++++--- 17 files changed, 163 insertions(+), 93 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java index 4a059bc61..5aad3639c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -67,6 +67,8 @@ import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ast.name.simple.SigParamNode; +import org.scribble.ast.name.simple.TypeParamNode; import org.scribble.del.DefaultDel; import org.scribble.del.ImportModuleDel; import org.scribble.del.ModuleDel; @@ -543,11 +545,20 @@ public AmbigNameNode AmbiguousNameNode(CommonTree source, String identifier) return ann; } + @SuppressWarnings("unchecked") @Override public NonRoleParamNode NonRoleParamNode( CommonTree source, K kind, String identifier) { - NonRoleParamNode pn = new NonRoleParamNode(source, kind, identifier); + NonRoleParamNode pn; //= new NonRoleParamNode(source, kind, identifier); + if (kind.equals(SigKind.KIND)) + { + pn = (NonRoleParamNode) new SigParamNode(source.getToken()); + } + else + { + pn = (NonRoleParamNode) new TypeParamNode(source.getToken()); + } pn = del(pn, new ParamNodeDel()); return pn; } diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java b/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java index 85d030c64..b80ab35ae 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java @@ -29,9 +29,12 @@ import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ast.name.simple.SigParamNode; +import org.scribble.ast.name.simple.TypeParamNode; // In ast package to access protected non-defensive del setter @@ -56,8 +59,8 @@ public interface DelDecorator void RoleDecl(RoleDecl rd); void NonRoleParamDeclList(NonRoleParamDeclList pds); // NonRoleParamDecl NonRoleParamDecl(CommonTree source, K kind, NonRoleParamNode name); - void TypeDecl(TypeParamDecl td); - void SigDecl(SigParamDecl sd); + void TypeParamDecl(TypeParamDecl td); + void SigParamDecl(SigParamDecl sd); void GProtocolDef(GProtocolDef gpd); void GProtocolBlock(GProtocolBlock gpb); @@ -96,9 +99,13 @@ public interface DelDecorator void GProtocolNameNode(GProtocolNameNode gpn); void LProtocolNameNode(LProtocolNameNode lpn); - /*AmbigNameNode AmbiguousNameNode(CommonTree source, String identifier); - NonRoleParamNode NonRoleParamNode(CommonTree source, K kind, String identifier); - DummyProjectionRoleNode DummyProjectionRoleNode(); + void AmbigNameNode(AmbigNameNode an); + + // NonRoleParamNode NonRoleParamNode(CommonTree source, K kind, String identifier); + void SigParamNode(SigParamNode sp); + void TypeParamNode(TypeParamNode tp); + + /*DummyProjectionRoleNode DummyProjectionRoleNode(); LProtocolDecl LProtocolDecl(CommonTree source, List modifiers, LProtocolHeader header, LProtocolDef def); // Not currently used -- local protos not parsed, only projected LProjectionDecl LProjectionDecl(CommonTree source, List modifiers, GProtocolName fullname, Role self, LProtocolHeader header, LProtocolDef def); // del extends that of LProtocolDecl diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java index 5c2f1f0b4..603381513 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java @@ -31,9 +31,12 @@ import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ast.name.simple.SigParamNode; +import org.scribble.ast.name.simple.TypeParamNode; import org.scribble.del.DefaultDel; import org.scribble.del.ImportModuleDel; import org.scribble.del.ModuleDel; @@ -53,8 +56,10 @@ import org.scribble.del.global.GProtocolDeclDel; import org.scribble.del.global.GProtocolDefDel; import org.scribble.del.global.GRecursionDel; +import org.scribble.del.name.AmbigNameNodeDel; import org.scribble.del.name.DataTypeNodeDel; import org.scribble.del.name.MessageSigNameNodeDel; +import org.scribble.del.name.ParamNodeDel; import org.scribble.del.name.RecVarNodeDel; import org.scribble.del.name.RoleNodeDel; @@ -114,11 +119,11 @@ public void decorate(CommonTree n) //case EMPTY_PARAMETERDECLLST: NonRoleParamDeclList((NonRoleParamDeclList) n); break; - case "TYPEDECL": - TypeDecl((TypeParamDecl) n); + case "TYPEPARAMDECL": + TypeParamDecl((TypeParamDecl) n); break; - case "SIGDECL": - SigDecl((SigParamDecl) n); + case "SIGPARAMDECL": + SigParamDecl((SigParamDecl) n); break; case "GLOBALPROTOCOLDEF": @@ -185,6 +190,12 @@ public void decorate(CommonTree n) case "OPNAME": OpNode((OpNode) n); break; + case "SIGPARAMNAME": + SigParamNode((SigParamNode) n); + break; + case "TYPEPARAMNAME": + TypeParamNode((TypeParamNode) n); + break; case "MODULENAME": //System.out.println("5555b: " + n.getClass() + " ,, " + type + " ,, " + n); @@ -193,6 +204,10 @@ public void decorate(CommonTree n) ModuleNameNode((ModuleNameNode) n); break; + case "AMBIGUOUSNAME": + AmbigNameNode((AmbigNameNode) n); + break; + default: // Leaf "ID" nodes //throw new RuntimeException("Unknown ANTLR node type: " + type); //System.out.println("9999:" + n + " ,, " + n.getChildren()); @@ -296,13 +311,13 @@ public NonRoleParamDecl NonRoleParamDecl(CommonT }*/ @Override - public void TypeDecl(TypeParamDecl td) + public void TypeParamDecl(TypeParamDecl td) { setDel(td, new NonRoleParamDeclDel()); } @Override - public void SigDecl(SigParamDecl sd) + public void SigParamDecl(SigParamDecl sd) { setDel(sd, new NonRoleParamDeclDel()); } @@ -554,23 +569,33 @@ protected static , K extends Kind> T castNameNode(K kind, return tmp; }*/ - /*@Override - public AmbigNameNode AmbiguousNameNode(CommonTree source, String identifier) + @Override + public void AmbigNameNode(AmbigNameNode an) { - AmbigNameNode ann = new AmbigNameNode(source, identifier); - ann = (AmbigNameNode) ann.del(new AmbigNameNodeDel()); - return ann; + setDel(an, new AmbigNameNodeDel()); } - @Override + /*@Override public NonRoleParamNode NonRoleParamNode(CommonTree source, K kind, String identifier) { NonRoleParamNode pn = new NonRoleParamNode(source, kind, identifier); pn = setDel(pn, new ParamNodeDel()); return pn; + }*/ + + @Override + public void SigParamNode(SigParamNode sp) + { + setDel(sp, new ParamNodeDel()); } @Override + public void TypeParamNode(TypeParamNode tp) + { + setDel(tp, new ParamNodeDel()); + } + + /*@Override public DummyProjectionRoleNode DummyProjectionRoleNode() { DummyProjectionRoleNode dprn = new DummyProjectionRoleNode(); diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgNode.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgNode.java index c4d9c43fe..bfc6b4c61 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgNode.java @@ -38,7 +38,12 @@ default boolean isDataTypeNameNode() return false; } - default boolean isParamNode() + default boolean isSigParamNode() + { + return false; + } + + default boolean isTypeParamNode() { return false; } diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java index c6e2249e9..affc1c084 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java @@ -19,7 +19,7 @@ import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.Name; -// TODO: make concrete subclasses to "eliminate" generic parameter (e.g., for better child casting, etc.) +// CHECKME: can drop generic parameter and kind? public abstract class NonRoleParamDecl extends HeaderParamDecl { diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java index ef66d98f8..d5c8b56e5 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java @@ -23,6 +23,7 @@ import org.scribble.type.name.Name; import org.scribble.type.name.Role; +// Can contain "mixed" type/sig kinds // Typing a bit awkward that this list has to use NonRoleParamKind as the "concrete" kind, while the NonRoleParamDecl elements use the actual concrete kind // But OK because the NonRoleParamDecl nodes are immutable (the generic kind value is never rewritten after instantiation, only read) public class NonRoleParamDeclList extends HeaderParamDeclList @@ -44,8 +45,8 @@ public List> getParamDeclChildren() { @SuppressWarnings("unchecked") List> cast = - ((List) getChildren()).stream() - .map(x -> (NonRoleParamDecl) x) + getChildren().stream() + .map(x -> (NonRoleParamDecl) x) // Cast specifically to NonRoleParamKind (not "?") for hetero list .collect(Collectors.toList()); return cast; } diff --git a/scribble-core/src/main/java/org/scribble/ast/SigParamDecl.java b/scribble-core/src/main/java/org/scribble/ast/SigParamDecl.java index 78a73ba9d..7e67da6e0 100644 --- a/scribble-core/src/main/java/org/scribble/ast/SigParamDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/SigParamDecl.java @@ -14,7 +14,7 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.ast.name.qualified.MessageSigNameNode; +import org.scribble.ast.name.simple.SigParamNode; import org.scribble.type.kind.SigKind; import org.scribble.type.name.Name; import org.scribble.type.name.Role; @@ -40,9 +40,9 @@ public SigParamDecl dupNode() } @Override - public MessageSigNameNode getNameNodeChild() + public SigParamNode getNameNodeChild() { - return (MessageSigNameNode) getRawNameNodeChild(); // CHECKME: make Type/Sig(Param)Node? + return (SigParamNode) getRawNameNodeChild(); // CHECKME: make Type/Sig(Param)Node? } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index 7a5621320..cdcfd186d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -52,11 +52,12 @@ public AmbigNameNode dupNode() return new AmbigNameNode(this);//, getIdentifier()); } - @Override + /*@Override public String getText() { - return getToken().getText(); // CHECKME: ambig nodes are now leafs - } + //return getToken().getText(); // CHECKME: ambig nodes are now leafs -- NO: now separated from ID + return super.getText(); + }*/ @Override public MessageNode project(AstFactory af) diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java index cb53593f9..1f2314ebd 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java @@ -15,52 +15,38 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.MessageNode; -import org.scribble.ast.NonRoleArgNode; -import org.scribble.ast.name.PayloadElemNameNode; -import org.scribble.type.Arg; -import org.scribble.type.Message; -import org.scribble.type.kind.DataTypeKind; -import org.scribble.type.kind.Kind; import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.kind.SigKind; -import org.scribble.type.name.DataType; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.Name; -import org.scribble.type.name.PayloadElemType; -import org.scribble.visit.Substitutor; // An unambiguous kinded parameter (ambiguous parameters handled by disambiguation) that isn't a role -- e.g. DataType/MessageSigName param //public class NonRoleParamNode extends SimpleNameNode implements MessageNode, PayloadElemNameNode //public class NonRoleParamNode extends SimpleNameNode implements MessageNode, PayloadElemNameNode -public class NonRoleParamNode extends - SimpleNameNode implements MessageNode, PayloadElemNameNode +public abstract class NonRoleParamNode extends + SimpleNameNode// implements MessageNode, PayloadElemNameNode // As a payload, can only be a DataType (so hardcode) { public final K kind; // ScribTreeAdaptor#create constructor - public NonRoleParamNode(Token t) + public NonRoleParamNode(Token t, K kind) { super(t); this.kind = null; // FIXME: how to set? (disamb?) -- probably do concrete data/sig subclasses? } // Tree#dupNode constructor - protected NonRoleParamNode(NonRoleParamNode node, K kind)//, String id) + protected NonRoleParamNode(NonRoleParamNode node)//, String id) { super(node); - this.kind = kind; + this.kind = node.kind; } @Override - public NonRoleParamNode dupNode() - { + public abstract NonRoleParamNode dupNode(); + /*{ return new NonRoleParamNode<>(this, this.kind);//, getIdentifier()); - } + }*/ - @Override + /*@Override public MessageNode project(AstFactory af) // MessageSigName params { return this; @@ -152,8 +138,16 @@ public PayloadElemType toPayloadType() // Currently can assume th /*else if (this.kind.equals(Local.KIND)) // Protocol params not supported { return (Local) toName(); - }*/ + }* / throw new RuntimeException("Not a payload kind parameter: " + this); + }*/ + + @Override + public int hashCode() + { + int hash = 317; + hash = 31 * super.hashCode(); + return hash; } @Override @@ -177,14 +171,6 @@ public boolean canEqual(Object o) return o instanceof NonRoleParamNode; } - @Override - public int hashCode() - { - int hash = 317; - hash = 31 * super.hashCode(); - return hash; - } - diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java index 4157056b7..ad9a6df5a 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java @@ -35,7 +35,7 @@ protected SimpleNameNode(SimpleNameNode node)//, String id) public String getText() { - return getLastElement(); + return getLastElement(); // i.e., second child element, after node type } diff --git a/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java b/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java index e3e25115f..4ce8f2359 100644 --- a/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java @@ -52,12 +52,12 @@ public NonRoleArgList leaveDisambiguation(ScribNode parent, ScribNode child, Nam NonRoleParamKind kind = param.kind; NonRoleArg arg = args.next(); NonRoleArgNode val = arg.getValChild(); - if (val.isParamNode()) + if (val.isTypeParamNode() || val.isSigParamNode()) { if (!((NonRoleParamNode) val).kind.equals(kind)) { throw new ScribbleException(arg.getSource(), - "Bad arg " + arg + " for param kind: " + kind); + "Invalid arg " + arg + " for param kind: " + kind); } } else if (kind.equals(SigKind.KIND)) @@ -65,7 +65,7 @@ else if (kind.equals(SigKind.KIND)) if (!val.isMessageSigNode() && !val.isMessageSigNameNode()) { throw new ScribbleException(arg.getSource(), - "Bad arg " + arg + " for param kind: " + kind); + "Invalid arg " + arg + " for param kind: " + kind); } } else if (kind.equals(DataTypeKind.KIND)) @@ -73,7 +73,7 @@ else if (kind.equals(DataTypeKind.KIND)) if (!val.isDataTypeNameNode()) { throw new ScribbleException(arg.getSource(), - "Bad arg " + arg + " for param kind: " + kind); + "Invalid arg " + arg + " for param kind: " + kind); } } else diff --git a/scribble-core/src/main/java/org/scribble/del/ScribDel.java b/scribble-core/src/main/java/org/scribble/del/ScribDel.java index 823203bea..91e21cb9c 100644 --- a/scribble-core/src/main/java/org/scribble/del/ScribDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ScribDel.java @@ -37,6 +37,7 @@ import org.scribble.visit.wf.ReachabilityChecker; import org.scribble.visit.wf.WFChoiceChecker; +// TODO: parent params now redundant // FIXME: refactor as appropriate into G/LDel // Immutable except for pass-specific Envs (by visitors) only -- Envs considered transient, not treated immutably (i.e. non defensive setter on del) // Parameterise by AstNode type? Would inhibit del sharing between types (but that's not currently needed) diff --git a/scribble-core/src/main/java/org/scribble/del/name/AmbigNameNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/AmbigNameNodeDel.java index f8f72f7dd..973827b3b 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/AmbigNameNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/AmbigNameNodeDel.java @@ -17,10 +17,15 @@ import org.scribble.ast.PayloadElem; import org.scribble.ast.ScribNode; import org.scribble.ast.context.ModuleContext; +import org.scribble.ast.name.qualified.DataTypeNode; +import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.SigParamNode; +import org.scribble.ast.name.simple.TypeParamNode; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; import org.scribble.type.kind.DataTypeKind; +import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.SigKind; import org.scribble.type.name.AmbigName; import org.scribble.visit.wf.NameDisambiguator; @@ -49,8 +54,11 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, throw new ScribbleException(ann.getSource(), "Invalid occurrence of data type: " + parent); } - return disamb.job.config.af.QualifiedNameNode(ann.getSource(), - DataTypeKind.KIND, name.getElements()); + /*return disamb.job.config.af.QualifiedNameNode(ann.getSource(), + DataTypeKind.KIND, name.getElements());*/ + DataTypeNode res = new DataTypeNode(ann.token); // CHECKME: what should the Token be? + res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? + return res; } else if (mcontext.isMessageSigNameVisible(name.toMessageSigName())) { @@ -59,13 +67,29 @@ else if (mcontext.isMessageSigNameVisible(name.toMessageSigName())) throw new ScribbleException(ann.getSource(), "Invalid occurrence of message signature name: " + parent); } - return disamb.job.config.af.QualifiedNameNode(ann.getSource(), - SigKind.KIND, name.getElements()); + /*return disamb.job.config.af.QualifiedNameNode(ann.getSource(), + SigKind.KIND, name.getElements());*/ + MessageSigNameNode res = new MessageSigNameNode(ann.token); // CHECME: what should the Token be? + res.addChildren(ann.getChildren()); + return res; } else if (disamb.isBoundParameter(name)) { - return disamb.job.config.af.NonRoleParamNode(ann.getSource(), - disamb.getParameterKind(name), name.toString()); + /*return disamb.job.config.af.NonRoleParamNode(ann.getSource(), + disamb.getParameterKind(name), name.toString());*/ + NonRoleParamKind kind = disamb.getParameterKind(name); + if (kind.equals(DataTypeKind.KIND)) + { + TypeParamNode res = new TypeParamNode(ann.token); // CHECKME: what should the Token be? + res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? + return res; + } + else if (kind.equals(SigKind.KIND)) + { + SigParamNode res = new SigParamNode(ann.token); // CHECKME: what should the Token be? + res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? + return res; + } } throw new ScribbleException(ann.getSource(), "Cannot disambiguate name: " + name); diff --git a/scribble-core/src/main/java/org/scribble/del/name/RoleNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/RoleNodeDel.java index 2ba72c753..fe662d35c 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/RoleNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/RoleNodeDel.java @@ -30,7 +30,7 @@ public RoleNodeDel() public RoleNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException { RoleNode rn = (RoleNode) visited; - if (!disamb.isBoundRole(rn.toName())) + if (!disamb.isBoundRole(rn.toName())) // Added on RoleDecl entry { throw new ScribbleException(rn.getSource(), "Role not bound: " + rn); } diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java index c9f228e23..cd3fd8712 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java @@ -32,7 +32,6 @@ public ModuleContextBuilder(Job job) @Override protected void enter(ScribNode parent, ScribNode child) throws ScribbleException { - System.out.println("sss4: " + ((parent != null) ? parent.getClass() : "") + " ,, " + child.getClass()); child.del().enterModuleContextBuilding(parent, child, this); } diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 890ddff37..a802809e2 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -126,8 +126,8 @@ tokens ROLEDECL = 'ROLEDECL'; PARAMETERDECLLIST = 'PARAMETERDECLLIST'; //PARAMETERDECL = 'PARAMETERDECL'; - TYPEDECL = 'TYPEDECL'; - SIGDECL = 'SIGDECL'; + TYPEPARAMDECL = 'TYPEPARAMDECL'; + SIGPARAMDECL = 'SIGPARAMDECL'; ROLEINSTANTIATIONLIST = 'ROLEINSTANTIATIONLIST'; ROLEINSTANTIATION = 'ROLEINSTANTIATION'; // FIXME: not consistent with arginstas/payloadeles ARGUMENTINSTANTIATIONLIST = 'ARGUMENTINSTANTIATIONLIST'; @@ -151,8 +151,8 @@ tokens GPROTOCOLNAME = 'GPROTOCOLNAME'; ROLENAME = 'ROLENAME'; - TYPENAME = 'TYPENAME'; - SIGNAME = 'SIGNAME'; + TYPEPARAMNAME = 'TYPEPARAMNAME'; + SIGPARAMNAME = 'SIGPARAMNAME'; ID = 'ID'; OPNAME = 'OPNAME'; RECURSIONVAR = 'RECURSIONVAR'; @@ -470,7 +470,7 @@ payloadtypedecl: simplepayloadtypename: IDENTIFIER -> - ^(TYPENAME IDENTIFIER) // TODO factor out with typedecl? + ^(TYPENAME IDENTIFIER) // TODO factor out with typedecl? NO: params distinct from "literals" ; messagesignaturedecl: @@ -483,7 +483,7 @@ messagesignaturedecl: simplemessagesignaturename: IDENTIFIER -> - ^(SIGNAME IDENTIFIER) // TODO factor out with sigdecl? + ^(SIGNAME IDENTIFIER) // TODO factor out with sigparamdecl? NO: params distinct from "literals" ; @@ -615,14 +615,15 @@ parameterdecl: typedecl: TYPE_KW parametername -> - ^(TYPEDECL ^(TYPENAME parametername)) + ^(TYPEPARAMDECL ^(TYPEPARAMNAME parametername)) ; +// FIXME: should be a nonroleparamnode // cf. roledecl sigdecl: SIG_KW parametername -> - ^(SIGDECL ^(SIGNAME parametername)) + ^(SIGPARAMDECL ^(SIGPARAMNAME parametername)) ; @@ -695,13 +696,14 @@ rolenamenode: message: messagesignature -/* - ambiguousname // FIXME: qualified name*/ +| + ambiguousname +; +/*// FIXME TODO: qualified (messagesig) names | messagesignaturename // qualified messagesignaturename subsumes parametername case -/*| +| parametername*/ -; globalconnect: //message CONNECT_KW rolename TO_KW rolename diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 6626f71a0..2f3e23871 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -33,10 +33,13 @@ import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ast.name.simple.SigParamNode; +import org.scribble.ast.name.simple.TypeParamNode; // get/setType don't seem to be really used public class ScribTreeAdaptor extends CommonTreeAdaptor @@ -89,6 +92,10 @@ public Object create(Token t) return new DataTypeDecl(t); case "MESSAGESIGNATUREDECL": return new MessageSigNameDecl(t); + case "TYPENAME": + return new DataTypeNode(t); + case "SIGNAME": + return new MessageSigNameNode(t); case "GLOBALPROTOCOLDECL": //return this.f.GProtocolDecl(empty, Collections.emptyList(), null, null); return new GProtocolDecl(t); @@ -106,14 +113,14 @@ public Object create(Token t) return new RoleNode(t); case "PARAMETERDECLLIST": //return this.f.NonRoleParamDeclList(empty, Collections.emptyList()); return new NonRoleParamDeclList(t); - case "TYPEDECL": + case "TYPEPARAMDECL": return new TypeParamDecl(t); - case "TYPENAME": - return new DataTypeNode(t); - case "SIGDECL": + case "TYPEPARAMNAME": + return new TypeParamNode(t); + case "SIGPARAMDECL": return new SigParamDecl(t); - case "SIGNAME": - return new MessageSigNameNode(t); + case "SIGPARAMNAME": + return new SigParamNode(t); case "GLOBALPROTOCOLDEF": //return this.f.GProtocolDef(empty, null); return new GProtocolDef(t); case "GLOBALPROTOCOLBLOCK": //return this.f.GProtocolBlock(empty, null); @@ -166,11 +173,12 @@ public Object create(Token t) System.out.println("222: " + t + " ,, " + x); return x;*/ //return nil(); // CHECKME + case "AMBIGUOUSNAME": + return new AmbigNameNode(t); default: //throw new RuntimeException("Shouldn't get here: " + lab + " ,, " + lab.length()); //return new MyCommonTree(t); - return - new IdNode(t); // FIXME: currently all name "leaf" nodes are there, so not ambig, more like ID + return new IdNode(t); // FIXME: currently all name "leaf" nodes are there, so not ambig, more like ID //return empty; } } From 214940129f0f45a76406860bc04e45ae64ac145a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 17 Mar 2019 09:55:39 +0000 Subject: [PATCH 121/539] Continued: protocol header params refactoring. --- .../ast/name/simple/SigParamNode.java | 116 ++++++++++++++++++ .../ast/name/simple/TypeParamNode.java | 107 ++++++++++++++++ 2 files changed, 223 insertions(+) create mode 100644 scribble-core/src/main/java/org/scribble/ast/name/simple/SigParamNode.java create mode 100644 scribble-core/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/SigParamNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/SigParamNode.java new file mode 100644 index 000000000..b0d30394e --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/SigParamNode.java @@ -0,0 +1,116 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.name.simple; + +import org.antlr.runtime.Token; +import org.scribble.ast.AstFactory; +import org.scribble.ast.MessageNode; +import org.scribble.ast.MessageSigNode; +import org.scribble.type.kind.SigKind; +import org.scribble.type.name.MessageSigName; +import org.scribble.visit.Substitutor; + +public class SigParamNode extends NonRoleParamNode + implements MessageNode +{ + // ScribTreeAdaptor#create constructor + public SigParamNode(Token t) + { + super(t, SigKind.KIND); + } + + // Tree#dupNode constructor + protected SigParamNode(SigParamNode node)//, String id) + { + super(node); + } + + @Override + public SigParamNode dupNode() + { + if (getChildren().isEmpty()) + { + throw new RuntimeException(); + } + return new SigParamNode(this);//, getIdentifier()); + } + + @Override + public SigParamNode project(AstFactory af) // MessageSigName params + { + return this; + } + + @Override + public MessageSigNode substituteNames(Substitutor subs) + { + MessageSigName arg = toArg(); + MessageSigNode an; + an = (MessageSigNode) subs.getArgumentSubstitution(arg); // getArgumentSubstitution returns a clone + an = (MessageSigNode) an.del(del()); + return an; + } + + @Override + public MessageSigName toName() + { + return new MessageSigName(getText()); + } + + @Override + public MessageSigName toArg() + { + return toMessage(); + } + + @Override + public MessageSigName toMessage() + { + return toName(); + } + + @Override + public boolean isTypeParamNode() + { + return true; + } + + @Override + public int hashCode() + { + int hash = 8609; + hash = 31 * super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof SigParamNode)) + { + return false; + } + return super.equals(o); + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof SigParamNode; + } +} diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java new file mode 100644 index 000000000..a00954238 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java @@ -0,0 +1,107 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.name.simple; + +import org.antlr.runtime.Token; +import org.scribble.ast.name.PayloadElemNameNode; +import org.scribble.ast.name.qualified.DataTypeNode; +import org.scribble.type.kind.DataTypeKind; +import org.scribble.type.name.DataType; +import org.scribble.visit.Substitutor; + +public class TypeParamNode extends NonRoleParamNode + implements PayloadElemNameNode + // As a payload, can only be a DataType (so hardcode) +{ + // ScribTreeAdaptor#create constructor + public TypeParamNode(Token t) + { + super(t, DataTypeKind.KIND); + } + + // Tree#dupNode constructor + protected TypeParamNode(TypeParamNode node)//, String id) + { + super(node); + } + + @Override + public TypeParamNode dupNode() + { + return new TypeParamNode(this); + } + + @Override + public DataTypeNode substituteNames(Substitutor subs) + { + DataType arg = toArg(); + DataTypeNode an; + an = (DataTypeNode) subs.getArgumentSubstitution(arg); // getArgumentSubstitution returns a clone + an = (DataTypeNode) an.del(del()); + return an; + } + + @Override + public DataType toName() + { + return new DataType(getText()); + } + + @Override + public DataType toArg() + { + // FIXME: as a payload kind, currently hardcorded to data type kinds (protocol payloads not supported) + return toPayloadType(); + } + + @Override + public DataType toPayloadType() // Currently can assume the only possible kind for NonRoleParamNode is DataTypeKind + { + return toName(); + } + + @Override + public boolean isTypeParamNode() + { + return true; + } + + @Override + public int hashCode() + { + int hash = 8599; + hash = 31 * super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof TypeParamNode)) + { + return false; + } + return super.equals(o); + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof TypeParamNode; + } +} From 78c740b94b16fe17d232df08515d50a4f3a3e769 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 17 Mar 2019 11:48:44 +0000 Subject: [PATCH 122/539] Continued: refactored UnaryPayloadElem parsing into Scribble.g. --- .../java/org/scribble/ast/AstFactoryImpl.java | 12 ++--- .../java/org/scribble/ast/DelDecorator.java | 2 +- .../org/scribble/ast/DelDecoratorImpl.java | 26 ++++++----- .../org/scribble/ast/PayloadElemList.java | 2 +- .../java/org/scribble/ast/ScribNodeBase.java | 3 +- .../org/scribble/ast/UnaryPayloadElem.java | 6 ++- .../java/org/scribble/ast/name/NameNode.java | 2 +- .../ast/name/qualified/QualifiedNameNode.java | 1 + .../ast/name/simple/SimpleNameNode.java | 1 + .../name/{ => qualified}/DataTypeNodeDel.java | 18 +++++--- .../MessageSigNameNodeDel.java | 18 +++++--- .../name/{ => simple}/AmbigNameNodeDel.java | 2 +- .../del/name/{ => simple}/ParamNodeDel.java | 2 +- .../del/name/{ => simple}/RecVarNodeDel.java | 2 +- .../del/name/{ => simple}/RoleNodeDel.java | 2 +- .../visit/context/ModuleContextBuilder.java | 1 + .../org/scribble/parser/antlr/Scribble.g | 45 ++++++++++++++++++- 17 files changed, 104 insertions(+), 41 deletions(-) rename scribble-core/src/main/java/org/scribble/del/name/{ => qualified}/DataTypeNodeDel.java (78%) rename scribble-core/src/main/java/org/scribble/del/name/{ => qualified}/MessageSigNameNodeDel.java (74%) rename scribble-core/src/main/java/org/scribble/del/name/{ => simple}/AmbigNameNodeDel.java (99%) rename scribble-core/src/main/java/org/scribble/del/name/{ => simple}/ParamNodeDel.java (94%) rename scribble-core/src/main/java/org/scribble/del/name/{ => simple}/RecVarNodeDel.java (98%) rename scribble-core/src/main/java/org/scribble/del/name/{ => simple}/RoleNodeDel.java (97%) diff --git a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java index 5aad3639c..195376d6c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -107,12 +107,12 @@ import org.scribble.del.local.LSendDel; import org.scribble.del.local.LWrapClientDel; import org.scribble.del.local.LWrapServerDel; -import org.scribble.del.name.AmbigNameNodeDel; -import org.scribble.del.name.DataTypeNodeDel; -import org.scribble.del.name.MessageSigNameNodeDel; -import org.scribble.del.name.ParamNodeDel; -import org.scribble.del.name.RecVarNodeDel; -import org.scribble.del.name.RoleNodeDel; +import org.scribble.del.name.qualified.DataTypeNodeDel; +import org.scribble.del.name.qualified.MessageSigNameNodeDel; +import org.scribble.del.name.simple.AmbigNameNodeDel; +import org.scribble.del.name.simple.ParamNodeDel; +import org.scribble.del.name.simple.RecVarNodeDel; +import org.scribble.del.name.simple.RoleNodeDel; import org.scribble.type.kind.DataTypeKind; import org.scribble.type.kind.Global; import org.scribble.type.kind.Kind; diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java b/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java index b80ab35ae..c33c95ca2 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java @@ -77,7 +77,7 @@ public interface DelDecorator void MessageSigNode(MessageSigNode n); void PayloadElemList(PayloadElemList pay); - // UnaryPayloadElem UnaryPayloadElem(UnaryPayloadElem e); + void UnaryPayloadElem(UnaryPayloadElem e); /*GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode name, RoleNode role); LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode name);*/ diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java index 603381513..b33e1ddc5 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java @@ -56,12 +56,12 @@ import org.scribble.del.global.GProtocolDeclDel; import org.scribble.del.global.GProtocolDefDel; import org.scribble.del.global.GRecursionDel; -import org.scribble.del.name.AmbigNameNodeDel; -import org.scribble.del.name.DataTypeNodeDel; -import org.scribble.del.name.MessageSigNameNodeDel; -import org.scribble.del.name.ParamNodeDel; -import org.scribble.del.name.RecVarNodeDel; -import org.scribble.del.name.RoleNodeDel; +import org.scribble.del.name.qualified.DataTypeNodeDel; +import org.scribble.del.name.qualified.MessageSigNameNodeDel; +import org.scribble.del.name.simple.AmbigNameNodeDel; +import org.scribble.del.name.simple.ParamNodeDel; +import org.scribble.del.name.simple.RecVarNodeDel; +import org.scribble.del.name.simple.RoleNodeDel; //FIXME TODO: refactor decoration methods into AST interface, to ensure they are implemented and called @@ -142,6 +142,9 @@ public void decorate(CommonTree n) case "PAYLOAD": PayloadElemList((PayloadElemList) n); break; + case "UNARYPAYLOADELEM": + UnaryPayloadElem((UnaryPayloadElem) n); + break; case "ROLEINSTANTIATIONLIST": RoleArgList((RoleArgList) n); @@ -405,15 +408,14 @@ public void MessageSigNode(MessageSigNode mn) public void PayloadElemList(PayloadElemList pay) { setDel(pay, createDefaultDelegate()); + //setDel(pay, new PayloadElemListDel()); } - /*@Override - public UnaryPayloadElem UnaryPayloadElem(CommonTree source, PayloadElemNameNode name) + @Override + public void UnaryPayloadElem(UnaryPayloadElem e) { - UnaryPayloadElem de= new UnaryPayloadElem<>(source, name); - de = del(de, createDefaultDelegate()); - return de; - }*/ + setDel(e, createDefaultDelegate()); + } @Override public void RoleArgList(RoleArgList rs) diff --git a/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java b/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java index 1d7b22ada..3d1d8bb60 100644 --- a/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java +++ b/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java @@ -49,7 +49,7 @@ public PayloadElemList dupNode() public List> getElementChildren() { - return ((List) getChildren()).stream().map(x -> (PayloadElem) x) + return getChildren().stream().map(x -> (PayloadElem) x) .collect(Collectors.toList()); } diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java index d0ec2cc62..105845862 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -17,7 +17,6 @@ import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; -import java.util.stream.Stream; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; @@ -81,7 +80,7 @@ public List getChildren() { return Collections.emptyList(); } - return ((Stream) super.getChildren().stream()).map(x -> (ScribNode) x) + return ((List) super.getChildren()).stream().map(x -> (ScribNode) x) .collect(Collectors.toList()); } diff --git a/scribble-core/src/main/java/org/scribble/ast/UnaryPayloadElem.java b/scribble-core/src/main/java/org/scribble/ast/UnaryPayloadElem.java index 1675023fd..b38b7293e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/UnaryPayloadElem.java +++ b/scribble-core/src/main/java/org/scribble/ast/UnaryPayloadElem.java @@ -71,10 +71,12 @@ public UnaryPayloadElem reconstruct(PayloadElemNameNode name) } @Override - public UnaryPayloadElem visitChildren(AstVisitor nv) throws ScribbleException + public UnaryPayloadElem visitChildren(AstVisitor nv) + throws ScribbleException { @SuppressWarnings("unchecked") - PayloadElemNameNode name = (PayloadElemNameNode) visitChild(getNameChild(), nv); + PayloadElemNameNode name = (PayloadElemNameNode) visitChild( + getNameChild(), nv); // CHECKME: probably need to record an explicit kind token, for "cast checking" // Cannot use ScribNodeBase.visitChildWithCastCheck because this is not a ProtocolKindNode return reconstruct(name); diff --git a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java index 335d932c9..562400926 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java @@ -51,7 +51,7 @@ public String[] getElements() protected List getSimpleNameList() { - return ((List) getChildren()).stream() + return getChildren().stream() .map(x -> ((CommonTree) x).getText()).collect(Collectors.toList()); // CHECKME: currently AmbigNameNode(?) // CHECKME: factor out getText? diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java index 31054a42d..64661c24e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java @@ -18,6 +18,7 @@ import org.scribble.ast.name.NameNode; import org.scribble.type.kind.Kind; +// Any name that could be compound/qualified (but could also be a singleton) public abstract class QualifiedNameNode extends NameNode { // ScribTreeAdaptor#create constructor diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java index ad9a6df5a..63dcbaf55 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java @@ -18,6 +18,7 @@ import org.scribble.ast.name.NameNode; import org.scribble.type.kind.Kind; +// Names that are necessaryily "simple", i.e., never compound qualified // "Identifier" in parser grammar public abstract class SimpleNameNode extends NameNode { diff --git a/scribble-core/src/main/java/org/scribble/del/name/DataTypeNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java similarity index 78% rename from scribble-core/src/main/java/org/scribble/del/name/DataTypeNodeDel.java rename to scribble-core/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java index 7fe3122c5..a8f9989ec 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/DataTypeNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java @@ -11,15 +11,16 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.del.name; +package org.scribble.del.name.qualified; +import org.antlr.runtime.CommonToken; import org.scribble.ast.DataTypeDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.qualified.DataTypeNode; +import org.scribble.ast.name.simple.IdNode; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; -import org.scribble.type.kind.DataTypeKind; import org.scribble.type.name.DataType; import org.scribble.visit.wf.NameDisambiguator; @@ -48,8 +49,15 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, "Data type not visible: " + dt); } DataType fullname = mc.getVisibleDataTypeFullName(dt); - return (DataTypeNode) disamb.job.config.af.QualifiedNameNode( - dtn.getSource(), DataTypeKind.KIND, fullname.getElements()); - // Didn't keep original del + /*return (DataTypeNode) disamb.job.config.af.QualifiedNameNode( + dtn.getSource(), DataTypeKind.KIND, fullname.getElements());*/ + DataTypeNode res = new DataTypeNode(dtn.token); + for (String e : fullname.getElements()) + { + IdNode n = new IdNode(new CommonToken(23, e)); // FIXME TODO: refactor ast into parser module to access token type constants + res.addChild(n); + } + return res; + // Don't keep original del (so not using clone) } } diff --git a/scribble-core/src/main/java/org/scribble/del/name/MessageSigNameNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java similarity index 74% rename from scribble-core/src/main/java/org/scribble/del/name/MessageSigNameNodeDel.java rename to scribble-core/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java index 5b095a623..9aa96e04a 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/MessageSigNameNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java @@ -11,15 +11,16 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.del.name; +package org.scribble.del.name.qualified; +import org.antlr.runtime.CommonToken; import org.scribble.ast.MessageSigNameDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.qualified.MessageSigNameNode; +import org.scribble.ast.name.simple.IdNode; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; -import org.scribble.type.kind.SigKind; import org.scribble.type.name.MessageSigName; import org.scribble.visit.wf.NameDisambiguator; @@ -43,8 +44,15 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, MessageSigNameNode msnn = (MessageSigNameNode) visited; MessageSigName fullname = mc.getVisibleMessageSigNameFullName(msnn.toName()); - return (MessageSigNameNode) disamb.job.config.af.QualifiedNameNode( - msnn.getSource(), SigKind.KIND, fullname.getElements()); - // Didn't keep original del + /*return (MessageSigNameNode) disamb.job.config.af.QualifiedNameNode( + msnn.getSource(), SigKind.KIND, fullname.getElements());*/ + MessageSigNameNode res = new MessageSigNameNode(msnn.token); + for (String e : fullname.getElements()) + { + IdNode n = new IdNode(new CommonToken(23, e)); // FIXME TODO: refactor ast into parser module to access token type constants + res.addChild(n); + } + return res; + // Don't keep original del (so not using clone) } } diff --git a/scribble-core/src/main/java/org/scribble/del/name/AmbigNameNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java similarity index 99% rename from scribble-core/src/main/java/org/scribble/del/name/AmbigNameNodeDel.java rename to scribble-core/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java index 973827b3b..d4d3a4f6e 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/AmbigNameNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.del.name; +package org.scribble.del.name.simple; import org.scribble.ast.MessageTransfer; import org.scribble.ast.PayloadElem; diff --git a/scribble-core/src/main/java/org/scribble/del/name/ParamNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/simple/ParamNodeDel.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/del/name/ParamNodeDel.java rename to scribble-core/src/main/java/org/scribble/del/name/simple/ParamNodeDel.java index 818993e7b..20ad4ddf9 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/ParamNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/simple/ParamNodeDel.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.del.name; +package org.scribble.del.name.simple; import org.scribble.del.ScribDelBase; diff --git a/scribble-core/src/main/java/org/scribble/del/name/RecVarNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/del/name/RecVarNodeDel.java rename to scribble-core/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java index 215f12929..b4e3fb16f 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/RecVarNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.del.name; +package org.scribble.del.name.simple; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RecVarNode; diff --git a/scribble-core/src/main/java/org/scribble/del/name/RoleNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/del/name/RoleNodeDel.java rename to scribble-core/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java index fe662d35c..793e474d2 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/RoleNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.del.name; +package org.scribble.del.name.simple; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java index cd3fd8712..c2ae93f66 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java @@ -32,6 +32,7 @@ public ModuleContextBuilder(Job job) @Override protected void enter(ScribNode parent, ScribNode child) throws ScribbleException { + //System.out.println("mmm1: " + child.getClass() + " ,, " + child.del()); child.del().enterModuleContextBuilding(parent, child, this); } diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index a802809e2..b71227d53 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -153,12 +153,14 @@ tokens ROLENAME = 'ROLENAME'; TYPEPARAMNAME = 'TYPEPARAMNAME'; SIGPARAMNAME = 'SIGPARAMNAME'; - ID = 'ID'; + //ID = 'ID'; OPNAME = 'OPNAME'; RECURSIONVAR = 'RECURSIONVAR'; TYPENAME = 'TYPENAME'; SIGNAME = 'SIGNAME'; + + UNARYPAYLOADELEM = 'UNARYPAYLOADELEM'; } @@ -170,6 +172,10 @@ tokens //import org.scribble.main.RuntimeScribbleException; //import org.scribble.parser.scribble.ast.tree.MyCommonTree; import org.scribble.ast.ScribNodeBase; + import org.scribble.ast.UnaryPayloadElem; + import org.scribble.ast.name.qualified.DataTypeNode; + import org.scribble.ast.name.simple.IdNode; + import org.scribble.ast.name.simple.AmbigNameNode; } @lexer::header @@ -229,6 +235,38 @@ tokens super.displayRecognitionError(tokenNames, e); System.exit(1); } + + // qn = qualifiedname + public static CommonTree parsePayloadElem(CommonTree qn) throws RecognitionException + { + System.out.println("ggg1: " + qn + " ,, " + qn.token + " ,, " + qn.getChildren()); + if (qn.getChildCount() > 1) + { + //DataTypeNode dt = AntlrQualifiedName.toDataTypeNameNode(ct, af); + //String text = qn.getChild(0).getText(); + DataTypeNode dt = new DataTypeNode(new CommonToken(TYPENAME, "TYPENAME")); + ((List) qn.getChildren()).forEach(x -> dt.addChild(new IdNode(new CommonToken(IDENTIFIER, ((CommonTree) x).getText())))); + //UnaryPayloadElem pe = new UnaryPayloadElem(qn.token); + UnaryPayloadElem pe = new UnaryPayloadElem(new CommonToken(UNARYPAYLOADELEM, "UNARYPAYLOADELEM")); // CHECKME: OK to use qn.token? + pe.addChild(dt); + return pe; + } + else + { + // Similarly to NonRoleArg: cannot syntactically distinguish right now between SimplePayloadTypeNode and ParameterNode + //AmbigNameNode an = AntlrAmbigName.toAmbigNameNode(ct, af); + //return af.UnaryPayloadElem(ct, an); + String text = qn.getChild(0).getText(); + IdNode id = new IdNode(new CommonToken(IDENTIFIER, text)); + AmbigNameNode an = new AmbigNameNode(new CommonToken(AMBIGUOUSNAME, "AMBIGUOUSNAME")); + an.addChild(id); + //UnaryPayloadElem pe = new UnaryPayloadElem(qn.token); // CHECKME: OK to use qn.token? + UnaryPayloadElem pe = new UnaryPayloadElem(new CommonToken(UNARYPAYLOADELEM, "UNARYPAYLOADELEM")); // CHECKME: OK to use qn.token? + pe.addChild(an); + System.out.println("ggg2: " + pe + " ,, " + pe.token + " ,, " + pe.getChildren()); + return pe; + } + } } @lexer::members @@ -523,7 +561,9 @@ payload: payloadelement: /* ambiguousname // Parser doesn't distinguish simple from qualified properly, even with backtrack |*/ - qualifiedname // This case subsumes simple names // FIXME: ambiguousqualifiedname (or ambiguousname should just be qualified) + qualifiedname // This case subsumes simple names // FIXME: make ambiguousqualifiedname (or ambiguousname should just be qualified) +-> + { parsePayloadElem($qualifiedname.tree) } // Use ".text" instead of ".tree" for token String | protocolname '@' rolename -> @@ -531,6 +571,7 @@ payloadelement: ; + /** * Section 3.6 Protocol Declarations */ From 0c890d2ee368241f8f5a7470f00a9b59d091e07c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 17 Mar 2019 14:33:49 +0000 Subject: [PATCH 123/539] Continued: refactored do-arg parsing. --- .../org/scribble/ast/DelDecoratorImpl.java | 2 +- .../java/org/scribble/ast/NonRoleArgList.java | 3 + .../java/org/scribble/ast/TypeParamDecl.java | 6 +- .../ast/name/simple/NonRoleParamNode.java | 2 +- .../org/scribble/parser/antlr/Scribble.g | 63 +++++++++++++------ .../parser/scribble/ScribTreeAdaptor.java | 3 +- 6 files changed, 55 insertions(+), 24 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java index b33e1ddc5..365a65c6e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java @@ -155,7 +155,7 @@ public void decorate(CommonTree n) case "ARGUMENTINSTANTIATIONLIST": NonRoleArgList((NonRoleArgList) n); break; - case "ARGUMENTINSTANTIATION": + case "NONROLEARG": NonRoleArg((NonRoleArg) n); break; diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java index 6b3b9aef6..e413b8bcb 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java @@ -40,6 +40,9 @@ public NonRoleArgList(NonRoleArgList node) @Override public List getArgChildren() { + System.out.println("nnn1: " + getChildren() + " ,, "); + getChildren().forEach(x -> System.out.println(x.getClass() + " ,, " + ((CommonTree) x).getChildren())); + return getRawArgChildren().stream().map(x -> (NonRoleArg) x) .collect(Collectors.toList()); } diff --git a/scribble-core/src/main/java/org/scribble/ast/TypeParamDecl.java b/scribble-core/src/main/java/org/scribble/ast/TypeParamDecl.java index f71582cd0..5efa3809c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/TypeParamDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/TypeParamDecl.java @@ -14,7 +14,7 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.ast.name.qualified.DataTypeNode; +import org.scribble.ast.name.simple.TypeParamNode; import org.scribble.type.kind.DataTypeKind; import org.scribble.type.name.Name; import org.scribble.type.name.Role; @@ -40,9 +40,9 @@ public TypeParamDecl dupNode() } @Override - public DataTypeNode getNameNodeChild() + public TypeParamNode getNameNodeChild() { - return (DataTypeNode) getRawNameNodeChild(); // CHECKME: make Type/SigParamNode? + return (TypeParamNode) getRawNameNodeChild(); // CHECKME: make Type/SigParamNode? } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java index 1f2314ebd..647d7de4d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java @@ -30,7 +30,7 @@ public abstract class NonRoleParamNode extends public NonRoleParamNode(Token t, K kind) { super(t); - this.kind = null; // FIXME: how to set? (disamb?) -- probably do concrete data/sig subclasses? + this.kind = kind; // FIXME: how to set? (disamb?) -- probably do concrete data/sig subclasses? } // Tree#dupNode constructor diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index b71227d53..345d0487b 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -130,8 +130,8 @@ tokens SIGPARAMDECL = 'SIGPARAMDECL'; ROLEINSTANTIATIONLIST = 'ROLEINSTANTIATIONLIST'; ROLEINSTANTIATION = 'ROLEINSTANTIATION'; // FIXME: not consistent with arginstas/payloadeles - ARGUMENTINSTANTIATIONLIST = 'ARGUMENTINSTANTIATIONLIST'; - ARGUMENTINSTANTIATION = 'ARGUMENTINSTANTIATION'; + ARGUMENTINSTANTIATIONLIST = 'ARGUMENTINSTANTIATIONLIST'; // FIXME: token name inconsistent with class name (NonRoleArgList) + //ARGUMENTINSTANTIATION = 'ARGUMENTINSTANTIATION'; //CONNECTDECL = 'connect-decl'; GLOBALPROTOCOLDECL = 'GLOBALPROTOCOLDECL'; @@ -161,6 +161,7 @@ tokens SIGNAME = 'SIGNAME'; UNARYPAYLOADELEM = 'UNARYPAYLOADELEM'; + NONROLEARG = 'NONROLEARG'; } @@ -173,6 +174,7 @@ tokens //import org.scribble.parser.scribble.ast.tree.MyCommonTree; import org.scribble.ast.ScribNodeBase; import org.scribble.ast.UnaryPayloadElem; + import org.scribble.ast.NonRoleArg; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.AmbigNameNode; @@ -239,32 +241,57 @@ tokens // qn = qualifiedname public static CommonTree parsePayloadElem(CommonTree qn) throws RecognitionException { - System.out.println("ggg1: " + qn + " ,, " + qn.token + " ,, " + qn.getChildren()); + //System.out.println("ggg1: " + qn + " ,, " + qn.token + " ,, " + qn.getChildren()); if (qn.getChildCount() > 1) { - //DataTypeNode dt = AntlrQualifiedName.toDataTypeNameNode(ct, af); - //String text = qn.getChild(0).getText(); DataTypeNode dt = new DataTypeNode(new CommonToken(TYPENAME, "TYPENAME")); - ((List) qn.getChildren()).forEach(x -> dt.addChild(new IdNode(new CommonToken(IDENTIFIER, ((CommonTree) x).getText())))); - //UnaryPayloadElem pe = new UnaryPayloadElem(qn.token); - UnaryPayloadElem pe = new UnaryPayloadElem(new CommonToken(UNARYPAYLOADELEM, "UNARYPAYLOADELEM")); // CHECKME: OK to use qn.token? + ((List) qn.getChildren()).forEach(x -> + dt.addChild(new IdNode(new CommonToken(IDENTIFIER, ((CommonTree) x).getText())))); + UnaryPayloadElem pe = + new UnaryPayloadElem(new CommonToken(UNARYPAYLOADELEM, "UNARYPAYLOADELEM")); pe.addChild(dt); return pe; } else { // Similarly to NonRoleArg: cannot syntactically distinguish right now between SimplePayloadTypeNode and ParameterNode - //AmbigNameNode an = AntlrAmbigName.toAmbigNameNode(ct, af); - //return af.UnaryPayloadElem(ct, an); String text = qn.getChild(0).getText(); IdNode id = new IdNode(new CommonToken(IDENTIFIER, text)); - AmbigNameNode an = new AmbigNameNode(new CommonToken(AMBIGUOUSNAME, "AMBIGUOUSNAME")); + AmbigNameNode an = + new AmbigNameNode(new CommonToken(AMBIGUOUSNAME, "AMBIGUOUSNAME")); an.addChild(id); - //UnaryPayloadElem pe = new UnaryPayloadElem(qn.token); // CHECKME: OK to use qn.token? - UnaryPayloadElem pe = new UnaryPayloadElem(new CommonToken(UNARYPAYLOADELEM, "UNARYPAYLOADELEM")); // CHECKME: OK to use qn.token? - pe.addChild(an); - System.out.println("ggg2: " + pe + " ,, " + pe.token + " ,, " + pe.getChildren()); - return pe; + UnaryPayloadElem e = new UnaryPayloadElem( + new CommonToken(UNARYPAYLOADELEM, "UNARYPAYLOADELEM")); + e.addChild(an); + //System.out.println("ggg2: " + e + " ,, " + e.token + " ,, " + e.getChildren()); + return e; + } + } + + // Only for QualifiedName (DataTypeNode or AmbigNameNode), not messagesignature literal + // qn = qualifiedname + public static CommonTree parseNonRoleArg(CommonTree qn) throws RecognitionException + { + if (qn.getChildCount() > 1) + { + DataTypeNode dt = new DataTypeNode(new CommonToken(TYPENAME, "TYPENAME")); + ((List) qn.getChildren()).forEach(x -> + dt.addChild(new IdNode(new CommonToken(IDENTIFIER, ((CommonTree) x).getText())))); + NonRoleArg a = + new NonRoleArg(new CommonToken(NONROLEARG, "NONROLEARG")); + a.addChild(dt); + return a; + } + else + { + String text = qn.getChild(0).getText(); + IdNode id = new IdNode(new CommonToken(IDENTIFIER, text)); + AmbigNameNode an = + new AmbigNameNode(new CommonToken(AMBIGUOUSNAME, "AMBIGUOUSNAME")); + an.addChild(id); + NonRoleArg a = new NonRoleArg(new CommonToken(NONROLEARG, "NONROLEARG")); + a.addChild(an); + return a; } } } @@ -852,12 +879,12 @@ argumentinstantiation: // Grammatically same as message, but argument case can also be a payload type messagesignature -> - ^(ARGUMENTINSTANTIATION messagesignature) + ^(NONROLEARG messagesignature) /*| ambiguousname // As for payloadelement: parser doesn't distinguish simple from qualified properly, even with backtrack*/ | qualifiedname -> - ^(ARGUMENTINSTANTIATION qualifiedname) + { parseNonRoleArg($qualifiedname.tree) } // Cf. parsePayloadElem ; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 2f3e23871..23f431f44 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -147,6 +147,7 @@ public Object create(Token t) return new OpNode(t); case "PAYLOAD": return new PayloadElemList(t); + // N.N. UnaryPayloadElem parsed "manually" in Scribble.g case "ROLEINSTANTIATIONLIST": return new RoleArgList(t); @@ -154,7 +155,7 @@ public Object create(Token t) return new RoleArg(t); case "ARGUMENTINSTANTIATIONLIST": return new NonRoleArgList(t); - case "ARGUMENTINSTANTIATION": + case "NONROLEARG": // Only for messagesignature -- qualifiedname (datatypenode or ambignamenode) done "manually" in scribble.g (cf. UnaryPayloadElem) return new NonRoleArg(t); //return new MyCommonTree(t); // FIXME: placeholder for deleg, qualified or ambig From 9100ba0cbcbc01db2799d32b131d66d6e69b4a98 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 17 Mar 2019 14:52:59 +0000 Subject: [PATCH 124/539] Minor. --- .../src/main/antlr3/org/scribble/parser/antlr/Scribble.g | 2 +- .../java/org/scribble/parser/scribble/ScribTreeAdaptor.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 345d0487b..7ed3b1c86 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -250,7 +250,7 @@ tokens UnaryPayloadElem pe = new UnaryPayloadElem(new CommonToken(UNARYPAYLOADELEM, "UNARYPAYLOADELEM")); pe.addChild(dt); - return pe; + return pe; // N.B. "re-parsed" by ScribTreeAdaptor? Could return CommonTree here? } else { diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 23f431f44..c9eec7a8f 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -177,6 +177,9 @@ public Object create(Token t) case "AMBIGUOUSNAME": return new AmbigNameNode(t); default: + + //System.out.println("aaa1: " + lab); // FIXME: QUALIFIEDNAME (e.g., good.misc.globals.gdo.Do06b) // CHECKME: UNARYPAYLOADELEM? + //throw new RuntimeException("Shouldn't get here: " + lab + " ,, " + lab.length()); //return new MyCommonTree(t); return new IdNode(t); // FIXME: currently all name "leaf" nodes are there, so not ambig, more like ID From 1ccfbd511a0420cf674cc9a8944c83f229b2a65d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 18 Mar 2019 15:31:20 +0000 Subject: [PATCH 125/539] Continued: refactored module imports. --- .../java/org/scribble/cli/CLArgParser.java | 1 + .../java/org/scribble/main/MainContext.java | 15 +++-- .../org/scribble/main/ScribModuleLoader.java | 18 +++--- .../scribble/main/ScribbleAntlrWrapper.java | 12 +++- .../org/scribble/ast/DelDecoratorImpl.java | 4 +- .../java/org/scribble/ast/ImportDecl.java | 54 ++---------------- .../java/org/scribble/ast/ImportModule.java | 56 +++++++++++++++++-- .../scribble/ast/context/ModuleContext.java | 4 +- .../main/java/org/scribble/del/ModuleDel.java | 2 +- .../src/main/java/org/scribble/job/Job.java | 3 + .../visit/context/ModuleContextBuilder.java | 2 +- .../org/scribble/parser/antlr/Scribble.g | 14 ++--- .../parser/scribble/ScribTreeAdaptor.java | 8 +++ 13 files changed, 111 insertions(+), 82 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java index cfe769aed..f9270d6cb 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java @@ -420,6 +420,7 @@ private static boolean validateModuleArg(String arg) private static boolean validatePaths(String paths) { + System.out.println(System.getProperty("user.dir")); for (String path : paths.split(File.pathSeparator)) { if (!new File(path).isDirectory()) diff --git a/scribble-cli/src/main/java/org/scribble/main/MainContext.java b/scribble-cli/src/main/java/org/scribble/main/MainContext.java index 513b63c6d..ea4a697d5 100644 --- a/scribble-cli/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-cli/src/main/java/org/scribble/main/MainContext.java @@ -103,18 +103,16 @@ public MainContext(boolean debug, ResourceLocator locator, Path mainpath, //Pair p = this.loader.loadMainModule(mainpath); Resource res = DirectoryResourceLocator.getResourceByFullPath(mainpath); // TODO: hardcoded to DirectoryResourceLocator -- main module loading should be factored out to front end (e.g. CommandLine) - CommonTree atree = this.antlrParser.parseAntlrTree(res); + Module mod = this.antlrParser.parseAntlrTree(res); // Does del decoration // FIXME HERE: deprecate scribParser -- move ANTLR error checking out - Module mod = (Module) atree;//this.scribParser.parse(atree, this.af); // TODO: rename exceptions + /*Module mod = (Module) atree;//this.scribParser.parse(atree, this.af); // TODO: rename exceptions /*HERE del decorator move ast to parser? and make core/lang*/ - - new DelDecoratorImpl().decorate(mod); - //HERE: debug context building or name disamb (role node child lost) + //HERE: debug context building or name disamb (role node child lost)*/ checkMainModuleName(mainpath, mod, noValidation); @@ -138,8 +136,9 @@ public MainContext(boolean debug, ResourceLocator locator, String inline, spin); Resource res = new InlineResource(inline); - Module mod = (Module) this.scribParser - .parse(this.antlrParser.parseAntlrTree(res), this.af); + /*Module mod = (Module) this.scribParser + .parse(this.antlrParser.parseAntlrTree(res), this.af);*/ + Module mod = (Module) this.antlrParser.parseAntlrTree(res); // Does del decoration init( debug, locator, useOldWF, @@ -221,7 +220,7 @@ private void loadAllModules(Pair module) ((ImportModule) id).getModuleNameNodeChild().toName(); if (!this.parsed.containsKey(modname)) { - loadAllModules(this.loader.loadModule(modname, af)); + loadAllModules(this.loader.loadModule(modname, this.af)); } } } diff --git a/scribble-cli/src/main/java/org/scribble/main/ScribModuleLoader.java b/scribble-cli/src/main/java/org/scribble/main/ScribModuleLoader.java index 9ae44b74c..0015415a4 100644 --- a/scribble-cli/src/main/java/org/scribble/main/ScribModuleLoader.java +++ b/scribble-cli/src/main/java/org/scribble/main/ScribModuleLoader.java @@ -16,7 +16,6 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Module; import org.scribble.job.ScribbleException; -import org.scribble.main.DefaultModuleLoader; import org.scribble.main.resource.Resource; import org.scribble.main.resource.ResourceLocator; import org.scribble.parser.scribble.AntlrToScribParser; @@ -32,8 +31,9 @@ public class ScribModuleLoader extends DefaultModuleLoader //implements ModuleLo private ResourceLocator locator; private ScribbleAntlrWrapper antlr; private AntlrToScribParser parser; - - public ScribModuleLoader(ResourceLocator locator, ScribbleAntlrWrapper antlr, AntlrToScribParser parser) + + public ScribModuleLoader(ResourceLocator locator, ScribbleAntlrWrapper antlr, + AntlrToScribParser parser) { this.locator = locator; this.antlr = antlr; @@ -41,15 +41,18 @@ public ScribModuleLoader(ResourceLocator locator, ScribbleAntlrWrapper antlr, An } @Override - public Pair loadModule(ModuleName modname, AstFactory af) throws ScribParserException, ScribbleException + public Pair loadModule(ModuleName modname, AstFactory af) + throws ScribParserException, ScribbleException { Pair cached = super.loadModule(modname, af); if (cached != null) { return cached; - } + } Resource res = this.locator.getResource(modname.toPath()); - Module parsed = (Module) this.parser.parse(this.antlr.parseAntlrTree(res), af); + /*Module parsed = (Module) this.parser.parse(this.antlr.parseAntlrTree(res), + af);*/ + Module parsed = this.antlr.parseAntlrTree(res); // Does del decoration checkModuleName(modname, res, parsed); registerModule(res, parsed); return new Pair<>(res, parsed); @@ -59,7 +62,8 @@ private static void checkModuleName(ModuleName mn, Resource res, Module mod) { if (!mn.equals(mod.getFullModuleName())) { - throw new RuntimeException("Invalid module name " + mod.getFullModuleName() + " at location: " + res.getLocation()); + throw new RuntimeException("Invalid module name " + + mod.getFullModuleName() + " at location: " + res.getLocation()); } } } diff --git a/scribble-cli/src/main/java/org/scribble/main/ScribbleAntlrWrapper.java b/scribble-cli/src/main/java/org/scribble/main/ScribbleAntlrWrapper.java index f32d38602..ca775d71a 100644 --- a/scribble-cli/src/main/java/org/scribble/main/ScribbleAntlrWrapper.java +++ b/scribble-cli/src/main/java/org/scribble/main/ScribbleAntlrWrapper.java @@ -21,6 +21,9 @@ import org.antlr.runtime.Lexer; import org.antlr.runtime.RecognitionException; import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.DelDecorator; +import org.scribble.ast.DelDecoratorImpl; +import org.scribble.ast.Module; import org.scribble.main.resource.Resource; import org.scribble.parser.antlr.ScribbleLexer; import org.scribble.parser.antlr.ScribbleParser; @@ -31,6 +34,8 @@ // Not encapsulated inside ScribParser, because ScribParser's main function is the higher-level operation of "parsing" CommonTrees into ScribNodes public class ScribbleAntlrWrapper { + private final DelDecorator df = new DelDecoratorImpl(); + public ScribbleAntlrWrapper() { @@ -55,7 +60,8 @@ protected CommonTree runScribbleParser(CommonTokenStream cts) throws Recognition return (CommonTree) p.module().getTree(); } - public CommonTree parseAntlrTree(Resource res) + // Parse Resource into Module + public Module parseAntlrTree(Resource res) { try { @@ -70,7 +76,9 @@ public CommonTree parseAntlrTree(Resource res) /*// FIXME: need an interface for Scribble top-level module method (ANTLR "grammar actions"?) Method m = c.getMethod("module"); return (CommonTree) ((ParserRuleReturnScope) m.invoke(parser)).getTree();*/ // No: reflection doesn't work well with ANTLR error handling - return runScribbleParser(new CommonTokenStream(lex)); + Module mod = (Module) runScribbleParser(new CommonTokenStream(lex)); + this.df.decorate(mod); + return mod; } /*catch (NoSuchMethodException nsme) { diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java index 365a65c6e..6b7eb38fb 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java @@ -87,7 +87,9 @@ public void decorate(CommonTree n) ModuleDecl((ModuleDecl) n); break; - //case IMPORTMODULE: + case "IMPORTMODULE": + ImportModule((ImportModule) n); + break; case "MESSAGESIGNATUREDECL": //return AntlrMessageSigDecl.parseMessageSigDecl(this, ct, af); MessageSigNameDecl((MessageSigNameDecl) n); diff --git a/scribble-core/src/main/java/org/scribble/ast/ImportDecl.java b/scribble-core/src/main/java/org/scribble/ast/ImportDecl.java index 0ee064f76..f6415e0e8 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ImportDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/ImportDecl.java @@ -15,14 +15,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; import org.scribble.type.kind.ImportKind; import org.scribble.type.name.Name; -import org.scribble.visit.AstVisitor; -// TODO: factor out stuff from ImportModule and ImportMember into here, e.g. alias/name, reconstruct +// CHECKME: factor out more stuff from ImportModule and ImportMember into here? e.g. alias/name, reconstruct (or else no need for common super?) public abstract class ImportDecl extends ScribNodeBase//, ModuleMember //implements NameDeclaration { // ScribTreeAdaptor#create constructor @@ -39,55 +35,15 @@ protected ImportDecl(ImportDecl node) public abstract ImportDecl dupNode(); - public abstract Name getAlias(); - //public abstract Name getVisibleName(); - - public ModuleNameNode getModuleNameNodeChild() - { - return (ModuleNameNode) getChild(0); - } - - public ModuleNameNode getAliasNameNodeChild() - { - return (ModuleNameNode) getChild(1); - } - public boolean isImportModule() { return false; } - - public boolean isAliased() - { - //return this.alias != null; - return getChildCount() > 1; - } - - // alias == null if no alias - public ImportDecl reconstruct(ModuleNameNode modname, ModuleNameNode alias) - { - ImportDecl im = dupNode(); - ScribDel del = del(); - im.addChild(modname); - if (alias != null) - { - im.addChild(alias); - } - im.setDel(del); // No copy - return im; - } - - @Override - public ImportDecl visitChildren(AstVisitor nv) throws ScribbleException - { - ModuleNameNode modname = (ModuleNameNode) - visitChild(getModuleNameNodeChild(), nv); - ModuleNameNode alias = isAliased() - ? (ModuleNameNode) visitChild(getAliasNameNodeChild(), nv) - : null; - return reconstruct(modname, alias); - } + public abstract boolean hasAlias(); + + public abstract Name getAlias(); + //public abstract Name getVisibleName(); diff --git a/scribble-core/src/main/java/org/scribble/ast/ImportModule.java b/scribble-core/src/main/java/org/scribble/ast/ImportModule.java index e90ff5b24..7a4f86dbc 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ImportModule.java +++ b/scribble-core/src/main/java/org/scribble/ast/ImportModule.java @@ -16,8 +16,11 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.del.ScribDel; +import org.scribble.job.ScribbleException; import org.scribble.type.kind.ModuleKind; import org.scribble.type.name.ModuleName; +import org.scribble.visit.AstVisitor; public class ImportModule extends ImportDecl { @@ -37,6 +40,17 @@ protected ImportModule(ImportModule node) this.alias = null; } + public ModuleNameNode getModuleNameNodeChild() + { + return (ModuleNameNode) getChild(0); + } + + // No child if no alias (cf., this.hasAlias) + public ModuleNameNode getAliasNameNodeChild() + { + return (ModuleNameNode) getChild(1); + } + // Cf. CommonTree#dupNode @Override public ImportModule dupNode() @@ -44,17 +58,43 @@ public ImportModule dupNode() return new ImportModule(this); } + // alias == null if no alias + public ImportModule reconstruct(ModuleNameNode modname, ModuleNameNode alias) + { + ImportModule im = dupNode(); + ScribDel del = del(); + im.addChild(modname); + if (alias != null) + { + im.addChild(alias); + } + im.setDel(del); // No copy + return im; + } + + @Override + public ImportModule visitChildren(AstVisitor nv) throws ScribbleException + { + ModuleNameNode modname = (ModuleNameNode) + visitChild(getModuleNameNodeChild(), nv); + ModuleNameNode alias = hasAlias() + ? (ModuleNameNode) visitChild(getAliasNameNodeChild(), nv) + : null; + return reconstruct(modname, alias); + } + @Override public boolean isImportModule() { return true; } - /*@Override - public ModuleName getVisibleName() + @Override + public boolean hasAlias() { - return isAliased() ? getAlias() : this.modname.toName(); - }*/ + //return this.alias != null; + return getChildCount() > 1; + } @Override public ModuleName getAlias() @@ -62,11 +102,17 @@ public ModuleName getAlias() return getAliasNameNodeChild().toName(); } + /*@Override + public ModuleName getVisibleName() + { + return isAliased() ? getAlias() : this.modname.toName(); + }*/ + @Override public String toString() { String s = Constants.IMPORT_KW + " " + getModuleNameNodeChild(); - if (isAliased()) + if (hasAlias()) { s += " " + Constants.AS_KW + " " + getAlias(); } diff --git a/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java b/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java index ded20bf3a..7473fb97e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java +++ b/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java @@ -150,7 +150,7 @@ private void addVisible(Map parsed, Module root) { ImportModule im = (ImportModule) id; ModuleName fullname = im.getModuleNameNodeChild().toName(); - ModuleName visname = (im.isAliased()) ? im.getAlias() : fullname; + ModuleName visname = (im.hasAlias()) ? im.getAlias() : fullname; // getVisibleName doesn't use fullname if (this.visible.modules.containsKey(visname)) { @@ -248,6 +248,8 @@ public ProtocolName getVisibleProtocolDeclFullName( public boolean isVisibleProtocolDeclName( ProtocolName visname) { + System.out.println("mc1: " + this.visible.globals.keySet() + " ,, " + visname); + return this.visible.isVisibleProtocolDeclName(visname); } diff --git a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java b/scribble-core/src/main/java/org/scribble/del/ModuleDel.java index 33971645d..50aa64d73 100644 --- a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ModuleDel.java @@ -184,7 +184,7 @@ public Module createModuleForProjection(Projector proj, Module root, @Override public String toString() { - return (this.mcontext == null) ? null : this.mcontext.toString(); // null before and during context building + return (this.mcontext == null) ? "[]" : this.mcontext.toString(); // null before and during context building } public ModuleContext getModuleContext() diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index af4f1d4ed..a6a1e46b2 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -349,6 +349,9 @@ private void runVisitorPass(Set modnames, for (ModuleName modname : modnames) { AstVisitor nv = cons.newInstance(this); + + System.out.println("jjj1: " + modname); + runVisitorOnModule(modname, nv); } } diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java index c2ae93f66..719381af4 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java @@ -32,7 +32,7 @@ public ModuleContextBuilder(Job job) @Override protected void enter(ScribNode parent, ScribNode child) throws ScribbleException { - //System.out.println("mmm1: " + child.getClass() + " ,, " + child.del()); + System.out.println("mmm1: " + child.getClass() + " ,, " + child.del()); child.del().enterModuleContextBuilding(parent, child, this); } diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 7ed3b1c86..d5b58a644 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -85,8 +85,8 @@ tokens // "Node type" constants -- but not parsed "directly" by AntlrToScribParser - EMPTY_ALIAS = 'EMTPY_ALIAS'; - //EMPTY_PACKAGENAME = '__empty_packagebame'; + //EMPTY_ALIAS = 'EMTPY_ALIAS'; + ////EMPTY_PACKAGENAME = '__empty_packagebame'; EMPTY_OPERATOR = 'EMPTY_OPERATOR'; //EMPTY_PARAMETERDECLLIST = '__empty_parameterdecllist'; @@ -490,21 +490,21 @@ moduledecl: */ importdecl: importmodule -| - importmember +/*| + importmember*/ ; importmodule: IMPORT_KW modulename ';' -> - ^(IMPORTMODULE modulename EMPTY_ALIAS) + ^(IMPORTMODULE modulename) | IMPORT_KW modulename AS_KW simplemodulename ';' -> ^(IMPORTMODULE modulename simplemodulename) ; -importmember: +/*importmember: FROM_KW modulename IMPORT_KW simplemembername ';' -> ^(IMPORTMEMBER modulename simplemembername EMPTY_ALIAS) @@ -512,7 +512,7 @@ importmember: FROM_KW modulename IMPORT_KW simplemembername AS_KW simplemembername ';' -> ^(IMPORTMEMBER modulename simplemembername simplemembername) -; +;*/ /** diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index c9eec7a8f..08edc8b35 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -3,6 +3,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTreeAdaptor; import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.ImportModule; import org.scribble.ast.MessageSigNameDecl; import org.scribble.ast.MessageSigNode; import org.scribble.ast.Module; @@ -88,6 +89,10 @@ public Object create(Token t) return new ModuleNameNode(t); /*.. HERE ambigname -- or qualifiedname? (ambigname currently singleton name) -- or modulename just as identifiers? -- ANTLR uses every (leaf) token as singleton node -- AntlrTokenTree? -- i.e. CommonTree (wrapper for Token)*/ + + case "IMPORTMODULE": + return new ImportModule(t); + case "PAYLOADTYPEDECL": return new DataTypeDecl(t); case "MESSAGESIGNATUREDECL": @@ -180,6 +185,9 @@ public Object create(Token t) //System.out.println("aaa1: " + lab); // FIXME: QUALIFIEDNAME (e.g., good.misc.globals.gdo.Do06b) // CHECKME: UNARYPAYLOADELEM? + //FIXME: add explicit check for unhandled parser categories (e.g., use __ prefixes) -- cf. actual IDs + + //throw new RuntimeException("Shouldn't get here: " + lab + " ,, " + lab.length()); //return new MyCommonTree(t); return new IdNode(t); // FIXME: currently all name "leaf" nodes are there, so not ambig, more like ID From 78f563455753d36236ed58e0ec0fd4971d05f799 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 18 Mar 2019 15:34:26 +0000 Subject: [PATCH 126/539] Continued: fixed simple module name parsing bug. --- .../src/main/antlr3/org/scribble/parser/antlr/Scribble.g | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index d5b58a644..5a97eeda3 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -424,7 +424,7 @@ ambiguousname: * Section 3.2.1 Package, Module and Module Member Names */ -simplemodulename: simplename; +//simplemodulename: simplename; //simplepayloadtypename: simplename; //simplemessagesignaturename: simplename; simpleprotocolname: simplename; @@ -504,6 +504,12 @@ importmodule: ^(IMPORTMODULE modulename simplemodulename) ; +simplemodulename: + IDENTIFIER +-> + ^(MODULENAME IDENTIFIER) +; + /*importmember: FROM_KW modulename IMPORT_KW simplemembername ';' -> From f7f75388ad06bbbd7a5e4cbe4941d526932b7bd4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 22 Mar 2019 15:38:54 +0000 Subject: [PATCH 127/539] ScribGoodTest OK. --- .../src/main/java/org/scribble/lang/global/GRecursion.java | 4 +--- .../src/main/java/org/scribble/lang/local/LChoice.java | 6 ++++++ .../src/main/java/org/scribble/lang/local/LContinue.java | 6 ++++++ .../src/main/java/org/scribble/lang/local/LProtocol.java | 6 ++++++ .../src/main/java/org/scribble/lang/local/LRcv.java | 6 ++++++ .../src/main/java/org/scribble/lang/local/LRecursion.java | 6 ++++++ .../src/main/java/org/scribble/lang/local/LSend.java | 6 ++++++ .../src/main/java/org/scribble/lang/local/LSeq.java | 6 ++++++ .../src/main/java/org/scribble/lang/local/LSkip.java | 6 ++++++ .../src/main/java/org/scribble/lang/local/LType.java | 3 ++- .../org/scribble/visit/context/ModuleContextBuilder.java | 2 +- 11 files changed, 52 insertions(+), 5 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java index 4c9ebe467..2c866cbec 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java @@ -9,7 +9,6 @@ import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; -import org.scribble.lang.local.LContinue; import org.scribble.lang.local.LRecursion; import org.scribble.lang.local.LSeq; import org.scribble.lang.local.LSkip; @@ -66,8 +65,7 @@ public GType unfoldAllOnce(STypeUnfolder u) public LType project(Role self) { LSeq body = this.body.project(self); - if (body.isEmpty() - || (body.elems.size() == 1 && (body.elems.get(0) instanceof LContinue))) + if (body.isEmpty() || body.isSingleCont()) // recvar doesn't matter for isSingleCont { return LSkip.SKIP; } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java index c43ac5af4..f8f44d2c3 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java @@ -33,6 +33,12 @@ public LChoice reconstruct(org.scribble.ast.Choice source, Role subj, return new LChoice(source, subj, blocks); } + @Override + public boolean isSingleCont() + { + return this.blocks.stream().allMatch(x -> x.isSingleCont()); + } + @Override public LChoice substitute(Substitutions subs) { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java index d98030f12..3b006efbe 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java @@ -32,6 +32,12 @@ public LContinue reconstruct(org.scribble.ast.ProtocolKindNode source, { return new LContinue(source, recvar); } + + @Override + public boolean isSingleCont() + { + return true; + } @Override public LContinue substitute(Substitutions subs) diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index 5edc15c29..aa5b7e077 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -39,6 +39,12 @@ public LProtocol reconstruct(ProtocolDecl source, { return new LProtocol(source, mods, fullname, roles, def); } + + @Override + public boolean isSingleCont() + { + throw new RuntimeException("Unsupported for LProtocol:\n" + this); + } @Override public LType substitute(Substitutions subs) diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java b/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java index 53ae757ab..9801a1d97 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java @@ -33,6 +33,12 @@ public LRcv reconstruct( return new LRcv(source, src, msg); } + @Override + public boolean isSingleCont() + { + return false; + } + @Override public LRcv substitute(Substitutions subs) { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java index 513449d78..dc343a1c8 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java @@ -29,6 +29,12 @@ public LRecursion reconstruct(org.scribble.ast.ProtocolKindNode source, { return new LRecursion(source, recvar, block); } + + @Override + public boolean isSingleCont() + { + return false; + } @Override public LRecursion substitute(Substitutions subs) diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSend.java b/scribble-core/src/main/java/org/scribble/lang/local/LSend.java index 4713dcc67..eb182bfbc 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSend.java @@ -33,6 +33,12 @@ public LSend reconstruct( return new LSend(source, msg, dst); } + @Override + public boolean isSingleCont() + { + return false; + } + @Override public LSend substitute(Substitutions subs) { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java index fe3be4e4e..ef3548f67 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java @@ -34,6 +34,12 @@ public LSeq reconstruct(InteractionSeq source, return new LSeq(source, elems); } + @Override + public boolean isSingleCont() + { + return this.elems.size() == 1 && ((LType) this.elems.get(0)).isSingleCont(); + } + @Override public LSeq substitute(Substitutions subs) { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java index d005697d2..9dd231b6d 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java @@ -26,6 +26,12 @@ public Set getRoles() throw new RuntimeException("Unsupported for Skip: " + this); } + @Override + public boolean isSingleCont() + { + return false; + } + @Override public LSkip substitute(Substitutions subs) { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LType.java b/scribble-core/src/main/java/org/scribble/lang/local/LType.java index 0aae84399..44491ad5c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LType.java @@ -11,6 +11,7 @@ public interface LType extends SType { + boolean isSingleCont(); @Override LType substitute(Substitutions subs); @@ -24,7 +25,7 @@ public interface LType extends SType // Uses b to builds graph "progressively" (working graph is mutable) // Use EGraphBuilderUtil2::finalise for final result void buildGraph(EGraphBuilderUtil2 b); - + ReachabilityEnv checkReachability(ReachabilityEnv env) throws ScribbleException; } diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java index 719381af4..c2ae93f66 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java @@ -32,7 +32,7 @@ public ModuleContextBuilder(Job job) @Override protected void enter(ScribNode parent, ScribNode child) throws ScribbleException { - System.out.println("mmm1: " + child.getClass() + " ,, " + child.del()); + //System.out.println("mmm1: " + child.getClass() + " ,, " + child.del()); child.del().enterModuleContextBuilding(parent, child, this); } From 3f06e89f5af9e48b422689e61469c895b3ac895f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 22 Mar 2019 17:52:16 +0000 Subject: [PATCH 128/539] Continued: adding validation. --- .../scribble/ast/global/GProtocolDecl.java | 10 ++-- .../scribble/del/global/GProtocolDeclDel.java | 7 ++- .../src/main/java/org/scribble/job/Job.java | 46 +++++++++++++++++-- .../java/org/scribble/job/JobContext.java | 14 ++---- .../reach/globals/grecursion/Recursion08a.scr | 1 - .../good/syntax/projroledeclfix/Test01.scr | 2 +- 6 files changed, 60 insertions(+), 20 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java index 8ff927c5c..03f65d1b3 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java @@ -27,7 +27,6 @@ import org.scribble.job.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.ModuleName; import org.scribble.type.name.Role; public class GProtocolDecl extends ProtocolDecl implements GNode @@ -84,10 +83,13 @@ public GProtocolDef getDefChild() } @Override - public GProtocolName getFullMemberName(Module mod) + public GProtocolName getFullMemberName(Module mod) // TODO: remove mod from meth sig { - ModuleName fullmodname = mod.getFullModuleName(); - return new GProtocolName(fullmodname, getHeaderChild().getDeclName()); + /*ModuleName fullmodname = mod.getFullModuleName(); + return new GProtocolName(fullmodname, getHeaderChild().getDeclName());*/ + Module m = (Module) getParent(); + return new GProtocolName(m.getFullModuleName(), + getHeaderChild().getDeclName()); } /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 3443b687c..5b4ef60df 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -197,6 +197,9 @@ public void enterValidation(ScribNode parent, ScribNode child, else { validateByScribble(checker.job, fullname, true); + + System.out.println("ppp1: " + checker.job.config.fair); + if (!checker.job.config.fair) { checker.job.debugPrintln( @@ -206,7 +209,7 @@ public void enterValidation(ScribNode parent, ScribNode child, } } - private static void validateByScribble(Job job, GProtocolName fullname, + public static void validateByScribble(Job job, GProtocolName fullname, boolean fair) throws ScribbleException { JobContext jc = job.getJobContext(); @@ -217,7 +220,7 @@ private static void validateByScribble(Job job, GProtocolName fullname, job.config.sf.newSModel(graph).validate(job); } - private static void validateBySpin(Job job, GProtocolName fullname) + public static void validateBySpin(Job job, GProtocolName fullname) throws ScribbleException { JobContext jc = job.getJobContext(); diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index a6a1e46b2..214b60704 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -24,6 +24,7 @@ import org.scribble.ast.Module; import org.scribble.ast.context.ModuleContext; import org.scribble.ast.global.GProtocolDecl; +import org.scribble.del.global.GProtocolDeclDel; import org.scribble.del.local.LProtocolDeclDel; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -52,6 +53,7 @@ import org.scribble.visit.context.Projector; import org.scribble.visit.context.ProtocolDeclContextBuilder; import org.scribble.visit.util.RoleCollector; +import org.scribble.visit.validation.GProtocolValidator; import org.scribble.visit.wf.ExplicitCorrelationChecker; import org.scribble.visit.wf.NameDisambiguator; @@ -228,6 +230,47 @@ public void runWellFormednessPasses() throws ScribbleException } proj.checkReachability(); } + + GProtocolValidator checker = new GProtocolValidator(this); + //runVisitorPassOnAllModules(GProtocolValidator.class); + for (Module mod : this.jctxt.getParsed().values()) + { + // FIXME: refactor validation into lang.GProtocol + for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) + { + if (gpd.isAux()) + { + return; + } + + GProtocolName fullname = gpd.getFullMemberName(mod); + + System.out.println("\nvalidating " + fullname + ":"); + + if (checker.job.config.spin) + { + if (checker.job.config.fair) + { + throw new RuntimeException( + "[TODO]: -spin currently does not support fair ouput choices."); + } + GProtocolDeclDel.validateBySpin(checker.job, fullname); + } + else + { + GProtocolDeclDel.validateByScribble(checker.job, fullname, true); + + System.out.println("ppp1: " + checker.job.config.fair); + + if (!checker.job.config.fair) + { + checker.job.debugPrintln( + "(" + fullname + ") Validating with \"unfair\" output choices.. "); + GProtocolDeclDel.validateByScribble(checker.job, fullname, false); // TODO: only need to check progress, not full validation + } + } + } + } } // Due to Projector not being a subprotocol visitor, so "external" subprotocols may not be visible in ModuleContext building for the projections of the current root Module @@ -349,9 +392,6 @@ private void runVisitorPass(Set modnames, for (ModuleName modname : modnames) { AstVisitor nv = cons.newInstance(this); - - System.out.println("jjj1: " + modname); - runVisitorOnModule(modname, nv); } } diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext.java b/scribble-core/src/main/java/org/scribble/job/JobContext.java index b0fb7c736..28c7974e1 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/job/JobContext.java @@ -23,7 +23,6 @@ import java.util.stream.Collectors; import org.scribble.ast.Module; -import org.scribble.ast.ProtocolMod; import org.scribble.ast.global.GProtocolDecl; import org.scribble.lang.global.GProtocol; import org.scribble.lang.local.LProtocol; @@ -94,14 +93,12 @@ public Set getFullModuleNames() public Set getParsedFullModuleNames() { - Set modnames = new HashSet<>(); - modnames.addAll(this.parsed.keySet()); - return modnames; + return Collections.unmodifiableSet(this.parsed.keySet()); } public Set getProjectedFullModuleNames() { - return this.projected.keySet().stream().map(lpn -> lpn.getPrefix()) + return this.projected.keySet().stream().map(x -> x.getPrefix()) .collect(Collectors.toSet()); } @@ -311,9 +308,8 @@ public SGraph getSGraph(GProtocolName fullname) throws ScribbleException .getProtocolDeclChild(fullname.getSimpleName()); Map egraphs = getEGraphsForSGraphBuilding(fullname, gpd, true); - boolean explicit = - gpd.modifiers.contains(ProtocolMod.EXPLICIT); - //graph = SGraph.buildSGraph(egraphs, explicit, this.job, fullname); + boolean explicit = gpd.isExplicit(); + //graph = SGraph.buildSGraph(egraphs, explicit, this.job, fullname); graph = this.job.buildSGraph(fullname, egraphs, explicit); addSGraph(fullname, graph); } @@ -346,7 +342,7 @@ public SGraph getUnfairSGraph(GProtocolName fullname) throws ScribbleException GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()) .getProtocolDeclChild(fullname.getSimpleName()); Map egraphs = getEGraphsForSGraphBuilding(fullname, gpd, false); - boolean explicit = gpd.modifiers.contains(ProtocolMod.EXPLICIT); + boolean explicit = gpd.isExplicit(); //graph = SGraph.buildSGraph(this.job, fullname, this.job.createInitialSConfig(job, egraphs, explicit)); graph = this.job.buildSGraph(fullname, egraphs, explicit); addUnfairSGraph(fullname, graph); diff --git a/scribble-test/src/test/resources/good/reach/globals/grecursion/Recursion08a.scr b/scribble-test/src/test/resources/good/reach/globals/grecursion/Recursion08a.scr index 23e2f7a26..bee832f00 100644 --- a/scribble-test/src/test/resources/good/reach/globals/grecursion/Recursion08a.scr +++ b/scribble-test/src/test/resources/good/reach/globals/grecursion/Recursion08a.scr @@ -18,4 +18,3 @@ global protocol Recursion8a(role A, role B, role C, role D) } l3() from C to D; } - diff --git a/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr b/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr index da73b0485..10cff809e 100644 --- a/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr +++ b/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr @@ -1,4 +1,4 @@ -//$ bin/scribblec.sh modules/cli/src/test/resources/good/projroledeclfix/Test01.scr -project Bar F +//$ bin/scribblec.sh scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr -project Bar F module good.syntax.projroledeclfix.Test01; From fe51728e15e79d03a1ab17d58ac573b36e0f0885 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 22 Mar 2019 18:09:57 +0000 Subject: [PATCH 129/539] Continued. --- .../java/org/scribble/ast/ProtocolDecl.java | 4 +++- .../java/org/scribble/ast/ProtocolMod.java | 18 +++++++++++++++++- .../java/org/scribble/ast/ProtocolModList.java | 2 +- .../main/java/org/scribble/lang/Protocol.java | 2 +- .../org/scribble/lang/global/GProtocol.java | 3 ++- .../org/scribble/lang/local/LProjection.java | 11 ++++++----- .../org/scribble/lang/local/LProtocol.java | 3 ++- .../good/syntax/projroledeclfix/Test01.scr | 3 +++ 8 files changed, 35 insertions(+), 11 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java index 4dbc79646..2c8f9c14a 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java @@ -103,7 +103,9 @@ public List getRoles() @Override public String toString() { - return getHeaderChild() + " " + getDefChild(); + ProtocolModList mods = getModifierListChild(); + return (mods.isEmpty() ? "" : mods + " ") + getHeaderChild() + " " + + getDefChild(); } diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java index 20dfd2ea8..11bdd0cec 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java @@ -1,3 +1,19 @@ package org.scribble.ast; -public enum ProtocolMod { AUX, EXPLICIT } // CHECKME: move to Header? \ No newline at end of file +// CHECKME: move to Header? +public enum ProtocolMod +{ + AUX, + EXPLICIT; + + @Override + public String toString() + { + switch (this) + { + case AUX: return "aux"; + case EXPLICIT: return "explicit"; + default: throw new RuntimeException("Unknown modifier: " + this); + } + } +} diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java index 236fcf1a0..0d7ecf2ff 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java @@ -88,7 +88,7 @@ private ProtocolMod parseModifier(String mod) { case "aux": return ProtocolMod.AUX; case "explicit": return ProtocolMod.EXPLICIT; - default: throw new RuntimeException("Invalid modifier: " + mod); + default: throw new RuntimeException("Unknown modifier: " + mod); } } } diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index a5cae3435..fd5286035 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -58,7 +58,7 @@ public ProtocolDecl getSource() @Override public String toString() { - return " protocol " + this.fullname + "(" + this.roles.stream() + return "protocol " + this.fullname + "(" + this.roles.stream() .map(x -> x.toString()).collect(Collectors.joining(", ")) + ")" + " {\n" + this.def + "\n}"; } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index 2774ab7b2..e49a69327 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -126,7 +126,8 @@ public GProtocolDecl getSource() @Override public String toString() { - return "global" + super.toString(); + return this.mods.stream().map(x -> x.toString() + " ") + .collect(Collectors.joining()) + "global " + super.toString(); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java index 34baf72e5..77afa199a 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java @@ -68,11 +68,12 @@ public LProtocolDecl getSource() @Override public String toString() { - return "local protocol " + this.fullname - + "(" + this.roles.stream().map(x -> x.toString()) - .collect(Collectors.joining(", ")) + ")" - + " projects " + this.parent - + "@" + this.self + " {\n" + this.def + "\n}"; + return this.mods.stream().map(x -> x.toString() + " ") + "local protocol " + + this.fullname + "(" + + this.roles.stream().map(x -> x.toString()) + .collect(Collectors.joining(", ")) + + ")" + " projects " + this.parent + "@" + this.self + " {\n" + this.def + + "\n}"; } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index aa5b7e077..8a98a790c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -121,7 +121,8 @@ public LProtocolDecl getSource() @Override public String toString() { - return "local" + super.toString(); + return this.mods.stream().map(x -> x.toString() + " ") + "local " + + super.toString(); } @Override diff --git a/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr b/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr index 10cff809e..598ab61f7 100644 --- a/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr +++ b/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr @@ -11,6 +11,9 @@ global protocol Foo(role A, role B, role C) do Bar(A, B, C); } +..HERE CHECKME: aux aux + +aux global protocol Bar(role D, role E, role F) { 2() from D to F; From c5ffbeac37cce83b62983665ba4218d009fc483d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 24 Mar 2019 11:49:16 +0000 Subject: [PATCH 130/539] Fixed protocol mod parsing. --- .../org/scribble/ast/DelDecoratorImpl.java | 6 --- .../java/org/scribble/ast/ProtocolDecl.java | 10 +++-- .../java/org/scribble/ast/ProtocolMod.java | 39 +++++++++++++------ .../org/scribble/ast/ProtocolModList.java | 24 ++++++------ .../java/org/scribble/ast/ScribNodeBase.java | 1 + .../scribble/del/global/GProtocolDeclDel.java | 5 ++- .../main/java/org/scribble/lang/Protocol.java | 1 - .../org/scribble/lang/global/GProtocol.java | 2 +- .../org/scribble/lang/local/LProjection.java | 2 +- .../org/scribble/lang/local/LProtocol.java | 2 +- .../scribble/visit/wf/WFChoiceChecker.java | 4 +- .../parser/scribble/ScribTreeAdaptor.java | 7 ++++ .../ast/global/AntlrGProtocolDecl.java | 6 ++- .../good/syntax/projroledeclfix/Test01.scr | 2 +- 14 files changed, 67 insertions(+), 44 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java index 6b7eb38fb..da42dd98d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java @@ -202,10 +202,6 @@ public void decorate(CommonTree n) TypeParamNode((TypeParamNode) n); break; case "MODULENAME": - - //System.out.println("5555b: " + n.getClass() + " ,, " + type + " ,, " + n); - //System.out.println("4444:" + n + " ,, " + n.getChildren()); - ModuleNameNode((ModuleNameNode) n); break; @@ -215,11 +211,9 @@ public void decorate(CommonTree n) default: // Leaf "ID" nodes //throw new RuntimeException("Unknown ANTLR node type: " + type); - //System.out.println("9999:" + n + " ,, " + n.getChildren()); break; } - //System.out.println("8888:" + n + " ,, " + n.getChildren()); ((List) n.getChildren()).stream().map(x -> (CommonTree) x) .forEach(x -> decorate(x)); } diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java index 2c8f9c14a..cea2a9723 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java @@ -49,14 +49,16 @@ protected ProtocolDecl(ProtocolDecl node) public abstract ProtocolDecl dupNode(); - public boolean isExplicit() + public boolean isAux() { - return getModifierListChild().getModList().contains(ProtocolMod.EXPLICIT); + //return getModifierListChild().getModList().contains(ProtocolMod.AUX); + return getModifierListChild().hasAux(); } - public boolean isAux() + public boolean isExplicit() { - return getModifierListChild().getModList().contains(ProtocolMod.AUX); + //return getModifierListChild().getModList().contains(ProtocolMod.EXPLICIT); + return getModifierListChild().hasExplicit(); } public ProtocolModList getModifierListChild() diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java index 11bdd0cec..2acf48e31 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java @@ -1,19 +1,36 @@ package org.scribble.ast; -// CHECKME: move to Header? -public enum ProtocolMod +import org.antlr.runtime.Token; +import org.scribble.job.ScribbleException; +import org.scribble.visit.AstVisitor; + +public abstract class ProtocolMod extends ScribNodeBase { - AUX, - EXPLICIT; + // ScribTreeAdaptor#create constructor + public ProtocolMod(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected ProtocolMod(ProtocolMod node) + { + super(node); + } + + public boolean isAux() + { + return false; + } + + public boolean isExplicit() + { + return false; + } @Override - public String toString() + public ProtocolMod visitChildren(AstVisitor nv) throws ScribbleException { - switch (this) - { - case AUX: return "aux"; - case EXPLICIT: return "explicit"; - default: throw new RuntimeException("Unknown modifier: " + this); - } + return this; } } diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java index 0d7ecf2ff..82eaf6b96 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java @@ -17,7 +17,6 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; import org.scribble.visit.AstVisitor; @@ -39,8 +38,7 @@ protected ProtocolModList(ProtocolModList node) @Override public ProtocolModList dupNode() { - //return new ProtocolModList(this); // Doesn't include children? - return this; + return new ProtocolModList(this); } @Override @@ -53,21 +51,25 @@ public ProtocolModList visitChildren(AstVisitor nv) throws ScribbleException // Cf., NameNode::getSimpleNameList public List getModList() { - return ((List) getChildren()).stream() + /*return ((List) getChildren()).stream() .map(x -> parseModifier(((CommonTree) x).getText())) .collect(Collectors.toList()); // CHECKME: currently AmbigNameNode(?) - // CHECKME: factor out getText? + // CHECKME: factor out getText?*/ + return ((List) getChildren()).stream().map(x -> (ProtocolMod) x) + .collect(Collectors.toList()); } - public boolean isAux() + public boolean hasAux() { - return getModList().contains(ProtocolMod.AUX); + //return getModList().contains(ProtocolMod.AUX); + return getModList().stream().anyMatch(x -> x.isAux()); } - public boolean isExplicit() + public boolean hasExplicit() { - return getModList().contains(ProtocolMod.EXPLICIT); + //return getModList().contains(ProtocolMod.EXPLICIT); + return getModList().stream().anyMatch(x -> x.isExplicit()); } public boolean isEmpty() @@ -82,7 +84,7 @@ public String toString() .collect(Collectors.joining(" ")); } - private ProtocolMod parseModifier(String mod) + /*private ProtocolMod parseModifier(String mod) { switch (mod) { @@ -90,5 +92,5 @@ private ProtocolMod parseModifier(String mod) case "explicit": return ProtocolMod.EXPLICIT; default: throw new RuntimeException("Unknown modifier: " + mod); } - } + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java index 105845862..c673a59b3 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -98,6 +98,7 @@ protected void setChildren(List children) // FIXME: rework as ANTLR node (deep) copy (maybe "clone") -- no: ANTLR dupNode is node only copy (actually, dupNode is node "shell" only, doesn't even keep children, let alone copy them) // FIXME TODO: rework children using ANTLR children // N.B. does not copy children nor del + // Should call Tree#dupNode constructor (i.e., children not dup'd) -- do not "return this" (unless childress), ends up with children duplicated (because node "dup'd" with children, then children added again) @Override public abstract ScribNodeBase dupNode(); diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 5b4ef60df..2bbf96fc9 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -26,7 +26,6 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Module; import org.scribble.ast.NonRoleParamDeclList; -import org.scribble.ast.ProtocolMod; import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScribNode; import org.scribble.ast.context.DependencyMap; @@ -42,6 +41,7 @@ import org.scribble.job.Job; import org.scribble.job.JobContext; import org.scribble.job.ScribbleException; +import org.scribble.lang.ProtocolMod; import org.scribble.lang.global.GProtocol; import org.scribble.lang.global.GSeq; import org.scribble.lang.global.GTypeTranslator; @@ -75,7 +75,8 @@ public GProtocol translate(ScribNode n, GTypeTranslator t) { GProtocolDecl source = (GProtocolDecl) n; Module m = (Module) n.getParent(); - List mods = source.getModifierListChild().getModList(); + List mods = source.getModifierListChild().getModList().stream() + .map(x -> ProtocolMod.fromAst(x)).collect(Collectors.toList()); GProtocolName fullname = new GProtocolName(m.getFullModuleName(), source.getHeaderChild().getDeclName()); List roles = source.getRoles(); diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index fd5286035..30c50fdf1 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -6,7 +6,6 @@ import java.util.stream.Collectors; import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ProtocolMod; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index e49a69327..cbbd865b4 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -8,10 +8,10 @@ import java.util.stream.Stream; import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ProtocolMod; import org.scribble.ast.global.GProtocolDecl; import org.scribble.job.ScribbleException; import org.scribble.lang.Protocol; +import org.scribble.lang.ProtocolMod; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java index 77afa199a..a908d44f4 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java @@ -4,8 +4,8 @@ import java.util.stream.Collectors; import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ProtocolMod; import org.scribble.ast.local.LProtocolDecl; +import org.scribble.lang.ProtocolMod; import org.scribble.lang.STypeInliner; import org.scribble.lang.Substitutions; import org.scribble.type.SubprotoSig; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index 8a98a790c..d7f6bbc15 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -5,11 +5,11 @@ import java.util.stream.Collectors; import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ProtocolMod; import org.scribble.ast.local.LProtocolDecl; import org.scribble.job.Job; import org.scribble.job.ScribbleException; import org.scribble.lang.Protocol; +import org.scribble.lang.ProtocolMod; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java b/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java index 6de55192c..4604ae12f 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java @@ -19,7 +19,6 @@ import org.scribble.ast.Choice; import org.scribble.ast.InteractionSeq; import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ProtocolMod; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GProtocolDecl; import org.scribble.job.Job; @@ -47,8 +46,7 @@ protected WFChoiceEnv makeRootProtocolDeclEnv( ProtocolDecl pd) { return new WFChoiceEnv(new HashSet<>(pd.getRoles()), - !(pd.isGlobal() && ((GProtocolDecl) pd).modifiers - .contains(ProtocolMod.EXPLICIT))); + !(pd.isGlobal() && pd.isExplicit())); // FIXME: consider locals; also, explicit modifier should be carried over to local projections } diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 08edc8b35..cccacb8cc 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -2,7 +2,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTreeAdaptor; +import org.scribble.ast.AuxMod; import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.ExplicitMod; import org.scribble.ast.ImportModule; import org.scribble.ast.MessageSigNameDecl; import org.scribble.ast.MessageSigNode; @@ -106,6 +108,11 @@ public Object create(Token t) return new GProtocolDecl(t); case "GLOBALPROTOCOLDECLMODS": return new ProtocolModList(t); + case "aux": + return new AuxMod(t); + case "explicit": + return new ExplicitMod(t); + case "GLOBALPROTOCOLHEADER": //return this.f.GProtocolHeader(empty, null, null, null); return new GProtocolHeader(t); case "GPROTOCOLNAME": diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDecl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDecl.java index 38990326e..07f6c07c6 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDecl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDecl.java @@ -19,6 +19,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; +import org.scribble.ast.AuxMod; +import org.scribble.ast.ExplicitMod; import org.scribble.ast.ProtocolMod; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.global.GProtocolDef; @@ -50,8 +52,8 @@ public static GProtocolDecl parseGPrototocolDecl(AntlrToScribParser parser, { switch (mod.getText()) { - case "aux": modifiers.add(ProtocolMod.AUX); break; - case "explicit": modifiers.add(ProtocolMod.EXPLICIT); break; + case "aux": modifiers.add(AuxMod.AUX); break; + case "explicit": modifiers.add(ExplicitMod.EXPLICIT); break; default: throw new RuntimeException("TODO: " + mod); } } diff --git a/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr b/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr index 598ab61f7..76f008765 100644 --- a/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr +++ b/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr @@ -11,7 +11,7 @@ global protocol Foo(role A, role B, role C) do Bar(A, B, C); } -..HERE CHECKME: aux aux +//..HERE CHECKME: aux aux aux global protocol Bar(role D, role E, role F) From d92f6028b5cffaa6139cfea2ef276c16b5955ce6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 24 Mar 2019 11:49:51 +0000 Subject: [PATCH 131/539] Added missing files. --- .../main/java/org/scribble/ast/AuxMod.java | 45 +++++++++++++++++ .../java/org/scribble/ast/ExplicitMod.java | 50 +++++++++++++++++++ .../java/org/scribble/lang/ProtocolMod.java | 29 +++++++++++ 3 files changed, 124 insertions(+) create mode 100644 scribble-core/src/main/java/org/scribble/ast/AuxMod.java create mode 100644 scribble-core/src/main/java/org/scribble/ast/ExplicitMod.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/ProtocolMod.java diff --git a/scribble-core/src/main/java/org/scribble/ast/AuxMod.java b/scribble-core/src/main/java/org/scribble/ast/AuxMod.java new file mode 100644 index 000000000..ef5bf8264 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/ast/AuxMod.java @@ -0,0 +1,45 @@ +package org.scribble.ast; + +import org.antlr.runtime.Token; + +public class AuxMod extends ProtocolMod +{ + // ScribTreeAdaptor#create constructor + public AuxMod(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected AuxMod(AuxMod node) + { + super(node); + } + + @Override + public boolean isAux() + { + return true; + } + + @Override + public AuxMod dupNode() + { + return new AuxMod(this); // return this also OK, since no children + } + + @Override + public String toString() + { + return "aux"; + } + + + + + + + + + public static final AuxMod AUX = new AuxMod((Token) null); +} diff --git a/scribble-core/src/main/java/org/scribble/ast/ExplicitMod.java b/scribble-core/src/main/java/org/scribble/ast/ExplicitMod.java new file mode 100644 index 000000000..38631d33c --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/ast/ExplicitMod.java @@ -0,0 +1,50 @@ +package org.scribble.ast; + +import org.antlr.runtime.Token; + +public class ExplicitMod extends ProtocolMod +{ + // ScribTreeAdaptor#create constructor + public ExplicitMod(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected ExplicitMod(ExplicitMod node) + { + super(node); + } + + @Override + public boolean isExplicit() + { + return true; + } + + @Override + public ExplicitMod dupNode() + { + return new ExplicitMod(this); // return this also OK, since no children + } + + @Override + public String toString() + { + return "explicit"; + } + + + + + + + + + + + + + + public static final ExplicitMod EXPLICIT = new ExplicitMod((Token) null); +} diff --git a/scribble-core/src/main/java/org/scribble/lang/ProtocolMod.java b/scribble-core/src/main/java/org/scribble/lang/ProtocolMod.java new file mode 100644 index 000000000..aa4ce97a1 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/ProtocolMod.java @@ -0,0 +1,29 @@ +package org.scribble.lang; + + +public enum ProtocolMod +{ + AUX, + EXPLICIT; + + @Override + public String toString() + { + switch (this) + { + case AUX: return "aux"; + case EXPLICIT: return "explicit"; + default: throw new RuntimeException("Unknown modifier: " + this); + } + } + + public static ProtocolMod fromAst(org.scribble.ast.ProtocolMod ast) + { + switch (ast.toString()) + { + case "aux": return AUX; + case "explicit": return EXPLICIT; + default: throw new RuntimeException("Unknown modifier: " + ast); + } + } +} From b89feb4ce893a64ab6203db4ab65b6dbf2b1e75e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 24 Mar 2019 11:51:28 +0000 Subject: [PATCH 132/539] Minor. --- .../src/main/java/org/scribble/ast/NonRoleArgList.java | 3 --- .../src/main/java/org/scribble/ast/context/ModuleContext.java | 2 -- 2 files changed, 5 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java index e413b8bcb..6b3b9aef6 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java @@ -40,9 +40,6 @@ public NonRoleArgList(NonRoleArgList node) @Override public List getArgChildren() { - System.out.println("nnn1: " + getChildren() + " ,, "); - getChildren().forEach(x -> System.out.println(x.getClass() + " ,, " + ((CommonTree) x).getChildren())); - return getRawArgChildren().stream().map(x -> (NonRoleArg) x) .collect(Collectors.toList()); } diff --git a/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java b/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java index 7473fb97e..f666ff16e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java +++ b/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java @@ -248,8 +248,6 @@ public ProtocolName getVisibleProtocolDeclFullName( public boolean isVisibleProtocolDeclName( ProtocolName visname) { - System.out.println("mc1: " + this.visible.globals.keySet() + " ,, " + visname); - return this.visible.isVisibleProtocolDeclName(visname); } From 4f3636599bb11ac1b1050bfe3196278335aca0e8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 26 Mar 2019 23:27:28 +0000 Subject: [PATCH 133/539] Continued: refactored protocol/do params and args, substitutions and subprotosigs. --- .../java/org/scribble/cli/CommandLine.java | 4 +- .../java/org/scribble/main/MainContext.java | 2 - .../java/org/scribble/ast/AstFactoryImpl.java | 4 +- .../org/scribble/ast/DelDecoratorImpl.java | 6 +- .../src/main/java/org/scribble/ast/Do.java | 14 ++--- .../java/org/scribble/ast/NonRoleArgList.java | 35 ++++++++++- .../org/scribble/ast/NonRoleParamDecl.java | 8 +-- .../scribble/ast/NonRoleParamDeclList.java | 4 +- .../java/org/scribble/ast/SigParamDecl.java | 7 ++- .../java/org/scribble/ast/TypeParamDecl.java | 7 ++- .../java/org/scribble/del/global/GDoDel.java | 6 +- .../scribble/del/global/GProtocolDeclDel.java | 6 +- ...mNodeDel.java => NonRoleParamNodeDel.java} | 4 +- .../src/main/java/org/scribble/job/Job.java | 49 ++++++++++++--- .../java/org/scribble/job/JobContext.java | 7 ++- .../main/java/org/scribble/lang/Continue.java | 3 +- .../src/main/java/org/scribble/lang/Do.java | 53 +++++++++++++---- .../org/scribble/lang/MessageTransfer.java | 8 ++- .../main/java/org/scribble/lang/Protocol.java | 24 +++++--- .../main/java/org/scribble/lang/SType.java | 2 +- .../src/main/java/org/scribble/lang/Seq.java | 2 +- .../java/org/scribble/lang/Substitutions.java | 59 ++++++++++++++----- .../org/scribble/lang/global/GChoice.java | 4 +- .../org/scribble/lang/global/GContinue.java | 2 +- .../java/org/scribble/lang/global/GDo.java | 21 +++---- .../lang/global/GMessageTransfer.java | 2 +- .../org/scribble/lang/global/GProtocol.java | 39 ++++++++---- .../org/scribble/lang/global/GRecursion.java | 18 +++++- .../java/org/scribble/lang/global/GSeq.java | 2 +- .../java/org/scribble/lang/global/GType.java | 2 +- .../java/org/scribble/lang/local/LChoice.java | 16 +++-- .../org/scribble/lang/local/LContinue.java | 13 ++-- .../org/scribble/lang/local/LProjection.java | 37 ++++++------ .../org/scribble/lang/local/LProtocol.java | 39 ++++++++---- .../java/org/scribble/lang/local/LRcv.java | 13 +++- .../org/scribble/lang/local/LRecursion.java | 15 +++-- .../java/org/scribble/lang/local/LSend.java | 13 +++- .../java/org/scribble/lang/local/LSeq.java | 17 ++++-- .../java/org/scribble/lang/local/LSkip.java | 14 ++++- .../java/org/scribble/lang/local/LType.java | 11 +++- .../model/endpoint/EGraphBuilderUtil2.java | 2 +- .../java/org/scribble/type/SubprotoSig.java | 23 +++++--- .../java/org/scribble/type/name/Role.java | 2 +- .../scribble/visit/SubprotocolVisitor.java | 16 ++--- .../UnguardedChoiceDoProjectionChecker.java | 2 +- .../resources/good/efsm/grecursion/Test09.scr | 3 + .../good/syntax/projroledeclfix/Test01.scr | 5 +- .../good/wfchoice/gdo/params/Test02.scr | 4 ++ 48 files changed, 460 insertions(+), 189 deletions(-) rename scribble-core/src/main/java/org/scribble/del/name/simple/{ParamNodeDel.java => NonRoleParamNodeDel.java} (89%) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index ceba56a59..7f4ffdab7 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -157,7 +157,7 @@ protected void runBody() { fail = x; } - + // Attempt certain "output tasks" even if above failed, in case can still do some useful output (hacky) try { @@ -296,7 +296,7 @@ private void printProjections(Job job) Map projections = job.getProjections(fullname, role); System.out.println("\n" + projections.values().stream() - .map((p) -> p.toString()).collect(Collectors.joining("\n\n"))); + .map(p -> p.toString()).collect(Collectors.joining("\n\n"))); } } diff --git a/scribble-cli/src/main/java/org/scribble/main/MainContext.java b/scribble-cli/src/main/java/org/scribble/main/MainContext.java index ea4a697d5..fb660f38d 100644 --- a/scribble-cli/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-cli/src/main/java/org/scribble/main/MainContext.java @@ -24,7 +24,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.AstFactoryImpl; -import org.scribble.ast.DelDecoratorImpl; import org.scribble.ast.ImportDecl; import org.scribble.ast.ImportModule; import org.scribble.ast.Module; @@ -163,7 +162,6 @@ private void init( // TODO CHECKME: main modname comes from the inlined moddecl -- check for issues if this clashes with an existing file system resource loadAllModules(p); // Populates this.parsed - this.config = new JobConfig(debug, main, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin, this.af, this.ef, this.sf); Map parsed = getParsedModules(); diff --git a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java index 195376d6c..782842587 100644 --- a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -110,7 +110,7 @@ import org.scribble.del.name.qualified.DataTypeNodeDel; import org.scribble.del.name.qualified.MessageSigNameNodeDel; import org.scribble.del.name.simple.AmbigNameNodeDel; -import org.scribble.del.name.simple.ParamNodeDel; +import org.scribble.del.name.simple.NonRoleParamNodeDel; import org.scribble.del.name.simple.RecVarNodeDel; import org.scribble.del.name.simple.RoleNodeDel; import org.scribble.type.kind.DataTypeKind; @@ -559,7 +559,7 @@ public NonRoleParamNode NonRoleParamNode( { pn = (NonRoleParamNode) new TypeParamNode(source.getToken()); } - pn = del(pn, new ParamNodeDel()); + pn = del(pn, new NonRoleParamNodeDel()); return pn; } diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java index da42dd98d..f84d013ea 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java @@ -59,7 +59,7 @@ import org.scribble.del.name.qualified.DataTypeNodeDel; import org.scribble.del.name.qualified.MessageSigNameNodeDel; import org.scribble.del.name.simple.AmbigNameNodeDel; -import org.scribble.del.name.simple.ParamNodeDel; +import org.scribble.del.name.simple.NonRoleParamNodeDel; import org.scribble.del.name.simple.RecVarNodeDel; import org.scribble.del.name.simple.RoleNodeDel; @@ -584,13 +584,13 @@ public NonRoleParamNode NonRoleParamNode(CommonT @Override public void SigParamNode(SigParamNode sp) { - setDel(sp, new ParamNodeDel()); + setDel(sp, new NonRoleParamNodeDel()); } @Override public void TypeParamNode(TypeParamNode tp) { - setDel(tp, new ParamNodeDel()); + setDel(tp, new NonRoleParamNodeDel()); } /*@Override diff --git a/scribble-core/src/main/java/org/scribble/ast/Do.java b/scribble-core/src/main/java/org/scribble/ast/Do.java index 3ea8a17ad..bfa6e3e04 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Do.java +++ b/scribble-core/src/main/java/org/scribble/ast/Do.java @@ -48,19 +48,19 @@ public Do(Do node) this.proto = null; } - // CHECKME: maybe wrap up role args and non-role args within the same container? - public RoleArgList getRoleListChild() - { - return (RoleArgList) getChild(2); - } + // getChild(0) + public abstract ProtocolNameNode getProtocolNameNode(); public NonRoleArgList getNonRoleListChild() { return (NonRoleArgList) getChild(1); } - // getChild(0) - public abstract ProtocolNameNode getProtocolNameNode(); + // CHECKME: maybe wrap up role args and non-role args within the same container? + public RoleArgList getRoleListChild() + { + return (RoleArgList) getChild(2); + } public abstract Do dupNode(); diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java index 6b3b9aef6..4e50cd5b4 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java @@ -13,13 +13,18 @@ */ package org.scribble.ast; +import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.type.Arg; +import org.scribble.type.MessageSig; import org.scribble.type.kind.NonRoleArgKind; +import org.scribble.type.kind.NonRoleParamKind; +import org.scribble.type.name.DataType; +import org.scribble.type.name.MessageSigName; import org.scribble.type.name.Role; // Cf. NonRoleParamDeclList @@ -69,11 +74,39 @@ public List getArgumentNodes() .collect(Collectors.toList()); } + // Can return a mix of arg kinds public List> getArguments() { - return getArgChildren().stream().map(ai -> ai.getValChild().toArg()) + return getArgChildren().stream() + .map(ai -> (Arg) ai.getValChild().toArg()) .collect(Collectors.toList()); } + + // Cast all, assuming no Ambig + public List> getParamKindArgs() + { + List> cast = new LinkedList<>(); + for (Arg a : getArguments()) + { + if (a instanceof MessageSig) + { + cast.add((MessageSig) a); + } + else if (a instanceof DataType) + { + cast.add((DataType) a); + } + else if (a instanceof MessageSigName) + { + cast.add((MessageSigName) a); + } + else + { + throw new RuntimeException("TODO: " + a); + } + } + return cast; + } @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java index affc1c084..c1058539e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java @@ -17,7 +17,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.NonRoleParamNode; import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.name.Name; +import org.scribble.type.name.MemberName; // CHECKME: can drop generic parameter and kind? public abstract class NonRoleParamDecl @@ -72,10 +72,10 @@ public NonRoleParamDecl project(AstFactory af, Role self) }*/ @Override - public Name getDeclName() - { + public abstract MemberName getDeclName(); // DataType/MessageSigName are MemberNames + /*{ return getNameNodeChild().toName(); - } + }*/ /*@Override public String getKeyword() diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java index d5c8b56e5..723e55953 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java @@ -20,7 +20,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.del.ScribDel; import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.name.Name; +import org.scribble.type.name.MemberName; import org.scribble.type.name.Role; // Can contain "mixed" type/sig kinds @@ -75,7 +75,7 @@ public NonRoleParamDeclList project(AstFactory af, Role self) return af.NonRoleParamDeclList(this.source, getParamDeclChildren()); } - public List> getParameters() + public List> getParameters() { return getParamDeclChildren().stream().map(decl -> decl.getDeclName()) .collect(Collectors.toList()); diff --git a/scribble-core/src/main/java/org/scribble/ast/SigParamDecl.java b/scribble-core/src/main/java/org/scribble/ast/SigParamDecl.java index 7e67da6e0..48fc8c33f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/SigParamDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/SigParamDecl.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.simple.SigParamNode; import org.scribble.type.kind.SigKind; -import org.scribble.type.name.Name; +import org.scribble.type.name.MessageSigName; import org.scribble.type.name.Role; public class SigParamDecl extends NonRoleParamDecl @@ -52,9 +52,10 @@ public SigParamDecl project(AstFactory af, Role self) } @Override - public Name getDeclName() + //public MemberName getDeclName() + public MessageSigName getDeclName() { - return getNameNodeChild().toName(); + return (MessageSigName) getNameNodeChild().toName(); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/TypeParamDecl.java b/scribble-core/src/main/java/org/scribble/ast/TypeParamDecl.java index 5efa3809c..9f07e7e02 100644 --- a/scribble-core/src/main/java/org/scribble/ast/TypeParamDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/TypeParamDecl.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.simple.TypeParamNode; import org.scribble.type.kind.DataTypeKind; -import org.scribble.type.name.Name; +import org.scribble.type.name.DataType; import org.scribble.type.name.Role; public class TypeParamDecl extends NonRoleParamDecl @@ -52,9 +52,10 @@ public TypeParamDecl project(AstFactory af, Role self) } @Override - public Name getDeclName() + //public Name getDeclName() + public DataType getDeclName() { - return getNameNodeChild().toName(); + return (DataType) getNameNodeChild().toName(); } @Override diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java index 1d155311a..125c63791 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java @@ -29,7 +29,9 @@ import org.scribble.del.DoDel; import org.scribble.job.ScribbleException; import org.scribble.lang.global.GTypeTranslator; +import org.scribble.type.Arg; import org.scribble.type.SubprotoSig; +import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.RecVarKind; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.ProtocolName; @@ -58,7 +60,9 @@ public org.scribble.lang.global.GDo translate(ScribNode n, GProtocolName fullname = (GProtocolName) modc .getVisibleProtocolDeclFullName(proto); List roles = source.getRoleListChild().getRoles(); - return new org.scribble.lang.global.GDo(source, fullname, roles); + List> params = source.getNonRoleListChild() + .getParamKindArgs(); + return new org.scribble.lang.global.GDo(source, fullname, roles, params); } // Part of context building diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 2bbf96fc9..4dbfdcccd 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -50,7 +50,9 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.global.SGraph; import org.scribble.type.kind.Global; +import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.MemberName; import org.scribble.type.name.MessageId; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; @@ -80,8 +82,10 @@ public GProtocol translate(ScribNode n, GTypeTranslator t) GProtocolName fullname = new GProtocolName(m.getFullModuleName(), source.getHeaderChild().getDeclName()); List roles = source.getRoles(); + List> params = source.getHeaderChild() + .getParamDeclListChild().getParameters(); // CHECKME: make more uniform with source::getRoles ? GSeq body = (GSeq) source.getDefChild().getBlockChild().visitWith(t); - return new GProtocol(source, mods, fullname, roles, body); + return new GProtocol(source, mods, fullname, roles, params, body); } @Override diff --git a/scribble-core/src/main/java/org/scribble/del/name/simple/ParamNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/simple/NonRoleParamNodeDel.java similarity index 89% rename from scribble-core/src/main/java/org/scribble/del/name/simple/ParamNodeDel.java rename to scribble-core/src/main/java/org/scribble/del/name/simple/NonRoleParamNodeDel.java index 20ad4ddf9..e644452b5 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/simple/ParamNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/simple/NonRoleParamNodeDel.java @@ -15,9 +15,9 @@ import org.scribble.del.ScribDelBase; -public class ParamNodeDel extends ScribDelBase +public class NonRoleParamNodeDel extends ScribDelBase { - public ParamNodeDel() + public NonRoleParamNodeDel() { } diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 214b60704..7c043e2c9 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -16,6 +16,9 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -25,7 +28,6 @@ import org.scribble.ast.context.ModuleContext; import org.scribble.ast.global.GProtocolDecl; import org.scribble.del.global.GProtocolDeclDel; -import org.scribble.del.local.LProtocolDeclDel; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.global.GProtocol; @@ -36,11 +38,16 @@ import org.scribble.model.endpoint.EGraphBuilderUtil; import org.scribble.model.global.SGraph; import org.scribble.model.global.SGraphBuilderUtil; +import org.scribble.type.Arg; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.kind.Local; +import org.scribble.type.kind.NonRoleParamKind; +import org.scribble.type.name.DataType; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; +import org.scribble.type.name.MemberName; +import org.scribble.type.name.MessageSigName; import org.scribble.type.name.ModuleName; import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; @@ -90,10 +97,11 @@ public EGraphBuilderUtil newEGraphBuilderUtil() public SGraph buildSGraph(GProtocolName fullname, Map egraphs, boolean explicit) throws ScribbleException { + debugPrintln("(" + fullname + ") Building global model using:"); for (Role r : egraphs.keySet()) { // FIXME: refactor - debugPrintln("(" + fullname + ") Building global model using EFSM for " + debugPrintln("-- EFSM for " + r + ":\n" + egraphs.get(r).init.toDot()); } //return SGraph.buildSGraph(this, fullname, createInitialSConfig(this, egraphs, explicit)); @@ -133,8 +141,25 @@ public void runContextBuildingPasses() throws ScribbleException for (GProtocol g : this.jctxt.getIntermediates()) { + List> params = new LinkedList<>(); + // Convert MemberName params to Args -- cf. NonRoleArgList::getParamKindArgs + for (MemberName n : g.params) + { + if (n instanceof DataType) + { + params.add((DataType) n); + } + else if (n instanceof MessageSigName) + { + params.add((MessageSigName) n); + } + else + { + throw new RuntimeException("TODO: " + n); + } + } SubprotoSig sig = new SubprotoSig(g.fullname, g.roles, - Collections.emptyList()); // FIXME + params); // FIXME //Deque stack = new LinkedList<>(); STypeInliner i = new STypeInliner(this); i.pushSig(sig); // TODO: factor into constructor @@ -315,14 +340,22 @@ protected void runProjectionUnfoldingPass() throws ScribbleException public Map getProjections(GProtocolName fullname, Role role) throws ScribbleException { - Module root = this.jctxt.getProjection(fullname, role); - Map> dependencies = ((LProtocolDeclDel) root + System.out.println("cccc2: "); + //Module root = this.jctxt.getProjection(fullname, role); + LProtocol proj = this.jctxt.getProjected(fullname, role); + System.out.println("cccc3: "); + + // FIXME: dependencies, -project -- FIXME: need to create Module (with dependency imports) + Map> dependencies = + /*((LProtocolDeclDel) root .getLProtoDeclChildren().get(0).del()).getProtocolDeclContext() - .getDependencyMap().getDependencies().get(role); + .getDependencyMap().getDependencies().get(role);*/ + new HashMap<>(); + System.out.println("cccc4: "); + // Can ignore Set for projections (is singleton), as each projected proto is a dependency only for self (implicit in the protocoldecl) return dependencies.keySet().stream().collect( - Collectors.toMap(lpn -> lpn, - lpn -> this.jctxt.getModule(lpn.getPrefix()))); + Collectors.toMap(x -> x, x -> this.jctxt.getModule(x.getPrefix()))); } /*public Map generateSessionApi(GProtocolName fullname) throws ScribbleException diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext.java b/scribble-core/src/main/java/org/scribble/job/JobContext.java index 28c7974e1..9e1f27de2 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/job/JobContext.java @@ -191,9 +191,12 @@ public void addProjected(LProtocolName fullname, LProtocol l) this.iprojected.put(fullname, l); } - public LProtocol getProjected(LProtocolName fullname) + // FIXME TODO: refactor getProjected and getProjection properly + //public LProtocol getProjected(LProtocolName fullname) + public LProtocol getProjected(GProtocolName fullname, Role self) { - return this.iprojected.get(fullname); + LProtocolName p = Projector.projectFullProtocolName(fullname, self); + return this.iprojected.get(p); } public Map getProjections() diff --git a/scribble-core/src/main/java/org/scribble/lang/Continue.java b/scribble-core/src/main/java/org/scribble/lang/Continue.java index a231cd22e..158a06b85 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Continue.java +++ b/scribble-core/src/main/java/org/scribble/lang/Continue.java @@ -31,7 +31,8 @@ public Set getRoles() } @Override - public Continue substitute(Substitutions subs) + public Continue substitute(Substitutions subs) + { return reconstruct(getSource(), this.recvar); } diff --git a/scribble-core/src/main/java/org/scribble/lang/Do.java b/scribble-core/src/main/java/org/scribble/lang/Do.java index 1759b105d..dcb5d9f32 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Do.java +++ b/scribble-core/src/main/java/org/scribble/lang/Do.java @@ -1,11 +1,17 @@ package org.scribble.lang; import java.util.Collections; +import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import org.scribble.type.Arg; +import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.DataType; +import org.scribble.type.name.MemberName; +import org.scribble.type.name.MessageSigName; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; @@ -13,19 +19,21 @@ public abstract class Do> extends STypeBase implements SType { public final N proto; // Currently disamb'd to fullname by GTypeTranslator (see GDoDel::translate) - public final List roles; // Ordered role args; pre: size > 1 - //public final List args; // CHECKME + public final List roles; // Ordered role args; pre: size > 2 + public final List> args; + // NonRoleParamKind, not NonRoleArgKind, because latter includes AmbigKind due to parsing requirements public Do(org.scribble.ast.Do source, N proto, - List roles) + List roles, List> args) { super(source); this.proto = proto; this.roles = Collections.unmodifiableList(roles); + this.args = Collections.unmodifiableList(args); } public abstract Do reconstruct(org.scribble.ast.Do source, - N proto, List roles); + N proto, List roles, List> args); @Override public Set getRoles() @@ -34,11 +42,28 @@ public Set getRoles() } @Override - public Do substitute(Substitutions subs) + public Do substitute(Substitutions subs) { - List roles = this.roles.stream().map(x -> subs.apply(x)) + List roles = this.roles.stream().map(x -> subs.subsRole(x)) .collect(Collectors.toList()); - return reconstruct((org.scribble.ast.Do) getSource(), this.proto, roles); + List> args = new LinkedList<>(); + for (Arg a : this.args) + { + if (a instanceof MemberName && subs.hasArg((MemberName) a)) + { + if (a instanceof DataType) + { + a = subs.subsArg((DataType) a); + } + else if (a instanceof MessageSigName) + { + a = subs.subsArg((MessageSigName) a); + } + } + args.add(a); + } + return reconstruct((org.scribble.ast.Do) getSource(), this.proto, roles, + args); } @Override @@ -50,8 +75,14 @@ public SType unfoldAllOnce(STypeUnfolder u) @Override public String toString() { - return "do " + this.proto + "(" + this.roles.stream().map(x -> x.toString()) - .collect(Collectors.joining(", ")) + ");"; + return "do " + this.proto + + "<" + + this.args.stream().map(x -> x.toString()) + .collect(Collectors.joining(", ")) + + ">" + + "(" + this.roles.stream().map(x -> x.toString()) + .collect(Collectors.joining(", ")) + + ");"; } @Override @@ -61,6 +92,7 @@ public int hashCode() hash = 31 * hash + super.hashCode(); hash = 31 * hash + this.proto.hashCode(); hash = 31 * hash + this.roles.hashCode(); + hash = 31 * hash + this.args.hashCode(); return hash; } @@ -77,6 +109,7 @@ public boolean equals(Object o) } Do them = (Do) o; return super.equals(this) // Does canEquals - && this.proto.equals(them.proto) && this.roles.equals(them.roles); + && this.proto.equals(them.proto) && this.roles.equals(them.roles) + && this.args.equals(them.args); } } diff --git a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java index c8b6901c8..048e82ae7 100644 --- a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java @@ -6,6 +6,7 @@ import org.scribble.type.Message; import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.MemberName; import org.scribble.type.name.Role; public abstract class MessageTransfer @@ -36,10 +37,11 @@ public Set getRoles() } @Override - public MessageTransfer substitute(Substitutions subs) + public MessageTransfer substitute(Substitutions subs) { - return reconstruct(getSource(), subs.apply(this.src), this.msg, - subs.apply(this.dst)); + //..HERE subs msg + return reconstruct(getSource(), subs.subsRole(this.src), this.msg, + subs.subsRole(this.dst)); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index 30c50fdf1..93dff8e03 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -6,7 +6,9 @@ import java.util.stream.Collectors; import org.scribble.ast.ProtocolDecl; +import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.MemberName; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; @@ -16,22 +18,25 @@ public abstract class Protocol public final List mods; public final N fullname; public final List roles; // Ordered role params; pre: size >= 2 - //public final List> params; // TODO - public final B def; // CHECKME: take "? extends Seq" as generic param? + public final List> params; + // NonRoleParamKind, not NonRoleArgKind, because latter includes AmbigKind due to parsing requirements + // CHECKME: make a ParamName? or at least SimpleName? + public final B def; public Protocol(ProtocolDecl source, List mods, N fullname, - List roles, // List params, - B def) + List roles, List> params, B def) { super(source); this.mods = Collections.unmodifiableList(mods); this.fullname = fullname; this.roles = Collections.unmodifiableList(roles); + this.params = Collections.unmodifiableList(params); this.def = def; } public abstract Protocol reconstruct(ProtocolDecl source, - List mods, N fullname, List roles, B def); + List mods, N fullname, List roles, + List> params, B def); public boolean isAux() { @@ -57,7 +62,10 @@ public ProtocolDecl getSource() @Override public String toString() { - return "protocol " + this.fullname + "(" + this.roles.stream() + return "protocol " + this.fullname + + "<" + this.params.stream() + .map(x -> x.toString()).collect(Collectors.joining(", ")) + ">" + + "(" + this.roles.stream() .map(x -> x.toString()).collect(Collectors.joining(", ")) + ")" + " {\n" + this.def + "\n}"; } @@ -71,6 +79,7 @@ public int hashCode() hash = 31 * hash + this.mods.hashCode(); hash = 31 * hash + this.fullname.hashCode(); hash = 31 * hash + this.roles.hashCode(); + hash = 31 * hash + this.params.hashCode(); hash = 31 * hash + this.def.hashCode(); return hash; } @@ -89,6 +98,7 @@ public boolean equals(Object o) Protocol them = (Protocol) o; return super.equals(this) // Does canEquals && this.mods.equals(them.mods) && this.fullname.equals(them.fullname) - && this.roles.equals(them.roles) && this.def.equals(them.def); + && this.roles.equals(them.roles) && this.params.equals(them.params) + && this.def.equals(them.def); } } diff --git a/scribble-core/src/main/java/org/scribble/lang/SType.java b/scribble-core/src/main/java/org/scribble/lang/SType.java index 9d00b2056..96c2607bc 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SType.java +++ b/scribble-core/src/main/java/org/scribble/lang/SType.java @@ -16,7 +16,7 @@ public interface SType // Unsupported for Protocol/Do Set getRoles(); - SType substitute(Substitutions role); + SType substitute(Substitutions subs); // Top-level call should be on a GProtocol with an empty stack -- XXX // stack is treated mutably diff --git a/scribble-core/src/main/java/org/scribble/lang/Seq.java b/scribble-core/src/main/java/org/scribble/lang/Seq.java index 097d7667a..4b07d6622 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Seq.java +++ b/scribble-core/src/main/java/org/scribble/lang/Seq.java @@ -32,7 +32,7 @@ public Set getRoles() } @Override - public Seq substitute(Substitutions subs) + public Seq substitute(Substitutions subs) { List> elems = this.elems.stream() .map(x -> x.substitute(subs)).collect(Collectors.toList()); diff --git a/scribble-core/src/main/java/org/scribble/lang/Substitutions.java b/scribble-core/src/main/java/org/scribble/lang/Substitutions.java index b5ce86c37..5a102f8af 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Substitutions.java +++ b/scribble-core/src/main/java/org/scribble/lang/Substitutions.java @@ -5,25 +5,41 @@ import java.util.List; import java.util.Map; -import org.scribble.type.name.Name; +import org.scribble.type.Arg; +import org.scribble.type.kind.NonRoleParamKind; +import org.scribble.type.name.MemberName; +import org.scribble.type.name.Role; // CHECKME: move to util? -public class Substitutions> // CHECKME: too restricting? +public class Substitutions { // Old name -> new name - private final Map subs = new HashMap<>(); + private final Map rsubs = new HashMap<>(); + private final Map, Arg> + asubs = new HashMap<>(); + // Keys are actually simple names (params) + // args are MessageSigName or DataType (but not MessageSig) -- N.B. substitution may replace sig name with a sig + // NonRoleParamKind, not NonRoleArgKind, because latter includes AmbigKind due to parsing requirements + // Better (CHECKME: necessary?) to separate roles and args -- but MessageSigName and DataType need to be distinct (so can group up, cf. NonRoleArgList) - public Substitutions(List old, List neu) + public Substitutions(List rold, List rnew, + List> aold, + List> anew) { - if (old.size() != neu.size()) + if (rold.size() != rnew.size()) { - throw new RuntimeException("Unqeual sizes: " + old + " ; " + neu); + throw new RuntimeException( + "Role lists don't match: " + rold + " ; " + rnew); } - Iterator i = neu.iterator(); - for (N n : old) + if (aold.size() != anew.size()) { - this.subs.put(n, i.next()); + throw new RuntimeException( + "Arg lists don't match: " + aold + " ; " + anew); } + Iterator i = rnew.iterator(); + rold.forEach(x -> this.rsubs.put(x, i.next())); + Iterator> j = anew.iterator(); + aold.forEach(x -> this.asubs.put(x, j.next())); } /*public void put(N old, N neu) @@ -31,22 +47,36 @@ public Substitutions(List old, List neu) this.subs.put(old, neu); }*/ - public N apply(N old) + public Role subsRole(Role old) { - return this.subs.get(old); + return this.rsubs.get(old); + } + + public // + Arg subsArg(MemberName old) + // ? param more convenient for accepting DataType/MessageSigName params + { + return this.asubs.get(old); + } + + public boolean hasArg(MemberName old) + // ? param more convenient for accepting DataType/MessageSigName params + { + return this.asubs.containsKey(old); } @Override public String toString() { - return this.subs.toString(); + return this.rsubs + "; " + this.asubs; } @Override public int hashCode() { int hash = 1889; - hash = 31 * hash + this.subs.hashCode(); + hash = 31 * hash + this.rsubs.hashCode(); + hash = 31 * hash + this.asubs.hashCode(); return hash; } @@ -61,6 +91,7 @@ public boolean equals(Object o) { return false; } - return this.subs.equals(((Substitutions) o).subs); + Substitutions them = (Substitutions) o; + return this.rsubs.equals(them.rsubs) && this.asubs.equals(them.asubs); } } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java index bec0e8d47..d8025aae9 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -39,11 +39,11 @@ public GChoice reconstruct(org.scribble.ast.Choice source, Role subj, } @Override - public GChoice substitute(Substitutions subs) + public GChoice substitute(Substitutions subs) { List blocks = this.blocks.stream().map(x -> x.substitute(subs)) .collect(Collectors.toList()); - return reconstruct(getSource(), subs.apply(this.subj), blocks); + return reconstruct(getSource(), subs.subsRole(this.subj), blocks); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java index 690e9a15b..1d2a928ac 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java @@ -31,7 +31,7 @@ public GContinue reconstruct(org.scribble.ast.ProtocolKindNode source, } @Override - public GContinue substitute(Substitutions subs) + public GContinue substitute(Substitutions subs) { return (GContinue) super.substitute(subs); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index 76fadaf78..45429a0f5 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -1,6 +1,5 @@ package org.scribble.lang.global; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; @@ -10,8 +9,10 @@ import org.scribble.lang.STypeInliner; import org.scribble.lang.Substitutions; import org.scribble.lang.local.LType; +import org.scribble.type.Arg; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; +import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -19,30 +20,30 @@ public class GDo extends Do implements GType { public GDo(org.scribble.ast.Do source, GProtocolName proto, - List roles) + List roles, List> args) { - super(source, proto, roles); + super(source, proto, roles, args); } @Override public GDo reconstruct(org.scribble.ast.Do source, - GProtocolName proto, List roles) + GProtocolName proto, List roles, List> args) { - return new GDo(source, proto, roles); + return new GDo(source, proto, roles, args); } @Override - public GDo substitute(Substitutions subs) + public GDo substitute(Substitutions subs) { return (GDo) super.substitute(subs); } + // CHECKME: factor up to base? (though currently there is no LDo) @Override public GType getInlined(STypeInliner i)//, Deque stack) { GProtocolName fullname = this.proto; - SubprotoSig sig = new SubprotoSig(fullname, this.roles, - Collections.emptyList()); // FIXME + SubprotoSig sig = new SubprotoSig(fullname, this.roles, this.args); RecVar rv = i.makeRecVar(sig); if (i.hasSig(sig)) { @@ -50,8 +51,8 @@ public GType getInlined(STypeInliner i)//, Deque stack) } i.pushSig(sig); GProtocol g = i.job.getJobContext().getIntermediate(fullname); - Substitutions subs = - new Substitutions<>(g.roles, i.peek().roles); // FIXME: args + Substitutions subs = + new Substitutions(g.roles, this.roles, g.params, this.args); GSeq inlined = g.def.substitute(subs).getInlined(i);//, stack); // i.e. returning a GSeq -- rely on parent GSeq to inline i.popSig(); diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java index 00ece037e..1fa86c9af 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java @@ -38,7 +38,7 @@ public GMessageTransfer reconstruct( } @Override - public GMessageTransfer substitute(Substitutions subs) + public GMessageTransfer substitute(Substitutions subs) { return (GMessageTransfer) super.substitute(subs); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index cbbd865b4..de6484da2 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -1,6 +1,7 @@ package org.scribble.lang.global; import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -19,8 +20,10 @@ import org.scribble.lang.local.LSeq; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; +import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; +import org.scribble.type.name.MemberName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; import org.scribble.visit.context.Projector; @@ -29,27 +32,31 @@ public class GProtocol extends Protocol implements GType { public GProtocol(ProtocolDecl source, List mods, - GProtocolName fullname, List roles, // List params, // TODO - GSeq def) + GProtocolName fullname, List roles, + List> params, GSeq def) { - super(source, mods, fullname, roles, def); + super(source, mods, fullname, roles, params, def); } @Override public GProtocol reconstruct(ProtocolDecl source, List mods, GProtocolName fullname, List roles, - GSeq def) + List> params, GSeq def) { - return new GProtocol(source, mods, fullname, roles, def); + return new GProtocol(source, mods, fullname, roles, params, def); } @Override - public GType substitute(Substitutions subs) + public GType substitute(Substitutions subs) { - List roles = this.roles.stream().map(x -> subs.apply(x)) + // CHECKME: needed? + /*List roles = this.roles.stream().map(x -> subs.subsRole(x)) + .collect(Collectors.toList()); + List> params = this.params.stream().map(x -> ...) .collect(Collectors.toList()); return reconstruct(getSource(), this.mods, this.fullname, roles, - this.def.substitute(subs)); + this.def.substitute(subs));*/ + throw new RuntimeException("Unsupported for Protocol: " + this); } // Pre: stack.peek is the sig for the calling Do (or top-level entry) @@ -58,33 +65,39 @@ public GType substitute(Substitutions subs) public GProtocol getInlined(STypeInliner i)//, Deque stack) { SubprotoSig sig = i.peek(); - Substitutions subs = new Substitutions<>(this.roles, sig.roles); // FIXME: args + Substitutions subs = new Substitutions(this.roles, sig.roles, this.params, + sig.args); GSeq body = this.def.substitute(subs).getInlined(i);//, stack); RecVar rv = i.makeRecVar(sig); GRecursion rec = new GRecursion(null, rv, body); // CHECKME: or protodecl source? GProtocolDecl source = getSource(); GSeq def = new GSeq(null, Stream.of(rec).collect(Collectors.toList())); - return new GProtocol(source, this.mods, this.fullname, this.roles, def); + return new GProtocol(source, this.mods, this.fullname, this.roles, + this.params, def); } @Override public GProtocol unfoldAllOnce(STypeUnfolder u) { GSeq unf = (GSeq) this.def.unfoldAllOnce(u); - return reconstruct(getSource(), this.mods, this.fullname, this.roles, unf); + return reconstruct(getSource(), this.mods, this.fullname, this.roles, + this.params, unf); } // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) @Override public LProjection project(Role self) { - LProtocolName fullname = Projector.projectFullProtocolName(this.fullname, self); + LProtocolName fullname = Projector.projectFullProtocolName(this.fullname, + self); LSeq body = (LSeq) this.def.project(self); Set tmp = body.getRoles(); List roles = this.roles.stream() .map(x -> x.equals(self) ? Role.SELF : x).filter(x -> tmp.contains(x)) .collect(Collectors.toList()); - return new LProjection(this.mods, this.fullname, self, fullname, roles, + List> params = + new LinkedList<>(this.params); // CHECKME: filter params by usage? + return new LProjection(this.mods, this.fullname, self, fullname, roles, params, body); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java index 2c866cbec..fa74408e8 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java @@ -1,5 +1,6 @@ package org.scribble.lang.global; +import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -34,7 +35,7 @@ public GRecursion reconstruct(org.scribble.ast.ProtocolKindNode source, } @Override - public GRecursion substitute(Substitutions subs) + public GRecursion substitute(Substitutions subs) { return reconstruct(getSource(), this.recvar, this.body.substitute(subs)); } @@ -65,7 +66,20 @@ public GType unfoldAllOnce(STypeUnfolder u) public LType project(Role self) { LSeq body = this.body.project(self); - if (body.isEmpty() || body.isSingleCont()) // recvar doesn't matter for isSingleCont + if (body.isEmpty()) + { + return LSkip.SKIP; + } + /*RecVar rv = body.isSingleCont(); // CHECKME: should do more "compressing" of "single continue" (subset) choice cases? or should not do "single continue" checking for choice at all? + if (rv != null) + { + return this.recvar.equals(rv) + ? LSkip.SKIP + : new LContinue(null, rv); // CHECKME: source + }*/ + Set rvs = new HashSet<>(); + rvs.add(this.recvar); + if (body.isSingleConts(rvs)) { return LSkip.SKIP; } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java index 793e76154..8499fec49 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -37,7 +37,7 @@ public GSeq reconstruct(InteractionSeq source, } @Override - public GSeq substitute(Substitutions subs) + public GSeq substitute(Substitutions subs) { return (GSeq) super.substitute(subs); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GType.java b/scribble-core/src/main/java/org/scribble/lang/global/GType.java index 8c60cc558..54a61d6ca 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GType.java @@ -15,7 +15,7 @@ public interface GType extends SType { @Override - GType substitute(Substitutions subs); + GType substitute(Substitutions subs); @Override GType getInlined(STypeInliner i);//, Deque stack); diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java index f8f44d2c3..b9341dbf2 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java @@ -34,17 +34,25 @@ public LChoice reconstruct(org.scribble.ast.Choice source, Role subj, } @Override - public boolean isSingleCont() + public RecVar isSingleCont() { - return this.blocks.stream().allMatch(x -> x.isSingleCont()); + List tmp = this.blocks.stream().map(x -> x.isSingleCont()) + .collect(Collectors.toList()); + return (tmp.size() == 1) ? tmp.get(0) : null; + } + + @Override + public boolean isSingleConts(Set rvs) + { + return this.blocks.stream().allMatch(x -> x.isSingleConts(rvs)); } @Override - public LChoice substitute(Substitutions subs) + public LChoice substitute(Substitutions subs) { List blocks = this.blocks.stream().map(x -> x.substitute(subs)) .collect(Collectors.toList()); - return reconstruct(getSource(), subs.apply(this.subj), blocks); + return reconstruct(getSource(), subs.subsRole(this.subj), blocks); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java index 3b006efbe..1de5c91ea 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java @@ -15,7 +15,6 @@ import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; public class LContinue extends Continue implements LType { @@ -34,13 +33,19 @@ public LContinue reconstruct(org.scribble.ast.ProtocolKindNode source, } @Override - public boolean isSingleCont() + public RecVar isSingleCont() { - return true; + return this.recvar; } @Override - public LContinue substitute(Substitutions subs) + public boolean isSingleConts(Set rvs) + { + return rvs.contains(this.recvar); + } + + @Override + public LContinue substitute(Substitutions subs) { return (LContinue) super.substitute(subs); } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java index a908d44f4..d2f8682a7 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java @@ -4,15 +4,12 @@ import java.util.stream.Collectors; import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.local.LProtocolDecl; import org.scribble.lang.ProtocolMod; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.Substitutions; -import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Local; +import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.RecVar; +import org.scribble.type.name.MemberName; import org.scribble.type.name.Role; public class LProjection extends LProtocol @@ -21,10 +18,10 @@ public class LProjection extends LProtocol public final Role self; public LProjection(List mods, GProtocolName parent, Role self, - LProtocolName fullname, List roles, // List params, // TODO - LSeq body) + LProtocolName fullname, List roles, + List> params, LSeq body) { - super(null, mods, fullname, roles, body); + super(null, mods, fullname, roles, params, body); this.parent = parent; this.self = self; } @@ -32,38 +29,40 @@ public LProjection(List mods, GProtocolName parent, Role self, @Override public LProjection reconstruct(ProtocolDecl source, List mods, LProtocolName fullname, List roles, - LSeq body) + List> params, LSeq body) { - return new LProjection(mods, this.parent, this.self, fullname, roles, body); + return new LProjection(mods, this.parent, this.self, fullname, roles, + params, body); } - @Override - public LType substitute(Substitutions subs) + /*@Override + public LType substitute(Substitutions subs) { - List roles = this.roles.stream().map(x -> subs.apply(x)) + *List roles = this.roles.stream().map(x -> subs.subsRole(x)) .collect(Collectors.toList()); return reconstruct(getSource(), this.mods, this.fullname, roles, this.def.substitute(subs)); - } + }*/ - // Pre: stack.peek is the sig for the calling Do (or top-level entry) + /*// Pre: stack.peek is the sig for the calling Do (or top-level entry) // i.e., it gives the roles/args at the call-site @Override public LRecursion getInlined(STypeInliner i)//, Deque stack) { SubprotoSig sig = i.peek(); - Substitutions subs = new Substitutions<>(this.roles, sig.roles); // FIXME: args + Substitutions subs = new Substitutions(this.roles, sig.roles, this.params, + sig.args); LSeq body = this.def.substitute(subs).getInlined(i);//, stack); LProtocolDecl source = getSource(); // CHECKME: or empty source? RecVar rv = i.makeRecVar(sig); return new LRecursion(source, rv, body); - } + }*/ - @Override + /*@Override public LProtocolDecl getSource() { return (LProtocolDecl) super.getSource(); - } + }*/ @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index d7f6bbc15..73f163bb5 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -2,7 +2,7 @@ import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; +import java.util.Set; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.local.LProtocolDecl; @@ -18,7 +18,9 @@ import org.scribble.model.endpoint.EState; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Local; +import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.LProtocolName; +import org.scribble.type.name.MemberName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -26,33 +28,42 @@ public class LProtocol extends Protocol implements LType { public LProtocol(ProtocolDecl source, List mods, - LProtocolName fullname, List roles, // List params, // TODO - LSeq def) + LProtocolName fullname, List roles, + List> params, LSeq def) { - super(source, mods, fullname, roles, def); + super(source, mods, fullname, roles, params, def); } @Override public LProtocol reconstruct(ProtocolDecl source, List mods, LProtocolName fullname, List roles, - LSeq def) + List> params, LSeq def) { - return new LProtocol(source, mods, fullname, roles, def); + return new LProtocol(source, mods, fullname, roles, params, def); } @Override - public boolean isSingleCont() + public RecVar isSingleCont() { throw new RuntimeException("Unsupported for LProtocol:\n" + this); } @Override - public LType substitute(Substitutions subs) + public boolean isSingleConts(Set rvs) { - List roles = this.roles.stream().map(x -> subs.apply(x)) + throw new RuntimeException("Unsupported for LProtocol:\n" + this); + } + + @Override + public LType substitute(Substitutions subs) + { + /*List roles = this.roles.stream().map(x -> subs.subsRole(x)) + .collect(Collectors.toList()); + List> params = this.params.stream().map(x -> ...) .collect(Collectors.toList()); - return reconstruct(getSource(), this.mods, this.fullname, roles, - this.def.substitute(subs)); + return reconstruct(getSource(), this.mods, this.fullname, roles, params, + this.def.substitute(subs));*/ + throw new RuntimeException("Unsupported for LProtocol:\n" + this); } // Pre: stack.peek is the sig for the calling Do (or top-level entry) @@ -61,7 +72,8 @@ public LType substitute(Substitutions subs) public LRecursion getInlined(STypeInliner i)//, Deque stack) { SubprotoSig sig = i.peek(); - Substitutions subs = new Substitutions<>(this.roles, sig.roles); // FIXME: args + Substitutions subs = new Substitutions(this.roles, sig.roles, this.params, + sig.args); LSeq body = this.def.substitute(subs).getInlined(i);//, stack); LProtocolDecl source = getSource(); // CHECKME: or empty source? RecVar rv = i.makeRecVar(sig); @@ -72,7 +84,8 @@ public LRecursion getInlined(STypeInliner i)//, Deque stack) public LProtocol unfoldAllOnce(STypeUnfolder u) { LSeq unf = (LSeq) this.def.unfoldAllOnce(u); - return reconstruct(getSource(), this.mods, this.fullname, this.roles, unf); + return reconstruct(getSource(), this.mods, this.fullname, this.roles, + this.params, unf); } public EGraph toEGraph(Job job) diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java b/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java index 9801a1d97..3898baa99 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java @@ -1,5 +1,7 @@ package org.scribble.lang.local; +import java.util.Set; + import org.scribble.job.ScribbleException; import org.scribble.lang.MessageTransfer; import org.scribble.lang.STypeInliner; @@ -11,6 +13,7 @@ import org.scribble.type.Payload; import org.scribble.type.kind.Local; import org.scribble.type.name.MessageId; +import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; public class LRcv extends MessageTransfer @@ -34,13 +37,19 @@ public LRcv reconstruct( } @Override - public boolean isSingleCont() + public RecVar isSingleCont() + { + return null; + } + + @Override + public boolean isSingleConts(Set rvs) { return false; } @Override - public LRcv substitute(Substitutions subs) + public LRcv substitute(Substitutions subs) { return (LRcv) super.substitute(subs); } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java index dc343a1c8..29cfbf722 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java @@ -12,7 +12,6 @@ import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; public class LRecursion extends Recursion implements LType { @@ -31,13 +30,21 @@ public LRecursion reconstruct(org.scribble.ast.ProtocolKindNode source, } @Override - public boolean isSingleCont() + public RecVar isSingleCont() { - return false; + return null; + } + + @Override + public boolean isSingleConts(Set rvs) + { + Set tmp = new HashSet<>(rvs); + tmp.add(this.recvar); + return this.body.isSingleConts(tmp); } @Override - public LRecursion substitute(Substitutions subs) + public LRecursion substitute(Substitutions subs) { return reconstruct(getSource(), this.recvar, this.body.substitute(subs)); } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSend.java b/scribble-core/src/main/java/org/scribble/lang/local/LSend.java index eb182bfbc..00b7fe0db 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSend.java @@ -1,5 +1,7 @@ package org.scribble.lang.local; +import java.util.Set; + import org.scribble.job.ScribbleException; import org.scribble.lang.MessageTransfer; import org.scribble.lang.STypeInliner; @@ -11,6 +13,7 @@ import org.scribble.type.Payload; import org.scribble.type.kind.Local; import org.scribble.type.name.MessageId; +import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; public class LSend extends MessageTransfer @@ -34,13 +37,19 @@ public LSend reconstruct( } @Override - public boolean isSingleCont() + public RecVar isSingleCont() + { + return null; + } + + @Override + public boolean isSingleConts(Set rvs) { return false; } @Override - public LSend substitute(Substitutions subs) + public LSend substitute(Substitutions subs) { return (LSend) super.substitute(subs); } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java index ef3548f67..3df208db6 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java @@ -4,6 +4,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import org.scribble.ast.InteractionSeq; @@ -17,7 +18,7 @@ import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.model.endpoint.EState; import org.scribble.type.kind.Local; -import org.scribble.type.name.Role; +import org.scribble.type.name.RecVar; public class LSeq extends Seq implements LType { @@ -35,13 +36,21 @@ public LSeq reconstruct(InteractionSeq source, } @Override - public boolean isSingleCont() + public RecVar isSingleCont() { - return this.elems.size() == 1 && ((LType) this.elems.get(0)).isSingleCont(); + RecVar rv = ((LType) this.elems.get(0)).isSingleCont(); + return (this.elems.size() == 1) ? rv : null; } @Override - public LSeq substitute(Substitutions subs) + public boolean isSingleConts(Set rvs) + { + return this.elems.size() == 1 + && ((LType) this.elems.get(0)).isSingleConts(rvs); + } + + @Override + public LSeq substitute(Substitutions subs) { return (LSeq) super.substitute(subs); } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java index 9dd231b6d..bafc58065 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java @@ -9,6 +9,7 @@ import org.scribble.lang.Substitutions; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; +import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; // Used only *during* projection -- filtered out by GSeq::projection @@ -27,13 +28,20 @@ public Set getRoles() } @Override - public boolean isSingleCont() + public RecVar isSingleCont() { - return false; + return null; + //CHECKME: throw new RuntimeException("Unsupported for LProtocol:\n" + this); + } + + @Override + public boolean isSingleConts(Set rvs) + { + throw new RuntimeException("Unsupported for Skip:\n" + this); } @Override - public LSkip substitute(Substitutions subs) + public LSkip substitute(Substitutions subs) { return this; } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LType.java b/scribble-core/src/main/java/org/scribble/lang/local/LType.java index 44491ad5c..1cb1d70c8 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LType.java @@ -1,5 +1,7 @@ package org.scribble.lang.local; +import java.util.Set; + import org.scribble.job.ScribbleException; import org.scribble.lang.SType; import org.scribble.lang.STypeInliner; @@ -7,14 +9,17 @@ import org.scribble.lang.Substitutions; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; -import org.scribble.type.name.Role; +import org.scribble.type.name.RecVar; public interface LType extends SType { - boolean isSingleCont(); + // Return recvar of the "single continue", if so; return null, if not + RecVar isSingleCont(); + + boolean isSingleConts(Set rvs); @Override - LType substitute(Substitutions subs); + LType substitute(Substitutions subs); @Override LType getInlined(STypeInliner i);//, Deque stack); diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java index 4609caa01..5b3315a26 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java @@ -484,7 +484,7 @@ else if (a instanceof IntermediateRecEdge) //for (IOAction e : this.enactingMap.get(succ)) RecVar rv = new RecVar(ice.mid.toString()); - System.out.println("sss2: " + rv); + System.out.println("bbbb2: " + rv); for (EAction e : this.enactingMap.get(origSucc).get(rv)) { diff --git a/scribble-core/src/main/java/org/scribble/type/SubprotoSig.java b/scribble-core/src/main/java/org/scribble/type/SubprotoSig.java index 30854536b..32418a900 100644 --- a/scribble-core/src/main/java/org/scribble/type/SubprotoSig.java +++ b/scribble-core/src/main/java/org/scribble/type/SubprotoSig.java @@ -15,7 +15,9 @@ import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; +import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; @@ -25,12 +27,13 @@ public class SubprotoSig public final ProtocolName fullname; // public Scope scope; public final List roles; // i.e., roles (and args) are ordered - public final List> args; + public final List> args; + // NonRoleParamKind, not NonRoleArgKind, because latter includes AmbigKind due to parsing requirements // public SubprotocolSignature(ProtocolName fmn, Scope scope, List // roles, List> args) public SubprotoSig(ProtocolName fullname, - List roles, List> args) + List roles, List> args) { this.fullname = fullname; // this.scope = scope; @@ -61,18 +64,22 @@ public boolean equals(Object o) return false; } SubprotoSig subsig = (SubprotoSig) o; - return this.fullname.equals(subsig.fullname) // && - // this.scope.equals(subsig.scope) + return this.fullname.equals(subsig.fullname) // && this.scope.equals(subsig.scope) && this.roles.equals(subsig.roles) && this.args.equals(subsig.args); } @Override public String toString() { - String roles = this.roles.toString(); - String args = this.args.toString(); return // this.scope + ":" + - this.fullname + "<" + args.substring(1, args.length() - 1) + ">(" - + roles.substring(1, roles.length() - 1) + ")"; + this.fullname + + "<" + + this.args.stream().map(x -> x.toString()) + .collect(Collectors.joining(", ")) + + ">" + + "(" + + this.roles.stream().map(x -> x.toString()) + .collect(Collectors.joining(", ")) + + ")"; } } diff --git a/scribble-core/src/main/java/org/scribble/type/name/Role.java b/scribble-core/src/main/java/org/scribble/type/name/Role.java index 218a3b7db..7c6aead9b 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/Role.java +++ b/scribble-core/src/main/java/org/scribble/type/name/Role.java @@ -16,7 +16,7 @@ import org.scribble.type.kind.RoleKind; -public class Role extends AbstractName +public class Role extends AbstractName // CHECKME: type.name package has no SimpleName { public static final Role EMPTY_ROLE = new Role(); public static final Role SELF = new Role("self"); // TODO Factor out constant diff --git a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java index 88674442e..ad585799a 100644 --- a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java @@ -80,7 +80,7 @@ protected void enterRootProtocolDecl(ProtocolDecl pd) ProtocolName fullname = mcontext .getVisibleProtocolDeclFullName(hdr.getDeclName()); List roleargs = rds.getRoles(); - List> nonroleargs = + List> nonroleargs = pds.getParamDeclChildren().stream().map(param -> paramDeclToArg(param)) .collect(Collectors.toList()); pushSubprotocolSig(fullname, roleargs, nonroleargs); @@ -224,8 +224,10 @@ private void enterSubprotocol(Do doo) getModuleContext().checkProtocolDeclDependencyFullName( doo.getProtocolNameNode().toName()); // namedisamb should already have converted proto to the fullname -- in order for inlining to work - pushSubprotocolSig(fullname, doo.getRoleListChild().getRoles(), - doo.getNonRoleListChild().getArguments()); + List> cast = doo.getNonRoleListChild() + .getParamKindArgs(); + // namedisamb should also ensure no ambigs in args + pushSubprotocolSig(fullname, doo.getRoleListChild().getRoles(), cast); pushNameMaps(fullname, doo); } @@ -238,7 +240,7 @@ private void leaveSubprotocol() } private void pushSubprotocolSig(ProtocolName fullname, List roleargs, - List> nonroleargs) + List> nonroleargs) { SubprotoSig subsig = new SubprotoSig(fullname, roleargs, nonroleargs); this.stack.add(subsig); @@ -341,7 +343,7 @@ protected static Map, NonRoleArgNode> makeNonRoleS .iterator(); Iterator nonroleargnodes = nral.getArgumentNodes() .iterator(); - for (Name param : nrpdl.getParameters()) + for (Name param : nrpdl.getParameters()) { Arg arg = nonroleargs.next(); NonRoleArgNode argnode; @@ -360,7 +362,7 @@ protected static Map, NonRoleArgNode> makeNonRoleS return newmap; } - private static Arg paramDeclToArg( + private static Arg paramDeclToArg( NonRoleParamDecl pd) { Name n = pd.getDeclName(); @@ -369,7 +371,7 @@ private static Arg paramDeclToArg( throw new RuntimeException("Shouldn't get in here: " + n); } @SuppressWarnings("unchecked") - Arg tmp = (Arg) n; + Arg tmp = (Arg) n; return tmp; } } diff --git a/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java b/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java index 394b2751e..205b671d5 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java @@ -88,7 +88,7 @@ private ScribNode visitOverrideForLDoPruning(ScribNode parent, LChoice lc) ld.getProtocolNameNode().toName()); SubprotoSig sig = new SubprotoSig(fullname, ld.getRoleListChild().getRoles(), - ld.getNonRoleListChild().getArguments()); + ld.getNonRoleListChild().getParamKindArgs()); if (sig.equals(getStack().get(0))) // Cf. SubprotocolVisitor.isRootedCycle { diff --git a/scribble-test/src/test/resources/good/efsm/grecursion/Test09.scr b/scribble-test/src/test/resources/good/efsm/grecursion/Test09.scr index 2a51a4800..901da6aaa 100644 --- a/scribble-test/src/test/resources/good/efsm/grecursion/Test09.scr +++ b/scribble-test/src/test/resources/good/efsm/grecursion/Test09.scr @@ -1,3 +1,6 @@ +//$ bin/scribblec.sh scribble-test/src/test/resources/good/efsm/grecursion/Test09.scr -project Proto1 C + + module good.efsm.grecursion.Test09; diff --git a/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr b/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr index 76f008765..a738a0220 100644 --- a/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr +++ b/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr @@ -11,9 +11,10 @@ global protocol Foo(role A, role B, role C) do Bar(A, B, C); } -//..HERE CHECKME: aux aux +//..HERE FIXME: recursion missing for B/C projections -- because continue for outer rec being dropped +// TODO drop "aux" -aux +aux global protocol Bar(role D, role E, role F) { 2() from D to F; diff --git a/scribble-test/src/test/resources/good/wfchoice/gdo/params/Test02.scr b/scribble-test/src/test/resources/good/wfchoice/gdo/params/Test02.scr index d8ed58124..e6608226f 100644 --- a/scribble-test/src/test/resources/good/wfchoice/gdo/params/Test02.scr +++ b/scribble-test/src/test/resources/good/wfchoice/gdo/params/Test02.scr @@ -1,3 +1,6 @@ +//$ bin/scribblec.sh scribble-test/src/test/resources/good/wfchoice/gdo/Test02.scr -project Foo A + + module good.wfchoice.gdo.params.Test02; @@ -15,6 +18,7 @@ global protocol Foo(role A, role B) } } +// FIXME: repeat rec sigs in inlining due to multilple do's -- breaks unfolding aux global protocol Bar(role C, role D) { From 56c2206d99af85895654a586eb17e21453f85c01 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 27 Mar 2019 15:36:10 +0000 Subject: [PATCH 134/539] Continued: fixed message transfer message substitution. --- .../src/main/java/org/scribble/job/Job.java | 3 +-- .../main/java/org/scribble/lang/MessageTransfer.java | 12 ++++++++++-- .../src/main/java/org/scribble/type/SubprotoSig.java | 1 + .../resources/good/syntax/projroledeclfix/Test01.scr | 4 ---- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 7c043e2c9..065aae706 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -158,8 +158,7 @@ else if (n instanceof MessageSigName) throw new RuntimeException("TODO: " + n); } } - SubprotoSig sig = new SubprotoSig(g.fullname, g.roles, - params); // FIXME + SubprotoSig sig = new SubprotoSig(g.fullname, g.roles, params); //Deque stack = new LinkedList<>(); STypeInliner i = new STypeInliner(this); i.pushSig(sig); // TODO: factor into constructor diff --git a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java index 048e82ae7..d54dae16b 100644 --- a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java @@ -39,8 +39,16 @@ public Set getRoles() @Override public MessageTransfer substitute(Substitutions subs) { - //..HERE subs msg - return reconstruct(getSource(), subs.subsRole(this.src), this.msg, + Message msg = this.msg; + if (msg instanceof MemberName) + { + MemberName n = (MemberName) msg; + if (subs.hasArg(n)) + { + msg = (Message) subs.subsArg(n); + } + } + return reconstruct(getSource(), subs.subsRole(this.src), msg, subs.subsRole(this.dst)); } diff --git a/scribble-core/src/main/java/org/scribble/type/SubprotoSig.java b/scribble-core/src/main/java/org/scribble/type/SubprotoSig.java index 32418a900..3051007de 100644 --- a/scribble-core/src/main/java/org/scribble/type/SubprotoSig.java +++ b/scribble-core/src/main/java/org/scribble/type/SubprotoSig.java @@ -29,6 +29,7 @@ public class SubprotoSig public final List roles; // i.e., roles (and args) are ordered public final List> args; // NonRoleParamKind, not NonRoleArgKind, because latter includes AmbigKind due to parsing requirements + // Arg, not MemberName, because need to include MessageSigs (sig literals) // public SubprotocolSignature(ProtocolName fmn, Scope scope, List // roles, List> args) diff --git a/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr b/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr index a738a0220..10cff809e 100644 --- a/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr +++ b/scribble-test/src/test/resources/good/syntax/projroledeclfix/Test01.scr @@ -11,10 +11,6 @@ global protocol Foo(role A, role B, role C) do Bar(A, B, C); } -//..HERE FIXME: recursion missing for B/C projections -- because continue for outer rec being dropped -// TODO drop "aux" - -aux global protocol Bar(role D, role E, role F) { 2() from D to F; From f6a2ebb13ae775a256d9697a340a821153ecdf95 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 27 Mar 2019 16:33:33 +0000 Subject: [PATCH 135/539] Continued: refactored do target protocol disamb. --- .../main/java/org/scribble/del/DoArgListDel.java | 15 +++++++++++++-- .../src/main/java/org/scribble/job/Job.java | 6 +++--- .../resources/bad/reach/globals/gdo/Test01b.scr | 3 ++- .../resources/bad/reach/globals/gdo/Test02a.scr | 3 ++- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java index a6376f741..ebb9f6bca 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java @@ -14,10 +14,12 @@ package org.scribble.del; import java.util.List; +import java.util.stream.Collectors; import org.scribble.ast.Do; import org.scribble.ast.DoArgList; import org.scribble.ast.HeaderParamDeclList; +import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.context.ModuleContext; @@ -63,8 +65,17 @@ protected ProtocolDecl getTargetProtocolDecl(Do parent, throw new ScribbleException("Protocol decl not visible: " + simpname); }*/ ProtocolName fullname = mc.getVisibleProtocolDeclFullName(pn); // Lookup in visible names -- not deps, because do target name not disambiguated yet (will be done later this pass) - return jc.getModule(fullname.getPrefix()) - .getProtocolDeclChild(pn.getSimpleName()); + Module mod = jc.getModule(fullname.getPrefix()); + //return mod.getProtocolDeclChild(pn.getSimpleName()); + List> pd = mod.getProtoDeclChildren().stream() + .filter( // cf. Module::hasProtocolDecl + x -> x.getHeaderChild().getDeclName().equals(pn.getSimpleName())) + .collect(Collectors.toList()); + if (pd.size() != 1) + { + throw new ScribbleException("[disamb] Target protocol ambiguous or not found: " + pn); + } + return pd.get(0); } protected abstract HeaderParamDeclList getParamDeclList( diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 065aae706..08b531d63 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -226,7 +226,7 @@ public void runWellFormednessPasses() throws ScribbleException for (GProtocol inlined : this.jctxt.getInlined()) { - /* TODO: relegate to "warning" + //TODO: relegate to "warning" // Check unused roles Set used = inlined.def.getRoles(); Set unused = inlined.roles.stream() @@ -237,7 +237,7 @@ public void runWellFormednessPasses() throws ScribbleException throw new ScribbleException( "Unused roles in " + inlined.fullname + ": " + unused); } - */ + if (inlined.isAux()) { continue; @@ -248,7 +248,7 @@ public void runWellFormednessPasses() throws ScribbleException for (LProtocol proj : this.jctxt.getProjections().values()) { - if (proj.isAux()) // CHECKME? + if (proj.isAux()) // CHECKME? e.g., bad.reach.globals.gdo.Test01b { continue; } diff --git a/scribble-test/src/test/resources/bad/reach/globals/gdo/Test01b.scr b/scribble-test/src/test/resources/bad/reach/globals/gdo/Test01b.scr index 81b31a8e4..a3965c9ae 100644 --- a/scribble-test/src/test/resources/bad/reach/globals/gdo/Test01b.scr +++ b/scribble-test/src/test/resources/bad/reach/globals/gdo/Test01b.scr @@ -1,7 +1,8 @@ module bad.reach.globals.gdo.Test01b; -aux global protocol Proto1(role A, role B) +//aux +global protocol Proto1(role A, role B) { 1() from A to B; do Proto1(A, B); diff --git a/scribble-test/src/test/resources/bad/reach/globals/gdo/Test02a.scr b/scribble-test/src/test/resources/bad/reach/globals/gdo/Test02a.scr index 0bc0a6f9f..5f129d9ed 100644 --- a/scribble-test/src/test/resources/bad/reach/globals/gdo/Test02a.scr +++ b/scribble-test/src/test/resources/bad/reach/globals/gdo/Test02a.scr @@ -8,7 +8,8 @@ global protocol Proto1(role A, role B) //3() from A to B; } -aux global protocol Proto2(role C, role D) +//aux +global protocol Proto2(role C, role D) { 2() from C to D; do Proto2(C, D); From 9909047d46d13f5c2df63394a6135c193da9e01a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 27 Mar 2019 17:57:18 +0000 Subject: [PATCH 136/539] Continued: refactored once-unfolding into role enabling check. --- scribble-core/src/main/java/org/scribble/job/Job.java | 9 +++++---- .../src/main/java/org/scribble/lang/STypeUnfolder.java | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 08b531d63..9448c0a32 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -41,7 +41,6 @@ import org.scribble.type.Arg; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; -import org.scribble.type.kind.Local; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.DataType; import org.scribble.type.name.GProtocolName; @@ -182,8 +181,8 @@ else if (n instanceof MessageSigName) { GProtocol inlined = this.jctxt.getInlined(g.fullname); LProtocol proj = inlined.project(self); // Projection and inling commutative? - STypeUnfolder unf = new STypeUnfolder<>(); - //proj = proj.unfoldAllOnce(unf); + /*STypeUnfolder unf = new STypeUnfolder<>(); + proj = proj.unfoldAllOnce(unf);*/ this.jctxt.addProjected(proj.fullname, proj); System.out.println("\nprojected onto " + self + ":\n" + proj); } @@ -242,7 +241,9 @@ public void runWellFormednessPasses() throws ScribbleException { continue; } - inlined.checkRoleEnabling(); + STypeUnfolder unf = new STypeUnfolder<>(); + //e.g., C->D captured under an A->B choice after unfolding, cf. bad.wfchoice.enabling.twoparty.Test01b; + inlined.unfoldAllOnce(unf).checkRoleEnabling(); inlined.checkExtChoiceConsistency(); } diff --git a/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java index f9778ac95..1df642d34 100644 --- a/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java @@ -6,6 +6,7 @@ import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.RecVar; +// Currently once usage only, no popRec -- CHECKME: fix? public class STypeUnfolder { private final Map> recs = new HashMap<>(); From 3356367dcf795454f48a915e69e7fa05e526ff13 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 27 Mar 2019 20:49:55 +0000 Subject: [PATCH 137/539] Minor. --- .../scribble/del/global/GProtocolDeclDel.java | 3 --- .../src/main/java/org/scribble/job/Job.java | 26 +++++++------------ .../good/wfchoice/gdo/params/Test02.scr | 2 -- scribble-test/src/test/scrib/tmp/Test.scr | 23 +++++++++++++++- 4 files changed, 31 insertions(+), 23 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 4dbfdcccd..ddf180395 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -202,9 +202,6 @@ public void enterValidation(ScribNode parent, ScribNode child, else { validateByScribble(checker.job, fullname, true); - - System.out.println("ppp1: " + checker.job.config.fair); - if (!checker.job.config.fair) { checker.job.debugPrintln( diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 9448c0a32..bb2cf9e73 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -134,7 +134,7 @@ public void runContextBuildingPasses() throws ScribbleException { GProtocol g = (GProtocol) gpd.visitWith(t); this.jctxt.addIntermediate(g.fullname, g); - System.out.println("\nparsed:\n" + gpd + "\n\nintermed:\n" + g); + debugPrintln("\nParsed:\n" + gpd + "\n\nScribble intermediary:\n" + g); } } @@ -162,7 +162,7 @@ else if (n instanceof MessageSigName) STypeInliner i = new STypeInliner(this); i.pushSig(sig); // TODO: factor into constructor GProtocol inlined = g.getInlined(i); - System.out.println("\ninlined:\n" + inlined); + debugPrintln("\nSubprotocols inlined:\n" + inlined); this.jctxt.addInlined(g.fullname, inlined); } @@ -172,7 +172,7 @@ else if (n instanceof MessageSigName) STypeUnfolder unf1 = new STypeUnfolder<>(); //GTypeUnfolder unf2 = new GTypeUnfolder(); GType unf = (GType) inlined.unfoldAllOnce(unf1);//.unfoldAllOnce(unf2); CHECKME: twice unfolding? instead of "unguarded"-unfolding? - System.out.println("\nunfolded:\n" + unf); + debugPrintln("\nAll recursions unfolded once:\n" + unf); } for (GProtocol g : this.jctxt.getIntermediates()) @@ -184,7 +184,7 @@ else if (n instanceof MessageSigName) /*STypeUnfolder unf = new STypeUnfolder<>(); proj = proj.unfoldAllOnce(unf);*/ this.jctxt.addProjected(proj.fullname, proj); - System.out.println("\nprojected onto " + self + ":\n" + proj); + debugPrintln("\nProjected onto " + self + ":\n" + proj); } } @@ -193,12 +193,9 @@ else if (n instanceof MessageSigName) { //LProtocolName lname = e.getKey(); LProtocol proj = e.getValue(); - - System.out.println("sss1: " + proj); - EGraph graph = proj.toEGraph(this); this.jctxt.addEGraph(proj.fullname, graph); - System.out.println("\ngraph for " + proj.fullname + ":\n" + graph.toDot()); + debugPrintln("\nEFSM for " + proj.fullname + ":\n" + graph.toDot()); } } @@ -270,7 +267,7 @@ public void runWellFormednessPasses() throws ScribbleException GProtocolName fullname = gpd.getFullMemberName(mod); - System.out.println("\nvalidating " + fullname + ":"); + debugPrintln("\nValidating " + fullname + ":"); if (checker.job.config.spin) { @@ -284,12 +281,9 @@ public void runWellFormednessPasses() throws ScribbleException else { GProtocolDeclDel.validateByScribble(checker.job, fullname, true); - - System.out.println("ppp1: " + checker.job.config.fair); - if (!checker.job.config.fair) { - checker.job.debugPrintln( + debugPrintln( "(" + fullname + ") Validating with \"unfair\" output choices.. "); GProtocolDeclDel.validateByScribble(checker.job, fullname, false); // TODO: only need to check progress, not full validation } @@ -340,10 +334,8 @@ protected void runProjectionUnfoldingPass() throws ScribbleException public Map getProjections(GProtocolName fullname, Role role) throws ScribbleException { - System.out.println("cccc2: "); - //Module root = this.jctxt.getProjection(fullname, role); - LProtocol proj = this.jctxt.getProjected(fullname, role); - System.out.println("cccc3: "); + //Module root = this.jctxt.getProjection(fullname, role); + LProtocol proj = this.jctxt.getProjected(fullname, role); // FIXME: dependencies, -project -- FIXME: need to create Module (with dependency imports) Map> dependencies = diff --git a/scribble-test/src/test/resources/good/wfchoice/gdo/params/Test02.scr b/scribble-test/src/test/resources/good/wfchoice/gdo/params/Test02.scr index e6608226f..8f63e0657 100644 --- a/scribble-test/src/test/resources/good/wfchoice/gdo/params/Test02.scr +++ b/scribble-test/src/test/resources/good/wfchoice/gdo/params/Test02.scr @@ -18,8 +18,6 @@ global protocol Foo(role A, role B) } } -// FIXME: repeat rec sigs in inlining due to multilple do's -- breaks unfolding - aux global protocol Bar(role C, role D) { M from C to D; diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 2e937e0c3..2523b3495 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -37,8 +37,29 @@ module tmp.Test; // FIXME: good.liveness.Test02, reachability check (empty rec projection) +global protocol Foo(role A, role B) +{ + choice at A + { + do Bar<1()>(A, B); + 1() from B to A; + } + or + { + do Bar<2()>(A, B); + 2() from B to A; + } +} + +// FIXME: repeat rec sigs in inlining due to multilple do's -- breaks unfolding + +aux global protocol Bar(role C, role D) +{ + M from C to D; +} -//* + +/* global protocol Proto1(role A, role B) { rec X From 43a4a91ab7461d0b1d7ee3c0b3d2714b693cdbab Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 27 Mar 2019 21:40:45 +0000 Subject: [PATCH 138/539] Continued: fixed STypeUnfolder recvar popping. --- .../main/java/org/scribble/cli/CLArgParser.java | 1 - .../java/org/scribble/lang/STypeUnfolder.java | 6 +++--- .../java/org/scribble/lang/global/GContinue.java | 5 ++--- .../org/scribble/lang/global/GRecursion.java | 5 +++-- .../java/org/scribble/lang/local/LRecursion.java | 3 ++- .../model/endpoint/EGraphBuilderUtil2.java | 3 --- scribble-test/src/test/scrib/tmp/Test.scr | 16 ++++++---------- 7 files changed, 16 insertions(+), 23 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java index f9270d6cb..cfe769aed 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java @@ -420,7 +420,6 @@ private static boolean validateModuleArg(String arg) private static boolean validatePaths(String paths) { - System.out.println(System.getProperty("user.dir")); for (String path : paths.split(File.pathSeparator)) { if (!new File(path).isDirectory()) diff --git a/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java index 1df642d34..c281a5fd9 100644 --- a/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java @@ -35,8 +35,8 @@ public Seq getRec(RecVar rv) return this.recs.get(rv); } - /*public B popRec(RecVar rv) + public void popRec(RecVar rv) { - return this.recs.remove(rv); - }*/ + this.recs.remove(rv); + } } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java index 1d2a928ac..b7627f41b 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java @@ -43,12 +43,11 @@ public GContinue getInlined(STypeInliner i)//, Deque stack) } @Override - public GRecursion unfoldAllOnce( - STypeUnfolder u) + public GRecursion unfoldAllOnce(STypeUnfolder u) { return new GRecursion(getSource(), this.recvar, (GSeq) u.getRec(this.recvar)); - // CHECKME: Continue (not Recursion) as the source of the unfolding + // CHECKME: Continue (not Recursion) as the source of the unfolding ? } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java index fa74408e8..1bf348d3f 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java @@ -53,10 +53,11 @@ public GRecursion getInlined(STypeInliner i)//, Deque stack) @Override public GType unfoldAllOnce(STypeUnfolder u) { - if (!u.hasRec(this.recvar)) + if (!u.hasRec(this.recvar)) // N.B. doesn't work for shadowing { - u.pushRec(this.recvar, this.body); // Never "popped", relying on recvar disamb by inliner -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs + u.pushRec(this.recvar, this.body); GType unf = (GType) this.body.unfoldAllOnce(u); + u.popRec(this.recvar); // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs return unf; } return this; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java index 29cfbf722..cfd9c3bd3 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java @@ -64,8 +64,9 @@ public LType unfoldAllOnce(STypeUnfolder u) { if (!u.hasRec(this.recvar)) { - u.pushRec(this.recvar, this.body); // Never "popped", relying on recvar disamb by inliner -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs + u.pushRec(this.recvar, this.body); LType unf = (LType) this.body.unfoldAllOnce(u); + u.popRec(this.recvar); // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs return unf; } return this; diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java index 5b3315a26..0e011a4c2 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java @@ -483,9 +483,6 @@ else if (a instanceof IntermediateRecEdge) IntermediateContinueEdge ice = (IntermediateContinueEdge) a; //for (IOAction e : this.enactingMap.get(succ)) RecVar rv = new RecVar(ice.mid.toString()); - - System.out.println("bbbb2: " + rv); - for (EAction e : this.enactingMap.get(origSucc).get(rv)) { for (EState n : origSucc.getSuccessors(e)) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 2523b3495..dd293470c 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -31,31 +31,27 @@ module tmp.Test; // TODO: port forwarding version of P2 -- funny case of "session" persisting over full disconnect, should/how to correlate? - - - // FIXME: good.liveness.Test02, reachability check (empty rec projection) -global protocol Foo(role A, role B) +global protocol Foo(role A, role B) { choice at A { - do Bar<1()>(A, B); - 1() from B to A; + do Bar(A, B); } or { - do Bar<2()>(A, B); - 2() from B to A; + do Bar(A, B); } } // FIXME: repeat rec sigs in inlining due to multilple do's -- breaks unfolding -aux global protocol Bar(role C, role D) +aux global protocol Bar(role C, role D) { - M from C to D; + 3() from C to D; + do Bar(C, D); } From 61adae02495be9593d5f3330430bbdb50b1382e7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 27 Mar 2019 22:36:29 +0000 Subject: [PATCH 139/539] Continued: fixed subproto inlining for shadowed recvars in nested recs. --- .../main/java/org/scribble/lang/Continue.java | 3 +- .../java/org/scribble/lang/STypeInliner.java | 48 ++++++++++++++++--- .../java/org/scribble/lang/global/GDo.java | 2 +- .../org/scribble/lang/global/GProtocol.java | 2 +- .../org/scribble/lang/global/GRecursion.java | 13 +++-- .../org/scribble/lang/local/LProtocol.java | 2 +- .../org/scribble/lang/local/LRecursion.java | 13 +++-- scribble-test/src/test/scrib/tmp/Test.scr | 34 ++++++++++++- 8 files changed, 94 insertions(+), 23 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/lang/Continue.java b/scribble-core/src/main/java/org/scribble/lang/Continue.java index 158a06b85..cf00b2e09 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Continue.java +++ b/scribble-core/src/main/java/org/scribble/lang/Continue.java @@ -40,8 +40,7 @@ public Continue substitute(Substitutions subs) @Override public Continue getInlined(STypeInliner i) { - RecVar rv = i.makeRecVar(//stack.peek(), - this.recvar); + RecVar rv = i.getInlinedRecVar(this.recvar); return reconstruct(getSource(), rv); } diff --git a/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java b/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java index f42ae5668..fd13bbb58 100644 --- a/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java @@ -1,7 +1,9 @@ package org.scribble.lang; import java.util.Deque; +import java.util.HashMap; import java.util.LinkedList; +import java.util.Map; import java.util.stream.Collectors; import org.scribble.job.Job; @@ -14,6 +16,10 @@ public class STypeInliner private final Deque stack = new LinkedList<>(); + // To handle recvar shadowing in nested recs + private Map> recvars = new HashMap<>(); + private Map counter = new HashMap<>(); + public STypeInliner(Job job) { this.job = job; @@ -43,20 +49,50 @@ public void popSig() this.stack.pop(); } - // sig is the for the current innermost proto - public RecVar makeRecVar(SubprotoSig sig) + // For Protocol/Do -- sig is for the current innermost proto (but not implicitly peek() for G/LDo convenience) + public RecVar getInlinedRecVar(SubprotoSig sig) { - String lab = "__" + sig.fullname + "__" + String lab = "__" + sig.fullname.toString().replaceAll("\\.", "_") + "__" + sig.roles.stream().map(x -> x.toString()) .collect(Collectors.joining("_")) + "__" + sig.args.stream().map(x -> x.toString()) .collect(Collectors.joining("_")); return new RecVar(lab); } - - public RecVar makeRecVar(//SubprotoSig sig, + + public RecVar enterRec(//SubprotoSig sig, RecVar rv) { - return new RecVar(makeRecVar(this.stack.peek()).toString() + "__" + rv); + String text = getInlinedRecVar(this.stack.peek()) + "__" + rv; + if (this.counter.containsKey(rv)) + { + int i = this.counter.get(rv) + 1; + text += "_" + i; + this.counter.put(rv, i); + } + else + { + this.counter.put(rv, 0); + } + RecVar res = new RecVar(text); + Deque tmp = this.recvars.get(rv); + if (tmp == null) + { + tmp = new LinkedList<>(); + this.recvars.put(rv, tmp); + } + tmp.push(res); + return res; + } + + // For Continue + public RecVar getInlinedRecVar(RecVar rv) + { + return this.recvars.get(rv).peek(); + } + + public void exitRec(RecVar rv) + { + this.recvars.get(rv).pop(); } } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index 45429a0f5..64883fe6f 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -44,7 +44,7 @@ public GType getInlined(STypeInliner i)//, Deque stack) { GProtocolName fullname = this.proto; SubprotoSig sig = new SubprotoSig(fullname, this.roles, this.args); - RecVar rv = i.makeRecVar(sig); + RecVar rv = i.getInlinedRecVar(sig); if (i.hasSig(sig)) { return new GContinue(getSource(), rv); diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index de6484da2..01cf355d2 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -68,7 +68,7 @@ public GProtocol getInlined(STypeInliner i)//, Deque stack) Substitutions subs = new Substitutions(this.roles, sig.roles, this.params, sig.args); GSeq body = this.def.substitute(subs).getInlined(i);//, stack); - RecVar rv = i.makeRecVar(sig); + RecVar rv = i.getInlinedRecVar(sig); GRecursion rec = new GRecursion(null, rv, body); // CHECKME: or protodecl source? GProtocolDecl source = getSource(); GSeq def = new GSeq(null, Stream.of(rec).collect(Collectors.toList())); diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java index 1bf348d3f..d16ce7631 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java @@ -44,20 +44,23 @@ public GRecursion substitute(Substitutions subs) public GRecursion getInlined(STypeInliner i)//, Deque stack) { org.scribble.ast.ProtocolKindNode source = getSource(); // CHECKME: or empty source? - GSeq body = this.body.getInlined(i);//, stack); - RecVar rv = i.makeRecVar(//stack.peek(), + RecVar rv = i.enterRec(//stack.peek(), this.recvar); // FIXME: make GTypeInliner, and record recvars to check freshness (e.g., rec X in two choice cases) - return reconstruct(source, rv, body); + GSeq body = this.body.getInlined(i);//, stack); + GRecursion res = reconstruct(source, rv, body); + i.exitRec(this.recvar); + return res; } @Override public GType unfoldAllOnce(STypeUnfolder u) { - if (!u.hasRec(this.recvar)) // N.B. doesn't work for shadowing + if (!u.hasRec(this.recvar)) // N.B. doesn't work if recvars shadowed { u.pushRec(this.recvar, this.body); GType unf = (GType) this.body.unfoldAllOnce(u); - u.popRec(this.recvar); // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs + u.popRec(this.recvar); + // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs return unf; } return this; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index 73f163bb5..b61889b56 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -76,7 +76,7 @@ public LRecursion getInlined(STypeInliner i)//, Deque stack) sig.args); LSeq body = this.def.substitute(subs).getInlined(i);//, stack); LProtocolDecl source = getSource(); // CHECKME: or empty source? - RecVar rv = i.makeRecVar(sig); + RecVar rv = i.getInlinedRecVar(sig); return new LRecursion(source, rv, body); } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java index cfd9c3bd3..4b8949cc5 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java @@ -53,20 +53,23 @@ public LRecursion substitute(Substitutions subs) public LRecursion getInlined(STypeInliner i)//, Deque stack) { org.scribble.ast.ProtocolKindNode source = getSource(); // CHECKME: or empty source? - LSeq body = this.body.getInlined(i);//, stack); - RecVar rv = i.makeRecVar(//stack.peek(), + RecVar rv = i.enterRec(//stack.peek(), this.recvar); // FIXME: make GTypeInliner, and record recvars to check freshness (e.g., rec X in two choice cases) - return reconstruct(source, rv, body); + LSeq body = this.body.getInlined(i);//, stack); + LRecursion res = reconstruct(source, rv, body); + i.exitRec(this.recvar); + return res; } @Override public LType unfoldAllOnce(STypeUnfolder u) { - if (!u.hasRec(this.recvar)) + if (!u.hasRec(this.recvar)) // N.B. doesn't work if recvars shadowed { u.pushRec(this.recvar, this.body); LType unf = (LType) this.body.unfoldAllOnce(u); - u.popRec(this.recvar); // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs + u.popRec(this.recvar); + // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs return unf; } return this; diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index dd293470c..5db556aa9 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -34,6 +34,38 @@ module tmp.Test; // FIXME: good.liveness.Test02, reachability check (empty rec projection) + + +/*// Add unit test -- testing: inlining of shadowed recvars +global protocol Foo(role A, role B) +{ + rec X + { + rec X + { + 1() from A to B; + continue X; + } + } +} +//*/ + + +/* // Add unit test -- testing: repeat rec sigs in inlining due to multilple do's, w.r.t. unfolding +global protocol Foo(role A, role B) +{ + do Bar(A, B); + do Bar(A, B); +} + +aux global protocol Bar(role A, role B) +{ + 1() from A to B; +} +//*/ + + +/* // Add unit test -- testing: repeat rec sigs in inlining due to multilple do's, w.r.t. unfolding global protocol Foo(role A, role B) { choice at A @@ -46,8 +78,6 @@ global protocol Foo(role A, role B) } } -// FIXME: repeat rec sigs in inlining due to multilple do's -- breaks unfolding - aux global protocol Bar(role C, role D) { 3() from C to D; From cac941fd351c0b2bf0e05e9e48971d876fb13832 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 28 Mar 2019 10:18:17 +0000 Subject: [PATCH 140/539] Minor. --- scribble-core/src/main/java/org/scribble/job/Job.java | 7 ++++--- .../src/main/java/org/scribble/lang/STypeInliner.java | 1 + scribble-test/src/test/scrib/tmp/Test.scr | 11 +++++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index bb2cf9e73..edaef0512 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -343,11 +343,12 @@ public Map getProjections(GProtocolName fullname, .getLProtoDeclChildren().get(0).del()).getProtocolDeclContext() .getDependencyMap().getDependencies().get(role);*/ new HashMap<>(); - System.out.println("cccc4: "); // Can ignore Set for projections (is singleton), as each projected proto is a dependency only for self (implicit in the protocoldecl) - return dependencies.keySet().stream().collect( - Collectors.toMap(x -> x, x -> this.jctxt.getModule(x.getPrefix()))); + /*return dependencies.keySet().stream().collect( + Collectors.toMap(x -> x, x -> this.jctxt.getModule(x.getPrefix())));*/ + throw new RuntimeException( + "[TODO] Projection modules and dependencies: " + fullname + "@" + role); } /*public Map generateSessionApi(GProtocolName fullname) throws ScribbleException diff --git a/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java b/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java index fd13bbb58..5dafd4d92 100644 --- a/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java @@ -14,6 +14,7 @@ public class STypeInliner { public final Job job; + // Basically, "SubprotocolVisitor" -- factor out? private final Deque stack = new LinkedList<>(); // To handle recvar shadowing in nested recs diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 5db556aa9..3de1c67e7 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -34,6 +34,17 @@ module tmp.Test; // FIXME: good.liveness.Test02, reachability check (empty rec projection) +//------------- +//- projection dependencies (projections as modules?) +//- check projected role/choice/do pruning/fixing? +//- drop unused recs -- partly done by inlining, but not done yet for subprotos +//- refactor ast to parser, refactor lang to type? -- separate protocol classes? +//- remove unused visitors and del code -- move new visitors there? +//- shorten class names +//- refactor model building +//- refactor do param/arg ast classes +//- refactor parsing and CL +//- check demos /*// Add unit test -- testing: inlining of shadowed recvars From 64d61572dd0065d853bed4aec848d0a49ac7caee Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 29 Mar 2019 18:28:57 +0000 Subject: [PATCH 141/539] Continued: added parser check for unhandled token types. --- .../java/org/scribble/ast/InteractionSeq.java | 8 +- .../scribble/ast/global/GInteractionSeq.java | 2 +- .../org/scribble/ast/global/GRecursion.java | 2 +- .../java/org/scribble/ast/local/LChoice.java | 2 +- .../main/java/org/scribble/ast/local/LDo.java | 2 +- .../scribble/ast/local/LInteractionSeq.java | 4 +- .../org/scribble/ast/local/LRecursion.java | 2 +- .../del/global/GInteractionSeqDel.java | 14 +- .../org/scribble/del/local/LChoiceDel.java | 2 +- .../del/local/LInteractionSeqDel.java | 20 +- .../context/ProjectedChoiceDoPruner.java | 2 +- .../UnguardedChoiceDoProjectionChecker.java | 2 +- .../parser/scribble/ScribTreeAdaptor.java | 198 ++++++------------ scribble-test/src/test/scrib/tmp/Test.scr | 22 +- 14 files changed, 121 insertions(+), 161 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java b/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java index a97bdf5b4..d8a94172c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java +++ b/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java @@ -44,7 +44,7 @@ public InteractionSeq(InteractionSeq node) @Override public abstract InteractionSeq dupNode(); - public abstract List> getInteractNodeChildren(); + public abstract List> getInteractionChildren(); public boolean isEmpty() { @@ -64,7 +64,7 @@ public InteractionSeq reconstruct(List> ins) public ScribNode visitChildren(AstVisitor nv) throws ScribbleException { List> actions = new LinkedList<>(); - for (InteractionNode in : getInteractNodeChildren()) + for (InteractionNode in : getInteractionChildren()) { //ProtocolKindNode visited = visitProtocolKindChildWithCastCheck(this, in, nv, ProtocolKindNode.class, in.getKind(), KIND_CAST); // No: ProjectedChoiceDoPruning (and others?) needs to return null; CastCheck doesn't allow that // CHECKME @@ -74,7 +74,7 @@ public ScribNode visitChildren(AstVisitor nv) throws ScribbleException { @SuppressWarnings("unchecked") InteractionSeq tmp = (InteractionSeq) visited; - actions.addAll(tmp.getInteractNodeChildren()); + actions.addAll(tmp.getInteractionChildren()); } else { @@ -89,7 +89,7 @@ public ScribNode visitChildren(AstVisitor nv) throws ScribbleException @Override public String toString() { - return getInteractNodeChildren().stream().map(i -> i.toString()) + return getInteractionChildren().stream().map(i -> i.toString()) .collect(Collectors.joining("\n")); } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java b/scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java index 481c4a476..025cf482d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java @@ -53,7 +53,7 @@ public LInteractionSeq project(AstFactory af, Role self, List } @Override - public List getInteractNodeChildren() + public List getInteractionChildren() { return getChildren().stream().map(n -> (GInteractionNode) n) .collect(Collectors.toList()); diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java index e35b2eaed..93ec573da 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java @@ -92,7 +92,7 @@ protected static LProtocolBlock prune(AstFactory af, LProtocolBlock block, return block; } List lis = block.getInteractSeqChild() - .getInteractNodeChildren(); + .getInteractionChildren(); if (lis.size() > 1) { return block; diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java b/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java index 6fbba93f7..de42effcb 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java @@ -63,7 +63,7 @@ public List getBlockChildren() public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { return getBlockChildren().get(0).getInteractSeqChild() - .getInteractNodeChildren().get(0).inferLocalChoiceSubject(fixer); + .getInteractionChildren().get(0).inferLocalChoiceSubject(fixer); } @Override diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LDo.java b/scribble-core/src/main/java/org/scribble/ast/local/LDo.java index f1b5bbf38..fed9e8834 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LDo.java @@ -66,7 +66,7 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) ModuleContext mc = fixer.getModuleContext(); JobContext jc = fixer.job.getJobContext(); Role subj = getTargetProtocolDecl(jc, mc).getDefChild().getBlockChild() - .getInteractSeqChild().getInteractNodeChildren().get(0) + .getInteractSeqChild().getInteractionChildren().get(0) .inferLocalChoiceSubject(fixer); // FIXME: need equivalent of (e.g) rec X { continue X; } pruning (cf GRecursion.prune) for irrelevant recursive-do (e.g. proto(A, B, C) { choice at A {A->B.do Proto(A,B,C)} or {A->B.B->C} })) Iterator roleargs = getRoleListChild().getRoles().iterator(); diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java b/scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java index 9b9bc174d..122812b16 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java @@ -45,7 +45,7 @@ public LInteractionSeq dupNode() } @Override - public List getInteractNodeChildren() + public List getInteractionChildren() { return getChildren().stream().map(n -> (LInteractionNode) n) .collect(Collectors.toList()); @@ -61,7 +61,7 @@ public Set getEnabling() { if (!this.isEmpty()) { - for (LInteractionNode ln : getInteractNodeChildren()) + for (LInteractionNode ln : getInteractionChildren()) { Set enab = ln.getEnabling(); if (!enab.isEmpty()) diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java index 93ed3170f..371ffeb80 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java @@ -56,7 +56,7 @@ public LProtocolBlock getBlockChild() public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { //fixer.pushRec(this.recvar.toName()); - return getBlockChild().getInteractSeqChild().getInteractNodeChildren() + return getBlockChild().getInteractSeqChild().getInteractionChildren() .get(0).inferLocalChoiceSubject(fixer); } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java b/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java index bb26398ad..c4da199f0 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java @@ -46,7 +46,7 @@ public GSeq translate(ScribNode n, GTypeTranslator t) { GInteractionSeq source = (GInteractionSeq) n; List elems = new LinkedList<>(); - for (GInteractionNode c : source.getInteractNodeChildren()) + for (GInteractionNode c : source.getInteractionChildren()) { elems.add(c.visitWith(t)); // throws ScribbleException } @@ -60,12 +60,12 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, { GInteractionSeq gis = (GInteractionSeq) visited; List gins = new LinkedList(); - for (GInteractionNode gi : gis.getInteractNodeChildren()) + for (GInteractionNode gi : gis.getInteractionChildren()) { ScribNode inlined = ((InlineProtocolEnv) gi.del().env()).getTranslation(); if (inlined instanceof GInteractionSeq) // A do got inlined { - gins.addAll(((GInteractionSeq) inlined).getInteractNodeChildren()); + gins.addAll(((GInteractionSeq) inlined).getInteractionChildren()); } else { @@ -91,14 +91,14 @@ public GInteractionSeq leaveProjection(ScribNode parent, ScribNode child, { GInteractionSeq gis = (GInteractionSeq) visited; List lis = new LinkedList<>(); - for (GInteractionNode gi : gis.getInteractNodeChildren()) // FIXME: rewrite using flatMap + for (GInteractionNode gi : gis.getInteractionChildren()) // FIXME: rewrite using flatMap { LNode ln = (LNode) ((ProjectionEnv) gi.del().env()).getProjection(); //LNode ln = ((GInteractionNodeDel) gi.del()).project(gi, self); // FIXME: won't work for do // TODO: move node-specific projects to G nodes (not dels) and take child projections as params, bit like reconstruct if (ln instanceof LInteractionSeq) // Self comm sequence { - lis.addAll(((LInteractionSeq) ln).getInteractNodeChildren()); + lis.addAll(((LInteractionSeq) ln).getInteractionChildren()); } else if (ln != null) // null is used for empty projection { @@ -149,11 +149,11 @@ public GInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, RecRemover rem, ScribNode visited) throws ScribbleException { GInteractionSeq gis = (GInteractionSeq) visited; - List gins = gis.getInteractNodeChildren().stream() + List gins = gis.getInteractionChildren().stream() .flatMap((gi) -> (gi instanceof GRecursion && rem.toRemove(((GRecursion) gi).getRecVarChild().toName())) ? ((GRecursion) gi).getBlockChild().getInteractSeqChild() - .getInteractNodeChildren().stream() + .getInteractionChildren().stream() : Stream.of(gi)) .collect(Collectors.toList()); return rem.job.config.af.GInteractionSeq(gis.getSource(), gins); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java b/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java index d633eedd8..4a5773b9f 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java @@ -87,7 +87,7 @@ public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, List blocks = lc.getBlockChildren(); Set subjs = blocks.stream() - .map(b -> b.getInteractSeqChild().getInteractNodeChildren().get(0) + .map(b -> b.getInteractSeqChild().getInteractionChildren().get(0) .inferLocalChoiceSubject(fixer)) //.filter((r) -> !r.toString().equals(DummyProjectionRoleNode.DUMMY_PROJECTION_ROLE)) .collect(Collectors.toSet()); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java b/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java index 7d5652fe1..ac6cc200d 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java @@ -45,7 +45,7 @@ public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, throws ScribbleException { LInteractionSeq lc = (LInteractionSeq) visited; - List actions = lc.getInteractNodeChildren().stream() + List actions = lc.getInteractionChildren().stream() .filter(li -> li != null).collect(Collectors.toList()); return lc.reconstruct(actions); } @@ -57,12 +57,12 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, { LInteractionSeq lis = (LInteractionSeq) visited; List lins = new LinkedList(); - for (LInteractionNode li : lis.getInteractNodeChildren()) + for (LInteractionNode li : lis.getInteractionChildren()) { ScribNode inlined = ((InlineProtocolEnv) li.del().env()).getTranslation(); if (inlined instanceof LInteractionSeq) { - lins.addAll(((LInteractionSeq) inlined).getInteractNodeChildren()); + lins.addAll(((LInteractionSeq) inlined).getInteractionChildren()); } else { @@ -81,7 +81,7 @@ public LInteractionSeq visitForReachabilityChecking( throws ScribbleException { List visited = new LinkedList<>(); - for (InteractionNode li : child.getInteractNodeChildren()) + for (InteractionNode li : child.getInteractionChildren()) { ReachabilityEnv re = checker.peekEnv(); if (!re.isSequenceable()) @@ -116,19 +116,19 @@ public LInteractionSeq visitForFsmConversion(EGraphBuilder gb, child.getInteractions().get(i).accept(conv); } }*/ - for (int i = 0; i < child.getInteractNodeChildren().size(); i++) + for (int i = 0; i < child.getInteractionChildren().size(); i++) { - if (i == child.getInteractNodeChildren().size() - 1) + if (i == child.getInteractionChildren().size() - 1) { gb.util.setExit(exit); - child.getInteractNodeChildren().get(i).accept(gb); + child.getInteractionChildren().get(i).accept(gb); } else { EState tmp = // conv.util.newState(Collections.emptySet()); gb.util.ef.newEState(Collections.emptySet()); gb.util.setExit(tmp); - child.getInteractNodeChildren().get(i).accept(gb); + child.getInteractionChildren().get(i).accept(gb); gb.util.setEntry(gb.util.getExit()); // exit may not be tmp, entry/exit can be modified, e.g. continue } @@ -149,11 +149,11 @@ public LInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, RecRemover rem, ScribNode visited) throws ScribbleException { LInteractionSeq lis = (LInteractionSeq) visited; - List lins = lis.getInteractNodeChildren().stream() + List lins = lis.getInteractionChildren().stream() .flatMap((li) -> (li instanceof LRecursion && rem.toRemove(((LRecursion) li).getRecVarChild().toName())) ? ((LRecursion) li).getBlockChild().getInteractSeqChild() - .getInteractNodeChildren().stream() + .getInteractionChildren().stream() : Stream.of(li)) .collect(Collectors.toList()); return rem.job.config.af.LInteractionSeq(lis.getSource(), lins); diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java index c6039348d..3c956dfc8 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java @@ -54,7 +54,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) LChoice lc = (LChoice) parent; LProtocolBlock lb = (LProtocolBlock) child; LInteractionSeq lis = lb.getInteractSeqChild(); - List ins = lis.getInteractNodeChildren(); + List ins = lis.getInteractionChildren(); if (ins.get(0) instanceof LDo) // Unlike GRecursion.prune, to-prune "do" could be followed by a continuation? { JobContext jc = this.job.getJobContext(); diff --git a/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java b/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java index 205b671d5..43a1bc0b1 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java @@ -79,7 +79,7 @@ private ScribNode visitOverrideForLDoPruning(ScribNode parent, LChoice lc) for (LProtocolBlock b : lc.getBlockChildren()) { LInteractionNode in = - b.getInteractSeqChild().getInteractNodeChildren().get(0); + b.getInteractSeqChild().getInteractionChildren().get(0); if (in instanceof LDo) { LDo ld = (LDo) in; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index cccacb8cc..a9c3a7212 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -1,5 +1,8 @@ package org.scribble.parser.scribble; +import java.util.Arrays; +import java.util.List; + import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTreeAdaptor; import org.scribble.ast.AuxMod; @@ -43,11 +46,13 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; import org.scribble.ast.name.simple.TypeParamNode; +import org.scribble.parser.antlr.ScribbleParser; // get/setType don't seem to be really used public class ScribTreeAdaptor extends CommonTreeAdaptor { - //private final AstFactory f = new AstFactoryImpl(); + public static final List TOKEN_NAMES = + Arrays.asList(ScribbleParser.tokenNames); // Generated parser seems to use nil to create "blank" nodes and then "fill them in" @Override @@ -59,146 +64,81 @@ public Object nil() @Override public Object create(Token t) { - /*if (payload == null) - { - //System.out.println("aaa: " + payload.getText()); - return new MyCommonTree(payload); - }*/ + String tname = t.getText(); - if (t == null) // E.g. nil() -- CHECKME: what are the nils being made for? + /* // Could try to use a naming convention between Token and AST class names for reflection + try { - //return super.create(null); - //return nil(); - throw new RuntimeException("Shouldn't get in here: "); // null Token only for nil + Constructor cons = c.get Constructor(Job.class); + for (ModuleName modname : modnames) + { + AstVisitor nv = cons.newInstance(this); + runVisitorOnModule(modname, nv); + } } - - /*String lab = ""; - if (t != null) + catch (NoSuchMethodException | SecurityException | InstantiationException + | IllegalAccessException | IllegalArgumentException + | InvocationTargetException e) { - //return new MyCommonTree(payload); - lab = t.getText(); + throw new RuntimeException(e); }*/ - String lab = t.getText(); - //CommonTree empty = new CommonTree(t); // CommonTree constr sets this.token = payload.token - switch (lab) + + switch (tname) { - case "MODULE": //return this.f.Module(empty, null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); - return new Module(t); - case "MODULEDECL": //return this.f.ModuleDecl(empty, null); - return new ModuleDecl(t); - case "MODULENAME": //return this.f.Q - //return new ModuleNameNode(t); - return new ModuleNameNode(t); /*.. HERE ambigname -- or qualifiedname? (ambigname currently singleton name) - -- or modulename just as identifiers? -- ANTLR uses every (leaf) token as singleton node - -- AntlrTokenTree? -- i.e. CommonTree (wrapper for Token)*/ - - case "IMPORTMODULE": - return new ImportModule(t); - - case "PAYLOADTYPEDECL": - return new DataTypeDecl(t); - case "MESSAGESIGNATUREDECL": - return new MessageSigNameDecl(t); - case "TYPENAME": - return new DataTypeNode(t); - case "SIGNAME": - return new MessageSigNameNode(t); + case "MODULE": return new Module(t); + case "MODULEDECL": return new ModuleDecl(t); + case "MODULENAME": return new ModuleNameNode(t); + case "IMPORTMODULE": return new ImportModule(t); + case "PAYLOADTYPEDECL": return new DataTypeDecl(t); + case "MESSAGESIGNATUREDECL": return new MessageSigNameDecl(t); + case "TYPENAME": return new DataTypeNode(t); + case "SIGNAME": return new MessageSigNameNode(t); + case "GLOBALPROTOCOLDECL": return new GProtocolDecl(t); + case "GLOBALPROTOCOLDECLMODS": return new ProtocolModList(t); + case "aux": return new AuxMod(t); + case "explicit": return new ExplicitMod(t); - case "GLOBALPROTOCOLDECL": //return this.f.GProtocolDecl(empty, Collections.emptyList(), null, null); - return new GProtocolDecl(t); - case "GLOBALPROTOCOLDECLMODS": - return new ProtocolModList(t); - case "aux": - return new AuxMod(t); - case "explicit": - return new ExplicitMod(t); - - case "GLOBALPROTOCOLHEADER": //return this.f.GProtocolHeader(empty, null, null, null); - return new GProtocolHeader(t); - case "GPROTOCOLNAME": - return new GProtocolNameNode(t); - case "ROLEDECLLIST": //return this.f.RoleDeclList(empty, Collections.emptyList()); - return new RoleDeclList(t); - case "ROLEDECL": //return this.f.RoleDecl(empty, null); - return new RoleDecl(t); - case "ROLENAME": - return new RoleNode(t); - case "PARAMETERDECLLIST": //return this.f.NonRoleParamDeclList(empty, Collections.emptyList()); - return new NonRoleParamDeclList(t); - case "TYPEPARAMDECL": - return new TypeParamDecl(t); - case "TYPEPARAMNAME": - return new TypeParamNode(t); - case "SIGPARAMDECL": - return new SigParamDecl(t); - case "SIGPARAMNAME": - return new SigParamNode(t); - case "GLOBALPROTOCOLDEF": //return this.f.GProtocolDef(empty, null); - return new GProtocolDef(t); - case "GLOBALPROTOCOLBLOCK": //return this.f.GProtocolBlock(empty, null); - return new GProtocolBlock(t); - case "GLOBALINTERACTIONSEQUENCE": //return this.f.GInteractionSeq(empty, Collections.emptyList()); - return new GInteractionSeq(t); + case "GLOBALPROTOCOLHEADER": return new GProtocolHeader(t); + case "GPROTOCOLNAME": return new GProtocolNameNode(t); + case "ROLEDECLLIST": return new RoleDeclList(t); + case "ROLEDECL": return new RoleDecl(t); + case "ROLENAME": return new RoleNode(t); + case "PARAMETERDECLLIST": return new NonRoleParamDeclList(t); + case "TYPEPARAMDECL": return new TypeParamDecl(t); + case "TYPEPARAMNAME": return new TypeParamNode(t); + case "SIGPARAMDECL": return new SigParamDecl(t); + case "SIGPARAMNAME": return new SigParamNode(t); + case "GLOBALPROTOCOLDEF": return new GProtocolDef(t); + case "GLOBALPROTOCOLBLOCK": return new GProtocolBlock(t); + case "GLOBALINTERACTIONSEQUENCE": return new GInteractionSeq(t); - case "GLOBALMESSAGETRANSFER": //return this.f.GMessageTransfer(empty, null, null, Collections.emptyList()); - return new GMessageTransfer(t); - case "GLOBALCHOICE": - return new GChoice(t); - case "GLOBALRECURSION": - return new GRecursion(t); - case "GLOBALCONTINUE": - return new GContinue(t); - case "GLOBALDO": - return new GDo(t); - case "RECURSIONVAR": - return new RecVarNode(t); + case "GLOBALMESSAGETRANSFER": return new GMessageTransfer(t); + case "GLOBALCHOICE": return new GChoice(t); + case "GLOBALRECURSION": return new GRecursion(t); + case "GLOBALCONTINUE": return new GContinue(t); + case "GLOBALDO": return new GDo(t); + case "RECURSIONVAR": return new RecVarNode(t); - case "MESSAGESIGNATURE": //return this.f.Me - return new MessageSigNode(t); - case "OPNAME": - return new OpNode(t); - case "PAYLOAD": - return new PayloadElemList(t); - // N.N. UnaryPayloadElem parsed "manually" in Scribble.g + case "MESSAGESIGNATURE": return new MessageSigNode(t); + case "OPNAME": return new OpNode(t); + case "PAYLOAD": return new PayloadElemList(t); // N.B. UnaryPayloadElem parsed "manually" in Scribble.g - case "ROLEINSTANTIATIONLIST": - return new RoleArgList(t); - case "ROLEINSTANTIATION": - return new RoleArg(t); - case "ARGUMENTINSTANTIATIONLIST": - return new NonRoleArgList(t); - case "NONROLEARG": // Only for messagesignature -- qualifiedname (datatypenode or ambignamenode) done "manually" in scribble.g (cf. UnaryPayloadElem) - return new NonRoleArg(t); - - //return new MyCommonTree(t); // FIXME: placeholder for deleg, qualified or ambig - //case "QUALIFIEDNAME": //return this.f.Q - /*case tmp - case Test - case Proto1 - case A - case B - case 1 - case A - case B*/ + case "ROLEINSTANTIATIONLIST": return new RoleArgList(t); + case "ROLEINSTANTIATION": return new RoleArg(t); + case "ARGUMENTINSTANTIATIONLIST": return new NonRoleArgList(t); + case "NONROLEARG": return new NonRoleArg(t); // Only for messagesignature -- qualifiedname (datatypenode or ambignamenode) done "manually" in scribble.g (cf. UnaryPayloadElem) + case "AMBIGUOUSNAME": return new AmbigNameNode(t); - //case "": // CHECKME ? nil? "If you want a flat tree (a list)" - /*MyCommonTree x = new MyCommonTree(t); - System.out.println("222: " + t + " ,, " + x); - return x;*/ - //return nil(); // CHECKME - case "AMBIGUOUSNAME": - return new AmbigNameNode(t); default: - - //System.out.println("aaa1: " + lab); // FIXME: QUALIFIEDNAME (e.g., good.misc.globals.gdo.Do06b) // CHECKME: UNARYPAYLOADELEM? - - //FIXME: add explicit check for unhandled parser categories (e.g., use __ prefixes) -- cf. actual IDs - - - //throw new RuntimeException("Shouldn't get here: " + lab + " ,, " + lab.length()); - //return new MyCommonTree(t); - return new IdNode(t); // FIXME: currently all name "leaf" nodes are there, so not ambig, more like ID - //return empty; + { + //CHECKME: QUALIFIEDNAME (e.g., good.misc.globals.gdo.Do06b) + //CHECKME: UNARYPAYLOADELEM? + if (TOKEN_NAMES.contains(tname)) + { + throw new RuntimeException("[TODO] Unhandled token type: " + tname); + } + return new IdNode(t); + } } } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 3de1c67e7..30cb352ad 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -38,15 +38,35 @@ module tmp.Test; //- projection dependencies (projections as modules?) //- check projected role/choice/do pruning/fixing? //- drop unused recs -- partly done by inlining, but not done yet for subprotos +//- connections //- refactor ast to parser, refactor lang to type? -- separate protocol classes? //- remove unused visitors and del code -- move new visitors there? -//- shorten class names +//- shorten class names, rename parser constants, fix scribtreeadaptor and deldecorator //- refactor model building //- refactor do param/arg ast classes //- refactor parsing and CL //- check demos + +explicit global protocol Foo(role A, role B, role C) +{ + 0() connect A to B; + /*choice at A + { + 1() from A to B; + do Foo(A, B, C); + } + or + { + 2() from A to B; + foo() connect A to C; + 3() from A to C; + }*/ +} + + + /*// Add unit test -- testing: inlining of shadowed recvars global protocol Foo(role A, role B) { From df0a7f644bf0d58b6f5c34207a4ec9f5f26a8a35 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 29 Mar 2019 18:54:05 +0000 Subject: [PATCH 142/539] Continued: fixed QUALIFIEDNAME cases in parsing. --- .../scribble/main/ScribbleAntlrWrapper.java | 4 +- .../java/org/scribble/ast/ScribNodeBase.java | 3 +- .../org/scribble/ast/name/simple/OpNode.java | 4 +- .../parser/scribble/ScribTreeAdaptor.java | 7 +- .../scribble/ast/name/AntlrSimpleName.java | 2 +- .../parser/scribble/del}/DelDecorator.java | 20 ++- .../scribble/del}/DelDecoratorImpl.java | 131 ++++++++++++------ scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 8 files changed, 119 insertions(+), 54 deletions(-) rename {scribble-core/src/main/java/org/scribble/ast => scribble-parser/src/main/java/org/scribble/parser/scribble/del}/DelDecorator.java (89%) rename {scribble-core/src/main/java/org/scribble/ast => scribble-parser/src/main/java/org/scribble/parser/scribble/del}/DelDecoratorImpl.java (90%) diff --git a/scribble-cli/src/main/java/org/scribble/main/ScribbleAntlrWrapper.java b/scribble-cli/src/main/java/org/scribble/main/ScribbleAntlrWrapper.java index ca775d71a..493775569 100644 --- a/scribble-cli/src/main/java/org/scribble/main/ScribbleAntlrWrapper.java +++ b/scribble-cli/src/main/java/org/scribble/main/ScribbleAntlrWrapper.java @@ -21,13 +21,13 @@ import org.antlr.runtime.Lexer; import org.antlr.runtime.RecognitionException; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.DelDecorator; -import org.scribble.ast.DelDecoratorImpl; import org.scribble.ast.Module; import org.scribble.main.resource.Resource; import org.scribble.parser.antlr.ScribbleLexer; import org.scribble.parser.antlr.ScribbleParser; import org.scribble.parser.scribble.ScribTreeAdaptor; +import org.scribble.parser.scribble.del.DelDecorator; +import org.scribble.parser.scribble.del.DelDecoratorImpl; // Resource -> ANTLR CommonTree -- parses Resources into ANTLR CommonTrees // Wraps the ScribbleLexer and ScribbleParser generated by ANTLR from Scribble.g diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java index c673a59b3..6feae034a 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -144,7 +144,8 @@ public final ScribNodeBase del(ScribDel del) } // Non-defensive - protected final void setDel(ScribDel del) + //protected // FIXME: make protected again after refactoring ast to parser + public final void setDel(ScribDel del) { this.del = del; } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java index 976f33172..45e43533a 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java @@ -21,7 +21,7 @@ public class OpNode extends SimpleNameNode { - public static final String EMPTY_OP_IDENTIFIER = "EMPTY_OPERATOR"; + public static final String EMPTY_OP_ID = "EMPTY_OPERATOR"; // ScribTreeAdaptor#create constructor public OpNode(Token t) @@ -45,7 +45,7 @@ public OpNode dupNode() public Op toName() { String id = getText(); - if (id.equals(EMPTY_OP_IDENTIFIER)) + if (id.equals(EMPTY_OP_ID)) { return Op.EMPTY_OP; } diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index a9c3a7212..d36b24680 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -135,7 +135,12 @@ public Object create(Token t) //CHECKME: UNARYPAYLOADELEM? if (TOKEN_NAMES.contains(tname)) { - throw new RuntimeException("[TODO] Unhandled token type: " + tname); + if (!(tname.equals(OpNode.EMPTY_OP_ID) // TODO: refactor empty op hack + || tname.equals("QUALIFIEDNAME"))) + // Temporary QUALIFIEDNAME created, then internally parsed by ScribbleParser.parsePayloadElem/parseNonRoleArg + { + throw new RuntimeException("[TODO] Unhandled token type: " + tname); + } } return new IdNode(t); } diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java index 722706f06..b5d2f6042 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java @@ -76,7 +76,7 @@ public static OpNode toOpNode(CommonTree ct, AstFactory af) { String op = getName(ct); return op.equals(ScribbleAntlrConstants.ANTLR_EMPTY_OPERATOR) - ? (OpNode) af.SimpleNameNode(ct, OpKind.KIND, OpNode.EMPTY_OP_IDENTIFIER) + ? (OpNode) af.SimpleNameNode(ct, OpKind.KIND, OpNode.EMPTY_OP_ID) : (OpNode) af.SimpleNameNode(ct, OpKind.KIND, getName(ct)); } diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java similarity index 89% rename from scribble-core/src/main/java/org/scribble/ast/DelDecorator.java rename to scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java index c33c95ca2..647f08d12 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecorator.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java @@ -11,9 +11,27 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.ast; +package org.scribble.parser.scribble.del; import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.ImportModule; +import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.MessageSigNode; +import org.scribble.ast.Module; +import org.scribble.ast.ModuleDecl; +import org.scribble.ast.NonRoleArg; +import org.scribble.ast.NonRoleArgList; +import org.scribble.ast.NonRoleParamDeclList; +import org.scribble.ast.PayloadElemList; +import org.scribble.ast.ProtocolModList; +import org.scribble.ast.RoleArg; +import org.scribble.ast.RoleArgList; +import org.scribble.ast.RoleDecl; +import org.scribble.ast.RoleDeclList; +import org.scribble.ast.SigParamDecl; +import org.scribble.ast.TypeParamDecl; +import org.scribble.ast.UnaryPayloadElem; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GContinue; import org.scribble.ast.global.GDo; diff --git a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java similarity index 90% rename from scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java rename to scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java index f84d013ea..81804e77c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DelDecoratorImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java @@ -11,11 +11,30 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.ast; +package org.scribble.parser.scribble.del; import java.util.List; import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.ImportModule; +import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.MessageSigNode; +import org.scribble.ast.Module; +import org.scribble.ast.ModuleDecl; +import org.scribble.ast.NonRoleArg; +import org.scribble.ast.NonRoleArgList; +import org.scribble.ast.NonRoleParamDeclList; +import org.scribble.ast.PayloadElemList; +import org.scribble.ast.ProtocolModList; +import org.scribble.ast.RoleArg; +import org.scribble.ast.RoleArgList; +import org.scribble.ast.RoleDecl; +import org.scribble.ast.RoleDeclList; +import org.scribble.ast.ScribNodeBase; +import org.scribble.ast.SigParamDecl; +import org.scribble.ast.TypeParamDecl; +import org.scribble.ast.UnaryPayloadElem; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GContinue; import org.scribble.ast.global.GDo; @@ -62,6 +81,7 @@ import org.scribble.del.name.simple.NonRoleParamNodeDel; import org.scribble.del.name.simple.RecVarNodeDel; import org.scribble.del.name.simple.RoleNodeDel; +import org.scribble.parser.scribble.ScribTreeAdaptor; //FIXME TODO: refactor decoration methods into AST interface, to ensure they are implemented and called @@ -77,143 +97,164 @@ public DelDecoratorImpl() // Visitor enter/leave framework uses dels -- DelDecorator is a proto visitor (akin to parsing) public void decorate(CommonTree n) { - String type = n.getToken().getText(); // CHECKME: do by Antlr Token, or at this point by Scib AST type? - switch (type) + decorateNode(n); + decorateChildren(n); + } + + private void decorateNode(CommonTree n) + { + String tname = n.getToken().getText(); // CHECKME: cases on Token (as currently), or refactor by Scrib AST class? + + //...HERE: use reflection to dispatch by AST class name + + switch (tname) { case "MODULE": Module((Module) n); - break; + return; case "MODULEDECL": ModuleDecl((ModuleDecl) n); - break; + return; case "IMPORTMODULE": ImportModule((ImportModule) n); - break; + return; case "MESSAGESIGNATUREDECL": //return AntlrMessageSigDecl.parseMessageSigDecl(this, ct, af); MessageSigNameDecl((MessageSigNameDecl) n); - break; + return; case "PAYLOADTYPEDECL": //return AntlrDataTypeDecl.parseDataTypeDecl(this, ct, af);*/ DataTypeDecl((DataTypeDecl) n); - break; + return; case "GLOBALPROTOCOLDECL": GProtocolDecl((GProtocolDecl) n); - break; + return; case "GLOBALPROTOCOLDECLMODS": ProtocolModList((ProtocolModList) n); - break; + return; case "GLOBALPROTOCOLHEADER": GProtocolHeader((GProtocolHeader) n); - break; + return; case "GPROTOCOLNAME": GProtocolNameNode((GProtocolNameNode) n); - break; + return; case "ROLEDECLLIST": RoleDeclList((RoleDeclList) n); - break; + return; case "ROLEDECL": RoleDecl((RoleDecl) n); - break; + return; case "PARAMETERDECLLIST": //case EMPTY_PARAMETERDECLLST: NonRoleParamDeclList((NonRoleParamDeclList) n); - break; + return; case "TYPEPARAMDECL": TypeParamDecl((TypeParamDecl) n); - break; + return; case "SIGPARAMDECL": SigParamDecl((SigParamDecl) n); - break; + return; case "GLOBALPROTOCOLDEF": GProtocolDef((GProtocolDef) n); - break; + return; case "GLOBALPROTOCOLBLOCK": GProtocolBlock((GProtocolBlock) n); - break; + return; case "GLOBALINTERACTIONSEQUENCE": GInteractionSeq((GInteractionSeq) n); - break; + return; case "MESSAGESIGNATURE": MessageSigNode((MessageSigNode) n); - break; + return; case "PAYLOAD": PayloadElemList((PayloadElemList) n); - break; + return; case "UNARYPAYLOADELEM": UnaryPayloadElem((UnaryPayloadElem) n); - break; + return; case "ROLEINSTANTIATIONLIST": RoleArgList((RoleArgList) n); - break; + return; case "ROLEINSTANTIATION": RoleArg((RoleArg) n); - break; + return; case "ARGUMENTINSTANTIATIONLIST": NonRoleArgList((NonRoleArgList) n); - break; + return; case "NONROLEARG": NonRoleArg((NonRoleArg) n); - break; + return; case "GLOBALMESSAGETRANSFER": GMessageTransfer((GMessageTransfer) n); - break; + return; /*case GLOBALCONNECT: return AntlrGConnect.parseGConnect(this, ct, af); case GLOBALDISCONNECT: return AntlrGDisconnect.parseGDisconnect(this, ct, af); case GLOBALWRAP: return AntlrGWrap.parseGWrap(this, ct, af);*/ case "GLOBALCHOICE": GChoice((GChoice) n); - break; + return; case "GLOBALRECURSION": GRecursion((GRecursion) n); - break; + return; case "GLOBALCONTINUE": GContinue((GContinue) n); - break; + return; case "GLOBALDO": GDo((GDo) n); - break; + return; case "ROLENAME": RoleNode((RoleNode) n); - break; + return; case "TYPENAME": DataTypeNode((DataTypeNode) n); - break; + return; case "SIGNAME": MessageSigNameNode((MessageSigNameNode) n); - break; + return; case "RECURSIONVAR": RecVarNode((RecVarNode) n); - break; + return; case "OPNAME": OpNode((OpNode) n); - break; + return; case "SIGPARAMNAME": SigParamNode((SigParamNode) n); - break; + return; case "TYPEPARAMNAME": TypeParamNode((TypeParamNode) n); - break; + return; case "MODULENAME": ModuleNameNode((ModuleNameNode) n); - break; + return; case "AMBIGUOUSNAME": AmbigNameNode((AmbigNameNode) n); - break; - - default: // Leaf "ID" nodes - //throw new RuntimeException("Unknown ANTLR node type: " + type); - break; + return; + + default: + { + // Similar to ScribTreeAdaptor::create (but no need to allow QUALIFIEDNAME any more) + if (ScribTreeAdaptor.TOKEN_NAMES.contains(tname)) + { + if (!tname.equals(OpNode.EMPTY_OP_ID)) // TODO: refactor empty op hack + { + throw new RuntimeException("[TODO] Unhandled token type: " + tname); + } + } + // Leaf "ID" nodes + } } + } + private void decorateChildren(CommonTree n) + { ((List) n.getChildren()).stream().map(x -> (CommonTree) x) .forEach(x -> decorate(x)); } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 30cb352ad..66ff02e8d 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -41,7 +41,7 @@ module tmp.Test; //- connections //- refactor ast to parser, refactor lang to type? -- separate protocol classes? //- remove unused visitors and del code -- move new visitors there? -//- shorten class names, rename parser constants, fix scribtreeadaptor and deldecorator +//- shorten class names (e.g., Protocol->Proto), rename parser constants, revise ScribTreeAdaptor and DelDecorator //- refactor model building //- refactor do param/arg ast classes //- refactor parsing and CL From dc05ced271ec31689c3e645784f3521930110ef0 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 30 Mar 2019 11:36:17 +0000 Subject: [PATCH 143/539] Continued: refactoring del decoration using reflection. --- .../main/java/org/scribble/ast/ScribNode.java | 4 + .../parser/scribble/ScribTreeAdaptor.java | 2 +- .../parser/scribble/del/DelDecorator.java | 4 +- .../parser/scribble/del/DelDecoratorImpl.java | 179 +++--------------- scribble-test/src/test/scrib/tmp/Test.scr | 11 +- 5 files changed, 40 insertions(+), 160 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNode.java b/scribble-core/src/main/java/org/scribble/ast/ScribNode.java index e82e9208d..30046b0ed 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/ScribNode.java @@ -13,6 +13,8 @@ */ package org.scribble.ast; +import java.util.List; + import org.antlr.runtime.tree.CommonTree; import org.antlr.runtime.tree.Tree; import org.scribble.del.ScribDel; @@ -27,6 +29,8 @@ */ public interface ScribNode extends Tree { + List getChildren(); + //void setChildren(List children); // protected // Returns a deep clone but with fresh dels (i.e. dels not copied) -- use the af to build with fresh dels -- XXX diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index d36b24680..77194d3a3 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -66,7 +66,7 @@ public Object create(Token t) { String tname = t.getText(); - /* // Could try to use a naming convention between Token and AST class names for reflection + /* // CHECKME: use a naming convention between Token and AST class names for reflection? try { Constructor cons = c.get Constructor(Job.class); diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java index 647f08d12..082e88ce7 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java @@ -13,7 +13,6 @@ */ package org.scribble.parser.scribble.del; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.DataTypeDecl; import org.scribble.ast.ImportModule; import org.scribble.ast.MessageSigNameDecl; @@ -29,6 +28,7 @@ import org.scribble.ast.RoleArgList; import org.scribble.ast.RoleDecl; import org.scribble.ast.RoleDeclList; +import org.scribble.ast.ScribNode; import org.scribble.ast.SigParamDecl; import org.scribble.ast.TypeParamDecl; import org.scribble.ast.UnaryPayloadElem; @@ -58,7 +58,7 @@ // In ast package to access protected non-defensive del setter public interface DelDecorator { - void decorate(CommonTree n); + void decorate(ScribNode n); // TODO: make void return types to be more clear about non-defensiveness void Module(Module m); diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java index 81804e77c..e68f2c480 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java @@ -13,9 +13,9 @@ */ package org.scribble.parser.scribble.del; -import java.util.List; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.DataTypeDecl; import org.scribble.ast.ImportModule; import org.scribble.ast.MessageSigNameDecl; @@ -31,6 +31,7 @@ import org.scribble.ast.RoleArgList; import org.scribble.ast.RoleDecl; import org.scribble.ast.RoleDeclList; +import org.scribble.ast.ScribNode; import org.scribble.ast.ScribNodeBase; import org.scribble.ast.SigParamDecl; import org.scribble.ast.TypeParamDecl; @@ -81,11 +82,10 @@ import org.scribble.del.name.simple.NonRoleParamNodeDel; import org.scribble.del.name.simple.RecVarNodeDel; import org.scribble.del.name.simple.RoleNodeDel; -import org.scribble.parser.scribble.ScribTreeAdaptor; //FIXME TODO: refactor decoration methods into AST interface, to ensure they are implemented and called -// In ast package to access protected non-defensive del setter +//CHECKME: to what extent are del's still needed? public class DelDecoratorImpl implements DelDecorator { public DelDecoratorImpl() @@ -93,170 +93,39 @@ public DelDecoratorImpl() } - // TODO: refactor, cf. AntlrToScribParserUtil - // Visitor enter/leave framework uses dels -- DelDecorator is a proto visitor (akin to parsing) - public void decorate(CommonTree n) + // Visitor enter/leave framework uses dels -- DelDecorator is a "protovisitor" (akin to parsing) + public void decorate(ScribNode n) { decorateNode(n); decorateChildren(n); } - private void decorateNode(CommonTree n) + private void decorateNode(ScribNode n) { - String tname = n.getToken().getText(); // CHECKME: cases on Token (as currently), or refactor by Scrib AST class? - - //...HERE: use reflection to dispatch by AST class name - - switch (tname) + Class ddec = DelDecorator.class; + try { - case "MODULE": - Module((Module) n); - return; - case "MODULEDECL": - ModuleDecl((ModuleDecl) n); - return; - - case "IMPORTMODULE": - ImportModule((ImportModule) n); - return; - - case "MESSAGESIGNATUREDECL": //return AntlrMessageSigDecl.parseMessageSigDecl(this, ct, af); - MessageSigNameDecl((MessageSigNameDecl) n); - return; - case "PAYLOADTYPEDECL": //return AntlrDataTypeDecl.parseDataTypeDecl(this, ct, af);*/ - DataTypeDecl((DataTypeDecl) n); - return; - - case "GLOBALPROTOCOLDECL": - GProtocolDecl((GProtocolDecl) n); - return; - case "GLOBALPROTOCOLDECLMODS": - ProtocolModList((ProtocolModList) n); - return; - - case "GLOBALPROTOCOLHEADER": - GProtocolHeader((GProtocolHeader) n); - return; - case "GPROTOCOLNAME": - GProtocolNameNode((GProtocolNameNode) n); - return; - case "ROLEDECLLIST": - RoleDeclList((RoleDeclList) n); - return; - case "ROLEDECL": - RoleDecl((RoleDecl) n); - return; - case "PARAMETERDECLLIST": - //case EMPTY_PARAMETERDECLLST: - NonRoleParamDeclList((NonRoleParamDeclList) n); - return; - case "TYPEPARAMDECL": - TypeParamDecl((TypeParamDecl) n); - return; - case "SIGPARAMDECL": - SigParamDecl((SigParamDecl) n); - return; - - case "GLOBALPROTOCOLDEF": - GProtocolDef((GProtocolDef) n); - return; - case "GLOBALPROTOCOLBLOCK": - GProtocolBlock((GProtocolBlock) n); - return; - case "GLOBALINTERACTIONSEQUENCE": - GInteractionSeq((GInteractionSeq) n); - return; - - case "MESSAGESIGNATURE": - MessageSigNode((MessageSigNode) n); - return; - case "PAYLOAD": - PayloadElemList((PayloadElemList) n); - return; - case "UNARYPAYLOADELEM": - UnaryPayloadElem((UnaryPayloadElem) n); - return; - - case "ROLEINSTANTIATIONLIST": - RoleArgList((RoleArgList) n); - return; - case "ROLEINSTANTIATION": - RoleArg((RoleArg) n); - return; - case "ARGUMENTINSTANTIATIONLIST": - NonRoleArgList((NonRoleArgList) n); - return; - case "NONROLEARG": - NonRoleArg((NonRoleArg) n); - return; - - case "GLOBALMESSAGETRANSFER": - GMessageTransfer((GMessageTransfer) n); - return; - /*case GLOBALCONNECT: return AntlrGConnect.parseGConnect(this, ct, af); - case GLOBALDISCONNECT: return AntlrGDisconnect.parseGDisconnect(this, ct, af); - case GLOBALWRAP: return AntlrGWrap.parseGWrap(this, ct, af);*/ - case "GLOBALCHOICE": - GChoice((GChoice) n); - return; - case "GLOBALRECURSION": - GRecursion((GRecursion) n); - return; - case "GLOBALCONTINUE": - GContinue((GContinue) n); - return; - case "GLOBALDO": - GDo((GDo) n); - return; - - case "ROLENAME": - RoleNode((RoleNode) n); - return; - case "TYPENAME": - DataTypeNode((DataTypeNode) n); - return; - case "SIGNAME": - MessageSigNameNode((MessageSigNameNode) n); - return; - case "RECURSIONVAR": - RecVarNode((RecVarNode) n); - return; - case "OPNAME": - OpNode((OpNode) n); - return; - case "SIGPARAMNAME": - SigParamNode((SigParamNode) n); - return; - case "TYPEPARAMNAME": - TypeParamNode((TypeParamNode) n); - return; - case "MODULENAME": - ModuleNameNode((ModuleNameNode) n); - return; - - case "AMBIGUOUSNAME": - AmbigNameNode((AmbigNameNode) n); - return; - - default: + String cname = n.getClass().getName(); + if (!(cname.equals("org.scribble.ast.name.simple.IdNode") + || cname.equals("org.scribble.ast.AuxMod"))) // FIXME: add del methods for these { - // Similar to ScribTreeAdaptor::create (but no need to allow QUALIFIEDNAME any more) - if (ScribTreeAdaptor.TOKEN_NAMES.contains(tname)) - { - if (!tname.equals(OpNode.EMPTY_OP_ID)) // TODO: refactor empty op hack - { - throw new RuntimeException("[TODO] Unhandled token type: " + tname); - } - } - // Leaf "ID" nodes + String mname = cname.substring(cname.lastIndexOf('.')+1, cname.length()); + Class param = Class.forName(cname); + Method m = ddec.getMethod(mname, param); + m.invoke(this, n); } } + catch (NoSuchMethodException | SecurityException | ClassNotFoundException + | IllegalAccessException | IllegalArgumentException + | InvocationTargetException e) + { + throw new RuntimeException(e); + } } - private void decorateChildren(CommonTree n) + private void decorateChildren(ScribNode n) { - ((List) n.getChildren()).stream().map(x -> (CommonTree) x) - .forEach(x -> decorate(x)); + n.getChildren().stream().map(x -> (ScribNode) x).forEach(x -> decorate(x)); } /*@Override diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 66ff02e8d..06f3b1ca2 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -48,11 +48,17 @@ module tmp.Test; //- check demos +global protocol Foo(role A, role B) +{ + 1() from A to B; +} + +/* explicit global protocol Foo(role A, role B, role C) { 0() connect A to B; - /*choice at A + choice at A { 1() from A to B; do Foo(A, B, C); @@ -62,8 +68,9 @@ explicit global protocol Foo(role A, role B, role C) 2() from A to B; foo() connect A to C; 3() from A to C; - }*/ + } } +//*/ From 74496885371270caf18d724c4af3e8169108aa50 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 30 Mar 2019 11:36:40 +0000 Subject: [PATCH 144/539] Minor. --- .../java/org/scribble/parser/scribble/del/DelDecoratorImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java index e68f2c480..c52e030ea 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java @@ -125,7 +125,7 @@ private void decorateNode(ScribNode n) private void decorateChildren(ScribNode n) { - n.getChildren().stream().map(x -> (ScribNode) x).forEach(x -> decorate(x)); + n.getChildren().stream().forEach(x -> decorate(x)); } /*@Override From 7cde75193628f5d46516e9017be0f14d3386873a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 30 Mar 2019 12:45:59 +0000 Subject: [PATCH 145/539] Continued: added missing methods to del decorator. --- .../org/scribble/parser/antlr/Scribble.g | 4 +- .../parser/scribble/del/DelDecorator.java | 102 +++++++++++------- .../parser/scribble/del/DelDecoratorImpl.java | 67 +++++++----- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 4 files changed, 108 insertions(+), 67 deletions(-) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 5a97eeda3..8c771fb7a 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -94,7 +94,9 @@ tokens //NAME = 'name'; AMBIGUOUSNAME = 'AMBIGUOUSNAME'; - QUALIFIEDNAME = 'QUALIFIEDNAME'; + QUALIFIEDNAME = 'QUALIFIEDNAME'; + // N.B. an intermediate node type, not an actual ScribNode -- "re-parsed" internally by parsePayloadElem/NonRoleArg + // No relation to abstract AST class, QualifiedName MODULENAME = 'MODULENAME'; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java index 082e88ce7..26cf7d769 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java @@ -13,7 +13,9 @@ */ package org.scribble.parser.scribble.del; +import org.scribble.ast.AuxMod; import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.ExplicitMod; import org.scribble.ast.ImportModule; import org.scribble.ast.MessageSigNameDecl; import org.scribble.ast.MessageSigNode; @@ -48,6 +50,7 @@ import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; @@ -55,74 +58,93 @@ import org.scribble.ast.name.simple.TypeParamNode; -// In ast package to access protected non-defensive del setter +// A dec method for each AST class +// Wach method named after the class name -- currently dispatched by reflection public interface DelDecorator { void decorate(ScribNode n); - // TODO: make void return types to be more clear about non-defensiveness void Module(Module m); - void ModuleDecl(ModuleDecl md); - void ImportModule(ImportModule im); + void ModuleDecl(ModuleDecl n); + void ImportModule(ImportModule n); - void MessageSigNameDecl(MessageSigNameDecl sd); - void DataTypeDecl(DataTypeDecl td); + void MessageSigNameDecl(MessageSigNameDecl n); + void DataTypeDecl(DataTypeDecl n); - void GProtocolDecl(GProtocolDecl gpd); - void ProtocolModList(ProtocolModList mods); + void GProtocolDecl(GProtocolDecl n); + void ProtocolModList(ProtocolModList n); + void AuxMod(AuxMod n); + void ExplicitMod(ExplicitMod n); - void GProtocolHeader(GProtocolHeader gph); - void RoleDeclList(RoleDeclList rds); - void RoleDecl(RoleDecl rd); - void NonRoleParamDeclList(NonRoleParamDeclList pds); + void GProtocolHeader(GProtocolHeader n); + void RoleDeclList(RoleDeclList n); + void RoleDecl(RoleDecl n); + void NonRoleParamDeclList(NonRoleParamDeclList n); // NonRoleParamDecl NonRoleParamDecl(CommonTree source, K kind, NonRoleParamNode name); - void TypeParamDecl(TypeParamDecl td); - void SigParamDecl(SigParamDecl sd); + void TypeParamDecl(TypeParamDecl n); + void SigParamDecl(SigParamDecl n); - void GProtocolDef(GProtocolDef gpd); - void GProtocolBlock(GProtocolBlock gpb); - void GInteractionSeq(GInteractionSeq gis); + void GProtocolDef(GProtocolDef n); + void GProtocolBlock(GProtocolBlock n); + void GInteractionSeq(GInteractionSeq n); - void GMessageTransfer(GMessageTransfer gmt); + void GMessageTransfer(GMessageTransfer n); /*GConnect GConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest); GDisconnect GDisconnect(CommonTree source, RoleNode src, RoleNode dest); GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest);*/ - void GChoice(GChoice gc); - void GRecursion(GRecursion gr); - void GContinue(GContinue gc); - void GDo(GDo gd); + void GChoice(GChoice n); + void GRecursion(GRecursion n); + void GContinue(GContinue n); + void GDo(GDo n); void MessageSigNode(MessageSigNode n); - void PayloadElemList(PayloadElemList pay); - void UnaryPayloadElem(UnaryPayloadElem e); - + void PayloadElemList(PayloadElemList n); + void UnaryPayloadElem(UnaryPayloadElem n); /*GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode name, RoleNode role); LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode name);*/ - void RoleArgList(RoleArgList rs); + void RoleArgList(RoleArgList n); void RoleArg(RoleArg r); - void NonRoleArgList(NonRoleArgList as); - void NonRoleArg(NonRoleArg a); + void NonRoleArgList(NonRoleArgList n); + void NonRoleArg(NonRoleArg n); /* NameNode SimpleNameNode(CommonTree source, K kind, String identifier); QualifiedNameNode QualifiedNameNode(CommonTree source, K kind, String... elems);*/ - void RecVarNode(RecVarNode rv); - void RoleNode(RoleNode r); - void OpNode(OpNode op); - void MessageSigNameNode(MessageSigNameNode mn); - void DataTypeNode(DataTypeNode dn); - void ModuleNameNode(ModuleNameNode mn); - void GProtocolNameNode(GProtocolNameNode gpn); - void LProtocolNameNode(LProtocolNameNode lpn); - - void AmbigNameNode(AmbigNameNode an); + void RecVarNode(RecVarNode n); + void RoleNode(RoleNode n); + void OpNode(OpNode n); + void MessageSigNameNode(MessageSigNameNode n); + void DataTypeNode(DataTypeNode n); + void ModuleNameNode(ModuleNameNode n); + void GProtocolNameNode(GProtocolNameNode n); + void LProtocolNameNode(LProtocolNameNode n); + + void AmbigNameNode(AmbigNameNode n); + void IdNode(IdNode n); // NonRoleParamNode NonRoleParamNode(CommonTree source, K kind, String identifier); - void SigParamNode(SigParamNode sp); - void TypeParamNode(TypeParamNode tp); + void SigParamNode(SigParamNode n); + void TypeParamNode(TypeParamNode n); + + + + + + + + + + + + + + + + + /*DummyProjectionRoleNode DummyProjectionRoleNode(); LProtocolDecl LProtocolDecl(CommonTree source, List modifiers, LProtocolHeader header, LProtocolDef def); // Not currently used -- local protos not parsed, only projected diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java index c52e030ea..a8abccfef 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java @@ -16,7 +16,9 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import org.scribble.ast.AuxMod; import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.ExplicitMod; import org.scribble.ast.ImportModule; import org.scribble.ast.MessageSigNameDecl; import org.scribble.ast.MessageSigNode; @@ -52,6 +54,7 @@ import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; @@ -106,14 +109,10 @@ private void decorateNode(ScribNode n) try { String cname = n.getClass().getName(); - if (!(cname.equals("org.scribble.ast.name.simple.IdNode") - || cname.equals("org.scribble.ast.AuxMod"))) // FIXME: add del methods for these - { - String mname = cname.substring(cname.lastIndexOf('.')+1, cname.length()); - Class param = Class.forName(cname); - Method m = ddec.getMethod(mname, param); - m.invoke(this, n); - } + String mname = cname.substring(cname.lastIndexOf('.')+1, cname.length()); + Class param = Class.forName(cname); + Method m = ddec.getMethod(mname, param); + m.invoke(this, n); } catch (NoSuchMethodException | SecurityException | ClassNotFoundException | IllegalAccessException | IllegalArgumentException @@ -127,23 +126,6 @@ private void decorateChildren(ScribNode n) { n.getChildren().stream().forEach(x -> decorate(x)); } - - /*@Override - public GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role) - { - GDelegationElem de = new GDelegationElem(source, proto, role); - //de = del(de, createDefaultDelegate()); - de = setDel(de, new GDelegationElemDel()); // FIXME: GDelegationElemDel - return de; - } - - @Override - public LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode proto) - { - LDelegationElem de = new LDelegationElem(source, proto); - de = setDel(de, createDefaultDelegate()); - return de; - }*/ @Override public void Module(Module m) @@ -187,6 +169,18 @@ public void ProtocolModList(ProtocolModList mods) setDel(mods, createDefaultDelegate()); } + @Override + public void AuxMod(AuxMod n) + { + setDel(n, createDefaultDelegate()); + } + + @Override + public void ExplicitMod(ExplicitMod n) + { + setDel(n, createDefaultDelegate()); + } + @Override public void GProtocolHeader(GProtocolHeader gph) { @@ -323,6 +317,23 @@ public void UnaryPayloadElem(UnaryPayloadElem e) setDel(e, createDefaultDelegate()); } + /*@Override + public GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role) + { + GDelegationElem de = new GDelegationElem(source, proto, role); + //de = del(de, createDefaultDelegate()); + de = setDel(de, new GDelegationElemDel()); // FIXME: GDelegationElemDel + return de; + } + + @Override + public LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode proto) + { + LDelegationElem de = new LDelegationElem(source, proto); + de = setDel(de, createDefaultDelegate()); + return de; + }*/ + @Override public void RoleArgList(RoleArgList rs) { @@ -483,6 +494,12 @@ public void AmbigNameNode(AmbigNameNode an) setDel(an, new AmbigNameNodeDel()); } + @Override + public void IdNode(IdNode an) + { + setDel(an, createDefaultDelegate()); + } + /*@Override public NonRoleParamNode NonRoleParamNode(CommonTree source, K kind, String identifier) { diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 06f3b1ca2..1e842d10e 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -43,7 +43,7 @@ module tmp.Test; //- remove unused visitors and del code -- move new visitors there? //- shorten class names (e.g., Protocol->Proto), rename parser constants, revise ScribTreeAdaptor and DelDecorator //- refactor model building -//- refactor do param/arg ast classes +//- refactor do param/arg ast classes -- generally clean up AST class hierarchy //- refactor parsing and CL //- check demos From 5421c6d1e8e495b0ae73d559384689014c213c3f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 30 Mar 2019 12:56:28 +0000 Subject: [PATCH 146/539] Minor. --- .../parser/scribble/del/DelDecoratorImpl.java | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java index a8abccfef..22631dae1 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java @@ -87,7 +87,7 @@ import org.scribble.del.name.simple.RoleNodeDel; -//FIXME TODO: refactor decoration methods into AST interface, to ensure they are implemented and called +//CHECKME: refactor decoration methods into AST interface, to ensure they are implemented and called? //CHECKME: to what extent are del's still needed? public class DelDecoratorImpl implements DelDecorator { @@ -103,7 +103,7 @@ public void decorate(ScribNode n) decorateChildren(n); } - private void decorateNode(ScribNode n) + protected void decorateNode(ScribNode n) { Class ddec = DelDecorator.class; try @@ -122,10 +122,28 @@ private void decorateNode(ScribNode n) } } - private void decorateChildren(ScribNode n) + protected void decorateChildren(ScribNode n) { n.getChildren().stream().forEach(x -> decorate(x)); } + + protected ScribDel createDefaultDelegate() + { + return new DefaultDel(); + } + + // Non-defensive + //protected static T setDel(T n, ScribDel del) + protected static void setDel(ScribNodeBase n, ScribDel del) + { + n.setDel(del); + //return n; + /*// Defensive helper with cast check + ScribNodeBase copy = ((ScribNodeBase) n).clone(); // Need deep clone, since children have parent field + //copy.del = del; + copy.setDel(del); + return ScribUtil.castNodeByClass(n, copy);*/ + } @Override public void Module(Module m) @@ -675,22 +693,4 @@ public LDo LDo(CommonTree source, RoleArgList roleinstans, NonRoleArgList argins ld = setDel(ld, new LDoDel()); return ld; }*/ - - protected ScribDel createDefaultDelegate() - { - return new DefaultDel(); - } - - // Non-defensive - //protected static T setDel(T n, ScribDel del) - protected static void setDel(ScribNodeBase n, ScribDel del) - { - n.setDel(del); - //return n; - /*// Defensive helper with cast check - ScribNodeBase copy = ((ScribNodeBase) n).clone(); // Need deep clone, since children have parent field - //copy.del = del; - copy.setDel(del); - return ScribUtil.castNodeByClass(n, copy);*/ - } } From 5c51a308e9dc82c2e8086d8425dca711c6b73e60 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 30 Mar 2019 22:14:58 +0000 Subject: [PATCH 147/539] Continued: adding protocol/module dependency collection. --- .../src/main/java/org/scribble/job/Job.java | 15 +++++-- .../java/org/scribble/job/JobContext.java | 8 ++-- .../main/java/org/scribble/lang/Choice.java | 8 ++++ .../main/java/org/scribble/lang/Continue.java | 8 ++++ .../src/main/java/org/scribble/lang/Do.java | 8 ++++ .../org/scribble/lang/MessageTransfer.java | 35 ++++++++++++++++ .../main/java/org/scribble/lang/Protocol.java | 7 ++++ .../java/org/scribble/lang/Recursion.java | 8 ++++ .../main/java/org/scribble/lang/SType.java | 5 +++ .../src/main/java/org/scribble/lang/Seq.java | 8 ++++ .../java/org/scribble/lang/local/LSkip.java | 8 ++++ .../main/java/org/scribble/type/Payload.java | 23 ++++------- .../java/org/scribble/type/name/DataType.java | 3 +- .../scribble/type/name/GDelegationType.java | 2 +- .../org/scribble/type/name/LProtocolName.java | 3 +- .../scribble/type/name/PayloadElemType.java | 2 +- .../parser/scribble/del/DelDecoratorImpl.java | 40 +++++++++++++++++++ .../good/syntax/disamb/imports/Import01a.scr | 2 + scribble-test/src/test/scrib/tmp/Test.scr | 1 + 19 files changed, 167 insertions(+), 27 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index edaef0512..cb4de75f1 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -183,13 +183,13 @@ else if (n instanceof MessageSigName) LProtocol proj = inlined.project(self); // Projection and inling commutative? /*STypeUnfolder unf = new STypeUnfolder<>(); proj = proj.unfoldAllOnce(unf);*/ - this.jctxt.addProjected(proj.fullname, proj); + this.jctxt.addInlinedProjected(proj.fullname, proj); debugPrintln("\nProjected onto " + self + ":\n" + proj); } } for (Entry e : - this.jctxt.getProjections().entrySet()) + this.jctxt.getInlinedProjections().entrySet()) { //LProtocolName lname = e.getKey(); LProtocol proj = e.getValue(); @@ -244,7 +244,7 @@ public void runWellFormednessPasses() throws ScribbleException inlined.checkExtChoiceConsistency(); } - for (LProtocol proj : this.jctxt.getProjections().values()) + for (LProtocol proj : this.jctxt.getInlinedProjections().values()) { if (proj.isAux()) // CHECKME? e.g., bad.reach.globals.gdo.Test01b { @@ -335,7 +335,7 @@ public Map getProjections(GProtocolName fullname, Role role) throws ScribbleException { //Module root = this.jctxt.getProjection(fullname, role); - LProtocol proj = this.jctxt.getProjected(fullname, role); + LProtocol proj = this.jctxt.getInlinedProjected(fullname, role); // FIXME: dependencies, -project -- FIXME: need to create Module (with dependency imports) Map> dependencies = @@ -343,6 +343,13 @@ public Map getProjections(GProtocolName fullname, .getLProtoDeclChildren().get(0).del()).getProtocolDeclContext() .getDependencyMap().getDependencies().get(role);*/ new HashMap<>(); + + // FIXME TODO make LDo and add projection for Do, and do getDeps on that + // TODO make test framework to check proj->inline matches inline->proj + // TODO make test framework to check global-"proj"-via-taus matches actual proj -- matches mean language acceptance? + + List deps = proj.getDependencies(); + System.out.println("jjj1: " + proj + "\n" + deps); // Can ignore Set for projections (is singleton), as each projected proto is a dependency only for self (implicit in the protocoldecl) /*return dependencies.keySet().stream().collect( diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext.java b/scribble-core/src/main/java/org/scribble/job/JobContext.java index 9e1f27de2..c22aabca4 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/job/JobContext.java @@ -186,20 +186,20 @@ public Collection getInlined() return Collections.unmodifiableCollection(this.inlined.values()); } - public void addProjected(LProtocolName fullname, LProtocol l) + public void addInlinedProjected(LProtocolName fullname, LProtocol l) { this.iprojected.put(fullname, l); } + // "Projected from inlined" // FIXME TODO: refactor getProjected and getProjection properly - //public LProtocol getProjected(LProtocolName fullname) - public LProtocol getProjected(GProtocolName fullname, Role self) + public LProtocol getInlinedProjected(GProtocolName fullname, Role self) { LProtocolName p = Projector.projectFullProtocolName(fullname, self); return this.iprojected.get(p); } - public Map getProjections() + public Map getInlinedProjections() { return Collections.unmodifiableMap(this.iprojected); } diff --git a/scribble-core/src/main/java/org/scribble/lang/Choice.java b/scribble-core/src/main/java/org/scribble/lang/Choice.java index 6907c2b1f..36578e15f 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Choice.java +++ b/scribble-core/src/main/java/org/scribble/lang/Choice.java @@ -7,6 +7,7 @@ import java.util.stream.Stream; import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.ModuleName; import org.scribble.type.name.Role; public abstract class Choice> @@ -35,6 +36,13 @@ public Set getRoles() return res; } + @Override + public List getDependencies() + { + return this.blocks.stream().flatMap(x -> x.getDependencies().stream()) + .collect(Collectors.toList()); + } + //public abstract List getBlocks(); @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/Continue.java b/scribble-core/src/main/java/org/scribble/lang/Continue.java index cf00b2e09..772497b01 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Continue.java +++ b/scribble-core/src/main/java/org/scribble/lang/Continue.java @@ -1,10 +1,12 @@ package org.scribble.lang; import java.util.Collections; +import java.util.List; import java.util.Set; import org.scribble.ast.ProtocolKindNode; import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.ModuleName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -30,6 +32,12 @@ public Set getRoles() return Collections.emptySet(); } + @Override + public List getDependencies() + { + return Collections.emptyList(); + } + @Override public Continue substitute(Substitutions subs) diff --git a/scribble-core/src/main/java/org/scribble/lang/Do.java b/scribble-core/src/main/java/org/scribble/lang/Do.java index dcb5d9f32..14c2763b2 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Do.java +++ b/scribble-core/src/main/java/org/scribble/lang/Do.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.type.Arg; import org.scribble.type.kind.NonRoleParamKind; @@ -12,6 +13,7 @@ import org.scribble.type.name.DataType; import org.scribble.type.name.MemberName; import org.scribble.type.name.MessageSigName; +import org.scribble.type.name.ModuleName; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; @@ -41,6 +43,12 @@ public Set getRoles() throw new RuntimeException("Unsupported for Do: " + this); } + @Override + public List getDependencies() + { + return Stream.of(this.proto.getPrefix()).collect(Collectors.toList()); + } + @Override public Do substitute(Substitutions subs) { diff --git a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java index d54dae16b..1c120c869 100644 --- a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java @@ -1,12 +1,21 @@ package org.scribble.lang; +import java.util.LinkedList; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import org.scribble.type.Message; +import org.scribble.type.MessageSig; +import org.scribble.type.Payload; import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.DataType; +import org.scribble.type.name.GDelegationType; import org.scribble.type.name.MemberName; +import org.scribble.type.name.MessageSigName; +import org.scribble.type.name.ModuleName; +import org.scribble.type.name.PayloadElemType; import org.scribble.type.name.Role; public abstract class MessageTransfer @@ -35,6 +44,32 @@ public Set getRoles() // Inlcudes self return Stream.of(this.src, this.dst).collect(Collectors.toSet()); } + + @Override + public List getDependencies() + { + List res = new LinkedList<>(); + if (this.msg.isMessageSigName()) + { + res.add(((MessageSigName) this.msg).getPrefix()); + } + else //if (this.msg.isMessageSig) + { + Payload pay = ((MessageSig) this.msg).payload; + for (PayloadElemType p : pay.elems) + { + if (p.isDataType()) + { + res.add(((DataType) p).getPrefix()); + } + else //if (p.isGDelegationType()) + { + res.add(((GDelegationType) p).getGlobalProtocol().getPrefix()); + } + } + } + return res; + } @Override public MessageTransfer substitute(Substitutions subs) diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index 93dff8e03..c01005881 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -9,6 +9,7 @@ import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; +import org.scribble.type.name.ModuleName; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; @@ -52,6 +53,12 @@ public Set getRoles() { throw new RuntimeException("Unsupported for Protocol: " + this); } + + @Override + public List getDependencies() + { + return this.def.getDependencies(); + } @Override public ProtocolDecl getSource() diff --git a/scribble-core/src/main/java/org/scribble/lang/Recursion.java b/scribble-core/src/main/java/org/scribble/lang/Recursion.java index ca56f1963..43723e744 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/Recursion.java @@ -1,9 +1,11 @@ package org.scribble.lang; +import java.util.List; import java.util.Set; import org.scribble.ast.ProtocolKindNode; import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.ModuleName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -31,6 +33,12 @@ public Set getRoles() return this.body.getRoles(); } + @Override + public List getDependencies() + { + return this.body.getDependencies(); + } + @Override public String toString() { diff --git a/scribble-core/src/main/java/org/scribble/lang/SType.java b/scribble-core/src/main/java/org/scribble/lang/SType.java index 96c2607bc..369e56a4a 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SType.java +++ b/scribble-core/src/main/java/org/scribble/lang/SType.java @@ -1,9 +1,11 @@ package org.scribble.lang; +import java.util.List; import java.util.Set; import org.scribble.ast.ProtocolKindNode; import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.ModuleName; import org.scribble.type.name.Role; // CHECKME: move to type.sess? @@ -32,6 +34,9 @@ public interface SType // FIXME: repeat recvar names, including non-shadowing (e.g., choice cases) SType unfoldAllOnce(STypeUnfolder u); + // Returns *all* modules (SType has no notion of Module) + List getDependencies(); + // Call this using: them.canEquals(this) boolean canEquals(Object o); } diff --git a/scribble-core/src/main/java/org/scribble/lang/Seq.java b/scribble-core/src/main/java/org/scribble/lang/Seq.java index 4b07d6622..95b69a6b5 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Seq.java +++ b/scribble-core/src/main/java/org/scribble/lang/Seq.java @@ -7,6 +7,7 @@ import org.scribble.ast.InteractionSeq; import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.ModuleName; import org.scribble.type.name.Role; // Could add B extends STTypeBase, K>, but it inflates type params quite a bit (e.g., Protocol) @@ -30,6 +31,13 @@ public Set getRoles() return this.elems.stream().flatMap(x -> x.getRoles().stream()) .collect(Collectors.toSet()); } + + @Override + public List getDependencies() + { + return this.elems.stream().flatMap(x -> x.getDependencies().stream()) + .collect(Collectors.toList()); + } @Override public Seq substitute(Substitutions subs) diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java index bafc58065..f1c4d3d04 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java @@ -1,5 +1,6 @@ package org.scribble.lang.local; +import java.util.List; import java.util.Set; import org.scribble.job.ScribbleException; @@ -9,6 +10,7 @@ import org.scribble.lang.Substitutions; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; +import org.scribble.type.name.ModuleName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -26,6 +28,12 @@ public Set getRoles() { throw new RuntimeException("Unsupported for Skip: " + this); } + + @Override + public List getDependencies() + { + throw new RuntimeException("Unsupported for Skip: " + this); + } @Override public RecVar isSingleCont() diff --git a/scribble-core/src/main/java/org/scribble/type/Payload.java b/scribble-core/src/main/java/org/scribble/type/Payload.java index b77e89f8a..7db53d890 100644 --- a/scribble-core/src/main/java/org/scribble/type/Payload.java +++ b/scribble-core/src/main/java/org/scribble/type/Payload.java @@ -15,20 +15,21 @@ import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; -import org.scribble.type.kind.Kind; import org.scribble.type.kind.PayloadTypeKind; import org.scribble.type.name.PayloadElemType; public class Payload { - public static final Payload EMPTY_PAYLOAD = new Payload(Collections.emptyList()); + public static final Payload EMPTY_PAYLOAD = new Payload( + Collections.emptyList()); public final List> elems; - - public Payload(List> payload) + + public Payload(List> elems) { - this.elems = payload; + this.elems = Collections.unmodifiableList(elems); } public boolean isEmpty() @@ -61,16 +62,8 @@ public boolean equals(Object o) @Override public String toString() { - if (this.elems.isEmpty()) - { - return "()"; - } - String payload = "(" + this.elems.get(0); - for (PayloadElemType pt : this.elems.subList(1, this.elems.size())) - { - payload+= ", " + pt; - } - return payload + ")"; + return "(" + this.elems.stream().map(x -> x.toString()) + .collect(Collectors.joining(", ")) + ")"; } /*@Override diff --git a/scribble-core/src/main/java/org/scribble/type/name/DataType.java b/scribble-core/src/main/java/org/scribble/type/name/DataType.java index 0f335debe..7a953ce5f 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/DataType.java +++ b/scribble-core/src/main/java/org/scribble/type/name/DataType.java @@ -18,7 +18,8 @@ // Potentially qualified/canonical payload type name; not the AST primitive identifier // FIXME: record "external type name" from DataTypeDecl (for API gen)? cf. OutputSockGen#addSendOpParams -public class DataType extends MemberName implements PayloadElemType +public class DataType extends MemberName + implements PayloadElemType { private static final long serialVersionUID = 1L; diff --git a/scribble-core/src/main/java/org/scribble/type/name/GDelegationType.java b/scribble-core/src/main/java/org/scribble/type/name/GDelegationType.java index 64a9dfd8d..7dd654039 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/GDelegationType.java +++ b/scribble-core/src/main/java/org/scribble/type/name/GDelegationType.java @@ -18,7 +18,7 @@ import org.scribble.type.kind.Local; -// FIXME: factor out of name package? (and then PayloadType also needs to be moved out of name?) +// CHECKME: factor out of name package? (and then PayloadType also needs to be moved out of name?) public class GDelegationType implements PayloadElemType, Serializable { private static final long serialVersionUID = 1L; diff --git a/scribble-core/src/main/java/org/scribble/type/name/LProtocolName.java b/scribble-core/src/main/java/org/scribble/type/name/LProtocolName.java index 3c0540914..eb0f1459a 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/LProtocolName.java +++ b/scribble-core/src/main/java/org/scribble/type/name/LProtocolName.java @@ -16,7 +16,8 @@ import org.scribble.type.kind.Local; -public class LProtocolName extends ProtocolName implements PayloadElemType //-- not needed, deleg elems currently have to be (Global@Role) +public class LProtocolName extends ProtocolName + implements PayloadElemType // @Deprecated -- not used, deleg elems currently have to be (Global@Role) { private static final long serialVersionUID = 1L; diff --git a/scribble-core/src/main/java/org/scribble/type/name/PayloadElemType.java b/scribble-core/src/main/java/org/scribble/type/name/PayloadElemType.java index bdaa39d8d..b8cbbe874 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/PayloadElemType.java +++ b/scribble-core/src/main/java/org/scribble/type/name/PayloadElemType.java @@ -29,7 +29,7 @@ default boolean isGDelegationType() return false; } - /*public boolean isLDelegationType() + /*public boolean isLDelegationType() // Not currently used { return true; }*/ diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java index 22631dae1..07dbeb32c 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java @@ -538,6 +538,46 @@ public void TypeParamNode(TypeParamNode tp) setDel(tp, new NonRoleParamNodeDel()); } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /*@Override public DummyProjectionRoleNode DummyProjectionRoleNode() { diff --git a/scribble-test/src/test/resources/good/syntax/disamb/imports/Import01a.scr b/scribble-test/src/test/resources/good/syntax/disamb/imports/Import01a.scr index cc796ec5f..cc5b1b20e 100644 --- a/scribble-test/src/test/resources/good/syntax/disamb/imports/Import01a.scr +++ b/scribble-test/src/test/resources/good/syntax/disamb/imports/Import01a.scr @@ -1,3 +1,5 @@ +// bin/scribblec.sh scribble-test/src/test/resources/good/syntax/disamb/imports/Import01a.scr -ip scribble-test/src/test/resources -project Foo A + module good.syntax.disamb.imports.Import01a; import good.syntax.disamb.imports.pack1.Import01b as Test3; diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 1e842d10e..66fdf2bb3 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -40,6 +40,7 @@ module tmp.Test; //- drop unused recs -- partly done by inlining, but not done yet for subprotos //- connections //- refactor ast to parser, refactor lang to type? -- separate protocol classes? +//- or: ast/del to new lang -- core lang to type, except protocol //- remove unused visitors and del code -- move new visitors there? //- shorten class names (e.g., Protocol->Proto), rename parser constants, revise ScribTreeAdaptor and DelDecorator //- refactor model building From 6bc3168ae653463121243305a7035439619a67ee Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 2 Apr 2019 19:03:12 +0100 Subject: [PATCH 148/539] Continued: refactoring non-inlined projection. --- .../java/org/scribble/cli/CommandLine.java | 22 ++-- .../callbackapi/CBEndpointApiGenerator.java | 2 +- .../callbackapi/CBEndpointApiGenerator2.java | 8 +- .../callbackapi/CBEndpointApiGenerator3.java | 8 +- .../java/sessionapi/SessionApiGenerator.java | 4 +- .../java/statechanapi/ScribSockGen.java | 2 +- .../StateChannelApiGenerator.java | 4 +- .../ioifaces/IOInterfacesGenerator.java | 2 +- .../main/java/org/scribble/ast/local/LDo.java | 2 +- .../java/org/scribble/del/DoArgListDel.java | 2 +- .../src/main/java/org/scribble/del/DoDel.java | 2 +- .../main/java/org/scribble/del/ModuleDel.java | 25 +++- .../del/global/GDelegationElemDel.java | 6 +- .../java/org/scribble/del/global/GDoDel.java | 2 +- .../scribble/del/global/GProtocolDeclDel.java | 6 +- .../java/org/scribble/del/local/LDoDel.java | 2 +- .../src/main/java/org/scribble/job/Job.java | 114 +++++++++-------- .../java/org/scribble/job/JobContext.java | 69 ++++++---- .../src/main/java/org/scribble/lang/Do.java | 2 +- .../java/org/scribble/lang/Projector.java | 16 +++ .../main/java/org/scribble/lang/Protocol.java | 3 +- .../org/scribble/lang/global/GChoice.java | 21 ++- .../org/scribble/lang/global/GContinue.java | 9 +- .../java/org/scribble/lang/global/GDo.java | 49 ++++++- .../lang/global/GMessageTransfer.java | 9 +- .../org/scribble/lang/global/GProtocol.java | 22 +++- .../org/scribble/lang/global/GRecursion.java | 19 ++- .../java/org/scribble/lang/global/GSeq.java | 22 +++- .../java/org/scribble/lang/global/GType.java | 22 ++-- .../java/org/scribble/lang/local/LDo.java | 121 ++++++++++++++++++ .../org/scribble/lang/local/LProjection.java | 6 +- .../org/scribble/lang/local/LProtocol.java | 5 +- .../java/org/scribble/lang/local/LType.java | 3 + .../visit/InlinedProtocolUnfolder.java | 2 +- .../scribble/visit/ProtocolDefInliner.java | 4 +- .../scribble/visit/SubprotocolVisitor.java | 4 +- .../context/ProjectedChoiceDoPruner.java | 2 +- .../visit/wf/ExplicitCorrelationChecker.java | 5 +- scribble-test/src/test/scrib/tmp/Test.scr | 10 +- 39 files changed, 471 insertions(+), 167 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/lang/Projector.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LDo.java diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 7f4ffdab7..e64339dcd 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -287,7 +287,7 @@ protected void doNonAttemptableOutputTasks(Job job) private void printProjections(Job job) throws CommandLineException, ScribbleException { - JobContext jcontext = job.getJobContext(); + JobContext jcontext = job.getContext(); String[] args = this.args.get(CLArgFlag.PROJECT); for (int i = 0; i < args.length; i += 2) { @@ -306,7 +306,7 @@ private void printProjections(Job job) private void printEGraph(Job job, boolean forUser, boolean fair) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getJobContext(); + JobContext jcontext = job.getContext(); String[] args = forUser ? this.args.get(CLArgFlag.EFSM) : (fair @@ -327,7 +327,7 @@ private void printEGraph(Job job, boolean forUser, boolean fair) private void drawEGraph(Job job, boolean forUser, boolean fair) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getJobContext(); + JobContext jcontext = job.getContext(); String[] args = forUser ? this.args.get(CLArgFlag.EFSM_PNG) : (fair @@ -348,7 +348,7 @@ private EGraph getEGraph(Job job, GProtocolName fullname, Role role, boolean forUser, boolean fair) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getJobContext(); + JobContext jcontext = job.getContext(); GProtocolDecl gpd = (GProtocolDecl) jcontext.getMainModule() .getProtocolDeclChild(fullname.getSimpleName()); if (gpd == null || !gpd.getHeaderChild().getRoleDeclListChild().getRoles() @@ -382,7 +382,7 @@ private EGraph getEGraph(Job job, GProtocolName fullname, Role role, private void printSGraph(Job job, boolean fair) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getJobContext(); + JobContext jcontext = job.getContext(); String[] args = fair ? this.args.get(CLArgFlag.SGRAPH) : this.args.get(CLArgFlag.UNFAIR_SGRAPH); @@ -400,7 +400,7 @@ private void printSGraph(Job job, boolean fair) private void drawSGraph(Job job, boolean fair) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getJobContext(); + JobContext jcontext = job.getContext(); String[] args = fair ? this.args.get(CLArgFlag.SGRAPH_PNG) : this.args.get(CLArgFlag.UNFAIR_SGRAPH_PNG); @@ -416,7 +416,7 @@ private void drawSGraph(Job job, boolean fair) private static SGraph getSGraph(Job job, GProtocolName fullname, boolean fair) throws ScribbleException { - JobContext jcontext = job.getJobContext(); + JobContext jcontext = job.getContext(); SGraph model = fair ? jcontext.getSGraph(fullname) : jcontext.getUnfairSGraph(fullname); @@ -431,7 +431,7 @@ private static SGraph getSGraph(Job job, GProtocolName fullname, boolean fair) private void outputEndpointApi(Job job) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getJobContext(); + JobContext jcontext = job.getContext(); String[] args = this.args.get(CLArgFlag.API_GEN); JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // FIXME: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) @@ -449,7 +449,7 @@ private void outputEndpointApi(Job job) private void outputSessionApi(Job job) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getJobContext(); + JobContext jcontext = job.getContext(); String[] args = this.args.get(CLArgFlag.SESS_API_GEN); JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // TODO: refactor (generalise -- use new API) for (String fullname : args) @@ -463,7 +463,7 @@ private void outputSessionApi(Job job) private void outputStateChannelApi(Job job) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getJobContext(); + JobContext jcontext = job.getContext(); String[] args = this.args.get(CLArgFlag.SCHAN_API_GEN); JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // TODO: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) @@ -479,7 +479,7 @@ private void outputStateChannelApi(Job job) private void outputEventDrivenApi(Job job) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getJobContext(); + JobContext jcontext = job.getContext(); String[] args = this.args.get(CLArgFlag.ED_API_GEN); /*JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // FIXME: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index f81beec92..971f525be 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -66,7 +66,7 @@ public Map buildSessionApi() throws ScribbleException // FIXME: public Map buildEndpointClass() throws ScribbleException { - JobContext jc = this.job.getJobContext(); + JobContext jc = this.job.getContext(); EState init = (this.job.config.minEfsm ? jc.getMinimisedEGraph(this.proto, this.self) : jc.getEGraph(this.proto, this.self) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java index 4ca2a655d..24f5e5f9b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java @@ -92,7 +92,7 @@ public Map buildEndpointClass() throws ScribbleException { Map res = new HashMap<>(); - JobContext jc = this.job.getJobContext(); + JobContext jc = this.job.getContext(); EState init = (this.job.config.minEfsm ? jc.getMinimisedEGraph(this.proto, this.self) : jc.getEGraph(this.proto, this.self) @@ -208,7 +208,7 @@ public Map buildEndpointClass() throws ScribbleException messageAbstract.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); res.put(mprefix + messageAbstractName + ".java", messageAbstract.build()); - Module main = this.job.getJobContext().getMainModule(); + Module main = this.job.getContext().getMainModule(); Map messageClasses = new HashMap<>(); // A class per Payload for this state for (EAction a : s.getAllActions()) { @@ -447,7 +447,7 @@ String generateMessageInterface(EState s, String messageIfName, String endpoint MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) { return (MessageSigNameDecl) - this.job.getJobContext().getMainModule().getNonProtoDeclChildren().stream() // FIXME: main module? + this.job.getContext().getMainModule().getNonProtoDeclChildren().stream() // FIXME: main module? .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(mid.toString())) .iterator().next(); } @@ -490,7 +490,7 @@ String generateMessageClass(boolean isSig, String messageName, EState s, else { int i = 1; - Module main = this.job.getJobContext().getMainModule(); + Module main = this.job.getContext().getMainModule(); for (PayloadElemType pet : a.payload.elems) { DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pet); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 574b1d6a5..3af9985dc 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -82,7 +82,7 @@ public Map buildEndpointClass() throws ScribbleException { Map res = new HashMap<>(); - JobContext jc = this.job.getJobContext(); + JobContext jc = this.job.getContext(); EState init = (this.job.config.minEfsm ? jc.getMinimisedEGraph(this.proto, this.self) : jc.getEGraph(this.proto, this.self) @@ -469,7 +469,7 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, protected String generateStateClass(EState s, String rootPack, EStateKind kind, String stateName, String endpointName) { - Module main = this.job.getJobContext().getMainModule(); + Module main = this.job.getContext().getMainModule(); String stateKind; switch (kind) @@ -960,7 +960,7 @@ protected String getMessagesPackage(String rootPack) protected MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) { return (MessageSigNameDecl) - this.job.getJobContext().getMainModule().getNonProtoDeclChildren().stream() // FIXME: main module? + this.job.getContext().getMainModule().getNonProtoDeclChildren().stream() // FIXME: main module? .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(mid.toString())) .iterator().next(); } @@ -968,7 +968,7 @@ protected MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) //protected final Function, String> getExtName = e -> protected String getExtName(PayloadElemType e) { - String extName = this.job.getJobContext().getMainModule().getDataTypeDeclChild((DataType) e).extName; + String extName = this.job.getContext().getMainModule().getDataTypeDeclChild((DataType) e).extName; return (extName.indexOf(".") != -1) ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) : extName; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index a4d2f7925..78d208d53 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -181,7 +181,7 @@ private void addSingletonConstant(ClassBuilder cb, String subpack, String type) private void constructOpClasses() throws ScribbleException { - Module mod = this.job.getJobContext().getModule(this.gpn.getPrefix()); + Module mod = this.job.getContext().getModule(this.gpn.getPrefix()); GProtocolName simpname = this.gpn.getSimpleName(); GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDeclChild(simpname); MessageIdCollector coll = new MessageIdCollector(this.job, ((ModuleDel) mod.del()).getModuleContext()); @@ -197,7 +197,7 @@ private void constructOpClasses() throws ScribbleException private void constructRoleClasses() throws ScribbleException { - Module mod = this.job.getJobContext().getModule(this.gpn.getPrefix()); + Module mod = this.job.getContext().getModule(this.gpn.getPrefix()); GProtocolName simpname = this.gpn.getSimpleName(); GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDeclChild(simpname); for (Role r : gpd.getRoles()) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java index b156183da..c2f526783 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java @@ -153,7 +153,7 @@ protected void addInitialStateConstructor() mb.addBodyLine(SESSIONENDPOINT_PARAM + ".init();"); mb.addBodyLine(ClassBuilder.RETURN + " " + ClassBuilder.NEW + " " + this.root + "(" + SESSIONENDPOINT_PARAM + ");");*/ - GProtocolDecl gpd = (GProtocolDecl) this.apigen.getJob().getJobContext().getModule(this.apigen.gpn.getPrefix()).getProtocolDeclChild(this.apigen.gpn.getSimpleName()); + GProtocolDecl gpd = (GProtocolDecl) this.apigen.getJob().getContext().getModule(this.apigen.gpn.getPrefix()).getProtocolDeclChild(this.apigen.gpn.getSimpleName()); String epClass = gpd.isExplicit() ? EXPLICITENDPOINT_CLASS : MPSTENDPOINT_CLASS; ConstructorBuilder ctor2 = cb.newConstructor(epClass + "<" + sess + ", " + role + "> " + SESSIONENDPOINT_PARAM); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 53642476c..11fceb52c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -64,7 +64,7 @@ public StateChannelApiGenerator(Job job, GProtocolName fullname, Role self) this.self = self; this.lpn = Projector.projectFullProtocolName(fullname, self); //this.init = job.getContext().getEndpointGraph(fullname, self).init; - JobContext jc = job.getJobContext(); + JobContext jc = job.getContext(); this.init = job.config.minEfsm ? jc.getMinimisedEGraph(fullname, self).init : jc.getEGraph(fullname, self).init; @@ -209,7 +209,7 @@ protected EState getInitialState() protected Module getMainModule() { - return this.job.getJobContext().getMainModule(); + return this.job.getContext().getMainModule(); } protected void addTypeDecl(TypeBuilder tb) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index 5a2ea388d..9d29a01e5 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -79,7 +79,7 @@ public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) GProtocolName fullname = apigen.getGProtocolName(); Role self = getSelf(); //EndpointState init = this.job.getContext().getEndpointGraph(fullname, self).init; - JobContext jc = this.job.getJobContext(); + JobContext jc = this.job.getContext(); EState init = this.job.config.minEfsm ? jc.getMinimisedEGraph(fullname, self).init : jc.getEGraph(fullname, self).init; diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LDo.java b/scribble-core/src/main/java/org/scribble/ast/local/LDo.java index fed9e8834..d949ad674 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LDo.java @@ -64,7 +64,7 @@ public LDo dupNode() public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { ModuleContext mc = fixer.getModuleContext(); - JobContext jc = fixer.job.getJobContext(); + JobContext jc = fixer.job.getContext(); Role subj = getTargetProtocolDecl(jc, mc).getDefChild().getBlockChild() .getInteractSeqChild().getInteractionChildren().get(0) .inferLocalChoiceSubject(fixer); diff --git a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java index ebb9f6bca..e2bc0cf45 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java @@ -57,7 +57,7 @@ protected ProtocolDecl getTargetProtocolDecl(Do parent, NameDisambiguator disamb) throws ScribbleException { ModuleContext mc = disamb.getModuleContext(); - JobContext jc = disamb.job.getJobContext(); + JobContext jc = disamb.job.getContext(); Do doo = (Do) parent; ProtocolName pn = doo.getProtocolNameNode().toName(); /*if (!mc.isVisibleProtocolDeclName(simpname)) // FIXME: should be checked somewhere else? earlier (do-entry?) -- done diff --git a/scribble-core/src/main/java/org/scribble/del/DoDel.java b/scribble-core/src/main/java/org/scribble/del/DoDel.java index 3b40943fc..2e10c5311 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoDel.java @@ -100,7 +100,7 @@ public Do leaveProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) throws ScribbleException { - JobContext jcontext = builder.job.getJobContext(); + JobContext jcontext = builder.job.getContext(); ModuleContext mcontext = builder.getModuleContext(); Do doo = (Do) visited; ProtocolName pn = doo.getProtocolNameNode().toName(); // leaveDisambiguation has fully qualified the target name diff --git a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java b/scribble-core/src/main/java/org/scribble/del/ModuleDel.java index 50aa64d73..2761522d2 100644 --- a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ModuleDel.java @@ -60,7 +60,7 @@ public void enterModuleContextBuilding(ScribNode parent, ScribNode child, ModuleContextBuilder builder) throws ScribbleException { builder.setModuleContext(new ModuleContext( - builder.job.getJobContext().getParsed(), (Module) child)); + builder.job.getContext().getParsed(), (Module) child)); // ModuleContext building is done solely by "new ModuleContext" (no deeper visiting needed) // The only thing ModuleContextBuilder really does is to set the ModuleContext in ModuleDel // FIXME: obtain from MainContext instead of creating on entry by this visitor @@ -135,9 +135,19 @@ private static Set getDuplicates(Collection ss) } @Override - public Module leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) + public Module leaveProjection(ScribNode parent, ScribNode child, + Projector proj, ScribNode visited) { - proj.job.getJobContext().addProjections(proj.getProjections()); + //proj.job.getJobContext().addProjections(proj.getProjections()); + /*Map> res = new HashMap<>(); + for (Entry> e : proj.getProjections() + .entrySet()) + { + Map tmp = e.getValue().entrySet().stream() + .collect(Collectors.toMap(Entry::getKey, + x -> x.getValue().getLProtoDeclChildren().get(0))); + res.put(e.getKey(), tmp); // FIXME: need LTypeTranslator (local intermediate) + }*/ return (Module) visited; } @@ -159,12 +169,15 @@ public Module createModuleForProjection(Projector proj, Module root, { LProtocolName targetsimpname = Projector .projectSimpleProtocolName(gpn.getSimpleName(), role); - ModuleNameNode targetmodname = Projector.makeProjectedModuleNameNode(proj.job.config.af, //null, // CHECKME? projected import sources? + ModuleNameNode targetmodname = Projector.makeProjectedModuleNameNode( + proj.job.config.af, + //null, // CHECKME? projected import sources? - new CommonTree(), // FIXME -- + new CommonTree(), // TODO FIXME -- gpn.getPrefix(), targetsimpname); - if (!targetmodname.toName().equals(modname.toName())) // Self dependency -- each projected local is in its own module now, so can compare module names + if (!targetmodname.toName().equals(modname.toName())) + // Self dependency -- each projected local is in its own module now, so can compare module names { imports .add(proj.job.config.af.ImportModule(null, targetmodname, null)); diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java index 02de33c5a..1d7aacab6 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -70,7 +70,7 @@ public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, RoleNode r = de.getRoleChild(); Role rn = r.toName(); - ProtocolDecl gpd = disamb.job.getJobContext() + ProtocolDecl gpd = disamb.job.getContext() .getModule(fullname.getPrefix()) .getProtocolDeclChild(fullname.getSimpleName()); if (!gpd.getHeaderChild().getRoleDeclListChild().getRoles().contains(rn)) @@ -122,7 +122,7 @@ public void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, } Set todo = new LinkedHashSet(); - ProtocolDecl targetgpd = checker.job.getJobContext() + ProtocolDecl targetgpd = checker.job.getContext() .getModule(targetfullname.getPrefix()) .getProtocolDeclChild(targetfullname.getSimpleName()); // target // CHECKME: does this already contain transitive do-dependencies? But doesn't contain transitive delegation-dependencies..? @@ -148,7 +148,7 @@ public void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, "Recursive protocol dependencies not supported for delegation types: " + de); } - ProtocolDecl nextgpd = checker.job.getJobContext() + ProtocolDecl nextgpd = checker.job.getContext() .getModule(targetfullname.getPrefix()) .getProtocolDeclChild(nextfullname.getSimpleName()); Set tmp = ((GProtocolDeclDel) nextgpd.del()) diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java index 125c63791..603d76988 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java @@ -117,7 +117,7 @@ public void enterProjection(ScribNode parent, ScribNode child, Projector proj) { // For correct name mangling, need to use the parameter corresponding to the self argument // N.B. -- this depends on Projector not following the Subprotocol pattern, otherwise self is wrong - Role param = gd.getTargetRoleParameter(proj.job.getJobContext(), + Role param = gd.getTargetRoleParameter(proj.job.getContext(), proj.getModuleContext(), self); proj.pushSelf(param); } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index ddf180395..3860e2694 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -149,7 +149,7 @@ public GProtocolDecl leaveProjection(ScribNode parent, ScribNode child, { AstFactory af = proj.job.config.af; - Module root = proj.job.getJobContext().getModule(proj.getModuleContext().root); + Module root = proj.job.getContext().getModule(proj.getModuleContext().root); GProtocolDecl gpd = (GProtocolDecl) visited; GProtocolHeader gph = gpd.getHeaderChild(); Role self = proj.peekSelf(); @@ -214,7 +214,7 @@ public void enterValidation(ScribNode parent, ScribNode child, public static void validateByScribble(Job job, GProtocolName fullname, boolean fair) throws ScribbleException { - JobContext jc = job.getJobContext(); + JobContext jc = job.getContext(); SGraph graph = (fair) ? jc.getSGraph(fullname) : jc.getUnfairSGraph(fullname); @@ -225,7 +225,7 @@ public static void validateByScribble(Job job, GProtocolName fullname, public static void validateBySpin(Job job, GProtocolName fullname) throws ScribbleException { - JobContext jc = job.getJobContext(); + JobContext jc = job.getContext(); Module mod = jc.getModule(fullname.getPrefix()); GProtocolDecl gpd = (GProtocolDecl) mod .getProtocolDeclChild(fullname.getSimpleName()); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java index ab6ae47d9..9253d085a 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java @@ -96,7 +96,7 @@ public LDo leaveProtocolInlining(ScribNode parent, ScribNode child, throws ScribbleException // CHECKME: similar needed for non-role args? Or all params always known? (not ideal for distributed?) { - JobContext jc = fixer.job.getJobContext(); + JobContext jc = fixer.job.getContext(); LDo ld = (LDo) visited; RoleArgList roleList = ld.getRoleListChild(); LProtocolDecl lpd = ld.getTargetProtocolDecl(jc, fixer.getModuleContext()); diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index cb4de75f1..f0a7623f5 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -16,7 +16,6 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Collections; -import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -28,6 +27,7 @@ import org.scribble.ast.context.ModuleContext; import org.scribble.ast.global.GProtocolDecl; import org.scribble.del.global.GProtocolDeclDel; +import org.scribble.lang.Projector; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.global.GProtocol; @@ -56,33 +56,31 @@ import org.scribble.visit.context.ProjectedChoiceDoPruner; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; import org.scribble.visit.context.ProjectedRoleDeclFixer; -import org.scribble.visit.context.Projector; import org.scribble.visit.context.ProtocolDeclContextBuilder; import org.scribble.visit.util.RoleCollector; import org.scribble.visit.validation.GProtocolValidator; -import org.scribble.visit.wf.ExplicitCorrelationChecker; import org.scribble.visit.wf.NameDisambiguator; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models public class Job { // Keys are full names - private final Map mctxts; // CHECKME: constant? move to JobConfig? + private final Map modcs; // CHECKME: constant? move to JobConfig? public final JobConfig config; // Immutable - private final JobContext jctxt; // Mutable (Visitor passes replace modules) + private final JobContext context; // Mutable (Visitor passes replace modules) private final SGraphBuilderUtil sgbu; // Just take MainContext as arg? -- would need to fix Maven dependencies //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) public Job(Map parsed, - Map mctxts, JobConfig config) + Map modcs, JobConfig config) { - this.mctxts = Collections.unmodifiableMap(mctxts); + this.modcs = Collections.unmodifiableMap(modcs); this.config = config; this.sgbu = config.sf.newSGraphBuilderUtil(); - this.jctxt = new JobContext(this, parsed); // Single instance per Job and should never be shared + this.context = new JobContext(this, parsed); // Single instance per Job and should never be shared } // Scribble extensions should override these "new" methods @@ -125,20 +123,20 @@ public void runContextBuildingPasses() throws ScribbleException //runVisitorPassOnAllModules(ProtocolDefInliner.class); // FIXME TODO: refactor into a runVisitorPassOnAllModules for SimpleVisitor (and add operation to ModuleDel) - Set fullmodnames = this.jctxt.getFullModuleNames(); + Set fullmodnames = this.context.getFullModuleNames(); for (ModuleName fullmodname : fullmodnames) { - Module mod = this.jctxt.getModule(fullmodname); + Module mod = this.context.getModule(fullmodname); GTypeTranslator t = new GTypeTranslator(this, fullmodname); for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) { GProtocol g = (GProtocol) gpd.visitWith(t); - this.jctxt.addIntermediate(g.fullname, g); - debugPrintln("\nParsed:\n" + gpd + "\n\nScribble intermediary:\n" + g); + this.context.addIntermediate(g.fullname, g); + debugPrintln("\nParsed:\n" + gpd + "\n\nScribble intermediate:\n" + g); } } - for (GProtocol g : this.jctxt.getIntermediates()) + for (GProtocol g : this.context.getIntermediates()) { List> params = new LinkedList<>(); // Convert MemberName params to Args -- cf. NonRoleArgList::getParamKindArgs @@ -163,38 +161,27 @@ else if (n instanceof MessageSigName) i.pushSig(sig); // TODO: factor into constructor GProtocol inlined = g.getInlined(i); debugPrintln("\nSubprotocols inlined:\n" + inlined); - this.jctxt.addInlined(g.fullname, inlined); + this.context.addInlined(g.fullname, inlined); } //runUnfoldingPass(); - for (GProtocol inlined : this.jctxt.getInlined()) + for (GProtocol inlined : this.context.getInlined()) { STypeUnfolder unf1 = new STypeUnfolder<>(); //GTypeUnfolder unf2 = new GTypeUnfolder(); GType unf = (GType) inlined.unfoldAllOnce(unf1);//.unfoldAllOnce(unf2); CHECKME: twice unfolding? instead of "unguarded"-unfolding? debugPrintln("\nAll recursions unfolded once:\n" + unf); } - - for (GProtocol g : this.jctxt.getIntermediates()) - { - for (Role self : g.roles) - { - GProtocol inlined = this.jctxt.getInlined(g.fullname); - LProtocol proj = inlined.project(self); // Projection and inling commutative? - /*STypeUnfolder unf = new STypeUnfolder<>(); - proj = proj.unfoldAllOnce(unf);*/ - this.jctxt.addInlinedProjected(proj.fullname, proj); - debugPrintln("\nProjected onto " + self + ":\n" + proj); - } - } + + runProjectionPasses(); for (Entry e : - this.jctxt.getInlinedProjections().entrySet()) + this.context.getInlinedProjections().entrySet()) { //LProtocolName lname = e.getKey(); LProtocol proj = e.getValue(); EGraph graph = proj.toEGraph(this); - this.jctxt.addEGraph(proj.fullname, graph); + this.context.addEGraph(proj.fullname, graph); debugPrintln("\nEFSM for " + proj.fullname + ":\n" + graph.toDot()); } } @@ -217,10 +204,9 @@ public void runWellFormednessPasses() throws ScribbleException runVisitorPassOnAllModules(GProtocolValidator.class); } }*/ - + //HERE WF (unfolding? unguarded-unfolder -- and lazy-unfolder-with-choice-pruning, e.g., bad.wfchoice.enabling.threeparty.Test02), projection, validation - - for (GProtocol inlined : this.jctxt.getInlined()) + for (GProtocol inlined : this.context.getInlined()) { //TODO: relegate to "warning" // Check unused roles @@ -244,7 +230,7 @@ public void runWellFormednessPasses() throws ScribbleException inlined.checkExtChoiceConsistency(); } - for (LProtocol proj : this.jctxt.getInlinedProjections().values()) + for (LProtocol proj : this.context.getInlinedProjections().values()) { if (proj.isAux()) // CHECKME? e.g., bad.reach.globals.gdo.Test01b { @@ -255,7 +241,7 @@ public void runWellFormednessPasses() throws ScribbleException GProtocolValidator checker = new GProtocolValidator(this); //runVisitorPassOnAllModules(GProtocolValidator.class); - for (Module mod : this.jctxt.getParsed().values()) + for (Module mod : this.context.getParsed().values()) { // FIXME: refactor validation into lang.GProtocol for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) @@ -297,12 +283,34 @@ public void runWellFormednessPasses() throws ScribbleException // So Projection should not be an "inlining" SubprotocolVisitor, it would need to be more a "DependencyVisitor" protected void runProjectionPasses() throws ScribbleException { - runVisitorPassOnAllModules(Projector.class); + /*runVisitorPassOnAllModules(Projector.class); runProjectionContextBuildingPasses(); runProjectionUnfoldingPass(); if (!this.config.noAcceptCorrelationCheck) { runVisitorPassOnParsedModules(ExplicitCorrelationChecker.class); + }*/ + + for (GProtocol g : this.context.getIntermediates()) + { + for (Role self : g.roles) + { + GProtocol inlined = this.context.getInlined(g.fullname); + LProtocol iproj = inlined.projectInlined(self); // CHECKME: projection and inling commutative? + this.context.addInlinedProjection(iproj.fullname, iproj); + debugPrintln("\nProjected inlined onto " + self + ":\n" + iproj); + } + } + + // Inlined already projected, used for do-projection + for (GProtocol g : this.context.getIntermediates()) + { + for (Role self : g.roles) + { + LProtocol proj = g.project(new Projector(this, self)); + this.context.addProjection(proj); + debugPrintln("\nProjected onto " + self + ":\n" + proj); + } } } @@ -334,15 +342,17 @@ protected void runProjectionUnfoldingPass() throws ScribbleException public Map getProjections(GProtocolName fullname, Role role) throws ScribbleException { - //Module root = this.jctxt.getProjection(fullname, role); - LProtocol proj = this.jctxt.getInlinedProjected(fullname, role); + //Module root = + LProtocol proj = + this.context.getProjection(fullname, role); + //LProtocol proj = this.jctxt.getInlinedProjection(fullname, role); // FIXME: dependencies, -project -- FIXME: need to create Module (with dependency imports) - Map> dependencies = - /*((LProtocolDeclDel) root - .getLProtoDeclChildren().get(0).del()).getProtocolDeclContext() - .getDependencyMap().getDependencies().get(role);*/ - new HashMap<>(); + /*Map> dependencies = +// ((LProtocolDeclDel) root +// .getLProtoDeclChildren().get(0).del()).getProtocolDeclContext() +// .getDependencyMap().getDependencies().get(role); + new HashMap<>();*/ // FIXME TODO make LDo and add projection for Do, and do getDeps on that // TODO make test framework to check proj->inline matches inline->proj @@ -350,6 +360,8 @@ public Map getProjections(GProtocolName fullname, List deps = proj.getDependencies(); System.out.println("jjj1: " + proj + "\n" + deps); + + //...HERE: build Modules for deps and return // Can ignore Set for projections (is singleton), as each projected proto is a dependency only for self (implicit in the protocoldecl) /*return dependencies.keySet().stream().collect( @@ -399,21 +411,21 @@ public void runVisitorPassOnAllModules(Class c) throws ScribbleException { debugPrintPass("Running " + c + " on all modules:"); - runVisitorPass(this.jctxt.getFullModuleNames(), c); + runVisitorPass(this.context.getFullModuleNames(), c); } public void runVisitorPassOnParsedModules(Class c) throws ScribbleException { debugPrintPass("Running " + c + " on parsed modules:"); - runVisitorPass(this.jctxt.getParsedFullModuleNames(), c); + runVisitorPass(this.context.getParsedFullModuleNames(), c); } public void runVisitorPassOnProjectedModules(Class c) throws ScribbleException { debugPrintPass("Running " + c + " on projected modules:"); - runVisitorPass(this.jctxt.getProjectedFullModuleNames(), c); + runVisitorPass(this.context.getProjectedFullModuleNames(), c); } private void runVisitorPass(Set modnames, @@ -439,18 +451,18 @@ private void runVisitorPass(Set modnames, private void runVisitorOnModule(ModuleName modname, AstVisitor nv) throws ScribbleException { - Module visited = (Module) this.jctxt.getModule(modname).accept(nv); - this.jctxt.replaceModule(visited); + Module visited = (Module) this.context.getModule(modname).accept(nv); + this.context.replaceModule(visited); } - public JobContext getJobContext() + public JobContext getContext() { - return this.jctxt; + return this.context; } public ModuleContext getModuleContext(ModuleName fullname) { - return this.mctxts.get(fullname); + return this.modcs.get(fullname); } public boolean isDebug() diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext.java b/scribble-core/src/main/java/org/scribble/job/JobContext.java index c22aabca4..4491960eb 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/job/JobContext.java @@ -46,11 +46,15 @@ public class JobContext // Modules that were originally parsed (obtained from MainContext), but may be modified during the Job // ModuleName keys are full module names -- currently the modules read from file, distinguished from the generated projection modules + // CHECKME: separate original parsed from "working set"? private final Map parsed;// = new HashMap<>(); - // Projected (i.e., created) modules + // Projected (i.e., created) modules -- no: LProtocol // LProtocolName is the full local protocol name (module name is the prefix) - private final Map projected = new HashMap<>(); + // LProtocolName key is LProtocol value fullname (i.e., redundant) + private final //Map + Map + projected = new HashMap<>(); // "Directly" translated global protos, i.e., separate proto decls without any inlining/unfolding/etc private final Map intermed = new HashMap<>(); // Keys are full names (though GProtocol already includes full name) @@ -124,12 +128,12 @@ public Module getModule(ModuleName fullname) { return this.parsed.get(fullname); } - else if (isProjectedModule(fullname)) + /*else if (isProjectedModule(fullname)) { return this.projected.get(this.projected.keySet().stream() .filter(lpn -> lpn.getPrefix().equals(fullname)) .collect(Collectors.toList()).get(0)); - } + }*/ else { throw new RuntimeException("Unknown module: " + fullname); @@ -143,10 +147,10 @@ protected void replaceModule(Module module) { this.parsed.put(fullname, module); } - else if (isProjectedModule(fullname)) + /*else if (isProjectedModule(fullname)) { addProjection(module); - } + }*/ else { throw new RuntimeException("Unknown module: " + fullname); @@ -186,17 +190,25 @@ public Collection getInlined() return Collections.unmodifiableCollection(this.inlined.values()); } - public void addInlinedProjected(LProtocolName fullname, LProtocol l) + public void addInlinedProjection(LProtocolName fullname, LProtocol l) { this.iprojected.put(fullname, l); } // "Projected from inlined" // FIXME TODO: refactor getProjected and getProjection properly - public LProtocol getInlinedProjected(GProtocolName fullname, Role self) + public LProtocol getInlinedProjection(GProtocolName fullname, Role self) { LProtocolName p = Projector.projectFullProtocolName(fullname, self); - return this.iprojected.get(p); + + System.out.println("jjjj5: " + p + " ,, " + this.iprojected.keySet()); + + return getInlinedProjection(p); + } + + public LProtocol getInlinedProjection(LProtocolName fullname) + { + return this.iprojected.get(fullname); } public Map getInlinedProjections() @@ -205,11 +217,12 @@ public Map getInlinedProjections() } // Make context immutable? (will need to assign updated context back to Job) -- will also need to do for Module replacing - public void addProjections(Map> projections) + public void addProjections(Map> projections) + Map> projs) { - for (GProtocolName gpn : projections.keySet()) + for (GProtocolName g : projs.keySet()) { - Map mods = projections.get(gpn); + Map mods = projs.get(g); for (Role role : mods.keySet()) { addProjection(mods.get(role)); @@ -233,26 +246,36 @@ public void addProjections(Map> projections) }*/ } - private void addProjection(Module mod) + //private void addProjection(Module mod) + public void addProjection(LProtocol p) { - LProtocolName lpn = (LProtocolName) mod.getProtoDeclChildren().get(0) + /*LProtocolName lpn = (LProtocolName) mod.getProtoDeclChildren().get(0) .getFullMemberName(mod); - this.projected.put(lpn, mod); + this.projected.put(lpn, mod);*/ + this.projected.put(p.fullname, p); } - public Module getProjection(GProtocolName fullname, Role role) + public //Module + LProtocol getProjection(GProtocolName fullname, Role role) throws ScribbleException { - Module proj = this.projected - .get(Projector.projectFullProtocolName(fullname, role)); - if (proj == null) + return getProjection(Projector.projectFullProtocolName(fullname, role)); + } + + public //Module + LProtocol getProjection(LProtocolName fullname) + //throws ScribbleException + { + /*Module proj = this.projected.get(fullname); + if (proj == null)*/ + /*if (!this.projected.containsKey(fullname)) { throw new ScribbleException( - "Projection not found: " + fullname + ", " + role); + "Projection not found: " + fullname); // E.g. disamb/enabling error before projection passes (e.g. CommandLine -fsm arg) - // CHECKME: should not occur any more - } - return proj; + //CHECKME: should not occur any more? + }*/ + return this.projected.get(fullname); } protected void addEGraph(LProtocolName fullname, EGraph graph) diff --git a/scribble-core/src/main/java/org/scribble/lang/Do.java b/scribble-core/src/main/java/org/scribble/lang/Do.java index 14c2763b2..3cfaeee71 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Do.java +++ b/scribble-core/src/main/java/org/scribble/lang/Do.java @@ -40,7 +40,7 @@ public abstract Do reconstruct(org.scribble.ast.Do source, @Override public Set getRoles() { - throw new RuntimeException("Unsupported for Do: " + this); + return this.roles.stream().collect(Collectors.toSet()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/Projector.java b/scribble-core/src/main/java/org/scribble/lang/Projector.java new file mode 100644 index 000000000..3f0f209ab --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/Projector.java @@ -0,0 +1,16 @@ +package org.scribble.lang; + +import org.scribble.job.Job; +import org.scribble.type.name.Role; + +public class Projector +{ + public final Job job; + public final Role self; + + public Projector(Job job, Role self) + { + this.job = job; + this.self = self; + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index c01005881..fab7d9cdb 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -49,6 +49,7 @@ public boolean isExplicit() return this.mods.contains(ProtocolMod.EXPLICIT); } + // FIXME: confusing with this.roles List -- Protocol shouldn't be a SType public Set getRoles() { throw new RuntimeException("Unsupported for Protocol: " + this); @@ -70,7 +71,7 @@ public ProtocolDecl getSource() public String toString() { return "protocol " + this.fullname - + "<" + this.params.stream() + + "<" + this.params.stream() // CHECKME: drop empty "<>" ? .map(x -> x.toString()).collect(Collectors.joining(", ")) + ">" + "(" + this.roles.stream() .map(x -> x.toString()).collect(Collectors.joining(", ")) + ")" diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java index d8025aae9..1941ed5d7 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -13,6 +13,7 @@ import org.scribble.job.ScribbleException; import org.scribble.lang.Choice; +import org.scribble.lang.Projector; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; @@ -65,17 +66,29 @@ public GChoice unfoldAllOnce(STypeUnfolder u) } @Override - public LType project(Role self) + public LType projectInlined(Role self) + { + return projectAux(self, + this.blocks.stream().map(x -> x.projectInlined(self))); + } + + private LType projectAux(Role self, Stream blocks) { Role subj = this.subj.equals(self) ? Role.SELF : this.subj; - List blocks = this.blocks.stream().map(x -> x.project(self)) + List tmp = blocks .filter(x -> !x.isEmpty()) .collect(Collectors.toList()); - if (blocks.isEmpty()) + if (tmp.isEmpty()) { return LSkip.SKIP; // CHECKME: OK, or "empty" choice at subj still important? } - return new LChoice(null, subj, blocks); + return new LChoice(null, subj, tmp); + } + + @Override + public LType project(Projector v) + { + return projectAux(v.self, this.blocks.stream().map(x -> x.project(v))); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java index b7627f41b..64322a573 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java @@ -6,6 +6,7 @@ import org.scribble.ast.ProtocolKindNode; import org.scribble.job.ScribbleException; import org.scribble.lang.Continue; +import org.scribble.lang.Projector; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; @@ -51,10 +52,16 @@ public GRecursion unfoldAllOnce(STypeUnfolder u) } @Override - public LContinue project(Role self) + public LContinue projectInlined(Role self) { return new LContinue(null, this.recvar); } + + @Override + public LContinue project(Projector v) + { + return projectInlined(v.self); + } @Override public Set checkRoleEnabling(Set enabled) throws ScribbleException diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index 64883fe6f..0d0f81fd0 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -3,17 +3,24 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; +import org.scribble.ast.global.GProtocolDecl; +import org.scribble.job.JobContext; import org.scribble.job.ScribbleException; import org.scribble.lang.Do; +import org.scribble.lang.Projector; import org.scribble.lang.STypeInliner; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.LDo; +import org.scribble.lang.local.LSkip; import org.scribble.lang.local.LType; import org.scribble.type.Arg; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.LProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -27,7 +34,8 @@ public GDo(org.scribble.ast.Do source, GProtocolName proto, @Override public GDo reconstruct(org.scribble.ast.Do source, - GProtocolName proto, List roles, List> args) + GProtocolName proto, List roles, + List> args) { return new GDo(source, proto, roles, args); } @@ -38,7 +46,7 @@ public GDo substitute(Substitutions subs) return (GDo) super.substitute(subs); } - // CHECKME: factor up to base? (though currently there is no LDo) + // CHECKME: factor up to base? @Override public GType getInlined(STypeInliner i)//, Deque stack) { @@ -50,7 +58,7 @@ public GType getInlined(STypeInliner i)//, Deque stack) return new GContinue(getSource(), rv); } i.pushSig(sig); - GProtocol g = i.job.getJobContext().getIntermediate(fullname); + GProtocol g = i.job.getContext().getIntermediate(fullname); Substitutions subs = new Substitutions(g.roles, this.roles, g.params, this.args); GSeq inlined = g.def.substitute(subs).getInlined(i);//, stack); @@ -60,10 +68,39 @@ public GType getInlined(STypeInliner i)//, Deque stack) } @Override - public LType project(Role self) + public LType projectInlined(Role self) { - // TODO: consider role fixing and do pruning - throw new RuntimeException("TODO: " + this); + throw new RuntimeException("Unsupported for Do: " + this); + } + + @Override + public LType project(Projector v) + { + if (!this.roles.contains(v.self)) + { + return LSkip.SKIP; + } + + JobContext jobc = v.job.getContext(); + GProtocolDecl gpd = jobc.getParsed().get(this.proto.getPrefix()) + .getGProtoDeclChildren().stream().filter(x -> x.getHeaderChild() + .getDeclName().equals(this.proto.getSimpleName())) + .findAny().get(); + Role targSelf = gpd.getRoles().get(this.roles.indexOf(v.self)); + + GProtocol imed = jobc.getIntermediate(this.proto); + // CHECKME: because intermed decl already prunes roles? + if (!imed.roles.contains(targSelf)) + { + return LSkip.SKIP; + } + + LProtocolName fullname = org.scribble.visit.context.Projector + .projectFullProtocolName(this.proto, targSelf); + List rs = this.roles.stream() + .map(x -> x.equals(v.self) ? Role.SELF : x) + .collect(Collectors.toList()); + return new LDo(null, fullname, rs, this.args); // CHECKME: prune args? } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java index 1fa86c9af..2f206b5cf 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java @@ -8,6 +8,7 @@ import org.scribble.job.ScribbleException; import org.scribble.lang.MessageTransfer; +import org.scribble.lang.Projector; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; @@ -56,7 +57,7 @@ public GMessageTransfer unfoldAllOnce(STypeUnfolder u) } @Override - public LType project(Role self) + public LType projectInlined(Role self) { if (this.src.equals(self)) { @@ -76,6 +77,12 @@ else if (this.dst.equals(self)) } } + @Override + public LType project(Projector v) + { + return projectInlined(v.self); + } + @Override public Set checkRoleEnabling(Set enabled) throws ScribbleException { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index 01cf355d2..bfbecf549 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -11,6 +11,7 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.global.GProtocolDecl; import org.scribble.job.ScribbleException; +import org.scribble.lang.Projector; import org.scribble.lang.Protocol; import org.scribble.lang.ProtocolMod; import org.scribble.lang.STypeInliner; @@ -26,7 +27,6 @@ import org.scribble.type.name.MemberName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; -import org.scribble.visit.context.Projector; public class GProtocol extends Protocol implements GType @@ -86,11 +86,16 @@ public GProtocol unfoldAllOnce(STypeUnfolder u) // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) @Override - public LProjection project(Role self) + public LProjection projectInlined(Role self) { - LProtocolName fullname = Projector.projectFullProtocolName(this.fullname, - self); - LSeq body = (LSeq) this.def.project(self); + LSeq body = (LSeq) this.def.projectInlined(self); + return projectAux(self, body); + } + + private LProjection projectAux(Role self, LSeq body) + { + LProtocolName fullname = org.scribble.visit.context.Projector + .projectFullProtocolName(this.fullname, self); Set tmp = body.getRoles(); List roles = this.roles.stream() .map(x -> x.equals(self) ? Role.SELF : x).filter(x -> tmp.contains(x)) @@ -101,6 +106,13 @@ public LProjection project(Role self) body); } + @Override + public LProjection project(Projector v) + { + LSeq body = (LSeq) this.def.project(v); + return projectAux(v.self, body); + } + @Override public Set checkRoleEnabling(Set enabled) throws ScribbleException { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java index d16ce7631..71cced793 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java @@ -6,6 +6,7 @@ import org.scribble.ast.ProtocolKindNode; import org.scribble.job.ScribbleException; +import org.scribble.lang.Projector; import org.scribble.lang.Recursion; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -67,10 +68,15 @@ public GType unfoldAllOnce(STypeUnfolder u) } @Override - public LType project(Role self) + public LType projectInlined(Role self) { - LSeq body = this.body.project(self); - if (body.isEmpty()) + LSeq body = this.body.projectInlined(self); + return projectAux(body); + } + + private LType projectAux(LSeq body) + { + if (body.isEmpty()) // N.B. projection is doing empty-rec pruning { return LSkip.SKIP; } @@ -90,6 +96,13 @@ public LType project(Role self) return new LRecursion(null, this.recvar, body); } + @Override + public LType project(Projector v) + { + LSeq body = this.body.project(v); + return projectAux(body); + } + @Override public Set checkRoleEnabling(Set enabled) throws ScribbleException { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java index 8499fec49..ba79a0835 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -5,10 +5,12 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.ast.InteractionSeq; import org.scribble.ast.global.GInteractionSeq; import org.scribble.job.ScribbleException; +import org.scribble.lang.Projector; import org.scribble.lang.SType; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -84,17 +86,29 @@ public GSeq unfoldAllOnce(STypeUnfolder u) } @Override - public LSeq project(Role self) + public LSeq projectInlined(Role self) { - List elems = this.elems.stream().map(x -> ((GType) x).project(self)) - .filter(x -> !x.equals(LSkip.SKIP)) + return projectAux(this.elems.stream() + .map(x -> ((GType) x).projectInlined(self))); + } + + private LSeq projectAux(Stream elems) + { + List tmp = elems.filter(x -> !x.equals(LSkip.SKIP)) .collect(Collectors.toList()); - return new LSeq(null, elems); + return new LSeq(null, tmp); // Empty seqs converted to LSkip by GChoice/Recursion projection // And a WF top-level protocol cannot produce empty LSeq // So a projection never contains an empty LSeq -- i.e., "empty choice/rec" pruning unnecessary } + @Override + public LSeq project(Projector v) + { + return projectAux(this.elems.stream() + .map(x -> ((GType) x).project(v))); + } + @Override public Set checkRoleEnabling(Set enabled) throws ScribbleException { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GType.java b/scribble-core/src/main/java/org/scribble/lang/global/GType.java index 54a61d6ca..d3e8f6231 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GType.java @@ -4,6 +4,7 @@ import java.util.Set; import org.scribble.job.ScribbleException; +import org.scribble.lang.Projector; import org.scribble.lang.SType; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; @@ -14,16 +15,8 @@ public interface GType extends SType { - @Override - GType substitute(Substitutions subs); - - @Override - GType getInlined(STypeInliner i);//, Deque stack); - - @Override - SType unfoldAllOnce(STypeUnfolder u); // Not GType return, o/w need to override again in GDo - - LType project(Role self); + LType projectInlined(Role self); + LType project(Projector v); // Pre: use on inlined or later (unsupported for Do, also Protocol) // enabled treated immutably @@ -36,5 +29,14 @@ public interface GType extends SType // Returns enablers post visiting Map checkExtChoiceConsistency(Map enablers) throws ScribbleException; + + @Override + GType substitute(Substitutions subs); + + @Override + GType getInlined(STypeInliner i);//, Deque stack); + + @Override + SType unfoldAllOnce(STypeUnfolder u); // Not GType return, o/w need to override again in GDo } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LDo.java b/scribble-core/src/main/java/org/scribble/lang/local/LDo.java new file mode 100644 index 000000000..c254b1ea6 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/local/LDo.java @@ -0,0 +1,121 @@ +package org.scribble.lang.local; + +import java.util.List; +import java.util.Set; + +import org.scribble.job.ScribbleException; +import org.scribble.lang.Do; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.Substitutions; +import org.scribble.model.endpoint.EGraphBuilderUtil2; +import org.scribble.type.Arg; +import org.scribble.type.SubprotoSig; +import org.scribble.type.kind.Local; +import org.scribble.type.kind.NonRoleParamKind; +import org.scribble.type.name.LProtocolName; +import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; + +public class LDo extends Do implements LType +{ + public LDo(org.scribble.ast.Do source, LProtocolName proto, + List roles, List> args) + { + super(source, proto, roles, args); + } + + @Override + public LDo reconstruct(org.scribble.ast.Do source, + LProtocolName proto, List roles, + List> args) + { + return new LDo(source, proto, roles, args); + } + + @Override + public RecVar isSingleCont() + { + throw new RuntimeException("Unsupported for LDo: " + this); + } + + @Override + public boolean isSingleConts(Set rvs) + { + throw new RuntimeException("Unsupported for LDo: " + this); + } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + throw new RuntimeException("Unsupported for LDo: " + this); + } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribbleException + { + throw new RuntimeException("Unsupported for LDo: " + this); + } + + @Override + public LDo substitute(Substitutions subs) + { + return (LDo) super.substitute(subs); + } + + // CHECKME: factor up to base? + @Override + public LType getInlined(STypeInliner i) + { + LProtocolName fullname = this.proto; + SubprotoSig sig = new SubprotoSig(fullname, this.roles, this.args); + RecVar rv = i.getInlinedRecVar(sig); + if (i.hasSig(sig)) + { + return new LContinue(getSource(), rv); + } + i.pushSig(sig); + LProtocol p = i.job.getContext().getProjection(fullname); // This line differs from GDo version + Substitutions subs = + new Substitutions(p.roles, this.roles, p.params, this.args); + LSeq inlined = p.def.substitute(subs).getInlined(i);//, stack); + // i.e. returning a Seq -- rely on parent Seq to inline + i.popSig(); + return new LRecursion(null, rv, inlined); + } + + @Override + public org.scribble.ast.local.LDo getSource() + { + return (org.scribble.ast.local.LDo) super.getSource(); + } + + @Override + public int hashCode() + { + int hash = 1303; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof LDo)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof LDo; + } +} + diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java index d2f8682a7..0e81b4bb3 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java @@ -67,8 +67,10 @@ public LProtocolDecl getSource() @Override public String toString() { - return this.mods.stream().map(x -> x.toString() + " ") + "local protocol " - + this.fullname + "(" + return this.mods.stream().map(x -> x.toString() + " ") + .collect(Collectors.joining()) + + "local protocol " + this.fullname + + "(" + this.roles.stream().map(x -> x.toString()) .collect(Collectors.joining(", ")) + ")" + " projects " + this.parent + "@" + this.self + " {\n" + this.def diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index b61889b56..31054fd5b 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -3,6 +3,7 @@ import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.local.LProtocolDecl; @@ -134,8 +135,8 @@ public LProtocolDecl getSource() @Override public String toString() { - return this.mods.stream().map(x -> x.toString() + " ") + "local " - + super.toString(); + return this.mods.stream().map(x -> x.toString() + " ") + .collect(Collectors.joining(" ")) + "local " + super.toString(); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LType.java b/scribble-core/src/main/java/org/scribble/lang/local/LType.java index 1cb1d70c8..c15f7d667 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LType.java @@ -13,7 +13,10 @@ public interface LType extends SType { + //Role getSelf(); // CHECKME + // Return recvar of the "single continue", if so; return null, if not + @Deprecated RecVar isSingleCont(); boolean isSingleConts(Set rvs); diff --git a/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java b/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java index 28449130a..da114dd63 100644 --- a/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java @@ -95,7 +95,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleExcepti ProtocolDecl pd = (ProtocolDecl) visited; this.job.debugPrintln("\n[DEBUG] Unfolded inlined protocol " + pd.getFullMemberName( - this.job.getJobContext().getModule(getModuleContext().root)) + this.job.getContext().getModule(getModuleContext().root)) + ":\n" + ((ProtocolDefDel) pd.getDefChild().del()) .getInlinedProtocolDef()); } diff --git a/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java b/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java index c154df2f6..a1542672e 100644 --- a/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java +++ b/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java @@ -88,7 +88,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleExcepti { ProtocolDecl pd = (ProtocolDecl) visited; this.job.debugPrintln("\n[DEBUG] Inlined root protocol " - + pd.getFullMemberName(this.job.getJobContext().getModule(getModuleContext().root)) + ":\n" + + pd.getFullMemberName(this.job.getContext().getModule(getModuleContext().root)) + ":\n" + ((ProtocolDefDel) pd.getDefChild().del()).getInlinedProtocolDef()); } return leave(parent, child, visited); @@ -118,7 +118,7 @@ protected Do visitOverrideForDo(InteractionSeq parent, Do child) throws { //return (GDo) super.visitForSubprotocols(parent, child); // Duplicated from SubprotocolVisitor#visitOverrideFoDo and modified to access discarded env -- FIXME: factor out this facility better - JobContext jc = this.job.getJobContext(); + JobContext jc = this.job.getContext(); ModuleContext mc = getModuleContext(); ProtocolDecl pd = child.getTargetProtocolDecl(jc, mc); diff --git a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java index ad585799a..52a8b13fe 100644 --- a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java @@ -117,7 +117,7 @@ protected Do visitOverrideForDo(ScribNode parent, Do doo) { if (!isCycle()) { - JobContext jc = this.job.getJobContext(); + JobContext jc = this.job.getContext(); ModuleContext mc = getModuleContext(); ProtocolDecl pd = doo.getTargetProtocolDecl(jc, mc); @@ -248,7 +248,7 @@ private void pushSubprotocolSig(ProtocolName fullname, List roleargs, private void pushNameMaps(ProtocolName fullname, Do doo) { - ProtocolDecl pd = this.job.getJobContext().getModule(fullname.getPrefix()) + ProtocolDecl pd = this.job.getContext().getModule(fullname.getPrefix()) .getProtocolDeclChild(fullname.getSimpleName()); ProtocolHeader hdr = pd.getHeaderChild(); this.rolemaps.push(makeRoleSubsMap(this.rolemaps.get(0), diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java index 3c956dfc8..0e69ad8d8 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java @@ -57,7 +57,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) List ins = lis.getInteractionChildren(); if (ins.get(0) instanceof LDo) // Unlike GRecursion.prune, to-prune "do" could be followed by a continuation? { - JobContext jc = this.job.getJobContext(); + JobContext jc = this.job.getContext(); LDo ld = (LDo) ins.get(0); LProtocolDecl lpd = ld.getTargetProtocolDecl(jc, getModuleContext()); diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java b/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java index 5cf8a2f95..b289b68f6 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java @@ -48,8 +48,9 @@ public ScribNode visit(ScribNode parent, ScribNode child) GProtocolName gpn = gpd.getFullMemberName(mod); for (Role r : gpd.getHeaderChild().getRoleDeclListChild().getRoles()) { - Module proj = this.job.getJobContext().getProjection(gpn, r); - proj.accept(this); + /*Module proj = this.job.getJobContext().getProjection(gpn, r); + proj.accept(this);*/ + throw new RuntimeException("[TODO]: " + gpn + "@" + r); } } return gpd; diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 66fdf2bb3..b7bc78770 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -36,7 +36,7 @@ module tmp.Test; //------------- //- projection dependencies (projections as modules?) -//- check projected role/choice/do pruning/fixing? +//- check projected role/choice/do pruning/fixing? -- applies only to above proj? (i.e., proto decls) -- CHECKME: can do role fixing by getting roles from iprohj? similarly do-pruning? //- drop unused recs -- partly done by inlining, but not done yet for subprotos //- connections //- refactor ast to parser, refactor lang to type? -- separate protocol classes? @@ -49,9 +49,15 @@ module tmp.Test; //- check demos -global protocol Foo(role A, role B) +global protocol Foo(role A, role B, role C) { 1() from A to B; + do Bar(A, C); +} + +aux global protocol Bar(role D, role E) +{ + 2() from D to E; } From 37234013db1aea720d50fbd1de932f8e3935097a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 2 Apr 2019 19:08:21 +0100 Subject: [PATCH 149/539] Minor. --- scribble-core/src/main/java/org/scribble/job/Job.java | 2 +- .../src/main/java/org/scribble/lang/global/GDo.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index f0a7623f5..57f4a52d9 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -302,7 +302,7 @@ protected void runProjectionPasses() throws ScribbleException } } - // Inlined already projected, used for do-projection + // Pre: inlined already projected -- used for Do projection for (GProtocol g : this.context.getIntermediates()) { for (Role self : g.roles) diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index 0d0f81fd0..551808391 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -89,8 +89,7 @@ public LType project(Projector v) Role targSelf = gpd.getRoles().get(this.roles.indexOf(v.self)); GProtocol imed = jobc.getIntermediate(this.proto); - // CHECKME: because intermed decl already prunes roles? - if (!imed.roles.contains(targSelf)) + if (!imed.roles.contains(targSelf)) // CHECKME: because roles already pruned for intermed decl? { return LSkip.SKIP; } @@ -100,7 +99,7 @@ public LType project(Projector v) List rs = this.roles.stream() .map(x -> x.equals(v.self) ? Role.SELF : x) .collect(Collectors.toList()); - return new LDo(null, fullname, rs, this.args); // CHECKME: prune args? + return new LDo(null, fullname, rs, this.args); // TODO CHECKME: prune args? } @Override From 33e04bccf1df90cf460573cd82af75b45ff07873 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 3 Apr 2019 12:47:14 +0100 Subject: [PATCH 150/539] Continued: partial output for -project. --- .../src/main/java/org/scribble/job/Job.java | 37 ++++++++----------- .../java/org/scribble/job/JobContext.java | 10 ++++- .../main/java/org/scribble/lang/Choice.java | 15 ++++++-- .../main/java/org/scribble/lang/Continue.java | 11 +++++- .../src/main/java/org/scribble/lang/Do.java | 14 +++++-- .../org/scribble/lang/MessageTransfer.java | 21 +++++++---- .../main/java/org/scribble/lang/Protocol.java | 16 +++++--- .../java/org/scribble/lang/Recursion.java | 13 +++++-- .../main/java/org/scribble/lang/SType.java | 8 ++-- .../src/main/java/org/scribble/lang/Seq.java | 15 ++++++-- .../java/org/scribble/lang/global/GDo.java | 5 +-- .../org/scribble/lang/local/LProjection.java | 2 +- .../java/org/scribble/lang/local/LSkip.java | 11 +++++- scribble-test/src/test/scrib/tmp/Test.scr | 8 ++++ 14 files changed, 128 insertions(+), 58 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 57f4a52d9..10912323c 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -41,6 +41,7 @@ import org.scribble.type.Arg; import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; +import org.scribble.type.kind.Local; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.DataType; import org.scribble.type.name.GProtocolName; @@ -48,6 +49,7 @@ import org.scribble.type.name.MemberName; import org.scribble.type.name.MessageSigName; import org.scribble.type.name.ModuleName; +import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; import org.scribble.visit.InlinedProtocolUnfolder; @@ -345,29 +347,22 @@ public Map getProjections(GProtocolName fullname, //Module root = LProtocol proj = this.context.getProjection(fullname, role); - //LProtocol proj = this.jctxt.getInlinedProjection(fullname, role); - // FIXME: dependencies, -project -- FIXME: need to create Module (with dependency imports) - /*Map> dependencies = -// ((LProtocolDeclDel) root -// .getLProtoDeclChildren().get(0).del()).getProtocolDeclContext() -// .getDependencyMap().getDependencies().get(role); - new HashMap<>();*/ - - // FIXME TODO make LDo and add projection for Do, and do getDeps on that - // TODO make test framework to check proj->inline matches inline->proj - // TODO make test framework to check global-"proj"-via-taus matches actual proj -- matches mean language acceptance? - - List deps = proj.getDependencies(); - System.out.println("jjj1: " + proj + "\n" + deps); - - //...HERE: build Modules for deps and return + System.out.println(proj); + List> ps = proj.getProtoDependencies(); + for (ProtocolName p : ps) + { + System.out.println("\n" + this.context.getProjection((LProtocolName) p)); + } + + List> ns = proj.getNonProtoDependencies(); - // Can ignore Set for projections (is singleton), as each projected proto is a dependency only for self (implicit in the protocoldecl) - /*return dependencies.keySet().stream().collect( - Collectors.toMap(x -> x, x -> this.jctxt.getModule(x.getPrefix())));*/ - throw new RuntimeException( - "[TODO] Projection modules and dependencies: " + fullname + "@" + role); + debugPrintln("\n[TODO] Full module projection and imports: " + + fullname + "@" + role); + + return Collections.emptyMap(); + //FIXME: build output Modules + //FIXME: (interleaved) ordering between proto and nonproto (Module) imports -- order by original Global import order? } /*public Map generateSessionApi(GProtocolName fullname) throws ScribbleException diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext.java b/scribble-core/src/main/java/org/scribble/job/JobContext.java index 4491960eb..9ccccb65e 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/job/JobContext.java @@ -425,9 +425,17 @@ private static String runAut(String fsm, String aut) throws ScribbleException } } - // HACK + // HACK -- CHECKME: separate original parsed from "working set"? public Map getParsed() { return Collections.unmodifiableMap(this.parsed); } + + public GProtocolDecl getParsed(GProtocolName fullname) + { + return this.parsed.get(fullname.getPrefix()) + .getGProtoDeclChildren().stream().filter(x -> x.getHeaderChild() + .getDeclName().equals(fullname.getSimpleName())) + .findAny().get(); + } } diff --git a/scribble-core/src/main/java/org/scribble/lang/Choice.java b/scribble-core/src/main/java/org/scribble/lang/Choice.java index 36578e15f..06be82ccf 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Choice.java +++ b/scribble-core/src/main/java/org/scribble/lang/Choice.java @@ -7,7 +7,8 @@ import java.util.stream.Stream; import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.ModuleName; +import org.scribble.type.name.MemberName; +import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; public abstract class Choice> @@ -37,9 +38,17 @@ public Set getRoles() } @Override - public List getDependencies() + public List> getProtoDependencies() { - return this.blocks.stream().flatMap(x -> x.getDependencies().stream()) + return this.blocks.stream().flatMap(x -> x.getProtoDependencies().stream()) + .distinct().collect(Collectors.toList()); + } + + @Override + public List> getNonProtoDependencies() + { + return this.blocks.stream() + .flatMap(x -> x.getNonProtoDependencies().stream()).distinct() .collect(Collectors.toList()); } diff --git a/scribble-core/src/main/java/org/scribble/lang/Continue.java b/scribble-core/src/main/java/org/scribble/lang/Continue.java index 772497b01..d802cb1d1 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Continue.java +++ b/scribble-core/src/main/java/org/scribble/lang/Continue.java @@ -6,7 +6,8 @@ import org.scribble.ast.ProtocolKindNode; import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.ModuleName; +import org.scribble.type.name.MemberName; +import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -33,7 +34,13 @@ public Set getRoles() } @Override - public List getDependencies() + public List> getProtoDependencies() + { + return Collections.emptyList(); + } + + @Override + public List> getNonProtoDependencies() { return Collections.emptyList(); } diff --git a/scribble-core/src/main/java/org/scribble/lang/Do.java b/scribble-core/src/main/java/org/scribble/lang/Do.java index 3cfaeee71..273133a05 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Do.java +++ b/scribble-core/src/main/java/org/scribble/lang/Do.java @@ -8,12 +8,12 @@ import java.util.stream.Stream; import org.scribble.type.Arg; +import org.scribble.type.MessageSig; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.DataType; import org.scribble.type.name.MemberName; import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.ModuleName; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; @@ -44,9 +44,17 @@ public Set getRoles() } @Override - public List getDependencies() + public List> getProtoDependencies() { - return Stream.of(this.proto.getPrefix()).collect(Collectors.toList()); + return Stream.of(this.proto).collect(Collectors.toList()); + } + + @Override + public List> getNonProtoDependencies() + { + return this.args.stream() + .filter(x -> (x instanceof MessageSig) || (x instanceof DataType)) // CHECKME: refactor? + .map(x -> (MemberName) x).collect(Collectors.toList()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java index 1c120c869..0931389c3 100644 --- a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java @@ -1,5 +1,6 @@ package org.scribble.lang; +import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Set; @@ -14,8 +15,8 @@ import org.scribble.type.name.GDelegationType; import org.scribble.type.name.MemberName; import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.ModuleName; import org.scribble.type.name.PayloadElemType; +import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; public abstract class MessageTransfer @@ -46,12 +47,18 @@ public Set getRoles() } @Override - public List getDependencies() + public List> getProtoDependencies() { - List res = new LinkedList<>(); + return Collections.emptyList(); + } + + @Override + public List> getNonProtoDependencies() + { + List> res = new LinkedList<>(); if (this.msg.isMessageSigName()) { - res.add(((MessageSigName) this.msg).getPrefix()); + res.add((MessageSigName) this.msg); } else //if (this.msg.isMessageSig) { @@ -60,11 +67,11 @@ public List getDependencies() { if (p.isDataType()) { - res.add(((DataType) p).getPrefix()); + res.add((DataType) p); } - else //if (p.isGDelegationType()) + else if (p.isGDelegationType()) // TODO FIXME: should be projected to local name { - res.add(((GDelegationType) p).getGlobalProtocol().getPrefix()); + res.add(((GDelegationType) p).getGlobalProtocol()); } } } diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index fab7d9cdb..2005f9945 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -9,7 +9,6 @@ import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; -import org.scribble.type.name.ModuleName; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; @@ -49,16 +48,23 @@ public boolean isExplicit() return this.mods.contains(ProtocolMod.EXPLICIT); } - // FIXME: confusing with this.roles List -- Protocol shouldn't be a SType + // FIXME: confusing with this.roles List -- refactor: Protocol shouldn't be a SType + @Override public Set getRoles() { throw new RuntimeException("Unsupported for Protocol: " + this); } @Override - public List getDependencies() + public List> getProtoDependencies() + { + return this.def.getProtoDependencies(); + } + + @Override + public List> getNonProtoDependencies() { - return this.def.getDependencies(); + return this.def.getNonProtoDependencies(); } @Override @@ -70,7 +76,7 @@ public ProtocolDecl getSource() @Override public String toString() { - return "protocol " + this.fullname + return "protocol " + this.fullname.getSimpleName() + "<" + this.params.stream() // CHECKME: drop empty "<>" ? .map(x -> x.toString()).collect(Collectors.joining(", ")) + ">" + "(" + this.roles.stream() diff --git a/scribble-core/src/main/java/org/scribble/lang/Recursion.java b/scribble-core/src/main/java/org/scribble/lang/Recursion.java index 43723e744..807aa5d0e 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/Recursion.java @@ -5,7 +5,8 @@ import org.scribble.ast.ProtocolKindNode; import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.ModuleName; +import org.scribble.type.name.MemberName; +import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -34,9 +35,15 @@ public Set getRoles() } @Override - public List getDependencies() + public List> getProtoDependencies() { - return this.body.getDependencies(); + return this.body.getProtoDependencies(); + } + + @Override + public List> getNonProtoDependencies() + { + return this.body.getNonProtoDependencies(); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/SType.java b/scribble-core/src/main/java/org/scribble/lang/SType.java index 369e56a4a..bfea0ecb5 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SType.java +++ b/scribble-core/src/main/java/org/scribble/lang/SType.java @@ -5,7 +5,8 @@ import org.scribble.ast.ProtocolKindNode; import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.ModuleName; +import org.scribble.type.name.MemberName; +import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; // CHECKME: move to type.sess? @@ -34,8 +35,9 @@ public interface SType // FIXME: repeat recvar names, including non-shadowing (e.g., choice cases) SType unfoldAllOnce(STypeUnfolder u); - // Returns *all* modules (SType has no notion of Module) - List getDependencies(); + // Resulting Lists should not contain duplicates (i.e., Choice/Seq) + List> getProtoDependencies(); + List> getNonProtoDependencies(); // N.B. delegation payloads currently here, not getProtoDependencies (CHECKME: refactor?) // Call this using: them.canEquals(this) boolean canEquals(Object o); diff --git a/scribble-core/src/main/java/org/scribble/lang/Seq.java b/scribble-core/src/main/java/org/scribble/lang/Seq.java index 95b69a6b5..f998b6e8e 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Seq.java +++ b/scribble-core/src/main/java/org/scribble/lang/Seq.java @@ -7,7 +7,8 @@ import org.scribble.ast.InteractionSeq; import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.ModuleName; +import org.scribble.type.name.MemberName; +import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; // Could add B extends STTypeBase, K>, but it inflates type params quite a bit (e.g., Protocol) @@ -33,9 +34,17 @@ public Set getRoles() } @Override - public List getDependencies() + public List> getProtoDependencies() { - return this.elems.stream().flatMap(x -> x.getDependencies().stream()) + return this.elems.stream().flatMap(x -> x.getProtoDependencies().stream()) + .distinct().collect(Collectors.toList()); + } + + @Override + public List> getNonProtoDependencies() + { + return this.elems.stream() + .flatMap(x -> x.getNonProtoDependencies().stream()).distinct() .collect(Collectors.toList()); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index 551808391..3d9888e03 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -82,10 +82,7 @@ public LType project(Projector v) } JobContext jobc = v.job.getContext(); - GProtocolDecl gpd = jobc.getParsed().get(this.proto.getPrefix()) - .getGProtoDeclChildren().stream().filter(x -> x.getHeaderChild() - .getDeclName().equals(this.proto.getSimpleName())) - .findAny().get(); + GProtocolDecl gpd = jobc.getParsed(this.proto); Role targSelf = gpd.getRoles().get(this.roles.indexOf(v.self)); GProtocol imed = jobc.getIntermediate(this.proto); diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java index 0e81b4bb3..e93b03487 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java @@ -69,7 +69,7 @@ public String toString() { return this.mods.stream().map(x -> x.toString() + " ") .collect(Collectors.joining()) - + "local protocol " + this.fullname + + "local protocol " + this.fullname.getSimpleName() + "(" + this.roles.stream().map(x -> x.toString()) .collect(Collectors.joining(", ")) diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java index f1c4d3d04..d0aa240b3 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java @@ -10,7 +10,8 @@ import org.scribble.lang.Substitutions; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; -import org.scribble.type.name.ModuleName; +import org.scribble.type.name.MemberName; +import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -30,7 +31,13 @@ public Set getRoles() } @Override - public List getDependencies() + public List> getProtoDependencies() + { + throw new RuntimeException("Unsupported for Skip: " + this); + } + + @Override + public List> getNonProtoDependencies() { throw new RuntimeException("Unsupported for Skip: " + this); } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index b7bc78770..060983e44 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -34,6 +34,11 @@ module tmp.Test; // FIXME: good.liveness.Test02, reachability check (empty rec projection) + + + + + //------------- //- projection dependencies (projections as modules?) //- check projected role/choice/do pruning/fixing? -- applies only to above proj? (i.e., proto decls) -- CHECKME: can do role fixing by getting roles from iprohj? similarly do-pruning? @@ -47,6 +52,9 @@ module tmp.Test; //- refactor do param/arg ast classes -- generally clean up AST class hierarchy //- refactor parsing and CL //- check demos + + // TODO make test framework to check proj->inline matches inline->proj + // TODO make test framework to check global-"proj"-via-taus matches actual proj -- matches mean language acceptance? global protocol Foo(role A, role B, role C) From 3a5180af7fdc68d2dfdfd71097a2ea0f7d3095fc Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 3 Apr 2019 12:48:56 +0100 Subject: [PATCH 151/539] Minor. --- scribble-core/src/main/java/org/scribble/job/Job.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 10912323c..26d4b9b2a 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -340,7 +340,7 @@ protected void runProjectionUnfoldingPass() throws ScribbleException } // Pre: checkWellFormedness - // Returns: full proto name -> Module + // Returns: fullname -> Module public Map getProjections(GProtocolName fullname, Role role) throws ScribbleException { @@ -357,7 +357,7 @@ public Map getProjections(GProtocolName fullname, List> ns = proj.getNonProtoDependencies(); - debugPrintln("\n[TODO] Full module projection and imports: " + warningPrintln("\n[TODO] Full module projection and imports: " + fullname + "@" + role); return Collections.emptyMap(); From 425327da17509386627008da2cf312f1a9dcea74 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 3 Apr 2019 13:43:55 +0100 Subject: [PATCH 152/539] Continued: refactored self role in lang Protocols. --- .../org/scribble/ast/local/SelfRoleDecl.java | 1 + .../main/java/org/scribble/lang/Protocol.java | 45 ++++++++++++++++--- .../org/scribble/lang/global/GProtocol.java | 5 +-- .../org/scribble/lang/local/LProjection.java | 27 ++++++----- .../org/scribble/lang/local/LProtocol.java | 26 ++++++++--- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 6 files changed, 77 insertions(+), 29 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/local/SelfRoleDecl.java b/scribble-core/src/main/java/org/scribble/ast/local/SelfRoleDecl.java index ccff2ce55..edb8eab05 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/SelfRoleDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/SelfRoleDecl.java @@ -20,6 +20,7 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.type.name.Role; +// Child should be a "self" ID node public class SelfRoleDecl extends RoleDecl { // ScribTreeAdaptor#create constructor diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index 2005f9945..899b10574 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -5,10 +5,13 @@ import java.util.Set; import java.util.stream.Collectors; +import org.scribble.ast.Constants; import org.scribble.ast.ProtocolDecl; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.DataType; import org.scribble.type.name.MemberName; +import org.scribble.type.name.MessageSigName; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; @@ -34,9 +37,9 @@ public Protocol(ProtocolDecl source, List mods, N fullname, this.def = def; } - public abstract Protocol reconstruct(ProtocolDecl source, + /*public abstract Protocol reconstruct(ProtocolDecl source, List mods, N fullname, List roles, - List> params, B def); + List> params, B def);*/ public boolean isAux() { @@ -77,13 +80,43 @@ public ProtocolDecl getSource() public String toString() { return "protocol " + this.fullname.getSimpleName() - + "<" + this.params.stream() // CHECKME: drop empty "<>" ? - .map(x -> x.toString()).collect(Collectors.joining(", ")) + ">" - + "(" + this.roles.stream() - .map(x -> x.toString()).collect(Collectors.joining(", ")) + ")" + + paramsToString() + + rolesToString() + " {\n" + this.def + "\n}"; } + protected String rolesToString() + { + return "(" + + this.roles.stream().map(x -> Constants.ROLE_KW + " " + x.toString()) + .collect(Collectors.joining(", ")) + + ")"; + } + + protected String paramsToString() + { + return "<" + this.params.stream() // CHECKME: drop empty "<>" ? + .map(x -> + { + String k; + if (x instanceof DataType) // CHECKME: refactor? + { + k = Constants.TYPE_KW; + } + else if (x instanceof MessageSigName) + { + k = Constants.SIG_KW; + } + else + { + throw new RuntimeException(); + } + return k + x; + }) + .collect(Collectors.joining(", ")) + + ">"; + } + // CHECKME: only should/need to use fullname? @Override public int hashCode() diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index bfbecf549..4c7cf4b54 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -38,7 +38,6 @@ public GProtocol(ProtocolDecl source, List mods, super(source, mods, fullname, roles, params, def); } - @Override public GProtocol reconstruct(ProtocolDecl source, List mods, GProtocolName fullname, List roles, List> params, GSeq def) @@ -98,11 +97,11 @@ private LProjection projectAux(Role self, LSeq body) .projectFullProtocolName(this.fullname, self); Set tmp = body.getRoles(); List roles = this.roles.stream() - .map(x -> x.equals(self) ? Role.SELF : x).filter(x -> tmp.contains(x)) + .filter(x -> x.equals(self) || tmp.contains(x)) // Implicitly filters Role.SELF .collect(Collectors.toList()); List> params = new LinkedList<>(this.params); // CHECKME: filter params by usage? - return new LProjection(this.mods, this.fullname, self, fullname, roles, params, + return new LProjection(this.mods, fullname, roles, self, params, this.fullname, body); } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java index e93b03487..57d0fa02c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java @@ -15,24 +15,23 @@ public class LProjection extends LProtocol { public final GProtocolName parent; - public final Role self; - public LProjection(List mods, GProtocolName parent, Role self, - LProtocolName fullname, List roles, - List> params, LSeq body) + public LProjection(List mods, LProtocolName fullname, + List roles, Role self, + List> params, GProtocolName parent, + LSeq body) { - super(null, mods, fullname, roles, params, body); + super(null, mods, fullname, roles, self, params, body); this.parent = parent; - this.self = self; } @Override public LProjection reconstruct(ProtocolDecl source, List mods, LProtocolName fullname, List roles, - List> params, LSeq body) + Role self, List> params, LSeq body) { - return new LProjection(mods, this.parent, this.self, fullname, roles, - params, body); + return new LProjection(mods, fullname, roles, this.self, params, + this.parent, body); } /*@Override @@ -70,11 +69,10 @@ public String toString() return this.mods.stream().map(x -> x.toString() + " ") .collect(Collectors.joining()) + "local protocol " + this.fullname.getSimpleName() - + "(" - + this.roles.stream().map(x -> x.toString()) - .collect(Collectors.joining(", ")) - + ")" + " projects " + this.parent + "@" + this.self + " {\n" + this.def - + "\n}"; + + paramsToString() + + rolesToString() + + " projects " + this.parent + + " {\n" + this.def + "\n}"; } @Override @@ -82,6 +80,7 @@ public int hashCode() { int hash = 3167; hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.parent.hashCode(); return hash; } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index 31054fd5b..5d398b084 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -5,6 +5,7 @@ import java.util.Set; import java.util.stream.Collectors; +import org.scribble.ast.Constants; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.local.LProtocolDecl; import org.scribble.job.Job; @@ -28,19 +29,21 @@ public class LProtocol extends Protocol implements LType { + public final Role self; + public LProtocol(ProtocolDecl source, List mods, - LProtocolName fullname, List roles, + LProtocolName fullname, List roles, Role self, List> params, LSeq def) { super(source, mods, fullname, roles, params, def); + this.self = self; } - @Override public LProtocol reconstruct(ProtocolDecl source, List mods, LProtocolName fullname, List roles, - List> params, LSeq def) + Role self, List> params, LSeq def) { - return new LProtocol(source, mods, fullname, roles, params, def); + return new LProtocol(source, mods, fullname, roles, self, params, def); } @Override @@ -86,7 +89,7 @@ public LProtocol unfoldAllOnce(STypeUnfolder u) { LSeq unf = (LSeq) this.def.unfoldAllOnce(u); return reconstruct(getSource(), this.mods, this.fullname, this.roles, - this.params, unf); + this.self, this.params, unf); } public EGraph toEGraph(Job job) @@ -138,12 +141,25 @@ public String toString() return this.mods.stream().map(x -> x.toString() + " ") .collect(Collectors.joining(" ")) + "local " + super.toString(); } + + @Override + protected String rolesToString() + { + return "(" + + this.roles.stream() + .map(x -> x.equals(this.self) + ? Constants.SELF_KW + " " + this.self + : Constants.ROLE_KW + " " + x) + .collect(Collectors.joining(", ")) + + ")"; + } @Override public int hashCode() { int hash = 11; hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.self.hashCode(); return hash; } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 060983e44..51f8fd997 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -41,7 +41,7 @@ module tmp.Test; //------------- //- projection dependencies (projections as modules?) -//- check projected role/choice/do pruning/fixing? -- applies only to above proj? (i.e., proto decls) -- CHECKME: can do role fixing by getting roles from iprohj? similarly do-pruning? +//- check projected role/choice/do pruning/fixing? -- applies only to above proj? (i.e., proto decls) -- CHECKME: can do role fixing by getting roles from iproj? similarly do-pruning? //- drop unused recs -- partly done by inlining, but not done yet for subprotos //- connections //- refactor ast to parser, refactor lang to type? -- separate protocol classes? From 657ddec00e0e924461af20c169c65cf51abd3ba9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 3 Apr 2019 13:47:19 +0100 Subject: [PATCH 153/539] Minor. --- .../src/main/java/org/scribble/lang/global/GChoice.java | 3 ++- scribble-core/src/main/java/org/scribble/lang/global/GDo.java | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java index 1941ed5d7..5ce0dcf0b 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -74,7 +74,8 @@ public LType projectInlined(Role self) private LType projectAux(Role self, Stream blocks) { - Role subj = this.subj.equals(self) ? Role.SELF : this.subj; + Role subj = this.subj.equals(self) ? Role.SELF : this.subj; + // CHECKME: "self" also explcitily used for Do, but implicitly for MessageTransfer, inconsistent? List tmp = blocks .filter(x -> !x.isEmpty()) .collect(Collectors.toList()); diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index 3d9888e03..118f0f6a6 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -95,6 +95,7 @@ public LType project(Projector v) .projectFullProtocolName(this.proto, targSelf); List rs = this.roles.stream() .map(x -> x.equals(v.self) ? Role.SELF : x) + // CHECKME: "self" also explcitily used for Choice, but implicitly for MessageTransfer, inconsistent? .collect(Collectors.toList()); return new LDo(null, fullname, rs, this.args); // TODO CHECKME: prune args? } From b329da7d70aeabaa12d935512aaa4e8d00c6c15f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 3 Apr 2019 15:20:56 +0100 Subject: [PATCH 154/539] Continued: added pruneRecs to SType. --- .../main/java/org/scribble/ast/RoleDecl.java | 2 +- .../src/main/java/org/scribble/job/Job.java | 9 ++++--- .../main/java/org/scribble/lang/Choice.java | 8 ++++++ .../main/java/org/scribble/lang/Continue.java | 17 +++++++++++- .../src/main/java/org/scribble/lang/Do.java | 13 ++++++++++ .../org/scribble/lang/MessageTransfer.java | 13 ++++++++++ .../main/java/org/scribble/lang/Protocol.java | 26 +++++++++++++++++++ .../java/org/scribble/lang/Recursion.java | 16 ++++++++++++ .../main/java/org/scribble/lang/SType.java | 6 ++++- .../src/main/java/org/scribble/lang/Seq.java | 25 ++++++++++++------ .../org/scribble/lang/global/GChoice.java | 8 ++++++ .../org/scribble/lang/global/GContinue.java | 6 +++++ .../java/org/scribble/lang/global/GDo.java | 6 +++++ .../org/scribble/lang/global/GProtocol.java | 18 +++---------- .../java/org/scribble/lang/global/GSeq.java | 19 ++++++++++++++ .../java/org/scribble/lang/global/GType.java | 5 ++-- .../java/org/scribble/lang/local/LChoice.java | 8 ++++++ .../org/scribble/lang/local/LProjection.java | 15 ++++------- .../org/scribble/lang/local/LProtocol.java | 25 +++++++----------- .../java/org/scribble/lang/local/LSeq.java | 19 ++++++++++++++ .../java/org/scribble/lang/local/LSkip.java | 12 +++++++++ .../java/org/scribble/lang/local/LType.java | 5 ++-- scribble-test/src/test/scrib/tmp/Test.scr | 8 ++++++ 23 files changed, 227 insertions(+), 62 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java b/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java index db1675196..505ddf93b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java @@ -57,7 +57,7 @@ public RoleDecl project(AstFactory af, Role self) { return af.SelfRoleDecl(name.source, rn); } - return af.RoleDecl(source, rn); + return af.RoleDecl(this.source, rn); } @Override diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 26d4b9b2a..92a86076a 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -161,7 +161,7 @@ else if (n instanceof MessageSigName) //Deque stack = new LinkedList<>(); STypeInliner i = new STypeInliner(this); i.pushSig(sig); // TODO: factor into constructor - GProtocol inlined = g.getInlined(i); + GProtocol inlined = g.getInlined(i); // Protocol.getInlined does pruneRecs debugPrintln("\nSubprotocols inlined:\n" + inlined); this.context.addInlined(g.fullname, inlined); } @@ -297,7 +297,7 @@ protected void runProjectionPasses() throws ScribbleException { for (Role self : g.roles) { - GProtocol inlined = this.context.getInlined(g.fullname); + GProtocol inlined = this.context.getInlined(g.fullname); // pruneRecs already done for pruneRecs (cf. runContextBuildingPasses) LProtocol iproj = inlined.projectInlined(self); // CHECKME: projection and inling commutative? this.context.addInlinedProjection(iproj.fullname, iproj); debugPrintln("\nProjected inlined onto " + self + ":\n" + iproj); @@ -309,7 +309,7 @@ protected void runProjectionPasses() throws ScribbleException { for (Role self : g.roles) { - LProtocol proj = g.project(new Projector(this, self)); + LProtocol proj = g.project(new Projector(this, self)); // Does pruneRecs this.context.addProjection(proj); debugPrintln("\nProjected onto " + self + ":\n" + proj); } @@ -357,7 +357,8 @@ public Map getProjections(GProtocolName fullname, List> ns = proj.getNonProtoDependencies(); - warningPrintln("\n[TODO] Full module projection and imports: " + warningPrintln(""); + warningPrintln("[TODO] Full module projection and imports: " + fullname + "@" + role); return Collections.emptyMap(); diff --git a/scribble-core/src/main/java/org/scribble/lang/Choice.java b/scribble-core/src/main/java/org/scribble/lang/Choice.java index 06be82ccf..32ea977f1 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Choice.java +++ b/scribble-core/src/main/java/org/scribble/lang/Choice.java @@ -9,6 +9,7 @@ import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.ProtocolName; +import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; public abstract class Choice> @@ -36,6 +37,13 @@ public Set getRoles() this.blocks.forEach(x -> res.addAll(x.getRoles())); return res; } + + @Override + public Set getRecVars() + { + return this.blocks.stream().flatMap(x -> x.getRecVars().stream()) + .collect(Collectors.toSet()); + } @Override public List> getProtoDependencies() diff --git a/scribble-core/src/main/java/org/scribble/lang/Continue.java b/scribble-core/src/main/java/org/scribble/lang/Continue.java index d802cb1d1..93c560b1d 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Continue.java +++ b/scribble-core/src/main/java/org/scribble/lang/Continue.java @@ -3,6 +3,8 @@ import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.ast.ProtocolKindNode; import org.scribble.type.kind.ProtocolKind; @@ -32,6 +34,12 @@ public Set getRoles() { return Collections.emptySet(); } + + @Override + public Set getRecVars() + { + return Stream.of(this.recvar).collect(Collectors.toSet()); + } @Override public List> getProtoDependencies() @@ -47,9 +55,16 @@ public List> getNonProtoDependencies() @Override public Continue substitute(Substitutions subs) + { + //return reconstruct(getSource(), this.recvar); + return this; + } + @Override + public Continue pruneRecs() { - return reconstruct(getSource(), this.recvar); + //return reconstruct(getSource(), this.recvar); + return this; } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/Do.java b/scribble-core/src/main/java/org/scribble/lang/Do.java index 273133a05..87688c636 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Do.java +++ b/scribble-core/src/main/java/org/scribble/lang/Do.java @@ -15,6 +15,7 @@ import org.scribble.type.name.MemberName; import org.scribble.type.name.MessageSigName; import org.scribble.type.name.ProtocolName; +import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; public abstract class Do> @@ -43,6 +44,12 @@ public Set getRoles() return this.roles.stream().collect(Collectors.toSet()); } + @Override + public Set getRecVars() + { + return Collections.emptySet(); + } + @Override public List> getProtoDependencies() { @@ -82,6 +89,12 @@ else if (a instanceof MessageSigName) args); } + @Override + public Do pruneRecs() + { + return this; + } + @Override public SType unfoldAllOnce(STypeUnfolder u) { diff --git a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java index 0931389c3..80bf5db16 100644 --- a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java @@ -17,6 +17,7 @@ import org.scribble.type.name.MessageSigName; import org.scribble.type.name.PayloadElemType; import org.scribble.type.name.ProtocolName; +import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; public abstract class MessageTransfer @@ -46,6 +47,12 @@ public Set getRoles() return Stream.of(this.src, this.dst).collect(Collectors.toSet()); } + @Override + public Set getRecVars() + { + return Collections.emptySet(); + } + @Override public List> getProtoDependencies() { @@ -93,6 +100,12 @@ public MessageTransfer substitute(Substitutions subs) return reconstruct(getSource(), subs.subsRole(this.src), msg, subs.subsRole(this.dst)); } + + @Override + public MessageTransfer pruneRecs() + { + return this; + } @Override public MessageTransfer getInlined(STypeInliner i) diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index 899b10574..0adf8b6c0 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -13,6 +13,7 @@ import org.scribble.type.name.MemberName; import org.scribble.type.name.MessageSigName; import org.scribble.type.name.ProtocolName; +import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; public abstract class Protocol, B extends Seq> @@ -57,6 +58,31 @@ public Set getRoles() { throw new RuntimeException("Unsupported for Protocol: " + this); } + + @Override + public Set getRecVars() + { + throw new RuntimeException("Unsupported for Protocol: " + this); + } + + @Override + public Protocol substitute(Substitutions subs) + { + // CHECKME: needed? + /*List roles = this.roles.stream().map(x -> subs.subsRole(x)) + .collect(Collectors.toList()); + List> params = this.params.stream().map(x -> ...) + .collect(Collectors.toList()); + return reconstruct(getSource(), this.mods, this.fullname, roles, + this.def.substitute(subs));*/ + throw new RuntimeException("Unsupported for Protocol: " + this); + } + + @Override + public Protocol pruneRecs() + { + throw new RuntimeException("Unsupported for Protocol: " + this); + } @Override public List> getProtoDependencies() diff --git a/scribble-core/src/main/java/org/scribble/lang/Recursion.java b/scribble-core/src/main/java/org/scribble/lang/Recursion.java index 807aa5d0e..067046586 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/Recursion.java @@ -4,6 +4,7 @@ import java.util.Set; import org.scribble.ast.ProtocolKindNode; +import org.scribble.lang.local.LSkip; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.ProtocolName; @@ -34,6 +35,21 @@ public Set getRoles() return this.body.getRoles(); } + @Override + public Set getRecVars() + { + return this.body.getRecVars(); + } + + @Override + public SType pruneRecs() + { + // Assumes no shadowing (e.g., use after inlining recvar disamb) + return this.body.getRecVars().contains(this.recvar) + ? this + : this.body; // i.e., return a Seq, to be "inlined" by Seq.pruneRecs -- N.B. must handle empty Seq case + } + @Override public List> getProtoDependencies() { diff --git a/scribble-core/src/main/java/org/scribble/lang/SType.java b/scribble-core/src/main/java/org/scribble/lang/SType.java index bfea0ecb5..e68f486fd 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SType.java +++ b/scribble-core/src/main/java/org/scribble/lang/SType.java @@ -7,11 +7,12 @@ import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.ProtocolName; +import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; // CHECKME: move to type.sess? // Generic works to "specialise" G/L subclasses (and works with immutable pattern) -- cf. not supported by contravariant method parameter subtyping for getters/setters -public interface SType +public interface SType // CHECKME: consider adding B extends Seq here { boolean hasSource(); // i.e., was parsed ProtocolKindNode getSource(); // Pre: hasSource @@ -21,6 +22,9 @@ public interface SType SType substitute(Substitutions subs); + Set getRecVars(); + SType pruneRecs(); // Assumes no shadowing (e.g., use after inlining recvar disamb) + // Top-level call should be on a GProtocol with an empty stack -- XXX // stack is treated mutably // Do stack.push to push the next sig onto the stack diff --git a/scribble-core/src/main/java/org/scribble/lang/Seq.java b/scribble-core/src/main/java/org/scribble/lang/Seq.java index f998b6e8e..7236cb20f 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Seq.java +++ b/scribble-core/src/main/java/org/scribble/lang/Seq.java @@ -1,6 +1,7 @@ package org.scribble.lang; import java.util.Collections; +import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -9,6 +10,7 @@ import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.ProtocolName; +import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; // Could add B extends STTypeBase, K>, but it inflates type params quite a bit (e.g., Protocol) @@ -32,6 +34,21 @@ public Set getRoles() return this.elems.stream().flatMap(x -> x.getRoles().stream()) .collect(Collectors.toSet()); } + + @Override + public Set getRecVars() + { + return this.elems.stream().flatMap(x -> x.getRecVars().stream()) + .collect(Collectors.toSet()); + } + + @Override + public Seq substitute(Substitutions subs) + { + List> elems = this.elems.stream() + .map(x -> x.substitute(subs)).collect(Collectors.toList()); + return reconstruct(getSource(), elems); + } @Override public List> getProtoDependencies() @@ -48,14 +65,6 @@ public List> getNonProtoDependencies() .collect(Collectors.toList()); } - @Override - public Seq substitute(Substitutions subs) - { - List> elems = this.elems.stream() - .map(x -> x.substitute(subs)).collect(Collectors.toList()); - return reconstruct(getSource(), elems); - } - public abstract List> getElements(); public boolean isEmpty() diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java index 5ce0dcf0b..fd0690d89 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -47,6 +47,14 @@ public GChoice substitute(Substitutions subs) return reconstruct(getSource(), subs.subsRole(this.subj), blocks); } + @Override + public GChoice pruneRecs() + { + List blocks = this.blocks.stream().map(x -> x.pruneRecs()) + .collect(Collectors.toList()); + return reconstruct(getSource(), this.subj, blocks); + } + @Override public GChoice getInlined(STypeInliner i )//GTypeTranslator t, Deque stack) { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java index 64322a573..fe950cab1 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java @@ -37,6 +37,12 @@ public GContinue substitute(Substitutions subs) return (GContinue) super.substitute(subs); } + @Override + public GContinue pruneRecs() + { + return (GContinue) super.pruneRecs(); + } + @Override public GContinue getInlined(STypeInliner i)//, Deque stack) { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index 118f0f6a6..45bcbdf88 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -46,6 +46,12 @@ public GDo substitute(Substitutions subs) return (GDo) super.substitute(subs); } + @Override + public GDo pruneRecs() + { + return (GDo) super.pruneRecs(); + } + // CHECKME: factor up to base? @Override public GType getInlined(STypeInliner i)//, Deque stack) diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index 4c7cf4b54..3b8b81e08 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -44,20 +44,8 @@ public GProtocol reconstruct(ProtocolDecl source, { return new GProtocol(source, mods, fullname, roles, params, def); } - - @Override - public GType substitute(Substitutions subs) - { - // CHECKME: needed? - /*List roles = this.roles.stream().map(x -> subs.subsRole(x)) - .collect(Collectors.toList()); - List> params = this.params.stream().map(x -> ...) - .collect(Collectors.toList()); - return reconstruct(getSource(), this.mods, this.fullname, roles, - this.def.substitute(subs));*/ - throw new RuntimeException("Unsupported for Protocol: " + this); - } + // CHECKME: drop from Protocol (after removing Protocol from SType?) // Pre: stack.peek is the sig for the calling Do (or top-level entry) // i.e., it gives the roles/args at the call-site @Override @@ -66,7 +54,7 @@ public GProtocol getInlined(STypeInliner i)//, Deque stack) SubprotoSig sig = i.peek(); Substitutions subs = new Substitutions(this.roles, sig.roles, this.params, sig.args); - GSeq body = this.def.substitute(subs).getInlined(i);//, stack); + GSeq body = this.def.substitute(subs).getInlined(i).pruneRecs(); RecVar rv = i.getInlinedRecVar(sig); GRecursion rec = new GRecursion(null, rv, body); // CHECKME: or protodecl source? GProtocolDecl source = getSource(); @@ -108,7 +96,7 @@ private LProjection projectAux(Role self, LSeq body) @Override public LProjection project(Projector v) { - LSeq body = (LSeq) this.def.project(v); + LSeq body = (LSeq) this.def.project(v).pruneRecs(); return projectAux(v.self, body); } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java index ba79a0835..e980cf232 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -44,6 +44,25 @@ public GSeq substitute(Substitutions subs) return (GSeq) super.substitute(subs); } + @Override + public GSeq pruneRecs() + { + List elems = new LinkedList<>(); + for (SType e : this.elems) + { + GType e1 = (GType) e.pruneRecs(); + if (e1 instanceof GSeq) // cf. Recursion::pruneRecs + { + elems.addAll(((GSeq) e1).getElements()); // Handles empty Seq case + } + else + { + elems.add(e1); + } + } + return reconstruct(getSource(), elems); + } + @Override public GSeq getInlined(STypeInliner i)// , Deque stack) { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GType.java b/scribble-core/src/main/java/org/scribble/lang/global/GType.java index d3e8f6231..e4f3a53cd 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GType.java @@ -8,7 +8,6 @@ import org.scribble.lang.SType; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.lang.local.LType; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -30,8 +29,8 @@ public interface GType extends SType Map checkExtChoiceConsistency(Map enablers) throws ScribbleException; - @Override - GType substitute(Substitutions subs); + /*@Override + GType substitute(Substitutions subs);*/ // Otherwise causes return type inconsistency with base abstract classes @Override GType getInlined(STypeInliner i);//, Deque stack); diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java index b9341dbf2..83da18336 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java @@ -55,6 +55,14 @@ public LChoice substitute(Substitutions subs) return reconstruct(getSource(), subs.subsRole(this.subj), blocks); } + @Override + public LChoice pruneRecs() + { + List blocks = this.blocks.stream().map(x -> x.pruneRecs()) + .collect(Collectors.toList()); + return reconstruct(getSource(), this.subj, blocks); + } + @Override public LChoice getInlined(STypeInliner i )//GTypeTranslator t, Deque stack) { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java index 57d0fa02c..cfa6624bd 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java @@ -5,6 +5,7 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.lang.ProtocolMod; +import org.scribble.lang.STypeInliner; import org.scribble.type.kind.Local; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.GProtocolName; @@ -43,19 +44,13 @@ public LType substitute(Substitutions subs) this.def.substitute(subs)); }*/ - /*// Pre: stack.peek is the sig for the calling Do (or top-level entry) + // Pre: stack.peek is the sig for the calling Do (or top-level entry) // i.e., it gives the roles/args at the call-site @Override - public LRecursion getInlined(STypeInliner i)//, Deque stack) + public LProjection getInlined(STypeInliner i) { - SubprotoSig sig = i.peek(); - Substitutions subs = new Substitutions(this.roles, sig.roles, this.params, - sig.args); - LSeq body = this.def.substitute(subs).getInlined(i);//, stack); - LProtocolDecl source = getSource(); // CHECKME: or empty source? - RecVar rv = i.makeRecVar(sig); - return new LRecursion(source, rv, body); - }*/ + throw new RuntimeException("[TODO]: " + this); + } /*@Override public LProtocolDecl getSource() diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index 5d398b084..70c58bc1b 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.ast.Constants; import org.scribble.ast.ProtocolDecl; @@ -57,31 +58,23 @@ public boolean isSingleConts(Set rvs) { throw new RuntimeException("Unsupported for LProtocol:\n" + this); } - - @Override - public LType substitute(Substitutions subs) - { - /*List roles = this.roles.stream().map(x -> subs.subsRole(x)) - .collect(Collectors.toList()); - List> params = this.params.stream().map(x -> ...) - .collect(Collectors.toList()); - return reconstruct(getSource(), this.mods, this.fullname, roles, params, - this.def.substitute(subs));*/ - throw new RuntimeException("Unsupported for LProtocol:\n" + this); - } + // CHECKME: drop from Protocol (after removing Protocol from SType?) // Pre: stack.peek is the sig for the calling Do (or top-level entry) // i.e., it gives the roles/args at the call-site @Override - public LRecursion getInlined(STypeInliner i)//, Deque stack) + public LProtocol getInlined(STypeInliner i)//, Deque stack) { SubprotoSig sig = i.peek(); Substitutions subs = new Substitutions(this.roles, sig.roles, this.params, sig.args); - LSeq body = this.def.substitute(subs).getInlined(i);//, stack); - LProtocolDecl source = getSource(); // CHECKME: or empty source? + LSeq body = this.def.substitute(subs).getInlined(i).pruneRecs(); RecVar rv = i.getInlinedRecVar(sig); - return new LRecursion(source, rv, body); + LRecursion rec = new LRecursion(null, rv, body); // CHECKME: or protodecl source? + LProtocolDecl source = getSource(); + LSeq def = new LSeq(null, Stream.of(rec).collect(Collectors.toList())); + return new LProtocol(source, this.mods, this.fullname, this.roles, + this.self, this.params, def); } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java index 3df208db6..35c7c4864 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java @@ -55,6 +55,25 @@ public LSeq substitute(Substitutions subs) return (LSeq) super.substitute(subs); } + @Override + public LSeq pruneRecs() + { + List elems = new LinkedList<>(); + for (SType e : this.elems) + { + LType e1 = (LType) e.pruneRecs(); + if (e1 instanceof LSeq) // cf. Recursion::pruneRecs + { + elems.addAll(((LSeq) e1).getElements()); // Handles empty Seq case + } + else + { + elems.add(e1); + } + } + return reconstruct(getSource(), elems); + } + @Override public LSeq getInlined(STypeInliner i)//, Deque stack) { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java index d0aa240b3..3842adbc4 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java @@ -29,6 +29,18 @@ public Set getRoles() { throw new RuntimeException("Unsupported for Skip: " + this); } + + @Override + public Set getRecVars() + { + throw new RuntimeException("Unsupported for Skip: " + this); + } + + @Override + public LSkip pruneRecs() + { + throw new RuntimeException("Unsupported for Skip: " + this); + } @Override public List> getProtoDependencies() diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LType.java b/scribble-core/src/main/java/org/scribble/lang/local/LType.java index c15f7d667..d17bb5436 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LType.java @@ -6,7 +6,6 @@ import org.scribble.lang.SType; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; @@ -21,8 +20,8 @@ public interface LType extends SType boolean isSingleConts(Set rvs); - @Override - LType substitute(Substitutions subs); + /*@Override + LType substitute(Substitutions subs);*/ // Otherwise causes return type inconsistency with base abstract classes @Override LType getInlined(STypeInliner i);//, Deque stack); diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 51f8fd997..93aa5f639 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -57,6 +57,13 @@ module tmp.Test; // TODO make test framework to check global-"proj"-via-taus matches actual proj -- matches mean language acceptance? +explicit global protocol Foo(role A, role B) +{ + connect A to B; +} + + +/* global protocol Foo(role A, role B, role C) { 1() from A to B; @@ -67,6 +74,7 @@ aux global protocol Bar(role D, role E) { 2() from D to E; } +//*/ /* From efe2f7f990ea0a840e6427589fdd95c207907d43 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 3 Apr 2019 17:30:49 +0100 Subject: [PATCH 155/539] Continued: refactoring explicit connections. --- .../java/org/scribble/ast/ConnectAction.java | 64 +++------- .../org/scribble/ast/DisconnectAction.java | 4 +- .../org/scribble/ast/MessageTransfer.java | 59 +-------- .../scribble/ast/SimpleInteractionNode.java | 1 + .../org/scribble/ast/global/GConnect.java | 42 +++---- .../org/scribble/del/global/GConnectDel.java | 19 +++ .../del/global/GMessageTransferDel.java | 32 ++--- .../org/scribble/lang/MessageTransfer.java | 116 ++---------------- .../java/org/scribble/lang/Recursion.java | 3 +- .../org/scribble/lang/global/GContinue.java | 2 +- .../lang/global/GMessageTransfer.java | 8 +- .../java/org/scribble/lang/local/LRcv.java | 4 +- .../java/org/scribble/lang/local/LSend.java | 5 +- .../org/scribble/parser/antlr/Scribble.g | 18 +-- .../parser/scribble/ScribTreeAdaptor.java | 4 + .../parser/scribble/del/DelDecorator.java | 8 +- .../parser/scribble/del/DelDecoratorImpl.java | 21 ++-- scribble-test/src/test/scrib/tmp/Test.scr | 24 +++- 18 files changed, 147 insertions(+), 287 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java b/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java index c27ca0214..18125e252 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java +++ b/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java @@ -13,16 +13,18 @@ */ package org.scribble.ast; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; -import org.scribble.visit.AstVisitor; -// TODO: factor with MessageTransfer -public abstract class ConnectAction extends SimpleInteractionNode +// TODO CHECKME: factor with MessageTransfer? +public abstract class ConnectAction + extends BaseInteractionNode { // ScribTreeAdaptor#create constructor public ConnectAction(Token t) @@ -42,57 +44,29 @@ public ConnectAction(ConnectAction node) this.dest = null; } - public abstract ConnectAction dupNode(); - - public MessageNode getMessageNodeChild() - { - return (MessageNode) getChild(0); - } - - public RoleNode getSourceChild() - { - return (RoleNode) getChild(1); - } - + // TODO: refactor public RoleNode getDestinationChild() { - return (RoleNode) getChild(2); - } - - public ConnectAction reconstruct(RoleNode src, MessageNode msg, RoleNode dest) - { - ConnectAction ca = dupNode(); - ca.addChild(msg); - ca.addChild(src); - ca.addChild(dest); - ScribDel del = del(); - ca.setDel(del); // No copy - return ca; - } - - @Override - public ConnectAction visitChildren(AstVisitor nv) - throws ScribbleException - { - RoleNode src = (RoleNode) visitChild(getSourceChild(), nv); - MessageNode msg = (MessageNode) visitChild(getMessageNodeChild(), nv); - RoleNode dest = (RoleNode) visitChild(getDestinationChild(), nv); - return reconstruct(src, msg, dest); + List dests = getDestinationChildren(); + if (dests.size() != 1) + { + throw new RuntimeException("Shouldn't get in here: " + this); + } + return dests.get(0); } + // Currently only used for toString, because current syntax allows "connect" with no explicit message protected boolean isUnitMessage() { - if (!this.msg.isMessageSigNode()) + MessageNode n = getMessageNodeChild(); + if (!n.isMessageSigNode()) { return false; } - MessageSigNode msn = (MessageSigNode) this.msg; + MessageSigNode msn = (MessageSigNode) n; return msn.getOpChild().isEmpty() && msn.getPayloadListChild().isEmpty(); } - @Override - public abstract String toString(); - @@ -110,7 +84,7 @@ protected boolean isUnitMessage() protected ConnectAction(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) //protected ConnectionAction(RoleNode src, RoleNode dest) { - super(source); + super(source, src, msg, Stream.of(dest).collect(Collectors.toList())); this.src = src; this.msg = msg; this.dest = dest; diff --git a/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java index cf93155f4..da10185b0 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java @@ -42,8 +42,6 @@ public DisconnectAction(DisconnectAction node) this.right = null; } - public abstract DisconnectAction dupNode(); - public RoleNode getLeftChild() { return (RoleNode) getChild(0); @@ -53,6 +51,8 @@ public RoleNode getRightChild() { return (RoleNode) getChild(1); } + + public abstract DisconnectAction dupNode(); public DisconnectAction reconstruct(RoleNode left, RoleNode right) { diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java index 1838e1880..c70a6464b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java @@ -15,18 +15,14 @@ import java.util.LinkedList; import java.util.List; -import java.util.stream.Collectors; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.Role; -import org.scribble.visit.AstVisitor; -public abstract class MessageTransfer extends SimpleInteractionNode +public abstract class MessageTransfer + extends BaseInteractionNode { // ScribTreeAdaptor#create constructor public MessageTransfer(Token t) @@ -45,57 +41,8 @@ public MessageTransfer(MessageTransfer node) this.msg = null; this.dests = null; } - - public MessageNode getMessageNodeChild() - { - return (MessageNode) getChild(0); - } - - public RoleNode getSourceChild() - { - return (RoleNode) getChild(1); - } - public List getDestinationChildren() - { - //return Collections.unmodifiableList(this.dests); - List cs = getChildren(); - return cs.subList(2, cs.size()).stream().map(x -> (RoleNode) x) - .collect(Collectors.toList()); - } - - public final List getDestinationRoles() - { - return getDestinationChildren().stream().map(rn -> rn.toName()) - .collect(Collectors.toList()); - } - public abstract MessageTransfer dupNode(); - - public MessageTransfer reconstruct(RoleNode src, MessageNode msg, - List dests) - { - MessageTransfer mt = dupNode(); - mt.addChild(msg); - mt.addChild(src); - mt.addChildren(dests); - ScribDel del = del(); - mt.setDel(del); // No copy - return mt; - } - - @Override - public MessageTransfer visitChildren(AstVisitor nv) throws ScribbleException - { - MessageNode msg = (MessageNode) visitChild(getMessageNodeChild(), nv); - RoleNode src = (RoleNode) visitChild(getSourceChild(), nv); - List dests = visitChildListWithClassEqualityCheck(this, - getDestinationChildren(), nv); - return reconstruct(src, msg, dests); - } - - @Override - public abstract String toString(); @@ -116,7 +63,7 @@ public MessageTransfer visitChildren(AstVisitor nv) throws ScribbleException protected MessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List dests) { - super(source); + super(source, src, msg, dests); this.src = src; this.msg = msg; this.dests = new LinkedList<>(dests); // CHECKME: Collections.unmodifiable? diff --git a/scribble-core/src/main/java/org/scribble/ast/SimpleInteractionNode.java b/scribble-core/src/main/java/org/scribble/ast/SimpleInteractionNode.java index 8c5e0f1e9..abc9c4904 100644 --- a/scribble-core/src/main/java/org/scribble/ast/SimpleInteractionNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/SimpleInteractionNode.java @@ -18,6 +18,7 @@ import org.scribble.type.kind.ProtocolKind; // Name should be read (Simple ( InteractionNode )) +// FIXME: rename: Continue/Do aren't really interactions public abstract class SimpleInteractionNode extends ScribNodeBase implements InteractionNode { diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java b/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java index 735930126..d2e2938b8 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java @@ -21,7 +21,6 @@ import org.scribble.ast.MessageNode; import org.scribble.ast.local.LNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.ScribDel; import org.scribble.type.kind.Global; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; @@ -41,6 +40,12 @@ public GConnect(GConnect node) { super(node); } + + @Override + public GConnect dupNode() + { + return new GConnect(this); + } public LNode project(AstFactory af, Role self) { @@ -76,22 +81,6 @@ public LNode project(AstFactory af, Role self) } return proj; } - - public GConnect dupNode() - { - return new GConnect(this); - } - - @Override - public GConnect reconstruct(RoleNode src, MessageNode msg, RoleNode dest) - //public GConnect reconstruct(RoleNode src, RoleNode dest) - { - ScribDel del = del(); - GConnect gc = new GConnect(this.source, src, msg, dest); - //GConnect gc = new GConnect(src, dest); - gc = (GConnect) gc.del(del); - return gc; - } @Override public String toString() @@ -99,15 +88,7 @@ public String toString() return (isUnitMessage() ? "" : getMessageNodeChild() + " ") + Constants.CONNECT_KW + " " + getSourceChild() + " " + Constants.TO_KW + " " + getDestinationChild() + ";"; - //return Constants.CONNECT_KW + " " + this.src + " " + Constants.TO_KW + " " + this.dest + ";"; } - - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public Global getKind() - { - return GSimpleInteractionNode.super.getKind(); - }*/ @@ -146,4 +127,15 @@ public GConnect clone(AstFactory af) return af.GConnect(this.source, src, msg, dest); //return AstFactoryImpl.FACTORY.GConnect(src, dest); }*/ + + /*@Override + public GConnect reconstruct(MessageNode msg, RoleNode src, RoleNode dest) + //public GConnect reconstruct(RoleNode src, RoleNode dest) + { + ScribDel del = del(); + GConnect gc = new GConnect(this.source, src, msg, dest); + //GConnect gc = new GConnect(src, dest); + gc = (GConnect) gc.del(del); + return gc; + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java index e445eb30b..7de0968ed 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java @@ -13,6 +13,8 @@ */ package org.scribble.del.global; +import java.util.List; + import org.scribble.ast.MessageNode; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GConnect; @@ -20,6 +22,7 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ConnectionActionDel; import org.scribble.job.ScribbleException; +import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.Message; import org.scribble.type.name.Role; import org.scribble.visit.context.Projector; @@ -44,6 +47,22 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, Role dest = gc.dest.toName();*/ return gc; } + + @Override + public org.scribble.lang.global.GConnect translate(ScribNode n, + GTypeTranslator t) throws ScribbleException + { + GConnect source = (GConnect) n; + Role src = source.getSourceChild().toName(); + List ds = source.getDestinationChildren(); + if (ds.size() > 1) + { + throw new RuntimeException("TODO: multiple destination roles: " + source); + } + Role dst = ds.get(0).toName(); + Message msg = source.getMessageNodeChild().toMessage(); + return new org.scribble.lang.global.GConnect(source, src, msg, dst); + } @Override public GConnect leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, diff --git a/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java index 75c3cf7e0..7ec32d955 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -36,22 +36,6 @@ public GMessageTransferDel() { } - - @Override - public org.scribble.lang.global.GMessageTransfer translate(ScribNode n, - GTypeTranslator t) throws ScribbleException - { - GMessageTransfer source = (GMessageTransfer) n; - Role src = source.getSourceChild().toName(); - List ds = source.getDestinationChildren(); - if (ds.size() > 1) - { - throw new RuntimeException("TODO: multiple destination roles: " + source); - } - Role dst = ds.get(0).toName(); - Message msg = source.getMessageNodeChild().toMessage(); - return new org.scribble.lang.global.GMessageTransfer(source, src, msg, dst); - } @Override public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, @@ -68,6 +52,22 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, } return gmt; } + + @Override + public org.scribble.lang.global.GMessageTransfer translate(ScribNode n, + GTypeTranslator t) throws ScribbleException + { + GMessageTransfer source = (GMessageTransfer) n; + Role src = source.getSourceChild().toName(); + List ds = source.getDestinationChildren(); + if (ds.size() > 1) + { + throw new RuntimeException("TODO: multiple destination roles: " + source); + } + Role dst = ds.get(0).toName(); + Message msg = source.getMessageNodeChild().toMessage(); + return new org.scribble.lang.global.GMessageTransfer(source, src, msg, dst); + } @Override public GMessageTransfer leaveInlinedWFChoiceCheck(ScribNode parent, diff --git a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java index 80bf5db16..0d6489fe0 100644 --- a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java @@ -1,11 +1,7 @@ package org.scribble.lang; -import java.util.Collections; import java.util.LinkedList; import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.scribble.type.Message; import org.scribble.type.MessageSig; @@ -16,47 +12,15 @@ import org.scribble.type.name.MemberName; import org.scribble.type.name.MessageSigName; import org.scribble.type.name.PayloadElemType; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; public abstract class MessageTransfer - extends STypeBase implements SType + extends Interaction { - public final Role src; - public final Message msg; - public final Role dst; - - public MessageTransfer(org.scribble.ast.MessageTransfer source, Role src, - Message msg, Role dst) - { - super(source); - this.src = src; - this.msg = msg; - this.dst = dst; - } - - public abstract MessageTransfer reconstruct( - org.scribble.ast.MessageTransfer source, Role src, Message msg, - Role dst); - - @Override - public Set getRoles() - { - // Inlcudes self - return Stream.of(this.src, this.dst).collect(Collectors.toSet()); - } - - @Override - public Set getRecVars() + public MessageTransfer(org.scribble.ast.BaseInteractionNode source, // BaseInteractionNode not ideal + Role src, Message msg, Role dst) { - return Collections.emptySet(); - } - - @Override - public List> getProtoDependencies() - { - return Collections.emptyList(); + super(source, src, msg, dst); } @Override @@ -80,76 +44,12 @@ else if (p.isGDelegationType()) // TODO FIXME: should be projected to local nam { res.add(((GDelegationType) p).getGlobalProtocol()); } + else + { + throw new RuntimeException("[TODO]: " + this); + } } } return res; } - - @Override - public MessageTransfer substitute(Substitutions subs) - { - Message msg = this.msg; - if (msg instanceof MemberName) - { - MemberName n = (MemberName) msg; - if (subs.hasArg(n)) - { - msg = (Message) subs.subsArg(n); - } - } - return reconstruct(getSource(), subs.subsRole(this.src), msg, - subs.subsRole(this.dst)); - } - - @Override - public MessageTransfer pruneRecs() - { - return this; - } - - @Override - public MessageTransfer getInlined(STypeInliner i) - { - return this; - } - - @Override - public org.scribble.ast.MessageTransfer getSource() - { - return (org.scribble.ast.MessageTransfer) super.getSource(); - } - - @Override - public String toString() - { - return this.msg + " from " + this.src + " to " + this.dst + ";"; - } - - @Override - public int hashCode() - { - int hash = 17; - hash = 31 * hash + super.hashCode(); - hash = 31 * hash + this.src.hashCode(); - hash = 31 * hash + this.msg.hashCode(); - hash = 31 * hash + this.dst.hashCode(); - return hash; - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof MessageTransfer)) - { - return false; - } - MessageTransfer them = (MessageTransfer) o; - return super.equals(this) // Does canEquals - && this.src.equals(them.src) && this.msg.equals(them.msg) - && this.dst.equals(them.dst); - } } diff --git a/scribble-core/src/main/java/org/scribble/lang/Recursion.java b/scribble-core/src/main/java/org/scribble/lang/Recursion.java index 067046586..8e5532faa 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/Recursion.java @@ -4,7 +4,6 @@ import java.util.Set; import org.scribble.ast.ProtocolKindNode; -import org.scribble.lang.local.LSkip; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.ProtocolName; @@ -44,7 +43,7 @@ public Set getRecVars() @Override public SType pruneRecs() { - // Assumes no shadowing (e.g., use after inlining recvar disamb) + // Assumes no shadowing (e.g., use after SType#getInlined recvar disamb) return this.body.getRecVars().contains(this.recvar) ? this : this.body; // i.e., return a Seq, to be "inlined" by Seq.pruneRecs -- N.B. must handle empty Seq case diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java index fe950cab1..010c044d3 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java @@ -66,7 +66,7 @@ public LContinue projectInlined(Role self) @Override public LContinue project(Projector v) { - return projectInlined(v.self); + return projectInlined(v.self); // No need for "aux", no recursive call } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java index 2f206b5cf..260d8434f 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java @@ -24,7 +24,7 @@ public class GMessageTransfer extends MessageTransfer implements GType { - public GMessageTransfer(org.scribble.ast.MessageTransfer source, + public GMessageTransfer(org.scribble.ast.BaseInteractionNode source, Role src, Message msg, Role dst) { super(source, src, msg, dst); @@ -32,7 +32,7 @@ public GMessageTransfer(org.scribble.ast.MessageTransfer source, @Override public GMessageTransfer reconstruct( - org.scribble.ast.MessageTransfer source, Role src, Message msg, + org.scribble.ast.BaseInteractionNode source, Role src, Message msg, Role dst) { return new GMessageTransfer(source, src, msg, dst); @@ -63,7 +63,7 @@ public LType projectInlined(Role self) { /*if (this.dst.equals(self)) { - // Already checked? + // CHECKME: already checked? }*/ return new LSend(null, this.msg, this.dst); } @@ -80,7 +80,7 @@ else if (this.dst.equals(self)) @Override public LType project(Projector v) { - return projectInlined(v.self); + return projectInlined(v.self); // No need for "aux", no recursive call } @Override diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java b/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java index 3898baa99..c05d743ac 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java @@ -21,7 +21,7 @@ public class LRcv extends MessageTransfer { // this.dst == Role.SELF - public LRcv(org.scribble.ast.MessageTransfer source, + public LRcv(org.scribble.ast.BaseInteractionNode source, Role src, Message msg) { super(source, src, msg, Role.SELF); @@ -30,7 +30,7 @@ public LRcv(org.scribble.ast.MessageTransfer source, // FIXME: unnecessary dst @Override public LRcv reconstruct( - org.scribble.ast.MessageTransfer source, Role src, Message msg, + org.scribble.ast.BaseInteractionNode source, Role src, Message msg, Role dst) { return new LRcv(source, src, msg); diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSend.java b/scribble-core/src/main/java/org/scribble/lang/local/LSend.java index 00b7fe0db..b30267835 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSend.java @@ -21,7 +21,7 @@ public class LSend extends MessageTransfer { // this.src == Role.SELF - public LSend(org.scribble.ast.MessageTransfer source, + public LSend(org.scribble.ast.BaseInteractionNode source, Message msg, Role dst) { super(source, Role.SELF, msg, dst); @@ -30,7 +30,7 @@ public LSend(org.scribble.ast.MessageTransfer source, // CHECKME: remove unnecessary src ? @Override public LSend reconstruct( - org.scribble.ast.MessageTransfer source, Role src, Message msg, + org.scribble.ast.BaseInteractionNode source, Role src, Message msg, Role dst) { return new LSend(source, msg, dst); @@ -74,6 +74,7 @@ public void buildGraph(EGraphBuilderUtil2 b) Payload payload = this.msg.isMessageSig() // CHECKME: generalise? (e.g., hasPayload) ? ((MessageSig) msg).payload : Payload.EMPTY_PAYLOAD; + // TODO: add toAction method to base Interaction b.addEdge(b.getEntry(), b.ef.newESend(peer, mid, payload), b.getExit()); } diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 8c771fb7a..cb3196b16 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -763,6 +763,7 @@ globalmessagetransfer: -> ^(GLOBALMESSAGETRANSFER message rolenamenode+) ; +// TODO: multisend rolenamenode: rolename @@ -783,13 +784,14 @@ message: globalconnect: //message CONNECT_KW rolename TO_KW rolename - CONNECT_KW rolename TO_KW rolename ';' + CONNECT_KW rolenamenode TO_KW rolenamenode ';' -> - ^(GLOBALCONNECT rolename rolename ^(MESSAGESIGNATURE EMPTY_OPERATOR ^(PAYLOAD))) // Empty message sig duplicated from messagesignature + ^(GLOBALCONNECT ^(MESSAGESIGNATURE ^(OPNAME EMPTY_OPERATOR) ^(PAYLOAD)) rolenamenode rolenamenode) // cf. messagesignature "()" case + // CHECKME: require "()" as for message transfers? i.e., simply delete this rule? | - message CONNECT_KW rolename TO_KW rolename ';' + message CONNECT_KW rolenamenode TO_KW rolenamenode ';' -> - ^(GLOBALCONNECT rolename rolename message) + ^(GLOBALCONNECT message rolenamenode rolenamenode) ; /* '(' connectdecl (',' connectdecl)* ')' -> @@ -805,16 +807,16 @@ globalconnect: ;*/ globaldisconnect: - DISCONNECT_KW rolename AND_KW rolename ';' + DISCONNECT_KW rolenamenode AND_KW rolenamenode ';' -> - ^(GLOBALDISCONNECT rolename rolename ) + ^(GLOBALDISCONNECT rolenamenode rolenamenode) ; globalwrap: //message CONNECT_KW rolename TO_KW rolename - WRAP_KW rolename TO_KW rolename ';' + WRAP_KW rolenamnode TO_KW rolenamnode ';' -> - ^(GLOBALWRAP rolename rolename) + ^(GLOBALWRAP rolenamnode rolenamnode) ; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 77194d3a3..14b6a80bd 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -26,7 +26,9 @@ import org.scribble.ast.SigParamDecl; import org.scribble.ast.TypeParamDecl; import org.scribble.ast.global.GChoice; +import org.scribble.ast.global.GConnect; import org.scribble.ast.global.GContinue; +import org.scribble.ast.global.GDisconnect; import org.scribble.ast.global.GDo; import org.scribble.ast.global.GInteractionSeq; import org.scribble.ast.global.GMessageTransfer; @@ -113,6 +115,8 @@ public Object create(Token t) case "GLOBALINTERACTIONSEQUENCE": return new GInteractionSeq(t); case "GLOBALMESSAGETRANSFER": return new GMessageTransfer(t); + case "GLOBALCONNECT": return new GConnect(t); + case "GLOBALDISCONNECT": return new GDisconnect(t); case "GLOBALCHOICE": return new GChoice(t); case "GLOBALRECURSION": return new GRecursion(t); case "GLOBALCONTINUE": return new GContinue(t); diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java index 26cf7d769..1b33141b2 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java @@ -35,7 +35,9 @@ import org.scribble.ast.TypeParamDecl; import org.scribble.ast.UnaryPayloadElem; import org.scribble.ast.global.GChoice; +import org.scribble.ast.global.GConnect; import org.scribble.ast.global.GContinue; +import org.scribble.ast.global.GDisconnect; import org.scribble.ast.global.GDo; import org.scribble.ast.global.GInteractionSeq; import org.scribble.ast.global.GMessageTransfer; @@ -90,9 +92,9 @@ public interface DelDecorator void GInteractionSeq(GInteractionSeq n); void GMessageTransfer(GMessageTransfer n); - /*GConnect GConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest); - GDisconnect GDisconnect(CommonTree source, RoleNode src, RoleNode dest); - GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest);*/ + void GConnect(GConnect n); + void GDisconnect(GDisconnect n); + /*GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest);*/ void GChoice(GChoice n); void GRecursion(GRecursion n); void GContinue(GContinue n); diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java index 07dbeb32c..731bd9dd1 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java @@ -39,7 +39,9 @@ import org.scribble.ast.TypeParamDecl; import org.scribble.ast.UnaryPayloadElem; import org.scribble.ast.global.GChoice; +import org.scribble.ast.global.GConnect; import org.scribble.ast.global.GContinue; +import org.scribble.ast.global.GDisconnect; import org.scribble.ast.global.GDo; import org.scribble.ast.global.GInteractionSeq; import org.scribble.ast.global.GMessageTransfer; @@ -71,7 +73,9 @@ import org.scribble.del.RoleDeclListDel; import org.scribble.del.ScribDel; import org.scribble.del.global.GChoiceDel; +import org.scribble.del.global.GConnectDel; import org.scribble.del.global.GContinueDel; +import org.scribble.del.global.GDisconnectDel; import org.scribble.del.global.GDoDel; import org.scribble.del.global.GInteractionSeqDel; import org.scribble.del.global.GMessageTransferDel; @@ -267,24 +271,19 @@ public void GMessageTransfer(GMessageTransfer gmt) setDel(gmt, new GMessageTransferDel()); } - /*@Override - public GConnect GConnect(GConnect gc) + @Override + public void GConnect(GConnect n) { - GConnect gc = new GConnect(source, src, msg, dest); - gc = setDel(gc, new GConnectDel()); - return gc; + setDel(n, new GConnectDel()); } @Override - public GDisconnect GDisconnect(CommonTree source, RoleNode src, RoleNode dest) + public void GDisconnect(GDisconnect n) { - GDisconnect gc = new GDisconnect(source, //UnitMessageSigNode(), - src, dest); - gc = setDel(gc, new GDisconnectDel()); - return gc; + setDel(n, new GDisconnectDel()); } - @Override + /*@Override public GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest) { GWrap gw = new GWrap(source, UnitMessageSigNode(), src, dest); diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 93aa5f639..0b4d04861 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -40,9 +40,11 @@ module tmp.Test; //------------- +//- drop unused recs -- partly done by inlining, but not done yet for subprotos + //- projection dependencies (projections as modules?) //- check projected role/choice/do pruning/fixing? -- applies only to above proj? (i.e., proto decls) -- CHECKME: can do role fixing by getting roles from iproj? similarly do-pruning? -//- drop unused recs -- partly done by inlining, but not done yet for subprotos + //- connections //- refactor ast to parser, refactor lang to type? -- separate protocol classes? //- or: ast/del to new lang -- core lang to type, except protocol @@ -57,9 +59,27 @@ module tmp.Test; // TODO make test framework to check global-"proj"-via-taus matches actual proj -- matches mean language acceptance? -explicit global protocol Foo(role A, role B) +/* +explicit global protocol Foo(role A, role B, role C) { connect A to B; + choice at A + { + 1() from A to B; + } + or + { + 2() from A to B; + connect A to C; + 3() from A to C; + } +} +//*/ + + +explicit global protocol Foo(role A, role B) +{ + 1() from A to B; } From 77418b4d097bea93ef0377ed704b13fc001734db Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 3 Apr 2019 19:30:28 +0100 Subject: [PATCH 156/539] Continued: refactored basic/direction interactions and session nodes; and added SType disconnect. --- .../java/org/scribble/ast/AstFactory.java | 8 +- .../java/org/scribble/ast/AstFactoryImpl.java | 8 +- ...ractionNode.java => BasicInteraction.java} | 18 ++- .../main/java/org/scribble/ast/Choice.java | 2 +- .../org/scribble/ast/CompoundInteraction.java | 10 +- .../java/org/scribble/ast/CompoundNode.java | 46 ++++++ .../java/org/scribble/ast/ConnectAction.java | 2 +- .../main/java/org/scribble/ast/Continue.java | 2 +- .../org/scribble/ast/DirectedInteraction.java | 131 ++++++++++++++++ .../org/scribble/ast/DisconnectAction.java | 2 +- .../src/main/java/org/scribble/ast/Do.java | 2 +- .../java/org/scribble/ast/InteractionSeq.java | 14 +- .../org/scribble/ast/MessageTransfer.java | 2 +- .../main/java/org/scribble/ast/Parallel.java | 121 --------------- .../java/org/scribble/ast/ProtocolBlock.java | 2 +- .../main/java/org/scribble/ast/Recursion.java | 2 +- ...{InteractionNode.java => SessionNode.java} | 3 +- ...actionNode.java => SimpleSessionNode.java} | 10 +- .../java/org/scribble/ast/global/GChoice.java | 2 +- ...ionNode.java => GCompoundInteraction.java} | 2 +- .../org/scribble/ast/global/GConnect.java | 2 +- .../org/scribble/ast/global/GContinue.java | 2 +- .../org/scribble/ast/global/GDisconnect.java | 3 +- .../java/org/scribble/ast/global/GDo.java | 2 +- .../scribble/ast/global/GInteractionSeq.java | 10 +- .../scribble/ast/global/GMessageTransfer.java | 8 +- .../org/scribble/ast/global/GRecursion.java | 8 +- ...InteractionNode.java => GSessionNode.java} | 4 +- ...ctionNode.java => GSimpleSessionNode.java} | 2 +- .../java/org/scribble/ast/global/GWrap.java | 2 +- .../java/org/scribble/ast/local/LAccept.java | 6 +- .../java/org/scribble/ast/local/LChoice.java | 6 +- ...ionNode.java => LCompoundInteraction.java} | 2 +- .../scribble/ast/local/LConnectionAction.java | 2 +- .../org/scribble/ast/local/LContinue.java | 6 +- .../org/scribble/ast/local/LDisconnect.java | 6 +- .../main/java/org/scribble/ast/local/LDo.java | 6 +- .../scribble/ast/local/LInteractionSeq.java | 8 +- .../scribble/ast/local/LMessageTransfer.java | 2 +- .../java/org/scribble/ast/local/LReceive.java | 6 +- .../org/scribble/ast/local/LRecursion.java | 6 +- .../java/org/scribble/ast/local/LRequest.java | 6 +- .../java/org/scribble/ast/local/LSend.java | 6 +- ...InteractionNode.java => LSessionNode.java} | 8 +- ...ctionNode.java => LSimpleSessionNode.java} | 2 +- .../org/scribble/ast/local/LWrapClient.java | 6 +- .../org/scribble/ast/local/LWrapServer.java | 6 +- .../main/java/org/scribble/del/ChoiceDel.java | 2 +- .../scribble/del/CompoundInteractionDel.java | 99 ++++++++---- .../del/CompoundInteractionNodeDel.java | 125 --------------- .../scribble/del/CompoundSessionNodeDel.java | 84 +++++++++++ .../org/scribble/del/ConnectionActionDel.java | 2 +- .../java/org/scribble/del/ContinueDel.java | 2 +- .../src/main/java/org/scribble/del/DoDel.java | 2 +- .../org/scribble/del/MessageTransferDel.java | 2 +- .../org/scribble/del/ProtocolBlockDel.java | 2 +- .../java/org/scribble/del/RecursionDel.java | 2 +- ...NodeDel.java => SimpleSessionNodeDel.java} | 2 +- .../org/scribble/del/global/GConnectDel.java | 3 +- .../scribble/del/global/GDisconnectDel.java | 14 +- .../del/global/GInteractionSeqDel.java | 20 +-- .../local/LCompoundInteractionNodeDel.java | 6 +- .../del/local/LInteractionNodeDel.java | 6 +- .../del/local/LInteractionSeqDel.java | 20 +-- .../main/java/org/scribble/job/JobConfig.java | 2 +- .../org/scribble/lang/BasicInteraction.java | 48 ++++++ .../java/org/scribble/lang/ConnectAction.java | 54 +++++++ .../scribble/lang/DirectedInteraction.java | 89 +++++++++++ .../org/scribble/lang/DisconnectAction.java | 82 ++++++++++ .../org/scribble/lang/MessageTransfer.java | 4 +- .../org/scribble/lang/global/GConnect.java | 142 ++++++++++++++++++ .../org/scribble/lang/global/GDisconnect.java | 128 ++++++++++++++++ .../lang/global/GMessageTransfer.java | 4 +- .../java/org/scribble/lang/global/GType.java | 4 + .../java/org/scribble/lang/local/LAcc.java | 121 +++++++++++++++ .../org/scribble/lang/local/LDisconnect.java | 117 +++++++++++++++ .../java/org/scribble/lang/local/LRcv.java | 4 +- .../java/org/scribble/lang/local/LReq.java | 122 +++++++++++++++ .../java/org/scribble/lang/local/LSend.java | 4 +- .../context/ProjectedChoiceDoPruner.java | 4 +- .../UnguardedChoiceDoProjectionChecker.java | 4 +- .../ast/global/AntlrGInteractionSequence.java | 6 +- scribble-test/src/test/scrib/tmp/Test.scr | 4 + 83 files changed, 1423 insertions(+), 435 deletions(-) rename scribble-core/src/main/java/org/scribble/ast/{CompoundInteractionNode.java => BasicInteraction.java} (71%) create mode 100644 scribble-core/src/main/java/org/scribble/ast/CompoundNode.java create mode 100644 scribble-core/src/main/java/org/scribble/ast/DirectedInteraction.java delete mode 100644 scribble-core/src/main/java/org/scribble/ast/Parallel.java rename scribble-core/src/main/java/org/scribble/ast/{InteractionNode.java => SessionNode.java} (84%) rename scribble-core/src/main/java/org/scribble/ast/{SimpleInteractionNode.java => SimpleSessionNode.java} (78%) rename scribble-core/src/main/java/org/scribble/ast/global/{GSimpleInteractionNode.java => GCompoundInteraction.java} (90%) rename scribble-core/src/main/java/org/scribble/ast/global/{GInteractionNode.java => GSessionNode.java} (88%) rename scribble-core/src/main/java/org/scribble/ast/global/{GCompoundInteractionNode.java => GSimpleSessionNode.java} (90%) rename scribble-core/src/main/java/org/scribble/ast/local/{LCompoundInteractionNode.java => LCompoundInteraction.java} (90%) rename scribble-core/src/main/java/org/scribble/ast/local/{LInteractionNode.java => LSessionNode.java} (84%) rename scribble-core/src/main/java/org/scribble/ast/local/{LSimpleInteractionNode.java => LSimpleSessionNode.java} (90%) delete mode 100644 scribble-core/src/main/java/org/scribble/del/CompoundInteractionNodeDel.java create mode 100644 scribble-core/src/main/java/org/scribble/del/CompoundSessionNodeDel.java rename scribble-core/src/main/java/org/scribble/del/{SimpleInteractionNodeDel.java => SimpleSessionNodeDel.java} (92%) create mode 100644 scribble-core/src/main/java/org/scribble/lang/BasicInteraction.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/ConnectAction.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/DirectedInteraction.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/DisconnectAction.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/global/GConnect.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/global/GDisconnect.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LAcc.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LDisconnect.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LReq.java diff --git a/scribble-core/src/main/java/org/scribble/ast/AstFactory.java b/scribble-core/src/main/java/org/scribble/ast/AstFactory.java index 491325a23..2265328a3 100644 --- a/scribble-core/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-core/src/main/java/org/scribble/ast/AstFactory.java @@ -22,7 +22,7 @@ import org.scribble.ast.global.GDelegationElem; import org.scribble.ast.global.GDisconnect; import org.scribble.ast.global.GDo; -import org.scribble.ast.global.GInteractionNode; +import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GInteractionSeq; import org.scribble.ast.global.GMessageTransfer; import org.scribble.ast.global.GProtocolBlock; @@ -37,7 +37,7 @@ import org.scribble.ast.local.LDelegationElem; import org.scribble.ast.local.LDisconnect; import org.scribble.ast.local.LDo; -import org.scribble.ast.local.LInteractionNode; +import org.scribble.ast.local.LSessionNode; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProjectionDecl; import org.scribble.ast.local.LProtocolBlock; @@ -129,7 +129,7 @@ NonRoleParamDecl NonRoleParamDecl( GProtocolBlock GProtocolBlock(CommonTree source, GInteractionSeq gis); GInteractionSeq GInteractionSeq(CommonTree source, - List gis); + List gis); GMessageTransfer GMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List dests); @@ -193,7 +193,7 @@ LProtocolHeader LProtocolHeader(CommonTree source, LProtocolNameNode name, LProtocolBlock LProtocolBlock(CommonTree source, LInteractionSeq seq); LInteractionSeq LInteractionSeq(CommonTree source, - List actions); + List actions); LSend LSend(CommonTree source, RoleNode src, MessageNode msg, List dests); diff --git a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java index 782842587..3c961072a 100644 --- a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -24,7 +24,7 @@ import org.scribble.ast.global.GDelegationElem; import org.scribble.ast.global.GDisconnect; import org.scribble.ast.global.GDo; -import org.scribble.ast.global.GInteractionNode; +import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GInteractionSeq; import org.scribble.ast.global.GMessageTransfer; import org.scribble.ast.global.GProtocolBlock; @@ -39,7 +39,7 @@ import org.scribble.ast.local.LDelegationElem; import org.scribble.ast.local.LDisconnect; import org.scribble.ast.local.LDo; -import org.scribble.ast.local.LInteractionNode; +import org.scribble.ast.local.LSessionNode; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProjectionDecl; import org.scribble.ast.local.LProtocolBlock; @@ -341,7 +341,7 @@ public GProtocolBlock GProtocolBlock(CommonTree source, GInteractionSeq seq) @Override public GInteractionSeq GInteractionSeq(CommonTree source, - List actions) + List actions) { GInteractionSeq gis = new GInteractionSeq(source, actions); gis = del(gis, new GInteractionSeqDel()); @@ -628,7 +628,7 @@ public LProtocolBlock LProtocolBlock(CommonTree source, LInteractionSeq seq) @Override public LInteractionSeq LInteractionSeq(CommonTree source, - List actions) + List actions) { LInteractionSeq lis = new LInteractionSeq(source, actions); lis = del(lis, new LInteractionSeqDel()); diff --git a/scribble-core/src/main/java/org/scribble/ast/CompoundInteractionNode.java b/scribble-core/src/main/java/org/scribble/ast/BasicInteraction.java similarity index 71% rename from scribble-core/src/main/java/org/scribble/ast/CompoundInteractionNode.java rename to scribble-core/src/main/java/org/scribble/ast/BasicInteraction.java index d04b6f5ab..a4ee60320 100644 --- a/scribble-core/src/main/java/org/scribble/ast/CompoundInteractionNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/BasicInteraction.java @@ -17,22 +17,20 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.ProtocolKind; -// Name should be read (Compound ( InteractionNode )) -public abstract class CompoundInteractionNode - extends CompoundInteraction implements InteractionNode +public abstract class BasicInteraction + extends SimpleSessionNode { // ScribTreeAdaptor#create constructor - public CompoundInteractionNode(Token t) + public BasicInteraction(Token t) { super(t); } // Tree#dupNode constructor - protected CompoundInteractionNode(CompoundInteractionNode node) + public BasicInteraction(BasicInteraction node) { super(node); } - @@ -43,8 +41,14 @@ protected CompoundInteractionNode(CompoundInteractionNode node) - protected CompoundInteractionNode(CommonTree source) + + + + + protected BasicInteraction(CommonTree source) { super(source); } + } + diff --git a/scribble-core/src/main/java/org/scribble/ast/Choice.java b/scribble-core/src/main/java/org/scribble/ast/Choice.java index cf13e3807..832dd8d0f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Choice.java +++ b/scribble-core/src/main/java/org/scribble/ast/Choice.java @@ -25,7 +25,7 @@ import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; -public abstract class Choice extends CompoundInteractionNode +public abstract class Choice extends CompoundInteraction { // ScribTreeAdaptor#create constructor public Choice(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/CompoundInteraction.java b/scribble-core/src/main/java/org/scribble/ast/CompoundInteraction.java index 845c4621c..9793c7311 100644 --- a/scribble-core/src/main/java/org/scribble/ast/CompoundInteraction.java +++ b/scribble-core/src/main/java/org/scribble/ast/CompoundInteraction.java @@ -15,9 +15,11 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.type.kind.ProtocolKind; -// ProtocolBlock or CompoundInteractionNode -public abstract class CompoundInteraction extends ScribNodeBase +// Name should be read (Compound ( InteractionNode )) +public abstract class CompoundInteraction + extends CompoundNode implements SessionNode { // ScribTreeAdaptor#create constructor public CompoundInteraction(Token t) @@ -39,7 +41,9 @@ protected CompoundInteraction(CompoundInteraction node) - public CompoundInteraction(CommonTree source) + + + protected CompoundInteraction(CommonTree source) { super(source); } diff --git a/scribble-core/src/main/java/org/scribble/ast/CompoundNode.java b/scribble-core/src/main/java/org/scribble/ast/CompoundNode.java new file mode 100644 index 000000000..c40add1ac --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/ast/CompoundNode.java @@ -0,0 +1,46 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast; + +import org.antlr.runtime.Token; +import org.antlr.runtime.tree.CommonTree; + +// ProtocolBlock or CompoundInteractionNode +public abstract class CompoundNode extends ScribNodeBase +{ + // ScribTreeAdaptor#create constructor + public CompoundNode(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected CompoundNode(CompoundNode node) + { + super(node); + } + + + + + + + + + + public CompoundNode(CommonTree source) + { + super(source); + } +} diff --git a/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java b/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java index 18125e252..1daed5128 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java +++ b/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java @@ -24,7 +24,7 @@ // TODO CHECKME: factor with MessageTransfer? public abstract class ConnectAction - extends BaseInteractionNode + extends DirectedInteraction { // ScribTreeAdaptor#create constructor public ConnectAction(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/Continue.java b/scribble-core/src/main/java/org/scribble/ast/Continue.java index 55a41db6d..b8b6b4eb0 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Continue.java +++ b/scribble-core/src/main/java/org/scribble/ast/Continue.java @@ -22,7 +22,7 @@ import org.scribble.visit.AstVisitor; public abstract class Continue - extends SimpleInteractionNode + extends SimpleSessionNode { // ScribTreeAdaptor#create constructor public Continue(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/ast/DirectedInteraction.java new file mode 100644 index 000000000..ee55cdd83 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/ast/DirectedInteraction.java @@ -0,0 +1,131 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast; + +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; + +import org.antlr.runtime.Token; +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.ScribDel; +import org.scribble.job.ScribbleException; +import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.Role; +import org.scribble.visit.AstVisitor; + +// FIXME: rename (Simple)Interaction, after existing SimpleInteraction renamed +public abstract class DirectedInteraction + extends BasicInteraction +{ + // ScribTreeAdaptor#create constructor + public DirectedInteraction(Token t) + { + super(t); + this.src = null; + this.msg = null; + this.dests = null; + } + + // Tree#dupNode constructor + public DirectedInteraction(DirectedInteraction node) + { + super(node); + this.src = null; + this.msg = null; + this.dests = null; + } + + public MessageNode getMessageNodeChild() + { + return (MessageNode) getChild(0); + } + + public RoleNode getSourceChild() + { + return (RoleNode) getChild(1); + } + + // CHECKME: OK for (future) connect? + public List getDestinationChildren() + { + //return Collections.unmodifiableList(this.dests); + List cs = getChildren(); + return cs.subList(2, cs.size()).stream().map(x -> (RoleNode) x) + .collect(Collectors.toList()); + } + + public final List getDestinationRoles() + { + return getDestinationChildren().stream().map(rn -> rn.toName()) + .collect(Collectors.toList()); + } + + public abstract DirectedInteraction dupNode(); + + public DirectedInteraction reconstruct(MessageNode msg, RoleNode src, + List dests) + { + DirectedInteraction mt = dupNode(); + // Same order as getter indices + mt.addChild(msg); + mt.addChild(src); + mt.addChildren(dests); + ScribDel del = del(); + mt.setDel(del); // No copy + return mt; + } + + @Override + public DirectedInteraction visitChildren(AstVisitor nv) + throws ScribbleException + { + MessageNode msg = (MessageNode) visitChild(getMessageNodeChild(), nv); + RoleNode src = (RoleNode) visitChild(getSourceChild(), nv); + List dests = visitChildListWithClassEqualityCheck(this, + getDestinationChildren(), nv); + return reconstruct(msg, src, dests); + } + + @Override + public abstract String toString(); + + + + + + + + + + + + + + + private final RoleNode src; + private final MessageNode msg; // CHECKME: ambig may get resolved to an unexpected kind, e.g. DataTypeNode (cf. DoArg, PayloadElem wrappers) + private final List dests; + + protected DirectedInteraction(CommonTree source, RoleNode src, MessageNode msg, List dests) + { + super(source); + this.src = src; + this.msg = msg; + this.dests = new LinkedList<>(dests); // CHECKME: Collections.unmodifiable? + } + +} + diff --git a/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java index da10185b0..36d4c84cd 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java @@ -24,7 +24,7 @@ // (G)Disconnect is symmetric (send/receive asymmetric/async; request/accept asymmetric/sync; (g)disconnect symmetric/async) // However, LDisconnect is "symmetric" but self-oriented -- "left" used for self public abstract class DisconnectAction - extends SimpleInteractionNode + extends BasicInteraction { // ScribTreeAdaptor#create constructor public DisconnectAction(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/Do.java b/scribble-core/src/main/java/org/scribble/ast/Do.java index bfa6e3e04..105b2b45a 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Do.java +++ b/scribble-core/src/main/java/org/scribble/ast/Do.java @@ -28,7 +28,7 @@ import org.scribble.visit.AstVisitor; public abstract class Do - extends SimpleInteractionNode // implements ScopedNode + extends SimpleSessionNode // implements ScopedNode { // ScribTreeAdaptor#create constructor public Do(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java b/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java index d8a94172c..bae5fdccb 100644 --- a/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java +++ b/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java @@ -44,14 +44,14 @@ public InteractionSeq(InteractionSeq node) @Override public abstract InteractionSeq dupNode(); - public abstract List> getInteractionChildren(); + public abstract List> getInteractionChildren(); public boolean isEmpty() { return getChildCount() == 0; //this.inters.isEmpty(); } - public InteractionSeq reconstruct(List> ins) + public InteractionSeq reconstruct(List> ins) { InteractionSeq pd = dupNode(); ScribDel del = del(); @@ -63,8 +63,8 @@ public InteractionSeq reconstruct(List> ins) @Override public ScribNode visitChildren(AstVisitor nv) throws ScribbleException { - List> actions = new LinkedList<>(); - for (InteractionNode in : getInteractionChildren()) + List> actions = new LinkedList<>(); + for (SessionNode in : getInteractionChildren()) { //ProtocolKindNode visited = visitProtocolKindChildWithCastCheck(this, in, nv, ProtocolKindNode.class, in.getKind(), KIND_CAST); // No: ProjectedChoiceDoPruning (and others?) needs to return null; CastCheck doesn't allow that // CHECKME @@ -79,7 +79,7 @@ public ScribNode visitChildren(AstVisitor nv) throws ScribbleException else { @SuppressWarnings("unchecked") - InteractionNode tmp = (InteractionNode) visited; + SessionNode tmp = (SessionNode) visited; actions.add(tmp); } } @@ -107,9 +107,9 @@ public String toString() - private final List> inters; + private final List> inters; - protected InteractionSeq(CommonTree source, List> inters) + protected InteractionSeq(CommonTree source, List> inters) { super(source); this.inters = inters; diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java index c70a6464b..cc39b559f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java @@ -22,7 +22,7 @@ import org.scribble.type.kind.ProtocolKind; public abstract class MessageTransfer - extends BaseInteractionNode + extends DirectedInteraction { // ScribTreeAdaptor#create constructor public MessageTransfer(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/Parallel.java b/scribble-core/src/main/java/org/scribble/ast/Parallel.java deleted file mode 100644 index e02e06631..000000000 --- a/scribble-core/src/main/java/org/scribble/ast/Parallel.java +++ /dev/null @@ -1,121 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast; - -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.visit.AstVisitor; - -public abstract class Parallel extends CompoundInteractionNode -{ - private final List> blocks; - - protected Parallel(CommonTree source, List> blocks) - { - super(source); - this.blocks = new LinkedList<>(blocks); - } - - public abstract Parallel reconstruct(List> blocks); - - @Override - public Parallel visitChildren(AstVisitor nv) throws ScribbleException - { - List> blocks = visitChildListWithClassEqualityCheck(this, this.blocks, nv); - return reconstruct(blocks); - } - - public List> getBlocks() - { - return Collections.unmodifiableList(this.blocks); - } - - /*@Override - public NodeContextBuilder enterContextBuilding(NodeContextBuilder builder) throws ScribbleException - { - builder.pushContext(new CompoundInteractionNodeContext()); - return builder; - } - - @Override - public Parallel leaveContextBuilding(NodeContextBuilder builder) throws ScribbleException - { - CompoundInteractionNodeContext pcontext = (CompoundInteractionNodeContext) builder.popContext(); - List bcontexts = - this.blocks.stream().map((b) -> b.getContext()).collect(Collectors.toList()); - pcontext = (CompoundInteractionNodeContext) pcontext.merge(bcontexts); - builder.replaceContext(((CompoundInteractionContext) builder.peekContext()).merge(pcontext)); - //return new Parallel<>(this.ct, this.blocks, pcontext); - return reconstruct(this.ct, this.blocks, pcontext, getEnv()); - } - - @Override - public Parallel leaveWFChoiceCheck(WellFormedChoiceChecker checker) throws ScribbleException - { - checker.getEnv().leave(this, checker); - return this; - } - - @Override - public Parallel leaveReachabilityCheck(ReachabilityChecker checker) throws ScribbleException - { - checker.getEnv().leave(this, checker); - return this; - } - - /*@Override - public Parallel checkWellFormedness(WellFormednessChecker wfc) throws ScribbleException - {k - return visitWithEnv(wfc); - } - - @Override - public Parallel project(Projector proj) throws ScribbleException - { - return visitWithEnv(proj); - } - - @Override - public Parallel checkReachability(ReachabilityChecker rc) throws ScribbleException - { - return visitWithEnv(rc); - } - - public Parallel visitWithEnv(EnvVisitor nv) throws ScribbleException - { - Env env = nv.getEnv(); - List blocks = new LinkedList<>(); - for (ProtocolBlock block : this.blocks) - { - nv.setEnv(new Env(env)); - ProtocolBlock visited = (ProtocolBlock) nv.visit(block); - blocks.add(visited); - } - nv.setEnv(env); - return new Parallel(this.ct, blocks); - }*/ - - /*@Override - public String toString() - { - String sep = " " + Constants.AND_KW + " "; - return Constants.PAR_KW + " " - + this.blocks.stream().map((block) -> block.toString()).collect(Collectors.joining(sep)); - }*/ -} diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java index 6829531c5..8bb0f304d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java @@ -21,7 +21,7 @@ import org.scribble.visit.AstVisitor; public abstract class ProtocolBlock - extends CompoundInteraction implements ProtocolKindNode + extends CompoundNode implements ProtocolKindNode { // ScribTreeAdaptor#create constructor public ProtocolBlock(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/Recursion.java b/scribble-core/src/main/java/org/scribble/ast/Recursion.java index 2500c4560..c45520714 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/ast/Recursion.java @@ -22,7 +22,7 @@ import org.scribble.visit.AstVisitor; public abstract class Recursion - extends CompoundInteractionNode + extends CompoundInteraction { // ScribTreeAdaptor#create constructor public Recursion(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/InteractionNode.java b/scribble-core/src/main/java/org/scribble/ast/SessionNode.java similarity index 84% rename from scribble-core/src/main/java/org/scribble/ast/InteractionNode.java rename to scribble-core/src/main/java/org/scribble/ast/SessionNode.java index 3bcdea11e..91e01e46b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/InteractionNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/SessionNode.java @@ -15,8 +15,9 @@ import org.scribble.type.kind.ProtocolKind; +// AST nodes that correspond to session type constructors -- elements of InteractionSeq nodes // Make a compound interaction subclass for choice/parallel etc? -public interface InteractionNode extends ProtocolKindNode +public interface SessionNode extends ProtocolKindNode { //Set> collectMessageIds(); // Not worth implementing this homomorphically for every case except MessageTransfer, better to use visitChildren pattern //Map> getEnablingMessages(); diff --git a/scribble-core/src/main/java/org/scribble/ast/SimpleInteractionNode.java b/scribble-core/src/main/java/org/scribble/ast/SimpleSessionNode.java similarity index 78% rename from scribble-core/src/main/java/org/scribble/ast/SimpleInteractionNode.java rename to scribble-core/src/main/java/org/scribble/ast/SimpleSessionNode.java index abc9c4904..009e5643e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/SimpleInteractionNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/SimpleSessionNode.java @@ -19,17 +19,17 @@ // Name should be read (Simple ( InteractionNode )) // FIXME: rename: Continue/Do aren't really interactions -public abstract class SimpleInteractionNode - extends ScribNodeBase implements InteractionNode +public abstract class SimpleSessionNode + extends ScribNodeBase implements SessionNode { // ScribTreeAdaptor#create constructor - public SimpleInteractionNode(Token t) + public SimpleSessionNode(Token t) { super(t); } // Tree#dupNode constructor - public SimpleInteractionNode(SimpleInteractionNode node) + public SimpleSessionNode(SimpleSessionNode node) { super(node); } @@ -43,7 +43,7 @@ public SimpleInteractionNode(SimpleInteractionNode node) - protected SimpleInteractionNode(CommonTree source) + protected SimpleSessionNode(CommonTree source) { super(source); } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java b/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java index b1a8d1bfd..c3b8acdc1 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java @@ -30,7 +30,7 @@ import org.scribble.type.kind.Global; import org.scribble.type.name.Role; -public class GChoice extends Choice implements GCompoundInteractionNode +public class GChoice extends Choice implements GCompoundInteraction { // ScribTreeAdaptor#create constructor public GChoice(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GSimpleInteractionNode.java b/scribble-core/src/main/java/org/scribble/ast/global/GCompoundInteraction.java similarity index 90% rename from scribble-core/src/main/java/org/scribble/ast/global/GSimpleInteractionNode.java rename to scribble-core/src/main/java/org/scribble/ast/global/GCompoundInteraction.java index 717dad138..b02d86c4d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GSimpleInteractionNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GCompoundInteraction.java @@ -13,7 +13,7 @@ */ package org.scribble.ast.global; -public interface GSimpleInteractionNode extends GInteractionNode +public interface GCompoundInteraction extends GSessionNode { } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java b/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java index d2e2938b8..1c9f23d27 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java @@ -27,7 +27,7 @@ // TODO: make GConnectionAction and factor this class with GWrap (cf. LConnectionAction) public class GConnect extends ConnectAction - implements GSimpleInteractionNode + implements GSimpleSessionNode { // ScribTreeAdaptor#create constructor public GConnect(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GContinue.java b/scribble-core/src/main/java/org/scribble/ast/global/GContinue.java index e0f37459d..821957c0b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GContinue.java @@ -23,7 +23,7 @@ import org.scribble.type.kind.RecVarKind; import org.scribble.type.name.Role; -public class GContinue extends Continue implements GSimpleInteractionNode +public class GContinue extends Continue implements GSimpleSessionNode { // ScribTreeAdaptor#create constructor public GContinue(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GDisconnect.java b/scribble-core/src/main/java/org/scribble/ast/global/GDisconnect.java index 2cf65c678..6a6435d7d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GDisconnect.java @@ -24,7 +24,8 @@ import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; -public class GDisconnect extends DisconnectAction implements GSimpleInteractionNode +public class GDisconnect extends DisconnectAction + implements GSimpleSessionNode { // ScribTreeAdaptor#create constructor public GDisconnect(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GDo.java b/scribble-core/src/main/java/org/scribble/ast/global/GDo.java index 611033936..1e85d6ec2 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GDo.java @@ -28,7 +28,7 @@ import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; -public class GDo extends Do implements GSimpleInteractionNode +public class GDo extends Do implements GSimpleSessionNode { // ScribTreeAdaptor#create constructor public GDo(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java b/scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java index 025cf482d..2ca2a09be 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java @@ -20,7 +20,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.InteractionSeq; -import org.scribble.ast.local.LInteractionNode; +import org.scribble.ast.local.LSessionNode; import org.scribble.ast.local.LInteractionSeq; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -46,16 +46,16 @@ public GInteractionSeq dupNode() } // Move node-specific projects to G nodes (not dels) and take child projections as params, bit like reconstruct - public LInteractionSeq project(AstFactory af, Role self, List lis) + public LInteractionSeq project(AstFactory af, Role self, List lis) { LInteractionSeq projection = af.LInteractionSeq(this.source, lis); return projection; } @Override - public List getInteractionChildren() + public List getInteractionChildren() { - return getChildren().stream().map(n -> (GInteractionNode) n) + return getChildren().stream().map(n -> (GSessionNode) n) .collect(Collectors.toList()); } @@ -70,7 +70,7 @@ public List getInteractionChildren() - public GInteractionSeq(CommonTree source, List actions) + public GInteractionSeq(CommonTree source, List actions) { super(source, actions); } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java index ee218fcb8..bbbb01f3c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java @@ -23,7 +23,7 @@ import org.scribble.ast.Constants; import org.scribble.ast.MessageNode; import org.scribble.ast.MessageTransfer; -import org.scribble.ast.local.LInteractionNode; +import org.scribble.ast.local.LSessionNode; import org.scribble.ast.local.LNode; import org.scribble.ast.local.LReceive; import org.scribble.ast.name.simple.RoleNode; @@ -32,7 +32,7 @@ import org.scribble.type.name.Role; public class GMessageTransfer extends MessageTransfer - implements GSimpleInteractionNode + implements GSimpleSessionNode { // ScribTreeAdaptor#create constructor public GMessageTransfer(Token t) @@ -82,8 +82,8 @@ public LNode project(AstFactory af, Role self) else { LReceive lr = af.LReceive(this.source, srcNode1, msg, destNodes); - List lis = Arrays.asList( - new LInteractionNode[]{(LInteractionNode) proj, lr}); + List lis = Arrays.asList( + new LSessionNode[]{(LSessionNode) proj, lr}); proj = af.LInteractionSeq(this.source, lis); } } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java index 93ec573da..e23e7b115 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java @@ -29,7 +29,7 @@ import org.scribble.ast.Recursion; import org.scribble.ast.local.LChoice; import org.scribble.ast.local.LContinue; -import org.scribble.ast.local.LInteractionNode; +import org.scribble.ast.local.LSessionNode; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.local.LRecursion; @@ -40,7 +40,7 @@ public class GRecursion extends Recursion - implements GCompoundInteractionNode + implements GCompoundInteraction { // ScribTreeAdaptor#create constructor public GRecursion(Token t) @@ -91,7 +91,7 @@ protected static LProtocolBlock prune(AstFactory af, LProtocolBlock block, { return block; } - List lis = block.getInteractSeqChild() + List lis = block.getInteractSeqChild() .getInteractionChildren(); if (lis.size() > 1) { @@ -100,7 +100,7 @@ protected static LProtocolBlock prune(AstFactory af, LProtocolBlock block, else //if (lis.size() == 1) { // Only pruning if single statement body: if more than 1, must be some (non-empty?) statement before a continue -- cannot (shouldn't?) be a continue followed by some other statement due to reachability - LInteractionNode lin = lis.get(0); + LSessionNode lin = lis.get(0); if (lin instanceof LContinue) { if (rvs.contains(((LContinue) lin).getRecVarChild().toName())) diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GInteractionNode.java b/scribble-core/src/main/java/org/scribble/ast/global/GSessionNode.java similarity index 88% rename from scribble-core/src/main/java/org/scribble/ast/global/GInteractionNode.java rename to scribble-core/src/main/java/org/scribble/ast/global/GSessionNode.java index 8c20d3232..c49f57f18 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GInteractionNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GSessionNode.java @@ -13,11 +13,11 @@ */ package org.scribble.ast.global; -import org.scribble.ast.InteractionNode; +import org.scribble.ast.SessionNode; import org.scribble.type.kind.Global; // Alternatively to interface, use GlobalNode subclass with delegation to "super" base (e.g. Choice) classes -public interface GInteractionNode extends InteractionNode, GNode +public interface GSessionNode extends SessionNode, GNode { //public LInteractionSeq project(AstFactory af, Role self); // TODO } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GCompoundInteractionNode.java b/scribble-core/src/main/java/org/scribble/ast/global/GSimpleSessionNode.java similarity index 90% rename from scribble-core/src/main/java/org/scribble/ast/global/GCompoundInteractionNode.java rename to scribble-core/src/main/java/org/scribble/ast/global/GSimpleSessionNode.java index 9eb86d367..7088f7993 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GCompoundInteractionNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GSimpleSessionNode.java @@ -13,7 +13,7 @@ */ package org.scribble.ast.global; -public interface GCompoundInteractionNode extends GInteractionNode +public interface GSimpleSessionNode extends GSessionNode { } diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GWrap.java b/scribble-core/src/main/java/org/scribble/ast/global/GWrap.java index fcb6d6854..b60640a96 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GWrap.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GWrap.java @@ -25,7 +25,7 @@ import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; -public class GWrap extends ConnectAction implements GSimpleInteractionNode +public class GWrap extends ConnectAction implements GSimpleSessionNode { // ScribTreeAdaptor#create constructor public GWrap(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java b/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java index 8af7cd8c8..c834032b3 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java @@ -28,7 +28,7 @@ import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -public class LAccept extends LConnectionAction implements LSimpleInteractionNode +public class LAccept extends LConnectionAction implements LSimpleSessionNode { // ScribTreeAdaptor#create constructor public LAccept(Token t) @@ -57,14 +57,14 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) + public LSessionNode merge(AstFactory af, LSessionNode ln) throws ScribbleException { throw new RuntimeScribbleException("Invalid merge on LAccept: " + this); } @Override - public boolean canMerge(LInteractionNode ln) + public boolean canMerge(LSessionNode ln) { return false; } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java b/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java index de42effcb..d4f25d772 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java @@ -30,7 +30,7 @@ import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -public class LChoice extends Choice implements LCompoundInteractionNode +public class LChoice extends Choice implements LCompoundInteraction { // ScribTreeAdaptor#create constructor public LChoice(Token t) @@ -67,7 +67,7 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) } @Override - public LChoice merge(AstFactory af, LInteractionNode ln) throws ScribbleException + public LChoice merge(AstFactory af, LSessionNode ln) throws ScribbleException { if (!(ln instanceof LChoice) || !this.canMerge(ln)) { @@ -87,7 +87,7 @@ public LChoice merge(AstFactory af, LInteractionNode ln) throws ScribbleExceptio } @Override - public boolean canMerge(LInteractionNode ln) + public boolean canMerge(LSessionNode ln) { // Merge currently does "nothing"; validation takes direct non-deterministic interpretation -- purpose of syntactic merge is to convert non-det to "equivalent" safe det in certain sitations return ln instanceof LChoice; diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LCompoundInteractionNode.java b/scribble-core/src/main/java/org/scribble/ast/local/LCompoundInteraction.java similarity index 90% rename from scribble-core/src/main/java/org/scribble/ast/local/LCompoundInteractionNode.java rename to scribble-core/src/main/java/org/scribble/ast/local/LCompoundInteraction.java index f539aac6a..314fd90d6 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LCompoundInteractionNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LCompoundInteraction.java @@ -13,7 +13,7 @@ */ package org.scribble.ast.local; -public interface LCompoundInteractionNode extends LInteractionNode +public interface LCompoundInteraction extends LSessionNode { } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LConnectionAction.java b/scribble-core/src/main/java/org/scribble/ast/local/LConnectionAction.java index f14aede2d..0a73d3885 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LConnectionAction.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LConnectionAction.java @@ -21,7 +21,7 @@ import org.scribble.type.kind.Local; public abstract class LConnectionAction extends ConnectAction - implements LSimpleInteractionNode + implements LSimpleSessionNode { // ScribTreeAdaptor#create constructor public LConnectionAction(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LContinue.java b/scribble-core/src/main/java/org/scribble/ast/local/LContinue.java index 732b5e13c..a35195c7e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LContinue.java @@ -27,7 +27,7 @@ import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -public class LContinue extends Continue implements LSimpleInteractionNode +public class LContinue extends Continue implements LSimpleSessionNode { // ScribTreeAdaptor#create constructor public LContinue(Token t) @@ -62,7 +62,7 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) + public LSessionNode merge(AstFactory af, LSessionNode ln) throws ScribbleException { if (!(ln instanceof LContinue) || !this.canMerge(ln)) @@ -80,7 +80,7 @@ public LInteractionNode merge(AstFactory af, LInteractionNode ln) } @Override - public boolean canMerge(LInteractionNode ln) + public boolean canMerge(LSessionNode ln) { return ln instanceof LContinue; } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java b/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java index b4fb3a0ac..e0b180817 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java @@ -32,7 +32,7 @@ // "left" of LDisconnect is used for self public class LDisconnect extends DisconnectAction - implements LSimpleInteractionNode + implements LSimpleSessionNode { // ScribTreeAdaptor#create constructor public LDisconnect(Token t) @@ -75,14 +75,14 @@ public LDisconnect dupNode() } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) + public LSessionNode merge(AstFactory af, LSessionNode ln) throws ScribbleException { throw new RuntimeScribbleException("Invalid merge on LDisconnect: " + this); } @Override - public boolean canMerge(LInteractionNode ln) + public boolean canMerge(LSessionNode ln) { return false; } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LDo.java b/scribble-core/src/main/java/org/scribble/ast/local/LDo.java index d949ad674..16d7b31bf 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LDo.java @@ -34,7 +34,7 @@ import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -public class LDo extends Do implements LSimpleInteractionNode +public class LDo extends Do implements LSimpleSessionNode { // ScribTreeAdaptor#create constructor public LDo(Token t) @@ -83,14 +83,14 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) + public LSessionNode merge(AstFactory af, LSessionNode ln) throws ScribbleException { throw new RuntimeScribbleException("Invalid merge on LDo: " + this); } @Override - public boolean canMerge(LInteractionNode ln) + public boolean canMerge(LSessionNode ln) { return false; } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java b/scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java index 122812b16..2bb3ea561 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java @@ -45,9 +45,9 @@ public LInteractionSeq dupNode() } @Override - public List getInteractionChildren() + public List getInteractionChildren() { - return getChildren().stream().map(n -> (LInteractionNode) n) + return getChildren().stream().map(n -> (LSessionNode) n) .collect(Collectors.toList()); } @@ -61,7 +61,7 @@ public Set getEnabling() { if (!this.isEmpty()) { - for (LInteractionNode ln : getInteractionChildren()) + for (LSessionNode ln : getInteractionChildren()) { Set enab = ln.getEnabling(); if (!enab.isEmpty()) @@ -85,7 +85,7 @@ public Set getEnabling() - public LInteractionSeq(CommonTree source, List lis) + public LInteractionSeq(CommonTree source, List lis) { super(source, lis); } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LMessageTransfer.java b/scribble-core/src/main/java/org/scribble/ast/local/LMessageTransfer.java index 12a11ddd9..68373e3ae 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LMessageTransfer.java @@ -22,7 +22,7 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.type.kind.Local; -public abstract class LMessageTransfer extends MessageTransfer implements LSimpleInteractionNode +public abstract class LMessageTransfer extends MessageTransfer implements LSimpleSessionNode { // ScribTreeAdaptor#create constructor public LMessageTransfer(Token t) diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java b/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java index db712c636..ce0aee8af 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java @@ -29,7 +29,7 @@ import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -public class LReceive extends LMessageTransfer implements LSimpleInteractionNode +public class LReceive extends LMessageTransfer implements LSimpleSessionNode { // ScribTreeAdaptor#create constructor public LReceive(Token t) @@ -58,14 +58,14 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) + public LSessionNode merge(AstFactory af, LSessionNode ln) throws ScribbleException { throw new RuntimeScribbleException("Invalid merge on LReceive: " + this); } @Override - public boolean canMerge(LInteractionNode ln) + public boolean canMerge(LSessionNode ln) { return false; } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java index 371ffeb80..a2a2c50ab 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java @@ -26,7 +26,7 @@ import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -public class LRecursion extends Recursion implements LCompoundInteractionNode +public class LRecursion extends Recursion implements LCompoundInteraction { // ScribTreeAdaptor#create constructor public LRecursion(Token t) @@ -61,7 +61,7 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) + public LSessionNode merge(AstFactory af, LSessionNode ln) throws ScribbleException { if (!(ln instanceof LRecursion) || !this.canMerge(ln)) @@ -84,7 +84,7 @@ public LInteractionNode merge(AstFactory af, LInteractionNode ln) } @Override - public boolean canMerge(LInteractionNode ln) + public boolean canMerge(LSessionNode ln) { return ln instanceof LRecursion; } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java b/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java index 48db66b76..03b715d1b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java @@ -28,7 +28,7 @@ import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -public class LRequest extends LConnectionAction implements LSimpleInteractionNode +public class LRequest extends LConnectionAction implements LSimpleSessionNode { // ScribTreeAdaptor#create constructor public LRequest(Token t) @@ -57,14 +57,14 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) + public LSessionNode merge(AstFactory af, LSessionNode ln) throws ScribbleException { throw new RuntimeScribbleException("Invalid merge on LRequest: " + this); } @Override - public boolean canMerge(LInteractionNode ln) + public boolean canMerge(LSessionNode ln) { return false; } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LSend.java b/scribble-core/src/main/java/org/scribble/ast/local/LSend.java index 0863d1211..44b2624fa 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LSend.java @@ -31,7 +31,7 @@ import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LSend extends LMessageTransfer - implements LSimpleInteractionNode // Explicitly needed here for getKind + implements LSimpleSessionNode // Explicitly needed here for getKind { // ScribTreeAdaptor#create constructor public LSend(Token t) @@ -59,14 +59,14 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) + public LSessionNode merge(AstFactory af, LSessionNode ln) throws ScribbleException { throw new RuntimeScribbleException("Invalid merge on LSend: " + this); } @Override - public boolean canMerge(LInteractionNode ln) + public boolean canMerge(LSessionNode ln) { return false; } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LInteractionNode.java b/scribble-core/src/main/java/org/scribble/ast/local/LSessionNode.java similarity index 84% rename from scribble-core/src/main/java/org/scribble/ast/local/LInteractionNode.java rename to scribble-core/src/main/java/org/scribble/ast/local/LSessionNode.java index 8db975279..3f8db4f47 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LInteractionNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LSessionNode.java @@ -16,7 +16,7 @@ import java.util.Set; import org.scribble.ast.AstFactory; -import org.scribble.ast.InteractionNode; +import org.scribble.ast.SessionNode; import org.scribble.job.ScribbleException; import org.scribble.type.Message; import org.scribble.type.kind.Local; @@ -24,13 +24,13 @@ import org.scribble.visit.context.ProjectedChoiceSubjectFixer; // Alternatively to interface, use GlobalNode subclass with delegation to "super" base (e.g. Choice) classes -public interface LInteractionNode extends InteractionNode, LNode +public interface LSessionNode extends SessionNode, LNode { Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer); // "merge" currently does "nothing"; validation takes direct non-deterministic interpretation -- purpose of syntactic merge would be to convert non-det to "equivalent" safe det in certain sitations - LInteractionNode merge(AstFactory af, LInteractionNode ln) throws ScribbleException; - boolean canMerge(LInteractionNode ln); + LSessionNode merge(AstFactory af, LSessionNode ln) throws ScribbleException; + boolean canMerge(LSessionNode ln); Set getEnabling(); } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LSimpleInteractionNode.java b/scribble-core/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java similarity index 90% rename from scribble-core/src/main/java/org/scribble/ast/local/LSimpleInteractionNode.java rename to scribble-core/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java index 42b645253..88861cd57 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LSimpleInteractionNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java @@ -13,7 +13,7 @@ */ package org.scribble.ast.local; -public interface LSimpleInteractionNode extends LInteractionNode +public interface LSimpleSessionNode extends LSessionNode { } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java b/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java index 307be326d..c4feb486c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java @@ -29,7 +29,7 @@ import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LWrapClient extends LConnectionAction - implements LSimpleInteractionNode + implements LSimpleSessionNode { // ScribTreeAdaptor#create constructor public LWrapClient(Token t) @@ -58,14 +58,14 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) + public LSessionNode merge(AstFactory af, LSessionNode ln) throws ScribbleException { throw new RuntimeScribbleException("Invalid merge on LWrapClient: " + this); } @Override - public boolean canMerge(LInteractionNode ln) + public boolean canMerge(LSessionNode ln) { return false; } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java b/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java index eb6f2120c..823ec55f7 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java @@ -28,7 +28,7 @@ import org.scribble.type.name.Role; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -public class LWrapServer extends LConnectionAction implements LSimpleInteractionNode +public class LWrapServer extends LConnectionAction implements LSimpleSessionNode { // ScribTreeAdaptor#create constructor public LWrapServer(Token t) @@ -56,14 +56,14 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) } @Override - public LInteractionNode merge(AstFactory af, LInteractionNode ln) + public LSessionNode merge(AstFactory af, LSessionNode ln) throws ScribbleException { throw new RuntimeScribbleException("Invalid merge on LWrapServer: " + this); } @Override - public boolean canMerge(LInteractionNode ln) + public boolean canMerge(LSessionNode ln) { return false; } diff --git a/scribble-core/src/main/java/org/scribble/del/ChoiceDel.java b/scribble-core/src/main/java/org/scribble/del/ChoiceDel.java index da4857467..c3fa42d95 100644 --- a/scribble-core/src/main/java/org/scribble/del/ChoiceDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ChoiceDel.java @@ -24,7 +24,7 @@ import org.scribble.visit.wf.ExplicitCorrelationChecker; import org.scribble.visit.wf.env.ExplicitCorrelationEnv; -public abstract class ChoiceDel extends CompoundInteractionNodeDel +public abstract class ChoiceDel extends CompoundInteractionDel { public ChoiceDel() { diff --git a/scribble-core/src/main/java/org/scribble/del/CompoundInteractionDel.java b/scribble-core/src/main/java/org/scribble/del/CompoundInteractionDel.java index 85f148857..ac5604fee 100644 --- a/scribble-core/src/main/java/org/scribble/del/CompoundInteractionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/CompoundInteractionDel.java @@ -13,72 +13,113 @@ */ package org.scribble.del; +import org.scribble.ast.CompoundInteraction; import org.scribble.ast.ScribNode; import org.scribble.job.ScribbleException; import org.scribble.visit.InlinedProtocolUnfolder; +import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; +import org.scribble.visit.context.env.UnguardedChoiceDoEnv; +import org.scribble.visit.env.UnfoldingEnv; import org.scribble.visit.wf.ExplicitCorrelationChecker; import org.scribble.visit.wf.WFChoiceChecker; +import org.scribble.visit.wf.env.ExplicitCorrelationEnv; +import org.scribble.visit.wf.env.WFChoiceEnv; -// For CompoundInteractionNode and ProtocolBlock -public abstract class CompoundInteractionDel extends ScribDelBase +public abstract class CompoundInteractionDel extends CompoundSessionNodeDel implements InteractionNodeDel { public CompoundInteractionDel() { } - // Should only do for projections, but OK here (visitor only run on projections) @Override - public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker) throws ScribbleException + public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribbleException { - ScribDelBase.pushVisitorEnv(this, checker); + ScribDelBase.pushVisitorEnv(this, inl); } - // Should only do for projections, but OK here (visitor only run on projections) @Override - public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribbleException + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { - // Overridden in CompoundInteractionNodeDel to do merging of child context into parent context - return ScribDelBase.popAndSetVisitorEnv(this, checker, visited); + return ScribDelBase.popAndSetVisitorEnv(this, inl, visited); } + // In the following only leaves are overridden to do additional merging -- enters remain as for super by default + // Specialised enters will be overridden per node (e.g., GChoiceDel.enterInlinedWFChoiceCheck) -- corresponding leaves will use their super (i.e., the below) to do merging + + // Should only do for projections, but OK here (visitor only run on projections) @Override - public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf) throws ScribbleException + public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribbleException { - ScribDelBase.pushVisitorEnv(this, unf); + // Override super routine (in CompoundInteractionDel, which just does base popAndSet) to do merging of child context into parent context + UnguardedChoiceDoEnv visited_env = checker.popEnv(); // popAndSet current + setEnv(visited_env); + UnguardedChoiceDoEnv parent_env = checker.popEnv(); // pop-merge-push parent + parent_env = parent_env.mergeContext(visited_env); + checker.pushEnv(parent_env); + return (CompoundInteraction) visited; } @Override public ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) throws ScribbleException { - // Overridden in CompoundInteractionNodeDel to do merging of child context into parent context - return ScribDelBase.popAndSetVisitorEnv(this, unf, visited); + // Override super routine (in CompoundInteractionDel, which just does base popAndSet) to do merging of child context into parent context + // Need to further override for "compound" nodes with block children, e.g., Choice/RecursionDel, to merge children together and then into current (then call here via super to set and merge current into parent) + UnfoldingEnv visited_env = unf.popEnv(); // popAndSet current + setEnv(visited_env); + UnfoldingEnv parent_env = unf.popEnv(); // pop-merge-push parent + parent_env = parent_env.mergeContext(visited_env); + unf.pushEnv(parent_env); + return (CompoundInteraction) visited; } @Override - public void enterInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker) throws ScribbleException + public CompoundInteraction leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException { - ScribDelBase.pushVisitorEnv(this, checker); + WFChoiceEnv visited_env = checker.popEnv(); // popAndSet current + setEnv(visited_env); + WFChoiceEnv parent_env = checker.popEnv(); // pop-merge-push parent + parent_env = parent_env.mergeContext(visited_env); + checker.pushEnv(parent_env); + return (CompoundInteraction) visited; } - + @Override - public ScribNode leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException + public ScribNode leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribbleException { - // Overridden in CompoundInteractionNodeDel to do merging of child context into parent context - return ScribDelBase.popAndSetVisitorEnv(this, checker, visited); + // Override super routine (in CompoundInteractionDel, which just does base popAndSet) to do merging of child context into parent context + // Need to further override for "multi-compound" nodes, e.g., ChoiceDel + ExplicitCorrelationEnv visited_env = checker.popEnv(); // popAndSet current + setEnv(visited_env); + ExplicitCorrelationEnv parent_env = checker.popEnv(); // pop-merge-push parent + parent_env = parent_env.mergeContext(visited_env); + checker.pushEnv(parent_env); + return (CompoundInteraction) visited; } - @Override - public void enterExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker) throws ScribbleException + /*@Override + public void enterWFChoicePathCheck(ScribNode parent, ScribNode child, WFChoicePathChecker coll) throws ScribbleException { - ScribDelBase.pushVisitorEnv(this, checker); - } - - @Override - public ScribNode leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribbleException + WFChoicePathEnv env = coll.peekEnv().enterContext(); + env = env.clear(); + coll.pushEnv(env); + }*/ + + /*@Override + public CompoundInteractionNode leaveWFChoicePathCheck(ScribNode parent, ScribNode child, WFChoicePathChecker coll, ScribNode visited) throws ScribbleException + //public CompoundInteractionNode leavePathCollection(ScribNode parent, ScribNode child, PathCollectionVisitor coll, ScribNode visited) throws ScribbleException { - // Overridden in CompoundInteractionNodeDel to do merging of child context into parent context - return ScribDelBase.popAndSetVisitorEnv(this, checker, visited); - } + WFChoicePathEnv visited_env = coll.popEnv(); // popAndSet current + setEnv(visited_env); + WFChoicePathEnv parent_env = coll.popEnv(); // pop-merge-push parent + parent_env = parent_env.mergeContext(visited_env); + coll.pushEnv(parent_env); + + /*System.out.println("3: " + parent_env.getPaths().size()); + System.out.println("4: " + parent_env.getPaths() + ""); + System.out.println("4: " + visited + "\n");* / + + return (CompoundInteractionNode) visited; + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/del/CompoundInteractionNodeDel.java b/scribble-core/src/main/java/org/scribble/del/CompoundInteractionNodeDel.java deleted file mode 100644 index 1b239dbfb..000000000 --- a/scribble-core/src/main/java/org/scribble/del/CompoundInteractionNodeDel.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.del; - -import org.scribble.ast.CompoundInteractionNode; -import org.scribble.ast.ScribNode; -import org.scribble.job.ScribbleException; -import org.scribble.visit.InlinedProtocolUnfolder; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; -import org.scribble.visit.context.env.UnguardedChoiceDoEnv; -import org.scribble.visit.env.UnfoldingEnv; -import org.scribble.visit.wf.ExplicitCorrelationChecker; -import org.scribble.visit.wf.WFChoiceChecker; -import org.scribble.visit.wf.env.ExplicitCorrelationEnv; -import org.scribble.visit.wf.env.WFChoiceEnv; - -public abstract class CompoundInteractionNodeDel extends CompoundInteractionDel implements InteractionNodeDel -{ - public CompoundInteractionNodeDel() - { - - } - - @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribbleException - { - ScribDelBase.pushVisitorEnv(this, inl); - } - - @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException - { - return ScribDelBase.popAndSetVisitorEnv(this, inl, visited); - } - - // In the following only leaves are overridden to do additional merging -- enters remain as for super by default - // Specialised enters will be overridden per node (e.g., GChoiceDel.enterInlinedWFChoiceCheck) -- corresponding leaves will use their super (i.e., the below) to do merging - - // Should only do for projections, but OK here (visitor only run on projections) - @Override - public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribbleException - { - // Override super routine (in CompoundInteractionDel, which just does base popAndSet) to do merging of child context into parent context - UnguardedChoiceDoEnv visited_env = checker.popEnv(); // popAndSet current - setEnv(visited_env); - UnguardedChoiceDoEnv parent_env = checker.popEnv(); // pop-merge-push parent - parent_env = parent_env.mergeContext(visited_env); - checker.pushEnv(parent_env); - return (CompoundInteractionNode) visited; - } - - @Override - public ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) throws ScribbleException - { - // Override super routine (in CompoundInteractionDel, which just does base popAndSet) to do merging of child context into parent context - // Need to further override for "compound" nodes with block children, e.g., Choice/RecursionDel, to merge children together and then into current (then call here via super to set and merge current into parent) - UnfoldingEnv visited_env = unf.popEnv(); // popAndSet current - setEnv(visited_env); - UnfoldingEnv parent_env = unf.popEnv(); // pop-merge-push parent - parent_env = parent_env.mergeContext(visited_env); - unf.pushEnv(parent_env); - return (CompoundInteractionNode) visited; - } - - @Override - public CompoundInteractionNode leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException - { - WFChoiceEnv visited_env = checker.popEnv(); // popAndSet current - setEnv(visited_env); - WFChoiceEnv parent_env = checker.popEnv(); // pop-merge-push parent - parent_env = parent_env.mergeContext(visited_env); - checker.pushEnv(parent_env); - return (CompoundInteractionNode) visited; - } - - @Override - public ScribNode leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribbleException - { - // Override super routine (in CompoundInteractionDel, which just does base popAndSet) to do merging of child context into parent context - // Need to further override for "multi-compound" nodes, e.g., ChoiceDel - ExplicitCorrelationEnv visited_env = checker.popEnv(); // popAndSet current - setEnv(visited_env); - ExplicitCorrelationEnv parent_env = checker.popEnv(); // pop-merge-push parent - parent_env = parent_env.mergeContext(visited_env); - checker.pushEnv(parent_env); - return (CompoundInteractionNode) visited; - } - - /*@Override - public void enterWFChoicePathCheck(ScribNode parent, ScribNode child, WFChoicePathChecker coll) throws ScribbleException - { - WFChoicePathEnv env = coll.peekEnv().enterContext(); - env = env.clear(); - coll.pushEnv(env); - }*/ - - /*@Override - public CompoundInteractionNode leaveWFChoicePathCheck(ScribNode parent, ScribNode child, WFChoicePathChecker coll, ScribNode visited) throws ScribbleException - //public CompoundInteractionNode leavePathCollection(ScribNode parent, ScribNode child, PathCollectionVisitor coll, ScribNode visited) throws ScribbleException - { - WFChoicePathEnv visited_env = coll.popEnv(); // popAndSet current - setEnv(visited_env); - WFChoicePathEnv parent_env = coll.popEnv(); // pop-merge-push parent - parent_env = parent_env.mergeContext(visited_env); - coll.pushEnv(parent_env); - - /*System.out.println("3: " + parent_env.getPaths().size()); - System.out.println("4: " + parent_env.getPaths() + ""); - System.out.println("4: " + visited + "\n");* / - - return (CompoundInteractionNode) visited; - }*/ -} diff --git a/scribble-core/src/main/java/org/scribble/del/CompoundSessionNodeDel.java b/scribble-core/src/main/java/org/scribble/del/CompoundSessionNodeDel.java new file mode 100644 index 000000000..d45921950 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/del/CompoundSessionNodeDel.java @@ -0,0 +1,84 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.del; + +import org.scribble.ast.ScribNode; +import org.scribble.job.ScribbleException; +import org.scribble.visit.InlinedProtocolUnfolder; +import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; +import org.scribble.visit.wf.ExplicitCorrelationChecker; +import org.scribble.visit.wf.WFChoiceChecker; + +// For CompoundInteractionNode and ProtocolBlock +public abstract class CompoundSessionNodeDel extends ScribDelBase +{ + public CompoundSessionNodeDel() + { + + } + + // Should only do for projections, but OK here (visitor only run on projections) + @Override + public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker) throws ScribbleException + { + ScribDelBase.pushVisitorEnv(this, checker); + } + + // Should only do for projections, but OK here (visitor only run on projections) + @Override + public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribbleException + { + // Overridden in CompoundInteractionNodeDel to do merging of child context into parent context + return ScribDelBase.popAndSetVisitorEnv(this, checker, visited); + } + + @Override + public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf) throws ScribbleException + { + ScribDelBase.pushVisitorEnv(this, unf); + } + + @Override + public ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) throws ScribbleException + { + // Overridden in CompoundInteractionNodeDel to do merging of child context into parent context + return ScribDelBase.popAndSetVisitorEnv(this, unf, visited); + } + + @Override + public void enterInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker) throws ScribbleException + { + ScribDelBase.pushVisitorEnv(this, checker); + } + + @Override + public ScribNode leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException + { + // Overridden in CompoundInteractionNodeDel to do merging of child context into parent context + return ScribDelBase.popAndSetVisitorEnv(this, checker, visited); + } + + @Override + public void enterExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker) throws ScribbleException + { + ScribDelBase.pushVisitorEnv(this, checker); + } + + @Override + public ScribNode leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribbleException + { + // Overridden in CompoundInteractionNodeDel to do merging of child context into parent context + return ScribDelBase.popAndSetVisitorEnv(this, checker, visited); + } +} diff --git a/scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java b/scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java index 7989e9da4..169cfc098 100644 --- a/scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java @@ -22,7 +22,7 @@ import org.scribble.visit.util.RoleCollector; // TODO: factor with MessageTransferDel -public abstract class ConnectionActionDel extends SimpleInteractionNodeDel +public abstract class ConnectionActionDel extends SimpleSessionNodeDel { public ConnectionActionDel() { diff --git a/scribble-core/src/main/java/org/scribble/del/ContinueDel.java b/scribble-core/src/main/java/org/scribble/del/ContinueDel.java index ec61e82d1..b65df8845 100644 --- a/scribble-core/src/main/java/org/scribble/del/ContinueDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ContinueDel.java @@ -21,7 +21,7 @@ import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.util.RecVarCollector; -public abstract class ContinueDel extends SimpleInteractionNodeDel +public abstract class ContinueDel extends SimpleSessionNodeDel { public ContinueDel() { diff --git a/scribble-core/src/main/java/org/scribble/del/DoDel.java b/scribble-core/src/main/java/org/scribble/del/DoDel.java index 2e10c5311..701a71cf6 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoDel.java @@ -27,7 +27,7 @@ import org.scribble.visit.context.ProtocolDeclContextBuilder; import org.scribble.visit.wf.NameDisambiguator; -public abstract class DoDel extends SimpleInteractionNodeDel +public abstract class DoDel extends SimpleSessionNodeDel { public DoDel() { diff --git a/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java b/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java index 92985b736..fd6b3bca7 100644 --- a/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java +++ b/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java @@ -30,7 +30,7 @@ import org.scribble.visit.util.MessageIdCollector; import org.scribble.visit.util.RoleCollector; -public abstract class MessageTransferDel extends SimpleInteractionNodeDel +public abstract class MessageTransferDel extends SimpleSessionNodeDel { public MessageTransferDel() { diff --git a/scribble-core/src/main/java/org/scribble/del/ProtocolBlockDel.java b/scribble-core/src/main/java/org/scribble/del/ProtocolBlockDel.java index 71ac8c3f4..7f4881171 100644 --- a/scribble-core/src/main/java/org/scribble/del/ProtocolBlockDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ProtocolBlockDel.java @@ -17,7 +17,7 @@ import org.scribble.job.ScribbleException; import org.scribble.visit.ProtocolDefInliner; -public abstract class ProtocolBlockDel extends CompoundInteractionDel +public abstract class ProtocolBlockDel extends CompoundSessionNodeDel { @Override public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribbleException diff --git a/scribble-core/src/main/java/org/scribble/del/RecursionDel.java b/scribble-core/src/main/java/org/scribble/del/RecursionDel.java index fb739178e..897ba6ea6 100644 --- a/scribble-core/src/main/java/org/scribble/del/RecursionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/RecursionDel.java @@ -23,7 +23,7 @@ import org.scribble.visit.util.RecVarCollector; import org.scribble.visit.wf.NameDisambiguator; -public abstract class RecursionDel extends CompoundInteractionNodeDel +public abstract class RecursionDel extends CompoundInteractionDel { public RecursionDel() { diff --git a/scribble-core/src/main/java/org/scribble/del/SimpleInteractionNodeDel.java b/scribble-core/src/main/java/org/scribble/del/SimpleSessionNodeDel.java similarity index 92% rename from scribble-core/src/main/java/org/scribble/del/SimpleInteractionNodeDel.java rename to scribble-core/src/main/java/org/scribble/del/SimpleSessionNodeDel.java index f5fd71adb..f51ddfd58 100644 --- a/scribble-core/src/main/java/org/scribble/del/SimpleInteractionNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/SimpleSessionNodeDel.java @@ -17,7 +17,7 @@ import org.scribble.job.ScribbleException; import org.scribble.visit.ProtocolDefInliner; -public abstract class SimpleInteractionNodeDel extends ScribDelBase implements InteractionNodeDel +public abstract class SimpleSessionNodeDel extends ScribDelBase implements InteractionNodeDel { @Override public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribbleException diff --git a/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java index 7de0968ed..44db254b4 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java @@ -105,8 +105,7 @@ public GConnect leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, @Override public ScribNode leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribbleException // throws - // ScribbleException + Projector proj, ScribNode visited) throws ScribbleException { GConnect gc = (GConnect) visited; Role self = proj.peekSelf(); diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java index 72b987ab9..ee15f6825 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java @@ -19,6 +19,7 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ConnectionActionDel; import org.scribble.job.ScribbleException; +import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.name.Role; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; @@ -43,6 +44,16 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, Role dest = gc.dest.toName();*/ return gc; } + + @Override + public org.scribble.lang.global.GDisconnect translate(ScribNode n, + GTypeTranslator t) throws ScribbleException + { + GDisconnect source = (GDisconnect) n; + Role left = source.getLeftChild().toName(); + Role right = source.getRightChild().toName(); + return new org.scribble.lang.global.GDisconnect(source, left, right); + } @Override public GDisconnect leaveInlinedWFChoiceCheck(ScribNode parent, @@ -92,7 +103,8 @@ public GDisconnect leaveInlinedWFChoiceCheck(ScribNode parent, } @Override - public ScribNode leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException //throws ScribbleException + public ScribNode leaveProjection(ScribNode parent, ScribNode child, + Projector proj, ScribNode visited) throws ScribbleException { GDisconnect gd = (GDisconnect) visited; Role self = proj.peekSelf(); diff --git a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java b/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java index c4da199f0..d601c3cbd 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java @@ -19,10 +19,10 @@ import java.util.stream.Stream; import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GInteractionNode; +import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GInteractionSeq; import org.scribble.ast.global.GRecursion; -import org.scribble.ast.local.LInteractionNode; +import org.scribble.ast.local.LSessionNode; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LNode; import org.scribble.del.InteractionSeqDel; @@ -46,7 +46,7 @@ public GSeq translate(ScribNode n, GTypeTranslator t) { GInteractionSeq source = (GInteractionSeq) n; List elems = new LinkedList<>(); - for (GInteractionNode c : source.getInteractionChildren()) + for (GSessionNode c : source.getInteractionChildren()) { elems.add(c.visitWith(t)); // throws ScribbleException } @@ -59,8 +59,8 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { GInteractionSeq gis = (GInteractionSeq) visited; - List gins = new LinkedList(); - for (GInteractionNode gi : gis.getInteractionChildren()) + List gins = new LinkedList(); + for (GSessionNode gi : gis.getInteractionChildren()) { ScribNode inlined = ((InlineProtocolEnv) gi.del().env()).getTranslation(); if (inlined instanceof GInteractionSeq) // A do got inlined @@ -69,7 +69,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, } else { - gins.add((GInteractionNode) inlined); + gins.add((GSessionNode) inlined); } } GInteractionSeq inlined = inl.job.config.af.GInteractionSeq(gis.getSource(), @@ -90,8 +90,8 @@ public GInteractionSeq leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException { GInteractionSeq gis = (GInteractionSeq) visited; - List lis = new LinkedList<>(); - for (GInteractionNode gi : gis.getInteractionChildren()) // FIXME: rewrite using flatMap + List lis = new LinkedList<>(); + for (GSessionNode gi : gis.getInteractionChildren()) // FIXME: rewrite using flatMap { LNode ln = (LNode) ((ProjectionEnv) gi.del().env()).getProjection(); //LNode ln = ((GInteractionNodeDel) gi.del()).project(gi, self); // FIXME: won't work for do @@ -102,7 +102,7 @@ public GInteractionSeq leaveProjection(ScribNode parent, ScribNode child, } else if (ln != null) // null is used for empty projection { - lis.add((LInteractionNode) ln); + lis.add((LSessionNode) ln); } } /*if (lis.size() == 1) // NO: needed for e.g. rec X { 1() from A to B; choice at A { continue X; } or { 2() from A to B; } } -- do instead in GRecursion @@ -149,7 +149,7 @@ public GInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, RecRemover rem, ScribNode visited) throws ScribbleException { GInteractionSeq gis = (GInteractionSeq) visited; - List gins = gis.getInteractionChildren().stream() + List gins = gis.getInteractionChildren().stream() .flatMap((gi) -> (gi instanceof GRecursion && rem.toRemove(((GRecursion) gi).getRecVarChild().toName())) ? ((GRecursion) gi).getBlockChild().getInteractSeqChild() diff --git a/scribble-core/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java b/scribble-core/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java index 4220b49ed..fd7b66e59 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java @@ -14,7 +14,7 @@ package org.scribble.del.local; import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LCompoundInteractionNode; +import org.scribble.ast.local.LCompoundInteraction; import org.scribble.job.ScribbleException; import org.scribble.visit.wf.ReachabilityChecker; import org.scribble.visit.wf.env.ReachabilityEnv; @@ -22,7 +22,7 @@ public interface LCompoundInteractionNodeDel extends LInteractionNodeDel { @Override - default LCompoundInteractionNode leaveReachabilityCheck(ScribNode parent, + default LCompoundInteraction leaveReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker, ScribNode visited) throws ScribbleException { @@ -32,6 +32,6 @@ default LCompoundInteractionNode leaveReachabilityCheck(ScribNode parent, ReachabilityEnv parent_env = checker.popEnv(); parent_env = parent_env.mergeContext(visited_env); checker.pushEnv(parent_env); - return (LCompoundInteractionNode) visited; + return (LCompoundInteraction) visited; } } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LInteractionNodeDel.java b/scribble-core/src/main/java/org/scribble/del/local/LInteractionNodeDel.java index d3f13b463..3391213a6 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LInteractionNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LInteractionNodeDel.java @@ -14,7 +14,7 @@ package org.scribble.del.local; import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LInteractionNode; +import org.scribble.ast.local.LSessionNode; import org.scribble.del.InteractionNodeDel; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; @@ -30,8 +30,8 @@ default void enterReachabilityCheck(ScribNode parent, ScribNode child, Reachabil } @Override - default LInteractionNode leaveReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker, ScribNode visited) throws ScribbleException + default LSessionNode leaveReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker, ScribNode visited) throws ScribbleException { - return (LInteractionNode) ScribDelBase.popAndSetVisitorEnv(this, checker, visited); + return (LSessionNode) ScribDelBase.popAndSetVisitorEnv(this, checker, visited); } } diff --git a/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java b/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java index ac6cc200d..d6f3ab24e 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java @@ -19,9 +19,9 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.ast.InteractionNode; +import org.scribble.ast.SessionNode; import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LInteractionNode; +import org.scribble.ast.local.LSessionNode; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LRecursion; import org.scribble.del.InteractionSeqDel; @@ -45,7 +45,7 @@ public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, throws ScribbleException { LInteractionSeq lc = (LInteractionSeq) visited; - List actions = lc.getInteractionChildren().stream() + List actions = lc.getInteractionChildren().stream() .filter(li -> li != null).collect(Collectors.toList()); return lc.reconstruct(actions); } @@ -56,8 +56,8 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { LInteractionSeq lis = (LInteractionSeq) visited; - List lins = new LinkedList(); - for (LInteractionNode li : lis.getInteractionChildren()) + List lins = new LinkedList(); + for (LSessionNode li : lis.getInteractionChildren()) { ScribNode inlined = ((InlineProtocolEnv) li.del().env()).getTranslation(); if (inlined instanceof LInteractionSeq) @@ -66,7 +66,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, } else { - lins.add((LInteractionNode) inlined); + lins.add((LSessionNode) inlined); } } LInteractionSeq inlined = @@ -80,8 +80,8 @@ public LInteractionSeq visitForReachabilityChecking( ReachabilityChecker checker, LInteractionSeq child) throws ScribbleException { - List visited = new LinkedList<>(); - for (InteractionNode li : child.getInteractionChildren()) + List visited = new LinkedList<>(); + for (SessionNode li : child.getInteractionChildren()) { ReachabilityEnv re = checker.peekEnv(); if (!re.isSequenceable()) @@ -89,7 +89,7 @@ public LInteractionSeq visitForReachabilityChecking( throw new ScribbleException(li.getSource(), "Invalid/unreachable sequence to: " + li); } - visited.add((LInteractionNode) li.accept(checker)); + visited.add((LSessionNode) li.accept(checker)); } return child; } @@ -149,7 +149,7 @@ public LInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, RecRemover rem, ScribNode visited) throws ScribbleException { LInteractionSeq lis = (LInteractionSeq) visited; - List lins = lis.getInteractionChildren().stream() + List lins = lis.getInteractionChildren().stream() .flatMap((li) -> (li instanceof LRecursion && rem.toRemove(((LRecursion) li).getRecVarChild().toName())) ? ((LRecursion) li).getBlockChild().getInteractSeqChild() diff --git a/scribble-core/src/main/java/org/scribble/job/JobConfig.java b/scribble-core/src/main/java/org/scribble/job/JobConfig.java index e303f5f2b..9754f2963 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobConfig.java +++ b/scribble-core/src/main/java/org/scribble/job/JobConfig.java @@ -30,7 +30,7 @@ public class JobConfig public final boolean minEfsm; // Currently only affects EFSM output (i.e. -fsm, -dot) and API gen -- doesn't affect model checking public final boolean fair; public final boolean noLocalChoiceSubjectCheck; - public final boolean noAcceptCorrelationCheck; + public final boolean noAcceptCorrelationCheck; // Currently unused public final boolean noValidation; public final boolean spin; diff --git a/scribble-core/src/main/java/org/scribble/lang/BasicInteraction.java b/scribble-core/src/main/java/org/scribble/lang/BasicInteraction.java new file mode 100644 index 000000000..9cde3a66b --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/BasicInteraction.java @@ -0,0 +1,48 @@ +package org.scribble.lang; + +import java.util.Collections; +import java.util.List; +import java.util.Set; + +import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.ProtocolName; +import org.scribble.type.name.RecVar; + +public abstract class BasicInteraction + extends STypeBase implements SType +{ + public BasicInteraction(org.scribble.ast.BasicInteraction source) + { + super(source); + } + + @Override + public Set getRecVars() + { + return Collections.emptySet(); + } + + @Override + public BasicInteraction pruneRecs() + { + return this; + } + + @Override + public BasicInteraction getInlined(STypeInliner i) + { + return this; + } + + @Override + public List> getProtoDependencies() + { + return Collections.emptyList(); + } + + @Override + public org.scribble.ast.BasicInteraction getSource() + { + return (org.scribble.ast.BasicInteraction) super.getSource(); + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/ConnectAction.java b/scribble-core/src/main/java/org/scribble/lang/ConnectAction.java new file mode 100644 index 000000000..8b3e5bac4 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/ConnectAction.java @@ -0,0 +1,54 @@ +package org.scribble.lang; + +import java.util.LinkedList; +import java.util.List; + +import org.scribble.type.Message; +import org.scribble.type.MessageSig; +import org.scribble.type.Payload; +import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.DataType; +import org.scribble.type.name.MemberName; +import org.scribble.type.name.MessageSigName; +import org.scribble.type.name.PayloadElemType; +import org.scribble.type.name.Role; + +public abstract class ConnectAction + extends DirectedInteraction +{ + public ConnectAction(org.scribble.ast.DirectedInteraction source, // BaseInteractionNode not ideal + Role src, Message msg, Role dst) + { + super(source, src, msg, dst); + } + + @Override + public List> getNonProtoDependencies() + { + List> res = new LinkedList<>(); + if (this.msg.isMessageSigName()) + { + res.add((MessageSigName) this.msg); + } + else //if (this.msg.isMessageSig) + { + Payload pay = ((MessageSig) this.msg).payload; + for (PayloadElemType p : pay.elems) + { + if (p.isDataType()) + { + res.add((DataType) p); + } + else if (p.isGDelegationType()) + { + throw new RuntimeException("Shouldn't get in here: " + this); + } + else + { + throw new RuntimeException("[TODO]: " + this); + } + } + } + return res; + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/lang/DirectedInteraction.java new file mode 100644 index 000000000..ce38a89a7 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/DirectedInteraction.java @@ -0,0 +1,89 @@ +package org.scribble.lang; + +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.type.Message; +import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.MemberName; +import org.scribble.type.name.Role; + +// Besides directed-ness, also features a Message +public abstract class DirectedInteraction + extends BasicInteraction +{ + public final Role src; + public final Message msg; + public final Role dst; + + public DirectedInteraction(org.scribble.ast.DirectedInteraction source, + Role src, Message msg, Role dst) + { + super(source); + this.src = src; + this.msg = msg; + this.dst = dst; + } + + public abstract DirectedInteraction reconstruct( + org.scribble.ast.DirectedInteraction source, Role src, Message msg, + Role dst); + + @Override + public Set getRoles() + { + // Includes self + return Stream.of(this.src, this.dst).collect(Collectors.toSet()); + } + + @Override + public DirectedInteraction substitute(Substitutions subs) + { + Message msg = this.msg; + if (msg instanceof MemberName) + { + MemberName n = (MemberName) msg; + if (subs.hasArg(n)) + { + msg = (Message) subs.subsArg(n); + } + } + return reconstruct(getSource(), subs.subsRole(this.src), msg, + subs.subsRole(this.dst)); + } + + @Override + public org.scribble.ast.DirectedInteraction getSource() + { + return (org.scribble.ast.DirectedInteraction) super.getSource(); + } + + @Override + public int hashCode() + { + int hash = 10631; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.src.hashCode(); + hash = 31 * hash + this.msg.hashCode(); + hash = 31 * hash + this.dst.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof DirectedInteraction)) + { + return false; + } + DirectedInteraction them = (DirectedInteraction) o; + return super.equals(this) // Does canEquals + && this.src.equals(them.src) && this.msg.equals(them.msg) + && this.dst.equals(them.dst); + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/lang/DisconnectAction.java new file mode 100644 index 000000000..04e73acc1 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/DisconnectAction.java @@ -0,0 +1,82 @@ +package org.scribble.lang; + +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.MemberName; +import org.scribble.type.name.Role; + +// Base class would be "SymmetricInteraction" (cf., DirectedInteraction) +public abstract class DisconnectAction + extends BasicInteraction +{ + public final Role left; + public final Role right; + + public DisconnectAction(org.scribble.ast.DisconnectAction source, + Role left, Role right) + { + super(source); + this.left = left; + this.right = right; + } + + public abstract DisconnectAction reconstruct( + org.scribble.ast.DisconnectAction source, Role src, Role dst); + + @Override + public Set getRoles() + { + // Includes self + return Stream.of(this.left, this.right).collect(Collectors.toSet()); + } + + @Override + public DisconnectAction substitute(Substitutions subs) + { + return reconstruct(getSource(), subs.subsRole(this.left), + subs.subsRole(this.right)); + } + + @Override + public List> getNonProtoDependencies() + { + return Collections.emptyList(); + } + + @Override + public org.scribble.ast.DisconnectAction getSource() + { + return (org.scribble.ast.DisconnectAction) super.getSource(); + } + + @Override + public int hashCode() + { + int hash = 10663; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.left.hashCode(); + hash = 31 * hash + this.right.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof DisconnectAction)) + { + return false; + } + DisconnectAction them = (DisconnectAction) o; + return super.equals(this) // Does canEquals + && this.left.equals(them.left) && this.right.equals(them.right); + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java index 0d6489fe0..e37ae3015 100644 --- a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java @@ -15,9 +15,9 @@ import org.scribble.type.name.Role; public abstract class MessageTransfer - extends Interaction + extends DirectedInteraction { - public MessageTransfer(org.scribble.ast.BaseInteractionNode source, // BaseInteractionNode not ideal + public MessageTransfer(org.scribble.ast.DirectedInteraction source, // DirectedInteraction not ideal (imprecise) Role src, Message msg, Role dst) { super(source, src, msg, dst); diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GConnect.java b/scribble-core/src/main/java/org/scribble/lang/global/GConnect.java new file mode 100644 index 000000000..4d19de30a --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/global/GConnect.java @@ -0,0 +1,142 @@ +package org.scribble.lang.global; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.scribble.job.ScribbleException; +import org.scribble.lang.ConnectAction; +import org.scribble.lang.Projector; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.Substitutions; +import org.scribble.lang.local.LAcc; +import org.scribble.lang.local.LReq; +import org.scribble.lang.local.LSkip; +import org.scribble.lang.local.LType; +import org.scribble.type.Message; +import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; + +public class GConnect extends ConnectAction + implements GType +{ + + public GConnect(org.scribble.ast.DirectedInteraction source, // DirectedInteraction not ideal (imprecise) + Role src, Message msg, Role dst) + { + super(source, src, msg, dst); + } + + @Override + public GConnect reconstruct( + org.scribble.ast.DirectedInteraction source, Role src, Message msg, + Role dst) + { + return new GConnect(source, src, msg, dst); + } + + @Override + public GConnect substitute(Substitutions subs) + { + return (GConnect) super.substitute(subs); + } + + @Override + public GConnect getInlined(STypeInliner i)//, Deque stack) + { + return (GConnect) super.getInlined(i); + } + + @Override + public GConnect unfoldAllOnce(STypeUnfolder u) + { + return this; + } + + @Override + public LType projectInlined(Role self) + { + if (this.src.equals(self)) + { + /*if (this.dst.equals(self)) + { + // CHECKME: already checked? + }*/ + return new LReq(null, this.msg, this.dst); + } + else if (this.dst.equals(self)) + { + return new LAcc(null, this.src, this.msg); + } + else + { + return LSkip.SKIP; + } + } + + @Override + public LType project(Projector v) + { + return projectInlined(v.self); // No need for "aux", no recursive call + } + + @Override + public Set checkRoleEnabling(Set enabled) throws ScribbleException + { + if (!enabled.contains(this.src)) + { + throw new ScribbleException("Source role not enabled: " + this.src); + } + if (enabled.contains(this.dst)) + { + return enabled; + } + Set tmp = new HashSet<>(enabled); + tmp.add(this.dst); + return Collections.unmodifiableSet(tmp); + } + + @Override + public Map checkExtChoiceConsistency(Map enablers) + throws ScribbleException + { + if (enablers.containsKey(this.dst)) + { + return enablers; + } + Map tmp = new HashMap<>(enablers); + tmp.put(this.dst, this.src); + return Collections.unmodifiableMap(tmp); + } + + @Override + public int hashCode() + { + int hash = 10639; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof GConnect)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof GConnect; + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDisconnect.java b/scribble-core/src/main/java/org/scribble/lang/global/GDisconnect.java new file mode 100644 index 000000000..94e5ddc0b --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDisconnect.java @@ -0,0 +1,128 @@ +package org.scribble.lang.global; + +import java.util.Map; +import java.util.Set; + +import org.scribble.job.ScribbleException; +import org.scribble.lang.DisconnectAction; +import org.scribble.lang.Projector; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.Substitutions; +import org.scribble.lang.local.LDisconnect; +import org.scribble.lang.local.LSkip; +import org.scribble.lang.local.LType; +import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; + +public class GDisconnect extends DisconnectAction + implements GType +{ + + public GDisconnect(org.scribble.ast.DisconnectAction source, + Role left, Role right) + { + super(source, left, right); + } + + @Override + public GDisconnect reconstruct( + org.scribble.ast.DisconnectAction source, Role left, Role right) + { + return new GDisconnect(source, left, right); + } + + @Override + public GDisconnect substitute(Substitutions subs) + { + return (GDisconnect) super.substitute(subs); + } + + @Override + public GDisconnect getInlined(STypeInliner i)//, Deque stack) + { + return (GDisconnect) super.getInlined(i); + } + + @Override + public GDisconnect unfoldAllOnce(STypeUnfolder u) + { + return this; + } + + @Override + public LType projectInlined(Role self) + { + if (this.left.equals(self)) + { + /*if (this.dst.equals(self)) + { + // CHECKME: already checked? + }*/ + return new LDisconnect(null, this.right); + } + else if (this.right.equals(self)) + { + return new LDisconnect(null, this.left); + } + else + { + return LSkip.SKIP; + } + } + + @Override + public LType project(Projector v) + { + return projectInlined(v.self); // No need for "aux", no recursive call + } + + @Override + public Set checkRoleEnabling(Set enabled) throws ScribbleException + { + if (!enabled.contains(this.left)) + { + throw new ScribbleException("Role not enabled: " + this.left); + } + if (!enabled.contains(this.right)) + { + throw new ScribbleException("Role not enabled: " + this.right); + } + return enabled; + } + + @Override + public Map checkExtChoiceConsistency(Map enablers) + throws ScribbleException + { + return enablers; + } + + @Override + public int hashCode() + { + int hash = 8747; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof GDisconnect)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof GDisconnect; + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java index 260d8434f..2310c9836 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java @@ -24,7 +24,7 @@ public class GMessageTransfer extends MessageTransfer implements GType { - public GMessageTransfer(org.scribble.ast.BaseInteractionNode source, + public GMessageTransfer(org.scribble.ast.DirectedInteraction source, Role src, Message msg, Role dst) { super(source, src, msg, dst); @@ -32,7 +32,7 @@ public GMessageTransfer(org.scribble.ast.BaseInteractionNode source, @Override public GMessageTransfer reconstruct( - org.scribble.ast.BaseInteractionNode source, Role src, Message msg, + org.scribble.ast.DirectedInteraction source, Role src, Message msg, Role dst) { return new GMessageTransfer(source, src, msg, dst); diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GType.java b/scribble-core/src/main/java/org/scribble/lang/global/GType.java index e4f3a53cd..7492b5aef 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GType.java @@ -28,6 +28,10 @@ public interface GType extends SType // Returns enablers post visiting Map checkExtChoiceConsistency(Map enablers) throws ScribbleException; + + // Pre: conns is reflexive + // Also does correlation warnings + //Map checkConnections(Map conns) throws ScribbleException; /*@Override GType substitute(Substitutions subs);*/ // Otherwise causes return type inconsistency with base abstract classes diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LAcc.java b/scribble-core/src/main/java/org/scribble/lang/local/LAcc.java new file mode 100644 index 000000000..23ab73202 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/local/LAcc.java @@ -0,0 +1,121 @@ +package org.scribble.lang.local; + +import java.util.Set; + +import org.scribble.job.ScribbleException; +import org.scribble.lang.ConnectAction; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.Substitutions; +import org.scribble.model.endpoint.EGraphBuilderUtil2; +import org.scribble.type.Message; +import org.scribble.type.MessageSig; +import org.scribble.type.Payload; +import org.scribble.type.kind.Local; +import org.scribble.type.name.MessageId; +import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; + +public class LAcc extends ConnectAction + implements LType +{ + + // this.dst == Role.SELF + public LAcc(org.scribble.ast.DirectedInteraction source, + Role src, Message msg) + { + super(source, src, msg, Role.SELF); + } + + // FIXME: unnecessary dst + @Override + public LAcc reconstruct( + org.scribble.ast.DirectedInteraction source, Role src, Message msg, + Role dst) + { + return new LAcc(source, src, msg); + } + + @Override + public RecVar isSingleCont() + { + return null; + } + + @Override + public boolean isSingleConts(Set rvs) + { + return false; + } + + @Override + public LAcc substitute(Substitutions subs) + { + return (LAcc) super.substitute(subs); + } + + @Override + public LAcc getInlined(STypeInliner i)//, Deque stack) + { + return (LAcc) super.getInlined(i); + } + + @Override + public LAcc unfoldAllOnce(STypeUnfolder u) + { + return this; + } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + Role peer = this.src; + MessageId mid = this.msg.getId(); + Payload payload = this.msg.isMessageSig() // CHECKME: generalise? (e.g., hasPayload) + ? ((MessageSig) msg).payload + : Payload.EMPTY_PAYLOAD; + b.addEdge(b.getEntry(), b.ef.newEAccept(peer, mid, payload), b.getExit()); + } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribbleException + { + return env; + } + + @Override + public String toString() + { + return this.msg + " accept " + this.src + ";"; + } + + @Override + public int hashCode() + { + int hash = 10601; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof LAcc)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof LAcc; + } + +} diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LDisconnect.java b/scribble-core/src/main/java/org/scribble/lang/local/LDisconnect.java new file mode 100644 index 000000000..d9c558157 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/local/LDisconnect.java @@ -0,0 +1,117 @@ +package org.scribble.lang.local; + +import java.util.Set; + +import org.scribble.job.ScribbleException; +import org.scribble.lang.DisconnectAction; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.Substitutions; +import org.scribble.model.endpoint.EGraphBuilderUtil2; +import org.scribble.type.kind.Local; +import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; + +public class LDisconnect extends DisconnectAction + implements LType +{ + + // this.src == Role.SELF + public LDisconnect(org.scribble.ast.DisconnectAction source, + Role peer) + { + super(source, Role.SELF, peer); + } + + public Role getPeer() + { + return this.right; + } + + // CHECKME: remove unnecessary self ? + @Override + public LDisconnect reconstruct( + org.scribble.ast.DisconnectAction source, Role self, Role peer) + { + return new LDisconnect(source, peer); + } + + @Override + public RecVar isSingleCont() + { + return null; + } + + @Override + public boolean isSingleConts(Set rvs) + { + return false; + } + + @Override + public LDisconnect substitute(Substitutions subs) + { + return (LDisconnect) super.substitute(subs); + } + + @Override + public LDisconnect getInlined(STypeInliner i)//, Deque stack) + { + return (LDisconnect) super.getInlined(i); + } + + @Override + public LDisconnect unfoldAllOnce(STypeUnfolder u) + { + return this; + } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + Role peer = getPeer(); + // TODO: add toAction method to base Interaction + b.addEdge(b.getEntry(), b.ef.newEDisconnect(peer), b.getExit()); + } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribbleException + { + return env; + } + + @Override + public String toString() + { + return "disconnect " + getPeer() + ";"; + } + + @Override + public int hashCode() + { + int hash = 8753; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof LDisconnect)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof LDisconnect; + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java b/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java index c05d743ac..cf495e844 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java @@ -21,7 +21,7 @@ public class LRcv extends MessageTransfer { // this.dst == Role.SELF - public LRcv(org.scribble.ast.BaseInteractionNode source, + public LRcv(org.scribble.ast.DirectedInteraction source, Role src, Message msg) { super(source, src, msg, Role.SELF); @@ -30,7 +30,7 @@ public LRcv(org.scribble.ast.BaseInteractionNode source, // FIXME: unnecessary dst @Override public LRcv reconstruct( - org.scribble.ast.BaseInteractionNode source, Role src, Message msg, + org.scribble.ast.DirectedInteraction source, Role src, Message msg, Role dst) { return new LRcv(source, src, msg); diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LReq.java b/scribble-core/src/main/java/org/scribble/lang/local/LReq.java new file mode 100644 index 000000000..7360dcb56 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/local/LReq.java @@ -0,0 +1,122 @@ +package org.scribble.lang.local; + +import java.util.Set; + +import org.scribble.job.ScribbleException; +import org.scribble.lang.ConnectAction; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.Substitutions; +import org.scribble.model.endpoint.EGraphBuilderUtil2; +import org.scribble.type.Message; +import org.scribble.type.MessageSig; +import org.scribble.type.Payload; +import org.scribble.type.kind.Local; +import org.scribble.type.name.MessageId; +import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; + +public class LReq extends ConnectAction + implements LType +{ + + // this.src == Role.SELF + public LReq(org.scribble.ast.DirectedInteraction source, + Message msg, Role dst) + { + super(source, Role.SELF, msg, dst); + } + + // CHECKME: remove unnecessary src ? + @Override + public LReq reconstruct( + org.scribble.ast.DirectedInteraction source, Role src, Message msg, + Role dst) + { + return new LReq(source, msg, dst); + } + + @Override + public RecVar isSingleCont() + { + return null; + } + + @Override + public boolean isSingleConts(Set rvs) + { + return false; + } + + @Override + public LReq substitute(Substitutions subs) + { + return (LReq) super.substitute(subs); + } + + @Override + public LReq getInlined(STypeInliner i)//, Deque stack) + { + return (LReq) super.getInlined(i); + } + + @Override + public LReq unfoldAllOnce(STypeUnfolder u) + { + return this; + } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + Role peer = this.dst; + MessageId mid = this.msg.getId(); + Payload payload = this.msg.isMessageSig() // CHECKME: generalise? (e.g., hasPayload) + ? ((MessageSig) msg).payload + : Payload.EMPTY_PAYLOAD; + // TODO: add toAction method to base Interaction + b.addEdge(b.getEntry(), b.ef.newERequest(peer, mid, payload), b.getExit()); + } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribbleException + { + return env; + } + + @Override + public String toString() + { + return this.msg + " request " + this.dst + ";"; + } + + @Override + public int hashCode() + { + int hash = 10597; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof LReq)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof LReq; + } + +} diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSend.java b/scribble-core/src/main/java/org/scribble/lang/local/LSend.java index b30267835..987986f8e 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSend.java @@ -21,7 +21,7 @@ public class LSend extends MessageTransfer { // this.src == Role.SELF - public LSend(org.scribble.ast.BaseInteractionNode source, + public LSend(org.scribble.ast.DirectedInteraction source, Message msg, Role dst) { super(source, Role.SELF, msg, dst); @@ -30,7 +30,7 @@ public LSend(org.scribble.ast.BaseInteractionNode source, // CHECKME: remove unnecessary src ? @Override public LSend reconstruct( - org.scribble.ast.BaseInteractionNode source, Role src, Message msg, + org.scribble.ast.DirectedInteraction source, Role src, Message msg, Role dst) { return new LSend(source, msg, dst); diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java index 0e69ad8d8..cc01af2e6 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java @@ -18,7 +18,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LChoice; import org.scribble.ast.local.LDo; -import org.scribble.ast.local.LInteractionNode; +import org.scribble.ast.local.LSessionNode; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.local.LProtocolDecl; @@ -54,7 +54,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) LChoice lc = (LChoice) parent; LProtocolBlock lb = (LProtocolBlock) child; LInteractionSeq lis = lb.getInteractSeqChild(); - List ins = lis.getInteractionChildren(); + List ins = lis.getInteractionChildren(); if (ins.get(0) instanceof LDo) // Unlike GRecursion.prune, to-prune "do" could be followed by a continuation? { JobContext jc = this.job.getContext(); diff --git a/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java b/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java index 43a1bc0b1..346186caf 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java @@ -18,7 +18,7 @@ import org.scribble.ast.context.ModuleContext; import org.scribble.ast.local.LChoice; import org.scribble.ast.local.LDo; -import org.scribble.ast.local.LInteractionNode; +import org.scribble.ast.local.LSessionNode; import org.scribble.ast.local.LProtocolBlock; import org.scribble.job.Job; import org.scribble.job.ScribbleException; @@ -78,7 +78,7 @@ private ScribNode visitOverrideForLDoPruning(ScribNode parent, LChoice lc) { for (LProtocolBlock b : lc.getBlockChildren()) { - LInteractionNode in = + LSessionNode in = b.getInteractSeqChild().getInteractionChildren().get(0); if (in instanceof LDo) { diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGInteractionSequence.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGInteractionSequence.java index d938913ce..d7e885d79 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGInteractionSequence.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGInteractionSequence.java @@ -19,7 +19,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.global.GInteractionNode; +import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GInteractionSeq; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.AntlrToScribParserUtil; @@ -31,10 +31,10 @@ public static GInteractionSeq parseGInteractionSequence(AntlrToScribParser parse { /*List gis = getInteractionChildren(ct).stream().map((gi) -> (GInteractionNode) parser.parse(gi)).collect(Collectors.toList());*/ - List gis = new LinkedList<>(); + List gis = new LinkedList<>(); for (CommonTree gi : getInteractionChildren(ct)) { - gis.add((GInteractionNode) parser.parse(gi, af)); + gis.add((GSessionNode) parser.parse(gi, af)); } return af.GInteractionSeq(ct, gis); } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 0b4d04861..59647e656 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -79,6 +79,10 @@ explicit global protocol Foo(role A, role B, role C) explicit global protocol Foo(role A, role B) { + //connect A to B; + 1() from A to B; + disconnect A and B; + connect A to B; 1() from A to B; } From 3c1f2391dec88c9ec5ff690e60aa2397f95db068 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 3 Apr 2019 19:49:43 +0100 Subject: [PATCH 157/539] Minor. --- .../org/scribble/lang/global/GChoice.java | 23 +++++++++++++--- .../java/org/scribble/lang/global/GSeq.java | 11 ++++++++ .../java/org/scribble/lang/global/GType.java | 1 + scribble-test/src/test/scrib/tmp/Test.scr | 27 +++++++++++++++++++ 4 files changed, 58 insertions(+), 4 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java index fd0690d89..08c9a02b6 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -133,18 +133,18 @@ public Map checkExtChoiceConsistency(Map enablers) blocks.add(block.checkExtChoiceConsistency(subj)); } Map res = new HashMap<>(enablers); - Set> tmp = blocks.stream() + Set> all = blocks.stream() .flatMap(x -> x.entrySet().stream()).collect(Collectors.toSet()); - for (Entry e : tmp) + for (Entry e : all) { Role enabled = e.getKey(); Role enabler = e.getValue(); - if (tmp.stream().anyMatch( + if (all.stream().anyMatch( x -> x.getKey().equals(enabled) && !x.getValue().equals(enabler))) { throw new ScribbleException( "Inconsistent external choice subjects for " + enabled + ": " - + tmp.stream().filter(x -> x.getKey().equals(enabled)) + + all.stream().filter(x -> x.getKey().equals(enabled)) .collect(Collectors.toList())); } if (!res.containsKey(enabled)) @@ -154,6 +154,21 @@ public Map checkExtChoiceConsistency(Map enablers) } return Collections.unmodifiableMap(res); } + + /*@Override + public Map checkConnections(Map conns) + throws ScribbleException + { + List> blocks = new LinkedList<>(); + for (GSeq block : this.blocks) + { + blocks.add(block.checkConnections(conns)); + } + return blocks.stream().flatMap(x -> x.entrySet().stream()).distinct() + .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); + // "may" merge -- check for possible duplicate connections + // FIXME: but unconnected error needs "must" connections; also "duplicate" disconnect + }*/ @Override public org.scribble.ast.global.GChoice getSource() diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java index e980cf232..455d19366 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -149,6 +149,17 @@ public Map checkExtChoiceConsistency(Map enablers) return enablers; } + /*@Override + public Map checkConnections(Map conns) + throws ScribbleException + { + for (GType elem : getElements()) + { + conns = elem.checkConnections(conns); + } + return conns; + }*/ + @Override public List getElements() { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GType.java b/scribble-core/src/main/java/org/scribble/lang/global/GType.java index 7492b5aef..3351ffdee 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GType.java @@ -32,6 +32,7 @@ Map checkExtChoiceConsistency(Map enablers) // Pre: conns is reflexive // Also does correlation warnings //Map checkConnections(Map conns) throws ScribbleException; + // Check on model instead: could possibly do syntactically on once-unfolding, but still need separate checks for dup-conn, unconnected and bad-dconn (may vs. must) /*@Override GType substitute(Substitutions subs);*/ // Otherwise causes return type inconsistency with base abstract classes diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 59647e656..3fc8b2db4 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -57,6 +57,31 @@ module tmp.Test; // TODO make test framework to check proj->inline matches inline->proj // TODO make test framework to check global-"proj"-via-taus matches actual proj -- matches mean language acceptance? + // could also test once-unfold-all against model + + +/* +explicit global protocol Foo(role A, role B, role C) +{ + connect A to B; + do FooAux(A, B, C); +} + +aux explicit global protocol FooAux(role A, role B, role C) +{ + choice at A + { + 1() from A to B; + do FooAux(A, B, C); + } + or + { + 2() from A to B; + connect A to C; + 3() from A to C; + } +} +//*/ /* @@ -77,6 +102,7 @@ explicit global protocol Foo(role A, role B, role C) //*/ +//* explicit global protocol Foo(role A, role B) { //connect A to B; @@ -85,6 +111,7 @@ explicit global protocol Foo(role A, role B) connect A to B; 1() from A to B; } +//*/ /* From fb7f80c826fb7c7905cea149a4ca27de98e6c73b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 3 Apr 2019 20:12:18 +0100 Subject: [PATCH 158/539] Added scribble-lang Maven module. --- pom.xml | 20 ++++++++++---------- scribble-dist/pom.xml | 4 ++++ scribble-lang/pom.xml | 27 +++++++++++++++++++++++++++ scribble-parser/pom.xml | 5 +++++ scribble-test/pom.xml | 4 ++++ 5 files changed, 50 insertions(+), 10 deletions(-) create mode 100644 scribble-lang/pom.xml diff --git a/pom.xml b/pom.xml index f0181a08d..89565528f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,11 +1,5 @@ - - - - - - + 4.0.0 org.scribble parent @@ -84,7 +78,8 @@ scribble-test scribble-dist scribble-demos - + scribble-lang + @@ -98,6 +93,11 @@ scribble-parser ${project.version} + + org.scribble + scribble-lang + ${project.version} + org.scribble scribble-cli @@ -244,7 +244,7 @@ false checkstyle/suppressions.xml false - + @@ -381,4 +381,4 @@ - + \ No newline at end of file diff --git a/scribble-dist/pom.xml b/scribble-dist/pom.xml index a9e9d844a..34173239a 100644 --- a/scribble-dist/pom.xml +++ b/scribble-dist/pom.xml @@ -27,6 +27,10 @@ org.scribble scribble-core + + org.scribble + scribble-lang + org.scribble scribble-parser diff --git a/scribble-lang/pom.xml b/scribble-lang/pom.xml new file mode 100644 index 000000000..8236974c3 --- /dev/null +++ b/scribble-lang/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + scribble-lang + jar + scribble-lang + + + org.scribble + parent + 0.4.4-SNAPSHOT + + + http://maven.apache.org + + UTF-8 + + + + + org.scribble + scribble-core + + + + diff --git a/scribble-parser/pom.xml b/scribble-parser/pom.xml index 09d2e2c42..4f2738b88 100644 --- a/scribble-parser/pom.xml +++ b/scribble-parser/pom.xml @@ -18,6 +18,11 @@ scribble-core + + org.scribble + scribble-lang + + org.antlr antlr-runtime diff --git a/scribble-test/pom.xml b/scribble-test/pom.xml index 2eb1d7b4e..6e6b9f08f 100644 --- a/scribble-test/pom.xml +++ b/scribble-test/pom.xml @@ -26,6 +26,10 @@ org.scribble scribble-parser + + org.scribble + scribble-lang + org.scribble scribble-cli From 80eee045d3d9a68fd55752aa8fac6c55df501748 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 3 Apr 2019 20:30:32 +0100 Subject: [PATCH 159/539] Fixing poms and adding missing file headers. --- pom.xml | 1 + .../java/callbackapi/CBEndpointApiGenerator.java | 13 +++++++++++++ .../java/callbackapi/CBEndpointApiGenerator2.java | 13 +++++++++++++ .../java/callbackapi/CBEndpointApiGenerator3.java | 13 +++++++++++++ .../src/main/java/org/scribble/ast/AuxMod.java | 13 +++++++++++++ .../src/main/java/org/scribble/ast/ExplicitMod.java | 13 +++++++++++++ .../src/main/java/org/scribble/ast/ProtocolMod.java | 13 +++++++++++++ .../src/main/java/org/scribble/ast/ScribNil.java | 13 +++++++++++++ .../java/org/scribble/lang/BasicInteraction.java | 13 +++++++++++++ .../src/main/java/org/scribble/lang/Choice.java | 13 +++++++++++++ .../main/java/org/scribble/lang/ConnectAction.java | 13 +++++++++++++ .../src/main/java/org/scribble/lang/Continue.java | 13 +++++++++++++ .../java/org/scribble/lang/DirectedInteraction.java | 13 +++++++++++++ .../java/org/scribble/lang/DisconnectAction.java | 13 +++++++++++++ .../src/main/java/org/scribble/lang/Do.java | 13 +++++++++++++ .../main/java/org/scribble/lang/LangConstants.java | 13 +++++++++++++ .../java/org/scribble/lang/MessageTransfer.java | 13 +++++++++++++ .../src/main/java/org/scribble/lang/Projector.java | 13 +++++++++++++ .../src/main/java/org/scribble/lang/Protocol.java | 13 +++++++++++++ .../main/java/org/scribble/lang/ProtocolMod.java | 13 +++++++++++++ .../src/main/java/org/scribble/lang/Recursion.java | 13 +++++++++++++ .../src/main/java/org/scribble/lang/SType.java | 13 +++++++++++++ .../src/main/java/org/scribble/lang/STypeBase.java | 13 +++++++++++++ .../main/java/org/scribble/lang/STypeInliner.java | 13 +++++++++++++ .../main/java/org/scribble/lang/STypeUnfolder.java | 13 +++++++++++++ .../src/main/java/org/scribble/lang/Seq.java | 13 +++++++++++++ .../main/java/org/scribble/lang/Substitutions.java | 13 +++++++++++++ .../main/java/org/scribble/lang/global/GChoice.java | 13 +++++++++++++ .../java/org/scribble/lang/global/GConnect.java | 13 +++++++++++++ .../java/org/scribble/lang/global/GContinue.java | 13 +++++++++++++ .../java/org/scribble/lang/global/GDisconnect.java | 13 +++++++++++++ .../src/main/java/org/scribble/lang/global/GDo.java | 13 +++++++++++++ .../org/scribble/lang/global/GMessageTransfer.java | 13 +++++++++++++ .../java/org/scribble/lang/global/GProtocol.java | 13 +++++++++++++ .../java/org/scribble/lang/global/GRecursion.java | 13 +++++++++++++ .../main/java/org/scribble/lang/global/GSeq.java | 13 +++++++++++++ .../main/java/org/scribble/lang/global/GType.java | 13 +++++++++++++ .../org/scribble/lang/global/GTypeTranslator.java | 13 +++++++++++++ .../src/main/java/org/scribble/lang/local/LAcc.java | 13 +++++++++++++ .../main/java/org/scribble/lang/local/LChoice.java | 13 +++++++++++++ .../java/org/scribble/lang/local/LContinue.java | 13 +++++++++++++ .../java/org/scribble/lang/local/LDisconnect.java | 13 +++++++++++++ .../src/main/java/org/scribble/lang/local/LDo.java | 13 +++++++++++++ .../java/org/scribble/lang/local/LProjection.java | 13 +++++++++++++ .../java/org/scribble/lang/local/LProtocol.java | 13 +++++++++++++ .../src/main/java/org/scribble/lang/local/LRcv.java | 13 +++++++++++++ .../java/org/scribble/lang/local/LRecursion.java | 13 +++++++++++++ .../src/main/java/org/scribble/lang/local/LReq.java | 13 +++++++++++++ .../main/java/org/scribble/lang/local/LSend.java | 13 +++++++++++++ .../src/main/java/org/scribble/lang/local/LSeq.java | 13 +++++++++++++ .../main/java/org/scribble/lang/local/LSkip.java | 13 +++++++++++++ .../main/java/org/scribble/lang/local/LType.java | 13 +++++++++++++ .../org/scribble/lang/local/ReachabilityEnv.java | 13 +++++++++++++ .../model/endpoint/IntermediateContinueEdge.java | 13 +++++++++++++ .../model/endpoint/IntermediateRecEdge.java | 13 +++++++++++++ .../antlr3/org/scribble/parser/antlr/Scribble.g | 4 ++-- .../parser/scribble/AntlrToScribParser.java | 6 ++---- .../scribble/parser/scribble/ScribTreeAdaptor.java | 13 +++++++++++++ .../parser/scribble/ast/tree/MyCommonTree.java | 13 +++++++++++++ .../org/scribble/runtime/handlers/ScribBranch.java | 13 +++++++++++++ .../scribble/runtime/handlers/ScribOutputEvent.java | 13 +++++++++++++ .../scribble/runtime/handlers/ScribSigMessage.java | 13 +++++++++++++ .../runtime/handlers/states/ScribEndState.java | 13 +++++++++++++ .../runtime/handlers/states/ScribInputState.java | 13 +++++++++++++ .../runtime/handlers/states/ScribOutputState.java | 13 +++++++++++++ .../runtime/handlers/states/ScribState.java | 13 +++++++++++++ 66 files changed, 824 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 89565528f..e735ae1a9 100644 --- a/pom.xml +++ b/pom.xml @@ -285,6 +285,7 @@ bin/*.sh scribblec.sh **/*.swp + scribble-test/src/test/scrib/**/* scribble-f17/**/* diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 971f525be..b29814bac 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.codegen.java.callbackapi; import java.util.HashMap; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java index 24f5e5f9b..a613e67ee 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.codegen.java.callbackapi; import java.util.HashMap; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 3af9985dc..d7756f2e3 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.codegen.java.callbackapi; import java.util.Comparator; diff --git a/scribble-core/src/main/java/org/scribble/ast/AuxMod.java b/scribble-core/src/main/java/org/scribble/ast/AuxMod.java index ef5bf8264..2146d0585 100644 --- a/scribble-core/src/main/java/org/scribble/ast/AuxMod.java +++ b/scribble-core/src/main/java/org/scribble/ast/AuxMod.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.ast; import org.antlr.runtime.Token; diff --git a/scribble-core/src/main/java/org/scribble/ast/ExplicitMod.java b/scribble-core/src/main/java/org/scribble/ast/ExplicitMod.java index 38631d33c..36ef1208f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ExplicitMod.java +++ b/scribble-core/src/main/java/org/scribble/ast/ExplicitMod.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.ast; import org.antlr.runtime.Token; diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java b/scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java index 2acf48e31..763aa74f8 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java +++ b/scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.ast; import org.antlr.runtime.Token; diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNil.java b/scribble-core/src/main/java/org/scribble/ast/ScribNil.java index 28edb6d4c..9ac462094 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNil.java +++ b/scribble-core/src/main/java/org/scribble/ast/ScribNil.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.ast; import org.antlr.runtime.Token; diff --git a/scribble-core/src/main/java/org/scribble/lang/BasicInteraction.java b/scribble-core/src/main/java/org/scribble/lang/BasicInteraction.java index 9cde3a66b..090ec89f7 100644 --- a/scribble-core/src/main/java/org/scribble/lang/BasicInteraction.java +++ b/scribble-core/src/main/java/org/scribble/lang/BasicInteraction.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/lang/Choice.java b/scribble-core/src/main/java/org/scribble/lang/Choice.java index 32ea977f1..98284361f 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Choice.java +++ b/scribble-core/src/main/java/org/scribble/lang/Choice.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/lang/ConnectAction.java b/scribble-core/src/main/java/org/scribble/lang/ConnectAction.java index 8b3e5bac4..d7bbbf4a0 100644 --- a/scribble-core/src/main/java/org/scribble/lang/ConnectAction.java +++ b/scribble-core/src/main/java/org/scribble/lang/ConnectAction.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; import java.util.LinkedList; diff --git a/scribble-core/src/main/java/org/scribble/lang/Continue.java b/scribble-core/src/main/java/org/scribble/lang/Continue.java index 93c560b1d..01c38ec2a 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Continue.java +++ b/scribble-core/src/main/java/org/scribble/lang/Continue.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/lang/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/lang/DirectedInteraction.java index ce38a89a7..74c8dac5c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/lang/DirectedInteraction.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; import java.util.Set; diff --git a/scribble-core/src/main/java/org/scribble/lang/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/lang/DisconnectAction.java index 04e73acc1..d896e7131 100644 --- a/scribble-core/src/main/java/org/scribble/lang/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/lang/DisconnectAction.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/lang/Do.java b/scribble-core/src/main/java/org/scribble/lang/Do.java index 87688c636..c2aa20a07 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Do.java +++ b/scribble-core/src/main/java/org/scribble/lang/Do.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/lang/LangConstants.java b/scribble-core/src/main/java/org/scribble/lang/LangConstants.java index 364596cec..62c8ce19d 100644 --- a/scribble-core/src/main/java/org/scribble/lang/LangConstants.java +++ b/scribble-core/src/main/java/org/scribble/lang/LangConstants.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; public class LangConstants diff --git a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java index e37ae3015..d66fff1d4 100644 --- a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; import java.util.LinkedList; diff --git a/scribble-core/src/main/java/org/scribble/lang/Projector.java b/scribble-core/src/main/java/org/scribble/lang/Projector.java index 3f0f209ab..8f14d58e1 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Projector.java +++ b/scribble-core/src/main/java/org/scribble/lang/Projector.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; import org.scribble.job.Job; diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index 0adf8b6c0..899ce4ee7 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/lang/ProtocolMod.java b/scribble-core/src/main/java/org/scribble/lang/ProtocolMod.java index aa4ce97a1..7c420f7aa 100644 --- a/scribble-core/src/main/java/org/scribble/lang/ProtocolMod.java +++ b/scribble-core/src/main/java/org/scribble/lang/ProtocolMod.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; diff --git a/scribble-core/src/main/java/org/scribble/lang/Recursion.java b/scribble-core/src/main/java/org/scribble/lang/Recursion.java index 8e5532faa..0ec8072b1 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/Recursion.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; import java.util.List; diff --git a/scribble-core/src/main/java/org/scribble/lang/SType.java b/scribble-core/src/main/java/org/scribble/lang/SType.java index e68f486fd..d5ba4d9c0 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SType.java +++ b/scribble-core/src/main/java/org/scribble/lang/SType.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; import java.util.List; diff --git a/scribble-core/src/main/java/org/scribble/lang/STypeBase.java b/scribble-core/src/main/java/org/scribble/lang/STypeBase.java index bd9fff952..cb668aea7 100644 --- a/scribble-core/src/main/java/org/scribble/lang/STypeBase.java +++ b/scribble-core/src/main/java/org/scribble/lang/STypeBase.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; import org.scribble.ast.ProtocolKindNode; diff --git a/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java b/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java index 5dafd4d92..eb604ec92 100644 --- a/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; import java.util.Deque; diff --git a/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java index c281a5fd9..e455922a5 100644 --- a/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; import java.util.HashMap; diff --git a/scribble-core/src/main/java/org/scribble/lang/Seq.java b/scribble-core/src/main/java/org/scribble/lang/Seq.java index 7236cb20f..0a6b40f15 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Seq.java +++ b/scribble-core/src/main/java/org/scribble/lang/Seq.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/lang/Substitutions.java b/scribble-core/src/main/java/org/scribble/lang/Substitutions.java index 5a102f8af..a14833a19 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Substitutions.java +++ b/scribble-core/src/main/java/org/scribble/lang/Substitutions.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang; import java.util.HashMap; diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java index 08c9a02b6..3fc039e53 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.global; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GConnect.java b/scribble-core/src/main/java/org/scribble/lang/global/GConnect.java index 4d19de30a..c8e0e1597 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GConnect.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.global; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java index 010c044d3..1a0c52b35 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.global; import java.util.Map; diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDisconnect.java b/scribble-core/src/main/java/org/scribble/lang/global/GDisconnect.java index 94e5ddc0b..261760c5a 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDisconnect.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.global; import java.util.Map; diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java index 45bcbdf88..66f85a924 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDo.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.global; import java.util.List; diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java index 2310c9836..ef13dd5dd 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.global; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index 3b8b81e08..1d2383f67 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.global; import java.util.HashSet; diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java index 71cced793..7c120504e 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.global; import java.util.HashSet; diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java index 455d19366..8b4398f35 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.global; import java.util.LinkedList; diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GType.java b/scribble-core/src/main/java/org/scribble/lang/global/GType.java index 3351ffdee..5c2a2b4e2 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GType.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.global; import java.util.Map; diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java b/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java index 86a3df428..b88eb826e 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.global; import org.scribble.ast.ScribNode; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LAcc.java b/scribble-core/src/main/java/org/scribble/lang/local/LAcc.java index 23ab73202..4b43b61fc 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LAcc.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LAcc.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.local; import java.util.Set; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java index 83da18336..b05a799f3 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.local; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java index 1de5c91ea..aaad82342 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.local; import java.util.HashSet; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LDisconnect.java b/scribble-core/src/main/java/org/scribble/lang/local/LDisconnect.java index d9c558157..79cbc3402 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LDisconnect.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.local; import java.util.Set; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LDo.java b/scribble-core/src/main/java/org/scribble/lang/local/LDo.java index c254b1ea6..f2e6993d4 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LDo.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.local; import java.util.List; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java index cfa6624bd..e2d65b685 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.local; import java.util.List; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index 70c58bc1b..d026bc0b7 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.local; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java b/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java index cf495e844..df4221f03 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.local; import java.util.Set; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java index 4b8949cc5..4f3c6a9a3 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.local; import java.util.HashSet; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LReq.java b/scribble-core/src/main/java/org/scribble/lang/local/LReq.java index 7360dcb56..f88809106 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LReq.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LReq.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.local; import java.util.Set; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSend.java b/scribble-core/src/main/java/org/scribble/lang/local/LSend.java index 987986f8e..b24df7605 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSend.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.local; import java.util.Set; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java index 35c7c4864..16b64daa3 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.local; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java index 3842adbc4..4e8d98961 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.local; import java.util.List; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LType.java b/scribble-core/src/main/java/org/scribble/lang/local/LType.java index d17bb5436..d92758abf 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LType.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.local; import java.util.Set; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/ReachabilityEnv.java b/scribble-core/src/main/java/org/scribble/lang/local/ReachabilityEnv.java index f92a85d63..dde03cb1d 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/ReachabilityEnv.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/ReachabilityEnv.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.lang.local; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateContinueEdge.java b/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateContinueEdge.java index 654a0e1f8..3df8e37cf 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateContinueEdge.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateContinueEdge.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.model.endpoint; import org.scribble.model.endpoint.actions.EAction; diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java b/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java index bf090a024..01fb61e25 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.model.endpoint; import org.scribble.model.endpoint.actions.EAction; diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index cb3196b16..6c60cd1b4 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -814,9 +814,9 @@ globaldisconnect: globalwrap: //message CONNECT_KW rolename TO_KW rolename - WRAP_KW rolenamnode TO_KW rolenamnode ';' + WRAP_KW rolenamenode TO_KW rolenamenode ';' -> - ^(GLOBALWRAP rolenamnode rolenamnode) + ^(GLOBALWRAP rolenamenode rolenamenode) ; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java index bd4859c5b..926949909 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java @@ -1,7 +1,5 @@ -/**block - - * blockC -opyright 2008 The Scribble Authors +/** + * Copyright 2008 The Scribble Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 14b6a80bd..03159e384 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.parser.scribble; import java.util.Arrays; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/tree/MyCommonTree.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/tree/MyCommonTree.java index f82949506..434dc196d 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/tree/MyCommonTree.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/tree/MyCommonTree.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.parser.scribble.ast.tree; import org.antlr.runtime.Token; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribBranch.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribBranch.java index 4edb3f060..d88130b3d 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribBranch.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribBranch.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.runtime.handlers; import org.scribble.runtime.message.ScribMessage; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java index 5b86f9132..0c91ee2c2 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.runtime.handlers; import org.scribble.type.name.Op; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribSigMessage.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribSigMessage.java index f84598f91..a71c55856 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribSigMessage.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribSigMessage.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.runtime.handlers; import org.scribble.runtime.message.ScribMessage; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribEndState.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribEndState.java index 4a56c1fd4..5ba3b73e8 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribEndState.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribEndState.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.runtime.handlers.states; abstract public class ScribEndState extends ScribState diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribInputState.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribInputState.java index 45e104eed..6ca2d5ef7 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribInputState.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribInputState.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.runtime.handlers.states; import org.scribble.type.name.Role; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribOutputState.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribOutputState.java index 03b3ebce4..71db63699 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribOutputState.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribOutputState.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.runtime.handlers.states; abstract public class ScribOutputState extends ScribState diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribState.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribState.java index 026eae866..fd66f16ac 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribState.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribState.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.runtime.handlers.states; import java.util.HashMap; From 6a3823b80b27b1334b5739351acc74828ba998fa Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 3 Apr 2019 20:44:00 +0100 Subject: [PATCH 160/539] Minor. --- pom.xml | 2 +- scribble-test/src/test/scrib/test/test2/MyA.java | 13 +++++++++++++ scribble-test/src/test/scrib/test/test2/MyB.java | 13 +++++++++++++ scribble-test/src/test/scrib/test/test3/MyA.java | 13 +++++++++++++ scribble-test/src/test/scrib/test/test3/MyB.java | 13 +++++++++++++ scribble-test/src/test/scrib/test/test3/MyC.java | 13 +++++++++++++ scribble-test/src/test/scrib/test/test4/MyA.java | 13 +++++++++++++ scribble-test/src/test/scrib/test/test4/MyB.java | 13 +++++++++++++ scribble-test/src/test/scrib/test/test5/MyA.java | 13 +++++++++++++ scribble-test/src/test/scrib/test/test5/MyB.java | 13 +++++++++++++ scribble-test/src/test/scrib/test/test5/MyC.java | 13 +++++++++++++ scribble-test/src/test/scrib/test/test6/MyA.java | 13 +++++++++++++ scribble-test/src/test/scrib/test/test6/MyB.java | 13 +++++++++++++ scribble-test/src/test/scrib/test/test7/MyA.java | 13 +++++++++++++ scribble-test/src/test/scrib/test/test7/MyB.java | 13 +++++++++++++ scribble-test/src/test/scrib/test/test8/MyA.java | 13 +++++++++++++ scribble-test/src/test/scrib/test/test8/MyB.java | 13 +++++++++++++ scribble-test/src/test/scrib/test/test8/MyC.java | 13 +++++++++++++ 18 files changed, 222 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e735ae1a9..9e89d475b 100644 --- a/pom.xml +++ b/pom.xml @@ -285,7 +285,7 @@ bin/*.sh scribblec.sh **/*.swp - scribble-test/src/test/scrib/**/* + scribble-test/**/*.* scribble-f17/**/* diff --git a/scribble-test/src/test/scrib/test/test2/MyA.java b/scribble-test/src/test/scrib/test/test2/MyA.java index f9dd0f6d0..72a1e4072 100644 --- a/scribble-test/src/test/scrib/test/test2/MyA.java +++ b/scribble-test/src/test/scrib/test/test2/MyA.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test2; import static test.test2.Test2.Proto1.Proto1.A; diff --git a/scribble-test/src/test/scrib/test/test2/MyB.java b/scribble-test/src/test/scrib/test/test2/MyB.java index b54ba9216..8f5ea4cf0 100644 --- a/scribble-test/src/test/scrib/test/test2/MyB.java +++ b/scribble-test/src/test/scrib/test/test2/MyB.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test2; import static test.test2.Test2.Proto1.Proto1.A; diff --git a/scribble-test/src/test/scrib/test/test3/MyA.java b/scribble-test/src/test/scrib/test/test3/MyA.java index 915d8cf3b..86ab5e89e 100644 --- a/scribble-test/src/test/scrib/test/test3/MyA.java +++ b/scribble-test/src/test/scrib/test/test3/MyA.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test3; import static test.test3.Test3.Proto1.Proto1.A; diff --git a/scribble-test/src/test/scrib/test/test3/MyB.java b/scribble-test/src/test/scrib/test/test3/MyB.java index 74acbd162..9b893d3e6 100644 --- a/scribble-test/src/test/scrib/test/test3/MyB.java +++ b/scribble-test/src/test/scrib/test/test3/MyB.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test3; import static test.test3.Test3.Proto1.Proto1.A; diff --git a/scribble-test/src/test/scrib/test/test3/MyC.java b/scribble-test/src/test/scrib/test/test3/MyC.java index 74223e2c7..8d4ca1a8e 100644 --- a/scribble-test/src/test/scrib/test/test3/MyC.java +++ b/scribble-test/src/test/scrib/test/test3/MyC.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test3; import static test.test3.Test3.Proto1.Proto1.B; diff --git a/scribble-test/src/test/scrib/test/test4/MyA.java b/scribble-test/src/test/scrib/test/test4/MyA.java index f3b754916..9c5d0e835 100644 --- a/scribble-test/src/test/scrib/test/test4/MyA.java +++ b/scribble-test/src/test/scrib/test/test4/MyA.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test4; import static test.test4.Test4.Proto1.Proto1.A; diff --git a/scribble-test/src/test/scrib/test/test4/MyB.java b/scribble-test/src/test/scrib/test/test4/MyB.java index 0e3c72ee7..98b4490a3 100644 --- a/scribble-test/src/test/scrib/test/test4/MyB.java +++ b/scribble-test/src/test/scrib/test/test4/MyB.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test4; import static test.test4.Test4.Proto1.Proto1.A; diff --git a/scribble-test/src/test/scrib/test/test5/MyA.java b/scribble-test/src/test/scrib/test/test5/MyA.java index e16faec87..7492cdfb4 100644 --- a/scribble-test/src/test/scrib/test/test5/MyA.java +++ b/scribble-test/src/test/scrib/test/test5/MyA.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test5; import static test.test5.Test5.Proto1.Proto1.A; diff --git a/scribble-test/src/test/scrib/test/test5/MyB.java b/scribble-test/src/test/scrib/test/test5/MyB.java index a712b8448..fa72ab187 100644 --- a/scribble-test/src/test/scrib/test/test5/MyB.java +++ b/scribble-test/src/test/scrib/test/test5/MyB.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test5; import static test.test5.Test5.Proto1.Proto1.A; diff --git a/scribble-test/src/test/scrib/test/test5/MyC.java b/scribble-test/src/test/scrib/test/test5/MyC.java index d3d3536b2..e3bb9d01b 100644 --- a/scribble-test/src/test/scrib/test/test5/MyC.java +++ b/scribble-test/src/test/scrib/test/test5/MyC.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test5; import static test.test5.Test5.Proto1.Proto1.A; diff --git a/scribble-test/src/test/scrib/test/test6/MyA.java b/scribble-test/src/test/scrib/test/test6/MyA.java index aaa246bde..ba94cedd7 100644 --- a/scribble-test/src/test/scrib/test/test6/MyA.java +++ b/scribble-test/src/test/scrib/test/test6/MyA.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test6; import static test.test6.Test6.Proto1.Proto1.A; diff --git a/scribble-test/src/test/scrib/test/test6/MyB.java b/scribble-test/src/test/scrib/test/test6/MyB.java index f9074a0c1..029b3ab2a 100644 --- a/scribble-test/src/test/scrib/test/test6/MyB.java +++ b/scribble-test/src/test/scrib/test/test6/MyB.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test6; import static test.test6.Test6.Proto1.Proto1.A; diff --git a/scribble-test/src/test/scrib/test/test7/MyA.java b/scribble-test/src/test/scrib/test/test7/MyA.java index e085bd33e..8358ae5da 100644 --- a/scribble-test/src/test/scrib/test/test7/MyA.java +++ b/scribble-test/src/test/scrib/test/test7/MyA.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test7; import static test.test7.Test7.Proto1.Proto1.A; diff --git a/scribble-test/src/test/scrib/test/test7/MyB.java b/scribble-test/src/test/scrib/test/test7/MyB.java index e11342e15..65afb87d4 100644 --- a/scribble-test/src/test/scrib/test/test7/MyB.java +++ b/scribble-test/src/test/scrib/test/test7/MyB.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test7; import static test.test7.Test7.Proto1.Proto1.A; diff --git a/scribble-test/src/test/scrib/test/test8/MyA.java b/scribble-test/src/test/scrib/test/test8/MyA.java index 16972b2d8..ff54d0a73 100644 --- a/scribble-test/src/test/scrib/test/test8/MyA.java +++ b/scribble-test/src/test/scrib/test/test8/MyA.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test8; import static test.test8.Test8.Proto1.Proto1.A; diff --git a/scribble-test/src/test/scrib/test/test8/MyB.java b/scribble-test/src/test/scrib/test/test8/MyB.java index 0863f5858..1cc3c9561 100644 --- a/scribble-test/src/test/scrib/test/test8/MyB.java +++ b/scribble-test/src/test/scrib/test/test8/MyB.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test8; import static test.test8.Test8.Proto1.Proto1.A; diff --git a/scribble-test/src/test/scrib/test/test8/MyC.java b/scribble-test/src/test/scrib/test/test8/MyC.java index 13d80c686..2984de63d 100644 --- a/scribble-test/src/test/scrib/test/test8/MyC.java +++ b/scribble-test/src/test/scrib/test/test8/MyC.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test8; import static test.test8.Test8.Proto1.Proto1.A; From bc7b7c23af1d66ca78eac2dcc0b4050bb92fda10 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 3 Apr 2019 20:45:15 +0100 Subject: [PATCH 161/539] Minor. --- .../src/test/scrib/test/test4/sig/Bar.java | 13 +++++++++++++ .../src/test/scrib/test/test4/sig/Foo.java | 13 +++++++++++++ .../test/scrib/test/test4/sig/Test4Formatter.java | 13 +++++++++++++ .../src/test/scrib/test/test4/sig/Test4Message.java | 13 +++++++++++++ 4 files changed, 52 insertions(+) diff --git a/scribble-test/src/test/scrib/test/test4/sig/Bar.java b/scribble-test/src/test/scrib/test/test4/sig/Bar.java index 9ee19e039..717a2e36c 100644 --- a/scribble-test/src/test/scrib/test/test4/sig/Bar.java +++ b/scribble-test/src/test/scrib/test/test4/sig/Bar.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test4.sig; import test.test4.Test4.Proto1.Proto1; diff --git a/scribble-test/src/test/scrib/test/test4/sig/Foo.java b/scribble-test/src/test/scrib/test/test4/sig/Foo.java index ab7aa630f..bd52d0700 100644 --- a/scribble-test/src/test/scrib/test/test4/sig/Foo.java +++ b/scribble-test/src/test/scrib/test/test4/sig/Foo.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test4.sig; import test.test4.Test4.Proto1.Proto1; diff --git a/scribble-test/src/test/scrib/test/test4/sig/Test4Formatter.java b/scribble-test/src/test/scrib/test/test4/sig/Test4Formatter.java index 328939107..603c62acd 100644 --- a/scribble-test/src/test/scrib/test/test4/sig/Test4Formatter.java +++ b/scribble-test/src/test/scrib/test/test4/sig/Test4Formatter.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test4.sig; import java.io.DataInputStream; diff --git a/scribble-test/src/test/scrib/test/test4/sig/Test4Message.java b/scribble-test/src/test/scrib/test/test4/sig/Test4Message.java index f1180d1a8..d430b679c 100644 --- a/scribble-test/src/test/scrib/test/test4/sig/Test4Message.java +++ b/scribble-test/src/test/scrib/test/test4/sig/Test4Message.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package test.test4.sig; import org.scribble.runtime.message.ScribMessage; From 57697a19fd5ac220ed5cd4a3b1a817f742506007 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 3 Apr 2019 22:52:19 +0100 Subject: [PATCH 162/539] Moved main package from cli to a new scribble-main module. --- pom.xml | 12 ++++-- scribble-cli/pom.xml | 8 ++++ .../org/scribble/lang/global/GConnect.java | 6 +++ .../org/scribble/lang/global/GDisconnect.java | 6 +++ .../lang/global/GMessageTransfer.java | 6 +++ .../java/org}/scribble/del/DelDecorator.java | 2 +- .../org}/scribble/del/DelDecoratorImpl.java | 2 +- scribble-main/pom.xml | 38 +++++++++++++++++++ .../scribble/main/DefaultModuleLoader.java | 0 .../java/org/scribble/main/MainContext.java | 4 +- .../java/org/scribble/main/ModuleLoader.java | 0 .../org/scribble/main/ScribModuleLoader.java | 12 +++--- .../main/resource/AbstractResource.java | 0 .../resource/DirectoryResourceLocator.java | 0 .../scribble/main/resource/FileResource.java | 0 .../main/resource/IResourceLocator.java | 0 .../main/resource/InlineResource.java | 0 .../org/scribble/main/resource/Resource.java | 0 .../main/resource/ResourceLocator.java | 0 .../scribble}/ScribbleAntlrWrapper.java | 9 ++--- scribble-test/src/test/scrib/tmp/Test.scr | 8 ++++ 21 files changed, 96 insertions(+), 17 deletions(-) rename {scribble-parser/src/main/java/org/scribble/parser => scribble-lang/src/main/java/org}/scribble/del/DelDecorator.java (99%) rename {scribble-parser/src/main/java/org/scribble/parser => scribble-lang/src/main/java/org}/scribble/del/DelDecoratorImpl.java (99%) create mode 100644 scribble-main/pom.xml rename {scribble-cli => scribble-main}/src/main/java/org/scribble/main/DefaultModuleLoader.java (100%) rename {scribble-cli => scribble-main}/src/main/java/org/scribble/main/MainContext.java (99%) rename {scribble-cli => scribble-main}/src/main/java/org/scribble/main/ModuleLoader.java (100%) rename {scribble-cli => scribble-main}/src/main/java/org/scribble/main/ScribModuleLoader.java (90%) rename {scribble-cli => scribble-main}/src/main/java/org/scribble/main/resource/AbstractResource.java (100%) rename {scribble-cli => scribble-main}/src/main/java/org/scribble/main/resource/DirectoryResourceLocator.java (100%) rename {scribble-cli => scribble-main}/src/main/java/org/scribble/main/resource/FileResource.java (100%) rename {scribble-cli => scribble-main}/src/main/java/org/scribble/main/resource/IResourceLocator.java (100%) rename {scribble-cli => scribble-main}/src/main/java/org/scribble/main/resource/InlineResource.java (100%) rename {scribble-cli => scribble-main}/src/main/java/org/scribble/main/resource/Resource.java (100%) rename {scribble-cli => scribble-main}/src/main/java/org/scribble/main/resource/ResourceLocator.java (100%) rename {scribble-cli/src/main/java/org/scribble/main => scribble-main/src/main/java/org/scribble/parser/scribble}/ScribbleAntlrWrapper.java (93%) diff --git a/pom.xml b/pom.xml index 9e89d475b..35635b8ad 100644 --- a/pom.xml +++ b/pom.xml @@ -71,14 +71,15 @@ scribble-core + scribble-runtime scribble-parser - scribble-cli + scribble-lang scribble-codegen - scribble-runtime + scribble-main + scribble-cli scribble-test scribble-dist scribble-demos - scribble-lang @@ -113,6 +114,11 @@ scribble-codegen ${project.version} + + org.scribble + scribble-main + ${project.version} + org.scribble diff --git a/scribble-cli/pom.xml b/scribble-cli/pom.xml index fcbf96988..ad473f3c3 100644 --- a/scribble-cli/pom.xml +++ b/scribble-cli/pom.xml @@ -21,10 +21,18 @@ org.scribble scribble-parser + + org.scribble + scribble-lang + org.scribble scribble-codegen + + org.scribble + scribble-main + commons-io diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GConnect.java b/scribble-core/src/main/java/org/scribble/lang/global/GConnect.java index c8e0e1597..d4622b8d9 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GConnect.java @@ -125,6 +125,12 @@ public Map checkExtChoiceConsistency(Map enablers) return Collections.unmodifiableMap(tmp); } + @Override + public String toString() + { + return this.msg + " connect " + this.src + " to " + this.dst + ";"; + } + @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDisconnect.java b/scribble-core/src/main/java/org/scribble/lang/global/GDisconnect.java index 261760c5a..7cd064d92 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GDisconnect.java @@ -111,6 +111,12 @@ public Map checkExtChoiceConsistency(Map enablers) return enablers; } + @Override + public String toString() + { + return "disconnect " + this.left + " and " + this.right + ";"; + } + @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java index ef13dd5dd..312e42d1d 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java @@ -125,6 +125,12 @@ public Map checkExtChoiceConsistency(Map enablers) return Collections.unmodifiableMap(tmp); } + @Override + public String toString() + { + return this.msg + " from " + this.src + " to " + this.dst + ";"; + } + @Override public int hashCode() { diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java b/scribble-lang/src/main/java/org/scribble/del/DelDecorator.java similarity index 99% rename from scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java rename to scribble-lang/src/main/java/org/scribble/del/DelDecorator.java index 1b33141b2..c2ff5efc6 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecorator.java +++ b/scribble-lang/src/main/java/org/scribble/del/DelDecorator.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.parser.scribble.del; +package org.scribble.del; import org.scribble.ast.AuxMod; import org.scribble.ast.DataTypeDecl; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java b/scribble-lang/src/main/java/org/scribble/del/DelDecoratorImpl.java similarity index 99% rename from scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java rename to scribble-lang/src/main/java/org/scribble/del/DelDecoratorImpl.java index 731bd9dd1..2bfa79c75 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/del/DelDecoratorImpl.java +++ b/scribble-lang/src/main/java/org/scribble/del/DelDecoratorImpl.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.parser.scribble.del; +package org.scribble.del; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; diff --git a/scribble-main/pom.xml b/scribble-main/pom.xml new file mode 100644 index 000000000..816151316 --- /dev/null +++ b/scribble-main/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + org.scribble + parent + 0.4.4-SNAPSHOT + + org.scribble + scribble-main + 0.4.4-SNAPSHOT + scribble-main + http://maven.apache.org + + UTF-8 + + + + org.scribble + scribble-core + + + org.scribble + scribble-parser + + + org.scribble + scribble-lang + + + junit + junit + 3.8.1 + test + + + diff --git a/scribble-cli/src/main/java/org/scribble/main/DefaultModuleLoader.java b/scribble-main/src/main/java/org/scribble/main/DefaultModuleLoader.java similarity index 100% rename from scribble-cli/src/main/java/org/scribble/main/DefaultModuleLoader.java rename to scribble-main/src/main/java/org/scribble/main/DefaultModuleLoader.java diff --git a/scribble-cli/src/main/java/org/scribble/main/MainContext.java b/scribble-main/src/main/java/org/scribble/main/MainContext.java similarity index 99% rename from scribble-cli/src/main/java/org/scribble/main/MainContext.java rename to scribble-main/src/main/java/org/scribble/main/MainContext.java index fb660f38d..65c288564 100644 --- a/scribble-cli/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-main/src/main/java/org/scribble/main/MainContext.java @@ -40,6 +40,7 @@ import org.scribble.model.global.SModelFactory; import org.scribble.model.global.SModelFactoryImpl; import org.scribble.parser.scribble.AntlrToScribParser; +import org.scribble.parser.scribble.ScribbleAntlrWrapper; import org.scribble.type.name.ModuleName; import org.scribble.util.Pair; import org.scribble.util.ScribParserException; @@ -83,8 +84,7 @@ private MainContext(boolean debug, ResourceLocator locator, boolean useOldWF, throws ScribParserException, ScribbleException { this.locator = locator; - this.loader = new ScribModuleLoader(this.locator, this.antlrParser, - this.scribParser); + this.loader = new ScribModuleLoader(this.locator, this.antlrParser);//, this.scribParser); } // Load main module from file system diff --git a/scribble-cli/src/main/java/org/scribble/main/ModuleLoader.java b/scribble-main/src/main/java/org/scribble/main/ModuleLoader.java similarity index 100% rename from scribble-cli/src/main/java/org/scribble/main/ModuleLoader.java rename to scribble-main/src/main/java/org/scribble/main/ModuleLoader.java diff --git a/scribble-cli/src/main/java/org/scribble/main/ScribModuleLoader.java b/scribble-main/src/main/java/org/scribble/main/ScribModuleLoader.java similarity index 90% rename from scribble-cli/src/main/java/org/scribble/main/ScribModuleLoader.java rename to scribble-main/src/main/java/org/scribble/main/ScribModuleLoader.java index 0015415a4..79532b931 100644 --- a/scribble-cli/src/main/java/org/scribble/main/ScribModuleLoader.java +++ b/scribble-main/src/main/java/org/scribble/main/ScribModuleLoader.java @@ -18,7 +18,7 @@ import org.scribble.job.ScribbleException; import org.scribble.main.resource.Resource; import org.scribble.main.resource.ResourceLocator; -import org.scribble.parser.scribble.AntlrToScribParser; +import org.scribble.parser.scribble.ScribbleAntlrWrapper; import org.scribble.type.name.ModuleName; import org.scribble.util.Pair; import org.scribble.util.ScribParserException; @@ -30,14 +30,13 @@ public class ScribModuleLoader extends DefaultModuleLoader //implements ModuleLo { private ResourceLocator locator; private ScribbleAntlrWrapper antlr; - private AntlrToScribParser parser; + //private AntlrToScribParser parser; - public ScribModuleLoader(ResourceLocator locator, ScribbleAntlrWrapper antlr, - AntlrToScribParser parser) + public ScribModuleLoader(ResourceLocator locator, ScribbleAntlrWrapper antlr)//, AntlrToScribParser parser) { this.locator = locator; this.antlr = antlr; - this.parser = parser; + //this.parser = parser; } @Override @@ -53,6 +52,9 @@ public Pair loadModule(ModuleName modname, AstFactory af) /*Module parsed = (Module) this.parser.parse(this.antlr.parseAntlrTree(res), af);*/ Module parsed = this.antlr.parseAntlrTree(res); // Does del decoration + + //AntlrToScribParser.checkForAntlrErrors(ct); // FIXME: do this somewhere + checkModuleName(modname, res, parsed); registerModule(res, parsed); return new Pair<>(res, parsed); diff --git a/scribble-cli/src/main/java/org/scribble/main/resource/AbstractResource.java b/scribble-main/src/main/java/org/scribble/main/resource/AbstractResource.java similarity index 100% rename from scribble-cli/src/main/java/org/scribble/main/resource/AbstractResource.java rename to scribble-main/src/main/java/org/scribble/main/resource/AbstractResource.java diff --git a/scribble-cli/src/main/java/org/scribble/main/resource/DirectoryResourceLocator.java b/scribble-main/src/main/java/org/scribble/main/resource/DirectoryResourceLocator.java similarity index 100% rename from scribble-cli/src/main/java/org/scribble/main/resource/DirectoryResourceLocator.java rename to scribble-main/src/main/java/org/scribble/main/resource/DirectoryResourceLocator.java diff --git a/scribble-cli/src/main/java/org/scribble/main/resource/FileResource.java b/scribble-main/src/main/java/org/scribble/main/resource/FileResource.java similarity index 100% rename from scribble-cli/src/main/java/org/scribble/main/resource/FileResource.java rename to scribble-main/src/main/java/org/scribble/main/resource/FileResource.java diff --git a/scribble-cli/src/main/java/org/scribble/main/resource/IResourceLocator.java b/scribble-main/src/main/java/org/scribble/main/resource/IResourceLocator.java similarity index 100% rename from scribble-cli/src/main/java/org/scribble/main/resource/IResourceLocator.java rename to scribble-main/src/main/java/org/scribble/main/resource/IResourceLocator.java diff --git a/scribble-cli/src/main/java/org/scribble/main/resource/InlineResource.java b/scribble-main/src/main/java/org/scribble/main/resource/InlineResource.java similarity index 100% rename from scribble-cli/src/main/java/org/scribble/main/resource/InlineResource.java rename to scribble-main/src/main/java/org/scribble/main/resource/InlineResource.java diff --git a/scribble-cli/src/main/java/org/scribble/main/resource/Resource.java b/scribble-main/src/main/java/org/scribble/main/resource/Resource.java similarity index 100% rename from scribble-cli/src/main/java/org/scribble/main/resource/Resource.java rename to scribble-main/src/main/java/org/scribble/main/resource/Resource.java diff --git a/scribble-cli/src/main/java/org/scribble/main/resource/ResourceLocator.java b/scribble-main/src/main/java/org/scribble/main/resource/ResourceLocator.java similarity index 100% rename from scribble-cli/src/main/java/org/scribble/main/resource/ResourceLocator.java rename to scribble-main/src/main/java/org/scribble/main/resource/ResourceLocator.java diff --git a/scribble-cli/src/main/java/org/scribble/main/ScribbleAntlrWrapper.java b/scribble-main/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java similarity index 93% rename from scribble-cli/src/main/java/org/scribble/main/ScribbleAntlrWrapper.java rename to scribble-main/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java index 493775569..78fc29c01 100644 --- a/scribble-cli/src/main/java/org/scribble/main/ScribbleAntlrWrapper.java +++ b/scribble-main/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.main; +package org.scribble.parser.scribble; import java.io.IOException; import java.io.InputStream; @@ -22,12 +22,11 @@ import org.antlr.runtime.RecognitionException; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.Module; +import org.scribble.del.DelDecorator; +import org.scribble.del.DelDecoratorImpl; import org.scribble.main.resource.Resource; import org.scribble.parser.antlr.ScribbleLexer; import org.scribble.parser.antlr.ScribbleParser; -import org.scribble.parser.scribble.ScribTreeAdaptor; -import org.scribble.parser.scribble.del.DelDecorator; -import org.scribble.parser.scribble.del.DelDecoratorImpl; // Resource -> ANTLR CommonTree -- parses Resources into ANTLR CommonTrees // Wraps the ScribbleLexer and ScribbleParser generated by ANTLR from Scribble.g @@ -73,7 +72,7 @@ public Module parseAntlrTree(Resource res) /*Class c = parser.getClass(); try*/ { - /*// FIXME: need an interface for Scribble top-level module method (ANTLR "grammar actions"?) + /* // FIXME: need an interface for Scribble top-level module method (ANTLR "grammar actions"?) Method m = c.getMethod("module"); return (CommonTree) ((ParserRuleReturnScope) m.invoke(parser)).getTree();*/ // No: reflection doesn't work well with ANTLR error handling Module mod = (Module) runScribbleParser(new CommonTokenStream(lex)); diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 3fc8b2db4..8b0e95385 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -58,6 +58,14 @@ module tmp.Test; // TODO make test framework to check proj->inline matches inline->proj // TODO make test framework to check global-"proj"-via-taus matches actual proj -- matches mean language acceptance? // could also test once-unfold-all against model + // refactor test to use main instead of cli + + +// separate Job into core and lang parts (mainly parsed Module) +// move ast/del, old visit and new frontend to lang +// integrate new frontend with MainContext? +// move lang types to type.sess, and move new visit +// add exp conn checks to model validation /* From c05fd6851835b0429b5faf3b581433b2a2126884 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 4 Apr 2019 09:13:02 +0100 Subject: [PATCH 163/539] Patched scribble-test pom.xml license check ignore list. --- pom.xml | 2 +- scribble-test/pom.xml | 19 +++++++++++++++++++ scribble-test/src/test/scrib/tmp/Test.scr | 4 +++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 35635b8ad..9e496e18b 100644 --- a/pom.xml +++ b/pom.xml @@ -291,7 +291,7 @@ bin/*.sh scribblec.sh **/*.swp - scribble-test/**/*.* + scribble-test/**/*.* scribble-f17/**/* diff --git a/scribble-test/pom.xml b/scribble-test/pom.xml index 6e6b9f08f..32020d086 100644 --- a/scribble-test/pom.xml +++ b/scribble-test/pom.xml @@ -65,6 +65,25 @@ + + + com.mycila + license-maven-plugin + + + **/*.scr + **/*.java + **/*.policy + **/*.xml + **/*.html + **/stylesheet.css + **/script.js + **/package-list + **/IGNORE + + + + diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 8b0e95385..aa4efadb7 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -58,14 +58,16 @@ module tmp.Test; // TODO make test framework to check proj->inline matches inline->proj // TODO make test framework to check global-"proj"-via-taus matches actual proj -- matches mean language acceptance? // could also test once-unfold-all against model - // refactor test to use main instead of cli +//... +// change parsed to in jobcontext to record original roledecls (for GDo::project) -- and change getInlined on proto to prune (via getRoles on def) // separate Job into core and lang parts (mainly parsed Module) // move ast/del, old visit and new frontend to lang // integrate new frontend with MainContext? // move lang types to type.sess, and move new visit // add exp conn checks to model validation +// refactor test to use main instead of cli /* From 2b7cdf24ad007b717e79857604d2f187a33f130a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 4 Apr 2019 10:21:03 +0100 Subject: [PATCH 164/539] Split ModuleContextMaker from ModuleContext, for separation of core from lang modules. --- .../callbackapi/CBEndpointApiGenerator2.java | 2 +- .../src/main/java/org/scribble/ast/Do.java | 2 +- .../java/org/scribble/ast/MessageNode.java | 2 +- .../java/org/scribble/ast/MessageSigNode.java | 2 +- .../java/org/scribble/ast/NonRoleArgList.java | 4 +- .../java/org/scribble/ast/NonRoleArgNode.java | 2 +- .../org/scribble/ast/PayloadElemList.java | 2 +- .../java/org/scribble/ast/global/GDo.java | 2 +- .../java/org/scribble/ast/local/LAccept.java | 2 +- .../java/org/scribble/ast/local/LChoice.java | 2 +- .../org/scribble/ast/local/LContinue.java | 2 +- .../org/scribble/ast/local/LDisconnect.java | 2 +- .../main/java/org/scribble/ast/local/LDo.java | 4 +- .../scribble/ast/local/LInteractionSeq.java | 2 +- .../scribble/ast/local/LProtocolBlock.java | 2 +- .../java/org/scribble/ast/local/LReceive.java | 2 +- .../org/scribble/ast/local/LRecursion.java | 2 +- .../java/org/scribble/ast/local/LRequest.java | 2 +- .../java/org/scribble/ast/local/LSend.java | 2 +- .../org/scribble/ast/local/LSessionNode.java | 2 +- .../org/scribble/ast/local/LWrapClient.java | 2 +- .../org/scribble/ast/local/LWrapServer.java | 2 +- .../ast/name/qualified/DataTypeNode.java | 2 +- .../ast/name/qualified/LProtocolNameNode.java | 2 +- .../ast/name/simple/AmbigNameNode.java | 4 +- .../java/org/scribble/del/DoArgListDel.java | 2 +- .../src/main/java/org/scribble/del/DoDel.java | 4 +- .../main/java/org/scribble/del/ModuleDel.java | 8 +- .../org/scribble/del/ProtocolDeclDel.java | 2 +- .../org/scribble/del/global/GChoiceDel.java | 6 +- .../org/scribble/del/global/GConnectDel.java | 6 +- .../org/scribble/del/global/GContinueDel.java | 4 +- .../java/org/scribble/del/global/GDel.java | 2 +- .../del/global/GDelegationElemDel.java | 2 +- .../scribble/del/global/GDisconnectDel.java | 4 +- .../java/org/scribble/del/global/GDoDel.java | 10 +- .../del/global/GInteractionSeqDel.java | 4 +- .../del/global/GMessageTransferDel.java | 6 +- .../del/global/GProtocolBlockDel.java | 2 +- .../scribble/del/global/GProtocolDeclDel.java | 2 +- .../scribble/del/global/GProtocolDefDel.java | 2 +- .../scribble/del/global/GRecursionDel.java | 6 +- .../org/scribble/del/local/LAcceptDel.java | 2 +- .../java/org/scribble/del/local/LDoDel.java | 2 +- .../scribble/del/local/LProtocolDefDel.java | 2 +- .../org/scribble/del/local/LReceiveDel.java | 2 +- .../org/scribble/del/local/LRequestDel.java | 2 +- .../java/org/scribble/del/local/LSendDel.java | 2 +- .../del/name/qualified/DataTypeNodeDel.java | 2 +- .../name/qualified/MessageSigNameNodeDel.java | 2 +- .../del/name/simple/AmbigNameNodeDel.java | 2 +- .../src/main/java/org/scribble/job/Job.java | 8 +- .../main/java/org/scribble/lang/Protocol.java | 2 + .../java/org/scribble/lang/STypeInliner.java | 1 - .../java/org/scribble/lang/STypeUnfolder.java | 1 + .../scribble/{type => lang}/SubprotoSig.java | 3 +- .../java/org/scribble/lang/Substitutions.java | 2 +- .../scribble/lang/context/ModuleContext.java | 139 ++++++++++++++++ .../context/ModuleContextMaker.java} | 157 +++--------------- .../org/scribble/lang/context/ScribNames.java | 40 +++++ .../org/scribble/lang/global/GProtocol.java | 7 +- .../scribble/lang/global/GTypeTranslator.java | 1 + .../org/scribble/lang/local/LProjection.java | 1 + .../org/scribble/lang/local/LProtocol.java | 5 +- .../main/java/org/scribble/model/MAction.java | 2 +- .../scribble/model/endpoint/AutParser.java | 2 +- .../model/endpoint/EModelFactory.java | 2 +- .../model/endpoint/EModelFactoryImpl.java | 2 +- .../endpoint/IntermediateContinueEdge.java | 2 +- .../model/endpoint/IntermediateRecEdge.java | 2 +- .../model/endpoint/actions/EAccept.java | 2 +- .../model/endpoint/actions/EAction.java | 2 +- .../model/endpoint/actions/EDisconnect.java | 2 +- .../model/endpoint/actions/EReceive.java | 2 +- .../model/endpoint/actions/ERequest.java | 2 +- .../model/endpoint/actions/ESend.java | 2 +- .../model/endpoint/actions/EWrapClient.java | 2 +- .../model/endpoint/actions/EWrapServer.java | 2 +- .../scribble/model/global/SModelFactory.java | 2 +- .../model/global/SModelFactoryImpl.java | 2 +- .../model/global/actions/SAccept.java | 2 +- .../model/global/actions/SAction.java | 2 +- .../model/global/actions/SConnect.java | 2 +- .../model/global/actions/SDisconnect.java | 2 +- .../model/global/actions/SReceive.java | 2 +- .../model/global/actions/SRequest.java | 2 +- .../scribble/model/global/actions/SSend.java | 2 +- .../model/global/actions/SWrapClient.java | 2 +- .../model/global/actions/SWrapServer.java | 2 +- .../scribble/type/name/MessageSigName.java | 2 +- .../scribble/type/name/PayloadElemType.java | 2 +- .../org/scribble/type/{ => session}/Arg.java | 2 +- .../session}/BasicInteraction.java | 3 +- .../{lang => type/session}/Choice.java | 2 +- .../{lang => type/session}/ConnectAction.java | 5 +- .../{lang => type/session}/Continue.java | 4 +- .../session}/DirectedInteraction.java | 4 +- .../session}/DisconnectAction.java | 3 +- .../scribble/{lang => type/session}/Do.java | 6 +- .../scribble/type/{ => session}/Message.java | 2 +- .../type/{ => session}/MessageSig.java | 2 +- .../session}/MessageTransfer.java | 5 +- .../scribble/type/{ => session}/Payload.java | 2 +- .../{lang => type/session}/Recursion.java | 2 +- .../{lang => type/session}/SType.java | 5 +- .../{lang => type/session}/STypeBase.java | 2 +- .../STypeFactory.java} | 6 +- .../scribble/{lang => type/session}/Seq.java | 3 +- .../session}/global/GChoice.java | 12 +- .../session}/global/GConnect.java | 14 +- .../session}/global/GContinue.java | 6 +- .../session}/global/GDisconnect.java | 10 +- .../{lang => type/session}/global/GDo.java | 15 +- .../session}/global/GMessageTransfer.java | 14 +- .../session}/global/GRecursion.java | 12 +- .../{lang => type/session}/global/GSeq.java | 12 +- .../{lang => type/session}/global/GType.java | 6 +- .../{lang => type/session}/local/LAcc.java | 11 +- .../{lang => type/session}/local/LChoice.java | 5 +- .../session}/local/LContinue.java | 5 +- .../session}/local/LDisconnect.java | 5 +- .../{lang => type/session}/local/LDo.java | 10 +- .../{lang => type/session}/local/LRcv.java | 11 +- .../session}/local/LRecursion.java | 5 +- .../{lang => type/session}/local/LReq.java | 11 +- .../{lang => type/session}/local/LSend.java | 11 +- .../{lang => type/session}/local/LSeq.java | 7 +- .../{lang => type/session}/local/LSkip.java | 5 +- .../{lang => type/session}/local/LType.java | 5 +- .../visit/OffsetSubprotocolVisitor.java | 2 +- .../scribble/visit/ProtocolDefInliner.java | 4 +- .../org/scribble/visit/SimpleVisitor.java | 2 +- .../scribble/visit/SubprotocolVisitor.java | 6 +- .../java/org/scribble/visit/Substitutor.java | 2 +- .../visit/context/ModuleContextBuilder.java | 14 +- .../visit/context/ModuleContextVisitor.java | 2 +- .../UnguardedChoiceDoProjectionChecker.java | 4 +- .../visit/util/MessageIdCollector.java | 2 +- .../scribble/visit/util/NameCollector.java | 2 +- .../scribble/visit/util/RecVarCollector.java | 2 +- .../scribble/visit/util/RoleCollector.java | 2 +- .../scribble/visit/wf/env/WFChoiceEnv.java | 6 +- .../java/org/scribble/main/MainContext.java | 8 +- 143 files changed, 494 insertions(+), 381 deletions(-) rename scribble-core/src/main/java/org/scribble/{type => lang}/SubprotoSig.java (97%) create mode 100644 scribble-core/src/main/java/org/scribble/lang/context/ModuleContext.java rename scribble-core/src/main/java/org/scribble/{ast/context/ModuleContext.java => lang/context/ModuleContextMaker.java} (59%) create mode 100644 scribble-core/src/main/java/org/scribble/lang/context/ScribNames.java rename scribble-core/src/main/java/org/scribble/type/{ => session}/Arg.java (95%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/BasicInteraction.java (95%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/Choice.java (98%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/ConnectAction.java (93%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/Continue.java (96%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/DirectedInteraction.java (97%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/DisconnectAction.java (97%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/Do.java (97%) rename scribble-core/src/main/java/org/scribble/type/{ => session}/Message.java (96%) rename scribble-core/src/main/java/org/scribble/type/{ => session}/MessageSig.java (97%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/MessageTransfer.java (93%) rename scribble-core/src/main/java/org/scribble/type/{ => session}/Payload.java (97%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/Recursion.java (98%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/SType.java (94%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/STypeBase.java (98%) rename scribble-core/src/main/java/org/scribble/type/{SessionTypeFactory.java => session/STypeFactory.java} (94%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/Seq.java (97%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/global/GChoice.java (95%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/global/GConnect.java (91%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/global/GContinue.java (95%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/global/GDisconnect.java (92%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/global/GDo.java (92%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/global/GMessageTransfer.java (91%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/global/GRecursion.java (93%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/global/GSeq.java (94%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/global/GType.java (94%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/local/LAcc.java (91%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/local/LChoice.java (97%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/local/LContinue.java (96%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/local/LDisconnect.java (95%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/local/LDo.java (93%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/local/LRcv.java (91%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/local/LRecursion.java (96%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/local/LReq.java (91%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/local/LSend.java (91%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/local/LSeq.java (96%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/local/LSkip.java (96%) rename scribble-core/src/main/java/org/scribble/{lang => type/session}/local/LType.java (92%) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java index a613e67ee..1620f3fa1 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java @@ -38,12 +38,12 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.EStateKind; import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.Payload; import org.scribble.type.name.DataType; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.MessageSigName; import org.scribble.type.name.PayloadElemType; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; // FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) @Deprecated diff --git a/scribble-core/src/main/java/org/scribble/ast/Do.java b/scribble-core/src/main/java/org/scribble/ast/Do.java index 105b2b45a..961d6afe8 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Do.java +++ b/scribble-core/src/main/java/org/scribble/ast/Do.java @@ -17,11 +17,11 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.qualified.ProtocolNameNode; import org.scribble.del.ScribDel; import org.scribble.job.JobContext; import org.scribble.job.ScribbleException; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageNode.java b/scribble-core/src/main/java/org/scribble/ast/MessageNode.java index 58aaf5d32..c586c34e6 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/MessageNode.java @@ -13,7 +13,7 @@ */ package org.scribble.ast; -import org.scribble.type.Message; +import org.scribble.type.session.Message; // A sig kind node: MessageSignatureNode, MessageSignatureNameNode or NonRoleParamNode public interface MessageNode extends NonRoleArgNode diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java b/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java index c3f07ebdf..15e6c5676 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java @@ -18,7 +18,7 @@ import org.scribble.ast.name.simple.OpNode; import org.scribble.del.ScribDel; import org.scribble.job.ScribbleException; -import org.scribble.type.MessageSig; +import org.scribble.type.session.MessageSig; import org.scribble.visit.AstVisitor; public class MessageSigNode extends ScribNodeBase implements MessageNode diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java index 4e50cd5b4..b76732e24 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java @@ -19,13 +19,13 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.Arg; -import org.scribble.type.MessageSig; import org.scribble.type.kind.NonRoleArgKind; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.DataType; import org.scribble.type.name.MessageSigName; import org.scribble.type.name.Role; +import org.scribble.type.session.Arg; +import org.scribble.type.session.MessageSig; // Cf. NonRoleParamDeclList public class NonRoleArgList extends DoArgList diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgNode.java b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgNode.java index bfc6b4c61..8ba8ee271 100644 --- a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/NonRoleArgNode.java @@ -13,8 +13,8 @@ */ package org.scribble.ast; -import org.scribble.type.Arg; import org.scribble.type.kind.NonRoleArgKind; +import org.scribble.type.session.Arg; // sig or payloadtype kinds that can be used as do arg vals, cf. RoleNode // "Value nodes" (sigs or names) that can be used as non-role subprotocol arguments (doesn't include role instantation arguments) diff --git a/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java b/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java index 3d1d8bb60..8e57e974b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java +++ b/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java @@ -21,8 +21,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.del.ScribDel; import org.scribble.job.ScribbleException; -import org.scribble.type.Payload; import org.scribble.type.name.PayloadElemType; +import org.scribble.type.session.Payload; import org.scribble.visit.AstVisitor; // Cf. DoArgList, but here we don't need as much abstraction (cf. RoleArgList, NonRoleArgList) diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GDo.java b/scribble-core/src/main/java/org/scribble/ast/global/GDo.java index 1e85d6ec2..20b1b44e0 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GDo.java @@ -19,11 +19,11 @@ import org.scribble.ast.Do; import org.scribble.ast.NonRoleArgList; import org.scribble.ast.RoleArgList; -import org.scribble.ast.context.ModuleContext; import org.scribble.ast.local.LDo; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.job.JobContext; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java b/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java index c834032b3..535a3e3dc 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java @@ -24,8 +24,8 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; -import org.scribble.type.Message; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LAccept extends LConnectionAction implements LSimpleSessionNode diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java b/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java index d4f25d772..73ecdbd39 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java @@ -25,9 +25,9 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.ScribbleException; -import org.scribble.type.Message; import org.scribble.type.kind.Local; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LChoice extends Choice implements LCompoundInteraction diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LContinue.java b/scribble-core/src/main/java/org/scribble/ast/local/LContinue.java index a35195c7e..94b060183 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LContinue.java @@ -22,9 +22,9 @@ import org.scribble.ast.Continue; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.job.ScribbleException; -import org.scribble.type.Message; import org.scribble.type.kind.Local; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LContinue extends Continue implements LSimpleSessionNode diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java b/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java index e0b180817..46a2c9e2a 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java @@ -25,9 +25,9 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; -import org.scribble.type.Message; import org.scribble.type.kind.Local; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; // "left" of LDisconnect is used for self diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LDo.java b/scribble-core/src/main/java/org/scribble/ast/local/LDo.java index 16d7b31bf..609f89dbd 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LDo.java @@ -23,15 +23,15 @@ import org.scribble.ast.Do; import org.scribble.ast.NonRoleArgList; import org.scribble.ast.RoleArgList; -import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.job.JobContext; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; -import org.scribble.type.Message; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.kind.Local; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LDo extends Do implements LSimpleSessionNode diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java b/scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java index 2bb3ea561..0514f487b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java @@ -21,8 +21,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.InteractionSeq; -import org.scribble.type.Message; import org.scribble.type.kind.Local; +import org.scribble.type.session.Message; public class LInteractionSeq extends InteractionSeq implements LNode { diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolBlock.java b/scribble-core/src/main/java/org/scribble/ast/local/LProtocolBlock.java index 90a993ac9..173c2f95b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolBlock.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LProtocolBlock.java @@ -18,8 +18,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.ProtocolBlock; -import org.scribble.type.Message; import org.scribble.type.kind.Local; +import org.scribble.type.session.Message; public class LProtocolBlock extends ProtocolBlock implements LNode { diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java b/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java index ce0aee8af..e01400328 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java @@ -25,8 +25,8 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; -import org.scribble.type.Message; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LReceive extends LMessageTransfer implements LSimpleSessionNode diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java index a2a2c50ab..563910b49 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java @@ -21,9 +21,9 @@ import org.scribble.ast.Recursion; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.job.ScribbleException; -import org.scribble.type.Message; import org.scribble.type.kind.Local; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LRecursion extends Recursion implements LCompoundInteraction diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java b/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java index 03b715d1b..c1335f75d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java @@ -24,8 +24,8 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; -import org.scribble.type.Message; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LRequest extends LConnectionAction implements LSimpleSessionNode diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LSend.java b/scribble-core/src/main/java/org/scribble/ast/local/LSend.java index 44b2624fa..587b52523 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LSend.java @@ -26,8 +26,8 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; -import org.scribble.type.Message; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LSend extends LMessageTransfer diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LSessionNode.java b/scribble-core/src/main/java/org/scribble/ast/local/LSessionNode.java index 3f8db4f47..73f6c72d5 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LSessionNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LSessionNode.java @@ -18,9 +18,9 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.SessionNode; import org.scribble.job.ScribbleException; -import org.scribble.type.Message; import org.scribble.type.kind.Local; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; // Alternatively to interface, use GlobalNode subclass with delegation to "super" base (e.g. Choice) classes diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java b/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java index c4feb486c..afdc9b2d1 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java @@ -24,8 +24,8 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; -import org.scribble.type.Message; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LWrapClient extends LConnectionAction diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java b/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java index 823ec55f7..0a98ed61e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java @@ -24,8 +24,8 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; -import org.scribble.type.Message; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LWrapServer extends LConnectionAction implements LSimpleSessionNode diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java index b63763072..a115ed2db 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java @@ -16,9 +16,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.PayloadElemNameNode; -import org.scribble.type.Arg; import org.scribble.type.kind.DataTypeKind; import org.scribble.type.name.DataType; +import org.scribble.type.session.Arg; //public class DataTypeNode extends MemberNameNode implements PayloadElemNameNode public class DataTypeNode extends MemberNameNode diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java index 86d026d8e..94cc98673 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java @@ -16,9 +16,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.PayloadElemNameNode; -import org.scribble.type.Arg; import org.scribble.type.kind.Local; import org.scribble.type.name.LProtocolName; +import org.scribble.type.session.Arg; public class LProtocolNameNode extends ProtocolNameNode implements PayloadElemNameNode { diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index cdcfd186d..762d968ed 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -18,13 +18,13 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.name.PayloadElemNameNode; -import org.scribble.type.Arg; -import org.scribble.type.Message; import org.scribble.type.kind.AmbigKind; import org.scribble.type.kind.DataTypeKind; import org.scribble.type.kind.NonRoleArgKind; import org.scribble.type.name.AmbigName; import org.scribble.type.name.PayloadElemType; +import org.scribble.type.session.Arg; +import org.scribble.type.session.Message; // Primitive payload type, MessageSigName or parameter names only: if name is parsed as a CompoundNameNodes, it must be a payload type (not ambiguous in this case) // No counterpart needed for MessageNode because MessageSignature values can be syntactically distinguished from sig parameters diff --git a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java index e2bc0cf45..9318d0d2d 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java @@ -22,9 +22,9 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ModuleContext; import org.scribble.job.JobContext; import org.scribble.job.ScribbleException; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.name.ProtocolName; import org.scribble.visit.wf.NameDisambiguator; diff --git a/scribble-core/src/main/java/org/scribble/del/DoDel.java b/scribble-core/src/main/java/org/scribble/del/DoDel.java index 701a71cf6..c48a9892b 100644 --- a/scribble-core/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/DoDel.java @@ -15,11 +15,11 @@ import org.scribble.ast.Do; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.qualified.ProtocolNameNode; import org.scribble.job.JobContext; import org.scribble.job.ScribbleException; -import org.scribble.type.SubprotoSig; +import org.scribble.lang.SubprotoSig; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java b/scribble-core/src/main/java/org/scribble/del/ModuleDel.java index 2761522d2..2d7bad9dc 100644 --- a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ModuleDel.java @@ -29,11 +29,11 @@ import org.scribble.ast.NonProtocolDecl; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ModuleContext; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.local.LProtocolDecl; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.job.ScribbleException; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.Role; @@ -59,8 +59,10 @@ private ModuleDel copy() public void enterModuleContextBuilding(ScribNode parent, ScribNode child, ModuleContextBuilder builder) throws ScribbleException { - builder.setModuleContext(new ModuleContext( - builder.job.getContext().getParsed(), (Module) child)); + builder.setModuleContext( + //new ModuleContext(builder.job.getContext().getParsed(), (Module) child) + builder.maker.make(builder.job.getContext().getParsed(), (Module) child) + ); // ModuleContext building is done solely by "new ModuleContext" (no deeper visiting needed) // The only thing ModuleContextBuilder really does is to set the ModuleContext in ModuleDel // FIXME: obtain from MainContext instead of creating on entry by this visitor diff --git a/scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java index 8da32ab3d..7022899af 100644 --- a/scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java @@ -20,7 +20,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.context.ProtocolDeclContext; import org.scribble.job.ScribbleException; -import org.scribble.type.SubprotoSig; +import org.scribble.lang.SubprotoSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.ProtocolName; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java index a96e8fd92..c04d890dc 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -28,10 +28,10 @@ import org.scribble.del.ChoiceDel; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; -import org.scribble.lang.global.GSeq; import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.global.GSeq; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.context.env.ProjectionEnv; @@ -43,7 +43,7 @@ public class GChoiceDel extends ChoiceDel implements GCompoundInteractionNodeDel { @Override - public org.scribble.lang.global.GChoice translate(ScribNode n, + public org.scribble.type.session.global.GChoice translate(ScribNode n, GTypeTranslator t) throws ScribbleException { GChoice source = (GChoice) n; @@ -53,7 +53,7 @@ public org.scribble.lang.global.GChoice translate(ScribNode n, { blocks.add((GSeq) b.visitWith(t)); } - return new org.scribble.lang.global.GChoice(source, subj, blocks); + return new org.scribble.type.session.global.GChoice(source, subj, blocks); } @Override diff --git a/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java index 44db254b4..b56712e83 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java @@ -23,8 +23,8 @@ import org.scribble.del.ConnectionActionDel; import org.scribble.job.ScribbleException; import org.scribble.lang.global.GTypeTranslator; -import org.scribble.type.Message; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; import org.scribble.visit.wf.WFChoiceChecker; @@ -49,7 +49,7 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, } @Override - public org.scribble.lang.global.GConnect translate(ScribNode n, + public org.scribble.type.session.global.GConnect translate(ScribNode n, GTypeTranslator t) throws ScribbleException { GConnect source = (GConnect) n; @@ -61,7 +61,7 @@ public org.scribble.lang.global.GConnect translate(ScribNode n, } Role dst = ds.get(0).toName(); Message msg = source.getMessageNodeChild().toMessage(); - return new org.scribble.lang.global.GConnect(source, src, msg, dst); + return new org.scribble.type.session.global.GConnect(source, src, msg, dst); } @Override diff --git a/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java b/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java index efe7c5916..bcaed98cc 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java @@ -29,12 +29,12 @@ public class GContinueDel extends ContinueDel implements GSimpleInteractionNodeD { @Override - public org.scribble.lang.global.GContinue translate(ScribNode n, + public org.scribble.type.session.global.GContinue translate(ScribNode n, GTypeTranslator t) throws ScribbleException { GContinue source = (GContinue) n; RecVar recvar = source.getRecVarChild().toName(); - return new org.scribble.lang.global.GContinue(source, recvar); + return new org.scribble.type.session.global.GContinue(source, recvar); } @Override diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDel.java index ac1fbf659..26967e7ee 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDel.java @@ -16,8 +16,8 @@ import org.scribble.ast.ScribNode; import org.scribble.del.ScribDel; import org.scribble.job.ScribbleException; -import org.scribble.lang.global.GType; import org.scribble.lang.global.GTypeTranslator; +import org.scribble.type.session.global.GType; public interface GDel extends ScribDel { diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java index 1d7aacab6..42ceaec8c 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -22,12 +22,12 @@ import org.scribble.ast.MessageTransfer; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ModuleContext; import org.scribble.ast.global.GDelegationElem; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.ProtocolName; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java index ee15f6825..1c0477f05 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java @@ -46,13 +46,13 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, } @Override - public org.scribble.lang.global.GDisconnect translate(ScribNode n, + public org.scribble.type.session.global.GDisconnect translate(ScribNode n, GTypeTranslator t) throws ScribbleException { GDisconnect source = (GDisconnect) n; Role left = source.getLeftChild().toName(); Role right = source.getRightChild().toName(); - return new org.scribble.lang.global.GDisconnect(source, left, right); + return new org.scribble.type.session.global.GDisconnect(source, left, right); } @Override diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java index 603d76988..06a1bb699 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java @@ -17,7 +17,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ModuleContext; import org.scribble.ast.global.GContinue; import org.scribble.ast.global.GDo; import org.scribble.ast.global.GInteractionSeq; @@ -28,14 +27,15 @@ import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.DoDel; import org.scribble.job.ScribbleException; +import org.scribble.lang.SubprotoSig; +import org.scribble.lang.context.ModuleContext; import org.scribble.lang.global.GTypeTranslator; -import org.scribble.type.Arg; -import org.scribble.type.SubprotoSig; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.RecVarKind; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; +import org.scribble.type.session.Arg; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.context.ProtocolDeclContextBuilder; @@ -44,7 +44,7 @@ public class GDoDel extends DoDel implements GSimpleInteractionNodeDel { @Override - public org.scribble.lang.global.GDo translate(ScribNode n, + public org.scribble.type.session.global.GDo translate(ScribNode n, GTypeTranslator t) throws ScribbleException { GDo source = (GDo) n; @@ -62,7 +62,7 @@ public org.scribble.lang.global.GDo translate(ScribNode n, List roles = source.getRoleListChild().getRoles(); List> params = source.getNonRoleListChild() .getParamKindArgs(); - return new org.scribble.lang.global.GDo(source, fullname, roles, params); + return new org.scribble.type.session.global.GDo(source, fullname, roles, params); } // Part of context building diff --git a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java b/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java index d601c3cbd..ea6251019 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java @@ -28,9 +28,9 @@ import org.scribble.del.InteractionSeqDel; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; -import org.scribble.lang.global.GSeq; -import org.scribble.lang.global.GType; import org.scribble.lang.global.GTypeTranslator; +import org.scribble.type.session.global.GSeq; +import org.scribble.type.session.global.GType; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.context.RecRemover; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java index 7ec32d955..aae55d5d3 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -22,8 +22,8 @@ import org.scribble.del.MessageTransferDel; import org.scribble.job.ScribbleException; import org.scribble.lang.global.GTypeTranslator; -import org.scribble.type.Message; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; import org.scribble.visit.wf.WFChoiceChecker; @@ -54,7 +54,7 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, } @Override - public org.scribble.lang.global.GMessageTransfer translate(ScribNode n, + public org.scribble.type.session.global.GMessageTransfer translate(ScribNode n, GTypeTranslator t) throws ScribbleException { GMessageTransfer source = (GMessageTransfer) n; @@ -66,7 +66,7 @@ public org.scribble.lang.global.GMessageTransfer translate(ScribNode n, } Role dst = ds.get(0).toName(); Message msg = source.getMessageNodeChild().toMessage(); - return new org.scribble.lang.global.GMessageTransfer(source, src, msg, dst); + return new org.scribble.type.session.global.GMessageTransfer(source, src, msg, dst); } @Override diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java index ee1486b60..f8c03f132 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java @@ -21,8 +21,8 @@ import org.scribble.del.ProtocolBlockDel; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; -import org.scribble.lang.global.GSeq; import org.scribble.lang.global.GTypeTranslator; +import org.scribble.type.session.global.GSeq; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.context.env.ProjectionEnv; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 3860e2694..00b093134 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -43,7 +43,6 @@ import org.scribble.job.ScribbleException; import org.scribble.lang.ProtocolMod; import org.scribble.lang.global.GProtocol; -import org.scribble.lang.global.GSeq; import org.scribble.lang.global.GTypeTranslator; import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; @@ -56,6 +55,7 @@ import org.scribble.type.name.MessageId; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; +import org.scribble.type.session.global.GSeq; import org.scribble.util.ScribUtil; import org.scribble.visit.context.Projector; import org.scribble.visit.context.ProtocolDeclContextBuilder; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java index 2ab9b6992..c8cfde06e 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java @@ -29,7 +29,7 @@ import org.scribble.del.ProtocolDefDel; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; -import org.scribble.type.SubprotoSig; +import org.scribble.lang.SubprotoSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.kind.RecVarKind; import org.scribble.visit.ProtocolDefInliner; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java b/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java index ad5101245..9db8caa05 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java @@ -21,9 +21,9 @@ import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.RecursionDel; import org.scribble.job.ScribbleException; -import org.scribble.lang.global.GSeq; import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.name.RecVar; +import org.scribble.type.session.global.GSeq; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.context.env.ProjectionEnv; @@ -35,13 +35,13 @@ public class GRecursionDel extends RecursionDel implements GCompoundInteractionN { @Override - public org.scribble.lang.global.GRecursion translate(ScribNode n, + public org.scribble.type.session.global.GRecursion translate(ScribNode n, GTypeTranslator t) throws ScribbleException { GRecursion source = (GRecursion) n; RecVar recvar = source.getRecVarChild().toName(); GSeq block = (GSeq) source.getBlockChild().visitWith(t); - return new org.scribble.lang.global.GRecursion(source, recvar, block); + return new org.scribble.type.session.global.GRecursion(source, recvar, block); } @Override diff --git a/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java b/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java index 5d61b35ba..045c878d0 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java @@ -19,9 +19,9 @@ import org.scribble.ast.local.LAccept; import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.ScribbleException; -import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java index 9253d085a..cafe5f19e 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java @@ -34,7 +34,7 @@ import org.scribble.del.DoDel; import org.scribble.job.JobContext; import org.scribble.job.ScribbleException; -import org.scribble.type.SubprotoSig; +import org.scribble.lang.SubprotoSig; import org.scribble.type.kind.RecVarKind; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java b/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java index 6bb4e1a52..bd2771c09 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java @@ -27,7 +27,7 @@ import org.scribble.del.ProtocolDefDel; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; -import org.scribble.type.SubprotoSig; +import org.scribble.lang.SubprotoSig; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.kind.RecVarKind; import org.scribble.visit.ProtocolDefInliner; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java b/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java index 9da1c3be7..b08464439 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java @@ -18,9 +18,9 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LReceive; import org.scribble.job.ScribbleException; -import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java b/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java index 854de0c9c..b6fe4b435 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java @@ -19,9 +19,9 @@ import org.scribble.ast.local.LRequest; import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.ScribbleException; -import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java b/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java index ca5ea5169..8f7b56191 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java @@ -22,9 +22,9 @@ import org.scribble.ast.local.LSend; import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.ScribbleException; -import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; import org.scribble.visit.wf.ExplicitCorrelationChecker; diff --git a/scribble-core/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java index a8f9989ec..5540c0e66 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java @@ -16,11 +16,11 @@ import org.antlr.runtime.CommonToken; import org.scribble.ast.DataTypeDecl; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.name.DataType; import org.scribble.visit.wf.NameDisambiguator; diff --git a/scribble-core/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java index 9aa96e04a..aad1f16ce 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java @@ -16,11 +16,11 @@ import org.antlr.runtime.CommonToken; import org.scribble.ast.MessageSigNameDecl; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.name.MessageSigName; import org.scribble.visit.wf.NameDisambiguator; diff --git a/scribble-core/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java b/scribble-core/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java index d4d3a4f6e..7498c76ca 100644 --- a/scribble-core/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java +++ b/scribble-core/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java @@ -16,7 +16,6 @@ import org.scribble.ast.MessageTransfer; import org.scribble.ast.PayloadElem; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.simple.AmbigNameNode; @@ -24,6 +23,7 @@ import org.scribble.ast.name.simple.TypeParamNode; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.kind.DataTypeKind; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.SigKind; diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 92a86076a..7f473228a 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -24,22 +24,20 @@ import java.util.stream.Collectors; import org.scribble.ast.Module; -import org.scribble.ast.context.ModuleContext; import org.scribble.ast.global.GProtocolDecl; import org.scribble.del.global.GProtocolDeclDel; import org.scribble.lang.Projector; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.SubprotoSig; +import org.scribble.lang.context.ModuleContext; import org.scribble.lang.global.GProtocol; -import org.scribble.lang.global.GType; import org.scribble.lang.global.GTypeTranslator; import org.scribble.lang.local.LProtocol; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EGraphBuilderUtil; import org.scribble.model.global.SGraph; import org.scribble.model.global.SGraphBuilderUtil; -import org.scribble.type.Arg; -import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.kind.Local; import org.scribble.type.kind.NonRoleParamKind; @@ -51,6 +49,8 @@ import org.scribble.type.name.ModuleName; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; +import org.scribble.type.session.Arg; +import org.scribble.type.session.global.GType; import org.scribble.visit.AstVisitor; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.ProtocolDefInliner; diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index 899ce4ee7..fbf6d7f35 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -28,6 +28,8 @@ import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.STypeBase; +import org.scribble.type.session.Seq; public abstract class Protocol, B extends Seq> extends STypeBase diff --git a/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java b/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java index eb604ec92..71ea707a0 100644 --- a/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java @@ -20,7 +20,6 @@ import java.util.stream.Collectors; import org.scribble.job.Job; -import org.scribble.type.SubprotoSig; import org.scribble.type.name.RecVar; public class STypeInliner diff --git a/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java index e455922a5..1a986a9ef 100644 --- a/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java @@ -18,6 +18,7 @@ import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.RecVar; +import org.scribble.type.session.Seq; // Currently once usage only, no popRec -- CHECKME: fix? public class STypeUnfolder diff --git a/scribble-core/src/main/java/org/scribble/type/SubprotoSig.java b/scribble-core/src/main/java/org/scribble/lang/SubprotoSig.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/type/SubprotoSig.java rename to scribble-core/src/main/java/org/scribble/lang/SubprotoSig.java index 3051007de..d3042cb76 100644 --- a/scribble-core/src/main/java/org/scribble/type/SubprotoSig.java +++ b/scribble-core/src/main/java/org/scribble/lang/SubprotoSig.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type; +package org.scribble.lang; import java.util.Collections; import java.util.List; @@ -20,6 +20,7 @@ import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; +import org.scribble.type.session.Arg; // Immutable public class SubprotoSig diff --git a/scribble-core/src/main/java/org/scribble/lang/Substitutions.java b/scribble-core/src/main/java/org/scribble/lang/Substitutions.java index a14833a19..eea436b01 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Substitutions.java +++ b/scribble-core/src/main/java/org/scribble/lang/Substitutions.java @@ -18,10 +18,10 @@ import java.util.List; import java.util.Map; -import org.scribble.type.Arg; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.Role; +import org.scribble.type.session.Arg; // CHECKME: move to util? public class Substitutions diff --git a/scribble-core/src/main/java/org/scribble/lang/context/ModuleContext.java b/scribble-core/src/main/java/org/scribble/lang/context/ModuleContext.java new file mode 100644 index 000000000..c1b3bc46f --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/context/ModuleContext.java @@ -0,0 +1,139 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.lang.context; + +import java.util.Map; + +import org.scribble.job.ScribbleException; +import org.scribble.type.kind.Global; +import org.scribble.type.kind.Kind; +import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.kind.SigKind; +import org.scribble.type.name.DataType; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.LProtocolName; +import org.scribble.type.name.MessageSigName; +import org.scribble.type.name.ModuleName; +import org.scribble.type.name.Name; +import org.scribble.type.name.ProtocolName; + +// Context information specific to each module as a root (wrt. to visitor passes) +// CHECKME: move to main package? +public class ModuleContext +{ + public final ModuleName root; // full name // The root Module for this ModuleContext (cf. the "main" root module from CLI) + + // All transitive name dependencies of this module: all names fully qualified + // The ScribNames maps are basically just used as sets (identity map) + // Cf. ProtocolDeclContext protocol dependencies from protocoldecl as root + private final ScribNames deps; + + // The modules and member names that are visible from this Module -- mapped to "cannonical" (fully qualified) names + // visible names -> fully qualified names + // Directly visible names from this module + private final ScribNames visible; + + // Made by ModuleContextBuilder + // ModuleContext is the root context + public ModuleContext(ModuleName root, ScribNames deps, ScribNames visible) throws ScribbleException + { + this.root = root; + this.deps = deps; + this.visible = visible; + } + + /*public boolean isDataTypeDependency(DataType typename) + { + return this.deps.data.keySet().contains(typename); + } + + public boolean isMessageSigNameDependency(Name signame) + { + return this.deps.sigs.containsKey(signame); + }*/ + + // TODO: deprecate -- now redundant: proto should already be full name by namedisamb (and this.deps only stores full names) + // Refactored as a "check" for now (although still redundant, not actually checking anything) + public ProtocolName checkProtocolDeclDependencyFullName( + ProtocolName proto) + { + return getProtocolDeclFullName(this.deps, proto); + } + + public boolean isDataTypeVisible(DataType typename) + { + return this.visible.data.keySet().contains(typename); + } + + public boolean isMessageSigNameVisible(Name signame) + { + return this.visible.sigs.containsKey(signame); + } + + public DataType getVisibleDataTypeFullName(DataType visname) + { + return getFullName(this.visible.data, visname); + } + + public boolean isVisibleDataType(DataType visname) + { + return this.visible.isVisibleDataType(visname); + } + + public MessageSigName getVisibleMessageSigNameFullName(MessageSigName visname) + { + return getFullName(this.visible.sigs, visname); + } + + public ProtocolName getVisibleProtocolDeclFullName( + ProtocolName visname) + { + return getProtocolDeclFullName(this.visible, visname); + } + + public boolean isVisibleProtocolDeclName( + ProtocolName visname) + { + return this.visible.isVisibleProtocolDeclName(visname); + } + + public static ProtocolName getProtocolDeclFullName( + ScribNames names, ProtocolName proto) + { + ProtocolName pn = (proto.getKind() + .equals(Global.KIND)) + ? getFullName(names.globals, (GProtocolName) proto) + : getFullName(names.locals, (LProtocolName) proto); + @SuppressWarnings("unchecked") + ProtocolName tmp = (ProtocolName) pn; + return tmp; + } + + private static , K extends Kind> T getFullName( + Map map, T visname) + { + if (!map.containsKey(visname)) + { + // FIXME: runtime exception bad -- make a guard method + throw new RuntimeException("Unknown name: " + visname); + } + return map.get(visname); + } + + @Override + public String toString() + { + return "[deps=" + this.deps + ", visible=" + this.visible + "]"; + } +} diff --git a/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java b/scribble-core/src/main/java/org/scribble/lang/context/ModuleContextMaker.java similarity index 59% rename from scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java rename to scribble-core/src/main/java/org/scribble/lang/context/ModuleContextMaker.java index f666ff16e..eb062dabe 100644 --- a/scribble-core/src/main/java/org/scribble/ast/context/ModuleContext.java +++ b/scribble-core/src/main/java/org/scribble/lang/context/ModuleContextMaker.java @@ -11,9 +11,8 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.ast.context; +package org.scribble.lang.context; -import java.util.HashMap; import java.util.Map; import org.scribble.ast.DataTypeDecl; @@ -25,59 +24,60 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.local.LProtocolDecl; import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.Kind; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.kind.SigKind; import org.scribble.type.name.DataType; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.MessageSigName; import org.scribble.type.name.ModuleName; -import org.scribble.type.name.Name; -import org.scribble.type.name.ProtocolName; -// Context information specific to each module as a root (wrt. to visitor passes) -// CHECKME: move to main package? -public class ModuleContext +public class ModuleContextMaker { - public final ModuleName root; // full name // The root Module for this ModuleContext (cf. the "main" root module from CLI) + private Module root; // full name // The root Module for this ModuleContext (cf. the "main" root module from CLI) // All transitive name dependencies of this module: all names fully qualified // The ScribNames maps are basically just used as sets (identity map) // Cf. ProtocolDeclContext protocol dependencies from protocoldecl as root - private final ScribNames deps = new ScribNames(); + private ScribNames deps;// = new ScribNames(); // The modules and member names that are visible from this Module -- mapped to "cannonical" (fully qualified) names // visible names -> fully qualified names // Directly visible names from this module - private final ScribNames visible = new ScribNames(); + private ScribNames visible;// = new ScribNames(); // Made by ModuleContextBuilder // ModuleContext is the root context - public ModuleContext(//JobContext jcontext, + public ModuleContextMaker() //JobContext jcontext, + { + } + + public ModuleContext make( Map parsed, // From MainContext (N.B., in a different non-visible package) Module root) throws ScribbleException { - ModuleName fullname = root.getFullModuleName(); - ModuleName simpname = root.getModuleDeclChild().getDeclName(); + this.root = root; + this.deps = new ScribNames(); + this.visible = new ScribNames(); + + ModuleName fullname = this.root.getFullModuleName(); + ModuleName simpname = this.root.getModuleDeclChild().getDeclName(); - this.root = fullname; - // All transitive dependencies (for inlined and subprotocol visiting) - addModule(this.deps, root, fullname); - addImportDependencies(parsed, root); + addModule(this.deps, this.root, fullname); + addImportDependencies(parsed, this.root); // Names directly visible from this module - addModule(this.visible, root, fullname); + addModule(this.visible, this.root, fullname); if (!fullname.equals(simpname)) { - addModule(this.visible, root, simpname); + addModule(this.visible, this.root, simpname); // Adds simple name of root as visible, and members qualified by simple name } addVisible(parsed, root); // Adds imports and members by their "direct" names (unqualified, except for no-alias imports) + + return new ModuleContext(root.getFullModuleName(), deps, visible); } + // Register mod under name modname, modname could be the full module name or an import alias // Adds member names qualified by mod @@ -196,114 +196,9 @@ private void addVisible(Map parsed, Module root) } } - /*public boolean isDataTypeDependency(DataType typename) - { - return this.deps.data.keySet().contains(typename); - } - - public boolean isMessageSigNameDependency(Name signame) - { - return this.deps.sigs.containsKey(signame); - }*/ - - // TODO: deprecate -- now redundant: proto should already be full name by namedisamb (and this.deps only stores full names) - // Refactored as a "check" for now (although still redundant, not actually checking anything) - public ProtocolName checkProtocolDeclDependencyFullName( - ProtocolName proto) - { - return getProtocolDeclFullName(this.deps, proto); - } - - public boolean isDataTypeVisible(DataType typename) - { - return this.visible.data.keySet().contains(typename); - } - - public boolean isMessageSigNameVisible(Name signame) - { - return this.visible.sigs.containsKey(signame); - } - - public DataType getVisibleDataTypeFullName(DataType visname) - { - return getFullName(this.visible.data, visname); - } - - public boolean isVisibleDataType(DataType visname) - { - return this.visible.isVisibleDataType(visname); - } - - public MessageSigName getVisibleMessageSigNameFullName(MessageSigName visname) - { - return getFullName(this.visible.sigs, visname); - } - - public ProtocolName getVisibleProtocolDeclFullName( - ProtocolName visname) - { - return getProtocolDeclFullName(this.visible, visname); - } - - public boolean isVisibleProtocolDeclName( - ProtocolName visname) - { - return this.visible.isVisibleProtocolDeclName(visname); - } - - public static ProtocolName getProtocolDeclFullName( - ScribNames names, ProtocolName proto) - { - ProtocolName pn = (proto.getKind() - .equals(Global.KIND)) - ? getFullName(names.globals, (GProtocolName) proto) - : getFullName(names.locals, (LProtocolName) proto); - @SuppressWarnings("unchecked") - ProtocolName tmp = (ProtocolName) pn; - return tmp; - } - - private static , K extends Kind> T getFullName( - Map map, T visname) - { - if (!map.containsKey(visname)) - { - // FIXME: runtime exception bad -- make a guard method - throw new RuntimeException("Unknown name: " + visname); - } - return map.get(visname); - } - - @Override + /*@Override public String toString() { - return "[deps=" + this.deps + ", visible=" + this.visible + "]"; - } + return "Maker[deps=" + this.deps + ", visible=" + this.visible + "]"; + }*/ } - -class ScribNames -{ - // names -> fully qualified names - protected final Map modules = new HashMap<>(); - protected final Map data = new HashMap<>(); - protected final Map sigs = new HashMap<>(); - protected final Map globals = new HashMap<>(); - protected final Map locals = new HashMap<>(); - - @Override - public String toString() - { - return "(modules=" + this.modules + ", types=" + this.data + ", sigs=" + this.sigs - + ", globals=" + this.globals + ", locals=" + this.locals + ")"; - } - - public boolean isVisibleProtocolDeclName(ProtocolName visname) - { - return this.globals.containsKey(visname) || this.locals.containsKey(visname); - } - - public boolean isVisibleDataType(DataType visname) - { - return this.data.containsKey(visname); - } -} diff --git a/scribble-core/src/main/java/org/scribble/lang/context/ScribNames.java b/scribble-core/src/main/java/org/scribble/lang/context/ScribNames.java new file mode 100644 index 000000000..fe22c9409 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/context/ScribNames.java @@ -0,0 +1,40 @@ +package org.scribble.lang.context; + +import java.util.HashMap; +import java.util.Map; + +import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.DataType; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.LProtocolName; +import org.scribble.type.name.MessageSigName; +import org.scribble.type.name.ModuleName; +import org.scribble.type.name.ProtocolName; + +// TODO: rename better +public class ScribNames +{ + // names -> fully qualified names + protected final Map modules = new HashMap<>(); + protected final Map data = new HashMap<>(); + protected final Map sigs = new HashMap<>(); + protected final Map globals = new HashMap<>(); + protected final Map locals = new HashMap<>(); + + @Override + public String toString() + { + return "(modules=" + this.modules + ", types=" + this.data + ", sigs=" + this.sigs + + ", globals=" + this.globals + ", locals=" + this.locals + ")"; + } + + public boolean isVisibleProtocolDeclName(ProtocolName visname) + { + return this.globals.containsKey(visname) || this.locals.containsKey(visname); + } + + public boolean isVisibleDataType(DataType visname) + { + return this.data.containsKey(visname); + } +} \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index 1d2383f67..d6f54d7b6 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -29,10 +29,9 @@ import org.scribble.lang.ProtocolMod; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.SubprotoSig; import org.scribble.lang.Substitutions; import org.scribble.lang.local.LProjection; -import org.scribble.lang.local.LSeq; -import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Global; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.GProtocolName; @@ -40,6 +39,10 @@ import org.scribble.type.name.MemberName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.global.GRecursion; +import org.scribble.type.session.global.GSeq; +import org.scribble.type.session.global.GType; +import org.scribble.type.session.local.LSeq; public class GProtocol extends Protocol implements GType diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java b/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java index b88eb826e..31413c719 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java @@ -18,6 +18,7 @@ import org.scribble.job.Job; import org.scribble.job.ScribbleException; import org.scribble.type.name.ModuleName; +import org.scribble.type.session.global.GType; import org.scribble.visit.SimpleVisitor; // CHECKME: move to visit package? diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java index e2d65b685..3a45a17c9 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java @@ -25,6 +25,7 @@ import org.scribble.type.name.LProtocolName; import org.scribble.type.name.MemberName; import org.scribble.type.name.Role; +import org.scribble.type.session.local.LSeq; public class LProjection extends LProtocol { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index d026bc0b7..49763b1a7 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -28,17 +28,20 @@ import org.scribble.lang.ProtocolMod; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.SubprotoSig; import org.scribble.lang.Substitutions; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.model.endpoint.EState; -import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Local; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.MemberName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.local.LRecursion; +import org.scribble.type.session.local.LSeq; +import org.scribble.type.session.local.LType; public class LProtocol extends Protocol implements LType diff --git a/scribble-core/src/main/java/org/scribble/model/MAction.java b/scribble-core/src/main/java/org/scribble/model/MAction.java index d3ca3bb70..b219a51ca 100644 --- a/scribble-core/src/main/java/org/scribble/model/MAction.java +++ b/scribble-core/src/main/java/org/scribble/model/MAction.java @@ -13,10 +13,10 @@ */ package org.scribble.model; -import org.scribble.type.Payload; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public abstract class MAction { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java b/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java index 9e9b785cd..cf9c13e5e 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java @@ -28,12 +28,12 @@ import org.scribble.job.Job; import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.Payload; import org.scribble.type.name.DataType; import org.scribble.type.name.MessageId; import org.scribble.type.name.MessageSigName; import org.scribble.type.name.Op; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public class AutParser { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactory.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactory.java index 43e981467..09d508b1a 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactory.java @@ -22,10 +22,10 @@ import org.scribble.model.endpoint.actions.ESend; import org.scribble.model.endpoint.actions.EWrapClient; import org.scribble.model.endpoint.actions.EWrapServer; -import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public interface EModelFactory { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactoryImpl.java index 3505dc96c..35c38f297 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactoryImpl.java @@ -22,10 +22,10 @@ import org.scribble.model.endpoint.actions.ESend; import org.scribble.model.endpoint.actions.EWrapClient; import org.scribble.model.endpoint.actions.EWrapServer; -import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; // Separate E/SModelFactories fits protected E/SState constructor pattern public class EModelFactoryImpl implements EModelFactory diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateContinueEdge.java b/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateContinueEdge.java index 3df8e37cf..dafba0de1 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateContinueEdge.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateContinueEdge.java @@ -16,10 +16,10 @@ import org.scribble.model.endpoint.actions.EAction; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.actions.SAction; -import org.scribble.type.Payload; import org.scribble.type.name.Op; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; class IntermediateContinueEdge extends EAction { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java b/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java index 01fb61e25..d2af5e554 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java @@ -16,10 +16,10 @@ import org.scribble.model.endpoint.actions.EAction; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.actions.SAction; -import org.scribble.type.Payload; import org.scribble.type.name.Op; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; // FIXME rename better (it's an "external rec" continue edge) @Deprecated diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAccept.java b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAccept.java index 05f5e2227..f09c50190 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAccept.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAccept.java @@ -16,9 +16,9 @@ import org.scribble.model.endpoint.EModelFactory; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.actions.SAccept; -import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public class EAccept extends EAction { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAction.java b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAction.java index fc0121252..3789f01c9 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAction.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAction.java @@ -17,10 +17,10 @@ import org.scribble.model.endpoint.EModelFactory; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.actions.SAction; -import org.scribble.type.Payload; import org.scribble.type.kind.Local; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public abstract class EAction extends MAction { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EDisconnect.java b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EDisconnect.java index 19f219f78..f650dd559 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EDisconnect.java @@ -16,9 +16,9 @@ import org.scribble.model.endpoint.EModelFactory; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.actions.SDisconnect; -import org.scribble.type.Payload; import org.scribble.type.name.Op; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public class EDisconnect extends EAction { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EReceive.java b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EReceive.java index 11b351dc2..b1bcf2678 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EReceive.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EReceive.java @@ -16,9 +16,9 @@ import org.scribble.model.endpoint.EModelFactory; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.actions.SReceive; -import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public class EReceive extends EAction { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/ERequest.java b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/ERequest.java index 8f371742a..519c38173 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/ERequest.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/ERequest.java @@ -16,9 +16,9 @@ import org.scribble.model.endpoint.EModelFactory; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.actions.SRequest; -import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public class ERequest extends EAction { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/ESend.java b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/ESend.java index fb8176cd6..996996265 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/ESend.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/ESend.java @@ -16,9 +16,9 @@ import org.scribble.model.endpoint.EModelFactory; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.actions.SSend; -import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public class ESend extends EAction { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapClient.java b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapClient.java index 0566d618f..87c90337b 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapClient.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapClient.java @@ -16,9 +16,9 @@ import org.scribble.model.endpoint.EModelFactory; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.actions.SWrapClient; -import org.scribble.type.Payload; import org.scribble.type.name.Op; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; // Duplicated from Disconnect public class EWrapClient extends EAction diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapServer.java b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapServer.java index e99f3fff7..62eb301f3 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapServer.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapServer.java @@ -16,9 +16,9 @@ import org.scribble.model.endpoint.EModelFactory; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.actions.SWrapServer; -import org.scribble.type.Payload; import org.scribble.type.name.Op; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; // Duplicated from Disconnect public class EWrapServer extends EAction diff --git a/scribble-core/src/main/java/org/scribble/model/global/SModelFactory.java b/scribble-core/src/main/java/org/scribble/model/global/SModelFactory.java index 603b412ce..f8ebfa832 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/model/global/SModelFactory.java @@ -23,10 +23,10 @@ import org.scribble.model.global.actions.SSend; import org.scribble.model.global.actions.SWrapClient; import org.scribble.model.global.actions.SWrapServer; -import org.scribble.type.Payload; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public interface SModelFactory { diff --git a/scribble-core/src/main/java/org/scribble/model/global/SModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/model/global/SModelFactoryImpl.java index 9e9e69377..69f8f9458 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/model/global/SModelFactoryImpl.java @@ -23,10 +23,10 @@ import org.scribble.model.global.actions.SSend; import org.scribble.model.global.actions.SWrapClient; import org.scribble.model.global.actions.SWrapServer; -import org.scribble.type.Payload; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; // Separate E/SModelFactories fits protected E/SState constructor pattern public class SModelFactoryImpl implements SModelFactory diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SAccept.java b/scribble-core/src/main/java/org/scribble/model/global/actions/SAccept.java index fac28d9fc..d929217bb 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SAccept.java +++ b/scribble-core/src/main/java/org/scribble/model/global/actions/SAccept.java @@ -13,9 +13,9 @@ */ package org.scribble.model.global.actions; -import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public class SAccept extends SAction { diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SAction.java b/scribble-core/src/main/java/org/scribble/model/global/actions/SAction.java index 10c20bc34..395819ba7 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SAction.java +++ b/scribble-core/src/main/java/org/scribble/model/global/actions/SAction.java @@ -18,10 +18,10 @@ import java.util.Set; import org.scribble.model.MAction; -import org.scribble.type.Payload; import org.scribble.type.kind.Global; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public abstract class SAction extends MAction { diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SConnect.java b/scribble-core/src/main/java/org/scribble/model/global/actions/SConnect.java index 594b6c782..a6ec67084 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SConnect.java +++ b/scribble-core/src/main/java/org/scribble/model/global/actions/SConnect.java @@ -13,9 +13,9 @@ */ package org.scribble.model.global.actions; -import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public class SConnect extends SAction { diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SDisconnect.java b/scribble-core/src/main/java/org/scribble/model/global/actions/SDisconnect.java index d4d3a596a..3c87acd95 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/model/global/actions/SDisconnect.java @@ -13,9 +13,9 @@ */ package org.scribble.model.global.actions; -import org.scribble.type.Payload; import org.scribble.type.name.Op; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public class SDisconnect extends SAction { diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SReceive.java b/scribble-core/src/main/java/org/scribble/model/global/actions/SReceive.java index 46915ce13..346690167 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SReceive.java +++ b/scribble-core/src/main/java/org/scribble/model/global/actions/SReceive.java @@ -13,9 +13,9 @@ */ package org.scribble.model.global.actions; -import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public class SReceive extends SAction { diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SRequest.java b/scribble-core/src/main/java/org/scribble/model/global/actions/SRequest.java index 93bf4b4a6..5fdd9183e 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SRequest.java +++ b/scribble-core/src/main/java/org/scribble/model/global/actions/SRequest.java @@ -13,9 +13,9 @@ */ package org.scribble.model.global.actions; -import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public class SRequest extends SAction { diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SSend.java b/scribble-core/src/main/java/org/scribble/model/global/actions/SSend.java index 40a798055..86e4ba107 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SSend.java +++ b/scribble-core/src/main/java/org/scribble/model/global/actions/SSend.java @@ -13,9 +13,9 @@ */ package org.scribble.model.global.actions; -import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public class SSend extends SAction { diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapClient.java b/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapClient.java index c0540d3fe..7516cffbc 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapClient.java +++ b/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapClient.java @@ -13,9 +13,9 @@ */ package org.scribble.model.global.actions; -import org.scribble.type.Payload; import org.scribble.type.name.Op; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public class SWrapClient extends SAction { diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapServer.java b/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapServer.java index 448fdb2cd..2cf71ce69 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapServer.java +++ b/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapServer.java @@ -13,9 +13,9 @@ */ package org.scribble.model.global.actions; -import org.scribble.type.Payload; import org.scribble.type.name.Op; import org.scribble.type.name.Role; +import org.scribble.type.session.Payload; public class SWrapServer extends SAction { diff --git a/scribble-core/src/main/java/org/scribble/type/name/MessageSigName.java b/scribble-core/src/main/java/org/scribble/type/name/MessageSigName.java index 09a1837f0..53464dc30 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/MessageSigName.java +++ b/scribble-core/src/main/java/org/scribble/type/name/MessageSigName.java @@ -13,8 +13,8 @@ */ package org.scribble.type.name; -import org.scribble.type.Message; import org.scribble.type.kind.SigKind; +import org.scribble.type.session.Message; // The name of a declared (imported) message signature member diff --git a/scribble-core/src/main/java/org/scribble/type/name/PayloadElemType.java b/scribble-core/src/main/java/org/scribble/type/name/PayloadElemType.java index b8cbbe874..4107d8b08 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/PayloadElemType.java +++ b/scribble-core/src/main/java/org/scribble/type/name/PayloadElemType.java @@ -13,8 +13,8 @@ */ package org.scribble.type.name; -import org.scribble.type.Arg; import org.scribble.type.kind.PayloadTypeKind; +import org.scribble.type.session.Arg; public interface PayloadElemType extends Arg diff --git a/scribble-core/src/main/java/org/scribble/type/Arg.java b/scribble-core/src/main/java/org/scribble/type/session/Arg.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/type/Arg.java rename to scribble-core/src/main/java/org/scribble/type/session/Arg.java index 5c1a63b8e..ca0760fc4 100644 --- a/scribble-core/src/main/java/org/scribble/type/Arg.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Arg.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type; +package org.scribble.type.session; import org.scribble.type.kind.NonRoleArgKind; diff --git a/scribble-core/src/main/java/org/scribble/lang/BasicInteraction.java b/scribble-core/src/main/java/org/scribble/type/session/BasicInteraction.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/lang/BasicInteraction.java rename to scribble-core/src/main/java/org/scribble/type/session/BasicInteraction.java index 090ec89f7..7df8793dd 100644 --- a/scribble-core/src/main/java/org/scribble/lang/BasicInteraction.java +++ b/scribble-core/src/main/java/org/scribble/type/session/BasicInteraction.java @@ -11,12 +11,13 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.type.session; import java.util.Collections; import java.util.List; import java.util.Set; +import org.scribble.lang.STypeInliner; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; diff --git a/scribble-core/src/main/java/org/scribble/lang/Choice.java b/scribble-core/src/main/java/org/scribble/type/session/Choice.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/lang/Choice.java rename to scribble-core/src/main/java/org/scribble/type/session/Choice.java index 98284361f..1b3e14bce 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Choice.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Choice.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.type.session; import java.util.Collections; import java.util.List; diff --git a/scribble-core/src/main/java/org/scribble/lang/ConnectAction.java b/scribble-core/src/main/java/org/scribble/type/session/ConnectAction.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/lang/ConnectAction.java rename to scribble-core/src/main/java/org/scribble/type/session/ConnectAction.java index d7bbbf4a0..3ee5c2e60 100644 --- a/scribble-core/src/main/java/org/scribble/lang/ConnectAction.java +++ b/scribble-core/src/main/java/org/scribble/type/session/ConnectAction.java @@ -11,14 +11,11 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.type.session; import java.util.LinkedList; import java.util.List; -import org.scribble.type.Message; -import org.scribble.type.MessageSig; -import org.scribble.type.Payload; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.DataType; import org.scribble.type.name.MemberName; diff --git a/scribble-core/src/main/java/org/scribble/lang/Continue.java b/scribble-core/src/main/java/org/scribble/type/session/Continue.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/lang/Continue.java rename to scribble-core/src/main/java/org/scribble/type/session/Continue.java index 01c38ec2a..028b75676 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Continue.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Continue.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.type.session; import java.util.Collections; import java.util.List; @@ -20,6 +20,8 @@ import java.util.stream.Stream; import org.scribble.ast.ProtocolKindNode; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.Substitutions; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.ProtocolName; diff --git a/scribble-core/src/main/java/org/scribble/lang/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/lang/DirectedInteraction.java rename to scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java index 74c8dac5c..a1a122012 100644 --- a/scribble-core/src/main/java/org/scribble/lang/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java @@ -11,13 +11,13 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.type.session; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.type.Message; +import org.scribble.lang.Substitutions; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/lang/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/lang/DisconnectAction.java rename to scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java index d896e7131..e6277d078 100644 --- a/scribble-core/src/main/java/org/scribble/lang/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.type.session; import java.util.Collections; import java.util.List; @@ -19,6 +19,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.scribble.lang.Substitutions; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.Role; diff --git a/scribble-core/src/main/java/org/scribble/lang/Do.java b/scribble-core/src/main/java/org/scribble/type/session/Do.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/lang/Do.java rename to scribble-core/src/main/java/org/scribble/type/session/Do.java index c2aa20a07..ff35ab140 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Do.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Do.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.type.session; import java.util.Collections; import java.util.LinkedList; @@ -20,8 +20,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.type.Arg; -import org.scribble.type.MessageSig; +import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.Substitutions; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.DataType; diff --git a/scribble-core/src/main/java/org/scribble/type/Message.java b/scribble-core/src/main/java/org/scribble/type/session/Message.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/type/Message.java rename to scribble-core/src/main/java/org/scribble/type/session/Message.java index f3a70913d..a856c01df 100644 --- a/scribble-core/src/main/java/org/scribble/type/Message.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Message.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type; +package org.scribble.type.session; import org.scribble.type.kind.MessageIdKind; import org.scribble.type.kind.SigKind; diff --git a/scribble-core/src/main/java/org/scribble/type/MessageSig.java b/scribble-core/src/main/java/org/scribble/type/session/MessageSig.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/type/MessageSig.java rename to scribble-core/src/main/java/org/scribble/type/session/MessageSig.java index 9080f3019..238b84077 100644 --- a/scribble-core/src/main/java/org/scribble/type/MessageSig.java +++ b/scribble-core/src/main/java/org/scribble/type/session/MessageSig.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type; +package org.scribble.type.session; import org.scribble.type.kind.OpKind; import org.scribble.type.kind.SigKind; diff --git a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/type/session/MessageTransfer.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java rename to scribble-core/src/main/java/org/scribble/type/session/MessageTransfer.java index d66fff1d4..810839ffb 100644 --- a/scribble-core/src/main/java/org/scribble/lang/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/type/session/MessageTransfer.java @@ -11,14 +11,11 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.type.session; import java.util.LinkedList; import java.util.List; -import org.scribble.type.Message; -import org.scribble.type.MessageSig; -import org.scribble.type.Payload; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.DataType; import org.scribble.type.name.GDelegationType; diff --git a/scribble-core/src/main/java/org/scribble/type/Payload.java b/scribble-core/src/main/java/org/scribble/type/session/Payload.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/type/Payload.java rename to scribble-core/src/main/java/org/scribble/type/session/Payload.java index 7db53d890..945f1a975 100644 --- a/scribble-core/src/main/java/org/scribble/type/Payload.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Payload.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type; +package org.scribble.type.session; import java.util.Collections; import java.util.List; diff --git a/scribble-core/src/main/java/org/scribble/lang/Recursion.java b/scribble-core/src/main/java/org/scribble/type/session/Recursion.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/lang/Recursion.java rename to scribble-core/src/main/java/org/scribble/type/session/Recursion.java index 0ec8072b1..eabd243f9 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Recursion.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.type.session; import java.util.List; import java.util.Set; diff --git a/scribble-core/src/main/java/org/scribble/lang/SType.java b/scribble-core/src/main/java/org/scribble/type/session/SType.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/lang/SType.java rename to scribble-core/src/main/java/org/scribble/type/session/SType.java index d5ba4d9c0..b42b83649 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SType.java +++ b/scribble-core/src/main/java/org/scribble/type/session/SType.java @@ -11,12 +11,15 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.type.session; import java.util.List; import java.util.Set; import org.scribble.ast.ProtocolKindNode; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.Substitutions; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.ProtocolName; diff --git a/scribble-core/src/main/java/org/scribble/lang/STypeBase.java b/scribble-core/src/main/java/org/scribble/type/session/STypeBase.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/lang/STypeBase.java rename to scribble-core/src/main/java/org/scribble/type/session/STypeBase.java index cb668aea7..c8ec3ab8c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/STypeBase.java +++ b/scribble-core/src/main/java/org/scribble/type/session/STypeBase.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.type.session; import org.scribble.ast.ProtocolKindNode; import org.scribble.type.kind.ProtocolKind; diff --git a/scribble-core/src/main/java/org/scribble/type/SessionTypeFactory.java b/scribble-core/src/main/java/org/scribble/type/session/STypeFactory.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/type/SessionTypeFactory.java rename to scribble-core/src/main/java/org/scribble/type/session/STypeFactory.java index 4492496c2..80dd9e15e 100644 --- a/scribble-core/src/main/java/org/scribble/type/SessionTypeFactory.java +++ b/scribble-core/src/main/java/org/scribble/type/session/STypeFactory.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type; +package org.scribble.type.session; import java.util.Arrays; @@ -19,9 +19,9 @@ import org.scribble.type.name.ModuleName; import org.scribble.type.name.PackageName; -public class SessionTypeFactory +public class STypeFactory { - public SessionTypeFactory() + public STypeFactory() { } diff --git a/scribble-core/src/main/java/org/scribble/lang/Seq.java b/scribble-core/src/main/java/org/scribble/type/session/Seq.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/lang/Seq.java rename to scribble-core/src/main/java/org/scribble/type/session/Seq.java index 0a6b40f15..ec1df127a 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Seq.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Seq.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.type.session; import java.util.Collections; import java.util.LinkedList; @@ -20,6 +20,7 @@ import java.util.stream.Collectors; import org.scribble.ast.InteractionSeq; +import org.scribble.lang.Substitutions; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.ProtocolName; diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java b/scribble-core/src/main/java/org/scribble/type/session/global/GChoice.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/lang/global/GChoice.java rename to scribble-core/src/main/java/org/scribble/type/session/global/GChoice.java index 3fc039e53..096c14402 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GChoice.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.global; +package org.scribble.type.session.global; import java.util.Collections; import java.util.HashMap; @@ -25,17 +25,17 @@ import java.util.stream.Stream; import org.scribble.job.ScribbleException; -import org.scribble.lang.Choice; import org.scribble.lang.Projector; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; -import org.scribble.lang.local.LChoice; -import org.scribble.lang.local.LSeq; -import org.scribble.lang.local.LSkip; -import org.scribble.lang.local.LType; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; +import org.scribble.type.session.Choice; +import org.scribble.type.session.local.LChoice; +import org.scribble.type.session.local.LSeq; +import org.scribble.type.session.local.LSkip; +import org.scribble.type.session.local.LType; public class GChoice extends Choice implements GType { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GConnect.java b/scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java similarity index 91% rename from scribble-core/src/main/java/org/scribble/lang/global/GConnect.java rename to scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java index d4622b8d9..286498a56 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.global; +package org.scribble.type.session.global; import java.util.Collections; import java.util.HashMap; @@ -20,18 +20,18 @@ import java.util.Set; import org.scribble.job.ScribbleException; -import org.scribble.lang.ConnectAction; import org.scribble.lang.Projector; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; -import org.scribble.lang.local.LAcc; -import org.scribble.lang.local.LReq; -import org.scribble.lang.local.LSkip; -import org.scribble.lang.local.LType; -import org.scribble.type.Message; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; +import org.scribble.type.session.ConnectAction; +import org.scribble.type.session.Message; +import org.scribble.type.session.local.LAcc; +import org.scribble.type.session.local.LReq; +import org.scribble.type.session.local.LSkip; +import org.scribble.type.session.local.LType; public class GConnect extends ConnectAction implements GType diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java b/scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/lang/global/GContinue.java rename to scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java index 1a0c52b35..a4e746ff8 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java @@ -11,22 +11,22 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.global; +package org.scribble.type.session.global; import java.util.Map; import java.util.Set; import org.scribble.ast.ProtocolKindNode; import org.scribble.job.ScribbleException; -import org.scribble.lang.Continue; import org.scribble.lang.Projector; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; -import org.scribble.lang.local.LContinue; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.Continue; +import org.scribble.type.session.local.LContinue; public class GContinue extends Continue implements GType { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDisconnect.java b/scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java similarity index 92% rename from scribble-core/src/main/java/org/scribble/lang/global/GDisconnect.java rename to scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java index 7cd064d92..50d9c84e9 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java @@ -11,22 +11,22 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.global; +package org.scribble.type.session.global; import java.util.Map; import java.util.Set; import org.scribble.job.ScribbleException; -import org.scribble.lang.DisconnectAction; import org.scribble.lang.Projector; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; -import org.scribble.lang.local.LDisconnect; -import org.scribble.lang.local.LSkip; -import org.scribble.lang.local.LType; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; +import org.scribble.type.session.DisconnectAction; +import org.scribble.type.session.local.LDisconnect; +import org.scribble.type.session.local.LSkip; +import org.scribble.type.session.local.LType; public class GDisconnect extends DisconnectAction implements GType diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java b/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java similarity index 92% rename from scribble-core/src/main/java/org/scribble/lang/global/GDo.java rename to scribble-core/src/main/java/org/scribble/type/session/global/GDo.java index 66f85a924..3c42448f0 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.global; +package org.scribble.type.session.global; import java.util.List; import java.util.Map; @@ -21,21 +21,22 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.job.JobContext; import org.scribble.job.ScribbleException; -import org.scribble.lang.Do; import org.scribble.lang.Projector; import org.scribble.lang.STypeInliner; +import org.scribble.lang.SubprotoSig; import org.scribble.lang.Substitutions; -import org.scribble.lang.local.LDo; -import org.scribble.lang.local.LSkip; -import org.scribble.lang.local.LType; -import org.scribble.type.Arg; -import org.scribble.type.SubprotoSig; +import org.scribble.lang.global.GProtocol; import org.scribble.type.kind.Global; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.Arg; +import org.scribble.type.session.Do; +import org.scribble.type.session.local.LDo; +import org.scribble.type.session.local.LSkip; +import org.scribble.type.session.local.LType; public class GDo extends Do implements GType { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java similarity index 91% rename from scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java rename to scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java index 312e42d1d..546e0c5f0 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.global; +package org.scribble.type.session.global; import java.util.Collections; import java.util.HashMap; @@ -20,18 +20,18 @@ import java.util.Set; import org.scribble.job.ScribbleException; -import org.scribble.lang.MessageTransfer; import org.scribble.lang.Projector; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; -import org.scribble.lang.local.LRcv; -import org.scribble.lang.local.LSend; -import org.scribble.lang.local.LSkip; -import org.scribble.lang.local.LType; -import org.scribble.type.Message; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; +import org.scribble.type.session.MessageTransfer; +import org.scribble.type.session.local.LRcv; +import org.scribble.type.session.local.LSend; +import org.scribble.type.session.local.LSkip; +import org.scribble.type.session.local.LType; public class GMessageTransfer extends MessageTransfer implements GType diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/type/session/global/GRecursion.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java rename to scribble-core/src/main/java/org/scribble/type/session/global/GRecursion.java index 7c120504e..0de3a696b 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GRecursion.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.global; +package org.scribble.type.session.global; import java.util.HashSet; import java.util.Map; @@ -20,17 +20,17 @@ import org.scribble.ast.ProtocolKindNode; import org.scribble.job.ScribbleException; import org.scribble.lang.Projector; -import org.scribble.lang.Recursion; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; -import org.scribble.lang.local.LRecursion; -import org.scribble.lang.local.LSeq; -import org.scribble.lang.local.LSkip; -import org.scribble.lang.local.LType; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.Recursion; +import org.scribble.type.session.local.LRecursion; +import org.scribble.type.session.local.LSeq; +import org.scribble.type.session.local.LSkip; +import org.scribble.type.session.local.LType; public class GRecursion extends Recursion implements GType { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java b/scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/lang/global/GSeq.java rename to scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java index 8b4398f35..3f109f197 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.global; +package org.scribble.type.session.global; import java.util.LinkedList; import java.util.List; @@ -24,16 +24,16 @@ import org.scribble.ast.global.GInteractionSeq; import org.scribble.job.ScribbleException; import org.scribble.lang.Projector; -import org.scribble.lang.SType; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Seq; import org.scribble.lang.Substitutions; -import org.scribble.lang.local.LSeq; -import org.scribble.lang.local.LSkip; -import org.scribble.lang.local.LType; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; +import org.scribble.type.session.SType; +import org.scribble.type.session.Seq; +import org.scribble.type.session.local.LSeq; +import org.scribble.type.session.local.LSkip; +import org.scribble.type.session.local.LType; public class GSeq extends Seq implements GType { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GType.java b/scribble-core/src/main/java/org/scribble/type/session/global/GType.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/lang/global/GType.java rename to scribble-core/src/main/java/org/scribble/type/session/global/GType.java index 5c2a2b4e2..ea8c7e7c0 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GType.java @@ -11,19 +11,19 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.global; +package org.scribble.type.session.global; import java.util.Map; import java.util.Set; import org.scribble.job.ScribbleException; import org.scribble.lang.Projector; -import org.scribble.lang.SType; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.local.LType; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; +import org.scribble.type.session.SType; +import org.scribble.type.session.local.LType; public interface GType extends SType { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LAcc.java b/scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java similarity index 91% rename from scribble-core/src/main/java/org/scribble/lang/local/LAcc.java rename to scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java index 4b43b61fc..fd0516e87 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LAcc.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java @@ -11,23 +11,24 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.local; +package org.scribble.type.session.local; import java.util.Set; import org.scribble.job.ScribbleException; -import org.scribble.lang.ConnectAction; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.type.Message; -import org.scribble.type.MessageSig; -import org.scribble.type.Payload; import org.scribble.type.kind.Local; import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.ConnectAction; +import org.scribble.type.session.Message; +import org.scribble.type.session.MessageSig; +import org.scribble.type.session.Payload; public class LAcc extends ConnectAction implements LType diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java b/scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/lang/local/LChoice.java rename to scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java index b05a799f3..f651f540b 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.local; +package org.scribble.type.session.local; import java.util.Collections; import java.util.LinkedList; @@ -20,16 +20,17 @@ import java.util.stream.Collectors; import org.scribble.job.ScribbleException; -import org.scribble.lang.Choice; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.Choice; public class LChoice extends Choice implements LType { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java b/scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/lang/local/LContinue.java rename to scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java index aaad82342..1e399bed4 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.local; +package org.scribble.type.session.local; import java.util.HashSet; import java.util.LinkedList; @@ -19,15 +19,16 @@ import org.scribble.ast.ProtocolKindNode; import org.scribble.job.ScribbleException; -import org.scribble.lang.Continue; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; +import org.scribble.type.session.Continue; public class LContinue extends Continue implements LType { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LDisconnect.java b/scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/lang/local/LDisconnect.java rename to scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java index 79cbc3402..b22241ba7 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java @@ -11,19 +11,20 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.local; +package org.scribble.type.session.local; import java.util.Set; import org.scribble.job.ScribbleException; -import org.scribble.lang.DisconnectAction; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.DisconnectAction; public class LDisconnect extends DisconnectAction implements LType diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LDo.java b/scribble-core/src/main/java/org/scribble/type/session/local/LDo.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/lang/local/LDo.java rename to scribble-core/src/main/java/org/scribble/type/session/local/LDo.java index f2e6993d4..98a62d8c3 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LDo.java @@ -11,23 +11,25 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.local; +package org.scribble.type.session.local; import java.util.List; import java.util.Set; import org.scribble.job.ScribbleException; -import org.scribble.lang.Do; import org.scribble.lang.STypeInliner; +import org.scribble.lang.SubprotoSig; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.LProtocol; +import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.type.Arg; -import org.scribble.type.SubprotoSig; import org.scribble.type.kind.Local; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.Arg; +import org.scribble.type.session.Do; public class LDo extends Do implements LType { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java b/scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java similarity index 91% rename from scribble-core/src/main/java/org/scribble/lang/local/LRcv.java rename to scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java index df4221f03..905a029c1 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java @@ -11,23 +11,24 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.local; +package org.scribble.type.session.local; import java.util.Set; import org.scribble.job.ScribbleException; -import org.scribble.lang.MessageTransfer; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.type.Message; -import org.scribble.type.MessageSig; -import org.scribble.type.Payload; import org.scribble.type.kind.Local; import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; +import org.scribble.type.session.MessageSig; +import org.scribble.type.session.MessageTransfer; +import org.scribble.type.session.Payload; public class LRcv extends MessageTransfer implements LType diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java rename to scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java index 4f3c6a9a3..0f2e18fe4 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java @@ -11,20 +11,21 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.local; +package org.scribble.type.session.local; import java.util.HashSet; import java.util.Set; import org.scribble.ast.ProtocolKindNode; import org.scribble.job.ScribbleException; -import org.scribble.lang.Recursion; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; +import org.scribble.type.session.Recursion; public class LRecursion extends Recursion implements LType { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LReq.java b/scribble-core/src/main/java/org/scribble/type/session/local/LReq.java similarity index 91% rename from scribble-core/src/main/java/org/scribble/lang/local/LReq.java rename to scribble-core/src/main/java/org/scribble/type/session/local/LReq.java index f88809106..ee4bf813d 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LReq.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LReq.java @@ -11,23 +11,24 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.local; +package org.scribble.type.session.local; import java.util.Set; import org.scribble.job.ScribbleException; -import org.scribble.lang.ConnectAction; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.type.Message; -import org.scribble.type.MessageSig; -import org.scribble.type.Payload; import org.scribble.type.kind.Local; import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.ConnectAction; +import org.scribble.type.session.Message; +import org.scribble.type.session.MessageSig; +import org.scribble.type.session.Payload; public class LReq extends ConnectAction implements LType diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSend.java b/scribble-core/src/main/java/org/scribble/type/session/local/LSend.java similarity index 91% rename from scribble-core/src/main/java/org/scribble/lang/local/LSend.java rename to scribble-core/src/main/java/org/scribble/type/session/local/LSend.java index b24df7605..c03a8ee06 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LSend.java @@ -11,23 +11,24 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.local; +package org.scribble.type.session.local; import java.util.Set; import org.scribble.job.ScribbleException; -import org.scribble.lang.MessageTransfer; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.type.Message; -import org.scribble.type.MessageSig; -import org.scribble.type.Payload; import org.scribble.type.kind.Local; import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; +import org.scribble.type.session.MessageSig; +import org.scribble.type.session.MessageTransfer; +import org.scribble.type.session.Payload; public class LSend extends MessageTransfer implements LType diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java b/scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/lang/local/LSeq.java rename to scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java index 16b64daa3..ed8d98ef8 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.local; +package org.scribble.type.session.local; import java.util.Collections; import java.util.Iterator; @@ -23,15 +23,16 @@ import org.scribble.ast.InteractionSeq; import org.scribble.ast.local.LInteractionSeq; import org.scribble.job.ScribbleException; -import org.scribble.lang.SType; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Seq; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.model.endpoint.EState; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; +import org.scribble.type.session.SType; +import org.scribble.type.session.Seq; public class LSeq extends Seq implements LType { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java b/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/lang/local/LSkip.java rename to scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java index 4e8d98961..ad32277a5 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java @@ -11,22 +11,23 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.local; +package org.scribble.type.session.local; import java.util.List; import java.util.Set; import org.scribble.job.ScribbleException; -import org.scribble.lang.STypeBase; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; import org.scribble.lang.Substitutions; +import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.MemberName; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.session.STypeBase; // Used only *during* projection -- filtered out by GSeq::projection public class LSkip extends STypeBase implements LType diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LType.java b/scribble-core/src/main/java/org/scribble/type/session/local/LType.java similarity index 92% rename from scribble-core/src/main/java/org/scribble/lang/local/LType.java rename to scribble-core/src/main/java/org/scribble/type/session/local/LType.java index d92758abf..c46017059 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LType.java @@ -11,17 +11,18 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.local; +package org.scribble.type.session.local; import java.util.Set; import org.scribble.job.ScribbleException; -import org.scribble.lang.SType; import org.scribble.lang.STypeInliner; import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; +import org.scribble.type.session.SType; public interface LType extends SType { diff --git a/scribble-core/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java index 7091dd169..d9307c4ed 100644 --- a/scribble-core/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java @@ -21,10 +21,10 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.Job; import org.scribble.job.ScribbleException; -import org.scribble.type.Arg; import org.scribble.type.kind.NonRoleArgKind; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.Role; +import org.scribble.type.session.Arg; import org.scribble.visit.env.Env; // Can probably be fully replaced by SubprotocolVisitor diff --git a/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java b/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java index a1542672e..065bd4561 100644 --- a/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java +++ b/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java @@ -20,7 +20,6 @@ import org.scribble.ast.InteractionSeq; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ModuleContext; import org.scribble.ast.global.GDo; import org.scribble.ast.local.LDo; import org.scribble.del.ProtocolDefDel; @@ -29,7 +28,8 @@ import org.scribble.job.Job; import org.scribble.job.JobContext; import org.scribble.job.ScribbleException; -import org.scribble.type.SubprotoSig; +import org.scribble.lang.SubprotoSig; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.RecVar; import org.scribble.visit.env.InlineProtocolEnv; diff --git a/scribble-core/src/main/java/org/scribble/visit/SimpleVisitor.java b/scribble-core/src/main/java/org/scribble/visit/SimpleVisitor.java index 8236a15c9..3042b1fd8 100644 --- a/scribble-core/src/main/java/org/scribble/visit/SimpleVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/SimpleVisitor.java @@ -14,9 +14,9 @@ package org.scribble.visit; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ModuleContext; import org.scribble.job.Job; import org.scribble.job.ScribbleException; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.name.ModuleName; // A SimpleVisitor visits a Module (or some part of one) for a given Job diff --git a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java index 52a8b13fe..0d7f451d3 100644 --- a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java @@ -32,13 +32,12 @@ import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScopedNode; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.Job; import org.scribble.job.JobContext; import org.scribble.job.ScribbleException; -import org.scribble.type.Arg; -import org.scribble.type.SubprotoSig; +import org.scribble.lang.SubprotoSig; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.kind.NonRoleArgKind; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.ProtocolKind; @@ -46,6 +45,7 @@ import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; import org.scribble.type.name.Scope; +import org.scribble.type.session.Arg; import org.scribble.visit.env.Env; public abstract class SubprotocolVisitor> extends EnvVisitor diff --git a/scribble-core/src/main/java/org/scribble/visit/Substitutor.java b/scribble-core/src/main/java/org/scribble/visit/Substitutor.java index cb31e4b20..5f3e7fb43 100644 --- a/scribble-core/src/main/java/org/scribble/visit/Substitutor.java +++ b/scribble-core/src/main/java/org/scribble/visit/Substitutor.java @@ -20,9 +20,9 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.Job; import org.scribble.job.ScribbleException; -import org.scribble.type.Arg; import org.scribble.type.kind.NonRoleArgKind; import org.scribble.type.name.Role; +import org.scribble.type.session.Arg; public class Substitutor extends AstVisitor { diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java index c2ae93f66..8a2876016 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java @@ -14,14 +14,17 @@ package org.scribble.visit.context; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ModuleContext; import org.scribble.job.Job; import org.scribble.job.ScribbleException; +import org.scribble.lang.context.ModuleContext; +import org.scribble.lang.context.ModuleContextMaker; import org.scribble.visit.AstVisitor; // Disambiguates ambiguous PayloadTypeOrParameter names and inserts implicit Scope names public class ModuleContextBuilder extends AstVisitor { + public final ModuleContextMaker maker = new ModuleContextMaker(); // TODO: HACK, refactor + private ModuleContext mcontext; // The "root" Module context (not the "main" module) public ModuleContextBuilder(Job job) @@ -30,16 +33,19 @@ public ModuleContextBuilder(Job job) } @Override - protected void enter(ScribNode parent, ScribNode child) throws ScribbleException + protected void enter(ScribNode parent, ScribNode child) + throws ScribbleException { //System.out.println("mmm1: " + child.getClass() + " ,, " + child.del()); child.del().enterModuleContextBuilding(parent, child, this); } @Override - protected ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected ScribNode leave(ScribNode parent, ScribNode child, + ScribNode visited) throws ScribbleException { - return visited.del().leaveModuleContextBuilding(parent, child, this, visited); + return visited.del().leaveModuleContextBuilding(parent, child, this, + visited); } public void setModuleContext(ModuleContext mcontext) diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java index 1c8ba8d24..43bda183c 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java @@ -15,10 +15,10 @@ import org.scribble.ast.Module; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ModuleContext; import org.scribble.del.ModuleDel; import org.scribble.job.Job; import org.scribble.job.ScribbleException; +import org.scribble.lang.context.ModuleContext; import org.scribble.visit.AstVisitor; // A visitor that caches the ModuleContext from an entered Module, for later access diff --git a/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java b/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java index 346186caf..52404468f 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java @@ -15,14 +15,14 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ModuleContext; import org.scribble.ast.local.LChoice; import org.scribble.ast.local.LDo; import org.scribble.ast.local.LSessionNode; import org.scribble.ast.local.LProtocolBlock; import org.scribble.job.Job; import org.scribble.job.ScribbleException; -import org.scribble.type.SubprotoSig; +import org.scribble.lang.SubprotoSig; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; import org.scribble.visit.SubprotocolVisitor; diff --git a/scribble-core/src/main/java/org/scribble/visit/util/MessageIdCollector.java b/scribble-core/src/main/java/org/scribble/visit/util/MessageIdCollector.java index 1dad428c2..940b551d1 100644 --- a/scribble-core/src/main/java/org/scribble/visit/util/MessageIdCollector.java +++ b/scribble-core/src/main/java/org/scribble/visit/util/MessageIdCollector.java @@ -14,9 +14,9 @@ package org.scribble.visit.util; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ModuleContext; import org.scribble.job.Job; import org.scribble.job.ScribbleException; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.name.MessageId; public class MessageIdCollector extends NameCollector> diff --git a/scribble-core/src/main/java/org/scribble/visit/util/NameCollector.java b/scribble-core/src/main/java/org/scribble/visit/util/NameCollector.java index 43b5fe0bb..f3b1deeb3 100644 --- a/scribble-core/src/main/java/org/scribble/visit/util/NameCollector.java +++ b/scribble-core/src/main/java/org/scribble/visit/util/NameCollector.java @@ -16,8 +16,8 @@ import java.util.HashSet; import java.util.Set; -import org.scribble.ast.context.ModuleContext; import org.scribble.job.Job; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.name.Name; import org.scribble.visit.NoEnvOffsetSubprotocolVisitor; diff --git a/scribble-core/src/main/java/org/scribble/visit/util/RecVarCollector.java b/scribble-core/src/main/java/org/scribble/visit/util/RecVarCollector.java index f70a18281..4f58ca1b9 100644 --- a/scribble-core/src/main/java/org/scribble/visit/util/RecVarCollector.java +++ b/scribble-core/src/main/java/org/scribble/visit/util/RecVarCollector.java @@ -15,9 +15,9 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ModuleContext; import org.scribble.job.Job; import org.scribble.job.ScribbleException; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.name.RecVar; // Collects continues (not recs) diff --git a/scribble-core/src/main/java/org/scribble/visit/util/RoleCollector.java b/scribble-core/src/main/java/org/scribble/visit/util/RoleCollector.java index 483e0471f..eb83be6f1 100644 --- a/scribble-core/src/main/java/org/scribble/visit/util/RoleCollector.java +++ b/scribble-core/src/main/java/org/scribble/visit/util/RoleCollector.java @@ -15,9 +15,9 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ModuleContext; import org.scribble.job.Job; import org.scribble.job.ScribbleException; +import org.scribble.lang.context.ModuleContext; import org.scribble.type.name.Role; // Second pass for ProtocolDeclContext building diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java b/scribble-core/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java index db03fdc94..6e039f901 100644 --- a/scribble-core/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java +++ b/scribble-core/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java @@ -18,12 +18,12 @@ import java.util.List; import java.util.Set; -import org.scribble.type.Message; -import org.scribble.type.MessageSig; -import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.Op; import org.scribble.type.name.Role; +import org.scribble.type.session.Message; +import org.scribble.type.session.MessageSig; +import org.scribble.type.session.Payload; import org.scribble.util.ConnectedMap; import org.scribble.util.MessageIdMap; import org.scribble.visit.env.Env; diff --git a/scribble-main/src/main/java/org/scribble/main/MainContext.java b/scribble-main/src/main/java/org/scribble/main/MainContext.java index 65c288564..55b02c158 100644 --- a/scribble-main/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-main/src/main/java/org/scribble/main/MainContext.java @@ -27,10 +27,11 @@ import org.scribble.ast.ImportDecl; import org.scribble.ast.ImportModule; import org.scribble.ast.Module; -import org.scribble.ast.context.ModuleContext; import org.scribble.job.Job; import org.scribble.job.JobConfig; import org.scribble.job.ScribbleException; +import org.scribble.lang.context.ModuleContext; +import org.scribble.lang.context.ModuleContextMaker; import org.scribble.main.resource.DirectoryResourceLocator; import org.scribble.main.resource.InlineResource; import org.scribble.main.resource.Resource; @@ -166,10 +167,13 @@ private void init( Map parsed = getParsedModules(); Map map = new HashMap<>(); + ModuleContextMaker maker = new ModuleContextMaker(); for (ModuleName fullname : this.parsed.keySet()) { Pair e = this.parsed.get(fullname); - map.put(fullname, new ModuleContext(parsed, e.right)); + map.put(fullname, //new ModuleContext(parsed, e.right)); + maker.make(parsed, e.right)); + // CHECKME: how does this relate to the ModuleContextBuilder pass ? } this.mctxts = Collections.unmodifiableMap(map); } From 82204b7c2a14cef277b731a01020fcb070de7c6d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 4 Apr 2019 15:36:35 +0100 Subject: [PATCH 165/539] Continued: removed all ast imports from core Job2 and JobContext2. --- .../java/org/scribble/cli/CommandLine.java | 92 +-- .../org/scribble/codegen/java/ApiGen.java | 11 + .../callbackapi/CBEndpointApiGenerator.java | 101 ++- .../callbackapi/CBEndpointApiGenerator2.java | 701 ------------------ .../callbackapi/CBEndpointApiGenerator3.java | 52 +- .../StateChannelApiGenerator.java | 8 +- .../ioifaces/IOInterfacesGenerator.java | 13 +- .../scribble/del/global/GProtocolDeclDel.java | 244 +----- .../src/main/java/org/scribble/job/Job.java | 362 +-------- .../src/main/java/org/scribble/job/Job2.java | 385 ++++++++++ .../java/org/scribble/job/JobContext.java | 323 +------- .../java/org/scribble/job/JobContext2.java | 400 ++++++++++ .../java/org/scribble/lang/Projector.java | 6 +- .../main/java/org/scribble/lang/Protocol.java | 7 + .../java/org/scribble/lang/STypeInliner.java | 6 +- .../org/scribble/lang/global/GProtocol.java | 248 ++++++- .../org/scribble/lang/local/LProtocol.java | 4 +- .../scribble/model/endpoint/AutParser.java | 12 +- .../model/global/SGraphBuilderUtil.java | 4 +- .../org/scribble/model/global/SModel.java | 8 +- .../org/scribble/type/session/Choice.java | 8 + .../org/scribble/type/session/Continue.java | 7 + .../type/session/DirectedInteraction.java | 9 + .../type/session/DisconnectAction.java | 7 + .../java/org/scribble/type/session/Do.java | 16 + .../org/scribble/type/session/Recursion.java | 7 + .../java/org/scribble/type/session/SType.java | 4 +- .../java/org/scribble/type/session/Seq.java | 9 +- .../org/scribble/type/session/global/GDo.java | 17 +- .../scribble/type/session/global/GType.java | 4 +- .../scribble/type/session/local/LSkip.java | 8 + .../scribble/visit/context/EGraphBuilder.java | 9 +- .../visit/validation/GProtocolValidator.java | 10 + scribble-dist/src/main/resources/scribblec.sh | 6 +- .../bad/liveness/roleprog/unfair/Test06.scr | 2 + 35 files changed, 1393 insertions(+), 1717 deletions(-) delete mode 100644 scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java create mode 100644 scribble-core/src/main/java/org/scribble/job/Job2.java create mode 100644 scribble-core/src/main/java/org/scribble/job/JobContext2.java diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index e64339dcd..7002bffe4 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -30,9 +30,12 @@ import org.scribble.codegen.java.callbackapi.CBEndpointApiGenerator3; import org.scribble.job.AntlrSourceException; import org.scribble.job.Job; +import org.scribble.job.Job2; import org.scribble.job.JobContext; +import org.scribble.job.JobContext2; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; +import org.scribble.lang.local.LProtocol; import org.scribble.main.MainContext; import org.scribble.main.resource.DirectoryResourceLocator; import org.scribble.main.resource.ResourceLocator; @@ -195,7 +198,8 @@ protected void doValidationTasks(Job job) // Base Scribble else*/ { - job.checkWellFormedness(); + job.runContextBuildingPasses(); // TODO: refactor, w.r.t. below + job.getJob2().checkWellFormedness(); } } @@ -287,14 +291,15 @@ protected void doNonAttemptableOutputTasks(Job job) private void printProjections(Job job) throws CommandLineException, ScribbleException { - JobContext jcontext = job.getContext(); + JobContext jobc = job.getContext(); + Job2 job2 = job.getJob2(); String[] args = this.args.get(CLArgFlag.PROJECT); for (int i = 0; i < args.length; i += 2) { - GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); - Role role = checkRoleArg(jcontext, fullname, args[i+1]); - Map projections = job.getProjections(fullname, - role); + GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); + Role role = checkRoleArg(jobc, fullname, args[i+1]); + Map projections = job2.getProjections(fullname, + role); // FIXME: output Module System.out.println("\n" + projections.values().stream() .map(p -> p.toString()).collect(Collectors.joining("\n\n"))); } @@ -306,7 +311,7 @@ private void printProjections(Job job) private void printEGraph(Job job, boolean forUser, boolean fair) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); + JobContext jobc = job.getContext(); String[] args = forUser ? this.args.get(CLArgFlag.EFSM) : (fair @@ -314,8 +319,8 @@ private void printEGraph(Job job, boolean forUser, boolean fair) : this.args.get(CLArgFlag.UNFAIR_EFSM)); for (int i = 0; i < args.length; i += 2) { - GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); - Role role = checkRoleArg(jcontext, fullname, args[i+1]); + GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); + Role role = checkRoleArg(jobc, fullname, args[i+1]); EGraph fsm = getEGraph(job, fullname, role, forUser, fair); String out = this.args.containsKey(CLArgFlag.AUT) ? fsm.toAut() @@ -327,7 +332,7 @@ private void printEGraph(Job job, boolean forUser, boolean fair) private void drawEGraph(Job job, boolean forUser, boolean fair) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); + JobContext jobc = job.getContext(); String[] args = forUser ? this.args.get(CLArgFlag.EFSM_PNG) : (fair @@ -335,8 +340,8 @@ private void drawEGraph(Job job, boolean forUser, boolean fair) : this.args.get(CLArgFlag.UNFAIR_EFSM_PNG)); for (int i = 0; i < args.length; i += 3) { - GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); - Role role = checkRoleArg(jcontext, fullname, args[i+1]); + GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); + Role role = checkRoleArg(jobc, fullname, args[i+1]); String png = args[i+2]; EGraph fsm = getEGraph(job, fullname, role, forUser, fair); runDot(fsm.toDot(), png); @@ -348,8 +353,9 @@ private EGraph getEGraph(Job job, GProtocolName fullname, Role role, boolean forUser, boolean fair) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); - GProtocolDecl gpd = (GProtocolDecl) jcontext.getMainModule() + JobContext jobc = job.getContext(); + JobContext2 jobc2 = job.getJob2().getContext(); + GProtocolDecl gpd = (GProtocolDecl) jobc.getMainModule() .getProtocolDeclChild(fullname.getSimpleName()); if (gpd == null || !gpd.getHeaderChild().getRoleDeclListChild().getRoles() .contains(role)) @@ -361,15 +367,15 @@ private EGraph getEGraph(Job job, GProtocolName fullname, Role role, if (forUser) // The (possibly minimised) user-output EFSM for API gen { graph = this.args.containsKey(CLArgFlag.LTSCONVERT_MIN) - ? jcontext.getMinimisedEGraph(fullname, role) - : jcontext.getEGraph(fullname, role); + ? jobc2.getMinimisedEGraph(fullname, role) + : jobc2.getEGraph(fullname, role); } else // The (possibly unfair-transformed) internal EFSM for validation { graph = //(!this.args.containsKey(ArgFlag.FAIR) && !this.args.containsKey(ArgFlag.NO_LIVENESS)) // Cf. GlobalModelChecker.getEndpointFSMs !fair - ? jcontext.getUnfairEGraph(fullname, role) - : jcontext.getEGraph(fullname, role); + ? jobc2.getUnfairEGraph(fullname, role) + : jobc2.getEGraph(fullname, role); } if (graph == null) { @@ -382,13 +388,13 @@ private EGraph getEGraph(Job job, GProtocolName fullname, Role role, private void printSGraph(Job job, boolean fair) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); + JobContext jobc = job.getContext(); String[] args = fair ? this.args.get(CLArgFlag.SGRAPH) : this.args.get(CLArgFlag.UNFAIR_SGRAPH); for (int i = 0; i < args.length; i += 1) { - GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); + GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); SGraph model = getSGraph(job, fullname, fair); String out = this.args.containsKey(CLArgFlag.AUT) ? model.toAut() @@ -400,13 +406,13 @@ private void printSGraph(Job job, boolean fair) private void drawSGraph(Job job, boolean fair) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); + JobContext jobc = job.getContext(); String[] args = fair ? this.args.get(CLArgFlag.SGRAPH_PNG) : this.args.get(CLArgFlag.UNFAIR_SGRAPH_PNG); for (int i = 0; i < args.length; i += 2) { - GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); + GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); String png = args[i+1]; SGraph model = getSGraph(job, fullname, fair); runDot(model.toDot(), png); @@ -416,10 +422,10 @@ private void drawSGraph(Job job, boolean fair) private static SGraph getSGraph(Job job, GProtocolName fullname, boolean fair) throws ScribbleException { - JobContext jcontext = job.getContext(); + JobContext2 jobc2 = job.getJob2().getContext(); SGraph model = fair - ? jcontext.getSGraph(fullname) - : jcontext.getUnfairSGraph(fullname); + ? jobc2.getSGraph(fullname) + : jobc2.getUnfairSGraph(fullname); if (model == null) { throw new RuntimeScribbleException("Shouldn't see this: " + fullname); @@ -431,15 +437,15 @@ private static SGraph getSGraph(Job job, GProtocolName fullname, boolean fair) private void outputEndpointApi(Job job) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); + JobContext jobc = job.getContext(); String[] args = this.args.get(CLArgFlag.API_GEN); JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // FIXME: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) { - GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); + GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); Map sessClasses = jgen.generateSessionApi(fullname); outputClasses(sessClasses); - Role role = checkRoleArg(jcontext, fullname, args[i+1]); + Role role = checkRoleArg(jobc, fullname, args[i+1]); Map scClasses = jgen.generateStateChannelApi(fullname, role, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); outputClasses(scClasses); @@ -449,12 +455,12 @@ private void outputEndpointApi(Job job) private void outputSessionApi(Job job) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); + JobContext jobc = job.getContext(); String[] args = this.args.get(CLArgFlag.SESS_API_GEN); JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // TODO: refactor (generalise -- use new API) for (String fullname : args) { - GProtocolName gpn = checkGlobalProtocolArg(jcontext, fullname); + GProtocolName gpn = checkGlobalProtocolArg(jobc, fullname); Map classes = jgen.generateSessionApi(gpn); outputClasses(classes); } @@ -463,13 +469,13 @@ private void outputSessionApi(Job job) private void outputStateChannelApi(Job job) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); + JobContext jobc = job.getContext(); String[] args = this.args.get(CLArgFlag.SCHAN_API_GEN); JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // TODO: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) { - GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); - Role self = checkRoleArg(jcontext, fullname, args[i+1]); + GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); + Role self = checkRoleArg(jobc, fullname, args[i+1]); Map classes = jgen.generateStateChannelApi(fullname, self, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); outputClasses(classes); @@ -479,22 +485,22 @@ private void outputStateChannelApi(Job job) private void outputEventDrivenApi(Job job) throws ScribbleException, CommandLineException { - JobContext jcontext = job.getContext(); + JobContext jobc = job.getContext(); String[] args = this.args.get(CLArgFlag.ED_API_GEN); /*JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // FIXME: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) { - GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); + GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); Map sessClasses = jgen.generateSessionApi(fullname); outputClasses(sessClasses); - Role role = checkRoleArg(jcontext, fullname, args[i+1]); + Role role = checkRoleArg(jobc, fullname, args[i+1]); Map scClasses = jgen.generateStateChannelApi(fullname, role, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); outputClasses(scClasses); }*/ for (int i = 0; i < args.length; i += 2) { - GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); - Role self = checkRoleArg(jcontext, fullname, args[i+1]); + GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); + Role self = checkRoleArg(jobc, fullname, args[i+1]); CBEndpointApiGenerator3 edgen = new CBEndpointApiGenerator3(job, fullname, self, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); Map out = edgen.build(); @@ -559,11 +565,11 @@ protected static List parseImportPaths(String paths) .collect(Collectors.toList()); } - protected static GProtocolName checkGlobalProtocolArg(JobContext jcontext, + protected static GProtocolName checkGlobalProtocolArg(JobContext jobc, String simpname) throws CommandLineException { GProtocolName simpgpn = new GProtocolName(simpname); - Module main = jcontext.getMainModule(); + Module main = jobc.getMainModule(); if (!main.hasProtocolDecl(simpgpn)) { throw new CommandLineException("Global protocol not found: " + simpname); @@ -578,13 +584,13 @@ protected static GProtocolName checkGlobalProtocolArg(JobContext jcontext, throw new CommandLineException( "Invalid aux protocol specified as root: " + simpname); } - return new GProtocolName(jcontext.job.config.main, simpgpn); // TODO: take Job param instead of Jobcontext + return new GProtocolName(jobc.job.config.main, simpgpn); // TODO: take Job param instead of Jobcontext } - protected static Role checkRoleArg(JobContext jcontext, + protected static Role checkRoleArg(JobContext jobc, GProtocolName fullname, String rolename) throws CommandLineException { - ProtocolDecl pd = jcontext.getMainModule() + ProtocolDecl pd = jobc.getMainModule() .getProtocolDeclChild(fullname.getSimpleName()); Role role = new Role(rolename); if (!pd.getHeaderChild().getRoleDeclListChild().getRoles().contains(role)) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java index b0fb6550d..778bcc9e3 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java @@ -16,17 +16,28 @@ import java.util.Map; import org.scribble.job.Job; +import org.scribble.job.Job2; +import org.scribble.job.ScribbleException; import org.scribble.type.name.GProtocolName; // Basic pattern: use TypeGenerators to create all necessary TypeBuilders and cache them, and generateApi should call build on all as a final step public abstract class ApiGen { public final Job job; + public final Job2 job2; public final GProtocolName gpn; // full name public ApiGen(Job job, GProtocolName fullname) { this.job = job; + try + { + this.job2 = job.getJob2(); + } + catch (ScribbleException e) // TODO: refactor + { + throw new RuntimeException(e); + } this.gpn = fullname; } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index b29814bac..b9599fde3 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -24,9 +24,11 @@ import org.scribble.ast.DataTypeDecl; import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.Module; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.job.Job; -import org.scribble.job.JobContext; +import org.scribble.job.Job2; +import org.scribble.job.JobContext2; import org.scribble.job.ScribbleException; import org.scribble.model.MState; import org.scribble.model.endpoint.EState; @@ -39,9 +41,11 @@ // FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) // From ParamCoreEndpointApiGenerator +@Deprecated public class CBEndpointApiGenerator { public final Job job; + public final Job2 job2; public final GProtocolName proto; public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral @@ -50,6 +54,14 @@ public class CBEndpointApiGenerator public CBEndpointApiGenerator(Job job, GProtocolName fullname, Role self, boolean subtypes) { this.job = job; + try + { + this.job2 = job.getJob2(); + } + catch (ScribbleException e) // TODO: refactor + { + throw new RuntimeException(e); + } this.proto = fullname; this.self = self; @@ -79,10 +91,11 @@ public Map buildSessionApi() throws ScribbleException // FIXME: public Map buildEndpointClass() throws ScribbleException { - JobContext jc = this.job.getContext(); + Module main = this.job.getContext().getMainModule(); + JobContext2 jobc2 = this.job2.getContext(); EState init = (this.job.config.minEfsm - ? jc.getMinimisedEGraph(this.proto, this.self) - : jc.getEGraph(this.proto, this.self) + ? jobc2.getMinimisedEGraph(this.proto, this.self) + : jobc2.getEGraph(this.proto, this.self) ).init; // TODO: factor out with StateChannelApiGenerator constructor Set states = new HashSet<>(); @@ -236,13 +249,18 @@ public Map buildEndpointClass() throws ScribbleException messageInterface += "}\n"; res.put(mprefix + "interfaces/" + messageIfName + ".java", messageInterface);*/ - boolean isSig = jc.getMainModule().getNonProtoDeclChildren().stream() - .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); + boolean isSig = main.getNonProtoDeclChildren().stream() + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) + && ((MessageSigNameDecl) npd).getDeclName().toString() + .equals(a.mid.toString())); MessageSigNameDecl msnd = null; if (isSig) { - msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtoDeclChildren().stream() - .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); + msnd = (MessageSigNameDecl) main.getNonProtoDeclChildren().stream() + .filter(npd -> (npd instanceof MessageSigNameDecl) + && ((MessageSigNameDecl) npd).getDeclName().toString() + .equals(a.mid.toString())) + .iterator().next(); } String messageName; @@ -281,7 +299,7 @@ public Map buildEndpointClass() throws ScribbleException int i = 1; for (PayloadElemType pet : a.payload.elems) { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); + DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pet); messageClass += ", " + dtd.extName + " arg" + i++; } } @@ -301,12 +319,17 @@ public Map buildEndpointClass() throws ScribbleException messageClass += "\n"; messageClass += "@Override\n"; messageClass += "public org.scribble.type.name.Role getPeer() {\n"; - messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ";\n"; + messageClass += "return " + + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + + ".roles." + a.peer + "." + a.peer + ";\n"; messageClass += "}\n"; messageClass += "\n"; messageClass += "@Override\n"; messageClass += "public org.scribble.type.name.Op getOp() {\n"; - messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";\n"; + messageClass += "return " + + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + + SessionApiGenerator.getOpClassName(a.mid) + ";\n"; messageClass += "}\n"; messageClass += "\n"; messageClass += "@Override\n"; @@ -329,14 +352,23 @@ public Map buildEndpointClass() throws ScribbleException // branches if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) { - String bprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/" + this.self + "/"; + String bprefix = SessionApiGenerator + .getEndpointApiRootPackageName(this.proto).replace('.', '/') + + "/handlers/" + this.self + "/"; String branchName = name + "_" + s.id + "_Branch"; String branchAbstract = ""; branchAbstract += "package " + pack + ".handlers." + this.self + ";\n"; branchAbstract += ""; - branchAbstract += "public abstract class " + branchName + " implements org.scribble.runtime.handlers.ScribBranch"; - branchAbstract += s.getAllActions().stream().map(a -> - ", " + pack + ".handlers." + this.self + ".interfaces." + name + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()) + "").collect(Collectors.joining("")); + branchAbstract += "public abstract class " + branchName + + " implements org.scribble.runtime.handlers.ScribBranch"; + branchAbstract += s.getAllActions().stream() + .map(a -> ", " + pack + ".handlers." + this.self + ".interfaces." + + name + "__" + a.peer + "_" + + SessionApiGenerator.getOpClassName(a.mid) + + a.payload.elems.stream().map(e -> "_" + e) + .collect(Collectors.joining()) + + "") + .collect(Collectors.joining("")); branchAbstract += " {\n"; /*for (EAction a : s.getAllActions()) { @@ -374,33 +406,44 @@ public Map buildEndpointClass() throws ScribbleException branchAbstract += "switch (m.op.toString()) {\n"; for (EAction a : s.getAllActions()) { - String receiveIfName = name + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()); + String receiveIfName = name + "__" + a.peer + "_" + + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems + .stream().map(e -> "_" + e).collect(Collectors.joining()); String receiveInterface = ""; receiveInterface += "package " + pack + ".handlers." + this.self + ".interfaces;\n"; receiveInterface += "\n"; receiveInterface += "public interface " + receiveIfName + " {\n"; // FIXME: factor out - boolean isSig = jc.getMainModule().getNonProtoDeclChildren().stream() - .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); + boolean isSig = main.getNonProtoDeclChildren().stream() + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) + && ((MessageSigNameDecl) npd).getDeclName().toString() + .equals(a.mid.toString())); MessageSigNameDecl msnd = null; if (isSig) { - msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtoDeclChildren().stream() - .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); + msnd = (MessageSigNameDecl) main.getNonProtoDeclChildren().stream() + .filter(npd -> (npd instanceof MessageSigNameDecl) + && ((MessageSigNameDecl) npd).getDeclName().toString() + .equals(a.mid.toString())) + .iterator().next(); } - receiveInterface += "\npublic void receive(D data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer, "; + receiveInterface += "\npublic void receive(D data, " + + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + + ".roles." + a.peer + " peer, "; if (isSig) { receiveInterface += msnd.extName + " m"; } else { - receiveInterface += SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + " op"; + receiveInterface += SessionApiGenerator + .getEndpointApiRootPackageName(this.proto) + ".ops." + + SessionApiGenerator.getOpClassName(a.mid) + " op"; int i = 1; for (PayloadElemType pet : a.payload.elems) { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); + DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pet); receiveInterface += ", " + dtd.extName + " arg" + i++; } } @@ -418,19 +461,25 @@ public Map buildEndpointClass() throws ScribbleException .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); }*/ - branchAbstract += "case \"" + SessionApiGenerator.getOpClassName(a.mid) + "\": receive(data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ", "; + branchAbstract += "case \"" + + SessionApiGenerator.getOpClassName(a.mid) + "\": receive(data, " + + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + + ".roles." + a.peer + "." + a.peer + ", "; if (isSig) { branchAbstract += "(" + msnd.extName + ") m"; } else { - branchAbstract += "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + ") m.op"; + branchAbstract += "(" + + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + + ") m.op"; } int i = 0; for (PayloadElemType pet : a.payload.elems) { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); + DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pet); branchAbstract += ", (" + dtd.extName + ") m.payload[" + i++ + "]"; } branchAbstract += "); break;\n"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java deleted file mode 100644 index 1620f3fa1..000000000 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator2.java +++ /dev/null @@ -1,701 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.codegen.java.callbackapi; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -import org.scribble.ast.DataTypeDecl; -import org.scribble.ast.MessageSigNameDecl; -import org.scribble.ast.Module; -import org.scribble.codegen.java.sessionapi.SessionApiGenerator; -import org.scribble.codegen.java.util.ClassBuilder; -import org.scribble.codegen.java.util.ConstructorBuilder; -import org.scribble.codegen.java.util.FieldBuilder; -import org.scribble.codegen.java.util.InterfaceBuilder; -import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.job.Job; -import org.scribble.job.JobContext; -import org.scribble.job.ScribbleException; -import org.scribble.model.MState; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.EStateKind; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.DataType; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.PayloadElemType; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; - -// FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) -@Deprecated -public class CBEndpointApiGenerator2 -{ - public final Job job; - public final GProtocolName proto; - public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral - - //private final boolean subtypes; // Generate full hierarchy (states -> states, not just indivdual state -> cases) -- cf. ioifaces - - public CBEndpointApiGenerator2(Job job, GProtocolName fullname, Role self, boolean subtypes) - { - this.job = job; - this.proto = fullname; - this.self = self; - - //this.subtypes = subtypes; - if (subtypes) - { - throw new RuntimeException("TODO: -subtypes"); - } - } - - public Map build() throws ScribbleException - { - Map res = new HashMap<>(); // filepath -> source - res.putAll(buildSessionApi()); - return res; - } - - // FIXME: factor out -- integrate with JEndpointApiGenerator - public Map buildSessionApi() throws ScribbleException - { - this.job.debugPrintln("\n[param-core] Running " + CBEndpointApiGenerator2.class + " for " + this.proto + "@" + this.self); - - Map res = new HashMap<>(); - res.putAll(new SessionApiGenerator(this.job, this.proto).generateApi()); - res.putAll(buildEndpointClass()); - return res; - } - - String getHandlersPackage() - { - return SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers"; - } - - String getHandlersSelfPackage() - { - return getHandlersPackage() + "." + this.self; - } - - String getStatesSelfPackage() - { - return getHandlersPackage() + ".states." + this.self; - } - - public Map buildEndpointClass() throws ScribbleException - { - Map res = new HashMap<>(); - - JobContext jc = this.job.getContext(); - EState init = (this.job.config.minEfsm - ? jc.getMinimisedEGraph(this.proto, this.self) - : jc.getEGraph(this.proto, this.self) - ).init; - // TODO: factor out with StateChannelApiGenerator constructor - Set states = new HashSet<>(); - states.add(init); - states.addAll(MState.getReachableStates(init)); - - // frontend handler class - String rootPack = SessionApiGenerator.getEndpointApiRootPackageName(this.proto); - String endpointName = this.proto.getSimpleName() + "_" + this.self; - String initStateName = getStatesSelfPackage() + "." + endpointName + "_" + init.id; // FIXME: factor out - String sessClassName = rootPack + "." + this.proto.getSimpleName(); - String prefix = getHandlersSelfPackage().replace('.', '/') + "/"; // StateChannelApiGenerator#generateApi - - //String epClass = generateEndpointClass(rootPack, endpointName, sessClass, init, states); - ClassBuilder endpointClass = new ClassBuilder(endpointName); - endpointClass.setPackage(getHandlersSelfPackage()); - endpointClass.addModifiers("public"); - endpointClass.addParameters("D"); - endpointClass.setSuperClass("org.scribble.runtime.session.CBEndpoint<" + sessClassName + ", " + getRolesPackage() + "." + this.self + ", D>"); - ConstructorBuilder cb = endpointClass.newConstructor(sessClassName + " sess", getRolesPackage() + "." + this.self + " self", "org.scribble.runtime.message.ScribMessageFormatter smf", "D data"); - cb.addModifiers("public"); - cb.addExceptions("java.io.IOException", "org.scribble.main.ScribbleRuntimeException"); - cb.addBodyLine("super(sess, self, smf, " + initStateName + ".id, data);"); - for (EState s : states) - { - String tmp = (s.getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.id; - cb.addBodyLine("this.states.put(\"" + tmp + "\", " + getStatesSelfPackage() + "." + tmp + ".id);"); - } - MethodBuilder mb = endpointClass.newMethod("run"); - mb.addModifiers("public"); - mb.setReturn("java.util.concurrent.Future"); - mb.addExceptions("org.scribble.main.ScribbleRuntimeException"); - mb.addAnnotations("@Override"); - mb.addBodyLine("java.util.Set states = java.util.stream.Stream.of(" + initStateName + ".id).collect(java.util.stream.Collectors.toSet());"); - mb.addBodyLine("java.util.Set regd = new java.util.HashSet<>();"); - mb.addBodyLine("regd.addAll(this.inputs.keySet());"); - mb.addBodyLine("regd.addAll(this.outputs.keySet());"); - mb.addBodyLine("if (!states.equals(regd)) {"); - mb.addBodyLine("states.removeAll(regd);"); - mb.addBodyLine("throw new org.scribble.main.ScribbleRuntimeException(\"Missing state registrations: \" + states);"); - mb.addBodyLine("}"); - mb.addBodyLine("return super.run();"); - for (EState s : states) - { - switch (s.getStateKind()) - { - case OUTPUT: - { - MethodBuilder callback = endpointClass.newMethod("callback"); - callback.addModifiers("public"); - callback.setReturn(endpointName + ""); - callback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", // FIXME: factor out - "java.util.function.Function cb"); // FIXME: factor out - callback.addBodyLine("this.outputs.put(sid, cb);"); - callback.addBodyLine("return this;"); - break; - } - case UNARY_INPUT: - case POLY_INPUT: - { - MethodBuilder callback = endpointClass.newMethod("callback"); - callback.addModifiers("public"); - callback.setReturn(endpointName + ""); - callback.addParameters(getStatesSelfPackage() + "." + endpointName + "_" + s.id + " sid", getHandlersSelfPackage() + "." + endpointName + "_" + s.id + "_Branch b"); // FIXME: factor out - callback.addBodyLine("this.inputs.put(sid, b);"); - callback.addBodyLine("return this;");; - break; - } - case WRAP_SERVER: - case ACCEPT: - { - throw new RuntimeException("TODO: " + s.getStateKind()); - } - case TERMINAL: - { - break; - } - default: - { - throw new RuntimeException("Shouldn't get in here: " + s.getStateKind()); - } - } - } - res.put(prefix + endpointName + ".java", endpointClass.build()); - - // states - String sprefix = getStatesSelfPackage().replace('.', '/') + "/"; // StateChannelApiGenerator#generateApi - for (EState s : states) - { - EStateKind kind = s.getStateKind(); - String stateId = (kind == EStateKind.TERMINAL) ? "End" : endpointName + "_" + s.id; - String stateClass = generateStateClass(s, rootPack, kind, stateId); - res.put(sprefix + stateId + ".java", stateClass); - - // messages - if (s.getStateKind() == EStateKind.OUTPUT) - { - String mprefix = getMessagesPackage(rootPack).replace('.', '/') + "/"; - - /*String messageIfName = endpointName + - s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); - String messageInterface = generateMessageInterface(s, messageIfName, endpointName, rootPack, mprefix); - res.put(mprefix + "interfaces/" + messageIfName + ".java", messageInterface);*/ - - String messageAbstractName = getMessageAbstractName(endpointName, s); // FIXME: is interface - //String messageAbstract = generateMessageAbstract(messageIfName, messageAbstractName, endpointName, rootPack, mprefix); - InterfaceBuilder messageAbstract = new InterfaceBuilder(messageAbstractName); - messageAbstract.setPackage(getMessagesPackage(rootPack)); - messageAbstract.addModifiers("public"); - messageAbstract.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); - res.put(mprefix + messageAbstractName + ".java", messageAbstract.build()); - - Module main = this.job.getContext().getMainModule(); - Map messageClasses = new HashMap<>(); // A class per Payload for this state - for (EAction a : s.getAllActions()) - { - /*boolean isSig = jc.getMainModule().getNonProtocolDecls().stream() // FIXME - .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString()));*/ - - ClassBuilder messageClass; - if (!messageClasses.containsKey(a.payload)) - { - String name = //"Pay_" + - this.self + "_" + s.id + "_" // FIXME: factor out - + (a.payload.elems.isEmpty() - ? "Unit" - : a.payload.elems.stream().map(e -> - { - String extName = main.getDataTypeDeclChild((DataType) e).extName; - return (extName.indexOf(".") != -1) - ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) - : extName; - }).collect(Collectors.joining("_")) - ); // FIXME: extName sime // Not terminal - messageClass = new ClassBuilder(name); - messageClasses.put(a.payload, messageClass); - messageClass.setPackage(getMessagesPackage(rootPack)); - messageClass.addModifiers("public"); - messageClass.setSuperClass("org.scribble.runtime.message.ScribMessage"); - messageClass.addInterfaces(messageAbstractName); - MethodBuilder getPeer = messageClass.newMethod("getPeer"); - getPeer.addModifiers("public"); - getPeer.addAnnotations("@Override"); - getPeer.setReturn("org.scribble.type.name.Role"); - getPeer.addBodyLine("return " + getRolesPackage() + "." + a.peer + "." + a.peer + ";"); - MethodBuilder getOp = messageClass.newMethod("getOp"); - getOp.addModifiers("public"); - getOp.addAnnotations("@Override"); - getOp.setReturn("org.scribble.type.name.Op"); - getOp.addBodyLine("return " + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";"); - MethodBuilder getPayload = messageClass.newMethod("getPayload"); - getPayload.addModifiers("public"); - getPayload.addAnnotations("@Override"); - getPayload.setReturn("Object[]"); - getPayload.addBodyLine("return this.payload;"); - FieldBuilder fb = messageClass.newField("serialVersionUID"); - fb.addModifiers("private", "static", "final"); - fb.setType("long"); - fb.setExpression("1L"); - } - else - { - messageClass = messageClasses.get(a.payload); - } - - /*String messageName = isSig - ? endpointName + "_" + SessionApiGenerator.getOpClassName(a.mid) - : endpointName + "_" + s.id + "_" + SessionApiGenerator.getOpClassName(a.mid); - String messageClass = generateMessageClass(isSig, messageName, s, a, messageIfName, rootPack, messageAbstractName); - res.put(mprefix + messageName + ".java", messageClass);*/ - int[] i = { 2 }; - String[] args = new String[a.payload.elems.size() + 2]; - args[0] = getRolesPackage() + "." + a.peer + " peer"; - args[1] = getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + " op"; - a.payload.elems.forEach(e -> args[i[0]++] = main.getDataTypeDeclChild((DataType) e).extName + " arg" + (i[0]-3)); - ConstructorBuilder ob = messageClass.newConstructor(args); - ob.addModifiers("public"); - ob.addBodyLine("super(op" + IntStream.range(0, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining()) + ");"); - } - messageClasses.values().forEach(c -> res.put(mprefix + c.getName() + ".java", c.build())); - } - - // branches - if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) - { - String bprefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto).replace('.', '/') + "/handlers/" + this.self + "/"; - String branchName = endpointName + "_" + s.id + "_Branch"; - - for (EAction a : s.getAllActions()) - { - // FIXME: factor out - boolean isSig = jc.getMainModule().getNonProtoDeclChildren().stream() - .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); - MessageSigNameDecl msnd = null; - if (isSig) - { - msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtoDeclChildren().stream() - .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); - } - - String receiveIfName = endpointName + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()); - String receiveInterface = generateReceiveInterface(isSig, msnd, jc, a, rootPack, receiveIfName); - res.put(bprefix + "interfaces/" + receiveIfName + ".java", receiveInterface); - } - - String branchAbstract = generateBranch(bprefix, jc, s, endpointName, rootPack, branchName); - res.put(bprefix + branchName + ".java", branchAbstract); - } - } - - return res; - } - - String generateEndpointClass(String rootPack, String endpointName, String sess, EState init, Set states) - { - String role = SessionApiGenerator.getRolesPackageName(this.proto) + "." + this.self; - String epClass = ""; - - epClass += "package " + rootPack + ".handlers." + this.self + ";\n"; - epClass += "\n"; - epClass += "\n"; - epClass += "public class " + endpointName + " extends org.scribble.runtime.session.CBEndpoint<" + sess + ", " + role + ", D> {\n"; - - epClass += "public " + endpointName + "(" + sess + " sess, " + role - + " self, org.scribble.runtime.message.ScribMessageFormatter smf, D data) throws java.io.IOException, org.scribble.main.ScribbleRuntimeException {\n"; - epClass += "super(sess, self, smf, " + rootPack + ".handlers.states." + this.self + "." + endpointName + "_" + init.id + ".id" + ", data);\n"; // FIXME: factor out - for (EState s : states) - { - String tmp = (s.getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.id; - epClass += "this.states.put(\"" + tmp + "\", " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." + tmp + ".id);\n"; - } - epClass += "}\n"; - epClass += "\n"; - - - epClass += states.stream().map(s -> generateRegister(this.proto, this.self, s)).collect(Collectors.joining("\n")); - - epClass += "@Override\n"; - epClass += "public java.util.concurrent.Future run() throws org.scribble.main.ScribbleRuntimeException {\n"; - epClass += "java.util.Set states = java.util.stream.Stream.of(" + states.stream().filter(s -> s.getStateKind() != EStateKind.TERMINAL).map(s -> - SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." + this.proto.getSimpleName() + "_" + this.self + "_" + s.id + ".id").collect(Collectors.joining(", ")) + ").collect(java.util.stream.Collectors.toSet());\n"; - epClass += "java.util.Set regd = new java.util.HashSet<>();\n"; - epClass += "regd.addAll(this.inputs.keySet());\n"; - epClass += "regd.addAll(this.outputs.keySet());\n"; - epClass += "if (!states.equals(regd)) {\n"; - epClass += "states.removeAll(regd);\n"; - epClass += "throw new org.scribble.main.ScribbleRuntimeException(\"Missing state registrations: \" + states);\n"; - epClass += "}\n"; - epClass += "return super.run();\n"; - epClass += "}\n"; - - epClass += "}\n"; - - return epClass; - } - - String generateReceiveInterface(boolean isSig, MessageSigNameDecl msnd, JobContext jc, EAction a, String rootPack, String receiveIfName) - { - String receiveInterface = ""; - receiveInterface += "package " + rootPack + ".handlers." + this.self + ".interfaces;\n"; - receiveInterface += "\n"; - receiveInterface += "public interface " + receiveIfName + " {\n"; - - - receiveInterface += "\npublic void receive(D data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer, "; - if (isSig) - { - receiveInterface += msnd.extName + " m"; - } - else - { - receiveInterface += SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + " op"; - int i = 1; - for (PayloadElemType pet : a.payload.elems) - { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); - receiveInterface += ", " + dtd.extName + " arg" + i++; - } - } - receiveInterface += ");\n"; - receiveInterface += "}\n"; - - return receiveInterface; - } - - String generateBranch(String bprefix, JobContext jc, EState s, String endpointName, String rootPack, String branchName) - { - String branchAbstract = ""; - branchAbstract += "package " + rootPack + ".handlers." + this.self + ";\n"; - branchAbstract += ""; - branchAbstract += "public abstract class " + branchName + " implements org.scribble.runtime.handlers.ScribBranch"; - branchAbstract += s.getAllActions().stream().map(a -> - ", " + rootPack + ".handlers." + this.self + ".interfaces." + endpointName + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()) + "").collect(Collectors.joining("")); - branchAbstract += " {\n"; - - branchAbstract += "\n"; - branchAbstract += "@Override\n"; - branchAbstract += "public void dispatch(D data, org.scribble.runtime.message.ScribMessage m) {\n"; - branchAbstract += "switch (m.op.toString()) {\n"; - for (EAction a : s.getAllActions()) - { - // FIXME: factor out - boolean isSig = jc.getMainModule().getNonProtoDeclChildren().stream() - .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); - MessageSigNameDecl msnd = null; - if (isSig) - { - msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtoDeclChildren().stream() - .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); - } - - branchAbstract += "case \"" + SessionApiGenerator.getOpClassName(a.mid) + "\": receive(data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ", "; - if (isSig) - { - branchAbstract += "(" + msnd.extName + ") m"; - } - else - { - branchAbstract += "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + ") m.op"; - } - int i = 0; - for (PayloadElemType pet : a.payload.elems) - { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); - branchAbstract += ", (" + dtd.extName + ") m.payload[" + i++ + "]"; - } - branchAbstract += "); break;\n"; - } - branchAbstract += "default: throw new RuntimeException(\"Shouldn't get in here: \" + m);\n"; - branchAbstract += "}\n"; - branchAbstract += "}\n"; - branchAbstract += "}\n"; - - return branchAbstract; - } - - String generateMessageInterface(EState s, String messageIfName, String endpointName, String rootPack, String mprefix) - { - // FIXME: sort cases - // FIXME: generate lattice -- cf. original handler i/f's (with "subtyping") - String messageInterface = ""; - messageInterface += "package " + rootPack + ".handlers.states." + this.self + ".messages.interfaces;\n"; - messageInterface += "\n"; - messageInterface += "public interface " + messageIfName + " {\n"; - messageInterface += "}\n"; - return messageInterface; - } - - MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) - { - return (MessageSigNameDecl) - this.job.getContext().getMainModule().getNonProtoDeclChildren().stream() // FIXME: main module? - .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(mid.toString())) - .iterator().next(); - } - - String getMessagesPackage(String rootPack) - { - return rootPack + ".handlers.states." + this.self + ".messages"; - } - - String generateMessageClass(boolean isSig, String messageName, EState s, - EAction a, String endpointName, String rootPack, String messageAbstractName) - { - MessageSigNameDecl msnd = null; - if (isSig) - { - msnd = getMessageSigNameDecl((MessageSigName) a.mid); - } - - String messageClass = ""; - messageClass += "package " + getMessagesPackage(rootPack) + ";\n"; - messageClass += "\n"; - // extends ScribMessage just for convenience of storing payload (peer/op pre-known) -- instances of this class never "directly" sent, cf., CBEndpoint - messageClass += "public class " + messageName + " extends org.scribble.runtime.message.ScribMessage implements " + messageAbstractName; - if (isSig) - { - messageClass += ", org.scribble.runtime.handlers.ScribSigMessage"; - } - messageClass += " {\n"; - messageClass += "private static final long serialVersionUID = 1L;\n"; - if (isSig) - { - messageClass += "private final " + msnd.extName + " m;\n"; - } - messageClass += "\n"; - messageClass += "public " + messageName + "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer"; - if (isSig) - { - messageClass += ", " + msnd.extName + " m"; - } - else - { - int i = 1; - Module main = this.job.getContext().getMainModule(); - for (PayloadElemType pet : a.payload.elems) - { - DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pet); - messageClass += ", " + dtd.extName + " arg" + i++; - } - } - messageClass += ") {\n"; - messageClass += "super(" - + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) - + IntStream.rangeClosed(1, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining("")) + ");\n"; - if (isSig) - { - messageClass += "this.m = m;\n"; - } - messageClass += "}\n"; - messageClass += "\n"; - messageClass += "@Override\n"; - messageClass += "public org.scribble.type.name.Role getPeer() {\n"; - messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ";\n"; - messageClass += "}\n"; - messageClass += "\n"; - messageClass += "@Override\n"; - messageClass += "public org.scribble.type.name.Op getOp() {\n"; - messageClass += "return " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";\n"; - messageClass += "}\n"; - messageClass += "\n"; - messageClass += "@Override\n"; - messageClass += "public Object[] getPayload() {\n"; - messageClass += "return this.payload;\n"; - messageClass += "}\n"; - if (isSig) - { - messageClass += "\n"; - messageClass += "@Override\n"; - messageClass += "public org.scribble.runtime.message.ScribMessage getSig() {\n"; - messageClass += "return this.m;\n"; - messageClass += "}\n"; - } - messageClass += "}\n"; - - return messageClass; -} - -String generateMessageAbstract(String messageIfName, String messageAbstractName, String endpointName, String rootPack, String mprefix) - { - String messageAbstract = ""; - messageAbstract += "package " + rootPack + ".handlers.states." + this.self + ".messages;\n"; - messageAbstract += "\n"; - messageAbstract += "public interface " + messageAbstractName + " extends org.scribble.runtime.handlers.ScribOutputEvent, " + rootPack + ".handlers.states." + this.self + ".messages.interfaces." + messageIfName + " {\n"; - messageAbstract += "}\n"; - - return messageAbstract; - } - - String generateStateClass(EState s, String rootPack, EStateKind kind, String stateId) - { - String stateKind; - switch (kind) - { - case OUTPUT: stateKind = "org.scribble.runtime.handlers.states.ScribOutputState"; break; - case UNARY_INPUT: - case POLY_INPUT: stateKind = "org.scribble.runtime.handlers.states.ScribInputState"; break; - case TERMINAL: stateKind = "org.scribble.runtime.handlers.states.ScribEndState"; break; - case ACCEPT: - case WRAP_SERVER: - throw new RuntimeException("TODO"); - default: - throw new RuntimeException("TODO"); - } - String stateClass = ""; - stateClass += "package " + rootPack + ".handlers.states." + this.self + ";\n"; - stateClass += "\n"; - stateClass += "public final class " + stateId + " extends " + stateKind + " {\n"; - stateClass += "public static final " + stateId + " id = new " + stateId + "(" - + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + s.getActions().get(0).peer + "." + s.getActions().get(0).peer : "") - + ");\n"; - stateClass += "private " + stateId + "(" - + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? "org.scribble.type.name.Role peer" : "") - + ") {\n"; - stateClass += ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? "super(\"" + stateId + "\", peer);" : "super(\"" + stateId + "\");") + "\n"; - for (EAction a : s.getAllActions()) - { - stateClass += "this.succs.put(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) - + ", " - /*+ ((s.getSuccessor(a).id == s.id) - ? "this" - : ((s.getSuccessor(a).getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.getSuccessor(a).id) + ".id")*/ - + "\"" + ((s.getSuccessor(a).getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.getSuccessor(a).id) + "\"" - + ");\n"; - } - stateClass += "}\n"; - stateClass += "}\n"; - - return stateClass; - } - - private String generateRegister(GProtocolName gpn, Role self, EState s) - { - String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." ; - String res = ""; - String name = gpn.getSimpleName() + "_" + self; - switch (s.getStateKind()) - { - case OUTPUT: - { - // FIXME: "untyped" (ScribEvent) -- need state-specific "enums" - res += "public " + name + " callback(" + prefix + name + "_" + s.id - + " sid, java.util.function.Function h) {\n"; // FIXME: factor out - /*res += "this.outputs.put(sid, h);\n"; - res += "return this;\n";*/ - res += "return icallback(sid, h);\n"; - res += "}\n"; - res += "\n"; - String messageIfName = name + - s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); - res += "public\n" - + "\n" // FIXME: factor out - + name + " icallback(" + prefix + name + "_" + s.id - + " sid, java.util.function.Function h) {\n"; - res += "this.outputs.put(sid, h);\n"; - res += "return this;\n"; - res += "}\n"; - res += "\n"; - break; - } - case UNARY_INPUT: - case POLY_INPUT: - { - res += "public " + name + " callback(" + prefix + name + "_" + s.id + " sid"; - res += ", " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + "." + name + "_" + s.id + "_Branch b"; - res += ") {\n"; - res += "return icallback(sid, b);\n"; - res += "}\n"; - res += "\n"; - String T = s.getAllActions().stream().map(a -> SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + ".interfaces." + name + "__" + a.peer + "_" - + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining("")) + "").collect(Collectors.joining(" & ")) - + " & org.scribble.runtime.handlers.ScribBranch"; - res += "public " + "\n" - + name + " icallback(" + prefix + name + "_" + s.id - + " sid, T" - //+ SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + ".interfaces." + receiveIfName + " - + " b) {\n"; // FIXME: factor out - res += "this.inputs.put(sid, b);\n"; - res += "return this;\n"; - res += "}\n"; - res += "\n"; - break; - } - case TERMINAL: - { - break; - } - case ACCEPT: - case WRAP_SERVER: - { - throw new RuntimeException("[scrib] TODO: " + s); - } - default: - { - throw new RuntimeException("[scrib] Shouldn't get in here: " + s); - } - } - return res; - } - - String getMessageAbstractName(String endpointName, EState s) - { - //return endpointName + "_" + s.id + "_Message"; - return "Pay_" + this.self + "_" + s.id; - } - - String getRolesPackage() - { - return SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles"; - } - - String getOpsPackage() - { - return SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops"; - } - - public String generateScribbleRuntimeImports() - { - return getScribbleRuntimeImports().stream().map(x -> "import \"" + x + "\"\n").collect(Collectors.joining()); - } - - private List getScribbleRuntimeImports() // FIXME: factor up - { - return Stream.of( - //EDApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE - "" - ).collect(Collectors.toList()); - } -} diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index d7756f2e3..a44002b56 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -33,7 +33,9 @@ import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.job.Job; +import org.scribble.job.Job2; import org.scribble.job.JobContext; +import org.scribble.job.JobContext2; import org.scribble.job.ScribbleException; import org.scribble.model.MState; import org.scribble.model.endpoint.EState; @@ -52,6 +54,7 @@ public class CBEndpointApiGenerator3 { public final Job job; + public final Job2 job2; public final GProtocolName proto; public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral @@ -62,6 +65,14 @@ public class CBEndpointApiGenerator3 public CBEndpointApiGenerator3(Job job, GProtocolName fullname, Role self, boolean subtypes) { this.job = job; + try + { + this.job2 = job.getJob2(); + } + catch (ScribbleException e) // TODO: refactor + { + throw new RuntimeException(e); + } this.proto = fullname; this.self = self; @@ -93,12 +104,13 @@ public Map buildSessionApi() throws ScribbleException public Map buildEndpointClass() throws ScribbleException { + Module main = this.job.getContext().getMainModule(); Map res = new HashMap<>(); - JobContext jc = this.job.getContext(); + JobContext2 jobc2 = this.job2.getContext(); EState init = (this.job.config.minEfsm - ? jc.getMinimisedEGraph(this.proto, this.self) - : jc.getEGraph(this.proto, this.self) + ? jobc2.getMinimisedEGraph(this.proto, this.self) + : jobc2.getEGraph(this.proto, this.self) ).init; // TODO: factor out with StateChannelApiGenerator constructor Set states = new HashSet<>(); @@ -209,6 +221,7 @@ public Map buildEndpointClass() throws ScribbleException }*/ // branches + JobContext jobc = this.job.getContext(); for (EState s : states) { if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) @@ -219,13 +232,18 @@ public Map buildEndpointClass() throws ScribbleException for (EAction a : s.getAllActions()) { // FIXME: factor out - boolean isSig = jc.getMainModule().getNonProtoDeclChildren().stream() - .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); + boolean isSig = main.getNonProtoDeclChildren().stream() + .anyMatch(npd -> (npd instanceof MessageSigNameDecl) + && ((MessageSigNameDecl) npd).getDeclName().toString() + .equals(a.mid.toString())); MessageSigNameDecl msnd = null; if (isSig) { - msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtoDeclChildren().stream() - .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); + msnd = (MessageSigNameDecl) main.getNonProtoDeclChildren().stream() + .filter(npd -> (npd instanceof MessageSigNameDecl) + && ((MessageSigNameDecl) npd).getDeclName().toString() + .equals(a.mid.toString())) + .iterator().next(); } String receiveIfName = @@ -233,11 +251,13 @@ public Map buildEndpointClass() throws ScribbleException "ICallback__" // CHECKME: confusing against "icallback" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + getExtName(e)).collect(Collectors.joining()); // FIXME: factor out - String receiveInterface = generateReceiveInterface(isSig, msnd, jc, a, rootPack, receiveIfName); - res.put((getHandlersSelfPackage() + ".inputs.").replace('.', '/') + receiveIfName + ".java", receiveInterface); + String receiveInterface = generateReceiveInterface(isSig, msnd, jobc, a, rootPack, receiveIfName); + res.put((getHandlersSelfPackage() + ".inputs.").replace('.', '/') + + receiveIfName + ".java", receiveInterface); } - String branchAbstract = generateBranch(bprefix, jc, s, endpointName, rootPack, branchName); + String branchAbstract = generateBranch(bprefix, jobc, s, endpointName, + rootPack, branchName); res.put(bprefix + branchName + ".java", branchAbstract); } } @@ -709,7 +729,9 @@ protected String generateBranch(String bprefix, JobContext jc, EState s, String return branchAbstract; } - protected String generateReceiveInterface(boolean isSig, MessageSigNameDecl msnd, JobContext jc, EAction a, String rootPack, String receiveIfName) + protected String generateReceiveInterface(boolean isSig, + MessageSigNameDecl msnd, JobContext jc, EAction a, String rootPack, + String receiveIfName) { String receiveInterface = ""; receiveInterface += "package " + getHandlersSelfPackage() + ".inputs;\n"; @@ -717,14 +739,18 @@ protected String generateReceiveInterface(boolean isSig, MessageSigNameDecl msnd receiveInterface += "public interface " + receiveIfName + " {\n"; // Cf. original callback API, have extra parameter (o/w same) // Cf. output-callback i/f, only specifies peer and message (not self) - receiveInterface += "\nvoid receive(D data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer, "; + receiveInterface += "\nvoid receive(D data, " + + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + + ".roles." + a.peer + " peer, "; if (isSig) { receiveInterface += msnd.extName + " m"; } else { - receiveInterface += SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + " op"; + receiveInterface += SessionApiGenerator + .getEndpointApiRootPackageName(this.proto) + ".ops." + + SessionApiGenerator.getOpClassName(a.mid) + " op"; int i = 1; for (PayloadElemType pet : a.payload.elems) { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 11fceb52c..ba86cba0d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -23,7 +23,7 @@ import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.TypeBuilder; import org.scribble.job.Job; -import org.scribble.job.JobContext; +import org.scribble.job.JobContext2; import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -64,10 +64,10 @@ public StateChannelApiGenerator(Job job, GProtocolName fullname, Role self) this.self = self; this.lpn = Projector.projectFullProtocolName(fullname, self); //this.init = job.getContext().getEndpointGraph(fullname, self).init; - JobContext jc = job.getContext(); + JobContext2 jobc2 = this.job2.getContext(); this.init = job.config.minEfsm - ? jc.getMinimisedEGraph(fullname, self).init - : jc.getEGraph(fullname, self).init; + ? jobc2.getMinimisedEGraph(fullname, self).init + : jobc2.getEGraph(fullname, self).init; this.skipIOInterfacesGeneration = skipIOInterfacesGeneration(this.init); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index 9d29a01e5..49418b091 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -37,7 +37,7 @@ import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.codegen.java.util.TypeBuilder; -import org.scribble.job.JobContext; +import org.scribble.job.JobContext2; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EState; @@ -79,10 +79,10 @@ public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) GProtocolName fullname = apigen.getGProtocolName(); Role self = getSelf(); //EndpointState init = this.job.getContext().getEndpointGraph(fullname, self).init; - JobContext jc = this.job.getContext(); + JobContext2 jobc2 = this.job2.getContext(); EState init = this.job.config.minEfsm - ? jc.getMinimisedEGraph(fullname, self).init - : jc.getEGraph(fullname, self).init; + ? jobc2.getMinimisedEGraph(fullname, self).init + : jobc2.getEGraph(fullname, self).init; //if (IOInterfacesGenerator.skipIOInterfacesGeneration(init)) { @@ -90,7 +90,10 @@ public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) Set as = EState.getReachableActions(init); if (as.stream().anyMatch((a) -> !a.isSend() && !a.isReceive())) // HACK FIXME (connect/disconnect) { - throw new RuntimeScribbleException("[TODO] I/O Interface generation not supported for: " + as.stream().filter((a) -> !a.isSend() && !a.isReceive()).collect(Collectors.toList())); + throw new RuntimeScribbleException( + "[TODO] I/O Interface generation not supported for: " + + as.stream().filter(a -> !a.isSend() && !a.isReceive()) + .collect(Collectors.toList())); } } diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 00b093134..bfce40ba6 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -13,11 +13,6 @@ */ package org.scribble.del.global; -import java.io.File; -import java.io.IOException; -import java.util.Comparator; -import java.util.HashSet; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -38,29 +33,20 @@ import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.del.ModuleDel; import org.scribble.del.ProtocolDeclDel; -import org.scribble.job.Job; -import org.scribble.job.JobContext; import org.scribble.job.ScribbleException; import org.scribble.lang.ProtocolMod; import org.scribble.lang.global.GProtocol; import org.scribble.lang.global.GTypeTranslator; -import org.scribble.model.MState; -import org.scribble.model.endpoint.EGraph; -import org.scribble.model.endpoint.EState; -import org.scribble.model.global.SGraph; import org.scribble.type.kind.Global; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.MemberName; -import org.scribble.type.name.MessageId; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; import org.scribble.type.session.global.GSeq; -import org.scribble.util.ScribUtil; import org.scribble.visit.context.Projector; import org.scribble.visit.context.ProtocolDeclContextBuilder; import org.scribble.visit.context.env.ProjectionEnv; -import org.scribble.visit.util.MessageIdCollector; import org.scribble.visit.util.RoleCollector; import org.scribble.visit.validation.GProtocolValidator; @@ -81,11 +67,11 @@ public GProtocol translate(ScribNode n, GTypeTranslator t) .map(x -> ProtocolMod.fromAst(x)).collect(Collectors.toList()); GProtocolName fullname = new GProtocolName(m.getFullModuleName(), source.getHeaderChild().getDeclName()); - List roles = source.getRoles(); - List> params = source.getHeaderChild() + List rs = source.getRoles(); + List> ps = source.getHeaderChild() .getParamDeclListChild().getParameters(); // CHECKME: make more uniform with source::getRoles ? GSeq body = (GSeq) source.getDefChild().getBlockChild().visitWith(t); - return new GProtocol(source, mods, fullname, roles, params, body); + return new GProtocol(source, mods, fullname, rs, ps, body); } @Override @@ -190,239 +176,25 @@ public void enterValidation(ScribNode parent, ScribNode child, } GProtocolName fullname = gpd.getFullMemberName((Module) parent); - if (checker.job.config.spin) + if (checker.job2.config.spin) { - if (checker.job.config.fair) + if (checker.job2.config.fair) { throw new RuntimeException( "[TODO]: -spin currently does not support fair ouput choices."); } - validateBySpin(checker.job, fullname); + GProtocol.validateBySpin(checker.job2, fullname); } else { - validateByScribble(checker.job, fullname, true); + GProtocol.validateByScribble(checker.job2, fullname, true); if (!checker.job.config.fair) { checker.job.debugPrintln( "(" + fullname + ") Validating with \"unfair\" output choices.. "); - validateByScribble(checker.job, fullname, false); // TODO: only need to check progress, not full validation + GProtocol.validateByScribble(checker.job2, fullname, false); // TODO: only need to check progress, not full validation } } } - - public static void validateByScribble(Job job, GProtocolName fullname, - boolean fair) throws ScribbleException - { - JobContext jc = job.getContext(); - SGraph graph = (fair) - ? jc.getSGraph(fullname) - : jc.getUnfairSGraph(fullname); - //graph.toModel().validate(job); - job.config.sf.newSModel(graph).validate(job); - } - - public static void validateBySpin(Job job, GProtocolName fullname) - throws ScribbleException - { - JobContext jc = job.getContext(); - Module mod = jc.getModule(fullname.getPrefix()); - GProtocolDecl gpd = (GProtocolDecl) mod - .getProtocolDeclChild(fullname.getSimpleName()); - - List rs = gpd.getHeaderChild().getRoleDeclListChild().getRoles() - .stream().sorted(Comparator.comparing(Role::toString)) - .collect(Collectors.toList()); - - MessageIdCollector coll = new MessageIdCollector(job, - ((ModuleDel) mod.del()).getModuleContext()); - gpd.accept(coll); - Set> mids = coll.getNames(); - - String pml = ""; - pml += "mtype {" + mids.stream().map(mid -> mid.toString()) - .collect(Collectors.joining(", ")) + "};\n"; - - // FIXME: explicit - - pml += "\n"; - List pairs = new LinkedList<>(); - for (Role r1 : rs) - { - for (Role r2 : rs) - { - if (!r1.equals(r2)) - { - pairs.add(new Role[] {r1, r2}); - } - } - } - //for (Role[] p : (Iterable) () -> pairs.stream().sorted().iterator()) - for (Role[] p : pairs) - { - pml += "chan s_" + p[0] + "_" + p[1] + " = [1] of { mtype };\n" - + "chan r_" + p[0] + "_" + p[1] + " = [1] of { mtype };\n" - + "bool empty_" + p[0] + "_" + p[1] + " = true;\n" - + "active proctype chan_" + p[0] + "_" + p[1] + "() {\n" - + "mtype m;\n" - + "end_chan_" + p[0] + "_" + p[1] + ":\n" - + "do\n" - + "::\n" - + "atomic { s_" + p[0] + "_" + p[1] + "?m; empty_" + p[0] + "_" + p[1] - + " = false }\n" - + "atomic { r_" + p[0] + "_" + p[1] + "!m; empty_" + p[0] + "_" + p[1] - + " = true }\n" - + "od\n" - + "}\n"; - } - - for (Role r : rs) - { - pml += "\n\n" + jc.getEGraph(fullname, r).toPml(r); - } - if (job.config.debug) - { - System.out.println("[-spin]: Promela processes\n" + pml + "\n"); - } - - List clauses = new LinkedList<>(); - for (Role r : rs) - { - Set tmp = new HashSet<>(); - EGraph g = jc.getEGraph(fullname, r); - tmp.add(g.init); - tmp.addAll(MState.getReachableStates(g.init)); - if (g.term != null) - { - tmp.remove(g.term); - } - tmp.forEach( // Throws exception, cannot use flatMap - s -> clauses.add("!<>[]" + r + "@label" + r + s.id) // FIXME: factor out - ); - } - //*/ - /*String roleProgress = ""; // This way is not faster - for (Role r : rs) - { - Set tmp = new HashSet<>(); - EGraph g = jc.getEGraph(fullname, r); - tmp.add(g.init); - tmp.addAll(MState.getReachableStates(g.init)); - if (g.term != null) - { - tmp.remove(g.term); - } - roleProgress += (((roleProgress.isEmpty()) ? "" : " || ") - + tmp.stream().map(s -> r + "@label" + r + s.id).collect(Collectors.joining(" || "))); - } - roleProgress = "!<>[](" + roleProgress + ")"; - clauses.add(roleProgress);*/ - /*for (Role[] p : pairs) - { - clauses.add("[]<>(empty_" + p[0] + "_" + p[1] + ")"); - }*/ - String eventualStability = ""; - for (Role[] p : pairs) - { - //eventualStability += (((eventualStability.isEmpty()) ? "" : " && ") + "empty_" + p[0] + "_" + p[1]); - eventualStability += (((eventualStability.isEmpty()) ? "" : " && ") + "<>empty_" + p[0] + "_" + p[1]); - } - //eventualStability = "[]<>(" + eventualStability + ")"; - eventualStability = "[](" + eventualStability + ")"; // FIXME: current "eventual reception", not eventual stability - clauses.add(eventualStability); - - //int batchSize = 10; // FIXME: factor out - int batchSize = 6; // FIXME: factor out // FIXME: dynamic batch sizing based on previous batch duration? - for (int i = 0; i < clauses.size(); ) - { - int j = (i+batchSize < clauses.size()) ? i+batchSize : clauses.size(); - String batch = clauses.subList(i, j).stream().collect(Collectors.joining(" && ")); - String ltl = "ltl {\n" + batch + "\n" + "}"; - if (job.config.debug) - { - System.out.println("[-spin] Batched ltl:\n" + ltl + "\n"); - } - if (!runSpin(fullname.toString(), pml + "\n\n" + ltl)) - { - throw new ScribbleException("Protocol not valid:\n" + gpd); - } - i += batchSize; - } - } - - // FIXME: move - private static boolean runSpin(String prefix, String pml) //throws ScribbleException - { - File tmp; - try - { - tmp = File.createTempFile(prefix, ".pml.tmp"); - try - { - String tmpName = tmp.getAbsolutePath(); - ScribUtil.writeToFile(tmpName, pml); - String[] res = ScribUtil.runProcess("spin", "-a", tmpName); - res[0] = res[0].replaceAll("(?m)^ltl.*$", ""); - res[1] = res[1].replace( - "'gcc-4' is not recognized as an internal or external command,\noperable program or batch file.", - ""); - res[1] = res[1].replace( - "'gcc-3' is not recognized as an internal or external command,\noperable program or batch file.", - ""); - res[0] = res[0].trim(); - res[1] = res[1].trim(); - if (!res[0].trim().isEmpty() || !res[1].trim().isEmpty()) - { - //throw new RuntimeException("[scrib] : " + Arrays.toString(res[0].getBytes()) + "\n" + Arrays.toString(res[1].getBytes())); - throw new RuntimeException("[-spin] [spin]: " + res[0] + "\n" + res[1]); - } - int procs = 0; - for (int i = 0; i < pml.length(); procs++) - { - i = pml.indexOf("proctype", i); - if (i == -1) - { - break; - } - i++; - } - int dnfair = (procs <= 6) ? 2 : 3; // FIXME - res = ScribUtil.runProcess("gcc", "-o", "pan", "pan.c", "-DNFAIR=" + dnfair); - res[0] = res[0].trim(); - res[1] = res[1].trim(); - if (!res[0].isEmpty() || !res[1].isEmpty()) - { - throw new RuntimeException("[-spin] [gcc]: " + res[0] + "\n" + res[1]); - } - res = ScribUtil.runProcess("pan", "-a", "-f"); - res[1] = res[1].replace("warning: no accept labels are defined, so option -a has no effect (ignored)", ""); - res[0] = res[0].trim(); - res[1] = res[1].trim(); - if (res[0].contains("error,") || !res[1].isEmpty()) - { - throw new RuntimeException("[-spin] [pan]: " + res[0] + "\n" + res[1]); - } - int err = res[0].indexOf("errors: "); - boolean valid = (res[0].charAt(err + 8) == '0'); - if (!valid) - { - System.err.println("[-spin] [pan] " + res[0] + "\n" + res[1]); - } - return valid; - } - catch (ScribbleException e) - { - throw new RuntimeException(e); - } - finally - { - tmp.delete(); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } } diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-core/src/main/java/org/scribble/job/Job.java index 7f473228a..216b12d2b 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/job/Job.java @@ -16,51 +16,18 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Collections; -import java.util.LinkedList; -import java.util.List; +import java.util.HashSet; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; -import java.util.stream.Collectors; import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.del.global.GProtocolDeclDel; -import org.scribble.lang.Projector; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.SubprotoSig; import org.scribble.lang.context.ModuleContext; import org.scribble.lang.global.GProtocol; import org.scribble.lang.global.GTypeTranslator; -import org.scribble.lang.local.LProtocol; -import org.scribble.model.endpoint.EGraph; -import org.scribble.model.endpoint.EGraphBuilderUtil; -import org.scribble.model.global.SGraph; -import org.scribble.model.global.SGraphBuilderUtil; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.Local; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.name.DataType; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.MessageSigName; import org.scribble.type.name.ModuleName; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.Role; -import org.scribble.type.session.Arg; -import org.scribble.type.session.global.GType; import org.scribble.visit.AstVisitor; -import org.scribble.visit.InlinedProtocolUnfolder; -import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.ModuleContextBuilder; -import org.scribble.visit.context.ProjectedChoiceDoPruner; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -import org.scribble.visit.context.ProjectedRoleDeclFixer; -import org.scribble.visit.context.ProtocolDeclContextBuilder; -import org.scribble.visit.util.RoleCollector; -import org.scribble.visit.validation.GProtocolValidator; import org.scribble.visit.wf.NameDisambiguator; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models @@ -72,7 +39,9 @@ public class Job public final JobConfig config; // Immutable private final JobContext context; // Mutable (Visitor passes replace modules) - private final SGraphBuilderUtil sgbu; + //private final SGraphBuilderUtil sgbu; + + private Job2 job2; // Just take MainContext as arg? -- would need to fix Maven dependencies //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) @@ -81,11 +50,34 @@ public Job(Map parsed, { this.modcs = Collections.unmodifiableMap(modcs); this.config = config; - this.sgbu = config.sf.newSGraphBuilderUtil(); + //this.sgbu = config.sf.newSGraphBuilderUtil(); this.context = new JobContext(this, parsed); // Single instance per Job and should never be shared } - // Scribble extensions should override these "new" methods + public Job2 getJob2() throws ScribbleException + { + if (this.job2 == null) + { + Set fullmodnames = this.context.getFullModuleNames(); + Set imeds = new HashSet<>(); + for (ModuleName fullmodname : fullmodnames) + { + Module mod = this.context.getModule(fullmodname); + GTypeTranslator t = new GTypeTranslator(this, fullmodname); + for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) + { + GProtocol g = (GProtocol) gpd.visitWith(t); + //this.context.addIntermediate(g.fullname, g); + imeds.add(g); + debugPrintln("\nParsed:\n" + gpd + "\n\nScribble intermediate:\n" + g); + } + } + this.job2 = new Job2(imeds, this.modcs, this.config); + } + return this.job2; + } + + /*// Scribble extensions should override these "new" methods // CHECKME: move to MainContext::newJob? public EGraphBuilderUtil newEGraphBuilderUtil() { @@ -105,304 +97,21 @@ public SGraph buildSGraph(GProtocolName fullname, Map egraphs, } //return SGraph.buildSGraph(this, fullname, createInitialSConfig(this, egraphs, explicit)); return this.sgbu.buildSGraph(this, fullname, egraphs, explicit); // FIXME: factor out util - } + }*/ - public void checkWellFormedness() throws ScribbleException + /*public void checkWellFormedness() throws ScribbleException { runContextBuildingPasses(); //runUnfoldingPass(); runWellFormednessPasses(); - } + }*/ public void runContextBuildingPasses() throws ScribbleException { runVisitorPassOnAllModules(ModuleContextBuilder.class); // Always done first (even if other contexts are built later) so that following passes can use ModuleContextVisitor runVisitorPassOnAllModules(NameDisambiguator.class); // Includes validating names used in subprotocol calls.. - - /*runVisitorPassOnAllModules(ProtocolDeclContextBuilder.class); //..which this pass depends on. This pass basically builds protocol dependency info - runVisitorPassOnAllModules(DelegationProtocolRefChecker.class); // Must come after ProtocolDeclContextBuilder - runVisitorPassOnAllModules(RoleCollector.class); // Actually, this is the second part of protocoldecl context building*/ - //runVisitorPassOnAllModules(ProtocolDefInliner.class); - - // FIXME TODO: refactor into a runVisitorPassOnAllModules for SimpleVisitor (and add operation to ModuleDel) - Set fullmodnames = this.context.getFullModuleNames(); - for (ModuleName fullmodname : fullmodnames) - { - Module mod = this.context.getModule(fullmodname); - GTypeTranslator t = new GTypeTranslator(this, fullmodname); - for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) - { - GProtocol g = (GProtocol) gpd.visitWith(t); - this.context.addIntermediate(g.fullname, g); - debugPrintln("\nParsed:\n" + gpd + "\n\nScribble intermediate:\n" + g); - } - } - - for (GProtocol g : this.context.getIntermediates()) - { - List> params = new LinkedList<>(); - // Convert MemberName params to Args -- cf. NonRoleArgList::getParamKindArgs - for (MemberName n : g.params) - { - if (n instanceof DataType) - { - params.add((DataType) n); - } - else if (n instanceof MessageSigName) - { - params.add((MessageSigName) n); - } - else - { - throw new RuntimeException("TODO: " + n); - } - } - SubprotoSig sig = new SubprotoSig(g.fullname, g.roles, params); - //Deque stack = new LinkedList<>(); - STypeInliner i = new STypeInliner(this); - i.pushSig(sig); // TODO: factor into constructor - GProtocol inlined = g.getInlined(i); // Protocol.getInlined does pruneRecs - debugPrintln("\nSubprotocols inlined:\n" + inlined); - this.context.addInlined(g.fullname, inlined); - } - - //runUnfoldingPass(); - for (GProtocol inlined : this.context.getInlined()) - { - STypeUnfolder unf1 = new STypeUnfolder<>(); - //GTypeUnfolder unf2 = new GTypeUnfolder(); - GType unf = (GType) inlined.unfoldAllOnce(unf1);//.unfoldAllOnce(unf2); CHECKME: twice unfolding? instead of "unguarded"-unfolding? - debugPrintln("\nAll recursions unfolded once:\n" + unf); - } - - runProjectionPasses(); - - for (Entry e : - this.context.getInlinedProjections().entrySet()) - { - //LProtocolName lname = e.getKey(); - LProtocol proj = e.getValue(); - EGraph graph = proj.toEGraph(this); - this.context.addEGraph(proj.fullname, graph); - debugPrintln("\nEFSM for " + proj.fullname + ":\n" + graph.toDot()); - } - } - - // "Second part" of context building (separated for extensions to work on non-unfolded protos -- e.g., Assrt/F17CommandLine) - public void runUnfoldingPass() throws ScribbleException - { - runVisitorPassOnAllModules(InlinedProtocolUnfolder.class); } - public void runWellFormednessPasses() throws ScribbleException - { - /*if (!this.config.noValidation) - { - runVisitorPassOnAllModules(WFChoiceChecker.class); // For enabled roles and disjoint enabling messages -- includes connectedness checks - runProjectionPasses(); - runVisitorPassOnAllModules(ReachabilityChecker.class); // Moved before GlobalModelChecker.class, OK? - if (!this.config.useOldWf) - { - runVisitorPassOnAllModules(GProtocolValidator.class); - } - }*/ - - //HERE WF (unfolding? unguarded-unfolder -- and lazy-unfolder-with-choice-pruning, e.g., bad.wfchoice.enabling.threeparty.Test02), projection, validation - for (GProtocol inlined : this.context.getInlined()) - { - //TODO: relegate to "warning" - // Check unused roles - Set used = inlined.def.getRoles(); - Set unused = inlined.roles.stream() - .filter(x -> !used.contains(x)) - .collect(Collectors.toSet()); - if (!unused.isEmpty()) - { - throw new ScribbleException( - "Unused roles in " + inlined.fullname + ": " + unused); - } - - if (inlined.isAux()) - { - continue; - } - STypeUnfolder unf = new STypeUnfolder<>(); - //e.g., C->D captured under an A->B choice after unfolding, cf. bad.wfchoice.enabling.twoparty.Test01b; - inlined.unfoldAllOnce(unf).checkRoleEnabling(); - inlined.checkExtChoiceConsistency(); - } - - for (LProtocol proj : this.context.getInlinedProjections().values()) - { - if (proj.isAux()) // CHECKME? e.g., bad.reach.globals.gdo.Test01b - { - continue; - } - proj.checkReachability(); - } - - GProtocolValidator checker = new GProtocolValidator(this); - //runVisitorPassOnAllModules(GProtocolValidator.class); - for (Module mod : this.context.getParsed().values()) - { - // FIXME: refactor validation into lang.GProtocol - for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) - { - if (gpd.isAux()) - { - return; - } - - GProtocolName fullname = gpd.getFullMemberName(mod); - - debugPrintln("\nValidating " + fullname + ":"); - - if (checker.job.config.spin) - { - if (checker.job.config.fair) - { - throw new RuntimeException( - "[TODO]: -spin currently does not support fair ouput choices."); - } - GProtocolDeclDel.validateBySpin(checker.job, fullname); - } - else - { - GProtocolDeclDel.validateByScribble(checker.job, fullname, true); - if (!checker.job.config.fair) - { - debugPrintln( - "(" + fullname + ") Validating with \"unfair\" output choices.. "); - GProtocolDeclDel.validateByScribble(checker.job, fullname, false); // TODO: only need to check progress, not full validation - } - } - } - } - } - - // Due to Projector not being a subprotocol visitor, so "external" subprotocols may not be visible in ModuleContext building for the projections of the current root Module - // SubprotocolVisitor it doesn't visit the target Module/ProtocolDecls -- that's why the old Projector maintained its own dependencies and created the projection modules after leaving a Do separately from SubprotocolVisiting - // So Projection should not be an "inlining" SubprotocolVisitor, it would need to be more a "DependencyVisitor" - protected void runProjectionPasses() throws ScribbleException - { - /*runVisitorPassOnAllModules(Projector.class); - runProjectionContextBuildingPasses(); - runProjectionUnfoldingPass(); - if (!this.config.noAcceptCorrelationCheck) - { - runVisitorPassOnParsedModules(ExplicitCorrelationChecker.class); - }*/ - - for (GProtocol g : this.context.getIntermediates()) - { - for (Role self : g.roles) - { - GProtocol inlined = this.context.getInlined(g.fullname); // pruneRecs already done for pruneRecs (cf. runContextBuildingPasses) - LProtocol iproj = inlined.projectInlined(self); // CHECKME: projection and inling commutative? - this.context.addInlinedProjection(iproj.fullname, iproj); - debugPrintln("\nProjected inlined onto " + self + ":\n" + iproj); - } - } - - // Pre: inlined already projected -- used for Do projection - for (GProtocol g : this.context.getIntermediates()) - { - for (Role self : g.roles) - { - LProtocol proj = g.project(new Projector(this, self)); // Does pruneRecs - this.context.addProjection(proj); - debugPrintln("\nProjected onto " + self + ":\n" + proj); - } - } - } - - // To be done as a barrier pass after projection done on all Modules -- N.B. Module context building, no other validation (so "fixing" can be done in following passes) - // Also does projection "fixing" (choice subjects, subprotocol roledecls) - protected void runProjectionContextBuildingPasses() throws ScribbleException - { - runVisitorPassOnProjectedModules(ModuleContextBuilder.class); - runVisitorPassOnProjectedModules(ProtocolDeclContextBuilder.class); - runVisitorPassOnProjectedModules(RoleCollector.class); // NOTE: doesn't collect from choice subjects (may be invalid until projected choice subjs fixed) - runVisitorPassOnProjectedModules(ProjectedChoiceDoPruner.class); - if (!this.config.noLocalChoiceSubjectCheck) - { - // Disabling ProjectedChoiceSubjectFixer (local choice subject inference) goes towards a general global WF, but is currently unsound - runVisitorPassOnProjectedModules(ProjectedChoiceSubjectFixer.class); // Must come before other passes that need DUMMY role occurrences to be fixed - } - runVisitorPassOnProjectedModules(ProjectedRoleDeclFixer.class); // Possibly could do after inlining, and do role collection on the inlined version - runVisitorPassOnProjectedModules(ProtocolDefInliner.class); - } - - // Cf. runUnfoldingPass - protected void runProjectionUnfoldingPass() throws ScribbleException - { - runVisitorPassOnProjectedModules(InlinedProtocolUnfolder.class); - } - - // Pre: checkWellFormedness - // Returns: fullname -> Module - public Map getProjections(GProtocolName fullname, - Role role) throws ScribbleException - { - //Module root = - LProtocol proj = - this.context.getProjection(fullname, role); - - System.out.println(proj); - List> ps = proj.getProtoDependencies(); - for (ProtocolName p : ps) - { - System.out.println("\n" + this.context.getProjection((LProtocolName) p)); - } - - List> ns = proj.getNonProtoDependencies(); - - warningPrintln(""); - warningPrintln("[TODO] Full module projection and imports: " - + fullname + "@" + role); - - return Collections.emptyMap(); - //FIXME: build output Modules - //FIXME: (interleaved) ordering between proto and nonproto (Module) imports -- order by original Global import order? - } - - /*public Map generateSessionApi(GProtocolName fullname) throws ScribbleException - { - debugPrintPass("Running " + SessionApiGenerator.class + " for " + fullname); - SessionApiGenerator sg = new SessionApiGenerator(this, fullname); - Map map = sg.generateApi(); // filepath -> class source - return map; - } - - // FIXME: refactor an EndpointApiGenerator -- ? - public Map generateStateChannelApi(GProtocolName fullname, Role self, boolean subtypes) throws ScribbleException - { - /*if (this.jcontext.getEndpointGraph(fullname, self) == null) - { - buildGraph(fullname, self); - }* / - debugPrintPass("Running " + StateChannelApiGenerator.class + " for " + fullname + "@" + self); - StateChannelApiGenerator apigen = new StateChannelApiGenerator(this, fullname, self); - IOInterfacesGenerator iogen = null; - try - { - iogen = new IOInterfacesGenerator(apigen, subtypes); - } - catch (RuntimeScribbleException e) // FIXME: use IOInterfacesGenerator.skipIOInterfacesGeneration - { - //System.err.println("[Warning] Skipping I/O Interface generation for protocol featuring: " + fullname); - warningPrintln("Skipping I/O Interface generation for: " + fullname + "\n Cause: " + e.getMessage()); - } - // Construct the Generators first, to build all the types -- then call generate to "compile" all Builders to text (further building changes will not be output) - Map api = new HashMap<>(); // filepath -> class source // Store results? - api.putAll(apigen.generateApi()); - if (iogen != null) - { - api.putAll(iogen.generateApi()); - } - return api; - }*/ - public void runVisitorPassOnAllModules(Class c) throws ScribbleException { @@ -417,13 +126,6 @@ public void runVisitorPassOnParsedModules(Class c) runVisitorPass(this.context.getParsedFullModuleNames(), c); } - public void runVisitorPassOnProjectedModules(Class c) - throws ScribbleException - { - debugPrintPass("Running " + c + " on projected modules:"); - runVisitorPass(this.context.getProjectedFullModuleNames(), c); - } - private void runVisitorPass(Set modnames, Class c) throws ScribbleException { diff --git a/scribble-core/src/main/java/org/scribble/job/Job2.java b/scribble-core/src/main/java/org/scribble/job/Job2.java new file mode 100644 index 000000000..19d770f2a --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/job/Job2.java @@ -0,0 +1,385 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.job; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.stream.Collectors; + +import org.scribble.lang.Projector; +import org.scribble.lang.STypeInliner; +import org.scribble.lang.STypeUnfolder; +import org.scribble.lang.SubprotoSig; +import org.scribble.lang.context.ModuleContext; +import org.scribble.lang.global.GProtocol; +import org.scribble.lang.local.LProtocol; +import org.scribble.model.endpoint.EGraph; +import org.scribble.model.endpoint.EGraphBuilderUtil; +import org.scribble.model.global.SGraph; +import org.scribble.model.global.SGraphBuilderUtil; +import org.scribble.type.kind.Global; +import org.scribble.type.kind.Local; +import org.scribble.type.kind.NonRoleParamKind; +import org.scribble.type.name.DataType; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.LProtocolName; +import org.scribble.type.name.MemberName; +import org.scribble.type.name.MessageSigName; +import org.scribble.type.name.ModuleName; +import org.scribble.type.name.ProtocolName; +import org.scribble.type.name.Role; +import org.scribble.type.session.Arg; +import org.scribble.type.session.global.GType; +import org.scribble.visit.validation.GProtocolValidator; + +// A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models +public class Job2 +{ + // Keys are full names + private final Map modcs; // CHECKME: constant? move to JobConfig? + + public final JobConfig config; // Immutable + + private final JobContext2 context; // Mutable (Visitor passes replace modules) + private final SGraphBuilderUtil sgbu; + + // Just take MainContext as arg? -- would need to fix Maven dependencies + //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) + public Job2(Set parsed,//Map parsed, + Map modcs, JobConfig config) + { + this.modcs = Collections.unmodifiableMap(modcs); + this.config = config; + this.sgbu = config.sf.newSGraphBuilderUtil(); + this.context = new JobContext2(this, parsed); // Single instance per Job and should never be shared + } + + // Scribble extensions should override these "new" methods + // CHECKME: move to MainContext::newJob? + public EGraphBuilderUtil newEGraphBuilderUtil() + { + return new EGraphBuilderUtil(this.config.ef); + } + + //public SGraphBuilderUtil newSGraphBuilderUtil() // FIXME TODO global builder util + public SGraph buildSGraph(GProtocolName fullname, Map egraphs, + boolean explicit) throws ScribbleException + { + debugPrintln("(" + fullname + ") Building global model using:"); + for (Role r : egraphs.keySet()) + { + // FIXME: refactor + debugPrintln("-- EFSM for " + + r + ":\n" + egraphs.get(r).init.toDot()); + } + //return SGraph.buildSGraph(this, fullname, createInitialSConfig(this, egraphs, explicit)); + return this.sgbu.buildSGraph(this, fullname, egraphs, explicit); // FIXME: factor out util + } + + public void checkWellFormedness() throws ScribbleException + { + runContextBuildingPasses(); + //runUnfoldingPass(); + runWellFormednessPasses(); + } + + public void runContextBuildingPasses() throws ScribbleException + { + /*// FIXME TODO: refactor into a runVisitorPassOnAllModules for SimpleVisitor (and add operation to ModuleDel) + Set fullmodnames = this.context.getFullModuleNames(); + for (ModuleName fullmodname : fullmodnames) + { + Module mod = this.context.getModule(fullmodname); + GTypeTranslator t = new GTypeTranslator(this, fullmodname); + for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) + { + GProtocol g = (GProtocol) gpd.visitWith(t); + this.context.addIntermediate(g.fullname, g); + debugPrintln("\nParsed:\n" + gpd + "\n\nScribble intermediate:\n" + g); + } + }*/ + + for (GProtocol g : this.context.getIntermediates()) + { + List> params = new LinkedList<>(); + // Convert MemberName params to Args -- cf. NonRoleArgList::getParamKindArgs + for (MemberName n : g.params) + { + if (n instanceof DataType) + { + params.add((DataType) n); + } + else if (n instanceof MessageSigName) + { + params.add((MessageSigName) n); + } + else + { + throw new RuntimeException("TODO: " + n); + } + } + SubprotoSig sig = new SubprotoSig(g.fullname, g.roles, params); + //Deque stack = new LinkedList<>(); + STypeInliner i = new STypeInliner(this); + i.pushSig(sig); // TODO: factor into constructor + GProtocol inlined = g.getInlined(i); // Protocol.getInlined does pruneRecs + debugPrintln("\nSubprotocols inlined:\n" + inlined); + this.context.addInlined(g.fullname, inlined); + } + + //runUnfoldingPass(); + for (GProtocol inlined : this.context.getInlined()) + { + STypeUnfolder unf1 = new STypeUnfolder<>(); + //GTypeUnfolder unf2 = new GTypeUnfolder(); + GType unf = (GType) inlined.unfoldAllOnce(unf1);//.unfoldAllOnce(unf2); CHECKME: twice unfolding? instead of "unguarded"-unfolding? + debugPrintln("\nAll recursions unfolded once:\n" + unf); + } + + runProjectionPasses(); + + for (Entry e : + this.context.getInlinedProjections().entrySet()) + { + //LProtocolName lname = e.getKey(); + LProtocol proj = e.getValue(); + EGraph graph = proj.toEGraph(this); + this.context.addEGraph(proj.fullname, graph); + debugPrintln("\nEFSM for " + proj.fullname + ":\n" + graph.toDot()); + } + } + + public void runWellFormednessPasses() throws ScribbleException + { + /*if (!this.config.noValidation) + { + runVisitorPassOnAllModules(WFChoiceChecker.class); // For enabled roles and disjoint enabling messages -- includes connectedness checks + runProjectionPasses(); + runVisitorPassOnAllModules(ReachabilityChecker.class); // Moved before GlobalModelChecker.class, OK? + if (!this.config.useOldWf) + { + runVisitorPassOnAllModules(GProtocolValidator.class); + } + }*/ + + //HERE WF (unfolding? unguarded-unfolder -- and lazy-unfolder-with-choice-pruning, e.g., bad.wfchoice.enabling.threeparty.Test02), projection, validation + for (GProtocol inlined : this.context.getInlined()) + { + //TODO: relegate to "warning" + // Check unused roles + Set used = inlined.def.getRoles(); + Set unused = this.context.getIntermediate(inlined.fullname).roles // imeds have original role decls (inlined's are pruned) + .stream().filter(x -> !used.contains(x)).collect(Collectors.toSet()); + if (!unused.isEmpty()) + { + throw new ScribbleException( + "Unused roles in " + inlined.fullname + ": " + unused); + } + + if (inlined.isAux()) + { + continue; + } + STypeUnfolder unf = new STypeUnfolder<>(); + //e.g., C->D captured under an A->B choice after unfolding, cf. bad.wfchoice.enabling.twoparty.Test01b; + inlined.unfoldAllOnce(unf).checkRoleEnabling(); + inlined.checkExtChoiceConsistency(); + } + + for (LProtocol proj : this.context.getInlinedProjections().values()) + { + if (proj.isAux()) // CHECKME? e.g., bad.reach.globals.gdo.Test01b + { + continue; + } + proj.checkReachability(); + } + + GProtocolValidator checker = new GProtocolValidator(this); + //runVisitorPassOnAllModules(GProtocolValidator.class); + //for (Module mod : this.context.getParsed().values()) + { + // FIXME: refactor validation into lang.GProtocol + //for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) + for (GProtocol gpd : this.context.getInlined()) //mod.getGProtoDeclChildren()) + { + if (gpd.isAux()) + { + continue; + } + + GProtocolName fullname = gpd.fullname;//.getFullMemberName(mod); + + debugPrintln("\nValidating " + fullname + ":"); + + if (checker.job2.config.spin) + { + if (checker.job2.config.fair) + { + throw new RuntimeException( + "[TODO]: -spin currently does not support fair ouput choices."); + } + GProtocol.validateBySpin(checker.job2, fullname); + } + else + { + GProtocol.validateByScribble(checker.job2, fullname, true); + if (!checker.job2.config.fair) + { + debugPrintln( + "(" + fullname + ") Validating with \"unfair\" output choices.. "); + GProtocol.validateByScribble(checker.job2, fullname, false); // TODO: only need to check progress, not full validation + } + } + } + } + } + + // Due to Projector not being a subprotocol visitor, so "external" subprotocols may not be visible in ModuleContext building for the projections of the current root Module + // SubprotocolVisitor it doesn't visit the target Module/ProtocolDecls -- that's why the old Projector maintained its own dependencies and created the projection modules after leaving a Do separately from SubprotocolVisiting + // So Projection should not be an "inlining" SubprotocolVisitor, it would need to be more a "DependencyVisitor" + protected void runProjectionPasses() throws ScribbleException + { + /*runVisitorPassOnAllModules(Projector.class); + runProjectionContextBuildingPasses(); + runProjectionUnfoldingPass(); + if (!this.config.noAcceptCorrelationCheck) + { + runVisitorPassOnParsedModules(ExplicitCorrelationChecker.class); + }*/ + + for (GProtocol g : this.context.getInlined()) + { + for (Role self : g.roles) + { + GProtocol inlined = this.context.getInlined(g.fullname); // pruneRecs already done for pruneRecs (cf. runContextBuildingPasses) + LProtocol iproj = inlined.projectInlined(self); // CHECKME: projection and inling commutative? + this.context.addInlinedProjection(iproj.fullname, iproj); + debugPrintln("\nProjected inlined onto " + self + ":\n" + iproj); + } + } + + // Pre: inlined already projected -- used for Do projection + for (GProtocol g : this.context.getInlined()) + { + for (Role self : g.roles) + { + LProtocol proj = g.project(new Projector(this, self)); // Does pruneRecs + this.context.addProjection(proj); + debugPrintln("\nProjected onto " + self + ":\n" + proj); + } + } + } + + // Pre: checkWellFormedness + // Returns: fullname -> Module + public Map getProjections(GProtocolName fullname, + Role role) throws ScribbleException + { + //Module root = + LProtocol proj = + this.context.getProjection(fullname, role); + + System.out.println(proj); + List> ps = proj.getProtoDependencies(); + for (ProtocolName p : ps) + { + System.out.println("\n" + this.context.getProjection((LProtocolName) p)); + } + + List> ns = proj.getNonProtoDependencies(); + + warningPrintln(""); + warningPrintln("[TODO] Full module projection and imports: " + + fullname + "@" + role); + + return Collections.emptyMap(); + //FIXME: build output Modules + //FIXME: (interleaved) ordering between proto and nonproto (Module) imports -- order by original Global import order? + } + + /*public Map generateSessionApi(GProtocolName fullname) throws ScribbleException + { + debugPrintPass("Running " + SessionApiGenerator.class + " for " + fullname); + SessionApiGenerator sg = new SessionApiGenerator(this, fullname); + Map map = sg.generateApi(); // filepath -> class source + return map; + } + + // FIXME: refactor an EndpointApiGenerator -- ? + public Map generateStateChannelApi(GProtocolName fullname, Role self, boolean subtypes) throws ScribbleException + { + /*if (this.jcontext.getEndpointGraph(fullname, self) == null) + { + buildGraph(fullname, self); + }* / + debugPrintPass("Running " + StateChannelApiGenerator.class + " for " + fullname + "@" + self); + StateChannelApiGenerator apigen = new StateChannelApiGenerator(this, fullname, self); + IOInterfacesGenerator iogen = null; + try + { + iogen = new IOInterfacesGenerator(apigen, subtypes); + } + catch (RuntimeScribbleException e) // FIXME: use IOInterfacesGenerator.skipIOInterfacesGeneration + { + //System.err.println("[Warning] Skipping I/O Interface generation for protocol featuring: " + fullname); + warningPrintln("Skipping I/O Interface generation for: " + fullname + "\n Cause: " + e.getMessage()); + } + // Construct the Generators first, to build all the types -- then call generate to "compile" all Builders to text (further building changes will not be output) + Map api = new HashMap<>(); // filepath -> class source // Store results? + api.putAll(apigen.generateApi()); + if (iogen != null) + { + api.putAll(iogen.generateApi()); + } + return api; + }*/ + + public JobContext2 getContext() + { + return this.context; + } + + public ModuleContext getModuleContext(ModuleName fullname) + { + return this.modcs.get(fullname); + } + + public boolean isDebug() + { + return this.config.debug; + } + + public void warningPrintln(String s) + { + System.err.println("[Warning] " + s); + } + + public void debugPrintln(String s) + { + if (this.config.debug) + { + System.out.println(s); + } + } + + private void debugPrintPass(String s) + { + debugPrintln("\n[Job] " + s); + } +} diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext.java b/scribble-core/src/main/java/org/scribble/job/JobContext.java index 9ccccb65e..960a1170a 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/job/JobContext.java @@ -13,28 +13,16 @@ */ package org.scribble.job; -import java.io.File; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.lang.global.GProtocol; -import org.scribble.lang.local.LProtocol; -import org.scribble.model.endpoint.AutParser; -import org.scribble.model.endpoint.EGraph; -import org.scribble.model.global.SGraph; import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.LProtocolName; import org.scribble.type.name.ModuleName; -import org.scribble.type.name.Role; -import org.scribble.util.ScribUtil; -import org.scribble.visit.context.Projector; // Global "static" context information for a Job -- single instance per Job, should not be shared between Jobs // Mutable: projections, graphs, etc are added mutably later -- replaceModule also mutable setter -- "users" get this from the Job and expect to setter mutate "in place" @@ -49,35 +37,11 @@ public class JobContext // CHECKME: separate original parsed from "working set"? private final Map parsed;// = new HashMap<>(); - // Projected (i.e., created) modules -- no: LProtocol - // LProtocolName is the full local protocol name (module name is the prefix) - // LProtocolName key is LProtocol value fullname (i.e., redundant) - private final //Map - Map - projected = new HashMap<>(); - - // "Directly" translated global protos, i.e., separate proto decls without any inlining/unfolding/etc - private final Map intermed = new HashMap<>(); // Keys are full names (though GProtocol already includes full name) - private final Map iprojected = new HashMap<>(); // From intermediates; keys are full names - - // CHECKME: "global WF" only? - private final Map inlined = new HashMap<>(); // Keys are full names (though GProtocol already includes full name) - - private final Map fairEGraphs = new HashMap<>(); - private final Map fairSGraphs = new HashMap<>(); - - private final Map unfairEGraphs = new HashMap<>(); - private final Map unfairSGraphs = new HashMap<>(); - - private final Map minimisedEGraphs = new HashMap<>(); // Toolchain currently depends on single instance of each graph (state id equality), e.g. cannot re-build or re-minimise, would not be the same graph instance - // FIXME: currently only minimising "fair" graph, need to consider minimisation orthogonally to fairness -- NO: minimising (of fair) is for API gen only, unfair-transform does not use minimisation (regardless of user flag) for WF - protected JobContext(Job job, Map parsed)//, ModuleName main) { this.job = job; this.parsed = new HashMap(parsed); - //this.main = main; } public Module getMainModule() @@ -91,7 +55,7 @@ public Set getFullModuleNames() { Set modnames = new HashSet<>(); modnames.addAll(getParsedFullModuleNames()); - modnames.addAll(getProjectedFullModuleNames()); + //modnames.addAll(getProjectedFullModuleNames()); return modnames; } @@ -100,27 +64,10 @@ public Set getParsedFullModuleNames() return Collections.unmodifiableSet(this.parsed.keySet()); } - public Set getProjectedFullModuleNames() - { - return this.projected.keySet().stream().map(x -> x.getPrefix()) - .collect(Collectors.toSet()); - } - - /*public boolean hasModule(ModuleName fullname) - { - return isParsedModule(fullname) || isProjectedModule(fullname); - }*/ - private boolean isParsedModule(ModuleName fullname) { return this.parsed.containsKey(fullname); } - - private boolean isProjectedModule(ModuleName fullname) - { - //return this.projected.keySet().stream().filter((lpn) -> lpn.getPrefix().equals(fullname)).count() > 0; - return getProjectedFullModuleNames().contains(fullname); - } public Module getModule(ModuleName fullname) { @@ -157,274 +104,6 @@ protected void replaceModule(Module module) } } - // TODO rename better - public void addIntermediate(GProtocolName fullname, GProtocol g) - { - this.intermed.put(fullname, g); - } - - public GProtocol getIntermediate(GProtocolName fullname) - { - return this.intermed.get(fullname); - } - - //public Map getIntermediates() - public Collection getIntermediates() - { - //return Collections.unmodifiableMap(this.intermed); - return Collections.unmodifiableCollection(this.intermed.values()); - } - - public void addInlined(GProtocolName fullname, GProtocol g) - { - this.inlined.put(fullname, g); - } - - public GProtocol getInlined(GProtocolName fullname) - { - return this.inlined.get(fullname); - } - - public Collection getInlined() - { - return Collections.unmodifiableCollection(this.inlined.values()); - } - - public void addInlinedProjection(LProtocolName fullname, LProtocol l) - { - this.iprojected.put(fullname, l); - } - - // "Projected from inlined" - // FIXME TODO: refactor getProjected and getProjection properly - public LProtocol getInlinedProjection(GProtocolName fullname, Role self) - { - LProtocolName p = Projector.projectFullProtocolName(fullname, self); - - System.out.println("jjjj5: " + p + " ,, " + this.iprojected.keySet()); - - return getInlinedProjection(p); - } - - public LProtocol getInlinedProjection(LProtocolName fullname) - { - return this.iprojected.get(fullname); - } - - public Map getInlinedProjections() - { - return Collections.unmodifiableMap(this.iprojected); - } - - // Make context immutable? (will need to assign updated context back to Job) -- will also need to do for Module replacing - public void addProjections(Map> projections) - Map> projs) - { - for (GProtocolName g : projs.keySet()) - { - Map mods = projs.get(g); - for (Role role : mods.keySet()) - { - addProjection(mods.get(role)); - } - } - - /*// Doesn't work for external subprotocols now that Projector doesn't record Module-specific dependencies itself - try - { - ContextBuilder builder = new ContextBuilder(this.job); - for (ProtocolName lpn : this.projections.keySet()) - { - Module mod = this.projections.get(lpn); - mod = (Module) mod.accept(builder); - replaceModule(mod); - } - } - catch (ScribbleException e) - { - throw new RuntimeException("Shouldn't get in here: " + e); - }*/ - } - - //private void addProjection(Module mod) - public void addProjection(LProtocol p) - { - /*LProtocolName lpn = (LProtocolName) mod.getProtoDeclChildren().get(0) - .getFullMemberName(mod); - this.projected.put(lpn, mod);*/ - this.projected.put(p.fullname, p); - } - - public //Module - LProtocol getProjection(GProtocolName fullname, Role role) - throws ScribbleException - { - return getProjection(Projector.projectFullProtocolName(fullname, role)); - } - - public //Module - LProtocol getProjection(LProtocolName fullname) - //throws ScribbleException - { - /*Module proj = this.projected.get(fullname); - if (proj == null)*/ - /*if (!this.projected.containsKey(fullname)) - { - throw new ScribbleException( - "Projection not found: " + fullname); - // E.g. disamb/enabling error before projection passes (e.g. CommandLine -fsm arg) - //CHECKME: should not occur any more? - }*/ - return this.projected.get(fullname); - } - - protected void addEGraph(LProtocolName fullname, EGraph graph) - { - this.fairEGraphs.put(fullname, graph); - } - - // N.B. graphs built from inlined (not unfolded) - public EGraph getEGraph(GProtocolName fullname, Role role) - throws ScribbleException - { - LProtocolName fulllpn = Projector.projectFullProtocolName(fullname, role); - // Moved form LProtocolDecl - EGraph graph = this.fairEGraphs.get(fulllpn); - if (graph == null) - { - /*Module proj = getProjection(fullname, role); // Projected module contains a single protocol - EGraphBuilder builder = new EGraphBuilder(this.job); // Obtains an EGraphBuilderUtil from Job - proj.accept(builder); - graph = builder.util.finalise(); - addEGraph(fulllpn, graph);*/ - throw new RuntimeException("Shouldn't get in here: "); - } - return graph; - } - - protected void addUnfairEGraph(LProtocolName fullname, EGraph graph) - { - this.unfairEGraphs.put(fullname, graph); - } - - public EGraph getUnfairEGraph(GProtocolName fullname, Role role) throws ScribbleException - { - LProtocolName fulllpn = Projector.projectFullProtocolName(fullname, role); - - EGraph unfair = this.unfairEGraphs.get(fulllpn); - if (unfair == null) - { - unfair = getEGraph(fullname, role).init.unfairTransform(this.job.config.ef).toGraph(); - addUnfairEGraph(fulllpn, unfair); - } - return unfair; - } - - protected void addSGraph(GProtocolName fullname, SGraph graph) - { - this.fairSGraphs.put(fullname, graph); - } - - public SGraph getSGraph(GProtocolName fullname) throws ScribbleException - { - SGraph graph = this.fairSGraphs.get(fullname); - if (graph == null) - { - GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()) - .getProtocolDeclChild(fullname.getSimpleName()); - Map egraphs = - getEGraphsForSGraphBuilding(fullname, gpd, true); - boolean explicit = gpd.isExplicit(); - //graph = SGraph.buildSGraph(egraphs, explicit, this.job, fullname); - graph = this.job.buildSGraph(fullname, egraphs, explicit); - addSGraph(fullname, graph); - } - return graph; - } - - private Map getEGraphsForSGraphBuilding(GProtocolName fullname, - GProtocolDecl gpd, boolean fair) throws ScribbleException - { - Map egraphs = new HashMap<>(); - for (Role self : gpd.getHeaderChild().getRoleDeclListChild().getRoles()) - { - egraphs.put(self, fair - ? getEGraph(fullname, self) - : getUnfairEGraph(fullname, self)); - } - return egraphs; - } - - protected void addUnfairSGraph(GProtocolName fullname, SGraph graph) - { - this.unfairSGraphs.put(fullname, graph); - } - - public SGraph getUnfairSGraph(GProtocolName fullname) throws ScribbleException - { - SGraph graph = this.unfairSGraphs.get(fullname); - if (graph == null) - { - GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()) - .getProtocolDeclChild(fullname.getSimpleName()); - Map egraphs = getEGraphsForSGraphBuilding(fullname, gpd, false); - boolean explicit = gpd.isExplicit(); - //graph = SGraph.buildSGraph(this.job, fullname, this.job.createInitialSConfig(job, egraphs, explicit)); - graph = this.job.buildSGraph(fullname, egraphs, explicit); - addUnfairSGraph(fullname, graph); - } - return graph; - } - - protected void addMinimisedEGraph(LProtocolName fullname, EGraph graph) - { - this.minimisedEGraphs.put(fullname, graph); - } - - public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) - throws ScribbleException - { - LProtocolName fulllpn = Projector.projectFullProtocolName(fullname, role); - - EGraph minimised = this.minimisedEGraphs.get(fulllpn); - if (minimised == null) - { - String aut = runAut(getEGraph(fullname, role).init.toAut(), - fulllpn + ".aut"); - minimised = new AutParser(this.job).parse(aut); - addMinimisedEGraph(fulllpn, minimised); - } - return minimised; - } - - // Duplicated from CommandLine.runDot - // Minimises the FSM up to bisimulation - // N.B. ltsconvert will typically re-number the states - private static String runAut(String fsm, String aut) throws ScribbleException - { - String tmpName = aut + ".tmp"; - File tmp = new File(tmpName); - if (tmp.exists()) // Factor out with CommandLine.runDot (file exists check) - { - throw new RuntimeException("Cannot overwrite: " + tmpName); - } - try - { - ScribUtil.writeToFile(tmpName, fsm); - String[] res = ScribUtil.runProcess("ltsconvert", "-ebisim", "-iaut", - "-oaut", tmpName); - if (!res[1].isEmpty()) - { - throw new RuntimeException(res[1]); - } - return res[0]; - } - finally - { - tmp.delete(); - } - } - // HACK -- CHECKME: separate original parsed from "working set"? public Map getParsed() { diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext2.java b/scribble-core/src/main/java/org/scribble/job/JobContext2.java new file mode 100644 index 000000000..97784d550 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/job/JobContext2.java @@ -0,0 +1,400 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.job; + +import java.io.File; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.scribble.lang.global.GProtocol; +import org.scribble.lang.local.LProtocol; +import org.scribble.model.endpoint.AutParser; +import org.scribble.model.endpoint.EGraph; +import org.scribble.model.global.SGraph; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.LProtocolName; +import org.scribble.type.name.ModuleName; +import org.scribble.type.name.Role; +import org.scribble.util.ScribUtil; +import org.scribble.visit.context.Projector; + +// Global "static" context information for a Job -- single instance per Job, should not be shared between Jobs +// Mutable: projections, graphs, etc are added mutably later -- replaceModule also mutable setter -- "users" get this from the Job and expect to setter mutate "in place" +public class JobContext2 +{ + public final Job2 job; + + //public final ModuleName main; // The "main" root module from MainContext + + // Modules that were originally parsed (obtained from MainContext), but may be modified during the Job + // ModuleName keys are full module names -- currently the modules read from file, distinguished from the generated projection modules + // CHECKME: separate original parsed from "working set"? + //private final Map parsed;// = new HashMap<>(); + + //...HERE: delete parsed, take intermeds in constructor + + // Projected (i.e., created) modules -- no: LProtocol + // LProtocolName is the full local protocol name (module name is the prefix) + // LProtocolName key is LProtocol value fullname (i.e., redundant) + private final //Map + Map + projected = new HashMap<>(); + + // "Directly" translated global protos, i.e., separate proto decls without any inlining/unfolding/etc + // Has original decl role list (and args) + private final Map intermed;// = new HashMap<>(); // Keys are full names (though GProtocol already includes full name) + + private final Map iprojected = new HashMap<>(); // From intermediates; keys are full names + + // Has pruned role decls -- CHECKME: prune args? + // CHECKME: "global WF" only? + private final Map inlined = new HashMap<>(); // Keys are full names (though GProtocol already includes full name) + + private final Map fairEGraphs = new HashMap<>(); + private final Map fairSGraphs = new HashMap<>(); + + private final Map unfairEGraphs = new HashMap<>(); + private final Map unfairSGraphs = new HashMap<>(); + + private final Map minimisedEGraphs = new HashMap<>(); // Toolchain currently depends on single instance of each graph (state id equality), e.g. cannot re-build or re-minimise, would not be the same graph instance + // FIXME: currently only minimising "fair" graph, need to consider minimisation orthogonally to fairness -- NO: minimising (of fair) is for API gen only, unfair-transform does not use minimisation (regardless of user flag) for WF + + protected JobContext2(Job2 job, //Map parsed)//, ModuleName main) + Set intermed) + { + this.job = job; + + //this.parsed = new HashMap(parsed); + //this.main = main; + this.intermed = intermed.stream() + .collect(Collectors.toMap(x -> x.fullname, x -> x)); + } + + // Used by Job for pass running, includes projections (e.g. for reachability checking) + // Safer to get module names and require user to re-fetch the module by the getter each time (after replacing), to make sure the latest is used + public Set getFullModuleNames() + { + Set modnames = new HashSet<>(); + modnames.addAll(getParsedFullModuleNames()); + modnames.addAll(getProjectedFullModuleNames()); + return modnames; + } + + public Set getParsedFullModuleNames() + { + //return Collections.unmodifiableSet(this.parsed.keySet()); + return this.intermed.keySet().stream().map(x -> x.getPrefix()) + .collect(Collectors.toSet()); + } + + public Set getProjectedFullModuleNames() + { + return this.projected.keySet().stream().map(x -> x.getPrefix()) + .collect(Collectors.toSet()); + } + + /*public boolean hasModule(ModuleName fullname) + { + return isParsedModule(fullname) || isProjectedModule(fullname); + }*/ + + private boolean isParsedModule(ModuleName fullname) + { + //return this.parsed.containsKey(fullname); + return this.intermed.keySet().stream() + .anyMatch(x -> x.getPrefix().equals(fullname)); + } + + private boolean isProjectedModule(ModuleName fullname) + { + //return this.projected.keySet().stream().filter((lpn) -> lpn.getPrefix().equals(fullname)).count() > 0; + return getProjectedFullModuleNames().contains(fullname); + } + + // TODO rename better + /*public void addIntermediate(GProtocolName fullname, GProtocol g) + { + this.intermed.put(fullname, g); + }*/ + + public GProtocol getIntermediate(GProtocolName fullname) + { + return this.intermed.get(fullname); + } + + //public Map getIntermediates() + public Collection getIntermediates() + { + //return Collections.unmodifiableMap(this.intermed); + return this.intermed.values().stream().collect(Collectors.toSet()); + } + + public void addInlined(GProtocolName fullname, GProtocol g) + { + this.inlined.put(fullname, g); + } + + public GProtocol getInlined(GProtocolName fullname) + { + return this.inlined.get(fullname); + } + + public Set getInlined() + { + return this.inlined.values().stream().collect(Collectors.toSet()); + } + + public void addInlinedProjection(LProtocolName fullname, LProtocol l) + { + this.iprojected.put(fullname, l); + } + + // "Projected from inlined" + // FIXME TODO: refactor getProjected and getProjection properly + public LProtocol getInlinedProjection(GProtocolName fullname, Role self) + { + LProtocolName p = Projector.projectFullProtocolName(fullname, self); + return getInlinedProjection(p); + } + + public LProtocol getInlinedProjection(LProtocolName fullname) + { + return this.iprojected.get(fullname); + } + + public Map getInlinedProjections() + { + return Collections.unmodifiableMap(this.iprojected); + } + + // Make context immutable? (will need to assign updated context back to Job) -- will also need to do for Module replacing + public void addProjections(Map> projections) + Map> projs) + { + for (GProtocolName g : projs.keySet()) + { + Map mods = projs.get(g); + for (Role role : mods.keySet()) + { + addProjection(mods.get(role)); + } + } + + /*// Doesn't work for external subprotocols now that Projector doesn't record Module-specific dependencies itself + try + { + ContextBuilder builder = new ContextBuilder(this.job); + for (ProtocolName lpn : this.projections.keySet()) + { + Module mod = this.projections.get(lpn); + mod = (Module) mod.accept(builder); + replaceModule(mod); + } + } + catch (ScribbleException e) + { + throw new RuntimeException("Shouldn't get in here: " + e); + }*/ + } + + //private void addProjection(Module mod) + public void addProjection(LProtocol p) + { + /*LProtocolName lpn = (LProtocolName) mod.getProtoDeclChildren().get(0) + .getFullMemberName(mod); + this.projected.put(lpn, mod);*/ + this.projected.put(p.fullname, p); + } + + public //Module + LProtocol getProjection(GProtocolName fullname, Role role) + throws ScribbleException + { + return getProjection(Projector.projectFullProtocolName(fullname, role)); + } + + public //Module + LProtocol getProjection(LProtocolName fullname) + //throws ScribbleException + { + /*Module proj = this.projected.get(fullname); + if (proj == null)*/ + /*if (!this.projected.containsKey(fullname)) + { + throw new ScribbleException( + "Projection not found: " + fullname); + // E.g. disamb/enabling error before projection passes (e.g. CommandLine -fsm arg) + //CHECKME: should not occur any more? + }*/ + return this.projected.get(fullname); + } + + protected void addEGraph(LProtocolName fullname, EGraph graph) + { + this.fairEGraphs.put(fullname, graph); + } + + // N.B. graphs built from inlined (not unfolded) + public EGraph getEGraph(GProtocolName fullname, Role role) + throws ScribbleException + { + LProtocolName fulllpn = Projector.projectFullProtocolName(fullname, role); + // Moved form LProtocolDecl + EGraph graph = this.fairEGraphs.get(fulllpn); + if (graph == null) + { + /*Module proj = getProjection(fullname, role); // Projected module contains a single protocol + EGraphBuilder builder = new EGraphBuilder(this.job); // Obtains an EGraphBuilderUtil from Job + proj.accept(builder); + graph = builder.util.finalise(); + addEGraph(fulllpn, graph);*/ + throw new RuntimeException("Shouldn't get in here: "); + } + return graph; + } + + protected void addUnfairEGraph(LProtocolName fullname, EGraph graph) + { + this.unfairEGraphs.put(fullname, graph); + } + + public EGraph getUnfairEGraph(GProtocolName fullname, Role role) throws ScribbleException + { + LProtocolName fulllpn = Projector.projectFullProtocolName(fullname, role); + + EGraph unfair = this.unfairEGraphs.get(fulllpn); + if (unfair == null) + { + unfair = getEGraph(fullname, role).init.unfairTransform(this.job.config.ef).toGraph(); + addUnfairEGraph(fulllpn, unfair); + } + return unfair; + } + + protected void addSGraph(GProtocolName fullname, SGraph graph) + { + this.fairSGraphs.put(fullname, graph); + } + + public SGraph getSGraph(GProtocolName fullname) throws ScribbleException + { + SGraph graph = this.fairSGraphs.get(fullname); + if (graph == null) + { + /*GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()) + .getProtocolDeclChild(fullname.getSimpleName());*/ + Map egraphs = + getEGraphsForSGraphBuilding(fullname, //gpd, + true); + boolean explicit = //gpd.isExplicit(); + this.intermed.get(fullname).isExplicit(); + //graph = SGraph.buildSGraph(egraphs, explicit, this.job, fullname); + graph = this.job.buildSGraph(fullname, egraphs, explicit); + addSGraph(fullname, graph); + } + return graph; + } + + private Map getEGraphsForSGraphBuilding(GProtocolName fullname, + //GProtocolDecl gpd, + boolean fair) throws ScribbleException + { + Map egraphs = new HashMap<>(); + //for (Role self : gpd.getHeaderChild().getRoleDeclListChild().getRoles()) + for (Role self : this.intermed.get(fullname).roles) + { + egraphs.put(self, fair + ? getEGraph(fullname, self) + : getUnfairEGraph(fullname, self)); + } + return egraphs; + } + + protected void addUnfairSGraph(GProtocolName fullname, SGraph graph) + { + this.unfairSGraphs.put(fullname, graph); + } + + public SGraph getUnfairSGraph(GProtocolName fullname) throws ScribbleException + { + SGraph graph = this.unfairSGraphs.get(fullname); + if (graph == null) + { + /*GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()) + .getProtocolDeclChild(fullname.getSimpleName());*/ + Map egraphs = getEGraphsForSGraphBuilding(fullname, //gpd, + false); + boolean explicit = //gpd.isExplicit(); + this.intermed.get(fullname).isExplicit(); + //graph = SGraph.buildSGraph(this.job, fullname, this.job.createInitialSConfig(job, egraphs, explicit)); + graph = this.job.buildSGraph(fullname, egraphs, explicit); + addUnfairSGraph(fullname, graph); + } + return graph; + } + + protected void addMinimisedEGraph(LProtocolName fullname, EGraph graph) + { + this.minimisedEGraphs.put(fullname, graph); + } + + public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) + throws ScribbleException + { + LProtocolName fulllpn = Projector.projectFullProtocolName(fullname, role); + + EGraph minimised = this.minimisedEGraphs.get(fulllpn); + if (minimised == null) + { + String aut = runAut(getEGraph(fullname, role).init.toAut(), + fulllpn + ".aut"); + minimised = new AutParser(this.job).parse(aut); + addMinimisedEGraph(fulllpn, minimised); + } + return minimised; + } + + // Duplicated from CommandLine.runDot + // Minimises the FSM up to bisimulation + // N.B. ltsconvert will typically re-number the states + private static String runAut(String fsm, String aut) throws ScribbleException + { + String tmpName = aut + ".tmp"; + File tmp = new File(tmpName); + if (tmp.exists()) // Factor out with CommandLine.runDot (file exists check) + { + throw new RuntimeException("Cannot overwrite: " + tmpName); + } + try + { + ScribUtil.writeToFile(tmpName, fsm); + String[] res = ScribUtil.runProcess("ltsconvert", "-ebisim", "-iaut", + "-oaut", tmpName); + if (!res[1].isEmpty()) + { + throw new RuntimeException(res[1]); + } + return res[0]; + } + finally + { + tmp.delete(); + } + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/Projector.java b/scribble-core/src/main/java/org/scribble/lang/Projector.java index 8f14d58e1..aa471726c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Projector.java +++ b/scribble-core/src/main/java/org/scribble/lang/Projector.java @@ -13,15 +13,15 @@ */ package org.scribble.lang; -import org.scribble.job.Job; +import org.scribble.job.Job2; import org.scribble.type.name.Role; public class Projector { - public final Job job; + public final Job2 job; public final Role self; - public Projector(Job job, Role self) + public Projector(Job2 job, Role self) { this.job = job; this.self = self; diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index fbf6d7f35..f71037054 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -24,6 +24,7 @@ import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.DataType; import org.scribble.type.name.MemberName; +import org.scribble.type.name.MessageId; import org.scribble.type.name.MessageSigName; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; @@ -74,6 +75,12 @@ public Set getRoles() throw new RuntimeException("Unsupported for Protocol: " + this); } + @Override + public Set> getMessageIds() + { + throw new RuntimeException("Unsupported for Protocol: " + this); + } + @Override public Set getRecVars() { diff --git a/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java b/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java index 71ea707a0..ff6f30059 100644 --- a/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java @@ -19,12 +19,12 @@ import java.util.Map; import java.util.stream.Collectors; -import org.scribble.job.Job; +import org.scribble.job.Job2; import org.scribble.type.name.RecVar; public class STypeInliner { - public final Job job; + public final Job2 job; // Basically, "SubprotocolVisitor" -- factor out? private final Deque stack = new LinkedList<>(); @@ -33,7 +33,7 @@ public class STypeInliner private Map> recvars = new HashMap<>(); private Map counter = new HashMap<>(); - public STypeInliner(Job job) + public STypeInliner(Job2 job) { this.job = job; } diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index d6f54d7b6..855b5d759 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -13,6 +13,9 @@ */ package org.scribble.lang.global; +import java.io.File; +import java.io.IOException; +import java.util.Comparator; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -21,8 +24,12 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.global.GProtocolDecl; +import org.scribble.del.ModuleDel; +import org.scribble.job.Job2; +import org.scribble.job.JobContext2; import org.scribble.job.ScribbleException; import org.scribble.lang.Projector; import org.scribble.lang.Protocol; @@ -32,17 +39,24 @@ import org.scribble.lang.SubprotoSig; import org.scribble.lang.Substitutions; import org.scribble.lang.local.LProjection; +import org.scribble.model.MState; +import org.scribble.model.endpoint.EGraph; +import org.scribble.model.endpoint.EState; +import org.scribble.model.global.SGraph; import org.scribble.type.kind.Global; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.MemberName; +import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; import org.scribble.type.session.global.GRecursion; import org.scribble.type.session.global.GSeq; import org.scribble.type.session.global.GType; import org.scribble.type.session.local.LSeq; +import org.scribble.util.ScribUtil; +import org.scribble.visit.util.MessageIdCollector; public class GProtocol extends Protocol implements GType @@ -75,7 +89,10 @@ public GProtocol getInlined(STypeInliner i)//, Deque stack) GRecursion rec = new GRecursion(null, rv, body); // CHECKME: or protodecl source? GProtocolDecl source = getSource(); GSeq def = new GSeq(null, Stream.of(rec).collect(Collectors.toList())); - return new GProtocol(source, this.mods, this.fullname, this.roles, + Set used = def.getRoles(); + List rs = this.roles.stream().filter(x -> used.contains(x)) // Prune role decls + .collect(Collectors.toList()); + return new GProtocol(source, this.mods, this.fullname, rs, this.params, def); } @@ -92,15 +109,15 @@ public GProtocol unfoldAllOnce(STypeUnfolder u) public LProjection projectInlined(Role self) { LSeq body = (LSeq) this.def.projectInlined(self); - return projectAux(self, body); + return projectAux(self, this.roles, body); } - private LProjection projectAux(Role self, LSeq body) + private LProjection projectAux(Role self, List decls, LSeq body) { LProtocolName fullname = org.scribble.visit.context.Projector .projectFullProtocolName(this.fullname, self); Set tmp = body.getRoles(); - List roles = this.roles.stream() + List roles = decls.stream() .filter(x -> x.equals(self) || tmp.contains(x)) // Implicitly filters Role.SELF .collect(Collectors.toList()); List> params = @@ -113,7 +130,9 @@ private LProjection projectAux(Role self, LSeq body) public LProjection project(Projector v) { LSeq body = (LSeq) this.def.project(v).pruneRecs(); - return projectAux(v.self, body); + return projectAux(v.self, + v.job.getContext().getInlined(this.fullname).roles, // Used inlined decls, already pruned + body); } @Override @@ -185,4 +204,223 @@ public boolean canEquals(Object o) { return o instanceof GProtocol; } + + public static void validateByScribble(Job2 job2, GProtocolName fullname, + boolean fair) throws ScribbleException + { + JobContext2 jc = job2.getContext(); + SGraph graph = (fair) + ? jc.getSGraph(fullname) + : jc.getUnfairSGraph(fullname); + //graph.toModel().validate(job); + job2.config.sf.newSModel(graph).validate(job2); + } + + public static void validateBySpin(Job2 job2, GProtocolName fullname) + throws ScribbleException + { + JobContext2 jobc2 = job2.getContext(); + /*Module mod = jc.getModule(fullname.getPrefix()); + GProtocolDecl gpd = (GProtocolDecl) mod + .getProtocolDeclChild(fullname.getSimpleName());*/ + GProtocol gpd = jobc2.getInlined(fullname); + + List rs = //gpd.getHeaderChild().getRoleDeclListChild().getRoles() + gpd.roles + .stream().sorted(Comparator.comparing(Role::toString)) + .collect(Collectors.toList()); + + /*MessageIdCollector coll = new MessageIdCollector(job, + ((ModuleDel) mod.del()).getModuleContext()); // TODO: get ModuleContext from Job(Context) + gpd.accept(coll); + Set> mids = coll.getNames();*/ + Set> mids = gpd.def.getMessageIds(); + + //..........FIXME: get mids from SType, instead of old AST Collector + + String pml = ""; + pml += "mtype {" + mids.stream().map(mid -> mid.toString()) + .collect(Collectors.joining(", ")) + "};\n"; + + // FIXME: explicit + + pml += "\n"; + List pairs = new LinkedList<>(); + for (Role r1 : rs) + { + for (Role r2 : rs) + { + if (!r1.equals(r2)) + { + pairs.add(new Role[] {r1, r2}); + } + } + } + //for (Role[] p : (Iterable) () -> pairs.stream().sorted().iterator()) + for (Role[] p : pairs) + { + pml += "chan s_" + p[0] + "_" + p[1] + " = [1] of { mtype };\n" + + "chan r_" + p[0] + "_" + p[1] + " = [1] of { mtype };\n" + + "bool empty_" + p[0] + "_" + p[1] + " = true;\n" + + "active proctype chan_" + p[0] + "_" + p[1] + "() {\n" + + "mtype m;\n" + + "end_chan_" + p[0] + "_" + p[1] + ":\n" + + "do\n" + + "::\n" + + "atomic { s_" + p[0] + "_" + p[1] + "?m; empty_" + p[0] + "_" + p[1] + + " = false }\n" + + "atomic { r_" + p[0] + "_" + p[1] + "!m; empty_" + p[0] + "_" + p[1] + + " = true }\n" + + "od\n" + + "}\n"; + } + + for (Role r : rs) + { + pml += "\n\n" + jobc2.getEGraph(fullname, r).toPml(r); + } + if (job2.config.debug) + { + System.out.println("[-spin]: Promela processes\n" + pml + "\n"); + } + + List clauses = new LinkedList<>(); + for (Role r : rs) + { + Set tmp = new HashSet<>(); + EGraph g = jobc2.getEGraph(fullname, r); + tmp.add(g.init); + tmp.addAll(MState.getReachableStates(g.init)); + if (g.term != null) + { + tmp.remove(g.term); + } + tmp.forEach( // Throws exception, cannot use flatMap + s -> clauses.add("!<>[]" + r + "@label" + r + s.id) // FIXME: factor out + ); + } + //*/ + /*String roleProgress = ""; // This way is not faster + for (Role r : rs) + { + Set tmp = new HashSet<>(); + EGraph g = jc.getEGraph(fullname, r); + tmp.add(g.init); + tmp.addAll(MState.getReachableStates(g.init)); + if (g.term != null) + { + tmp.remove(g.term); + } + roleProgress += (((roleProgress.isEmpty()) ? "" : " || ") + + tmp.stream().map(s -> r + "@label" + r + s.id).collect(Collectors.joining(" || "))); + } + roleProgress = "!<>[](" + roleProgress + ")"; + clauses.add(roleProgress);*/ + /*for (Role[] p : pairs) + { + clauses.add("[]<>(empty_" + p[0] + "_" + p[1] + ")"); + }*/ + String eventualStability = ""; + for (Role[] p : pairs) + { + //eventualStability += (((eventualStability.isEmpty()) ? "" : " && ") + "empty_" + p[0] + "_" + p[1]); + eventualStability += (((eventualStability.isEmpty()) ? "" : " && ") + "<>empty_" + p[0] + "_" + p[1]); + } + //eventualStability = "[]<>(" + eventualStability + ")"; + eventualStability = "[](" + eventualStability + ")"; // FIXME: current "eventual reception", not eventual stability + clauses.add(eventualStability); + + //int batchSize = 10; // FIXME: factor out + int batchSize = 6; // FIXME: factor out // FIXME: dynamic batch sizing based on previous batch duration? + for (int i = 0; i < clauses.size(); ) + { + int j = (i+batchSize < clauses.size()) ? i+batchSize : clauses.size(); + String batch = clauses.subList(i, j).stream().collect(Collectors.joining(" && ")); + String ltl = "ltl {\n" + batch + "\n" + "}"; + if (job2.config.debug) + { + System.out.println("[-spin] Batched ltl:\n" + ltl + "\n"); + } + if (!GProtocol.runSpin(fullname.toString(), pml + "\n\n" + ltl)) + { + throw new ScribbleException("Protocol not valid:\n" + gpd); + } + i += batchSize; + } + } + + // FIXME: relocate + public static boolean runSpin(String prefix, String pml) //throws ScribbleException + { + File tmp; + try + { + tmp = File.createTempFile(prefix, ".pml.tmp"); + try + { + String tmpName = tmp.getAbsolutePath(); + ScribUtil.writeToFile(tmpName, pml); + String[] res = ScribUtil.runProcess("spin", "-a", tmpName); + res[0] = res[0].replaceAll("(?m)^ltl.*$", ""); + res[1] = res[1].replace( + "'gcc-4' is not recognized as an internal or external command,\noperable program or batch file.", + ""); + res[1] = res[1].replace( + "'gcc-3' is not recognized as an internal or external command,\noperable program or batch file.", + ""); + res[0] = res[0].trim(); + res[1] = res[1].trim(); + if (!res[0].trim().isEmpty() || !res[1].trim().isEmpty()) + { + //throw new RuntimeException("[scrib] : " + Arrays.toString(res[0].getBytes()) + "\n" + Arrays.toString(res[1].getBytes())); + throw new RuntimeException("[-spin] [spin]: " + res[0] + "\n" + res[1]); + } + int procs = 0; + for (int i = 0; i < pml.length(); procs++) + { + i = pml.indexOf("proctype", i); + if (i == -1) + { + break; + } + i++; + } + int dnfair = (procs <= 6) ? 2 : 3; // FIXME + res = ScribUtil.runProcess("gcc", "-o", "pan", "pan.c", "-DNFAIR=" + dnfair); + res[0] = res[0].trim(); + res[1] = res[1].trim(); + if (!res[0].isEmpty() || !res[1].isEmpty()) + { + throw new RuntimeException("[-spin] [gcc]: " + res[0] + "\n" + res[1]); + } + res = ScribUtil.runProcess("pan", "-a", "-f"); + res[1] = res[1].replace("warning: no accept labels are defined, so option -a has no effect (ignored)", ""); + res[0] = res[0].trim(); + res[1] = res[1].trim(); + if (res[0].contains("error,") || !res[1].isEmpty()) + { + throw new RuntimeException("[-spin] [pan]: " + res[0] + "\n" + res[1]); + } + int err = res[0].indexOf("errors: "); + boolean valid = (res[0].charAt(err + 8) == '0'); + if (!valid) + { + System.err.println("[-spin] [pan] " + res[0] + "\n" + res[1]); + } + return valid; + } + catch (ScribbleException e) + { + throw new RuntimeException(e); + } + finally + { + tmp.delete(); + } + } + catch (IOException e) + { + throw new RuntimeException(e); + } + } } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index 49763b1a7..56518c414 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -22,7 +22,7 @@ import org.scribble.ast.Constants; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.local.LProtocolDecl; -import org.scribble.job.Job; +import org.scribble.job.Job2; import org.scribble.job.ScribbleException; import org.scribble.lang.Protocol; import org.scribble.lang.ProtocolMod; @@ -101,7 +101,7 @@ public LProtocol unfoldAllOnce(STypeUnfolder u) this.self, this.params, unf); } - public EGraph toEGraph(Job job) + public EGraph toEGraph(Job2 job) { EGraphBuilderUtil2 b = new EGraphBuilderUtil2(job.config.ef); b.init(null); // FIXME: init param not used diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java b/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java index cf9c13e5e..d34c57784 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java @@ -26,7 +26,7 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.job.Job; +import org.scribble.job.Job2; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; import org.scribble.type.name.MessageId; @@ -37,16 +37,16 @@ public class AutParser { - private final Job job; + private final Job2 job2; - public AutParser(Job job) + public AutParser(Job2 job2) { - this.job = job; + this.job2 = job2; } public EGraph parse(String aut) { - EModelFactory ef = job.config.ef; + EModelFactory ef = this.job2.config.ef; //Map> edges = new HashMap<>(); Map> as = new HashMap<>(); @@ -114,7 +114,7 @@ public EGraph parse(String aut) term = terms.iterator().next(); } //EGraphBuilderUtil util = new EGraphBuilderUtil(ef); - EGraphBuilderUtil util = job.newEGraphBuilderUtil(); + EGraphBuilderUtil util = this.job2.newEGraphBuilderUtil(); Map map = new HashMap<>(); map.put(init, util.getEntry()); if (term != -1) diff --git a/scribble-core/src/main/java/org/scribble/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/model/global/SGraphBuilderUtil.java index 7b96b33e2..287166984 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/model/global/SGraphBuilderUtil.java @@ -21,7 +21,7 @@ import java.util.Map.Entry; import java.util.stream.Collectors; -import org.scribble.job.Job; +import org.scribble.job.Job2; import org.scribble.job.ScribbleException; import org.scribble.model.GraphBuilderUtil; import org.scribble.model.endpoint.EFSM; @@ -66,7 +66,7 @@ protected SConfig createInitialSConfig(EModelFactory ef, Map egrap // Also checks for non-deterministic payloads // Maybe refactor into an SGraph builder util; cf., EGraphBuilderUtil -- but not Visitor-based building (cf. EndpointGraphBuilder), this isn't an AST algorithm //public SGraph buildSGraph(Job job, GProtocolName fullname, SConfig c0) throws ScribbleException - public SGraph buildSGraph(Job job, GProtocolName fullname, Map egraphs, boolean explicit) throws ScribbleException + public SGraph buildSGraph(Job2 job, GProtocolName fullname, Map egraphs, boolean explicit) throws ScribbleException { /*Map efsms = egraphs.entrySet().stream().collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().toFsm())); diff --git a/scribble-core/src/main/java/org/scribble/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/model/global/SModel.java index 124bd7e30..0279f7cd3 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/model/global/SModel.java @@ -21,7 +21,7 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.job.Job; +import org.scribble.job.Job2; import org.scribble.job.ScribbleException; import org.scribble.model.endpoint.EFSM; import org.scribble.model.endpoint.actions.ESend; @@ -37,7 +37,7 @@ protected SModel(SGraph graph) this.graph = graph; } - public void validate(Job job) throws ScribbleException + public void validate(Job2 job) throws ScribbleException { SState init = this.graph.init; Map states = this.graph.states; @@ -120,7 +120,7 @@ protected String appendSafetyErrorMessages(String errorMsg, } protected String appendProgressErrorMessages(String errorMsg, - Set starved, Map> ignored, Job job, + Set starved, Map> ignored, Job2 job, Map states, Set termset) { if (!starved.isEmpty()) @@ -138,7 +138,7 @@ protected String appendProgressErrorMessages(String errorMsg, return errorMsg; } - protected String termSetToString(Job job, Set termset, + protected String termSetToString(Job2 job, Set termset, Map all) { return job.config.debug diff --git a/scribble-core/src/main/java/org/scribble/type/session/Choice.java b/scribble-core/src/main/java/org/scribble/type/session/Choice.java index 1b3e14bce..c9eef4304 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Choice.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Choice.java @@ -21,6 +21,7 @@ import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; +import org.scribble.type.name.MessageId; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -50,6 +51,13 @@ public Set getRoles() this.blocks.forEach(x -> res.addAll(x.getRoles())); return res; } + + @Override + public Set> getMessageIds() + { + return this.blocks.stream().flatMap(x -> x.getMessageIds().stream()) + .collect(Collectors.toSet()); + } @Override public Set getRecVars() diff --git a/scribble-core/src/main/java/org/scribble/type/session/Continue.java b/scribble-core/src/main/java/org/scribble/type/session/Continue.java index 028b75676..cd2025e1c 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Continue.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Continue.java @@ -24,6 +24,7 @@ import org.scribble.lang.Substitutions; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; +import org.scribble.type.name.MessageId; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -49,6 +50,12 @@ public Set getRoles() { return Collections.emptySet(); } + + @Override + public Set> getMessageIds() + { + return Collections.emptySet(); + } @Override public Set getRecVars() diff --git a/scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java index a1a122012..c04bcaa5b 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java @@ -13,13 +13,16 @@ */ package org.scribble.type.session; +import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import org.scribble.lang.Substitutions; +import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; +import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; // Besides directed-ness, also features a Message @@ -49,6 +52,12 @@ public Set getRoles() // Includes self return Stream.of(this.src, this.dst).collect(Collectors.toSet()); } + + @Override + public Set> getMessageIds() + { + return Stream.of(this.msg.getId()).collect(Collectors.toSet()); + } @Override public DirectedInteraction substitute(Substitutions subs) diff --git a/scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java index e6277d078..782eed16d 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java @@ -22,6 +22,7 @@ import org.scribble.lang.Substitutions; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; +import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; // Base class would be "SymmetricInteraction" (cf., DirectedInteraction) @@ -48,6 +49,12 @@ public Set getRoles() // Includes self return Stream.of(this.left, this.right).collect(Collectors.toSet()); } + + @Override + public Set> getMessageIds() + { + return Collections.emptySet(); + } @Override public DisconnectAction substitute(Substitutions subs) diff --git a/scribble-core/src/main/java/org/scribble/type/session/Do.java b/scribble-core/src/main/java/org/scribble/type/session/Do.java index ff35ab140..751bdae26 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Do.java @@ -14,6 +14,7 @@ package org.scribble.type.session; import java.util.Collections; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; @@ -26,6 +27,7 @@ import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.DataType; import org.scribble.type.name.MemberName; +import org.scribble.type.name.MessageId; import org.scribble.type.name.MessageSigName; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; @@ -57,6 +59,20 @@ public Set getRoles() return this.roles.stream().collect(Collectors.toSet()); } + @Override + public Set> getMessageIds() + { + Set> mids = new HashSet<>(); + for (Arg a : this.args) + { + if (a instanceof Message) + { + mids.add(((Message) a).getId()); + } + } + return mids; + } + @Override public Set getRecVars() { diff --git a/scribble-core/src/main/java/org/scribble/type/session/Recursion.java b/scribble-core/src/main/java/org/scribble/type/session/Recursion.java index eabd243f9..25f52ddb5 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Recursion.java @@ -19,6 +19,7 @@ import org.scribble.ast.ProtocolKindNode; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; +import org.scribble.type.name.MessageId; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -47,6 +48,12 @@ public Set getRoles() return this.body.getRoles(); } + @Override + public Set> getMessageIds() + { + return this.body.getMessageIds(); + } + @Override public Set getRecVars() { diff --git a/scribble-core/src/main/java/org/scribble/type/session/SType.java b/scribble-core/src/main/java/org/scribble/type/session/SType.java index b42b83649..0b832567f 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/type/session/SType.java @@ -22,6 +22,7 @@ import org.scribble.lang.Substitutions; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; +import org.scribble.type.name.MessageId; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -33,8 +34,9 @@ public interface SType // CHECKME: consider adding B ex boolean hasSource(); // i.e., was parsed ProtocolKindNode getSource(); // Pre: hasSource - // Unsupported for Protocol/Do + // Unsupported for Protocol (Protocol should not be an SType) Set getRoles(); + Set> getMessageIds(); SType substitute(Substitutions subs); diff --git a/scribble-core/src/main/java/org/scribble/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/type/session/Seq.java index ec1df127a..c5d8d07cd 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Seq.java @@ -14,7 +14,6 @@ package org.scribble.type.session; import java.util.Collections; -import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -23,6 +22,7 @@ import org.scribble.lang.Substitutions; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; +import org.scribble.type.name.MessageId; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -48,6 +48,13 @@ public Set getRoles() return this.elems.stream().flatMap(x -> x.getRoles().stream()) .collect(Collectors.toSet()); } + + @Override + public Set> getMessageIds() + { + return this.elems.stream().flatMap(x -> x.getMessageIds().stream()) + .collect(Collectors.toSet()); + } @Override public Set getRecVars() diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java b/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java index 3c42448f0..8f8af880b 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java @@ -13,13 +13,13 @@ */ package org.scribble.type.session.global; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import org.scribble.ast.global.GProtocolDecl; -import org.scribble.job.JobContext; +import org.scribble.job.JobContext2; import org.scribble.job.ScribbleException; import org.scribble.lang.Projector; import org.scribble.lang.STypeInliner; @@ -101,9 +101,10 @@ public LType project(Projector v) return LSkip.SKIP; } - JobContext jobc = v.job.getContext(); - GProtocolDecl gpd = jobc.getParsed(this.proto); - Role targSelf = gpd.getRoles().get(this.roles.indexOf(v.self)); + JobContext2 jobc = v.job.getContext(); + //GProtocolDecl gpd = jobc.getParsed(this.proto); + GProtocol gpd = jobc.getIntermediate(this.proto); + Role targSelf = gpd.roles.get(this.roles.indexOf(v.self)); GProtocol imed = jobc.getIntermediate(this.proto); if (!imed.roles.contains(targSelf)) // CHECKME: because roles already pruned for intermed decl? @@ -113,7 +114,11 @@ public LType project(Projector v) LProtocolName fullname = org.scribble.visit.context.Projector .projectFullProtocolName(this.proto, targSelf); - List rs = this.roles.stream() + Substitutions subs = new Substitutions(imed.roles, this.roles, + Collections.emptyList(), Collections.emptyList()); + List used = jobc.getInlined(this.proto).roles.stream().map(x -> subs.subsRole(x)) + .collect(Collectors.toList()); + List rs = this.roles.stream().filter(x -> used.contains(x)) .map(x -> x.equals(v.self) ? Role.SELF : x) // CHECKME: "self" also explcitily used for Choice, but implicitly for MessageTransfer, inconsistent? .collect(Collectors.toList()); diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GType.java b/scribble-core/src/main/java/org/scribble/type/session/global/GType.java index ea8c7e7c0..3aad9cb92 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GType.java @@ -27,8 +27,8 @@ public interface GType extends SType { - LType projectInlined(Role self); - LType project(Projector v); + LType projectInlined(Role self); // Use on inlined (i.e., Do inlined, roles pruned) + LType project(Projector v); // Use on parsed (intermed) // Pre: use on inlined or later (unsupported for Do, also Protocol) // enabled treated immutably diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java index ad32277a5..56ecb2816 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java @@ -24,6 +24,7 @@ import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.MemberName; +import org.scribble.type.name.MessageId; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -39,11 +40,18 @@ private LSkip() super(null); } + @Override public Set getRoles() { throw new RuntimeException("Unsupported for Skip: " + this); } + @Override + public Set> getMessageIds() + { + throw new RuntimeException("Unsupported for Skip: " + this); + } + @Override public Set getRecVars() { diff --git a/scribble-core/src/main/java/org/scribble/visit/context/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/visit/context/EGraphBuilder.java index 9f1dbd563..596dca32c 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/visit/context/EGraphBuilder.java @@ -34,7 +34,14 @@ public class EGraphBuilder extends NoEnvInlinedProtocolVisitor public EGraphBuilder(Job job) { super(job); - this.util = job.newEGraphBuilderUtil(); + try + { + this.util = job.getJob2().newEGraphBuilderUtil(); + } + catch (ScribbleException e) // TODO: refactor + { + throw new RuntimeException(e); + } } // Override visitInlinedProtocol -- not visit, or else enter/exit is lost diff --git a/scribble-core/src/main/java/org/scribble/visit/validation/GProtocolValidator.java b/scribble-core/src/main/java/org/scribble/visit/validation/GProtocolValidator.java index 60382807c..bb7b7c000 100644 --- a/scribble-core/src/main/java/org/scribble/visit/validation/GProtocolValidator.java +++ b/scribble-core/src/main/java/org/scribble/visit/validation/GProtocolValidator.java @@ -15,14 +15,24 @@ import org.scribble.ast.ScribNode; import org.scribble.job.Job; +import org.scribble.job.Job2; import org.scribble.job.ScribbleException; import org.scribble.visit.context.ModuleContextVisitor; public class GProtocolValidator extends ModuleContextVisitor { + public final Job2 job2; + public GProtocolValidator(Job job) { super(job); + this.job2 = null; + } + + public GProtocolValidator(Job2 job2) + { + super(null); + this.job2 = job2; } @Override diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index 8841ee7a8..c7a33686e 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -103,16 +103,20 @@ ARGS= CLASSPATH=$DIR'/scribble-cli/target/classes/' CLASSPATH=$CLASSPATH':'$DIR'/scribble-core/target/classes' +CLASSPATH=$CLASSPATH':'$DIR'/scribble-lang/target/classes' CLASSPATH=$CLASSPATH':'$DIR'/scribble-parser/target/classes' CLASSPATH=$CLASSPATH':'$DIR'/scribble-codegen/target/classes' +CLASSPATH=$CLASSPATH':'$DIR'/scribble-main/target/classes' CLASSPATH=$CLASSPATH':'$ANTLR CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/antlr.jar' CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/antlr-runtime.jar' CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/commons-io.jar' -CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-cli.jar' CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-core.jar' +CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-lang.jar' CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-parser.jar' CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-codegen.jar' +CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-main.jar' +CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-cli.jar' CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/stringtemplate.jar' CLASSPATH="'"`fixpath "$CLASSPATH"`"'" diff --git a/scribble-test/src/test/resources/bad/liveness/roleprog/unfair/Test06.scr b/scribble-test/src/test/resources/bad/liveness/roleprog/unfair/Test06.scr index d40b82d09..24414f745 100644 --- a/scribble-test/src/test/resources/bad/liveness/roleprog/unfair/Test06.scr +++ b/scribble-test/src/test/resources/bad/liveness/roleprog/unfair/Test06.scr @@ -1,3 +1,5 @@ +//$ bin/scribblec.sh scribble-test/src/test/resources/bad/liveness/roleprog/unfair/Test06.scr + module bad.liveness.roleprog.unfair.Test06; From d554fe5828b73fb1d455a7678630ce6c3d863379 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 5 Apr 2019 14:25:27 +0100 Subject: [PATCH 166/539] Continued: core/lang/main module separation passes JUnit. --- .../java/org/scribble/cli/CommandLine.java | 10 ++-- scribble-codegen/pom.xml | 4 ++ .../StateChannelApiGenerator.java | 4 +- .../src/main/java/org/scribble/job/Job2.java | 26 ++++---- .../job/{JobConfig.java => JobConfig2.java} | 9 +-- .../java/org/scribble/job/JobContext2.java | 18 +++--- .../java/org/scribble/lang/LangConstants.java | 1 + .../java/org/scribble/lang/Projector.java | 29 --------- .../main/java/org/scribble/lang/Protocol.java | 13 ++-- .../java/org/scribble/lang/ProtocolMod.java | 4 +- .../org/scribble/lang/global/GProtocol.java | 48 ++++++--------- .../org/scribble/lang/local/LProjection.java | 9 ++- .../org/scribble/lang/local/LProtocol.java | 31 ++++------ .../org/scribble/type/name/ModuleName.java | 2 +- .../{lang => type/name}/Substitutions.java | 4 +- .../type/session/BasicInteraction.java | 18 ++++-- .../org/scribble/type/session/Choice.java | 24 +++++++- .../scribble/type/session/ConnectAction.java | 3 +- .../org/scribble/type/session/Continue.java | 20 +++---- .../type/session/DirectedInteraction.java | 13 ++-- .../type/session/DisconnectAction.java | 13 ++-- .../java/org/scribble/type/session/Do.java | 12 ++-- .../type/session/MessageTransfer.java | 3 +- .../org/scribble/type/session/Recursion.java | 33 ++++++++++- .../java/org/scribble/type/session/SType.java | 10 ++-- .../org/scribble/type/session/STypeBase.java | 17 +++--- .../java/org/scribble/type/session/Seq.java | 59 +++++++++++++++---- .../scribble/type/session/global/GChoice.java | 30 ++++------ .../type/session/global/GConnect.java | 21 +++---- .../type/session/global/GContinue.java | 20 +++---- .../type/session/global/GDisconnect.java | 21 +++---- .../org/scribble/type/session/global/GDo.java | 41 ++++++------- .../type/session/global/GMessageTransfer.java | 21 +++---- .../type/session/global/GRecursion.java | 26 ++++---- .../scribble/type/session/global/GSeq.java | 36 +++++------ .../scribble/type/session/global/GType.java | 8 +-- .../org/scribble/type/session/local/LAcc.java | 20 +++---- .../scribble/type/session/local/LChoice.java | 25 ++++---- .../type/session/local/LContinue.java | 16 ++--- .../type/session/local/LDisconnect.java | 17 +++--- .../org/scribble/type/session/local/LDo.java | 29 ++++----- .../org/scribble/type/session/local/LRcv.java | 17 +++--- .../type/session/local/LRecursion.java | 22 +++---- .../org/scribble/type/session/local/LReq.java | 17 +++--- .../scribble/type/session/local/LSend.java | 17 +++--- .../org/scribble/type/session/local/LSeq.java | 29 ++++----- .../scribble/type/session/local/LSkip.java | 12 +--- .../scribble/type/session/local/LType.java | 4 +- .../org/scribble/{ast => util}/Constants.java | 2 +- .../util/{ScribUtil.java => ScribUtil2.java} | 41 +------------ .../java/org/scribble/visit/Projector2.java | 58 ++++++++++++++++++ .../{lang => visit}/STypeInliner.java | 3 +- .../{lang => visit}/STypeUnfolder.java | 2 +- .../java/org/scribble/ast/AstFactory.java | 0 .../java/org/scribble/ast/AstFactoryImpl.java | 0 .../main/java/org/scribble/ast/AuxMod.java | 0 .../org/scribble/ast/BasicInteraction.java | 0 .../main/java/org/scribble/ast/Choice.java | 1 + .../org/scribble/ast/CompoundInteraction.java | 0 .../java/org/scribble/ast/CompoundNode.java | 0 .../java/org/scribble/ast/ConnectAction.java | 0 .../main/java/org/scribble/ast/Continue.java | 1 + .../java/org/scribble/ast/DataTypeDecl.java | 1 + .../org/scribble/ast/DirectedInteraction.java | 0 .../org/scribble/ast/DisconnectAction.java | 0 .../src/main/java/org/scribble/ast/Do.java | 1 + .../src/main/java/org/scribble/ast/DoArg.java | 0 .../main/java/org/scribble/ast/DoArgList.java | 0 .../main/java/org/scribble/ast/DoArgNode.java | 0 .../java/org/scribble/ast/ExplicitMod.java | 0 .../org/scribble/ast/HeaderParamDecl.java | 0 .../org/scribble/ast/HeaderParamDeclList.java | 0 .../java/org/scribble/ast/ImportDecl.java | 0 .../java/org/scribble/ast/ImportModule.java | 1 + .../java/org/scribble/ast/InteractionSeq.java | 0 .../java/org/scribble/ast/MessageNode.java | 0 .../org/scribble/ast/MessageSigNameDecl.java | 1 + .../java/org/scribble/ast/MessageSigNode.java | 0 .../org/scribble/ast/MessageTransfer.java | 0 .../main/java/org/scribble/ast/Module.java | 0 .../java/org/scribble/ast/ModuleDecl.java | 1 + .../java/org/scribble/ast/ModuleMember.java | 0 .../java/org/scribble/ast/NameDeclNode.java | 0 .../org/scribble/ast/NonProtocolDecl.java | 0 .../java/org/scribble/ast/NonRoleArg.java | 0 .../java/org/scribble/ast/NonRoleArgList.java | 0 .../java/org/scribble/ast/NonRoleArgNode.java | 0 .../org/scribble/ast/NonRoleParamDecl.java | 0 .../scribble/ast/NonRoleParamDeclList.java | 0 .../java/org/scribble/ast/PayloadElem.java | 0 .../org/scribble/ast/PayloadElemList.java | 0 .../java/org/scribble/ast/ProtocolBlock.java | 0 .../java/org/scribble/ast/ProtocolDecl.java | 0 .../java/org/scribble/ast/ProtocolDef.java | 0 .../java/org/scribble/ast/ProtocolHeader.java | 1 + .../org/scribble/ast/ProtocolKindNode.java | 0 .../java/org/scribble/ast/ProtocolMod.java | 0 .../org/scribble/ast/ProtocolModList.java | 0 .../main/java/org/scribble/ast/Recursion.java | 1 + .../main/java/org/scribble/ast/RoleArg.java | 0 .../java/org/scribble/ast/RoleArgList.java | 0 .../main/java/org/scribble/ast/RoleDecl.java | 1 + .../java/org/scribble/ast/RoleDeclList.java | 0 .../java/org/scribble/ast/ScopedNode.java | 0 .../main/java/org/scribble/ast/ScribNil.java | 0 .../main/java/org/scribble/ast/ScribNode.java | 1 + .../java/org/scribble/ast/ScribNodeBase.java | 7 ++- .../java/org/scribble/ast/SessionNode.java | 0 .../java/org/scribble/ast/SigParamDecl.java | 1 + .../org/scribble/ast/SimpleSessionNode.java | 0 .../java/org/scribble/ast/TypeParamDecl.java | 1 + .../org/scribble/ast/UnaryPayloadElem.java | 0 .../scribble/ast/context/DependencyMap.java | 0 .../ast/context/ProtocolDeclContext.java | 0 .../ast/context/global/GDependencyMap.java | 0 .../context/global/GProtocolDeclContext.java | 0 .../ast/context/local/LDependencyMap.java | 0 .../context/local/LProjectionDeclContext.java | 0 .../context/local/LProtocolDeclContext.java | 0 .../java/org/scribble/ast/global/GChoice.java | 0 .../ast/global/GCompoundInteraction.java | 0 .../org/scribble/ast/global/GConnect.java | 2 +- .../org/scribble/ast/global/GContinue.java | 0 .../scribble/ast/global/GDelegationElem.java | 0 .../org/scribble/ast/global/GDisconnect.java | 2 +- .../java/org/scribble/ast/global/GDo.java | 0 .../scribble/ast/global/GInteractionSeq.java | 0 .../scribble/ast/global/GMessageTransfer.java | 2 +- .../java/org/scribble/ast/global/GNode.java | 0 .../scribble/ast/global/GProtocolBlock.java | 0 .../scribble/ast/global/GProtocolDecl.java | 0 .../org/scribble/ast/global/GProtocolDef.java | 0 .../scribble/ast/global/GProtocolHeader.java | 2 +- .../org/scribble/ast/global/GRecursion.java | 0 .../org/scribble/ast/global/GSessionNode.java | 0 .../ast/global/GSimpleSessionNode.java | 0 .../java/org/scribble/ast/global/GWrap.java | 2 +- .../java/org/scribble/ast/local/LAccept.java | 2 +- .../java/org/scribble/ast/local/LChoice.java | 0 .../ast/local/LCompoundInteraction.java | 0 .../scribble/ast/local/LConnectionAction.java | 0 .../org/scribble/ast/local/LContinue.java | 0 .../scribble/ast/local/LDelegationElem.java | 0 .../org/scribble/ast/local/LDisconnect.java | 2 +- .../main/java/org/scribble/ast/local/LDo.java | 0 .../scribble/ast/local/LInteractionSeq.java | 0 .../scribble/ast/local/LMessageTransfer.java | 0 .../java/org/scribble/ast/local/LNode.java | 0 .../scribble/ast/local/LProjectionDecl.java | 0 .../scribble/ast/local/LProtocolBlock.java | 0 .../org/scribble/ast/local/LProtocolDecl.java | 0 .../org/scribble/ast/local/LProtocolDef.java | 0 .../scribble/ast/local/LProtocolHeader.java | 2 +- .../java/org/scribble/ast/local/LReceive.java | 2 +- .../org/scribble/ast/local/LRecursion.java | 0 .../java/org/scribble/ast/local/LRequest.java | 2 +- .../java/org/scribble/ast/local/LSend.java | 2 +- .../org/scribble/ast/local/LSessionNode.java | 0 .../ast/local/LSimpleSessionNode.java | 0 .../org/scribble/ast/local/LWrapClient.java | 2 +- .../org/scribble/ast/local/LWrapServer.java | 2 +- .../org/scribble/ast/local/SelfRoleDecl.java | 0 .../java/org/scribble/ast/name/NameNode.java | 0 .../ast/name/PayloadElemNameNode.java | 0 .../ast/name/qualified/DataTypeNode.java | 0 .../ast/name/qualified/GProtocolNameNode.java | 0 .../ast/name/qualified/LProtocolNameNode.java | 0 .../ast/name/qualified/MemberNameNode.java | 0 .../name/qualified/MessageSigNameNode.java | 0 .../ast/name/qualified/ModuleNameNode.java | 0 .../ast/name/qualified/ProtocolNameNode.java | 0 .../ast/name/qualified/QualifiedNameNode.java | 0 .../ast/name/simple/AmbigNameNode.java | 0 .../name/simple/DummyProjectionRoleNode.java | 0 .../org/scribble/ast/name/simple/IdNode.java | 0 .../ast/name/simple/NonRoleParamNode.java | 0 .../org/scribble/ast/name/simple/OpNode.java | 0 .../scribble/ast/name/simple/RecVarNode.java | 0 .../scribble/ast/name/simple/RoleNode.java | 0 .../ast/name/simple/SigParamNode.java | 0 .../ast/name/simple/SimpleNameNode.java | 0 .../ast/name/simple/TypeParamNode.java | 0 .../main/java/org/scribble/del/ChoiceDel.java | 0 .../scribble/del/CompoundInteractionDel.java | 0 .../scribble/del/CompoundSessionNodeDel.java | 0 .../org/scribble/del/ConnectionActionDel.java | 0 .../java/org/scribble/del/ContinueDel.java | 0 .../java/org/scribble/del/DefaultDel.java | 0 .../java/org/scribble/del/DoArgListDel.java | 0 .../src/main/java/org/scribble/del/DoDel.java | 0 .../scribble/del/HeaderParamDeclListDel.java | 0 .../org/scribble/del/ImportModuleDel.java | 0 .../org/scribble/del/InteractionNodeDel.java | 0 .../org/scribble/del/InteractionSeqDel.java | 0 .../org/scribble/del/MessageTransferDel.java | 0 .../main/java/org/scribble/del/ModuleDel.java | 2 +- .../org/scribble/del/NonRoleArgListDel.java | 0 .../org/scribble/del/NonRoleParamDeclDel.java | 0 .../scribble/del/NonRoleParamDeclListDel.java | 0 .../org/scribble/del/ProtocolBlockDel.java | 0 .../org/scribble/del/ProtocolDeclDel.java | 0 .../java/org/scribble/del/ProtocolDefDel.java | 0 .../java/org/scribble/del/RecursionDel.java | 0 .../java/org/scribble/del/RoleArgListDel.java | 0 .../java/org/scribble/del/RoleDeclDel.java | 0 .../org/scribble/del/RoleDeclListDel.java | 0 .../main/java/org/scribble/del/ScribDel.java | 1 + .../java/org/scribble/del/ScribDelBase.java | 0 .../scribble/del/SimpleSessionNodeDel.java | 0 .../org/scribble/del/global/GChoiceDel.java | 2 +- .../global/GCompoundInteractionNodeDel.java | 0 .../org/scribble/del/global/GConnectDel.java | 2 +- .../org/scribble/del/global/GContinueDel.java | 2 +- .../java/org/scribble/del/global/GDel.java | 2 +- .../del/global/GDelegationElemDel.java | 0 .../scribble/del/global/GDisconnectDel.java | 2 +- .../java/org/scribble/del/global/GDoDel.java | 2 +- .../del/global/GInteractionNodeDel.java | 0 .../del/global/GInteractionSeqDel.java | 2 +- .../del/global/GMessageTransferDel.java | 2 +- .../del/global/GProtocolBlockDel.java | 2 +- .../scribble/del/global/GProtocolDeclDel.java | 2 +- .../scribble/del/global/GProtocolDefDel.java | 0 .../scribble/del/global/GRecursionDel.java | 2 +- .../del/global/GSimpleInteractionNodeDel.java | 0 .../org/scribble/del/global/GWrapDel.java | 0 .../org/scribble/del/local/LAcceptDel.java | 0 .../org/scribble/del/local/LChoiceDel.java | 0 .../local/LCompoundInteractionNodeDel.java | 0 .../del/local/LConnectionActionDel.java | 0 .../org/scribble/del/local/LContinueDel.java | 0 .../scribble/del/local/LDisconnectDel.java | 0 .../java/org/scribble/del/local/LDoDel.java | 0 .../del/local/LInteractionNodeDel.java | 0 .../del/local/LInteractionSeqDel.java | 0 .../del/local/LMessageTransferDel.java | 0 .../del/local/LProjectionDeclDel.java | 0 .../scribble/del/local/LProtocolBlockDel.java | 0 .../scribble/del/local/LProtocolDeclDel.java | 0 .../scribble/del/local/LProtocolDefDel.java | 0 .../org/scribble/del/local/LReceiveDel.java | 0 .../org/scribble/del/local/LRecursionDel.java | 0 .../org/scribble/del/local/LRequestDel.java | 0 .../java/org/scribble/del/local/LSendDel.java | 0 .../del/local/LSimpleInteractionNodeDel.java | 0 .../scribble/del/local/LWrapClientDel.java | 0 .../scribble/del/local/LWrapServerDel.java | 0 .../del/name/qualified/DataTypeNodeDel.java | 0 .../name/qualified/MessageSigNameNodeDel.java | 0 .../del/name/simple/AmbigNameNodeDel.java | 0 .../del/name/simple/NonRoleParamNodeDel.java | 0 .../del/name/simple/RecVarNodeDel.java | 0 .../scribble/del/name/simple/RoleNodeDel.java | 0 .../src/main/java/org/scribble/job/Job.java | 4 +- .../java/org/scribble/job/JobContext.java | 0 .../lang/context/ModuleContextMaker.java | 2 + .../java/org/scribble/visit/AstVisitor.java | 0 .../java/org/scribble/visit/EnvVisitor.java | 0 .../org/scribble/visit}/GTypeTranslator.java | 2 +- .../visit/InlinedProtocolUnfolder.java | 0 .../visit/InlinedProtocolVisitor.java | 0 .../visit/NoEnvInlinedProtocolVisitor.java | 0 .../visit/NoEnvOffsetSubprotocolVisitor.java | 0 .../visit/NoEnvSubprotocolVisitor.java | 0 .../scribble/visit/NoEnvUnfoldingVisitor.java | 0 .../visit/OffsetSubprotocolVisitor.java | 0 .../scribble/visit/ProtocolDefInliner.java | 0 .../org/scribble/visit/SimpleVisitor.java | 0 .../scribble/visit/SubprotocolVisitor.java | 0 .../java/org/scribble/visit/Substitutor.java | 0 .../org/scribble/visit/UnfoldingVisitor.java | 0 .../scribble/visit/context/EGraphBuilder.java | 0 .../visit/context/ModuleContextBuilder.java | 0 .../visit/context/ModuleContextVisitor.java | 0 .../context/ProjectedChoiceDoPruner.java | 0 .../context/ProjectedChoiceSubjectFixer.java | 0 .../visit/context/ProjectedRoleDeclFixer.java | 0 .../org/scribble/visit/context/Projector.java | 32 +--------- .../context/ProtocolDeclContextBuilder.java | 0 .../scribble/visit/context/RecRemover.java | 0 .../UnguardedChoiceDoProjectionChecker.java | 0 .../visit/context/env/ProjectionEnv.java | 0 .../context/env/UnguardedChoiceDoEnv.java | 0 .../java/org/scribble/visit/env/DummyEnv.java | 0 .../main/java/org/scribble/visit/env/Env.java | 0 .../scribble/visit/env/InlineProtocolEnv.java | 0 .../org/scribble/visit/env/UnfoldingEnv.java | 0 .../visit/util/MessageIdCollector.java | 0 .../scribble/visit/util/NameCollector.java | 0 .../scribble/visit/util/RecVarCollector.java | 0 .../scribble/visit/util/RoleCollector.java | 0 .../visit/validation/GProtocolValidator.java | 0 .../wf/DelegationProtocolRefChecker.java | 0 .../visit/wf/ExplicitCorrelationChecker.java | 0 .../scribble/visit/wf/NameDisambiguator.java | 0 .../visit/wf/ReachabilityChecker.java | 0 .../scribble/visit/wf/WFChoiceChecker.java | 0 .../visit/wf/env/ExplicitCorrelationEnv.java | 0 .../visit/wf/env/ReachabilityEnv.java | 0 .../scribble/visit/wf/env/WFChoiceEnv.java | 0 .../java/org/scribble/main/MainContext.java | 4 +- 301 files changed, 560 insertions(+), 547 deletions(-) rename scribble-core/src/main/java/org/scribble/job/{JobConfig.java => JobConfig2.java} (88%) delete mode 100644 scribble-core/src/main/java/org/scribble/lang/Projector.java rename scribble-core/src/main/java/org/scribble/{lang => type/name}/Substitutions.java (96%) rename scribble-core/src/main/java/org/scribble/{ast => util}/Constants.java (98%) rename scribble-core/src/main/java/org/scribble/util/{ScribUtil.java => ScribUtil2.java} (67%) create mode 100644 scribble-core/src/main/java/org/scribble/visit/Projector2.java rename scribble-core/src/main/java/org/scribble/{lang => visit}/STypeInliner.java (97%) rename scribble-core/src/main/java/org/scribble/{lang => visit}/STypeUnfolder.java (97%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/AstFactory.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/AstFactoryImpl.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/AuxMod.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/BasicInteraction.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/Choice.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/CompoundInteraction.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/CompoundNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/ConnectAction.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/Continue.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/DataTypeDecl.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/DirectedInteraction.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/DisconnectAction.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/Do.java (99%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/DoArg.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/DoArgList.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/DoArgNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/ExplicitMod.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/HeaderParamDecl.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/HeaderParamDeclList.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/ImportDecl.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/ImportModule.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/InteractionSeq.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/MessageNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/MessageSigNameDecl.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/MessageSigNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/MessageTransfer.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/Module.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/ModuleDecl.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/ModuleMember.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/NameDeclNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/NonProtocolDecl.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/NonRoleArg.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/NonRoleArgList.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/NonRoleArgNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/NonRoleParamDecl.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/NonRoleParamDeclList.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/PayloadElem.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/PayloadElemList.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/ProtocolBlock.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/ProtocolDecl.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/ProtocolDef.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/ProtocolHeader.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/ProtocolKindNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/ProtocolMod.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/ProtocolModList.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/Recursion.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/RoleArg.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/RoleArgList.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/RoleDecl.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/RoleDeclList.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/ScopedNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/ScribNil.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/ScribNode.java (96%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/ScribNodeBase.java (97%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/SessionNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/SigParamDecl.java (97%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/SimpleSessionNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/TypeParamDecl.java (97%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/UnaryPayloadElem.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/context/DependencyMap.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/context/ProtocolDeclContext.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/context/global/GDependencyMap.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/context/global/GProtocolDeclContext.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/context/local/LDependencyMap.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/context/local/LProjectionDeclContext.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/context/local/LProtocolDeclContext.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GChoice.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GCompoundInteraction.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GConnect.java (99%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GContinue.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GDelegationElem.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GDisconnect.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GDo.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GInteractionSeq.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GMessageTransfer.java (99%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GProtocolBlock.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GProtocolDecl.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GProtocolDef.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GProtocolHeader.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GRecursion.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GSessionNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GSimpleSessionNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/global/GWrap.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LAccept.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LChoice.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LCompoundInteraction.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LConnectionAction.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LContinue.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LDelegationElem.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LDisconnect.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LDo.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LInteractionSeq.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LMessageTransfer.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LProjectionDecl.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LProtocolBlock.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LProtocolDecl.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LProtocolDef.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LProtocolHeader.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LReceive.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LRecursion.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LRequest.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LSend.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LSessionNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LWrapClient.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/LWrapServer.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/local/SelfRoleDecl.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/NameNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/PayloadElemNameNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/simple/IdNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/simple/OpNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/simple/RecVarNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/simple/RoleNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/simple/SigParamNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/ChoiceDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/CompoundInteractionDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/CompoundSessionNodeDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/ConnectionActionDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/ContinueDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/DefaultDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/DoArgListDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/DoDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/HeaderParamDeclListDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/ImportModuleDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/InteractionNodeDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/InteractionSeqDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/MessageTransferDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/ModuleDel.java (99%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/NonRoleArgListDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/NonRoleParamDeclDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/NonRoleParamDeclListDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/ProtocolBlockDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/ProtocolDeclDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/ProtocolDefDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/RecursionDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/RoleArgListDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/RoleDeclDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/RoleDeclListDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/ScribDel.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/ScribDelBase.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/SimpleSessionNodeDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/global/GChoiceDel.java (99%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/global/GCompoundInteractionNodeDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/global/GConnectDel.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/global/GContinueDel.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/global/GDel.java (95%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/global/GDelegationElemDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/global/GDisconnectDel.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/global/GDoDel.java (99%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/global/GInteractionNodeDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/global/GInteractionSeqDel.java (99%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/global/GMessageTransferDel.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/global/GProtocolBlockDel.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/global/GProtocolDeclDel.java (99%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/global/GProtocolDefDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/global/GRecursionDel.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/global/GSimpleInteractionNodeDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/global/GWrapDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LAcceptDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LChoiceDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LConnectionActionDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LContinueDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LDisconnectDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LDoDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LInteractionNodeDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LInteractionSeqDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LMessageTransferDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LProjectionDeclDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LProtocolBlockDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LProtocolDeclDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LProtocolDefDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LReceiveDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LRecursionDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LRequestDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LSendDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LSimpleInteractionNodeDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LWrapClientDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/local/LWrapServerDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/name/simple/NonRoleParamNodeDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/job/Job.java (98%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/job/JobContext.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/lang/context/ModuleContextMaker.java (99%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/AstVisitor.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/EnvVisitor.java (100%) rename {scribble-core/src/main/java/org/scribble/lang/global => scribble-lang/src/main/java/org/scribble/visit}/GTypeTranslator.java (97%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/ProtocolDefInliner.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/SimpleVisitor.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/SubprotocolVisitor.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/Substitutor.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/UnfoldingVisitor.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/context/EGraphBuilder.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/context/Projector.java (84%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/context/RecRemover.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/context/env/UnguardedChoiceDoEnv.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/env/DummyEnv.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/env/Env.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/env/InlineProtocolEnv.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/env/UnfoldingEnv.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/util/MessageIdCollector.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/util/NameCollector.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/util/RecVarCollector.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/util/RoleCollector.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/validation/GProtocolValidator.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/wf/NameDisambiguator.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/wf/env/ExplicitCorrelationEnv.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java (100%) rename {scribble-core => scribble-lang}/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java (100%) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 7002bffe4..ee67b42b2 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -45,7 +45,7 @@ import org.scribble.type.name.LProtocolName; import org.scribble.type.name.Role; import org.scribble.util.ScribParserException; -import org.scribble.util.ScribUtil; +import org.scribble.util.ScribUtil2; public class CommandLine { @@ -516,14 +516,14 @@ protected void outputClasses(Map classes) if (this.args.containsKey(CLArgFlag.API_OUTPUT)) { String dir = this.args.get(CLArgFlag.API_OUTPUT)[0]; - f = path -> { ScribUtil.handleLambdaScribbleException(() -> + f = path -> { ScribUtil2.handleLambdaScribbleException(() -> { String tmp = dir + "/" + path; if (this.args.containsKey(CLArgFlag.VERBOSE)) { System.out.println("[DEBUG] Writing to: " + tmp); } - ScribUtil.writeToFile(tmp, classes.get(path)); return null; + ScribUtil2.writeToFile(tmp, classes.get(path)); return null; }); }; } else @@ -544,8 +544,8 @@ protected static void runDot(String dot, String png) } try { - ScribUtil.writeToFile(tmpName, dot); - String[] res = ScribUtil.runProcess("dot", "-Tpng", "-o" + png, tmpName); + ScribUtil2.writeToFile(tmpName, dot); + String[] res = ScribUtil2.runProcess("dot", "-Tpng", "-o" + png, tmpName); System.out.print(!res[1].isEmpty() ? res[1] : res[0]); // already "\n" terminated } finally diff --git a/scribble-codegen/pom.xml b/scribble-codegen/pom.xml index e3fba955c..ad6aac1f6 100644 --- a/scribble-codegen/pom.xml +++ b/scribble-codegen/pom.xml @@ -20,5 +20,9 @@ org.scribble scribble-core + + org.scribble + scribble-lang + diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index ba86cba0d..e5c29c999 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -30,7 +30,7 @@ import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.Role; -import org.scribble.visit.context.Projector; +import org.scribble.visit.Projector2; // TODO: "wildcard" unary async: op doesn't matter -- for branch-receive op "still needed" to cast to correct branch state // TODO: "functional state interfaces", e.g. for smtp ehlo and quit actions @@ -62,7 +62,7 @@ public StateChannelApiGenerator(Job job, GProtocolName fullname, Role self) super(job, fullname); this.self = self; - this.lpn = Projector.projectFullProtocolName(fullname, self); + this.lpn = Projector2.projectFullProtocolName(fullname, self); //this.init = job.getContext().getEndpointGraph(fullname, self).init; JobContext2 jobc2 = this.job2.getContext(); this.init = job.config.minEfsm diff --git a/scribble-core/src/main/java/org/scribble/job/Job2.java b/scribble-core/src/main/java/org/scribble/job/Job2.java index 19d770f2a..bc15f2fb7 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job2.java +++ b/scribble-core/src/main/java/org/scribble/job/Job2.java @@ -21,9 +21,6 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.lang.Projector; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; import org.scribble.lang.SubprotoSig; import org.scribble.lang.context.ModuleContext; import org.scribble.lang.global.GProtocol; @@ -45,7 +42,9 @@ import org.scribble.type.name.Role; import org.scribble.type.session.Arg; import org.scribble.type.session.global.GType; -import org.scribble.visit.validation.GProtocolValidator; +import org.scribble.visit.Projector2; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models public class Job2 @@ -53,7 +52,7 @@ public class Job2 // Keys are full names private final Map modcs; // CHECKME: constant? move to JobConfig? - public final JobConfig config; // Immutable + public final JobConfig2 config; // Immutable private final JobContext2 context; // Mutable (Visitor passes replace modules) private final SGraphBuilderUtil sgbu; @@ -61,7 +60,7 @@ public class Job2 // Just take MainContext as arg? -- would need to fix Maven dependencies //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) public Job2(Set parsed,//Map parsed, - Map modcs, JobConfig config) + Map modcs, JobConfig2 config) { this.modcs = Collections.unmodifiableMap(modcs); this.config = config; @@ -210,7 +209,6 @@ public void runWellFormednessPasses() throws ScribbleException proj.checkReachability(); } - GProtocolValidator checker = new GProtocolValidator(this); //runVisitorPassOnAllModules(GProtocolValidator.class); //for (Module mod : this.context.getParsed().values()) { @@ -227,23 +225,23 @@ public void runWellFormednessPasses() throws ScribbleException debugPrintln("\nValidating " + fullname + ":"); - if (checker.job2.config.spin) + if (this.config.spin) { - if (checker.job2.config.fair) + if (this.config.fair) { throw new RuntimeException( "[TODO]: -spin currently does not support fair ouput choices."); } - GProtocol.validateBySpin(checker.job2, fullname); + GProtocol.validateBySpin(this, fullname); } else { - GProtocol.validateByScribble(checker.job2, fullname, true); - if (!checker.job2.config.fair) + GProtocol.validateByScribble(this, fullname, true); + if (!this.config.fair) { debugPrintln( "(" + fullname + ") Validating with \"unfair\" output choices.. "); - GProtocol.validateByScribble(checker.job2, fullname, false); // TODO: only need to check progress, not full validation + GProtocol.validateByScribble(this, fullname, false); // TODO: only need to check progress, not full validation } } } @@ -279,7 +277,7 @@ protected void runProjectionPasses() throws ScribbleException { for (Role self : g.roles) { - LProtocol proj = g.project(new Projector(this, self)); // Does pruneRecs + LProtocol proj = g.project(new Projector2(this, self)); // Does pruneRecs this.context.addProjection(proj); debugPrintln("\nProjected onto " + self + ":\n" + proj); } diff --git a/scribble-core/src/main/java/org/scribble/job/JobConfig.java b/scribble-core/src/main/java/org/scribble/job/JobConfig2.java similarity index 88% rename from scribble-core/src/main/java/org/scribble/job/JobConfig.java rename to scribble-core/src/main/java/org/scribble/job/JobConfig2.java index 9754f2963..8d8eaf22b 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobConfig.java +++ b/scribble-core/src/main/java/org/scribble/job/JobConfig2.java @@ -13,13 +13,12 @@ */ package org.scribble.job; -import org.scribble.ast.AstFactory; import org.scribble.model.endpoint.EModelFactory; import org.scribble.model.global.SModelFactory; import org.scribble.type.name.ModuleName; // The "static" (constant) info for Jobs -- cf. JobContext "dynamic" state -public class JobConfig +public class JobConfig2 { public final ModuleName main; // Full name // CHECKME: verbose/debug printing parameter? @@ -34,15 +33,14 @@ public class JobConfig public final boolean noValidation; public final boolean spin; - public final AstFactory af; public final EModelFactory ef; public final SModelFactory sf; // N.B. MainContext is in a different non-visible (by Maven) package - public JobConfig(boolean debug, ModuleName main, boolean useOldWF, boolean noLiveness, boolean minEfsm, + public JobConfig2(boolean debug, ModuleName main, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin, - AstFactory af, EModelFactory ef, SModelFactory sf) + EModelFactory ef, SModelFactory sf) { this.main = main; @@ -57,7 +55,6 @@ public JobConfig(boolean debug, ModuleName main, boolean useOldWF, boolean noLiv this.noValidation = noValidation; this.spin = spin; - this.af = af; this.ef = ef; this.sf = sf; } diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext2.java b/scribble-core/src/main/java/org/scribble/job/JobContext2.java index 97784d550..4558a2f05 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobContext2.java +++ b/scribble-core/src/main/java/org/scribble/job/JobContext2.java @@ -31,8 +31,8 @@ import org.scribble.type.name.LProtocolName; import org.scribble.type.name.ModuleName; import org.scribble.type.name.Role; -import org.scribble.util.ScribUtil; -import org.scribble.visit.context.Projector; +import org.scribble.util.ScribUtil2; +import org.scribble.visit.Projector2; // Global "static" context information for a Job -- single instance per Job, should not be shared between Jobs // Mutable: projections, graphs, etc are added mutably later -- replaceModule also mutable setter -- "users" get this from the Job and expect to setter mutate "in place" @@ -169,7 +169,7 @@ public void addInlinedProjection(LProtocolName fullname, LProtocol l) // FIXME TODO: refactor getProjected and getProjection properly public LProtocol getInlinedProjection(GProtocolName fullname, Role self) { - LProtocolName p = Projector.projectFullProtocolName(fullname, self); + LProtocolName p = Projector2.projectFullProtocolName(fullname, self); return getInlinedProjection(p); } @@ -226,7 +226,7 @@ public void addProjection(LProtocol p) LProtocol getProjection(GProtocolName fullname, Role role) throws ScribbleException { - return getProjection(Projector.projectFullProtocolName(fullname, role)); + return getProjection(Projector2.projectFullProtocolName(fullname, role)); } public //Module @@ -254,7 +254,7 @@ protected void addEGraph(LProtocolName fullname, EGraph graph) public EGraph getEGraph(GProtocolName fullname, Role role) throws ScribbleException { - LProtocolName fulllpn = Projector.projectFullProtocolName(fullname, role); + LProtocolName fulllpn = Projector2.projectFullProtocolName(fullname, role); // Moved form LProtocolDecl EGraph graph = this.fairEGraphs.get(fulllpn); if (graph == null) @@ -276,7 +276,7 @@ protected void addUnfairEGraph(LProtocolName fullname, EGraph graph) public EGraph getUnfairEGraph(GProtocolName fullname, Role role) throws ScribbleException { - LProtocolName fulllpn = Projector.projectFullProtocolName(fullname, role); + LProtocolName fulllpn = Projector2.projectFullProtocolName(fullname, role); EGraph unfair = this.unfairEGraphs.get(fulllpn); if (unfair == null) @@ -357,7 +357,7 @@ protected void addMinimisedEGraph(LProtocolName fullname, EGraph graph) public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) throws ScribbleException { - LProtocolName fulllpn = Projector.projectFullProtocolName(fullname, role); + LProtocolName fulllpn = Projector2.projectFullProtocolName(fullname, role); EGraph minimised = this.minimisedEGraphs.get(fulllpn); if (minimised == null) @@ -383,8 +383,8 @@ private static String runAut(String fsm, String aut) throws ScribbleException } try { - ScribUtil.writeToFile(tmpName, fsm); - String[] res = ScribUtil.runProcess("ltsconvert", "-ebisim", "-iaut", + ScribUtil2.writeToFile(tmpName, fsm); + String[] res = ScribUtil2.runProcess("ltsconvert", "-ebisim", "-iaut", "-oaut", tmpName); if (!res[1].isEmpty()) { diff --git a/scribble-core/src/main/java/org/scribble/lang/LangConstants.java b/scribble-core/src/main/java/org/scribble/lang/LangConstants.java index 62c8ce19d..68eaf62b0 100644 --- a/scribble-core/src/main/java/org/scribble/lang/LangConstants.java +++ b/scribble-core/src/main/java/org/scribble/lang/LangConstants.java @@ -13,6 +13,7 @@ */ package org.scribble.lang; +@Deprecated public class LangConstants { diff --git a/scribble-core/src/main/java/org/scribble/lang/Projector.java b/scribble-core/src/main/java/org/scribble/lang/Projector.java deleted file mode 100644 index aa471726c..000000000 --- a/scribble-core/src/main/java/org/scribble/lang/Projector.java +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.lang; - -import org.scribble.job.Job2; -import org.scribble.type.name.Role; - -public class Projector -{ - public final Job2 job; - public final Role self; - - public Projector(Job2 job, Role self) - { - this.job = job; - this.self = self; - } -} diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index f71037054..f6451ac1e 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -18,8 +18,7 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.ast.Constants; -import org.scribble.ast.ProtocolDecl; +import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.DataType; @@ -29,8 +28,10 @@ import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.STypeBase; import org.scribble.type.session.Seq; +import org.scribble.util.Constants; public abstract class Protocol, B extends Seq> extends STypeBase @@ -43,7 +44,7 @@ public abstract class Protocol // CHECKME: make a ParamName? or at least SimpleName? public final B def; - public Protocol(ProtocolDecl source, List mods, N fullname, + public Protocol(CommonTree source, List mods, N fullname, List roles, List> params, B def) { super(source); @@ -118,12 +119,6 @@ public List> getNonProtoDependencies() return this.def.getNonProtoDependencies(); } - @Override - public ProtocolDecl getSource() - { - return (ProtocolDecl) super.getSource(); - } - @Override public String toString() { diff --git a/scribble-core/src/main/java/org/scribble/lang/ProtocolMod.java b/scribble-core/src/main/java/org/scribble/lang/ProtocolMod.java index 7c420f7aa..aa21e2c0e 100644 --- a/scribble-core/src/main/java/org/scribble/lang/ProtocolMod.java +++ b/scribble-core/src/main/java/org/scribble/lang/ProtocolMod.java @@ -13,6 +13,7 @@ */ package org.scribble.lang; +import org.antlr.runtime.tree.CommonTree; public enum ProtocolMod { @@ -30,7 +31,8 @@ public String toString() } } - public static ProtocolMod fromAst(org.scribble.ast.ProtocolMod ast) + // TODO: refactor to scrib-lang -- param should be ProtocolMod, not CommonTree + public static ProtocolMod fromAst(CommonTree ast)//org.scribble.ast.ProtocolMod ast) { switch (ast.toString()) { diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index 855b5d759..5fc760ef3 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -24,20 +24,13 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.ast.Module; -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.global.GProtocolDecl; -import org.scribble.del.ModuleDel; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.Job2; import org.scribble.job.JobContext2; import org.scribble.job.ScribbleException; -import org.scribble.lang.Projector; import org.scribble.lang.Protocol; import org.scribble.lang.ProtocolMod; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; import org.scribble.lang.SubprotoSig; -import org.scribble.lang.Substitutions; import org.scribble.lang.local.LProjection; import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; @@ -51,24 +44,27 @@ import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.global.GRecursion; import org.scribble.type.session.global.GSeq; import org.scribble.type.session.global.GType; import org.scribble.type.session.local.LSeq; -import org.scribble.util.ScribUtil; -import org.scribble.visit.util.MessageIdCollector; +import org.scribble.util.ScribUtil2; +import org.scribble.visit.Projector2; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public class GProtocol extends Protocol implements GType { - public GProtocol(ProtocolDecl source, List mods, + public GProtocol(CommonTree source, List mods, GProtocolName fullname, List roles, List> params, GSeq def) { super(source, mods, fullname, roles, params, def); } - public GProtocol reconstruct(ProtocolDecl source, + public GProtocol reconstruct(CommonTree source, List mods, GProtocolName fullname, List roles, List> params, GSeq def) { @@ -79,15 +75,15 @@ public GProtocol reconstruct(ProtocolDecl source, // Pre: stack.peek is the sig for the calling Do (or top-level entry) // i.e., it gives the roles/args at the call-site @Override - public GProtocol getInlined(STypeInliner i)//, Deque stack) + public GProtocol getInlined(STypeInliner v) { - SubprotoSig sig = i.peek(); + SubprotoSig sig = v.peek(); Substitutions subs = new Substitutions(this.roles, sig.roles, this.params, sig.args); - GSeq body = this.def.substitute(subs).getInlined(i).pruneRecs(); - RecVar rv = i.getInlinedRecVar(sig); + GSeq body = this.def.substitute(subs).getInlined(v).pruneRecs(); + RecVar rv = v.getInlinedRecVar(sig); GRecursion rec = new GRecursion(null, rv, body); // CHECKME: or protodecl source? - GProtocolDecl source = getSource(); + CommonTree source = getSource(); GSeq def = new GSeq(null, Stream.of(rec).collect(Collectors.toList())); Set used = def.getRoles(); List rs = this.roles.stream().filter(x -> used.contains(x)) // Prune role decls @@ -114,7 +110,7 @@ public LProjection projectInlined(Role self) private LProjection projectAux(Role self, List decls, LSeq body) { - LProtocolName fullname = org.scribble.visit.context.Projector + LProtocolName fullname = Projector2 .projectFullProtocolName(this.fullname, self); Set tmp = body.getRoles(); List roles = decls.stream() @@ -127,7 +123,7 @@ private LProjection projectAux(Role self, List decls, LSeq body) } @Override - public LProjection project(Projector v) + public LProjection project(Projector2 v) { LSeq body = (LSeq) this.def.project(v).pruneRecs(); return projectAux(v.self, @@ -164,12 +160,6 @@ public Map checkExtChoiceConsistency() throws ScribbleException return this.def.checkExtChoiceConsistency(tmp); } - @Override - public GProtocolDecl getSource() - { - return (GProtocolDecl) super.getSource(); - } - @Override public String toString() { @@ -359,8 +349,8 @@ public static boolean runSpin(String prefix, String pml) //throws ScribbleExcept try { String tmpName = tmp.getAbsolutePath(); - ScribUtil.writeToFile(tmpName, pml); - String[] res = ScribUtil.runProcess("spin", "-a", tmpName); + ScribUtil2.writeToFile(tmpName, pml); + String[] res = ScribUtil2.runProcess("spin", "-a", tmpName); res[0] = res[0].replaceAll("(?m)^ltl.*$", ""); res[1] = res[1].replace( "'gcc-4' is not recognized as an internal or external command,\noperable program or batch file.", @@ -386,14 +376,14 @@ public static boolean runSpin(String prefix, String pml) //throws ScribbleExcept i++; } int dnfair = (procs <= 6) ? 2 : 3; // FIXME - res = ScribUtil.runProcess("gcc", "-o", "pan", "pan.c", "-DNFAIR=" + dnfair); + res = ScribUtil2.runProcess("gcc", "-o", "pan", "pan.c", "-DNFAIR=" + dnfair); res[0] = res[0].trim(); res[1] = res[1].trim(); if (!res[0].isEmpty() || !res[1].isEmpty()) { throw new RuntimeException("[-spin] [gcc]: " + res[0] + "\n" + res[1]); } - res = ScribUtil.runProcess("pan", "-a", "-f"); + res = ScribUtil2.runProcess("pan", "-a", "-f"); res[1] = res[1].replace("warning: no accept labels are defined, so option -a has no effect (ignored)", ""); res[0] = res[0].trim(); res[1] = res[1].trim(); diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java index 3a45a17c9..9e62b3ce0 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java @@ -16,16 +16,15 @@ import java.util.List; import java.util.stream.Collectors; -import org.scribble.ast.ProtocolDecl; +import org.antlr.runtime.tree.CommonTree; import org.scribble.lang.ProtocolMod; -import org.scribble.lang.STypeInliner; -import org.scribble.type.kind.Local; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.MemberName; import org.scribble.type.name.Role; import org.scribble.type.session.local.LSeq; +import org.scribble.visit.STypeInliner; public class LProjection extends LProtocol { @@ -41,7 +40,7 @@ public LProjection(List mods, LProtocolName fullname, } @Override - public LProjection reconstruct(ProtocolDecl source, + public LProjection reconstruct(CommonTree source, List mods, LProtocolName fullname, List roles, Role self, List> params, LSeq body) { @@ -61,7 +60,7 @@ public LType substitute(Substitutions subs) // Pre: stack.peek is the sig for the calling Do (or top-level entry) // i.e., it gives the roles/args at the call-site @Override - public LProjection getInlined(STypeInliner i) + public LProjection getInlined(STypeInliner v) { throw new RuntimeException("[TODO]: " + this); } diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index 56518c414..5d5d059ed 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -19,17 +19,12 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.ast.Constants; -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.local.LProtocolDecl; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.Job2; import org.scribble.job.ScribbleException; import org.scribble.lang.Protocol; import org.scribble.lang.ProtocolMod; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; import org.scribble.lang.SubprotoSig; -import org.scribble.lang.Substitutions; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.model.endpoint.EState; @@ -39,16 +34,20 @@ import org.scribble.type.name.MemberName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.local.LRecursion; import org.scribble.type.session.local.LSeq; import org.scribble.type.session.local.LType; +import org.scribble.util.Constants; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public class LProtocol extends Protocol implements LType { public final Role self; - public LProtocol(ProtocolDecl source, List mods, + public LProtocol(CommonTree source, List mods, LProtocolName fullname, List roles, Role self, List> params, LSeq def) { @@ -56,7 +55,7 @@ public LProtocol(ProtocolDecl source, List mods, this.self = self; } - public LProtocol reconstruct(ProtocolDecl source, + public LProtocol reconstruct(CommonTree source, List mods, LProtocolName fullname, List roles, Role self, List> params, LSeq def) { @@ -79,15 +78,15 @@ public boolean isSingleConts(Set rvs) // Pre: stack.peek is the sig for the calling Do (or top-level entry) // i.e., it gives the roles/args at the call-site @Override - public LProtocol getInlined(STypeInliner i)//, Deque stack) + public LProtocol getInlined(STypeInliner v)//, Deque stack) { - SubprotoSig sig = i.peek(); + SubprotoSig sig = v.peek(); Substitutions subs = new Substitutions(this.roles, sig.roles, this.params, sig.args); - LSeq body = this.def.substitute(subs).getInlined(i).pruneRecs(); - RecVar rv = i.getInlinedRecVar(sig); + LSeq body = this.def.substitute(subs).getInlined(v).pruneRecs(); + RecVar rv = v.getInlinedRecVar(sig); LRecursion rec = new LRecursion(null, rv, body); // CHECKME: or protodecl source? - LProtocolDecl source = getSource(); + CommonTree source = getSource(); LSeq def = new LSeq(null, Stream.of(rec).collect(Collectors.toList())); return new LProtocol(source, this.mods, this.fullname, this.roles, this.self, this.params, def); @@ -138,12 +137,6 @@ public ReachabilityEnv checkReachability() .checkReachability(new ReachabilityEnv(false, Collections.emptySet())); } - @Override - public LProtocolDecl getSource() - { - return (LProtocolDecl) super.getSource(); - } - @Override public String toString() { diff --git a/scribble-core/src/main/java/org/scribble/type/name/ModuleName.java b/scribble-core/src/main/java/org/scribble/type/name/ModuleName.java index d250feea3..b5c4cf237 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/ModuleName.java +++ b/scribble-core/src/main/java/org/scribble/type/name/ModuleName.java @@ -16,8 +16,8 @@ import java.nio.file.Path; import java.nio.file.Paths; -import org.scribble.ast.Constants; import org.scribble.type.kind.ModuleKind; +import org.scribble.util.Constants; // General name: simple or full (a central class for value comparison) public class ModuleName extends QualifiedName diff --git a/scribble-core/src/main/java/org/scribble/lang/Substitutions.java b/scribble-core/src/main/java/org/scribble/type/name/Substitutions.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/lang/Substitutions.java rename to scribble-core/src/main/java/org/scribble/type/name/Substitutions.java index eea436b01..bc1608ad4 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Substitutions.java +++ b/scribble-core/src/main/java/org/scribble/type/name/Substitutions.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.type.name; import java.util.HashMap; import java.util.Iterator; @@ -19,8 +19,6 @@ import java.util.Map; import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.Role; import org.scribble.type.session.Arg; // CHECKME: move to util? diff --git a/scribble-core/src/main/java/org/scribble/type/session/BasicInteraction.java b/scribble-core/src/main/java/org/scribble/type/session/BasicInteraction.java index 7df8793dd..c2c824b90 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/BasicInteraction.java +++ b/scribble-core/src/main/java/org/scribble/type/session/BasicInteraction.java @@ -17,15 +17,17 @@ import java.util.List; import java.util.Set; -import org.scribble.lang.STypeInliner; +import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public abstract class BasicInteraction extends STypeBase implements SType { - public BasicInteraction(org.scribble.ast.BasicInteraction source) + public BasicInteraction(CommonTree source) { super(source); } @@ -43,7 +45,13 @@ public BasicInteraction pruneRecs() } @Override - public BasicInteraction getInlined(STypeInliner i) + public BasicInteraction getInlined(STypeInliner v) + { + return this; + } + + @Override + public BasicInteraction unfoldAllOnce(STypeUnfolder u) { return this; } @@ -55,8 +63,8 @@ public List> getProtoDependencies() } @Override - public org.scribble.ast.BasicInteraction getSource() + public CommonTree getSource() { - return (org.scribble.ast.BasicInteraction) super.getSource(); + return (CommonTree) super.getSource(); } } diff --git a/scribble-core/src/main/java/org/scribble/type/session/Choice.java b/scribble-core/src/main/java/org/scribble/type/session/Choice.java index c9eef4304..60aa56729 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Choice.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Choice.java @@ -19,6 +19,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.MessageId; @@ -33,7 +34,7 @@ public abstract class Choice> public final List blocks; // Pre: size > 0 // CHECKME: rename? - public Choice(org.scribble.ast.Choice source, Role subj, + public Choice(CommonTree source, Role subj, List blocks) { super(source); @@ -41,8 +42,9 @@ public Choice(org.scribble.ast.Choice source, Role subj, this.blocks = Collections.unmodifiableList(blocks); } - public abstract Choice reconstruct(org.scribble.ast.Choice source, Role subj, + public abstract Choice reconstruct(CommonTree source, Role subj, List blocks); + //List> blocks); @Override public Set getRoles() @@ -66,6 +68,24 @@ public Set getRecVars() .collect(Collectors.toSet()); } + /*@Override + public Choice getInlined(STypeInliner v) + { + CommonTree source = getSource(); // CHECKME: or empty source? + List> blocks = this.blocks.stream().map(x -> x.getInlined(v)) + .collect(Collectors.toList()); + return reconstruct(source, this.subj, blocks); + } + + @Override + public Choice unfoldAllOnce(STypeUnfolder u) + { + CommonTree source = getSource(); // CHECKME: or empty source? + List> blocks = this.blocks.stream().map(x -> x.unfoldAllOnce(u)) + .collect(Collectors.toList()); + return reconstruct(source, this.subj, blocks); + }*/ + @Override public List> getProtoDependencies() { diff --git a/scribble-core/src/main/java/org/scribble/type/session/ConnectAction.java b/scribble-core/src/main/java/org/scribble/type/session/ConnectAction.java index 3ee5c2e60..82d678e87 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/ConnectAction.java +++ b/scribble-core/src/main/java/org/scribble/type/session/ConnectAction.java @@ -16,6 +16,7 @@ import java.util.LinkedList; import java.util.List; +import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.DataType; import org.scribble.type.name.MemberName; @@ -26,7 +27,7 @@ public abstract class ConnectAction extends DirectedInteraction { - public ConnectAction(org.scribble.ast.DirectedInteraction source, // BaseInteractionNode not ideal + public ConnectAction(CommonTree source, // BaseInteractionNode not ideal Role src, Message msg, Role dst) { super(source, src, msg, dst); diff --git a/scribble-core/src/main/java/org/scribble/type/session/Continue.java b/scribble-core/src/main/java/org/scribble/type/session/Continue.java index cd2025e1c..57f868e09 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Continue.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Continue.java @@ -19,15 +19,15 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.ast.ProtocolKindNode; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.Substitutions; +import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.MessageId; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; +import org.scribble.visit.STypeInliner; public abstract class Continue extends STypeBase implements SType @@ -35,7 +35,7 @@ public abstract class Continue public final RecVar recvar; public Continue(//org.scribble.ast.Continue source, - ProtocolKindNode source, // Due to inlining, do -> continue + CommonTree source, // Due to inlining, do -> continue RecVar recvar) { super(source); @@ -43,7 +43,7 @@ public Continue(//org.scribble.ast.Continue source, } public abstract Continue reconstruct( - org.scribble.ast.ProtocolKindNode source, RecVar recvar); + CommonTree source, RecVar recvar); @Override public Set getRoles() @@ -90,17 +90,11 @@ public Continue pruneRecs() } @Override - public Continue getInlined(STypeInliner i) + public Continue getInlined(STypeInliner v) { - RecVar rv = i.getInlinedRecVar(this.recvar); + RecVar rv = v.getInlinedRecVar(this.recvar); return reconstruct(getSource(), rv); } - - @Override - public org.scribble.ast.ProtocolKindNode getSource() - { - return (org.scribble.ast.ProtocolKindNode) super.getSource(); - } @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java index c04bcaa5b..e7fd1ec14 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java @@ -13,17 +13,16 @@ */ package org.scribble.type.session; -import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.lang.Substitutions; -import org.scribble.type.kind.NonRoleParamKind; +import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; // Besides directed-ness, also features a Message public abstract class DirectedInteraction @@ -33,7 +32,7 @@ public abstract class DirectedInteraction public final Message msg; public final Role dst; - public DirectedInteraction(org.scribble.ast.DirectedInteraction source, + public DirectedInteraction(CommonTree source, Role src, Message msg, Role dst) { super(source); @@ -43,7 +42,7 @@ public DirectedInteraction(org.scribble.ast.DirectedInteraction source, } public abstract DirectedInteraction reconstruct( - org.scribble.ast.DirectedInteraction source, Role src, Message msg, + CommonTree source, Role src, Message msg, Role dst); @Override @@ -76,9 +75,9 @@ public DirectedInteraction substitute(Substitutions subs) } @Override - public org.scribble.ast.DirectedInteraction getSource() + public CommonTree getSource() { - return (org.scribble.ast.DirectedInteraction) super.getSource(); + return (CommonTree) super.getSource(); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java index 782eed16d..8849795e0 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java @@ -19,11 +19,12 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.lang.Substitutions; +import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; // Base class would be "SymmetricInteraction" (cf., DirectedInteraction) public abstract class DisconnectAction @@ -32,7 +33,7 @@ public abstract class DisconnectAction public final Role left; public final Role right; - public DisconnectAction(org.scribble.ast.DisconnectAction source, + public DisconnectAction(CommonTree source, Role left, Role right) { super(source); @@ -41,7 +42,7 @@ public DisconnectAction(org.scribble.ast.DisconnectAction source, } public abstract DisconnectAction reconstruct( - org.scribble.ast.DisconnectAction source, Role src, Role dst); + CommonTree source, Role src, Role dst); @Override public Set getRoles() @@ -69,12 +70,6 @@ public List> getNonProtoDependencies() return Collections.emptyList(); } - @Override - public org.scribble.ast.DisconnectAction getSource() - { - return (org.scribble.ast.DisconnectAction) super.getSource(); - } - @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/type/session/Do.java b/scribble-core/src/main/java/org/scribble/type/session/Do.java index 751bdae26..ba8cfe764 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Do.java @@ -21,8 +21,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; +import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.DataType; @@ -32,6 +31,8 @@ import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; +import org.scribble.visit.STypeUnfolder; public abstract class Do> extends STypeBase implements SType @@ -41,7 +42,7 @@ public abstract class Do> public final List> args; // NonRoleParamKind, not NonRoleArgKind, because latter includes AmbigKind due to parsing requirements - public Do(org.scribble.ast.Do source, N proto, + public Do(CommonTree source, N proto, List roles, List> args) { super(source); @@ -50,7 +51,7 @@ public Do(org.scribble.ast.Do source, N proto, this.args = Collections.unmodifiableList(args); } - public abstract Do reconstruct(org.scribble.ast.Do source, + public abstract Do reconstruct(CommonTree source, N proto, List roles, List> args); @Override @@ -114,8 +115,7 @@ else if (a instanceof MessageSigName) } args.add(a); } - return reconstruct((org.scribble.ast.Do) getSource(), this.proto, roles, - args); + return reconstruct(getSource(), this.proto, roles, args); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/session/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/type/session/MessageTransfer.java index 810839ffb..24363d62e 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/type/session/MessageTransfer.java @@ -16,6 +16,7 @@ import java.util.LinkedList; import java.util.List; +import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.DataType; import org.scribble.type.name.GDelegationType; @@ -27,7 +28,7 @@ public abstract class MessageTransfer extends DirectedInteraction { - public MessageTransfer(org.scribble.ast.DirectedInteraction source, // DirectedInteraction not ideal (imprecise) + public MessageTransfer(CommonTree source, Role src, Message msg, Role dst) { super(source, src, msg, dst); diff --git a/scribble-core/src/main/java/org/scribble/type/session/Recursion.java b/scribble-core/src/main/java/org/scribble/type/session/Recursion.java index 25f52ddb5..c72d85cb0 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Recursion.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Set; -import org.scribble.ast.ProtocolKindNode; +import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.MessageId; @@ -31,7 +31,7 @@ public abstract class Recursion> public final B body; public Recursion(//org.scribble.ast.Recursion source, - ProtocolKindNode source, // Due to inlining, protodecl -> rec + CommonTree source, // Due to inlining, protodecl -> rec RecVar recvar, B body) { super(source); @@ -40,7 +40,7 @@ public Recursion(//org.scribble.ast.Recursion source, } public abstract Recursion reconstruct( - org.scribble.ast.ProtocolKindNode source, RecVar recvar, B body); + CommonTree source, RecVar recvar, B body); @Override public Set getRoles() @@ -69,6 +69,33 @@ public SType pruneRecs() : this.body; // i.e., return a Seq, to be "inlined" by Seq.pruneRecs -- N.B. must handle empty Seq case } + /* // CHECKME: try adding B to Seq + Override + public Recursion getInlined(STypeInliner v) + { + CommonTree source = getSource(); // CHECKME: or empty source? + RecVar rv = i.enterRec(//stack.peek(), + this.recvar); // FIXME: make GTypeInliner, and record recvars to check freshness (e.g., rec X in two choice cases) + B body = this.body.getInlined(v); + Recursion res = reconstruct(source, rv, body); + i.exitRec(this.recvar); + return res; + } + + @Override + public GType unfoldAllOnce(STypeUnfolder u) + { + if (!u.hasRec(this.recvar)) // N.B. doesn't work if recvars shadowed + { + u.pushRec(this.recvar, this.body); + GType unf = (GType) this.body.unfoldAllOnce(u); + u.popRec(this.recvar); + // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs + return unf; + } + return this; + }*/ + @Override public List> getProtoDependencies() { diff --git a/scribble-core/src/main/java/org/scribble/type/session/SType.java b/scribble-core/src/main/java/org/scribble/type/session/SType.java index 0b832567f..ea7466170 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/type/session/SType.java @@ -16,23 +16,23 @@ import java.util.List; import java.util.Set; -import org.scribble.ast.ProtocolKindNode; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; +import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.MessageId; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; // CHECKME: move to type.sess? // Generic works to "specialise" G/L subclasses (and works with immutable pattern) -- cf. not supported by contravariant method parameter subtyping for getters/setters public interface SType // CHECKME: consider adding B extends Seq here { boolean hasSource(); // i.e., was parsed - ProtocolKindNode getSource(); // Pre: hasSource + CommonTree getSource(); // Pre: hasSource // Unsupported for Protocol (Protocol should not be an SType) Set getRoles(); diff --git a/scribble-core/src/main/java/org/scribble/type/session/STypeBase.java b/scribble-core/src/main/java/org/scribble/type/session/STypeBase.java index c8ec3ab8c..3285aaa21 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/STypeBase.java +++ b/scribble-core/src/main/java/org/scribble/type/session/STypeBase.java @@ -13,23 +13,22 @@ */ package org.scribble.type.session; -import org.scribble.ast.ProtocolKindNode; +import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.ProtocolKind; // SessTypeBase is to SessType as ScribNodeBase is to ScribNode public abstract class STypeBase implements SType { - private final ProtocolKindNode source; // Currently null for "generated" terms (cf. hasSource) + private final CommonTree source; // Currently null for "generated" terms (cf. hasSource) - public STypeBase(ProtocolKindNode source) + public STypeBase(CommonTree source) { - @SuppressWarnings("unchecked") // FIXME: - ProtocolKindNode clone = (source == null) + /*CommonTree clone = (source == null) ? null - : (ProtocolKindNode) source.clone(); - // ScribNodes are mutable - this.source = clone; + : CommonTree.clone(); // clone not visibile*/ + this.source = source; + // CHECKME: ScribNodes are technically mutable -- though should be treated immutable (defensive copies) post disamb, i.e., in core passes } @Override @@ -40,7 +39,7 @@ public boolean hasSource() // Pre: hasSource @Override - public ProtocolKindNode getSource() + public CommonTree getSource() { return this.source; } diff --git a/scribble-core/src/main/java/org/scribble/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/type/session/Seq.java index c5d8d07cd..663501eb2 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Seq.java @@ -14,32 +14,35 @@ package org.scribble.type.session; import java.util.Collections; +import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import org.scribble.ast.InteractionSeq; -import org.scribble.lang.Substitutions; +import org.antlr.runtime.tree.CommonTree; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.MessageId; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; -// Could add B extends STTypeBase, K>, but it inflates type params quite a bit (e.g., Protocol) +// Could add B extends STypeBase, but it inflates type params quite a bit (e.g., Protocol) public abstract class Seq extends STypeBase { public final List> elems; // GType or LType - public Seq(InteractionSeq source, List> elems) + public Seq(CommonTree source, List> elems) { super(source); this.elems = Collections.unmodifiableList(elems); } - public abstract Seq reconstruct(InteractionSeq source, + public abstract Seq reconstruct(CommonTree source, List> elems); @Override @@ -70,6 +73,46 @@ public Seq substitute(Substitutions subs) .map(x -> x.substitute(subs)).collect(Collectors.toList()); return reconstruct(getSource(), elems); } + + @Override + public Seq getInlined(STypeInliner v) + { + CommonTree source = getSource(); // CHECKME: or empty source? + List> elems = new LinkedList<>(); + for (SType e : this.elems) + { + SType e1 = e.getInlined(v); + if (e1 instanceof Seq) + { + elems.addAll(((Seq) e1).elems); // Inline Seq's returned by Do.getInlined + } + else + { + elems.add(e1); + } + } + return reconstruct(source, elems); + } + + @Override + public Seq unfoldAllOnce(STypeUnfolder u) + { + CommonTree source = getSource(); + List> elems = new LinkedList<>(); + for (SType e : this.elems) + { + SType e1 = e.unfoldAllOnce(u); + if (e1 instanceof Seq) + { + elems.addAll(((Seq) e1).elems); + } + else + { + elems.add(e1); + } + } + return reconstruct(source, elems); + } @Override public List> getProtoDependencies() @@ -92,12 +135,6 @@ public boolean isEmpty() { return this.elems.isEmpty(); } - - @Override - public InteractionSeq getSource() - { - return (InteractionSeq) super.getSource(); - } @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GChoice.java b/scribble-core/src/main/java/org/scribble/type/session/global/GChoice.java index 096c14402..abd2a587a 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GChoice.java @@ -24,30 +24,32 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.Projector; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.Choice; import org.scribble.type.session.local.LChoice; import org.scribble.type.session.local.LSeq; import org.scribble.type.session.local.LSkip; import org.scribble.type.session.local.LType; +import org.scribble.visit.Projector2; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public class GChoice extends Choice implements GType { - public GChoice(org.scribble.ast.Choice source, Role subj, + public GChoice(CommonTree source, Role subj, List blocks) { super(source, subj, blocks); } @Override - public GChoice reconstruct(org.scribble.ast.Choice source, Role subj, + public GChoice reconstruct(CommonTree source, Role subj, List blocks) + //List> blocks) { return new GChoice(source, subj, blocks); } @@ -69,10 +71,10 @@ public GChoice pruneRecs() } @Override - public GChoice getInlined(STypeInliner i )//GTypeTranslator t, Deque stack) + public GChoice getInlined(STypeInliner v) { - org.scribble.ast.global.GChoice source = getSource(); // CHECKME: or empty source? - List blocks = this.blocks.stream().map(x -> x.getInlined(i)) + CommonTree source = getSource(); // CHECKME: or empty source? + List blocks = this.blocks.stream().map(x -> x.getInlined(v)) .collect(Collectors.toList()); return reconstruct(source, this.subj, blocks); } @@ -80,7 +82,7 @@ public GChoice getInlined(STypeInliner i )//GTypeTranslator t, Deque u) { - org.scribble.ast.global.GChoice source = getSource(); // CHECKME: or empty source? + CommonTree source = getSource(); // CHECKME: or empty source? List blocks = this.blocks.stream().map(x -> x.unfoldAllOnce(u)) .collect(Collectors.toList()); return reconstruct(source, this.subj, blocks); @@ -108,7 +110,7 @@ private LType projectAux(Role self, Stream blocks) } @Override - public LType project(Projector v) + public LType project(Projector2 v) { return projectAux(v.self, this.blocks.stream().map(x -> x.project(v))); } @@ -183,12 +185,6 @@ public Map checkConnections(Map conns) // FIXME: but unconnected error needs "must" connections; also "duplicate" disconnect }*/ - @Override - public org.scribble.ast.global.GChoice getSource() - { - return (org.scribble.ast.global.GChoice) super.getSource(); - } - @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java b/scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java index 286498a56..f808a9f64 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java @@ -19,25 +19,26 @@ import java.util.Map; import java.util.Set; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.Projector; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.ConnectAction; import org.scribble.type.session.Message; import org.scribble.type.session.local.LAcc; import org.scribble.type.session.local.LReq; import org.scribble.type.session.local.LSkip; import org.scribble.type.session.local.LType; +import org.scribble.visit.Projector2; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public class GConnect extends ConnectAction implements GType { - public GConnect(org.scribble.ast.DirectedInteraction source, // DirectedInteraction not ideal (imprecise) + public GConnect(CommonTree source, // DirectedInteraction not ideal (imprecise) Role src, Message msg, Role dst) { super(source, src, msg, dst); @@ -45,7 +46,7 @@ public GConnect(org.scribble.ast.DirectedInteraction source, // Directe @Override public GConnect reconstruct( - org.scribble.ast.DirectedInteraction source, Role src, Message msg, + CommonTree source, Role src, Message msg, Role dst) { return new GConnect(source, src, msg, dst); @@ -58,15 +59,15 @@ public GConnect substitute(Substitutions subs) } @Override - public GConnect getInlined(STypeInliner i)//, Deque stack) + public GConnect getInlined(STypeInliner v) { - return (GConnect) super.getInlined(i); + return (GConnect) super.getInlined(v); } @Override public GConnect unfoldAllOnce(STypeUnfolder u) { - return this; + return (GConnect) super.unfoldAllOnce(u); } @Override @@ -91,7 +92,7 @@ else if (this.dst.equals(self)) } @Override - public LType project(Projector v) + public LType project(Projector2 v) { return projectInlined(v.self); // No need for "aux", no recursive call } diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java b/scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java index a4e746ff8..1996c7d38 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java @@ -16,29 +16,29 @@ import java.util.Map; import java.util.Set; -import org.scribble.ast.ProtocolKindNode; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.Projector; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.Continue; import org.scribble.type.session.local.LContinue; +import org.scribble.visit.Projector2; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public class GContinue extends Continue implements GType { public GContinue(//org.scribble.ast.Continue source, - ProtocolKindNode source, // Due to inlining, do -> continue + CommonTree source, // Due to inlining, do -> continue RecVar recvar) { super(source, recvar); } @Override - public GContinue reconstruct(org.scribble.ast.ProtocolKindNode source, + public GContinue reconstruct(CommonTree source, RecVar recvar) { return new GContinue(source, recvar); @@ -57,9 +57,9 @@ public GContinue pruneRecs() } @Override - public GContinue getInlined(STypeInliner i)//, Deque stack) + public GContinue getInlined(STypeInliner v) { - return (GContinue) super.getInlined(i); + return (GContinue) super.getInlined(v); } @Override @@ -77,7 +77,7 @@ public LContinue projectInlined(Role self) } @Override - public LContinue project(Projector v) + public LContinue project(Projector2 v) { return projectInlined(v.self); // No need for "aux", no recursive call } diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java b/scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java index 50d9c84e9..3dbd7c0d6 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java @@ -16,23 +16,24 @@ import java.util.Map; import java.util.Set; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.Projector; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.DisconnectAction; import org.scribble.type.session.local.LDisconnect; import org.scribble.type.session.local.LSkip; import org.scribble.type.session.local.LType; +import org.scribble.visit.Projector2; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public class GDisconnect extends DisconnectAction implements GType { - public GDisconnect(org.scribble.ast.DisconnectAction source, + public GDisconnect(CommonTree source, Role left, Role right) { super(source, left, right); @@ -40,7 +41,7 @@ public GDisconnect(org.scribble.ast.DisconnectAction source, @Override public GDisconnect reconstruct( - org.scribble.ast.DisconnectAction source, Role left, Role right) + CommonTree source, Role left, Role right) { return new GDisconnect(source, left, right); } @@ -52,15 +53,15 @@ public GDisconnect substitute(Substitutions subs) } @Override - public GDisconnect getInlined(STypeInliner i)//, Deque stack) + public GDisconnect getInlined(STypeInliner v) { - return (GDisconnect) super.getInlined(i); + return (GDisconnect) super.getInlined(v); } @Override public GDisconnect unfoldAllOnce(STypeUnfolder u) { - return this; + return (GDisconnect) super.unfoldAllOnce(u); } @Override @@ -85,7 +86,7 @@ else if (this.right.equals(self)) } @Override - public LType project(Projector v) + public LType project(Projector2 v) { return projectInlined(v.self); // No need for "aux", no recursive call } diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java b/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java index 8f8af880b..25b83c502 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java @@ -19,12 +19,10 @@ import java.util.Set; import java.util.stream.Collectors; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.JobContext2; import org.scribble.job.ScribbleException; -import org.scribble.lang.Projector; -import org.scribble.lang.STypeInliner; import org.scribble.lang.SubprotoSig; -import org.scribble.lang.Substitutions; import org.scribble.lang.global.GProtocol; import org.scribble.type.kind.Global; import org.scribble.type.kind.NonRoleParamKind; @@ -32,22 +30,25 @@ import org.scribble.type.name.LProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.Arg; import org.scribble.type.session.Do; import org.scribble.type.session.local.LDo; import org.scribble.type.session.local.LSkip; import org.scribble.type.session.local.LType; +import org.scribble.visit.Projector2; +import org.scribble.visit.STypeInliner; public class GDo extends Do implements GType { - public GDo(org.scribble.ast.Do source, GProtocolName proto, + public GDo(CommonTree source, GProtocolName proto, List roles, List> args) { super(source, proto, roles, args); } @Override - public GDo reconstruct(org.scribble.ast.Do source, + public GDo reconstruct(CommonTree source, GProtocolName proto, List roles, List> args) { @@ -68,22 +69,22 @@ public GDo pruneRecs() // CHECKME: factor up to base? @Override - public GType getInlined(STypeInliner i)//, Deque stack) + public GType getInlined(STypeInliner v) { GProtocolName fullname = this.proto; SubprotoSig sig = new SubprotoSig(fullname, this.roles, this.args); - RecVar rv = i.getInlinedRecVar(sig); - if (i.hasSig(sig)) + RecVar rv = v.getInlinedRecVar(sig); + if (v.hasSig(sig)) { return new GContinue(getSource(), rv); } - i.pushSig(sig); - GProtocol g = i.job.getContext().getIntermediate(fullname); + v.pushSig(sig); + GProtocol g = v.job.getContext().getIntermediate(fullname); Substitutions subs = new Substitutions(g.roles, this.roles, g.params, this.args); - GSeq inlined = g.def.substitute(subs).getInlined(i);//, stack); + GSeq inlined = g.def.substitute(subs).getInlined(v);//, stack); // i.e. returning a GSeq -- rely on parent GSeq to inline - i.popSig(); + v.popSig(); return new GRecursion(null, rv, inlined); } @@ -94,7 +95,7 @@ public LType projectInlined(Role self) } @Override - public LType project(Projector v) + public LType project(Projector2 v) { if (!this.roles.contains(v.self)) { @@ -112,12 +113,12 @@ public LType project(Projector v) return LSkip.SKIP; } - LProtocolName fullname = org.scribble.visit.context.Projector - .projectFullProtocolName(this.proto, targSelf); + LProtocolName fullname = Projector2.projectFullProtocolName(this.proto, + targSelf); Substitutions subs = new Substitutions(imed.roles, this.roles, Collections.emptyList(), Collections.emptyList()); - List used = jobc.getInlined(this.proto).roles.stream().map(x -> subs.subsRole(x)) - .collect(Collectors.toList()); + List used = jobc.getInlined(this.proto).roles.stream() + .map(x -> subs.subsRole(x)).collect(Collectors.toList()); List rs = this.roles.stream().filter(x -> used.contains(x)) .map(x -> x.equals(v.self) ? Role.SELF : x) // CHECKME: "self" also explcitily used for Choice, but implicitly for MessageTransfer, inconsistent? @@ -138,12 +139,6 @@ public Map checkExtChoiceConsistency(Map enablers) throw new RuntimeException("Unsupported for Do: " + this); } - @Override - public org.scribble.ast.global.GDo getSource() - { - return (org.scribble.ast.global.GDo) super.getSource(); - } - @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java index 546e0c5f0..8c61120d4 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java @@ -19,25 +19,26 @@ import java.util.Map; import java.util.Set; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.Projector; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.Message; import org.scribble.type.session.MessageTransfer; import org.scribble.type.session.local.LRcv; import org.scribble.type.session.local.LSend; import org.scribble.type.session.local.LSkip; import org.scribble.type.session.local.LType; +import org.scribble.visit.Projector2; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public class GMessageTransfer extends MessageTransfer implements GType { - public GMessageTransfer(org.scribble.ast.DirectedInteraction source, + public GMessageTransfer(CommonTree source, Role src, Message msg, Role dst) { super(source, src, msg, dst); @@ -45,7 +46,7 @@ public GMessageTransfer(org.scribble.ast.DirectedInteraction source, @Override public GMessageTransfer reconstruct( - org.scribble.ast.DirectedInteraction source, Role src, Message msg, + CommonTree source, Role src, Message msg, Role dst) { return new GMessageTransfer(source, src, msg, dst); @@ -58,15 +59,15 @@ public GMessageTransfer substitute(Substitutions subs) } @Override - public GMessageTransfer getInlined(STypeInliner i)//, Deque stack) + public GMessageTransfer getInlined(STypeInliner v) { - return (GMessageTransfer) super.getInlined(i); + return (GMessageTransfer) super.getInlined(v); } @Override public GMessageTransfer unfoldAllOnce(STypeUnfolder u) { - return this; + return (GMessageTransfer) super.unfoldAllOnce(u); } @Override @@ -91,7 +92,7 @@ else if (this.dst.equals(self)) } @Override - public LType project(Projector v) + public LType project(Projector2 v) { return projectInlined(v.self); // No need for "aux", no recursive call } diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/type/session/global/GRecursion.java index 0de3a696b..ca793294d 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GRecursion.java @@ -17,32 +17,32 @@ import java.util.Map; import java.util.Set; -import org.scribble.ast.ProtocolKindNode; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.Projector; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.Recursion; import org.scribble.type.session.local.LRecursion; import org.scribble.type.session.local.LSeq; import org.scribble.type.session.local.LSkip; import org.scribble.type.session.local.LType; +import org.scribble.visit.Projector2; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public class GRecursion extends Recursion implements GType { public GRecursion(//org.scribble.ast.Recursion source, - ProtocolKindNode source, // Due to inlining, protocoldecl -> rec + CommonTree source, // Due to inlining, protocoldecl -> rec RecVar recvar, GSeq body) { super(source, recvar, body); } @Override - public GRecursion reconstruct(org.scribble.ast.ProtocolKindNode source, + public GRecursion reconstruct(CommonTree source, RecVar recvar, GSeq block) { return new GRecursion(source, recvar, block); @@ -55,14 +55,14 @@ public GRecursion substitute(Substitutions subs) } @Override - public GRecursion getInlined(STypeInliner i)//, Deque stack) + public GRecursion getInlined(STypeInliner v) { - org.scribble.ast.ProtocolKindNode source = getSource(); // CHECKME: or empty source? - RecVar rv = i.enterRec(//stack.peek(), + CommonTree source = getSource(); // CHECKME: or empty source? + RecVar rv = v.enterRec(//stack.peek(), this.recvar); // FIXME: make GTypeInliner, and record recvars to check freshness (e.g., rec X in two choice cases) - GSeq body = this.body.getInlined(i);//, stack); + GSeq body = this.body.getInlined(v);//, stack); GRecursion res = reconstruct(source, rv, body); - i.exitRec(this.recvar); + v.exitRec(this.recvar); return res; } @@ -110,7 +110,7 @@ private LType projectAux(LSeq body) } @Override - public LType project(Projector v) + public LType project(Projector2 v) { LSeq body = this.body.project(v); return projectAux(body); diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java b/scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java index 3f109f197..40d2da0ec 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java @@ -20,32 +20,31 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.ast.InteractionSeq; -import org.scribble.ast.global.GInteractionSeq; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.Projector; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.SType; import org.scribble.type.session.Seq; import org.scribble.type.session.local.LSeq; import org.scribble.type.session.local.LSkip; import org.scribble.type.session.local.LType; +import org.scribble.visit.Projector2; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public class GSeq extends Seq implements GType { // GInteractionSeq or GBlock better as source? - public GSeq(InteractionSeq source, + public GSeq(CommonTree source, List> elems) { super(source, elems); } @Override - public GSeq reconstruct(InteractionSeq source, + public GSeq reconstruct(CommonTree source, List> elems) { return new GSeq(source, elems); @@ -77,17 +76,18 @@ public GSeq pruneRecs() } @Override - public GSeq getInlined(STypeInliner i)// , Deque stack) + public GSeq getInlined(STypeInliner v) { - GInteractionSeq source = getSource(); // CHECKME: or empty source? + return (GSeq) super.getInlined(v); + } + /*CommonTree source = getSource(); // CHECKME: or empty source? List> elems = new LinkedList<>(); for (SType e : this.elems) { SType e1 = e.getInlined(i);// , stack); if (e1 instanceof GSeq) { - elems.addAll(((GSeq) e1).elems); // Inline GSeq's returned by - // GDo::getInlined + elems.addAll(((GSeq) e1).elems); // Inline GSeq's returned by GDo::getInlined } else { @@ -95,12 +95,12 @@ public GSeq getInlined(STypeInliner i)// , Deque stack) } } return reconstruct(source, elems); - } + }*/ @Override public GSeq unfoldAllOnce(STypeUnfolder u) { - GInteractionSeq source = getSource(); + CommonTree source = getSource(); List> elems = new LinkedList<>(); for (SType e : this.elems) { @@ -135,7 +135,7 @@ private LSeq projectAux(Stream elems) } @Override - public LSeq project(Projector v) + public LSeq project(Projector2 v) { return projectAux(this.elems.stream() .map(x -> ((GType) x).project(v))); @@ -179,12 +179,6 @@ public List getElements() return this.elems.stream().map(x -> (GType) x).collect(Collectors.toList()); } - @Override - public GInteractionSeq getSource() - { - return (GInteractionSeq) super.getSource(); - } - @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GType.java b/scribble-core/src/main/java/org/scribble/type/session/global/GType.java index 3aad9cb92..377eadef8 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GType.java @@ -17,18 +17,18 @@ import java.util.Set; import org.scribble.job.ScribbleException; -import org.scribble.lang.Projector; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; import org.scribble.type.session.SType; import org.scribble.type.session.local.LType; +import org.scribble.visit.Projector2; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public interface GType extends SType { LType projectInlined(Role self); // Use on inlined (i.e., Do inlined, roles pruned) - LType project(Projector v); // Use on parsed (intermed) + LType project(Projector2 v); // Use on parsed (intermed) // Pre: use on inlined or later (unsupported for Do, also Protocol) // enabled treated immutably diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java b/scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java index fd0516e87..258967d4f 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java @@ -15,27 +15,27 @@ import java.util.Set; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.ConnectAction; import org.scribble.type.session.Message; import org.scribble.type.session.MessageSig; import org.scribble.type.session.Payload; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; -public class LAcc extends ConnectAction - implements LType +public class LAcc extends ConnectAction implements LType { // this.dst == Role.SELF - public LAcc(org.scribble.ast.DirectedInteraction source, + public LAcc(CommonTree source, Role src, Message msg) { super(source, src, msg, Role.SELF); @@ -44,7 +44,7 @@ public LAcc(org.scribble.ast.DirectedInteraction source, // FIXME: unnecessary dst @Override public LAcc reconstruct( - org.scribble.ast.DirectedInteraction source, Role src, Message msg, + CommonTree source, Role src, Message msg, Role dst) { return new LAcc(source, src, msg); @@ -69,15 +69,15 @@ public LAcc substitute(Substitutions subs) } @Override - public LAcc getInlined(STypeInliner i)//, Deque stack) + public LAcc getInlined(STypeInliner v) { - return (LAcc) super.getInlined(i); + return (LAcc) super.getInlined(v); } @Override public LAcc unfoldAllOnce(STypeUnfolder u) { - return this; + return (LAcc) super.unfoldAllOnce(u); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java b/scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java index f651f540b..a6b086cd9 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java @@ -19,10 +19,8 @@ import java.util.Set; import java.util.stream.Collectors; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.model.endpoint.EState; @@ -30,18 +28,21 @@ import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.Choice; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public class LChoice extends Choice implements LType { - public LChoice(org.scribble.ast.Choice source, Role subj, + public LChoice(CommonTree source, Role subj, List blocks) { super(source, subj, blocks); } @Override - public LChoice reconstruct(org.scribble.ast.Choice source, Role subj, + public LChoice reconstruct(CommonTree source, Role subj, List blocks) { return new LChoice(source, subj, blocks); @@ -78,10 +79,10 @@ public LChoice pruneRecs() } @Override - public LChoice getInlined(STypeInliner i )//GTypeTranslator t, Deque stack) + public LChoice getInlined(STypeInliner v) { - org.scribble.ast.local.LChoice source = getSource(); // CHECKME: or empty source? - List blocks = this.blocks.stream().map(x -> x.getInlined(i)) + CommonTree source = getSource(); // CHECKME: or empty source? + List blocks = this.blocks.stream().map(x -> x.getInlined(v)) .collect(Collectors.toList()); return reconstruct(source, this.subj, blocks); } @@ -89,7 +90,7 @@ public LChoice getInlined(STypeInliner i )//GTypeTranslator t, Deque u) { - org.scribble.ast.local.LChoice source = getSource(); // CHECKME: or empty source? + CommonTree source = getSource(); // CHECKME: or empty source? List blocks = this.blocks.stream().map(x -> x.unfoldAllOnce(u)) .collect(Collectors.toList()); return reconstruct(source, this.subj, blocks); @@ -188,12 +189,6 @@ public List getBlocks() { return this.blocks; }*/ - - @Override - public org.scribble.ast.local.LChoice getSource() - { - return (org.scribble.ast.local.LChoice) super.getSource(); - } @Override public int hashCode() diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java b/scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java index 1e399bed4..0ec0e56ee 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java @@ -17,30 +17,30 @@ import java.util.LinkedList; import java.util.Set; -import org.scribble.ast.ProtocolKindNode; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.Continue; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public class LContinue extends Continue implements LType { public LContinue(//org.scribble.ast.Continue source, - ProtocolKindNode source, // Due to inlining, do -> continue + CommonTree source, // Due to inlining, do -> continue RecVar recvar) { super(source, recvar); } @Override - public LContinue reconstruct(org.scribble.ast.ProtocolKindNode source, + public LContinue reconstruct(CommonTree source, RecVar recvar) { return new LContinue(source, recvar); @@ -65,9 +65,9 @@ public LContinue substitute(Substitutions subs) } @Override - public LContinue getInlined(STypeInliner i)//, Deque stack) + public LContinue getInlined(STypeInliner v) { - return (LContinue) super.getInlined(i); + return (LContinue) super.getInlined(v); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java b/scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java index b22241ba7..61a07f281 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java @@ -15,23 +15,24 @@ import java.util.Set; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.DisconnectAction; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public class LDisconnect extends DisconnectAction implements LType { // this.src == Role.SELF - public LDisconnect(org.scribble.ast.DisconnectAction source, + public LDisconnect(CommonTree source, Role peer) { super(source, Role.SELF, peer); @@ -45,7 +46,7 @@ public Role getPeer() // CHECKME: remove unnecessary self ? @Override public LDisconnect reconstruct( - org.scribble.ast.DisconnectAction source, Role self, Role peer) + CommonTree source, Role self, Role peer) { return new LDisconnect(source, peer); } @@ -69,15 +70,15 @@ public LDisconnect substitute(Substitutions subs) } @Override - public LDisconnect getInlined(STypeInliner i)//, Deque stack) + public LDisconnect getInlined(STypeInliner v) { - return (LDisconnect) super.getInlined(i); + return (LDisconnect) super.getInlined(v); } @Override public LDisconnect unfoldAllOnce(STypeUnfolder u) { - return this; + return (LDisconnect) super.unfoldAllOnce(u); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LDo.java b/scribble-core/src/main/java/org/scribble/type/session/local/LDo.java index 98a62d8c3..3d678e488 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LDo.java @@ -16,10 +16,9 @@ import java.util.List; import java.util.Set; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.STypeInliner; import org.scribble.lang.SubprotoSig; -import org.scribble.lang.Substitutions; import org.scribble.lang.local.LProtocol; import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; @@ -28,19 +27,21 @@ import org.scribble.type.name.LProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.Arg; import org.scribble.type.session.Do; +import org.scribble.visit.STypeInliner; public class LDo extends Do implements LType { - public LDo(org.scribble.ast.Do source, LProtocolName proto, + public LDo(CommonTree source, LProtocolName proto, List roles, List> args) { super(source, proto, roles, args); } @Override - public LDo reconstruct(org.scribble.ast.Do source, + public LDo reconstruct(CommonTree source, LProtocolName proto, List roles, List> args) { @@ -80,31 +81,25 @@ public LDo substitute(Substitutions subs) // CHECKME: factor up to base? @Override - public LType getInlined(STypeInliner i) + public LType getInlined(STypeInliner v) { LProtocolName fullname = this.proto; SubprotoSig sig = new SubprotoSig(fullname, this.roles, this.args); - RecVar rv = i.getInlinedRecVar(sig); - if (i.hasSig(sig)) + RecVar rv = v.getInlinedRecVar(sig); + if (v.hasSig(sig)) { return new LContinue(getSource(), rv); } - i.pushSig(sig); - LProtocol p = i.job.getContext().getProjection(fullname); // This line differs from GDo version + v.pushSig(sig); + LProtocol p = v.job.getContext().getProjection(fullname); // This line differs from GDo version Substitutions subs = new Substitutions(p.roles, this.roles, p.params, this.args); - LSeq inlined = p.def.substitute(subs).getInlined(i);//, stack); + LSeq inlined = p.def.substitute(subs).getInlined(v);//, stack); // i.e. returning a Seq -- rely on parent Seq to inline - i.popSig(); + v.popSig(); return new LRecursion(null, rv, inlined); } - @Override - public org.scribble.ast.local.LDo getSource() - { - return (org.scribble.ast.local.LDo) super.getSource(); - } - @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java b/scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java index 905a029c1..0a34d3a92 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java @@ -15,27 +15,28 @@ import java.util.Set; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.Message; import org.scribble.type.session.MessageSig; import org.scribble.type.session.MessageTransfer; import org.scribble.type.session.Payload; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public class LRcv extends MessageTransfer implements LType { // this.dst == Role.SELF - public LRcv(org.scribble.ast.DirectedInteraction source, + public LRcv(CommonTree source, Role src, Message msg) { super(source, src, msg, Role.SELF); @@ -44,7 +45,7 @@ public LRcv(org.scribble.ast.DirectedInteraction source, // FIXME: unnecessary dst @Override public LRcv reconstruct( - org.scribble.ast.DirectedInteraction source, Role src, Message msg, + CommonTree source, Role src, Message msg, Role dst) { return new LRcv(source, src, msg); @@ -69,15 +70,15 @@ public LRcv substitute(Substitutions subs) } @Override - public LRcv getInlined(STypeInliner i)//, Deque stack) + public LRcv getInlined(STypeInliner v) { - return (LRcv) super.getInlined(i); + return (LRcv) super.getInlined(v); } @Override public LRcv unfoldAllOnce(STypeUnfolder u) { - return this; + return (LRcv) super.unfoldAllOnce(u); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java index 0f2e18fe4..c6f1ad208 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java @@ -16,28 +16,28 @@ import java.util.HashSet; import java.util.Set; -import org.scribble.ast.ProtocolKindNode; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.Recursion; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public class LRecursion extends Recursion implements LType { public LRecursion(//org.scribble.ast.Recursion source, - ProtocolKindNode source, // Due to inlining, protocoldecl -> rec + CommonTree source, // Due to inlining, protocoldecl -> rec RecVar recvar, LSeq body) { super(source, recvar, body); } @Override - public LRecursion reconstruct(org.scribble.ast.ProtocolKindNode source, + public LRecursion reconstruct(CommonTree source, RecVar recvar, LSeq block) { return new LRecursion(source, recvar, block); @@ -64,14 +64,14 @@ public LRecursion substitute(Substitutions subs) } @Override - public LRecursion getInlined(STypeInliner i)//, Deque stack) + public LRecursion getInlined(STypeInliner v) { - org.scribble.ast.ProtocolKindNode source = getSource(); // CHECKME: or empty source? - RecVar rv = i.enterRec(//stack.peek(), + CommonTree source = getSource(); // CHECKME: or empty source? + RecVar rv = v.enterRec(//stack.peek(), this.recvar); // FIXME: make GTypeInliner, and record recvars to check freshness (e.g., rec X in two choice cases) - LSeq body = this.body.getInlined(i);//, stack); + LSeq body = this.body.getInlined(v);//, stack); LRecursion res = reconstruct(source, rv, body); - i.exitRec(this.recvar); + v.exitRec(this.recvar); return res; } diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LReq.java b/scribble-core/src/main/java/org/scribble/type/session/local/LReq.java index ee4bf813d..8c613085e 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LReq.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LReq.java @@ -15,27 +15,28 @@ import java.util.Set; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.ConnectAction; import org.scribble.type.session.Message; import org.scribble.type.session.MessageSig; import org.scribble.type.session.Payload; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public class LReq extends ConnectAction implements LType { // this.src == Role.SELF - public LReq(org.scribble.ast.DirectedInteraction source, + public LReq(CommonTree source, Message msg, Role dst) { super(source, Role.SELF, msg, dst); @@ -44,7 +45,7 @@ public LReq(org.scribble.ast.DirectedInteraction source, // CHECKME: remove unnecessary src ? @Override public LReq reconstruct( - org.scribble.ast.DirectedInteraction source, Role src, Message msg, + CommonTree source, Role src, Message msg, Role dst) { return new LReq(source, msg, dst); @@ -69,15 +70,15 @@ public LReq substitute(Substitutions subs) } @Override - public LReq getInlined(STypeInliner i)//, Deque stack) + public LReq getInlined(STypeInliner v) { - return (LReq) super.getInlined(i); + return (LReq) super.getInlined(v); } @Override public LReq unfoldAllOnce(STypeUnfolder u) { - return this; + return (LReq) super.unfoldAllOnce(u); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LSend.java b/scribble-core/src/main/java/org/scribble/type/session/local/LSend.java index c03a8ee06..c2e46a1c3 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LSend.java @@ -15,27 +15,28 @@ import java.util.Set; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.Message; import org.scribble.type.session.MessageSig; import org.scribble.type.session.MessageTransfer; import org.scribble.type.session.Payload; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public class LSend extends MessageTransfer implements LType { // this.src == Role.SELF - public LSend(org.scribble.ast.DirectedInteraction source, + public LSend(CommonTree source, Message msg, Role dst) { super(source, Role.SELF, msg, dst); @@ -44,7 +45,7 @@ public LSend(org.scribble.ast.DirectedInteraction source, // CHECKME: remove unnecessary src ? @Override public LSend reconstruct( - org.scribble.ast.DirectedInteraction source, Role src, Message msg, + CommonTree source, Role src, Message msg, Role dst) { return new LSend(source, msg, dst); @@ -69,15 +70,15 @@ public LSend substitute(Substitutions subs) } @Override - public LSend getInlined(STypeInliner i)//, Deque stack) + public LSend getInlined(STypeInliner v) { - return (LSend) super.getInlined(i); + return (LSend) super.getInlined(v); } @Override public LSend unfoldAllOnce(STypeUnfolder u) { - return this; + return (LSend) super.unfoldAllOnce(u); } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java b/scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java index ed8d98ef8..051bb9c31 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java @@ -20,30 +20,29 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.ast.InteractionSeq; -import org.scribble.ast.local.LInteractionSeq; +import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.model.endpoint.EState; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.SType; import org.scribble.type.session.Seq; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public class LSeq extends Seq implements LType { // GInteractionSeq or GBlock better as source? - public LSeq(InteractionSeq source, List> elems) + public LSeq(CommonTree source, List> elems) { super(source, elems); } @Override - public LSeq reconstruct(InteractionSeq source, + public LSeq reconstruct(CommonTree source, List> elems) { return new LSeq(source, elems); @@ -89,9 +88,11 @@ public LSeq pruneRecs() } @Override - public LSeq getInlined(STypeInliner i)//, Deque stack) + public LSeq getInlined(STypeInliner v) { - LInteractionSeq source = getSource(); // CHECKME: or empty source? + return (LSeq) super.getInlined(v); + } + /*CommonTree source = getSource(); // CHECKME: or empty source? List> elems = new LinkedList<>(); for (SType e : this.elems) { @@ -106,12 +107,12 @@ public LSeq getInlined(STypeInliner i)//, Deque stack) } } return reconstruct(source, elems); - } + }*/ @Override public LSeq unfoldAllOnce(STypeUnfolder u) { - LInteractionSeq source = getSource(); + CommonTree source = getSource(); List> elems = new LinkedList<>(); for (SType e : this.elems) { @@ -183,12 +184,6 @@ public List getElements() { return this.elems.stream().map(x -> (LType) x).collect(Collectors.toList()); } - - @Override - public LInteractionSeq getSource() - { - return (LInteractionSeq) super.getSource(); - } @Override public int hashCode() diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java index 56ecb2816..57ae56d9f 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java @@ -17,9 +17,6 @@ import java.util.Set; import org.scribble.job.ScribbleException; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; -import org.scribble.lang.Substitutions; import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; @@ -28,7 +25,10 @@ import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; import org.scribble.type.session.STypeBase; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; // Used only *during* projection -- filtered out by GSeq::projection public class LSkip extends STypeBase implements LType @@ -107,12 +107,6 @@ public LType unfoldAllOnce(STypeUnfolder u) throw new RuntimeException("Unsupported for Skip: " + this); } - @Override - public org.scribble.ast.local.LNode getSource() - { - return null; - } - @Override public void buildGraph(EGraphBuilderUtil2 b) { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LType.java b/scribble-core/src/main/java/org/scribble/type/session/local/LType.java index c46017059..3499b7d15 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LType.java @@ -16,13 +16,13 @@ import java.util.Set; import org.scribble.job.ScribbleException; -import org.scribble.lang.STypeInliner; -import org.scribble.lang.STypeUnfolder; import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; import org.scribble.type.session.SType; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public interface LType extends SType { diff --git a/scribble-core/src/main/java/org/scribble/ast/Constants.java b/scribble-core/src/main/java/org/scribble/util/Constants.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/Constants.java rename to scribble-core/src/main/java/org/scribble/util/Constants.java index fb62cde91..d908f2104 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Constants.java +++ b/scribble-core/src/main/java/org/scribble/util/Constants.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.ast; +package org.scribble.util; // FIXME: cannot use AntlrConstants from org.scribble.parser due to Maven dependency restrictions diff --git a/scribble-core/src/main/java/org/scribble/util/ScribUtil.java b/scribble-core/src/main/java/org/scribble/util/ScribUtil2.java similarity index 67% rename from scribble-core/src/main/java/org/scribble/util/ScribUtil.java rename to scribble-core/src/main/java/org/scribble/util/ScribUtil2.java index 5a220b256..b822d2574 100644 --- a/scribble-core/src/main/java/org/scribble/util/ScribUtil.java +++ b/scribble-core/src/main/java/org/scribble/util/ScribUtil2.java @@ -19,52 +19,13 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.util.List; import java.util.concurrent.Callable; -import java.util.stream.Collectors; -import org.scribble.ast.AstFactory; -import org.scribble.ast.ScribNode; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; -public class ScribUtil +public class ScribUtil2 { - // Strict class equality, cf. ScribNodeBase#visitChildWithClassCheck - // C is expected to be of a ground class type - // Maybe pointless (in terms of formal guarantees) to use equality instead of assignable - public static C checkNodeClassEquality(C c, ScribNode n) - { - if (!c.getClass().equals(n.getClass())) - { - throw new RuntimeException( - "Node class not equal: " + c.getClass() + ", " + n.getClass()); - } - @SuppressWarnings("unchecked") - C tmp = (C) n; - return tmp; - } - - // C is expected to be of a ground class type - public static C castNodeByClass(C cast, ScribNode n) - { - if (!cast.getClass().isAssignableFrom(n.getClass())) - { - throw new RuntimeException( - "Node class cast error: " + cast.getClass() + ", " + n.getClass()); - } - @SuppressWarnings("unchecked") - C tmp = (C) n; - return tmp; - } - - public static List cloneList(AstFactory af, - List ns) - { - return ns.stream().map(n -> checkNodeClassEquality(n, // n.clone(af))) - n.clone())).collect(Collectors.toList()); - } - public static T handleLambdaScribbleException(Callable c) { try diff --git a/scribble-core/src/main/java/org/scribble/visit/Projector2.java b/scribble-core/src/main/java/org/scribble/visit/Projector2.java new file mode 100644 index 000000000..3bedc27d3 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/visit/Projector2.java @@ -0,0 +1,58 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.visit; + +import org.scribble.job.Job2; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.LProtocolName; +import org.scribble.type.name.ModuleName; +import org.scribble.type.name.Role; + +public class Projector2 +{ + public final Job2 job; + public final Role self; + + public Projector2(Job2 job, Role self) + { + this.job = job; + this.self = self; + } + + public static LProtocolName projectSimpleProtocolName(GProtocolName simpname, + Role role) + { + return new LProtocolName(simpname.toString() + "_" + role.toString()); + } + + // Role is the target subprotocol parameter (not the current projector self -- actually the self just popped) + public static LProtocolName projectFullProtocolName(GProtocolName fullname, + Role role) + { + LProtocolName simplename = projectSimpleProtocolName( + fullname.getSimpleName(), role); + ModuleName modname = projectModuleName(fullname.getPrefix(), simplename); + return new LProtocolName(modname, simplename); + } + + // fullname is the un-projected name; localname is the already projected simple name + public static ModuleName projectModuleName(ModuleName fullname, + LProtocolName localname) + { + ModuleName simpname = new ModuleName( + fullname.getSimpleName().toString() + "_" + localname.toString()); + return new ModuleName(fullname.getPrefix(), simpname); // Supports unary + // fullname + } +} diff --git a/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java b/scribble-core/src/main/java/org/scribble/visit/STypeInliner.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/lang/STypeInliner.java rename to scribble-core/src/main/java/org/scribble/visit/STypeInliner.java index ff6f30059..5c4af95c0 100644 --- a/scribble-core/src/main/java/org/scribble/lang/STypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/visit/STypeInliner.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.visit; import java.util.Deque; import java.util.HashMap; @@ -20,6 +20,7 @@ import java.util.stream.Collectors; import org.scribble.job.Job2; +import org.scribble.lang.SubprotoSig; import org.scribble.type.name.RecVar; public class STypeInliner diff --git a/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/visit/STypeUnfolder.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java rename to scribble-core/src/main/java/org/scribble/visit/STypeUnfolder.java index 1a986a9ef..0cac4857c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/visit/STypeUnfolder.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.visit; import java.util.HashMap; import java.util.Map; diff --git a/scribble-core/src/main/java/org/scribble/ast/AstFactory.java b/scribble-lang/src/main/java/org/scribble/ast/AstFactory.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/AstFactory.java rename to scribble-lang/src/main/java/org/scribble/ast/AstFactory.java diff --git a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-lang/src/main/java/org/scribble/ast/AstFactoryImpl.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java rename to scribble-lang/src/main/java/org/scribble/ast/AstFactoryImpl.java diff --git a/scribble-core/src/main/java/org/scribble/ast/AuxMod.java b/scribble-lang/src/main/java/org/scribble/ast/AuxMod.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/AuxMod.java rename to scribble-lang/src/main/java/org/scribble/ast/AuxMod.java diff --git a/scribble-core/src/main/java/org/scribble/ast/BasicInteraction.java b/scribble-lang/src/main/java/org/scribble/ast/BasicInteraction.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/BasicInteraction.java rename to scribble-lang/src/main/java/org/scribble/ast/BasicInteraction.java diff --git a/scribble-core/src/main/java/org/scribble/ast/Choice.java b/scribble-lang/src/main/java/org/scribble/ast/Choice.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/Choice.java rename to scribble-lang/src/main/java/org/scribble/ast/Choice.java index 832dd8d0f..31c765a5c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Choice.java +++ b/scribble-lang/src/main/java/org/scribble/ast/Choice.java @@ -23,6 +23,7 @@ import org.scribble.del.ScribDel; import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; +import org.scribble.util.Constants; import org.scribble.visit.AstVisitor; public abstract class Choice extends CompoundInteraction diff --git a/scribble-core/src/main/java/org/scribble/ast/CompoundInteraction.java b/scribble-lang/src/main/java/org/scribble/ast/CompoundInteraction.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/CompoundInteraction.java rename to scribble-lang/src/main/java/org/scribble/ast/CompoundInteraction.java diff --git a/scribble-core/src/main/java/org/scribble/ast/CompoundNode.java b/scribble-lang/src/main/java/org/scribble/ast/CompoundNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/CompoundNode.java rename to scribble-lang/src/main/java/org/scribble/ast/CompoundNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ConnectAction.java b/scribble-lang/src/main/java/org/scribble/ast/ConnectAction.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/ConnectAction.java rename to scribble-lang/src/main/java/org/scribble/ast/ConnectAction.java diff --git a/scribble-core/src/main/java/org/scribble/ast/Continue.java b/scribble-lang/src/main/java/org/scribble/ast/Continue.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/Continue.java rename to scribble-lang/src/main/java/org/scribble/ast/Continue.java index b8b6b4eb0..7d23bd7e1 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Continue.java +++ b/scribble-lang/src/main/java/org/scribble/ast/Continue.java @@ -19,6 +19,7 @@ import org.scribble.del.ScribDel; import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; +import org.scribble.util.Constants; import org.scribble.visit.AstVisitor; public abstract class Continue diff --git a/scribble-core/src/main/java/org/scribble/ast/DataTypeDecl.java b/scribble-lang/src/main/java/org/scribble/ast/DataTypeDecl.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/DataTypeDecl.java rename to scribble-lang/src/main/java/org/scribble/ast/DataTypeDecl.java index 49e1c9ddf..ebf7d8ce6 100644 --- a/scribble-core/src/main/java/org/scribble/ast/DataTypeDecl.java +++ b/scribble-lang/src/main/java/org/scribble/ast/DataTypeDecl.java @@ -19,6 +19,7 @@ import org.scribble.type.kind.DataTypeKind; import org.scribble.type.name.DataType; import org.scribble.type.name.ModuleName; +import org.scribble.util.Constants; public class DataTypeDecl extends NonProtocolDecl { diff --git a/scribble-core/src/main/java/org/scribble/ast/DirectedInteraction.java b/scribble-lang/src/main/java/org/scribble/ast/DirectedInteraction.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/DirectedInteraction.java rename to scribble-lang/src/main/java/org/scribble/ast/DirectedInteraction.java diff --git a/scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java b/scribble-lang/src/main/java/org/scribble/ast/DisconnectAction.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/DisconnectAction.java rename to scribble-lang/src/main/java/org/scribble/ast/DisconnectAction.java diff --git a/scribble-core/src/main/java/org/scribble/ast/Do.java b/scribble-lang/src/main/java/org/scribble/ast/Do.java similarity index 99% rename from scribble-core/src/main/java/org/scribble/ast/Do.java rename to scribble-lang/src/main/java/org/scribble/ast/Do.java index 961d6afe8..38b9a9e6e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Do.java +++ b/scribble-lang/src/main/java/org/scribble/ast/Do.java @@ -25,6 +25,7 @@ import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; +import org.scribble.util.Constants; import org.scribble.visit.AstVisitor; public abstract class Do diff --git a/scribble-core/src/main/java/org/scribble/ast/DoArg.java b/scribble-lang/src/main/java/org/scribble/ast/DoArg.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/DoArg.java rename to scribble-lang/src/main/java/org/scribble/ast/DoArg.java diff --git a/scribble-core/src/main/java/org/scribble/ast/DoArgList.java b/scribble-lang/src/main/java/org/scribble/ast/DoArgList.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/DoArgList.java rename to scribble-lang/src/main/java/org/scribble/ast/DoArgList.java diff --git a/scribble-core/src/main/java/org/scribble/ast/DoArgNode.java b/scribble-lang/src/main/java/org/scribble/ast/DoArgNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/DoArgNode.java rename to scribble-lang/src/main/java/org/scribble/ast/DoArgNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ExplicitMod.java b/scribble-lang/src/main/java/org/scribble/ast/ExplicitMod.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/ExplicitMod.java rename to scribble-lang/src/main/java/org/scribble/ast/ExplicitMod.java diff --git a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java b/scribble-lang/src/main/java/org/scribble/ast/HeaderParamDecl.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/HeaderParamDecl.java rename to scribble-lang/src/main/java/org/scribble/ast/HeaderParamDecl.java diff --git a/scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java b/scribble-lang/src/main/java/org/scribble/ast/HeaderParamDeclList.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/HeaderParamDeclList.java rename to scribble-lang/src/main/java/org/scribble/ast/HeaderParamDeclList.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ImportDecl.java b/scribble-lang/src/main/java/org/scribble/ast/ImportDecl.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/ImportDecl.java rename to scribble-lang/src/main/java/org/scribble/ast/ImportDecl.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ImportModule.java b/scribble-lang/src/main/java/org/scribble/ast/ImportModule.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/ImportModule.java rename to scribble-lang/src/main/java/org/scribble/ast/ImportModule.java index 7a4f86dbc..7c14acca4 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ImportModule.java +++ b/scribble-lang/src/main/java/org/scribble/ast/ImportModule.java @@ -20,6 +20,7 @@ import org.scribble.job.ScribbleException; import org.scribble.type.kind.ModuleKind; import org.scribble.type.name.ModuleName; +import org.scribble.util.Constants; import org.scribble.visit.AstVisitor; public class ImportModule extends ImportDecl diff --git a/scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java b/scribble-lang/src/main/java/org/scribble/ast/InteractionSeq.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/InteractionSeq.java rename to scribble-lang/src/main/java/org/scribble/ast/InteractionSeq.java diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageNode.java b/scribble-lang/src/main/java/org/scribble/ast/MessageNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/MessageNode.java rename to scribble-lang/src/main/java/org/scribble/ast/MessageNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageSigNameDecl.java b/scribble-lang/src/main/java/org/scribble/ast/MessageSigNameDecl.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/MessageSigNameDecl.java rename to scribble-lang/src/main/java/org/scribble/ast/MessageSigNameDecl.java index 91bc0bf7f..c783a13ef 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageSigNameDecl.java +++ b/scribble-lang/src/main/java/org/scribble/ast/MessageSigNameDecl.java @@ -19,6 +19,7 @@ import org.scribble.type.kind.SigKind; import org.scribble.type.name.MessageSigName; import org.scribble.type.name.ModuleName; +import org.scribble.util.Constants; public class MessageSigNameDecl extends NonProtocolDecl { diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java b/scribble-lang/src/main/java/org/scribble/ast/MessageSigNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java rename to scribble-lang/src/main/java/org/scribble/ast/MessageSigNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java b/scribble-lang/src/main/java/org/scribble/ast/MessageTransfer.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/MessageTransfer.java rename to scribble-lang/src/main/java/org/scribble/ast/MessageTransfer.java diff --git a/scribble-core/src/main/java/org/scribble/ast/Module.java b/scribble-lang/src/main/java/org/scribble/ast/Module.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/Module.java rename to scribble-lang/src/main/java/org/scribble/ast/Module.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java b/scribble-lang/src/main/java/org/scribble/ast/ModuleDecl.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java rename to scribble-lang/src/main/java/org/scribble/ast/ModuleDecl.java index 20cda42a9..669553457 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ModuleDecl.java +++ b/scribble-lang/src/main/java/org/scribble/ast/ModuleDecl.java @@ -23,6 +23,7 @@ import org.scribble.job.ScribbleException; import org.scribble.type.kind.ModuleKind; import org.scribble.type.name.ModuleName; +import org.scribble.util.Constants; import org.scribble.visit.AstVisitor; public class ModuleDecl extends NameDeclNode diff --git a/scribble-core/src/main/java/org/scribble/ast/ModuleMember.java b/scribble-lang/src/main/java/org/scribble/ast/ModuleMember.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/ModuleMember.java rename to scribble-lang/src/main/java/org/scribble/ast/ModuleMember.java diff --git a/scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java b/scribble-lang/src/main/java/org/scribble/ast/NameDeclNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/NameDeclNode.java rename to scribble-lang/src/main/java/org/scribble/ast/NameDeclNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java b/scribble-lang/src/main/java/org/scribble/ast/NonProtocolDecl.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/NonProtocolDecl.java rename to scribble-lang/src/main/java/org/scribble/ast/NonProtocolDecl.java diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleArg.java b/scribble-lang/src/main/java/org/scribble/ast/NonRoleArg.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/NonRoleArg.java rename to scribble-lang/src/main/java/org/scribble/ast/NonRoleArg.java diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java b/scribble-lang/src/main/java/org/scribble/ast/NonRoleArgList.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/NonRoleArgList.java rename to scribble-lang/src/main/java/org/scribble/ast/NonRoleArgList.java diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleArgNode.java b/scribble-lang/src/main/java/org/scribble/ast/NonRoleArgNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/NonRoleArgNode.java rename to scribble-lang/src/main/java/org/scribble/ast/NonRoleArgNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java b/scribble-lang/src/main/java/org/scribble/ast/NonRoleParamDecl.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/NonRoleParamDecl.java rename to scribble-lang/src/main/java/org/scribble/ast/NonRoleParamDecl.java diff --git a/scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java b/scribble-lang/src/main/java/org/scribble/ast/NonRoleParamDeclList.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/NonRoleParamDeclList.java rename to scribble-lang/src/main/java/org/scribble/ast/NonRoleParamDeclList.java diff --git a/scribble-core/src/main/java/org/scribble/ast/PayloadElem.java b/scribble-lang/src/main/java/org/scribble/ast/PayloadElem.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/PayloadElem.java rename to scribble-lang/src/main/java/org/scribble/ast/PayloadElem.java diff --git a/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java b/scribble-lang/src/main/java/org/scribble/ast/PayloadElemList.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java rename to scribble-lang/src/main/java/org/scribble/ast/PayloadElemList.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java b/scribble-lang/src/main/java/org/scribble/ast/ProtocolBlock.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/ProtocolBlock.java rename to scribble-lang/src/main/java/org/scribble/ast/ProtocolBlock.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java b/scribble-lang/src/main/java/org/scribble/ast/ProtocolDecl.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/ProtocolDecl.java rename to scribble-lang/src/main/java/org/scribble/ast/ProtocolDecl.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolDef.java b/scribble-lang/src/main/java/org/scribble/ast/ProtocolDef.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/ProtocolDef.java rename to scribble-lang/src/main/java/org/scribble/ast/ProtocolDef.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java b/scribble-lang/src/main/java/org/scribble/ast/ProtocolHeader.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java rename to scribble-lang/src/main/java/org/scribble/ast/ProtocolHeader.java index 8653b9285..4c4c787a8 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ProtocolHeader.java +++ b/scribble-lang/src/main/java/org/scribble/ast/ProtocolHeader.java @@ -21,6 +21,7 @@ import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.ProtocolName; +import org.scribble.util.Constants; import org.scribble.visit.AstVisitor; // TODO: parameterize on global/local name node and role decl list (i.e. self roles) diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolKindNode.java b/scribble-lang/src/main/java/org/scribble/ast/ProtocolKindNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/ProtocolKindNode.java rename to scribble-lang/src/main/java/org/scribble/ast/ProtocolKindNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java b/scribble-lang/src/main/java/org/scribble/ast/ProtocolMod.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/ProtocolMod.java rename to scribble-lang/src/main/java/org/scribble/ast/ProtocolMod.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java b/scribble-lang/src/main/java/org/scribble/ast/ProtocolModList.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/ProtocolModList.java rename to scribble-lang/src/main/java/org/scribble/ast/ProtocolModList.java diff --git a/scribble-core/src/main/java/org/scribble/ast/Recursion.java b/scribble-lang/src/main/java/org/scribble/ast/Recursion.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/Recursion.java rename to scribble-lang/src/main/java/org/scribble/ast/Recursion.java index c45520714..260974b11 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Recursion.java +++ b/scribble-lang/src/main/java/org/scribble/ast/Recursion.java @@ -19,6 +19,7 @@ import org.scribble.del.ScribDel; import org.scribble.job.ScribbleException; import org.scribble.type.kind.ProtocolKind; +import org.scribble.util.Constants; import org.scribble.visit.AstVisitor; public abstract class Recursion diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleArg.java b/scribble-lang/src/main/java/org/scribble/ast/RoleArg.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/RoleArg.java rename to scribble-lang/src/main/java/org/scribble/ast/RoleArg.java diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleArgList.java b/scribble-lang/src/main/java/org/scribble/ast/RoleArgList.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/RoleArgList.java rename to scribble-lang/src/main/java/org/scribble/ast/RoleArgList.java diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java b/scribble-lang/src/main/java/org/scribble/ast/RoleDecl.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/RoleDecl.java rename to scribble-lang/src/main/java/org/scribble/ast/RoleDecl.java index 505ddf93b..8c6cd67fa 100644 --- a/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java +++ b/scribble-lang/src/main/java/org/scribble/ast/RoleDecl.java @@ -19,6 +19,7 @@ import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Name; import org.scribble.type.name.Role; +import org.scribble.util.Constants; public class RoleDecl extends HeaderParamDecl { diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleDeclList.java b/scribble-lang/src/main/java/org/scribble/ast/RoleDeclList.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/RoleDeclList.java rename to scribble-lang/src/main/java/org/scribble/ast/RoleDeclList.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ScopedNode.java b/scribble-lang/src/main/java/org/scribble/ast/ScopedNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/ScopedNode.java rename to scribble-lang/src/main/java/org/scribble/ast/ScopedNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNil.java b/scribble-lang/src/main/java/org/scribble/ast/ScribNil.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/ScribNil.java rename to scribble-lang/src/main/java/org/scribble/ast/ScribNil.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNode.java b/scribble-lang/src/main/java/org/scribble/ast/ScribNode.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/ast/ScribNode.java rename to scribble-lang/src/main/java/org/scribble/ast/ScribNode.java index 30046b0ed..8d92c1861 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNode.java +++ b/scribble-lang/src/main/java/org/scribble/ast/ScribNode.java @@ -27,6 +27,7 @@ * This is the generic object from which all Scribble model objects * are derived. */ +// Part of core (not lang) -- core is coupled via source to ScribNode/CommonTree public interface ScribNode extends Tree { List getChildren(); diff --git a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-lang/src/main/java/org/scribble/ast/ScribNodeBase.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java rename to scribble-lang/src/main/java/org/scribble/ast/ScribNodeBase.java index 6feae034a..49991760d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-lang/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -27,6 +27,7 @@ import org.scribble.type.kind.Local; import org.scribble.type.kind.ProtocolKind; import org.scribble.util.ScribUtil; +import org.scribble.util.ScribUtil2; import org.scribble.visit.AstVisitor; import org.scribble.visit.Substitutor; @@ -112,7 +113,7 @@ protected final ScribNodeBase copy() // Deprecated: because ANTLR Tree is not i // Deep (tree) clone, i.e., children also cloned // Makes a new del via AF (i.e. fresh, not a copy of old del) -- cf. reconstruct, keeps old del (the same instance) - // EDIT: now just keep old del -- by default, del's are immutable + // No: now just keep old del -- by default, del's are immutable /*@Override public abstract ScribNodeBase clone(AstFactory af);*/ @@ -200,7 +201,7 @@ protected final static T visitChildWithClassEqualityCheck( throws ScribbleException { return visitChildListWith(parent, children, nv, - (T t) -> ScribUtil.handleLambdaScribbleException( + (T t) -> ScribUtil2.handleLambdaScribbleException( () -> ScribNodeBase .visitChildWithClassEqualityCheck(parent, t, nv))); // -> T } @@ -267,7 +268,7 @@ List visitProtocolKindChildListWithCastCheck( Function f) throws ScribbleException { return visitChildListWith(parent, children, nv, - (T t) -> ScribUtil.handleLambdaScribbleException( + (T t) -> ScribUtil2.handleLambdaScribbleException( () -> ScribNodeBase .visitProtocolKindChildWithCastCheck(parent, t, nv, c, k, f))); // -> R diff --git a/scribble-core/src/main/java/org/scribble/ast/SessionNode.java b/scribble-lang/src/main/java/org/scribble/ast/SessionNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/SessionNode.java rename to scribble-lang/src/main/java/org/scribble/ast/SessionNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/SigParamDecl.java b/scribble-lang/src/main/java/org/scribble/ast/SigParamDecl.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/ast/SigParamDecl.java rename to scribble-lang/src/main/java/org/scribble/ast/SigParamDecl.java index 48fc8c33f..5de123a52 100644 --- a/scribble-core/src/main/java/org/scribble/ast/SigParamDecl.java +++ b/scribble-lang/src/main/java/org/scribble/ast/SigParamDecl.java @@ -18,6 +18,7 @@ import org.scribble.type.kind.SigKind; import org.scribble.type.name.MessageSigName; import org.scribble.type.name.Role; +import org.scribble.util.Constants; public class SigParamDecl extends NonRoleParamDecl { diff --git a/scribble-core/src/main/java/org/scribble/ast/SimpleSessionNode.java b/scribble-lang/src/main/java/org/scribble/ast/SimpleSessionNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/SimpleSessionNode.java rename to scribble-lang/src/main/java/org/scribble/ast/SimpleSessionNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/TypeParamDecl.java b/scribble-lang/src/main/java/org/scribble/ast/TypeParamDecl.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/ast/TypeParamDecl.java rename to scribble-lang/src/main/java/org/scribble/ast/TypeParamDecl.java index 9f07e7e02..966eec92b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/TypeParamDecl.java +++ b/scribble-lang/src/main/java/org/scribble/ast/TypeParamDecl.java @@ -18,6 +18,7 @@ import org.scribble.type.kind.DataTypeKind; import org.scribble.type.name.DataType; import org.scribble.type.name.Role; +import org.scribble.util.Constants; public class TypeParamDecl extends NonRoleParamDecl { diff --git a/scribble-core/src/main/java/org/scribble/ast/UnaryPayloadElem.java b/scribble-lang/src/main/java/org/scribble/ast/UnaryPayloadElem.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/UnaryPayloadElem.java rename to scribble-lang/src/main/java/org/scribble/ast/UnaryPayloadElem.java diff --git a/scribble-core/src/main/java/org/scribble/ast/context/DependencyMap.java b/scribble-lang/src/main/java/org/scribble/ast/context/DependencyMap.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/context/DependencyMap.java rename to scribble-lang/src/main/java/org/scribble/ast/context/DependencyMap.java diff --git a/scribble-core/src/main/java/org/scribble/ast/context/ProtocolDeclContext.java b/scribble-lang/src/main/java/org/scribble/ast/context/ProtocolDeclContext.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/context/ProtocolDeclContext.java rename to scribble-lang/src/main/java/org/scribble/ast/context/ProtocolDeclContext.java diff --git a/scribble-core/src/main/java/org/scribble/ast/context/global/GDependencyMap.java b/scribble-lang/src/main/java/org/scribble/ast/context/global/GDependencyMap.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/context/global/GDependencyMap.java rename to scribble-lang/src/main/java/org/scribble/ast/context/global/GDependencyMap.java diff --git a/scribble-core/src/main/java/org/scribble/ast/context/global/GProtocolDeclContext.java b/scribble-lang/src/main/java/org/scribble/ast/context/global/GProtocolDeclContext.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/context/global/GProtocolDeclContext.java rename to scribble-lang/src/main/java/org/scribble/ast/context/global/GProtocolDeclContext.java diff --git a/scribble-core/src/main/java/org/scribble/ast/context/local/LDependencyMap.java b/scribble-lang/src/main/java/org/scribble/ast/context/local/LDependencyMap.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/context/local/LDependencyMap.java rename to scribble-lang/src/main/java/org/scribble/ast/context/local/LDependencyMap.java diff --git a/scribble-core/src/main/java/org/scribble/ast/context/local/LProjectionDeclContext.java b/scribble-lang/src/main/java/org/scribble/ast/context/local/LProjectionDeclContext.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/context/local/LProjectionDeclContext.java rename to scribble-lang/src/main/java/org/scribble/ast/context/local/LProjectionDeclContext.java diff --git a/scribble-core/src/main/java/org/scribble/ast/context/local/LProtocolDeclContext.java b/scribble-lang/src/main/java/org/scribble/ast/context/local/LProtocolDeclContext.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/context/local/LProtocolDeclContext.java rename to scribble-lang/src/main/java/org/scribble/ast/context/local/LProtocolDeclContext.java diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java b/scribble-lang/src/main/java/org/scribble/ast/global/GChoice.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/global/GChoice.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GChoice.java diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GCompoundInteraction.java b/scribble-lang/src/main/java/org/scribble/ast/global/GCompoundInteraction.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/global/GCompoundInteraction.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GCompoundInteraction.java diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java b/scribble-lang/src/main/java/org/scribble/ast/global/GConnect.java similarity index 99% rename from scribble-core/src/main/java/org/scribble/ast/global/GConnect.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GConnect.java index 1c9f23d27..f4228095c 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GConnect.java +++ b/scribble-lang/src/main/java/org/scribble/ast/global/GConnect.java @@ -17,13 +17,13 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.ConnectAction; -import org.scribble.ast.Constants; import org.scribble.ast.MessageNode; import org.scribble.ast.local.LNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.type.kind.Global; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; +import org.scribble.util.Constants; // TODO: make GConnectionAction and factor this class with GWrap (cf. LConnectionAction) public class GConnect extends ConnectAction diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GContinue.java b/scribble-lang/src/main/java/org/scribble/ast/global/GContinue.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/global/GContinue.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GContinue.java diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GDelegationElem.java b/scribble-lang/src/main/java/org/scribble/ast/global/GDelegationElem.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/global/GDelegationElem.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GDelegationElem.java diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GDisconnect.java b/scribble-lang/src/main/java/org/scribble/ast/global/GDisconnect.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/global/GDisconnect.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GDisconnect.java index 6a6435d7d..4743b95c8 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GDisconnect.java +++ b/scribble-lang/src/main/java/org/scribble/ast/global/GDisconnect.java @@ -16,13 +16,13 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.Constants; import org.scribble.ast.DisconnectAction; import org.scribble.ast.local.LNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.type.kind.Global; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; +import org.scribble.util.Constants; public class GDisconnect extends DisconnectAction implements GSimpleSessionNode diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GDo.java b/scribble-lang/src/main/java/org/scribble/ast/global/GDo.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/global/GDo.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GDo.java diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java b/scribble-lang/src/main/java/org/scribble/ast/global/GInteractionSeq.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/global/GInteractionSeq.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GInteractionSeq.java diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java b/scribble-lang/src/main/java/org/scribble/ast/global/GMessageTransfer.java similarity index 99% rename from scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GMessageTransfer.java index bbbb01f3c..2f0a5f787 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java +++ b/scribble-lang/src/main/java/org/scribble/ast/global/GMessageTransfer.java @@ -20,7 +20,6 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.Constants; import org.scribble.ast.MessageNode; import org.scribble.ast.MessageTransfer; import org.scribble.ast.local.LSessionNode; @@ -30,6 +29,7 @@ import org.scribble.type.kind.Global; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; +import org.scribble.util.Constants; public class GMessageTransfer extends MessageTransfer implements GSimpleSessionNode diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GNode.java b/scribble-lang/src/main/java/org/scribble/ast/global/GNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/global/GNode.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolBlock.java b/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolBlock.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/global/GProtocolBlock.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GProtocolBlock.java diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java b/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDecl.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/global/GProtocolDecl.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDecl.java diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolDef.java b/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDef.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/global/GProtocolDef.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDef.java diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolHeader.java b/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolHeader.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/global/GProtocolHeader.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GProtocolHeader.java index 09cecae8c..b6385c473 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GProtocolHeader.java +++ b/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolHeader.java @@ -16,7 +16,6 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.Constants; import org.scribble.ast.NonRoleParamDeclList; import org.scribble.ast.ProtocolHeader; import org.scribble.ast.RoleDeclList; @@ -26,6 +25,7 @@ import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; +import org.scribble.util.Constants; public class GProtocolHeader extends ProtocolHeader implements GNode { diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java b/scribble-lang/src/main/java/org/scribble/ast/global/GRecursion.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/global/GRecursion.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GRecursion.java diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GSessionNode.java b/scribble-lang/src/main/java/org/scribble/ast/global/GSessionNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/global/GSessionNode.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GSessionNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GSimpleSessionNode.java b/scribble-lang/src/main/java/org/scribble/ast/global/GSimpleSessionNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/global/GSimpleSessionNode.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GSimpleSessionNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GWrap.java b/scribble-lang/src/main/java/org/scribble/ast/global/GWrap.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/global/GWrap.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GWrap.java index b60640a96..232f3c478 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GWrap.java +++ b/scribble-lang/src/main/java/org/scribble/ast/global/GWrap.java @@ -17,13 +17,13 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.ConnectAction; -import org.scribble.ast.Constants; import org.scribble.ast.MessageSigNode; import org.scribble.ast.local.LNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.type.kind.Global; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; +import org.scribble.util.Constants; public class GWrap extends ConnectAction implements GSimpleSessionNode { diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java b/scribble-lang/src/main/java/org/scribble/ast/local/LAccept.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/local/LAccept.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LAccept.java index 535a3e3dc..17752db3e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LAccept.java +++ b/scribble-lang/src/main/java/org/scribble/ast/local/LAccept.java @@ -19,13 +19,13 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.Constants; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; import org.scribble.type.name.Role; import org.scribble.type.session.Message; +import org.scribble.util.Constants; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LAccept extends LConnectionAction implements LSimpleSessionNode diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java b/scribble-lang/src/main/java/org/scribble/ast/local/LChoice.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/local/LChoice.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LChoice.java diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LCompoundInteraction.java b/scribble-lang/src/main/java/org/scribble/ast/local/LCompoundInteraction.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/local/LCompoundInteraction.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LCompoundInteraction.java diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LConnectionAction.java b/scribble-lang/src/main/java/org/scribble/ast/local/LConnectionAction.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/local/LConnectionAction.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LConnectionAction.java diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LContinue.java b/scribble-lang/src/main/java/org/scribble/ast/local/LContinue.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/local/LContinue.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LContinue.java diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LDelegationElem.java b/scribble-lang/src/main/java/org/scribble/ast/local/LDelegationElem.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/local/LDelegationElem.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LDelegationElem.java diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java b/scribble-lang/src/main/java/org/scribble/ast/local/LDisconnect.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LDisconnect.java index 46a2c9e2a..f983e5359 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LDisconnect.java +++ b/scribble-lang/src/main/java/org/scribble/ast/local/LDisconnect.java @@ -19,7 +19,6 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.Constants; import org.scribble.ast.DisconnectAction; import org.scribble.ast.MessageSigNode; import org.scribble.ast.name.simple.RoleNode; @@ -28,6 +27,7 @@ import org.scribble.type.kind.Local; import org.scribble.type.name.Role; import org.scribble.type.session.Message; +import org.scribble.util.Constants; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; // "left" of LDisconnect is used for self diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LDo.java b/scribble-lang/src/main/java/org/scribble/ast/local/LDo.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/local/LDo.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LDo.java diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java b/scribble-lang/src/main/java/org/scribble/ast/local/LInteractionSeq.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/local/LInteractionSeq.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LInteractionSeq.java diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LMessageTransfer.java b/scribble-lang/src/main/java/org/scribble/ast/local/LMessageTransfer.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/local/LMessageTransfer.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LMessageTransfer.java diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LNode.java b/scribble-lang/src/main/java/org/scribble/ast/local/LNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/local/LNode.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LProjectionDecl.java b/scribble-lang/src/main/java/org/scribble/ast/local/LProjectionDecl.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/local/LProjectionDecl.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LProjectionDecl.java diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolBlock.java b/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolBlock.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/local/LProtocolBlock.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LProtocolBlock.java diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDecl.java b/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDecl.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/local/LProtocolDecl.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDecl.java diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolDef.java b/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDef.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/local/LProtocolDef.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDef.java diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolHeader.java b/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolHeader.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/local/LProtocolHeader.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LProtocolHeader.java index 7ad9fc074..5f43ee924 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LProtocolHeader.java +++ b/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolHeader.java @@ -15,7 +15,6 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.Constants; import org.scribble.ast.NameDeclNode; import org.scribble.ast.NonRoleParamDeclList; import org.scribble.ast.ProtocolHeader; @@ -27,6 +26,7 @@ import org.scribble.type.kind.RoleKind; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.Role; +import org.scribble.util.Constants; public class LProtocolHeader extends ProtocolHeader implements LNode { diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java b/scribble-lang/src/main/java/org/scribble/ast/local/LReceive.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/local/LReceive.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LReceive.java index e01400328..88bf56c6f 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LReceive.java +++ b/scribble-lang/src/main/java/org/scribble/ast/local/LReceive.java @@ -20,13 +20,13 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.Constants; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; import org.scribble.type.name.Role; import org.scribble.type.session.Message; +import org.scribble.util.Constants; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LReceive extends LMessageTransfer implements LSimpleSessionNode diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java b/scribble-lang/src/main/java/org/scribble/ast/local/LRecursion.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/local/LRecursion.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LRecursion.java diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java b/scribble-lang/src/main/java/org/scribble/ast/local/LRequest.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/local/LRequest.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LRequest.java index c1335f75d..2ec8e598d 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LRequest.java +++ b/scribble-lang/src/main/java/org/scribble/ast/local/LRequest.java @@ -19,13 +19,13 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.Constants; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; import org.scribble.type.name.Role; import org.scribble.type.session.Message; +import org.scribble.util.Constants; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LRequest extends LConnectionAction implements LSimpleSessionNode diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LSend.java b/scribble-lang/src/main/java/org/scribble/ast/local/LSend.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/local/LSend.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LSend.java index 587b52523..81fca50ec 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LSend.java +++ b/scribble-lang/src/main/java/org/scribble/ast/local/LSend.java @@ -21,13 +21,13 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.Constants; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; import org.scribble.type.name.Role; import org.scribble.type.session.Message; +import org.scribble.util.Constants; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LSend extends LMessageTransfer diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LSessionNode.java b/scribble-lang/src/main/java/org/scribble/ast/local/LSessionNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/local/LSessionNode.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LSessionNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java b/scribble-lang/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java b/scribble-lang/src/main/java/org/scribble/ast/local/LWrapClient.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LWrapClient.java index afdc9b2d1..5fe544358 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LWrapClient.java +++ b/scribble-lang/src/main/java/org/scribble/ast/local/LWrapClient.java @@ -19,13 +19,13 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.Constants; import org.scribble.ast.MessageSigNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; import org.scribble.type.name.Role; import org.scribble.type.session.Message; +import org.scribble.util.Constants; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LWrapClient extends LConnectionAction diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java b/scribble-lang/src/main/java/org/scribble/ast/local/LWrapServer.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LWrapServer.java index 0a98ed61e..e5ecfc8ff 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LWrapServer.java +++ b/scribble-lang/src/main/java/org/scribble/ast/local/LWrapServer.java @@ -19,13 +19,13 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ast.Constants; import org.scribble.ast.MessageSigNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; import org.scribble.type.name.Role; import org.scribble.type.session.Message; +import org.scribble.util.Constants; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LWrapServer extends LConnectionAction implements LSimpleSessionNode diff --git a/scribble-core/src/main/java/org/scribble/ast/local/SelfRoleDecl.java b/scribble-lang/src/main/java/org/scribble/ast/local/SelfRoleDecl.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/local/SelfRoleDecl.java rename to scribble-lang/src/main/java/org/scribble/ast/local/SelfRoleDecl.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/NameNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/NameNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/NameNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/NameNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/PayloadElemNameNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/PayloadElemNameNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/PayloadElemNameNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/PayloadElemNameNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/IdNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/simple/IdNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/simple/IdNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/simple/IdNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/simple/OpNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/simple/OpNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/simple/RecVarNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/simple/RecVarNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/simple/RoleNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/simple/RoleNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/SigParamNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/simple/SigParamNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/simple/SigParamNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/simple/SigParamNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java b/scribble-lang/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java rename to scribble-lang/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java diff --git a/scribble-core/src/main/java/org/scribble/del/ChoiceDel.java b/scribble-lang/src/main/java/org/scribble/del/ChoiceDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/ChoiceDel.java rename to scribble-lang/src/main/java/org/scribble/del/ChoiceDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/CompoundInteractionDel.java b/scribble-lang/src/main/java/org/scribble/del/CompoundInteractionDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/CompoundInteractionDel.java rename to scribble-lang/src/main/java/org/scribble/del/CompoundInteractionDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/CompoundSessionNodeDel.java b/scribble-lang/src/main/java/org/scribble/del/CompoundSessionNodeDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/CompoundSessionNodeDel.java rename to scribble-lang/src/main/java/org/scribble/del/CompoundSessionNodeDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java b/scribble-lang/src/main/java/org/scribble/del/ConnectionActionDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/ConnectionActionDel.java rename to scribble-lang/src/main/java/org/scribble/del/ConnectionActionDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/ContinueDel.java b/scribble-lang/src/main/java/org/scribble/del/ContinueDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/ContinueDel.java rename to scribble-lang/src/main/java/org/scribble/del/ContinueDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/DefaultDel.java b/scribble-lang/src/main/java/org/scribble/del/DefaultDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/DefaultDel.java rename to scribble-lang/src/main/java/org/scribble/del/DefaultDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-lang/src/main/java/org/scribble/del/DoArgListDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/DoArgListDel.java rename to scribble-lang/src/main/java/org/scribble/del/DoArgListDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/DoDel.java b/scribble-lang/src/main/java/org/scribble/del/DoDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/DoDel.java rename to scribble-lang/src/main/java/org/scribble/del/DoDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/HeaderParamDeclListDel.java b/scribble-lang/src/main/java/org/scribble/del/HeaderParamDeclListDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/HeaderParamDeclListDel.java rename to scribble-lang/src/main/java/org/scribble/del/HeaderParamDeclListDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/ImportModuleDel.java b/scribble-lang/src/main/java/org/scribble/del/ImportModuleDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/ImportModuleDel.java rename to scribble-lang/src/main/java/org/scribble/del/ImportModuleDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/InteractionNodeDel.java b/scribble-lang/src/main/java/org/scribble/del/InteractionNodeDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/InteractionNodeDel.java rename to scribble-lang/src/main/java/org/scribble/del/InteractionNodeDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/InteractionSeqDel.java b/scribble-lang/src/main/java/org/scribble/del/InteractionSeqDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/InteractionSeqDel.java rename to scribble-lang/src/main/java/org/scribble/del/InteractionSeqDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java b/scribble-lang/src/main/java/org/scribble/del/MessageTransferDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java rename to scribble-lang/src/main/java/org/scribble/del/MessageTransferDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java b/scribble-lang/src/main/java/org/scribble/del/ModuleDel.java similarity index 99% rename from scribble-core/src/main/java/org/scribble/del/ModuleDel.java rename to scribble-lang/src/main/java/org/scribble/del/ModuleDel.java index 2d7bad9dc..69cf4376a 100644 --- a/scribble-core/src/main/java/org/scribble/del/ModuleDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/ModuleDel.java @@ -169,7 +169,7 @@ public Module createModuleForProjection(Projector proj, Module root, { for (Role role : deps.get(gpn)) { - LProtocolName targetsimpname = Projector + LProtocolName targetsimpname = org.scribble.visit.Projector2 .projectSimpleProtocolName(gpn.getSimpleName(), role); ModuleNameNode targetmodname = Projector.makeProjectedModuleNameNode( proj.job.config.af, diff --git a/scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java b/scribble-lang/src/main/java/org/scribble/del/NonRoleArgListDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/NonRoleArgListDel.java rename to scribble-lang/src/main/java/org/scribble/del/NonRoleArgListDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/NonRoleParamDeclDel.java b/scribble-lang/src/main/java/org/scribble/del/NonRoleParamDeclDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/NonRoleParamDeclDel.java rename to scribble-lang/src/main/java/org/scribble/del/NonRoleParamDeclDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/NonRoleParamDeclListDel.java b/scribble-lang/src/main/java/org/scribble/del/NonRoleParamDeclListDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/NonRoleParamDeclListDel.java rename to scribble-lang/src/main/java/org/scribble/del/NonRoleParamDeclListDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/ProtocolBlockDel.java b/scribble-lang/src/main/java/org/scribble/del/ProtocolBlockDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/ProtocolBlockDel.java rename to scribble-lang/src/main/java/org/scribble/del/ProtocolBlockDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java b/scribble-lang/src/main/java/org/scribble/del/ProtocolDeclDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/ProtocolDeclDel.java rename to scribble-lang/src/main/java/org/scribble/del/ProtocolDeclDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/ProtocolDefDel.java b/scribble-lang/src/main/java/org/scribble/del/ProtocolDefDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/ProtocolDefDel.java rename to scribble-lang/src/main/java/org/scribble/del/ProtocolDefDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/RecursionDel.java b/scribble-lang/src/main/java/org/scribble/del/RecursionDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/RecursionDel.java rename to scribble-lang/src/main/java/org/scribble/del/RecursionDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/RoleArgListDel.java b/scribble-lang/src/main/java/org/scribble/del/RoleArgListDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/RoleArgListDel.java rename to scribble-lang/src/main/java/org/scribble/del/RoleArgListDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/RoleDeclDel.java b/scribble-lang/src/main/java/org/scribble/del/RoleDeclDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/RoleDeclDel.java rename to scribble-lang/src/main/java/org/scribble/del/RoleDeclDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/RoleDeclListDel.java b/scribble-lang/src/main/java/org/scribble/del/RoleDeclListDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/RoleDeclListDel.java rename to scribble-lang/src/main/java/org/scribble/del/RoleDeclListDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/ScribDel.java b/scribble-lang/src/main/java/org/scribble/del/ScribDel.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/del/ScribDel.java rename to scribble-lang/src/main/java/org/scribble/del/ScribDel.java index 91e21cb9c..3e0b90d44 100644 --- a/scribble-core/src/main/java/org/scribble/del/ScribDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/ScribDel.java @@ -41,6 +41,7 @@ // FIXME: refactor as appropriate into G/LDel // Immutable except for pass-specific Envs (by visitors) only -- Envs considered transient, not treated immutably (i.e. non defensive setter on del) // Parameterise by AstNode type? Would inhibit del sharing between types (but that's not currently needed) +// Part of core (not lang), because ScribNode -- CHECKME: can move del methods from ScribNode to Base? public interface ScribDel { // "Transient" diff --git a/scribble-core/src/main/java/org/scribble/del/ScribDelBase.java b/scribble-lang/src/main/java/org/scribble/del/ScribDelBase.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/ScribDelBase.java rename to scribble-lang/src/main/java/org/scribble/del/ScribDelBase.java diff --git a/scribble-core/src/main/java/org/scribble/del/SimpleSessionNodeDel.java b/scribble-lang/src/main/java/org/scribble/del/SimpleSessionNodeDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/SimpleSessionNodeDel.java rename to scribble-lang/src/main/java/org/scribble/del/SimpleSessionNodeDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GChoiceDel.java similarity index 99% rename from scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java rename to scribble-lang/src/main/java/org/scribble/del/global/GChoiceDel.java index c04d890dc..e185aa1d4 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -28,10 +28,10 @@ import org.scribble.del.ChoiceDel; import org.scribble.job.RuntimeScribbleException; import org.scribble.job.ScribbleException; -import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; import org.scribble.type.session.global.GSeq; +import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.context.env.ProjectionEnv; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GCompoundInteractionNodeDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GCompoundInteractionNodeDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/global/GCompoundInteractionNodeDel.java rename to scribble-lang/src/main/java/org/scribble/del/global/GCompoundInteractionNodeDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GConnectDel.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java rename to scribble-lang/src/main/java/org/scribble/del/global/GConnectDel.java index b56712e83..2f1f3e192 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/global/GConnectDel.java @@ -22,9 +22,9 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ConnectionActionDel; import org.scribble.job.ScribbleException; -import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.name.Role; import org.scribble.type.session.Message; +import org.scribble.visit.GTypeTranslator; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; import org.scribble.visit.wf.WFChoiceChecker; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GContinueDel.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java rename to scribble-lang/src/main/java/org/scribble/del/global/GContinueDel.java index bcaed98cc..a921f1980 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GContinueDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/global/GContinueDel.java @@ -19,8 +19,8 @@ import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.ContinueDel; import org.scribble.job.ScribbleException; -import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.name.RecVar; +import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.env.InlineProtocolEnv; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GDel.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/del/global/GDel.java rename to scribble-lang/src/main/java/org/scribble/del/global/GDel.java index 26967e7ee..da6cd6bca 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/global/GDel.java @@ -16,8 +16,8 @@ import org.scribble.ast.ScribNode; import org.scribble.del.ScribDel; import org.scribble.job.ScribbleException; -import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.session.global.GType; +import org.scribble.visit.GTypeTranslator; public interface GDel extends ScribDel { diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GDelegationElemDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java rename to scribble-lang/src/main/java/org/scribble/del/global/GDelegationElemDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GDisconnectDel.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java rename to scribble-lang/src/main/java/org/scribble/del/global/GDisconnectDel.java index 1c0477f05..399671b5f 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDisconnectDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/global/GDisconnectDel.java @@ -19,8 +19,8 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ConnectionActionDel; import org.scribble.job.ScribbleException; -import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.name.Role; +import org.scribble.visit.GTypeTranslator; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; import org.scribble.visit.wf.WFChoiceChecker; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GDoDel.java similarity index 99% rename from scribble-core/src/main/java/org/scribble/del/global/GDoDel.java rename to scribble-lang/src/main/java/org/scribble/del/global/GDoDel.java index 06a1bb699..97d918e17 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/global/GDoDel.java @@ -29,13 +29,13 @@ import org.scribble.job.ScribbleException; import org.scribble.lang.SubprotoSig; import org.scribble.lang.context.ModuleContext; -import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.kind.RecVarKind; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; import org.scribble.type.session.Arg; +import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.context.ProtocolDeclContextBuilder; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GInteractionNodeDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GInteractionNodeDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/global/GInteractionNodeDel.java rename to scribble-lang/src/main/java/org/scribble/del/global/GInteractionNodeDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GInteractionSeqDel.java similarity index 99% rename from scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java rename to scribble-lang/src/main/java/org/scribble/del/global/GInteractionSeqDel.java index ea6251019..f0ef8f12f 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GInteractionSeqDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/global/GInteractionSeqDel.java @@ -28,9 +28,9 @@ import org.scribble.del.InteractionSeqDel; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; -import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.session.global.GSeq; import org.scribble.type.session.global.GType; +import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.context.RecRemover; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GMessageTransferDel.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java rename to scribble-lang/src/main/java/org/scribble/del/global/GMessageTransferDel.java index aae55d5d3..0ed4a1729 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -21,9 +21,9 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.MessageTransferDel; import org.scribble.job.ScribbleException; -import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.name.Role; import org.scribble.type.session.Message; +import org.scribble.visit.GTypeTranslator; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; import org.scribble.visit.wf.WFChoiceChecker; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GProtocolBlockDel.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java rename to scribble-lang/src/main/java/org/scribble/del/global/GProtocolBlockDel.java index f8c03f132..e4a6b422b 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolBlockDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/global/GProtocolBlockDel.java @@ -21,8 +21,8 @@ import org.scribble.del.ProtocolBlockDel; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; -import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.session.global.GSeq; +import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.context.env.ProjectionEnv; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GProtocolDeclDel.java similarity index 99% rename from scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java rename to scribble-lang/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index bfce40ba6..cc2ee7e44 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -36,7 +36,6 @@ import org.scribble.job.ScribbleException; import org.scribble.lang.ProtocolMod; import org.scribble.lang.global.GProtocol; -import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.kind.Global; import org.scribble.type.kind.NonRoleParamKind; import org.scribble.type.name.GProtocolName; @@ -44,6 +43,7 @@ import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; import org.scribble.type.session.global.GSeq; +import org.scribble.visit.GTypeTranslator; import org.scribble.visit.context.Projector; import org.scribble.visit.context.ProtocolDeclContextBuilder; import org.scribble.visit.context.env.ProjectionEnv; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GProtocolDefDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/global/GProtocolDefDel.java rename to scribble-lang/src/main/java/org/scribble/del/global/GProtocolDefDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GRecursionDel.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java rename to scribble-lang/src/main/java/org/scribble/del/global/GRecursionDel.java index 9db8caa05..c53101393 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GRecursionDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/global/GRecursionDel.java @@ -21,9 +21,9 @@ import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.RecursionDel; import org.scribble.job.ScribbleException; -import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.name.RecVar; import org.scribble.type.session.global.GSeq; +import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.context.env.ProjectionEnv; diff --git a/scribble-core/src/main/java/org/scribble/del/global/GSimpleInteractionNodeDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GSimpleInteractionNodeDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/global/GSimpleInteractionNodeDel.java rename to scribble-lang/src/main/java/org/scribble/del/global/GSimpleInteractionNodeDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/global/GWrapDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GWrapDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/global/GWrapDel.java rename to scribble-lang/src/main/java/org/scribble/del/global/GWrapDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LAcceptDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LAcceptDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LChoiceDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LChoiceDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LChoiceDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LConnectionActionDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LConnectionActionDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LConnectionActionDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LConnectionActionDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LContinueDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LContinueDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LContinueDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LDisconnectDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LDisconnectDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LDisconnectDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LDisconnectDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LDoDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LDoDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LDoDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LInteractionNodeDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LInteractionNodeDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LInteractionNodeDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LInteractionNodeDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LInteractionSeqDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LInteractionSeqDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LInteractionSeqDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LMessageTransferDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LMessageTransferDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LMessageTransferDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LMessageTransferDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LProjectionDeclDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LProjectionDeclDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LProjectionDeclDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProtocolBlockDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LProtocolBlockDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LProtocolBlockDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LProtocolBlockDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProtocolDeclDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LProtocolDeclDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LProtocolDeclDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LProtocolDeclDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LProtocolDefDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LProtocolDefDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LProtocolDefDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LReceiveDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LReceiveDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LRecursionDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LRecursionDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LRecursionDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LRecursionDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LRequestDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LRequestDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LSendDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LSendDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LSendDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LSimpleInteractionNodeDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LSimpleInteractionNodeDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LSimpleInteractionNodeDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LSimpleInteractionNodeDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LWrapClientDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LWrapClientDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LWrapClientDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LWrapClientDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/local/LWrapServerDel.java b/scribble-lang/src/main/java/org/scribble/del/local/LWrapServerDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/local/LWrapServerDel.java rename to scribble-lang/src/main/java/org/scribble/del/local/LWrapServerDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java b/scribble-lang/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java rename to scribble-lang/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java b/scribble-lang/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java rename to scribble-lang/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java b/scribble-lang/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java rename to scribble-lang/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/name/simple/NonRoleParamNodeDel.java b/scribble-lang/src/main/java/org/scribble/del/name/simple/NonRoleParamNodeDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/name/simple/NonRoleParamNodeDel.java rename to scribble-lang/src/main/java/org/scribble/del/name/simple/NonRoleParamNodeDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java b/scribble-lang/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java rename to scribble-lang/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java diff --git a/scribble-core/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java b/scribble-lang/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java rename to scribble-lang/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java diff --git a/scribble-core/src/main/java/org/scribble/job/Job.java b/scribble-lang/src/main/java/org/scribble/job/Job.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/job/Job.java rename to scribble-lang/src/main/java/org/scribble/job/Job.java index 216b12d2b..fd646c7bd 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job.java +++ b/scribble-lang/src/main/java/org/scribble/job/Job.java @@ -24,9 +24,9 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.lang.context.ModuleContext; import org.scribble.lang.global.GProtocol; -import org.scribble.lang.global.GTypeTranslator; import org.scribble.type.name.ModuleName; import org.scribble.visit.AstVisitor; +import org.scribble.visit.GTypeTranslator; import org.scribble.visit.context.ModuleContextBuilder; import org.scribble.visit.wf.NameDisambiguator; @@ -72,7 +72,7 @@ public Job2 getJob2() throws ScribbleException debugPrintln("\nParsed:\n" + gpd + "\n\nScribble intermediate:\n" + g); } } - this.job2 = new Job2(imeds, this.modcs, this.config); + this.job2 = new Job2(imeds, this.modcs, this.config.toJobConfig2()); } return this.job2; } diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext.java b/scribble-lang/src/main/java/org/scribble/job/JobContext.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/job/JobContext.java rename to scribble-lang/src/main/java/org/scribble/job/JobContext.java diff --git a/scribble-core/src/main/java/org/scribble/lang/context/ModuleContextMaker.java b/scribble-lang/src/main/java/org/scribble/lang/context/ModuleContextMaker.java similarity index 99% rename from scribble-core/src/main/java/org/scribble/lang/context/ModuleContextMaker.java rename to scribble-lang/src/main/java/org/scribble/lang/context/ModuleContextMaker.java index eb062dabe..5565759bf 100644 --- a/scribble-core/src/main/java/org/scribble/lang/context/ModuleContextMaker.java +++ b/scribble-lang/src/main/java/org/scribble/lang/context/ModuleContextMaker.java @@ -30,6 +30,7 @@ import org.scribble.type.name.MessageSigName; import org.scribble.type.name.ModuleName; +// TODO: rename and refactor public class ModuleContextMaker { private Module root; // full name // The root Module for this ModuleContext (cf. the "main" root module from CLI) @@ -48,6 +49,7 @@ public class ModuleContextMaker // ModuleContext is the root context public ModuleContextMaker() //JobContext jcontext, { + } public ModuleContext make( diff --git a/scribble-core/src/main/java/org/scribble/visit/AstVisitor.java b/scribble-lang/src/main/java/org/scribble/visit/AstVisitor.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/AstVisitor.java rename to scribble-lang/src/main/java/org/scribble/visit/AstVisitor.java diff --git a/scribble-core/src/main/java/org/scribble/visit/EnvVisitor.java b/scribble-lang/src/main/java/org/scribble/visit/EnvVisitor.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/EnvVisitor.java rename to scribble-lang/src/main/java/org/scribble/visit/EnvVisitor.java diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java b/scribble-lang/src/main/java/org/scribble/visit/GTypeTranslator.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java rename to scribble-lang/src/main/java/org/scribble/visit/GTypeTranslator.java index 31413c719..24463324c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GTypeTranslator.java +++ b/scribble-lang/src/main/java/org/scribble/visit/GTypeTranslator.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.global; +package org.scribble.visit; import org.scribble.ast.ScribNode; import org.scribble.del.global.GDel; diff --git a/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java b/scribble-lang/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java rename to scribble-lang/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java diff --git a/scribble-core/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java b/scribble-lang/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java rename to scribble-lang/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java diff --git a/scribble-core/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java b/scribble-lang/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java rename to scribble-lang/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java diff --git a/scribble-core/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java b/scribble-lang/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java rename to scribble-lang/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java diff --git a/scribble-core/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java b/scribble-lang/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java rename to scribble-lang/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java diff --git a/scribble-core/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java b/scribble-lang/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java rename to scribble-lang/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java diff --git a/scribble-core/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java b/scribble-lang/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java rename to scribble-lang/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java diff --git a/scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java b/scribble-lang/src/main/java/org/scribble/visit/ProtocolDefInliner.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/ProtocolDefInliner.java rename to scribble-lang/src/main/java/org/scribble/visit/ProtocolDefInliner.java diff --git a/scribble-core/src/main/java/org/scribble/visit/SimpleVisitor.java b/scribble-lang/src/main/java/org/scribble/visit/SimpleVisitor.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/SimpleVisitor.java rename to scribble-lang/src/main/java/org/scribble/visit/SimpleVisitor.java diff --git a/scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java b/scribble-lang/src/main/java/org/scribble/visit/SubprotocolVisitor.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/SubprotocolVisitor.java rename to scribble-lang/src/main/java/org/scribble/visit/SubprotocolVisitor.java diff --git a/scribble-core/src/main/java/org/scribble/visit/Substitutor.java b/scribble-lang/src/main/java/org/scribble/visit/Substitutor.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/Substitutor.java rename to scribble-lang/src/main/java/org/scribble/visit/Substitutor.java diff --git a/scribble-core/src/main/java/org/scribble/visit/UnfoldingVisitor.java b/scribble-lang/src/main/java/org/scribble/visit/UnfoldingVisitor.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/UnfoldingVisitor.java rename to scribble-lang/src/main/java/org/scribble/visit/UnfoldingVisitor.java diff --git a/scribble-core/src/main/java/org/scribble/visit/context/EGraphBuilder.java b/scribble-lang/src/main/java/org/scribble/visit/context/EGraphBuilder.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/context/EGraphBuilder.java rename to scribble-lang/src/main/java/org/scribble/visit/context/EGraphBuilder.java diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java b/scribble-lang/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java rename to scribble-lang/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java b/scribble-lang/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java rename to scribble-lang/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java b/scribble-lang/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java rename to scribble-lang/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java b/scribble-lang/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java rename to scribble-lang/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java b/scribble-lang/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java rename to scribble-lang/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java diff --git a/scribble-core/src/main/java/org/scribble/visit/context/Projector.java b/scribble-lang/src/main/java/org/scribble/visit/context/Projector.java similarity index 84% rename from scribble-core/src/main/java/org/scribble/visit/context/Projector.java rename to scribble-lang/src/main/java/org/scribble/visit/context/Projector.java index 2e5952c45..bfa59135e 100644 --- a/scribble-core/src/main/java/org/scribble/visit/context/Projector.java +++ b/scribble-lang/src/main/java/org/scribble/visit/context/Projector.java @@ -138,44 +138,18 @@ public Map> getProjections() return this.projections; } - public static LProtocolName projectSimpleProtocolName(GProtocolName simpname, - Role role) - { - return new LProtocolName(simpname.toString() + "_" + role.toString()); - } - - // Role is the target subprotocol parameter (not the current projector self -- actually the self just popped) - public static LProtocolName projectFullProtocolName(GProtocolName fullname, - Role role) - { - LProtocolName simplename = projectSimpleProtocolName( - fullname.getSimpleName(), role); - ModuleName modname = projectModuleName(fullname.getPrefix(), simplename); - return new LProtocolName(modname, simplename); - } - - // fullname is the un-projected name; localname is the already projected simple name - public static ModuleName projectModuleName(ModuleName fullname, - LProtocolName localname) - { - ModuleName simpname = new ModuleName( - fullname.getSimpleName().toString() + "_" + localname.toString()); - return new ModuleName(fullname.getPrefix(), simpname); // Supports unary - // fullname - } - public static LProtocolNameNode makeProjectedSimpleNameNode(AstFactory af, CommonTree source, GProtocolName simpname, Role role) { return (LProtocolNameNode) af.QualifiedNameNode(source, Local.KIND, - projectSimpleProtocolName(simpname, role).toString()); + org.scribble.visit.Projector2.projectSimpleProtocolName(simpname, role).toString()); } public static LProtocolNameNode makeProjectedFullNameNode(AstFactory af, CommonTree source, GProtocolName fullname, Role role) { return (LProtocolNameNode) af.QualifiedNameNode(source, Local.KIND, - projectFullProtocolName(fullname, role).getElements()); + org.scribble.visit.Projector2.projectFullProtocolName(fullname, role).getElements()); } // fullname is the un-projected name; localname is the already projected simple name @@ -183,7 +157,7 @@ public static ModuleNameNode makeProjectedModuleNameNode(AstFactory af, CommonTree source, ModuleName fullname, LProtocolName localname) { return (ModuleNameNode) af.QualifiedNameNode(source, ModuleKind.KIND, - projectModuleName(fullname, localname).getElements()); + org.scribble.visit.Projector2.projectModuleName(fullname, localname).getElements()); } diff --git a/scribble-core/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java b/scribble-lang/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java rename to scribble-lang/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java diff --git a/scribble-core/src/main/java/org/scribble/visit/context/RecRemover.java b/scribble-lang/src/main/java/org/scribble/visit/context/RecRemover.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/context/RecRemover.java rename to scribble-lang/src/main/java/org/scribble/visit/context/RecRemover.java diff --git a/scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java b/scribble-lang/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java rename to scribble-lang/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java diff --git a/scribble-core/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java b/scribble-lang/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java rename to scribble-lang/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java diff --git a/scribble-core/src/main/java/org/scribble/visit/context/env/UnguardedChoiceDoEnv.java b/scribble-lang/src/main/java/org/scribble/visit/context/env/UnguardedChoiceDoEnv.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/context/env/UnguardedChoiceDoEnv.java rename to scribble-lang/src/main/java/org/scribble/visit/context/env/UnguardedChoiceDoEnv.java diff --git a/scribble-core/src/main/java/org/scribble/visit/env/DummyEnv.java b/scribble-lang/src/main/java/org/scribble/visit/env/DummyEnv.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/env/DummyEnv.java rename to scribble-lang/src/main/java/org/scribble/visit/env/DummyEnv.java diff --git a/scribble-core/src/main/java/org/scribble/visit/env/Env.java b/scribble-lang/src/main/java/org/scribble/visit/env/Env.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/env/Env.java rename to scribble-lang/src/main/java/org/scribble/visit/env/Env.java diff --git a/scribble-core/src/main/java/org/scribble/visit/env/InlineProtocolEnv.java b/scribble-lang/src/main/java/org/scribble/visit/env/InlineProtocolEnv.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/env/InlineProtocolEnv.java rename to scribble-lang/src/main/java/org/scribble/visit/env/InlineProtocolEnv.java diff --git a/scribble-core/src/main/java/org/scribble/visit/env/UnfoldingEnv.java b/scribble-lang/src/main/java/org/scribble/visit/env/UnfoldingEnv.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/env/UnfoldingEnv.java rename to scribble-lang/src/main/java/org/scribble/visit/env/UnfoldingEnv.java diff --git a/scribble-core/src/main/java/org/scribble/visit/util/MessageIdCollector.java b/scribble-lang/src/main/java/org/scribble/visit/util/MessageIdCollector.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/util/MessageIdCollector.java rename to scribble-lang/src/main/java/org/scribble/visit/util/MessageIdCollector.java diff --git a/scribble-core/src/main/java/org/scribble/visit/util/NameCollector.java b/scribble-lang/src/main/java/org/scribble/visit/util/NameCollector.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/util/NameCollector.java rename to scribble-lang/src/main/java/org/scribble/visit/util/NameCollector.java diff --git a/scribble-core/src/main/java/org/scribble/visit/util/RecVarCollector.java b/scribble-lang/src/main/java/org/scribble/visit/util/RecVarCollector.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/util/RecVarCollector.java rename to scribble-lang/src/main/java/org/scribble/visit/util/RecVarCollector.java diff --git a/scribble-core/src/main/java/org/scribble/visit/util/RoleCollector.java b/scribble-lang/src/main/java/org/scribble/visit/util/RoleCollector.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/util/RoleCollector.java rename to scribble-lang/src/main/java/org/scribble/visit/util/RoleCollector.java diff --git a/scribble-core/src/main/java/org/scribble/visit/validation/GProtocolValidator.java b/scribble-lang/src/main/java/org/scribble/visit/validation/GProtocolValidator.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/validation/GProtocolValidator.java rename to scribble-lang/src/main/java/org/scribble/visit/validation/GProtocolValidator.java diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java b/scribble-lang/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java rename to scribble-lang/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java b/scribble-lang/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java rename to scribble-lang/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/NameDisambiguator.java b/scribble-lang/src/main/java/org/scribble/visit/wf/NameDisambiguator.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/wf/NameDisambiguator.java rename to scribble-lang/src/main/java/org/scribble/visit/wf/NameDisambiguator.java diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java b/scribble-lang/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java rename to scribble-lang/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java b/scribble-lang/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java rename to scribble-lang/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/env/ExplicitCorrelationEnv.java b/scribble-lang/src/main/java/org/scribble/visit/wf/env/ExplicitCorrelationEnv.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/wf/env/ExplicitCorrelationEnv.java rename to scribble-lang/src/main/java/org/scribble/visit/wf/env/ExplicitCorrelationEnv.java diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java b/scribble-lang/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java rename to scribble-lang/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java diff --git a/scribble-core/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java b/scribble-lang/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java similarity index 100% rename from scribble-core/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java rename to scribble-lang/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java diff --git a/scribble-main/src/main/java/org/scribble/main/MainContext.java b/scribble-main/src/main/java/org/scribble/main/MainContext.java index 55b02c158..c180bb44c 100644 --- a/scribble-main/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-main/src/main/java/org/scribble/main/MainContext.java @@ -163,7 +163,9 @@ private void init( // TODO CHECKME: main modname comes from the inlined moddecl -- check for issues if this clashes with an existing file system resource loadAllModules(p); // Populates this.parsed - this.config = new JobConfig(debug, main, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin, this.af, this.ef, this.sf); + this.config = new JobConfig(debug, main, useOldWF, noLiveness, minEfsm, + fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, + spin, this.af, this.ef, this.sf); Map parsed = getParsedModules(); Map map = new HashMap<>(); From b1b288afe6a125b5eeceb7dfe7b805ea95f695ce Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 5 Apr 2019 14:26:36 +0100 Subject: [PATCH 167/539] Added missing JobConfig. --- .../main/java/org/scribble/job/JobConfig.java | 71 +++++++++++++++++++ scribble-test/src/test/scrib/tmp/Test.scr | 7 +- 2 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 scribble-lang/src/main/java/org/scribble/job/JobConfig.java diff --git a/scribble-lang/src/main/java/org/scribble/job/JobConfig.java b/scribble-lang/src/main/java/org/scribble/job/JobConfig.java new file mode 100644 index 000000000..9f9959347 --- /dev/null +++ b/scribble-lang/src/main/java/org/scribble/job/JobConfig.java @@ -0,0 +1,71 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.job; + +import org.scribble.ast.AstFactory; +import org.scribble.model.endpoint.EModelFactory; +import org.scribble.model.global.SModelFactory; +import org.scribble.type.name.ModuleName; + +// The "static" (constant) info for Jobs -- cf. JobContext "dynamic" state +public class JobConfig +{ + public final ModuleName main; // Full name + // CHECKME: verbose/debug printing parameter? + + public final boolean debug; + public final boolean useOldWf; + public final boolean noProgress; // TODO: deprecate + public final boolean minEfsm; // Currently only affects EFSM output (i.e. -fsm, -dot) and API gen -- doesn't affect model checking + public final boolean fair; + public final boolean noLocalChoiceSubjectCheck; + public final boolean noAcceptCorrelationCheck; // Currently unused + public final boolean noValidation; + public final boolean spin; + + public final AstFactory af; + public final EModelFactory ef; + public final SModelFactory sf; + + // N.B. MainContext is in a different non-visible (by Maven) package + public JobConfig(boolean debug, ModuleName main, boolean useOldWF, boolean noLiveness, boolean minEfsm, + boolean fair, boolean noLocalChoiceSubjectCheck, + boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin, + AstFactory af, EModelFactory ef, SModelFactory sf) + { + this.main = main; + + //this.jUnit = jUnit; + this.debug = debug; + this.useOldWf = useOldWF; + this.noProgress = noLiveness; + this.minEfsm = minEfsm; + this.fair = fair; + this.noLocalChoiceSubjectCheck = noLocalChoiceSubjectCheck; + this.noAcceptCorrelationCheck = noAcceptCorrelationCheck; + this.noValidation = noValidation; + this.spin = spin; + + this.af = af; + this.ef = ef; + this.sf = sf; + } + + public JobConfig2 toJobConfig2() + { + return new JobConfig2(debug, main, useOldWf, noProgress, minEfsm, fair, + noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin, + ef, sf); + } +} diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index aa4efadb7..d3a06c853 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -1,10 +1,11 @@ //Raymond@HZHL3 ~/code/scribble-java/scribble-java -//$ java -cp modules/cli/target/classes/';'modules/core/target/classes';'modules/trace/target/classes';'modules/parser/target/classes';c:\Users\Raymond\.m2\repository\org\antlr\antlr-runtime\3.2\antlr-runtime-3.2.jar;'modules/validation/target/classes/';'modules/projection/target/classes/';C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.9.9\jackson-mapper-asl-1.9.9.jar;C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-core-asl\1.9.9\jackson-core-asl-1.9.9.jar' org.scribble.cli.CommandLine -path modules/core/src/test/scrib/ modules/core/src/test/scrib/Test.scr -//$ java -cp modules/cli/target/classes/';'modules/core/target/classes';'modules/trace/target/classes';'modules/parser/target/classes';c:\Users\Raymond\.m2\repository\org\antlr\antlr-runtime\3.2\antlr-runtime-3.2.jar;'modules/validation/target/classes/';'modules/projection/target/classes/';C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.9.9\jackson-mapper-asl-1.9.9.jar;C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-core-asl\1.9.9\jackson-core-asl-1.9.9.jar' org.scribble2.cli.CommandLine -path modules/validation/src/test/scrib/src modules/validation/src/test/scrib/src/Test.scr - //$ bin/scribblec.sh -ip scribble-test/src/test/scrib/ -d scribble-test/src/test/scrib/tmp/ scribble-test/src/test/scrib/tmp/Test.scr //$ bin/scribblec.sh -ip scribble-test/src/test/scrib/ -d scribble-test/src/test/scrib/tmp/ scribble-test/src/test/scrib/tmp/Test.scr -api Proto1 B +// OLD: +//$ java -cp modules/cli/target/classes/';'modules/core/target/classes';'modules/trace/target/classes';'modules/parser/target/classes';c:\Users\Raymond\.m2\repository\org\antlr\antlr-runtime\3.2\antlr-runtime-3.2.jar;'modules/validation/target/classes/';'modules/projection/target/classes/';C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.9.9\jackson-mapper-asl-1.9.9.jar;C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-core-asl\1.9.9\jackson-core-asl-1.9.9.jar' org.scribble.cli.CommandLine -path modules/core/src/test/scrib/ modules/core/src/test/scrib/Test.scr +//$ java -cp modules/cli/target/classes/';'modules/core/target/classes';'modules/trace/target/classes';'modules/parser/target/classes';c:\Users\Raymond\.m2\repository\org\antlr\antlr-runtime\3.2\antlr-runtime-3.2.jar;'modules/validation/target/classes/';'modules/projection/target/classes/';C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.9.9\jackson-mapper-asl-1.9.9.jar;C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-core-asl\1.9.9\jackson-core-asl-1.9.9.jar' org.scribble2.cli.CommandLine -path modules/validation/src/test/scrib/src modules/validation/src/test/scrib/src/Test.scr + //http://sandbox.kidstrythisathome.com/erdos/ From 2683c43a710f90d71f61e7ec0842cbbee6ab5e3b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 5 Apr 2019 14:28:07 +0100 Subject: [PATCH 168/539] Added missing ScribUtil.java. --- .../java/org/scribble/util/ScribUtil.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 scribble-lang/src/main/java/org/scribble/util/ScribUtil.java diff --git a/scribble-lang/src/main/java/org/scribble/util/ScribUtil.java b/scribble-lang/src/main/java/org/scribble/util/ScribUtil.java new file mode 100644 index 000000000..3ecd085a1 --- /dev/null +++ b/scribble-lang/src/main/java/org/scribble/util/ScribUtil.java @@ -0,0 +1,58 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.util; + +import java.util.List; +import java.util.stream.Collectors; + +import org.scribble.ast.AstFactory; +import org.scribble.ast.ScribNode; + +public class ScribUtil +{ + // Strict class equality, cf. ScribNodeBase#visitChildWithClassCheck + // C is expected to be of a ground class type + // Maybe pointless (in terms of formal guarantees) to use equality instead of assignable + public static C checkNodeClassEquality(C c, ScribNode n) + { + if (!c.getClass().equals(n.getClass())) + { + throw new RuntimeException( + "Node class not equal: " + c.getClass() + ", " + n.getClass()); + } + @SuppressWarnings("unchecked") + C tmp = (C) n; + return tmp; + } + + // C is expected to be of a ground class type + public static C castNodeByClass(C cast, ScribNode n) + { + if (!cast.getClass().isAssignableFrom(n.getClass())) + { + throw new RuntimeException( + "Node class cast error: " + cast.getClass() + ", " + n.getClass()); + } + @SuppressWarnings("unchecked") + C tmp = (C) n; + return tmp; + } + + public static List cloneList(AstFactory af, + List ns) + { + return ns.stream().map(n -> checkNodeClassEquality(n, // n.clone(af))) + n.clone())).collect(Collectors.toList()); + } +} From 94bbacf6e986f74de5e17657b6bb2285e71750d7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 5 Apr 2019 14:49:42 +0100 Subject: [PATCH 169/539] Fixed -project output bug. --- scribble-core/src/main/java/org/scribble/job/Job2.java | 7 +++++-- .../src/main/java/org/scribble/type/session/SType.java | 1 + .../resources/good/syntax/disamb/imports/Import01a.scr | 2 +- scribble-test/src/test/scrib/tmp/Test.scr | 6 +++++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/job/Job2.java b/scribble-core/src/main/java/org/scribble/job/Job2.java index bc15f2fb7..f1d7d8056 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job2.java +++ b/scribble-core/src/main/java/org/scribble/job/Job2.java @@ -273,7 +273,7 @@ protected void runProjectionPasses() throws ScribbleException } // Pre: inlined already projected -- used for Do projection - for (GProtocol g : this.context.getInlined()) + for (GProtocol g : this.context.getIntermediates()) { for (Role self : g.roles) { @@ -293,12 +293,15 @@ public Map getProjections(GProtocolName fullname, LProtocol proj = this.context.getProjection(fullname, role); - System.out.println(proj); List> ps = proj.getProtoDependencies(); for (ProtocolName p : ps) { System.out.println("\n" + this.context.getProjection((LProtocolName) p)); } + if (!ps.contains(proj.fullname)) + { + System.out.println("\n" + proj); + } List> ns = proj.getNonProtoDependencies(); diff --git a/scribble-core/src/main/java/org/scribble/type/session/SType.java b/scribble-core/src/main/java/org/scribble/type/session/SType.java index ea7466170..fb7c305ec 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/type/session/SType.java @@ -58,6 +58,7 @@ public interface SType // CHECKME: consider adding B ex SType unfoldAllOnce(STypeUnfolder u); // Resulting Lists should not contain duplicates (i.e., Choice/Seq) + // Result does not necessarily contain root proto, but may do so via dependencies List> getProtoDependencies(); List> getNonProtoDependencies(); // N.B. delegation payloads currently here, not getProtoDependencies (CHECKME: refactor?) diff --git a/scribble-test/src/test/resources/good/syntax/disamb/imports/Import01a.scr b/scribble-test/src/test/resources/good/syntax/disamb/imports/Import01a.scr index cc5b1b20e..6d565efcc 100644 --- a/scribble-test/src/test/resources/good/syntax/disamb/imports/Import01a.scr +++ b/scribble-test/src/test/resources/good/syntax/disamb/imports/Import01a.scr @@ -1,4 +1,4 @@ -// bin/scribblec.sh scribble-test/src/test/resources/good/syntax/disamb/imports/Import01a.scr -ip scribble-test/src/test/resources -project Foo A +// bin/scribblec.sh scribble-test/src/test/resources/good/syntax/disamb/imports/Import01a.scr -ip scribble-test/src/test/resources -project Import1a C module good.syntax.disamb.imports.Import01a; diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index d3a06c853..cdecc9d4a 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -112,8 +112,12 @@ explicit global protocol Foo(role A, role B, role C) } //*/ +global protocol Proto1(role A, role B) +{ + 1() from A to B; +} -//* +/* explicit global protocol Foo(role A, role B) { //connect A to B; From e099a458a963fc8195b2d9cb609a9b75007f43cf Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 5 Apr 2019 16:32:45 +0100 Subject: [PATCH 170/539] Continued: refactoring SType generic params. --- .../main/java/org/scribble/lang/Protocol.java | 4 +- .../type/session/BasicInteraction.java | 10 +-- .../org/scribble/type/session/Choice.java | 33 +++++++-- .../scribble/type/session/ConnectAction.java | 4 +- .../org/scribble/type/session/Continue.java | 14 ++-- .../type/session/DirectedInteraction.java | 10 +-- .../type/session/DisconnectAction.java | 10 +-- .../java/org/scribble/type/session/Do.java | 15 ++-- .../type/session/MessageTransfer.java | 4 +- .../org/scribble/type/session/Recursion.java | 41 ++++++++++- .../java/org/scribble/type/session/SType.java | 14 ++-- .../org/scribble/type/session/STypeBase.java | 8 +-- .../java/org/scribble/type/session/Seq.java | 65 +++++++++++------ .../type/session/global/GConnect.java | 2 +- .../type/session/global/GContinue.java | 2 +- .../type/session/global/GDisconnect.java | 2 +- .../org/scribble/type/session/global/GDo.java | 2 +- .../type/session/global/GMessageTransfer.java | 2 +- .../scribble/type/session/global/GSeq.java | 70 +------------------ .../scribble/type/session/global/GType.java | 6 +- .../org/scribble/type/session/local/LAcc.java | 2 +- .../scribble/type/session/local/LChoice.java | 37 ---------- .../type/session/local/LContinue.java | 2 +- .../type/session/local/LDisconnect.java | 2 +- .../org/scribble/type/session/local/LDo.java | 2 +- .../org/scribble/type/session/local/LRcv.java | 2 +- .../type/session/local/LRecursion.java | 35 ---------- .../org/scribble/type/session/local/LReq.java | 2 +- .../scribble/type/session/local/LSend.java | 2 +- .../org/scribble/type/session/local/LSeq.java | 63 +---------------- .../scribble/type/session/local/LSkip.java | 2 +- .../scribble/type/session/local/LType.java | 24 +++---- .../org/scribble/visit/STypeUnfolder.java | 7 +- 33 files changed, 191 insertions(+), 309 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index f6451ac1e..89a7ee55c 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -33,8 +33,8 @@ import org.scribble.type.session.Seq; import org.scribble.util.Constants; -public abstract class Protocol, B extends Seq> - extends STypeBase +public abstract class Protocol, B extends Seq> + extends STypeBase { public final List mods; public final N fullname; diff --git a/scribble-core/src/main/java/org/scribble/type/session/BasicInteraction.java b/scribble-core/src/main/java/org/scribble/type/session/BasicInteraction.java index c2c824b90..f799ca214 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/BasicInteraction.java +++ b/scribble-core/src/main/java/org/scribble/type/session/BasicInteraction.java @@ -24,8 +24,8 @@ import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; -public abstract class BasicInteraction - extends STypeBase implements SType +public abstract class BasicInteraction> + extends STypeBase implements SType { public BasicInteraction(CommonTree source) { @@ -39,19 +39,19 @@ public Set getRecVars() } @Override - public BasicInteraction pruneRecs() + public BasicInteraction pruneRecs() { return this; } @Override - public BasicInteraction getInlined(STypeInliner v) + public BasicInteraction getInlined(STypeInliner v) { return this; } @Override - public BasicInteraction unfoldAllOnce(STypeUnfolder u) + public BasicInteraction unfoldAllOnce(STypeUnfolder u) { return this; } diff --git a/scribble-core/src/main/java/org/scribble/type/session/Choice.java b/scribble-core/src/main/java/org/scribble/type/session/Choice.java index 60aa56729..5fb1080ba 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Choice.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Choice.java @@ -26,9 +26,12 @@ import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; -public abstract class Choice> - extends STypeBase implements SType +public abstract class Choice> + extends STypeBase implements SType { public final Role subj; public final List blocks; // Pre: size > 0 @@ -44,7 +47,7 @@ public Choice(CommonTree source, Role subj, public abstract Choice reconstruct(CommonTree source, Role subj, List blocks); - //List> blocks); + //List> blocks); @Override public Set getRoles() @@ -54,6 +57,22 @@ public Set getRoles() return res; } + @Override + public Choice substitute(Substitutions subs) + { + List blocks = this.blocks.stream().map(x -> x.substitute(subs)) + .collect(Collectors.toList()); + return reconstruct(getSource(), subs.subsRole(this.subj), blocks); + } + + @Override + public Choice pruneRecs() + { + List blocks = this.blocks.stream().map(x -> x.pruneRecs()) + .collect(Collectors.toList()); + return reconstruct(getSource(), this.subj, blocks); + } + @Override public Set> getMessageIds() { @@ -68,11 +87,11 @@ public Set getRecVars() .collect(Collectors.toSet()); } - /*@Override + @Override public Choice getInlined(STypeInliner v) { CommonTree source = getSource(); // CHECKME: or empty source? - List> blocks = this.blocks.stream().map(x -> x.getInlined(v)) + List blocks = this.blocks.stream().map(x -> x.getInlined(v)) .collect(Collectors.toList()); return reconstruct(source, this.subj, blocks); } @@ -81,10 +100,10 @@ public Choice getInlined(STypeInliner v) public Choice unfoldAllOnce(STypeUnfolder u) { CommonTree source = getSource(); // CHECKME: or empty source? - List> blocks = this.blocks.stream().map(x -> x.unfoldAllOnce(u)) + List blocks = this.blocks.stream().map(x -> x.unfoldAllOnce(u)) .collect(Collectors.toList()); return reconstruct(source, this.subj, blocks); - }*/ + } @Override public List> getProtoDependencies() diff --git a/scribble-core/src/main/java/org/scribble/type/session/ConnectAction.java b/scribble-core/src/main/java/org/scribble/type/session/ConnectAction.java index 82d678e87..6b792efd5 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/ConnectAction.java +++ b/scribble-core/src/main/java/org/scribble/type/session/ConnectAction.java @@ -24,8 +24,8 @@ import org.scribble.type.name.PayloadElemType; import org.scribble.type.name.Role; -public abstract class ConnectAction - extends DirectedInteraction +public abstract class ConnectAction> + extends DirectedInteraction { public ConnectAction(CommonTree source, // BaseInteractionNode not ideal Role src, Message msg, Role dst) diff --git a/scribble-core/src/main/java/org/scribble/type/session/Continue.java b/scribble-core/src/main/java/org/scribble/type/session/Continue.java index 57f868e09..4e8b2cf5b 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Continue.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Continue.java @@ -29,8 +29,8 @@ import org.scribble.type.name.Substitutions; import org.scribble.visit.STypeInliner; -public abstract class Continue - extends STypeBase implements SType +public abstract class Continue> + extends STypeBase { public final RecVar recvar; @@ -42,7 +42,7 @@ public Continue(//org.scribble.ast.Continue source, this.recvar = recvar; } - public abstract Continue reconstruct( + public abstract Continue reconstruct( CommonTree source, RecVar recvar); @Override @@ -76,21 +76,21 @@ public List> getNonProtoDependencies() } @Override - public Continue substitute(Substitutions subs) + public Continue substitute(Substitutions subs) { //return reconstruct(getSource(), this.recvar); return this; } @Override - public Continue pruneRecs() + public Continue pruneRecs() { //return reconstruct(getSource(), this.recvar); return this; } @Override - public Continue getInlined(STypeInliner v) + public Continue getInlined(STypeInliner v) { RecVar rv = v.getInlinedRecVar(this.recvar); return reconstruct(getSource(), rv); @@ -122,7 +122,7 @@ public boolean equals(Object o) { return false; } - Continue them = (Continue) o; + Continue them = (Continue) o; return super.equals(this) // Does canEquals && this.recvar.equals(them.recvar); } diff --git a/scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java index e7fd1ec14..16a9639d0 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java @@ -25,8 +25,8 @@ import org.scribble.type.name.Substitutions; // Besides directed-ness, also features a Message -public abstract class DirectedInteraction - extends BasicInteraction +public abstract class DirectedInteraction> + extends BasicInteraction { public final Role src; public final Message msg; @@ -41,7 +41,7 @@ public DirectedInteraction(CommonTree source, this.dst = dst; } - public abstract DirectedInteraction reconstruct( + public abstract DirectedInteraction reconstruct( CommonTree source, Role src, Message msg, Role dst); @@ -59,7 +59,7 @@ public Set> getMessageIds() } @Override - public DirectedInteraction substitute(Substitutions subs) + public DirectedInteraction substitute(Substitutions subs) { Message msg = this.msg; if (msg instanceof MemberName) @@ -102,7 +102,7 @@ public boolean equals(Object o) { return false; } - DirectedInteraction them = (DirectedInteraction) o; + DirectedInteraction them = (DirectedInteraction) o; return super.equals(this) // Does canEquals && this.src.equals(them.src) && this.msg.equals(them.msg) && this.dst.equals(them.dst); diff --git a/scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java index 8849795e0..464625934 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java @@ -27,8 +27,8 @@ import org.scribble.type.name.Substitutions; // Base class would be "SymmetricInteraction" (cf., DirectedInteraction) -public abstract class DisconnectAction - extends BasicInteraction +public abstract class DisconnectAction> + extends BasicInteraction { public final Role left; public final Role right; @@ -41,7 +41,7 @@ public DisconnectAction(CommonTree source, this.right = right; } - public abstract DisconnectAction reconstruct( + public abstract DisconnectAction reconstruct( CommonTree source, Role src, Role dst); @Override @@ -58,7 +58,7 @@ public Set> getMessageIds() } @Override - public DisconnectAction substitute(Substitutions subs) + public DisconnectAction substitute(Substitutions subs) { return reconstruct(getSource(), subs.subsRole(this.left), subs.subsRole(this.right)); @@ -91,7 +91,7 @@ public boolean equals(Object o) { return false; } - DisconnectAction them = (DisconnectAction) o; + DisconnectAction them = (DisconnectAction) o; return super.equals(this) // Does canEquals && this.left.equals(them.left) && this.right.equals(them.right); } diff --git a/scribble-core/src/main/java/org/scribble/type/session/Do.java b/scribble-core/src/main/java/org/scribble/type/session/Do.java index ba8cfe764..158de064b 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Do.java @@ -34,8 +34,9 @@ import org.scribble.type.name.Substitutions; import org.scribble.visit.STypeUnfolder; -public abstract class Do> - extends STypeBase implements SType +public abstract class Do + , N extends ProtocolName> + extends STypeBase { public final N proto; // Currently disamb'd to fullname by GTypeTranslator (see GDoDel::translate) public final List roles; // Ordered role args; pre: size > 2 @@ -51,7 +52,7 @@ public Do(CommonTree source, N proto, this.args = Collections.unmodifiableList(args); } - public abstract Do reconstruct(CommonTree source, + public abstract Do reconstruct(CommonTree source, N proto, List roles, List> args); @Override @@ -95,7 +96,7 @@ public List> getNonProtoDependencies() } @Override - public Do substitute(Substitutions subs) + public Do substitute(Substitutions subs) { List roles = this.roles.stream().map(x -> subs.subsRole(x)) .collect(Collectors.toList()); @@ -119,13 +120,13 @@ else if (a instanceof MessageSigName) } @Override - public Do pruneRecs() + public Do pruneRecs() { return this; } @Override - public SType unfoldAllOnce(STypeUnfolder u) + public SType unfoldAllOnce(STypeUnfolder u) { throw new RuntimeException("Unsupported for Do: " + this); } @@ -165,7 +166,7 @@ public boolean equals(Object o) { return false; } - Do them = (Do) o; + Do them = (Do) o; return super.equals(this) // Does canEquals && this.proto.equals(them.proto) && this.roles.equals(them.roles) && this.args.equals(them.args); diff --git a/scribble-core/src/main/java/org/scribble/type/session/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/type/session/MessageTransfer.java index 24363d62e..40a266a07 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/type/session/MessageTransfer.java @@ -25,8 +25,8 @@ import org.scribble.type.name.PayloadElemType; import org.scribble.type.name.Role; -public abstract class MessageTransfer - extends DirectedInteraction +public abstract class MessageTransfer> + extends DirectedInteraction { public MessageTransfer(CommonTree source, Role src, Message msg, Role dst) diff --git a/scribble-core/src/main/java/org/scribble/type/session/Recursion.java b/scribble-core/src/main/java/org/scribble/type/session/Recursion.java index c72d85cb0..732dc9225 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Recursion.java @@ -23,9 +23,12 @@ import org.scribble.type.name.ProtocolName; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; +import org.scribble.type.name.Substitutions; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; -public abstract class Recursion> - extends STypeBase implements SType +public abstract class Recursion> + extends STypeBase { public final RecVar recvar; public final B body; @@ -53,6 +56,12 @@ public Set> getMessageIds() { return this.body.getMessageIds(); } + + @Override + public Recursion substitute(Substitutions subs) + { + return reconstruct(getSource(), this.recvar, this.body.substitute(subs)); + } @Override public Set getRecVars() @@ -61,7 +70,7 @@ public Set getRecVars() } @Override - public SType pruneRecs() + public SType pruneRecs() { // Assumes no shadowing (e.g., use after SType#getInlined recvar disamb) return this.body.getRecVars().contains(this.recvar) @@ -69,6 +78,32 @@ public SType pruneRecs() : this.body; // i.e., return a Seq, to be "inlined" by Seq.pruneRecs -- N.B. must handle empty Seq case } + @Override + public Recursion getInlined(STypeInliner v) + { + CommonTree source = getSource(); // CHECKME: or empty source? + RecVar rv = v.enterRec(//stack.peek(), + this.recvar); // FIXME: make GTypeInliner, and record recvars to check freshness (e.g., rec X in two choice cases) + B body = this.body.getInlined(v);//, stack); + Recursion res = reconstruct(source, rv, body); + v.exitRec(this.recvar); + return res; + } + + @Override + public SType unfoldAllOnce(STypeUnfolder u) + { + if (!u.hasRec(this.recvar)) // N.B. doesn't work if recvars shadowed + { + u.pushRec(this.recvar, this.body); + SType unf = this.body.unfoldAllOnce(u); + u.popRec(this.recvar); + // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs + return unf; + } + return this; + } + /* // CHECKME: try adding B to Seq Override public Recursion getInlined(STypeInliner v) diff --git a/scribble-core/src/main/java/org/scribble/type/session/SType.java b/scribble-core/src/main/java/org/scribble/type/session/SType.java index fb7c305ec..7279d7a95 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/type/session/SType.java @@ -27,9 +27,9 @@ import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; -// CHECKME: move to type.sess? +// B needed(?) to factor up several methods from G/L compounds to bases, e.g., getInlined and unfoldAllOnce // Generic works to "specialise" G/L subclasses (and works with immutable pattern) -- cf. not supported by contravariant method parameter subtyping for getters/setters -public interface SType // CHECKME: consider adding B extends Seq here +public interface SType> { boolean hasSource(); // i.e., was parsed CommonTree getSource(); // Pre: hasSource @@ -38,10 +38,10 @@ public interface SType // CHECKME: consider adding B ex Set getRoles(); Set> getMessageIds(); - SType substitute(Substitutions subs); + SType substitute(Substitutions subs); Set getRecVars(); - SType pruneRecs(); // Assumes no shadowing (e.g., use after inlining recvar disamb) + SType pruneRecs(); // Assumes no shadowing (e.g., use after inlining recvar disamb) // Top-level call should be on a GProtocol with an empty stack -- XXX // stack is treated mutably @@ -50,12 +50,12 @@ public interface SType // CHECKME: consider adding B ex // Pre: stack.peek gives call-site sig, i.e., call-site roles/args // CHECKME: OK to (re-)use GTypeTranslator for inlining? // Stack not "internalised", must be "manually" managed -- cf., SubprotocolVisitor - //SessType getInlined(GTypeTranslator t, Deque stack); // FIXME: generalise for locals - SType getInlined(STypeInliner i); + //SessType getInlined(GTypeTranslator t, Deque stack); // FIXME: generalise for locals + SType getInlined(STypeInliner i); // Unsupported for Do // FIXME: repeat recvar names, including non-shadowing (e.g., choice cases) - SType unfoldAllOnce(STypeUnfolder u); + SType unfoldAllOnce(STypeUnfolder u); // Resulting Lists should not contain duplicates (i.e., Choice/Seq) // Result does not necessarily contain root proto, but may do so via dependencies diff --git a/scribble-core/src/main/java/org/scribble/type/session/STypeBase.java b/scribble-core/src/main/java/org/scribble/type/session/STypeBase.java index 3285aaa21..4086492ad 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/STypeBase.java +++ b/scribble-core/src/main/java/org/scribble/type/session/STypeBase.java @@ -17,8 +17,8 @@ import org.scribble.type.kind.ProtocolKind; // SessTypeBase is to SessType as ScribNodeBase is to ScribNode -public abstract class STypeBase - implements SType +public abstract class STypeBase> + implements SType { private final CommonTree source; // Currently null for "generated" terms (cf. hasSource) @@ -27,8 +27,8 @@ public STypeBase(CommonTree source) /*CommonTree clone = (source == null) ? null : CommonTree.clone(); // clone not visibile*/ - this.source = source; // CHECKME: ScribNodes are technically mutable -- though should be treated immutable (defensive copies) post disamb, i.e., in core passes + this.source = source; } @Override @@ -64,7 +64,7 @@ public boolean equals(Object o) { return false; } - STypeBase them = (STypeBase) o; + STypeBase them = (STypeBase) o; return them.canEquals(this); } } diff --git a/scribble-core/src/main/java/org/scribble/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/type/session/Seq.java index 663501eb2..7632541a7 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Seq.java @@ -30,20 +30,20 @@ import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; -// Could add B extends STypeBase, but it inflates type params quite a bit (e.g., Protocol) -public abstract class Seq - extends STypeBase +// CHECKME: could add B extends STypeBase, but it inflates type params quite a bit (e.g., Protocol) ? +public abstract class Seq> + extends STypeBase { - public final List> elems; // GType or LType + public final List> elems; // GType or LType -- could make SType subclasses take themself as another param, but not worth it - public Seq(CommonTree source, List> elems) + public Seq(CommonTree source, List> elems) { super(source); this.elems = Collections.unmodifiableList(elems); } - public abstract Seq reconstruct(CommonTree source, - List> elems); + public abstract B reconstruct(CommonTree source, + List> elems); @Override public Set getRoles() @@ -67,24 +67,43 @@ public Set getRecVars() } @Override - public Seq substitute(Substitutions subs) + public B pruneRecs() { - List> elems = this.elems.stream() + List> elems = new LinkedList<>(); + for (SType e : this.elems) + { + SType e1 = (SType) e.pruneRecs(); + if (e1 instanceof Seq) // cf. Recursion::pruneRecs + { + elems.addAll(((Seq) e1).getElements()); // Handles empty Seq case + } + else + { + elems.add(e1); + } + } + return reconstruct(getSource(), elems); + } + + @Override + public B substitute(Substitutions subs) + { + List> elems = this.elems.stream() .map(x -> x.substitute(subs)).collect(Collectors.toList()); return reconstruct(getSource(), elems); } @Override - public Seq getInlined(STypeInliner v) + public B getInlined(STypeInliner v) { CommonTree source = getSource(); // CHECKME: or empty source? - List> elems = new LinkedList<>(); - for (SType e : this.elems) + List> elems = new LinkedList<>(); + for (SType e : this.elems) { - SType e1 = e.getInlined(v); - if (e1 instanceof Seq) + SType e1 = e.getInlined(v); + if (e1 instanceof Seq) { - elems.addAll(((Seq) e1).elems); // Inline Seq's returned by Do.getInlined + elems.addAll(((Seq) e1).elems); // Inline Seq's returned by Do.getInlined } else { @@ -95,16 +114,16 @@ public Seq getInlined(STypeInliner v) } @Override - public Seq unfoldAllOnce(STypeUnfolder u) + public B unfoldAllOnce(STypeUnfolder u) { CommonTree source = getSource(); - List> elems = new LinkedList<>(); - for (SType e : this.elems) + List> elems = new LinkedList<>(); + for (SType e : this.elems) { - SType e1 = e.unfoldAllOnce(u); - if (e1 instanceof Seq) + SType e1 = e.unfoldAllOnce(u); + if (e1 instanceof Seq) { - elems.addAll(((Seq) e1).elems); + elems.addAll(((Seq) e1).elems); } else { @@ -129,7 +148,7 @@ public List> getNonProtoDependencies() .collect(Collectors.toList()); } - public abstract List> getElements(); + public abstract List> getElements(); public boolean isEmpty() { @@ -163,7 +182,7 @@ public boolean equals(Object o) { return false; } - Seq them = (Seq) o; + Seq them = (Seq) o; return super.equals(this) // Does canEquals && this.elems.equals(them.elems); } diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java b/scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java index f808a9f64..495eba93d 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java @@ -34,7 +34,7 @@ import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; -public class GConnect extends ConnectAction +public class GConnect extends ConnectAction implements GType { diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java b/scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java index 1996c7d38..93b325f6f 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java @@ -28,7 +28,7 @@ import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; -public class GContinue extends Continue implements GType +public class GContinue extends Continue implements GType { public GContinue(//org.scribble.ast.Continue source, CommonTree source, // Due to inlining, do -> continue diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java b/scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java index 3dbd7c0d6..b4a0bc445 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java @@ -29,7 +29,7 @@ import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; -public class GDisconnect extends DisconnectAction +public class GDisconnect extends DisconnectAction implements GType { diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java b/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java index 25b83c502..52a9ca20e 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java @@ -39,7 +39,7 @@ import org.scribble.visit.Projector2; import org.scribble.visit.STypeInliner; -public class GDo extends Do implements GType +public class GDo extends Do implements GType { public GDo(CommonTree source, GProtocolName proto, List roles, List> args) diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java index 8c61120d4..6e141278b 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java @@ -34,7 +34,7 @@ import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; -public class GMessageTransfer extends MessageTransfer +public class GMessageTransfer extends MessageTransfer implements GType { diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java b/scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java index 40d2da0ec..8792a2038 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java @@ -13,7 +13,6 @@ */ package org.scribble.type.session.global; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -31,21 +30,19 @@ import org.scribble.type.session.local.LSkip; import org.scribble.type.session.local.LType; import org.scribble.visit.Projector2; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; -public class GSeq extends Seq implements GType +public class GSeq extends Seq implements GType { // GInteractionSeq or GBlock better as source? public GSeq(CommonTree source, - List> elems) + List> elems) { super(source, elems); } @Override public GSeq reconstruct(CommonTree source, - List> elems) + List> elems) { return new GSeq(source, elems); } @@ -56,67 +53,6 @@ public GSeq substitute(Substitutions subs) return (GSeq) super.substitute(subs); } - @Override - public GSeq pruneRecs() - { - List elems = new LinkedList<>(); - for (SType e : this.elems) - { - GType e1 = (GType) e.pruneRecs(); - if (e1 instanceof GSeq) // cf. Recursion::pruneRecs - { - elems.addAll(((GSeq) e1).getElements()); // Handles empty Seq case - } - else - { - elems.add(e1); - } - } - return reconstruct(getSource(), elems); - } - - @Override - public GSeq getInlined(STypeInliner v) - { - return (GSeq) super.getInlined(v); - } - /*CommonTree source = getSource(); // CHECKME: or empty source? - List> elems = new LinkedList<>(); - for (SType e : this.elems) - { - SType e1 = e.getInlined(i);// , stack); - if (e1 instanceof GSeq) - { - elems.addAll(((GSeq) e1).elems); // Inline GSeq's returned by GDo::getInlined - } - else - { - elems.add(e1); - } - } - return reconstruct(source, elems); - }*/ - - @Override - public GSeq unfoldAllOnce(STypeUnfolder u) - { - CommonTree source = getSource(); - List> elems = new LinkedList<>(); - for (SType e : this.elems) - { - SType e1 = e.unfoldAllOnce(u); - if (e1 instanceof Seq) - { - elems.addAll(((Seq) e1).elems); - } - else - { - elems.add(e1); - } - } - return reconstruct(source, elems); - } - @Override public LSeq projectInlined(Role self) { diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GType.java b/scribble-core/src/main/java/org/scribble/type/session/global/GType.java index 377eadef8..b04844bb5 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GType.java @@ -22,10 +22,8 @@ import org.scribble.type.session.SType; import org.scribble.type.session.local.LType; import org.scribble.visit.Projector2; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; -public interface GType extends SType +public interface GType extends SType { LType projectInlined(Role self); // Use on inlined (i.e., Do inlined, roles pruned) LType project(Projector2 v); // Use on parsed (intermed) @@ -50,10 +48,12 @@ Map checkExtChoiceConsistency(Map enablers) /*@Override GType substitute(Substitutions subs);*/ // Otherwise causes return type inconsistency with base abstract classes + /*// GType returns cause "conflicts" in implementing subclasses -- SType would need itself as another generic param, but not worth it @Override GType getInlined(STypeInliner i);//, Deque stack); @Override SType unfoldAllOnce(STypeUnfolder u); // Not GType return, o/w need to override again in GDo + */ } diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java b/scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java index 258967d4f..a22994bc5 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java @@ -31,7 +31,7 @@ import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; -public class LAcc extends ConnectAction implements LType +public class LAcc extends ConnectAction implements LType { // this.dst == Role.SELF diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java b/scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java index a6b086cd9..034b549ca 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java @@ -28,10 +28,7 @@ import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; import org.scribble.type.session.Choice; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; public class LChoice extends Choice implements LType { @@ -61,40 +58,6 @@ public boolean isSingleConts(Set rvs) { return this.blocks.stream().allMatch(x -> x.isSingleConts(rvs)); } - - @Override - public LChoice substitute(Substitutions subs) - { - List blocks = this.blocks.stream().map(x -> x.substitute(subs)) - .collect(Collectors.toList()); - return reconstruct(getSource(), subs.subsRole(this.subj), blocks); - } - - @Override - public LChoice pruneRecs() - { - List blocks = this.blocks.stream().map(x -> x.pruneRecs()) - .collect(Collectors.toList()); - return reconstruct(getSource(), this.subj, blocks); - } - - @Override - public LChoice getInlined(STypeInliner v) - { - CommonTree source = getSource(); // CHECKME: or empty source? - List blocks = this.blocks.stream().map(x -> x.getInlined(v)) - .collect(Collectors.toList()); - return reconstruct(source, this.subj, blocks); - } - - @Override - public LChoice unfoldAllOnce(STypeUnfolder u) - { - CommonTree source = getSource(); // CHECKME: or empty source? - List blocks = this.blocks.stream().map(x -> x.unfoldAllOnce(u)) - .collect(Collectors.toList()); - return reconstruct(source, this.subj, blocks); - } @Override public void buildGraph(EGraphBuilderUtil2 b) diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java b/scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java index 0ec0e56ee..3ca2552d1 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java @@ -30,7 +30,7 @@ import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; -public class LContinue extends Continue implements LType +public class LContinue extends Continue implements LType { public LContinue(//org.scribble.ast.Continue source, CommonTree source, // Due to inlining, do -> continue diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java b/scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java index 61a07f281..e00f25efd 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java @@ -27,7 +27,7 @@ import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; -public class LDisconnect extends DisconnectAction +public class LDisconnect extends DisconnectAction implements LType { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LDo.java b/scribble-core/src/main/java/org/scribble/type/session/local/LDo.java index 3d678e488..917b8f61a 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LDo.java @@ -32,7 +32,7 @@ import org.scribble.type.session.Do; import org.scribble.visit.STypeInliner; -public class LDo extends Do implements LType +public class LDo extends Do implements LType { public LDo(CommonTree source, LProtocolName proto, List roles, List> args) diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java b/scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java index 0a34d3a92..d3cd752e4 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java @@ -31,7 +31,7 @@ import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; -public class LRcv extends MessageTransfer +public class LRcv extends MessageTransfer implements LType { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java index c6f1ad208..dda0fda80 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java @@ -22,10 +22,7 @@ import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; -import org.scribble.type.name.Substitutions; import org.scribble.type.session.Recursion; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; public class LRecursion extends Recursion implements LType { @@ -57,38 +54,6 @@ public boolean isSingleConts(Set rvs) return this.body.isSingleConts(tmp); } - @Override - public LRecursion substitute(Substitutions subs) - { - return reconstruct(getSource(), this.recvar, this.body.substitute(subs)); - } - - @Override - public LRecursion getInlined(STypeInliner v) - { - CommonTree source = getSource(); // CHECKME: or empty source? - RecVar rv = v.enterRec(//stack.peek(), - this.recvar); // FIXME: make GTypeInliner, and record recvars to check freshness (e.g., rec X in two choice cases) - LSeq body = this.body.getInlined(v);//, stack); - LRecursion res = reconstruct(source, rv, body); - v.exitRec(this.recvar); - return res; - } - - @Override - public LType unfoldAllOnce(STypeUnfolder u) - { - if (!u.hasRec(this.recvar)) // N.B. doesn't work if recvars shadowed - { - u.pushRec(this.recvar, this.body); - LType unf = (LType) this.body.unfoldAllOnce(u); - u.popRec(this.recvar); - // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs - return unf; - } - return this; - } - @Override public void buildGraph(EGraphBuilderUtil2 b) { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LReq.java b/scribble-core/src/main/java/org/scribble/type/session/local/LReq.java index 8c613085e..b31ab6108 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LReq.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LReq.java @@ -31,7 +31,7 @@ import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; -public class LReq extends ConnectAction +public class LReq extends ConnectAction implements LType { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LSend.java b/scribble-core/src/main/java/org/scribble/type/session/local/LSend.java index c2e46a1c3..b55181549 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LSend.java @@ -31,7 +31,7 @@ import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; -public class LSend extends MessageTransfer +public class LSend extends MessageTransfer implements LType { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java b/scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java index 051bb9c31..61688f776 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java @@ -15,7 +15,6 @@ import java.util.Collections; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -31,19 +30,18 @@ import org.scribble.type.session.SType; import org.scribble.type.session.Seq; import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; -public class LSeq extends Seq implements LType +public class LSeq extends Seq implements LType { // GInteractionSeq or GBlock better as source? - public LSeq(CommonTree source, List> elems) + public LSeq(CommonTree source, List> elems) { super(source, elems); } @Override public LSeq reconstruct(CommonTree source, - List> elems) + List> elems) { return new LSeq(source, elems); } @@ -68,66 +66,11 @@ public LSeq substitute(Substitutions subs) return (LSeq) super.substitute(subs); } - @Override - public LSeq pruneRecs() - { - List elems = new LinkedList<>(); - for (SType e : this.elems) - { - LType e1 = (LType) e.pruneRecs(); - if (e1 instanceof LSeq) // cf. Recursion::pruneRecs - { - elems.addAll(((LSeq) e1).getElements()); // Handles empty Seq case - } - else - { - elems.add(e1); - } - } - return reconstruct(getSource(), elems); - } - @Override public LSeq getInlined(STypeInliner v) { return (LSeq) super.getInlined(v); } - /*CommonTree source = getSource(); // CHECKME: or empty source? - List> elems = new LinkedList<>(); - for (SType e : this.elems) - { - SType e1 = e.getInlined(i);//, stack); - if (e1 instanceof LSeq) - { - elems.addAll(((LSeq) e1).elems); // Inline GSeq's returned by GDo::getInlined - } - else - { - elems.add(e1); - } - } - return reconstruct(source, elems); - }*/ - - @Override - public LSeq unfoldAllOnce(STypeUnfolder u) - { - CommonTree source = getSource(); - List> elems = new LinkedList<>(); - for (SType e : this.elems) - { - SType e1 = e.unfoldAllOnce(u); - if (e1 instanceof Seq) - { - elems.addAll(((Seq) e1).elems); - } - else - { - elems.add(e1); - } - } - return reconstruct(source, elems); - } @Override public void buildGraph(EGraphBuilderUtil2 b) diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java index 57ae56d9f..7269259b3 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java @@ -31,7 +31,7 @@ import org.scribble.visit.STypeUnfolder; // Used only *during* projection -- filtered out by GSeq::projection -public class LSkip extends STypeBase implements LType +public class LSkip extends STypeBase implements LType { public static final LSkip SKIP = new LSkip(); diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LType.java b/scribble-core/src/main/java/org/scribble/type/session/local/LType.java index 3499b7d15..b73ca3c5e 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LType.java @@ -21,10 +21,8 @@ import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; import org.scribble.type.session.SType; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; -public interface LType extends SType +public interface LType extends SType { //Role getSelf(); // CHECKME @@ -33,15 +31,6 @@ public interface LType extends SType RecVar isSingleCont(); boolean isSingleConts(Set rvs); - - /*@Override - LType substitute(Substitutions subs);*/ // Otherwise causes return type inconsistency with base abstract classes - - @Override - LType getInlined(STypeInliner i);//, Deque stack); - - @Override - SType unfoldAllOnce(STypeUnfolder u); // Uses b to builds graph "progressively" (working graph is mutable) // Use EGraphBuilderUtil2::finalise for final result @@ -49,4 +38,15 @@ public interface LType extends SType ReachabilityEnv checkReachability(ReachabilityEnv env) throws ScribbleException; + + /*@Override + LType substitute(Substitutions subs);*/ // Otherwise causes return type inconsistency with base abstract classes + + /*// LType returns cause "conflicts" in implementing subclasses -- SType would need itself as another generic param, but not worth it + @Override + SType getInlined(STypeInliner v); + + @Override + SType unfoldAllOnce(STypeUnfolder u); + */ } diff --git a/scribble-core/src/main/java/org/scribble/visit/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/visit/STypeUnfolder.java index 0cac4857c..9e9d97fde 100644 --- a/scribble-core/src/main/java/org/scribble/visit/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/visit/STypeUnfolder.java @@ -21,16 +21,17 @@ import org.scribble.type.session.Seq; // Currently once usage only, no popRec -- CHECKME: fix? +// FIXME: take B, and refactor getRec public class STypeUnfolder { - private final Map> recs = new HashMap<>(); + private final Map> recs = new HashMap<>(); public STypeUnfolder() { } - public void pushRec(RecVar rv, Seq body) + public void pushRec(RecVar rv, Seq body) { if (this.recs.containsKey(rv)) { @@ -44,7 +45,7 @@ public boolean hasRec(RecVar rv) return this.recs.containsKey(rv); } - public Seq getRec(RecVar rv) + public Seq getRec(RecVar rv) { return this.recs.get(rv); } From fa6e1d0b821c72410255239bb21d05edb6bc9281 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 5 Apr 2019 16:52:56 +0100 Subject: [PATCH 171/539] Continued: refactoring SType generic params. --- .../StateChannelApiGenerator.java | 2 +- .../src/main/java/org/scribble/job/Job2.java | 6 +-- .../java/org/scribble/job/JobContext2.java | 6 +-- .../org/scribble/lang/global/GProtocol.java | 2 +- .../org/scribble/lang/local/LProtocol.java | 7 +--- .../java/org/scribble/type/session/Seq.java | 5 ++- .../scribble/type/session/global/GChoice.java | 39 +------------------ .../type/session/global/GConnect.java | 23 +---------- .../type/session/global/GContinue.java | 22 +---------- .../type/session/global/GDisconnect.java | 23 +---------- .../org/scribble/type/session/global/GDo.java | 14 +------ .../type/session/global/GMessageTransfer.java | 23 +---------- .../type/session/global/GRecursion.java | 37 +----------------- .../scribble/type/session/global/GSeq.java | 10 +---- .../scribble/type/session/global/GType.java | 3 +- .../org/scribble/type/session/local/LAcc.java | 29 +------------- .../scribble/type/session/local/LChoice.java | 10 +---- .../type/session/local/LContinue.java | 27 ++----------- .../type/session/local/LDisconnect.java | 29 +------------- .../org/scribble/type/session/local/LDo.java | 15 +------ .../org/scribble/type/session/local/LRcv.java | 29 +------------- .../type/session/local/LRecursion.java | 8 +--- .../org/scribble/type/session/local/LReq.java | 29 +------------- .../scribble/type/session/local/LSend.java | 29 +------------- .../org/scribble/type/session/local/LSeq.java | 23 +---------- .../scribble/type/session/local/LSkip.java | 9 +---- .../scribble/type/session/local/LType.java | 11 +++--- .../visit/{ => global}/Projector2.java | 2 +- .../local/ReachabilityEnv.java | 2 +- .../main/java/org/scribble/del/ModuleDel.java | 2 +- .../org/scribble/visit/context/Projector.java | 6 +-- 31 files changed, 46 insertions(+), 436 deletions(-) rename scribble-core/src/main/java/org/scribble/visit/{ => global}/Projector2.java (98%) rename scribble-core/src/main/java/org/scribble/{lang => visit}/local/ReachabilityEnv.java (97%) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index e5c29c999..5e9c01c4d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -30,7 +30,7 @@ import org.scribble.type.name.GProtocolName; import org.scribble.type.name.LProtocolName; import org.scribble.type.name.Role; -import org.scribble.visit.Projector2; +import org.scribble.visit.global.Projector2; // TODO: "wildcard" unary async: op doesn't matter -- for branch-receive op "still needed" to cast to correct branch state // TODO: "functional state interfaces", e.g. for smtp ehlo and quit actions diff --git a/scribble-core/src/main/java/org/scribble/job/Job2.java b/scribble-core/src/main/java/org/scribble/job/Job2.java index f1d7d8056..b35b7ea71 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job2.java +++ b/scribble-core/src/main/java/org/scribble/job/Job2.java @@ -42,9 +42,9 @@ import org.scribble.type.name.Role; import org.scribble.type.session.Arg; import org.scribble.type.session.global.GType; -import org.scribble.visit.Projector2; import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; +import org.scribble.visit.global.Projector2; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models public class Job2 @@ -379,8 +379,8 @@ public void debugPrintln(String s) } } - private void debugPrintPass(String s) + /*private void debugPrintPass(String s) { debugPrintln("\n[Job] " + s); - } + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext2.java b/scribble-core/src/main/java/org/scribble/job/JobContext2.java index 4558a2f05..85e5926a7 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobContext2.java +++ b/scribble-core/src/main/java/org/scribble/job/JobContext2.java @@ -32,7 +32,7 @@ import org.scribble.type.name.ModuleName; import org.scribble.type.name.Role; import org.scribble.util.ScribUtil2; -import org.scribble.visit.Projector2; +import org.scribble.visit.global.Projector2; // Global "static" context information for a Job -- single instance per Job, should not be shared between Jobs // Mutable: projections, graphs, etc are added mutably later -- replaceModule also mutable setter -- "users" get this from the Job and expect to setter mutate "in place" @@ -114,7 +114,7 @@ public Set getProjectedFullModuleNames() return isParsedModule(fullname) || isProjectedModule(fullname); }*/ - private boolean isParsedModule(ModuleName fullname) + /*private boolean isParsedModule(ModuleName fullname) { //return this.parsed.containsKey(fullname); return this.intermed.keySet().stream() @@ -125,7 +125,7 @@ private boolean isProjectedModule(ModuleName fullname) { //return this.projected.keySet().stream().filter((lpn) -> lpn.getPrefix().equals(fullname)).count() > 0; return getProjectedFullModuleNames().contains(fullname); - } + }*/ // TODO rename better /*public void addIntermediate(GProtocolName fullname, GProtocol g) diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index 5fc760ef3..1bbb8f83d 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -50,9 +50,9 @@ import org.scribble.type.session.global.GType; import org.scribble.type.session.local.LSeq; import org.scribble.util.ScribUtil2; -import org.scribble.visit.Projector2; import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; +import org.scribble.visit.global.Projector2; public class GProtocol extends Protocol implements GType diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index 5d5d059ed..39fa1b6a9 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -41,6 +41,7 @@ import org.scribble.util.Constants; import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; +import org.scribble.visit.local.ReachabilityEnv; public class LProtocol extends Protocol implements LType @@ -61,12 +62,6 @@ public LProtocol reconstruct(CommonTree source, { return new LProtocol(source, mods, fullname, roles, self, params, def); } - - @Override - public RecVar isSingleCont() - { - throw new RuntimeException("Unsupported for LProtocol:\n" + this); - } @Override public boolean isSingleConts(Set rvs) diff --git a/scribble-core/src/main/java/org/scribble/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/type/session/Seq.java index 7632541a7..3129ebb11 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/type/session/Seq.java @@ -30,11 +30,11 @@ import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; -// CHECKME: could add B extends STypeBase, but it inflates type params quite a bit (e.g., Protocol) ? public abstract class Seq> extends STypeBase { - public final List> elems; // GType or LType -- could make SType subclasses take themself as another param, but not worth it + // GType or LType -- could make SType subclasses take themself as another param, but not worth it + public final List> elems; public Seq(CommonTree source, List> elems) { @@ -148,6 +148,7 @@ public List> getNonProtoDependencies() .collect(Collectors.toList()); } + // Re. return type, could make SType subclasses take themself as another param, but not worth it public abstract List> getElements(); public boolean isEmpty() diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GChoice.java b/scribble-core/src/main/java/org/scribble/type/session/global/GChoice.java index abd2a587a..20675ab16 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GChoice.java @@ -28,15 +28,12 @@ import org.scribble.job.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; import org.scribble.type.session.Choice; import org.scribble.type.session.local.LChoice; import org.scribble.type.session.local.LSeq; import org.scribble.type.session.local.LSkip; import org.scribble.type.session.local.LType; -import org.scribble.visit.Projector2; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; +import org.scribble.visit.global.Projector2; public class GChoice extends Choice implements GType { @@ -53,40 +50,6 @@ public GChoice reconstruct(CommonTree source, Role subj, { return new GChoice(source, subj, blocks); } - - @Override - public GChoice substitute(Substitutions subs) - { - List blocks = this.blocks.stream().map(x -> x.substitute(subs)) - .collect(Collectors.toList()); - return reconstruct(getSource(), subs.subsRole(this.subj), blocks); - } - - @Override - public GChoice pruneRecs() - { - List blocks = this.blocks.stream().map(x -> x.pruneRecs()) - .collect(Collectors.toList()); - return reconstruct(getSource(), this.subj, blocks); - } - - @Override - public GChoice getInlined(STypeInliner v) - { - CommonTree source = getSource(); // CHECKME: or empty source? - List blocks = this.blocks.stream().map(x -> x.getInlined(v)) - .collect(Collectors.toList()); - return reconstruct(source, this.subj, blocks); - } - - @Override - public GChoice unfoldAllOnce(STypeUnfolder u) - { - CommonTree source = getSource(); // CHECKME: or empty source? - List blocks = this.blocks.stream().map(x -> x.unfoldAllOnce(u)) - .collect(Collectors.toList()); - return reconstruct(source, this.subj, blocks); - } @Override public LType projectInlined(Role self) diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java b/scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java index 495eba93d..95b36957e 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java @@ -23,16 +23,13 @@ import org.scribble.job.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; import org.scribble.type.session.ConnectAction; import org.scribble.type.session.Message; import org.scribble.type.session.local.LAcc; import org.scribble.type.session.local.LReq; import org.scribble.type.session.local.LSkip; import org.scribble.type.session.local.LType; -import org.scribble.visit.Projector2; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; +import org.scribble.visit.global.Projector2; public class GConnect extends ConnectAction implements GType @@ -51,24 +48,6 @@ public GConnect reconstruct( { return new GConnect(source, src, msg, dst); } - - @Override - public GConnect substitute(Substitutions subs) - { - return (GConnect) super.substitute(subs); - } - - @Override - public GConnect getInlined(STypeInliner v) - { - return (GConnect) super.getInlined(v); - } - - @Override - public GConnect unfoldAllOnce(STypeUnfolder u) - { - return (GConnect) super.unfoldAllOnce(u); - } @Override public LType projectInlined(Role self) diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java b/scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java index 93b325f6f..a21a14aaa 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java @@ -21,12 +21,10 @@ import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; import org.scribble.type.session.Continue; import org.scribble.type.session.local.LContinue; -import org.scribble.visit.Projector2; -import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; +import org.scribble.visit.global.Projector2; public class GContinue extends Continue implements GType { @@ -44,24 +42,6 @@ public GContinue reconstruct(CommonTree source, return new GContinue(source, recvar); } - @Override - public GContinue substitute(Substitutions subs) - { - return (GContinue) super.substitute(subs); - } - - @Override - public GContinue pruneRecs() - { - return (GContinue) super.pruneRecs(); - } - - @Override - public GContinue getInlined(STypeInliner v) - { - return (GContinue) super.getInlined(v); - } - @Override public GRecursion unfoldAllOnce(STypeUnfolder u) { diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java b/scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java index b4a0bc445..382987de1 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java @@ -20,14 +20,11 @@ import org.scribble.job.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; import org.scribble.type.session.DisconnectAction; import org.scribble.type.session.local.LDisconnect; import org.scribble.type.session.local.LSkip; import org.scribble.type.session.local.LType; -import org.scribble.visit.Projector2; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; +import org.scribble.visit.global.Projector2; public class GDisconnect extends DisconnectAction implements GType @@ -45,24 +42,6 @@ public GDisconnect reconstruct( { return new GDisconnect(source, left, right); } - - @Override - public GDisconnect substitute(Substitutions subs) - { - return (GDisconnect) super.substitute(subs); - } - - @Override - public GDisconnect getInlined(STypeInliner v) - { - return (GDisconnect) super.getInlined(v); - } - - @Override - public GDisconnect unfoldAllOnce(STypeUnfolder u) - { - return (GDisconnect) super.unfoldAllOnce(u); - } @Override public LType projectInlined(Role self) diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java b/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java index 52a9ca20e..18ce737ed 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java @@ -36,8 +36,8 @@ import org.scribble.type.session.local.LDo; import org.scribble.type.session.local.LSkip; import org.scribble.type.session.local.LType; -import org.scribble.visit.Projector2; import org.scribble.visit.STypeInliner; +import org.scribble.visit.global.Projector2; public class GDo extends Do implements GType { @@ -55,18 +55,6 @@ public GDo reconstruct(CommonTree source, return new GDo(source, proto, roles, args); } - @Override - public GDo substitute(Substitutions subs) - { - return (GDo) super.substitute(subs); - } - - @Override - public GDo pruneRecs() - { - return (GDo) super.pruneRecs(); - } - // CHECKME: factor up to base? @Override public GType getInlined(STypeInliner v) diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java index 6e141278b..1632f0490 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java @@ -23,16 +23,13 @@ import org.scribble.job.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; import org.scribble.type.session.Message; import org.scribble.type.session.MessageTransfer; import org.scribble.type.session.local.LRcv; import org.scribble.type.session.local.LSend; import org.scribble.type.session.local.LSkip; import org.scribble.type.session.local.LType; -import org.scribble.visit.Projector2; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; +import org.scribble.visit.global.Projector2; public class GMessageTransfer extends MessageTransfer implements GType @@ -51,24 +48,6 @@ public GMessageTransfer reconstruct( { return new GMessageTransfer(source, src, msg, dst); } - - @Override - public GMessageTransfer substitute(Substitutions subs) - { - return (GMessageTransfer) super.substitute(subs); - } - - @Override - public GMessageTransfer getInlined(STypeInliner v) - { - return (GMessageTransfer) super.getInlined(v); - } - - @Override - public GMessageTransfer unfoldAllOnce(STypeUnfolder u) - { - return (GMessageTransfer) super.unfoldAllOnce(u); - } @Override public LType projectInlined(Role self) diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/type/session/global/GRecursion.java index ca793294d..02a5c05ff 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GRecursion.java @@ -22,15 +22,12 @@ import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; import org.scribble.type.session.Recursion; import org.scribble.type.session.local.LRecursion; import org.scribble.type.session.local.LSeq; import org.scribble.type.session.local.LSkip; import org.scribble.type.session.local.LType; -import org.scribble.visit.Projector2; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; +import org.scribble.visit.global.Projector2; public class GRecursion extends Recursion implements GType { @@ -47,38 +44,6 @@ public GRecursion reconstruct(CommonTree source, { return new GRecursion(source, recvar, block); } - - @Override - public GRecursion substitute(Substitutions subs) - { - return reconstruct(getSource(), this.recvar, this.body.substitute(subs)); - } - - @Override - public GRecursion getInlined(STypeInliner v) - { - CommonTree source = getSource(); // CHECKME: or empty source? - RecVar rv = v.enterRec(//stack.peek(), - this.recvar); // FIXME: make GTypeInliner, and record recvars to check freshness (e.g., rec X in two choice cases) - GSeq body = this.body.getInlined(v);//, stack); - GRecursion res = reconstruct(source, rv, body); - v.exitRec(this.recvar); - return res; - } - - @Override - public GType unfoldAllOnce(STypeUnfolder u) - { - if (!u.hasRec(this.recvar)) // N.B. doesn't work if recvars shadowed - { - u.pushRec(this.recvar, this.body); - GType unf = (GType) this.body.unfoldAllOnce(u); - u.popRec(this.recvar); - // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs - return unf; - } - return this; - } @Override public LType projectInlined(Role self) diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java b/scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java index 8792a2038..d482d9986 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java @@ -23,17 +23,15 @@ import org.scribble.job.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; import org.scribble.type.session.SType; import org.scribble.type.session.Seq; import org.scribble.type.session.local.LSeq; import org.scribble.type.session.local.LSkip; import org.scribble.type.session.local.LType; -import org.scribble.visit.Projector2; +import org.scribble.visit.global.Projector2; public class GSeq extends Seq implements GType { - // GInteractionSeq or GBlock better as source? public GSeq(CommonTree source, List> elems) { @@ -47,12 +45,6 @@ public GSeq reconstruct(CommonTree source, return new GSeq(source, elems); } - @Override - public GSeq substitute(Substitutions subs) - { - return (GSeq) super.substitute(subs); - } - @Override public LSeq projectInlined(Role self) { diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GType.java b/scribble-core/src/main/java/org/scribble/type/session/global/GType.java index b04844bb5..a96956c4f 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GType.java @@ -21,7 +21,7 @@ import org.scribble.type.name.Role; import org.scribble.type.session.SType; import org.scribble.type.session.local.LType; -import org.scribble.visit.Projector2; +import org.scribble.visit.global.Projector2; public interface GType extends SType { @@ -31,6 +31,7 @@ public interface GType extends SType // Pre: use on inlined or later (unsupported for Do, also Protocol) // enabled treated immutably // Returns enabled post visiting + // Cf. SType visitors, here we only throw ScribbleException or return nothing, so can use return this way Set checkRoleEnabling(Set enabled) throws ScribbleException; // Pre: use on inlined or later (unsupported for Do, also Protocol) diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java b/scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java index a22994bc5..fce7d83d8 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java @@ -17,19 +17,16 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; import org.scribble.type.session.ConnectAction; import org.scribble.type.session.Message; import org.scribble.type.session.MessageSig; import org.scribble.type.session.Payload; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; +import org.scribble.visit.local.ReachabilityEnv; public class LAcc extends ConnectAction implements LType { @@ -50,36 +47,12 @@ public LAcc reconstruct( return new LAcc(source, src, msg); } - @Override - public RecVar isSingleCont() - { - return null; - } - @Override public boolean isSingleConts(Set rvs) { return false; } - @Override - public LAcc substitute(Substitutions subs) - { - return (LAcc) super.substitute(subs); - } - - @Override - public LAcc getInlined(STypeInliner v) - { - return (LAcc) super.getInlined(v); - } - - @Override - public LAcc unfoldAllOnce(STypeUnfolder u) - { - return (LAcc) super.unfoldAllOnce(u); - } - @Override public void buildGraph(EGraphBuilderUtil2 b) { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java b/scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java index 034b549ca..c802a9a3d 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java @@ -21,7 +21,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -29,6 +28,7 @@ import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; import org.scribble.type.session.Choice; +import org.scribble.visit.local.ReachabilityEnv; public class LChoice extends Choice implements LType { @@ -45,14 +45,6 @@ public LChoice reconstruct(CommonTree source, Role subj, return new LChoice(source, subj, blocks); } - @Override - public RecVar isSingleCont() - { - List tmp = this.blocks.stream().map(x -> x.isSingleCont()) - .collect(Collectors.toList()); - return (tmp.size() == 1) ? tmp.get(0) : null; - } - @Override public boolean isSingleConts(Set rvs) { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java b/scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java index 3ca2552d1..23e7b7a13 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java @@ -19,22 +19,19 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; -import org.scribble.type.name.Substitutions; import org.scribble.type.session.Continue; -import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; +import org.scribble.visit.local.ReachabilityEnv; public class LContinue extends Continue implements LType { - public LContinue(//org.scribble.ast.Continue source, - CommonTree source, // Due to inlining, do -> continue - RecVar recvar) + // N.B. source changes from do to continue after inlining + public LContinue(CommonTree source, RecVar recvar) { super(source, recvar); } @@ -45,12 +42,6 @@ public LContinue reconstruct(CommonTree source, { return new LContinue(source, recvar); } - - @Override - public RecVar isSingleCont() - { - return this.recvar; - } @Override public boolean isSingleConts(Set rvs) @@ -58,18 +49,6 @@ public boolean isSingleConts(Set rvs) return rvs.contains(this.recvar); } - @Override - public LContinue substitute(Substitutions subs) - { - return (LContinue) super.substitute(subs); - } - - @Override - public LContinue getInlined(STypeInliner v) - { - return (LContinue) super.getInlined(v); - } - @Override public LRecursion unfoldAllOnce(STypeUnfolder u) { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java b/scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java index e00f25efd..c3d8c8fae 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java @@ -17,15 +17,12 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; import org.scribble.type.session.DisconnectAction; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; +import org.scribble.visit.local.ReachabilityEnv; public class LDisconnect extends DisconnectAction implements LType @@ -51,36 +48,12 @@ public LDisconnect reconstruct( return new LDisconnect(source, peer); } - @Override - public RecVar isSingleCont() - { - return null; - } - @Override public boolean isSingleConts(Set rvs) { return false; } - @Override - public LDisconnect substitute(Substitutions subs) - { - return (LDisconnect) super.substitute(subs); - } - - @Override - public LDisconnect getInlined(STypeInliner v) - { - return (LDisconnect) super.getInlined(v); - } - - @Override - public LDisconnect unfoldAllOnce(STypeUnfolder u) - { - return (LDisconnect) super.unfoldAllOnce(u); - } - @Override public void buildGraph(EGraphBuilderUtil2 b) { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LDo.java b/scribble-core/src/main/java/org/scribble/type/session/local/LDo.java index 917b8f61a..e8ef5f081 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LDo.java @@ -20,7 +20,6 @@ import org.scribble.job.ScribbleException; import org.scribble.lang.SubprotoSig; import org.scribble.lang.local.LProtocol; -import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.kind.NonRoleParamKind; @@ -31,6 +30,7 @@ import org.scribble.type.session.Arg; import org.scribble.type.session.Do; import org.scribble.visit.STypeInliner; +import org.scribble.visit.local.ReachabilityEnv; public class LDo extends Do implements LType { @@ -47,13 +47,6 @@ public LDo reconstruct(CommonTree source, { return new LDo(source, proto, roles, args); } - - @Override - public RecVar isSingleCont() - { - throw new RuntimeException("Unsupported for LDo: " + this); - } - @Override public boolean isSingleConts(Set rvs) { @@ -73,12 +66,6 @@ public ReachabilityEnv checkReachability(ReachabilityEnv env) throw new RuntimeException("Unsupported for LDo: " + this); } - @Override - public LDo substitute(Substitutions subs) - { - return (LDo) super.substitute(subs); - } - // CHECKME: factor up to base? @Override public LType getInlined(STypeInliner v) diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java b/scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java index d3cd752e4..6d1a1acdc 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java @@ -17,19 +17,16 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; import org.scribble.type.session.Message; import org.scribble.type.session.MessageSig; import org.scribble.type.session.MessageTransfer; import org.scribble.type.session.Payload; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; +import org.scribble.visit.local.ReachabilityEnv; public class LRcv extends MessageTransfer implements LType @@ -51,36 +48,12 @@ public LRcv reconstruct( return new LRcv(source, src, msg); } - @Override - public RecVar isSingleCont() - { - return null; - } - @Override public boolean isSingleConts(Set rvs) { return false; } - @Override - public LRcv substitute(Substitutions subs) - { - return (LRcv) super.substitute(subs); - } - - @Override - public LRcv getInlined(STypeInliner v) - { - return (LRcv) super.getInlined(v); - } - - @Override - public LRcv unfoldAllOnce(STypeUnfolder u) - { - return (LRcv) super.unfoldAllOnce(u); - } - @Override public void buildGraph(EGraphBuilderUtil2 b) { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java index dda0fda80..ce0f909a7 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java @@ -18,11 +18,11 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; import org.scribble.type.session.Recursion; +import org.scribble.visit.local.ReachabilityEnv; public class LRecursion extends Recursion implements LType { @@ -40,12 +40,6 @@ public LRecursion reconstruct(CommonTree source, return new LRecursion(source, recvar, block); } - @Override - public RecVar isSingleCont() - { - return null; - } - @Override public boolean isSingleConts(Set rvs) { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LReq.java b/scribble-core/src/main/java/org/scribble/type/session/local/LReq.java index b31ab6108..45b96ce9a 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LReq.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LReq.java @@ -17,19 +17,16 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; import org.scribble.type.session.ConnectAction; import org.scribble.type.session.Message; import org.scribble.type.session.MessageSig; import org.scribble.type.session.Payload; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; +import org.scribble.visit.local.ReachabilityEnv; public class LReq extends ConnectAction implements LType @@ -51,36 +48,12 @@ public LReq reconstruct( return new LReq(source, msg, dst); } - @Override - public RecVar isSingleCont() - { - return null; - } - @Override public boolean isSingleConts(Set rvs) { return false; } - @Override - public LReq substitute(Substitutions subs) - { - return (LReq) super.substitute(subs); - } - - @Override - public LReq getInlined(STypeInliner v) - { - return (LReq) super.getInlined(v); - } - - @Override - public LReq unfoldAllOnce(STypeUnfolder u) - { - return (LReq) super.unfoldAllOnce(u); - } - @Override public void buildGraph(EGraphBuilderUtil2 b) { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LSend.java b/scribble-core/src/main/java/org/scribble/type/session/local/LSend.java index b55181549..ecc3be56c 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LSend.java @@ -17,19 +17,16 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; import org.scribble.type.session.Message; import org.scribble.type.session.MessageSig; import org.scribble.type.session.MessageTransfer; import org.scribble.type.session.Payload; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; +import org.scribble.visit.local.ReachabilityEnv; public class LSend extends MessageTransfer implements LType @@ -51,36 +48,12 @@ public LSend reconstruct( return new LSend(source, msg, dst); } - @Override - public RecVar isSingleCont() - { - return null; - } - @Override public boolean isSingleConts(Set rvs) { return false; } - @Override - public LSend substitute(Substitutions subs) - { - return (LSend) super.substitute(subs); - } - - @Override - public LSend getInlined(STypeInliner v) - { - return (LSend) super.getInlined(v); - } - - @Override - public LSend unfoldAllOnce(STypeUnfolder u) - { - return (LSend) super.unfoldAllOnce(u); - } - @Override public void buildGraph(EGraphBuilderUtil2 b) { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java b/scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java index 61688f776..89ced44ce 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java @@ -21,15 +21,13 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.job.ScribbleException; -import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.model.endpoint.EState; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; -import org.scribble.type.name.Substitutions; import org.scribble.type.session.SType; import org.scribble.type.session.Seq; -import org.scribble.visit.STypeInliner; +import org.scribble.visit.local.ReachabilityEnv; public class LSeq extends Seq implements LType { @@ -46,13 +44,6 @@ public LSeq reconstruct(CommonTree source, return new LSeq(source, elems); } - @Override - public RecVar isSingleCont() - { - RecVar rv = ((LType) this.elems.get(0)).isSingleCont(); - return (this.elems.size() == 1) ? rv : null; - } - @Override public boolean isSingleConts(Set rvs) { @@ -60,18 +51,6 @@ public boolean isSingleConts(Set rvs) && ((LType) this.elems.get(0)).isSingleConts(rvs); } - @Override - public LSeq substitute(Substitutions subs) - { - return (LSeq) super.substitute(subs); - } - - @Override - public LSeq getInlined(STypeInliner v) - { - return (LSeq) super.getInlined(v); - } - @Override public void buildGraph(EGraphBuilderUtil2 b) { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java index 7269259b3..10c8accc0 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java @@ -17,7 +17,6 @@ import java.util.Set; import org.scribble.job.ScribbleException; -import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.MemberName; @@ -29,6 +28,7 @@ import org.scribble.type.session.STypeBase; import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; +import org.scribble.visit.local.ReachabilityEnv; // Used only *during* projection -- filtered out by GSeq::projection public class LSkip extends STypeBase implements LType @@ -76,13 +76,6 @@ public List> getNonProtoDependencies() throw new RuntimeException("Unsupported for Skip: " + this); } - @Override - public RecVar isSingleCont() - { - return null; - //CHECKME: throw new RuntimeException("Unsupported for LProtocol:\n" + this); - } - @Override public boolean isSingleConts(Set rvs) { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LType.java b/scribble-core/src/main/java/org/scribble/type/session/local/LType.java index b73ca3c5e..8aeb205eb 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LType.java @@ -16,26 +16,25 @@ import java.util.Set; import org.scribble.job.ScribbleException; -import org.scribble.lang.local.ReachabilityEnv; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; import org.scribble.type.session.SType; +import org.scribble.visit.local.ReachabilityEnv; public interface LType extends SType { - //Role getSelf(); // CHECKME + //Role getSelf(); // CHECKME: useful? - // Return recvar of the "single continue", if so; return null, if not - @Deprecated - RecVar isSingleCont(); - + // Return true iff LType is "equivalent" to a single "continue X", where X in rvs boolean isSingleConts(Set rvs); // Uses b to builds graph "progressively" (working graph is mutable) // Use EGraphBuilderUtil2::finalise for final result void buildGraph(EGraphBuilderUtil2 b); + // Return: (new) env post visiting + // cf. GType "visitor" methods: same pattern, just env as a bespoke data type wrapper ReachabilityEnv checkReachability(ReachabilityEnv env) throws ScribbleException; diff --git a/scribble-core/src/main/java/org/scribble/visit/Projector2.java b/scribble-core/src/main/java/org/scribble/visit/global/Projector2.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/visit/Projector2.java rename to scribble-core/src/main/java/org/scribble/visit/global/Projector2.java index 3bedc27d3..2e871d71a 100644 --- a/scribble-core/src/main/java/org/scribble/visit/Projector2.java +++ b/scribble-core/src/main/java/org/scribble/visit/global/Projector2.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.visit; +package org.scribble.visit.global; import org.scribble.job.Job2; import org.scribble.type.name.GProtocolName; diff --git a/scribble-core/src/main/java/org/scribble/lang/local/ReachabilityEnv.java b/scribble-core/src/main/java/org/scribble/visit/local/ReachabilityEnv.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/lang/local/ReachabilityEnv.java rename to scribble-core/src/main/java/org/scribble/visit/local/ReachabilityEnv.java index dde03cb1d..03655d9d1 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/ReachabilityEnv.java +++ b/scribble-core/src/main/java/org/scribble/visit/local/ReachabilityEnv.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.local; +package org.scribble.visit.local; import java.util.Collections; import java.util.Set; diff --git a/scribble-lang/src/main/java/org/scribble/del/ModuleDel.java b/scribble-lang/src/main/java/org/scribble/del/ModuleDel.java index 69cf4376a..a6d4c60ce 100644 --- a/scribble-lang/src/main/java/org/scribble/del/ModuleDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/ModuleDel.java @@ -169,7 +169,7 @@ public Module createModuleForProjection(Projector proj, Module root, { for (Role role : deps.get(gpn)) { - LProtocolName targetsimpname = org.scribble.visit.Projector2 + LProtocolName targetsimpname = org.scribble.visit.global.Projector2 .projectSimpleProtocolName(gpn.getSimpleName(), role); ModuleNameNode targetmodname = Projector.makeProjectedModuleNameNode( proj.job.config.af, diff --git a/scribble-lang/src/main/java/org/scribble/visit/context/Projector.java b/scribble-lang/src/main/java/org/scribble/visit/context/Projector.java index bfa59135e..5ec91ae6d 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/context/Projector.java +++ b/scribble-lang/src/main/java/org/scribble/visit/context/Projector.java @@ -142,14 +142,14 @@ public static LProtocolNameNode makeProjectedSimpleNameNode(AstFactory af, CommonTree source, GProtocolName simpname, Role role) { return (LProtocolNameNode) af.QualifiedNameNode(source, Local.KIND, - org.scribble.visit.Projector2.projectSimpleProtocolName(simpname, role).toString()); + org.scribble.visit.global.Projector2.projectSimpleProtocolName(simpname, role).toString()); } public static LProtocolNameNode makeProjectedFullNameNode(AstFactory af, CommonTree source, GProtocolName fullname, Role role) { return (LProtocolNameNode) af.QualifiedNameNode(source, Local.KIND, - org.scribble.visit.Projector2.projectFullProtocolName(fullname, role).getElements()); + org.scribble.visit.global.Projector2.projectFullProtocolName(fullname, role).getElements()); } // fullname is the un-projected name; localname is the already projected simple name @@ -157,7 +157,7 @@ public static ModuleNameNode makeProjectedModuleNameNode(AstFactory af, CommonTree source, ModuleName fullname, LProtocolName localname) { return (ModuleNameNode) af.QualifiedNameNode(source, ModuleKind.KIND, - org.scribble.visit.Projector2.projectModuleName(fullname, localname).getElements()); + org.scribble.visit.global.Projector2.projectModuleName(fullname, localname).getElements()); } From 986c5fab215d88c5ad6cdd064a9fb1a78aabf2c5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 5 Apr 2019 17:16:58 +0100 Subject: [PATCH 172/539] Separate core protos from SType. --- .../src/main/java/org/scribble/job/Job2.java | 8 +-- .../main/java/org/scribble/lang/Protocol.java | 69 +++++++------------ .../main/java/org/scribble/lang/SNode.java | 9 +++ .../java/org/scribble/lang/global/GNode.java | 9 +++ .../org/scribble/lang/global/GProtocol.java | 54 ++++++--------- .../java/org/scribble/lang/local/LNode.java | 8 +++ .../org/scribble/lang/local/LProtocol.java | 27 +------- .../java/org/scribble/type/session/SType.java | 19 ++--- .../scribble/type/session/global/GType.java | 3 +- .../scribble/type/session/local/LType.java | 3 +- .../org/scribble/ast/global/GConnect.java | 6 +- .../org/scribble/ast/global/GDisconnect.java | 6 +- .../scribble/ast/global/GInteractionSeq.java | 2 +- .../scribble/ast/global/GMessageTransfer.java | 6 +- .../scribble/ast/global/GProtocolBlock.java | 2 +- .../scribble/ast/global/GProtocolDecl.java | 2 +- .../org/scribble/ast/global/GProtocolDef.java | 2 +- .../scribble/ast/global/GProtocolHeader.java | 2 +- .../global/{GNode.java => GScribNode.java} | 2 +- .../org/scribble/ast/global/GSessionNode.java | 2 +- .../java/org/scribble/ast/global/GWrap.java | 6 +- .../scribble/ast/local/LInteractionSeq.java | 2 +- .../scribble/ast/local/LProtocolBlock.java | 2 +- .../org/scribble/ast/local/LProtocolDecl.java | 2 +- .../org/scribble/ast/local/LProtocolDef.java | 2 +- .../scribble/ast/local/LProtocolHeader.java | 2 +- .../ast/local/{LNode.java => LScribNode.java} | 2 +- .../org/scribble/ast/local/LSessionNode.java | 2 +- .../org/scribble/del/global/GConnectDel.java | 4 +- .../java/org/scribble/del/global/GDel.java | 4 +- .../scribble/del/global/GDisconnectDel.java | 4 +- .../del/global/GInteractionSeqDel.java | 10 +-- .../del/global/GMessageTransferDel.java | 4 +- .../org/scribble/del/global/GWrapDel.java | 4 +- .../org/scribble/visit/GTypeTranslator.java | 7 +- .../visit/context/env/ProjectionEnv.java | 4 +- 36 files changed, 131 insertions(+), 171 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/lang/SNode.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/global/GNode.java create mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LNode.java rename scribble-lang/src/main/java/org/scribble/ast/global/{GNode.java => GScribNode.java} (93%) rename scribble-lang/src/main/java/org/scribble/ast/local/{LNode.java => LScribNode.java} (93%) diff --git a/scribble-core/src/main/java/org/scribble/job/Job2.java b/scribble-core/src/main/java/org/scribble/job/Job2.java index b35b7ea71..b050ec584 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job2.java +++ b/scribble-core/src/main/java/org/scribble/job/Job2.java @@ -23,6 +23,7 @@ import org.scribble.lang.SubprotoSig; import org.scribble.lang.context.ModuleContext; +import org.scribble.lang.global.GNode; import org.scribble.lang.global.GProtocol; import org.scribble.lang.local.LProtocol; import org.scribble.model.endpoint.EGraph; @@ -41,7 +42,6 @@ import org.scribble.type.name.ProtocolName; import org.scribble.type.name.Role; import org.scribble.type.session.Arg; -import org.scribble.type.session.global.GType; import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; import org.scribble.visit.global.Projector2; @@ -146,7 +146,7 @@ else if (n instanceof MessageSigName) { STypeUnfolder unf1 = new STypeUnfolder<>(); //GTypeUnfolder unf2 = new GTypeUnfolder(); - GType unf = (GType) inlined.unfoldAllOnce(unf1);//.unfoldAllOnce(unf2); CHECKME: twice unfolding? instead of "unguarded"-unfolding? + GProtocol unf = (GProtocol) inlined.unfoldAllOnce(unf1);//.unfoldAllOnce(unf2); CHECKME: twice unfolding? instead of "unguarded"-unfolding? debugPrintln("\nAll recursions unfolded once:\n" + unf); } @@ -293,7 +293,7 @@ public Map getProjections(GProtocolName fullname, LProtocol proj = this.context.getProjection(fullname, role); - List> ps = proj.getProtoDependencies(); + List> ps = proj.def.getProtoDependencies(); for (ProtocolName p : ps) { System.out.println("\n" + this.context.getProjection((LProtocolName) p)); @@ -303,7 +303,7 @@ public Map getProjections(GProtocolName fullname, System.out.println("\n" + proj); } - List> ns = proj.getNonProtoDependencies(); + List> ns = proj.def.getNonProtoDependencies(); warningPrintln(""); warningPrintln("[TODO] Full module projection and imports: " diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/lang/Protocol.java index 89a7ee55c..b86686235 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/Protocol.java @@ -15,7 +15,6 @@ import java.util.Collections; import java.util.List; -import java.util.Set; import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; @@ -23,19 +22,19 @@ import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.DataType; import org.scribble.type.name.MemberName; -import org.scribble.type.name.MessageId; import org.scribble.type.name.MessageSigName; import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; -import org.scribble.type.session.STypeBase; import org.scribble.type.session.Seq; import org.scribble.util.Constants; +import org.scribble.visit.STypeInliner; +import org.scribble.visit.STypeUnfolder; public abstract class Protocol, B extends Seq> - extends STypeBase + implements SNode { + private final CommonTree source; // CHECKME: factor out with SType(Base) ? + public final List mods; public final N fullname; public final List roles; // Ordered role params; pre: size >= 2 @@ -47,7 +46,7 @@ public abstract class Protocol public Protocol(CommonTree source, List mods, N fullname, List roles, List> params, B def) { - super(source); + this.source = source; // CHECKME: factor out with SType(Base) ? this.mods = Collections.unmodifiableList(mods); this.fullname = fullname; this.roles = Collections.unmodifiableList(roles); @@ -68,55 +67,31 @@ public boolean isExplicit() { return this.mods.contains(ProtocolMod.EXPLICIT); } - - // FIXME: confusing with this.roles List -- refactor: Protocol shouldn't be a SType - @Override - public Set getRoles() - { - throw new RuntimeException("Unsupported for Protocol: " + this); - } - - @Override - public Set> getMessageIds() - { - throw new RuntimeException("Unsupported for Protocol: " + this); - } - @Override - public Set getRecVars() - { - throw new RuntimeException("Unsupported for Protocol: " + this); - } - - @Override - public Protocol substitute(Substitutions subs) + /*@Override + public List> getProtoDependencies() { - // CHECKME: needed? - /*List roles = this.roles.stream().map(x -> subs.subsRole(x)) - .collect(Collectors.toList()); - List> params = this.params.stream().map(x -> ...) - .collect(Collectors.toList()); - return reconstruct(getSource(), this.mods, this.fullname, roles, - this.def.substitute(subs));*/ - throw new RuntimeException("Unsupported for Protocol: " + this); + return this.def.getProtoDependencies(); } @Override - public Protocol pruneRecs() + public List> getNonProtoDependencies() { - throw new RuntimeException("Unsupported for Protocol: " + this); - } + return this.def.getNonProtoDependencies(); + }*/ - @Override - public List> getProtoDependencies() + public abstract Protocol getInlined(STypeInliner v); + public abstract Protocol unfoldAllOnce(STypeUnfolder u); + + public boolean hasSource() // i.e., was parsed { - return this.def.getProtoDependencies(); + return this.source != null; } - @Override - public List> getNonProtoDependencies() + // CHECKME: factor out with SType(Base) ? + public CommonTree getSource() // Pre: hasSource { - return this.def.getNonProtoDependencies(); + return this.source; } @Override @@ -186,9 +161,11 @@ public boolean equals(Object o) return false; } Protocol them = (Protocol) o; - return super.equals(this) // Does canEquals + return them.canEquals(this) && this.mods.equals(them.mods) && this.fullname.equals(them.fullname) && this.roles.equals(them.roles) && this.params.equals(them.params) && this.def.equals(them.def); } + + public abstract boolean canEquals(Object o); } diff --git a/scribble-core/src/main/java/org/scribble/lang/SNode.java b/scribble-core/src/main/java/org/scribble/lang/SNode.java new file mode 100644 index 000000000..51e46ca96 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/SNode.java @@ -0,0 +1,9 @@ +package org.scribble.lang; + +import org.antlr.runtime.tree.CommonTree; + +public interface SNode +{ + boolean hasSource(); // i.e., was parsed + CommonTree getSource(); // Pre: hasSource +} diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GNode.java b/scribble-core/src/main/java/org/scribble/lang/global/GNode.java new file mode 100644 index 000000000..0c419800e --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/global/GNode.java @@ -0,0 +1,9 @@ +package org.scribble.lang.global; + +import org.scribble.lang.SNode; + +// Mainly for GDel.translate return (to include GProtocol) +public interface GNode extends SNode +{ + +} diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java index 1bbb8f83d..6c540bcb1 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java @@ -47,15 +47,14 @@ import org.scribble.type.name.Substitutions; import org.scribble.type.session.global.GRecursion; import org.scribble.type.session.global.GSeq; -import org.scribble.type.session.global.GType; import org.scribble.type.session.local.LSeq; import org.scribble.util.ScribUtil2; import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; import org.scribble.visit.global.Projector2; -public class GProtocol extends - Protocol implements GType +public class GProtocol extends Protocol + implements GNode // Mainly for GDel.translate return (to include GProtocol) { public GProtocol(CommonTree source, List mods, GProtocolName fullname, List roles, @@ -99,9 +98,22 @@ public GProtocol unfoldAllOnce(STypeUnfolder u) return reconstruct(getSource(), this.mods, this.fullname, this.roles, this.params, unf); } + + // Following are some top-level entry to GType methods + public Set checkRoleEnabling() throws ScribbleException + { + Set tmp = this.roles.stream().collect(Collectors.toSet()); + return this.def.checkRoleEnabling(tmp); + } + + public Map checkExtChoiceConsistency() throws ScribbleException + { + Map tmp = this.roles.stream() + .collect(Collectors.toMap(x -> x, x -> x)); + return this.def.checkExtChoiceConsistency(tmp); + } // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) - @Override public LProjection projectInlined(Role self) { LSeq body = (LSeq) this.def.projectInlined(self); @@ -122,7 +134,6 @@ private LProjection projectAux(Role self, List decls, LSeq body) body); } - @Override public LProjection project(Projector2 v) { LSeq body = (LSeq) this.def.project(v).pruneRecs(); @@ -130,35 +141,6 @@ public LProjection project(Projector2 v) v.job.getContext().getInlined(this.fullname).roles, // Used inlined decls, already pruned body); } - - @Override - public Set checkRoleEnabling(Set enabled) throws ScribbleException - { - throw new RuntimeException("Unsupported for Protocol: " + this); - } - - // FIXME: top-level overriding pattern inconsistent with, e.g., getInlined -- though maybe should be fixing the latter - // CHECKME: refactor Protocol out of SType? Also Do -- but harder because Do needs to be in Seq - public Set checkRoleEnabling() throws ScribbleException - { - Set tmp = //Collections.unmodifiableSet( - new HashSet<>(this.roles); - return this.def.checkRoleEnabling(tmp); - } - - @Override - public Map checkExtChoiceConsistency(Map enablers) - throws ScribbleException - { - throw new RuntimeException("Unsupported for Protocol: " + this); - } - - public Map checkExtChoiceConsistency() throws ScribbleException - { - Map tmp = this.roles.stream() - .collect(Collectors.toMap(x -> x, x -> x)); - return this.def.checkExtChoiceConsistency(tmp); - } @Override public String toString() @@ -195,6 +177,10 @@ public boolean canEquals(Object o) return o instanceof GProtocol; } + + + // TODO FIXME: refactor following methods (e.g., make non-static?) + public static void validateByScribble(Job2 job2, GProtocolName fullname, boolean fair) throws ScribbleException { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LNode.java b/scribble-core/src/main/java/org/scribble/lang/local/LNode.java new file mode 100644 index 000000000..01f40c98f --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/lang/local/LNode.java @@ -0,0 +1,8 @@ +package org.scribble.lang.local; + +import org.scribble.lang.SNode; + +public interface LNode extends SNode +{ + +} diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java index 39fa1b6a9..b70c7459a 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java @@ -15,7 +15,6 @@ import java.util.Collections; import java.util.List; -import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -37,14 +36,13 @@ import org.scribble.type.name.Substitutions; import org.scribble.type.session.local.LRecursion; import org.scribble.type.session.local.LSeq; -import org.scribble.type.session.local.LType; import org.scribble.util.Constants; import org.scribble.visit.STypeInliner; import org.scribble.visit.STypeUnfolder; import org.scribble.visit.local.ReachabilityEnv; -public class LProtocol extends - Protocol implements LType +public class LProtocol extends Protocol + implements LNode { public final Role self; @@ -62,12 +60,6 @@ public LProtocol reconstruct(CommonTree source, { return new LProtocol(source, mods, fullname, roles, self, params, def); } - - @Override - public boolean isSingleConts(Set rvs) - { - throw new RuntimeException("Unsupported for LProtocol:\n" + this); - } // CHECKME: drop from Protocol (after removing Protocol from SType?) // Pre: stack.peek is the sig for the calling Do (or top-level entry) @@ -81,7 +73,7 @@ public LProtocol getInlined(STypeInliner v)//, Deque stack) LSeq body = this.def.substitute(subs).getInlined(v).pruneRecs(); RecVar rv = v.getInlinedRecVar(sig); LRecursion rec = new LRecursion(null, rv, body); // CHECKME: or protodecl source? - CommonTree source = getSource(); + CommonTree source = getSource(); // CHECKME: or null source? LSeq def = new LSeq(null, Stream.of(rec).collect(Collectors.toList())); return new LProtocol(source, this.mods, this.fullname, this.roles, this.self, this.params, def); @@ -111,19 +103,6 @@ public EGraph toEGraph(Job2 job) EState term = init.getTerminal(); return new EGraph(init, term);*/ } - - @Override - public void buildGraph(EGraphBuilderUtil2 b) - { - this.def.buildGraph(b); - } - - @Override - public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribbleException - { - throw new RuntimeException("Unsupported for Protocol: " + this); - } public ReachabilityEnv checkReachability() throws ScribbleException diff --git a/scribble-core/src/main/java/org/scribble/type/session/SType.java b/scribble-core/src/main/java/org/scribble/type/session/SType.java index 7279d7a95..2b65f0106 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/type/session/SType.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Set; -import org.antlr.runtime.tree.CommonTree; +import org.scribble.lang.SNode; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.MemberName; import org.scribble.type.name.MessageId; @@ -30,10 +30,8 @@ // B needed(?) to factor up several methods from G/L compounds to bases, e.g., getInlined and unfoldAllOnce // Generic works to "specialise" G/L subclasses (and works with immutable pattern) -- cf. not supported by contravariant method parameter subtyping for getters/setters public interface SType> + extends SNode { - boolean hasSource(); // i.e., was parsed - CommonTree getSource(); // Pre: hasSource - // Unsupported for Protocol (Protocol should not be an SType) Set getRoles(); Set> getMessageIds(); @@ -43,25 +41,18 @@ public interface SType> Set getRecVars(); SType pruneRecs(); // Assumes no shadowing (e.g., use after inlining recvar disamb) - // Top-level call should be on a GProtocol with an empty stack -- XXX - // stack is treated mutably - // Do stack.push to push the next sig onto the stack - // - // Pre: stack.peek gives call-site sig, i.e., call-site roles/args // CHECKME: OK to (re-)use GTypeTranslator for inlining? - // Stack not "internalised", must be "manually" managed -- cf., SubprotocolVisitor - //SessType getInlined(GTypeTranslator t, Deque stack); // FIXME: generalise for locals SType getInlined(STypeInliner i); // Unsupported for Do - // FIXME: repeat recvar names, including non-shadowing (e.g., choice cases) + // CHECKME: repeat recvar names OK? including non-shadowing (e.g., choice cases) SType unfoldAllOnce(STypeUnfolder u); // Resulting Lists should not contain duplicates (i.e., Choice/Seq) - // Result does not necessarily contain root proto, but may do so via dependencies + // Result does not necessarily contain root proto (protodecl is not an SType), but may do so via dependencies List> getProtoDependencies(); List> getNonProtoDependencies(); // N.B. delegation payloads currently here, not getProtoDependencies (CHECKME: refactor?) - // Call this using: them.canEquals(this) + // subclass equals should call this by: them.canEquals(this) boolean canEquals(Object o); } diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GType.java b/scribble-core/src/main/java/org/scribble/type/session/global/GType.java index a96956c4f..df03b9019 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/type/session/global/GType.java @@ -17,13 +17,14 @@ import java.util.Set; import org.scribble.job.ScribbleException; +import org.scribble.lang.global.GNode; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; import org.scribble.type.session.SType; import org.scribble.type.session.local.LType; import org.scribble.visit.global.Projector2; -public interface GType extends SType +public interface GType extends SType, GNode { LType projectInlined(Role self); // Use on inlined (i.e., Do inlined, roles pruned) LType project(Projector2 v); // Use on parsed (intermed) diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LType.java b/scribble-core/src/main/java/org/scribble/type/session/local/LType.java index 8aeb205eb..13f359279 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/type/session/local/LType.java @@ -16,13 +16,14 @@ import java.util.Set; import org.scribble.job.ScribbleException; +import org.scribble.lang.local.LNode; import org.scribble.model.endpoint.EGraphBuilderUtil2; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; import org.scribble.type.session.SType; import org.scribble.visit.local.ReachabilityEnv; -public interface LType extends SType +public interface LType extends SType, LNode { //Role getSelf(); // CHECKME: useful? diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GConnect.java b/scribble-lang/src/main/java/org/scribble/ast/global/GConnect.java index f4228095c..d088519cb 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GConnect.java +++ b/scribble-lang/src/main/java/org/scribble/ast/global/GConnect.java @@ -18,7 +18,7 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.ConnectAction; import org.scribble.ast.MessageNode; -import org.scribble.ast.local.LNode; +import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.type.kind.Global; import org.scribble.type.kind.RoleKind; @@ -47,12 +47,12 @@ public GConnect dupNode() return new GConnect(this); } - public LNode project(AstFactory af, Role self) + public LScribNode project(AstFactory af, Role self) { Role src = this.getSourceChild().toName(); MessageNode msgNode = this.getMessageNodeChild(); Role dest = this.getDestinationChild().toName(); - LNode proj = null; + LScribNode proj = null; if (src.equals(self) || dest.equals(self)) { if (src.equals(dest)) diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GDisconnect.java b/scribble-lang/src/main/java/org/scribble/ast/global/GDisconnect.java index 4743b95c8..887ca1d0b 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GDisconnect.java +++ b/scribble-lang/src/main/java/org/scribble/ast/global/GDisconnect.java @@ -17,7 +17,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.DisconnectAction; -import org.scribble.ast.local.LNode; +import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.type.kind.Global; import org.scribble.type.kind.RoleKind; @@ -45,13 +45,13 @@ public GDisconnect dupNode() return new GDisconnect(this); } - public LNode project(AstFactory af, Role self) + public LScribNode project(AstFactory af, Role self) { RoleNode leftNode = this.getLeftChild(); RoleNode rightNode = this.getRightChild(); Role left = leftNode.toName(); Role right = rightNode.toName(); - LNode proj = null; + LScribNode proj = null; if (left.equals(self) || right.equals(self)) { RoleNode leftNode1 = (RoleNode) af.SimpleNameNode(leftNode.getSource(), diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GInteractionSeq.java b/scribble-lang/src/main/java/org/scribble/ast/global/GInteractionSeq.java index 2ca2a09be..c7681946d 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GInteractionSeq.java +++ b/scribble-lang/src/main/java/org/scribble/ast/global/GInteractionSeq.java @@ -25,7 +25,7 @@ import org.scribble.type.kind.Global; import org.scribble.type.name.Role; -public class GInteractionSeq extends InteractionSeq implements GNode +public class GInteractionSeq extends InteractionSeq implements GScribNode { // ScribTreeAdaptor#create constructor public GInteractionSeq(Token t) diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GMessageTransfer.java b/scribble-lang/src/main/java/org/scribble/ast/global/GMessageTransfer.java index 2f0a5f787..6a5a63b8e 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GMessageTransfer.java +++ b/scribble-lang/src/main/java/org/scribble/ast/global/GMessageTransfer.java @@ -23,7 +23,7 @@ import org.scribble.ast.MessageNode; import org.scribble.ast.MessageTransfer; import org.scribble.ast.local.LSessionNode; -import org.scribble.ast.local.LNode; +import org.scribble.ast.local.LScribNode; import org.scribble.ast.local.LReceive; import org.scribble.ast.name.simple.RoleNode; import org.scribble.type.kind.Global; @@ -52,12 +52,12 @@ public GMessageTransfer dupNode() return new GMessageTransfer(this); } - public LNode project(AstFactory af, Role self) + public LScribNode project(AstFactory af, Role self) { RoleNode srcNode = getSourceChild(); Role src = srcNode.toName(); List dests = this.getDestinationRoles(); - LNode proj = null; + LScribNode proj = null; if (src.equals(self) || dests.contains(self)) { RoleNode srcNode1 = (RoleNode) af.SimpleNameNode(srcNode.getSource(), diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolBlock.java b/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolBlock.java index a3388b6e3..f0b70dd51 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolBlock.java +++ b/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolBlock.java @@ -22,7 +22,7 @@ import org.scribble.type.kind.Global; import org.scribble.type.name.Role; -public class GProtocolBlock extends ProtocolBlock implements GNode +public class GProtocolBlock extends ProtocolBlock implements GScribNode { // ScribTreeAdaptor#create constructor public GProtocolBlock(Token t) diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDecl.java b/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDecl.java index 03f65d1b3..018fe50ae 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDecl.java +++ b/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDecl.java @@ -29,7 +29,7 @@ import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; -public class GProtocolDecl extends ProtocolDecl implements GNode +public class GProtocolDecl extends ProtocolDecl implements GScribNode { // ScribTreeAdaptor#create constructor public GProtocolDecl(Token t) diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDef.java b/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDef.java index 901b4f36f..8ca610380 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDef.java +++ b/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDef.java @@ -22,7 +22,7 @@ import org.scribble.type.kind.Global; import org.scribble.type.name.Role; -public class GProtocolDef extends ProtocolDef implements GNode +public class GProtocolDef extends ProtocolDef implements GScribNode { // ScribTreeAdaptor#create constructor public GProtocolDef(Token t) diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolHeader.java b/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolHeader.java index b6385c473..1af6f93a5 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolHeader.java +++ b/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolHeader.java @@ -27,7 +27,7 @@ import org.scribble.type.name.Role; import org.scribble.util.Constants; -public class GProtocolHeader extends ProtocolHeader implements GNode +public class GProtocolHeader extends ProtocolHeader implements GScribNode { // ScribTreeAdaptor#create constructor public GProtocolHeader(Token t) diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GNode.java b/scribble-lang/src/main/java/org/scribble/ast/global/GScribNode.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/ast/global/GNode.java rename to scribble-lang/src/main/java/org/scribble/ast/global/GScribNode.java index 56f327cc7..f6589427d 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GNode.java +++ b/scribble-lang/src/main/java/org/scribble/ast/global/GScribNode.java @@ -16,7 +16,7 @@ import org.scribble.ast.ProtocolKindNode; import org.scribble.type.kind.Global; -public interface GNode extends ProtocolKindNode +public interface GScribNode extends ProtocolKindNode { @Override default boolean isGlobal() diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GSessionNode.java b/scribble-lang/src/main/java/org/scribble/ast/global/GSessionNode.java index c49f57f18..e5f5f5186 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GSessionNode.java +++ b/scribble-lang/src/main/java/org/scribble/ast/global/GSessionNode.java @@ -17,7 +17,7 @@ import org.scribble.type.kind.Global; // Alternatively to interface, use GlobalNode subclass with delegation to "super" base (e.g. Choice) classes -public interface GSessionNode extends SessionNode, GNode +public interface GSessionNode extends SessionNode, GScribNode { //public LInteractionSeq project(AstFactory af, Role self); // TODO } diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GWrap.java b/scribble-lang/src/main/java/org/scribble/ast/global/GWrap.java index 232f3c478..36289a40c 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GWrap.java +++ b/scribble-lang/src/main/java/org/scribble/ast/global/GWrap.java @@ -18,7 +18,7 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.ConnectAction; import org.scribble.ast.MessageSigNode; -import org.scribble.ast.local.LNode; +import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.type.kind.Global; import org.scribble.type.kind.RoleKind; @@ -39,13 +39,13 @@ public GWrap(GWrap node) super(node); } - public LNode project(AstFactory af, Role self) + public LScribNode project(AstFactory af, Role self) { RoleNode srcNode = getSourceChild(); RoleNode destNode = getDestinationChild(); Role srcrole = srcNode.toName(); Role destrole = destNode.toName(); - LNode projection = null; + LScribNode projection = null; if (srcrole.equals(self) || destrole.equals(self)) { RoleNode srcNode1 = (RoleNode) af.SimpleNameNode(srcNode.getSource(), diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LInteractionSeq.java b/scribble-lang/src/main/java/org/scribble/ast/local/LInteractionSeq.java index 0514f487b..deadae423 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LInteractionSeq.java +++ b/scribble-lang/src/main/java/org/scribble/ast/local/LInteractionSeq.java @@ -24,7 +24,7 @@ import org.scribble.type.kind.Local; import org.scribble.type.session.Message; -public class LInteractionSeq extends InteractionSeq implements LNode +public class LInteractionSeq extends InteractionSeq implements LScribNode { // ScribTreeAdaptor#create constructor public LInteractionSeq(Token t) diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolBlock.java b/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolBlock.java index 173c2f95b..322dace4a 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolBlock.java +++ b/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolBlock.java @@ -21,7 +21,7 @@ import org.scribble.type.kind.Local; import org.scribble.type.session.Message; -public class LProtocolBlock extends ProtocolBlock implements LNode +public class LProtocolBlock extends ProtocolBlock implements LScribNode { // ScribTreeAdaptor#create constructor public LProtocolBlock(Token t) diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDecl.java b/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDecl.java index b172c7892..c299e2e0b 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDecl.java +++ b/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDecl.java @@ -29,7 +29,7 @@ import org.scribble.type.name.Role; // CHECKME: maybe make abstract with concrete parsed (LParsedDecl) and projected (LProjectionDecl) subclasses -public class LProtocolDecl extends ProtocolDecl implements LNode +public class LProtocolDecl extends ProtocolDecl implements LScribNode { // ScribTreeAdaptor#create constructor public LProtocolDecl(Token t) diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDef.java b/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDef.java index fa445b7a5..54783325f 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDef.java +++ b/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDef.java @@ -18,7 +18,7 @@ import org.scribble.ast.ProtocolDef; import org.scribble.type.kind.Local; -public class LProtocolDef extends ProtocolDef implements LNode +public class LProtocolDef extends ProtocolDef implements LScribNode { // ScribTreeAdaptor#create constructor public LProtocolDef(Token t) diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolHeader.java b/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolHeader.java index 5f43ee924..3a010561f 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolHeader.java +++ b/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolHeader.java @@ -28,7 +28,7 @@ import org.scribble.type.name.Role; import org.scribble.util.Constants; -public class LProtocolHeader extends ProtocolHeader implements LNode +public class LProtocolHeader extends ProtocolHeader implements LScribNode { // ScribTreeAdaptor#create constructor public LProtocolHeader(Token t) diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LNode.java b/scribble-lang/src/main/java/org/scribble/ast/local/LScribNode.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/ast/local/LNode.java rename to scribble-lang/src/main/java/org/scribble/ast/local/LScribNode.java index 452759784..f835ec2d5 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LNode.java +++ b/scribble-lang/src/main/java/org/scribble/ast/local/LScribNode.java @@ -16,7 +16,7 @@ import org.scribble.ast.ProtocolKindNode; import org.scribble.type.kind.Local; -public interface LNode extends ProtocolKindNode +public interface LScribNode extends ProtocolKindNode { @Override default boolean isLocal() diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LSessionNode.java b/scribble-lang/src/main/java/org/scribble/ast/local/LSessionNode.java index 73f6c72d5..93dfda7bd 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LSessionNode.java +++ b/scribble-lang/src/main/java/org/scribble/ast/local/LSessionNode.java @@ -24,7 +24,7 @@ import org.scribble.visit.context.ProjectedChoiceSubjectFixer; // Alternatively to interface, use GlobalNode subclass with delegation to "super" base (e.g. Choice) classes -public interface LSessionNode extends SessionNode, LNode +public interface LSessionNode extends SessionNode, LScribNode { Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer); diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GConnectDel.java index 2f1f3e192..f617a9d72 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/global/GConnectDel.java @@ -18,7 +18,7 @@ import org.scribble.ast.MessageNode; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GConnect; -import org.scribble.ast.local.LNode; +import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ConnectionActionDel; import org.scribble.job.ScribbleException; @@ -109,7 +109,7 @@ public ScribNode leaveProjection(ScribNode parent, ScribNode child, { GConnect gc = (GConnect) visited; Role self = proj.peekSelf(); - LNode projection = gc.project(proj.job.config.af, self); + LScribNode projection = gc.project(proj.job.config.af, self); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GConnect) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gc); diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GDel.java index da6cd6bca..7e5ed96a1 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/global/GDel.java @@ -16,12 +16,12 @@ import org.scribble.ast.ScribNode; import org.scribble.del.ScribDel; import org.scribble.job.ScribbleException; -import org.scribble.type.session.global.GType; +import org.scribble.lang.global.GNode; import org.scribble.visit.GTypeTranslator; public interface GDel extends ScribDel { - default GType translate(ScribNode n, GTypeTranslator t) + default GNode translate(ScribNode n, GTypeTranslator t) throws ScribbleException { throw new RuntimeException("TODO: " + n); diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GDisconnectDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GDisconnectDel.java index 399671b5f..2bacecf14 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GDisconnectDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/global/GDisconnectDel.java @@ -15,7 +15,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GDisconnect; -import org.scribble.ast.local.LNode; +import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ConnectionActionDel; import org.scribble.job.ScribbleException; @@ -108,7 +108,7 @@ public ScribNode leaveProjection(ScribNode parent, ScribNode child, { GDisconnect gd = (GDisconnect) visited; Role self = proj.peekSelf(); - LNode projection = gd.project(proj.job.config.af, self); + LScribNode projection = gd.project(proj.job.config.af, self); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GDisconnect) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gd); diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GInteractionSeqDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GInteractionSeqDel.java index f0ef8f12f..292744e7e 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GInteractionSeqDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/global/GInteractionSeqDel.java @@ -19,12 +19,12 @@ import java.util.stream.Stream; import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GInteractionSeq; import org.scribble.ast.global.GRecursion; -import org.scribble.ast.local.LSessionNode; +import org.scribble.ast.global.GSessionNode; import org.scribble.ast.local.LInteractionSeq; -import org.scribble.ast.local.LNode; +import org.scribble.ast.local.LScribNode; +import org.scribble.ast.local.LSessionNode; import org.scribble.del.InteractionSeqDel; import org.scribble.del.ScribDelBase; import org.scribble.job.ScribbleException; @@ -48,7 +48,7 @@ public GSeq translate(ScribNode n, GTypeTranslator t) List elems = new LinkedList<>(); for (GSessionNode c : source.getInteractionChildren()) { - elems.add(c.visitWith(t)); // throws ScribbleException + elems.add((GType) c.visitWith(t)); // throws ScribbleException } return new GSeq(source, elems); } @@ -93,7 +93,7 @@ public GInteractionSeq leaveProjection(ScribNode parent, ScribNode child, List lis = new LinkedList<>(); for (GSessionNode gi : gis.getInteractionChildren()) // FIXME: rewrite using flatMap { - LNode ln = (LNode) ((ProjectionEnv) gi.del().env()).getProjection(); + LScribNode ln = (LScribNode) ((ProjectionEnv) gi.del().env()).getProjection(); //LNode ln = ((GInteractionNodeDel) gi.del()).project(gi, self); // FIXME: won't work for do // TODO: move node-specific projects to G nodes (not dels) and take child projections as params, bit like reconstruct if (ln instanceof LInteractionSeq) // Self comm sequence diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GMessageTransferDel.java index 0ed4a1729..cd6ab27d8 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -17,7 +17,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GMessageTransfer; -import org.scribble.ast.local.LNode; +import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.MessageTransferDel; import org.scribble.job.ScribbleException; @@ -109,7 +109,7 @@ public ScribNode leaveProjection(ScribNode parent, ScribNode child, { GMessageTransfer gmt = (GMessageTransfer) visited; Role self = proj.peekSelf(); - LNode projection = gmt.project(proj.job.config.af, self); + LScribNode projection = gmt.project(proj.job.config.af, self); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GMessageTransfer) GSimpleInteractionNodeDel.super.leaveProjection( parent, child, proj, gmt); diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GWrapDel.java b/scribble-lang/src/main/java/org/scribble/del/global/GWrapDel.java index b401dec36..cc0b76fe9 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GWrapDel.java +++ b/scribble-lang/src/main/java/org/scribble/del/global/GWrapDel.java @@ -15,7 +15,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GWrap; -import org.scribble.ast.local.LNode; +import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ConnectionActionDel; import org.scribble.job.ScribbleException; @@ -90,7 +90,7 @@ public ScribNode leaveProjection(ScribNode parent, ScribNode child, { GWrap gw = (GWrap) visited; Role self = proj.peekSelf(); - LNode projection = gw.project(proj.job.config.af, self); + LScribNode projection = gw.project(proj.job.config.af, self); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GWrap) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gw); diff --git a/scribble-lang/src/main/java/org/scribble/visit/GTypeTranslator.java b/scribble-lang/src/main/java/org/scribble/visit/GTypeTranslator.java index 24463324c..a789be887 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/GTypeTranslator.java +++ b/scribble-lang/src/main/java/org/scribble/visit/GTypeTranslator.java @@ -17,12 +17,11 @@ import org.scribble.del.global.GDel; import org.scribble.job.Job; import org.scribble.job.ScribbleException; +import org.scribble.lang.global.GNode; import org.scribble.type.name.ModuleName; -import org.scribble.type.session.global.GType; -import org.scribble.visit.SimpleVisitor; // CHECKME: move to visit package? -public class GTypeTranslator extends SimpleVisitor +public class GTypeTranslator extends SimpleVisitor { public GTypeTranslator(Job job, ModuleName mod) { @@ -30,7 +29,7 @@ public GTypeTranslator(Job job, ModuleName mod) } @Override - public GType visit(ScribNode n) throws ScribbleException + public GNode visit(ScribNode n) throws ScribbleException { return ((GDel) n.del()).translate(n, this); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java b/scribble-lang/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java index 6e799ad2a..2fa98731c 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java +++ b/scribble-lang/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java @@ -14,7 +14,7 @@ package org.scribble.visit.context.env; import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LNode; +import org.scribble.ast.local.LScribNode; import org.scribble.visit.env.Env; // Could make projection type a class parameter @@ -46,7 +46,7 @@ public ScribNode getProjection() return this.projection; } - public ProjectionEnv setProjection(LNode projection) + public ProjectionEnv setProjection(LScribNode projection) { ProjectionEnv copy = new ProjectionEnv(); copy.projection = projection; From de89facb7b2172050adc2571ce5486781ed52c6b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 5 Apr 2019 18:16:52 +0100 Subject: [PATCH 173/539] Continued: refactoring and renaming modules/packages. --- pom.xml | 4 +- {scribble-lang => scribble-ast}/pom.xml | 4 +- .../java/org/scribble/ast/AstFactory.java | 10 +- .../java/org/scribble/ast/AstFactoryImpl.java | 28 ++--- .../main/java/org/scribble/ast/AuxMod.java | 0 .../org/scribble/ast/BasicInteraction.java | 2 +- .../main/java/org/scribble/ast/Choice.java | 4 +- .../org/scribble/ast/CompoundInteraction.java | 2 +- .../java/org/scribble/ast/CompoundNode.java | 0 .../java/org/scribble/ast/ConnectAction.java | 2 +- .../main/java/org/scribble/ast/Continue.java | 4 +- .../java/org/scribble/ast/DataTypeDecl.java | 6 +- .../org/scribble/ast/DirectedInteraction.java | 6 +- .../org/scribble/ast/DisconnectAction.java | 4 +- .../src/main/java/org/scribble/ast/Do.java | 16 +-- .../src/main/java/org/scribble/ast/DoArg.java | 4 +- .../main/java/org/scribble/ast/DoArgList.java | 4 +- .../main/java/org/scribble/ast/DoArgNode.java | 0 .../java/org/scribble/ast/ExplicitMod.java | 0 .../org/scribble/ast/HeaderParamDecl.java | 6 +- .../org/scribble/ast/HeaderParamDeclList.java | 6 +- .../java/org/scribble/ast/ImportDecl.java | 4 +- .../java/org/scribble/ast/ImportModule.java | 6 +- .../java/org/scribble/ast/InteractionSeq.java | 4 +- .../java/org/scribble/ast/MessageNode.java | 2 +- .../org/scribble/ast/MessageSigNameDecl.java | 6 +- .../java/org/scribble/ast/MessageSigNode.java | 4 +- .../org/scribble/ast/MessageTransfer.java | 2 +- .../main/java/org/scribble/ast/Module.java | 16 +-- .../java/org/scribble/ast/ModuleDecl.java | 6 +- .../java/org/scribble/ast/ModuleMember.java | 4 +- .../java/org/scribble/ast/NameDeclNode.java | 4 +- .../org/scribble/ast/NonProtocolDecl.java | 4 +- .../java/org/scribble/ast/NonRoleArg.java | 2 +- .../java/org/scribble/ast/NonRoleArgList.java | 14 +-- .../java/org/scribble/ast/NonRoleArgNode.java | 4 +- .../org/scribble/ast/NonRoleParamDecl.java | 4 +- .../scribble/ast/NonRoleParamDeclList.java | 6 +- .../java/org/scribble/ast/PayloadElem.java | 4 +- .../org/scribble/ast/PayloadElemList.java | 6 +- .../java/org/scribble/ast/ProtocolBlock.java | 4 +- .../java/org/scribble/ast/ProtocolDecl.java | 6 +- .../java/org/scribble/ast/ProtocolDef.java | 4 +- .../java/org/scribble/ast/ProtocolHeader.java | 6 +- .../org/scribble/ast/ProtocolKindNode.java | 2 +- .../java/org/scribble/ast/ProtocolMod.java | 2 +- .../org/scribble/ast/ProtocolModList.java | 2 +- .../main/java/org/scribble/ast/Recursion.java | 4 +- .../main/java/org/scribble/ast/RoleArg.java | 4 +- .../java/org/scribble/ast/RoleArgList.java | 2 +- .../main/java/org/scribble/ast/RoleDecl.java | 6 +- .../java/org/scribble/ast/RoleDeclList.java | 4 +- .../java/org/scribble/ast/ScopedNode.java | 4 +- .../main/java/org/scribble/ast/ScribNil.java | 0 .../main/java/org/scribble/ast/ScribNode.java | 2 +- .../java/org/scribble/ast/ScribNodeBase.java | 10 +- .../java/org/scribble/ast/SessionNode.java | 2 +- .../java/org/scribble/ast/SigParamDecl.java | 6 +- .../org/scribble/ast/SimpleSessionNode.java | 2 +- .../java/org/scribble/ast/TypeParamDecl.java | 6 +- .../org/scribble/ast/UnaryPayloadElem.java | 6 +- .../scribble/ast/context/DependencyMap.java | 4 +- .../ast/context/ProtocolDeclContext.java | 6 +- .../ast/context/global/GDependencyMap.java | 2 +- .../context/global/GProtocolDeclContext.java | 4 +- .../ast/context/local/LDependencyMap.java | 2 +- .../context/local/LProjectionDeclContext.java | 4 +- .../context/local/LProtocolDeclContext.java | 4 +- .../java/org/scribble/ast/global/GChoice.java | 8 +- .../ast/global/GCompoundInteraction.java | 0 .../org/scribble/ast/global/GConnect.java | 6 +- .../org/scribble/ast/global/GContinue.java | 6 +- .../scribble/ast/global/GDelegationElem.java | 8 +- .../org/scribble/ast/global/GDisconnect.java | 6 +- .../java/org/scribble/ast/global/GDo.java | 12 +-- .../scribble/ast/global/GInteractionSeq.java | 4 +- .../scribble/ast/global/GMessageTransfer.java | 6 +- .../scribble/ast/global/GProtocolBlock.java | 4 +- .../scribble/ast/global/GProtocolDecl.java | 8 +- .../org/scribble/ast/global/GProtocolDef.java | 4 +- .../scribble/ast/global/GProtocolHeader.java | 6 +- .../org/scribble/ast/global/GRecursion.java | 6 +- .../org/scribble/ast/global/GScribNode.java | 2 +- .../org/scribble/ast/global/GSessionNode.java | 2 +- .../ast/global/GSimpleSessionNode.java | 0 .../java/org/scribble/ast/global/GWrap.java | 6 +- .../java/org/scribble/ast/local/LAccept.java | 8 +- .../java/org/scribble/ast/local/LChoice.java | 8 +- .../ast/local/LCompoundInteraction.java | 0 .../scribble/ast/local/LConnectionAction.java | 2 +- .../org/scribble/ast/local/LContinue.java | 8 +- .../scribble/ast/local/LDelegationElem.java | 2 +- .../org/scribble/ast/local/LDisconnect.java | 10 +- .../main/java/org/scribble/ast/local/LDo.java | 20 ++-- .../scribble/ast/local/LInteractionSeq.java | 4 +- .../scribble/ast/local/LMessageTransfer.java | 2 +- .../scribble/ast/local/LProjectionDecl.java | 0 .../scribble/ast/local/LProtocolBlock.java | 4 +- .../org/scribble/ast/local/LProtocolDecl.java | 8 +- .../org/scribble/ast/local/LProtocolDef.java | 2 +- .../scribble/ast/local/LProtocolHeader.java | 8 +- .../java/org/scribble/ast/local/LReceive.java | 8 +- .../org/scribble/ast/local/LRecursion.java | 8 +- .../java/org/scribble/ast/local/LRequest.java | 8 +- .../org/scribble/ast/local/LScribNode.java | 2 +- .../java/org/scribble/ast/local/LSend.java | 8 +- .../org/scribble/ast/local/LSessionNode.java | 8 +- .../ast/local/LSimpleSessionNode.java | 0 .../org/scribble/ast/local/LWrapClient.java | 8 +- .../org/scribble/ast/local/LWrapServer.java | 8 +- .../org/scribble/ast/local/SelfRoleDecl.java | 2 +- .../java/org/scribble/ast/name/NameNode.java | 4 +- .../ast/name/PayloadElemNameNode.java | 4 +- .../ast/name/qualified/DataTypeNode.java | 6 +- .../ast/name/qualified/GProtocolNameNode.java | 4 +- .../ast/name/qualified/LProtocolNameNode.java | 6 +- .../ast/name/qualified/MemberNameNode.java | 6 +- .../name/qualified/MessageSigNameNode.java | 4 +- .../ast/name/qualified/ModuleNameNode.java | 6 +- .../ast/name/qualified/ProtocolNameNode.java | 4 +- .../ast/name/qualified/QualifiedNameNode.java | 2 +- .../ast/name/simple/AmbigNameNode.java | 14 +-- .../name/simple/DummyProjectionRoleNode.java | 2 +- .../org/scribble/ast/name/simple/IdNode.java | 8 +- .../ast/name/simple/NonRoleParamNode.java | 2 +- .../org/scribble/ast/name/simple/OpNode.java | 4 +- .../scribble/ast/name/simple/RecVarNode.java | 4 +- .../scribble/ast/name/simple/RoleNode.java | 4 +- .../ast/name/simple/SigParamNode.java | 4 +- .../ast/name/simple/SimpleNameNode.java | 4 +- .../ast/name/simple/TypeParamNode.java | 4 +- .../main/java/org/scribble/del/ChoiceDel.java | 2 +- .../scribble/del/CompoundInteractionDel.java | 2 +- .../scribble/del/CompoundSessionNodeDel.java | 2 +- .../org/scribble/del/ConnectionActionDel.java | 2 +- .../java/org/scribble/del/ContinueDel.java | 4 +- .../java/org/scribble/del/DefaultDel.java | 0 .../java/org/scribble/del/DelDecorator.java | 0 .../org/scribble/del/DelDecoratorImpl.java | 0 .../java/org/scribble/del/DoArgListDel.java | 10 +- .../src/main/java/org/scribble/del/DoDel.java | 16 +-- .../scribble/del/HeaderParamDeclListDel.java | 2 +- .../org/scribble/del/ImportModuleDel.java | 0 .../org/scribble/del/InteractionNodeDel.java | 0 .../org/scribble/del/InteractionSeqDel.java | 2 +- .../org/scribble/del/MessageTransferDel.java | 4 +- .../main/java/org/scribble/del/ModuleDel.java | 12 +-- .../org/scribble/del/NonRoleArgListDel.java | 8 +- .../org/scribble/del/NonRoleParamDeclDel.java | 2 +- .../scribble/del/NonRoleParamDeclListDel.java | 0 .../org/scribble/del/ProtocolBlockDel.java | 2 +- .../org/scribble/del/ProtocolDeclDel.java | 12 +-- .../java/org/scribble/del/ProtocolDefDel.java | 4 +- .../java/org/scribble/del/RecursionDel.java | 4 +- .../java/org/scribble/del/RoleArgListDel.java | 4 +- .../java/org/scribble/del/RoleDeclDel.java | 4 +- .../org/scribble/del/RoleDeclListDel.java | 0 .../main/java/org/scribble/del/ScribDel.java | 2 +- .../java/org/scribble/del/ScribDelBase.java | 0 .../scribble/del/SimpleSessionNodeDel.java | 2 +- .../org/scribble/del/global/GChoiceDel.java | 14 +-- .../global/GCompoundInteractionNodeDel.java | 0 .../org/scribble/del/global/GConnectDel.java | 10 +- .../org/scribble/del/global/GContinueDel.java | 8 +- .../java/org/scribble/del/global/GDel.java | 4 +- .../del/global/GDelegationElemDel.java | 12 +-- .../scribble/del/global/GDisconnectDel.java | 8 +- .../java/org/scribble/del/global/GDoDel.java | 22 ++-- .../del/global/GInteractionNodeDel.java | 2 +- .../del/global/GInteractionSeqDel.java | 6 +- .../del/global/GMessageTransferDel.java | 10 +- .../del/global/GProtocolBlockDel.java | 4 +- .../scribble/del/global/GProtocolDeclDel.java | 20 ++-- .../scribble/del/global/GProtocolDefDel.java | 8 +- .../scribble/del/global/GRecursionDel.java | 10 +- .../del/global/GSimpleInteractionNodeDel.java | 0 .../org/scribble/del/global/GWrapDel.java | 4 +- .../org/scribble/del/local/LAcceptDel.java | 8 +- .../org/scribble/del/local/LChoiceDel.java | 8 +- .../local/LCompoundInteractionNodeDel.java | 2 +- .../del/local/LConnectionActionDel.java | 2 +- .../org/scribble/del/local/LContinueDel.java | 8 +- .../scribble/del/local/LDisconnectDel.java | 4 +- .../java/org/scribble/del/local/LDoDel.java | 18 ++-- .../del/local/LInteractionNodeDel.java | 2 +- .../del/local/LInteractionSeqDel.java | 6 +- .../del/local/LMessageTransferDel.java | 2 +- .../del/local/LProjectionDeclDel.java | 6 +- .../scribble/del/local/LProtocolBlockDel.java | 2 +- .../scribble/del/local/LProtocolDeclDel.java | 10 +- .../scribble/del/local/LProtocolDefDel.java | 8 +- .../org/scribble/del/local/LReceiveDel.java | 8 +- .../org/scribble/del/local/LRecursionDel.java | 4 +- .../org/scribble/del/local/LRequestDel.java | 8 +- .../java/org/scribble/del/local/LSendDel.java | 8 +- .../del/local/LSimpleInteractionNodeDel.java | 0 .../scribble/del/local/LWrapClientDel.java | 4 +- .../scribble/del/local/LWrapServerDel.java | 4 +- .../del/name/qualified/DataTypeNodeDel.java | 6 +- .../name/qualified/MessageSigNameNodeDel.java | 6 +- .../del/name/simple/AmbigNameNodeDel.java | 12 +-- .../del/name/simple/NonRoleParamNodeDel.java | 0 .../del/name/simple/RecVarNodeDel.java | 6 +- .../scribble/del/name/simple/RoleNodeDel.java | 2 +- .../src/main/java/org/scribble/lang/Lang.java | 32 +++--- .../java/org/scribble/lang/LangConfig.java | 25 +++-- .../java/org/scribble/lang/LangContext.java | 12 +-- .../lang/context/ModuleContextMaker.java | 14 +-- .../java/org/scribble/util/ScribUtil.java | 0 .../java/org/scribble/visit/AstVisitor.java | 8 +- .../java/org/scribble/visit/EnvVisitor.java | 8 +- .../org/scribble/visit/GTypeTranslator.java | 10 +- .../visit/InlinedProtocolUnfolder.java | 12 +-- .../visit/InlinedProtocolVisitor.java | 6 +- .../visit/NoEnvInlinedProtocolVisitor.java | 4 +- .../visit/NoEnvOffsetSubprotocolVisitor.java | 4 +- .../visit/NoEnvSubprotocolVisitor.java | 4 +- .../scribble/visit/NoEnvUnfoldingVisitor.java | 4 +- .../visit/OffsetSubprotocolVisitor.java | 14 +-- .../scribble/visit/ProtocolDefInliner.java | 18 ++-- .../org/scribble/visit/SimpleVisitor.java | 12 +-- .../scribble/visit/SubprotocolVisitor.java | 30 +++--- .../java/org/scribble/visit/Substitutor.java | 12 +-- .../org/scribble/visit/UnfoldingVisitor.java | 8 +- .../scribble/visit/context/EGraphBuilder.java | 10 +- .../visit/context/ModuleContextBuilder.java | 8 +- .../visit/context/ModuleContextVisitor.java | 8 +- .../context/ProjectedChoiceDoPruner.java | 10 +- .../context/ProjectedChoiceSubjectFixer.java | 10 +- .../visit/context/ProjectedRoleDeclFixer.java | 6 +- .../org/scribble/visit/context/Projector.java | 26 ++--- .../context/ProtocolDeclContextBuilder.java | 12 +-- .../scribble/visit/context/RecRemover.java | 8 +- .../UnguardedChoiceDoProjectionChecker.java | 14 +-- .../visit/context/env/ProjectionEnv.java | 0 .../context/env/UnguardedChoiceDoEnv.java | 2 +- .../java/org/scribble/visit/env/DummyEnv.java | 0 .../main/java/org/scribble/visit/env/Env.java | 0 .../scribble/visit/env/InlineProtocolEnv.java | 0 .../org/scribble/visit/env/UnfoldingEnv.java | 0 .../visit/util/MessageIdCollector.java | 10 +- .../scribble/visit/util/NameCollector.java | 10 +- .../scribble/visit/util/RecVarCollector.java | 12 +-- .../scribble/visit/util/RoleCollector.java | 12 +-- .../visit/validation/GProtocolValidator.java | 12 +-- .../wf/DelegationProtocolRefChecker.java | 6 +- .../visit/wf/ExplicitCorrelationChecker.java | 12 +-- .../scribble/visit/wf/NameDisambiguator.java | 16 +-- .../visit/wf/ReachabilityChecker.java | 6 +- .../scribble/visit/wf/WFChoiceChecker.java | 8 +- .../visit/wf/env/ExplicitCorrelationEnv.java | 0 .../visit/wf/env/ReachabilityEnv.java | 2 +- .../scribble/visit/wf/env/WFChoiceEnv.java | 12 +-- scribble-cli/pom.xml | 2 +- .../java/org/scribble/cli/CommandLine.java | 102 +++++++++--------- scribble-codegen/pom.xml | 2 +- .../org/scribble/codegen/java/ApiGen.java | 18 ++-- .../codegen/java/JEndpointApiGenerator.java | 14 +-- .../callbackapi/CBEndpointApiGenerator.java | 34 +++--- .../callbackapi/CBEndpointApiGenerator3.java | 44 ++++---- .../java/sessionapi/SessionApiGenerator.java | 12 +-- .../java/statechanapi/AcceptSockGen.java | 4 +- .../java/statechanapi/BranchSockGen.java | 14 +-- .../java/statechanapi/CaseSockGen.java | 12 +-- .../codegen/java/statechanapi/EndSockGen.java | 2 +- .../java/statechanapi/HandlerIfaceGen.java | 10 +- .../java/statechanapi/InputFutureGen.java | 12 +-- .../java/statechanapi/OutputSockGen.java | 12 +-- .../java/statechanapi/ReceiveSockGen.java | 12 +-- .../java/statechanapi/ScribSockGen.java | 10 +- .../java/statechanapi/StateChanTypeGen.java | 2 +- .../StateChannelApiGenerator.java | 22 ++-- .../statechanapi/ioifaces/ActionIfaceGen.java | 12 +-- .../statechanapi/ioifaces/BranchIfaceGen.java | 8 +- .../statechanapi/ioifaces/CaseIfaceGen.java | 10 +- .../statechanapi/ioifaces/HandleIfaceGen.java | 10 +- .../statechanapi/ioifaces/IOIfaceGen.java | 2 +- .../ioifaces/IOInterfacesGenerator.java | 18 ++-- .../ioifaces/IOStateIfaceGen.java | 12 +-- .../ioifaces/ReceiveIfaceGen.java | 8 +- .../statechanapi/ioifaces/SelectIfaceGen.java | 6 +- .../ioifaces/SuccessorIfaceGen.java | 4 +- .../codegen/java/util/ConstructorBuilder.java | 2 +- .../codegen/java/util/EnumBuilder.java | 2 +- .../codegen/statetype/STActionBuilder.java | 4 +- .../statetype/STBranchStateBuilder.java | 2 +- .../codegen/statetype/STCaseBuilder.java | 6 +- .../codegen/statetype/STEndStateBuilder.java | 2 +- .../statetype/STOutputStateBuilder.java | 10 +- .../statetype/STReceiveStateBuilder.java | 4 +- .../statetype/STStateChanAPIBuilder.java | 18 ++-- .../codegen/statetype/STStateChanBuilder.java | 2 +- .../{ => core}/job/AntlrSourceException.java | 2 +- .../{job/Job2.java => core/job/Job.java} | 63 ++++++----- .../org/scribble/core}/job/JobConfig.java | 20 +--- .../job/JobContext.java} | 28 ++--- .../job/RuntimeScribbleException.java | 2 +- .../{ => core}/job/ScribbleException.java | 2 +- .../org/scribble/{ => core}/job/Todo.java | 2 +- .../{ => core}/lang/LangConstants.java | 2 +- .../scribble/{ => core}/lang/Protocol.java | 22 ++-- .../scribble/{ => core}/lang/ProtocolMod.java | 2 +- .../java/org/scribble/core/lang/SNode.java | 22 ++++ .../scribble/{ => core}/lang/SubprotoSig.java | 11 +- .../lang/context/ModuleContext.java | 26 ++--- .../core/lang/context/ScribNames.java | 54 ++++++++++ .../org/scribble/core/lang/global/GNode.java | 22 ++++ .../{ => core}/lang/global/GProtocol.java | 62 +++++------ .../org/scribble/core/lang/local/LNode.java | 21 ++++ .../{ => core}/lang/local/LProjection.java | 18 ++-- .../{ => core}/lang/local/LProtocol.java | 44 ++++---- .../{ => core}/model/GraphBuilderUtil.java | 6 +- .../scribble/{ => core}/model/MAction.java | 10 +- .../{ => core}/model/MPrettyPrint.java | 2 +- .../{ => core}/model/MPrettyState.java | 4 +- .../org/scribble/{ => core}/model/MState.java | 8 +- .../{ => core}/model/endpoint/AutParser.java | 22 ++-- .../{ => core}/model/endpoint/EFSM.java | 4 +- .../{ => core}/model/endpoint/EGraph.java | 6 +- .../model/endpoint/EGraphBuilderUtil.java | 12 +-- .../model/endpoint/EGraphBuilderUtil2.java | 12 +-- .../model/endpoint/EModelFactory.java | 24 ++--- .../model/endpoint/EModelFactoryImpl.java | 24 ++--- .../{ => core}/model/endpoint/EState.java | 16 +-- .../{ => core}/model/endpoint/EStateKind.java | 2 +- .../endpoint/IntermediateContinueEdge.java | 16 +-- .../model/endpoint/IntermediateRecEdge.java | 16 +-- .../model/endpoint/actions/EAccept.java | 14 +-- .../model/endpoint/actions/EAction.java | 18 ++-- .../model/endpoint/actions/EDisconnect.java | 14 +-- .../model/endpoint/actions/EReceive.java | 14 +-- .../model/endpoint/actions/ERequest.java | 14 +-- .../model/endpoint/actions/ESend.java | 14 +-- .../model/endpoint/actions/EWrapClient.java | 14 +-- .../model/endpoint/actions/EWrapServer.java | 14 +-- .../{ => core}/model/global/SBuffers.java | 24 ++--- .../{ => core}/model/global/SConfig.java | 26 ++--- .../{ => core}/model/global/SGraph.java | 8 +- .../model/global/SGraphBuilderUtil.java | 28 ++--- .../{ => core}/model/global/SModel.java | 20 ++-- .../model/global/SModelFactory.java | 26 ++--- .../model/global/SModelFactoryImpl.java | 26 ++--- .../{ => core}/model/global/SState.java | 20 ++-- .../{ => core}/model/global/SStateErrors.java | 10 +- .../model/global/actions/SAccept.java | 8 +- .../model/global/actions/SAction.java | 12 +-- .../model/global/actions/SConnect.java | 8 +- .../model/global/actions/SDisconnect.java | 8 +- .../model/global/actions/SReceive.java | 8 +- .../model/global/actions/SRequest.java | 8 +- .../model/global/actions/SSend.java | 8 +- .../model/global/actions/SWrapClient.java | 8 +- .../model/global/actions/SWrapServer.java | 8 +- .../{ => core}/type/kind/AbstractKind.java | 2 +- .../{ => core}/type/kind/AmbigKind.java | 2 +- .../{ => core}/type/kind/DataTypeKind.java | 2 +- .../scribble/{ => core}/type/kind/Global.java | 2 +- .../scribble/{ => core}/type/kind/IdKind.java | 2 +- .../{ => core}/type/kind/ImportKind.java | 2 +- .../scribble/{ => core}/type/kind/Kind.java | 4 +- .../scribble/{ => core}/type/kind/Local.java | 2 +- .../{ => core}/type/kind/MessageIdKind.java | 2 +- .../{ => core}/type/kind/ModuleKind.java | 2 +- .../type/kind/ModuleMemberKind.java | 2 +- .../{ => core}/type/kind/NonProtocolKind.java | 2 +- .../{ => core}/type/kind/NonRoleArgKind.java | 2 +- .../type/kind/NonRoleParamKind.java | 2 +- .../scribble/{ => core}/type/kind/OpKind.java | 2 +- .../{ => core}/type/kind/PackageKind.java | 2 +- .../{ => core}/type/kind/ParamKind.java | 2 +- .../{ => core}/type/kind/PayloadTypeKind.java | 2 +- .../{ => core}/type/kind/ProtocolKind.java | 2 +- .../{ => core}/type/kind/RecVarKind.java | 2 +- .../{ => core}/type/kind/RoleKind.java | 2 +- .../{ => core}/type/kind/ScopeKind.java | 2 +- .../{ => core}/type/kind/SigKind.java | 2 +- .../{ => core}/type/name/AbstractName.java | 4 +- .../{ => core}/type/name/AmbigName.java | 4 +- .../{ => core}/type/name/DataType.java | 4 +- .../{ => core}/type/name/GDelegationType.java | 4 +- .../{ => core}/type/name/GProtocolName.java | 4 +- .../type/name/Id.java} | 14 +-- .../{ => core}/type/name/LProtocolName.java | 4 +- .../{ => core}/type/name/MemberName.java | 4 +- .../{ => core}/type/name/MessageId.java | 4 +- .../{ => core}/type/name/MessageSigName.java | 6 +- .../{ => core}/type/name/ModuleName.java | 4 +- .../scribble/{ => core}/type/name/Name.java | 4 +- .../scribble/{ => core}/type/name/Named.java | 4 +- .../org/scribble/{ => core}/type/name/Op.java | 4 +- .../{ => core}/type/name/PackageName.java | 4 +- .../{ => core}/type/name/PayloadElemType.java | 6 +- .../{ => core}/type/name/ProtocolName.java | 4 +- .../{ => core}/type/name/QualifiedName.java | 4 +- .../scribble/{ => core}/type/name/RecVar.java | 4 +- .../scribble/{ => core}/type/name/Role.java | 4 +- .../scribble/{ => core}/type/name/Scope.java | 7 +- .../{ => core}/type/name/Substitutions.java | 6 +- .../scribble/{ => core}/type/session/Arg.java | 4 +- .../type/session/BasicInteraction.java | 12 +-- .../{ => core}/type/session/Choice.java | 20 ++-- .../type/session/ConnectAction.java | 14 +-- .../{ => core}/type/session/Continue.java | 18 ++-- .../type/session/DirectedInteraction.java | 12 +-- .../type/session/DisconnectAction.java | 12 +-- .../scribble/{ => core}/type/session/Do.java | 24 ++--- .../{ => core}/type/session/Message.java | 8 +- .../{ => core}/type/session/MessageSig.java | 10 +- .../type/session/MessageTransfer.java | 16 +-- .../{ => core}/type/session/Payload.java | 6 +- .../{ => core}/type/session/Recursion.java | 20 ++-- .../{ => core}/type/session/SType.java | 22 ++-- .../{ => core}/type/session/STypeBase.java | 4 +- .../{ => core}/type/session/STypeFactory.java | 8 +- .../scribble/{ => core}/type/session/Seq.java | 20 ++-- .../type/session/global/GChoice.java | 20 ++-- .../type/session/global/GConnect.java | 22 ++-- .../type/session/global/GContinue.java | 18 ++-- .../type/session/global/GDisconnect.java | 18 ++-- .../{ => core}/type/session/global/GDo.java | 40 +++---- .../type/session/global/GMessageTransfer.java | 22 ++-- .../type/session/global/GRecursion.java | 22 ++-- .../{ => core}/type/session/global/GSeq.java | 20 ++-- .../{ => core}/type/session/global/GType.java | 16 +-- .../{ => core}/type/session/local/LAcc.java | 24 ++--- .../type/session/local/LChoice.java | 20 ++-- .../type/session/local/LContinue.java | 20 ++-- .../type/session/local/LDisconnect.java | 16 +-- .../{ => core}/type/session/local/LDo.java | 30 +++--- .../{ => core}/type/session/local/LRcv.java | 24 ++--- .../type/session/local/LRecursion.java | 14 +-- .../{ => core}/type/session/local/LReq.java | 24 ++--- .../{ => core}/type/session/local/LSend.java | 24 ++--- .../{ => core}/type/session/local/LSeq.java | 18 ++-- .../{ => core}/type/session/local/LSkip.java | 28 ++--- .../{ => core}/type/session/local/LType.java | 16 +-- .../{ => core}/visit/STypeInliner.java | 12 +-- .../{ => core}/visit/STypeUnfolder.java | 8 +- .../{ => core}/visit/global/Projector2.java | 16 +-- .../visit/local/ReachabilityEnv.java | 4 +- .../main/java/org/scribble/lang/SNode.java | 9 -- .../org/scribble/lang/context/ScribNames.java | 40 ------- .../java/org/scribble/lang/global/GNode.java | 9 -- .../java/org/scribble/lang/local/LNode.java | 8 -- .../java/org/scribble/util/ConnectedMap.java | 2 +- .../java/org/scribble/util/MessageIdMap.java | 4 +- .../java/org/scribble/util/ScribUtil2.java | 4 +- scribble-dist/pom.xml | 2 +- scribble-main/pom.xml | 2 +- .../main/{MainContext.java => Main.java} | 39 +++---- .../loader}/DefaultModuleLoader.java | 6 +- .../{ => resource/loader}/ModuleLoader.java | 6 +- .../loader}/ScribModuleLoader.java | 8 +- .../DirectoryResourceLocator.java | 5 +- .../{ => locator}/IResourceLocator.java | 5 +- .../{ => locator}/ResourceLocator.java | 2 +- scribble-parser/pom.xml | 2 +- .../parser/scribble/ast/AntlrModuleDecl.java | 2 +- .../scribble/ast/AntlrNonRoleParamDecl.java | 8 +- .../ast/AntlrNonRoleParamDeclList.java | 2 +- .../scribble/ast/name/AntlrQualifiedName.java | 10 +- .../scribble/ast/name/AntlrSimpleName.java | 18 ++-- .../runtime/handlers/ScribOutputEvent.java | 4 +- .../handlers/states/ScribInputState.java | 2 +- .../runtime/handlers/states/ScribState.java | 2 +- .../runtime/message/ScribInterrupt.java | 2 +- .../runtime/message/ScribMessage.java | 2 +- .../runtime/net/BinaryChannelEndpoint.java | 2 +- .../scribble/runtime/net/SocketEndpoint.java | 2 +- .../scribble/runtime/session/CBEndpoint.java | 2 +- .../runtime/session/EndpointInputQueues.java | 4 +- .../runtime/session/ExplicitEndpoint.java | 2 +- .../runtime/session/MPSTEndpoint.java | 2 +- .../scribble/runtime/session/Principal.java | 2 +- .../runtime/session/ScribInputSelector.java | 2 +- .../org/scribble/runtime/session/Session.java | 6 +- .../runtime/session/SessionEndpoint.java | 4 +- .../runtime/statechans/AcceptSocket.java | 2 +- .../runtime/statechans/AffineSocket.java | 2 +- .../runtime/statechans/BranchSocket.java | 2 +- .../runtime/statechans/CaseSocket.java | 2 +- .../runtime/statechans/ConnectSocket.java | 2 +- .../runtime/statechans/EndSocket.java | 2 +- .../runtime/statechans/InitSocket.java | 2 +- .../runtime/statechans/LinearSocket.java | 2 +- .../runtime/statechans/OutputSocket.java | 4 +- .../runtime/statechans/ReceiveSocket.java | 2 +- .../runtime/statechans/ScribSocket.java | 2 +- scribble-test/pom.xml | 2 +- .../org/scribble/{cli => test}/ExecUtil.java | 2 +- .../org/scribble/{cli => test}/Harness.java | 2 +- .../IgnoredDirectoryWhenFilter.java | 2 +- .../{cli => test}/JavaProcessBuilder.java | 2 +- .../scribble/{cli => test}/ScribAllTest.java | 2 +- .../scribble/{cli => test}/ScribBadTest.java | 2 +- .../scribble/{cli => test}/ScribGoodTest.java | 2 +- .../scribble/{cli => test}/ScribTestBase.java | 9 +- 497 files changed, 2113 insertions(+), 2048 deletions(-) rename {scribble-lang => scribble-ast}/pom.xml (91%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/AstFactory.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/AstFactoryImpl.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/AuxMod.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/BasicInteraction.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/Choice.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/CompoundInteraction.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/CompoundNode.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/ConnectAction.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/Continue.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/DataTypeDecl.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/DirectedInteraction.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/DisconnectAction.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/Do.java (91%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/DoArg.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/DoArgList.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/DoArgNode.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/ExplicitMod.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/HeaderParamDecl.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/HeaderParamDeclList.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/ImportDecl.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/ImportModule.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/InteractionSeq.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/MessageNode.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/MessageSigNameDecl.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/MessageSigNode.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/MessageTransfer.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/Module.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/ModuleDecl.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/ModuleMember.java (90%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/NameDeclNode.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/NonProtocolDecl.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/NonRoleArg.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/NonRoleArgList.java (90%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/NonRoleArgNode.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/NonRoleParamDecl.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/NonRoleParamDeclList.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/PayloadElem.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/PayloadElemList.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/ProtocolBlock.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/ProtocolDecl.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/ProtocolDef.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/ProtocolHeader.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/ProtocolKindNode.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/ProtocolMod.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/ProtocolModList.java (98%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/Recursion.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/RoleArg.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/RoleArgList.java (98%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/RoleDecl.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/RoleDeclList.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/ScopedNode.java (92%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/ScribNil.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/ScribNode.java (98%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/ScribNodeBase.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/SessionNode.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/SigParamDecl.java (91%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/SimpleSessionNode.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/TypeParamDecl.java (92%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/UnaryPayloadElem.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/context/DependencyMap.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/context/ProtocolDeclContext.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/context/global/GDependencyMap.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/context/global/GProtocolDeclContext.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/context/local/LDependencyMap.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/context/local/LProjectionDeclContext.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/context/local/LProtocolDeclContext.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GChoice.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GCompoundInteraction.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GConnect.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GContinue.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GDelegationElem.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GDisconnect.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GDo.java (90%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GInteractionSeq.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GMessageTransfer.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GProtocolBlock.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GProtocolDecl.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GProtocolDef.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GProtocolHeader.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GRecursion.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GScribNode.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GSessionNode.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GSimpleSessionNode.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/global/GWrap.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LAccept.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LChoice.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LCompoundInteraction.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LConnectionAction.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LContinue.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LDelegationElem.java (98%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LDisconnect.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LDo.java (88%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LInteractionSeq.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LMessageTransfer.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LProjectionDecl.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LProtocolBlock.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LProtocolDecl.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LProtocolDef.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LProtocolHeader.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LReceive.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LRecursion.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LRequest.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LScribNode.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LSend.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LSessionNode.java (88%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LWrapClient.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/LWrapServer.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/local/SelfRoleDecl.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/NameNode.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/PayloadElemNameNode.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java (91%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java (92%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java (91%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java (98%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/simple/IdNode.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java (98%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/simple/OpNode.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/simple/RecVarNode.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/simple/RoleNode.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/simple/SigParamNode.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java (88%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/ChoiceDel.java (98%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/CompoundInteractionDel.java (99%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/CompoundSessionNodeDel.java (98%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/ConnectionActionDel.java (98%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/ContinueDel.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/DefaultDel.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/DelDecorator.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/DelDecoratorImpl.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/DoArgListDel.java (92%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/DoDel.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/HeaderParamDeclListDel.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/ImportModuleDel.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/InteractionNodeDel.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/InteractionSeqDel.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/MessageTransferDel.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/ModuleDel.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/NonRoleArgListDel.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/NonRoleParamDeclDel.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/NonRoleParamDeclListDel.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/ProtocolBlockDel.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/ProtocolDeclDel.java (92%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/ProtocolDefDel.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/RecursionDel.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/RoleArgListDel.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/RoleDeclDel.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/RoleDeclListDel.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/ScribDel.java (99%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/ScribDelBase.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/SimpleSessionNodeDel.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/global/GChoiceDel.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/global/GCompoundInteractionNodeDel.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/global/GConnectDel.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/global/GContinueDel.java (90%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/global/GDel.java (90%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/global/GDelegationElemDel.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/global/GDisconnectDel.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/global/GDoDel.java (90%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/global/GInteractionNodeDel.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/global/GInteractionSeqDel.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/global/GMessageTransferDel.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/global/GProtocolBlockDel.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/global/GProtocolDeclDel.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/global/GProtocolDefDel.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/global/GRecursionDel.java (92%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/global/GSimpleInteractionNodeDel.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/global/GWrapDel.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LAcceptDel.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LChoiceDel.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LConnectionActionDel.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LContinueDel.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LDisconnectDel.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LDoDel.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LInteractionNodeDel.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LInteractionSeqDel.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LMessageTransferDel.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LProjectionDeclDel.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LProtocolBlockDel.java (97%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LProtocolDeclDel.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LProtocolDefDel.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LReceiveDel.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LRecursionDel.java (98%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LRequestDel.java (92%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LSendDel.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LSimpleInteractionNodeDel.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LWrapClientDel.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/local/LWrapServerDel.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java (92%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/name/simple/NonRoleParamNodeDel.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java (96%) rename scribble-lang/src/main/java/org/scribble/job/Job.java => scribble-ast/src/main/java/org/scribble/lang/Lang.java (85%) rename scribble-core/src/main/java/org/scribble/job/JobConfig2.java => scribble-ast/src/main/java/org/scribble/lang/LangConfig.java (74%) rename scribble-lang/src/main/java/org/scribble/job/JobContext.java => scribble-ast/src/main/java/org/scribble/lang/LangContext.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/lang/context/ModuleContextMaker.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/util/ScribUtil.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/AstVisitor.java (90%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/EnvVisitor.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/GTypeTranslator.java (86%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java (92%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java (92%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java (92%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java (92%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java (90%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/ProtocolDefInliner.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/SimpleVisitor.java (84%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/SubprotocolVisitor.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/Substitutor.java (86%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/UnfoldingVisitor.java (96%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/context/EGraphBuilder.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java (90%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java (90%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java (92%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java (91%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/context/Projector.java (89%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java (89%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/context/RecRemover.java (91%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java (93%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/context/env/UnguardedChoiceDoEnv.java (98%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/env/DummyEnv.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/env/Env.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/env/InlineProtocolEnv.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/env/UnfoldingEnv.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/util/MessageIdCollector.java (84%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/util/NameCollector.java (88%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/util/RecVarCollector.java (84%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/util/RoleCollector.java (85%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/validation/GProtocolValidator.java (85%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java (90%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/wf/NameDisambiguator.java (94%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java (95%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/wf/env/ExplicitCorrelationEnv.java (100%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java (98%) rename {scribble-lang => scribble-ast}/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java (96%) rename scribble-core/src/main/java/org/scribble/{ => core}/job/AntlrSourceException.java (98%) rename scribble-core/src/main/java/org/scribble/{job/Job2.java => core/job/Job.java} (88%) rename {scribble-lang/src/main/java/org/scribble => scribble-core/src/main/java/org/scribble/core}/job/JobConfig.java (79%) rename scribble-core/src/main/java/org/scribble/{job/JobContext2.java => core/job/JobContext.java} (95%) rename scribble-core/src/main/java/org/scribble/{ => core}/job/RuntimeScribbleException.java (97%) rename scribble-core/src/main/java/org/scribble/{ => core}/job/ScribbleException.java (97%) rename scribble-core/src/main/java/org/scribble/{ => core}/job/Todo.java (99%) rename scribble-core/src/main/java/org/scribble/{ => core}/lang/LangConstants.java (95%) rename scribble-core/src/main/java/org/scribble/{ => core}/lang/Protocol.java (89%) rename scribble-core/src/main/java/org/scribble/{ => core}/lang/ProtocolMod.java (97%) create mode 100644 scribble-core/src/main/java/org/scribble/core/lang/SNode.java rename scribble-core/src/main/java/org/scribble/{ => core}/lang/SubprotoSig.java (90%) rename scribble-core/src/main/java/org/scribble/{ => core}/lang/context/ModuleContext.java (87%) create mode 100644 scribble-core/src/main/java/org/scribble/core/lang/context/ScribNames.java create mode 100644 scribble-core/src/main/java/org/scribble/core/lang/global/GNode.java rename scribble-core/src/main/java/org/scribble/{ => core}/lang/global/GProtocol.java (88%) create mode 100644 scribble-core/src/main/java/org/scribble/core/lang/local/LNode.java rename scribble-core/src/main/java/org/scribble/{ => core}/lang/local/LProjection.java (86%) rename scribble-core/src/main/java/org/scribble/{ => core}/lang/local/LProtocol.java (80%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/GraphBuilderUtil.java (94%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/MAction.java (92%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/MPrettyPrint.java (95%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/MPrettyState.java (98%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/MState.java (97%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/AutParser.java (94%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/EFSM.java (95%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/EGraph.java (93%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/EGraphBuilderUtil.java (97%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/EGraphBuilderUtil2.java (98%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/EModelFactory.java (63%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/EModelFactoryImpl.java (73%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/EState.java (97%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/EStateKind.java (95%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/IntermediateContinueEdge.java (80%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/IntermediateRecEdge.java (81%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/actions/EAccept.java (82%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/actions/EAction.java (84%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/actions/EDisconnect.java (82%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/actions/EReceive.java (86%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/actions/ERequest.java (83%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/actions/ESend.java (86%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/actions/EWrapClient.java (82%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/endpoint/actions/EWrapServer.java (82%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/SBuffers.java (92%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/SConfig.java (96%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/SGraph.java (96%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/SGraphBuilderUtil.java (90%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/SModel.java (93%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/SModelFactory.java (68%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/SModelFactoryImpl.java (76%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/SState.java (88%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/SStateErrors.java (88%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/actions/SAccept.java (88%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/actions/SAction.java (90%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/actions/SConnect.java (88%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/actions/SDisconnect.java (88%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/actions/SReceive.java (87%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/actions/SRequest.java (88%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/actions/SSend.java (87%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/actions/SWrapClient.java (88%) rename scribble-core/src/main/java/org/scribble/{ => core}/model/global/actions/SWrapServer.java (87%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/AbstractKind.java (97%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/AmbigKind.java (96%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/DataTypeKind.java (96%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/Global.java (96%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/IdKind.java (96%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/ImportKind.java (94%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/Kind.java (91%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/Local.java (96%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/MessageIdKind.java (94%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/ModuleKind.java (96%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/ModuleMemberKind.java (94%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/NonProtocolKind.java (94%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/NonRoleArgKind.java (95%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/NonRoleParamKind.java (94%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/OpKind.java (97%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/PackageKind.java (96%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/ParamKind.java (94%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/PayloadTypeKind.java (95%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/ProtocolKind.java (94%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/RecVarKind.java (96%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/RoleKind.java (96%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/ScopeKind.java (96%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/kind/SigKind.java (96%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/AbstractName.java (97%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/AmbigName.java (94%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/DataType.java (95%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/GDelegationType.java (96%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/GProtocolName.java (94%) rename scribble-core/src/main/java/org/scribble/{type/name/Identifier.java => core/type/name/Id.java} (79%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/LProtocolName.java (95%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/MemberName.java (94%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/MessageId.java (89%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/MessageSigName.java (93%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/ModuleName.java (96%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/Name.java (93%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/Named.java (89%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/Op.java (94%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/PackageName.java (94%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/PayloadElemType.java (86%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/ProtocolName.java (92%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/QualifiedName.java (93%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/RecVar.java (93%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/Role.java (94%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/Scope.java (92%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/name/Substitutions.java (95%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/Arg.java (89%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/BasicInteraction.java (84%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/Choice.java (89%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/ConnectAction.java (82%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/Continue.java (86%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/DirectedInteraction.java (90%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/DisconnectAction.java (89%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/Do.java (88%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/Message.java (82%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/MessageSig.java (87%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/MessageTransfer.java (80%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/Payload.java (91%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/Recursion.java (90%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/SType.java (80%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/STypeBase.java (95%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/STypeFactory.java (89%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/Seq.java (90%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/global/GChoice.java (90%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/global/GConnect.java (84%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/global/GContinue.java (83%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/global/GDisconnect.java (84%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/global/GDo.java (80%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/global/GMessageTransfer.java (84%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/global/GRecursion.java (83%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/global/GSeq.java (86%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/global/GType.java (85%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/local/LAcc.java (78%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/local/LChoice.java (89%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/local/LContinue.java (86%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/local/LDisconnect.java (83%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/local/LDo.java (78%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/local/LRcv.java (78%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/local/LRecursion.java (86%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/local/LReq.java (78%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/local/LSend.java (78%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/local/LSeq.java (87%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/local/LSkip.java (80%) rename scribble-core/src/main/java/org/scribble/{ => core}/type/session/local/LType.java (80%) rename scribble-core/src/main/java/org/scribble/{ => core}/visit/STypeInliner.java (92%) rename scribble-core/src/main/java/org/scribble/{ => core}/visit/STypeUnfolder.java (88%) rename scribble-core/src/main/java/org/scribble/{ => core}/visit/global/Projector2.java (84%) rename scribble-core/src/main/java/org/scribble/{ => core}/visit/local/ReachabilityEnv.java (93%) delete mode 100644 scribble-core/src/main/java/org/scribble/lang/SNode.java delete mode 100644 scribble-core/src/main/java/org/scribble/lang/context/ScribNames.java delete mode 100644 scribble-core/src/main/java/org/scribble/lang/global/GNode.java delete mode 100644 scribble-core/src/main/java/org/scribble/lang/local/LNode.java rename scribble-main/src/main/java/org/scribble/main/{MainContext.java => Main.java} (89%) rename scribble-main/src/main/java/org/scribble/main/{ => resource/loader}/DefaultModuleLoader.java (92%) rename scribble-main/src/main/java/org/scribble/main/{ => resource/loader}/ModuleLoader.java (91%) rename scribble-main/src/main/java/org/scribble/main/{ => resource/loader}/ScribModuleLoader.java (92%) rename scribble-main/src/main/java/org/scribble/main/resource/{ => locator}/DirectoryResourceLocator.java (94%) rename scribble-main/src/main/java/org/scribble/main/resource/{ => locator}/IResourceLocator.java (89%) rename scribble-main/src/main/java/org/scribble/main/resource/{ => locator}/ResourceLocator.java (93%) rename scribble-test/src/test/java/org/scribble/{cli => test}/ExecUtil.java (99%) rename scribble-test/src/test/java/org/scribble/{cli => test}/Harness.java (99%) rename scribble-test/src/test/java/org/scribble/{cli => test}/IgnoredDirectoryWhenFilter.java (97%) rename scribble-test/src/test/java/org/scribble/{cli => test}/JavaProcessBuilder.java (99%) rename scribble-test/src/test/java/org/scribble/{cli => test}/ScribAllTest.java (98%) rename scribble-test/src/test/java/org/scribble/{cli => test}/ScribBadTest.java (98%) rename scribble-test/src/test/java/org/scribble/{cli => test}/ScribGoodTest.java (98%) rename scribble-test/src/test/java/org/scribble/{cli => test}/ScribTestBase.java (93%) diff --git a/pom.xml b/pom.xml index 9e496e18b..5e9de030d 100644 --- a/pom.xml +++ b/pom.xml @@ -72,8 +72,8 @@ scribble-core scribble-runtime + scribble-ast scribble-parser - scribble-lang scribble-codegen scribble-main scribble-cli @@ -96,7 +96,7 @@ org.scribble - scribble-lang + scribble-ast ${project.version} diff --git a/scribble-lang/pom.xml b/scribble-ast/pom.xml similarity index 91% rename from scribble-lang/pom.xml rename to scribble-ast/pom.xml index 8236974c3..0e3ef28d4 100644 --- a/scribble-lang/pom.xml +++ b/scribble-ast/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - scribble-lang + scribble-ast jar - scribble-lang + scribble-ast org.scribble diff --git a/scribble-lang/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/ast/AstFactory.java rename to scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 2265328a3..d82ef5a7f 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -65,11 +65,11 @@ import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.type.kind.Kind; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.kind.PayloadTypeKind; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.Kind; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.kind.PayloadTypeKind; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.Role; public interface AstFactory diff --git a/scribble-lang/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/ast/AstFactoryImpl.java rename to scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java index 3c961072a..db38405a0 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -69,6 +69,20 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; import org.scribble.ast.name.simple.TypeParamNode; +import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.Kind; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.kind.ModuleKind; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.kind.OpKind; +import org.scribble.core.type.kind.PayloadTypeKind; +import org.scribble.core.type.kind.RecVarKind; +import org.scribble.core.type.kind.RoleKind; +import org.scribble.core.type.kind.SigKind; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.Op; +import org.scribble.core.type.name.Role; import org.scribble.del.DefaultDel; import org.scribble.del.ImportModuleDel; import org.scribble.del.ModuleDel; @@ -113,20 +127,6 @@ import org.scribble.del.name.simple.NonRoleParamNodeDel; import org.scribble.del.name.simple.RecVarNodeDel; import org.scribble.del.name.simple.RoleNodeDel; -import org.scribble.type.kind.DataTypeKind; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.Kind; -import org.scribble.type.kind.Local; -import org.scribble.type.kind.ModuleKind; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.kind.OpKind; -import org.scribble.type.kind.PayloadTypeKind; -import org.scribble.type.kind.RecVarKind; -import org.scribble.type.kind.RoleKind; -import org.scribble.type.kind.SigKind; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Op; -import org.scribble.type.name.Role; public class AstFactoryImpl implements AstFactory diff --git a/scribble-lang/src/main/java/org/scribble/ast/AuxMod.java b/scribble-ast/src/main/java/org/scribble/ast/AuxMod.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/ast/AuxMod.java rename to scribble-ast/src/main/java/org/scribble/ast/AuxMod.java diff --git a/scribble-lang/src/main/java/org/scribble/ast/BasicInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/BasicInteraction.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/BasicInteraction.java rename to scribble-ast/src/main/java/org/scribble/ast/BasicInteraction.java index a4ee60320..136e403d3 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/BasicInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/BasicInteraction.java @@ -15,7 +15,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtocolKind; public abstract class BasicInteraction extends SimpleSessionNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/Choice.java b/scribble-ast/src/main/java/org/scribble/ast/Choice.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/Choice.java rename to scribble-ast/src/main/java/org/scribble/ast/Choice.java index 31c765a5c..fbfd05027 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/Choice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Choice.java @@ -20,9 +20,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ProtocolKind; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ProtocolKind; import org.scribble.util.Constants; import org.scribble.visit.AstVisitor; diff --git a/scribble-lang/src/main/java/org/scribble/ast/CompoundInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/CompoundInteraction.java rename to scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java index 9793c7311..8e16de38a 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/CompoundInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java @@ -15,7 +15,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtocolKind; // Name should be read (Compound ( InteractionNode )) public abstract class CompoundInteraction diff --git a/scribble-lang/src/main/java/org/scribble/ast/CompoundNode.java b/scribble-ast/src/main/java/org/scribble/ast/CompoundNode.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/ast/CompoundNode.java rename to scribble-ast/src/main/java/org/scribble/ast/CompoundNode.java diff --git a/scribble-lang/src/main/java/org/scribble/ast/ConnectAction.java b/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/ast/ConnectAction.java rename to scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java index 1daed5128..67a3313dc 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/ConnectAction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java @@ -20,7 +20,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtocolKind; // TODO CHECKME: factor with MessageTransfer? public abstract class ConnectAction diff --git a/scribble-lang/src/main/java/org/scribble/ast/Continue.java b/scribble-ast/src/main/java/org/scribble/ast/Continue.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/Continue.java rename to scribble-ast/src/main/java/org/scribble/ast/Continue.java index 7d23bd7e1..67d871ee6 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/Continue.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Continue.java @@ -16,9 +16,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ProtocolKind; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ProtocolKind; import org.scribble.util.Constants; import org.scribble.visit.AstVisitor; diff --git a/scribble-lang/src/main/java/org/scribble/ast/DataTypeDecl.java b/scribble-ast/src/main/java/org/scribble/ast/DataTypeDecl.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/DataTypeDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/DataTypeDecl.java index ebf7d8ce6..6d70ea225 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/DataTypeDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DataTypeDecl.java @@ -16,9 +16,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.type.kind.DataTypeKind; -import org.scribble.type.name.DataType; -import org.scribble.type.name.ModuleName; +import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.ModuleName; import org.scribble.util.Constants; public class DataTypeDecl extends NonProtocolDecl diff --git a/scribble-lang/src/main/java/org/scribble/ast/DirectedInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/DirectedInteraction.java rename to scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java index ee55cdd83..dae933af8 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/DirectedInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java @@ -20,10 +20,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; // FIXME: rename (Simple)Interaction, after existing SimpleInteraction renamed diff --git a/scribble-lang/src/main/java/org/scribble/ast/DisconnectAction.java b/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/DisconnectAction.java rename to scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java index 36d4c84cd..6c3ba22f1 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/DisconnectAction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java @@ -16,9 +16,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ProtocolKind; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; // (G)Disconnect is symmetric (send/receive asymmetric/async; request/accept asymmetric/sync; (g)disconnect symmetric/async) diff --git a/scribble-lang/src/main/java/org/scribble/ast/Do.java b/scribble-ast/src/main/java/org/scribble/ast/Do.java similarity index 91% rename from scribble-lang/src/main/java/org/scribble/ast/Do.java rename to scribble-ast/src/main/java/org/scribble/ast/Do.java index 38b9a9e6e..94464d6e5 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/Do.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Do.java @@ -18,13 +18,13 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.ProtocolNameNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; -import org.scribble.job.JobContext; -import org.scribble.job.ScribbleException; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.Role; +import org.scribble.lang.LangContext; import org.scribble.util.Constants; import org.scribble.visit.AstVisitor; @@ -96,7 +96,7 @@ public ProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) } // mcontext redundant because redundant for getTargetProtocolDeclFullName - public ProtocolDecl getTargetProtocolDecl(JobContext jcontext, + public ProtocolDecl getTargetProtocolDecl(LangContext jcontext, ModuleContext mcontext) { ProtocolName fullname = getTargetProtocolDeclFullName(mcontext); @@ -104,7 +104,7 @@ public ProtocolDecl getTargetProtocolDecl(JobContext jcontext, .getProtocolDeclChild(fullname.getSimpleName()); } - public Role getTargetRoleParameter(JobContext jcontext, + public Role getTargetRoleParameter(LangContext jcontext, ModuleContext mcontext, Role role) { Iterator args = getRoleListChild().getRoles().iterator(); diff --git a/scribble-lang/src/main/java/org/scribble/ast/DoArg.java b/scribble-ast/src/main/java/org/scribble/ast/DoArg.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/DoArg.java rename to scribble-ast/src/main/java/org/scribble/ast/DoArg.java index dae35e59a..44bfecf5c 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/DoArg.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DoArg.java @@ -15,9 +15,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; // TODO: rename better? DoArg, DoArgNode, ... diff --git a/scribble-lang/src/main/java/org/scribble/ast/DoArgList.java b/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/DoArgList.java rename to scribble-ast/src/main/java/org/scribble/ast/DoArgList.java index 30a94957b..d3ed09228 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/DoArgList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java @@ -19,9 +19,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; // Cf. HeaderParameterDeclList -- but not kinded, because cannot determine Arg kind directly from node syntax itself (kinding for ModelNodes is to supplement syntactic information, not "typing" work) diff --git a/scribble-lang/src/main/java/org/scribble/ast/DoArgNode.java b/scribble-ast/src/main/java/org/scribble/ast/DoArgNode.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/ast/DoArgNode.java rename to scribble-ast/src/main/java/org/scribble/ast/DoArgNode.java diff --git a/scribble-lang/src/main/java/org/scribble/ast/ExplicitMod.java b/scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/ast/ExplicitMod.java rename to scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java diff --git a/scribble-lang/src/main/java/org/scribble/ast/HeaderParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/HeaderParamDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java index df2ffad08..a64f74e51 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/HeaderParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java @@ -17,10 +17,10 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; import org.scribble.ast.name.simple.SimpleNameNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ParamKind; +import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ParamKind; -import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; // Names that are declared in a protocol header (roles and parameters -- not the protocol name though) diff --git a/scribble-lang/src/main/java/org/scribble/ast/HeaderParamDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDeclList.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/HeaderParamDeclList.java rename to scribble-ast/src/main/java/org/scribble/ast/HeaderParamDeclList.java index d9cdb0933..774248bdc 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/HeaderParamDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDeclList.java @@ -19,10 +19,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ParamKind; +import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ParamKind; -import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; diff --git a/scribble-lang/src/main/java/org/scribble/ast/ImportDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ImportDecl.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/ImportDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/ImportDecl.java index f6415e0e8..c9ca9f637 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/ImportDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ImportDecl.java @@ -15,8 +15,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.ImportKind; -import org.scribble.type.name.Name; +import org.scribble.core.type.kind.ImportKind; +import org.scribble.core.type.name.Name; // CHECKME: factor out more stuff from ImportModule and ImportMember into here? e.g. alias/name, reconstruct (or else no need for common super?) public abstract class ImportDecl extends ScribNodeBase//, ModuleMember //implements NameDeclaration diff --git a/scribble-lang/src/main/java/org/scribble/ast/ImportModule.java b/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/ImportModule.java rename to scribble-ast/src/main/java/org/scribble/ast/ImportModule.java index 7c14acca4..3a7308c4b 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/ImportModule.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java @@ -16,10 +16,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ModuleKind; +import org.scribble.core.type.name.ModuleName; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ModuleKind; -import org.scribble.type.name.ModuleName; import org.scribble.util.Constants; import org.scribble.visit.AstVisitor; diff --git a/scribble-lang/src/main/java/org/scribble/ast/InteractionSeq.java b/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/InteractionSeq.java rename to scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java index bae5fdccb..b76bff74e 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/InteractionSeq.java +++ b/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java @@ -19,9 +19,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ProtocolKind; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; public abstract class InteractionSeq diff --git a/scribble-lang/src/main/java/org/scribble/ast/MessageNode.java b/scribble-ast/src/main/java/org/scribble/ast/MessageNode.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/MessageNode.java rename to scribble-ast/src/main/java/org/scribble/ast/MessageNode.java index c586c34e6..f0d9d55ef 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/MessageNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/MessageNode.java @@ -13,7 +13,7 @@ */ package org.scribble.ast; -import org.scribble.type.session.Message; +import org.scribble.core.type.session.Message; // A sig kind node: MessageSignatureNode, MessageSignatureNameNode or NonRoleParamNode public interface MessageNode extends NonRoleArgNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/MessageSigNameDecl.java b/scribble-ast/src/main/java/org/scribble/ast/MessageSigNameDecl.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/MessageSigNameDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/MessageSigNameDecl.java index c783a13ef..135dc2663 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/MessageSigNameDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/MessageSigNameDecl.java @@ -16,9 +16,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.MessageSigNameNode; -import org.scribble.type.kind.SigKind; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.ModuleName; +import org.scribble.core.type.kind.SigKind; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.ModuleName; import org.scribble.util.Constants; public class MessageSigNameDecl extends NonProtocolDecl diff --git a/scribble-lang/src/main/java/org/scribble/ast/MessageSigNode.java b/scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/MessageSigNode.java rename to scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java index 15e6c5676..ca2a097b2 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/MessageSigNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java @@ -16,9 +16,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.OpNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.session.MessageSig; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.session.MessageSig; import org.scribble.visit.AstVisitor; public class MessageSigNode extends ScribNodeBase implements MessageNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/MessageTransfer.java b/scribble-ast/src/main/java/org/scribble/ast/MessageTransfer.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/ast/MessageTransfer.java rename to scribble-ast/src/main/java/org/scribble/ast/MessageTransfer.java index cc39b559f..69530dfc2 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/MessageTransfer.java +++ b/scribble-ast/src/main/java/org/scribble/ast/MessageTransfer.java @@ -19,7 +19,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtocolKind; public abstract class MessageTransfer extends DirectedInteraction diff --git a/scribble-lang/src/main/java/org/scribble/ast/Module.java b/scribble-ast/src/main/java/org/scribble/ast/Module.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/Module.java rename to scribble-ast/src/main/java/org/scribble/ast/Module.java index b08969260..55a9bb39b 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/Module.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Module.java @@ -23,15 +23,15 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.local.LProtocolDecl; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.Kind; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.name.ProtocolName; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.Kind; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.DataType; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.ModuleName; -import org.scribble.type.name.ProtocolName; import org.scribble.visit.AstVisitor; public class Module extends ScribNodeBase diff --git a/scribble-lang/src/main/java/org/scribble/ast/ModuleDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/ModuleDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java index 669553457..9ce6fba80 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/ModuleDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java @@ -19,10 +19,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ModuleKind; +import org.scribble.core.type.name.ModuleName; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ModuleKind; -import org.scribble.type.name.ModuleName; import org.scribble.util.Constants; import org.scribble.visit.AstVisitor; diff --git a/scribble-lang/src/main/java/org/scribble/ast/ModuleMember.java b/scribble-ast/src/main/java/org/scribble/ast/ModuleMember.java similarity index 90% rename from scribble-lang/src/main/java/org/scribble/ast/ModuleMember.java rename to scribble-ast/src/main/java/org/scribble/ast/ModuleMember.java index 4be80e0bf..21e63f0c1 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/ModuleMember.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ModuleMember.java @@ -13,8 +13,8 @@ */ package org.scribble.ast; -import org.scribble.type.kind.ModuleMemberKind; -import org.scribble.type.name.MemberName; +import org.scribble.core.type.kind.ModuleMemberKind; +import org.scribble.core.type.name.MemberName; // Not an abstract class, NonProtocolDecl extends NameDeclNode (whereas ProtocolDecl uses ProtocolHeader for that) public interface ModuleMember diff --git a/scribble-lang/src/main/java/org/scribble/ast/NameDeclNode.java b/scribble-ast/src/main/java/org/scribble/ast/NameDeclNode.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/NameDeclNode.java rename to scribble-ast/src/main/java/org/scribble/ast/NameDeclNode.java index c56fbc165..bac96e08f 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/NameDeclNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NameDeclNode.java @@ -16,8 +16,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; -import org.scribble.type.kind.Kind; -import org.scribble.type.name.Name; +import org.scribble.core.type.kind.Kind; +import org.scribble.core.type.name.Name; public abstract class NameDeclNode extends ScribNodeBase { diff --git a/scribble-lang/src/main/java/org/scribble/ast/NonProtocolDecl.java b/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/ast/NonProtocolDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java index cb94d4114..d3060c584 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/NonProtocolDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java @@ -17,9 +17,9 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; import org.scribble.ast.name.simple.IdNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.NonProtocolKind; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.NonProtocolKind; import org.scribble.visit.AstVisitor; // Rename to something better diff --git a/scribble-lang/src/main/java/org/scribble/ast/NonRoleArg.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArg.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/ast/NonRoleArg.java rename to scribble-ast/src/main/java/org/scribble/ast/NonRoleArg.java index dd2b92aac..36d3e2338 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/NonRoleArg.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArg.java @@ -15,7 +15,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.name.Role; +import org.scribble.core.type.name.Role; public class NonRoleArg extends DoArg { diff --git a/scribble-lang/src/main/java/org/scribble/ast/NonRoleArgList.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java similarity index 90% rename from scribble-lang/src/main/java/org/scribble/ast/NonRoleArgList.java rename to scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java index b76732e24..3d593699a 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/NonRoleArgList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java @@ -19,13 +19,13 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.NonRoleArgKind; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.name.DataType; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.Role; -import org.scribble.type.session.Arg; -import org.scribble.type.session.MessageSig; +import org.scribble.core.type.kind.NonRoleArgKind; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Arg; +import org.scribble.core.type.session.MessageSig; // Cf. NonRoleParamDeclList public class NonRoleArgList extends DoArgList diff --git a/scribble-lang/src/main/java/org/scribble/ast/NonRoleArgNode.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgNode.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/NonRoleArgNode.java rename to scribble-ast/src/main/java/org/scribble/ast/NonRoleArgNode.java index 8ba8ee271..7c153b3ad 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/NonRoleArgNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgNode.java @@ -13,8 +13,8 @@ */ package org.scribble.ast; -import org.scribble.type.kind.NonRoleArgKind; -import org.scribble.type.session.Arg; +import org.scribble.core.type.kind.NonRoleArgKind; +import org.scribble.core.type.session.Arg; // sig or payloadtype kinds that can be used as do arg vals, cf. RoleNode // "Value nodes" (sigs or names) that can be used as non-role subprotocol arguments (doesn't include role instantation arguments) diff --git a/scribble-lang/src/main/java/org/scribble/ast/NonRoleParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDecl.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/ast/NonRoleParamDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDecl.java index c1058539e..79aa3d678 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/NonRoleParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDecl.java @@ -16,8 +16,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.NonRoleParamNode; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.name.MemberName; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.MemberName; // CHECKME: can drop generic parameter and kind? public abstract class NonRoleParamDecl diff --git a/scribble-lang/src/main/java/org/scribble/ast/NonRoleParamDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/NonRoleParamDeclList.java rename to scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java index 723e55953..3a7d7b68a 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/NonRoleParamDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java @@ -18,10 +18,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.Role; // Can contain "mixed" type/sig kinds // Typing a bit awkward that this list has to use NonRoleParamKind as the "concrete" kind, while the NonRoleParamDecl elements use the actual concrete kind diff --git a/scribble-lang/src/main/java/org/scribble/ast/PayloadElem.java b/scribble-ast/src/main/java/org/scribble/ast/PayloadElem.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/PayloadElem.java rename to scribble-ast/src/main/java/org/scribble/ast/PayloadElem.java index 5d19851bf..5ee02a979 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/PayloadElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/PayloadElem.java @@ -13,8 +13,8 @@ */ package org.scribble.ast; -import org.scribble.type.kind.PayloadTypeKind; -import org.scribble.type.name.PayloadElemType; +import org.scribble.core.type.kind.PayloadTypeKind; +import org.scribble.core.type.name.PayloadElemType; // Not in grammar file -- but cf. DoArg (and PayloadElemList cf. DoArgList) -- i.e. need a wrapper for mixed and initially ambiguous name kinds //public abstract class PayloadElem extends ScribNodeBase diff --git a/scribble-lang/src/main/java/org/scribble/ast/PayloadElemList.java b/scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/PayloadElemList.java rename to scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java index 8e57e974b..1899fe26e 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/PayloadElemList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java @@ -19,10 +19,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.session.Payload; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.PayloadElemType; -import org.scribble.type.session.Payload; import org.scribble.visit.AstVisitor; // Cf. DoArgList, but here we don't need as much abstraction (cf. RoleArgList, NonRoleArgList) diff --git a/scribble-lang/src/main/java/org/scribble/ast/ProtocolBlock.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/ProtocolBlock.java rename to scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java index 8bb0f304d..5f6888839 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/ProtocolBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java @@ -15,9 +15,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ProtocolKind; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; public abstract class ProtocolBlock diff --git a/scribble-lang/src/main/java/org/scribble/ast/ProtocolDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolDecl.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/ProtocolDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/ProtocolDecl.java index cea2a9723..0e16a409f 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/ProtocolDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolDecl.java @@ -18,10 +18,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; // CHECKME: visitChildren for modifiers diff --git a/scribble-lang/src/main/java/org/scribble/ast/ProtocolDef.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolDef.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/ProtocolDef.java rename to scribble-ast/src/main/java/org/scribble/ast/ProtocolDef.java index d8331121f..7ec53f0e5 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/ProtocolDef.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolDef.java @@ -15,9 +15,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ProtocolKind; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; public abstract class ProtocolDef extends ScribNodeBase diff --git a/scribble-lang/src/main/java/org/scribble/ast/ProtocolHeader.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolHeader.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/ProtocolHeader.java rename to scribble-ast/src/main/java/org/scribble/ast/ProtocolHeader.java index 4c4c787a8..8dd156752 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/ProtocolHeader.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolHeader.java @@ -17,10 +17,10 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; import org.scribble.ast.name.qualified.ProtocolNameNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.ProtocolName; import org.scribble.util.Constants; import org.scribble.visit.AstVisitor; diff --git a/scribble-lang/src/main/java/org/scribble/ast/ProtocolKindNode.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolKindNode.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/ProtocolKindNode.java rename to scribble-ast/src/main/java/org/scribble/ast/ProtocolKindNode.java index 824cf9eda..7bd686a06 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/ProtocolKindNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolKindNode.java @@ -13,7 +13,7 @@ */ package org.scribble.ast; -import org.scribble.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtocolKind; public interface ProtocolKindNode extends ScribNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/ProtocolMod.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolMod.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/ProtocolMod.java rename to scribble-ast/src/main/java/org/scribble/ast/ProtocolMod.java index 763aa74f8..5964d5fba 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/ProtocolMod.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolMod.java @@ -14,7 +14,7 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; import org.scribble.visit.AstVisitor; public abstract class ProtocolMod extends ScribNodeBase diff --git a/scribble-lang/src/main/java/org/scribble/ast/ProtocolModList.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolModList.java similarity index 98% rename from scribble-lang/src/main/java/org/scribble/ast/ProtocolModList.java rename to scribble-ast/src/main/java/org/scribble/ast/ProtocolModList.java index 82eaf6b96..26492f0ca 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/ProtocolModList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolModList.java @@ -17,7 +17,7 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; import org.scribble.visit.AstVisitor; // (Currently) a list of mod leaf nodes as AmbigNameNodes (cf., NameNode "elements") diff --git a/scribble-lang/src/main/java/org/scribble/ast/Recursion.java b/scribble-ast/src/main/java/org/scribble/ast/Recursion.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/Recursion.java rename to scribble-ast/src/main/java/org/scribble/ast/Recursion.java index 260974b11..0ec248b84 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/Recursion.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Recursion.java @@ -16,9 +16,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ProtocolKind; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ProtocolKind; import org.scribble.util.Constants; import org.scribble.visit.AstVisitor; diff --git a/scribble-lang/src/main/java/org/scribble/ast/RoleArg.java b/scribble-ast/src/main/java/org/scribble/ast/RoleArg.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/RoleArg.java rename to scribble-ast/src/main/java/org/scribble/ast/RoleArg.java index cd0c02690..b91fb7b0e 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/RoleArg.java +++ b/scribble-ast/src/main/java/org/scribble/ast/RoleArg.java @@ -16,8 +16,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.type.kind.RoleKind; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.RoleKind; +import org.scribble.core.type.name.Role; // CHECKME: can this be simplified to an interface? (also NonRoleArg) public class RoleArg extends DoArg diff --git a/scribble-lang/src/main/java/org/scribble/ast/RoleArgList.java b/scribble-ast/src/main/java/org/scribble/ast/RoleArgList.java similarity index 98% rename from scribble-lang/src/main/java/org/scribble/ast/RoleArgList.java rename to scribble-ast/src/main/java/org/scribble/ast/RoleArgList.java index 8f976846f..95b2e4d56 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/RoleArgList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/RoleArgList.java @@ -18,7 +18,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.name.Role; +import org.scribble.core.type.name.Role; public class RoleArgList extends DoArgList { diff --git a/scribble-lang/src/main/java/org/scribble/ast/RoleDecl.java b/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/RoleDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java index 8c6cd67fa..9e10cd46c 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/RoleDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java @@ -16,9 +16,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.type.kind.RoleKind; -import org.scribble.type.name.Name; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.RoleKind; +import org.scribble.core.type.name.Name; +import org.scribble.core.type.name.Role; import org.scribble.util.Constants; public class RoleDecl extends HeaderParamDecl diff --git a/scribble-lang/src/main/java/org/scribble/ast/RoleDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/RoleDeclList.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/RoleDeclList.java rename to scribble-ast/src/main/java/org/scribble/ast/RoleDeclList.java index 843793acb..3a09e3304 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/RoleDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/RoleDeclList.java @@ -18,8 +18,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.RoleKind; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.RoleKind; +import org.scribble.core.type.name.Role; public class RoleDeclList extends HeaderParamDeclList { diff --git a/scribble-lang/src/main/java/org/scribble/ast/ScopedNode.java b/scribble-ast/src/main/java/org/scribble/ast/ScopedNode.java similarity index 92% rename from scribble-lang/src/main/java/org/scribble/ast/ScopedNode.java rename to scribble-ast/src/main/java/org/scribble/ast/ScopedNode.java index 7d5c50928..8cec73514 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/ScopedNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScopedNode.java @@ -13,8 +13,8 @@ */ package org.scribble.ast; -import org.scribble.type.kind.ScopeKind; -import org.scribble.type.name.Name; +import org.scribble.core.type.kind.ScopeKind; +import org.scribble.core.type.name.Name; // Move to types? uniform with Named public interface ScopedNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/ScribNil.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNil.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/ast/ScribNil.java rename to scribble-ast/src/main/java/org/scribble/ast/ScribNil.java diff --git a/scribble-lang/src/main/java/org/scribble/ast/ScribNode.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java similarity index 98% rename from scribble-lang/src/main/java/org/scribble/ast/ScribNode.java rename to scribble-ast/src/main/java/org/scribble/ast/ScribNode.java index 8d92c1861..5a24633d0 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/ScribNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java @@ -17,8 +17,8 @@ import org.antlr.runtime.tree.CommonTree; import org.antlr.runtime.tree.Tree; +import org.scribble.core.job.ScribbleException; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; import org.scribble.visit.AstVisitor; import org.scribble.visit.SimpleVisitor; import org.scribble.visit.Substitutor; diff --git a/scribble-lang/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/ast/ScribNodeBase.java rename to scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java index 49991760d..5ccd7c684 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -20,12 +20,12 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.kind.ProtocolKind; import org.scribble.del.ScribDel; -import org.scribble.job.RuntimeScribbleException; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.Local; -import org.scribble.type.kind.ProtocolKind; import org.scribble.util.ScribUtil; import org.scribble.util.ScribUtil2; import org.scribble.visit.AstVisitor; diff --git a/scribble-lang/src/main/java/org/scribble/ast/SessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/SessionNode.java rename to scribble-ast/src/main/java/org/scribble/ast/SessionNode.java index 91e01e46b..a2de3def5 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/SessionNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java @@ -13,7 +13,7 @@ */ package org.scribble.ast; -import org.scribble.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtocolKind; // AST nodes that correspond to session type constructors -- elements of InteractionSeq nodes // Make a compound interaction subclass for choice/parallel etc? diff --git a/scribble-lang/src/main/java/org/scribble/ast/SigParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/SigParamDecl.java similarity index 91% rename from scribble-lang/src/main/java/org/scribble/ast/SigParamDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/SigParamDecl.java index 5de123a52..284df864d 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/SigParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SigParamDecl.java @@ -15,9 +15,9 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.simple.SigParamNode; -import org.scribble.type.kind.SigKind; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.SigKind; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.Role; import org.scribble.util.Constants; public class SigParamDecl extends NonRoleParamDecl diff --git a/scribble-lang/src/main/java/org/scribble/ast/SimpleSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/SimpleSessionNode.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/SimpleSessionNode.java rename to scribble-ast/src/main/java/org/scribble/ast/SimpleSessionNode.java index 009e5643e..90c218755 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/SimpleSessionNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SimpleSessionNode.java @@ -15,7 +15,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtocolKind; // Name should be read (Simple ( InteractionNode )) // FIXME: rename: Continue/Do aren't really interactions diff --git a/scribble-lang/src/main/java/org/scribble/ast/TypeParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/TypeParamDecl.java similarity index 92% rename from scribble-lang/src/main/java/org/scribble/ast/TypeParamDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/TypeParamDecl.java index 966eec92b..10b1fda4f 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/TypeParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/TypeParamDecl.java @@ -15,9 +15,9 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.simple.TypeParamNode; -import org.scribble.type.kind.DataTypeKind; -import org.scribble.type.name.DataType; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.Role; import org.scribble.util.Constants; public class TypeParamDecl extends NonRoleParamDecl diff --git a/scribble-lang/src/main/java/org/scribble/ast/UnaryPayloadElem.java b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/UnaryPayloadElem.java rename to scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java index b38b7293e..97a3973c7 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/UnaryPayloadElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java @@ -16,10 +16,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.PayloadElemNameNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.PayloadTypeKind; +import org.scribble.core.type.name.PayloadElemType; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.PayloadTypeKind; -import org.scribble.type.name.PayloadElemType; import org.scribble.visit.AstVisitor; diff --git a/scribble-lang/src/main/java/org/scribble/ast/context/DependencyMap.java b/scribble-ast/src/main/java/org/scribble/ast/context/DependencyMap.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/context/DependencyMap.java rename to scribble-ast/src/main/java/org/scribble/ast/context/DependencyMap.java index 037a86027..87c891efb 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/context/DependencyMap.java +++ b/scribble-ast/src/main/java/org/scribble/ast/context/DependencyMap.java @@ -18,8 +18,8 @@ import java.util.Map; import java.util.Map.Entry; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.Role; import java.util.Set; diff --git a/scribble-lang/src/main/java/org/scribble/ast/context/ProtocolDeclContext.java b/scribble-ast/src/main/java/org/scribble/ast/context/ProtocolDeclContext.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/context/ProtocolDeclContext.java rename to scribble-ast/src/main/java/org/scribble/ast/context/ProtocolDeclContext.java index 83a96e8b8..cf81f8b6b 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/context/ProtocolDeclContext.java +++ b/scribble-ast/src/main/java/org/scribble/ast/context/ProtocolDeclContext.java @@ -18,9 +18,9 @@ import java.util.HashSet; import java.util.Set; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.Role; public abstract class ProtocolDeclContext { diff --git a/scribble-lang/src/main/java/org/scribble/ast/context/global/GDependencyMap.java b/scribble-ast/src/main/java/org/scribble/ast/context/global/GDependencyMap.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/context/global/GDependencyMap.java rename to scribble-ast/src/main/java/org/scribble/ast/context/global/GDependencyMap.java index 4186e48be..ea0dbfba9 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/context/global/GDependencyMap.java +++ b/scribble-ast/src/main/java/org/scribble/ast/context/global/GDependencyMap.java @@ -14,7 +14,7 @@ package org.scribble.ast.context.global; import org.scribble.ast.context.DependencyMap; -import org.scribble.type.name.GProtocolName; +import org.scribble.core.type.name.GProtocolName; public class GDependencyMap extends DependencyMap { diff --git a/scribble-lang/src/main/java/org/scribble/ast/context/global/GProtocolDeclContext.java b/scribble-ast/src/main/java/org/scribble/ast/context/global/GProtocolDeclContext.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/ast/context/global/GProtocolDeclContext.java rename to scribble-ast/src/main/java/org/scribble/ast/context/global/GProtocolDeclContext.java index 58dbaa0e2..b2c3c33a7 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/context/global/GProtocolDeclContext.java +++ b/scribble-ast/src/main/java/org/scribble/ast/context/global/GProtocolDeclContext.java @@ -17,8 +17,8 @@ import java.util.Set; import org.scribble.ast.context.ProtocolDeclContext; -import org.scribble.type.kind.Global; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.Role; public class GProtocolDeclContext extends ProtocolDeclContext { diff --git a/scribble-lang/src/main/java/org/scribble/ast/context/local/LDependencyMap.java b/scribble-ast/src/main/java/org/scribble/ast/context/local/LDependencyMap.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/context/local/LDependencyMap.java rename to scribble-ast/src/main/java/org/scribble/ast/context/local/LDependencyMap.java index 9d9540aef..ddbb4db07 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/context/local/LDependencyMap.java +++ b/scribble-ast/src/main/java/org/scribble/ast/context/local/LDependencyMap.java @@ -14,7 +14,7 @@ package org.scribble.ast.context.local; import org.scribble.ast.context.DependencyMap; -import org.scribble.type.name.LProtocolName; +import org.scribble.core.type.name.LProtocolName; public class LDependencyMap extends DependencyMap { diff --git a/scribble-lang/src/main/java/org/scribble/ast/context/local/LProjectionDeclContext.java b/scribble-ast/src/main/java/org/scribble/ast/context/local/LProjectionDeclContext.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/ast/context/local/LProjectionDeclContext.java rename to scribble-ast/src/main/java/org/scribble/ast/context/local/LProjectionDeclContext.java index 758fce715..03c534414 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/context/local/LProjectionDeclContext.java +++ b/scribble-ast/src/main/java/org/scribble/ast/context/local/LProjectionDeclContext.java @@ -15,8 +15,8 @@ import java.util.Set; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.Role; @Deprecated diff --git a/scribble-lang/src/main/java/org/scribble/ast/context/local/LProtocolDeclContext.java b/scribble-ast/src/main/java/org/scribble/ast/context/local/LProtocolDeclContext.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/ast/context/local/LProtocolDeclContext.java rename to scribble-ast/src/main/java/org/scribble/ast/context/local/LProtocolDeclContext.java index f96fff131..e3c765aca 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/context/local/LProtocolDeclContext.java +++ b/scribble-ast/src/main/java/org/scribble/ast/context/local/LProtocolDeclContext.java @@ -17,8 +17,8 @@ import java.util.Set; import org.scribble.ast.context.ProtocolDeclContext; -import org.scribble.type.kind.Local; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.Role; public class LProtocolDeclContext extends ProtocolDeclContext { diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GChoice.java b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/global/GChoice.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java index c3b8acdc1..a4d04f420 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GChoice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java @@ -25,10 +25,10 @@ import org.scribble.ast.local.LChoice; import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.job.RuntimeScribbleException; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Global; -import org.scribble.type.name.Role; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.Role; public class GChoice extends Choice implements GCompoundInteraction { diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GCompoundInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/global/GCompoundInteraction.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/ast/global/GCompoundInteraction.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GCompoundInteraction.java diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GConnect.java b/scribble-ast/src/main/java/org/scribble/ast/global/GConnect.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/global/GConnect.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GConnect.java index d088519cb..9caa42155 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GConnect.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GConnect.java @@ -20,9 +20,9 @@ import org.scribble.ast.MessageNode; import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.RoleKind; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.RoleKind; +import org.scribble.core.type.name.Role; import org.scribble.util.Constants; // TODO: make GConnectionAction and factor this class with GWrap (cf. LConnectionAction) diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GContinue.java b/scribble-ast/src/main/java/org/scribble/ast/global/GContinue.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/ast/global/GContinue.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GContinue.java index 821957c0b..3f40b10ca 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GContinue.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GContinue.java @@ -19,9 +19,9 @@ import org.scribble.ast.Continue; import org.scribble.ast.local.LContinue; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.RecVarKind; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.RecVarKind; +import org.scribble.core.type.name.Role; public class GContinue extends Continue implements GSimpleSessionNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GDelegationElem.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/global/GDelegationElem.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java index e34576fe9..9403c879c 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GDelegationElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java @@ -21,11 +21,11 @@ import org.scribble.ast.local.LDelegationElem; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.GDelegationType; +import org.scribble.core.type.name.PayloadElemType; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Local; -import org.scribble.type.name.GDelegationType; -import org.scribble.type.name.PayloadElemType; import org.scribble.visit.AstVisitor; import org.scribble.visit.context.Projector; diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GDisconnect.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/global/GDisconnect.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java index 887ca1d0b..8e33dc452 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GDisconnect.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java @@ -19,9 +19,9 @@ import org.scribble.ast.DisconnectAction; import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.RoleKind; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.RoleKind; +import org.scribble.core.type.name.Role; import org.scribble.util.Constants; public class GDisconnect extends DisconnectAction diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GDo.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java similarity index 90% rename from scribble-lang/src/main/java/org/scribble/ast/global/GDo.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GDo.java index 20b1b44e0..e31f7f568 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GDo.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java @@ -22,11 +22,11 @@ import org.scribble.ast.local.LDo; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.job.JobContext; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.kind.Global; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.Role; +import org.scribble.lang.LangContext; public class GDo extends Do implements GSimpleSessionNode { @@ -69,7 +69,7 @@ public GProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) } @Override - public GProtocolDecl getTargetProtocolDecl(JobContext jcontext, + public GProtocolDecl getTargetProtocolDecl(LangContext jcontext, ModuleContext mcontext) { return (GProtocolDecl) super.getTargetProtocolDecl(jcontext, mcontext); diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GInteractionSeq.java b/scribble-ast/src/main/java/org/scribble/ast/global/GInteractionSeq.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/global/GInteractionSeq.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GInteractionSeq.java index c7681946d..c9348b3ac 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GInteractionSeq.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GInteractionSeq.java @@ -21,9 +21,9 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.InteractionSeq; import org.scribble.ast.local.LSessionNode; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.Role; import org.scribble.ast.local.LInteractionSeq; -import org.scribble.type.kind.Global; -import org.scribble.type.name.Role; public class GInteractionSeq extends InteractionSeq implements GScribNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GMessageTransfer.java b/scribble-ast/src/main/java/org/scribble/ast/global/GMessageTransfer.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/global/GMessageTransfer.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GMessageTransfer.java index 6a5a63b8e..f763f574e 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GMessageTransfer.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GMessageTransfer.java @@ -26,9 +26,9 @@ import org.scribble.ast.local.LScribNode; import org.scribble.ast.local.LReceive; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.RoleKind; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.RoleKind; +import org.scribble.core.type.name.Role; import org.scribble.util.Constants; public class GMessageTransfer extends MessageTransfer diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolBlock.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/global/GProtocolBlock.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java index f0b70dd51..2266578d3 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java @@ -19,8 +19,8 @@ import org.scribble.ast.ProtocolBlock; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProtocolBlock; -import org.scribble.type.kind.Global; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.Role; public class GProtocolBlock extends ProtocolBlock implements GScribNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDecl.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java index 018fe50ae..089888d2e 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java @@ -24,10 +24,10 @@ import org.scribble.ast.local.LProjectionDecl; import org.scribble.ast.local.LProtocolDef; import org.scribble.ast.local.LProtocolHeader; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Global; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.Role; public class GProtocolDecl extends ProtocolDecl implements GScribNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDef.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDef.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDef.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDef.java index 8ca610380..1a4d44b8f 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolDef.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDef.java @@ -19,8 +19,8 @@ import org.scribble.ast.ProtocolDef; import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.local.LProtocolDef; -import org.scribble.type.kind.Global; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.Role; public class GProtocolDef extends ProtocolDef implements GScribNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolHeader.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/global/GProtocolHeader.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java index 1af6f93a5..98a365c19 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GProtocolHeader.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java @@ -22,9 +22,9 @@ import org.scribble.ast.local.LProtocolHeader; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.type.kind.Global; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.Role; import org.scribble.util.Constants; public class GProtocolHeader extends ProtocolHeader implements GScribNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GRecursion.java b/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/ast/global/GRecursion.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java index e23e7b115..5aaaa1a24 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GRecursion.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java @@ -34,9 +34,9 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.local.LRecursion; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.type.kind.Global; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; public class GRecursion extends Recursion diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GScribNode.java b/scribble-ast/src/main/java/org/scribble/ast/global/GScribNode.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/global/GScribNode.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GScribNode.java index f6589427d..fb0330ab3 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GScribNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GScribNode.java @@ -14,7 +14,7 @@ package org.scribble.ast.global; import org.scribble.ast.ProtocolKindNode; -import org.scribble.type.kind.Global; +import org.scribble.core.type.kind.Global; public interface GScribNode extends ProtocolKindNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/global/GSessionNode.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/global/GSessionNode.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GSessionNode.java index e5f5f5186..f5268b1aa 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GSessionNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GSessionNode.java @@ -14,7 +14,7 @@ package org.scribble.ast.global; import org.scribble.ast.SessionNode; -import org.scribble.type.kind.Global; +import org.scribble.core.type.kind.Global; // Alternatively to interface, use GlobalNode subclass with delegation to "super" base (e.g. Choice) classes public interface GSessionNode extends SessionNode, GScribNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GSimpleSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/global/GSimpleSessionNode.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/ast/global/GSimpleSessionNode.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GSimpleSessionNode.java diff --git a/scribble-lang/src/main/java/org/scribble/ast/global/GWrap.java b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/global/GWrap.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java index 36289a40c..c12d9a182 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/global/GWrap.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java @@ -20,9 +20,9 @@ import org.scribble.ast.MessageSigNode; import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.RoleKind; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.RoleKind; +import org.scribble.core.type.name.Role; import org.scribble.util.Constants; public class GWrap extends ConnectAction implements GSimpleSessionNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LAccept.java b/scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/ast/local/LAccept.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java index 17752db3e..41164e469 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LAccept.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java @@ -21,10 +21,10 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.job.RuntimeScribbleException; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; import org.scribble.util.Constants; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LChoice.java b/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/local/LChoice.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java index 73ecdbd39..2bbf35d14 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LChoice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java @@ -24,10 +24,10 @@ import org.scribble.ast.Choice; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Local; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LChoice extends Choice implements LCompoundInteraction diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LCompoundInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/local/LCompoundInteraction.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/ast/local/LCompoundInteraction.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LCompoundInteraction.java diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LConnectionAction.java b/scribble-ast/src/main/java/org/scribble/ast/local/LConnectionAction.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/local/LConnectionAction.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LConnectionAction.java index 0a73d3885..8e13df0fa 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LConnectionAction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LConnectionAction.java @@ -18,7 +18,7 @@ import org.scribble.ast.ConnectAction; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.type.kind.Local; +import org.scribble.core.type.kind.Local; public abstract class LConnectionAction extends ConnectAction implements LSimpleSessionNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LContinue.java b/scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/local/LContinue.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java index 94b060183..a2e40cdd8 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LContinue.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java @@ -21,10 +21,10 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Continue; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Local; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LContinue extends Continue implements LSimpleSessionNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LDelegationElem.java b/scribble-ast/src/main/java/org/scribble/ast/local/LDelegationElem.java similarity index 98% rename from scribble-lang/src/main/java/org/scribble/ast/local/LDelegationElem.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LDelegationElem.java index a5cd56254..73fe09599 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LDelegationElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LDelegationElem.java @@ -17,7 +17,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.UnaryPayloadElem; import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.type.kind.Local; +import org.scribble.core.type.kind.Local; // N.B. extends UnaryPayloadElem, not DelegationElem public class LDelegationElem extends UnaryPayloadElem diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LDisconnect.java b/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/ast/local/LDisconnect.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java index f983e5359..e95c29a89 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LDisconnect.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java @@ -22,11 +22,11 @@ import org.scribble.ast.DisconnectAction; import org.scribble.ast.MessageSigNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.job.RuntimeScribbleException; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Local; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; import org.scribble.util.Constants; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LDo.java b/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java similarity index 88% rename from scribble-lang/src/main/java/org/scribble/ast/local/LDo.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LDo.java index 609f89dbd..37236e0e2 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LDo.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java @@ -24,14 +24,14 @@ import org.scribble.ast.NonRoleArgList; import org.scribble.ast.RoleArgList; import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.job.JobContext; -import org.scribble.job.RuntimeScribbleException; -import org.scribble.job.ScribbleException; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.kind.Local; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; +import org.scribble.lang.LangContext; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LDo extends Do implements LSimpleSessionNode @@ -64,7 +64,7 @@ public LDo dupNode() public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { ModuleContext mc = fixer.getModuleContext(); - JobContext jc = fixer.job.getContext(); + LangContext jc = fixer.job.getContext(); Role subj = getTargetProtocolDecl(jc, mc).getDefChild().getBlockChild() .getInteractSeqChild().getInteractionChildren().get(0) .inferLocalChoiceSubject(fixer); @@ -108,7 +108,7 @@ public LProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) } @Override - public LProtocolDecl getTargetProtocolDecl(JobContext jcontext, + public LProtocolDecl getTargetProtocolDecl(LangContext jcontext, ModuleContext mcontext) { return (LProtocolDecl) super.getTargetProtocolDecl(jcontext, mcontext); diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LInteractionSeq.java b/scribble-ast/src/main/java/org/scribble/ast/local/LInteractionSeq.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/local/LInteractionSeq.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LInteractionSeq.java index deadae423..b9efa72a0 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LInteractionSeq.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LInteractionSeq.java @@ -21,8 +21,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.InteractionSeq; -import org.scribble.type.kind.Local; -import org.scribble.type.session.Message; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.session.Message; public class LInteractionSeq extends InteractionSeq implements LScribNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LMessageTransfer.java b/scribble-ast/src/main/java/org/scribble/ast/local/LMessageTransfer.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/local/LMessageTransfer.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LMessageTransfer.java index 68373e3ae..81fb4412e 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LMessageTransfer.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LMessageTransfer.java @@ -20,7 +20,7 @@ import org.scribble.ast.MessageNode; import org.scribble.ast.MessageTransfer; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.type.kind.Local; +import org.scribble.core.type.kind.Local; public abstract class LMessageTransfer extends MessageTransfer implements LSimpleSessionNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LProjectionDecl.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/ast/local/LProjectionDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolBlock.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/local/LProtocolBlock.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java index 322dace4a..4261bcaa0 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java @@ -18,8 +18,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.ProtocolBlock; -import org.scribble.type.kind.Local; -import org.scribble.type.session.Message; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.session.Message; public class LProtocolBlock extends ProtocolBlock implements LScribNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDecl.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolDecl.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LProtocolDecl.java index c299e2e0b..c070f0e70 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolDecl.java @@ -23,10 +23,10 @@ import org.scribble.ast.ProtocolHeader; import org.scribble.ast.ProtocolMod; import org.scribble.ast.ProtocolModList; -import org.scribble.type.kind.Local; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.ModuleName; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.name.Role; // CHECKME: maybe make abstract with concrete parsed (LParsedDecl) and projected (LProjectionDecl) subclasses public class LProtocolDecl extends ProtocolDecl implements LScribNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDef.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolDef.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDef.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LProtocolDef.java index 54783325f..f5c858944 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolDef.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolDef.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.ProtocolDef; -import org.scribble.type.kind.Local; +import org.scribble.core.type.kind.Local; public class LProtocolDef extends ProtocolDef implements LScribNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolHeader.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolHeader.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/local/LProtocolHeader.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LProtocolHeader.java index 3a010561f..0aa23dafa 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LProtocolHeader.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolHeader.java @@ -22,10 +22,10 @@ import org.scribble.ast.RoleDeclList; import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.ast.name.qualified.ProtocolNameNode; -import org.scribble.type.kind.Local; -import org.scribble.type.kind.RoleKind; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.kind.RoleKind; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.Role; import org.scribble.util.Constants; public class LProtocolHeader extends ProtocolHeader implements LScribNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LReceive.java b/scribble-ast/src/main/java/org/scribble/ast/local/LReceive.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/ast/local/LReceive.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LReceive.java index 88bf56c6f..f6f74dfa2 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LReceive.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LReceive.java @@ -22,10 +22,10 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.job.RuntimeScribbleException; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; import org.scribble.util.Constants; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LRecursion.java b/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/local/LRecursion.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java index 563910b49..d3b977665 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LRecursion.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java @@ -20,10 +20,10 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Recursion; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Local; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LRecursion extends Recursion implements LCompoundInteraction diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LRequest.java b/scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/local/LRequest.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java index 2ec8e598d..abe9c0143 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LRequest.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java @@ -21,10 +21,10 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.job.RuntimeScribbleException; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; import org.scribble.util.Constants; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LScribNode.java b/scribble-ast/src/main/java/org/scribble/ast/local/LScribNode.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/local/LScribNode.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LScribNode.java index f835ec2d5..da6d84bc5 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LScribNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LScribNode.java @@ -14,7 +14,7 @@ package org.scribble.ast.local; import org.scribble.ast.ProtocolKindNode; -import org.scribble.type.kind.Local; +import org.scribble.core.type.kind.Local; public interface LScribNode extends ProtocolKindNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LSend.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/ast/local/LSend.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LSend.java index 81fca50ec..37da3da7c 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LSend.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java @@ -23,10 +23,10 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.job.RuntimeScribbleException; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; import org.scribble.util.Constants; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java similarity index 88% rename from scribble-lang/src/main/java/org/scribble/ast/local/LSessionNode.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java index 93dfda7bd..6f265d77a 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LSessionNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java @@ -17,10 +17,10 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.SessionNode; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Local; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; // Alternatively to interface, use GlobalNode subclass with delegation to "super" base (e.g. Choice) classes diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LWrapClient.java b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/ast/local/LWrapClient.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java index 5fe544358..83d2e055f 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LWrapClient.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java @@ -21,10 +21,10 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MessageSigNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.job.RuntimeScribbleException; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; import org.scribble.util.Constants; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/LWrapServer.java b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/ast/local/LWrapServer.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java index e5ecfc8ff..d895999a8 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/LWrapServer.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java @@ -21,10 +21,10 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MessageSigNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.job.RuntimeScribbleException; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; import org.scribble.util.Constants; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-lang/src/main/java/org/scribble/ast/local/SelfRoleDecl.java b/scribble-ast/src/main/java/org/scribble/ast/local/SelfRoleDecl.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/ast/local/SelfRoleDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/local/SelfRoleDecl.java index edb8eab05..3166685fb 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/local/SelfRoleDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/SelfRoleDecl.java @@ -18,7 +18,7 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.RoleDecl; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.type.name.Role; +import org.scribble.core.type.name.Role; // Child should be a "self" ID node public class SelfRoleDecl extends RoleDecl diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/NameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/ast/name/NameNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java index 562400926..1eee988d9 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/NameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java @@ -20,8 +20,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.ScribNodeBase; -import org.scribble.type.kind.Kind; -import org.scribble.type.name.Named; +import org.scribble.core.type.kind.Kind; +import org.scribble.core.type.name.Named; // Kind parameter used for typing help, but NameNodes don't record kind as state (not part of the syntax) -- so kind doesn't affect e.g. equals (i.e. name nodes of different kinds are still only compared syntactically) public abstract class NameNode extends ScribNodeBase diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/PayloadElemNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/PayloadElemNameNode.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/ast/name/PayloadElemNameNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/PayloadElemNameNode.java index 09b8c1baf..b7dcd8716 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/PayloadElemNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/PayloadElemNameNode.java @@ -14,8 +14,8 @@ package org.scribble.ast.name; import org.scribble.ast.NonRoleArgNode; -import org.scribble.type.kind.PayloadTypeKind; -import org.scribble.type.name.PayloadElemType; +import org.scribble.core.type.kind.PayloadTypeKind; +import org.scribble.core.type.name.PayloadElemType; // A datatype kind node: DataTypeNode or NonRoleParameterNode -- not necessarily simple nor qualified diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java index a115ed2db..a8bdb6446 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java @@ -16,9 +16,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.PayloadElemNameNode; -import org.scribble.type.kind.DataTypeKind; -import org.scribble.type.name.DataType; -import org.scribble.type.session.Arg; +import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.session.Arg; //public class DataTypeNode extends MemberNameNode implements PayloadElemNameNode public class DataTypeNode extends MemberNameNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java index 4582f44ec..47697cd95 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java @@ -15,8 +15,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.Global; -import org.scribble.type.name.GProtocolName; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.GProtocolName; public class GProtocolNameNode extends ProtocolNameNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java index 94cc98673..a69f7e41a 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java @@ -16,9 +16,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.PayloadElemNameNode; -import org.scribble.type.kind.Local; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.session.Arg; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.session.Arg; public class LProtocolNameNode extends ProtocolNameNode implements PayloadElemNameNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java similarity index 91% rename from scribble-lang/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java index 54d70898d..544ad1bbf 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java @@ -17,9 +17,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.Kind; -import org.scribble.type.name.ModuleName; -import org.scribble.type.name.PackageName; +import org.scribble.core.type.kind.Kind; +import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.name.PackageName; public abstract class MemberNameNode extends QualifiedNameNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java index 138447b28..2fe3921d8 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java @@ -17,8 +17,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; -import org.scribble.type.kind.SigKind; -import org.scribble.type.name.MessageSigName; +import org.scribble.core.type.kind.SigKind; +import org.scribble.core.type.name.MessageSigName; public class MessageSigNameNode extends MemberNameNode implements MessageNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java index 7896a1be5..0c6c00f7e 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java @@ -15,9 +15,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.ModuleKind; -import org.scribble.type.name.ModuleName; -import org.scribble.type.name.PackageName; +import org.scribble.core.type.kind.ModuleKind; +import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.name.PackageName; public class ModuleNameNode extends QualifiedNameNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java similarity index 92% rename from scribble-lang/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java index bb9b3bfea..92415f165 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java @@ -15,8 +15,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.ProtocolName; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; public abstract class ProtocolNameNode extends MemberNameNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java index 64661c24e..3796f098c 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; -import org.scribble.type.kind.Kind; +import org.scribble.core.type.kind.Kind; // Any name that could be compound/qualified (but could also be a singleton) public abstract class QualifiedNameNode extends NameNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java similarity index 91% rename from scribble-lang/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index 762d968ed..83a284fed 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -18,13 +18,13 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.name.PayloadElemNameNode; -import org.scribble.type.kind.AmbigKind; -import org.scribble.type.kind.DataTypeKind; -import org.scribble.type.kind.NonRoleArgKind; -import org.scribble.type.name.AmbigName; -import org.scribble.type.name.PayloadElemType; -import org.scribble.type.session.Arg; -import org.scribble.type.session.Message; +import org.scribble.core.type.kind.AmbigKind; +import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.kind.NonRoleArgKind; +import org.scribble.core.type.name.AmbigName; +import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.session.Arg; +import org.scribble.core.type.session.Message; // Primitive payload type, MessageSigName or parameter names only: if name is parsed as a CompoundNameNodes, it must be a payload type (not ambiguous in this case) // No counterpart needed for MessageNode because MessageSignature values can be syntactically distinguished from sig parameters diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java similarity index 98% rename from scribble-lang/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java index 5a9947c51..7dd669a3e 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java @@ -14,7 +14,7 @@ package org.scribble.ast.name.simple; import org.antlr.runtime.Token; -import org.scribble.type.name.Role; +import org.scribble.core.type.name.Role; import org.scribble.visit.Substitutor; // For local choice subjects diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/simple/IdNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/ast/name/simple/IdNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java index 677869fbb..ce2597d8f 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/simple/IdNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java @@ -15,8 +15,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.IdKind; -import org.scribble.type.name.Identifier; +import org.scribble.core.type.kind.IdKind; +import org.scribble.core.type.name.Id; // N.B. no del attached, so not currently visited public class IdNode extends SimpleNameNode @@ -46,9 +46,9 @@ public String getText() } @Override - public Identifier toName() + public Id toName() { - return new Identifier(getText()); + return new Id(getText()); } @Override diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java similarity index 98% rename from scribble-lang/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java index 647d7de4d..12c7e58e4 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java @@ -15,7 +15,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.NonRoleParamKind; +import org.scribble.core.type.kind.NonRoleParamKind; // An unambiguous kinded parameter (ambiguous parameters handled by disambiguation) that isn't a role -- e.g. DataType/MessageSigName param //public class NonRoleParamNode extends SimpleNameNode implements MessageNode, PayloadElemNameNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/simple/OpNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/name/simple/OpNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java index 45e43533a..adc2f0c9b 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/simple/OpNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java @@ -15,8 +15,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.OpKind; -import org.scribble.type.name.Op; +import org.scribble.core.type.kind.OpKind; +import org.scribble.core.type.name.Op; public class OpNode extends SimpleNameNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/simple/RecVarNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/name/simple/RecVarNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java index 0b6345ed0..0254dd31d 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/simple/RecVarNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java @@ -15,8 +15,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.RecVarKind; -import org.scribble.type.name.RecVar; +import org.scribble.core.type.kind.RecVarKind; +import org.scribble.core.type.name.RecVar; public class RecVarNode extends SimpleNameNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/simple/RoleNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/ast/name/simple/RoleNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java index acae2c669..84577ce57 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/simple/RoleNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java @@ -17,9 +17,9 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.DoArgNode; import org.scribble.ast.ScribNode; +import org.scribble.core.type.kind.RoleKind; +import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; -import org.scribble.type.kind.RoleKind; -import org.scribble.type.name.Role; import org.scribble.visit.Substitutor; public class RoleNode extends SimpleNameNode implements DoArgNode //RoleDecl, RoleInstantiation diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/simple/SigParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/name/simple/SigParamNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java index b0d30394e..ee072ea9a 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/simple/SigParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java @@ -17,8 +17,8 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.MessageSigNode; -import org.scribble.type.kind.SigKind; -import org.scribble.type.name.MessageSigName; +import org.scribble.core.type.kind.SigKind; +import org.scribble.core.type.name.MessageSigName; import org.scribble.visit.Substitutor; public class SigParamNode extends NonRoleParamNode diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java similarity index 88% rename from scribble-lang/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java index 63dcbaf55..40f7679a1 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java @@ -16,9 +16,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; -import org.scribble.type.kind.Kind; +import org.scribble.core.type.kind.Kind; -// Names that are necessaryily "simple", i.e., never compound qualified +// Names that are necessarily "simple", i.e., never compound qualified (cf. qualified, that may be simple or compound) // "Identifier" in parser grammar public abstract class SimpleNameNode extends NameNode { diff --git a/scribble-lang/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java index a00954238..90565de6e 100644 --- a/scribble-lang/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java @@ -16,8 +16,8 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.PayloadElemNameNode; import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.type.kind.DataTypeKind; -import org.scribble.type.name.DataType; +import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.name.DataType; import org.scribble.visit.Substitutor; public class TypeParamNode extends NonRoleParamNode diff --git a/scribble-lang/src/main/java/org/scribble/del/ChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/ChoiceDel.java similarity index 98% rename from scribble-lang/src/main/java/org/scribble/del/ChoiceDel.java rename to scribble-ast/src/main/java/org/scribble/del/ChoiceDel.java index c3fa42d95..9982221cd 100644 --- a/scribble-lang/src/main/java/org/scribble/del/ChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ChoiceDel.java @@ -18,7 +18,7 @@ import org.scribble.ast.Choice; import org.scribble.ast.ScribNode; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.env.UnfoldingEnv; import org.scribble.visit.wf.ExplicitCorrelationChecker; diff --git a/scribble-lang/src/main/java/org/scribble/del/CompoundInteractionDel.java b/scribble-ast/src/main/java/org/scribble/del/CompoundInteractionDel.java similarity index 99% rename from scribble-lang/src/main/java/org/scribble/del/CompoundInteractionDel.java rename to scribble-ast/src/main/java/org/scribble/del/CompoundInteractionDel.java index ac5604fee..71d18fc14 100644 --- a/scribble-lang/src/main/java/org/scribble/del/CompoundInteractionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/CompoundInteractionDel.java @@ -15,7 +15,7 @@ import org.scribble.ast.CompoundInteraction; import org.scribble.ast.ScribNode; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; diff --git a/scribble-lang/src/main/java/org/scribble/del/CompoundSessionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/CompoundSessionNodeDel.java similarity index 98% rename from scribble-lang/src/main/java/org/scribble/del/CompoundSessionNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/CompoundSessionNodeDel.java index d45921950..c4807b710 100644 --- a/scribble-lang/src/main/java/org/scribble/del/CompoundSessionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/CompoundSessionNodeDel.java @@ -14,7 +14,7 @@ package org.scribble.del; import org.scribble.ast.ScribNode; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; import org.scribble.visit.wf.ExplicitCorrelationChecker; diff --git a/scribble-lang/src/main/java/org/scribble/del/ConnectionActionDel.java b/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java similarity index 98% rename from scribble-lang/src/main/java/org/scribble/del/ConnectionActionDel.java rename to scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java index 169cfc098..589238f04 100644 --- a/scribble-lang/src/main/java/org/scribble/del/ConnectionActionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java @@ -15,7 +15,7 @@ import org.scribble.ast.ConnectAction; import org.scribble.ast.ScribNode; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.env.UnfoldingEnv; diff --git a/scribble-lang/src/main/java/org/scribble/del/ContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/ContinueDel.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/del/ContinueDel.java rename to scribble-ast/src/main/java/org/scribble/del/ContinueDel.java index b65df8845..4ecec18e6 100644 --- a/scribble-lang/src/main/java/org/scribble/del/ContinueDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ContinueDel.java @@ -16,8 +16,8 @@ import org.scribble.ast.Continue; import org.scribble.ast.Recursion; import org.scribble.ast.ScribNode; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.RecVar; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.RecVar; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.util.RecVarCollector; diff --git a/scribble-lang/src/main/java/org/scribble/del/DefaultDel.java b/scribble-ast/src/main/java/org/scribble/del/DefaultDel.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/del/DefaultDel.java rename to scribble-ast/src/main/java/org/scribble/del/DefaultDel.java diff --git a/scribble-lang/src/main/java/org/scribble/del/DelDecorator.java b/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/del/DelDecorator.java rename to scribble-ast/src/main/java/org/scribble/del/DelDecorator.java diff --git a/scribble-lang/src/main/java/org/scribble/del/DelDecoratorImpl.java b/scribble-ast/src/main/java/org/scribble/del/DelDecoratorImpl.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/del/DelDecoratorImpl.java rename to scribble-ast/src/main/java/org/scribble/del/DelDecoratorImpl.java diff --git a/scribble-lang/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java similarity index 92% rename from scribble-lang/src/main/java/org/scribble/del/DoArgListDel.java rename to scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java index 9318d0d2d..bd83a9bfc 100644 --- a/scribble-lang/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java @@ -22,10 +22,10 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.job.JobContext; -import org.scribble.job.ScribbleException; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.name.ProtocolName; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.lang.LangContext; import org.scribble.visit.wf.NameDisambiguator; public abstract class DoArgListDel extends ScribDelBase @@ -57,7 +57,7 @@ protected ProtocolDecl getTargetProtocolDecl(Do parent, NameDisambiguator disamb) throws ScribbleException { ModuleContext mc = disamb.getModuleContext(); - JobContext jc = disamb.job.getContext(); + LangContext jc = disamb.job.getContext(); Do doo = (Do) parent; ProtocolName pn = doo.getProtocolNameNode().toName(); /*if (!mc.isVisibleProtocolDeclName(simpname)) // FIXME: should be checked somewhere else? earlier (do-entry?) -- done diff --git a/scribble-lang/src/main/java/org/scribble/del/DoDel.java b/scribble-ast/src/main/java/org/scribble/del/DoDel.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/del/DoDel.java rename to scribble-ast/src/main/java/org/scribble/del/DoDel.java index c48a9892b..acb17eed3 100644 --- a/scribble-lang/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoDel.java @@ -16,13 +16,13 @@ import org.scribble.ast.Do; import org.scribble.ast.ScribNode; import org.scribble.ast.name.qualified.ProtocolNameNode; -import org.scribble.job.JobContext; -import org.scribble.job.ScribbleException; -import org.scribble.lang.SubprotoSig; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.Role; +import org.scribble.lang.LangContext; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.ProtocolDeclContextBuilder; import org.scribble.visit.wf.NameDisambiguator; @@ -100,7 +100,7 @@ public Do leaveProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) throws ScribbleException { - JobContext jcontext = builder.job.getContext(); + LangContext jcontext = builder.job.getContext(); ModuleContext mcontext = builder.getModuleContext(); Do doo = (Do) visited; ProtocolName pn = doo.getProtocolNameNode().toName(); // leaveDisambiguation has fully qualified the target name diff --git a/scribble-lang/src/main/java/org/scribble/del/HeaderParamDeclListDel.java b/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/del/HeaderParamDeclListDel.java rename to scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java index e969dae4c..4a7073387 100644 --- a/scribble-lang/src/main/java/org/scribble/del/HeaderParamDeclListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java @@ -18,7 +18,7 @@ import org.scribble.ast.HeaderParamDecl; import org.scribble.ast.HeaderParamDeclList; import org.scribble.ast.ScribNode; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; import org.scribble.visit.wf.NameDisambiguator; public abstract class HeaderParamDeclListDel extends ScribDelBase diff --git a/scribble-lang/src/main/java/org/scribble/del/ImportModuleDel.java b/scribble-ast/src/main/java/org/scribble/del/ImportModuleDel.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/del/ImportModuleDel.java rename to scribble-ast/src/main/java/org/scribble/del/ImportModuleDel.java diff --git a/scribble-lang/src/main/java/org/scribble/del/InteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/InteractionNodeDel.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/del/InteractionNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/InteractionNodeDel.java diff --git a/scribble-lang/src/main/java/org/scribble/del/InteractionSeqDel.java b/scribble-ast/src/main/java/org/scribble/del/InteractionSeqDel.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/del/InteractionSeqDel.java rename to scribble-ast/src/main/java/org/scribble/del/InteractionSeqDel.java index f5b53bdca..0d65f059c 100644 --- a/scribble-lang/src/main/java/org/scribble/del/InteractionSeqDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/InteractionSeqDel.java @@ -14,7 +14,7 @@ package org.scribble.del; import org.scribble.ast.ScribNode; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; import org.scribble.visit.ProtocolDefInliner; public abstract class InteractionSeqDel extends ScribDelBase diff --git a/scribble-lang/src/main/java/org/scribble/del/MessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/del/MessageTransferDel.java rename to scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java index fd6b3bca7..c941ffc7e 100644 --- a/scribble-lang/src/main/java/org/scribble/del/MessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java @@ -20,9 +20,9 @@ import org.scribble.ast.PayloadElem; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GDelegationElem; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.MessageId; import org.scribble.del.global.GDelegationElemDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.MessageId; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.ProtocolDeclContextBuilder; diff --git a/scribble-lang/src/main/java/org/scribble/del/ModuleDel.java b/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/del/ModuleDel.java rename to scribble-ast/src/main/java/org/scribble/del/ModuleDel.java index a6d4c60ce..5e6a634a3 100644 --- a/scribble-lang/src/main/java/org/scribble/del/ModuleDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java @@ -32,11 +32,11 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.local.LProtocolDecl; import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.job.ScribbleException; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.Role; import org.scribble.visit.context.ModuleContextBuilder; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; @@ -169,7 +169,7 @@ public Module createModuleForProjection(Projector proj, Module root, { for (Role role : deps.get(gpn)) { - LProtocolName targetsimpname = org.scribble.visit.global.Projector2 + LProtocolName targetsimpname = org.scribble.core.visit.global.Projector2 .projectSimpleProtocolName(gpn.getSimpleName(), role); ModuleNameNode targetmodname = Projector.makeProjectedModuleNameNode( proj.job.config.af, diff --git a/scribble-lang/src/main/java/org/scribble/del/NonRoleArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/del/NonRoleArgListDel.java rename to scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java index 4ce8f2359..4be1cf8ff 100644 --- a/scribble-lang/src/main/java/org/scribble/del/NonRoleArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java @@ -24,10 +24,10 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.NonRoleParamNode; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.DataTypeKind; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.kind.SigKind; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.kind.SigKind; import org.scribble.visit.wf.NameDisambiguator; public class NonRoleArgListDel extends DoArgListDel diff --git a/scribble-lang/src/main/java/org/scribble/del/NonRoleParamDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/del/NonRoleParamDeclDel.java rename to scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java index 51cf8b16c..88b59d44e 100644 --- a/scribble-lang/src/main/java/org/scribble/del/NonRoleParamDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java @@ -15,7 +15,7 @@ import org.scribble.ast.NonRoleParamDecl; import org.scribble.ast.ScribNode; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; import org.scribble.visit.wf.NameDisambiguator; public class NonRoleParamDeclDel extends ScribDelBase diff --git a/scribble-lang/src/main/java/org/scribble/del/NonRoleParamDeclListDel.java b/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclListDel.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/del/NonRoleParamDeclListDel.java rename to scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclListDel.java diff --git a/scribble-lang/src/main/java/org/scribble/del/ProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/del/ProtocolBlockDel.java rename to scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java index 7f4881171..bdb703d7a 100644 --- a/scribble-lang/src/main/java/org/scribble/del/ProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java @@ -14,7 +14,7 @@ package org.scribble.del; import org.scribble.ast.ScribNode; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; import org.scribble.visit.ProtocolDefInliner; public abstract class ProtocolBlockDel extends CompoundSessionNodeDel diff --git a/scribble-lang/src/main/java/org/scribble/del/ProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java similarity index 92% rename from scribble-lang/src/main/java/org/scribble/del/ProtocolDeclDel.java rename to scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java index 7022899af..6753ddb05 100644 --- a/scribble-lang/src/main/java/org/scribble/del/ProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java @@ -19,12 +19,12 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.context.ProtocolDeclContext; -import org.scribble.job.ScribbleException; -import org.scribble.lang.SubprotoSig; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.Role; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.ProtocolDeclContextBuilder; import org.scribble.visit.util.RoleCollector; diff --git a/scribble-lang/src/main/java/org/scribble/del/ProtocolDefDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/del/ProtocolDefDel.java rename to scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java index eb52c5412..aa6315536 100644 --- a/scribble-lang/src/main/java/org/scribble/del/ProtocolDefDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java @@ -15,8 +15,8 @@ import org.scribble.ast.ProtocolDef; import org.scribble.ast.ScribNode; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ProtocolKind; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ProtocolKind; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.RecRemover; import org.scribble.visit.util.RecVarCollector; diff --git a/scribble-lang/src/main/java/org/scribble/del/RecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/del/RecursionDel.java rename to scribble-ast/src/main/java/org/scribble/del/RecursionDel.java index 897ba6ea6..839e78606 100644 --- a/scribble-lang/src/main/java/org/scribble/del/RecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java @@ -15,8 +15,8 @@ import org.scribble.ast.Recursion; import org.scribble.ast.ScribNode; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.RecVar; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.RecVar; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.env.UnfoldingEnv; diff --git a/scribble-lang/src/main/java/org/scribble/del/RoleArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/del/RoleArgListDel.java rename to scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java index eaa88270a..e3ddaba2c 100644 --- a/scribble-lang/src/main/java/org/scribble/del/RoleArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java @@ -19,8 +19,8 @@ import org.scribble.ast.RoleArgList; import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScribNode; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.Role; import org.scribble.visit.wf.NameDisambiguator; public class RoleArgListDel extends DoArgListDel diff --git a/scribble-lang/src/main/java/org/scribble/del/RoleDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/RoleDeclDel.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/del/RoleDeclDel.java rename to scribble-ast/src/main/java/org/scribble/del/RoleDeclDel.java index c95af33f7..68e993a56 100644 --- a/scribble-lang/src/main/java/org/scribble/del/RoleDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/RoleDeclDel.java @@ -15,8 +15,8 @@ import org.scribble.ast.RoleDecl; import org.scribble.ast.ScribNode; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.Role; import org.scribble.visit.wf.NameDisambiguator; import org.scribble.visit.wf.WFChoiceChecker; diff --git a/scribble-lang/src/main/java/org/scribble/del/RoleDeclListDel.java b/scribble-ast/src/main/java/org/scribble/del/RoleDeclListDel.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/del/RoleDeclListDel.java rename to scribble-ast/src/main/java/org/scribble/del/RoleDeclListDel.java diff --git a/scribble-lang/src/main/java/org/scribble/del/ScribDel.java b/scribble-ast/src/main/java/org/scribble/del/ScribDel.java similarity index 99% rename from scribble-lang/src/main/java/org/scribble/del/ScribDel.java rename to scribble-ast/src/main/java/org/scribble/del/ScribDel.java index 3e0b90d44..7a1f35ad8 100644 --- a/scribble-lang/src/main/java/org/scribble/del/ScribDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ScribDel.java @@ -14,7 +14,7 @@ package org.scribble.del; import org.scribble.ast.ScribNode; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.EGraphBuilder; diff --git a/scribble-lang/src/main/java/org/scribble/del/ScribDelBase.java b/scribble-ast/src/main/java/org/scribble/del/ScribDelBase.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/del/ScribDelBase.java rename to scribble-ast/src/main/java/org/scribble/del/ScribDelBase.java diff --git a/scribble-lang/src/main/java/org/scribble/del/SimpleSessionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/SimpleSessionNodeDel.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/del/SimpleSessionNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/SimpleSessionNodeDel.java index f51ddfd58..7ac2be61b 100644 --- a/scribble-lang/src/main/java/org/scribble/del/SimpleSessionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/SimpleSessionNodeDel.java @@ -14,7 +14,7 @@ package org.scribble.del; import org.scribble.ast.ScribNode; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; import org.scribble.visit.ProtocolDefInliner; public abstract class SimpleSessionNodeDel extends ScribDelBase implements InteractionNodeDel diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/del/global/GChoiceDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java index e185aa1d4..4a36ae7b3 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -25,12 +25,12 @@ import org.scribble.ast.local.LChoice; import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.global.GSeq; import org.scribble.del.ChoiceDel; -import org.scribble.job.RuntimeScribbleException; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.global.GSeq; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; @@ -43,7 +43,7 @@ public class GChoiceDel extends ChoiceDel implements GCompoundInteractionNodeDel { @Override - public org.scribble.type.session.global.GChoice translate(ScribNode n, + public org.scribble.core.type.session.global.GChoice translate(ScribNode n, GTypeTranslator t) throws ScribbleException { GChoice source = (GChoice) n; @@ -53,7 +53,7 @@ public org.scribble.type.session.global.GChoice translate(ScribNode n, { blocks.add((GSeq) b.visitWith(t)); } - return new org.scribble.type.session.global.GChoice(source, subj, blocks); + return new org.scribble.core.type.session.global.GChoice(source, subj, blocks); } @Override diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GCompoundInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GCompoundInteractionNodeDel.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/del/global/GCompoundInteractionNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GCompoundInteractionNodeDel.java diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/del/global/GConnectDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java index f617a9d72..07b750a0f 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java @@ -20,10 +20,10 @@ import org.scribble.ast.global.GConnect; import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; import org.scribble.del.ConnectionActionDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; @@ -49,7 +49,7 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, } @Override - public org.scribble.type.session.global.GConnect translate(ScribNode n, + public org.scribble.core.type.session.global.GConnect translate(ScribNode n, GTypeTranslator t) throws ScribbleException { GConnect source = (GConnect) n; @@ -61,7 +61,7 @@ public org.scribble.type.session.global.GConnect translate(ScribNode n, } Role dst = ds.get(0).toName(); Message msg = source.getMessageNodeChild().toMessage(); - return new org.scribble.type.session.global.GConnect(source, src, msg, dst); + return new org.scribble.core.type.session.global.GConnect(source, src, msg, dst); } @Override diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java similarity index 90% rename from scribble-lang/src/main/java/org/scribble/del/global/GContinueDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java index a921f1980..3b16b7f4e 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GContinueDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java @@ -17,9 +17,9 @@ import org.scribble.ast.global.GContinue; import org.scribble.ast.local.LContinue; import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.RecVar; import org.scribble.del.ContinueDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.RecVar; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; @@ -29,12 +29,12 @@ public class GContinueDel extends ContinueDel implements GSimpleInteractionNodeD { @Override - public org.scribble.type.session.global.GContinue translate(ScribNode n, + public org.scribble.core.type.session.global.GContinue translate(ScribNode n, GTypeTranslator t) throws ScribbleException { GContinue source = (GContinue) n; RecVar recvar = source.getRecVarChild().toName(); - return new org.scribble.type.session.global.GContinue(source, recvar); + return new org.scribble.core.type.session.global.GContinue(source, recvar); } @Override diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDel.java similarity index 90% rename from scribble-lang/src/main/java/org/scribble/del/global/GDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GDel.java index 7e5ed96a1..9002185b2 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDel.java @@ -14,9 +14,9 @@ package org.scribble.del.global; import org.scribble.ast.ScribNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.global.GNode; import org.scribble.del.ScribDel; -import org.scribble.job.ScribbleException; -import org.scribble.lang.global.GNode; import org.scribble.visit.GTypeTranslator; public interface GDel extends ScribDel diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/del/global/GDelegationElemDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java index 42ceaec8c..a96206627 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -25,13 +25,13 @@ import org.scribble.ast.global.GDelegationElem; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.Role; import org.scribble.del.ScribDelBase; -import org.scribble.job.ScribbleException; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.kind.Global; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.Role; import org.scribble.visit.context.ProtocolDeclContextBuilder; import org.scribble.visit.wf.DelegationProtocolRefChecker; import org.scribble.visit.wf.NameDisambiguator; diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GDisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/del/global/GDisconnectDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java index 2bacecf14..be1d56d62 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GDisconnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java @@ -17,9 +17,9 @@ import org.scribble.ast.global.GDisconnect; import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.Role; import org.scribble.del.ConnectionActionDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.Role; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; @@ -46,13 +46,13 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, } @Override - public org.scribble.type.session.global.GDisconnect translate(ScribNode n, + public org.scribble.core.type.session.global.GDisconnect translate(ScribNode n, GTypeTranslator t) throws ScribbleException { GDisconnect source = (GDisconnect) n; Role left = source.getLeftChild().toName(); Role right = source.getRightChild().toName(); - return new org.scribble.type.session.global.GDisconnect(source, left, right); + return new org.scribble.core.type.session.global.GDisconnect(source, left, right); } @Override diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java similarity index 90% rename from scribble-lang/src/main/java/org/scribble/del/global/GDoDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java index 97d918e17..d5581fbe4 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java @@ -25,16 +25,16 @@ import org.scribble.ast.local.LDo; import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.kind.RecVarKind; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Arg; import org.scribble.del.DoDel; -import org.scribble.job.ScribbleException; -import org.scribble.lang.SubprotoSig; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.kind.RecVarKind; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.Role; -import org.scribble.type.session.Arg; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; @@ -44,7 +44,7 @@ public class GDoDel extends DoDel implements GSimpleInteractionNodeDel { @Override - public org.scribble.type.session.global.GDo translate(ScribNode n, + public org.scribble.core.type.session.global.GDo translate(ScribNode n, GTypeTranslator t) throws ScribbleException { GDo source = (GDo) n; @@ -62,7 +62,7 @@ public org.scribble.type.session.global.GDo translate(ScribNode n, List roles = source.getRoleListChild().getRoles(); List> params = source.getNonRoleListChild() .getParamKindArgs(); - return new org.scribble.type.session.global.GDo(source, fullname, roles, params); + return new org.scribble.core.type.session.global.GDo(source, fullname, roles, params); } // Part of context building diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/del/global/GInteractionNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java index 6d8c60740..2d3f9fd74 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GInteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java @@ -14,9 +14,9 @@ package org.scribble.del.global; import org.scribble.ast.ScribNode; +import org.scribble.core.job.ScribbleException; import org.scribble.del.InteractionNodeDel; import org.scribble.del.ScribDelBase; -import org.scribble.job.ScribbleException; import org.scribble.visit.context.Projector; public interface GInteractionNodeDel extends InteractionNodeDel, GDel diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GInteractionSeqDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/del/global/GInteractionSeqDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java index 292744e7e..3f4d212a5 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GInteractionSeqDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java @@ -25,11 +25,11 @@ import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LScribNode; import org.scribble.ast.local.LSessionNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.session.global.GSeq; +import org.scribble.core.type.session.global.GType; import org.scribble.del.InteractionSeqDel; import org.scribble.del.ScribDelBase; -import org.scribble.job.ScribbleException; -import org.scribble.type.session.global.GSeq; -import org.scribble.type.session.global.GType; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/del/global/GMessageTransferDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java index cd6ab27d8..22ec839e2 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -19,10 +19,10 @@ import org.scribble.ast.global.GMessageTransfer; import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; import org.scribble.del.MessageTransferDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; @@ -54,7 +54,7 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, } @Override - public org.scribble.type.session.global.GMessageTransfer translate(ScribNode n, + public org.scribble.core.type.session.global.GMessageTransfer translate(ScribNode n, GTypeTranslator t) throws ScribbleException { GMessageTransfer source = (GMessageTransfer) n; @@ -66,7 +66,7 @@ public org.scribble.type.session.global.GMessageTransfer translate(ScribNode n, } Role dst = ds.get(0).toName(); Message msg = source.getMessageNodeChild().toMessage(); - return new org.scribble.type.session.global.GMessageTransfer(source, src, msg, dst); + return new org.scribble.core.type.session.global.GMessageTransfer(source, src, msg, dst); } @Override diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/del/global/GProtocolBlockDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java index e4a6b422b..e25c39074 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java @@ -18,10 +18,10 @@ import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProtocolBlock; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.session.global.GSeq; import org.scribble.del.ProtocolBlockDel; import org.scribble.del.ScribDelBase; -import org.scribble.job.ScribbleException; -import org.scribble.type.session.global.GSeq; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/del/global/GProtocolDeclDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index cc2ee7e44..acd6fbf53 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -31,18 +31,18 @@ import org.scribble.ast.local.LProtocolDef; import org.scribble.ast.local.LProtocolHeader; import org.scribble.ast.name.qualified.LProtocolNameNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.ProtocolMod; +import org.scribble.core.lang.global.GProtocol; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.global.GSeq; import org.scribble.del.ModuleDel; import org.scribble.del.ProtocolDeclDel; -import org.scribble.job.ScribbleException; -import org.scribble.lang.ProtocolMod; -import org.scribble.lang.global.GProtocol; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.Role; -import org.scribble.type.session.global.GSeq; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.context.Projector; import org.scribble.visit.context.ProtocolDeclContextBuilder; diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GProtocolDefDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/del/global/GProtocolDefDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java index c8cfde06e..f9802e15d 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GProtocolDefDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java @@ -26,12 +26,12 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.local.LProtocolDef; import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.RecVarKind; import org.scribble.del.ProtocolDefDel; import org.scribble.del.ScribDelBase; -import org.scribble.job.ScribbleException; -import org.scribble.lang.SubprotoSig; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.kind.RecVarKind; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.context.env.ProjectionEnv; diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GRecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java similarity index 92% rename from scribble-lang/src/main/java/org/scribble/del/global/GRecursionDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java index c53101393..f051b003b 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GRecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java @@ -19,10 +19,10 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.local.LRecursion; import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.session.global.GSeq; import org.scribble.del.RecursionDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.RecVar; -import org.scribble.type.session.global.GSeq; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; @@ -35,13 +35,13 @@ public class GRecursionDel extends RecursionDel implements GCompoundInteractionN { @Override - public org.scribble.type.session.global.GRecursion translate(ScribNode n, + public org.scribble.core.type.session.global.GRecursion translate(ScribNode n, GTypeTranslator t) throws ScribbleException { GRecursion source = (GRecursion) n; RecVar recvar = source.getRecVarChild().toName(); GSeq block = (GSeq) source.getBlockChild().visitWith(t); - return new org.scribble.type.session.global.GRecursion(source, recvar, block); + return new org.scribble.core.type.session.global.GRecursion(source, recvar, block); } @Override diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GSimpleInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GSimpleInteractionNodeDel.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/del/global/GSimpleInteractionNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GSimpleInteractionNodeDel.java diff --git a/scribble-lang/src/main/java/org/scribble/del/global/GWrapDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/del/global/GWrapDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java index cc0b76fe9..313b4f4b8 100644 --- a/scribble-lang/src/main/java/org/scribble/del/global/GWrapDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java @@ -17,9 +17,9 @@ import org.scribble.ast.global.GWrap; import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.Role; import org.scribble.del.ConnectionActionDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.Role; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; import org.scribble.visit.wf.WFChoiceChecker; diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LAcceptDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/del/local/LAcceptDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java index 045c878d0..35460d5d5 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LAcceptDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java @@ -18,10 +18,10 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LAccept; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/del/local/LChoiceDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java index 4a5773b9f..e3ff28f3c 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java @@ -22,11 +22,11 @@ import org.scribble.ast.local.LChoice; import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.RoleKind; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; import org.scribble.del.ChoiceDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.RoleKind; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceDoPruner; diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java index fd7b66e59..ac7624e0d 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java @@ -15,7 +15,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LCompoundInteraction; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; import org.scribble.visit.wf.ReachabilityChecker; import org.scribble.visit.wf.env.ReachabilityEnv; diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LConnectionActionDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/del/local/LConnectionActionDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java index 1b6ae93ca..9a40f56bc 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LConnectionActionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java @@ -15,8 +15,8 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LConnectionAction; +import org.scribble.core.job.ScribbleException; import org.scribble.del.ConnectionActionDel; -import org.scribble.job.ScribbleException; import org.scribble.visit.wf.ExplicitCorrelationChecker; public abstract class LConnectionActionDel extends ConnectionActionDel implements LSimpleInteractionNodeDel diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/del/local/LContinueDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java index 42c41cad7..7a938def4 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LContinueDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java @@ -22,11 +22,11 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LContinue; import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.RecVar; import org.scribble.del.ContinueDel; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.RecVar; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.env.InlineProtocolEnv; diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LDisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/del/local/LDisconnectDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java index 6d48aaa75..0781e7666 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LDisconnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java @@ -15,9 +15,9 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LDisconnect; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.Role; import org.scribble.del.ConnectionActionDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.Role; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/del/local/LDoDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java index cafe5f19e..7bf38e8ec 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LDoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java @@ -31,15 +31,15 @@ import org.scribble.ast.local.LProtocolDecl; import org.scribble.ast.local.LRecursion; import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.type.kind.RecVarKind; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.Role; import org.scribble.del.DoDel; -import org.scribble.job.JobContext; -import org.scribble.job.ScribbleException; -import org.scribble.lang.SubprotoSig; -import org.scribble.type.kind.RecVarKind; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.Role; +import org.scribble.lang.LangContext; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.ProjectedRoleDeclFixer; import org.scribble.visit.context.ProtocolDeclContextBuilder; @@ -96,7 +96,7 @@ public LDo leaveProtocolInlining(ScribNode parent, ScribNode child, throws ScribbleException // CHECKME: similar needed for non-role args? Or all params always known? (not ideal for distributed?) { - JobContext jc = fixer.job.getContext(); + LangContext jc = fixer.job.getContext(); LDo ld = (LDo) visited; RoleArgList roleList = ld.getRoleListChild(); LProtocolDecl lpd = ld.getTargetProtocolDecl(jc, fixer.getModuleContext()); diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/del/local/LInteractionNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java index 3391213a6..7ecdb3384 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LInteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java @@ -15,9 +15,9 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LSessionNode; +import org.scribble.core.job.ScribbleException; import org.scribble.del.InteractionNodeDel; import org.scribble.del.ScribDelBase; -import org.scribble.job.ScribbleException; import org.scribble.visit.wf.ReachabilityChecker; public interface LInteractionNodeDel extends InteractionNodeDel diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LInteractionSeqDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/del/local/LInteractionSeqDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java index d6f3ab24e..d5fd770a2 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LInteractionSeqDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java @@ -22,13 +22,13 @@ import org.scribble.ast.SessionNode; import org.scribble.ast.ScribNode; import org.scribble.ast.local.LSessionNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.type.kind.Local; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LRecursion; import org.scribble.del.InteractionSeqDel; import org.scribble.del.ScribDelBase; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.type.kind.Local; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceDoPruner; diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/del/local/LMessageTransferDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java index 446a9cb6d..b84fdd9be 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java @@ -15,8 +15,8 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LMessageTransfer; +import org.scribble.core.job.ScribbleException; import org.scribble.del.MessageTransferDel; -import org.scribble.job.ScribbleException; import org.scribble.visit.wf.ExplicitCorrelationChecker; public abstract class LMessageTransferDel extends MessageTransferDel implements LSimpleInteractionNodeDel diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LProjectionDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/del/local/LProjectionDeclDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java index f574ec023..b31380238 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LProjectionDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java @@ -23,9 +23,9 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LProtocolDecl; import org.scribble.ast.local.LProtocolHeader; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.Role; import org.scribble.visit.context.ProjectedRoleDeclFixer; public class LProjectionDeclDel extends LProtocolDeclDel diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java similarity index 97% rename from scribble-lang/src/main/java/org/scribble/del/local/LProtocolBlockDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java index 26eefb3f4..5c7aa9397 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java @@ -16,9 +16,9 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProtocolBlock; +import org.scribble.core.job.ScribbleException; import org.scribble.del.ProtocolBlockDel; import org.scribble.del.ScribDelBase; -import org.scribble.job.ScribbleException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.env.InlineProtocolEnv; import org.scribble.visit.wf.ReachabilityChecker; diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/del/local/LProtocolDeclDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java index ac7f421a2..3edfa681d 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java @@ -18,12 +18,12 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.context.local.LProtocolDeclContext; import org.scribble.ast.local.LProtocolDecl; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.Role; import org.scribble.del.ProtocolDeclDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Local; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.Role; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProtocolDeclContextBuilder; diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LProtocolDefDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/del/local/LProtocolDefDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java index bd2771c09..2544b2f45 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LProtocolDefDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java @@ -24,12 +24,12 @@ import org.scribble.ast.local.LProtocolDef; import org.scribble.ast.local.LRecursion; import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.RecVarKind; import org.scribble.del.ProtocolDefDel; import org.scribble.del.ScribDelBase; -import org.scribble.job.ScribbleException; -import org.scribble.lang.SubprotoSig; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.kind.RecVarKind; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.env.InlineProtocolEnv; diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LReceiveDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/del/local/LReceiveDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java index b08464439..0fe0d3344 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LReceiveDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java @@ -17,10 +17,10 @@ import org.scribble.ast.MessageSigNode; import org.scribble.ast.ScribNode; import org.scribble.ast.local.LReceive; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LRecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java similarity index 98% rename from scribble-lang/src/main/java/org/scribble/del/local/LRecursionDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java index fe1265374..0004dd8e9 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LRecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java @@ -18,9 +18,9 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.local.LRecursion; import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.RecVar; import org.scribble.del.RecursionDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.RecVar; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LRequestDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java similarity index 92% rename from scribble-lang/src/main/java/org/scribble/del/local/LRequestDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java index b6fe4b435..686118b27 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LRequestDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java @@ -18,10 +18,10 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LRequest; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LSendDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/del/local/LSendDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java index 8f7b56191..7f1546b86 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LSendDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java @@ -21,10 +21,10 @@ import org.scribble.ast.local.LMessageTransfer; import org.scribble.ast.local.LSend; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; import org.scribble.visit.wf.ExplicitCorrelationChecker; diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LSimpleInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LSimpleInteractionNodeDel.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/del/local/LSimpleInteractionNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LSimpleInteractionNodeDel.java diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LWrapClientDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/del/local/LWrapClientDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java index 90017e0a0..b46bc3f90 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LWrapClientDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java @@ -16,9 +16,9 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LWrapClient; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.Role; import org.scribble.del.ConnectionActionDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.Role; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; diff --git a/scribble-lang/src/main/java/org/scribble/del/local/LWrapServerDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/del/local/LWrapServerDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java index a46808cb4..de7418df1 100644 --- a/scribble-lang/src/main/java/org/scribble/del/local/LWrapServerDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java @@ -15,9 +15,9 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LWrapServer; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.Role; import org.scribble.del.ConnectionActionDel; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.Role; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; diff --git a/scribble-lang/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java index 5540c0e66..8d3c1b94d 100644 --- a/scribble-lang/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java @@ -18,10 +18,10 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.simple.IdNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.name.DataType; import org.scribble.del.ScribDelBase; -import org.scribble.job.ScribbleException; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.name.DataType; import org.scribble.visit.wf.NameDisambiguator; public class DataTypeNodeDel extends ScribDelBase diff --git a/scribble-lang/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java index aad1f16ce..78da6bc2c 100644 --- a/scribble-lang/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java @@ -18,10 +18,10 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.simple.IdNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.name.MessageSigName; import org.scribble.del.ScribDelBase; -import org.scribble.job.ScribbleException; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.name.MessageSigName; import org.scribble.visit.wf.NameDisambiguator; public class MessageSigNameNodeDel extends ScribDelBase diff --git a/scribble-lang/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java similarity index 92% rename from scribble-lang/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java index 7498c76ca..fe5bf4e9c 100644 --- a/scribble-lang/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java @@ -21,13 +21,13 @@ import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.ast.name.simple.SigParamNode; import org.scribble.ast.name.simple.TypeParamNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.kind.SigKind; +import org.scribble.core.type.name.AmbigName; import org.scribble.del.ScribDelBase; -import org.scribble.job.ScribbleException; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.kind.DataTypeKind; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.kind.SigKind; -import org.scribble.type.name.AmbigName; import org.scribble.visit.wf.NameDisambiguator; public class AmbigNameNodeDel extends ScribDelBase diff --git a/scribble-lang/src/main/java/org/scribble/del/name/simple/NonRoleParamNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/NonRoleParamNodeDel.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/del/name/simple/NonRoleParamNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/name/simple/NonRoleParamNodeDel.java diff --git a/scribble-lang/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java index b4e3fb16f..7accc943e 100644 --- a/scribble-lang/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java @@ -15,10 +15,10 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.RecVarKind; +import org.scribble.core.type.name.RecVar; import org.scribble.del.ScribDelBase; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.RecVarKind; -import org.scribble.type.name.RecVar; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.wf.NameDisambiguator; diff --git a/scribble-lang/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java index 793e474d2..353099bec 100644 --- a/scribble-lang/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java @@ -15,8 +15,8 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.job.ScribbleException; import org.scribble.del.ScribDelBase; -import org.scribble.job.ScribbleException; import org.scribble.visit.wf.NameDisambiguator; public class RoleNodeDel extends ScribDelBase diff --git a/scribble-lang/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java similarity index 85% rename from scribble-lang/src/main/java/org/scribble/job/Job.java rename to scribble-ast/src/main/java/org/scribble/lang/Lang.java index fd646c7bd..a8747a3fa 100644 --- a/scribble-lang/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.job; +package org.scribble.lang; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; @@ -22,39 +22,41 @@ import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.lang.context.ModuleContext; -import org.scribble.lang.global.GProtocol; -import org.scribble.type.name.ModuleName; +import org.scribble.core.job.Job; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.lang.global.GProtocol; +import org.scribble.core.type.name.ModuleName; import org.scribble.visit.AstVisitor; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.context.ModuleContextBuilder; import org.scribble.visit.wf.NameDisambiguator; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models -public class Job +public class Lang { // Keys are full names private final Map modcs; // CHECKME: constant? move to JobConfig? - public final JobConfig config; // Immutable + public final LangConfig config; // Immutable - private final JobContext context; // Mutable (Visitor passes replace modules) + private final LangContext context; // Mutable (Visitor passes replace modules) //private final SGraphBuilderUtil sgbu; - private Job2 job2; + private Job job2; // Just take MainContext as arg? -- would need to fix Maven dependencies //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) - public Job(Map parsed, - Map modcs, JobConfig config) + public Lang(Map parsed, + Map modcs, LangConfig config) { this.modcs = Collections.unmodifiableMap(modcs); this.config = config; //this.sgbu = config.sf.newSGraphBuilderUtil(); - this.context = new JobContext(this, parsed); // Single instance per Job and should never be shared + this.context = new LangContext(this, parsed); // Single instance per Job and should never be shared } - public Job2 getJob2() throws ScribbleException + public Job toJob() throws ScribbleException { if (this.job2 == null) { @@ -72,7 +74,7 @@ public Job2 getJob2() throws ScribbleException debugPrintln("\nParsed:\n" + gpd + "\n\nScribble intermediate:\n" + g); } } - this.job2 = new Job2(imeds, this.modcs, this.config.toJobConfig2()); + this.job2 = new Job(imeds, this.modcs, this.config.toJobConfig2()); } return this.job2; } @@ -131,7 +133,7 @@ private void runVisitorPass(Set modnames, { try { - Constructor cons = c.getConstructor(Job.class); + Constructor cons = c.getConstructor(Lang.class); for (ModuleName modname : modnames) { AstVisitor nv = cons.newInstance(this); @@ -153,7 +155,7 @@ private void runVisitorOnModule(ModuleName modname, AstVisitor nv) this.context.replaceModule(visited); } - public JobContext getContext() + public LangContext getContext() { return this.context; } diff --git a/scribble-core/src/main/java/org/scribble/job/JobConfig2.java b/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java similarity index 74% rename from scribble-core/src/main/java/org/scribble/job/JobConfig2.java rename to scribble-ast/src/main/java/org/scribble/lang/LangConfig.java index 8d8eaf22b..703857c70 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobConfig2.java +++ b/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java @@ -11,14 +11,16 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.job; +package org.scribble.lang; -import org.scribble.model.endpoint.EModelFactory; -import org.scribble.model.global.SModelFactory; -import org.scribble.type.name.ModuleName; +import org.scribble.ast.AstFactory; +import org.scribble.core.job.JobConfig; +import org.scribble.core.model.endpoint.EModelFactory; +import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.type.name.ModuleName; // The "static" (constant) info for Jobs -- cf. JobContext "dynamic" state -public class JobConfig2 +public class LangConfig { public final ModuleName main; // Full name // CHECKME: verbose/debug printing parameter? @@ -33,14 +35,15 @@ public class JobConfig2 public final boolean noValidation; public final boolean spin; + public final AstFactory af; public final EModelFactory ef; public final SModelFactory sf; // N.B. MainContext is in a different non-visible (by Maven) package - public JobConfig2(boolean debug, ModuleName main, boolean useOldWF, boolean noLiveness, boolean minEfsm, + public LangConfig(boolean debug, ModuleName main, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin, - EModelFactory ef, SModelFactory sf) + AstFactory af, EModelFactory ef, SModelFactory sf) { this.main = main; @@ -55,7 +58,15 @@ public JobConfig2(boolean debug, ModuleName main, boolean useOldWF, boolean noLi this.noValidation = noValidation; this.spin = spin; + this.af = af; this.ef = ef; this.sf = sf; } + + public JobConfig toJobConfig2() + { + return new JobConfig(debug, main, useOldWf, noProgress, minEfsm, fair, + noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin, + ef, sf); + } } diff --git a/scribble-lang/src/main/java/org/scribble/job/JobContext.java b/scribble-ast/src/main/java/org/scribble/lang/LangContext.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/job/JobContext.java rename to scribble-ast/src/main/java/org/scribble/lang/LangContext.java index 960a1170a..6218ea463 100644 --- a/scribble-lang/src/main/java/org/scribble/job/JobContext.java +++ b/scribble-ast/src/main/java/org/scribble/lang/LangContext.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.job; +package org.scribble.lang; import java.util.Collections; import java.util.HashMap; @@ -21,14 +21,14 @@ import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.ModuleName; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.ModuleName; // Global "static" context information for a Job -- single instance per Job, should not be shared between Jobs // Mutable: projections, graphs, etc are added mutably later -- replaceModule also mutable setter -- "users" get this from the Job and expect to setter mutate "in place" -public class JobContext +public class LangContext { - public final Job job; + public final Lang job; //public final ModuleName main; // The "main" root module from MainContext @@ -37,7 +37,7 @@ public class JobContext // CHECKME: separate original parsed from "working set"? private final Map parsed;// = new HashMap<>(); - protected JobContext(Job job, Map parsed)//, ModuleName main) + protected LangContext(Lang job, Map parsed)//, ModuleName main) { this.job = job; diff --git a/scribble-lang/src/main/java/org/scribble/lang/context/ModuleContextMaker.java b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextMaker.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/lang/context/ModuleContextMaker.java rename to scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextMaker.java index 5565759bf..27eba8b18 100644 --- a/scribble-lang/src/main/java/org/scribble/lang/context/ModuleContextMaker.java +++ b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextMaker.java @@ -23,12 +23,14 @@ import org.scribble.ast.NonProtocolDecl; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.local.LProtocolDecl; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.DataType; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.ModuleName; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.lang.context.ScribNames; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.ModuleName; // TODO: rename and refactor public class ModuleContextMaker diff --git a/scribble-lang/src/main/java/org/scribble/util/ScribUtil.java b/scribble-ast/src/main/java/org/scribble/util/ScribUtil.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/util/ScribUtil.java rename to scribble-ast/src/main/java/org/scribble/util/ScribUtil.java diff --git a/scribble-lang/src/main/java/org/scribble/visit/AstVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java similarity index 90% rename from scribble-lang/src/main/java/org/scribble/visit/AstVisitor.java rename to scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java index 972bda649..306fc855c 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/AstVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java @@ -14,17 +14,17 @@ package org.scribble.visit; import org.scribble.ast.ScribNode; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.lang.Lang; // Pattern: node accepts visitor and calls visitor back (standard visitor pattern -- adding a new operation doesn't affect the Ast classes), but then visitor delegates back to node delegate (so routines for handling each node type not centralised in visitor, but decentralised to delegates) public abstract class AstVisitor { - public final Job job; // Immutable except for JobContext internals + public final Lang job; // Immutable except for JobContext internals //private ModuleContext mcontext; // Factor up to ModelVisitor? (will be null before context building) -- maybe make a ModuleVisitor - protected AstVisitor(Job job) + protected AstVisitor(Lang job) { this.job = job; } diff --git a/scribble-lang/src/main/java/org/scribble/visit/EnvVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/EnvVisitor.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/visit/EnvVisitor.java rename to scribble-ast/src/main/java/org/scribble/visit/EnvVisitor.java index ff0a5ba4b..f35a06e45 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/EnvVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/EnvVisitor.java @@ -17,9 +17,9 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ProtocolKind; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.lang.Lang; import org.scribble.visit.context.ModuleContextVisitor; import org.scribble.visit.env.Env; @@ -30,7 +30,7 @@ public abstract class EnvVisitor> extends ModuleContextVisitor { private LinkedList envs = new LinkedList(); // Deque - public EnvVisitor(Job job) + public EnvVisitor(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/GTypeTranslator.java b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java similarity index 86% rename from scribble-lang/src/main/java/org/scribble/visit/GTypeTranslator.java rename to scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java index a789be887..f42fde2fc 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/GTypeTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java @@ -14,16 +14,16 @@ package org.scribble.visit; import org.scribble.ast.ScribNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.global.GNode; +import org.scribble.core.type.name.ModuleName; import org.scribble.del.global.GDel; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.lang.global.GNode; -import org.scribble.type.name.ModuleName; +import org.scribble.lang.Lang; // CHECKME: move to visit package? public class GTypeTranslator extends SimpleVisitor { - public GTypeTranslator(Job job, ModuleName mod) + public GTypeTranslator(Lang job, ModuleName mod) { super(job, mod); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java b/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java rename to scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java index da114dd63..bcc2ac210 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java +++ b/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java @@ -29,12 +29,12 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.local.LRecursion; import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.RecVar; import org.scribble.del.ProtocolDefDel; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.RecVar; +import org.scribble.lang.Lang; import org.scribble.visit.env.UnfoldingEnv; // Statically unfolds unguarded recursions and continues "directly under" choices @@ -48,7 +48,7 @@ public class InlinedProtocolUnfolder protected Map> recs = new HashMap<>(); // Could parameterise recvars to be global/local private Set recsToUnfold = new HashSet<>(); - public InlinedProtocolUnfolder(Job job) + public InlinedProtocolUnfolder(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java rename to scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java index 0a480ac4e..9d9082fb7 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java @@ -15,14 +15,14 @@ import org.scribble.ast.ProtocolDef; import org.scribble.ast.ScribNode; +import org.scribble.core.job.ScribbleException; import org.scribble.del.ProtocolDefDel; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; +import org.scribble.lang.Lang; import org.scribble.visit.env.Env; public abstract class InlinedProtocolVisitor> extends EnvVisitor { - public InlinedProtocolVisitor(Job job) + public InlinedProtocolVisitor(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java similarity index 92% rename from scribble-lang/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java rename to scribble-ast/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java index c797c4e5c..d801f859c 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java @@ -14,12 +14,12 @@ package org.scribble.visit; import org.scribble.ast.ProtocolDecl; -import org.scribble.job.Job; +import org.scribble.lang.Lang; import org.scribble.visit.env.DummyEnv; public abstract class NoEnvInlinedProtocolVisitor extends InlinedProtocolVisitor { - public NoEnvInlinedProtocolVisitor(Job job) + public NoEnvInlinedProtocolVisitor(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java similarity index 92% rename from scribble-lang/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java rename to scribble-ast/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java index 0d91ac346..c70f53460 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java @@ -14,12 +14,12 @@ package org.scribble.visit; import org.scribble.ast.ProtocolDecl; -import org.scribble.job.Job; +import org.scribble.lang.Lang; import org.scribble.visit.env.DummyEnv; public abstract class NoEnvOffsetSubprotocolVisitor extends OffsetSubprotocolVisitor { - public NoEnvOffsetSubprotocolVisitor(Job job) + public NoEnvOffsetSubprotocolVisitor(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java similarity index 92% rename from scribble-lang/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java rename to scribble-ast/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java index a467004df..23fea69be 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java @@ -14,12 +14,12 @@ package org.scribble.visit; import org.scribble.ast.ProtocolDecl; -import org.scribble.job.Job; +import org.scribble.lang.Lang; import org.scribble.visit.env.DummyEnv; public abstract class NoEnvSubprotocolVisitor extends SubprotocolVisitor { - public NoEnvSubprotocolVisitor(Job job) + public NoEnvSubprotocolVisitor(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java similarity index 92% rename from scribble-lang/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java rename to scribble-ast/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java index 1c2af199e..78e19df56 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java @@ -14,12 +14,12 @@ package org.scribble.visit; import org.scribble.ast.ProtocolDecl; -import org.scribble.job.Job; +import org.scribble.lang.Lang; import org.scribble.visit.env.DummyEnv; public abstract class NoEnvUnfoldingVisitor extends UnfoldingVisitor { - public NoEnvUnfoldingVisitor(Job job) + public NoEnvUnfoldingVisitor(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java similarity index 90% rename from scribble-lang/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java rename to scribble-ast/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java index d9307c4ed..155a06d39 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java @@ -19,12 +19,12 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.NonRoleArgKind; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.Role; -import org.scribble.type.session.Arg; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.NonRoleArgKind; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Arg; +import org.scribble.lang.Lang; import org.scribble.visit.env.Env; // Can probably be fully replaced by SubprotocolVisitor @@ -32,7 +32,7 @@ public abstract class OffsetSubprotocolVisitor> extends SubprotocolVisitor { - public OffsetSubprotocolVisitor(Job job) + public OffsetSubprotocolVisitor(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/ProtocolDefInliner.java b/scribble-ast/src/main/java/org/scribble/visit/ProtocolDefInliner.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/visit/ProtocolDefInliner.java rename to scribble-ast/src/main/java/org/scribble/visit/ProtocolDefInliner.java index 065bd4561..398ba259f 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/ProtocolDefInliner.java +++ b/scribble-ast/src/main/java/org/scribble/visit/ProtocolDefInliner.java @@ -22,16 +22,16 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GDo; import org.scribble.ast.local.LDo; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.RecVar; import org.scribble.del.ProtocolDefDel; import org.scribble.del.global.GDoDel; import org.scribble.del.local.LDoDel; -import org.scribble.job.Job; -import org.scribble.job.JobContext; -import org.scribble.job.ScribbleException; -import org.scribble.lang.SubprotoSig; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.RecVar; +import org.scribble.lang.Lang; +import org.scribble.lang.LangContext; import org.scribble.visit.env.InlineProtocolEnv; public class ProtocolDefInliner extends SubprotocolVisitor @@ -40,7 +40,7 @@ public class ProtocolDefInliner extends SubprotocolVisitor private Map recvars = new HashMap<>(); // Original RecVars, nesting count - public ProtocolDefInliner(Job job) + public ProtocolDefInliner(Lang job) { super(job); } @@ -118,7 +118,7 @@ protected Do visitOverrideForDo(InteractionSeq parent, Do child) throws { //return (GDo) super.visitForSubprotocols(parent, child); // Duplicated from SubprotocolVisitor#visitOverrideFoDo and modified to access discarded env -- FIXME: factor out this facility better - JobContext jc = this.job.getContext(); + LangContext jc = this.job.getContext(); ModuleContext mc = getModuleContext(); ProtocolDecl pd = child.getTargetProtocolDecl(jc, mc); diff --git a/scribble-lang/src/main/java/org/scribble/visit/SimpleVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/SimpleVisitor.java similarity index 84% rename from scribble-lang/src/main/java/org/scribble/visit/SimpleVisitor.java rename to scribble-ast/src/main/java/org/scribble/visit/SimpleVisitor.java index 3042b1fd8..1c2d1966d 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/SimpleVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/SimpleVisitor.java @@ -14,20 +14,20 @@ package org.scribble.visit; import org.scribble.ast.ScribNode; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.name.ModuleName; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.name.ModuleName; +import org.scribble.lang.Lang; // A SimpleVisitor visits a Module (or some part of one) for a given Job // Apart from delegating to del-specific visiting methods, SimpleVisitors are mainly for holding data and collecting common operations // TODO CHECKME: refactor AstVisitor as a SimpleVisitor? i.e., T=ScribNode ? public abstract class SimpleVisitor { - public final Job job; + public final Lang job; public final ModuleName mod; // fullname - public SimpleVisitor(Job job, ModuleName fullname) + public SimpleVisitor(Lang job, ModuleName fullname) { this.job = job; this.mod = fullname; diff --git a/scribble-lang/src/main/java/org/scribble/visit/SubprotocolVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/SubprotocolVisitor.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/visit/SubprotocolVisitor.java rename to scribble-ast/src/main/java/org/scribble/visit/SubprotocolVisitor.java index 0d7f451d3..0445c5285 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/SubprotocolVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/SubprotocolVisitor.java @@ -33,19 +33,19 @@ import org.scribble.ast.ScopedNode; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.job.Job; -import org.scribble.job.JobContext; -import org.scribble.job.ScribbleException; -import org.scribble.lang.SubprotoSig; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.kind.NonRoleArgKind; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.Name; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.Role; -import org.scribble.type.name.Scope; -import org.scribble.type.session.Arg; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.kind.NonRoleArgKind; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.Name; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.Scope; +import org.scribble.core.type.session.Arg; +import org.scribble.lang.Lang; +import org.scribble.lang.LangContext; import org.scribble.visit.env.Env; public abstract class SubprotocolVisitor> extends EnvVisitor @@ -58,7 +58,7 @@ public abstract class SubprotocolVisitor> extends EnvVisitor private Scope scope = null; - public SubprotocolVisitor(Job job) + public SubprotocolVisitor(Lang job) { super(job); } @@ -117,7 +117,7 @@ protected Do visitOverrideForDo(ScribNode parent, Do doo) { if (!isCycle()) { - JobContext jc = this.job.getContext(); + LangContext jc = this.job.getContext(); ModuleContext mc = getModuleContext(); ProtocolDecl pd = doo.getTargetProtocolDecl(jc, mc); diff --git a/scribble-lang/src/main/java/org/scribble/visit/Substitutor.java b/scribble-ast/src/main/java/org/scribble/visit/Substitutor.java similarity index 86% rename from scribble-lang/src/main/java/org/scribble/visit/Substitutor.java rename to scribble-ast/src/main/java/org/scribble/visit/Substitutor.java index 5f3e7fb43..33f835ffc 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/Substitutor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/Substitutor.java @@ -18,11 +18,11 @@ import org.scribble.ast.NonRoleArgNode; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.NonRoleArgKind; -import org.scribble.type.name.Role; -import org.scribble.type.session.Arg; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.NonRoleArgKind; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Arg; +import org.scribble.lang.Lang; public class Substitutor extends AstVisitor { @@ -31,7 +31,7 @@ public class Substitutor extends AstVisitor private final Map rolemap; private final Map, NonRoleArgNode> argmap; - public Substitutor(Job job, Map rolemap, + public Substitutor(Lang job, Map rolemap, Map, NonRoleArgNode> argmap) { super(job); diff --git a/scribble-lang/src/main/java/org/scribble/visit/UnfoldingVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/UnfoldingVisitor.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/visit/UnfoldingVisitor.java rename to scribble-ast/src/main/java/org/scribble/visit/UnfoldingVisitor.java index 3e94502a5..f7e6af503 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/UnfoldingVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/UnfoldingVisitor.java @@ -24,9 +24,9 @@ import org.scribble.ast.ProtocolBlock; import org.scribble.ast.Recursion; import org.scribble.ast.ScribNode; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.RecVar; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.RecVar; +import org.scribble.lang.Lang; import org.scribble.visit.env.Env; // FIXME: unfolding/unrolling algorithm would be easier if we would use an "affine rec var" normal form: a single rec can have multiple labels, each label used at most once in a continue @@ -43,7 +43,7 @@ public abstract class UnfoldingVisitor> // Also FIXME: recvar shadowing: though this stack should be enough private Set unfolded = new HashSet<>(); - public UnfoldingVisitor(Job job) + public UnfoldingVisitor(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/context/EGraphBuilder.java b/scribble-ast/src/main/java/org/scribble/visit/context/EGraphBuilder.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/visit/context/EGraphBuilder.java rename to scribble-ast/src/main/java/org/scribble/visit/context/EGraphBuilder.java index 596dca32c..071b1dc08 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/context/EGraphBuilder.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/EGraphBuilder.java @@ -17,11 +17,11 @@ import org.scribble.ast.local.LChoice; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProtocolBlock; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EGraphBuilderUtil; import org.scribble.del.local.LChoiceDel; import org.scribble.del.local.LInteractionSeqDel; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EGraphBuilderUtil; +import org.scribble.lang.Lang; import org.scribble.visit.NoEnvInlinedProtocolVisitor; // Changed from offsetsubprot visitor to inlined visitor to reduce state label accumulation to rec only -- then, wfc-checking for "unguarded" recursive-do-as-continue in choice blocks handled by unfolding inlineds @@ -31,12 +31,12 @@ public class EGraphBuilder extends NoEnvInlinedProtocolVisitor { public final EGraphBuilderUtil util;// = new EGraphBuilderUtil(); - public EGraphBuilder(Job job) + public EGraphBuilder(Lang job) { super(job); try { - this.util = job.getJob2().newEGraphBuilderUtil(); + this.util = job.toJob().newEGraphBuilderUtil(); } catch (ScribbleException e) // TODO: refactor { diff --git a/scribble-lang/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java b/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java similarity index 90% rename from scribble-lang/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java rename to scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java index 8a2876016..c625aa3bc 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java @@ -14,9 +14,9 @@ package org.scribble.visit.context; import org.scribble.ast.ScribNode; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.lang.context.ModuleContext; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.lang.Lang; import org.scribble.lang.context.ModuleContextMaker; import org.scribble.visit.AstVisitor; @@ -27,7 +27,7 @@ public class ModuleContextBuilder extends AstVisitor private ModuleContext mcontext; // The "root" Module context (not the "main" module) - public ModuleContextBuilder(Job job) + public ModuleContextBuilder(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java similarity index 90% rename from scribble-lang/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java rename to scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java index 43bda183c..b7a99612d 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java @@ -15,10 +15,10 @@ import org.scribble.ast.Module; import org.scribble.ast.ScribNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.context.ModuleContext; import org.scribble.del.ModuleDel; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.lang.context.ModuleContext; +import org.scribble.lang.Lang; import org.scribble.visit.AstVisitor; // A visitor that caches the ModuleContext from an entered Module, for later access @@ -26,7 +26,7 @@ public abstract class ModuleContextVisitor extends AstVisitor { private ModuleContext mcontext; // The "root" module context (different than the front-end "main" module) // Factor up to ModelVisitor? (would be null before context building) - public ModuleContextVisitor(Job job) + public ModuleContextVisitor(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java b/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java rename to scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java index cc01af2e6..82205b417 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java @@ -23,10 +23,10 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.local.LProtocolDecl; import org.scribble.ast.name.simple.DummyProjectionRoleNode; +import org.scribble.core.job.ScribbleException; import org.scribble.del.ModuleDel; -import org.scribble.job.Job; -import org.scribble.job.JobContext; -import org.scribble.job.ScribbleException; +import org.scribble.lang.Lang; +import org.scribble.lang.LangContext; import org.scribble.visit.context.env.UnguardedChoiceDoEnv; // Basically infers all local choice subject candidates: if *none* are found for a given "choice-unguarded" do-call then the call is pruned (along with parent block and choice as necessary) @@ -34,7 +34,7 @@ // TODO: ambiguous choice subject (i.e. > 1 candidate) is checked subsequently by ProjectedChoiceSubjectFixer -- should be better integrated (e.g. reuse ChoiceUnguardedSubprotocolChecker, rather than adhoc LInteractionNode.inferLocalChoiceSubject) -- NOTE: but cannot do all pruning and fixing in one pass, as fixing the subject roles here will interfere with the pruning algorithm (currently it looks for dummy role choices) public class ProjectedChoiceDoPruner extends ModuleContextVisitor { - public ProjectedChoiceDoPruner(Job job) + public ProjectedChoiceDoPruner(Lang job) { super(job); } @@ -57,7 +57,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) List ins = lis.getInteractionChildren(); if (ins.get(0) instanceof LDo) // Unlike GRecursion.prune, to-prune "do" could be followed by a continuation? { - JobContext jc = this.job.getContext(); + LangContext jc = this.job.getContext(); LDo ld = (LDo) ins.get(0); LProtocolDecl lpd = ld.getTargetProtocolDecl(jc, getModuleContext()); diff --git a/scribble-lang/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java b/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java similarity index 92% rename from scribble-lang/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java rename to scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java index b21c437b7..4d5502300 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java @@ -19,16 +19,16 @@ import java.util.Map; import org.scribble.ast.ScribNode; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.lang.Lang; public class ProjectedChoiceSubjectFixer extends ModuleContextVisitor { private Map> recs = new HashMap>(); - public ProjectedChoiceSubjectFixer(Job job) + public ProjectedChoiceSubjectFixer(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java b/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java similarity index 91% rename from scribble-lang/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java rename to scribble-ast/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java index 8bb363e4f..9a92b2fb5 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java @@ -14,12 +14,12 @@ package org.scribble.visit.context; import org.scribble.ast.ScribNode; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.lang.Lang; public class ProjectedRoleDeclFixer extends ModuleContextVisitor { - public ProjectedRoleDeclFixer(Job job) + public ProjectedRoleDeclFixer(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/context/Projector.java b/scribble-ast/src/main/java/org/scribble/visit/context/Projector.java similarity index 89% rename from scribble-lang/src/main/java/org/scribble/visit/context/Projector.java rename to scribble-ast/src/main/java/org/scribble/visit/context/Projector.java index 5ec91ae6d..21a9dc183 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/context/Projector.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/Projector.java @@ -25,15 +25,15 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Local; -import org.scribble.type.kind.ModuleKind; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.ModuleName; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.kind.ModuleKind; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.name.Role; +import org.scribble.lang.Lang; import org.scribble.visit.EnvVisitor; import org.scribble.visit.context.env.ProjectionEnv; @@ -45,7 +45,7 @@ public class Projector extends EnvVisitor // protocol name is full global protocol name private Map> projections = new HashMap<>(); - public Projector(Job job) + public Projector(Lang job) { super(job); } @@ -142,14 +142,14 @@ public static LProtocolNameNode makeProjectedSimpleNameNode(AstFactory af, CommonTree source, GProtocolName simpname, Role role) { return (LProtocolNameNode) af.QualifiedNameNode(source, Local.KIND, - org.scribble.visit.global.Projector2.projectSimpleProtocolName(simpname, role).toString()); + org.scribble.core.visit.global.Projector2.projectSimpleProtocolName(simpname, role).toString()); } public static LProtocolNameNode makeProjectedFullNameNode(AstFactory af, CommonTree source, GProtocolName fullname, Role role) { return (LProtocolNameNode) af.QualifiedNameNode(source, Local.KIND, - org.scribble.visit.global.Projector2.projectFullProtocolName(fullname, role).getElements()); + org.scribble.core.visit.global.Projector2.projectFullProtocolName(fullname, role).getElements()); } // fullname is the un-projected name; localname is the already projected simple name @@ -157,7 +157,7 @@ public static ModuleNameNode makeProjectedModuleNameNode(AstFactory af, CommonTree source, ModuleName fullname, LProtocolName localname) { return (ModuleNameNode) af.QualifiedNameNode(source, ModuleKind.KIND, - org.scribble.visit.global.Projector2.projectModuleName(fullname, localname).getElements()); + org.scribble.core.visit.global.Projector2.projectModuleName(fullname, localname).getElements()); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java b/scribble-ast/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java similarity index 89% rename from scribble-lang/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java rename to scribble-ast/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java index f7f7d7b1d..a5dd9cb19 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java @@ -16,11 +16,11 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.context.global.GDependencyMap; import org.scribble.ast.context.local.LDependencyMap; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.Role; +import org.scribble.lang.Lang; import org.scribble.visit.NoEnvSubprotocolVisitor; // Disambiguates ambiguous PayloadTypeOrParameter names and inserts implicit Scope names -- no: old? @@ -29,7 +29,7 @@ public class ProtocolDeclContextBuilder extends NoEnvSubprotocolVisitor // For private GDependencyMap gdeps; private LDependencyMap ldeps; - public ProtocolDeclContextBuilder(Job job) + public ProtocolDeclContextBuilder(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/context/RecRemover.java b/scribble-ast/src/main/java/org/scribble/visit/context/RecRemover.java similarity index 91% rename from scribble-lang/src/main/java/org/scribble/visit/context/RecRemover.java rename to scribble-ast/src/main/java/org/scribble/visit/context/RecRemover.java index 00d29c92d..758f037d3 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/context/RecRemover.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/RecRemover.java @@ -17,9 +17,9 @@ import java.util.Set; import org.scribble.ast.ScribNode; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.RecVar; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.RecVar; +import org.scribble.lang.Lang; import org.scribble.visit.NoEnvInlinedProtocolVisitor; // FIXME: shadowed recvars @@ -27,7 +27,7 @@ public class RecRemover extends NoEnvInlinedProtocolVisitor { private final Set rvs = new HashSet<>(); - public RecRemover(Job job) + public RecRemover(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java b/scribble-ast/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java similarity index 93% rename from scribble-lang/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java rename to scribble-ast/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java index 52404468f..792939cf1 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java @@ -18,13 +18,13 @@ import org.scribble.ast.local.LChoice; import org.scribble.ast.local.LDo; import org.scribble.ast.local.LSessionNode; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.lang.Lang; import org.scribble.ast.local.LProtocolBlock; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.lang.SubprotoSig; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.ProtocolName; import org.scribble.visit.SubprotocolVisitor; import org.scribble.visit.context.env.UnguardedChoiceDoEnv; @@ -37,7 +37,7 @@ public class UnguardedChoiceDoProjectionChecker private boolean shouldPrune = false; // OK here, or reinstant in env? - public UnguardedChoiceDoProjectionChecker(Job job, ModuleContext mcontext, + public UnguardedChoiceDoProjectionChecker(Lang job, ModuleContext mcontext, LChoice cho) { super(job); diff --git a/scribble-lang/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java b/scribble-ast/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java rename to scribble-ast/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java diff --git a/scribble-lang/src/main/java/org/scribble/visit/context/env/UnguardedChoiceDoEnv.java b/scribble-ast/src/main/java/org/scribble/visit/context/env/UnguardedChoiceDoEnv.java similarity index 98% rename from scribble-lang/src/main/java/org/scribble/visit/context/env/UnguardedChoiceDoEnv.java rename to scribble-ast/src/main/java/org/scribble/visit/context/env/UnguardedChoiceDoEnv.java index d6bb56385..f2b91c7e9 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/context/env/UnguardedChoiceDoEnv.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/env/UnguardedChoiceDoEnv.java @@ -19,7 +19,7 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.type.name.Role; +import org.scribble.core.type.name.Role; import org.scribble.visit.env.Env; // Cf. UnfoldingEnv diff --git a/scribble-lang/src/main/java/org/scribble/visit/env/DummyEnv.java b/scribble-ast/src/main/java/org/scribble/visit/env/DummyEnv.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/visit/env/DummyEnv.java rename to scribble-ast/src/main/java/org/scribble/visit/env/DummyEnv.java diff --git a/scribble-lang/src/main/java/org/scribble/visit/env/Env.java b/scribble-ast/src/main/java/org/scribble/visit/env/Env.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/visit/env/Env.java rename to scribble-ast/src/main/java/org/scribble/visit/env/Env.java diff --git a/scribble-lang/src/main/java/org/scribble/visit/env/InlineProtocolEnv.java b/scribble-ast/src/main/java/org/scribble/visit/env/InlineProtocolEnv.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/visit/env/InlineProtocolEnv.java rename to scribble-ast/src/main/java/org/scribble/visit/env/InlineProtocolEnv.java diff --git a/scribble-lang/src/main/java/org/scribble/visit/env/UnfoldingEnv.java b/scribble-ast/src/main/java/org/scribble/visit/env/UnfoldingEnv.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/visit/env/UnfoldingEnv.java rename to scribble-ast/src/main/java/org/scribble/visit/env/UnfoldingEnv.java diff --git a/scribble-lang/src/main/java/org/scribble/visit/util/MessageIdCollector.java b/scribble-ast/src/main/java/org/scribble/visit/util/MessageIdCollector.java similarity index 84% rename from scribble-lang/src/main/java/org/scribble/visit/util/MessageIdCollector.java rename to scribble-ast/src/main/java/org/scribble/visit/util/MessageIdCollector.java index 940b551d1..38966c424 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/util/MessageIdCollector.java +++ b/scribble-ast/src/main/java/org/scribble/visit/util/MessageIdCollector.java @@ -14,14 +14,14 @@ package org.scribble.visit.util; import org.scribble.ast.ScribNode; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.name.MessageId; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.name.MessageId; +import org.scribble.lang.Lang; public class MessageIdCollector extends NameCollector> { - public MessageIdCollector(Job job, ModuleContext mcontext) + public MessageIdCollector(Lang job, ModuleContext mcontext) { super(job, mcontext); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/util/NameCollector.java b/scribble-ast/src/main/java/org/scribble/visit/util/NameCollector.java similarity index 88% rename from scribble-lang/src/main/java/org/scribble/visit/util/NameCollector.java rename to scribble-ast/src/main/java/org/scribble/visit/util/NameCollector.java index f3b1deeb3..534dae7b5 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/util/NameCollector.java +++ b/scribble-ast/src/main/java/org/scribble/visit/util/NameCollector.java @@ -16,9 +16,9 @@ import java.util.HashSet; import java.util.Set; -import org.scribble.job.Job; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.name.Name; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.name.Name; +import org.scribble.lang.Lang; import org.scribble.visit.NoEnvOffsetSubprotocolVisitor; // Make SubprotocolVisitor? -- should be at least SubprotocolVisitor for get all occurrences up to recursive subprotocols (e.g. role occurrences for protocoldeclcontext) @@ -26,14 +26,14 @@ public abstract class NameCollector> extends NoEnvOffsetSubpro { private Set names = new HashSet<>(); - public NameCollector(Job job) + public NameCollector(Lang job) { super(job); } // Can take ModuleContext here, so no need to visit from Module as root -- maybe factor this facility out // Although has to enter at least at protocoldecl for subprotocol visitor root sig pushing - public NameCollector(Job job, ModuleContext mcontext) + public NameCollector(Lang job, ModuleContext mcontext) { super(job); setModuleContext(mcontext); diff --git a/scribble-lang/src/main/java/org/scribble/visit/util/RecVarCollector.java b/scribble-ast/src/main/java/org/scribble/visit/util/RecVarCollector.java similarity index 84% rename from scribble-lang/src/main/java/org/scribble/visit/util/RecVarCollector.java rename to scribble-ast/src/main/java/org/scribble/visit/util/RecVarCollector.java index 4f58ca1b9..a33c06cb2 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/util/RecVarCollector.java +++ b/scribble-ast/src/main/java/org/scribble/visit/util/RecVarCollector.java @@ -15,20 +15,20 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.name.RecVar; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.name.RecVar; +import org.scribble.lang.Lang; // Collects continues (not recs) public class RecVarCollector extends NameCollector { - public RecVarCollector(Job job) + public RecVarCollector(Lang job) { super(job); } - public RecVarCollector(Job job, ModuleContext mcontext) + public RecVarCollector(Lang job, ModuleContext mcontext) { super(job, mcontext); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/util/RoleCollector.java b/scribble-ast/src/main/java/org/scribble/visit/util/RoleCollector.java similarity index 85% rename from scribble-lang/src/main/java/org/scribble/visit/util/RoleCollector.java rename to scribble-ast/src/main/java/org/scribble/visit/util/RoleCollector.java index eb83be6f1..317a53e57 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/util/RoleCollector.java +++ b/scribble-ast/src/main/java/org/scribble/visit/util/RoleCollector.java @@ -15,22 +15,22 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.lang.context.ModuleContext; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.name.Role; +import org.scribble.lang.Lang; // Second pass for ProtocolDeclContext building // Maybe generalise to integrate enabled message collection? // NOTE: doesn't collect from choice subjects public class RoleCollector extends NameCollector { - public RoleCollector(Job job) + public RoleCollector(Lang job) { super(job); } - public RoleCollector(Job job, ModuleContext mcontext) + public RoleCollector(Lang job, ModuleContext mcontext) { super(job, mcontext); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/validation/GProtocolValidator.java b/scribble-ast/src/main/java/org/scribble/visit/validation/GProtocolValidator.java similarity index 85% rename from scribble-lang/src/main/java/org/scribble/visit/validation/GProtocolValidator.java rename to scribble-ast/src/main/java/org/scribble/visit/validation/GProtocolValidator.java index bb7b7c000..60c80dfd9 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/validation/GProtocolValidator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/validation/GProtocolValidator.java @@ -14,22 +14,22 @@ package org.scribble.visit.validation; import org.scribble.ast.ScribNode; -import org.scribble.job.Job; -import org.scribble.job.Job2; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.Job; +import org.scribble.core.job.ScribbleException; +import org.scribble.lang.Lang; import org.scribble.visit.context.ModuleContextVisitor; public class GProtocolValidator extends ModuleContextVisitor { - public final Job2 job2; + public final Job job2; - public GProtocolValidator(Job job) + public GProtocolValidator(Lang job) { super(job); this.job2 = null; } - public GProtocolValidator(Job2 job2) + public GProtocolValidator(Job job2) { super(null); this.job2 = job2; diff --git a/scribble-lang/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java b/scribble-ast/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java rename to scribble-ast/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java index ac87ccb6b..2b82b597a 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java +++ b/scribble-ast/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java @@ -18,8 +18,8 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.lang.Lang; import org.scribble.visit.context.ModuleContextVisitor; // Checks for recursive protocoldecl dependencies in the presence of delegations (currently, both via the delegation, and in of the protocoldelcs themselves -- FIXME over restrictive) @@ -28,7 +28,7 @@ public class DelegationProtocolRefChecker extends ModuleContextVisitor private Deque> pds = new LinkedList<>(); // Stack should be unnecessary // HACK: for DelegationElem recursive protocoldecl dependency checking // FIXME: should factor out more generally - public DelegationProtocolRefChecker(Job job) + public DelegationProtocolRefChecker(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java b/scribble-ast/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java similarity index 90% rename from scribble-lang/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java rename to scribble-ast/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java index b289b68f6..6d6161861 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java +++ b/scribble-ast/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java @@ -17,11 +17,11 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.Role; +import org.scribble.lang.Lang; import org.scribble.visit.SubprotocolVisitor; import org.scribble.visit.wf.env.ExplicitCorrelationEnv; @@ -29,7 +29,7 @@ public class ExplicitCorrelationChecker extends SubprotocolVisitor // Need to follow /unfolded/ subprotos (inlined is already unfolded by context building when this pass is run) { - public ExplicitCorrelationChecker(Job job) + public ExplicitCorrelationChecker(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/wf/NameDisambiguator.java b/scribble-ast/src/main/java/org/scribble/visit/wf/NameDisambiguator.java similarity index 94% rename from scribble-lang/src/main/java/org/scribble/visit/wf/NameDisambiguator.java rename to scribble-ast/src/main/java/org/scribble/visit/wf/NameDisambiguator.java index eea6605c1..b81681b7b 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/wf/NameDisambiguator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/wf/NameDisambiguator.java @@ -20,14 +20,14 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GDelegationElem; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.NonRoleArgKind; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.Name; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; import org.scribble.del.global.GDelegationElemDel; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.NonRoleArgKind; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.name.Name; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; +import org.scribble.lang.Lang; import org.scribble.visit.context.ModuleContextVisitor; // Disambiguates ambiguous PayloadTypeOrParameter names and inserts implicit Scope names @@ -45,7 +45,7 @@ public class NameDisambiguator extends ModuleContextVisitor //private ProtocolDecl root; // FIXME: factor out // Now unused (recvar renaming refactored to inlining -- don't want to mangle source AST) - public NameDisambiguator(Job job) + public NameDisambiguator(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java b/scribble-ast/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java rename to scribble-ast/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java index e1e09398c..6b13de216 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java +++ b/scribble-ast/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java @@ -17,15 +17,15 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProtocolBlock; +import org.scribble.core.job.ScribbleException; import org.scribble.del.local.LInteractionSeqDel; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; +import org.scribble.lang.Lang; import org.scribble.visit.UnfoldingVisitor; import org.scribble.visit.wf.env.ReachabilityEnv; public class ReachabilityChecker extends UnfoldingVisitor { - public ReachabilityChecker(Job job) + public ReachabilityChecker(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java b/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java similarity index 95% rename from scribble-lang/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java rename to scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java index 4604ae12f..dd69c4f08 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java +++ b/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java @@ -21,9 +21,9 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ProtocolKind; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.lang.Lang; import org.scribble.visit.UnfoldingVisitor; import org.scribble.visit.wf.env.WFChoiceEnv; @@ -36,7 +36,7 @@ public class WFChoiceChecker extends UnfoldingVisitor // equals method identity not suitable unless AST nodes record additional info like syntactic position private Set> visited = new HashSet<>(); - public WFChoiceChecker(Job job) + public WFChoiceChecker(Lang job) { super(job); } diff --git a/scribble-lang/src/main/java/org/scribble/visit/wf/env/ExplicitCorrelationEnv.java b/scribble-ast/src/main/java/org/scribble/visit/wf/env/ExplicitCorrelationEnv.java similarity index 100% rename from scribble-lang/src/main/java/org/scribble/visit/wf/env/ExplicitCorrelationEnv.java rename to scribble-ast/src/main/java/org/scribble/visit/wf/env/ExplicitCorrelationEnv.java diff --git a/scribble-lang/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java b/scribble-ast/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java similarity index 98% rename from scribble-lang/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java rename to scribble-ast/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java index 8e1ae3eff..d4982c0de 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java +++ b/scribble-ast/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java @@ -19,7 +19,7 @@ import java.util.List; import java.util.Set; -import org.scribble.type.name.RecVar; +import org.scribble.core.type.name.RecVar; import org.scribble.visit.env.Env; public class ReachabilityEnv extends Env diff --git a/scribble-lang/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java b/scribble-ast/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java similarity index 96% rename from scribble-lang/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java rename to scribble-ast/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java index 6e039f901..f9b9a4071 100644 --- a/scribble-lang/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java +++ b/scribble-ast/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java @@ -18,12 +18,12 @@ import java.util.List; import java.util.Set; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Op; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; -import org.scribble.type.session.MessageSig; -import org.scribble.type.session.Payload; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Op; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.MessageSig; +import org.scribble.core.type.session.Payload; import org.scribble.util.ConnectedMap; import org.scribble.util.MessageIdMap; import org.scribble.visit.env.Env; diff --git a/scribble-cli/pom.xml b/scribble-cli/pom.xml index ad473f3c3..10ef121ae 100644 --- a/scribble-cli/pom.xml +++ b/scribble-cli/pom.xml @@ -23,7 +23,7 @@ org.scribble - scribble-lang + scribble-ast org.scribble diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index ee67b42b2..71ce79ec7 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -28,22 +28,22 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.codegen.java.JEndpointApiGenerator; import org.scribble.codegen.java.callbackapi.CBEndpointApiGenerator3; -import org.scribble.job.AntlrSourceException; -import org.scribble.job.Job; -import org.scribble.job.Job2; -import org.scribble.job.JobContext; -import org.scribble.job.JobContext2; -import org.scribble.job.RuntimeScribbleException; -import org.scribble.job.ScribbleException; -import org.scribble.lang.local.LProtocol; -import org.scribble.main.MainContext; -import org.scribble.main.resource.DirectoryResourceLocator; -import org.scribble.main.resource.ResourceLocator; -import org.scribble.model.endpoint.EGraph; -import org.scribble.model.global.SGraph; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.job.AntlrSourceException; +import org.scribble.core.job.Job; +import org.scribble.core.job.JobContext; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.local.LProtocol; +import org.scribble.core.model.endpoint.EGraph; +import org.scribble.core.model.global.SGraph; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.Role; +import org.scribble.lang.Lang; +import org.scribble.lang.LangContext; +import org.scribble.main.Main; +import org.scribble.main.resource.locator.DirectoryResourceLocator; +import org.scribble.main.resource.locator.ResourceLocator; import org.scribble.util.ScribParserException; import org.scribble.util.ScribUtil2; @@ -69,7 +69,7 @@ public CommandLine(String... args) throws CommandLineException } // A Scribble extension should override newMainContext as appropriate. - protected MainContext newMainContext() + protected Main newMainContext() throws ScribParserException, ScribbleException { //boolean jUnit = this.args.containsKey(ArgFlag.JUNIT); @@ -91,14 +91,14 @@ protected MainContext newMainContext() ResourceLocator locator = new DirectoryResourceLocator(impaths); if (this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) { - return new MainContext(debug, locator, this.args.get(CLArgFlag.INLINE_MAIN_MOD)[0], useOldWF, noLiveness, minEfsm, fair, + return new Main(debug, locator, this.args.get(CLArgFlag.INLINE_MAIN_MOD)[0], useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); } else { Path mainpath = CommandLine.parseMainPath(this.args.get(CLArgFlag.MAIN_MOD)[0]); //return new MainContext(jUnit, debug, locator, mainpath, useOldWF, noLiveness); - return new MainContext(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, + return new Main(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); } } @@ -149,8 +149,8 @@ public void run() throws CommandLineException, AntlrSourceException // Scribble protected void runBody() throws ScribParserException, AntlrSourceException, CommandLineException { - MainContext mc = newMainContext(); // Represents current instance of tooling for given CL args - Job job = mc.newJob(); // A Job is some series of passes performed on each Module in the MainContext (e.g., cf. Job::runVisitorPass) + Main mc = newMainContext(); // Represents current instance of tooling for given CL args + Lang job = mc.newJob(); // A Job is some series of passes performed on each Module in the MainContext (e.g., cf. Job::runVisitorPass) ScribbleException fail = null; try { @@ -184,7 +184,7 @@ protected void runBody() } // AntlrSourceException super of ScribbleException -- needed for, e.g., AssrtCoreSyntaxException - protected void doValidationTasks(Job job) + protected void doValidationTasks(Lang job) throws AntlrSourceException, ScribParserException, // Latter in case needed by subclasses CommandLineException { @@ -199,11 +199,11 @@ protected void doValidationTasks(Job job) else*/ { job.runContextBuildingPasses(); // TODO: refactor, w.r.t. below - job.getJob2().checkWellFormedness(); + job.toJob().checkWellFormedness(); } } - protected void tryOutputTasks(Job job) + protected void tryOutputTasks(Lang job) throws CommandLineException, ScribbleException { // Following must be ordered appropriately -- ? @@ -266,7 +266,7 @@ protected void tryOutputTasks(Job job) } // TODO: rename - protected void doNonAttemptableOutputTasks(Job job) + protected void doNonAttemptableOutputTasks(Lang job) throws ScribbleException, CommandLineException { if (this.args.containsKey(CLArgFlag.SESS_API_GEN)) @@ -288,11 +288,11 @@ protected void doNonAttemptableOutputTasks(Job job) } // TODO: option to write to file, like classes - private void printProjections(Job job) + private void printProjections(Lang job) throws CommandLineException, ScribbleException { - JobContext jobc = job.getContext(); - Job2 job2 = job.getJob2(); + LangContext jobc = job.getContext(); + Job job2 = job.toJob(); String[] args = this.args.get(CLArgFlag.PROJECT); for (int i = 0; i < args.length; i += 2) { @@ -308,10 +308,10 @@ private void printProjections(Job job) // dot/aut text output // forUser: true means for API gen and general user info (may be minimised), false means for validation (non-minimised, fair or unfair) // (forUser && !fair) should not hold, i.e. unfair doesn't make sense if forUser - private void printEGraph(Job job, boolean forUser, boolean fair) + private void printEGraph(Lang job, boolean forUser, boolean fair) throws ScribbleException, CommandLineException { - JobContext jobc = job.getContext(); + LangContext jobc = job.getContext(); String[] args = forUser ? this.args.get(CLArgFlag.EFSM) : (fair @@ -329,10 +329,10 @@ private void printEGraph(Job job, boolean forUser, boolean fair) } } - private void drawEGraph(Job job, boolean forUser, boolean fair) + private void drawEGraph(Lang job, boolean forUser, boolean fair) throws ScribbleException, CommandLineException { - JobContext jobc = job.getContext(); + LangContext jobc = job.getContext(); String[] args = forUser ? this.args.get(CLArgFlag.EFSM_PNG) : (fair @@ -349,12 +349,12 @@ private void drawEGraph(Job job, boolean forUser, boolean fair) } // Endpoint graphs are "inlined", so only a single graph is built (cf. projection output) - private EGraph getEGraph(Job job, GProtocolName fullname, Role role, + private EGraph getEGraph(Lang job, GProtocolName fullname, Role role, boolean forUser, boolean fair) throws ScribbleException, CommandLineException { - JobContext jobc = job.getContext(); - JobContext2 jobc2 = job.getJob2().getContext(); + LangContext jobc = job.getContext(); + JobContext jobc2 = job.toJob().getContext(); GProtocolDecl gpd = (GProtocolDecl) jobc.getMainModule() .getProtocolDeclChild(fullname.getSimpleName()); if (gpd == null || !gpd.getHeaderChild().getRoleDeclListChild().getRoles() @@ -385,10 +385,10 @@ private EGraph getEGraph(Job job, GProtocolName fullname, Role role, return graph; } - private void printSGraph(Job job, boolean fair) + private void printSGraph(Lang job, boolean fair) throws ScribbleException, CommandLineException { - JobContext jobc = job.getContext(); + LangContext jobc = job.getContext(); String[] args = fair ? this.args.get(CLArgFlag.SGRAPH) : this.args.get(CLArgFlag.UNFAIR_SGRAPH); @@ -403,10 +403,10 @@ private void printSGraph(Job job, boolean fair) } } - private void drawSGraph(Job job, boolean fair) + private void drawSGraph(Lang job, boolean fair) throws ScribbleException, CommandLineException { - JobContext jobc = job.getContext(); + LangContext jobc = job.getContext(); String[] args = fair ? this.args.get(CLArgFlag.SGRAPH_PNG) : this.args.get(CLArgFlag.UNFAIR_SGRAPH_PNG); @@ -419,10 +419,10 @@ private void drawSGraph(Job job, boolean fair) } } - private static SGraph getSGraph(Job job, GProtocolName fullname, boolean fair) + private static SGraph getSGraph(Lang job, GProtocolName fullname, boolean fair) throws ScribbleException { - JobContext2 jobc2 = job.getJob2().getContext(); + JobContext jobc2 = job.toJob().getContext(); SGraph model = fair ? jobc2.getSGraph(fullname) : jobc2.getUnfairSGraph(fullname); @@ -434,10 +434,10 @@ private static SGraph getSGraph(Job job, GProtocolName fullname, boolean fair) return model; } - private void outputEndpointApi(Job job) + private void outputEndpointApi(Lang job) throws ScribbleException, CommandLineException { - JobContext jobc = job.getContext(); + LangContext jobc = job.getContext(); String[] args = this.args.get(CLArgFlag.API_GEN); JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // FIXME: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) @@ -452,10 +452,10 @@ private void outputEndpointApi(Job job) } } - private void outputSessionApi(Job job) + private void outputSessionApi(Lang job) throws ScribbleException, CommandLineException { - JobContext jobc = job.getContext(); + LangContext jobc = job.getContext(); String[] args = this.args.get(CLArgFlag.SESS_API_GEN); JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // TODO: refactor (generalise -- use new API) for (String fullname : args) @@ -466,10 +466,10 @@ private void outputSessionApi(Job job) } } - private void outputStateChannelApi(Job job) + private void outputStateChannelApi(Lang job) throws ScribbleException, CommandLineException { - JobContext jobc = job.getContext(); + LangContext jobc = job.getContext(); String[] args = this.args.get(CLArgFlag.SCHAN_API_GEN); JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // TODO: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) @@ -482,10 +482,10 @@ private void outputStateChannelApi(Job job) } } - private void outputEventDrivenApi(Job job) + private void outputEventDrivenApi(Lang job) throws ScribbleException, CommandLineException { - JobContext jobc = job.getContext(); + LangContext jobc = job.getContext(); String[] args = this.args.get(CLArgFlag.ED_API_GEN); /*JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // FIXME: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) @@ -565,7 +565,7 @@ protected static List parseImportPaths(String paths) .collect(Collectors.toList()); } - protected static GProtocolName checkGlobalProtocolArg(JobContext jobc, + protected static GProtocolName checkGlobalProtocolArg(LangContext jobc, String simpname) throws CommandLineException { GProtocolName simpgpn = new GProtocolName(simpname); @@ -587,7 +587,7 @@ protected static GProtocolName checkGlobalProtocolArg(JobContext jobc, return new GProtocolName(jobc.job.config.main, simpgpn); // TODO: take Job param instead of Jobcontext } - protected static Role checkRoleArg(JobContext jobc, + protected static Role checkRoleArg(LangContext jobc, GProtocolName fullname, String rolename) throws CommandLineException { ProtocolDecl pd = jobc.getMainModule() diff --git a/scribble-codegen/pom.xml b/scribble-codegen/pom.xml index ad6aac1f6..5c844d7f9 100644 --- a/scribble-codegen/pom.xml +++ b/scribble-codegen/pom.xml @@ -22,7 +22,7 @@ org.scribble - scribble-lang + scribble-ast diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java index 778bcc9e3..219191da2 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java @@ -15,24 +15,24 @@ import java.util.Map; -import org.scribble.job.Job; -import org.scribble.job.Job2; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.GProtocolName; +import org.scribble.core.job.Job; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.lang.Lang; // Basic pattern: use TypeGenerators to create all necessary TypeBuilders and cache them, and generateApi should call build on all as a final step public abstract class ApiGen { - public final Job job; - public final Job2 job2; + public final Lang job; + public final Job job2; public final GProtocolName gpn; // full name - public ApiGen(Job job, GProtocolName fullname) + public ApiGen(Lang job, GProtocolName fullname) { this.job = job; try { - this.job2 = job.getJob2(); + this.job2 = job.toJob(); } catch (ScribbleException e) // TODO: refactor { @@ -45,7 +45,7 @@ public ApiGen(Job job, GProtocolName fullname) // FIXME: Path instead of String key? public abstract Map generateApi(); - public Job getJob() + public Lang getJob() { return this.job; } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java index d08a9449d..ef5ac502b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java @@ -19,17 +19,17 @@ import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.statechanapi.ioifaces.IOInterfacesGenerator; -import org.scribble.job.Job; -import org.scribble.job.RuntimeScribbleException; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.Role; +import org.scribble.lang.Lang; public class JEndpointApiGenerator { - public final Job job; + public final Lang job; - public JEndpointApiGenerator(Job job) + public JEndpointApiGenerator(Lang job) { this.job = job; } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index b9599fde3..2c3edd42a 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -26,37 +26,37 @@ import org.scribble.ast.MessageSigNameDecl; import org.scribble.ast.Module; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; -import org.scribble.job.Job; -import org.scribble.job.Job2; -import org.scribble.job.JobContext2; -import org.scribble.job.ScribbleException; -import org.scribble.model.MState; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.EStateKind; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.DataType; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.PayloadElemType; -import org.scribble.type.name.Role; +import org.scribble.core.job.Job; +import org.scribble.core.job.JobContext; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.MState; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.EStateKind; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.name.Role; +import org.scribble.lang.Lang; // FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) // From ParamCoreEndpointApiGenerator @Deprecated public class CBEndpointApiGenerator { - public final Job job; - public final Job2 job2; + public final Lang job; + public final Job job2; public final GProtocolName proto; public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral private final boolean subtypes; - public CBEndpointApiGenerator(Job job, GProtocolName fullname, Role self, boolean subtypes) + public CBEndpointApiGenerator(Lang job, GProtocolName fullname, Role self, boolean subtypes) { this.job = job; try { - this.job2 = job.getJob2(); + this.job2 = job.toJob(); } catch (ScribbleException e) // TODO: refactor { @@ -92,7 +92,7 @@ public Map buildSessionApi() throws ScribbleException // FIXME: public Map buildEndpointClass() throws ScribbleException { Module main = this.job.getContext().getMainModule(); - JobContext2 jobc2 = this.job2.getContext(); + JobContext jobc2 = this.job2.getContext(); EState init = (this.job.config.minEfsm ? jobc2.getMinimisedEGraph(this.proto, this.self) : jobc2.getEGraph(this.proto, this.self) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index a44002b56..68d047b37 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -32,20 +32,20 @@ import org.scribble.codegen.java.util.FieldBuilder; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.job.Job; -import org.scribble.job.Job2; -import org.scribble.job.JobContext; -import org.scribble.job.JobContext2; -import org.scribble.job.ScribbleException; -import org.scribble.model.MState; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.EStateKind; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.DataType; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.PayloadElemType; -import org.scribble.type.name.Role; +import org.scribble.core.job.Job; +import org.scribble.core.job.JobContext; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.MState; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.EStateKind; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.name.Role; +import org.scribble.lang.Lang; +import org.scribble.lang.LangContext; // FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) // FIXME: consider collecting up all interfaces as statics inside a container class -- also states? @@ -53,8 +53,8 @@ // FIXME: consider also "expanding" nested message constructors by op first? -- and consider "partial constructors" along expansions, can they be parameterised typed? public class CBEndpointApiGenerator3 { - public final Job job; - public final Job2 job2; + public final Lang job; + public final Job job2; public final GProtocolName proto; public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral @@ -62,12 +62,12 @@ public class CBEndpointApiGenerator3 //private final boolean subtypes; // Generate full hierarchy (states -> states, not just indivdual state -> cases) -- cf. ioifaces - public CBEndpointApiGenerator3(Job job, GProtocolName fullname, Role self, boolean subtypes) + public CBEndpointApiGenerator3(Lang job, GProtocolName fullname, Role self, boolean subtypes) { this.job = job; try { - this.job2 = job.getJob2(); + this.job2 = job.toJob(); } catch (ScribbleException e) // TODO: refactor { @@ -107,7 +107,7 @@ public Map buildEndpointClass() throws ScribbleException Module main = this.job.getContext().getMainModule(); Map res = new HashMap<>(); - JobContext2 jobc2 = this.job2.getContext(); + JobContext jobc2 = this.job2.getContext(); EState init = (this.job.config.minEfsm ? jobc2.getMinimisedEGraph(this.proto, this.self) : jobc2.getEGraph(this.proto, this.self) @@ -221,7 +221,7 @@ public Map buildEndpointClass() throws ScribbleException }*/ // branches - JobContext jobc = this.job.getContext(); + LangContext jobc = this.job.getContext(); for (EState s : states) { if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) @@ -673,7 +673,7 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, } // FIXME: refactor using TypeBuilder API - protected String generateBranch(String bprefix, JobContext jc, EState s, String endpointName, String rootPack, String branchName) + protected String generateBranch(String bprefix, LangContext jc, EState s, String endpointName, String rootPack, String branchName) { String branchAbstract = ""; branchAbstract += "package " + getHandlersSelfPackage() + ";\n"; @@ -730,7 +730,7 @@ protected String generateBranch(String bprefix, JobContext jc, EState s, String } protected String generateReceiveInterface(boolean isSig, - MessageSigNameDecl msnd, JobContext jc, EAction a, String rootPack, + MessageSigNameDecl msnd, LangContext jc, EAction a, String rootPack, String receiveIfName) { String receiveInterface = ""; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index 78d208d53..3d7734961 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -27,12 +27,12 @@ import org.scribble.codegen.java.util.ConstructorBuilder; import org.scribble.codegen.java.util.FieldBuilder; import org.scribble.codegen.java.util.MethodBuilder; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; import org.scribble.del.ModuleDel; -import org.scribble.job.Job; -import org.scribble.job.ScribbleException; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; +import org.scribble.lang.Lang; import org.scribble.visit.util.MessageIdCollector; public class SessionApiGenerator extends ApiGen @@ -53,7 +53,7 @@ public class SessionApiGenerator extends ApiGen private final ClassBuilder cb = new ClassBuilder(); private final Map classes = new HashMap<>(); // All classes in same package, for protected constructor access - public SessionApiGenerator(Job job, GProtocolName fullname) throws ScribbleException + public SessionApiGenerator(Lang job, GProtocolName fullname) throws ScribbleException { super(job, fullname); constructRoleClasses(); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AcceptSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AcceptSockGen.java index e4c38dce7..37ecf88b1 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AcceptSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AcceptSockGen.java @@ -18,8 +18,8 @@ import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; public class AcceptSockGen extends ScribSockGen { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java index 13383ff0f..541a3e8f3 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java @@ -27,13 +27,13 @@ import org.scribble.codegen.java.util.EnumBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.DataType; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.PayloadElemType; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.name.Role; public class BranchSockGen extends ScribSockGen { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java index 2dfeda36c..63020ff22 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java @@ -24,12 +24,12 @@ import org.scribble.codegen.java.util.FieldBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.DataType; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.Role; public class CaseSockGen extends ScribSockGen { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/EndSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/EndSockGen.java index 220d307f9..31efe7e2c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/EndSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/EndSockGen.java @@ -13,7 +13,7 @@ */ package org.scribble.codegen.java.statechanapi; -import org.scribble.model.endpoint.EState; +import org.scribble.core.model.endpoint.EState; public class EndSockGen extends ScribSockGen { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java index 88e0aed49..efa444210 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java @@ -21,11 +21,11 @@ import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.MessageSigName; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.MessageSigName; // Factor out public class HandlerIfaceGen extends AuxStateChanTypeGen diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java index e004361b1..5fd64b0c5 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java @@ -26,12 +26,12 @@ import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.DataType; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.PayloadElemType; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.PayloadElemType; public class InputFutureGen extends AuxStateChanTypeGen { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java index f1a284f0f..cef49024d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java @@ -24,12 +24,12 @@ import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.DataType; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.PayloadElemType; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.PayloadElemType; public class OutputSockGen extends ScribSockGen { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java index e7950781f..a868dc6c6 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java @@ -20,12 +20,12 @@ import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.DataType; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.PayloadElemType; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.PayloadElemType; public class ReceiveSockGen extends ScribSockGen { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java index c2f526783..200a4276f 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java @@ -23,11 +23,11 @@ import org.scribble.codegen.java.util.FieldBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; // Parameterize on output class type public abstract class ScribSockGen extends StateChanTypeGen diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChanTypeGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChanTypeGen.java index 3df9202a2..21d8dc0a9 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChanTypeGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChanTypeGen.java @@ -14,7 +14,7 @@ package org.scribble.codegen.java.statechanapi; import org.scribble.codegen.java.util.TypeBuilder; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; // Build a (top-level) type declaration for the API generation output public abstract class StateChanTypeGen diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 5e9c01c4d..3bb4dc3a5 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -22,15 +22,15 @@ import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.TypeBuilder; -import org.scribble.job.Job; -import org.scribble.job.JobContext2; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.Role; -import org.scribble.visit.global.Projector2; +import org.scribble.core.job.JobContext; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.Role; +import org.scribble.core.visit.global.Projector2; +import org.scribble.lang.Lang; // TODO: "wildcard" unary async: op doesn't matter -- for branch-receive op "still needed" to cast to correct branch state // TODO: "functional state interfaces", e.g. for smtp ehlo and quit actions @@ -56,7 +56,7 @@ public class StateChannelApiGenerator extends ApiGen private Map types = new HashMap<>(); // class/iface name key - public StateChannelApiGenerator(Job job, GProtocolName fullname, Role self) + public StateChannelApiGenerator(Lang job, GProtocolName fullname, Role self) throws ScribbleException // CHECKME: APIGenerationException? { super(job, fullname); @@ -64,7 +64,7 @@ public StateChannelApiGenerator(Job job, GProtocolName fullname, Role self) this.self = self; this.lpn = Projector2.projectFullProtocolName(fullname, self); //this.init = job.getContext().getEndpointGraph(fullname, self).init; - JobContext2 jobc2 = this.job2.getContext(); + JobContext jobc2 = this.job2.getContext(); this.init = job.config.minEfsm ? jobc2.getMinimisedEGraph(fullname, self).init : jobc2.getEGraph(fullname, self).init; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java index f9db95b6a..f06027471 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java @@ -20,12 +20,12 @@ import org.scribble.codegen.java.util.AbstractMethodBuilder; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.model.endpoint.actions.EReceive; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.PayloadElemType; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.model.endpoint.actions.EReceive; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.PayloadElemType; public class ActionIfaceGen extends IOIfaceGen { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java index b480a43e9..387ff32ee 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java @@ -25,10 +25,10 @@ import org.scribble.codegen.java.util.EnumBuilder; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.Role; public class BranchIfaceGen extends IOStateIfaceGen { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java index 5f3acb192..84a10ccce 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java @@ -25,11 +25,11 @@ import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.Role; public class CaseIfaceGen extends IOStateIfaceGen { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java index 52436caf3..433d67f33 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java @@ -23,11 +23,11 @@ import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.Role; // Cf. HandlerInterfaceGenerator public class HandleIfaceGen extends IOStateIfaceGen diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOIfaceGen.java index f861b08ba..b7692af9a 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOIfaceGen.java @@ -15,7 +15,7 @@ import org.scribble.codegen.java.statechanapi.StateChanTypeGen; import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; -import org.scribble.model.endpoint.EState; +import org.scribble.core.model.endpoint.EState; public abstract class IOIfaceGen extends StateChanTypeGen { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index 49418b091..1a0d43b86 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -37,14 +37,14 @@ import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.codegen.java.util.TypeBuilder; -import org.scribble.job.JobContext2; -import org.scribble.job.RuntimeScribbleException; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.EStateKind; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.job.JobContext; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.EStateKind; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.Role; // Cf. StateChannelApiGenerator // TODO: concrete state channel "to" casts for supertype i/f's (the info is there in the Java type hierachy though) @@ -79,7 +79,7 @@ public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) GProtocolName fullname = apigen.getGProtocolName(); Role self = getSelf(); //EndpointState init = this.job.getContext().getEndpointGraph(fullname, self).init; - JobContext2 jobc2 = this.job2.getContext(); + JobContext jobc2 = this.job2.getContext(); EState init = this.job.config.minEfsm ? jobc2.getMinimisedEGraph(fullname, self).init : jobc2.getEGraph(fullname, self).init; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java index ca55affd4..4c99c0084 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java @@ -26,12 +26,12 @@ import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.TypeBuilder; -import org.scribble.job.RuntimeScribbleException; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.Role; // Cf. ScribSocketGenerator // Partial I/O State I/f generator -- Successor Interfaces and cast methods added later diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java index 4cd6c6bcf..1e15d1536 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java @@ -22,10 +22,10 @@ import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.GProtocolName; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.GProtocolName; public class ReceiveIfaceGen extends IOStateIfaceGen { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java index f1946a9b4..c7639740a 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java @@ -17,9 +17,9 @@ import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.util.InterfaceBuilder; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; public class SelectIfaceGen extends IOStateIfaceGen { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SuccessorIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SuccessorIfaceGen.java index 514a5670c..fd448bfa3 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SuccessorIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SuccessorIfaceGen.java @@ -16,8 +16,8 @@ import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; public class SuccessorIfaceGen extends IOIfaceGen { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/util/ConstructorBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/util/ConstructorBuilder.java index e76db47ce..89837b984 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/util/ConstructorBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/util/ConstructorBuilder.java @@ -13,7 +13,7 @@ */ package org.scribble.codegen.java.util; -import org.scribble.job.RuntimeScribbleException; +import org.scribble.core.job.RuntimeScribbleException; public class ConstructorBuilder extends MethodBuilder { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/util/EnumBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/util/EnumBuilder.java index 7bcb5043b..140196330 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/util/EnumBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/util/EnumBuilder.java @@ -18,7 +18,7 @@ import java.util.List; import java.util.stream.Collectors; -import org.scribble.job.RuntimeScribbleException; +import org.scribble.core.job.RuntimeScribbleException; public class EnumBuilder extends TypeBuilder { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java index 64d718c6e..15107eb99 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java @@ -13,8 +13,8 @@ */ package org.scribble.codegen.statetype; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; public abstract class STActionBuilder { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java index 87f662188..ebe2e071e 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java @@ -13,7 +13,7 @@ */ package org.scribble.codegen.statetype; -import org.scribble.model.endpoint.EState; +import org.scribble.core.model.endpoint.EState; public abstract class STBranchStateBuilder extends STStateChanBuilder { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java index bc3fc04bf..76c15b396 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java @@ -13,9 +13,9 @@ */ package org.scribble.codegen.statetype; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.model.endpoint.actions.EReceive; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.model.endpoint.actions.EReceive; public abstract class STCaseBuilder extends STStateChanBuilder // Is a distinct type but not a state -- OK for now { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STEndStateBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STEndStateBuilder.java index cc80d80b0..89abfb1c8 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STEndStateBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STEndStateBuilder.java @@ -13,7 +13,7 @@ */ package org.scribble.codegen.statetype; -import org.scribble.model.endpoint.EState; +import org.scribble.core.model.endpoint.EState; public abstract class STEndStateBuilder extends STStateChanBuilder { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java index bd7ae7c8b..71b66f990 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java @@ -13,11 +13,11 @@ */ package org.scribble.codegen.statetype; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.model.endpoint.actions.ERequest; -import org.scribble.model.endpoint.actions.EDisconnect; -import org.scribble.model.endpoint.actions.ESend; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.model.endpoint.actions.EDisconnect; +import org.scribble.core.model.endpoint.actions.ERequest; +import org.scribble.core.model.endpoint.actions.ESend; public abstract class STOutputStateBuilder extends STStateChanBuilder { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java index dc5ebf640..d70076529 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java @@ -15,8 +15,8 @@ import java.util.List; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; public abstract class STReceiveStateBuilder extends STStateChanBuilder { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index 662c017ea..9121eb7b6 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -18,17 +18,17 @@ import java.util.Map; import java.util.Set; -import org.scribble.job.Job; -import org.scribble.model.MState; -import org.scribble.model.endpoint.EGraph; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.model.MState; +import org.scribble.core.model.endpoint.EGraph; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.Role; +import org.scribble.lang.Lang; public abstract class STStateChanAPIBuilder { - public final Job job; + public final Lang job; public final GProtocolName gpn; public final Role role; @@ -42,7 +42,7 @@ public abstract class STStateChanAPIBuilder private Map names = new HashMap<>(); - protected STStateChanAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph graph, + protected STStateChanAPIBuilder(Lang job, GProtocolName gpn, Role role, EGraph graph, STOutputStateBuilder ob, STReceiveStateBuilder rb, STBranchStateBuilder bb, STCaseBuilder cb, STEndStateBuilder eb) { this.job = job; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanBuilder.java index d2af364dc..aeca376a1 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanBuilder.java @@ -13,7 +13,7 @@ */ package org.scribble.codegen.statetype; -import org.scribble.model.endpoint.EState; +import org.scribble.core.model.endpoint.EState; public abstract class STStateChanBuilder { diff --git a/scribble-core/src/main/java/org/scribble/job/AntlrSourceException.java b/scribble-core/src/main/java/org/scribble/core/job/AntlrSourceException.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/job/AntlrSourceException.java rename to scribble-core/src/main/java/org/scribble/core/job/AntlrSourceException.java index eb127b415..3d854d29c 100644 --- a/scribble-core/src/main/java/org/scribble/job/AntlrSourceException.java +++ b/scribble-core/src/main/java/org/scribble/core/job/AntlrSourceException.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.job; +package org.scribble.core.job; import java.util.stream.Collectors; import java.util.stream.IntStream; diff --git a/scribble-core/src/main/java/org/scribble/job/Job2.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java similarity index 88% rename from scribble-core/src/main/java/org/scribble/job/Job2.java rename to scribble-core/src/main/java/org/scribble/core/job/Job.java index b050ec584..102570ceb 100644 --- a/scribble-core/src/main/java/org/scribble/job/Job2.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.job; +package org.scribble.core.job; import java.util.Collections; import java.util.LinkedList; @@ -21,51 +21,50 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.lang.SubprotoSig; -import org.scribble.lang.context.ModuleContext; -import org.scribble.lang.global.GNode; -import org.scribble.lang.global.GProtocol; -import org.scribble.lang.local.LProtocol; -import org.scribble.model.endpoint.EGraph; -import org.scribble.model.endpoint.EGraphBuilderUtil; -import org.scribble.model.global.SGraph; -import org.scribble.model.global.SGraphBuilderUtil; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.Local; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.name.DataType; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.ModuleName; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.Role; -import org.scribble.type.session.Arg; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; -import org.scribble.visit.global.Projector2; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.lang.global.GProtocol; +import org.scribble.core.lang.local.LProtocol; +import org.scribble.core.model.endpoint.EGraph; +import org.scribble.core.model.endpoint.EGraphBuilderUtil; +import org.scribble.core.model.global.SGraph; +import org.scribble.core.model.global.SGraphBuilderUtil; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Arg; +import org.scribble.core.visit.STypeInliner; +import org.scribble.core.visit.STypeUnfolder; +import org.scribble.core.visit.global.Projector2; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models -public class Job2 +public class Job { // Keys are full names private final Map modcs; // CHECKME: constant? move to JobConfig? - public final JobConfig2 config; // Immutable + public final JobConfig config; // Immutable - private final JobContext2 context; // Mutable (Visitor passes replace modules) + private final JobContext context; // Mutable (Visitor passes replace modules) private final SGraphBuilderUtil sgbu; // Just take MainContext as arg? -- would need to fix Maven dependencies //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) - public Job2(Set parsed,//Map parsed, - Map modcs, JobConfig2 config) + public Job(Set parsed,//Map parsed, + Map modcs, JobConfig config) { this.modcs = Collections.unmodifiableMap(modcs); this.config = config; this.sgbu = config.sf.newSGraphBuilderUtil(); - this.context = new JobContext2(this, parsed); // Single instance per Job and should never be shared + this.context = new JobContext(this, parsed); // Single instance per Job and should never be shared } // Scribble extensions should override these "new" methods @@ -351,7 +350,7 @@ public Map generateStateChannelApi(GProtocolName fullname, Role return api; }*/ - public JobContext2 getContext() + public JobContext getContext() { return this.context; } diff --git a/scribble-lang/src/main/java/org/scribble/job/JobConfig.java b/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java similarity index 79% rename from scribble-lang/src/main/java/org/scribble/job/JobConfig.java rename to scribble-core/src/main/java/org/scribble/core/job/JobConfig.java index 9f9959347..d8210c704 100644 --- a/scribble-lang/src/main/java/org/scribble/job/JobConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java @@ -11,12 +11,11 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.job; +package org.scribble.core.job; -import org.scribble.ast.AstFactory; -import org.scribble.model.endpoint.EModelFactory; -import org.scribble.model.global.SModelFactory; -import org.scribble.type.name.ModuleName; +import org.scribble.core.model.endpoint.EModelFactory; +import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.type.name.ModuleName; // The "static" (constant) info for Jobs -- cf. JobContext "dynamic" state public class JobConfig @@ -34,7 +33,6 @@ public class JobConfig public final boolean noValidation; public final boolean spin; - public final AstFactory af; public final EModelFactory ef; public final SModelFactory sf; @@ -42,7 +40,7 @@ public class JobConfig public JobConfig(boolean debug, ModuleName main, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin, - AstFactory af, EModelFactory ef, SModelFactory sf) + EModelFactory ef, SModelFactory sf) { this.main = main; @@ -57,15 +55,7 @@ public JobConfig(boolean debug, ModuleName main, boolean useOldWF, boolean noLiv this.noValidation = noValidation; this.spin = spin; - this.af = af; this.ef = ef; this.sf = sf; } - - public JobConfig2 toJobConfig2() - { - return new JobConfig2(debug, main, useOldWf, noProgress, minEfsm, fair, - noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin, - ef, sf); - } } diff --git a/scribble-core/src/main/java/org/scribble/job/JobContext2.java b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/job/JobContext2.java rename to scribble-core/src/main/java/org/scribble/core/job/JobContext.java index 85e5926a7..745fda912 100644 --- a/scribble-core/src/main/java/org/scribble/job/JobContext2.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.job; +package org.scribble.core.job; import java.io.File; import java.util.Collection; @@ -22,23 +22,23 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.lang.global.GProtocol; -import org.scribble.lang.local.LProtocol; -import org.scribble.model.endpoint.AutParser; -import org.scribble.model.endpoint.EGraph; -import org.scribble.model.global.SGraph; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.ModuleName; -import org.scribble.type.name.Role; +import org.scribble.core.lang.global.GProtocol; +import org.scribble.core.lang.local.LProtocol; +import org.scribble.core.model.endpoint.AutParser; +import org.scribble.core.model.endpoint.EGraph; +import org.scribble.core.model.global.SGraph; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.name.Role; +import org.scribble.core.visit.global.Projector2; import org.scribble.util.ScribUtil2; -import org.scribble.visit.global.Projector2; // Global "static" context information for a Job -- single instance per Job, should not be shared between Jobs // Mutable: projections, graphs, etc are added mutably later -- replaceModule also mutable setter -- "users" get this from the Job and expect to setter mutate "in place" -public class JobContext2 +public class JobContext { - public final Job2 job; + public final Job job; //public final ModuleName main; // The "main" root module from MainContext @@ -75,7 +75,7 @@ public class JobContext2 private final Map minimisedEGraphs = new HashMap<>(); // Toolchain currently depends on single instance of each graph (state id equality), e.g. cannot re-build or re-minimise, would not be the same graph instance // FIXME: currently only minimising "fair" graph, need to consider minimisation orthogonally to fairness -- NO: minimising (of fair) is for API gen only, unfair-transform does not use minimisation (regardless of user flag) for WF - protected JobContext2(Job2 job, //Map parsed)//, ModuleName main) + protected JobContext(Job job, //Map parsed)//, ModuleName main) Set intermed) { this.job = job; diff --git a/scribble-core/src/main/java/org/scribble/job/RuntimeScribbleException.java b/scribble-core/src/main/java/org/scribble/core/job/RuntimeScribbleException.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/job/RuntimeScribbleException.java rename to scribble-core/src/main/java/org/scribble/core/job/RuntimeScribbleException.java index e91d533f6..9a5effb9d 100644 --- a/scribble-core/src/main/java/org/scribble/job/RuntimeScribbleException.java +++ b/scribble-core/src/main/java/org/scribble/core/job/RuntimeScribbleException.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.job; +package org.scribble.core.job; public class RuntimeScribbleException extends RuntimeException { diff --git a/scribble-core/src/main/java/org/scribble/job/ScribbleException.java b/scribble-core/src/main/java/org/scribble/core/job/ScribbleException.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/job/ScribbleException.java rename to scribble-core/src/main/java/org/scribble/core/job/ScribbleException.java index 63c0369bd..3dc4a5c72 100644 --- a/scribble-core/src/main/java/org/scribble/job/ScribbleException.java +++ b/scribble-core/src/main/java/org/scribble/core/job/ScribbleException.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.job; +package org.scribble.core.job; import org.antlr.runtime.tree.CommonTree; diff --git a/scribble-core/src/main/java/org/scribble/job/Todo.java b/scribble-core/src/main/java/org/scribble/core/job/Todo.java similarity index 99% rename from scribble-core/src/main/java/org/scribble/job/Todo.java rename to scribble-core/src/main/java/org/scribble/core/job/Todo.java index 64ece6396..54f105e3d 100644 --- a/scribble-core/src/main/java/org/scribble/job/Todo.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Todo.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.job; +package org.scribble.core.job; // FIXME: project modifiers? diff --git a/scribble-core/src/main/java/org/scribble/lang/LangConstants.java b/scribble-core/src/main/java/org/scribble/core/lang/LangConstants.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/lang/LangConstants.java rename to scribble-core/src/main/java/org/scribble/core/lang/LangConstants.java index 68eaf62b0..9e3eed9cf 100644 --- a/scribble-core/src/main/java/org/scribble/lang/LangConstants.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/LangConstants.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.core.lang; @Deprecated public class LangConstants diff --git a/scribble-core/src/main/java/org/scribble/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java similarity index 89% rename from scribble-core/src/main/java/org/scribble/lang/Protocol.java rename to scribble-core/src/main/java/org/scribble/core/lang/Protocol.java index b86686235..78ad10051 100644 --- a/scribble-core/src/main/java/org/scribble/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java @@ -11,24 +11,24 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.core.lang; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.DataType; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.Role; -import org.scribble.type.session.Seq; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Seq; +import org.scribble.core.visit.STypeInliner; +import org.scribble.core.visit.STypeUnfolder; import org.scribble.util.Constants; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; public abstract class Protocol, B extends Seq> implements SNode diff --git a/scribble-core/src/main/java/org/scribble/lang/ProtocolMod.java b/scribble-core/src/main/java/org/scribble/core/lang/ProtocolMod.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/lang/ProtocolMod.java rename to scribble-core/src/main/java/org/scribble/core/lang/ProtocolMod.java index aa21e2c0e..053984e17 100644 --- a/scribble-core/src/main/java/org/scribble/lang/ProtocolMod.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/ProtocolMod.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.core.lang; import org.antlr.runtime.tree.CommonTree; diff --git a/scribble-core/src/main/java/org/scribble/core/lang/SNode.java b/scribble-core/src/main/java/org/scribble/core/lang/SNode.java new file mode 100644 index 000000000..04919b8ee --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/lang/SNode.java @@ -0,0 +1,22 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.lang; + +import org.antlr.runtime.tree.CommonTree; + +public interface SNode +{ + boolean hasSource(); // i.e., was parsed + CommonTree getSource(); // Pre: hasSource +} diff --git a/scribble-core/src/main/java/org/scribble/lang/SubprotoSig.java b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java similarity index 90% rename from scribble-core/src/main/java/org/scribble/lang/SubprotoSig.java rename to scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java index d3042cb76..3cbd575ad 100644 --- a/scribble-core/src/main/java/org/scribble/lang/SubprotoSig.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java @@ -11,17 +11,18 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.core.lang; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.Role; -import org.scribble.type.session.Arg; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Arg; +// CHECKME: relocate? // Immutable public class SubprotoSig { diff --git a/scribble-core/src/main/java/org/scribble/lang/context/ModuleContext.java b/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java similarity index 87% rename from scribble-core/src/main/java/org/scribble/lang/context/ModuleContext.java rename to scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java index c1b3bc46f..b73e4e810 100644 --- a/scribble-core/src/main/java/org/scribble/lang/context/ModuleContext.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java @@ -11,22 +11,22 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.context; +package org.scribble.core.lang.context; import java.util.Map; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.Kind; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.kind.SigKind; -import org.scribble.type.name.DataType; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.ModuleName; -import org.scribble.type.name.Name; -import org.scribble.type.name.ProtocolName; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.Kind; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.SigKind; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.name.Name; +import org.scribble.core.type.name.ProtocolName; // Context information specific to each module as a root (wrt. to visitor passes) // CHECKME: move to main package? diff --git a/scribble-core/src/main/java/org/scribble/core/lang/context/ScribNames.java b/scribble-core/src/main/java/org/scribble/core/lang/context/ScribNames.java new file mode 100644 index 000000000..e2bcb5278 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/lang/context/ScribNames.java @@ -0,0 +1,54 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.lang.context; + +import java.util.HashMap; +import java.util.Map; + +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.name.ProtocolName; + +// TODO: fix mutable public collection fields +// TODO: rename better +public class ScribNames +{ + // names -> fully qualified names + public final Map modules = new HashMap<>(); + public final Map data = new HashMap<>(); + public final Map sigs = new HashMap<>(); + public final Map globals = new HashMap<>(); + public final Map locals = new HashMap<>(); + + @Override + public String toString() + { + return "(modules=" + this.modules + ", types=" + this.data + ", sigs=" + this.sigs + + ", globals=" + this.globals + ", locals=" + this.locals + ")"; + } + + public boolean isVisibleProtocolDeclName(ProtocolName visname) + { + return this.globals.containsKey(visname) || this.locals.containsKey(visname); + } + + public boolean isVisibleDataType(DataType visname) + { + return this.data.containsKey(visname); + } +} \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GNode.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GNode.java new file mode 100644 index 000000000..80a9a602b --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GNode.java @@ -0,0 +1,22 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.lang.global; + +import org.scribble.core.lang.SNode; + +// Mainly for GDel.translate return (to include GProtocol) +public interface GNode extends SNode +{ + +} diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java similarity index 88% rename from scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java rename to scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 6c540bcb1..d9cd2eae3 100644 --- a/scribble-core/src/main/java/org/scribble/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.global; +package org.scribble.core.lang.global; import java.io.File; import java.io.IOException; @@ -25,33 +25,33 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.Job2; -import org.scribble.job.JobContext2; -import org.scribble.job.ScribbleException; -import org.scribble.lang.Protocol; -import org.scribble.lang.ProtocolMod; -import org.scribble.lang.SubprotoSig; -import org.scribble.lang.local.LProjection; -import org.scribble.model.MState; -import org.scribble.model.endpoint.EGraph; -import org.scribble.model.endpoint.EState; -import org.scribble.model.global.SGraph; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; -import org.scribble.type.session.global.GRecursion; -import org.scribble.type.session.global.GSeq; -import org.scribble.type.session.local.LSeq; +import org.scribble.core.job.Job; +import org.scribble.core.job.JobContext; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.Protocol; +import org.scribble.core.lang.ProtocolMod; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.lang.local.LProjection; +import org.scribble.core.model.MState; +import org.scribble.core.model.endpoint.EGraph; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.global.SGraph; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.Substitutions; +import org.scribble.core.type.session.global.GRecursion; +import org.scribble.core.type.session.global.GSeq; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.visit.STypeInliner; +import org.scribble.core.visit.STypeUnfolder; +import org.scribble.core.visit.global.Projector2; import org.scribble.util.ScribUtil2; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; -import org.scribble.visit.global.Projector2; public class GProtocol extends Protocol implements GNode // Mainly for GDel.translate return (to include GProtocol) @@ -181,10 +181,10 @@ public boolean canEquals(Object o) // TODO FIXME: refactor following methods (e.g., make non-static?) - public static void validateByScribble(Job2 job2, GProtocolName fullname, + public static void validateByScribble(Job job2, GProtocolName fullname, boolean fair) throws ScribbleException { - JobContext2 jc = job2.getContext(); + JobContext jc = job2.getContext(); SGraph graph = (fair) ? jc.getSGraph(fullname) : jc.getUnfairSGraph(fullname); @@ -192,10 +192,10 @@ public static void validateByScribble(Job2 job2, GProtocolName fullname, job2.config.sf.newSModel(graph).validate(job2); } - public static void validateBySpin(Job2 job2, GProtocolName fullname) + public static void validateBySpin(Job job2, GProtocolName fullname) throws ScribbleException { - JobContext2 jobc2 = job2.getContext(); + JobContext jobc2 = job2.getContext(); /*Module mod = jc.getModule(fullname.getPrefix()); GProtocolDecl gpd = (GProtocolDecl) mod .getProtocolDeclChild(fullname.getSimpleName());*/ diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LNode.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LNode.java new file mode 100644 index 000000000..97e536f95 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LNode.java @@ -0,0 +1,21 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.lang.local; + +import org.scribble.core.lang.SNode; + +public interface LNode extends SNode +{ + +} diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java similarity index 86% rename from scribble-core/src/main/java/org/scribble/lang/local/LProjection.java rename to scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java index 9e62b3ce0..7919e7c02 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java @@ -11,20 +11,20 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.local; +package org.scribble.core.lang.local; import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; -import org.scribble.lang.ProtocolMod; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.Role; -import org.scribble.type.session.local.LSeq; -import org.scribble.visit.STypeInliner; +import org.scribble.core.lang.ProtocolMod; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.visit.STypeInliner; public class LProjection extends LProtocol { diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java similarity index 80% rename from scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java rename to scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index b70c7459a..3eb3167b9 100644 --- a/scribble-core/src/main/java/org/scribble/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.local; +package org.scribble.core.lang.local; import java.util.Collections; import java.util.List; @@ -19,27 +19,27 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.Job2; -import org.scribble.job.ScribbleException; -import org.scribble.lang.Protocol; -import org.scribble.lang.ProtocolMod; -import org.scribble.lang.SubprotoSig; -import org.scribble.model.endpoint.EGraph; -import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.model.endpoint.EState; -import org.scribble.type.kind.Local; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; -import org.scribble.type.session.local.LRecursion; -import org.scribble.type.session.local.LSeq; +import org.scribble.core.job.Job; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.Protocol; +import org.scribble.core.lang.ProtocolMod; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.model.endpoint.EGraph; +import org.scribble.core.model.endpoint.EGraphBuilderUtil2; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.Substitutions; +import org.scribble.core.type.session.local.LRecursion; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.visit.STypeInliner; +import org.scribble.core.visit.STypeUnfolder; +import org.scribble.core.visit.local.ReachabilityEnv; import org.scribble.util.Constants; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; -import org.scribble.visit.local.ReachabilityEnv; public class LProtocol extends Protocol implements LNode @@ -87,7 +87,7 @@ public LProtocol unfoldAllOnce(STypeUnfolder u) this.self, this.params, unf); } - public EGraph toEGraph(Job2 job) + public EGraph toEGraph(Job job) { EGraphBuilderUtil2 b = new EGraphBuilderUtil2(job.config.ef); b.init(null); // FIXME: init param not used diff --git a/scribble-core/src/main/java/org/scribble/model/GraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/model/GraphBuilderUtil.java rename to scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java index 62734eeb3..3039e341d 100644 --- a/scribble-core/src/main/java/org/scribble/model/GraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java @@ -11,10 +11,10 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model; +package org.scribble.core.model; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ProtocolKind; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ProtocolKind; // Helper class for EndpointGraphBuilder -- can access the protected setters of S // N.B. must call init before every "new visit", including first diff --git a/scribble-core/src/main/java/org/scribble/model/MAction.java b/scribble-core/src/main/java/org/scribble/core/model/MAction.java similarity index 92% rename from scribble-core/src/main/java/org/scribble/model/MAction.java rename to scribble-core/src/main/java/org/scribble/core/model/MAction.java index b219a51ca..2ab0b2e0e 100644 --- a/scribble-core/src/main/java/org/scribble/model/MAction.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MAction.java @@ -11,12 +11,12 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model; +package org.scribble.core.model; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public abstract class MAction { diff --git a/scribble-core/src/main/java/org/scribble/model/MPrettyPrint.java b/scribble-core/src/main/java/org/scribble/core/model/MPrettyPrint.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/model/MPrettyPrint.java rename to scribble-core/src/main/java/org/scribble/core/model/MPrettyPrint.java index 8ddc261f1..d15a1aae1 100644 --- a/scribble-core/src/main/java/org/scribble/model/MPrettyPrint.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MPrettyPrint.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model; +package org.scribble.core.model; public interface MPrettyPrint { diff --git a/scribble-core/src/main/java/org/scribble/model/MPrettyState.java b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/model/MPrettyState.java rename to scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java index 6454b51c9..5b2138632 100644 --- a/scribble-core/src/main/java/org/scribble/model/MPrettyState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java @@ -11,14 +11,14 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model; +package org.scribble.core.model; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.stream.Collectors; -import org.scribble.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtocolKind; public abstract class MPrettyState , S extends MPrettyState, K extends ProtocolKind> diff --git a/scribble-core/src/main/java/org/scribble/model/MState.java b/scribble-core/src/main/java/org/scribble/core/model/MState.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/model/MState.java rename to scribble-core/src/main/java/org/scribble/core/model/MState.java index 7bfaa6361..731dc6251 100644 --- a/scribble-core/src/main/java/org/scribble/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MState.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model; +package org.scribble.core.model; import java.util.Collections; import java.util.HashMap; @@ -25,9 +25,9 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.scribble.job.RuntimeScribbleException; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.ProtocolKind; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.ProtocolKind; public abstract class MState< L, // Node label type (cosmetic) diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java index d34c57784..fc9847432 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/AutParser.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint; +package org.scribble.core.model.endpoint; import java.io.BufferedReader; import java.io.IOException; @@ -26,20 +26,20 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.job.Job2; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.DataType; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.Op; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.job.Job; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.Op; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public class AutParser { - private final Job2 job2; + private final Job job2; - public AutParser(Job2 job2) + public AutParser(Job job2) { this.job2 = job2; } diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EFSM.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/model/endpoint/EFSM.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java index 815bd20e6..51fd49d64 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EFSM.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java @@ -11,12 +11,12 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint; +package org.scribble.core.model.endpoint; import java.util.List; import java.util.stream.Collectors; -import org.scribble.model.endpoint.actions.EAction; +import org.scribble.core.model.endpoint.actions.EAction; // Factor out with SModel? public class EFSM diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraph.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/model/endpoint/EGraph.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java index d83fb87f8..86fb56bf3 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java @@ -11,10 +11,10 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint; +package org.scribble.core.model.endpoint; -import org.scribble.model.MPrettyPrint; -import org.scribble.type.name.Role; +import org.scribble.core.model.MPrettyPrint; +import org.scribble.core.type.name.Role; public class EGraph implements MPrettyPrint { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index 9cddfc4d0..3d7465423 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint; +package org.scribble.core.model.endpoint; import java.util.Arrays; import java.util.Collections; @@ -24,11 +24,11 @@ import java.util.Map; import java.util.Set; -import org.scribble.job.ScribbleException; -import org.scribble.model.GraphBuilderUtil; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.kind.Local; -import org.scribble.type.name.RecVar; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.GraphBuilderUtil; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.RecVar; // Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) // Tailored to support graph building from syntactic local protocol choice and recursion diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java index 0e011a4c2..6a7161a8e 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil2.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint; +package org.scribble.core.model.endpoint; import java.util.Arrays; import java.util.Collections; @@ -26,11 +26,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.job.ScribbleException; -import org.scribble.model.GraphBuilderUtil; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.kind.Local; -import org.scribble.type.name.RecVar; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.GraphBuilderUtil; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.RecVar; // FIXME TODO replace EGraphBuilderUtil // Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java similarity index 63% rename from scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactory.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java index 09d508b1a..9c56d6099 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java @@ -11,21 +11,21 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint; +package org.scribble.core.model.endpoint; import java.util.Set; -import org.scribble.model.endpoint.actions.EAccept; -import org.scribble.model.endpoint.actions.ERequest; -import org.scribble.model.endpoint.actions.EDisconnect; -import org.scribble.model.endpoint.actions.EReceive; -import org.scribble.model.endpoint.actions.ESend; -import org.scribble.model.endpoint.actions.EWrapClient; -import org.scribble.model.endpoint.actions.EWrapServer; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.model.endpoint.actions.EAccept; +import org.scribble.core.model.endpoint.actions.EDisconnect; +import org.scribble.core.model.endpoint.actions.EReceive; +import org.scribble.core.model.endpoint.actions.ERequest; +import org.scribble.core.model.endpoint.actions.ESend; +import org.scribble.core.model.endpoint.actions.EWrapClient; +import org.scribble.core.model.endpoint.actions.EWrapServer; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public interface EModelFactory { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java similarity index 73% rename from scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactoryImpl.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java index 35c38f297..a21780383 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java @@ -11,21 +11,21 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint; +package org.scribble.core.model.endpoint; import java.util.Set; -import org.scribble.model.endpoint.actions.EAccept; -import org.scribble.model.endpoint.actions.ERequest; -import org.scribble.model.endpoint.actions.EDisconnect; -import org.scribble.model.endpoint.actions.EReceive; -import org.scribble.model.endpoint.actions.ESend; -import org.scribble.model.endpoint.actions.EWrapClient; -import org.scribble.model.endpoint.actions.EWrapServer; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.model.endpoint.actions.EAccept; +import org.scribble.core.model.endpoint.actions.EDisconnect; +import org.scribble.core.model.endpoint.actions.EReceive; +import org.scribble.core.model.endpoint.actions.ERequest; +import org.scribble.core.model.endpoint.actions.ESend; +import org.scribble.core.model.endpoint.actions.EWrapClient; +import org.scribble.core.model.endpoint.actions.EWrapServer; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; // Separate E/SModelFactories fits protected E/SState constructor pattern public class EModelFactoryImpl implements EModelFactory diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/model/endpoint/EState.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index 78a1b06b8..75eac3165 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint; +package org.scribble.core.model.endpoint; import java.util.Collections; import java.util.HashMap; @@ -24,13 +24,13 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.job.ScribbleException; -import org.scribble.model.MPrettyState; -import org.scribble.model.MState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.kind.Local; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.MPrettyState; +import org.scribble.core.model.MState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; // Label types used to be both RecVar and SubprotocolSigs; now using inlined protocol for FSM building so just RecVar public class EState extends MPrettyState diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EStateKind.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EStateKind.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/model/endpoint/EStateKind.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/EStateKind.java index c97d8f19b..0d5be968c 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EStateKind.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EStateKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint; +package org.scribble.core.model.endpoint; // FIXME: consider that enums cannot be "extended" public enum EStateKind diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateContinueEdge.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java similarity index 80% rename from scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateContinueEdge.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java index dafba0de1..2ac1bcf05 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateContinueEdge.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java @@ -11,15 +11,15 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint; +package org.scribble.core.model.endpoint; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.model.global.SModelFactory; -import org.scribble.model.global.actions.SAction; -import org.scribble.type.name.Op; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.global.actions.SAction; +import org.scribble.core.type.name.Op; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; class IntermediateContinueEdge extends EAction { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateRecEdge.java similarity index 81% rename from scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateRecEdge.java index d2af5e554..670a928b6 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/IntermediateRecEdge.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateRecEdge.java @@ -11,15 +11,15 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint; +package org.scribble.core.model.endpoint; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.model.global.SModelFactory; -import org.scribble.model.global.actions.SAction; -import org.scribble.type.name.Op; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.global.actions.SAction; +import org.scribble.core.type.name.Op; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; // FIXME rename better (it's an "external rec" continue edge) @Deprecated diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAccept.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAccept.java similarity index 82% rename from scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAccept.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAccept.java index f09c50190..60108c1ef 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAccept.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAccept.java @@ -11,14 +11,14 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint.actions; +package org.scribble.core.model.endpoint.actions; -import org.scribble.model.endpoint.EModelFactory; -import org.scribble.model.global.SModelFactory; -import org.scribble.model.global.actions.SAccept; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.model.endpoint.EModelFactory; +import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.global.actions.SAccept; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public class EAccept extends EAction { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAction.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java similarity index 84% rename from scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAction.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java index 3789f01c9..a5261aec9 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAction.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java @@ -11,16 +11,16 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint.actions; +package org.scribble.core.model.endpoint.actions; -import org.scribble.model.MAction; -import org.scribble.model.endpoint.EModelFactory; -import org.scribble.model.global.SModelFactory; -import org.scribble.model.global.actions.SAction; -import org.scribble.type.kind.Local; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.model.MAction; +import org.scribble.core.model.endpoint.EModelFactory; +import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.global.actions.SAction; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public abstract class EAction extends MAction { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EDisconnect.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java similarity index 82% rename from scribble-core/src/main/java/org/scribble/model/endpoint/actions/EDisconnect.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java index f650dd559..22fdccf3e 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java @@ -11,14 +11,14 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint.actions; +package org.scribble.core.model.endpoint.actions; -import org.scribble.model.endpoint.EModelFactory; -import org.scribble.model.global.SModelFactory; -import org.scribble.model.global.actions.SDisconnect; -import org.scribble.type.name.Op; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.model.endpoint.EModelFactory; +import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.global.actions.SDisconnect; +import org.scribble.core.type.name.Op; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public class EDisconnect extends EAction { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EReceive.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReceive.java similarity index 86% rename from scribble-core/src/main/java/org/scribble/model/endpoint/actions/EReceive.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReceive.java index b1bcf2678..5c316b168 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EReceive.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReceive.java @@ -11,14 +11,14 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint.actions; +package org.scribble.core.model.endpoint.actions; -import org.scribble.model.endpoint.EModelFactory; -import org.scribble.model.global.SModelFactory; -import org.scribble.model.global.actions.SReceive; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.model.endpoint.EModelFactory; +import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.global.actions.SReceive; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public class EReceive extends EAction { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/ERequest.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERequest.java similarity index 83% rename from scribble-core/src/main/java/org/scribble/model/endpoint/actions/ERequest.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERequest.java index 519c38173..4032a383d 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/ERequest.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERequest.java @@ -11,14 +11,14 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint.actions; +package org.scribble.core.model.endpoint.actions; -import org.scribble.model.endpoint.EModelFactory; -import org.scribble.model.global.SModelFactory; -import org.scribble.model.global.actions.SRequest; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.model.endpoint.EModelFactory; +import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.global.actions.SRequest; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public class ERequest extends EAction { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/ESend.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java similarity index 86% rename from scribble-core/src/main/java/org/scribble/model/endpoint/actions/ESend.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java index 996996265..ea3684c5a 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/ESend.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java @@ -11,14 +11,14 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint.actions; +package org.scribble.core.model.endpoint.actions; -import org.scribble.model.endpoint.EModelFactory; -import org.scribble.model.global.SModelFactory; -import org.scribble.model.global.actions.SSend; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.model.endpoint.EModelFactory; +import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.global.actions.SSend; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public class ESend extends EAction { diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapClient.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapClient.java similarity index 82% rename from scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapClient.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapClient.java index 87c90337b..ba8de3b9b 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapClient.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapClient.java @@ -11,14 +11,14 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint.actions; +package org.scribble.core.model.endpoint.actions; -import org.scribble.model.endpoint.EModelFactory; -import org.scribble.model.global.SModelFactory; -import org.scribble.model.global.actions.SWrapClient; -import org.scribble.type.name.Op; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.model.endpoint.EModelFactory; +import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.global.actions.SWrapClient; +import org.scribble.core.type.name.Op; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; // Duplicated from Disconnect public class EWrapClient extends EAction diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapServer.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapServer.java similarity index 82% rename from scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapServer.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapServer.java index 62eb301f3..6ca2361c6 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EWrapServer.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapServer.java @@ -11,14 +11,14 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.endpoint.actions; +package org.scribble.core.model.endpoint.actions; -import org.scribble.model.endpoint.EModelFactory; -import org.scribble.model.global.SModelFactory; -import org.scribble.model.global.actions.SWrapServer; -import org.scribble.type.name.Op; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.model.endpoint.EModelFactory; +import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.global.actions.SWrapServer; +import org.scribble.core.type.name.Op; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; // Duplicated from Disconnect public class EWrapServer extends EAction diff --git a/scribble-core/src/main/java/org/scribble/model/global/SBuffers.java b/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java similarity index 92% rename from scribble-core/src/main/java/org/scribble/model/global/SBuffers.java rename to scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java index f8430fca6..9bf6e0723 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SBuffers.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global; +package org.scribble.core.model.global; import java.util.Collections; import java.util.HashMap; @@ -22,17 +22,17 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.model.endpoint.EModelFactory; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAccept; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.model.endpoint.actions.ERequest; -import org.scribble.model.endpoint.actions.EDisconnect; -import org.scribble.model.endpoint.actions.EReceive; -import org.scribble.model.endpoint.actions.ESend; -import org.scribble.model.endpoint.actions.EWrapClient; -import org.scribble.model.endpoint.actions.EWrapServer; -import org.scribble.type.name.Role; +import org.scribble.core.model.endpoint.EModelFactory; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAccept; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.model.endpoint.actions.EDisconnect; +import org.scribble.core.model.endpoint.actions.EReceive; +import org.scribble.core.model.endpoint.actions.ERequest; +import org.scribble.core.model.endpoint.actions.ESend; +import org.scribble.core.model.endpoint.actions.EWrapClient; +import org.scribble.core.model.endpoint.actions.EWrapServer; +import org.scribble.core.type.name.Role; public class SBuffers { diff --git a/scribble-core/src/main/java/org/scribble/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/model/global/SConfig.java rename to scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index b9f51df03..c6bd34cb6 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global; +package org.scribble.core.model.global; import java.util.Arrays; import java.util.Collections; @@ -24,18 +24,18 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.model.endpoint.EFSM; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.EStateKind; -import org.scribble.model.endpoint.actions.EAccept; -import org.scribble.model.endpoint.actions.ERequest; -import org.scribble.model.endpoint.actions.EDisconnect; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.model.endpoint.actions.EReceive; -import org.scribble.model.endpoint.actions.ESend; -import org.scribble.model.endpoint.actions.EWrapClient; -import org.scribble.model.endpoint.actions.EWrapServer; -import org.scribble.type.name.Role; +import org.scribble.core.model.endpoint.EFSM; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.EStateKind; +import org.scribble.core.model.endpoint.actions.EAccept; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.model.endpoint.actions.EDisconnect; +import org.scribble.core.model.endpoint.actions.EReceive; +import org.scribble.core.model.endpoint.actions.ERequest; +import org.scribble.core.model.endpoint.actions.ESend; +import org.scribble.core.model.endpoint.actions.EWrapClient; +import org.scribble.core.model.endpoint.actions.EWrapServer; +import org.scribble.core.type.name.Role; public class SConfig { diff --git a/scribble-core/src/main/java/org/scribble/model/global/SGraph.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/model/global/SGraph.java rename to scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java index 5795cb7e1..c75c36fb1 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global; +package org.scribble.core.model.global; import java.util.Collections; import java.util.HashMap; @@ -24,9 +24,9 @@ import java.util.SortedMap; import java.util.TreeMap; -import org.scribble.model.MPrettyPrint; -import org.scribble.model.global.actions.SAction; -import org.scribble.type.name.GProtocolName; +import org.scribble.core.model.MPrettyPrint; +import org.scribble.core.model.global.actions.SAction; +import org.scribble.core.type.name.GProtocolName; public class SGraph implements MPrettyPrint { diff --git a/scribble-core/src/main/java/org/scribble/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java similarity index 90% rename from scribble-core/src/main/java/org/scribble/model/global/SGraphBuilderUtil.java rename to scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index 287166984..4bf944942 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global; +package org.scribble.core.model.global; import java.util.HashMap; import java.util.Iterator; @@ -21,18 +21,18 @@ import java.util.Map.Entry; import java.util.stream.Collectors; -import org.scribble.job.Job2; -import org.scribble.job.ScribbleException; -import org.scribble.model.GraphBuilderUtil; -import org.scribble.model.endpoint.EFSM; -import org.scribble.model.endpoint.EGraph; -import org.scribble.model.endpoint.EModelFactory; -import org.scribble.model.endpoint.EStateKind; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.model.global.actions.SAction; -import org.scribble.type.kind.Global; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; +import org.scribble.core.job.Job; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.GraphBuilderUtil; +import org.scribble.core.model.endpoint.EFSM; +import org.scribble.core.model.endpoint.EGraph; +import org.scribble.core.model.endpoint.EModelFactory; +import org.scribble.core.model.endpoint.EStateKind; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.model.global.actions.SAction; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.Role; public class SGraphBuilderUtil extends GraphBuilderUtil { @@ -66,7 +66,7 @@ protected SConfig createInitialSConfig(EModelFactory ef, Map egrap // Also checks for non-deterministic payloads // Maybe refactor into an SGraph builder util; cf., EGraphBuilderUtil -- but not Visitor-based building (cf. EndpointGraphBuilder), this isn't an AST algorithm //public SGraph buildSGraph(Job job, GProtocolName fullname, SConfig c0) throws ScribbleException - public SGraph buildSGraph(Job2 job, GProtocolName fullname, Map egraphs, boolean explicit) throws ScribbleException + public SGraph buildSGraph(Job job, GProtocolName fullname, Map egraphs, boolean explicit) throws ScribbleException { /*Map efsms = egraphs.entrySet().stream().collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().toFsm())); diff --git a/scribble-core/src/main/java/org/scribble/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/model/global/SModel.java rename to scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index 0279f7cd3..10c97ebdd 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global; +package org.scribble.core.model.global; import java.util.HashMap; import java.util.HashSet; @@ -21,12 +21,12 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.job.Job2; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EFSM; -import org.scribble.model.endpoint.actions.ESend; -import org.scribble.model.global.actions.SAction; -import org.scribble.type.name.Role; +import org.scribble.core.job.Job; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EFSM; +import org.scribble.core.model.endpoint.actions.ESend; +import org.scribble.core.model.global.actions.SAction; +import org.scribble.core.type.name.Role; public class SModel { @@ -37,7 +37,7 @@ protected SModel(SGraph graph) this.graph = graph; } - public void validate(Job2 job) throws ScribbleException + public void validate(Job job) throws ScribbleException { SState init = this.graph.init; Map states = this.graph.states; @@ -120,7 +120,7 @@ protected String appendSafetyErrorMessages(String errorMsg, } protected String appendProgressErrorMessages(String errorMsg, - Set starved, Map> ignored, Job2 job, + Set starved, Map> ignored, Job job, Map states, Set termset) { if (!starved.isEmpty()) @@ -138,7 +138,7 @@ protected String appendProgressErrorMessages(String errorMsg, return errorMsg; } - protected String termSetToString(Job2 job, Set termset, + protected String termSetToString(Job job, Set termset, Map all) { return job.config.debug diff --git a/scribble-core/src/main/java/org/scribble/model/global/SModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java similarity index 68% rename from scribble-core/src/main/java/org/scribble/model/global/SModelFactory.java rename to scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java index f8ebfa832..814506394 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java @@ -11,22 +11,22 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global; +package org.scribble.core.model.global; import java.util.Map; -import org.scribble.model.endpoint.EFSM; -import org.scribble.model.global.actions.SAccept; -import org.scribble.model.global.actions.SRequest; -import org.scribble.model.global.actions.SDisconnect; -import org.scribble.model.global.actions.SReceive; -import org.scribble.model.global.actions.SSend; -import org.scribble.model.global.actions.SWrapClient; -import org.scribble.model.global.actions.SWrapServer; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.model.endpoint.EFSM; +import org.scribble.core.model.global.actions.SAccept; +import org.scribble.core.model.global.actions.SDisconnect; +import org.scribble.core.model.global.actions.SReceive; +import org.scribble.core.model.global.actions.SRequest; +import org.scribble.core.model.global.actions.SSend; +import org.scribble.core.model.global.actions.SWrapClient; +import org.scribble.core.model.global.actions.SWrapServer; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public interface SModelFactory { diff --git a/scribble-core/src/main/java/org/scribble/model/global/SModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java similarity index 76% rename from scribble-core/src/main/java/org/scribble/model/global/SModelFactoryImpl.java rename to scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java index 69f8f9458..0db717b9d 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java @@ -11,22 +11,22 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global; +package org.scribble.core.model.global; import java.util.Map; -import org.scribble.model.endpoint.EFSM; -import org.scribble.model.global.actions.SAccept; -import org.scribble.model.global.actions.SRequest; -import org.scribble.model.global.actions.SDisconnect; -import org.scribble.model.global.actions.SReceive; -import org.scribble.model.global.actions.SSend; -import org.scribble.model.global.actions.SWrapClient; -import org.scribble.model.global.actions.SWrapServer; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.model.endpoint.EFSM; +import org.scribble.core.model.global.actions.SAccept; +import org.scribble.core.model.global.actions.SDisconnect; +import org.scribble.core.model.global.actions.SReceive; +import org.scribble.core.model.global.actions.SRequest; +import org.scribble.core.model.global.actions.SSend; +import org.scribble.core.model.global.actions.SWrapClient; +import org.scribble.core.model.global.actions.SWrapServer; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; // Separate E/SModelFactories fits protected E/SState constructor pattern public class SModelFactoryImpl implements SModelFactory diff --git a/scribble-core/src/main/java/org/scribble/model/global/SState.java b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java similarity index 88% rename from scribble-core/src/main/java/org/scribble/model/global/SState.java rename to scribble-core/src/main/java/org/scribble/core/model/global/SState.java index 3a7fe06ce..cc30fb33a 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java @@ -11,22 +11,22 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global; +package org.scribble.core.model.global; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; -import org.scribble.model.MPrettyState; -import org.scribble.model.MState; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.model.endpoint.actions.EReceive; -import org.scribble.model.endpoint.actions.ESend; -import org.scribble.model.global.actions.SAction; -import org.scribble.type.kind.Global; -import org.scribble.type.name.Role; +import org.scribble.core.model.MPrettyState; +import org.scribble.core.model.MState; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.model.endpoint.actions.EReceive; +import org.scribble.core.model.endpoint.actions.ESend; +import org.scribble.core.model.global.actions.SAction; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.Role; // FIXME? make a WFModel front-end class? (cf. EGraph) // Only uses MState.id cosmetically, cf. MState equals/hash -- overrides equals/hash based on this.config (maybe extending MState is a bit misleading) diff --git a/scribble-core/src/main/java/org/scribble/model/global/SStateErrors.java b/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java similarity index 88% rename from scribble-core/src/main/java/org/scribble/model/global/SStateErrors.java rename to scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java index f288c9fa9..3fd5ae06e 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/SStateErrors.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java @@ -11,16 +11,16 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global; +package org.scribble.core.model.global; import java.util.Collections; import java.util.Map; import java.util.Set; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EReceive; -import org.scribble.model.endpoint.actions.ESend; -import org.scribble.type.name.Role; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EReceive; +import org.scribble.core.model.endpoint.actions.ESend; +import org.scribble.core.type.name.Role; public class SStateErrors { diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SAccept.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAccept.java similarity index 88% rename from scribble-core/src/main/java/org/scribble/model/global/actions/SAccept.java rename to scribble-core/src/main/java/org/scribble/core/model/global/actions/SAccept.java index d929217bb..e674454d6 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SAccept.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAccept.java @@ -11,11 +11,11 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global.actions; +package org.scribble.core.model.global.actions; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public class SAccept extends SAction { diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SAction.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java similarity index 90% rename from scribble-core/src/main/java/org/scribble/model/global/actions/SAction.java rename to scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java index 395819ba7..ce0c1b475 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SAction.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java @@ -11,17 +11,17 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global.actions; +package org.scribble.core.model.global.actions; import java.util.Arrays; import java.util.HashSet; import java.util.Set; -import org.scribble.model.MAction; -import org.scribble.type.kind.Global; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.model.MAction; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public abstract class SAction extends MAction { diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SConnect.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SConnect.java similarity index 88% rename from scribble-core/src/main/java/org/scribble/model/global/actions/SConnect.java rename to scribble-core/src/main/java/org/scribble/core/model/global/actions/SConnect.java index a6ec67084..68d412a21 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SConnect.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SConnect.java @@ -11,11 +11,11 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global.actions; +package org.scribble.core.model.global.actions; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public class SConnect extends SAction { diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SDisconnect.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SDisconnect.java similarity index 88% rename from scribble-core/src/main/java/org/scribble/model/global/actions/SDisconnect.java rename to scribble-core/src/main/java/org/scribble/core/model/global/actions/SDisconnect.java index 3c87acd95..97bdf6a51 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SDisconnect.java @@ -11,11 +11,11 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global.actions; +package org.scribble.core.model.global.actions; -import org.scribble.type.name.Op; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.type.name.Op; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public class SDisconnect extends SAction { diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SReceive.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SReceive.java similarity index 87% rename from scribble-core/src/main/java/org/scribble/model/global/actions/SReceive.java rename to scribble-core/src/main/java/org/scribble/core/model/global/actions/SReceive.java index 346690167..bc86048d0 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SReceive.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SReceive.java @@ -11,11 +11,11 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global.actions; +package org.scribble.core.model.global.actions; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public class SReceive extends SAction { diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SRequest.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SRequest.java similarity index 88% rename from scribble-core/src/main/java/org/scribble/model/global/actions/SRequest.java rename to scribble-core/src/main/java/org/scribble/core/model/global/actions/SRequest.java index 5fdd9183e..35e224a46 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SRequest.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SRequest.java @@ -11,11 +11,11 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global.actions; +package org.scribble.core.model.global.actions; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public class SRequest extends SAction { diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SSend.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SSend.java similarity index 87% rename from scribble-core/src/main/java/org/scribble/model/global/actions/SSend.java rename to scribble-core/src/main/java/org/scribble/core/model/global/actions/SSend.java index 86e4ba107..6b27e17dc 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SSend.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SSend.java @@ -11,11 +11,11 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global.actions; +package org.scribble.core.model.global.actions; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public class SSend extends SAction { diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapClient.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SWrapClient.java similarity index 88% rename from scribble-core/src/main/java/org/scribble/model/global/actions/SWrapClient.java rename to scribble-core/src/main/java/org/scribble/core/model/global/actions/SWrapClient.java index 7516cffbc..685ed6903 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapClient.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SWrapClient.java @@ -11,11 +11,11 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global.actions; +package org.scribble.core.model.global.actions; -import org.scribble.type.name.Op; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.type.name.Op; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public class SWrapClient extends SAction { diff --git a/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapServer.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SWrapServer.java similarity index 87% rename from scribble-core/src/main/java/org/scribble/model/global/actions/SWrapServer.java rename to scribble-core/src/main/java/org/scribble/core/model/global/actions/SWrapServer.java index 2cf71ce69..f8add98cb 100644 --- a/scribble-core/src/main/java/org/scribble/model/global/actions/SWrapServer.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SWrapServer.java @@ -11,11 +11,11 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.model.global.actions; +package org.scribble.core.model.global.actions; -import org.scribble.type.name.Op; -import org.scribble.type.name.Role; -import org.scribble.type.session.Payload; +import org.scribble.core.type.name.Op; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; public class SWrapServer extends SAction { diff --git a/scribble-core/src/main/java/org/scribble/type/kind/AbstractKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/AbstractKind.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/type/kind/AbstractKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/AbstractKind.java index 40ba9717b..c7700af67 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/AbstractKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/AbstractKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; public abstract class AbstractKind implements Kind { diff --git a/scribble-core/src/main/java/org/scribble/type/kind/AmbigKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/AmbigKind.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/type/kind/AmbigKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/AmbigKind.java index 73a09f581..0c3b7c6b8 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/AmbigKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/AmbigKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; public class AmbigKind extends AbstractKind implements NonRoleArgKind//, PayloadTypeKind diff --git a/scribble-core/src/main/java/org/scribble/type/kind/DataTypeKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/DataTypeKind.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/type/kind/DataTypeKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/DataTypeKind.java index 8eb6ca9ab..6a56b7aac 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/DataTypeKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/DataTypeKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; public class DataTypeKind extends AbstractKind implements PayloadTypeKind, ImportKind, ModuleMemberKind { diff --git a/scribble-core/src/main/java/org/scribble/type/kind/Global.java b/scribble-core/src/main/java/org/scribble/core/type/kind/Global.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/type/kind/Global.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/Global.java index 1be5e719e..28199f6d3 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/Global.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/Global.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; public class Global extends AbstractKind implements ProtocolKind { diff --git a/scribble-core/src/main/java/org/scribble/type/kind/IdKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/IdKind.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/type/kind/IdKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/IdKind.java index 2af157d42..778d274fc 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/IdKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/IdKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; public class IdKind extends AbstractKind diff --git a/scribble-core/src/main/java/org/scribble/type/kind/ImportKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/ImportKind.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/type/kind/ImportKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/ImportKind.java index 7fc3db8c8..6e2eb0d76 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/ImportKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/ImportKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; public interface ImportKind extends Kind diff --git a/scribble-core/src/main/java/org/scribble/type/kind/Kind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/Kind.java similarity index 91% rename from scribble-core/src/main/java/org/scribble/type/kind/Kind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/Kind.java index 745d7be4b..134b07bb3 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/Kind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/Kind.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; -import org.scribble.type.name.Name; +import org.scribble.core.type.name.Name; public interface Kind { diff --git a/scribble-core/src/main/java/org/scribble/type/kind/Local.java b/scribble-core/src/main/java/org/scribble/core/type/kind/Local.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/type/kind/Local.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/Local.java index 68534e1c9..4b83b783c 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/Local.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/Local.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; public class Local extends AbstractKind implements ProtocolKind, PayloadTypeKind { diff --git a/scribble-core/src/main/java/org/scribble/type/kind/MessageIdKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/MessageIdKind.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/type/kind/MessageIdKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/MessageIdKind.java index ed3679960..85e65d561 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/MessageIdKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/MessageIdKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; public interface MessageIdKind extends Kind diff --git a/scribble-core/src/main/java/org/scribble/type/kind/ModuleKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/ModuleKind.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/type/kind/ModuleKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/ModuleKind.java index 1a93f3be2..65a392347 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/ModuleKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/ModuleKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; public class ModuleKind extends AbstractKind implements ImportKind { diff --git a/scribble-core/src/main/java/org/scribble/type/kind/ModuleMemberKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/ModuleMemberKind.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/type/kind/ModuleMemberKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/ModuleMemberKind.java index 0182baaa1..c180acb15 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/ModuleMemberKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/ModuleMemberKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; public interface ModuleMemberKind extends Kind diff --git a/scribble-core/src/main/java/org/scribble/type/kind/NonProtocolKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/NonProtocolKind.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/type/kind/NonProtocolKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/NonProtocolKind.java index 7ae6e7d43..21ad4a1ac 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/NonProtocolKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/NonProtocolKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; public interface NonProtocolKind extends Kind diff --git a/scribble-core/src/main/java/org/scribble/type/kind/NonRoleArgKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/NonRoleArgKind.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/type/kind/NonRoleArgKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/NonRoleArgKind.java index 9ad41aa55..6219dfc66 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/NonRoleArgKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/NonRoleArgKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; // Following sesstype.Arg hierarchy diff --git a/scribble-core/src/main/java/org/scribble/type/kind/NonRoleParamKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/NonRoleParamKind.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/type/kind/NonRoleParamKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/NonRoleParamKind.java index d69912eb4..9eb8768e2 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/NonRoleParamKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/NonRoleParamKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; // Non-role params diff --git a/scribble-core/src/main/java/org/scribble/type/kind/OpKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/OpKind.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/type/kind/OpKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/OpKind.java index a5a82d7fd..222a379eb 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/OpKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/OpKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; import java.io.IOException; import java.io.Serializable; diff --git a/scribble-core/src/main/java/org/scribble/type/kind/PackageKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/PackageKind.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/type/kind/PackageKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/PackageKind.java index dd9acda4f..ff060c378 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/PackageKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/PackageKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; public class PackageKind extends AbstractKind { diff --git a/scribble-core/src/main/java/org/scribble/type/kind/ParamKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/ParamKind.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/type/kind/ParamKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/ParamKind.java index 998f2388c..1d99e9172 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/ParamKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/ParamKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; public interface ParamKind extends Kind diff --git a/scribble-core/src/main/java/org/scribble/type/kind/PayloadTypeKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/PayloadTypeKind.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/type/kind/PayloadTypeKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/PayloadTypeKind.java index da62c4c1a..2a08db257 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/PayloadTypeKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/PayloadTypeKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; // Following sesstype.Arg hierarchy diff --git a/scribble-core/src/main/java/org/scribble/type/kind/ProtocolKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/ProtocolKind.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/type/kind/ProtocolKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/ProtocolKind.java index d6d1ff137..0578c7d82 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/ProtocolKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/ProtocolKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; public interface ProtocolKind extends ModuleMemberKind { diff --git a/scribble-core/src/main/java/org/scribble/type/kind/RecVarKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/RecVarKind.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/type/kind/RecVarKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/RecVarKind.java index be96ba50d..073498914 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/RecVarKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/RecVarKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; public class RecVarKind extends AbstractKind { diff --git a/scribble-core/src/main/java/org/scribble/type/kind/RoleKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/RoleKind.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/type/kind/RoleKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/RoleKind.java index 23313ada6..8fd3d4e96 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/RoleKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/RoleKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; public class RoleKind extends AbstractKind implements ParamKind { diff --git a/scribble-core/src/main/java/org/scribble/type/kind/ScopeKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/ScopeKind.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/type/kind/ScopeKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/ScopeKind.java index 7fb1fd5a7..9b6bcad7c 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/ScopeKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/ScopeKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; public class ScopeKind extends AbstractKind { diff --git a/scribble-core/src/main/java/org/scribble/type/kind/SigKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/SigKind.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/type/kind/SigKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/SigKind.java index 45f495efd..2d234a986 100644 --- a/scribble-core/src/main/java/org/scribble/type/kind/SigKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/SigKind.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.kind; +package org.scribble.core.type.kind; // Following sesstype.Arg hierarchy diff --git a/scribble-core/src/main/java/org/scribble/type/name/AbstractName.java b/scribble-core/src/main/java/org/scribble/core/type/name/AbstractName.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/type/name/AbstractName.java rename to scribble-core/src/main/java/org/scribble/core/type/name/AbstractName.java index 4e7f90e4a..481d56a71 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/AbstractName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/AbstractName.java @@ -11,12 +11,12 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; import java.io.IOException; import java.util.Arrays; -import org.scribble.type.kind.Kind; +import org.scribble.core.type.kind.Kind; public abstract class AbstractName implements Name { diff --git a/scribble-core/src/main/java/org/scribble/type/name/AmbigName.java b/scribble-core/src/main/java/org/scribble/core/type/name/AmbigName.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/type/name/AmbigName.java rename to scribble-core/src/main/java/org/scribble/core/type/name/AmbigName.java index d8f0ce9a0..5bc37ead3 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/AmbigName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/AmbigName.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; -import org.scribble.type.kind.AmbigKind; +import org.scribble.core.type.kind.AmbigKind; public class AmbigName extends AbstractName { diff --git a/scribble-core/src/main/java/org/scribble/type/name/DataType.java b/scribble-core/src/main/java/org/scribble/core/type/name/DataType.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/type/name/DataType.java rename to scribble-core/src/main/java/org/scribble/core/type/name/DataType.java index 7a953ce5f..8fa41c5cd 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/DataType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/DataType.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; -import org.scribble.type.kind.DataTypeKind; +import org.scribble.core.type.kind.DataTypeKind; // Potentially qualified/canonical payload type name; not the AST primitive identifier diff --git a/scribble-core/src/main/java/org/scribble/type/name/GDelegationType.java b/scribble-core/src/main/java/org/scribble/core/type/name/GDelegationType.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/type/name/GDelegationType.java rename to scribble-core/src/main/java/org/scribble/core/type/name/GDelegationType.java index 7dd654039..01588c41e 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/GDelegationType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/GDelegationType.java @@ -11,12 +11,12 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; import java.io.IOException; import java.io.Serializable; -import org.scribble.type.kind.Local; +import org.scribble.core.type.kind.Local; // CHECKME: factor out of name package? (and then PayloadType also needs to be moved out of name?) public class GDelegationType implements PayloadElemType, Serializable diff --git a/scribble-core/src/main/java/org/scribble/type/name/GProtocolName.java b/scribble-core/src/main/java/org/scribble/core/type/name/GProtocolName.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/type/name/GProtocolName.java rename to scribble-core/src/main/java/org/scribble/core/type/name/GProtocolName.java index 24172ab23..4c0818fb8 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/GProtocolName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/GProtocolName.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; -import org.scribble.type.kind.Global; +import org.scribble.core.type.kind.Global; public class GProtocolName extends ProtocolName diff --git a/scribble-core/src/main/java/org/scribble/type/name/Identifier.java b/scribble-core/src/main/java/org/scribble/core/type/name/Id.java similarity index 79% rename from scribble-core/src/main/java/org/scribble/type/name/Identifier.java rename to scribble-core/src/main/java/org/scribble/core/type/name/Id.java index 763767b03..3ed5bd685 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/Identifier.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/Id.java @@ -11,15 +11,15 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; -import org.scribble.type.kind.IdKind; +import org.scribble.core.type.kind.IdKind; -public class Identifier extends AbstractName +public class Id extends AbstractName { private static final long serialVersionUID = 1L; - public Identifier(String text) + public Id(String text) { super(IdKind.KIND, text); } @@ -31,17 +31,17 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof Identifier)) + if (!(o instanceof Id)) { return false; } - Identifier n = (Identifier) o; + Id n = (Id) o; return n.canEqual(this) && super.equals(o); } public boolean canEqual(Object o) { - return o instanceof Identifier; + return o instanceof Id; } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/name/LProtocolName.java b/scribble-core/src/main/java/org/scribble/core/type/name/LProtocolName.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/type/name/LProtocolName.java rename to scribble-core/src/main/java/org/scribble/core/type/name/LProtocolName.java index eb0f1459a..119da6cc2 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/LProtocolName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/LProtocolName.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; -import org.scribble.type.kind.Local; +import org.scribble.core.type.kind.Local; public class LProtocolName extends ProtocolName diff --git a/scribble-core/src/main/java/org/scribble/type/name/MemberName.java b/scribble-core/src/main/java/org/scribble/core/type/name/MemberName.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/type/name/MemberName.java rename to scribble-core/src/main/java/org/scribble/core/type/name/MemberName.java index c5f39f80c..1f6d88a23 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/MemberName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/MemberName.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; -import org.scribble.type.kind.Kind; +import org.scribble.core.type.kind.Kind; // Simple name or qualified name diff --git a/scribble-core/src/main/java/org/scribble/type/name/MessageId.java b/scribble-core/src/main/java/org/scribble/core/type/name/MessageId.java similarity index 89% rename from scribble-core/src/main/java/org/scribble/type/name/MessageId.java rename to scribble-core/src/main/java/org/scribble/core/type/name/MessageId.java index 1df7a480a..4bea5c45e 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/MessageId.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/MessageId.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; -import org.scribble.type.kind.MessageIdKind; +import org.scribble.core.type.kind.MessageIdKind; public interface MessageId extends Name diff --git a/scribble-core/src/main/java/org/scribble/type/name/MessageSigName.java b/scribble-core/src/main/java/org/scribble/core/type/name/MessageSigName.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/type/name/MessageSigName.java rename to scribble-core/src/main/java/org/scribble/core/type/name/MessageSigName.java index 53464dc30..d7ba39ccf 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/MessageSigName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/MessageSigName.java @@ -11,10 +11,10 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; -import org.scribble.type.kind.SigKind; -import org.scribble.type.session.Message; +import org.scribble.core.type.kind.SigKind; +import org.scribble.core.type.session.Message; // The name of a declared (imported) message signature member diff --git a/scribble-core/src/main/java/org/scribble/type/name/ModuleName.java b/scribble-core/src/main/java/org/scribble/core/type/name/ModuleName.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/type/name/ModuleName.java rename to scribble-core/src/main/java/org/scribble/core/type/name/ModuleName.java index b5c4cf237..61ad4f683 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/ModuleName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/ModuleName.java @@ -11,12 +11,12 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; import java.nio.file.Path; import java.nio.file.Paths; -import org.scribble.type.kind.ModuleKind; +import org.scribble.core.type.kind.ModuleKind; import org.scribble.util.Constants; // General name: simple or full (a central class for value comparison) diff --git a/scribble-core/src/main/java/org/scribble/type/name/Name.java b/scribble-core/src/main/java/org/scribble/core/type/name/Name.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/type/name/Name.java rename to scribble-core/src/main/java/org/scribble/core/type/name/Name.java index 96a4295a6..b42e1ac49 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/Name.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/Name.java @@ -11,12 +11,12 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; import java.io.Serializable; import java.util.Arrays; -import org.scribble.type.kind.Kind; +import org.scribble.core.type.kind.Kind; public interface Name extends Serializable diff --git a/scribble-core/src/main/java/org/scribble/type/name/Named.java b/scribble-core/src/main/java/org/scribble/core/type/name/Named.java similarity index 89% rename from scribble-core/src/main/java/org/scribble/type/name/Named.java rename to scribble-core/src/main/java/org/scribble/core/type/name/Named.java index 227157515..9d5043321 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/Named.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/Named.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; -import org.scribble.type.kind.Kind; +import org.scribble.core.type.kind.Kind; public interface Named diff --git a/scribble-core/src/main/java/org/scribble/type/name/Op.java b/scribble-core/src/main/java/org/scribble/core/type/name/Op.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/type/name/Op.java rename to scribble-core/src/main/java/org/scribble/core/type/name/Op.java index 2f4292134..aaeb527a6 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/Op.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/Op.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; -import org.scribble.type.kind.OpKind; +import org.scribble.core.type.kind.OpKind; public class Op extends AbstractName implements MessageId { diff --git a/scribble-core/src/main/java/org/scribble/type/name/PackageName.java b/scribble-core/src/main/java/org/scribble/core/type/name/PackageName.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/type/name/PackageName.java rename to scribble-core/src/main/java/org/scribble/core/type/name/PackageName.java index 843c1f6c5..798b2a5bb 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/PackageName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/PackageName.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; -import org.scribble.type.kind.PackageKind; +import org.scribble.core.type.kind.PackageKind; public class PackageName extends QualifiedName { diff --git a/scribble-core/src/main/java/org/scribble/type/name/PayloadElemType.java b/scribble-core/src/main/java/org/scribble/core/type/name/PayloadElemType.java similarity index 86% rename from scribble-core/src/main/java/org/scribble/type/name/PayloadElemType.java rename to scribble-core/src/main/java/org/scribble/core/type/name/PayloadElemType.java index 4107d8b08..62d0843a7 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/PayloadElemType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/PayloadElemType.java @@ -11,10 +11,10 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; -import org.scribble.type.kind.PayloadTypeKind; -import org.scribble.type.session.Arg; +import org.scribble.core.type.kind.PayloadTypeKind; +import org.scribble.core.type.session.Arg; public interface PayloadElemType extends Arg diff --git a/scribble-core/src/main/java/org/scribble/type/name/ProtocolName.java b/scribble-core/src/main/java/org/scribble/core/type/name/ProtocolName.java similarity index 92% rename from scribble-core/src/main/java/org/scribble/type/name/ProtocolName.java rename to scribble-core/src/main/java/org/scribble/core/type/name/ProtocolName.java index 51a6200f0..333c57a70 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/ProtocolName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/ProtocolName.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; -import org.scribble.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtocolKind; // Potentially qualified/canonical protocol name; not the AST primitive identifier diff --git a/scribble-core/src/main/java/org/scribble/type/name/QualifiedName.java b/scribble-core/src/main/java/org/scribble/core/type/name/QualifiedName.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/type/name/QualifiedName.java rename to scribble-core/src/main/java/org/scribble/core/type/name/QualifiedName.java index 231436556..ac819fbe8 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/QualifiedName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/QualifiedName.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; -import org.scribble.type.kind.Kind; +import org.scribble.core.type.kind.Kind; diff --git a/scribble-core/src/main/java/org/scribble/type/name/RecVar.java b/scribble-core/src/main/java/org/scribble/core/type/name/RecVar.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/type/name/RecVar.java rename to scribble-core/src/main/java/org/scribble/core/type/name/RecVar.java index da419d06d..7fdaa7257 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/RecVar.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/RecVar.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; -import org.scribble.type.kind.RecVarKind; +import org.scribble.core.type.kind.RecVarKind; // CHECKME: RecVar inconsistent with, e.g., G/LProtocolName? public class RecVar extends AbstractName //implements PathElement diff --git a/scribble-core/src/main/java/org/scribble/type/name/Role.java b/scribble-core/src/main/java/org/scribble/core/type/name/Role.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/type/name/Role.java rename to scribble-core/src/main/java/org/scribble/core/type/name/Role.java index 7c6aead9b..390cf7764 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/Role.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/Role.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; -import org.scribble.type.kind.RoleKind; +import org.scribble.core.type.kind.RoleKind; public class Role extends AbstractName // CHECKME: type.name package has no SimpleName diff --git a/scribble-core/src/main/java/org/scribble/type/name/Scope.java b/scribble-core/src/main/java/org/scribble/core/type/name/Scope.java similarity index 92% rename from scribble-core/src/main/java/org/scribble/type/name/Scope.java rename to scribble-core/src/main/java/org/scribble/core/type/name/Scope.java index b0ed6991d..3f7b97c7d 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/Scope.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/Scope.java @@ -11,11 +11,12 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; -import org.scribble.type.kind.ScopeKind; +import org.scribble.core.type.kind.ScopeKind; -// Should be a compound name? +// CHECKME: should be a compound name? +@Deprecated // Not currently used public class Scope extends AbstractName { private static final long serialVersionUID = 1L; diff --git a/scribble-core/src/main/java/org/scribble/type/name/Substitutions.java b/scribble-core/src/main/java/org/scribble/core/type/name/Substitutions.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/type/name/Substitutions.java rename to scribble-core/src/main/java/org/scribble/core/type/name/Substitutions.java index bc1608ad4..246e32798 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/Substitutions.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/Substitutions.java @@ -11,15 +11,15 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.name; +package org.scribble.core.type.name; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.session.Arg; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.session.Arg; // CHECKME: move to util? public class Substitutions diff --git a/scribble-core/src/main/java/org/scribble/type/session/Arg.java b/scribble-core/src/main/java/org/scribble/core/type/session/Arg.java similarity index 89% rename from scribble-core/src/main/java/org/scribble/type/session/Arg.java rename to scribble-core/src/main/java/org/scribble/core/type/session/Arg.java index ca0760fc4..74b2999bd 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Arg.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Arg.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session; +package org.scribble.core.type.session; -import org.scribble.type.kind.NonRoleArgKind; +import org.scribble.core.type.kind.NonRoleArgKind; // A subprotocol argument (DoArgNode): SigKind or PayloadTypeKind public interface Arg diff --git a/scribble-core/src/main/java/org/scribble/type/session/BasicInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java similarity index 84% rename from scribble-core/src/main/java/org/scribble/type/session/BasicInteraction.java rename to scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java index f799ca214..e7cb8d598 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/BasicInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java @@ -11,18 +11,18 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session; +package org.scribble.core.type.session; import java.util.Collections; import java.util.List; import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.RecVar; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.visit.STypeInliner; +import org.scribble.core.visit.STypeUnfolder; public abstract class BasicInteraction> extends STypeBase implements SType diff --git a/scribble-core/src/main/java/org/scribble/type/session/Choice.java b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java similarity index 89% rename from scribble-core/src/main/java/org/scribble/type/session/Choice.java rename to scribble-core/src/main/java/org/scribble/core/type/session/Choice.java index 5fb1080ba..442973c63 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Choice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session; +package org.scribble.core.type.session; import java.util.Collections; import java.util.List; @@ -20,15 +20,15 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.Substitutions; +import org.scribble.core.visit.STypeInliner; +import org.scribble.core.visit.STypeUnfolder; public abstract class Choice> extends STypeBase implements SType diff --git a/scribble-core/src/main/java/org/scribble/type/session/ConnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java similarity index 82% rename from scribble-core/src/main/java/org/scribble/type/session/ConnectAction.java rename to scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java index 6b792efd5..2ced8f1e9 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/ConnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java @@ -11,18 +11,18 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session; +package org.scribble.core.type.session; import java.util.LinkedList; import java.util.List; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.DataType; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.PayloadElemType; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.name.Role; public abstract class ConnectAction> extends DirectedInteraction diff --git a/scribble-core/src/main/java/org/scribble/type/session/Continue.java b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java similarity index 86% rename from scribble-core/src/main/java/org/scribble/type/session/Continue.java rename to scribble-core/src/main/java/org/scribble/core/type/session/Continue.java index 4e8b2cf5b..0cfb431e2 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Continue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session; +package org.scribble.core.type.session; import java.util.Collections; import java.util.List; @@ -20,14 +20,14 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; -import org.scribble.visit.STypeInliner; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.Substitutions; +import org.scribble.core.visit.STypeInliner; public abstract class Continue> extends STypeBase diff --git a/scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java similarity index 90% rename from scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java rename to scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java index 16a9639d0..9122b69f0 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java @@ -11,18 +11,18 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session; +package org.scribble.core.type.session; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.Substitutions; // Besides directed-ness, also features a Message public abstract class DirectedInteraction> diff --git a/scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java similarity index 89% rename from scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java rename to scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java index 464625934..1223a1094 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session; +package org.scribble.core.type.session; import java.util.Collections; import java.util.List; @@ -20,11 +20,11 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.Substitutions; // Base class would be "SymmetricInteraction" (cf., DirectedInteraction) public abstract class DisconnectAction> diff --git a/scribble-core/src/main/java/org/scribble/type/session/Do.java b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java similarity index 88% rename from scribble-core/src/main/java/org/scribble/type/session/Do.java rename to scribble-core/src/main/java/org/scribble/core/type/session/Do.java index 158de064b..c63d66dfc 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session; +package org.scribble.core.type.session; import java.util.Collections; import java.util.HashSet; @@ -22,17 +22,17 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.DataType; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; -import org.scribble.visit.STypeUnfolder; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.Substitutions; +import org.scribble.core.visit.STypeUnfolder; public abstract class Do , N extends ProtocolName> diff --git a/scribble-core/src/main/java/org/scribble/type/session/Message.java b/scribble-core/src/main/java/org/scribble/core/type/session/Message.java similarity index 82% rename from scribble-core/src/main/java/org/scribble/type/session/Message.java rename to scribble-core/src/main/java/org/scribble/core/type/session/Message.java index a856c01df..8521d6b38 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Message.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Message.java @@ -11,11 +11,11 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session; +package org.scribble.core.type.session; -import org.scribble.type.kind.MessageIdKind; -import org.scribble.type.kind.SigKind; -import org.scribble.type.name.MessageId; +import org.scribble.core.type.kind.MessageIdKind; +import org.scribble.core.type.kind.SigKind; +import org.scribble.core.type.name.MessageId; diff --git a/scribble-core/src/main/java/org/scribble/type/session/MessageSig.java b/scribble-core/src/main/java/org/scribble/core/type/session/MessageSig.java similarity index 87% rename from scribble-core/src/main/java/org/scribble/type/session/MessageSig.java rename to scribble-core/src/main/java/org/scribble/core/type/session/MessageSig.java index 238b84077..40abfd8f6 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/MessageSig.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/MessageSig.java @@ -11,12 +11,12 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session; +package org.scribble.core.type.session; -import org.scribble.type.kind.OpKind; -import org.scribble.type.kind.SigKind; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Op; +import org.scribble.core.type.kind.OpKind; +import org.scribble.core.type.kind.SigKind; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Op; public class MessageSig implements Message { diff --git a/scribble-core/src/main/java/org/scribble/type/session/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/core/type/session/MessageTransfer.java similarity index 80% rename from scribble-core/src/main/java/org/scribble/type/session/MessageTransfer.java rename to scribble-core/src/main/java/org/scribble/core/type/session/MessageTransfer.java index 40a266a07..d0848e433 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/MessageTransfer.java @@ -11,19 +11,19 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session; +package org.scribble.core.type.session; import java.util.LinkedList; import java.util.List; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.DataType; -import org.scribble.type.name.GDelegationType; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.PayloadElemType; -import org.scribble.type.name.Role; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.GDelegationType; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.name.Role; public abstract class MessageTransfer> extends DirectedInteraction diff --git a/scribble-core/src/main/java/org/scribble/type/session/Payload.java b/scribble-core/src/main/java/org/scribble/core/type/session/Payload.java similarity index 91% rename from scribble-core/src/main/java/org/scribble/type/session/Payload.java rename to scribble-core/src/main/java/org/scribble/core/type/session/Payload.java index 945f1a975..48fd7aeef 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Payload.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Payload.java @@ -11,14 +11,14 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session; +package org.scribble.core.type.session; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -import org.scribble.type.kind.PayloadTypeKind; -import org.scribble.type.name.PayloadElemType; +import org.scribble.core.type.kind.PayloadTypeKind; +import org.scribble.core.type.name.PayloadElemType; public class Payload { diff --git a/scribble-core/src/main/java/org/scribble/type/session/Recursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java similarity index 90% rename from scribble-core/src/main/java/org/scribble/type/session/Recursion.java rename to scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java index 732dc9225..f3e0e1bfa 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java @@ -11,21 +11,21 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session; +package org.scribble.core.type.session; import java.util.List; import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.Substitutions; +import org.scribble.core.visit.STypeInliner; +import org.scribble.core.visit.STypeUnfolder; public abstract class Recursion> extends STypeBase diff --git a/scribble-core/src/main/java/org/scribble/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java similarity index 80% rename from scribble-core/src/main/java/org/scribble/type/session/SType.java rename to scribble-core/src/main/java/org/scribble/core/type/session/SType.java index 2b65f0106..727346e7c 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -11,21 +11,21 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session; +package org.scribble.core.type.session; import java.util.List; import java.util.Set; -import org.scribble.lang.SNode; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; +import org.scribble.core.lang.SNode; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.Substitutions; +import org.scribble.core.visit.STypeInliner; +import org.scribble.core.visit.STypeUnfolder; // B needed(?) to factor up several methods from G/L compounds to bases, e.g., getInlined and unfoldAllOnce // Generic works to "specialise" G/L subclasses (and works with immutable pattern) -- cf. not supported by contravariant method parameter subtyping for getters/setters diff --git a/scribble-core/src/main/java/org/scribble/type/session/STypeBase.java b/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/type/session/STypeBase.java rename to scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java index 4086492ad..5248e56ba 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/STypeBase.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java @@ -11,10 +11,10 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session; +package org.scribble.core.type.session; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtocolKind; // SessTypeBase is to SessType as ScribNodeBase is to ScribNode public abstract class STypeBase> diff --git a/scribble-core/src/main/java/org/scribble/type/session/STypeFactory.java b/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java similarity index 89% rename from scribble-core/src/main/java/org/scribble/type/session/STypeFactory.java rename to scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java index 80dd9e15e..01a214ea6 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/STypeFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java @@ -11,13 +11,13 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session; +package org.scribble.core.type.session; import java.util.Arrays; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.ModuleName; -import org.scribble.type.name.PackageName; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.name.PackageName; public class STypeFactory { diff --git a/scribble-core/src/main/java/org/scribble/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java similarity index 90% rename from scribble-core/src/main/java/org/scribble/type/session/Seq.java rename to scribble-core/src/main/java/org/scribble/core/type/session/Seq.java index 3129ebb11..186da1be3 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session; +package org.scribble.core.type.session; import java.util.Collections; import java.util.LinkedList; @@ -20,15 +20,15 @@ import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.Substitutions; +import org.scribble.core.visit.STypeInliner; +import org.scribble.core.visit.STypeUnfolder; public abstract class Seq> extends STypeBase diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GChoice.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java similarity index 90% rename from scribble-core/src/main/java/org/scribble/type/session/global/GChoice.java rename to scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java index 20675ab16..e00c85d0c 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.global; +package org.scribble.core.type.session.global; import java.util.Collections; import java.util.HashMap; @@ -25,15 +25,15 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Global; -import org.scribble.type.name.Role; -import org.scribble.type.session.Choice; -import org.scribble.type.session.local.LChoice; -import org.scribble.type.session.local.LSeq; -import org.scribble.type.session.local.LSkip; -import org.scribble.type.session.local.LType; -import org.scribble.visit.global.Projector2; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.local.LChoice; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.type.session.local.LSkip; +import org.scribble.core.type.session.local.LType; +import org.scribble.core.visit.global.Projector2; public class GChoice extends Choice implements GType { diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java similarity index 84% rename from scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java rename to scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java index 95b36957e..39184bf3e 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.global; +package org.scribble.core.type.session.global; import java.util.Collections; import java.util.HashMap; @@ -20,16 +20,16 @@ import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Global; -import org.scribble.type.name.Role; -import org.scribble.type.session.ConnectAction; -import org.scribble.type.session.Message; -import org.scribble.type.session.local.LAcc; -import org.scribble.type.session.local.LReq; -import org.scribble.type.session.local.LSkip; -import org.scribble.type.session.local.LType; -import org.scribble.visit.global.Projector2; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.ConnectAction; +import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.local.LAcc; +import org.scribble.core.type.session.local.LReq; +import org.scribble.core.type.session.local.LSkip; +import org.scribble.core.type.session.local.LType; +import org.scribble.core.visit.global.Projector2; public class GConnect extends ConnectAction implements GType diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java similarity index 83% rename from scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java rename to scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java index a21a14aaa..2f2cced4c 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java @@ -11,20 +11,20 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.global; +package org.scribble.core.type.session.global; import java.util.Map; import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Global; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.session.Continue; -import org.scribble.type.session.local.LContinue; -import org.scribble.visit.STypeUnfolder; -import org.scribble.visit.global.Projector2; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Continue; +import org.scribble.core.type.session.local.LContinue; +import org.scribble.core.visit.STypeUnfolder; +import org.scribble.core.visit.global.Projector2; public class GContinue extends Continue implements GType { diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java similarity index 84% rename from scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java rename to scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java index 382987de1..f1f8c34fc 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java @@ -11,20 +11,20 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.global; +package org.scribble.core.type.session.global; import java.util.Map; import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Global; -import org.scribble.type.name.Role; -import org.scribble.type.session.DisconnectAction; -import org.scribble.type.session.local.LDisconnect; -import org.scribble.type.session.local.LSkip; -import org.scribble.type.session.local.LType; -import org.scribble.visit.global.Projector2; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.DisconnectAction; +import org.scribble.core.type.session.local.LDisconnect; +import org.scribble.core.type.session.local.LSkip; +import org.scribble.core.type.session.local.LType; +import org.scribble.core.visit.global.Projector2; public class GDisconnect extends DisconnectAction implements GType diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java similarity index 80% rename from scribble-core/src/main/java/org/scribble/type/session/global/GDo.java rename to scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java index 18ce737ed..58cd26830 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.global; +package org.scribble.core.type.session.global; import java.util.Collections; import java.util.List; @@ -20,24 +20,24 @@ import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.JobContext2; -import org.scribble.job.ScribbleException; -import org.scribble.lang.SubprotoSig; -import org.scribble.lang.global.GProtocol; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; -import org.scribble.type.session.Arg; -import org.scribble.type.session.Do; -import org.scribble.type.session.local.LDo; -import org.scribble.type.session.local.LSkip; -import org.scribble.type.session.local.LType; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.global.Projector2; +import org.scribble.core.job.JobContext; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.lang.global.GProtocol; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.Substitutions; +import org.scribble.core.type.session.Arg; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.local.LDo; +import org.scribble.core.type.session.local.LSkip; +import org.scribble.core.type.session.local.LType; +import org.scribble.core.visit.STypeInliner; +import org.scribble.core.visit.global.Projector2; public class GDo extends Do implements GType { @@ -90,7 +90,7 @@ public LType project(Projector2 v) return LSkip.SKIP; } - JobContext2 jobc = v.job.getContext(); + JobContext jobc = v.job.getContext(); //GProtocolDecl gpd = jobc.getParsed(this.proto); GProtocol gpd = jobc.getIntermediate(this.proto); Role targSelf = gpd.roles.get(this.roles.indexOf(v.self)); diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java similarity index 84% rename from scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java rename to scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java index 1632f0490..daff85386 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.global; +package org.scribble.core.type.session.global; import java.util.Collections; import java.util.HashMap; @@ -20,16 +20,16 @@ import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Global; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; -import org.scribble.type.session.MessageTransfer; -import org.scribble.type.session.local.LRcv; -import org.scribble.type.session.local.LSend; -import org.scribble.type.session.local.LSkip; -import org.scribble.type.session.local.LType; -import org.scribble.visit.global.Projector2; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.MessageTransfer; +import org.scribble.core.type.session.local.LRcv; +import org.scribble.core.type.session.local.LSend; +import org.scribble.core.type.session.local.LSkip; +import org.scribble.core.type.session.local.LType; +import org.scribble.core.visit.global.Projector2; public class GMessageTransfer extends MessageTransfer implements GType diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java similarity index 83% rename from scribble-core/src/main/java/org/scribble/type/session/global/GRecursion.java rename to scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java index 02a5c05ff..48dadacc1 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java @@ -11,23 +11,23 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.global; +package org.scribble.core.type.session.global; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Global; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.session.Recursion; -import org.scribble.type.session.local.LRecursion; -import org.scribble.type.session.local.LSeq; -import org.scribble.type.session.local.LSkip; -import org.scribble.type.session.local.LType; -import org.scribble.visit.global.Projector2; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.local.LRecursion; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.type.session.local.LSkip; +import org.scribble.core.type.session.local.LType; +import org.scribble.core.visit.global.Projector2; public class GRecursion extends Recursion implements GType { diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java similarity index 86% rename from scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java rename to scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java index d482d9986..7ed3df718 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.global; +package org.scribble.core.type.session.global; import java.util.List; import java.util.Map; @@ -20,15 +20,15 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.type.kind.Global; -import org.scribble.type.name.Role; -import org.scribble.type.session.SType; -import org.scribble.type.session.Seq; -import org.scribble.type.session.local.LSeq; -import org.scribble.type.session.local.LSkip; -import org.scribble.type.session.local.LType; -import org.scribble.visit.global.Projector2; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.Seq; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.type.session.local.LSkip; +import org.scribble.core.type.session.local.LType; +import org.scribble.core.visit.global.Projector2; public class GSeq extends Seq implements GType { diff --git a/scribble-core/src/main/java/org/scribble/type/session/global/GType.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java similarity index 85% rename from scribble-core/src/main/java/org/scribble/type/session/global/GType.java rename to scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java index df03b9019..a8d3effea 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java @@ -11,18 +11,18 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.global; +package org.scribble.core.type.session.global; import java.util.Map; import java.util.Set; -import org.scribble.job.ScribbleException; -import org.scribble.lang.global.GNode; -import org.scribble.type.kind.Global; -import org.scribble.type.name.Role; -import org.scribble.type.session.SType; -import org.scribble.type.session.local.LType; -import org.scribble.visit.global.Projector2; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.global.GNode; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.local.LType; +import org.scribble.core.visit.global.Projector2; public interface GType extends SType, GNode { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java similarity index 78% rename from scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java rename to scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java index fce7d83d8..19c246561 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LAcc.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java @@ -11,22 +11,22 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.local; +package org.scribble.core.type.session.local; import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.type.kind.Local; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.session.ConnectAction; -import org.scribble.type.session.Message; -import org.scribble.type.session.MessageSig; -import org.scribble.type.session.Payload; -import org.scribble.visit.local.ReachabilityEnv; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EGraphBuilderUtil2; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.ConnectAction; +import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.MessageSig; +import org.scribble.core.type.session.Payload; +import org.scribble.core.visit.local.ReachabilityEnv; public class LAcc extends ConnectAction implements LType { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java similarity index 89% rename from scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java rename to scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java index c802a9a3d..4c693a022 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.local; +package org.scribble.core.type.session.local; import java.util.Collections; import java.util.LinkedList; @@ -20,15 +20,15 @@ import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.kind.Local; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.session.Choice; -import org.scribble.visit.local.ReachabilityEnv; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EGraphBuilderUtil2; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Choice; +import org.scribble.core.visit.local.ReachabilityEnv; public class LChoice extends Choice implements LType { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java similarity index 86% rename from scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java rename to scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java index 23e7b7a13..ff8484f93 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java @@ -11,22 +11,22 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.local; +package org.scribble.core.type.session.local; import java.util.HashSet; import java.util.LinkedList; import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.kind.Local; -import org.scribble.type.name.RecVar; -import org.scribble.type.session.Continue; -import org.scribble.visit.STypeUnfolder; -import org.scribble.visit.local.ReachabilityEnv; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EGraphBuilderUtil2; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.session.Continue; +import org.scribble.core.visit.STypeUnfolder; +import org.scribble.core.visit.local.ReachabilityEnv; public class LContinue extends Continue implements LType { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java similarity index 83% rename from scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java rename to scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java index c3d8c8fae..6886b33fc 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java @@ -11,18 +11,18 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.local; +package org.scribble.core.type.session.local; import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.type.kind.Local; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.session.DisconnectAction; -import org.scribble.visit.local.ReachabilityEnv; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EGraphBuilderUtil2; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.DisconnectAction; +import org.scribble.core.visit.local.ReachabilityEnv; public class LDisconnect extends DisconnectAction implements LType diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java similarity index 78% rename from scribble-core/src/main/java/org/scribble/type/session/local/LDo.java rename to scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java index e8ef5f081..ff355c274 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java @@ -11,26 +11,26 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.local; +package org.scribble.core.type.session.local; import java.util.List; import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.lang.SubprotoSig; -import org.scribble.lang.local.LProtocol; -import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.type.kind.Local; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; -import org.scribble.type.session.Arg; -import org.scribble.type.session.Do; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.local.ReachabilityEnv; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.lang.local.LProtocol; +import org.scribble.core.model.endpoint.EGraphBuilderUtil2; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.Substitutions; +import org.scribble.core.type.session.Arg; +import org.scribble.core.type.session.Do; +import org.scribble.core.visit.STypeInliner; +import org.scribble.core.visit.local.ReachabilityEnv; public class LDo extends Do implements LType { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java similarity index 78% rename from scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java rename to scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java index 6d1a1acdc..0f0a29c23 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java @@ -11,22 +11,22 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.local; +package org.scribble.core.type.session.local; import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.type.kind.Local; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; -import org.scribble.type.session.MessageSig; -import org.scribble.type.session.MessageTransfer; -import org.scribble.type.session.Payload; -import org.scribble.visit.local.ReachabilityEnv; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EGraphBuilderUtil2; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.MessageSig; +import org.scribble.core.type.session.MessageTransfer; +import org.scribble.core.type.session.Payload; +import org.scribble.core.visit.local.ReachabilityEnv; public class LRcv extends MessageTransfer implements LType diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java similarity index 86% rename from scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java rename to scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java index ce0f909a7..61f51d6c0 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java @@ -11,18 +11,18 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.local; +package org.scribble.core.type.session.local; import java.util.HashSet; import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.type.kind.Local; -import org.scribble.type.name.RecVar; -import org.scribble.type.session.Recursion; -import org.scribble.visit.local.ReachabilityEnv; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EGraphBuilderUtil2; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.visit.local.ReachabilityEnv; public class LRecursion extends Recursion implements LType { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LReq.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java similarity index 78% rename from scribble-core/src/main/java/org/scribble/type/session/local/LReq.java rename to scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java index 45b96ce9a..f14e6f42b 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LReq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java @@ -11,22 +11,22 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.local; +package org.scribble.core.type.session.local; import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.type.kind.Local; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.session.ConnectAction; -import org.scribble.type.session.Message; -import org.scribble.type.session.MessageSig; -import org.scribble.type.session.Payload; -import org.scribble.visit.local.ReachabilityEnv; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EGraphBuilderUtil2; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.ConnectAction; +import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.MessageSig; +import org.scribble.core.type.session.Payload; +import org.scribble.core.visit.local.ReachabilityEnv; public class LReq extends ConnectAction implements LType diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LSend.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java similarity index 78% rename from scribble-core/src/main/java/org/scribble/type/session/local/LSend.java rename to scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java index ecc3be56c..80a06804e 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java @@ -11,22 +11,22 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.local; +package org.scribble.core.type.session.local; import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.type.kind.Local; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.session.Message; -import org.scribble.type.session.MessageSig; -import org.scribble.type.session.MessageTransfer; -import org.scribble.type.session.Payload; -import org.scribble.visit.local.ReachabilityEnv; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EGraphBuilderUtil2; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.MessageSig; +import org.scribble.core.type.session.MessageTransfer; +import org.scribble.core.type.session.Payload; +import org.scribble.core.visit.local.ReachabilityEnv; public class LSend extends MessageTransfer implements LType diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java similarity index 87% rename from scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java rename to scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java index 89ced44ce..e85e56ee1 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.local; +package org.scribble.core.type.session.local; import java.util.Collections; import java.util.Iterator; @@ -20,14 +20,14 @@ import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.model.endpoint.EState; -import org.scribble.type.kind.Local; -import org.scribble.type.name.RecVar; -import org.scribble.type.session.SType; -import org.scribble.type.session.Seq; -import org.scribble.visit.local.ReachabilityEnv; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EGraphBuilderUtil2; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.Seq; +import org.scribble.core.visit.local.ReachabilityEnv; public class LSeq extends Seq implements LType { diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java similarity index 80% rename from scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java rename to scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java index 10c8accc0..8f933006e 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java @@ -11,24 +11,24 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.local; +package org.scribble.core.type.session.local; import java.util.List; import java.util.Set; -import org.scribble.job.ScribbleException; -import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.type.kind.Local; -import org.scribble.type.name.MemberName; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.ProtocolName; -import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; -import org.scribble.type.name.Substitutions; -import org.scribble.type.session.STypeBase; -import org.scribble.visit.STypeInliner; -import org.scribble.visit.STypeUnfolder; -import org.scribble.visit.local.ReachabilityEnv; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.model.endpoint.EGraphBuilderUtil2; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.Substitutions; +import org.scribble.core.type.session.STypeBase; +import org.scribble.core.visit.STypeInliner; +import org.scribble.core.visit.STypeUnfolder; +import org.scribble.core.visit.local.ReachabilityEnv; // Used only *during* projection -- filtered out by GSeq::projection public class LSkip extends STypeBase implements LType diff --git a/scribble-core/src/main/java/org/scribble/type/session/local/LType.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java similarity index 80% rename from scribble-core/src/main/java/org/scribble/type/session/local/LType.java rename to scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java index 13f359279..9c583c69b 100644 --- a/scribble-core/src/main/java/org/scribble/type/session/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java @@ -11,17 +11,17 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.type.session.local; +package org.scribble.core.type.session.local; import java.util.Set; -import org.scribble.job.ScribbleException; -import org.scribble.lang.local.LNode; -import org.scribble.model.endpoint.EGraphBuilderUtil2; -import org.scribble.type.kind.Local; -import org.scribble.type.name.RecVar; -import org.scribble.type.session.SType; -import org.scribble.visit.local.ReachabilityEnv; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.local.LNode; +import org.scribble.core.model.endpoint.EGraphBuilderUtil2; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.session.SType; +import org.scribble.core.visit.local.ReachabilityEnv; public interface LType extends SType, LNode { diff --git a/scribble-core/src/main/java/org/scribble/visit/STypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java similarity index 92% rename from scribble-core/src/main/java/org/scribble/visit/STypeInliner.java rename to scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java index 5c4af95c0..a07b22d58 100644 --- a/scribble-core/src/main/java/org/scribble/visit/STypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.visit; +package org.scribble.core.visit; import java.util.Deque; import java.util.HashMap; @@ -19,13 +19,13 @@ import java.util.Map; import java.util.stream.Collectors; -import org.scribble.job.Job2; -import org.scribble.lang.SubprotoSig; -import org.scribble.type.name.RecVar; +import org.scribble.core.job.Job; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.type.name.RecVar; public class STypeInliner { - public final Job2 job; + public final Job job; // Basically, "SubprotocolVisitor" -- factor out? private final Deque stack = new LinkedList<>(); @@ -34,7 +34,7 @@ public class STypeInliner private Map> recvars = new HashMap<>(); private Map counter = new HashMap<>(); - public STypeInliner(Job2 job) + public STypeInliner(Job job) { this.job = job; } diff --git a/scribble-core/src/main/java/org/scribble/visit/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java similarity index 88% rename from scribble-core/src/main/java/org/scribble/visit/STypeUnfolder.java rename to scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java index 9e9d97fde..a2a3f690a 100644 --- a/scribble-core/src/main/java/org/scribble/visit/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java @@ -11,14 +11,14 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.visit; +package org.scribble.core.visit; import java.util.HashMap; import java.util.Map; -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.RecVar; -import org.scribble.type.session.Seq; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.session.Seq; // Currently once usage only, no popRec -- CHECKME: fix? // FIXME: take B, and refactor getRec diff --git a/scribble-core/src/main/java/org/scribble/visit/global/Projector2.java b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector2.java similarity index 84% rename from scribble-core/src/main/java/org/scribble/visit/global/Projector2.java rename to scribble-core/src/main/java/org/scribble/core/visit/global/Projector2.java index 2e871d71a..da8d779db 100644 --- a/scribble-core/src/main/java/org/scribble/visit/global/Projector2.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector2.java @@ -11,20 +11,20 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.visit.global; +package org.scribble.core.visit.global; -import org.scribble.job.Job2; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.ModuleName; -import org.scribble.type.name.Role; +import org.scribble.core.job.Job; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.name.Role; public class Projector2 { - public final Job2 job; + public final Job job; public final Role self; - public Projector2(Job2 job, Role self) + public Projector2(Job job, Role self) { this.job = job; this.self = self; diff --git a/scribble-core/src/main/java/org/scribble/visit/local/ReachabilityEnv.java b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityEnv.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/visit/local/ReachabilityEnv.java rename to scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityEnv.java index 03655d9d1..ebfd24087 100644 --- a/scribble-core/src/main/java/org/scribble/visit/local/ReachabilityEnv.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityEnv.java @@ -11,12 +11,12 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.visit.local; +package org.scribble.core.visit.local; import java.util.Collections; import java.util.Set; -import org.scribble.type.name.RecVar; +import org.scribble.core.type.name.RecVar; public class ReachabilityEnv { diff --git a/scribble-core/src/main/java/org/scribble/lang/SNode.java b/scribble-core/src/main/java/org/scribble/lang/SNode.java deleted file mode 100644 index 51e46ca96..000000000 --- a/scribble-core/src/main/java/org/scribble/lang/SNode.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.scribble.lang; - -import org.antlr.runtime.tree.CommonTree; - -public interface SNode -{ - boolean hasSource(); // i.e., was parsed - CommonTree getSource(); // Pre: hasSource -} diff --git a/scribble-core/src/main/java/org/scribble/lang/context/ScribNames.java b/scribble-core/src/main/java/org/scribble/lang/context/ScribNames.java deleted file mode 100644 index fe22c9409..000000000 --- a/scribble-core/src/main/java/org/scribble/lang/context/ScribNames.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.scribble.lang.context; - -import java.util.HashMap; -import java.util.Map; - -import org.scribble.type.kind.ProtocolKind; -import org.scribble.type.name.DataType; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.LProtocolName; -import org.scribble.type.name.MessageSigName; -import org.scribble.type.name.ModuleName; -import org.scribble.type.name.ProtocolName; - -// TODO: rename better -public class ScribNames -{ - // names -> fully qualified names - protected final Map modules = new HashMap<>(); - protected final Map data = new HashMap<>(); - protected final Map sigs = new HashMap<>(); - protected final Map globals = new HashMap<>(); - protected final Map locals = new HashMap<>(); - - @Override - public String toString() - { - return "(modules=" + this.modules + ", types=" + this.data + ", sigs=" + this.sigs - + ", globals=" + this.globals + ", locals=" + this.locals + ")"; - } - - public boolean isVisibleProtocolDeclName(ProtocolName visname) - { - return this.globals.containsKey(visname) || this.locals.containsKey(visname); - } - - public boolean isVisibleDataType(DataType visname) - { - return this.data.containsKey(visname); - } -} \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/lang/global/GNode.java b/scribble-core/src/main/java/org/scribble/lang/global/GNode.java deleted file mode 100644 index 0c419800e..000000000 --- a/scribble-core/src/main/java/org/scribble/lang/global/GNode.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.scribble.lang.global; - -import org.scribble.lang.SNode; - -// Mainly for GDel.translate return (to include GProtocol) -public interface GNode extends SNode -{ - -} diff --git a/scribble-core/src/main/java/org/scribble/lang/local/LNode.java b/scribble-core/src/main/java/org/scribble/lang/local/LNode.java deleted file mode 100644 index 01f40c98f..000000000 --- a/scribble-core/src/main/java/org/scribble/lang/local/LNode.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.scribble.lang.local; - -import org.scribble.lang.SNode; - -public interface LNode extends SNode -{ - -} diff --git a/scribble-core/src/main/java/org/scribble/util/ConnectedMap.java b/scribble-core/src/main/java/org/scribble/util/ConnectedMap.java index ccbfa5f4f..2273b5942 100644 --- a/scribble-core/src/main/java/org/scribble/util/ConnectedMap.java +++ b/scribble-core/src/main/java/org/scribble/util/ConnectedMap.java @@ -19,7 +19,7 @@ import java.util.Map; import java.util.Set; -import org.scribble.type.name.Role; +import org.scribble.core.type.name.Role; // FIXME: factor out with MessageIdMap // FIXME: cf, WFBuffers.connected diff --git a/scribble-core/src/main/java/org/scribble/util/MessageIdMap.java b/scribble-core/src/main/java/org/scribble/util/MessageIdMap.java index df9aa839b..58775ad3f 100644 --- a/scribble-core/src/main/java/org/scribble/util/MessageIdMap.java +++ b/scribble-core/src/main/java/org/scribble/util/MessageIdMap.java @@ -19,8 +19,8 @@ import java.util.Map; import java.util.Set; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; // Mutable public class MessageIdMap diff --git a/scribble-core/src/main/java/org/scribble/util/ScribUtil2.java b/scribble-core/src/main/java/org/scribble/util/ScribUtil2.java index b822d2574..00da4e84c 100644 --- a/scribble-core/src/main/java/org/scribble/util/ScribUtil2.java +++ b/scribble-core/src/main/java/org/scribble/util/ScribUtil2.java @@ -21,8 +21,8 @@ import java.io.InputStreamReader; import java.util.concurrent.Callable; -import org.scribble.job.RuntimeScribbleException; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.job.ScribbleException; public class ScribUtil2 { diff --git a/scribble-dist/pom.xml b/scribble-dist/pom.xml index 34173239a..169eaac9f 100644 --- a/scribble-dist/pom.xml +++ b/scribble-dist/pom.xml @@ -29,7 +29,7 @@ org.scribble - scribble-lang + scribble-ast org.scribble diff --git a/scribble-main/pom.xml b/scribble-main/pom.xml index 816151316..adde93713 100644 --- a/scribble-main/pom.xml +++ b/scribble-main/pom.xml @@ -26,7 +26,7 @@ org.scribble - scribble-lang + scribble-ast junit diff --git a/scribble-main/src/main/java/org/scribble/main/MainContext.java b/scribble-main/src/main/java/org/scribble/main/Main.java similarity index 89% rename from scribble-main/src/main/java/org/scribble/main/MainContext.java rename to scribble-main/src/main/java/org/scribble/main/Main.java index c180bb44c..d70701214 100644 --- a/scribble-main/src/main/java/org/scribble/main/MainContext.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -27,29 +27,30 @@ import org.scribble.ast.ImportDecl; import org.scribble.ast.ImportModule; import org.scribble.ast.Module; -import org.scribble.job.Job; -import org.scribble.job.JobConfig; -import org.scribble.job.ScribbleException; -import org.scribble.lang.context.ModuleContext; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.model.endpoint.EModelFactory; +import org.scribble.core.model.endpoint.EModelFactoryImpl; +import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.global.SModelFactoryImpl; +import org.scribble.core.type.name.ModuleName; +import org.scribble.lang.Lang; +import org.scribble.lang.LangConfig; import org.scribble.lang.context.ModuleContextMaker; -import org.scribble.main.resource.DirectoryResourceLocator; import org.scribble.main.resource.InlineResource; import org.scribble.main.resource.Resource; -import org.scribble.main.resource.ResourceLocator; -import org.scribble.model.endpoint.EModelFactory; -import org.scribble.model.endpoint.EModelFactoryImpl; -import org.scribble.model.global.SModelFactory; -import org.scribble.model.global.SModelFactoryImpl; +import org.scribble.main.resource.loader.ScribModuleLoader; +import org.scribble.main.resource.locator.DirectoryResourceLocator; +import org.scribble.main.resource.locator.ResourceLocator; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ScribbleAntlrWrapper; -import org.scribble.type.name.ModuleName; import org.scribble.util.Pair; import org.scribble.util.ScribParserException; // Scribble tool context for main module // MainContext takes ResourceLocator abstractly (e.g. DirectoryResourceLocator), but because abstract Resource itself works off paths, it takes mainpath (rather than something more abstract, e.g. URI, to identify the "main" resource) // Resource and ResourceLocator should be made abstract from (file)paths (cf. use of toPath in ScribbleModuleLoader) -public class MainContext +public class Main { // HERE FIXME: refactor constructors/init @@ -66,7 +67,7 @@ public class MainContext //protected final JScribbleApiGen jgen; // No: API gen depends on the Job //public final boolean jUnit; - private JobConfig config; + private LangConfig config; private final ResourceLocator locator; // Path -> Resource private final ScribModuleLoader loader; // sesstype.ModuleName -> Pair @@ -78,7 +79,7 @@ public class MainContext private final Map> parsed = new HashMap<>(); // TODO: make Path abstract as e.g. URI -- locator is abstract but Path is coupled to concrete DirectoryResourceLocator - private MainContext(boolean debug, ResourceLocator locator, boolean useOldWF, + private Main(boolean debug, ResourceLocator locator, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) @@ -89,7 +90,7 @@ private MainContext(boolean debug, ResourceLocator locator, boolean useOldWF, } // Load main module from file system - public MainContext(boolean debug, ResourceLocator locator, Path mainpath, + public Main(boolean debug, ResourceLocator locator, Path mainpath, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) @@ -125,7 +126,7 @@ public MainContext(boolean debug, ResourceLocator locator, Path mainpath, } // For inline module arg - public MainContext(boolean debug, ResourceLocator locator, String inline, + public Main(boolean debug, ResourceLocator locator, String inline, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) @@ -163,7 +164,7 @@ private void init( // TODO CHECKME: main modname comes from the inlined moddecl -- check for issues if this clashes with an existing file system resource loadAllModules(p); // Populates this.parsed - this.config = new JobConfig(debug, main, useOldWF, noLiveness, minEfsm, + this.config = new LangConfig(debug, main, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin, this.af, this.ef, this.sf); @@ -181,9 +182,9 @@ private void init( } // A Scribble extension should override these "new" methods as appropriate. - public Job newJob() + public Lang newJob() { - return new Job(this.getParsedModules(), this.mctxts, this.config); + return new Lang(this.getParsedModules(), this.mctxts, this.config); } protected ScribbleAntlrWrapper newAntlrParser() diff --git a/scribble-main/src/main/java/org/scribble/main/DefaultModuleLoader.java b/scribble-main/src/main/java/org/scribble/main/resource/loader/DefaultModuleLoader.java similarity index 92% rename from scribble-main/src/main/java/org/scribble/main/DefaultModuleLoader.java rename to scribble-main/src/main/java/org/scribble/main/resource/loader/DefaultModuleLoader.java index e5452aa89..5b1a0c2e9 100644 --- a/scribble-main/src/main/java/org/scribble/main/DefaultModuleLoader.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/loader/DefaultModuleLoader.java @@ -11,13 +11,13 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.main; +package org.scribble.main.resource.loader; import org.scribble.ast.AstFactory; import org.scribble.ast.Module; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.ModuleName; import org.scribble.main.resource.Resource; -import org.scribble.type.name.ModuleName; import org.scribble.util.Pair; import org.scribble.util.ScribParserException; diff --git a/scribble-main/src/main/java/org/scribble/main/ModuleLoader.java b/scribble-main/src/main/java/org/scribble/main/resource/loader/ModuleLoader.java similarity index 91% rename from scribble-main/src/main/java/org/scribble/main/ModuleLoader.java rename to scribble-main/src/main/java/org/scribble/main/resource/loader/ModuleLoader.java index 0b92fc933..da851cd6c 100644 --- a/scribble-main/src/main/java/org/scribble/main/ModuleLoader.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/loader/ModuleLoader.java @@ -11,13 +11,13 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.main; +package org.scribble.main.resource.loader; import org.scribble.ast.AstFactory; import org.scribble.ast.Module; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.ModuleName; import org.scribble.main.resource.Resource; -import org.scribble.type.name.ModuleName; import org.scribble.util.Pair; import org.scribble.util.ScribParserException; diff --git a/scribble-main/src/main/java/org/scribble/main/ScribModuleLoader.java b/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java similarity index 92% rename from scribble-main/src/main/java/org/scribble/main/ScribModuleLoader.java rename to scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java index 79532b931..b66789aaf 100644 --- a/scribble-main/src/main/java/org/scribble/main/ScribModuleLoader.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java @@ -11,15 +11,15 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.main; +package org.scribble.main.resource.loader; import org.scribble.ast.AstFactory; import org.scribble.ast.Module; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.ModuleName; import org.scribble.main.resource.Resource; -import org.scribble.main.resource.ResourceLocator; +import org.scribble.main.resource.locator.ResourceLocator; import org.scribble.parser.scribble.ScribbleAntlrWrapper; -import org.scribble.type.name.ModuleName; import org.scribble.util.Pair; import org.scribble.util.ScribParserException; diff --git a/scribble-main/src/main/java/org/scribble/main/resource/DirectoryResourceLocator.java b/scribble-main/src/main/java/org/scribble/main/resource/locator/DirectoryResourceLocator.java similarity index 94% rename from scribble-main/src/main/java/org/scribble/main/resource/DirectoryResourceLocator.java rename to scribble-main/src/main/java/org/scribble/main/resource/locator/DirectoryResourceLocator.java index aaa4f6105..7d9349983 100644 --- a/scribble-main/src/main/java/org/scribble/main/resource/DirectoryResourceLocator.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/locator/DirectoryResourceLocator.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.main.resource; +package org.scribble.main.resource.locator; import java.io.IOException; import java.nio.file.Files; @@ -19,7 +19,8 @@ import java.util.LinkedList; import java.util.List; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.main.resource.FileResource; /** * This class provides a directory based resource locator. diff --git a/scribble-main/src/main/java/org/scribble/main/resource/IResourceLocator.java b/scribble-main/src/main/java/org/scribble/main/resource/locator/IResourceLocator.java similarity index 89% rename from scribble-main/src/main/java/org/scribble/main/resource/IResourceLocator.java rename to scribble-main/src/main/java/org/scribble/main/resource/locator/IResourceLocator.java index bbda4686a..24bae2495 100644 --- a/scribble-main/src/main/java/org/scribble/main/resource/IResourceLocator.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/locator/IResourceLocator.java @@ -11,11 +11,12 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.main.resource; +package org.scribble.main.resource.locator; import java.nio.file.Path; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.main.resource.Resource; /** diff --git a/scribble-main/src/main/java/org/scribble/main/resource/ResourceLocator.java b/scribble-main/src/main/java/org/scribble/main/resource/locator/ResourceLocator.java similarity index 93% rename from scribble-main/src/main/java/org/scribble/main/resource/ResourceLocator.java rename to scribble-main/src/main/java/org/scribble/main/resource/locator/ResourceLocator.java index 00438bfca..86f2c69af 100644 --- a/scribble-main/src/main/java/org/scribble/main/resource/ResourceLocator.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/locator/ResourceLocator.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.main.resource; +package org.scribble.main.resource.locator; public abstract class ResourceLocator implements IResourceLocator diff --git a/scribble-parser/pom.xml b/scribble-parser/pom.xml index 4f2738b88..926914e15 100644 --- a/scribble-parser/pom.xml +++ b/scribble-parser/pom.xml @@ -20,7 +20,7 @@ org.scribble - scribble-lang + scribble-ast diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModuleDecl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModuleDecl.java index e0b4512db..e412ac5ed 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModuleDecl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModuleDecl.java @@ -21,8 +21,8 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.ModuleDecl; import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.core.type.kind.ModuleKind; import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.type.kind.ModuleKind; public class AntlrModuleDecl { diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleParamDecl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleParamDecl.java index baad8514d..289ece86d 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleParamDecl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleParamDecl.java @@ -17,13 +17,13 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.NonRoleParamDecl; import org.scribble.ast.name.simple.NonRoleParamNode; +import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.kind.Kind; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.kind.SigKind; import org.scribble.parser.scribble.ScribbleAntlrConstants; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ast.name.AntlrSimpleName; -import org.scribble.type.kind.DataTypeKind; -import org.scribble.type.kind.Kind; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.kind.SigKind; public class AntlrNonRoleParamDecl { diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleParamDeclList.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleParamDeclList.java index 0b9e75f2d..8e194d1ef 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleParamDeclList.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleParamDeclList.java @@ -21,9 +21,9 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.NonRoleParamDecl; import org.scribble.ast.NonRoleParamDeclList; +import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.AntlrToScribParserUtil; -import org.scribble.type.kind.NonRoleParamKind; import org.scribble.util.ScribParserException; public class AntlrNonRoleParamDeclList diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrQualifiedName.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrQualifiedName.java index 2ebb64b6c..e8617862b 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrQualifiedName.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrQualifiedName.java @@ -20,11 +20,11 @@ import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.type.kind.DataTypeKind; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.Local; -import org.scribble.type.kind.ModuleKind; -import org.scribble.type.kind.SigKind; +import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.kind.ModuleKind; +import org.scribble.core.type.kind.SigKind; public class AntlrQualifiedName { diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java index b5d2f6042..196b6cfde 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java @@ -24,16 +24,16 @@ import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.kind.ModuleKind; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.kind.OpKind; +import org.scribble.core.type.kind.RecVarKind; +import org.scribble.core.type.kind.RoleKind; +import org.scribble.core.type.kind.SigKind; import org.scribble.parser.scribble.ScribbleAntlrConstants; -import org.scribble.type.kind.DataTypeKind; -import org.scribble.type.kind.Global; -import org.scribble.type.kind.Local; -import org.scribble.type.kind.ModuleKind; -import org.scribble.type.kind.NonRoleParamKind; -import org.scribble.type.kind.OpKind; -import org.scribble.type.kind.RecVarKind; -import org.scribble.type.kind.RoleKind; -import org.scribble.type.kind.SigKind; public class AntlrSimpleName { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java index 0c91ee2c2..db2228e9c 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/ScribOutputEvent.java @@ -13,8 +13,8 @@ */ package org.scribble.runtime.handlers; -import org.scribble.type.name.Op; -import org.scribble.type.name.Role; +import org.scribble.core.type.name.Op; +import org.scribble.core.type.name.Role; // FIXME: make interface and add to bounds of output icallback -- cf. CBEndpointApiGenerator // FIXME: not serializable due to RoleKind (in Role) diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribInputState.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribInputState.java index 6ca2d5ef7..82561cc76 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribInputState.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribInputState.java @@ -13,7 +13,7 @@ */ package org.scribble.runtime.handlers.states; -import org.scribble.type.name.Role; +import org.scribble.core.type.name.Role; abstract public class ScribInputState extends ScribState { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribState.java b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribState.java index fd66f16ac..29f3712be 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribState.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/handlers/states/ScribState.java @@ -16,7 +16,7 @@ import java.util.HashMap; import java.util.Map; -import org.scribble.type.name.Op; +import org.scribble.core.type.name.Op; abstract public class ScribState { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/message/ScribInterrupt.java b/scribble-runtime/src/main/java/org/scribble/runtime/message/ScribInterrupt.java index 0196e3946..eb0f4968d 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/message/ScribInterrupt.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/message/ScribInterrupt.java @@ -13,7 +13,7 @@ */ package org.scribble.runtime.message; -import org.scribble.type.name.Op; +import org.scribble.core.type.name.Op; public class ScribInterrupt extends ScribMessage { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/message/ScribMessage.java b/scribble-runtime/src/main/java/org/scribble/runtime/message/ScribMessage.java index 898539c96..11a07ad0d 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/message/ScribMessage.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/message/ScribMessage.java @@ -17,7 +17,7 @@ import java.util.Arrays; import java.util.stream.Collectors; -import org.scribble.type.name.Op; +import org.scribble.core.type.name.Op; public class ScribMessage implements Serializable { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelEndpoint.java index 316412d9f..1797ec8fe 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelEndpoint.java @@ -21,7 +21,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -import org.scribble.job.RuntimeScribbleException; +import org.scribble.core.job.RuntimeScribbleException; import org.scribble.runtime.message.ScribInterrupt; import org.scribble.runtime.message.ScribMessage; import org.scribble.runtime.session.SessionEndpoint; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/SocketEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/SocketEndpoint.java index 2f5883541..34f210b9c 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/SocketEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/SocketEndpoint.java @@ -16,9 +16,9 @@ import java.io.DataInputStream; import java.io.IOException; +import org.scribble.core.type.name.Role; import org.scribble.runtime.message.ScribMessage; import org.scribble.runtime.session.MPSTEndpoint; -import org.scribble.type.name.Role; // Read/write Objects on the binary connection to an endpoint in the session @Deprecated diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java index c82c01d0e..4ced461d3 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java @@ -22,6 +22,7 @@ import java.util.concurrent.TimeoutException; import java.util.function.Function; +import org.scribble.core.type.name.Role; import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.handlers.ScribBranch; import org.scribble.runtime.handlers.ScribOutputEvent; @@ -32,7 +33,6 @@ import org.scribble.runtime.handlers.states.ScribState; import org.scribble.runtime.message.ScribMessage; import org.scribble.runtime.message.ScribMessageFormatter; -import org.scribble.type.name.Role; public class CBEndpoint extends MPSTEndpoint { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/EndpointInputQueues.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/EndpointInputQueues.java index 7f626d378..3ebc38aed 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/EndpointInputQueues.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/EndpointInputQueues.java @@ -20,10 +20,10 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; -import org.scribble.job.RuntimeScribbleException; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.type.name.Role; import org.scribble.runtime.message.ScribInterrupt; import org.scribble.runtime.message.ScribMessage; -import org.scribble.type.name.Role; @Deprecated public class EndpointInputQueues diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/ExplicitEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/ExplicitEndpoint.java index 56cdccb27..ef3c1e481 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/ExplicitEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/ExplicitEndpoint.java @@ -15,9 +15,9 @@ import java.io.IOException; +import org.scribble.core.type.name.Role; import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.message.ScribMessageFormatter; -import org.scribble.type.name.Role; public class ExplicitEndpoint extends SessionEndpoint { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/MPSTEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/MPSTEndpoint.java index e64fcada9..1c6708aa5 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/MPSTEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/MPSTEndpoint.java @@ -17,11 +17,11 @@ import java.net.UnknownHostException; import java.util.concurrent.Callable; +import org.scribble.core.type.name.Role; import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.message.ScribMessageFormatter; import org.scribble.runtime.net.BinaryChannelEndpoint; import org.scribble.runtime.net.ScribServerSocket; -import org.scribble.type.name.Role; // FIXME: factor out between role-endpoint based socket and channel-endpoint sockets //.. initiator and joiner endpoints diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/Principal.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/Principal.java index be683f158..0f9d52675 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/Principal.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/Principal.java @@ -15,7 +15,7 @@ import java.io.Serializable; -import org.scribble.type.name.Role; +import org.scribble.core.type.name.Role; @Deprecated public class Principal implements Serializable diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/ScribInputSelector.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/ScribInputSelector.java index 263570d1f..5041da9e9 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/ScribInputSelector.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/ScribInputSelector.java @@ -20,8 +20,8 @@ import java.nio.channels.spi.AbstractSelectableChannel; import java.util.Set; +import org.scribble.core.type.name.Role; import org.scribble.runtime.net.BinaryChannelEndpoint; -import org.scribble.type.name.Role; public class ScribInputSelector extends Thread { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java index 2e348304d..da2dee9a6 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java @@ -19,10 +19,10 @@ import java.util.Map; import java.util.Random; -import org.scribble.job.ScribbleException; +import org.scribble.core.job.ScribbleException; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.Role; import org.scribble.main.ScribbleRuntimeException; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; public abstract class Session { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java index e3f19f4ec..a1672213b 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java @@ -20,14 +20,14 @@ import java.util.Map; import java.util.Set; -import org.scribble.job.RuntimeScribbleException; +import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.core.type.name.Role; import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.message.ScribMessageFormatter; import org.scribble.runtime.net.BinaryChannelEndpoint; import org.scribble.runtime.net.BinaryChannelWrapper; import org.scribble.runtime.net.ScribServerSocket; import org.scribble.runtime.util.Buf; -import org.scribble.type.name.Role; // FIXME: factor out between role-endpoint based socket and channel-endpoint sockets //.. initiator and joiner endpoints diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/AcceptSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/AcceptSocket.java index 9479e3064..5fa32b9e8 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/AcceptSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/AcceptSocket.java @@ -15,12 +15,12 @@ import java.io.IOException; +import org.scribble.core.type.name.Role; import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.net.ScribServerSocket; import org.scribble.runtime.session.MPSTEndpoint; import org.scribble.runtime.session.Session; import org.scribble.runtime.session.SessionEndpoint; -import org.scribble.type.name.Role; public abstract class AcceptSocket extends LinearSocket { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/AffineSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/AffineSocket.java index 13708e61f..fd1d1a5c5 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/AffineSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/AffineSocket.java @@ -13,9 +13,9 @@ */ package org.scribble.runtime.statechans; +import org.scribble.core.type.name.Role; import org.scribble.runtime.session.MPSTEndpoint; import org.scribble.runtime.session.Session; -import org.scribble.type.name.Role; @Deprecated public abstract class AffineSocket extends LinearSocket diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/BranchSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/BranchSocket.java index 24f07d24c..80acc14fa 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/BranchSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/BranchSocket.java @@ -13,9 +13,9 @@ */ package org.scribble.runtime.statechans; +import org.scribble.core.type.name.Role; import org.scribble.runtime.session.Session; import org.scribble.runtime.session.SessionEndpoint; -import org.scribble.type.name.Role; public abstract class BranchSocket extends ReceiveSocket { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/CaseSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/CaseSocket.java index f31a31166..f502d8c03 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/CaseSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/CaseSocket.java @@ -13,9 +13,9 @@ */ package org.scribble.runtime.statechans; +import org.scribble.core.type.name.Role; import org.scribble.runtime.session.Session; import org.scribble.runtime.session.SessionEndpoint; -import org.scribble.type.name.Role; // For "receiving" the payloads after a branch is done public abstract class CaseSocket extends LinearSocket // No I/O induced by this socket itself (i.e. not a ReceiveSocket) diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ConnectSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ConnectSocket.java index 4cf2a8309..29a04e073 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ConnectSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ConnectSocket.java @@ -17,11 +17,11 @@ import java.net.UnknownHostException; import java.util.concurrent.Callable; +import org.scribble.core.type.name.Role; import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.net.BinaryChannelEndpoint; import org.scribble.runtime.session.MPSTEndpoint; import org.scribble.runtime.session.Session; -import org.scribble.type.name.Role; @Deprecated public abstract class ConnectSocket extends LinearSocket diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/EndSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/EndSocket.java index 4b6fbe8d8..3af9f60af 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/EndSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/EndSocket.java @@ -13,10 +13,10 @@ */ package org.scribble.runtime.statechans; +import org.scribble.core.type.name.Role; import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.session.Session; import org.scribble.runtime.session.SessionEndpoint; -import org.scribble.type.name.Role; public abstract class EndSocket extends ScribSocket { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/InitSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/InitSocket.java index 1856c1dc0..aabf52ef6 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/InitSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/InitSocket.java @@ -17,12 +17,12 @@ import java.net.UnknownHostException; import java.util.concurrent.Callable; +import org.scribble.core.type.name.Role; import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.net.BinaryChannelEndpoint; import org.scribble.runtime.net.ScribServerSocket; import org.scribble.runtime.session.MPSTEndpoint; import org.scribble.runtime.session.Session; -import org.scribble.type.name.Role; // Establishing transport connections handled in here and wrapped up in SocketWrapper @Deprecated diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/LinearSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/LinearSocket.java index b30172754..04efc5fc8 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/LinearSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/LinearSocket.java @@ -16,11 +16,11 @@ import java.io.IOException; import java.util.concurrent.Callable; +import org.scribble.core.type.name.Role; import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.net.BinaryChannelWrapper; import org.scribble.runtime.session.Session; import org.scribble.runtime.session.SessionEndpoint; -import org.scribble.type.name.Role; // Not AutoClosable -- leave that to InitSocket public abstract class LinearSocket extends ScribSocket diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/OutputSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/OutputSocket.java index 0132acdff..4eccc9e55 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/OutputSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/OutputSocket.java @@ -17,14 +17,14 @@ import java.net.UnknownHostException; import java.util.concurrent.Callable; +import org.scribble.core.type.name.Op; +import org.scribble.core.type.name.Role; import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.message.ScribMessage; import org.scribble.runtime.net.BinaryChannelEndpoint; import org.scribble.runtime.session.MPSTEndpoint; import org.scribble.runtime.session.Session; import org.scribble.runtime.session.SessionEndpoint; -import org.scribble.type.name.Op; -import org.scribble.type.name.Role; public abstract class OutputSocket extends LinearSocket { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ReceiveSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ReceiveSocket.java index 4847e504b..760b98b2e 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ReceiveSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ReceiveSocket.java @@ -17,11 +17,11 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import org.scribble.core.type.name.Role; import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.message.ScribMessage; import org.scribble.runtime.session.Session; import org.scribble.runtime.session.SessionEndpoint; -import org.scribble.type.name.Role; public abstract class ReceiveSocket extends LinearSocket { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ScribSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ScribSocket.java index d8a7ba3d4..ec296ac75 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ScribSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ScribSocket.java @@ -13,9 +13,9 @@ */ package org.scribble.runtime.statechans; +import org.scribble.core.type.name.Role; import org.scribble.runtime.session.Session; import org.scribble.runtime.session.SessionEndpoint; -import org.scribble.type.name.Role; // FIXME: rename package (and class?) to statechans -- cf., handlers package public abstract class ScribSocket diff --git a/scribble-test/pom.xml b/scribble-test/pom.xml index 32020d086..86fb26dbd 100644 --- a/scribble-test/pom.xml +++ b/scribble-test/pom.xml @@ -28,7 +28,7 @@ org.scribble - scribble-lang + scribble-ast org.scribble diff --git a/scribble-test/src/test/java/org/scribble/cli/ExecUtil.java b/scribble-test/src/test/java/org/scribble/test/ExecUtil.java similarity index 99% rename from scribble-test/src/test/java/org/scribble/cli/ExecUtil.java rename to scribble-test/src/test/java/org/scribble/test/ExecUtil.java index df3b0ed2c..0d4accb1e 100644 --- a/scribble-test/src/test/java/org/scribble/cli/ExecUtil.java +++ b/scribble-test/src/test/java/org/scribble/test/ExecUtil.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.cli; +package org.scribble.test; import java.io.File; import java.io.IOException; diff --git a/scribble-test/src/test/java/org/scribble/cli/Harness.java b/scribble-test/src/test/java/org/scribble/test/Harness.java similarity index 99% rename from scribble-test/src/test/java/org/scribble/cli/Harness.java rename to scribble-test/src/test/java/org/scribble/test/Harness.java index d8bb9d3ee..e153f17f4 100644 --- a/scribble-test/src/test/java/org/scribble/cli/Harness.java +++ b/scribble-test/src/test/java/org/scribble/test/Harness.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.cli; +package org.scribble.test; import java.io.File; import java.util.Collection; diff --git a/scribble-test/src/test/java/org/scribble/cli/IgnoredDirectoryWhenFilter.java b/scribble-test/src/test/java/org/scribble/test/IgnoredDirectoryWhenFilter.java similarity index 97% rename from scribble-test/src/test/java/org/scribble/cli/IgnoredDirectoryWhenFilter.java rename to scribble-test/src/test/java/org/scribble/test/IgnoredDirectoryWhenFilter.java index 66ed4761e..8e034c56a 100644 --- a/scribble-test/src/test/java/org/scribble/cli/IgnoredDirectoryWhenFilter.java +++ b/scribble-test/src/test/java/org/scribble/test/IgnoredDirectoryWhenFilter.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.cli; +package org.scribble.test; import java.io.File; import java.io.FileFilter; diff --git a/scribble-test/src/test/java/org/scribble/cli/JavaProcessBuilder.java b/scribble-test/src/test/java/org/scribble/test/JavaProcessBuilder.java similarity index 99% rename from scribble-test/src/test/java/org/scribble/cli/JavaProcessBuilder.java rename to scribble-test/src/test/java/org/scribble/test/JavaProcessBuilder.java index 098860927..40f35b6bf 100644 --- a/scribble-test/src/test/java/org/scribble/cli/JavaProcessBuilder.java +++ b/scribble-test/src/test/java/org/scribble/test/JavaProcessBuilder.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.cli; +package org.scribble.test; import java.io.File; import java.util.ArrayList; diff --git a/scribble-test/src/test/java/org/scribble/cli/ScribAllTest.java b/scribble-test/src/test/java/org/scribble/test/ScribAllTest.java similarity index 98% rename from scribble-test/src/test/java/org/scribble/cli/ScribAllTest.java rename to scribble-test/src/test/java/org/scribble/test/ScribAllTest.java index e610e0777..47afda3cf 100644 --- a/scribble-test/src/test/java/org/scribble/cli/ScribAllTest.java +++ b/scribble-test/src/test/java/org/scribble/test/ScribAllTest.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.cli; +package org.scribble.test; import java.util.Collection; import java.util.LinkedList; diff --git a/scribble-test/src/test/java/org/scribble/cli/ScribBadTest.java b/scribble-test/src/test/java/org/scribble/test/ScribBadTest.java similarity index 98% rename from scribble-test/src/test/java/org/scribble/cli/ScribBadTest.java rename to scribble-test/src/test/java/org/scribble/test/ScribBadTest.java index a22b4a1cb..ae15719e1 100644 --- a/scribble-test/src/test/java/org/scribble/cli/ScribBadTest.java +++ b/scribble-test/src/test/java/org/scribble/test/ScribBadTest.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.cli; +package org.scribble.test; import java.util.Collection; diff --git a/scribble-test/src/test/java/org/scribble/cli/ScribGoodTest.java b/scribble-test/src/test/java/org/scribble/test/ScribGoodTest.java similarity index 98% rename from scribble-test/src/test/java/org/scribble/cli/ScribGoodTest.java rename to scribble-test/src/test/java/org/scribble/test/ScribGoodTest.java index 1eeb26133..22203cc43 100644 --- a/scribble-test/src/test/java/org/scribble/cli/ScribGoodTest.java +++ b/scribble-test/src/test/java/org/scribble/test/ScribGoodTest.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.cli; +package org.scribble.test; import java.util.Collection; diff --git a/scribble-test/src/test/java/org/scribble/cli/ScribTestBase.java b/scribble-test/src/test/java/org/scribble/test/ScribTestBase.java similarity index 93% rename from scribble-test/src/test/java/org/scribble/cli/ScribTestBase.java rename to scribble-test/src/test/java/org/scribble/test/ScribTestBase.java index d40b340be..cd3ea4f85 100644 --- a/scribble-test/src/test/java/org/scribble/cli/ScribTestBase.java +++ b/scribble-test/src/test/java/org/scribble/test/ScribTestBase.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.cli; +package org.scribble.test; import java.io.File; import java.io.IOException; @@ -19,8 +19,11 @@ import org.junit.Assert; import org.junit.Test; -import org.scribble.job.AntlrSourceException; -import org.scribble.job.ScribbleException; +import org.scribble.cli.CLArgParser; +import org.scribble.cli.CommandLine; +import org.scribble.cli.CommandLineException; +import org.scribble.core.job.AntlrSourceException; +import org.scribble.core.job.ScribbleException; /* * Packaging following pattern of putting tests into same package but different directory as classes being tested: From 5cd1740c6199ace3c0ebe72a537878c3e6dfcfe5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 5 Apr 2019 20:26:21 +0100 Subject: [PATCH 174/539] Continued: started cleaning up parser classes. --- .../src/main/java/org/scribble/main/Main.java | 8 +- .../parser/scribble/ScribbleAntlrWrapper.java | 21 ++++ .../parser/scribble/AntlrToScribParser.java | 104 ------------------ .../scribble/ast/AntlrDataTypeDecl.java | 66 ----------- .../scribble/ast/AntlrExtIdentifier.java | 25 ----- .../scribble/ast/AntlrImportModule.java | 53 --------- .../parser/scribble/ast/AntlrMessageSig.java | 46 -------- .../scribble/ast/AntlrMessageSigDecl.java | 67 ----------- .../parser/scribble/ast/AntlrModule.java | 88 --------------- .../parser/scribble/ast/AntlrModuleDecl.java | 49 --------- .../scribble/ast/AntlrNonRoleArgList.java | 95 ---------------- .../scribble/ast/AntlrNonRoleParamDecl.java | 81 -------------- .../ast/AntlrNonRoleParamDeclList.java | 50 --------- .../scribble/ast/AntlrPayloadElemList.java | 97 ---------------- .../parser/scribble/ast/AntlrRoleArg.java | 37 ------- .../parser/scribble/ast/AntlrRoleArgList.java | 44 -------- .../parser/scribble/ast/AntlrRoleDecl.java | 38 ------- .../scribble/ast/AntlrRoleDeclList.java | 44 -------- .../scribble/ast/global/AntlrGChoice.java | 57 ---------- .../scribble/ast/global/AntlrGConnect.java | 55 --------- .../scribble/ast/global/AntlrGContinue.java | 37 ------- .../scribble/ast/global/AntlrGDisconnect.java | 45 -------- .../parser/scribble/ast/global/AntlrGDo.java | 54 --------- .../ast/global/AntlrGInteractionSequence.java | 48 -------- .../ast/global/AntlrGMessageTransfer.java | 77 ------------- .../ast/global/AntlrGProtocolBlock.java | 37 ------- .../ast/global/AntlrGProtocolDecl.java | 91 --------------- .../ast/global/AntlrGProtocolDefinition.java | 37 ------- .../ast/global/AntlrGProtocolHeader.java | 54 --------- .../scribble/ast/global/AntlrGRecursion.java | 46 -------- .../scribble/ast/global/AntlrGWrap.java | 45 -------- .../scribble/ast/name/AntlrAmbigName.java | 37 ------- .../scribble/ast/name/AntlrQualifiedName.java | 66 ----------- .../scribble/ast/name/AntlrSimpleName.java | 92 ---------------- .../scribble/ast/tree/MyCommonTree.java | 50 --------- 35 files changed, 22 insertions(+), 1919 deletions(-) delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrDataTypeDecl.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrExtIdentifier.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrImportModule.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrMessageSig.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrMessageSigDecl.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModule.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModuleDecl.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleArgList.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleParamDecl.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleParamDeclList.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrPayloadElemList.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrRoleArg.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrRoleArgList.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrRoleDecl.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrRoleDeclList.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGChoice.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGConnect.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGContinue.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGDisconnect.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGDo.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGInteractionSequence.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGMessageTransfer.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolBlock.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDecl.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDefinition.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolHeader.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGRecursion.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGWrap.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrAmbigName.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrQualifiedName.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ast/tree/MyCommonTree.java diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index d70701214..12e4f06d5 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -42,7 +42,6 @@ import org.scribble.main.resource.loader.ScribModuleLoader; import org.scribble.main.resource.locator.DirectoryResourceLocator; import org.scribble.main.resource.locator.ResourceLocator; -import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ScribbleAntlrWrapper; import org.scribble.util.Pair; import org.scribble.util.ScribParserException; @@ -58,7 +57,7 @@ public class Main // Only "manually" used here for loading main module (which should be factored out to front end) -- otherwise, only used within loader protected final ScribbleAntlrWrapper antlrParser = newAntlrParser(); // Not encapsulated inside ScribbleParser, because ScribbleParser's main function is to "parse" ANTLR CommonTrees into ModelNodes - protected final AntlrToScribParser scribParser = newScribParser(); + //protected final AntlrToScribParser scribParser = newScribParser(); protected final AstFactory af = newAstFactory(); protected final EModelFactory ef = newEModelFactory(); @@ -192,11 +191,6 @@ protected ScribbleAntlrWrapper newAntlrParser() return new ScribbleAntlrWrapper(); } - protected AntlrToScribParser newScribParser() - { - return new AntlrToScribParser(); - } - protected AstFactory newAstFactory() { return new AstFactoryImpl(); diff --git a/scribble-main/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java b/scribble-main/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java index 78fc29c01..774652205 100644 --- a/scribble-main/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java +++ b/scribble-main/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java @@ -15,11 +15,14 @@ import java.io.IOException; import java.io.InputStream; +import java.util.List; +import java.util.stream.Collectors; import org.antlr.runtime.ANTLRStringStream; import org.antlr.runtime.CommonTokenStream; import org.antlr.runtime.Lexer; import org.antlr.runtime.RecognitionException; +import org.antlr.runtime.tree.CommonErrorNode; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.Module; import org.scribble.del.DelDecorator; @@ -139,4 +142,22 @@ private static byte[] readResource(Resource res) throw new RuntimeException(e); } } + + public static void checkForAntlrErrors(CommonTree ct) + { + if (ct.getChildCount() > 0) // getChildren returns null instead of empty list + { + List errors = ((List) ct.getChildren()).stream() + .filter(c -> (c instanceof CommonErrorNode)) + .map(c -> (CommonErrorNode) c) + .collect(Collectors.toList()); + if (errors.size() > 0) // Antlr prints errors to System.err by default, but then attempts to carry on + // Should never get here now, Antlr displayRecognitionError overridden to force exit: Antlr error recovery means not all errors produce CommonErrorNode + { + //throw new ScribParserException("Parsing errors: " + errors); // FIXME: improve feedback message + System.err.println("[ScribParser] Aborting due to parsing errors: " + errors); + System.exit(1); + } + } + } } diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java deleted file mode 100644 index 926949909..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParser.java +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble; - -import java.util.List; -import java.util.stream.Collectors; - -import org.antlr.runtime.tree.CommonErrorNode; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.Module; -import org.scribble.ast.ScribNode; -import org.scribble.parser.scribble.ScribbleAntlrConstants.AntlrNodeType; -import org.scribble.parser.scribble.ast.AntlrPayloadElemList; -import org.scribble.util.ScribParserException; - -// ANTLR CommonTree -> ScribNode -// Parses ANTLR nodes into ScribNodes using the parser.ast.Antlr[...] helper classes -public class AntlrToScribParser -{ - public AntlrToScribParser() - { - - } - - public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException - { - AntlrToScribParser.checkForAntlrErrors(ct); - - AntlrNodeType type = AntlrToScribParserUtil.getAntlrNodeType(ct); - switch (type) - { - case PAYLOAD: return AntlrPayloadElemList.parsePayloadElemList(this, ct, af); - - case MODULE: - - // HERE deprecating Antlr->Scrib parsing - System.out.println("CCC1"); - - //return AntlrModule.parseModule(this, ct, af); - return (Module) ct; - - /*case MODULEDECL: return AntlrModuleDecl.parseModuleDecl(this, ct, af); - case MESSAGESIGNATUREDECL: return AntlrMessageSigDecl.parseMessageSigDecl(this, ct, af); - case PAYLOADTYPEDECL: return AntlrDataTypeDecl.parseDataTypeDecl(this, ct, af); - case IMPORTMODULE: return AntlrImportModule.parseImportModule(this, ct, af); - case GLOBALPROTOCOLDECL: return AntlrGProtocolDecl.parseGPrototocolDecl(this, ct, af); - case ROLEDECLLIST: return AntlrRoleDeclList.parseRoleDeclList(this, ct, af); - case ROLEDECL: return AntlrRoleDecl.parseRoleDecl(this, ct, af); - //case CONNECTDECL: return AntlrConnectDecl.parseConnectDecl(this, ct); - case PARAMETERDECLLIST: - //case EMPTY_PARAMETERDECLLST: - return AntlrNonRoleParamDeclList.parseNonRoleParamDeclList(this, ct, af); - case PARAMETERDECL: return AntlrNonRoleParamDecl.parseNonRoleParamDecl(this, ct, af); - case ROLEINSTANTIATIONLIST: return AntlrRoleArgList.parseRoleArgList(this, ct, af); - case ROLEINSTANTIATION: return AntlrRoleArg.parseRoleArg(this, ct, af); - case ARGUMENTINSTANTIATIONLIST: return AntlrNonRoleArgList.parseNonRoleArgList(this, ct, af); - - case GLOBALPROTOCOLHEADER: return AntlrGProtocolHeader.parseGProtocolHeader(this, ct, af); - case GLOBALPROTOCOLDEF: return AntlrGProtocolDefinition.parseGProtocolDefinition(this, ct, af); - case GLOBALPROTOCOLBLOCK: return AntlrGProtocolBlock.parseGProtocolBlock(this, ct, af); - case GLOBALINTERACTIONSEQUENCE: return AntlrGInteractionSequence.parseGInteractionSequence(this, ct, af); - case MESSAGESIGNATURE: return AntlrMessageSig.parseMessageSig(this, ct, af); - case GLOBALCONNECT: return AntlrGConnect.parseGConnect(this, ct, af); - case GLOBALDISCONNECT: return AntlrGDisconnect.parseGDisconnect(this, ct, af); - case GLOBALMESSAGETRANSFER: return AntlrGMessageTransfer.parseGMessageTransfer(this, ct, af); - case GLOBALCHOICE: return AntlrGChoice.parseGChoice(this, ct, af); - case GLOBALRECURSION: return AntlrGRecursion.parseGRecursion(this, ct, af); - case GLOBALCONTINUE: return AntlrGContinue.parseGContinue(this, ct, af); - case GLOBALDO: return AntlrGDo.parseGDo(this, ct, af); - case GLOBALWRAP: return AntlrGWrap.parseGWrap(this, ct, af);*/ - default: throw new RuntimeException("Unknown ANTLR node type: " + type); - } - } - - public static void checkForAntlrErrors(CommonTree ct) - { - if (ct.getChildCount() > 0) // getChildren returns null instead of empty list - { - List errors = ((List) ct.getChildren()).stream() - .filter(c -> (c instanceof CommonErrorNode)) - .map(c -> (CommonErrorNode) c) - .collect(Collectors.toList()); - if (errors.size() > 0) // Antlr prints errors to System.err by default, but then attempts to carry on - // Should never get here now, Antlr displayRecognitionError overridden to force exit: Antlr error recovery means not all errors produce CommonErrorNode - { - //throw new ScribParserException("Parsing errors: " + errors); // FIXME: improve feedback message - System.err.println("[ScribParser] Aborting due to parsing errors: " + errors); - System.exit(1); - } - } - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrDataTypeDecl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrDataTypeDecl.java deleted file mode 100644 index ee97f1456..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrDataTypeDecl.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.DataTypeDecl; -import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; - -public class AntlrDataTypeDecl -{ - public static final int SCHEMA_CHILD_INDEX = 0; - public static final int EXTNAME_CHILD_INDEX = 1; - public static final int SOURCE_CHILD_INDEX = 2; - public static final int ALIAS_CHILD_INDEX = 3; - - public static DataTypeDecl parseDataTypeDecl(AntlrToScribParser parser, CommonTree ct, AstFactory af) - { - CommonTree tmp1 = getSchemaChild(ct); - String schema = AntlrSimpleName.getName(tmp1); - CommonTree tmp2 = getExtNameChild(ct); - String extName = AntlrExtIdentifier.getName(tmp2); - CommonTree tmp3 = getSourceChild(ct); - String source = AntlrExtIdentifier.getName(tmp3); - DataTypeNode alias = AntlrSimpleName.toDataTypeNameNode(getAliasChild(ct), af); // FIXME: EMTPY_ALIAS? - return af.DataTypeDecl(ct, schema, extName, source, alias); - } - - public static CommonTree getSchemaChild(CommonTree ct) - { - return (CommonTree) ct.getChild(SCHEMA_CHILD_INDEX); - } - - public static CommonTree getExtNameChild(CommonTree ct) - { - return (CommonTree) ct.getChild(EXTNAME_CHILD_INDEX); - } - - public static CommonTree getSourceChild(CommonTree ct) - { - return (CommonTree) ct.getChild(SOURCE_CHILD_INDEX); - } - - public static CommonTree getAliasChild(CommonTree ct) - { - return (CommonTree) ct.getChild(ALIAS_CHILD_INDEX); - } - - public static CommonTree getModuleParent(CommonTree ct) - { - return (CommonTree) ct.getParent(); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrExtIdentifier.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrExtIdentifier.java deleted file mode 100644 index a36ccc0d8..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrExtIdentifier.java +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast; - -import org.antlr.runtime.tree.CommonTree; - -public class AntlrExtIdentifier -{ - public static final String getName(CommonTree ct) - { - String text = ct.getText(); - return text.substring(1, text.length() - 1); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrImportModule.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrImportModule.java deleted file mode 100644 index 3ed0c6465..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrImportModule.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.ImportModule; -import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.ScribbleAntlrConstants; -import org.scribble.parser.scribble.ast.name.AntlrQualifiedName; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; - -public class AntlrImportModule -{ - public static final int MODULENAME_CHILD_INDEX = 0; - public static final int ALIAS_CHILD_INDEX = 1; - - public static ImportModule parseImportModule(AntlrToScribParser parser, CommonTree ct, AstFactory af) - { - ModuleNameNode fmn = AntlrQualifiedName.toModuleNameNode(getModuleNameChild(ct), af); - ModuleNameNode alias = (hasAlias(ct)) - ? AntlrSimpleName.toModuleNameNode(getAliasChild(ct), af) - : null; - return af.ImportModule(ct, fmn, alias); - } - - public static CommonTree getModuleNameChild(CommonTree ct) - { - return (CommonTree) ct.getChild(MODULENAME_CHILD_INDEX); - } - - public static CommonTree getAliasChild(CommonTree ct) - { - return (CommonTree) ct.getChild(ALIAS_CHILD_INDEX); - } - - public static boolean hasAlias(CommonTree ct) - { - return !ct.getChild(ALIAS_CHILD_INDEX).getText().equals(ScribbleAntlrConstants.EMPTY_ALIAS); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrMessageSig.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrMessageSig.java deleted file mode 100644 index 1e842ca4a..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrMessageSig.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.MessageSigNode; -import org.scribble.ast.PayloadElemList; -import org.scribble.ast.name.simple.OpNode; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; -import org.scribble.util.ScribParserException; - -public class AntlrMessageSig -{ - public static final int OPERATOR_CHILD_INDEX = 0; - public static final int PAYLOAD_CHILD_INDEX = 1; - - public static MessageSigNode parseMessageSig(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - OpNode op = AntlrSimpleName.toOpNode(getOpChild(ct), af); - PayloadElemList payload = (PayloadElemList) parser.parse(getPayloadElemListChild(ct), af); - return af.MessageSigNode(ct, op, payload); - } - - public static CommonTree getOpChild(CommonTree ct) - { - return (CommonTree) ct.getChild(OPERATOR_CHILD_INDEX); - } - - public static CommonTree getPayloadElemListChild(CommonTree ct) - { - return (CommonTree) ct.getChild(PAYLOAD_CHILD_INDEX); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrMessageSigDecl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrMessageSigDecl.java deleted file mode 100644 index 12bdc6da1..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrMessageSigDecl.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.MessageSigNameDecl; -import org.scribble.ast.name.qualified.MessageSigNameNode; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; - -// FIXME: factor out with AntlrDataTypeDecl -public class AntlrMessageSigDecl -{ - public static final int SCHEMA_CHILD_INDEX = 0; - public static final int EXTNAME_CHILD_INDEX = 1; - public static final int SOURCE_CHILD_INDEX = 2; - public static final int ALIAS_CHILD_INDEX = 3; - - public static MessageSigNameDecl parseMessageSigDecl(AntlrToScribParser parser, CommonTree ct, AstFactory af) - { - CommonTree tmp1 = getSchemaChild(ct); - String schema = AntlrSimpleName.getName(tmp1); - CommonTree tmp2 = getExtNameChild(ct); - String extName = AntlrExtIdentifier.getName(tmp2); - CommonTree tmp3 = getSourceChild(ct); - String source = AntlrExtIdentifier.getName(tmp3); - MessageSigNameNode alias = AntlrSimpleName.toMessageSigNameNode(getAliasChild(ct), af); - return af.MessageSigNameDecl(ct, schema, extName, source, alias); - } - - public static CommonTree getSchemaChild(CommonTree ct) - { - return (CommonTree) ct.getChild(SCHEMA_CHILD_INDEX); - } - - public static CommonTree getExtNameChild(CommonTree ct) - { - return (CommonTree) ct.getChild(EXTNAME_CHILD_INDEX); - } - - public static CommonTree getSourceChild(CommonTree ct) - { - return (CommonTree) ct.getChild(SOURCE_CHILD_INDEX); - } - - public static CommonTree getAliasChild(CommonTree ct) - { - return (CommonTree) ct.getChild(ALIAS_CHILD_INDEX); - } - - public static CommonTree getModuleParent(CommonTree ct) - { - return (CommonTree) ct.getParent(); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModule.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModule.java deleted file mode 100644 index 471e9b9a6..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModule.java +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast; - -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; -import java.util.stream.Collectors; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.ImportDecl; -import org.scribble.ast.Module; -import org.scribble.ast.ModuleDecl; -import org.scribble.ast.NonProtocolDecl; -import org.scribble.ast.ProtocolDecl; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.AntlrToScribParserUtil; -import org.scribble.parser.scribble.ScribbleAntlrConstants.AntlrNodeType; -import org.scribble.util.ScribParserException; - -public class AntlrModule -{ - public static final int MODULEDECL_CHILD_INDEX = 0; - - public static Module parseModule(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - ModuleDecl md = (ModuleDecl) parser.parse(getModuleDeclChild(ct), af); - List> ids = new LinkedList<>(); - List> ptds = new LinkedList<>(); - List> pds = new LinkedList<>(); - for (CommonTree id : getImportDeclChildren(ct)) - { - ImportDecl tmp = (ImportDecl) parser.parse(id, af); - ids.add(tmp); - } - for (CommonTree ptd : getDataTypeDeclChildren(ct)) - { - NonProtocolDecl tmp = (NonProtocolDecl) parser.parse(ptd, af); - ptds.add(tmp); - } - for (CommonTree pd : getProtocolDeclChildren(ct)) - { - ProtocolDecl tmp = (ProtocolDecl) parser.parse(pd, af); - pds.add(tmp); - } - return af.Module(ct, md, ids, ptds, pds); - } - - public static CommonTree getModuleDeclChild(CommonTree ct) - { - return (CommonTree) ct.getChild(MODULEDECL_CHILD_INDEX); - } - - public static List getImportDeclChildren(CommonTree ct) - { - return filterChildren(ct, AntlrNodeType.IMPORTMODULE, AntlrNodeType.IMPORTMEMBER); - } - - public static List getDataTypeDeclChildren(CommonTree ct) - { - return filterChildren(ct, AntlrNodeType.PAYLOADTYPEDECL, AntlrNodeType.MESSAGESIGNATUREDECL); - } - - public static List getProtocolDeclChildren(CommonTree ct) - { - return filterChildren(ct, AntlrNodeType.GLOBALPROTOCOLDECL, AntlrNodeType.LOCALPROTOCOLDECL); - } - - private static List filterChildren(CommonTree ct, AntlrNodeType... types) - { - List tmp = Arrays.asList(types); - List children = AntlrToScribParserUtil.toCommonTreeList(ct.getChildren()); - return children.subList(1, children.size()).stream() - .filter((c) -> tmp.contains(AntlrToScribParserUtil.getAntlrNodeType(c))).collect(Collectors.toList()); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModuleDecl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModuleDecl.java deleted file mode 100644 index e412ac5ed..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModuleDecl.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast; - -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.ModuleDecl; -import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.core.type.kind.ModuleKind; -import org.scribble.parser.scribble.AntlrToScribParser; - -public class AntlrModuleDecl -{ - public static final int MODULENAME_CHILD_INDEX = 0; - - public static ModuleDecl parseModuleDecl(AntlrToScribParser parser, CommonTree ct, AstFactory af) - { - //return af.ModuleDecl(ct, AntlrQualifiedName.toModuleNameNode(getModuleNameChild(ct), af)); - - System.out.println("bbb: " + ((List) ct.getChildren()).stream().map(x -> x.getClass().toString()).collect(Collectors.joining(""))); - System.out.println("ccc: " + ((List) ((CommonTree) ct.getChild(0)).getChildren()).stream().map(x -> x.getClass().toString()).collect(Collectors.joining(""))); - - // HACK FIXME - //List collect = ((Stream) ct.getChildren().stream()).map(x -> ((CommonTree) x).getText()).collect(Collectors.toList()); - List collect = ((Stream) ((CommonTree) ct.getChild(0)).getChildren().stream()).map(x -> ((CommonTree) x).getText()).collect(Collectors.toList()); - - return af.ModuleDecl(ct, (ModuleNameNode) af.QualifiedNameNode(ct, ModuleKind.KIND, collect.toArray(new String[0]))); - } - - public static CommonTree getModuleNameChild(CommonTree ct) - { - return (CommonTree) ct.getChild(MODULENAME_CHILD_INDEX); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleArgList.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleArgList.java deleted file mode 100644 index 5af278272..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleArgList.java +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast; - -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.NonRoleArg; -import org.scribble.ast.NonRoleArgList; -import org.scribble.ast.NonRoleArgNode; -import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.ast.name.simple.AmbigNameNode; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.AntlrToScribParserUtil; -import org.scribble.parser.scribble.ScribbleAntlrConstants.AntlrNodeType; -import org.scribble.parser.scribble.ast.name.AntlrAmbigName; -import org.scribble.parser.scribble.ast.name.AntlrQualifiedName; -import org.scribble.util.ScribParserException; - -public class AntlrNonRoleArgList -{ - // Similar to AntlrPayloadElemList - public static NonRoleArgList parseNonRoleArgList(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - //List as = getArgumentChildren(ct).stream().map((a) -> parseNonRoleArg(parser, a)).collect(Collectors.toList()); - List as = new LinkedList<>(); - for (CommonTree a : getArgumentChildren(ct)) - { - as.add(parseNonRoleArg(parser, a, af)); - } - return af.NonRoleArgList(ct, as); - } - - // Not in own class because not called by ScribbleParser -- called directly from above - private static NonRoleArg parseNonRoleArg(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - AntlrNodeType type = AntlrToScribParserUtil.getAntlrNodeType(ct); - if (type == AntlrNodeType.MESSAGESIGNATURE) - { - NonRoleArgNode arg = (NonRoleArgNode) parser.parse(ct, af); - return af.NonRoleArg(ct, arg); - } - else - { - /* // Parser isn't working to distinguish simple from qualified names (similarly to PayloadElemList) - if (type == AntlrNodeType.AMBIGUOUSNAME) - { - return AstFactoryImpl.FACTORY.NonRoleArg(AntlrAmbigName.toAmbigNameNode(ct)); - } - else - { - throw new RuntimeException("Shouldn't get in here: " + type); - }*/ - if (type == AntlrNodeType.QUALIFIEDNAME) - { - if (ct.getChildCount() > 1) - { - DataTypeNode dt = AntlrQualifiedName.toDataTypeNameNode(ct, af); - return af.NonRoleArg(ct, dt); - } - else - { - // Similarly to NonRoleArg: cannot syntactically distinguish right now between SimplePayloadTypeNode and ParameterNode - AmbigNameNode an = AntlrAmbigName.toAmbigNameNode(ct, af); - return af.NonRoleArg(ct, an); - } - } - else - { - throw new RuntimeException("Shouldn't get in here: " + ct); - } - } - } - - public static List getArgumentChildren(CommonTree ct) - { - return (ct.getChildCount() == 0) - ? Collections.emptyList() - : AntlrToScribParserUtil.toCommonTreeList(ct.getChildren()); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleParamDecl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleParamDecl.java deleted file mode 100644 index 289ece86d..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleParamDecl.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.NonRoleParamDecl; -import org.scribble.ast.name.simple.NonRoleParamNode; -import org.scribble.core.type.kind.DataTypeKind; -import org.scribble.core.type.kind.Kind; -import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.kind.SigKind; -import org.scribble.parser.scribble.ScribbleAntlrConstants; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; - -public class AntlrNonRoleParamDecl -{ - public static final int KIND_CHILD_INDEX = 0; - public static final int NAME_CHILD_INDEX = 1; - - public static NonRoleParamDecl parseNonRoleParamDecl(AntlrToScribParser parser, CommonTree ct, AstFactory af) - { - Kind kind = parseKind(getKindChild(ct)); - if (kind.equals(SigKind.KIND)) - { - NonRoleParamNode name = AntlrSimpleName.toParamNode(SigKind.KIND, getNameChild(ct), af); - return af.NonRoleParamDecl(ct, SigKind.KIND, name); - } - else if (kind.equals(DataTypeKind.KIND)) - { - NonRoleParamNode name = AntlrSimpleName.toParamNode(DataTypeKind.KIND, getNameChild(ct), af); - return af.NonRoleParamDecl(ct, DataTypeKind.KIND, name); - } - else - { - throw new RuntimeException("Shouldn't get in here: " + kind); - } - } - - private static Kind parseKind(CommonTree ct) - { - String kind = ct.getText(); - switch (kind) - { - case ScribbleAntlrConstants.KIND_MESSAGESIGNATURE: - { - return SigKind.KIND; - } - case ScribbleAntlrConstants.KIND_PAYLOADTYPE: - { - return DataTypeKind.KIND; - } - default: - { - throw new RuntimeException("Unknown parameter declaration kind: " + kind); - } - } - } - - public static CommonTree getKindChild(CommonTree ct) - { - return (CommonTree) ct.getChild(KIND_CHILD_INDEX); - } - - public static CommonTree getNameChild(CommonTree ct) - { - return (CommonTree) ct.getChild(NAME_CHILD_INDEX); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleParamDeclList.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleParamDeclList.java deleted file mode 100644 index 8e194d1ef..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrNonRoleParamDeclList.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast; - -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.NonRoleParamDecl; -import org.scribble.ast.NonRoleParamDeclList; -import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.AntlrToScribParserUtil; -import org.scribble.util.ScribParserException; - -public class AntlrNonRoleParamDeclList -{ - public static NonRoleParamDeclList parseNonRoleParamDeclList(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - List> pds = new LinkedList<>(); - for (CommonTree pd : getParamDeclChildren(ct)) - { - NonRoleParamDecl parsed = (NonRoleParamDecl) parser.parse(pd, af); - @SuppressWarnings("unchecked") // OK: the node is immutable -- will never "rewrite" the generic value (the kind) in it - NonRoleParamDecl tmp = (NonRoleParamDecl) parsed; - pds.add(tmp); - } - return af.NonRoleParamDeclList(ct, pds); - } - - public static final List getParamDeclChildren(CommonTree ct) - { - return (ct.getChildCount() == 0) - ? Collections.emptyList() - : AntlrToScribParserUtil.toCommonTreeList(ct.getChildren()); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrPayloadElemList.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrPayloadElemList.java deleted file mode 100644 index 6c311cb6c..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrPayloadElemList.java +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast; - -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.PayloadElem; -import org.scribble.ast.PayloadElemList; -import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.ast.name.qualified.GProtocolNameNode; -import org.scribble.ast.name.simple.AmbigNameNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.AntlrToScribParserUtil; -import org.scribble.parser.scribble.ScribbleAntlrConstants.AntlrNodeType; -import org.scribble.parser.scribble.ast.name.AntlrAmbigName; -import org.scribble.parser.scribble.ast.name.AntlrQualifiedName; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; - -public class AntlrPayloadElemList -{ - // Cf. AntlrNonRoleArgList - public static PayloadElemList parsePayloadElemList(AntlrToScribParser parser, CommonTree ct, AstFactory af) - { - // As in AntlrNonRoleArgList, i.e. payloadelem (NonRoleArg) not directly parsed -- cf. rolearg and nonroleparamdecl, which are directly parsed (not consistent), due to amibgious names - //List pes = getPayloadElements(ct).stream().map((pe) -> parsePayloadElem(pe)).collect(Collectors.toList()); - List> pes = getPayloadElements(ct).stream().map(pe -> parsePayloadElem(pe, af)).collect(Collectors.toList()); - return af.PayloadElemList(ct, pes); - } - - //private static PayloadElem parsePayloadElem(CommonTree ct) - public static PayloadElem parsePayloadElem(CommonTree ct, AstFactory af) - { - AntlrNodeType type = AntlrToScribParserUtil.getAntlrNodeType(ct); - /*// Parser isn't working to distinguish simple from qualified names (cf. Scribble.g payloadelement) - if (type == AntlrNodeType.QUALIFIEDNAME) - { - DataTypeNameNode dt = AntlrQualifiedName.toDataTypeNameNode(ct); - return AstFactoryImpl.FACTORY.PayloadElement(dt); - } - else if (type == AntlrNodeType.AMBIGUOUSNAME) - { - // Similarly to NonRoleArg: cannot syntactically distinguish right now between SimplePayloadTypeNode and ParameterNode - AmbigNameNode an = AntlrAmbigName.toAmbigNameNode(ct); - return AstFactoryImpl.FACTORY.PayloadElement(an); - }*/ - if (type == AntlrNodeType.DELEGATION) - { - RoleNode rn = AntlrSimpleName.toRoleNode((CommonTree) ct.getChild(0), af); - //GProtocolNameNode gpnn = AntlrQualifiedName.toGProtocolNameNode((CommonTree) ct.getChild(1)); // FIXME: - GProtocolNameNode gpnn = AntlrQualifiedName.toGProtocolNameNode((CommonTree) ct.getChild(1), af); - return af.GDelegationElem(ct, gpnn, rn); - //throw new RuntimeException("Shouldn't get in here: " + ct); - } - else if (type == AntlrNodeType.QUALIFIEDNAME) - { - if (ct.getChildCount() > 1) - { - DataTypeNode dt = AntlrQualifiedName.toDataTypeNameNode(ct, af); - //return AstFactoryImpl.FACTORY.PayloadElem(dt); - return af.UnaryPayloadElem(ct, dt); // return and dt share same ct in this case - } - else - { - // Similarly to NonRoleArg: cannot syntactically distinguish right now between SimplePayloadTypeNode and ParameterNode - AmbigNameNode an = AntlrAmbigName.toAmbigNameNode(ct, af); - return af.UnaryPayloadElem(ct, an); - } - } - else - { - throw new RuntimeException("Shouldn't get in here: " + ct); - } - } - - public static final List getPayloadElements(CommonTree ct) - { - return (ct.getChildCount() == 0) - ? Collections.emptyList() - : AntlrToScribParserUtil.toCommonTreeList(ct.getChildren()); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrRoleArg.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrRoleArg.java deleted file mode 100644 index b9f6313ae..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrRoleArg.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.RoleArg; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; - -public class AntlrRoleArg -{ - public static final int ARG_CHILD_INDEX = 0; - - public static RoleArg parseRoleArg(AntlrToScribParser parser, CommonTree ct, AstFactory af) - { - RoleNode role = AntlrSimpleName.toRoleNode(getArgChild(ct), af); - return af.RoleArg(ct, role); - } - - public static CommonTree getArgChild(CommonTree ct) - { - return (CommonTree) ct.getChild(ARG_CHILD_INDEX); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrRoleArgList.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrRoleArgList.java deleted file mode 100644 index 126b41e26..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrRoleArgList.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast; - -import java.util.LinkedList; -import java.util.List; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.RoleArg; -import org.scribble.ast.RoleArgList; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.AntlrToScribParserUtil; -import org.scribble.util.ScribParserException; - -public class AntlrRoleArgList -{ - public static RoleArgList parseRoleArgList(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - //List ris = getRoleInstantiationChildren(ct).stream().map((ri) -> (RoleArg) parser.parse(ri)).collect(Collectors.toList()); - List ris = new LinkedList<>(); - for (CommonTree ri : getRoleInstantiationChildren(ct)) - { - ris.add((RoleArg) parser.parse(ri, af)); - } - return af.RoleArgList(ct, ris); - } - - public static final List getRoleInstantiationChildren(CommonTree ct) - { - return AntlrToScribParserUtil.toCommonTreeList(ct.getChildren()); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrRoleDecl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrRoleDecl.java deleted file mode 100644 index 256dc630c..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrRoleDecl.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.RoleDecl; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; - -public class AntlrRoleDecl -{ - public static final int NAME_CHILD_INDEX = 0; - - //public static RoleNode parseRoleDecl(AntlrModuleParser parser, CommonTree ct) - public static RoleDecl parseRoleDecl(AntlrToScribParser parser, CommonTree ct, AstFactory af) - { - RoleNode name = AntlrSimpleName.toRoleNode(getNameChild(ct), af); - return af.RoleDecl(ct, name); - } - - public static CommonTree getNameChild(CommonTree ct) - { - return (CommonTree) ct.getChild(NAME_CHILD_INDEX); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrRoleDeclList.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrRoleDeclList.java deleted file mode 100644 index 75e4bcd24..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrRoleDeclList.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast; - -import java.util.LinkedList; -import java.util.List; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.RoleDecl; -import org.scribble.ast.RoleDeclList; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.AntlrToScribParserUtil; -import org.scribble.util.ScribParserException; - -public class AntlrRoleDeclList -{ - public static RoleDeclList parseRoleDeclList(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - //List rds = getRoleDeclChildren(ct).stream().map((pd) -> (RoleDecl) parser.parse(pd)).collect(Collectors.toList()); - List rds = new LinkedList<>(); - for (CommonTree pd : getRoleDeclChildren(ct)) - { - rds.add((RoleDecl) parser.parse(pd, af)); - } - return af.RoleDeclList(ct, rds); - } - - public static List getRoleDeclChildren(CommonTree ct) - { - return AntlrToScribParserUtil.toCommonTreeList(ct.getChildren()); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGChoice.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGChoice.java deleted file mode 100644 index 35ac4a159..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGChoice.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.global; - -import java.util.LinkedList; -import java.util.List; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.global.GChoice; -import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.AntlrToScribParserUtil; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; -import org.scribble.util.ScribParserException; - -public class AntlrGChoice -{ - public static final int SUBJECT_CHILD_INDEX = 0; - public static final int BLOCK_CHILDREN_START_INDEX = 1; - - public static GChoice parseGChoice(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - RoleNode subj = AntlrSimpleName.toRoleNode(getSubjectChild(ct), af); - /*List blocks = - getBlockChildren(ct).stream().map((b) -> (GProtocolBlock) parser.parse(b)).collect(Collectors.toList());*/ - List blocks = new LinkedList<>(); - for (CommonTree b : getBlockChildren(ct)) - { - blocks.add((GProtocolBlock) parser.parse(b, af)); - } - return af.GChoice(ct, subj, blocks); - } - - public static CommonTree getSubjectChild(CommonTree ct) - { - return (CommonTree) ct.getChild(SUBJECT_CHILD_INDEX); - } - - public static List getBlockChildren(CommonTree ct) - { - List children = ct.getChildren(); - return AntlrToScribParserUtil.toCommonTreeList(children.subList(BLOCK_CHILDREN_START_INDEX, children.size())); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGConnect.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGConnect.java deleted file mode 100644 index 277b33b88..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGConnect.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.global; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.MessageNode; -import org.scribble.ast.global.GConnect; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; -import org.scribble.util.ScribParserException; - -// Factor with AntlrGMessageTransfer? -public class AntlrGConnect -{ - public static final int MESSAGE_CHILD_INDEX = 2; // Different order than AntlrGMessageTransfer - public static final int SOURCE_CHILD_INDEX = 0; - public static final int DESTINATION_CHILD_INDEX = 1; - - public static GConnect parseGConnect(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - RoleNode src = AntlrSimpleName.toRoleNode(getSourceChild(ct), af); - MessageNode msg = AntlrGMessageTransfer.parseMessage(parser, getMessageChild(ct), af); - RoleNode dest = AntlrSimpleName.toRoleNode(getDestinationChild(ct), af); - return af.GConnect(ct, src, msg, dest); - //return AstFactoryImpl.FACTORY.GConnect(src, dest); - } - - public static CommonTree getMessageChild(CommonTree ct) - { - return (CommonTree) ct.getChild(MESSAGE_CHILD_INDEX); - } - - public static CommonTree getSourceChild(CommonTree ct) - { - return (CommonTree) ct.getChild(SOURCE_CHILD_INDEX); - } - - public static CommonTree getDestinationChild(CommonTree ct) - { - return (CommonTree) ct.getChild(DESTINATION_CHILD_INDEX); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGContinue.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGContinue.java deleted file mode 100644 index e5f338120..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGContinue.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.global; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.global.GContinue; -import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; - -public class AntlrGContinue -{ - public static final int LABEL_CHILD_INDEX = 0; - - public static GContinue parseGContinue(AntlrToScribParser parser, CommonTree ct, AstFactory af) - { - RecVarNode recvar = AntlrSimpleName.toRecVarNode(getRecVarChild(ct), af); - return af.GContinue(ct, recvar); - } - - public static final CommonTree getRecVarChild(CommonTree ct) - { - return (CommonTree) ct.getChild(LABEL_CHILD_INDEX); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGDisconnect.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGDisconnect.java deleted file mode 100644 index 671312bd2..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGDisconnect.java +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.global; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.global.GDisconnect; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; - -// Factor with AntlrGMessageTransfer/AntlrGConnect -public class AntlrGDisconnect -{ - public static final int SOURCE_CHILD_INDEX = 0; - public static final int DESTINATION_CHILD_INDEX = 1; - - public static GDisconnect parseGDisconnect(AntlrToScribParser parser, CommonTree ct, AstFactory af) - { - RoleNode src = AntlrSimpleName.toRoleNode(getSourceChild(ct), af); - RoleNode dest = AntlrSimpleName.toRoleNode(getDestinationChild(ct), af); - return af.GDisconnect(ct, src, dest); - } - - public static CommonTree getSourceChild(CommonTree ct) - { - return (CommonTree) ct.getChild(SOURCE_CHILD_INDEX); - } - - public static CommonTree getDestinationChild(CommonTree ct) - { - return (CommonTree) ct.getChild(DESTINATION_CHILD_INDEX); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGDo.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGDo.java deleted file mode 100644 index ebc589937..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGDo.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.global; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.NonRoleArgList; -import org.scribble.ast.RoleArgList; -import org.scribble.ast.global.GDo; -import org.scribble.ast.name.qualified.GProtocolNameNode; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.ast.name.AntlrQualifiedName; -import org.scribble.util.ScribParserException; - -public class AntlrGDo -{ - public static final int MEMBERNAME_CHILD_INDEX = 0; - public static final int ARGUMENTLIST_CHILD_INDEX = 1; - public static final int ROLEINSTANTIATIONLIST_CHILD_INDEX = 2; - - public static GDo parseGDo(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - RoleArgList ril = (RoleArgList) parser.parse(getRoleArgListChild(ct), af); - NonRoleArgList al = (NonRoleArgList) parser.parse(getNonRoleArgListChild(ct), af); - GProtocolNameNode pnn = AntlrQualifiedName.toGProtocolNameNode(getProtocolNameChild(ct), af); - return af.GDo(ct, ril, al, pnn); - } - - public static CommonTree getProtocolNameChild(CommonTree ct) - { - return (CommonTree) ct.getChild(MEMBERNAME_CHILD_INDEX); - } - - public static CommonTree getNonRoleArgListChild(CommonTree ct) - { - return (CommonTree) ct.getChild(ARGUMENTLIST_CHILD_INDEX); - } - - public static CommonTree getRoleArgListChild(CommonTree ct) - { - return (CommonTree) ct.getChild(ROLEINSTANTIATIONLIST_CHILD_INDEX); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGInteractionSequence.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGInteractionSequence.java deleted file mode 100644 index d7e885d79..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGInteractionSequence.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.global; - -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.global.GSessionNode; -import org.scribble.ast.global.GInteractionSeq; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.AntlrToScribParserUtil; -import org.scribble.util.ScribParserException; - -public class AntlrGInteractionSequence -{ - public static GInteractionSeq parseGInteractionSequence(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - /*List gis = - getInteractionChildren(ct).stream().map((gi) -> (GInteractionNode) parser.parse(gi)).collect(Collectors.toList());*/ - List gis = new LinkedList<>(); - for (CommonTree gi : getInteractionChildren(ct)) - { - gis.add((GSessionNode) parser.parse(gi, af)); - } - return af.GInteractionSeq(ct, gis); - } - - public static List getInteractionChildren(CommonTree ct) - { - return (ct.getChildCount() == 0) - ? Collections.emptyList() - : AntlrToScribParserUtil.toCommonTreeList(ct.getChildren()); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGMessageTransfer.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGMessageTransfer.java deleted file mode 100644 index 138ca0ec0..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGMessageTransfer.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.global; - -import java.util.List; -import java.util.stream.Collectors; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.MessageNode; -import org.scribble.ast.MessageSigNode; -import org.scribble.ast.global.GMessageTransfer; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.AntlrToScribParserUtil; -import org.scribble.parser.scribble.ScribbleAntlrConstants.AntlrNodeType; -import org.scribble.parser.scribble.ast.name.AntlrAmbigName; -import org.scribble.parser.scribble.ast.name.AntlrQualifiedName; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; -import org.scribble.util.ScribParserException; - -public class AntlrGMessageTransfer -{ - public static final int MESSAGE_CHILD_INDEX = 0; - public static final int SOURCE_CHILD_INDEX = 1; - public static final int DESTINATION_CHILDREN_START_INDEX = 2; - - public static GMessageTransfer parseGMessageTransfer(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - RoleNode src = AntlrSimpleName.toRoleNode(getSourceChild(ct), af); - MessageNode msg = parseMessage(parser, getMessageChild(ct), af); - List dests = - getDestChildren(ct).stream().map(d -> AntlrSimpleName.toRoleNode(d, af)).collect(Collectors.toList()); - return af.GMessageTransfer(ct, src, msg, dests); - } - - public static MessageNode parseMessage(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - AntlrNodeType type = AntlrToScribParserUtil.getAntlrNodeType(ct); - if (type == AntlrNodeType.MESSAGESIGNATURE) - { - return (MessageSigNode) parser.parse(ct, af); - } - else //if (type.equals(AntlrConstants.AMBIGUOUSNAME_NODE_TYPE)) - { - return (ct.getChildCount() == 1) - ? AntlrAmbigName.toAmbigNameNode(ct, af) // parametername or simple messagesignaturename - : AntlrQualifiedName.toMessageSigNameNode(ct, af); - } - } - - public static CommonTree getMessageChild(CommonTree ct) - { - return (CommonTree) ct.getChild(MESSAGE_CHILD_INDEX); - } - - public static CommonTree getSourceChild(CommonTree ct) - { - return (CommonTree) ct.getChild(SOURCE_CHILD_INDEX); - } - - public static List getDestChildren(CommonTree ct) - { - return AntlrToScribParserUtil.toCommonTreeList(ct.getChildren().subList(DESTINATION_CHILDREN_START_INDEX, ct.getChildCount())); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolBlock.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolBlock.java deleted file mode 100644 index 9159ab738..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolBlock.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.global; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.global.GInteractionSeq; -import org.scribble.ast.global.GProtocolBlock; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.util.ScribParserException; - -public class AntlrGProtocolBlock -{ - public static final int INTERACTIONSEQUENCE_CHILD_INDEX = 0; - - public static GProtocolBlock parseGProtocolBlock(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - GInteractionSeq gis = (GInteractionSeq) parser.parse(getInteractionSequenceChild(ct), af); - return af.GProtocolBlock(ct, gis); - } - - public static final CommonTree getInteractionSequenceChild(CommonTree ct) - { - return (CommonTree) ct.getChild(INTERACTIONSEQUENCE_CHILD_INDEX); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDecl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDecl.java deleted file mode 100644 index 07f6c07c6..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDecl.java +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.global; - -import java.util.LinkedList; -import java.util.List; -import java.util.stream.Collectors; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.AuxMod; -import org.scribble.ast.ExplicitMod; -import org.scribble.ast.ProtocolMod; -import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ast.global.GProtocolDef; -import org.scribble.ast.global.GProtocolHeader; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.util.ScribParserException; - -public class AntlrGProtocolDecl -{ - public static final int HEADER_CHILD_INDEX = 0; - public static final int BODY_CHILD_INDEX = 1; - //public static final int EXPLICIT_CONNECTIONS_FLAG_INDEX = 2; - public static final int MODIFIERS_CHILD_INDEX = 2; - - public static GProtocolDecl parseGPrototocolDecl(AntlrToScribParser parser, - CommonTree ct, AstFactory af) throws ScribParserException - { - GProtocolHeader header = (GProtocolHeader) - parser.parse(getHeaderChild(ct), af); - GProtocolDef def = (GProtocolDef) parser.parse(getBodyChild(ct), af); - List modifiers = new LinkedList<>(); - /*if (isExplicitConnections(ct)) - { - modifiers.add(GProtocolDecl.Modifiers.EXPLICIT); - }*/ - if (hasModifiersChild(ct)) - { - for (CommonTree mod :getModifierChildren(ct)) - { - switch (mod.getText()) - { - case "aux": modifiers.add(AuxMod.AUX); break; - case "explicit": modifiers.add(ExplicitMod.EXPLICIT); break; - default: throw new RuntimeException("TODO: " + mod); - } - } - } - return af.GProtocolDecl(ct, modifiers, header, def); - } - - public static CommonTree getHeaderChild(CommonTree ct) - { - return (CommonTree) ct.getChild(HEADER_CHILD_INDEX); - } - - public static CommonTree getBodyChild(CommonTree ct) - { - return (CommonTree) ct.getChild(BODY_CHILD_INDEX); - } - - public static boolean hasModifiersChild(CommonTree ct) - { - return ct.getChildCount() > MODIFIERS_CHILD_INDEX; - } - - public static List getModifierChildren(CommonTree ct) - { - //return (CommonTree) ct.getChild(MODIFIERS_CHILD_INDEX); - return ((List) ((CommonTree) ct.getChild(MODIFIERS_CHILD_INDEX)) - .getChildren()).stream().map(c -> (CommonTree) c) - .collect(Collectors.toList()); - } - - /*public static boolean isExplicitConnections(CommonTree ct) - { - return ct.getChildCount() > EXPLICIT_CONNECTIONS_FLAG_INDEX; - }*/ -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDefinition.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDefinition.java deleted file mode 100644 index f8d362f71..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDefinition.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.global; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.global.GProtocolDef; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.util.ScribParserException; - -public class AntlrGProtocolDefinition -{ - public static final int BLOCK_CHILD_INDEX = 0; - - public static GProtocolDef parseGProtocolDefinition(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - GProtocolBlock gpb = (GProtocolBlock) parser.parse(getBlockChild(ct), af); - return af.GProtocolDef(ct, gpb); - } - - public static CommonTree getBlockChild(CommonTree ct) - { - return (CommonTree) ct.getChild(BLOCK_CHILD_INDEX); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolHeader.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolHeader.java deleted file mode 100644 index 57d31035f..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolHeader.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.global; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.NonRoleParamDeclList; -import org.scribble.ast.RoleDeclList; -import org.scribble.ast.global.GProtocolHeader; -import org.scribble.ast.name.qualified.GProtocolNameNode; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; -import org.scribble.util.ScribParserException; - -public class AntlrGProtocolHeader -{ - public static final int NAME_CHILD_INDEX = 0; - public static final int PARAMETERDECLLIST_CHILD_INDEX = 1; - public static final int ROLEDECLLIST_CHILD_INDEX = 2; - - public static GProtocolHeader parseGProtocolHeader(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - GProtocolNameNode name = AntlrSimpleName.toGProtocolNameNode(getNameChild(ct), af); - RoleDeclList rdl = (RoleDeclList) parser.parse(getRoleDeclListChild(ct), af); - NonRoleParamDeclList pdl = (NonRoleParamDeclList) parser.parse(getParamDeclListChild(ct), af); - return af.GProtocolHeader(ct, name, rdl, pdl); - } - - public static CommonTree getNameChild(CommonTree ct) - { - return (CommonTree) ct.getChild(NAME_CHILD_INDEX); - } - - public static CommonTree getRoleDeclListChild(CommonTree ct) - { - return (CommonTree) ct.getChild(ROLEDECLLIST_CHILD_INDEX); - } - - public static CommonTree getParamDeclListChild(CommonTree ct) - { - return (CommonTree) ct.getChild(PARAMETERDECLLIST_CHILD_INDEX); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGRecursion.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGRecursion.java deleted file mode 100644 index 1906a7d08..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGRecursion.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.global; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.global.GRecursion; -import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; -import org.scribble.util.ScribParserException; - -public class AntlrGRecursion -{ - public static final int RECURSIONVAR_CHILD_INDEX = 0; - public static final int BLOCK_CHILD_INDEX = 1; - - public static GRecursion parseGRecursion(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException - { - RecVarNode recvar = AntlrSimpleName.toRecVarNode(getRecVarChild(ct), af); - GProtocolBlock block = (GProtocolBlock) parser.parse(getBlockChild(ct), af); - return af.GRecursion(ct, recvar, block); - } - - public static final CommonTree getRecVarChild(CommonTree ct) - { - return (CommonTree) ct.getChild(RECURSIONVAR_CHILD_INDEX); - } - - public static final CommonTree getBlockChild(CommonTree ct) - { - return (CommonTree) ct.getChild(BLOCK_CHILD_INDEX); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGWrap.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGWrap.java deleted file mode 100644 index 654a05f01..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGWrap.java +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.global; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.global.GWrap; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; - -// Factor with AntlrGMessageTransfer? -public class AntlrGWrap -{ - public static final int SOURCE_CHILD_INDEX = 0; - public static final int DESTINATION_CHILD_INDEX = 1; - - public static GWrap parseGWrap(AntlrToScribParser parser, CommonTree ct, AstFactory af) - { - RoleNode src = AntlrSimpleName.toRoleNode(getSourceChild(ct), af); - RoleNode dest = AntlrSimpleName.toRoleNode(getDestinationChild(ct), af); - return af.GWrap(ct, src, dest); - } - - public static CommonTree getSourceChild(CommonTree ct) - { - return (CommonTree) ct.getChild(SOURCE_CHILD_INDEX); - } - - public static CommonTree getDestinationChild(CommonTree ct) - { - return (CommonTree) ct.getChild(DESTINATION_CHILD_INDEX); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrAmbigName.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrAmbigName.java deleted file mode 100644 index 7baca3102..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrAmbigName.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.name; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.name.simple.AmbigNameNode; - -// FIXME: refactor into AntlrSimple/QualifiedName? -- need to separate ambig simple and qualified? -public class AntlrAmbigName -{ - public static AmbigNameNode toAmbigNameNode(CommonTree ct, AstFactory af) - { - return af.AmbiguousNameNode(getNameChild(ct), getName(ct)); - } - - private static CommonTree getNameChild(CommonTree ct) - { - return (CommonTree) ct.getChild(0); - } - - private static String getName(CommonTree ct) - { - return AntlrSimpleName.getName(getNameChild(ct)); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrQualifiedName.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrQualifiedName.java deleted file mode 100644 index e8617862b..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrQualifiedName.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.name; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.ast.name.qualified.GProtocolNameNode; -import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.ast.name.qualified.MessageSigNameNode; -import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.core.type.kind.DataTypeKind; -import org.scribble.core.type.kind.Global; -import org.scribble.core.type.kind.Local; -import org.scribble.core.type.kind.ModuleKind; -import org.scribble.core.type.kind.SigKind; - -public class AntlrQualifiedName -{ - protected static String[] getElements(CommonTree ct) - { - int count = ct.getChildCount(); - String[] names = new String[count]; - for (int i = 0; i < count; i++) - { - names[i] = AntlrSimpleName.getName((CommonTree) ct.getChild(i)); - } - return names; - } - - public static ModuleNameNode toModuleNameNode(CommonTree ct, AstFactory af) - { - return (ModuleNameNode) af.QualifiedNameNode(ct, ModuleKind.KIND, getElements(ct)); - } - - public static DataTypeNode toDataTypeNameNode(CommonTree ct, AstFactory af) - { - return (DataTypeNode) af.QualifiedNameNode(ct, DataTypeKind.KIND, getElements(ct)); - } - - public static MessageSigNameNode toMessageSigNameNode(CommonTree ct, AstFactory af) - { - return (MessageSigNameNode) af.QualifiedNameNode(ct, SigKind.KIND, getElements(ct)); - } - - public static GProtocolNameNode toGProtocolNameNode(CommonTree ct, AstFactory af) - { - return (GProtocolNameNode) af.QualifiedNameNode(ct, Global.KIND, getElements(ct)); - } - - public static LProtocolNameNode toLProtocolNameNode(CommonTree ct, AstFactory af) - { - return (LProtocolNameNode) af.QualifiedNameNode(ct, Local.KIND, getElements(ct)); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java deleted file mode 100644 index 196b6cfde..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/name/AntlrSimpleName.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.name; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.ast.name.qualified.GProtocolNameNode; -import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.ast.name.qualified.MessageSigNameNode; -import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.ast.name.simple.NonRoleParamNode; -import org.scribble.ast.name.simple.OpNode; -import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.kind.DataTypeKind; -import org.scribble.core.type.kind.Global; -import org.scribble.core.type.kind.Local; -import org.scribble.core.type.kind.ModuleKind; -import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.kind.OpKind; -import org.scribble.core.type.kind.RecVarKind; -import org.scribble.core.type.kind.RoleKind; -import org.scribble.core.type.kind.SigKind; -import org.scribble.parser.scribble.ScribbleAntlrConstants; - -public class AntlrSimpleName -{ - public static ModuleNameNode toModuleNameNode(CommonTree ct, AstFactory af) - { - return (ModuleNameNode) af.QualifiedNameNode(ct, ModuleKind.KIND, getName(ct)); // Cannot use SimpleNameNode because qualified uses the node's elements, not the node's text itself - } - - public static GProtocolNameNode toGProtocolNameNode(CommonTree ct, AstFactory af) - { - return (GProtocolNameNode) af.QualifiedNameNode(ct, Global.KIND, getName(ct)); // Cannot use SimpleNameNode because qualified uses the node's elements, not the node's text itself - } - - public static LProtocolNameNode toLProtocolNameNode(CommonTree ct, AstFactory af) - { - return (LProtocolNameNode) af.QualifiedNameNode(ct, Local.KIND, getName(ct)); - } - - public static DataTypeNode toDataTypeNameNode(CommonTree ct, AstFactory af) - { - return (DataTypeNode) af.QualifiedNameNode(ct, DataTypeKind.KIND, getName(ct)); - } - - public static MessageSigNameNode toMessageSigNameNode(CommonTree ct, AstFactory af) - { - return (MessageSigNameNode) af.QualifiedNameNode(ct, SigKind.KIND, getName(ct)); - } - - public static RoleNode toRoleNode(CommonTree ct, AstFactory af) - { - return (RoleNode) af.SimpleNameNode(ct, RoleKind.KIND, getName(ct)); - } - - public static NonRoleParamNode toParamNode(K kind, CommonTree ct, AstFactory af) - { - return af.NonRoleParamNode(ct, kind, getName(ct)); - } - - public static OpNode toOpNode(CommonTree ct, AstFactory af) - { - String op = getName(ct); - return op.equals(ScribbleAntlrConstants.ANTLR_EMPTY_OPERATOR) - ? (OpNode) af.SimpleNameNode(ct, OpKind.KIND, OpNode.EMPTY_OP_ID) - : (OpNode) af.SimpleNameNode(ct, OpKind.KIND, getName(ct)); - } - - public static RecVarNode toRecVarNode(CommonTree ct, AstFactory af) - { - return (RecVarNode) af.SimpleNameNode(ct, RecVarKind.KIND, getName(ct)); - } - - public static String getName(CommonTree ct) - { - return ct.getText(); - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/tree/MyCommonTree.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/tree/MyCommonTree.java deleted file mode 100644 index 434dc196d..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/tree/MyCommonTree.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble.ast.tree; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.ScribNodeBase; - -@Deprecated -public class MyCommonTree extends ScribNodeBase -{ - public MyCommonTree(CommonTree node) - { - super(node); - } - - public MyCommonTree(Token t) - { - super(t); - } - - @Override - public ScribNodeBase dupNode() - { - return new MyCommonTree(this); - } - - /*@Override - protected ScribNodeBase copy() - { - return (ScribNodeBase) dupNode(); - } - - @Override - public ScribNodeBase clone(AstFactory af) - { - return (ScribNodeBase) dupNode(); - }*/ -} From e126c4efcc554a19f5616ac9120a2635379d8dd8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 5 Apr 2019 21:21:18 +0100 Subject: [PATCH 175/539] Continued. --- .../main/java/org/scribble/ast/Choice.java | 4 +- .../main/java/org/scribble/ast/Continue.java | 4 +- .../org/scribble/ast/DirectedInteraction.java | 4 +- .../org/scribble/ast/DisconnectAction.java | 4 +- .../src/main/java/org/scribble/ast/Do.java | 4 +- .../src/main/java/org/scribble/ast/DoArg.java | 4 +- .../main/java/org/scribble/ast/DoArgList.java | 4 +- .../org/scribble/ast/HeaderParamDecl.java | 4 +- .../org/scribble/ast/HeaderParamDeclList.java | 4 +- .../java/org/scribble/ast/ImportModule.java | 9 +- .../java/org/scribble/ast/InteractionSeq.java | 4 +- .../java/org/scribble/ast/MessageSigNode.java | 4 +- .../main/java/org/scribble/ast/Module.java | 4 +- .../java/org/scribble/ast/ModuleDecl.java | 4 +- .../org/scribble/ast/NonProtocolDecl.java | 4 +- .../org/scribble/ast/PayloadElemList.java | 4 +- .../java/org/scribble/ast/ProtocolBlock.java | 4 +- .../java/org/scribble/ast/ProtocolDecl.java | 4 +- .../java/org/scribble/ast/ProtocolDef.java | 4 +- .../java/org/scribble/ast/ProtocolHeader.java | 4 +- .../java/org/scribble/ast/ProtocolMod.java | 4 +- .../org/scribble/ast/ProtocolModList.java | 4 +- .../main/java/org/scribble/ast/Recursion.java | 4 +- .../main/java/org/scribble/ast/ScribNode.java | 8 +- .../java/org/scribble/ast/ScribNodeBase.java | 36 ++-- .../org/scribble/ast/UnaryPayloadElem.java | 4 +- .../java/org/scribble/ast/global/GChoice.java | 8 +- .../scribble/ast/global/GDelegationElem.java | 4 +- .../scribble/ast/global/GProtocolDecl.java | 4 +- .../java/org/scribble/ast/local/LAccept.java | 8 +- .../java/org/scribble/ast/local/LChoice.java | 6 +- .../org/scribble/ast/local/LContinue.java | 8 +- .../org/scribble/ast/local/LDisconnect.java | 8 +- .../main/java/org/scribble/ast/local/LDo.java | 8 +- .../java/org/scribble/ast/local/LReceive.java | 8 +- .../org/scribble/ast/local/LRecursion.java | 8 +- .../java/org/scribble/ast/local/LRequest.java | 8 +- .../java/org/scribble/ast/local/LSend.java | 8 +- .../org/scribble/ast/local/LSessionNode.java | 4 +- .../org/scribble/ast/local/LWrapClient.java | 8 +- .../org/scribble/ast/local/LWrapServer.java | 8 +- .../main/java/org/scribble/del/ChoiceDel.java | 10 +- .../scribble/del/CompoundInteractionDel.java | 14 +- .../scribble/del/CompoundSessionNodeDel.java | 18 +- .../org/scribble/del/ConnectionActionDel.java | 6 +- .../java/org/scribble/del/ContinueDel.java | 6 +- .../java/org/scribble/del/DoArgListDel.java | 10 +- .../src/main/java/org/scribble/del/DoDel.java | 14 +- .../scribble/del/HeaderParamDeclListDel.java | 6 +- .../org/scribble/del/InteractionSeqDel.java | 4 +- .../org/scribble/del/MessageTransferDel.java | 8 +- .../main/java/org/scribble/del/ModuleDel.java | 12 +- .../org/scribble/del/NonRoleArgListDel.java | 10 +- .../org/scribble/del/NonRoleParamDeclDel.java | 4 +- .../org/scribble/del/ProtocolBlockDel.java | 4 +- .../org/scribble/del/ProtocolDeclDel.java | 12 +- .../java/org/scribble/del/ProtocolDefDel.java | 6 +- .../java/org/scribble/del/RecursionDel.java | 14 +- .../java/org/scribble/del/RoleArgListDel.java | 6 +- .../java/org/scribble/del/RoleDeclDel.java | 6 +- .../main/java/org/scribble/del/ScribDel.java | 66 +++--- .../scribble/del/SimpleSessionNodeDel.java | 6 +- .../org/scribble/del/global/GChoiceDel.java | 26 +-- .../org/scribble/del/global/GConnectDel.java | 16 +- .../org/scribble/del/global/GContinueDel.java | 8 +- .../java/org/scribble/del/global/GDel.java | 4 +- .../del/global/GDelegationElemDel.java | 18 +- .../scribble/del/global/GDisconnectDel.java | 18 +- .../java/org/scribble/del/global/GDoDel.java | 12 +- .../del/global/GInteractionNodeDel.java | 6 +- .../del/global/GInteractionSeqDel.java | 12 +- .../del/global/GMessageTransferDel.java | 16 +- .../del/global/GProtocolBlockDel.java | 10 +- .../scribble/del/global/GProtocolDeclDel.java | 14 +- .../scribble/del/global/GProtocolDefDel.java | 8 +- .../scribble/del/global/GRecursionDel.java | 10 +- .../org/scribble/del/global/GWrapDel.java | 16 +- .../org/scribble/del/local/LAcceptDel.java | 8 +- .../org/scribble/del/local/LChoiceDel.java | 18 +- .../local/LCompoundInteractionNodeDel.java | 4 +- .../del/local/LConnectionActionDel.java | 4 +- .../org/scribble/del/local/LContinueDel.java | 8 +- .../scribble/del/local/LDisconnectDel.java | 4 +- .../java/org/scribble/del/local/LDoDel.java | 8 +- .../del/local/LInteractionNodeDel.java | 6 +- .../del/local/LInteractionSeqDel.java | 14 +- .../del/local/LMessageTransferDel.java | 4 +- .../del/local/LProjectionDeclDel.java | 4 +- .../scribble/del/local/LProtocolBlockDel.java | 8 +- .../scribble/del/local/LProtocolDeclDel.java | 6 +- .../scribble/del/local/LProtocolDefDel.java | 4 +- .../org/scribble/del/local/LReceiveDel.java | 6 +- .../org/scribble/del/local/LRecursionDel.java | 10 +- .../org/scribble/del/local/LRequestDel.java | 4 +- .../java/org/scribble/del/local/LSendDel.java | 8 +- .../scribble/del/local/LWrapClientDel.java | 4 +- .../scribble/del/local/LWrapServerDel.java | 6 +- .../del/name/qualified/DataTypeNodeDel.java | 6 +- .../name/qualified/MessageSigNameNodeDel.java | 4 +- .../del/name/simple/AmbigNameNodeDel.java | 10 +- .../del/name/simple/RecVarNodeDel.java | 10 +- .../scribble/del/name/simple/RoleNodeDel.java | 6 +- .../src/main/java/org/scribble/lang/Lang.java | 17 +- .../java/org/scribble/lang/LangConfig.java | 2 +- .../lang/context/ModuleContextMaker.java | 12 +- .../{ScribUtil.java => ScribNodeUtil.java} | 2 +- .../java/org/scribble/visit/AstVisitor.java | 8 +- .../java/org/scribble/visit/EnvVisitor.java | 10 +- .../org/scribble/visit/GTypeTranslator.java | 4 +- .../visit/InlinedProtocolUnfolder.java | 12 +- .../visit/InlinedProtocolVisitor.java | 18 +- .../visit/OffsetSubprotocolVisitor.java | 16 +- .../scribble/visit/ProtocolDefInliner.java | 12 +- .../org/scribble/visit/SimpleVisitor.java | 4 +- .../scribble/visit/SubprotocolVisitor.java | 20 +- .../java/org/scribble/visit/Substitutor.java | 4 +- .../org/scribble/visit/UnfoldingVisitor.java | 14 +- .../scribble/visit/context/EGraphBuilder.java | 12 +- .../visit/context/ModuleContextBuilder.java | 6 +- .../visit/context/ModuleContextVisitor.java | 4 +- .../context/ProjectedChoiceDoPruner.java | 8 +- .../context/ProjectedChoiceSubjectFixer.java | 6 +- .../visit/context/ProjectedRoleDeclFixer.java | 6 +- .../org/scribble/visit/context/Projector.java | 10 +- .../context/ProtocolDeclContextBuilder.java | 6 +- .../scribble/visit/context/RecRemover.java | 6 +- .../UnguardedChoiceDoProjectionChecker.java | 10 +- .../visit/util/MessageIdCollector.java | 6 +- .../scribble/visit/util/RecVarCollector.java | 6 +- .../scribble/visit/util/RoleCollector.java | 6 +- .../visit/validation/GProtocolValidator.java | 6 +- .../wf/DelegationProtocolRefChecker.java | 6 +- .../visit/wf/ExplicitCorrelationChecker.java | 8 +- .../scribble/visit/wf/NameDisambiguator.java | 10 +- .../visit/wf/ReachabilityChecker.java | 10 +- .../scribble/visit/wf/WFChoiceChecker.java | 10 +- .../java/org/scribble/cli/CommandLine.java | 62 +++--- .../org/scribble/codegen/java/ApiGen.java | 4 +- .../codegen/java/JEndpointApiGenerator.java | 10 +- .../callbackapi/CBEndpointApiGenerator.java | 10 +- .../callbackapi/CBEndpointApiGenerator3.java | 10 +- .../java/sessionapi/SessionApiGenerator.java | 8 +- .../java/statechanapi/BranchSockGen.java | 4 +- .../java/statechanapi/CaseSockGen.java | 14 +- .../java/statechanapi/HandlerIfaceGen.java | 6 +- .../java/statechanapi/InputFutureGen.java | 6 +- .../java/statechanapi/OutputSockGen.java | 12 +- .../java/statechanapi/ReceiveSockGen.java | 16 +- .../java/statechanapi/ScribSockGen.java | 16 +- .../java/statechanapi/StateChanTypeGen.java | 4 +- .../StateChannelApiGenerator.java | 8 +- .../statechanapi/ioifaces/ActionIfaceGen.java | 4 +- .../statechanapi/ioifaces/BranchIfaceGen.java | 4 +- .../statechanapi/ioifaces/CaseIfaceGen.java | 4 +- .../statechanapi/ioifaces/HandleIfaceGen.java | 6 +- .../ioifaces/IOInterfacesGenerator.java | 14 +- .../ioifaces/IOStateIfaceGen.java | 14 +- .../ioifaces/ReceiveIfaceGen.java | 6 +- .../statechanapi/ioifaces/SelectIfaceGen.java | 4 +- .../codegen/java/util/ConstructorBuilder.java | 6 +- .../codegen/java/util/EnumBuilder.java | 18 +- .../main/java/org/scribble/core/job/Job.java | 15 +- .../org/scribble/core/job/JobContext.java | 23 +- .../core/lang/context/ModuleContext.java | 4 +- .../scribble/core/lang/global/GProtocol.java | 24 +-- .../scribble/core/lang/local/LProtocol.java | 4 +- .../scribble/core/model/GraphBuilderUtil.java | 4 +- .../java/org/scribble/core/model/MState.java | 12 +- .../model/endpoint/EGraphBuilderUtil.java | 4 +- .../model/endpoint/EGraphBuilderUtil2.java | 6 +- .../scribble/core/model/endpoint/EState.java | 4 +- .../core/model/global/SGraphBuilderUtil.java | 8 +- .../scribble/core/model/global/SModel.java | 10 +- .../core/type/session/global/GChoice.java | 10 +- .../core/type/session/global/GConnect.java | 8 +- .../core/type/session/global/GContinue.java | 6 +- .../core/type/session/global/GDisconnect.java | 10 +- .../core/type/session/global/GDo.java | 6 +- .../type/session/global/GMessageTransfer.java | 8 +- .../core/type/session/global/GRecursion.java | 6 +- .../core/type/session/global/GSeq.java | 6 +- .../core/type/session/global/GType.java | 6 +- .../core/type/session/local/LAcc.java | 4 +- .../core/type/session/local/LChoice.java | 4 +- .../core/type/session/local/LContinue.java | 6 +- .../core/type/session/local/LDisconnect.java | 4 +- .../scribble/core/type/session/local/LDo.java | 4 +- .../core/type/session/local/LRcv.java | 4 +- .../core/type/session/local/LRecursion.java | 4 +- .../core/type/session/local/LReq.java | 4 +- .../core/type/session/local/LSend.java | 4 +- .../core/type/session/local/LSeq.java | 6 +- .../core/type/session/local/LSkip.java | 4 +- .../core/type/session/local/LType.java | 4 +- .../job => util}/AntlrSourceException.java | 2 +- .../RuntimeScribException.java} | 14 +- .../ScribException.java} | 16 +- .../scribble/util/ScribParserException.java | 2 +- .../util/{ScribUtil2.java => ScribUtil.java} | 16 +- .../src/main/java/org/scribble/main/Main.java | 39 ++-- .../org/scribble/main/ScribAntlrWrapper.java | 129 ++++++++++++ .../main/resource/InlineResource.java | 3 +- .../resource/loader/DefaultModuleLoader.java | 4 +- .../main/resource/loader/ModuleLoader.java | 4 +- .../resource/loader/ScribModuleLoader.java | 47 ++--- .../locator/DirectoryResourceLocator.java | 21 +- .../resource/locator/IResourceLocator.java | 5 +- .../parser/scribble/ScribbleAntlrWrapper.java | 163 -------------- .../scribble/AntlrToScribParserUtil.java | 99 --------- .../scribble/ScribbleAntlrConstants.java | 198 ------------------ .../runtime/net/BinaryChannelEndpoint.java | 6 +- .../runtime/session/EndpointInputQueues.java | 6 +- .../org/scribble/runtime/session/Session.java | 10 +- .../runtime/session/SessionEndpoint.java | 6 +- .../java/org/scribble/test/ScribTestBase.java | 6 +- scribble-test/src/test/scrib/tmp/Test.scr | 11 +- 216 files changed, 1073 insertions(+), 1398 deletions(-) rename scribble-ast/src/main/java/org/scribble/util/{ScribUtil.java => ScribNodeUtil.java} (98%) rename scribble-core/src/main/java/org/scribble/{core/job => util}/AntlrSourceException.java (98%) rename scribble-core/src/main/java/org/scribble/{core/job/RuntimeScribbleException.java => util/RuntimeScribException.java} (73%) rename scribble-core/src/main/java/org/scribble/{core/job/ScribbleException.java => util/ScribException.java} (73%) rename scribble-core/src/main/java/org/scribble/util/{ScribUtil2.java => ScribUtil.java} (84%) create mode 100644 scribble-main/src/main/java/org/scribble/main/ScribAntlrWrapper.java delete mode 100644 scribble-main/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParserUtil.java delete mode 100644 scribble-parser/src/main/java/org/scribble/parser/scribble/ScribbleAntlrConstants.java diff --git a/scribble-ast/src/main/java/org/scribble/ast/Choice.java b/scribble-ast/src/main/java/org/scribble/ast/Choice.java index fbfd05027..183a04163 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Choice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Choice.java @@ -20,10 +20,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.del.ScribDel; import org.scribble.util.Constants; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; public abstract class Choice extends CompoundInteraction @@ -65,7 +65,7 @@ public Choice reconstruct(RoleNode subj, List> blo } @Override - public Choice visitChildren(AstVisitor nv) throws ScribbleException + public Choice visitChildren(AstVisitor nv) throws ScribException { RoleNode subj = (RoleNode) visitChild(getSubjectChild(), nv); List> blocks = diff --git a/scribble-ast/src/main/java/org/scribble/ast/Continue.java b/scribble-ast/src/main/java/org/scribble/ast/Continue.java index 67d871ee6..368ab865e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Continue.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Continue.java @@ -16,10 +16,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.del.ScribDel; import org.scribble.util.Constants; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; public abstract class Continue @@ -56,7 +56,7 @@ public Continue reconstruct(RecVarNode recvar) } @Override - public Continue visitChildren(AstVisitor nv) throws ScribbleException + public Continue visitChildren(AstVisitor nv) throws ScribException { RecVarNode recvar = (RecVarNode) visitChild(getRecVarChild(), nv); return reconstruct(recvar); diff --git a/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java index dae933af8..79b1b0ee4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java @@ -20,10 +20,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // FIXME: rename (Simple)Interaction, after existing SimpleInteraction renamed @@ -90,7 +90,7 @@ public DirectedInteraction reconstruct(MessageNode msg, RoleNode src, @Override public DirectedInteraction visitChildren(AstVisitor nv) - throws ScribbleException + throws ScribException { MessageNode msg = (MessageNode) visitChild(getMessageNodeChild(), nv); RoleNode src = (RoleNode) visitChild(getSourceChild(), nv); diff --git a/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java b/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java index 6c3ba22f1..27bec11d0 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java @@ -16,9 +16,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // (G)Disconnect is symmetric (send/receive asymmetric/async; request/accept asymmetric/sync; (g)disconnect symmetric/async) @@ -66,7 +66,7 @@ public DisconnectAction reconstruct(RoleNode left, RoleNode right) @Override public DisconnectAction visitChildren(AstVisitor nv) - throws ScribbleException + throws ScribException { RoleNode src = (RoleNode) visitChild(getLeftChild(), nv); RoleNode dest = (RoleNode) visitChild(getRightChild(), nv); diff --git a/scribble-ast/src/main/java/org/scribble/ast/Do.java b/scribble-ast/src/main/java/org/scribble/ast/Do.java index 94464d6e5..963754ff8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Do.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Do.java @@ -18,7 +18,6 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.ProtocolNameNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.ProtocolName; @@ -26,6 +25,7 @@ import org.scribble.del.ScribDel; import org.scribble.lang.LangContext; import org.scribble.util.Constants; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; public abstract class Do @@ -77,7 +77,7 @@ public Do reconstruct(RoleArgList roles, NonRoleArgList args, ProtocolNameNod } @Override - public Do visitChildren(AstVisitor nv) throws ScribbleException + public Do visitChildren(AstVisitor nv) throws ScribException { RoleArgList ril = (RoleArgList) visitChild(getRoleListChild(), nv); NonRoleArgList al = (NonRoleArgList) visitChild(getNonRoleListChild(), nv); diff --git a/scribble-ast/src/main/java/org/scribble/ast/DoArg.java b/scribble-ast/src/main/java/org/scribble/ast/DoArg.java index 44bfecf5c..712b94bd0 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DoArg.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DoArg.java @@ -15,9 +15,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // TODO: rename better? DoArg, DoArgNode, ... @@ -54,7 +54,7 @@ public DoArg reconstruct(T arg) } @Override - public DoArg visitChildren(AstVisitor nv) throws ScribbleException + public DoArg visitChildren(AstVisitor nv) throws ScribException { ScribNode visited = visitChild(getValChild(), nv); // Disambiguation will replace AmbiguousNameNodes // CHECKME: use visitChildWithClassEqualityCheck? diff --git a/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java b/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java index d3ed09228..31a443893 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java @@ -19,9 +19,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // Cf. HeaderParameterDeclList -- but not kinded, because cannot determine Arg kind directly from node syntax itself (kinding for ModelNodes is to supplement syntactic information, not "typing" work) @@ -65,7 +65,7 @@ public DoArgList reconstruct(List args) public abstract DoArgList project(AstFactory af, Role self); @Override - public DoArgList visitChildren(AstVisitor nv) throws ScribbleException + public DoArgList visitChildren(AstVisitor nv) throws ScribException { List nds = visitChildListWithClassEqualityCheck(this, getArgChildren(), nv); diff --git a/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java index a64f74e51..b16b34f25 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java @@ -17,10 +17,10 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; import org.scribble.ast.name.simple.SimpleNameNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ParamKind; import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // Names that are declared in a protocol header (roles and parameters -- not the protocol name though) @@ -56,7 +56,7 @@ public HeaderParamDecl reconstruct(NameNode name) // Always a "simple" na @Override public HeaderParamDecl visitChildren(AstVisitor nv) - throws ScribbleException + throws ScribException { NameNode name = visitChildWithClassEqualityCheck(this, getNameNodeChild(), nv); diff --git a/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDeclList.java index 774248bdc..a0e21e472 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDeclList.java @@ -19,10 +19,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ParamKind; import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -60,7 +60,7 @@ public HeaderParamDeclList reconstruct( @Override public HeaderParamDeclList visitChildren(AstVisitor nv) - throws ScribbleException + throws ScribException { List> nds = visitChildListWithClassEqualityCheck(this, getParamDeclChildren(), nv); diff --git a/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java b/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java index 3a7308c4b..8b5ed1f22 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java @@ -16,11 +16,11 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ModuleKind; import org.scribble.core.type.name.ModuleName; import org.scribble.del.ScribDel; import org.scribble.util.Constants; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; public class ImportModule extends ImportDecl @@ -41,12 +41,15 @@ protected ImportModule(ImportModule node) this.alias = null; } + // Full name ("import x.y.Z") public ModuleNameNode getModuleNameNodeChild() { return (ModuleNameNode) getChild(0); } - // No child if no alias (cf., this.hasAlias) + // Pre: hasAlias + // Simple name + // No child (null) if no alias public ModuleNameNode getAliasNameNodeChild() { return (ModuleNameNode) getChild(1); @@ -74,7 +77,7 @@ public ImportModule reconstruct(ModuleNameNode modname, ModuleNameNode alias) } @Override - public ImportModule visitChildren(AstVisitor nv) throws ScribbleException + public ImportModule visitChildren(AstVisitor nv) throws ScribException { ModuleNameNode modname = (ModuleNameNode) visitChild(getModuleNameNodeChild(), nv); diff --git a/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java b/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java index b76bff74e..a8f84f840 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java +++ b/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java @@ -19,9 +19,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; public abstract class InteractionSeq @@ -61,7 +61,7 @@ public InteractionSeq reconstruct(List> ins) } @Override - public ScribNode visitChildren(AstVisitor nv) throws ScribbleException + public ScribNode visitChildren(AstVisitor nv) throws ScribException { List> actions = new LinkedList<>(); for (SessionNode in : getInteractionChildren()) diff --git a/scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java b/scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java index ca2a097b2..33591ba14 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java @@ -16,9 +16,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.OpNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.session.MessageSig; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; public class MessageSigNode extends ScribNodeBase implements MessageNode @@ -66,7 +66,7 @@ public MessageSigNode reconstruct(OpNode op, PayloadElemList payload) } @Override - public MessageSigNode visitChildren(AstVisitor nv) throws ScribbleException + public MessageSigNode visitChildren(AstVisitor nv) throws ScribException { OpNode op = (OpNode) visitChild(getOpChild(), nv); PayloadElemList pay = (PayloadElemList) diff --git a/scribble-ast/src/main/java/org/scribble/ast/Module.java b/scribble-ast/src/main/java/org/scribble/ast/Module.java index 55a9bb39b..a2a51752c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Module.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Module.java @@ -23,7 +23,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.local.LProtocolDecl; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Kind; import org.scribble.core.type.kind.ProtocolKind; @@ -32,6 +31,7 @@ import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.ProtocolName; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; public class Module extends ScribNodeBase @@ -87,7 +87,7 @@ protected Module reconstruct(ModuleDecl moddecl, List> imports, } @Override - public Module visitChildren(AstVisitor nv) throws ScribbleException + public Module visitChildren(AstVisitor nv) throws ScribException { ModuleDecl moddecl = (ModuleDecl) visitChild(getModuleDeclChild(), nv); // class equality check probably too restrictive -- FIXME: remove class checks diff --git a/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java index 9ce6fba80..63c25d7e0 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java @@ -19,11 +19,11 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ModuleKind; import org.scribble.core.type.name.ModuleName; import org.scribble.del.ScribDel; import org.scribble.util.Constants; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; public class ModuleDecl extends NameDeclNode @@ -64,7 +64,7 @@ protected ModuleDecl reconstruct(ModuleNameNode name) } @Override - public ModuleDecl visitChildren(AstVisitor nv) throws ScribbleException + public ModuleDecl visitChildren(AstVisitor nv) throws ScribException { ModuleNameNode name = (ModuleNameNode) visitChild(getNameNodeChild(), nv); //return nv.job.af.ModuleDecl(this.source, fullmodname); // cf., reconstruct diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java b/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java index d3060c584..f37cc6d62 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java @@ -17,9 +17,9 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; import org.scribble.ast.name.simple.IdNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.NonProtocolKind; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // Rename to something better @@ -89,7 +89,7 @@ public NonProtocolDecl reconstruct( @Override public NonProtocolDecl visitChildren(AstVisitor nv) - throws ScribbleException + throws ScribException { NameNode name = (NameNode) visitChildWithClassEqualityCheck(this, getNameNodeChild(), nv); diff --git a/scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java b/scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java index 1899fe26e..7c661bdb4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java @@ -19,10 +19,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.PayloadElemType; import org.scribble.core.type.session.Payload; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // Cf. DoArgList, but here we don't need as much abstraction (cf. RoleArgList, NonRoleArgList) @@ -63,7 +63,7 @@ protected PayloadElemList reconstruct(List> elems) } @Override - public PayloadElemList visitChildren(AstVisitor nv) throws ScribbleException + public PayloadElemList visitChildren(AstVisitor nv) throws ScribException { List> elems = visitChildListWithClassEqualityCheck(this, getElementChildren(), nv); diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java index 5f6888839..a87823823 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java @@ -15,9 +15,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; public abstract class ProtocolBlock @@ -57,7 +57,7 @@ public ProtocolBlock reconstruct(InteractionSeq seq) } @Override - public ProtocolBlock visitChildren(AstVisitor nv) throws ScribbleException + public ProtocolBlock visitChildren(AstVisitor nv) throws ScribException { InteractionSeq seq = visitChildWithClassEqualityCheck(this, getInteractSeqChild(), nv); diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolDecl.java index 0e16a409f..d5ba9eb3e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolDecl.java @@ -18,10 +18,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // CHECKME: visitChildren for modifiers @@ -86,7 +86,7 @@ public ProtocolDecl reconstruct(ProtocolModList mods, } @Override - public ProtocolDecl visitChildren(AstVisitor nv) throws ScribbleException + public ProtocolDecl visitChildren(AstVisitor nv) throws ScribException { ProtocolModList mods = visitChildWithClassEqualityCheck(this, getModifierListChild(), nv); diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolDef.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolDef.java index 7ec53f0e5..677070f28 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolDef.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolDef.java @@ -15,9 +15,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; public abstract class ProtocolDef extends ScribNodeBase @@ -51,7 +51,7 @@ public ProtocolDef reconstruct(ProtocolBlock block) } @Override - public ProtocolDef visitChildren(AstVisitor nv) throws ScribbleException + public ProtocolDef visitChildren(AstVisitor nv) throws ScribException { ProtocolBlock block = visitChildWithClassEqualityCheck(this, getBlockChild(), nv); diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolHeader.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolHeader.java index 8dd156752..4e48dc853 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolHeader.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolHeader.java @@ -17,11 +17,11 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; import org.scribble.ast.name.qualified.ProtocolNameNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.ProtocolName; import org.scribble.del.ScribDel; import org.scribble.util.Constants; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // TODO: parameterize on global/local name node and role decl list (i.e. self roles) @@ -73,7 +73,7 @@ public ProtocolHeader reconstruct(ProtocolNameNode name, } @Override - public ProtocolHeader visitChildren(AstVisitor nv) throws ScribbleException + public ProtocolHeader visitChildren(AstVisitor nv) throws ScribException { /*ProtocolNameNode nameNodeChild = (ProtocolNameNode) visitChild( getNameNodeChild(), nv);*/ // Don't really need to visit, and can avoid generic cast diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolMod.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolMod.java index 5964d5fba..ba8388e2a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolMod.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolMod.java @@ -14,7 +14,7 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.core.job.ScribbleException; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; public abstract class ProtocolMod extends ScribNodeBase @@ -42,7 +42,7 @@ public boolean isExplicit() } @Override - public ProtocolMod visitChildren(AstVisitor nv) throws ScribbleException + public ProtocolMod visitChildren(AstVisitor nv) throws ScribException { return this; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolModList.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolModList.java index 26492f0ca..e9f23dbb0 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolModList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolModList.java @@ -17,7 +17,7 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.scribble.core.job.ScribbleException; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // (Currently) a list of mod leaf nodes as AmbigNameNodes (cf., NameNode "elements") @@ -42,7 +42,7 @@ public ProtocolModList dupNode() } @Override - public ProtocolModList visitChildren(AstVisitor nv) throws ScribbleException + public ProtocolModList visitChildren(AstVisitor nv) throws ScribException { // CHECKME: no child visiting, no reconstruct? return this; diff --git a/scribble-ast/src/main/java/org/scribble/ast/Recursion.java b/scribble-ast/src/main/java/org/scribble/ast/Recursion.java index 0ec248b84..88e671d33 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Recursion.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Recursion.java @@ -16,10 +16,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.del.ScribDel; import org.scribble.util.Constants; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; public abstract class Recursion @@ -61,7 +61,7 @@ public Recursion reconstruct(RecVarNode recvar, ProtocolBlock block) } @Override - public Recursion visitChildren(AstVisitor nv) throws ScribbleException + public Recursion visitChildren(AstVisitor nv) throws ScribException { RecVarNode recvar = (RecVarNode) visitChild(getRecVarChild(), nv); ProtocolBlock block = visitChildWithClassEqualityCheck(this, diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java index 5a24633d0..7c572c19b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java @@ -17,8 +17,8 @@ import org.antlr.runtime.tree.CommonTree; import org.antlr.runtime.tree.Tree; -import org.scribble.core.job.ScribbleException; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; import org.scribble.visit.SimpleVisitor; import org.scribble.visit.Substitutor; @@ -44,7 +44,7 @@ public interface ScribNode extends Tree ScribDel del(); ScribNode del(ScribDel del); - default T visitWith(SimpleVisitor v) throws ScribbleException // "Top-level" visitor entry method + default T visitWith(SimpleVisitor v) throws ScribException // "Top-level" visitor entry method { return v.visit(this); // N.B. ScribNode has getParent } @@ -58,6 +58,6 @@ default T visitWith(SimpleVisitor v) throws ScribbleException // "Top-le // Previously: for parsed entities, null if not parsed // Now: for the original parsed entity for error blaming; should not be null unless a "purely generated" entity - ScribNode accept(AstVisitor nv) throws ScribbleException; // The "top-level" method, e.g., module.accept(v) (cf. Job::runVisitorOnModule) - ScribNode visitChildren(AstVisitor nv) throws ScribbleException; + ScribNode accept(AstVisitor nv) throws ScribException; // The "top-level" method, e.g., module.accept(v) (cf. Job::runVisitorOnModule) + ScribNode visitChildren(AstVisitor nv) throws ScribException; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java index 5ccd7c684..39271bfed 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -20,14 +20,14 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.RuntimeScribbleException; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.del.ScribDel; +import org.scribble.util.RuntimeScribException; +import org.scribble.util.ScribNodeUtil; import org.scribble.util.ScribUtil; -import org.scribble.util.ScribUtil2; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; import org.scribble.visit.Substitutor; @@ -158,22 +158,22 @@ public static final T del(T n, ScribDel del) ScribNodeBase copy = ((ScribNodeBase) n).clone(); // Need deep clone, since children have parent field //copy.del = del; copy.setDel(del); - return ScribUtil.castNodeByClass(n, copy); + return ScribNodeUtil.castNodeByClass(n, copy); } @Override - public ScribNode accept(AstVisitor nv) throws ScribbleException + public ScribNode accept(AstVisitor nv) throws ScribException { return nv.visit(null, this); } @Override - public ScribNode visitChildren(AstVisitor nv) throws ScribbleException + public ScribNode visitChildren(AstVisitor nv) throws ScribException { return this; } - protected ScribNode visitChild(ScribNode child, AstVisitor nv) throws ScribbleException + protected ScribNode visitChild(ScribNode child, AstVisitor nv) throws ScribException { return nv.visit(this, child); // cf. child.accept(nv) ? } @@ -188,20 +188,20 @@ public ScribNode substituteNames(Substitutor subs) // Used when a generic cast would otherwise be needed (non-generic children casts don't need this) -- doesn't check any generic parameters, relies on concrete values being instances of non-parameterised types // Subtype constraint on visited could still be too restrictive, e.g. AmbigNameNodeDel (although it doesn't matter there), e.g. unfolding continue's into recursion's protected final static T visitChildWithClassEqualityCheck( - ScribNode parent, T child, AstVisitor nv) throws ScribbleException + ScribNode parent, T child, AstVisitor nv) throws ScribException { ScribNode visited = ((ScribNodeBase) parent).visitChild(child, nv); // Same subtyping flexibility as standard cast - return ScribUtil.checkNodeClassEquality(child, visited); + return ScribNodeUtil.checkNodeClassEquality(child, visited); } protected final static List visitChildListWithClassEqualityCheck( ScribNode parent, List children, AstVisitor nv) - throws ScribbleException + throws ScribException { return visitChildListWith(parent, children, nv, - (T t) -> ScribUtil2.handleLambdaScribbleException( + (T t) -> ScribUtil.handleLambdaScribbleException( () -> ScribNodeBase .visitChildWithClassEqualityCheck(parent, t, nv))); // -> T } @@ -209,7 +209,7 @@ protected final static T visitChildWithClassEqualityCheck( // Just a list-map with handling for promoted exceptions (via handleLambdaScribbleException) -- could move to Util (where handleLambdaScribbleException is) private final static List visitChildListWith( ScribNode parent, List children, AstVisitor nv, Function c) - throws ScribbleException + throws ScribException { /*List visited = new LinkedList<>(); for (T n : children) @@ -223,12 +223,12 @@ private final static List visitChi return children.stream().map(n -> c.apply(n)) .collect(Collectors.toList()); } - catch (RuntimeScribbleException rse) + catch (RuntimeScribException rse) { Throwable cause = rse.getCause(); - if (cause instanceof ScribbleException) + if (cause instanceof ScribException) { - throw (ScribbleException) cause; + throw (ScribException) cause; } throw (RuntimeException) cause; } @@ -243,7 +243,7 @@ private final static List visitChi R extends ProtocolKindNode> R visitProtocolKindChildWithCastCheck( ScribNode parent, ScribNode child, AstVisitor nv, Class clazz, K kind, - Function cast) throws ScribbleException + Function cast) throws ScribException { ScribNode visited = ((ScribNodeBase) parent).visitChild(child, nv); if (!clazz.isAssignableFrom(visited.getClass())) @@ -265,10 +265,10 @@ R visitProtocolKindChildWithCastCheck( K extends ProtocolKind, R extends ProtocolKindNode> List visitProtocolKindChildListWithCastCheck( ScribNode parent, List children, AstVisitor nv, Class c, K k, - Function f) throws ScribbleException + Function f) throws ScribException { return visitChildListWith(parent, children, nv, - (T t) -> ScribUtil2.handleLambdaScribbleException( + (T t) -> ScribUtil.handleLambdaScribbleException( () -> ScribNodeBase .visitProtocolKindChildWithCastCheck(parent, t, nv, c, k, f))); // -> R diff --git a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java index 97a3973c7..ca8f471f7 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java @@ -16,10 +16,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.PayloadElemNameNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.PayloadTypeKind; import org.scribble.core.type.name.PayloadElemType; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -72,7 +72,7 @@ public UnaryPayloadElem reconstruct(PayloadElemNameNode name) @Override public UnaryPayloadElem visitChildren(AstVisitor nv) - throws ScribbleException + throws ScribException { @SuppressWarnings("unchecked") PayloadElemNameNode name = (PayloadElemNameNode) visitChild( diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java index a4d04f420..d2c5103f7 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java @@ -25,10 +25,10 @@ import org.scribble.ast.local.LChoice; import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.RuntimeScribbleException; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; +import org.scribble.util.RuntimeScribException; +import org.scribble.util.ScribException; public class GChoice extends Choice implements GCompoundInteraction { @@ -92,9 +92,9 @@ public LChoice project(AstFactory af, Role self, List blocks) merged = merged.merge(af, cs.get(i)); // Merge currently does "nothing"; validation takes direct non-deterministic interpretation -- purpose of syntactic merge is to convert non-det to "equivalent" safe det in certain sitations } } - catch (ScribbleException e) // HACK + catch (ScribException e) // HACK { - throw new RuntimeScribbleException(e); + throw new RuntimeScribException(e); } projection = merged; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java index 9403c879c..6a887c26a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java @@ -21,11 +21,11 @@ import org.scribble.ast.local.LDelegationElem; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.GDelegationType; import org.scribble.core.type.name.PayloadElemType; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; import org.scribble.visit.context.Projector; @@ -89,7 +89,7 @@ public GDelegationElem reconstruct(GProtocolNameNode proto, RoleNode role) } @Override - public GDelegationElem visitChildren(AstVisitor nv) throws ScribbleException + public GDelegationElem visitChildren(AstVisitor nv) throws ScribException { GProtocolNameNode name = (GProtocolNameNode) visitChild(getProtocolChild(), nv); diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java index 089888d2e..4d428bf7f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java @@ -24,10 +24,10 @@ import org.scribble.ast.local.LProjectionDecl; import org.scribble.ast.local.LProtocolDef; import org.scribble.ast.local.LProtocolHeader; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.Role; +import org.scribble.util.ScribException; public class GProtocolDecl extends ProtocolDecl implements GScribNode { @@ -52,7 +52,7 @@ public GProtocolDecl dupNode() // CHECKME: project modifiers? public LProjectionDecl project(AstFactory af, Module mod, Role self, - LProtocolHeader hdr, LProtocolDef def) throws ScribbleException + LProtocolHeader hdr, LProtocolDef def) throws ScribException // mod is just the parent? { /*//Role self = proj.peekSelf(); diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java b/scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java index 41164e469..9378363ee 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java @@ -21,11 +21,11 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.RuntimeScribbleException; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; import org.scribble.util.Constants; +import org.scribble.util.RuntimeScribException; +import org.scribble.util.ScribException; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LAccept extends LConnectionAction implements LSimpleSessionNode @@ -58,9 +58,9 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) @Override public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribbleException + throws ScribException { - throw new RuntimeScribbleException("Invalid merge on LAccept: " + this); + throw new RuntimeScribException("Invalid merge on LAccept: " + this); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java b/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java index 2bbf35d14..566036ab8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java @@ -24,10 +24,10 @@ import org.scribble.ast.Choice; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; +import org.scribble.util.ScribException; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LChoice extends Choice implements LCompoundInteraction @@ -67,11 +67,11 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) } @Override - public LChoice merge(AstFactory af, LSessionNode ln) throws ScribbleException + public LChoice merge(AstFactory af, LSessionNode ln) throws ScribException { if (!(ln instanceof LChoice) || !this.canMerge(ln)) { - throw new ScribbleException("Cannot merge " + this.getClass() + " and " + throw new ScribException("Cannot merge " + this.getClass() + " and " + ln.getClass() + ": " + this + ", " + ln); } LChoice them = (LChoice) ln; diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java b/scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java index a2e40cdd8..854ace1a7 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java @@ -21,10 +21,10 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Continue; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; +import org.scribble.util.ScribException; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LContinue extends Continue implements LSimpleSessionNode @@ -63,17 +63,17 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) @Override public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribbleException + throws ScribException { if (!(ln instanceof LContinue) || !this.canMerge(ln)) { - throw new ScribbleException("Cannot merge " + this.getClass() + " and " + throw new ScribException("Cannot merge " + this.getClass() + " and " + ln.getClass() + ": " + this + ", " + ln); } LContinue them = ((LContinue) ln); if (!getRecVarChild().equals(them.getRecVarChild())) { - throw new ScribbleException("Cannot merge choices for " + getRecVarChild() + throw new ScribException("Cannot merge choices for " + getRecVarChild() + " and " + them.getRecVarChild() + ": " + this + ", " + ln); } return clone(); diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java b/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java index e95c29a89..55f13c0b3 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java @@ -22,12 +22,12 @@ import org.scribble.ast.DisconnectAction; import org.scribble.ast.MessageSigNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.RuntimeScribbleException; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; import org.scribble.util.Constants; +import org.scribble.util.RuntimeScribException; +import org.scribble.util.ScribException; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; // "left" of LDisconnect is used for self @@ -76,9 +76,9 @@ public LDisconnect dupNode() @Override public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribbleException + throws ScribException { - throw new RuntimeScribbleException("Invalid merge on LDisconnect: " + this); + throw new RuntimeScribException("Invalid merge on LDisconnect: " + this); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java b/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java index 37236e0e2..cc28ac729 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java @@ -24,14 +24,14 @@ import org.scribble.ast.NonRoleArgList; import org.scribble.ast.RoleArgList; import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.core.job.RuntimeScribbleException; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; import org.scribble.lang.LangContext; +import org.scribble.util.RuntimeScribException; +import org.scribble.util.ScribException; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LDo extends Do implements LSimpleSessionNode @@ -84,9 +84,9 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) @Override public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribbleException + throws ScribException { - throw new RuntimeScribbleException("Invalid merge on LDo: " + this); + throw new RuntimeScribException("Invalid merge on LDo: " + this); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LReceive.java b/scribble-ast/src/main/java/org/scribble/ast/local/LReceive.java index f6f74dfa2..382a3c8b8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LReceive.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LReceive.java @@ -22,11 +22,11 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.RuntimeScribbleException; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; import org.scribble.util.Constants; +import org.scribble.util.RuntimeScribException; +import org.scribble.util.ScribException; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LReceive extends LMessageTransfer implements LSimpleSessionNode @@ -59,9 +59,9 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) @Override public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribbleException + throws ScribException { - throw new RuntimeScribbleException("Invalid merge on LReceive: " + this); + throw new RuntimeScribException("Invalid merge on LReceive: " + this); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java b/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java index d3b977665..c949b182f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java @@ -20,10 +20,10 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Recursion; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; +import org.scribble.util.ScribException; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LRecursion extends Recursion implements LCompoundInteraction @@ -62,18 +62,18 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) @Override public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribbleException + throws ScribException { if (!(ln instanceof LRecursion) || !this.canMerge(ln)) { - throw new ScribbleException("Cannot merge " + getClass() + " and " + throw new ScribException("Cannot merge " + getClass() + " and " + ln.getClass() + ": " + this + ", " + ln); } LRecursion them = ((LRecursion) ln); if (!getRecVarChild().toName() .equals(them.getRecVarChild().toName())) { - throw new ScribbleException( + throw new ScribException( "Cannot merge recursions for " + getRecVarChild() + " and " + them.getRecVarChild() + ": " + this + ", " + ln); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java b/scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java index abe9c0143..1bf410549 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java @@ -21,11 +21,11 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.RuntimeScribbleException; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; import org.scribble.util.Constants; +import org.scribble.util.RuntimeScribException; +import org.scribble.util.ScribException; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LRequest extends LConnectionAction implements LSimpleSessionNode @@ -58,9 +58,9 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) @Override public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribbleException + throws ScribException { - throw new RuntimeScribbleException("Invalid merge on LRequest: " + this); + throw new RuntimeScribException("Invalid merge on LRequest: " + this); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java index 37da3da7c..a281ede07 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java @@ -23,11 +23,11 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.RuntimeScribbleException; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; import org.scribble.util.Constants; +import org.scribble.util.RuntimeScribException; +import org.scribble.util.ScribException; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LSend extends LMessageTransfer @@ -60,9 +60,9 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) @Override public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribbleException + throws ScribException { - throw new RuntimeScribbleException("Invalid merge on LSend: " + this); + throw new RuntimeScribException("Invalid merge on LSend: " + this); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java index 6f265d77a..a5bd11504 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java @@ -17,10 +17,10 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.SessionNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; +import org.scribble.util.ScribException; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; // Alternatively to interface, use GlobalNode subclass with delegation to "super" base (e.g. Choice) classes @@ -29,7 +29,7 @@ public interface LSessionNode extends SessionNode, LScribNode Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer); // "merge" currently does "nothing"; validation takes direct non-deterministic interpretation -- purpose of syntactic merge would be to convert non-det to "equivalent" safe det in certain sitations - LSessionNode merge(AstFactory af, LSessionNode ln) throws ScribbleException; + LSessionNode merge(AstFactory af, LSessionNode ln) throws ScribException; boolean canMerge(LSessionNode ln); Set getEnabling(); diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java index 83d2e055f..634a8cc57 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java @@ -21,11 +21,11 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MessageSigNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.RuntimeScribbleException; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; import org.scribble.util.Constants; +import org.scribble.util.RuntimeScribException; +import org.scribble.util.ScribException; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LWrapClient extends LConnectionAction @@ -59,9 +59,9 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) @Override public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribbleException + throws ScribException { - throw new RuntimeScribbleException("Invalid merge on LWrapClient: " + this); + throw new RuntimeScribException("Invalid merge on LWrapClient: " + this); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java index d895999a8..3b3788ec3 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java @@ -21,11 +21,11 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MessageSigNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.RuntimeScribbleException; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; import org.scribble.util.Constants; +import org.scribble.util.RuntimeScribException; +import org.scribble.util.ScribException; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LWrapServer extends LConnectionAction implements LSimpleSessionNode @@ -57,9 +57,9 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) @Override public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribbleException + throws ScribException { - throw new RuntimeScribbleException("Invalid merge on LWrapServer: " + this); + throw new RuntimeScribException("Invalid merge on LWrapServer: " + this); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/del/ChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/ChoiceDel.java index 9982221cd..8b192bb8e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ChoiceDel.java @@ -18,7 +18,7 @@ import org.scribble.ast.Choice; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; +import org.scribble.util.ScribException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.env.UnfoldingEnv; import org.scribble.visit.wf.ExplicitCorrelationChecker; @@ -32,7 +32,7 @@ public ChoiceDel() } @Override - public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf) throws ScribbleException + public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf) throws ScribException { UnfoldingEnv env = unf.peekEnv().enterContext(); env = env.pushChoiceParent(); // Above is already a copy, but fine @@ -40,7 +40,7 @@ public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, Inl } @Override - public Choice leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) throws ScribbleException + public Choice leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) throws ScribException { Choice cho = (Choice) visited; List benvs = @@ -51,14 +51,14 @@ public Choice leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child } @Override - public void enterExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker) throws ScribbleException + public void enterExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker) throws ScribException { ExplicitCorrelationEnv env = checker.peekEnv().enterContext(); checker.pushEnv(env); } @Override - public Choice leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribbleException + public Choice leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribException { Choice cho = (Choice) visited; List benvs = diff --git a/scribble-ast/src/main/java/org/scribble/del/CompoundInteractionDel.java b/scribble-ast/src/main/java/org/scribble/del/CompoundInteractionDel.java index 71d18fc14..32a57013c 100644 --- a/scribble-ast/src/main/java/org/scribble/del/CompoundInteractionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/CompoundInteractionDel.java @@ -15,7 +15,7 @@ import org.scribble.ast.CompoundInteraction; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; +import org.scribble.util.ScribException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; @@ -34,13 +34,13 @@ public CompoundInteractionDel() } @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribbleException + public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribException { ScribDelBase.pushVisitorEnv(this, inl); } @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribException { return ScribDelBase.popAndSetVisitorEnv(this, inl, visited); } @@ -50,7 +50,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, Protoc // Should only do for projections, but OK here (visitor only run on projections) @Override - public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribbleException + public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribException { // Override super routine (in CompoundInteractionDel, which just does base popAndSet) to do merging of child context into parent context UnguardedChoiceDoEnv visited_env = checker.popEnv(); // popAndSet current @@ -62,7 +62,7 @@ public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNo } @Override - public ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) throws ScribbleException + public ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) throws ScribException { // Override super routine (in CompoundInteractionDel, which just does base popAndSet) to do merging of child context into parent context // Need to further override for "compound" nodes with block children, e.g., Choice/RecursionDel, to merge children together and then into current (then call here via super to set and merge current into parent) @@ -75,7 +75,7 @@ public ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child } @Override - public CompoundInteraction leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException + public CompoundInteraction leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribException { WFChoiceEnv visited_env = checker.popEnv(); // popAndSet current setEnv(visited_env); @@ -86,7 +86,7 @@ public CompoundInteraction leaveInlinedWFChoiceCheck(ScribNode parent, ScribN } @Override - public ScribNode leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribbleException + public ScribNode leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribException { // Override super routine (in CompoundInteractionDel, which just does base popAndSet) to do merging of child context into parent context // Need to further override for "multi-compound" nodes, e.g., ChoiceDel diff --git a/scribble-ast/src/main/java/org/scribble/del/CompoundSessionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/CompoundSessionNodeDel.java index c4807b710..473f0d842 100644 --- a/scribble-ast/src/main/java/org/scribble/del/CompoundSessionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/CompoundSessionNodeDel.java @@ -14,7 +14,7 @@ package org.scribble.del; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; +import org.scribble.util.ScribException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; import org.scribble.visit.wf.ExplicitCorrelationChecker; @@ -30,53 +30,53 @@ public CompoundSessionNodeDel() // Should only do for projections, but OK here (visitor only run on projections) @Override - public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker) throws ScribbleException + public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker) throws ScribException { ScribDelBase.pushVisitorEnv(this, checker); } // Should only do for projections, but OK here (visitor only run on projections) @Override - public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribbleException + public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribException { // Overridden in CompoundInteractionNodeDel to do merging of child context into parent context return ScribDelBase.popAndSetVisitorEnv(this, checker, visited); } @Override - public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf) throws ScribbleException + public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf) throws ScribException { ScribDelBase.pushVisitorEnv(this, unf); } @Override - public ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) throws ScribbleException + public ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) throws ScribException { // Overridden in CompoundInteractionNodeDel to do merging of child context into parent context return ScribDelBase.popAndSetVisitorEnv(this, unf, visited); } @Override - public void enterInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker) throws ScribbleException + public void enterInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker) throws ScribException { ScribDelBase.pushVisitorEnv(this, checker); } @Override - public ScribNode leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException + public ScribNode leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribException { // Overridden in CompoundInteractionNodeDel to do merging of child context into parent context return ScribDelBase.popAndSetVisitorEnv(this, checker, visited); } @Override - public void enterExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker) throws ScribbleException + public void enterExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker) throws ScribException { ScribDelBase.pushVisitorEnv(this, checker); } @Override - public ScribNode leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribbleException + public ScribNode leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribException { // Overridden in CompoundInteractionNodeDel to do merging of child context into parent context return ScribDelBase.popAndSetVisitorEnv(this, checker, visited); diff --git a/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java b/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java index 589238f04..165b60b9d 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java @@ -15,7 +15,7 @@ import org.scribble.ast.ConnectAction; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; +import org.scribble.util.ScribException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.env.UnfoldingEnv; @@ -32,7 +32,7 @@ public ConnectionActionDel() @Override public ConnectAction leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) - throws ScribbleException + throws ScribException { ConnectAction c = (ConnectAction) visited; ConnectAction inlined = (ConnectAction) c.clone();//inl.job.af); @@ -42,7 +42,7 @@ public ConnectAction leaveProtocolInlining(ScribNode parent, @Override public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, - InlinedProtocolUnfolder unf) throws ScribbleException + InlinedProtocolUnfolder unf) throws ScribException { UnfoldingEnv env = unf.popEnv(); env = env.disableUnfold(); diff --git a/scribble-ast/src/main/java/org/scribble/del/ContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/ContinueDel.java index 4ecec18e6..a99116e1d 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ContinueDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ContinueDel.java @@ -16,8 +16,8 @@ import org.scribble.ast.Continue; import org.scribble.ast.Recursion; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.RecVar; +import org.scribble.util.ScribException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.util.RecVarCollector; @@ -40,7 +40,7 @@ public Continue leaveProtocolInlining(ScribNode parent, ScribNode child, Prot @Override public ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) - throws ScribbleException + throws ScribException { Continue cont = (Continue) visited; RecVar rv = cont.getRecVarChild().toName(); @@ -62,7 +62,7 @@ else if (unf.shouldUnfoldForUnguardedRec(rv)) @Override public ScribNode leaveRecVarCollection(ScribNode parent, ScribNode child, - RecVarCollector coll, ScribNode visited) throws ScribbleException + RecVarCollector coll, ScribNode visited) throws ScribException { coll.removeName(((Continue) visited).getRecVarChild().toName()); return visited; diff --git a/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java index bd83a9bfc..de754368c 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java @@ -22,10 +22,10 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.name.ProtocolName; import org.scribble.lang.LangContext; +import org.scribble.util.ScribException; import org.scribble.visit.wf.NameDisambiguator; public abstract class DoArgListDel extends ScribDelBase @@ -38,14 +38,14 @@ public DoArgListDel() // Doing in leave allows the arguments to be individually checked first @Override public DoArgList leaveDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb, ScribNode visited) throws ScribbleException + NameDisambiguator disamb, ScribNode visited) throws ScribException { DoArgList dal = (DoArgList) visited; List args = dal.getArgChildren(); ProtocolDecl pd = getTargetProtocolDecl((Do) parent, disamb); if (args.size() != getParamDeclList(pd).getParamDeclChildren().size()) { - throw new ScribbleException(visited.getSource(), + throw new ScribException(visited.getSource(), "Do arity mismatch for " + pd.getHeaderChild() + ": " + args); } @@ -54,7 +54,7 @@ public DoArgList leaveDisambiguation(ScribNode parent, ScribNode child, // Not using Do#getTargetProtocolDecl, because that currently relies on namedisamb pass to convert targets to fullnames (because it just gets the full name dependency, it doesn't do visible name resolution) protected ProtocolDecl getTargetProtocolDecl(Do parent, - NameDisambiguator disamb) throws ScribbleException + NameDisambiguator disamb) throws ScribException { ModuleContext mc = disamb.getModuleContext(); LangContext jc = disamb.job.getContext(); @@ -73,7 +73,7 @@ protected ProtocolDecl getTargetProtocolDecl(Do parent, .collect(Collectors.toList()); if (pd.size() != 1) { - throw new ScribbleException("[disamb] Target protocol ambiguous or not found: " + pn); + throw new ScribException("[disamb] Target protocol ambiguous or not found: " + pn); } return pd.get(0); } diff --git a/scribble-ast/src/main/java/org/scribble/del/DoDel.java b/scribble-ast/src/main/java/org/scribble/del/DoDel.java index acb17eed3..557d51998 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoDel.java @@ -16,13 +16,13 @@ import org.scribble.ast.Do; import org.scribble.ast.ScribNode; import org.scribble.ast.name.qualified.ProtocolNameNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.lang.LangContext; +import org.scribble.util.ScribException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.ProtocolDeclContextBuilder; import org.scribble.visit.wf.NameDisambiguator; @@ -36,7 +36,7 @@ public DoDel() @Override public void enterDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb) throws ScribbleException + NameDisambiguator disamb) throws ScribException { ModuleContext mc = disamb.getModuleContext(); Do doo = (Do) child; @@ -44,14 +44,14 @@ public void enterDisambiguation(ScribNode parent, ScribNode child, ProtocolName simpname = proto.toName(); if (!mc.isVisibleProtocolDeclName(simpname)) // CHECKME: do on entry here, before visiting DoArgListDel { - throw new ScribbleException(proto.getSource(), + throw new ScribException(proto.getSource(), "Protocol decl not visible: " + simpname); } } @Override public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb, ScribNode visited) throws ScribbleException + NameDisambiguator disamb, ScribNode visited) throws ScribException { return leaveDisambiguationAux(parent, child, disamb, visited); // To introduce type parameter @@ -62,7 +62,7 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, // TODO: refactor into G/LDoDel to bypass generic cast issues private ScribNode leaveDisambiguationAux( ScribNode parent, ScribNode child, NameDisambiguator disamb, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { @SuppressWarnings("unchecked") // Doesn't matter what K is, just need to propagate it down Do doo = (Do) visited; @@ -98,7 +98,7 @@ private ScribNode leaveDisambiguationAux( @Override public Do leaveProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) - throws ScribbleException + throws ScribException { LangContext jcontext = builder.job.getContext(); ModuleContext mcontext = builder.getModuleContext(); @@ -116,7 +116,7 @@ protected abstract void addProtocolDependency( @Override public void enterProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl) throws ScribbleException + ProtocolDefInliner inl) throws ScribException { super.enterProtocolInlining(parent, child, inl); if (!inl.isCycle()) diff --git a/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java b/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java index 4a7073387..f602364dd 100644 --- a/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java @@ -18,7 +18,7 @@ import org.scribble.ast.HeaderParamDecl; import org.scribble.ast.HeaderParamDeclList; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; +import org.scribble.util.ScribException; import org.scribble.visit.wf.NameDisambiguator; public abstract class HeaderParamDeclListDel extends ScribDelBase @@ -30,13 +30,13 @@ public HeaderParamDeclListDel() // Doing in leave allows the arguments to be individually checked first @Override - public HeaderParamDeclList leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + public HeaderParamDeclList leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { HeaderParamDeclList pdl = (HeaderParamDeclList) visited; List> decls = pdl.getParamDeclChildren(); // grammar enforces RoleDeclList size > 0 if (decls.size() != decls.stream().map((d) -> d.getDeclName()).distinct().count()) { - throw new ScribbleException(pdl.getSource(), "Duplicate header decls: " + pdl); + throw new ScribException(pdl.getSource(), "Duplicate header decls: " + pdl); } return pdl; } diff --git a/scribble-ast/src/main/java/org/scribble/del/InteractionSeqDel.java b/scribble-ast/src/main/java/org/scribble/del/InteractionSeqDel.java index 0d65f059c..4471fd256 100644 --- a/scribble-ast/src/main/java/org/scribble/del/InteractionSeqDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/InteractionSeqDel.java @@ -14,13 +14,13 @@ package org.scribble.del; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; +import org.scribble.util.ScribException; import org.scribble.visit.ProtocolDefInliner; public abstract class InteractionSeqDel extends ScribDelBase { @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribbleException + public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribException { ScribDelBase.pushVisitorEnv(this, inl); } diff --git a/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java index c941ffc7e..6f0d2e589 100644 --- a/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java @@ -20,9 +20,9 @@ import org.scribble.ast.PayloadElem; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GDelegationElem; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.MessageId; import org.scribble.del.global.GDelegationElemDel; +import org.scribble.util.ScribException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.ProtocolDeclContextBuilder; @@ -40,7 +40,7 @@ public MessageTransferDel() @Override public MessageTransfer leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) - throws ScribbleException + throws ScribException { MessageTransfer lr = (MessageTransfer) visited; MessageTransfer inlined = (MessageTransfer) lr.clone();//inl.job.af); @@ -58,7 +58,7 @@ public void enterChoiceUnguardedSubprotocolCheck(ScribNode parent, ScribNode chi @Override public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, - InlinedProtocolUnfolder unf) throws ScribbleException + InlinedProtocolUnfolder unf) throws ScribException { UnfoldingEnv env = unf.popEnv(); env = env.disableUnfold(); @@ -95,7 +95,7 @@ public ScribNode leaveMessageIdCollection(ScribNode parent, ScribNode child, @Override public MessageTransfer leaveProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) - throws ScribbleException + throws ScribException { MessageTransfer mt = (MessageTransfer) visited; MessageNode msg = mt.getMessageNodeChild(); diff --git a/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java b/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java index 5e6a634a3..9962980b0 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java @@ -32,11 +32,11 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.local.LProtocolDecl; import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.Role; +import org.scribble.util.ScribException; import org.scribble.visit.context.ModuleContextBuilder; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; @@ -57,7 +57,7 @@ private ModuleDel copy() @Override public void enterModuleContextBuilding(ScribNode parent, ScribNode child, - ModuleContextBuilder builder) throws ScribbleException + ModuleContextBuilder builder) throws ScribException { builder.setModuleContext( //new ModuleContext(builder.job.getContext().getParsed(), (Module) child) @@ -71,7 +71,7 @@ public void enterModuleContextBuilding(ScribNode parent, ScribNode child, // Maybe better to create on enter, so can be used during the context build pass (Context would need to be "cached" in the visitor to be accessed) @Override public Module leaveModuleContextBuilding(ScribNode parent, ScribNode child, - ModuleContextBuilder builder, ScribNode visited) throws ScribbleException + ModuleContextBuilder builder, ScribNode visited) throws ScribException { ModuleDel del = setModuleContext(builder.getModuleContext()); return (Module) visited.del(del); @@ -79,7 +79,7 @@ public Module leaveModuleContextBuilding(ScribNode parent, ScribNode child, @Override public Module leaveDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb, ScribNode visited) throws ScribbleException + NameDisambiguator disamb, ScribNode visited) throws ScribException { Module mod = (Module) visited; // Imports checked in ModuleContext -- that is built before disamb is run @@ -96,7 +96,7 @@ public Module leaveDisambiguation(ScribNode parent, ScribNode child, npds.stream() .filter(x -> dups1.contains(x.getDeclName().toString())) .collect(Collectors.toList()).get(0); - throw new ScribbleException(first.getSource(), + throw new ScribException(first.getSource(), "Duplicate non-protocol decls: " + first.getDeclName()); } List> pds = mod.getProtoDeclChildren(); @@ -113,7 +113,7 @@ public Module leaveDisambiguation(ScribNode parent, ScribNode child, .filter(x -> dups2 .contains(x.getHeaderChild().getDeclName().toString())) .collect(Collectors.toList()).get(0); - throw new ScribbleException(first.getSource(), + throw new ScribException(first.getSource(), "Duplicate protocol decls: " + first.getHeaderChild().getDeclName()); // Global and locals also required to be distinct diff --git a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java index 4be1cf8ff..006e55594 100644 --- a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java @@ -24,10 +24,10 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.NonRoleParamNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.DataTypeKind; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.SigKind; +import org.scribble.util.ScribException; import org.scribble.visit.wf.NameDisambiguator; public class NonRoleArgListDel extends DoArgListDel @@ -39,7 +39,7 @@ public NonRoleArgListDel() // Doing in leave allows the arguments to be individually checked first @Override - public NonRoleArgList leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + public NonRoleArgList leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { NonRoleArgList nral = (NonRoleArgList) super.leaveDisambiguation(parent, child, disamb, visited); // Checks matching arity @@ -56,7 +56,7 @@ public NonRoleArgList leaveDisambiguation(ScribNode parent, ScribNode child, Nam { if (!((NonRoleParamNode) val).kind.equals(kind)) { - throw new ScribbleException(arg.getSource(), + throw new ScribException(arg.getSource(), "Invalid arg " + arg + " for param kind: " + kind); } } @@ -64,7 +64,7 @@ else if (kind.equals(SigKind.KIND)) { if (!val.isMessageSigNode() && !val.isMessageSigNameNode()) { - throw new ScribbleException(arg.getSource(), + throw new ScribException(arg.getSource(), "Invalid arg " + arg + " for param kind: " + kind); } } @@ -72,7 +72,7 @@ else if (kind.equals(DataTypeKind.KIND)) { if (!val.isDataTypeNameNode()) { - throw new ScribbleException(arg.getSource(), + throw new ScribException(arg.getSource(), "Invalid arg " + arg + " for param kind: " + kind); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java index 88b59d44e..74421ea81 100644 --- a/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java @@ -15,13 +15,13 @@ import org.scribble.ast.NonRoleParamDecl; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; +import org.scribble.util.ScribException; import org.scribble.visit.wf.NameDisambiguator; public class NonRoleParamDeclDel extends ScribDelBase { @Override - public void enterDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb) throws ScribbleException + public void enterDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb) throws ScribException { NonRoleParamDecl pd = (NonRoleParamDecl) child; disamb.addParameter(pd.getDeclName(), pd.kind); diff --git a/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java index bdb703d7a..9b337d8c9 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java @@ -14,13 +14,13 @@ package org.scribble.del; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; +import org.scribble.util.ScribException; import org.scribble.visit.ProtocolDefInliner; public abstract class ProtocolBlockDel extends CompoundSessionNodeDel { @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribbleException + public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribException { ScribDelBase.pushVisitorEnv(this, inl); } diff --git a/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java index 6753ddb05..f9af96d25 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java @@ -19,12 +19,12 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.context.ProtocolDeclContext; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; +import org.scribble.util.ScribException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.ProtocolDeclContextBuilder; import org.scribble.visit.util.RoleCollector; @@ -44,7 +44,7 @@ protected ProtocolDeclDel() @Override public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb, ScribNode visited) throws ScribbleException + NameDisambiguator disamb, ScribNode visited) throws ScribException { disamb.clear(); return visited; @@ -53,7 +53,7 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, @Override public void enterProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder) - throws ScribbleException + throws ScribException { builder.clearProtocolDependencies(); // collect per protocoldecl all together, do not clear? @@ -70,7 +70,7 @@ protected abstract void addSelfDependency(ProtocolDeclContextBuilder builder, @Override public void enterProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl) throws ScribbleException + ProtocolDefInliner inl) throws ScribException { SubprotoSig subsig = inl.peekStack(); // SubprotocolVisitor has already entered subprotocol inl.setSubprotocolRecVar(subsig); @@ -78,14 +78,14 @@ public void enterProtocolInlining(ScribNode parent, ScribNode child, @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + ProtocolDefInliner inl, ScribNode visited) throws ScribException { return visited; } @Override public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, - RoleCollector coll, ScribNode visited) throws ScribbleException + RoleCollector coll, ScribNode visited) throws ScribException { ProtocolDecl pd = (ProtocolDecl) visited; Set occs = coll.getNames(); diff --git a/scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java index aa6315536..8f901e227 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java @@ -15,8 +15,8 @@ import org.scribble.ast.ProtocolDef; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.util.ScribException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.RecRemover; import org.scribble.visit.util.RecVarCollector; @@ -28,7 +28,7 @@ public abstract class ProtocolDefDel extends ScribDelBase protected abstract ProtocolDefDel copy(); @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribbleException + public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribException { ScribDelBase.pushVisitorEnv(this, inl); } @@ -54,7 +54,7 @@ public void enterRecRemoval(ScribNode parent, ScribNode child, RecRemover rem) { this.inlined.accept(rvc); // RecVarCollector not an InlinedProtocolVistor -- do simple visiting directly on inlined } - catch (ScribbleException e) + catch (ScribException e) { throw new RuntimeException(e); } diff --git a/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java index 839e78606..b3ced2333 100644 --- a/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java @@ -15,8 +15,8 @@ import org.scribble.ast.Recursion; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.RecVar; +import org.scribble.util.ScribException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.env.UnfoldingEnv; @@ -32,7 +32,7 @@ public RecursionDel() @Override public void enterDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb) throws ScribbleException + NameDisambiguator disamb) throws ScribException { Recursion rec = (Recursion) child; RecVar rv = rec.getRecVarChild().toName(); @@ -47,7 +47,7 @@ public void enterDisambiguation(ScribNode parent, ScribNode child, @Override public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb, ScribNode visited) throws ScribbleException + NameDisambiguator disamb, ScribNode visited) throws ScribException { Recursion rec = (Recursion) visited; /*RecVar rv = rec.recvar.toName(); @@ -59,7 +59,7 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, @Override public void enterProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inliner) throws ScribbleException + ProtocolDefInliner inliner) throws ScribException { super.enterProtocolInlining(parent, child, inliner); Recursion rec = (Recursion) child; @@ -68,7 +68,7 @@ public void enterProtocolInlining(ScribNode parent, ScribNode child, @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inliner, ScribNode visited) throws ScribbleException + ProtocolDefInliner inliner, ScribNode visited) throws ScribException { //Recursion rec = (Recursion) visited; RecVar origRV = ((Recursion) child).getRecVarChild().toName(); // visited may be already name mangled @@ -78,7 +78,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, @Override public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, - InlinedProtocolUnfolder unf) throws ScribbleException + InlinedProtocolUnfolder unf) throws ScribException { super.enterInlinedProtocolUnfolding(parent, child, unf); Recursion lr = (Recursion) child; @@ -89,7 +89,7 @@ public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, @Override public Recursion leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) - throws ScribbleException + throws ScribException { Recursion rec = (Recursion) visited; RecVar recvar = rec.getRecVarChild().toName(); diff --git a/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java index e3ddaba2c..d579b73bb 100644 --- a/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java @@ -19,8 +19,8 @@ import org.scribble.ast.RoleArgList; import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.Role; +import org.scribble.util.ScribException; import org.scribble.visit.wf.NameDisambiguator; public class RoleArgListDel extends DoArgListDel @@ -32,7 +32,7 @@ public RoleArgListDel() @Override public RoleArgList leaveDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb, ScribNode visited) throws ScribbleException + NameDisambiguator disamb, ScribNode visited) throws ScribException { visited = super.leaveDisambiguation(parent, child, disamb, visited); @@ -42,7 +42,7 @@ public RoleArgList leaveDisambiguation(ScribNode parent, ScribNode child, //if (roles.size() != new HashSet<>(roles).size()) if (roles.size() != roles.stream().distinct().count()) { - throw new ScribbleException(ral.getSource(), + throw new ScribException(ral.getSource(), "Duplicate role args: " + roles); } return ral; diff --git a/scribble-ast/src/main/java/org/scribble/del/RoleDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/RoleDeclDel.java index 68e993a56..053788bb2 100644 --- a/scribble-ast/src/main/java/org/scribble/del/RoleDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/RoleDeclDel.java @@ -15,22 +15,22 @@ import org.scribble.ast.RoleDecl; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.Role; +import org.scribble.util.ScribException; import org.scribble.visit.wf.NameDisambiguator; import org.scribble.visit.wf.WFChoiceChecker; public class RoleDeclDel extends ScribDelBase { @Override - public void enterDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb) throws ScribbleException + public void enterDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb) throws ScribException { RoleDecl rd = (RoleDecl) child; disamb.addRole(rd.getDeclName()); // Could check distinct here, but doing it uniformly in HeaderParamDeclListDel } @Override - public RoleDecl leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException + public RoleDecl leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribException { RoleDecl rd = (RoleDecl) visited; Role role = rd.getDeclName(); diff --git a/scribble-ast/src/main/java/org/scribble/del/ScribDel.java b/scribble-ast/src/main/java/org/scribble/del/ScribDel.java index 7a1f35ad8..bc692992b 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ScribDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ScribDel.java @@ -14,7 +14,7 @@ package org.scribble.del; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; +import org.scribble.util.ScribException; import org.scribble.visit.InlinedProtocolUnfolder; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.EGraphBuilder; @@ -50,54 +50,54 @@ public interface ScribDel void setEnv(Env env); // Non defensive default void enterModuleContextBuilding(ScribNode parent, ScribNode child, - ModuleContextBuilder builder) throws ScribbleException + ModuleContextBuilder builder) throws ScribException { } default ScribNode leaveModuleContextBuilding(ScribNode parent, ScribNode child, ModuleContextBuilder builder, ScribNode visited) - throws ScribbleException + throws ScribException { return visited; } default void enterDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb) throws ScribbleException + NameDisambiguator disamb) throws ScribException { } default ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb, ScribNode visited) throws ScribbleException + NameDisambiguator disamb, ScribNode visited) throws ScribException { return visited; } default void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, DelegationProtocolRefChecker checker) - throws ScribbleException + throws ScribException { } default ScribNode leaveDelegationProtocolRefCheck(ScribNode parent, ScribNode child, DelegationProtocolRefChecker checker, ScribNode visited) - throws ScribbleException + throws ScribException { return visited; } default void enterProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder) - throws ScribbleException + throws ScribException { } default ScribNode leaveProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) - throws ScribbleException + throws ScribException { return visited; } @@ -109,25 +109,25 @@ default void enterRoleCollection(ScribNode parent, ScribNode child, } default ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, - RoleCollector coll, ScribNode visited) throws ScribbleException + RoleCollector coll, ScribNode visited) throws ScribException { return visited; } default void enterProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl) throws ScribbleException + ProtocolDefInliner inl) throws ScribException { } default ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + ProtocolDefInliner inl, ScribNode visited) throws ScribException { return visited; } default void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, - InlinedProtocolUnfolder unf) throws ScribbleException + InlinedProtocolUnfolder unf) throws ScribException { } @@ -137,31 +137,31 @@ default void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, // the rec body default ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) - throws ScribbleException + throws ScribException { return visited; } default void enterInlinedWFChoiceCheck(ScribNode parent, ScribNode child, - WFChoiceChecker checker) throws ScribbleException + WFChoiceChecker checker) throws ScribException { } default ScribNode leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, - WFChoiceChecker checker, ScribNode visited) throws ScribbleException + WFChoiceChecker checker, ScribNode visited) throws ScribException { return visited; } default void enterProjection(ScribNode parent, ScribNode child, - Projector proj) throws ScribbleException + Projector proj) throws ScribException { } default ScribNode leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribbleException + Projector proj, ScribNode visited) throws ScribException { return visited; } @@ -174,7 +174,7 @@ default void enterProjectedChoiceSubjectFixing(ScribNode parent, default ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer, ScribNode visited) - throws ScribbleException + throws ScribException { return visited; } @@ -187,19 +187,19 @@ default void enterProjectedRoleDeclFixing(ScribNode parent, ScribNode child, default ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, ScribNode child, ProjectedRoleDeclFixer fixer, ScribNode visited) - throws ScribbleException + throws ScribException { return visited; } default void enterReachabilityCheck(ScribNode parent, ScribNode child, - ReachabilityChecker checker) throws ScribbleException + ReachabilityChecker checker) throws ScribException { } default ScribNode leaveReachabilityCheck(ScribNode parent, ScribNode child, - ReachabilityChecker checker, ScribNode visited) throws ScribbleException + ReachabilityChecker checker, ScribNode visited) throws ScribException { return visited; } @@ -211,7 +211,7 @@ default void enterEGraphBuilding(ScribNode parent, ScribNode child, } default ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder gb, ScribNode visited) throws ScribbleException + EGraphBuilder gb, ScribNode visited) throws ScribException { return visited; } @@ -229,53 +229,53 @@ default ScribNode leaveMessageIdCollection(ScribNode parent, ScribNode child, } default void enterValidation(ScribNode parent, ScribNode child, - GProtocolValidator coll) throws ScribbleException + GProtocolValidator coll) throws ScribException { } default ScribNode leaveValidation(ScribNode parent, ScribNode child, - GProtocolValidator coll, ScribNode visited) throws ScribbleException + GProtocolValidator coll, ScribNode visited) throws ScribException { return visited; } default void enterProjectedChoiceDoPruning(ScribNode parent, ScribNode child, - ProjectedChoiceDoPruner pruner) throws ScribbleException + ProjectedChoiceDoPruner pruner) throws ScribException { } default ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, ScribNode child, ProjectedChoiceDoPruner proj, ScribNode visited) - throws ScribbleException + throws ScribException { return visited; } default void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker) - throws ScribbleException + throws ScribException { } default ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { return visited; } default void enterExplicitCorrelationCheck(ScribNode parent, ScribNode child, - ExplicitCorrelationChecker checker) throws ScribbleException + ExplicitCorrelationChecker checker) throws ScribException { } default ScribNode leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) - throws ScribbleException + throws ScribException { return visited; } @@ -287,7 +287,7 @@ default void enterRecVarCollection(ScribNode parent, ScribNode child, } default ScribNode leaveRecVarCollection(ScribNode parent, ScribNode child, - RecVarCollector coll, ScribNode visited) throws ScribbleException + RecVarCollector coll, ScribNode visited) throws ScribException { return visited; } @@ -299,7 +299,7 @@ default void enterRecRemoval(ScribNode parent, ScribNode child, } default ScribNode leaveRecRemoval(ScribNode parent, ScribNode child, - RecRemover rem, ScribNode visited) throws ScribbleException + RecRemover rem, ScribNode visited) throws ScribException { return visited; } diff --git a/scribble-ast/src/main/java/org/scribble/del/SimpleSessionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/SimpleSessionNodeDel.java index 7ac2be61b..c5e102a3f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/SimpleSessionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/SimpleSessionNodeDel.java @@ -14,19 +14,19 @@ package org.scribble.del; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; +import org.scribble.util.ScribException; import org.scribble.visit.ProtocolDefInliner; public abstract class SimpleSessionNodeDel extends ScribDelBase implements InteractionNodeDel { @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribbleException + public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribException { ScribDelBase.pushVisitorEnv(this, inl); } @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribException { return ScribDelBase.popAndSetVisitorEnv(this, inl, visited); } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java index 4a36ae7b3..25c0f3654 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -25,12 +25,12 @@ import org.scribble.ast.local.LChoice; import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.RuntimeScribbleException; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.global.GSeq; import org.scribble.del.ChoiceDel; +import org.scribble.util.RuntimeScribException; +import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; @@ -44,7 +44,7 @@ public class GChoiceDel extends ChoiceDel implements GCompoundInteractionNodeDel @Override public org.scribble.core.type.session.global.GChoice translate(ScribNode n, - GTypeTranslator t) throws ScribbleException + GTypeTranslator t) throws ScribException { GChoice source = (GChoice) n; Role subj = source.getSubjectChild().toName(); @@ -58,7 +58,7 @@ public org.scribble.core.type.session.global.GChoice translate(ScribNode n, @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + ProtocolDefInliner inl, ScribNode visited) throws ScribException { GChoice gc = (GChoice) visited; List blocks = gc.getBlockChildren().stream() @@ -73,7 +73,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, @Override public void enterInlinedWFChoiceCheck(ScribNode parent, ScribNode child, - WFChoiceChecker checker) throws ScribbleException + WFChoiceChecker checker) throws ScribException { // No super call -- replacing base routine with this one WFChoiceEnv env = checker.peekEnv().enterContext(); @@ -84,14 +84,14 @@ public void enterInlinedWFChoiceCheck(ScribNode parent, ScribNode child, @Override public GChoice leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, - WFChoiceChecker checker, ScribNode visited) throws ScribbleException + WFChoiceChecker checker, ScribNode visited) throws ScribException { GChoice cho = (GChoice) visited; RoleNode subjNode = cho.getSubjectChild(); Role subj = subjNode.toName(); if (!checker.peekParentEnv().isEnabled(subj)) { - throw new ScribbleException(subjNode.getSource(), + throw new ScribException(subjNode.getSource(), "Subject not enabled: " + subj); } @@ -115,7 +115,7 @@ public GChoice leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, { if (!dests.equals(rs)) { - throw new RuntimeScribbleException( + throw new RuntimeScribException( "Mismatched enabled roles: " + dests + ", " + rs); } }); @@ -130,7 +130,7 @@ public GChoice leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, { if (!srcs.equals(rs)) { - throw new RuntimeScribbleException( + throw new RuntimeScribException( "Mismatched enabler roles for " + dest + ": " + srcs + ", " + rs); } @@ -143,7 +143,7 @@ public GChoice leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, { if (!Collections.disjoint(mids, ms)) { - throw new RuntimeScribbleException( + throw new RuntimeScribException( "Non disjoint enabling messages for " + dest + ": " + mids + ", " + ms); } @@ -151,9 +151,9 @@ public GChoice leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, }); } } - catch (RuntimeScribbleException rse) // Lambda hack + catch (RuntimeScribException rse) // Lambda hack { - throw new ScribbleException(rse.getMessage(), rse.getCause()); + throw new ScribException(rse.getMessage(), rse.getCause()); } } } @@ -183,7 +183,7 @@ public GChoice leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, @Override public GChoice leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribbleException + Projector proj, ScribNode visited) throws ScribException { GChoice gc = (GChoice) visited; List blocks = diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java index 07b750a0f..ab82127b7 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java @@ -20,10 +20,10 @@ import org.scribble.ast.global.GConnect; import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; import org.scribble.del.ConnectionActionDel; +import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; @@ -40,7 +40,7 @@ public GConnectDel() @Override public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb, ScribNode visited) throws ScribbleException + NameDisambiguator disamb, ScribNode visited) throws ScribException { GConnect gc = (GConnect) visited; /*Role src = gc.src.toName(); @@ -50,7 +50,7 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, @Override public org.scribble.core.type.session.global.GConnect translate(ScribNode n, - GTypeTranslator t) throws ScribbleException + GTypeTranslator t) throws ScribException { GConnect source = (GConnect) n; Role src = source.getSourceChild().toName(); @@ -66,7 +66,7 @@ public org.scribble.core.type.session.global.GConnect translate(ScribNode n, @Override public GConnect leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, - WFChoiceChecker checker, ScribNode visited) throws ScribbleException + WFChoiceChecker checker, ScribNode visited) throws ScribException { GConnect gc = (GConnect) visited; RoleNode srcNode = gc.getSourceChild(); @@ -76,7 +76,7 @@ public GConnect leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, Role src = srcNode.toName(); if (!checker.peekEnv().isEnabled(src)) { - throw new ScribbleException(srcNode.getSource(), "Role not enabled: " + src); + throw new ScribException(srcNode.getSource(), "Role not enabled: " + src); } Message msg = msgNode.toMessage(); WFChoiceEnv env = checker.popEnv(); @@ -85,12 +85,12 @@ public GConnect leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, { if (src.equals(dest)) { - throw new ScribbleException(gc.getSource(), + throw new ScribException(gc.getSource(), "[TODO] Self connections not supported: " + gc); } if (env.isConnected(src, dest)) { - throw new ScribbleException(gc.getSource(), + throw new ScribException(gc.getSource(), "Roles (possibly) already connected: " + src + ", " + dest); } @@ -105,7 +105,7 @@ public GConnect leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, @Override public ScribNode leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribbleException + Projector proj, ScribNode visited) throws ScribException { GConnect gc = (GConnect) visited; Role self = proj.peekSelf(); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java index 3b16b7f4e..b004e7f9c 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java @@ -17,9 +17,9 @@ import org.scribble.ast.global.GContinue; import org.scribble.ast.local.LContinue; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.RecVar; import org.scribble.del.ContinueDel; +import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; @@ -30,7 +30,7 @@ public class GContinueDel extends ContinueDel implements GSimpleInteractionNodeD @Override public org.scribble.core.type.session.global.GContinue translate(ScribNode n, - GTypeTranslator t) throws ScribbleException + GTypeTranslator t) throws ScribException { GContinue source = (GContinue) n; RecVar recvar = source.getRecVarChild().toName(); @@ -39,7 +39,7 @@ public org.scribble.core.type.session.global.GContinue translate(ScribNode n, @Override public GContinue leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + ProtocolDefInliner inl, ScribNode visited) throws ScribException { GContinue gc = (GContinue) visited; RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) gc.getRecVarChild() @@ -58,7 +58,7 @@ public GContinue leaveProtocolInlining(ScribNode parent, ScribNode child, @Override public GContinue leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribbleException + Projector proj, ScribNode visited) throws ScribException { GContinue gc = (GContinue) visited; //LContinue projection = project(proj.job.af, gc, proj.peekSelf()); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDel.java index 9002185b2..549d3a3ee 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDel.java @@ -14,15 +14,15 @@ package org.scribble.del.global; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.global.GNode; import org.scribble.del.ScribDel; +import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; public interface GDel extends ScribDel { default GNode translate(ScribNode n, GTypeTranslator t) - throws ScribbleException + throws ScribException { throw new RuntimeException("TODO: " + n); } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java index a96206627..d247168bd 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -25,13 +25,13 @@ import org.scribble.ast.global.GDelegationElem; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.del.ScribDelBase; +import org.scribble.util.ScribException; import org.scribble.visit.context.ProtocolDeclContextBuilder; import org.scribble.visit.wf.DelegationProtocolRefChecker; import org.scribble.visit.wf.NameDisambiguator; @@ -46,7 +46,7 @@ public GDelegationElemDel() // Duplicated from DoDel @Override public void enterDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb) throws ScribbleException + NameDisambiguator disamb) throws ScribException { ModuleContext mc = disamb.getModuleContext(); GDelegationElem de = (GDelegationElem) child; @@ -54,7 +54,7 @@ public void enterDisambiguation(ScribNode parent, ScribNode child, GProtocolName gpn = proto.toName(); if (!mc.isVisibleProtocolDeclName(gpn)) { - throw new ScribbleException(proto.getSource(), + throw new ScribException(proto.getSource(), "Protocol decl not visible: " + gpn); } } @@ -62,7 +62,7 @@ public void enterDisambiguation(ScribNode parent, ScribNode child, // Duplicated from DoDel //@Override public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, - GDelegationElem de) throws ScribbleException + GDelegationElem de) throws ScribException { ModuleContext mc = disamb.getModuleContext(); GProtocolName fullname = (GProtocolName) mc @@ -75,7 +75,7 @@ public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, .getProtocolDeclChild(fullname.getSimpleName()); if (!gpd.getHeaderChild().getRoleDeclListChild().getRoles().contains(rn)) { - throw new ScribbleException(r.getSource(), "Invalid delegation role: " + de); + throw new ScribException(r.getSource(), "Invalid delegation role: " + de); } GProtocolNameNode pnn = (GProtocolNameNode) disamb.job.config.af @@ -91,7 +91,7 @@ public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, // TODO: should always be GMessageTransfer public void leaveMessageTransferInProtocolDeclContextBuilding( MessageTransfer mt, GDelegationElem de, - ProtocolDeclContextBuilder builder) throws ScribbleException + ProtocolDeclContextBuilder builder) throws ScribException { RoleNode role = de.getRoleChild(); GProtocolName gpn = de.getProtocolChild().toName(); // leaveDisambiguation has fully qualified the target name @@ -104,7 +104,7 @@ public void leaveMessageTransferInProtocolDeclContextBuilding( @Override public void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, - DelegationProtocolRefChecker checker) throws ScribbleException + DelegationProtocolRefChecker checker) throws ScribException { GDelegationElem de = (GDelegationElem) child; ModuleContext mc = checker.getModuleContext(); @@ -116,7 +116,7 @@ public void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, if (targetfullname.equals(rootfullname)) // Explicit check here because ProtocolDeclContextBuilder dependencies explicitly include self protocoldecl dependencies (cf. GProtocolDeclDel.addSelfDependency) { - throw new ScribbleException(de.getSource(), + throw new ScribException(de.getSource(), "Recursive protocol dependencies not supported for delegation types: " + de); } @@ -144,7 +144,7 @@ public void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, mc.getVisibleProtocolDeclFullName(next); if (rootfullname.equals(nextfullname)) { - throw new ScribbleException(de.getSource(), + throw new ScribException(de.getSource(), "Recursive protocol dependencies not supported for delegation types: " + de); } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java index be1d56d62..dc30cb03e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java @@ -17,9 +17,9 @@ import org.scribble.ast.global.GDisconnect; import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.Role; import org.scribble.del.ConnectionActionDel; +import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; @@ -37,7 +37,7 @@ public GDisconnectDel() @Override public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb, ScribNode visited) throws ScribbleException + NameDisambiguator disamb, ScribNode visited) throws ScribException { GDisconnect gc = (GDisconnect) visited; /*Role src = gc.src.toName(); @@ -47,7 +47,7 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, @Override public org.scribble.core.type.session.global.GDisconnect translate(ScribNode n, - GTypeTranslator t) throws ScribbleException + GTypeTranslator t) throws ScribException { GDisconnect source = (GDisconnect) n; Role left = source.getLeftChild().toName(); @@ -58,7 +58,7 @@ public org.scribble.core.type.session.global.GDisconnect translate(ScribNode n, @Override public GDisconnect leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) - throws ScribbleException + throws ScribException { GDisconnect gd = (GDisconnect) visited; RoleNode leftNode = gd.getLeftChild(); @@ -67,7 +67,7 @@ public GDisconnect leaveInlinedWFChoiceCheck(ScribNode parent, Role left = leftNode.toName(); if (!checker.peekEnv().isEnabled(left)) { - throw new ScribbleException(leftNode.getSource(), + throw new ScribException(leftNode.getSource(), "Role not enabled: " + left); } //Message msg = gd.msg.toMessage(); // Unit message @@ -76,20 +76,20 @@ public GDisconnect leaveInlinedWFChoiceCheck(ScribNode parent, Role right = rightNode.toName(); if (!env.isEnabled(right)) { - throw new ScribbleException(rightNode.getSource(), + throw new ScribException(rightNode.getSource(), "Role not enabled: " + right); } { if (left.equals(right)) { - throw new ScribbleException(gd.getSource(), + throw new ScribException(gd.getSource(), "[TODO] Self connections not supported: " + gd); // Would currently // be subsumed by // the below } if (!env.isConnected(left, right)) { - throw new ScribbleException(gd.getSource(), + throw new ScribException(gd.getSource(), "Roles not (necessarily) connected: " + left + ", " + right); } @@ -104,7 +104,7 @@ public GDisconnect leaveInlinedWFChoiceCheck(ScribNode parent, @Override public ScribNode leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribbleException + Projector proj, ScribNode visited) throws ScribException { GDisconnect gd = (GDisconnect) visited; Role self = proj.peekSelf(); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java index d5581fbe4..9b3ace9e9 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java @@ -25,7 +25,6 @@ import org.scribble.ast.local.LDo; import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.NonRoleParamKind; @@ -35,6 +34,7 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.del.DoDel; +import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; @@ -45,7 +45,7 @@ public class GDoDel extends DoDel implements GSimpleInteractionNodeDel { @Override public org.scribble.core.type.session.global.GDo translate(ScribNode n, - GTypeTranslator t) throws ScribbleException + GTypeTranslator t) throws ScribException { GDo source = (GDo) n; @@ -54,7 +54,7 @@ public org.scribble.core.type.session.global.GDo translate(ScribNode n, ModuleContext modc = t.getModuleContext(); if (!modc.isVisibleProtocolDeclName(proto)) { - throw new ScribbleException(source, + throw new ScribException(source, "Protocol decl not visible: " + proto); } GProtocolName fullname = (GProtocolName) modc @@ -87,7 +87,7 @@ public GDo visitForSubprotocolInlining(ProtocolDefInliner builder, GDo child) @Override public GDo leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + ProtocolDefInliner inl, ScribNode visited) throws ScribException { if (!inl.isCycle()) { @@ -107,7 +107,7 @@ public GDo leaveProtocolInlining(ScribNode parent, ScribNode child, @Override public void enterProjection(ScribNode parent, ScribNode child, Projector proj) - throws ScribbleException + throws ScribException { GSimpleInteractionNodeDel.super.enterProjection(parent, child, proj); @@ -129,7 +129,7 @@ public void enterProjection(ScribNode parent, ScribNode child, Projector proj) @Override public GDo leaveProjection(ScribNode parent, ScribNode child, Projector proj, - ScribNode visited) throws ScribbleException // throws ScribbleException + ScribNode visited) throws ScribException // throws ScribbleException { GDo gd = (GDo) visited; Role popped = proj.popSelf(); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java index 2d3f9fd74..5b8cd277f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java @@ -14,9 +14,9 @@ package org.scribble.del.global; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.del.InteractionNodeDel; import org.scribble.del.ScribDelBase; +import org.scribble.util.ScribException; import org.scribble.visit.context.Projector; public interface GInteractionNodeDel extends InteractionNodeDel, GDel @@ -24,13 +24,13 @@ public interface GInteractionNodeDel extends InteractionNodeDel, GDel //public abstract LNode project(GNode n, Role self); // Generalised return, e.g. returning a seq @Override - default void enterProjection(ScribNode parent, ScribNode child, Projector proj) throws ScribbleException + default void enterProjection(ScribNode parent, ScribNode child, Projector proj) throws ScribException { ScribDelBase.pushVisitorEnv(this, proj); } @Override - default ScribNode leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException + default ScribNode leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribException { return ScribDelBase.popAndSetVisitorEnv(this, proj, visited); } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java index 3f4d212a5..22e0f0466 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java @@ -25,11 +25,11 @@ import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LScribNode; import org.scribble.ast.local.LSessionNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.global.GType; import org.scribble.del.InteractionSeqDel; import org.scribble.del.ScribDelBase; +import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; @@ -42,7 +42,7 @@ public class GInteractionSeqDel extends InteractionSeqDel implements GDel @Override public GSeq translate(ScribNode n, GTypeTranslator t) - throws ScribbleException + throws ScribException { GInteractionSeq source = (GInteractionSeq) n; List elems = new LinkedList<>(); @@ -56,7 +56,7 @@ public GSeq translate(ScribNode n, GTypeTranslator t) // enter in super @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + ProtocolDefInliner inl, ScribNode visited) throws ScribException { GInteractionSeq gis = (GInteractionSeq) visited; List gins = new LinkedList(); @@ -80,14 +80,14 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, @Override public void enterProjection(ScribNode parent, ScribNode child, Projector proj) - throws ScribbleException + throws ScribException { ScribDelBase.pushVisitorEnv(this, proj); // Unlike WF-choice and Reachability, Projection uses an Env for InteractionSequences } @Override public GInteractionSeq leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribbleException + Projector proj, ScribNode visited) throws ScribException { GInteractionSeq gis = (GInteractionSeq) visited; List lis = new LinkedList<>(); @@ -146,7 +146,7 @@ public GInteractionSeq leaveF17Parsing(ScribNode parent, ScribNode child, F17Par @Override public GInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, - RecRemover rem, ScribNode visited) throws ScribbleException + RecRemover rem, ScribNode visited) throws ScribException { GInteractionSeq gis = (GInteractionSeq) visited; List gins = gis.getInteractionChildren().stream() diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java index 22ec839e2..75b6b189e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -19,10 +19,10 @@ import org.scribble.ast.global.GMessageTransfer; import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; import org.scribble.del.MessageTransferDel; +import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; @@ -39,14 +39,14 @@ public GMessageTransferDel() @Override public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb, ScribNode visited) throws ScribbleException + NameDisambiguator disamb, ScribNode visited) throws ScribException { GMessageTransfer gmt = (GMessageTransfer) visited; Role src = gmt.getSourceChild().toName(); List dests = gmt.getDestinationRoles(); if (dests.contains(src)) { - throw new ScribbleException(gmt.getSource(), + throw new ScribException(gmt.getSource(), "[TODO] Self connections not supported: " + gmt); // Would currently be subsumed by unconnected check } @@ -55,7 +55,7 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, @Override public org.scribble.core.type.session.global.GMessageTransfer translate(ScribNode n, - GTypeTranslator t) throws ScribbleException + GTypeTranslator t) throws ScribException { GMessageTransfer source = (GMessageTransfer) n; Role src = source.getSourceChild().toName(); @@ -72,14 +72,14 @@ public org.scribble.core.type.session.global.GMessageTransfer translate(ScribNod @Override public GMessageTransfer leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) - throws ScribbleException + throws ScribException { GMessageTransfer gmt = (GMessageTransfer) visited; Role src = gmt.getSourceChild().toName(); if (!checker.peekEnv().isEnabled(src)) { - throw new ScribbleException(gmt.getSourceChild().getSource(), + throw new ScribException(gmt.getSourceChild().getSource(), "Role not enabled: " + src); } Message msg = gmt.getMessageNodeChild().toMessage(); @@ -89,7 +89,7 @@ public GMessageTransfer leaveInlinedWFChoiceCheck(ScribNode parent, // FIXME: better to check as global model error (role stuck on uncomnected send) if (!env.isConnected(src, dest)) { - throw new ScribbleException(gmt.getSource(), + throw new ScribException(gmt.getSource(), "Roles not (necessarily) connected: " + src + ", " + dest); } @@ -104,7 +104,7 @@ public GMessageTransfer leaveInlinedWFChoiceCheck(ScribNode parent, @Override //public GMessageTransfer leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException //throws ScribbleException public ScribNode leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribbleException + Projector proj, ScribNode visited) throws ScribException //throws ScribbleException { GMessageTransfer gmt = (GMessageTransfer) visited; diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java index e25c39074..a8cd417e4 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java @@ -18,10 +18,10 @@ import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProtocolBlock; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.session.global.GSeq; import org.scribble.del.ProtocolBlockDel; import org.scribble.del.ScribDelBase; +import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; @@ -33,14 +33,14 @@ public class GProtocolBlockDel extends ProtocolBlockDel implements GDel @Override public GSeq translate(ScribNode n, GTypeTranslator t) - throws ScribbleException + throws ScribException { return (GSeq) ((GProtocolBlock) n).getInteractSeqChild().visitWith(t); } @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + ProtocolDefInliner inl, ScribNode visited) throws ScribException { GProtocolBlock gpb = (GProtocolBlock) visited; GInteractionSeq seq = (GInteractionSeq) ((InlineProtocolEnv) gpb @@ -53,14 +53,14 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, @Override public void enterProjection(ScribNode parent, ScribNode child, Projector proj) - throws ScribbleException + throws ScribException { ScribDelBase.pushVisitorEnv(this, proj); } @Override public GProtocolBlock leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribbleException + Projector proj, ScribNode visited) throws ScribException { GProtocolBlock gpb = (GProtocolBlock) visited; LInteractionSeq seq = diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index acd6fbf53..b87b208f6 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -31,7 +31,6 @@ import org.scribble.ast.local.LProtocolDef; import org.scribble.ast.local.LProtocolHeader; import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.ProtocolMod; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.kind.Global; @@ -43,6 +42,7 @@ import org.scribble.core.type.session.global.GSeq; import org.scribble.del.ModuleDel; import org.scribble.del.ProtocolDeclDel; +import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.context.Projector; import org.scribble.visit.context.ProtocolDeclContextBuilder; @@ -59,7 +59,7 @@ public GProtocolDeclDel() @Override public GProtocol translate(ScribNode n, GTypeTranslator t) - throws ScribbleException + throws ScribException { GProtocolDecl source = (GProtocolDecl) n; Module m = (Module) n.getParent(); @@ -97,7 +97,7 @@ protected void addSelfDependency(ProtocolDeclContextBuilder builder, public GProtocolDecl leaveProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) - throws ScribbleException + throws ScribException { GProtocolDecl gpd = (GProtocolDecl) visited; GProtocolDeclContext gcontext = new GProtocolDeclContext( @@ -108,7 +108,7 @@ protected void addSelfDependency(ProtocolDeclContextBuilder builder, @Override public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, - RoleCollector coll, ScribNode visited) throws ScribbleException + RoleCollector coll, ScribNode visited) throws ScribException { GProtocolDecl gpd = (GProtocolDecl) visited; @@ -120,7 +120,7 @@ public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, if (occs.size() != decls.size()) { decls.removeAll(occs); - throw new ScribbleException( + throw new ScribException( gpd.getHeaderChild().getRoleDeclListChild().getSource(), "Unused role decl(s) in " + gpd.getHeaderChild().getDeclName() + ": " + decls); @@ -131,7 +131,7 @@ public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, @Override public GProtocolDecl leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribbleException + Projector proj, ScribNode visited) throws ScribException { AstFactory af = proj.job.config.af; @@ -167,7 +167,7 @@ protected Map> getGlobalProtocolDependencies(Role self) @Override public void enterValidation(ScribNode parent, ScribNode child, - GProtocolValidator checker) throws ScribbleException + GProtocolValidator checker) throws ScribException { GProtocolDecl gpd = (GProtocolDecl) child; if (gpd.isAux()) diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java index f9802e15d..70283a50a 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java @@ -26,12 +26,12 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.local.LProtocolDef; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.kind.RecVarKind; import org.scribble.del.ProtocolDefDel; import org.scribble.del.ScribDelBase; +import org.scribble.util.ScribException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; import org.scribble.visit.context.env.ProjectionEnv; @@ -54,7 +54,7 @@ protected GProtocolDefDel copy() @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + ProtocolDefInliner inl, ScribNode visited) throws ScribException { CommonTree blame = ((GProtocolDecl) parent).getHeaderChild().getSource(); SubprotoSig subsig = inl.peekStack(); @@ -80,7 +80,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, @Override public void enterProjection(ScribNode parent, ScribNode child, Projector proj) - throws ScribbleException + throws ScribException { //pushVisitorEnv(parent, child, proj); ScribDelBase.pushVisitorEnv(this, proj); @@ -88,7 +88,7 @@ public void enterProjection(ScribNode parent, ScribNode child, Projector proj) @Override public GProtocolDef leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribbleException + Projector proj, ScribNode visited) throws ScribException { GProtocolDef gpd = (GProtocolDef) visited; LProtocolBlock block = (LProtocolBlock) ((ProjectionEnv) gpd.getBlockChild() diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java index f051b003b..c9f3920f6 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java @@ -19,10 +19,10 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.local.LRecursion; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.global.GSeq; import org.scribble.del.RecursionDel; +import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.Projector; @@ -36,7 +36,7 @@ public class GRecursionDel extends RecursionDel implements GCompoundInteractionN @Override public org.scribble.core.type.session.global.GRecursion translate(ScribNode n, - GTypeTranslator t) throws ScribbleException + GTypeTranslator t) throws ScribException { GRecursion source = (GRecursion) n; RecVar recvar = source.getRecVarChild().toName(); @@ -46,7 +46,7 @@ public org.scribble.core.type.session.global.GRecursion translate(ScribNode n, @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + ProtocolDefInliner inl, ScribNode visited) throws ScribException { GRecursion gr = (GRecursion) visited; //RecVarNode recvar = gr.recvar.clone(); @@ -62,7 +62,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, @Override public GRecursion leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, - WFChoiceChecker checker, ScribNode visited) throws ScribbleException + WFChoiceChecker checker, ScribNode visited) throws ScribException { GRecursion rec = (GRecursion) visited; WFChoiceEnv merged = checker.popEnv() @@ -76,7 +76,7 @@ public GRecursion leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, @Override public GRecursion leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribbleException + Projector proj, ScribNode visited) throws ScribException { GRecursion gr = (GRecursion) visited; LProtocolBlock block = diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java index 313b4f4b8..5ba74d5b7 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java @@ -17,9 +17,9 @@ import org.scribble.ast.global.GWrap; import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.Role; import org.scribble.del.ConnectionActionDel; +import org.scribble.util.ScribException; import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; import org.scribble.visit.wf.WFChoiceChecker; @@ -36,7 +36,7 @@ public GWrapDel() @Override public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb, ScribNode visited) throws ScribbleException + NameDisambiguator disamb, ScribNode visited) throws ScribException { GWrap gw = (GWrap) visited; return gw; @@ -44,7 +44,7 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, @Override public GWrap leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, - WFChoiceChecker checker, ScribNode visited) throws ScribbleException + WFChoiceChecker checker, ScribNode visited) throws ScribException { GWrap gw = (GWrap) visited; @@ -54,24 +54,24 @@ public GWrap leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, Role dest = destNode.toName(); if (!checker.peekEnv().isEnabled(src)) { - throw new ScribbleException(srcNode.getSource(), + throw new ScribException(srcNode.getSource(), "Role not enabled: " + src); } if (!checker.peekEnv().isEnabled(dest)) { - throw new ScribbleException(destNode.getSource(), + throw new ScribException(destNode.getSource(), "Role not enabled: " + dest); } //Message msg = gw.msg.toMessage(); // Unit message if (src.equals(dest)) { - throw new ScribbleException(gw.getSource(), + throw new ScribException(gw.getSource(), "[TODO] Self connections not supported: " + gw); } WFChoiceEnv env = checker.popEnv(); if (!env.isConnected(src, dest)) { - throw new ScribbleException(gw.getSource(), + throw new ScribException(gw.getSource(), "Roles not (necessarily) connected: " + src + ", " + dest); } @@ -85,7 +85,7 @@ public GWrap leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, @Override public ScribNode leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribbleException + Projector proj, ScribNode visited) throws ScribException // throwsScribbleException { GWrap gw = (GWrap) visited; diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java index 35460d5d5..154e58d00 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java @@ -18,10 +18,10 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LAccept; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; +import org.scribble.util.ScribException; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; @@ -34,7 +34,7 @@ public class LAcceptDel extends LConnectionActionDel { @Override public LAccept leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder builder, ScribNode visited) throws ScribbleException + EGraphBuilder builder, ScribNode visited) throws ScribException { LAccept la = (LAccept) visited; RoleNode src = la.getSourceChild(); @@ -61,7 +61,7 @@ public void enterProjectedChoiceSubjectFixing(ScribNode parent, @Override public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker) - throws ScribbleException + throws ScribException { super.enterUnguardedChoiceDoProjectionCheck(parent, child, checker); LAccept la = (LAccept) child; @@ -73,7 +73,7 @@ public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, @Override public LAccept leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) - throws ScribbleException + throws ScribException { LAccept la = (LAccept) visited; ExplicitCorrelationEnv env = checker.popEnv(); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java index e3ff28f3c..e902e7083 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java @@ -22,11 +22,11 @@ import org.scribble.ast.local.LChoice; import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.RoleKind; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.del.ChoiceDel; +import org.scribble.util.ScribException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceDoPruner; @@ -50,7 +50,7 @@ public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode ch @Override public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { Choice cho = (Choice) visited; List benvs = cho.getBlockChildren().stream() @@ -66,7 +66,7 @@ public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, @Override public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, ScribNode child, ProjectedChoiceDoPruner pruner, ScribNode visited) - throws ScribbleException + throws ScribException { LChoice lc = (LChoice) visited; List blocks = lc.getBlockChildren().stream() @@ -81,7 +81,7 @@ public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, @Override public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer, ScribNode visited) - throws ScribbleException + throws ScribException { LChoice lc = (LChoice) visited; List blocks = lc.getBlockChildren(); @@ -113,7 +113,7 @@ public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, { String self = fixer.getModuleContext().root.getSimpleName().toString(); // HACK self = self.substring(self.lastIndexOf('_')+1, self.length()); // FIXME: not comaptible with role names that include "_" - throw new ScribbleException(lc.getSource(), "Cannot project onto " + self + throw new ScribException(lc.getSource(), "Cannot project onto " + self + " due to inconsistent local choice subjects: " + subjs); // self not recorded -- can derive from LProtocolDecl RoleDeclList //throw new RuntimeException("Shouldn't get in here: " + subjs); @@ -129,7 +129,7 @@ public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + ProtocolDefInliner inl, ScribNode visited) throws ScribException { LChoice lc = (LChoice) visited; List blocks = @@ -145,7 +145,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, @Override public LChoice leaveReachabilityCheck(ScribNode parent, ScribNode child, - ReachabilityChecker checker, ScribNode visited) throws ScribbleException + ReachabilityChecker checker, ScribNode visited) throws ScribException { LChoice cho = (LChoice) visited; List benvs = @@ -178,7 +178,7 @@ public LChoice visitForFsmConversion(EGraphBuilder graph, LChoice child) graph.util.popChoiceBlock(); } } - catch (ScribbleException e) + catch (ScribException e) { throw new RuntimeException("Shouldn't get in here: " + e); } @@ -187,7 +187,7 @@ public LChoice visitForFsmConversion(EGraphBuilder graph, LChoice child) @Override public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder graph, ScribNode visited) throws ScribbleException + EGraphBuilder graph, ScribNode visited) throws ScribException { graph.util.leaveChoice(); return super.leaveEGraphBuilding(parent, child, graph, visited); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java index ac7624e0d..daa59db0b 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java @@ -15,7 +15,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LCompoundInteraction; -import org.scribble.core.job.ScribbleException; +import org.scribble.util.ScribException; import org.scribble.visit.wf.ReachabilityChecker; import org.scribble.visit.wf.env.ReachabilityEnv; @@ -24,7 +24,7 @@ public interface LCompoundInteractionNodeDel extends LInteractionNodeDel @Override default LCompoundInteraction leaveReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker, ScribNode visited) - throws ScribbleException + throws ScribException { // Following CompoundInteractionNodeDel#leaveInlinedProtocolUnfolding/leaveWFChoiceCheck ReachabilityEnv visited_env = checker.popEnv(); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java index 9a40f56bc..793391ce7 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java @@ -15,14 +15,14 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LConnectionAction; -import org.scribble.core.job.ScribbleException; import org.scribble.del.ConnectionActionDel; +import org.scribble.util.ScribException; import org.scribble.visit.wf.ExplicitCorrelationChecker; public abstract class LConnectionActionDel extends ConnectionActionDel implements LSimpleInteractionNodeDel { @Override - public LConnectionAction leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribbleException + public LConnectionAction leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribException { LConnectionAction lca = (LConnectionAction) visited; checker.pushEnv(checker.popEnv().disableAccept()); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java index 7a938def4..39b781491 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java @@ -22,11 +22,11 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LContinue; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.RecVar; import org.scribble.del.ContinueDel; +import org.scribble.util.ScribException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.env.InlineProtocolEnv; @@ -38,7 +38,7 @@ public class LContinueDel extends ContinueDel { @Override public LContinue leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + ProtocolDefInliner inl, ScribNode visited) throws ScribException { LContinue lc = (LContinue) visited; RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) lc.getRecVarChild() @@ -50,7 +50,7 @@ public LContinue leaveProtocolInlining(ScribNode parent, ScribNode child, @Override public LContinue leaveReachabilityCheck(ScribNode parent, ScribNode child, - ReachabilityChecker checker, ScribNode visited) throws ScribbleException + ReachabilityChecker checker, ScribNode visited) throws ScribException { // "Entering" the continue here in leave, where we can merge the new state into the parent Env // Generally: if side effecting Env state to be merged into the parent (not just popped and discarded), leave must be overridden to do so @@ -64,7 +64,7 @@ public LContinue leaveReachabilityCheck(ScribNode parent, ScribNode child, @Override public LContinue leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder graph, ScribNode visited) throws ScribbleException + EGraphBuilder graph, ScribNode visited) throws ScribException { LContinue lr = (LContinue) visited; RecVar rv = lr.getRecVarChild().toName(); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java index 0781e7666..cc7c3a135 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java @@ -15,9 +15,9 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LDisconnect; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.Role; import org.scribble.del.ConnectionActionDel; +import org.scribble.util.ScribException; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; @@ -26,7 +26,7 @@ public class LDisconnectDel extends ConnectionActionDel { @Override public LDisconnect leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder builder, ScribNode visited) throws ScribbleException + EGraphBuilder builder, ScribNode visited) throws ScribException { LDisconnect ld = (LDisconnect) visited; Role peer = ld.getPeerChild().toName(); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java index 7bf38e8ec..50a7494d7 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java @@ -31,7 +31,6 @@ import org.scribble.ast.local.LProtocolDecl; import org.scribble.ast.local.LRecursion; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.type.kind.RecVarKind; import org.scribble.core.type.name.GProtocolName; @@ -40,6 +39,7 @@ import org.scribble.core.type.name.Role; import org.scribble.del.DoDel; import org.scribble.lang.LangContext; +import org.scribble.util.ScribException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.ProjectedRoleDeclFixer; import org.scribble.visit.context.ProtocolDeclContextBuilder; @@ -70,7 +70,7 @@ public LDo visitForSubprotocolInlining(ProtocolDefInliner builder, LDo child) @Override public LDo leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner dinlr, ScribNode visited) throws ScribbleException + ProtocolDefInliner dinlr, ScribNode visited) throws ScribException { if (!dinlr.isCycle()) { @@ -93,7 +93,7 @@ public LDo leaveProtocolInlining(ScribNode parent, ScribNode child, public ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, ScribNode child, ProjectedRoleDeclFixer fixer, ScribNode visited) - throws ScribbleException + throws ScribException // CHECKME: similar needed for non-role args? Or all params always known? (not ideal for distributed?) { LangContext jc = fixer.job.getContext(); @@ -125,7 +125,7 @@ public LDo leaveProtocolInlining(ScribNode parent, ScribNode child, @Override public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { /*//if (checker.isCycle()) if (checker.isRootedCycle()) // ChoiceUnguardedSubprotocolChecker is a (regular) SubprotocolVisitor which pushes a subprotosig on root decl entry (ProjectedSubprotocolPruner.visit) diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java index 7ecdb3384..20357940e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java @@ -15,22 +15,22 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LSessionNode; -import org.scribble.core.job.ScribbleException; import org.scribble.del.InteractionNodeDel; import org.scribble.del.ScribDelBase; +import org.scribble.util.ScribException; import org.scribble.visit.wf.ReachabilityChecker; public interface LInteractionNodeDel extends InteractionNodeDel { // Unlike WF-choice enter/leave for CompoundInteractionNodeDelegate (i.e. both global/local), reachability is limited to local only @Override - default void enterReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker) throws ScribbleException + default void enterReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker) throws ScribException { ScribDelBase.pushVisitorEnv(this, checker); } @Override - default LSessionNode leaveReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker, ScribNode visited) throws ScribbleException + default LSessionNode leaveReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker, ScribNode visited) throws ScribException { return (LSessionNode) ScribDelBase.popAndSetVisitorEnv(this, checker, visited); } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java index d5fd770a2..0fc159e49 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java @@ -22,13 +22,13 @@ import org.scribble.ast.SessionNode; import org.scribble.ast.ScribNode; import org.scribble.ast.local.LSessionNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EState; import org.scribble.core.type.kind.Local; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LRecursion; import org.scribble.del.InteractionSeqDel; import org.scribble.del.ScribDelBase; +import org.scribble.util.ScribException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceDoPruner; @@ -42,7 +42,7 @@ public class LInteractionSeqDel extends InteractionSeqDel @Override public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, ScribNode child, ProjectedChoiceDoPruner pruner, ScribNode visited) - throws ScribbleException + throws ScribException { LInteractionSeq lc = (LInteractionSeq) visited; List actions = lc.getInteractionChildren().stream() @@ -53,7 +53,7 @@ public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, // enter in super @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + ProtocolDefInliner inl, ScribNode visited) throws ScribException { LInteractionSeq lis = (LInteractionSeq) visited; List lins = new LinkedList(); @@ -78,7 +78,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, // Replaces visitChildrenInSubprotocols for LocalInteractionSequence public LInteractionSeq visitForReachabilityChecking( ReachabilityChecker checker, LInteractionSeq child) - throws ScribbleException + throws ScribException { List visited = new LinkedList<>(); for (SessionNode li : child.getInteractionChildren()) @@ -86,7 +86,7 @@ public LInteractionSeq visitForReachabilityChecking( ReachabilityEnv re = checker.peekEnv(); if (!re.isSequenceable()) { - throw new ScribbleException(li.getSource(), + throw new ScribException(li.getSource(), "Invalid/unreachable sequence to: " + li); } visited.add((LSessionNode) li.accept(checker)); @@ -95,7 +95,7 @@ public LInteractionSeq visitForReachabilityChecking( } public LInteractionSeq visitForFsmConversion(EGraphBuilder gb, - LInteractionSeq child) throws ScribbleException + LInteractionSeq child) throws ScribException { EState entry = gb.util.getEntry(); EState exit = gb.util.getExit(); @@ -146,7 +146,7 @@ public LInteractionSeq visitForFsmConversion(EGraphBuilder gb, // Duplicated from GInteractionSeq @Override public LInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, - RecRemover rem, ScribNode visited) throws ScribbleException + RecRemover rem, ScribNode visited) throws ScribException { LInteractionSeq lis = (LInteractionSeq) visited; List lins = lis.getInteractionChildren().stream() diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java index b84fdd9be..4c0301431 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java @@ -15,14 +15,14 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LMessageTransfer; -import org.scribble.core.job.ScribbleException; import org.scribble.del.MessageTransferDel; +import org.scribble.util.ScribException; import org.scribble.visit.wf.ExplicitCorrelationChecker; public abstract class LMessageTransferDel extends MessageTransferDel implements LSimpleInteractionNodeDel { @Override - public ScribNode leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribbleException + public ScribNode leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribException { LMessageTransfer lmt = (LMessageTransfer) visited; checker.pushEnv(checker.popEnv().disableAccept()); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java index b31380238..b0c72e4dc 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java @@ -23,9 +23,9 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LProtocolDecl; import org.scribble.ast.local.LProtocolHeader; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.Role; +import org.scribble.util.ScribException; import org.scribble.visit.context.ProjectedRoleDeclFixer; public class LProjectionDeclDel extends LProtocolDeclDel @@ -49,7 +49,7 @@ protected LProtocolDeclDel copy() @Override public ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, ScribNode child, ProjectedRoleDeclFixer fixer, ScribNode visited) - throws ScribbleException + throws ScribException { LProtocolDecl lpd = (LProtocolDecl) visited; // TODO: ensure all role params are used, to avoid empty roledecllist diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java index 5c7aa9397..a24d90c17 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java @@ -16,9 +16,9 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProtocolBlock; -import org.scribble.core.job.ScribbleException; import org.scribble.del.ProtocolBlockDel; import org.scribble.del.ScribDelBase; +import org.scribble.util.ScribException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.env.InlineProtocolEnv; import org.scribble.visit.wf.ReachabilityChecker; @@ -27,7 +27,7 @@ public class LProtocolBlockDel extends ProtocolBlockDel { @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + ProtocolDefInliner inl, ScribNode visited) throws ScribException { LProtocolBlock lpb = (LProtocolBlock) visited; LInteractionSeq seq = (LInteractionSeq) ((InlineProtocolEnv) lpb @@ -39,7 +39,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, @Override public void enterReachabilityCheck(ScribNode parent, ScribNode child, - ReachabilityChecker checker) throws ScribbleException + ReachabilityChecker checker) throws ScribException { ScribDelBase.pushVisitorEnv(this, checker); } @@ -47,7 +47,7 @@ public void enterReachabilityCheck(ScribNode parent, ScribNode child, @Override public LProtocolBlock leaveReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker, ScribNode visited) - throws ScribbleException + throws ScribException { return (LProtocolBlock) ScribDelBase.popAndSetVisitorEnv(this, checker, visited); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java index 3edfa681d..972df2091 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java @@ -18,12 +18,12 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.context.local.LProtocolDeclContext; import org.scribble.ast.local.LProtocolDecl; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.del.ProtocolDeclDel; +import org.scribble.util.ScribException; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProtocolDeclContextBuilder; @@ -50,7 +50,7 @@ protected void addSelfDependency(ProtocolDeclContextBuilder builder, @Override public void enterProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder) - throws ScribbleException + throws ScribException { super.enterProtocolDeclContextBuilding(parent, child, builder); } @@ -58,7 +58,7 @@ public void enterProtocolDeclContextBuilding(ScribNode parent, @Override public LProtocolDecl leaveProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) - throws ScribbleException + throws ScribException { LProtocolDecl lpd = (LProtocolDecl) visited; LProtocolDeclContext lcontext = new LProtocolDeclContext( diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java index 2544b2f45..66f76949f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java @@ -24,12 +24,12 @@ import org.scribble.ast.local.LProtocolDef; import org.scribble.ast.local.LRecursion; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.kind.RecVarKind; import org.scribble.del.ProtocolDefDel; import org.scribble.del.ScribDelBase; +import org.scribble.util.ScribException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.env.InlineProtocolEnv; @@ -50,7 +50,7 @@ protected LProtocolDefDel copy() @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + ProtocolDefInliner inl, ScribNode visited) throws ScribException { CommonTree blame = ((LProtocolDecl) parent).getHeaderChild().getSource(); // Cf., GProtocolDefDel SubprotoSig subsig = inl.peekStack(); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java index 0fe0d3344..4964875a3 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java @@ -17,10 +17,10 @@ import org.scribble.ast.MessageSigNode; import org.scribble.ast.ScribNode; import org.scribble.ast.local.LReceive; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; +import org.scribble.util.ScribException; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; @@ -30,7 +30,7 @@ public class LReceiveDel extends LMessageTransferDel { @Override public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder builder, ScribNode visited) throws ScribbleException + EGraphBuilder builder, ScribNode visited) throws ScribException { LReceive lr = (LReceive) visited; Role peer = lr.getSourceChild().toName(); @@ -56,7 +56,7 @@ public void enterProjectedChoiceSubjectFixing(ScribNode parent, @Override public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker) - throws ScribbleException + throws ScribException { super.enterUnguardedChoiceDoProjectionCheck(parent, child, checker); LReceive lr = (LReceive) child; diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java index 0004dd8e9..ff57269fd 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java @@ -18,9 +18,9 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.local.LRecursion; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.RecVar; import org.scribble.del.RecursionDel; +import org.scribble.util.ScribException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; @@ -36,7 +36,7 @@ public class LRecursionDel extends RecursionDel @Override public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { Recursion rec = (Recursion) visited; UnguardedChoiceDoEnv merged = checker.popEnv() @@ -48,7 +48,7 @@ public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + ProtocolDefInliner inl, ScribNode visited) throws ScribException { LRecursion lr = (LRecursion) visited; //RecVarNode recvar = lr.recvar.clone(); @@ -64,7 +64,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, @Override public LRecursion leaveReachabilityCheck(ScribNode parent, ScribNode child, - ReachabilityChecker checker, ScribNode visited) throws ScribbleException + ReachabilityChecker checker, ScribNode visited) throws ScribException { LRecursion lr = (LRecursion) visited; ReachabilityEnv env = checker.popEnv() @@ -98,7 +98,7 @@ public void enterEGraphBuilding(ScribNode parent, ScribNode child, @Override public LRecursion leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder graph, ScribNode visited) throws ScribbleException + EGraphBuilder graph, ScribNode visited) throws ScribException { LRecursion lr = (LRecursion) visited; RecVar rv = lr.getRecVarChild().toName(); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java index 686118b27..938e58acd 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java @@ -18,10 +18,10 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LRequest; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; +import org.scribble.util.ScribException; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; @@ -30,7 +30,7 @@ public class LRequestDel extends LConnectionActionDel { @Override public LRequest leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder builder, ScribNode visited) throws ScribbleException + EGraphBuilder builder, ScribNode visited) throws ScribException { LRequest lc = (LRequest) visited; MessageNode msg = lc.getMessageNodeChild(); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java index 7f1546b86..dd4c606d0 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java @@ -21,10 +21,10 @@ import org.scribble.ast.local.LMessageTransfer; import org.scribble.ast.local.LSend; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; +import org.scribble.util.ScribException; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; import org.scribble.visit.wf.ExplicitCorrelationChecker; @@ -34,13 +34,13 @@ public class LSendDel extends LMessageTransferDel @Override public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder builder, ScribNode visited) throws ScribbleException + EGraphBuilder builder, ScribNode visited) throws ScribException { LSend ls = (LSend) visited; List dests = ls.getDestinationChildren(); if (dests.size() > 1) { - throw new ScribbleException( + throw new ScribException( "[TODO] EFSM building for multicast not supported: " + ls); } Role peer = dests.get(0).toName(); @@ -67,7 +67,7 @@ public void enterProjectedChoiceSubjectFixing(ScribNode parent, @Override public LMessageTransfer leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) - throws ScribbleException + throws ScribException { LMessageTransfer lmt = (LMessageTransfer) visited; checker.pushEnv(checker.popEnv().disableAccept()); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java index b46bc3f90..fb6b9cf0c 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java @@ -16,9 +16,9 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LWrapClient; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.Role; import org.scribble.del.ConnectionActionDel; +import org.scribble.util.ScribException; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; @@ -27,7 +27,7 @@ public class LWrapClientDel extends ConnectionActionDel { @Override public LWrapClient leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder builder, ScribNode visited) throws ScribbleException + EGraphBuilder builder, ScribNode visited) throws ScribException { LWrapClient lc = (LWrapClient) visited; RoleNode dest = lc.getDestinationChild(); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java index de7418df1..e7e88750a 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java @@ -15,9 +15,9 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LWrapServer; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.Role; import org.scribble.del.ConnectionActionDel; +import org.scribble.util.ScribException; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; @@ -28,7 +28,7 @@ public class LWrapServerDel extends ConnectionActionDel { @Override public LWrapServer leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder builder, ScribNode visited) throws ScribbleException + EGraphBuilder builder, ScribNode visited) throws ScribException { LWrapServer la = (LWrapServer) visited; Role peer = la.getSourceChild().toName(); @@ -47,7 +47,7 @@ public void enterProjectedChoiceSubjectFixing(ScribNode parent, @Override public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker) - throws ScribbleException + throws ScribException { super.enterUnguardedChoiceDoProjectionCheck(parent, child, checker); LWrapServer la = (LWrapServer) child; diff --git a/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java index 8d3c1b94d..470e316aa 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java @@ -18,10 +18,10 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.simple.IdNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.name.DataType; import org.scribble.del.ScribDelBase; +import org.scribble.util.ScribException; import org.scribble.visit.wf.NameDisambiguator; public class DataTypeNodeDel extends ScribDelBase @@ -34,7 +34,7 @@ public DataTypeNodeDel() // Is this needed? Or DataTypeNodes always created from AmbigNameNode? (in this same pass) @Override public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb, ScribNode visited) throws ScribbleException + NameDisambiguator disamb, ScribNode visited) throws ScribException { if (parent instanceof DataTypeDecl) // Hacky? don't want to do for decl simplenames (generally, don't do if parent is namedeclnode) { @@ -45,7 +45,7 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, DataType dt = dtn.toName(); if (!mc.isVisibleDataType(dt)) { - throw new ScribbleException(dtn.getSource(), + throw new ScribException(dtn.getSource(), "Data type not visible: " + dt); } DataType fullname = mc.getVisibleDataTypeFullName(dt); diff --git a/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java index 78da6bc2c..874b71c76 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java @@ -18,10 +18,10 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.simple.IdNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.name.MessageSigName; import org.scribble.del.ScribDelBase; +import org.scribble.util.ScribException; import org.scribble.visit.wf.NameDisambiguator; public class MessageSigNameNodeDel extends ScribDelBase @@ -34,7 +34,7 @@ public MessageSigNameNodeDel() // Is this needed? Or DataTypeNodes always created from AmbigNameNode? (in this same pass) @Override public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb, ScribNode visited) throws ScribbleException + NameDisambiguator disamb, ScribNode visited) throws ScribException { if (parent instanceof MessageSigNameDecl) // Hacky? don't want to do for decl simplenames (generally, don't do if parent is namedeclnode) { diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java index fe5bf4e9c..8e4f89fcc 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java @@ -21,13 +21,13 @@ import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.ast.name.simple.SigParamNode; import org.scribble.ast.name.simple.TypeParamNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.DataTypeKind; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.AmbigName; import org.scribble.del.ScribDelBase; +import org.scribble.util.ScribException; import org.scribble.visit.wf.NameDisambiguator; public class AmbigNameNodeDel extends ScribDelBase @@ -40,7 +40,7 @@ public AmbigNameNodeDel() // Currently only in "message positions (see Scribble.g ambiguousname) @Override public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb, ScribNode visited) throws ScribbleException + NameDisambiguator disamb, ScribNode visited) throws ScribException { ModuleContext mcontext = disamb.getModuleContext(); AmbigNameNode ann = (AmbigNameNode) visited; @@ -51,7 +51,7 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, { if (parent instanceof MessageTransfer) // FIXME HACK: MessageTransfer assumes MessageNode (cast in visitChildren), so this needs to be caught here // FIXME: other similar cases? { - throw new ScribbleException(ann.getSource(), + throw new ScribException(ann.getSource(), "Invalid occurrence of data type: " + parent); } /*return disamb.job.config.af.QualifiedNameNode(ann.getSource(), @@ -64,7 +64,7 @@ else if (mcontext.isMessageSigNameVisible(name.toMessageSigName())) { if (parent instanceof PayloadElem) // FIXME HACK { - throw new ScribbleException(ann.getSource(), + throw new ScribException(ann.getSource(), "Invalid occurrence of message signature name: " + parent); } /*return disamb.job.config.af.QualifiedNameNode(ann.getSource(), @@ -91,7 +91,7 @@ else if (kind.equals(SigKind.KIND)) return res; } } - throw new ScribbleException(ann.getSource(), + throw new ScribException(ann.getSource(), "Cannot disambiguate name: " + name); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java index 7accc943e..cf086c663 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java @@ -15,10 +15,10 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.RecVarKind; import org.scribble.core.type.name.RecVar; import org.scribble.del.ScribDelBase; +import org.scribble.util.ScribException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.wf.NameDisambiguator; @@ -31,14 +31,14 @@ public RecVarNodeDel() @Override public RecVarNode leaveDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb, ScribNode visited) throws ScribbleException + NameDisambiguator disamb, ScribNode visited) throws ScribException { // Consistent with bound RoleNode checking RecVarNode rn = (RecVarNode) visited; RecVar rv = rn.toName(); if (!disamb.isBoundRecVar(rv)) { - throw new ScribbleException(rn.getSource(), + throw new ScribException(rn.getSource(), "Rec variable not bound: " + rn); } return (RecVarNode) super.leaveDisambiguation(parent, child, disamb, rn); @@ -47,7 +47,7 @@ public RecVarNode leaveDisambiguation(ScribNode parent, ScribNode child, @Override public void enterProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inliner) throws ScribbleException + ProtocolDefInliner inliner) throws ScribException { super.enterProtocolInlining(parent, child, inliner); ScribDelBase.pushVisitorEnv(this, inliner); @@ -55,7 +55,7 @@ public void enterProtocolInlining(ScribNode parent, ScribNode child, @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inliner, ScribNode visited) throws ScribbleException + ProtocolDefInliner inliner, ScribNode visited) throws ScribException { RecVarNode rn = (RecVarNode) visited; RecVar rv = rn.toName(); diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java index 353099bec..06600a09c 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java @@ -15,8 +15,8 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.del.ScribDelBase; +import org.scribble.util.ScribException; import org.scribble.visit.wf.NameDisambiguator; public class RoleNodeDel extends ScribDelBase @@ -27,12 +27,12 @@ public RoleNodeDel() } @Override - public RoleNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + public RoleNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { RoleNode rn = (RoleNode) visited; if (!disamb.isBoundRole(rn.toName())) // Added on RoleDecl entry { - throw new ScribbleException(rn.getSource(), "Role not bound: " + rn); + throw new ScribException(rn.getSource(), "Role not bound: " + rn); } return rn; } diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index a8747a3fa..12528b0de 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -23,10 +23,10 @@ import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; import org.scribble.core.job.Job; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.name.ModuleName; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.context.ModuleContextBuilder; @@ -56,7 +56,7 @@ public Lang(Map parsed, this.context = new LangContext(this, parsed); // Single instance per Job and should never be shared } - public Job toJob() throws ScribbleException + public Job toJob() throws ScribException { if (this.job2 == null) { @@ -74,7 +74,7 @@ public Job toJob() throws ScribbleException debugPrintln("\nParsed:\n" + gpd + "\n\nScribble intermediate:\n" + g); } } - this.job2 = new Job(imeds, this.modcs, this.config.toJobConfig2()); + this.job2 = new Job(imeds, this.modcs, this.config.toJobConfig()); } return this.job2; } @@ -108,28 +108,29 @@ public SGraph buildSGraph(GProtocolName fullname, Map egraphs, runWellFormednessPasses(); }*/ - public void runContextBuildingPasses() throws ScribbleException + public void runContextBuildingPasses() throws ScribException { + // CHECKME: in the end, should these also be refactored into core? (instead of AST visiting) runVisitorPassOnAllModules(ModuleContextBuilder.class); // Always done first (even if other contexts are built later) so that following passes can use ModuleContextVisitor runVisitorPassOnAllModules(NameDisambiguator.class); // Includes validating names used in subprotocol calls.. } public void runVisitorPassOnAllModules(Class c) - throws ScribbleException + throws ScribException { debugPrintPass("Running " + c + " on all modules:"); runVisitorPass(this.context.getFullModuleNames(), c); } public void runVisitorPassOnParsedModules(Class c) - throws ScribbleException + throws ScribException { debugPrintPass("Running " + c + " on parsed modules:"); runVisitorPass(this.context.getParsedFullModuleNames(), c); } private void runVisitorPass(Set modnames, - Class c) throws ScribbleException + Class c) throws ScribException { try { @@ -149,7 +150,7 @@ private void runVisitorPass(Set modnames, } private void runVisitorOnModule(ModuleName modname, AstVisitor nv) - throws ScribbleException + throws ScribException { Module visited = (Module) this.context.getModule(modname).accept(nv); this.context.replaceModule(visited); diff --git a/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java b/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java index 703857c70..16fb4da3d 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java +++ b/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java @@ -63,7 +63,7 @@ public LangConfig(boolean debug, ModuleName main, boolean useOldWF, boolean noLi this.sf = sf; } - public JobConfig toJobConfig2() + public JobConfig toJobConfig() { return new JobConfig(debug, main, useOldWf, noProgress, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin, diff --git a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextMaker.java b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextMaker.java index 27eba8b18..da288f69a 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextMaker.java +++ b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextMaker.java @@ -23,7 +23,6 @@ import org.scribble.ast.NonProtocolDecl; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.local.LProtocolDecl; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.lang.context.ScribNames; import org.scribble.core.type.name.DataType; @@ -31,6 +30,7 @@ import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.ModuleName; +import org.scribble.util.ScribException; // TODO: rename and refactor public class ModuleContextMaker @@ -56,7 +56,7 @@ public ModuleContextMaker() //JobContext jcontext, public ModuleContext make( Map parsed, // From MainContext (N.B., in a different non-visible package) - Module root) throws ScribbleException + Module root) throws ScribException { this.root = root; this.deps = new ScribNames(); @@ -86,7 +86,7 @@ public ModuleContext make( // Register mod under name modname, modname could be the full module name or an import alias // Adds member names qualified by mod private static void addModule(ScribNames names, Module mod, - ModuleName modname) throws ScribbleException + ModuleName modname) throws ScribException { names.modules.put(modname, mod.getFullModuleName()); for (NonProtocolDecl npd : mod.getNonProtoDeclChildren()) @@ -120,7 +120,7 @@ private static void addModule(ScribNames names, Module mod, // Could move to ImportModule but would need a defensive copy setter, or cache info in builder and create on leave private void addImportDependencies(Map parsed, Module mod) - throws ScribbleException + throws ScribException { for (ImportDecl id : mod.getImportDeclChildren()) { @@ -145,7 +145,7 @@ private void addImportDependencies(Map parsed, Module mod) // Adds "local" imports by alias or full name // Adds "local" members by simple names private void addVisible(Map parsed, Module root) - throws ScribbleException + throws ScribException { // Unlike for deps, visible is not done transitively for (ImportDecl id : root.getImportDeclChildren()) @@ -158,7 +158,7 @@ private void addVisible(Map parsed, Module root) // getVisibleName doesn't use fullname if (this.visible.modules.containsKey(visname)) { - throw new ScribbleException(id.getSource(), + throw new ScribException(id.getSource(), "Duplicate visible module name: " + visname); } Module imported = parsed.get(fullname); // TODO: Can get from MainContext instead of JobContext? diff --git a/scribble-ast/src/main/java/org/scribble/util/ScribUtil.java b/scribble-ast/src/main/java/org/scribble/util/ScribNodeUtil.java similarity index 98% rename from scribble-ast/src/main/java/org/scribble/util/ScribUtil.java rename to scribble-ast/src/main/java/org/scribble/util/ScribNodeUtil.java index 3ecd085a1..4cca8d937 100644 --- a/scribble-ast/src/main/java/org/scribble/util/ScribUtil.java +++ b/scribble-ast/src/main/java/org/scribble/util/ScribNodeUtil.java @@ -19,7 +19,7 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.ScribNode; -public class ScribUtil +public class ScribNodeUtil { // Strict class equality, cf. ScribNodeBase#visitChildWithClassCheck // C is expected to be of a ground class type diff --git a/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java index 306fc855c..c7bef0817 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java @@ -14,8 +14,8 @@ package org.scribble.visit; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; // Pattern: node accepts visitor and calls visitor back (standard visitor pattern -- adding a new operation doesn't affect the Ast classes), but then visitor delegates back to node delegate (so routines for handling each node type not centralised in visitor, but decentralised to delegates) public abstract class AstVisitor @@ -31,7 +31,7 @@ protected AstVisitor(Lang job) // Used by ScribNodeBase::accept public ScribNode visit(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { enter(parent, child); ScribNode visited = child.visitChildren(this); // visited means "children visited so far"; we're about to visit "this" now via "leave" @@ -39,13 +39,13 @@ public ScribNode visit(ScribNode parent, ScribNode child) } protected void enter(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { } protected ScribNode leave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { return visited; } diff --git a/scribble-ast/src/main/java/org/scribble/visit/EnvVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/EnvVisitor.java index f35a06e45..d717b3589 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/EnvVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/EnvVisitor.java @@ -17,9 +17,9 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; import org.scribble.visit.context.ModuleContextVisitor; import org.scribble.visit.env.Env; @@ -36,7 +36,7 @@ public EnvVisitor(Lang job) } @Override - protected final void enter(ScribNode parent, ScribNode child) throws ScribbleException + protected final void enter(ScribNode parent, ScribNode child) throws ScribException { super.enter(parent, child); if (child instanceof ProtocolDecl) // Only the root ProtocolDecl is visited: subprotocols visit the body directly @@ -48,7 +48,7 @@ protected final void enter(ScribNode parent, ScribNode child) throws ScribbleExc } @Override - protected final ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected final ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException { ScribNode n = envLeave(parent, child, visited); if (n instanceof ProtocolDecl) // Only the root ProtocolDecl is visited by SubprotocolVisitor (subprotocols visit the body directly) @@ -60,7 +60,7 @@ protected final ScribNode leave(ScribNode parent, ScribNode child, ScribNode vis protected abstract T makeRootProtocolDeclEnv(ProtocolDecl pd); - protected void envEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected void envEnter(ScribNode parent, ScribNode child) throws ScribException { //..could push copy of parent Env onto visitor stack for use by visitor pass (del env-leave routine should pop and push back the final result) //..but only if want an env for every node (unless restrict to specific nodes types -- e.g. interaction nodes) -- as opposed to only e.g. compound nodes, as done via del @@ -69,7 +69,7 @@ protected void envEnter(ScribNode parent, ScribNode child) throws ScribbleExcept //return this; } - protected ScribNode envLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected ScribNode envLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException { return visited; } diff --git a/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java index f42fde2fc..eb88cb5d2 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java @@ -14,11 +14,11 @@ package org.scribble.visit; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.global.GNode; import org.scribble.core.type.name.ModuleName; import org.scribble.del.global.GDel; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; // CHECKME: move to visit package? public class GTypeTranslator extends SimpleVisitor @@ -29,7 +29,7 @@ public GTypeTranslator(Lang job, ModuleName mod) } @Override - public GNode visit(ScribNode n) throws ScribbleException + public GNode visit(ScribNode n) throws ScribException { return ((GDel) n.del()).translate(n, this); } diff --git a/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java b/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java index bcc2ac210..5ca718260 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java +++ b/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java @@ -29,12 +29,12 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.local.LRecursion; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.RecVar; import org.scribble.del.ProtocolDefDel; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; import org.scribble.visit.env.UnfoldingEnv; // Statically unfolds unguarded recursions and continues "directly under" choices @@ -72,7 +72,7 @@ protected UnfoldingEnv makeRootProtocolDeclEnv(ProtocolDecl ScribNode unfold(Recursion rec) - throws ScribbleException + throws ScribException { RecVar rv = rec.getRecVarChild().toName(); ProtocolBlock pb = rec.getBlockChild(); @@ -123,7 +123,7 @@ private ScribNode unfold(Recursion rec) @Override protected void inlinedEnter(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { super.inlinedEnter(parent, child); child.del().enterInlinedProtocolUnfolding(parent, child, this); @@ -131,7 +131,7 @@ protected void inlinedEnter(ScribNode parent, ScribNode child) @Override protected ScribNode inlinedLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { visited = visited.del().leaveInlinedProtocolUnfolding(parent, child, this, visited); @@ -145,7 +145,7 @@ public Recursion getRecVar(RecVar recvar) // Maybe possible to revise this algorithm to handle shadowed recs, but currently requires unique recvar names public void setRecVar(AstFactory af, RecVar recvar, Recursion rec) - throws ScribbleException + throws ScribException { ProtocolBlock block = (ProtocolBlock) rec.getBlockChild() .accept(this); diff --git a/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java index 9d9082fb7..3d33ddff6 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java @@ -15,9 +15,9 @@ import org.scribble.ast.ProtocolDef; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.del.ProtocolDefDel; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; import org.scribble.visit.env.Env; public abstract class InlinedProtocolVisitor> extends EnvVisitor @@ -28,14 +28,14 @@ public InlinedProtocolVisitor(Lang job) } @Override - public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleException + public ScribNode visit(ScribNode parent, ScribNode child) throws ScribException { enter(parent, child); ScribNode visited = visitInlinedProtocol(parent, child); return leave(parent, child, visited); } - protected ScribNode visitInlinedProtocol(ScribNode parent, ScribNode child) throws ScribbleException + protected ScribNode visitInlinedProtocol(ScribNode parent, ScribNode child) throws ScribException { if (child instanceof ProtocolDef) { @@ -49,12 +49,12 @@ protected ScribNode visitInlinedProtocol(ScribNode parent, ScribNode child) thro } // N.B. results of visiting inlined version are stored back to inlined field, but original AST is unaffected -- so any Env/Del or AST updates to inlined version do not reflect back onto original AST -- a motivation for the original SubprotocolVisitor approach - private ScribNode visitOverrideForProtocolDef(ScribNode parent, ProtocolDef pd) throws ScribbleException + private ScribNode visitOverrideForProtocolDef(ScribNode parent, ProtocolDef pd) throws ScribException { ProtocolDef inlined = ((ProtocolDefDel) pd.del()).getInlinedProtocolDef(); if (inlined == null) { - throw new ScribbleException("InlineProtocolVisitor error: " + pd); // E.g. -fsm when inconsistent choice subjects + throw new ScribException("InlineProtocolVisitor error: " + pd); // E.g. -fsm when inconsistent choice subjects // FIXME: shouldn't occur any more? } @@ -69,25 +69,25 @@ private ScribNode visitOverrideForProtocolDef(ScribNode parent, ProtocolDef p } @Override - protected final void envEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected final void envEnter(ScribNode parent, ScribNode child) throws ScribException { super.envEnter(parent, child); inlinedEnter(parent, child); } @Override - protected final ScribNode envLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected final ScribNode envLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException { ScribNode n = inlinedLeave(parent, child, visited); return super.envLeave(parent, child, n); } - protected void inlinedEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected void inlinedEnter(ScribNode parent, ScribNode child) throws ScribException { } - protected ScribNode inlinedLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected ScribNode inlinedLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException { return visited; } diff --git a/scribble-ast/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java index 155a06d39..146060cf3 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java @@ -19,12 +19,12 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.NonRoleArgKind; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; import org.scribble.visit.env.Env; // Can probably be fully replaced by SubprotocolVisitor @@ -51,20 +51,20 @@ protected void enterRootProtocolDecl(ProtocolDecl pd) @Override protected final ScribNode visitForSubprotocols(ScribNode parent, - ScribNode child) throws ScribbleException + ScribNode child) throws ScribException { return visitForOffsetSubprotocols(parent, child); } protected ScribNode visitForOffsetSubprotocols(ScribNode parent, - ScribNode child) throws ScribbleException + ScribNode child) throws ScribException { return super.visitForSubprotocols(parent, child); } @Override protected final void envLeaveProtocolDeclOverride(ScribNode parent, - ScribNode child, ScribNode visited) throws ScribbleException + ScribNode child, ScribNode visited) throws ScribException { this.rolemaps.pop(); this.argmaps.pop(); @@ -72,7 +72,7 @@ protected final void envLeaveProtocolDeclOverride(ScribNode parent, @Override protected final void subprotocolEnter(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { super.subprotocolEnter(parent, child); offsetSubprotocolEnter(parent, child); @@ -80,20 +80,20 @@ protected final void subprotocolEnter(ScribNode parent, ScribNode child) @Override protected final ScribNode subprotocolLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { ScribNode n = offsetSubprotocolLeave(parent, child, visited); return super.subprotocolLeave(parent, child, n); } protected void offsetSubprotocolEnter(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { } protected ScribNode offsetSubprotocolLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { return visited; } diff --git a/scribble-ast/src/main/java/org/scribble/visit/ProtocolDefInliner.java b/scribble-ast/src/main/java/org/scribble/visit/ProtocolDefInliner.java index 398ba259f..0058db55b 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/ProtocolDefInliner.java +++ b/scribble-ast/src/main/java/org/scribble/visit/ProtocolDefInliner.java @@ -22,7 +22,6 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GDo; import org.scribble.ast.local.LDo; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.ProtocolKind; @@ -32,6 +31,7 @@ import org.scribble.del.local.LDoDel; import org.scribble.lang.Lang; import org.scribble.lang.LangContext; +import org.scribble.util.ScribException; import org.scribble.visit.env.InlineProtocolEnv; public class ProtocolDefInliner extends SubprotocolVisitor @@ -80,7 +80,7 @@ protected InlineProtocolEnv makeRootProtocolDeclEnv(ProtocolDecl visitOverrideForDo(InteractionSeq parent, Do child) throws ScribbleException + protected Do visitOverrideForDo(InteractionSeq parent, Do child) throws ScribException { if (!isCycle()) { @@ -138,7 +138,7 @@ protected Do visitOverrideForDo(InteractionSeq parent, Do child) throws @Override protected void subprotocolEnter(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { super.subprotocolEnter(parent, child); child.del().enterProtocolInlining(parent, child, this); @@ -146,7 +146,7 @@ protected void subprotocolEnter(ScribNode parent, ScribNode child) @Override protected ScribNode subprotocolLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { visited = visited.del().leaveProtocolInlining(parent, child, this, visited); return super.subprotocolLeave(parent, child, visited); diff --git a/scribble-ast/src/main/java/org/scribble/visit/SimpleVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/SimpleVisitor.java index 1c2d1966d..d85dcfd7e 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/SimpleVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/SimpleVisitor.java @@ -14,10 +14,10 @@ package org.scribble.visit; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.name.ModuleName; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; // A SimpleVisitor visits a Module (or some part of one) for a given Job // Apart from delegating to del-specific visiting methods, SimpleVisitors are mainly for holding data and collecting common operations @@ -35,7 +35,7 @@ public SimpleVisitor(Lang job, ModuleName fullname) // Override to delegate to del-specific method, e.g., n.del().visit(n, this) // N.B. ScribNode has getParent - public abstract T visit(ScribNode n) throws ScribbleException; + public abstract T visit(ScribNode n) throws ScribException; public ModuleContext getModuleContext() { diff --git a/scribble-ast/src/main/java/org/scribble/visit/SubprotocolVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/SubprotocolVisitor.java index 0445c5285..01151603b 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/SubprotocolVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/SubprotocolVisitor.java @@ -33,7 +33,6 @@ import org.scribble.ast.ScopedNode; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.NonRoleArgKind; @@ -46,6 +45,7 @@ import org.scribble.core.type.session.Arg; import org.scribble.lang.Lang; import org.scribble.lang.LangContext; +import org.scribble.util.ScribException; import org.scribble.visit.env.Env; public abstract class SubprotocolVisitor> extends EnvVisitor @@ -89,7 +89,7 @@ protected void enterRootProtocolDecl(ProtocolDecl pd) // Most subclasses will override visitForSubprotocols (e.g. ReachabilityChecker, FsmConstructor), but sometimes still want to change whole visit pattern (e.g. Projector) @Override public ScribNode visit(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { enter(parent, child); ScribNode visited = visitForSubprotocols(parent, child); @@ -98,7 +98,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) // Subclasses can override this to disable subprotocol visiting protected ScribNode visitForSubprotocols(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { if (child instanceof Do) { @@ -113,7 +113,7 @@ protected ScribNode visitForSubprotocols(ScribNode parent, ScribNode child) // The Do node itself is no longer visited -- FIXME: projection needs to visit it -- no: that's in enter/leave, visited means "visit children" protected Do visitOverrideForDo(ScribNode parent, Do doo) - throws ScribbleException + throws ScribException { if (!isCycle()) { @@ -147,7 +147,7 @@ protected ScribNode applySubstitutions(ScribNode n) return n.accept( new Substitutor(this.job, this.rolemaps.peek(), this.argmaps.peek())); } - catch (ScribbleException e) + catch (ScribException e) { throw new RuntimeException("Shouldn't get in here: " + n); } @@ -155,7 +155,7 @@ protected ScribNode applySubstitutions(ScribNode n) @Override protected final void envEnter(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { super.envEnter(parent, child); @@ -181,7 +181,7 @@ protected final void envEnter(ScribNode parent, ScribNode child) @Override protected final ScribNode envLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { ScribNode n = subprotocolLeave(parent, child, visited); if (child instanceof ProtocolDecl) @@ -201,19 +201,19 @@ protected final ScribNode envLeave(ScribNode parent, ScribNode child, // Hack for OffsetSubprotocolVisitor protected void envLeaveProtocolDeclOverride(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { leaveSubprotocol(); } protected void subprotocolEnter(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { } protected ScribNode subprotocolLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { return visited; } diff --git a/scribble-ast/src/main/java/org/scribble/visit/Substitutor.java b/scribble-ast/src/main/java/org/scribble/visit/Substitutor.java index 33f835ffc..da9768d74 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/Substitutor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/Substitutor.java @@ -18,11 +18,11 @@ import org.scribble.ast.NonRoleArgNode; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.NonRoleArgKind; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; public class Substitutor extends AstVisitor { @@ -41,7 +41,7 @@ public Substitutor(Lang job, Map rolemap, @Override public ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) - throws ScribbleException + throws ScribException { return visited.substituteNames(this); } diff --git a/scribble-ast/src/main/java/org/scribble/visit/UnfoldingVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/UnfoldingVisitor.java index f7e6af503..9054b754f 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/UnfoldingVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/UnfoldingVisitor.java @@ -24,9 +24,9 @@ import org.scribble.ast.ProtocolBlock; import org.scribble.ast.Recursion; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.RecVar; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; import org.scribble.visit.env.Env; // FIXME: unfolding/unrolling algorithm would be easier if we would use an "affine rec var" normal form: a single rec can have multiple labels, each label used at most once in a continue @@ -50,7 +50,7 @@ public UnfoldingVisitor(Lang job) @Override public ScribNode visit(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { enter(parent, child); ScribNode visited = visitForUnfolding(parent, child); @@ -58,7 +58,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) } protected ScribNode visitForUnfolding(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { if (child instanceof Continue) { @@ -83,7 +83,7 @@ protected ScribNode visitForUnfolding(ScribNode parent, ScribNode child) @Override protected final void inlinedEnter(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { super.inlinedEnter(parent, child); if (child instanceof Recursion) @@ -102,7 +102,7 @@ protected final void inlinedEnter(ScribNode parent, ScribNode child) @Override protected final ScribNode inlinedLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { ScribNode n = unfoldingLeave(parent, child, visited); if (child instanceof Recursion) @@ -120,13 +120,13 @@ protected final ScribNode inlinedLeave(ScribNode parent, ScribNode child, } protected void unfoldingEnter(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { } protected ScribNode unfoldingLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { return visited; } diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/EGraphBuilder.java b/scribble-ast/src/main/java/org/scribble/visit/context/EGraphBuilder.java index 071b1dc08..bf11f4a5a 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/context/EGraphBuilder.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/EGraphBuilder.java @@ -17,11 +17,11 @@ import org.scribble.ast.local.LChoice; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProtocolBlock; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EGraphBuilderUtil; import org.scribble.del.local.LChoiceDel; import org.scribble.del.local.LInteractionSeqDel; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; import org.scribble.visit.NoEnvInlinedProtocolVisitor; // Changed from offsetsubprot visitor to inlined visitor to reduce state label accumulation to rec only -- then, wfc-checking for "unguarded" recursive-do-as-continue in choice blocks handled by unfolding inlineds @@ -38,7 +38,7 @@ public EGraphBuilder(Lang job) { this.util = job.toJob().newEGraphBuilderUtil(); } - catch (ScribbleException e) // TODO: refactor + catch (ScribException e) // TODO: refactor { throw new RuntimeException(e); } @@ -47,7 +47,7 @@ public EGraphBuilder(Lang job) // Override visitInlinedProtocol -- not visit, or else enter/exit is lost @Override public ScribNode visitInlinedProtocol(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { if (child instanceof LInteractionSeq) { @@ -65,7 +65,7 @@ else if (child instanceof LChoice) } protected LInteractionSeq visitOverrideForLInteractionSeq( - LProtocolBlock parent, LInteractionSeq child) throws ScribbleException + LProtocolBlock parent, LInteractionSeq child) throws ScribException { return ((LInteractionSeqDel) child.del()).visitForFsmConversion(this, child); @@ -79,7 +79,7 @@ protected LChoice visitOverrideForLChoice(LInteractionSeq parent, @Override protected final void inlinedEnter(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException //protected final void unfoldingEnter(ScribNode parent, ScribNode child) throws ScribbleException { super.inlinedEnter(parent, child); @@ -89,7 +89,7 @@ protected final void inlinedEnter(ScribNode parent, ScribNode child) @Override protected ScribNode inlinedLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException //protected ScribNode unfoldingLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException { visited = visited.del().leaveEGraphBuilding(parent, child, this, visited); diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java b/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java index c625aa3bc..904253f1e 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java @@ -14,10 +14,10 @@ package org.scribble.visit.context; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.context.ModuleContext; import org.scribble.lang.Lang; import org.scribble.lang.context.ModuleContextMaker; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // Disambiguates ambiguous PayloadTypeOrParameter names and inserts implicit Scope names @@ -34,7 +34,7 @@ public ModuleContextBuilder(Lang job) @Override protected void enter(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { //System.out.println("mmm1: " + child.getClass() + " ,, " + child.del()); child.del().enterModuleContextBuilding(parent, child, this); @@ -42,7 +42,7 @@ protected void enter(ScribNode parent, ScribNode child) @Override protected ScribNode leave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { return visited.del().leaveModuleContextBuilding(parent, child, this, visited); diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java index b7a99612d..fc43e0d48 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java @@ -15,10 +15,10 @@ import org.scribble.ast.Module; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.context.ModuleContext; import org.scribble.del.ModuleDel; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // A visitor that caches the ModuleContext from an entered Module, for later access @@ -33,7 +33,7 @@ public ModuleContextVisitor(Lang job) @Override protected void enter(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { super.enter(parent, child); if (child instanceof Module) // Factor out? diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java b/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java index 82205b417..169de188c 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java @@ -23,10 +23,10 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.local.LProtocolDecl; import org.scribble.ast.name.simple.DummyProjectionRoleNode; -import org.scribble.core.job.ScribbleException; import org.scribble.del.ModuleDel; import org.scribble.lang.Lang; import org.scribble.lang.LangContext; +import org.scribble.util.ScribException; import org.scribble.visit.context.env.UnguardedChoiceDoEnv; // Basically infers all local choice subject candidates: if *none* are found for a given "choice-unguarded" do-call then the call is pruned (along with parent block and choice as necessary) @@ -47,7 +47,7 @@ protected ProjectedSubprotocolPruningEnv makeRootProtocolDeclEnv(ProtocolDecl> { @@ -27,14 +27,14 @@ public MessageIdCollector(Lang job, ModuleContext mcontext) } @Override - protected final void offsetSubprotocolEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected final void offsetSubprotocolEnter(ScribNode parent, ScribNode child) throws ScribException { super.offsetSubprotocolEnter(parent, child); child.del().enterMessageIdCollection(parent, child, this); } @Override - protected ScribNode offsetSubprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected ScribNode offsetSubprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException { visited = visited.del().leaveMessageIdCollection(parent, child, this, visited); return super.offsetSubprotocolLeave(parent, child, visited); diff --git a/scribble-ast/src/main/java/org/scribble/visit/util/RecVarCollector.java b/scribble-ast/src/main/java/org/scribble/visit/util/RecVarCollector.java index a33c06cb2..c471d47c4 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/util/RecVarCollector.java +++ b/scribble-ast/src/main/java/org/scribble/visit/util/RecVarCollector.java @@ -15,10 +15,10 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.name.RecVar; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; // Collects continues (not recs) public class RecVarCollector extends NameCollector @@ -34,7 +34,7 @@ public RecVarCollector(Lang job, ModuleContext mcontext) } @Override - protected final void offsetSubprotocolEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected final void offsetSubprotocolEnter(ScribNode parent, ScribNode child) throws ScribException { super.offsetSubprotocolEnter(parent, child); if (child instanceof ProtocolDecl) @@ -45,7 +45,7 @@ protected final void offsetSubprotocolEnter(ScribNode parent, ScribNode child) t } @Override - protected ScribNode offsetSubprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected ScribNode offsetSubprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException { visited = visited.del().leaveRecVarCollection(parent, child, this, visited); return super.offsetSubprotocolLeave(parent, child, visited); diff --git a/scribble-ast/src/main/java/org/scribble/visit/util/RoleCollector.java b/scribble-ast/src/main/java/org/scribble/visit/util/RoleCollector.java index 317a53e57..0e343e963 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/util/RoleCollector.java +++ b/scribble-ast/src/main/java/org/scribble/visit/util/RoleCollector.java @@ -15,10 +15,10 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.name.Role; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; // Second pass for ProtocolDeclContext building // Maybe generalise to integrate enabled message collection? @@ -36,7 +36,7 @@ public RoleCollector(Lang job, ModuleContext mcontext) } @Override - protected final void offsetSubprotocolEnter(ScribNode parent, ScribNode child) throws ScribbleException + protected final void offsetSubprotocolEnter(ScribNode parent, ScribNode child) throws ScribException { super.offsetSubprotocolEnter(parent, child); if (child instanceof ProtocolDecl) @@ -47,7 +47,7 @@ protected final void offsetSubprotocolEnter(ScribNode parent, ScribNode child) t } @Override - protected ScribNode offsetSubprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + protected ScribNode offsetSubprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException { visited = visited.del().leaveRoleCollection(parent, child, this, visited); return super.offsetSubprotocolLeave(parent, child, visited); diff --git a/scribble-ast/src/main/java/org/scribble/visit/validation/GProtocolValidator.java b/scribble-ast/src/main/java/org/scribble/visit/validation/GProtocolValidator.java index 60c80dfd9..b628ed585 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/validation/GProtocolValidator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/validation/GProtocolValidator.java @@ -15,8 +15,8 @@ import org.scribble.ast.ScribNode; import org.scribble.core.job.Job; -import org.scribble.core.job.ScribbleException; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; import org.scribble.visit.context.ModuleContextVisitor; public class GProtocolValidator extends ModuleContextVisitor @@ -36,14 +36,14 @@ public GProtocolValidator(Job job2) } @Override - public void enter(ScribNode parent, ScribNode child) throws ScribbleException + public void enter(ScribNode parent, ScribNode child) throws ScribException { super.enter(parent, child); child.del().enterValidation(parent, child, this); } @Override - public ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + public ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException { visited = visited.del().leaveValidation(parent, child, this, visited); return super.leave(parent, child, visited); diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java b/scribble-ast/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java index 2b82b597a..02ee59602 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java +++ b/scribble-ast/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java @@ -18,8 +18,8 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.core.job.ScribbleException; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; import org.scribble.visit.context.ModuleContextVisitor; // Checks for recursive protocoldecl dependencies in the presence of delegations (currently, both via the delegation, and in of the protocoldelcs themselves -- FIXME over restrictive) @@ -34,7 +34,7 @@ public DelegationProtocolRefChecker(Lang job) } @Override - public void enter(ScribNode parent, ScribNode child) throws ScribbleException + public void enter(ScribNode parent, ScribNode child) throws ScribException { super.enter(parent, child); if (child instanceof ProtocolDecl) @@ -45,7 +45,7 @@ public void enter(ScribNode parent, ScribNode child) throws ScribbleException } @Override - public ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + public ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException { visited = visited.del().leaveDelegationProtocolRefCheck(parent, child, this, visited); if (visited instanceof ProtocolDecl) diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java b/scribble-ast/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java index 6d6161861..5c6d0c543 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java +++ b/scribble-ast/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java @@ -17,11 +17,11 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.Role; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; import org.scribble.visit.SubprotocolVisitor; import org.scribble.visit.wf.env.ExplicitCorrelationEnv; @@ -37,7 +37,7 @@ public ExplicitCorrelationChecker(Lang job) @Override public ScribNode visit(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { if (child instanceof GProtocolDecl) { @@ -60,7 +60,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) @Override public void subprotocolEnter(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { super.subprotocolEnter(parent, child); child.del().enterExplicitCorrelationCheck(parent, child, this); @@ -68,7 +68,7 @@ public void subprotocolEnter(ScribNode parent, ScribNode child) @Override public ScribNode subprotocolLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { visited = visited.del().leaveExplicitCorrelationCheck(parent, child, this, visited); return super.subprotocolLeave(parent, child, visited); diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/NameDisambiguator.java b/scribble-ast/src/main/java/org/scribble/visit/wf/NameDisambiguator.java index b81681b7b..18422a4ab 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/NameDisambiguator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/wf/NameDisambiguator.java @@ -20,7 +20,6 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GDelegationElem; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.NonRoleArgKind; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.Name; @@ -28,6 +27,7 @@ import org.scribble.core.type.name.Role; import org.scribble.del.global.GDelegationElemDel; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; import org.scribble.visit.context.ModuleContextVisitor; // Disambiguates ambiguous PayloadTypeOrParameter names and inserts implicit Scope names @@ -57,7 +57,7 @@ public NameDisambiguator(Lang job) // Most subclasses will override visitForSubprotocols (e.g. ReachabilityChecker, FsmConstructor), but sometimes still want to change whole visit pattern (e.g. Projector) @Override - public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleException + public ScribNode visit(ScribNode parent, ScribNode child) throws ScribException { /*if (child instanceof ProtocolDecl) // FIXME: factor out { @@ -68,7 +68,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleExcepti return leave(parent, child, visited); } - protected ScribNode visitForDisamb(ScribNode parent, ScribNode child) throws ScribbleException + protected ScribNode visitForDisamb(ScribNode parent, ScribNode child) throws ScribException { if (child instanceof GDelegationElem) { @@ -83,14 +83,14 @@ protected ScribNode visitForDisamb(ScribNode parent, ScribNode child) throws Scr @Override //public NameDisambiguator enter(ModelNode parent, ModelNode child) throws ScribbleException - public void enter(ScribNode parent, ScribNode child) throws ScribbleException + public void enter(ScribNode parent, ScribNode child) throws ScribException { super.enter(parent, child); child.del().enterDisambiguation(parent, child, this); } @Override - public ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + public ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException { visited = visited.del().leaveDisambiguation(parent, child, this, visited); return super.leave(parent, child, visited); diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java b/scribble-ast/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java index 6b13de216..9320b0696 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java +++ b/scribble-ast/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java @@ -17,9 +17,9 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProtocolBlock; -import org.scribble.core.job.ScribbleException; import org.scribble.del.local.LInteractionSeqDel; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; import org.scribble.visit.UnfoldingVisitor; import org.scribble.visit.wf.env.ReachabilityEnv; @@ -40,7 +40,7 @@ protected ReachabilityEnv makeRootProtocolDeclEnv(ProtocolDecl pd) // Following Projector visit pattern -- for overriding base enter/visit/leave pattern @Override protected ScribNode visitForUnfolding(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { if (child instanceof LInteractionSeq) { @@ -54,7 +54,7 @@ protected ScribNode visitForUnfolding(ScribNode parent, ScribNode child) } protected LInteractionSeq visitOverrideForLInteractionSequence( - LProtocolBlock parent, LInteractionSeq child) throws ScribbleException + LProtocolBlock parent, LInteractionSeq child) throws ScribException { return ((LInteractionSeqDel) child.del()).visitForReachabilityChecking(this, (LInteractionSeq) child); @@ -62,7 +62,7 @@ protected LInteractionSeq visitOverrideForLInteractionSequence( @Override protected void unfoldingEnter(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { super.unfoldingEnter(parent, child); child.del().enterReachabilityCheck(parent, child, this); @@ -70,7 +70,7 @@ protected void unfoldingEnter(ScribNode parent, ScribNode child) @Override protected ScribNode unfoldingLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { visited = visited.del().leaveReachabilityCheck(parent, child, this, visited); diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java b/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java index dd69c4f08..6f65d23d9 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java +++ b/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java @@ -21,9 +21,9 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; import org.scribble.visit.UnfoldingVisitor; import org.scribble.visit.wf.env.WFChoiceEnv; @@ -52,7 +52,7 @@ protected WFChoiceEnv makeRootProtocolDeclEnv( @Override public ScribNode visit(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { if (child instanceof GProtocolDecl) { @@ -75,7 +75,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) } private ScribNode visitOverrideForChoice(InteractionSeq parent, - Choice child) throws ScribbleException + Choice child) throws ScribException { if (child instanceof Choice) { @@ -101,7 +101,7 @@ private ScribNode visitOverrideForChoice(InteractionSeq parent, @Override protected void unfoldingEnter(ScribNode parent, ScribNode child) - throws ScribbleException + throws ScribException { super.unfoldingEnter(parent, child); child.del().enterInlinedWFChoiceCheck(parent, child, this); @@ -109,7 +109,7 @@ protected void unfoldingEnter(ScribNode parent, ScribNode child) @Override protected ScribNode unfoldingLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribbleException + ScribNode visited) throws ScribException { visited = visited.del().leaveInlinedWFChoiceCheck(parent, child, this, visited); diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 71ce79ec7..a433447b2 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -28,11 +28,8 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.codegen.java.JEndpointApiGenerator; import org.scribble.codegen.java.callbackapi.CBEndpointApiGenerator3; -import org.scribble.core.job.AntlrSourceException; import org.scribble.core.job.Job; import org.scribble.core.job.JobContext; -import org.scribble.core.job.RuntimeScribbleException; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.global.SGraph; @@ -44,8 +41,11 @@ import org.scribble.main.Main; import org.scribble.main.resource.locator.DirectoryResourceLocator; import org.scribble.main.resource.locator.ResourceLocator; +import org.scribble.util.AntlrSourceException; +import org.scribble.util.RuntimeScribException; import org.scribble.util.ScribParserException; -import org.scribble.util.ScribUtil2; +import org.scribble.util.ScribUtil; +import org.scribble.util.ScribException; public class CommandLine { @@ -70,7 +70,7 @@ public CommandLine(String... args) throws CommandLineException // A Scribble extension should override newMainContext as appropriate. protected Main newMainContext() - throws ScribParserException, ScribbleException + throws ScribParserException, ScribException { //boolean jUnit = this.args.containsKey(ArgFlag.JUNIT); boolean debug = this.args.containsKey(CLArgFlag.VERBOSE); // TODO: factor out (cf. MainContext fields) @@ -117,7 +117,7 @@ public void run() throws CommandLineException, AntlrSourceException // Scribble { runBody(); } - catch (ScribbleException e) // Wouldn't need to do this if not Runnable (so maybe change) + catch (ScribException e) // Wouldn't need to do this if not Runnable (so maybe change) { if (this.args.containsKey(CLArgFlag.JUNIT) || this.args.containsKey(CLArgFlag.VERBOSE)) @@ -139,7 +139,7 @@ public void run() throws CommandLineException, AntlrSourceException // Scribble System.err.println(e.getMessage()); // No need to give full stack trace, even for debug, for command line errors System.exit(1); } - catch (RuntimeScribbleException e) + catch (RuntimeScribException e) { System.err.println(e.getMessage()); System.exit(1); @@ -151,12 +151,12 @@ protected void runBody() { Main mc = newMainContext(); // Represents current instance of tooling for given CL args Lang job = mc.newJob(); // A Job is some series of passes performed on each Module in the MainContext (e.g., cf. Job::runVisitorPass) - ScribbleException fail = null; + ScribException fail = null; try { doValidationTasks(job); // FIXME: refactor into job } - catch (ScribbleException x) + catch (ScribException x) { fail = x; } @@ -166,7 +166,7 @@ protected void runBody() { tryOutputTasks(job); // FIXME: refactor into job } - catch (ScribbleException x) + catch (ScribException x) { if (fail == null) { @@ -204,7 +204,7 @@ protected void doValidationTasks(Lang job) } protected void tryOutputTasks(Lang job) - throws CommandLineException, ScribbleException + throws CommandLineException, ScribException { // Following must be ordered appropriately -- ? if (this.args.containsKey(CLArgFlag.PROJECT)) @@ -267,7 +267,7 @@ protected void tryOutputTasks(Lang job) // TODO: rename protected void doNonAttemptableOutputTasks(Lang job) - throws ScribbleException, CommandLineException + throws ScribException, CommandLineException { if (this.args.containsKey(CLArgFlag.SESS_API_GEN)) { @@ -289,7 +289,7 @@ protected void doNonAttemptableOutputTasks(Lang job) // TODO: option to write to file, like classes private void printProjections(Lang job) - throws CommandLineException, ScribbleException + throws CommandLineException, ScribException { LangContext jobc = job.getContext(); Job job2 = job.toJob(); @@ -309,7 +309,7 @@ private void printProjections(Lang job) // forUser: true means for API gen and general user info (may be minimised), false means for validation (non-minimised, fair or unfair) // (forUser && !fair) should not hold, i.e. unfair doesn't make sense if forUser private void printEGraph(Lang job, boolean forUser, boolean fair) - throws ScribbleException, CommandLineException + throws ScribException, CommandLineException { LangContext jobc = job.getContext(); String[] args = forUser @@ -330,7 +330,7 @@ private void printEGraph(Lang job, boolean forUser, boolean fair) } private void drawEGraph(Lang job, boolean forUser, boolean fair) - throws ScribbleException, CommandLineException + throws ScribException, CommandLineException { LangContext jobc = job.getContext(); String[] args = forUser @@ -351,7 +351,7 @@ private void drawEGraph(Lang job, boolean forUser, boolean fair) // Endpoint graphs are "inlined", so only a single graph is built (cf. projection output) private EGraph getEGraph(Lang job, GProtocolName fullname, Role role, boolean forUser, boolean fair) - throws ScribbleException, CommandLineException + throws ScribException, CommandLineException { LangContext jobc = job.getContext(); JobContext jobc2 = job.toJob().getContext(); @@ -379,14 +379,14 @@ private EGraph getEGraph(Lang job, GProtocolName fullname, Role role, } if (graph == null) { - throw new RuntimeScribbleException("Shouldn't see this: " + fullname); + throw new RuntimeScribException("Shouldn't see this: " + fullname); // Should be suppressed by an earlier failure } return graph; } private void printSGraph(Lang job, boolean fair) - throws ScribbleException, CommandLineException + throws ScribException, CommandLineException { LangContext jobc = job.getContext(); String[] args = fair @@ -404,7 +404,7 @@ private void printSGraph(Lang job, boolean fair) } private void drawSGraph(Lang job, boolean fair) - throws ScribbleException, CommandLineException + throws ScribException, CommandLineException { LangContext jobc = job.getContext(); String[] args = fair @@ -420,7 +420,7 @@ private void drawSGraph(Lang job, boolean fair) } private static SGraph getSGraph(Lang job, GProtocolName fullname, boolean fair) - throws ScribbleException + throws ScribException { JobContext jobc2 = job.toJob().getContext(); SGraph model = fair @@ -428,14 +428,14 @@ private static SGraph getSGraph(Lang job, GProtocolName fullname, boolean fair) : jobc2.getUnfairSGraph(fullname); if (model == null) { - throw new RuntimeScribbleException("Shouldn't see this: " + fullname); + throw new RuntimeScribException("Shouldn't see this: " + fullname); // Should be suppressed by an earlier failure } return model; } private void outputEndpointApi(Lang job) - throws ScribbleException, CommandLineException + throws ScribException, CommandLineException { LangContext jobc = job.getContext(); String[] args = this.args.get(CLArgFlag.API_GEN); @@ -453,7 +453,7 @@ private void outputEndpointApi(Lang job) } private void outputSessionApi(Lang job) - throws ScribbleException, CommandLineException + throws ScribException, CommandLineException { LangContext jobc = job.getContext(); String[] args = this.args.get(CLArgFlag.SESS_API_GEN); @@ -467,7 +467,7 @@ private void outputSessionApi(Lang job) } private void outputStateChannelApi(Lang job) - throws ScribbleException, CommandLineException + throws ScribException, CommandLineException { LangContext jobc = job.getContext(); String[] args = this.args.get(CLArgFlag.SCHAN_API_GEN); @@ -483,7 +483,7 @@ private void outputStateChannelApi(Lang job) } private void outputEventDrivenApi(Lang job) - throws ScribbleException, CommandLineException + throws ScribException, CommandLineException { LangContext jobc = job.getContext(); String[] args = this.args.get(CLArgFlag.ED_API_GEN); @@ -510,20 +510,20 @@ private void outputEventDrivenApi(Lang job) // filepath -> class source protected void outputClasses(Map classes) - throws ScribbleException + throws ScribException { Consumer f; if (this.args.containsKey(CLArgFlag.API_OUTPUT)) { String dir = this.args.get(CLArgFlag.API_OUTPUT)[0]; - f = path -> { ScribUtil2.handleLambdaScribbleException(() -> + f = path -> { ScribUtil.handleLambdaScribbleException(() -> { String tmp = dir + "/" + path; if (this.args.containsKey(CLArgFlag.VERBOSE)) { System.out.println("[DEBUG] Writing to: " + tmp); } - ScribUtil2.writeToFile(tmp, classes.get(path)); return null; + ScribUtil.writeToFile(tmp, classes.get(path)); return null; }); }; } else @@ -534,7 +534,7 @@ protected void outputClasses(Map classes) } protected static void runDot(String dot, String png) - throws ScribbleException, CommandLineException + throws ScribException, CommandLineException { String tmpName = png + ".tmp"; File tmp = new File(tmpName); @@ -544,8 +544,8 @@ protected static void runDot(String dot, String png) } try { - ScribUtil2.writeToFile(tmpName, dot); - String[] res = ScribUtil2.runProcess("dot", "-Tpng", "-o" + png, tmpName); + ScribUtil.writeToFile(tmpName, dot); + String[] res = ScribUtil.runProcess("dot", "-Tpng", "-o" + png, tmpName); System.out.print(!res[1].isEmpty() ? res[1] : res[0]); // already "\n" terminated } finally diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java index 219191da2..450b31f72 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java @@ -16,9 +16,9 @@ import java.util.Map; import org.scribble.core.job.Job; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.GProtocolName; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; // Basic pattern: use TypeGenerators to create all necessary TypeBuilders and cache them, and generateApi should call build on all as a final step public abstract class ApiGen @@ -34,7 +34,7 @@ public ApiGen(Lang job, GProtocolName fullname) { this.job2 = job.toJob(); } - catch (ScribbleException e) // TODO: refactor + catch (ScribException e) // TODO: refactor { throw new RuntimeException(e); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java index ef5ac502b..261a9d7cd 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java @@ -19,11 +19,11 @@ import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.statechanapi.ioifaces.IOInterfacesGenerator; -import org.scribble.core.job.RuntimeScribbleException; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.Role; import org.scribble.lang.Lang; +import org.scribble.util.RuntimeScribException; +import org.scribble.util.ScribException; public class JEndpointApiGenerator { @@ -34,7 +34,7 @@ public JEndpointApiGenerator(Lang job) this.job = job; } - public Map generateSessionApi(GProtocolName fullname) throws ScribbleException + public Map generateSessionApi(GProtocolName fullname) throws ScribException { this.job.debugPrintln("\n[Java API gen] Running " + SessionApiGenerator.class + " for " + fullname); SessionApiGenerator sg = new SessionApiGenerator(this.job, fullname); // FIXME: reuse? @@ -43,7 +43,7 @@ public Map generateSessionApi(GProtocolName fullname) throws Scr } // FIXME: refactor an EndpointApiGenerator -- ? - public Map generateStateChannelApi(GProtocolName fullname, Role self, boolean subtypes) throws ScribbleException + public Map generateStateChannelApi(GProtocolName fullname, Role self, boolean subtypes) throws ScribException { /*JobContext jc = this.job.getContext(); if (jc.getEndpointGraph(fullname, self) == null) @@ -57,7 +57,7 @@ public Map generateStateChannelApi(GProtocolName fullname, Role { iogen = new IOInterfacesGenerator(apigen, subtypes); } - catch (RuntimeScribbleException e) // FIXME: use IOInterfacesGenerator.skipIOInterfacesGeneration + catch (RuntimeScribException e) // FIXME: use IOInterfacesGenerator.skipIOInterfacesGeneration { //System.err.println("[Warning] Skipping I/O Interface generation for protocol featuring: " + fullname); this.job.warningPrintln("Skipping I/O Interface generation for: " + fullname + "\n Cause: " + e.getMessage()); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 2c3edd42a..38d17427b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -28,7 +28,6 @@ import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.core.job.Job; import org.scribble.core.job.JobContext; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.MState; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.EStateKind; @@ -38,6 +37,7 @@ import org.scribble.core.type.name.PayloadElemType; import org.scribble.core.type.name.Role; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; // FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) // From ParamCoreEndpointApiGenerator @@ -58,7 +58,7 @@ public CBEndpointApiGenerator(Lang job, GProtocolName fullname, Role self, boole { this.job2 = job.toJob(); } - catch (ScribbleException e) // TODO: refactor + catch (ScribException e) // TODO: refactor { throw new RuntimeException(e); } @@ -72,14 +72,14 @@ public CBEndpointApiGenerator(Lang job, GProtocolName fullname, Role self, boole } } - public Map build() throws ScribbleException + public Map build() throws ScribException { Map res = new HashMap<>(); // filepath -> source res.putAll(buildSessionApi()); return res; } - public Map buildSessionApi() throws ScribbleException // FIXME: factor out -- integrate with JEndpointApiGenerator + public Map buildSessionApi() throws ScribException // FIXME: factor out -- integrate with JEndpointApiGenerator { this.job.debugPrintln("\n[param-core] Running " + CBEndpointApiGenerator.class + " for " + this.proto + "@" + this.self); @@ -89,7 +89,7 @@ public Map buildSessionApi() throws ScribbleException // FIXME: return res; } - public Map buildEndpointClass() throws ScribbleException + public Map buildEndpointClass() throws ScribException { Module main = this.job.getContext().getMainModule(); JobContext jobc2 = this.job2.getContext(); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 68d047b37..e5850ecd8 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -34,7 +34,6 @@ import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.core.job.Job; import org.scribble.core.job.JobContext; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.MState; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.EStateKind; @@ -46,6 +45,7 @@ import org.scribble.core.type.name.Role; import org.scribble.lang.Lang; import org.scribble.lang.LangContext; +import org.scribble.util.ScribException; // FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) // FIXME: consider collecting up all interfaces as statics inside a container class -- also states? @@ -69,7 +69,7 @@ public CBEndpointApiGenerator3(Lang job, GProtocolName fullname, Role self, bool { this.job2 = job.toJob(); } - catch (ScribbleException e) // TODO: refactor + catch (ScribException e) // TODO: refactor { throw new RuntimeException(e); } @@ -83,7 +83,7 @@ public CBEndpointApiGenerator3(Lang job, GProtocolName fullname, Role self, bool } } - public Map build() throws ScribbleException + public Map build() throws ScribException { this.stateNames.clear(); Map res = new HashMap<>(); // filepath -> source @@ -92,7 +92,7 @@ public Map build() throws ScribbleException } // FIXME: factor out -- integrate with JEndpointApiGenerator - public Map buildSessionApi() throws ScribbleException + public Map buildSessionApi() throws ScribException { this.job.debugPrintln("\n[param-core] Running " + CBEndpointApiGenerator3.class + " for " + this.proto + "@" + this.self); @@ -102,7 +102,7 @@ public Map buildSessionApi() throws ScribbleException return res; } - public Map buildEndpointClass() throws ScribbleException + public Map buildEndpointClass() throws ScribException { Module main = this.job.getContext().getMainModule(); Map res = new HashMap<>(); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index 3d7734961..f4eeef140 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -27,12 +27,12 @@ import org.scribble.codegen.java.util.ConstructorBuilder; import org.scribble.codegen.java.util.FieldBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; import org.scribble.del.ModuleDel; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; import org.scribble.visit.util.MessageIdCollector; public class SessionApiGenerator extends ApiGen @@ -53,7 +53,7 @@ public class SessionApiGenerator extends ApiGen private final ClassBuilder cb = new ClassBuilder(); private final Map classes = new HashMap<>(); // All classes in same package, for protected constructor access - public SessionApiGenerator(Lang job, GProtocolName fullname) throws ScribbleException + public SessionApiGenerator(Lang job, GProtocolName fullname) throws ScribException { super(job, fullname); constructRoleClasses(); @@ -179,7 +179,7 @@ private void addSingletonConstant(ClassBuilder cb, String subpack, String type) fb.setExpression(getEndpointApiRootPackageName(this.gpn) + "." + subpack + "." + type + "." + type); // Currently requires source Scribble to be in a package that is not the root -- can fix by generating to a subpackage based on Module and/or protocol } - private void constructOpClasses() throws ScribbleException + private void constructOpClasses() throws ScribException { Module mod = this.job.getContext().getModule(this.gpn.getPrefix()); GProtocolName simpname = this.gpn.getSimpleName(); @@ -195,7 +195,7 @@ private void constructOpClasses() throws ScribbleException } } - private void constructRoleClasses() throws ScribbleException + private void constructRoleClasses() throws ScribException { Module mod = this.job.getContext().getModule(this.gpn.getPrefix()); GProtocolName simpname = this.gpn.getSimpleName(); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java index 541a3e8f3..02e077a6d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java @@ -27,13 +27,13 @@ import org.scribble.codegen.java.util.EnumBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.PayloadElemType; import org.scribble.core.type.name.Role; +import org.scribble.util.ScribException; public class BranchSockGen extends ScribSockGen { @@ -57,7 +57,7 @@ protected void addImports() //private void addBranchMethod(ClassBuilder cb, EndpointState curr) @Override - protected void addMethods() throws ScribbleException + protected void addMethods() throws ScribException { final String ROLE_PARAM = "role"; final String MESSAGE_VAR = "m"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java index 63020ff22..d580baea8 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java @@ -24,12 +24,12 @@ import org.scribble.codegen.java.util.FieldBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.Role; +import org.scribble.util.ScribException; public class CaseSockGen extends ScribSockGen { @@ -78,7 +78,7 @@ protected MethodBuilder addConstructor() //private String constructCaseClass(EndpointState curr, Module main) @Override - protected void addMethods() throws ScribbleException + protected void addMethods() throws ScribException { String branchName = this.apigen.getSocketClassName(curr); // Name of "parent" branch class (curr state is the branch state) String enumClassName = branchName + "." + BranchSockGen.getBranchEnumClassName(this.apigen, this.curr); @@ -117,7 +117,7 @@ protected void addMethods() throws ScribbleException } // Same as in ReceiveSocketGenerator - private MethodBuilder makeReceiveHeader(ClassBuilder cb, EAction a, EState succ) throws ScribbleException + private MethodBuilder makeReceiveHeader(ClassBuilder cb, EAction a, EState succ) throws ScribException { MethodBuilder mb = cb.newMethod(); ReceiveSockGen.setReceiveHeaderWithoutReturnType(this.apigen, a, mb); @@ -125,7 +125,7 @@ private MethodBuilder makeReceiveHeader(ClassBuilder cb, EAction a, EState succ) return mb; } - private void addReceiveMethod(ClassBuilder cb, EAction a, EState succ) throws ScribbleException + private void addReceiveMethod(ClassBuilder cb, EAction a, EState succ) throws ScribException { Module main = this.apigen.getMainModule(); @@ -146,7 +146,7 @@ private void addReceiveMethod(ClassBuilder cb, EAction a, EState succ) throws Sc addReturnNextSocket(mb, succ); } - private MethodBuilder makeCaseReceiveHeader(ClassBuilder cb, EAction a, EState succ) throws ScribbleException + private MethodBuilder makeCaseReceiveHeader(ClassBuilder cb, EAction a, EState succ) throws ScribException { MethodBuilder mb = cb.newMethod(); setCaseReceiveHeaderWithoutReturnType(this.apigen, a, mb); @@ -154,7 +154,7 @@ private MethodBuilder makeCaseReceiveHeader(ClassBuilder cb, EAction a, EState s return mb; } - private void addCaseReceiveMethod(ClassBuilder cb, EAction a, EState succ) throws ScribbleException + private void addCaseReceiveMethod(ClassBuilder cb, EAction a, EState succ) throws ScribException { MethodBuilder mb = makeCaseReceiveHeader(cb, a, succ); String ln = JavaBuilder.RETURN + " " + "receive(" + getSessionApiRoleConstant(a.obj) + ", "; @@ -212,7 +212,7 @@ private static void addBranchCheck(String opClassName, MethodBuilder mb, String } // As for ReceiveSocket, but without peer param - public static void setCaseReceiveHeaderWithoutReturnType(StateChannelApiGenerator apigen, EAction a, MethodBuilder mb) throws ScribbleException + public static void setCaseReceiveHeaderWithoutReturnType(StateChannelApiGenerator apigen, EAction a, MethodBuilder mb) throws ScribException { //final String ROLE_PARAM = "role"; Module main = apigen.getMainModule(); // FIXME: main not necessarily the right module? diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java index efa444210..2e8acdf35 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java @@ -21,11 +21,11 @@ import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.MessageSigName; +import org.scribble.util.ScribException; // Factor out public class HandlerIfaceGen extends AuxStateChanTypeGen @@ -40,7 +40,7 @@ public HandlerIfaceGen(StateChannelApiGenerator apigen, ClassBuilder parent, ESt } @Override - public InterfaceBuilder generateType() throws ScribbleException + public InterfaceBuilder generateType() throws ScribException { GProtocolName gpn = this.apigen.getGProtocolName(); @@ -93,7 +93,7 @@ public static void setHandleMethodHeaderWithoutParamTypes(StateChannelApiGenerat mb.addExceptions(StateChannelApiGenerator.SCRIBBLERUNTIMEEXCEPTION_CLASS, "java.io.IOException", "ClassNotFoundException"); } - public static void addHandleMethodOpAndPayloadParams(StateChannelApiGenerator apigen, EAction a, MethodBuilder mb) throws ScribbleException + public static void addHandleMethodOpAndPayloadParams(StateChannelApiGenerator apigen, EAction a, MethodBuilder mb) throws ScribException { Module main = apigen.getMainModule(); String opClass = SessionApiGenerator.getOpClassName(a.mid); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java index 5fd64b0c5..7432db14e 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java @@ -26,12 +26,12 @@ import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.PayloadElemType; +import org.scribble.util.ScribException; public class InputFutureGen extends AuxStateChanTypeGen { @@ -47,7 +47,7 @@ public InputFutureGen(StateChannelApiGenerator apigen, ClassBuilder parent, EAct } @Override - public ClassBuilder generateType() throws ScribbleException + public ClassBuilder generateType() throws ScribException { final String FUTURE_PARAM = "fut"; Module main = this.apigen.getMainModule(); @@ -78,7 +78,7 @@ public ClassBuilder generateType() throws ScribbleException { if (!pt.isDataType()) { - throw new ScribbleException("[TODO] API generation not supported for non- data type payloads: " + pt); + throw new ScribException("[TODO] API generation not supported for non- data type payloads: " + pt); } DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); ScribSockGen.checkJavaDataTypeDecl(dtd); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java index cef49024d..0229f31f8 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java @@ -24,12 +24,12 @@ import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.PayloadElemType; +import org.scribble.util.ScribException; public class OutputSockGen extends ScribSockGen { @@ -54,7 +54,7 @@ protected void addImports() // A method for each successor state //private void addSendMethods(ClassBuilder cb, EndpointState curr) @Override - protected void addMethods() throws ScribbleException + protected void addMethods() throws ScribException { final String ROLE_PARAM = "role"; @@ -155,7 +155,7 @@ private static List getSendPayloadArgs(EAction a) return IntStream.range(0, a.payload.elems.size()).mapToObj((i) -> ARG_PREFIX + i++).collect(Collectors.toList()); // FIXME: factor out with params } - public static void setSendHeaderWithoutReturnType(StateChannelApiGenerator apigen, EAction a, MethodBuilder mb) throws ScribbleException + public static void setSendHeaderWithoutReturnType(StateChannelApiGenerator apigen, EAction a, MethodBuilder mb) throws ScribException { final String ROLE_PARAM = "role"; Module main = apigen.getMainModule(); // FIXME: main not necessarily the right module? @@ -209,7 +209,7 @@ public static void setWrapClientHeaderWithoutReturnType(StateChannelApiGenerator mb.addParameters("Callable wrapper"); } - protected static void addSendOpParams(StateChannelApiGenerator apigen, MethodBuilder mb, Module main, EAction a) throws ScribbleException + protected static void addSendOpParams(StateChannelApiGenerator apigen, MethodBuilder mb, Module main, EAction a) throws ScribException { List args = getSendPayloadArgs(a); mb.addParameters(SessionApiGenerator.getOpClassName(a.mid) + " op"); // opClass -- op param not actually used in body @@ -220,7 +220,7 @@ protected static void addSendOpParams(StateChannelApiGenerator apigen, MethodBui { if (!pt.isDataType()) { - throw new ScribbleException("[TODO] API generation not supported for non- data type payloads: " + pt); + throw new ScribException("[TODO] API generation not supported for non- data type payloads: " + pt); } DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); // FIXME: might not belong to main module // TODO: if not DataType ScribSockGen.checkJavaDataTypeDecl(dtd); @@ -229,7 +229,7 @@ protected static void addSendOpParams(StateChannelApiGenerator apigen, MethodBui } } - protected static void addSendMessageSigNameParams(MethodBuilder mb, MessageSigNameDecl msd) throws ScribbleException + protected static void addSendMessageSigNameParams(MethodBuilder mb, MessageSigNameDecl msd) throws ScribException { final String MESSAGE_PARAM = "m"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java index a868dc6c6..0c585199d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java @@ -20,12 +20,12 @@ import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.PayloadElemType; +import org.scribble.util.ScribException; public class ReceiveSockGen extends ScribSockGen { @@ -52,7 +52,7 @@ protected void addImports() // FIXME: most general async would also allow whole input-only compound statements (choice, recursion) to be bypassed //private void addReceiveMethods(ClassBuilder cb, EndpointState curr) @Override - protected void addMethods() throws ScribbleException + protected void addMethods() throws ScribException { EAction a = curr.getActions().iterator().next(); //String nextClass = this.apigen.getSocketClassName(curr.accept(a)); @@ -69,7 +69,7 @@ protected void addMethods() throws ScribbleException // [nextClass] receive([opClass] op, Buf arg, ...) //private void makeReceiveMethod(ClassBuilder cb, Module main, IOAction a, String nextClass, String opClass) - private void makeReceiveMethod(EAction a, EState succ) throws ScribbleException + private void makeReceiveMethod(EAction a, EState succ) throws ScribException { Module main = this.apigen.getMainModule(); // FIXME: main not necessarily the right module? @@ -94,7 +94,7 @@ private void makeReceiveMethod(EAction a, EState succ) throws ScribbleException } // Payload parameters added later - private MethodBuilder makeReceiveHeader(EAction a, EState succ) throws ScribbleException + private MethodBuilder makeReceiveHeader(EAction a, EState succ) throws ScribException { MethodBuilder mb = this.cb.newMethod(); setReceiveHeaderWithoutReturnType(this.apigen, a, mb); @@ -151,7 +151,7 @@ private void makeIsDoneMethod(EAction a) // Doesn't include return type //public static void makeReceiveHeader(StateChannelApiGenerator apigen, IOAction a, EndpointState succ, MethodBuilder mb) - public static void setReceiveHeaderWithoutReturnType(StateChannelApiGenerator apigen, EAction a, MethodBuilder mb) throws ScribbleException + public static void setReceiveHeaderWithoutReturnType(StateChannelApiGenerator apigen, EAction a, MethodBuilder mb) throws ScribException { final String ROLE_PARAM = "role"; Module main = apigen.getMainModule(); // FIXME: main not necessarily the right module? @@ -174,7 +174,7 @@ public static void setReceiveHeaderWithoutReturnType(StateChannelApiGenerator ap } // FIXME: main may not be the right module - protected static void addReceiveOpParams(MethodBuilder mb, Module main, EAction a, boolean superr) throws ScribbleException + protected static void addReceiveOpParams(MethodBuilder mb, Module main, EAction a, boolean superr) throws ScribException { if (!a.payload.isEmpty()) { @@ -184,7 +184,7 @@ protected static void addReceiveOpParams(MethodBuilder mb, Module main, EAction { if (!pt.isDataType()) { - throw new ScribbleException("[TODO] API generation not supported for non- data type payloads: " + pt); + throw new ScribException("[TODO] API generation not supported for non- data type payloads: " + pt); } DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType ScribSockGen.checkJavaDataTypeDecl(dtd); @@ -207,7 +207,7 @@ protected static void addPayloadBuffSetters(Module main, EAction a, MethodBuilde } } - protected static void addReceiveMessageSigNameParams(MethodBuilder mb, MessageSigNameDecl msd, boolean superr) throws ScribbleException + protected static void addReceiveMessageSigNameParams(MethodBuilder mb, MessageSigNameDecl msd, boolean superr) throws ScribException { ScribSockGen.checkMessageSigNameDecl(msd); mb.addParameters(BUF_CLASS + "<" + ((superr) ? "? " + JavaBuilder.SUPER + " " : "") + msd.extName + "> " + RECEIVE_ARG_PREFIX); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java index 200a4276f..91437ceec 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java @@ -23,11 +23,11 @@ import org.scribble.codegen.java.util.FieldBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EState; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; +import org.scribble.util.ScribException; // Parameterize on output class type public abstract class ScribSockGen extends StateChanTypeGen @@ -85,13 +85,13 @@ protected String getClassName() } @Override - public ClassBuilder generateType() throws ScribbleException + public ClassBuilder generateType() throws ScribException { constructClass(); // So className can be "overridden" in subclass constructor (CaseSocket) return this.cb; } - protected void constructClass() throws ScribbleException + protected void constructClass() throws ScribException { constructClassExceptMethods(); addMethods(); @@ -163,7 +163,7 @@ protected void addInitialStateConstructor() ctor2.addBodyLine(SESSIONENDPOINT_PARAM + ".init();"); } - protected abstract void addMethods() throws ScribbleException; + protected abstract void addMethods() throws ScribException; /*@Deprecated protected void setNextSocketReturnType(MethodBuilder mb, EState succ) @@ -259,21 +259,21 @@ public static void setNextSocketReturnType(StateChannelApiGenerator apigen, Meth mb.setReturn(ret); } - protected static void checkJavaDataTypeDecl(DataTypeDecl dtd) throws ScribbleException + protected static void checkJavaDataTypeDecl(DataTypeDecl dtd) throws ScribException { checkJavaSchema(dtd); } - protected static void checkMessageSigNameDecl(MessageSigNameDecl msd) throws ScribbleException + protected static void checkMessageSigNameDecl(MessageSigNameDecl msd) throws ScribException { checkJavaSchema(msd); } - protected static void checkJavaSchema(NonProtocolDecl npd) throws ScribbleException + protected static void checkJavaSchema(NonProtocolDecl npd) throws ScribException { if (!npd.schema.equals(ScribSockGen.JAVA_SCHEMA)) // FIXME: factor out { - throw new ScribbleException(npd.getSource(), "Unsupported data type schema: " + npd.schema); + throw new ScribException(npd.getSource(), "Unsupported data type schema: " + npd.schema); } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChanTypeGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChanTypeGen.java index 21d8dc0a9..1c6ac3777 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChanTypeGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChanTypeGen.java @@ -14,7 +14,7 @@ package org.scribble.codegen.java.statechanapi; import org.scribble.codegen.java.util.TypeBuilder; -import org.scribble.core.job.ScribbleException; +import org.scribble.util.ScribException; // Build a (top-level) type declaration for the API generation output public abstract class StateChanTypeGen @@ -26,5 +26,5 @@ public StateChanTypeGen(StateChannelApiGenerator apigen) this.apigen = apigen; } - public abstract TypeBuilder generateType() throws ScribbleException; // FIXME: APIGenerationException? + public abstract TypeBuilder generateType() throws ScribException; // FIXME: APIGenerationException? } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 3bb4dc3a5..282018966 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -23,7 +23,6 @@ import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.TypeBuilder; import org.scribble.core.job.JobContext; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.GProtocolName; @@ -31,6 +30,7 @@ import org.scribble.core.type.name.Role; import org.scribble.core.visit.global.Projector2; import org.scribble.lang.Lang; +import org.scribble.util.ScribException; // TODO: "wildcard" unary async: op doesn't matter -- for branch-receive op "still needed" to cast to correct branch state // TODO: "functional state interfaces", e.g. for smtp ehlo and quit actions @@ -57,7 +57,7 @@ public class StateChannelApiGenerator extends ApiGen private Map types = new HashMap<>(); // class/iface name key public StateChannelApiGenerator(Lang job, GProtocolName fullname, Role self) - throws ScribbleException // CHECKME: APIGenerationException? + throws ScribException // CHECKME: APIGenerationException? { super(job, fullname); @@ -134,7 +134,7 @@ private String newSocketClassName() return this.lpn.getSimpleName().toString() + "_" + this.counter++; } - private void constructClasses(EState curr) throws ScribbleException + private void constructClasses(EState curr) throws ScribException { if (curr.isTerminal()) { @@ -157,7 +157,7 @@ private void constructClasses(EState curr) throws ScribbleException } // Pre: curr is not terminal state - private ClassBuilder constructClass(EState curr) throws ScribbleException // FIXME: APIGenerationException? + private ClassBuilder constructClass(EState curr) throws ScribException // FIXME: APIGenerationException? { switch (curr.getStateKind()) { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java index f06027471..b245b60d5 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java @@ -20,12 +20,12 @@ import org.scribble.codegen.java.util.AbstractMethodBuilder; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.model.endpoint.actions.EReceive; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.PayloadElemType; +import org.scribble.util.ScribException; public class ActionIfaceGen extends IOIfaceGen { @@ -39,7 +39,7 @@ public ActionIfaceGen(StateChannelApiGenerator apigen, EState curr, EAction a) } @Override - public InterfaceBuilder generateType() throws ScribbleException + public InterfaceBuilder generateType() throws ScribException { GProtocolName gpn = this.apigen.getGProtocolName(); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java index 387ff32ee..a80333425 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java @@ -25,10 +25,10 @@ import org.scribble.codegen.java.util.EnumBuilder; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.Role; +import org.scribble.util.ScribException; public class BranchIfaceGen extends IOStateIfaceGen { @@ -38,7 +38,7 @@ public BranchIfaceGen(StateChannelApiGenerator apigen, Map getHandleInterfaceIOActionParams(EndpointState cur return as; }*/ - protected void addHandleMethods() throws ScribbleException + protected void addHandleMethods() throws ScribException { GProtocolName gpn = this.apigen.getGProtocolName(); //Role self = this.apigen.getSelf(); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index 1a0d43b86..8d13cb360 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -38,13 +38,13 @@ import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.codegen.java.util.TypeBuilder; import org.scribble.core.job.JobContext; -import org.scribble.core.job.RuntimeScribbleException; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.EStateKind; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.Role; +import org.scribble.util.RuntimeScribException; +import org.scribble.util.ScribException; // Cf. StateChannelApiGenerator // TODO: concrete state channel "to" casts for supertype i/f's (the info is there in the Java type hierachy though) @@ -70,7 +70,7 @@ public class IOInterfacesGenerator extends ApiGen //private final Map> branchSuccs = new HashMap<>(); private final Map> branchSuccs = new HashMap<>(); // key: HandleInterface name // Sorted when collected - public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) throws RuntimeScribbleException, ScribbleException + public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) throws RuntimeScribException, ScribException { super(apigen.getJob(), apigen.getGProtocolName()); this.apigen = apigen; @@ -90,7 +90,7 @@ public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) Set as = EState.getReachableActions(init); if (as.stream().anyMatch((a) -> !a.isSend() && !a.isReceive())) // HACK FIXME (connect/disconnect) { - throw new RuntimeScribbleException( + throw new RuntimeScribException( "[TODO] I/O Interface generation not supported for: " + as.stream().filter(a -> !a.isSend() && !a.isReceive()) .collect(Collectors.toList())); @@ -199,7 +199,7 @@ public Map generateApi() } // Factor out FSM visitor? - private void generateActionAndSuccessorInterfacesAndCollectPreActions(Set visited, EState s) throws ScribbleException + private void generateActionAndSuccessorInterfacesAndCollectPreActions(Set visited, EState s) throws ScribException { if (visited.contains(s) || s.isTerminal()) { @@ -262,7 +262,7 @@ private void generateActionAndSuccessorInterfacesAndCollectPreActions(Set visited, EState s) throws ScribbleException + private void generateIOStateInterfacesFirstPass(Set visited, EState s) throws ScribException { if (visited.contains(s) || s.isTerminal()) { @@ -355,7 +355,7 @@ private void generateIOStateInterfacesSecondPass(Set visited, EState s) } } - private void generateHandleInterfaces(Set visited, EState s) throws ScribbleException + private void generateHandleInterfaces(Set visited, EState s) throws ScribException { if (visited.contains(s) || s.isTerminal()) { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java index 4c99c0084..5b1c98e79 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java @@ -26,12 +26,12 @@ import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.TypeBuilder; -import org.scribble.core.job.RuntimeScribbleException; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.Role; +import org.scribble.util.RuntimeScribException; +import org.scribble.util.ScribException; // Cf. ScribSocketGenerator // Partial I/O State I/f generator -- Successor Interfaces and cast methods added later @@ -58,13 +58,13 @@ public IOStateIfaceGen(StateChannelApiGenerator apigen, Map 250) // .java { - throw new RuntimeScribbleException("I/O Interface name too long (max 255): " + name); + throw new RuntimeScribException("I/O Interface name too long (max 255): " + name); } } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java index 1e15d1536..6646141b3 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java @@ -22,10 +22,10 @@ import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.GProtocolName; +import org.scribble.util.ScribException; public class ReceiveIfaceGen extends IOStateIfaceGen { @@ -35,7 +35,7 @@ public ReceiveIfaceGen(StateChannelApiGenerator apigen, Map !a.isReceive())) // TODO (connect/disconnect) { @@ -46,7 +46,7 @@ public InterfaceBuilder generateType() throws ScribbleException } @Override - protected void constructInterface() throws ScribbleException + protected void constructInterface() throws ScribException { super.constructInterface(); addAsyncDiscardMethod(); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java index c7639740a..43803da69 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java @@ -17,9 +17,9 @@ import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.util.InterfaceBuilder; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.util.ScribException; public class SelectIfaceGen extends IOStateIfaceGen { @@ -29,7 +29,7 @@ public SelectIfaceGen(StateChannelApiGenerator apigen, Map !a.isSend())) // TODO (connect/disconnect) { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/util/ConstructorBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/util/ConstructorBuilder.java index 89837b984..19f5bc382 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/util/ConstructorBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/util/ConstructorBuilder.java @@ -13,7 +13,7 @@ */ package org.scribble.codegen.java.util; -import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.util.RuntimeScribException; public class ConstructorBuilder extends MethodBuilder { @@ -25,12 +25,12 @@ protected ConstructorBuilder(String name) @Override public void setName(String name) { - throw new RuntimeScribbleException("Invalid for constructor"); + throw new RuntimeScribException("Invalid for constructor"); } @Override public void setReturn(String ret) { - throw new RuntimeScribbleException("Invalid for constructor"); + throw new RuntimeScribException("Invalid for constructor"); } } \ No newline at end of file diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/util/EnumBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/util/EnumBuilder.java index 140196330..600237d1d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/util/EnumBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/util/EnumBuilder.java @@ -18,7 +18,7 @@ import java.util.List; import java.util.stream.Collectors; -import org.scribble.core.job.RuntimeScribbleException; +import org.scribble.util.RuntimeScribException; public class EnumBuilder extends TypeBuilder { @@ -72,48 +72,48 @@ protected String buildSignature(String enun) @Override public void setPackage(String packname) { - throw new RuntimeScribbleException("Invalid for enums"); + throw new RuntimeScribException("Invalid for enums"); } @Override public void addImports(String... imports) { - throw new RuntimeScribbleException("Invalid for enums"); + throw new RuntimeScribException("Invalid for enums"); } @Override public FieldBuilder newField(String name) { - throw new RuntimeScribbleException("Invalid for enums"); + throw new RuntimeScribException("Invalid for enums"); } @Override public AbstractMethodBuilder newAbstractMethod() { - throw new RuntimeScribbleException("Invalid for enums"); + throw new RuntimeScribException("Invalid for enums"); } @Override public ClassBuilder newTopLevelClass() { - throw new RuntimeScribbleException("Invalid for enums"); + throw new RuntimeScribException("Invalid for enums"); } @Override protected String buildFields(String clazz) { - throw new RuntimeScribbleException("Invalid for enums"); + throw new RuntimeScribException("Invalid for enums"); } @Override protected String buildMethods(String clazz) { - throw new RuntimeScribbleException("Invalid for enums"); + throw new RuntimeScribException("Invalid for enums"); } @Override protected String buildMemberTypes(String clazz) { - throw new RuntimeScribbleException("Invalid for enums"); + throw new RuntimeScribException("Invalid for enums"); } } diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index 102570ceb..e864c436f 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -44,6 +44,7 @@ import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.global.Projector2; +import org.scribble.util.ScribException; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models public class Job @@ -76,7 +77,7 @@ public EGraphBuilderUtil newEGraphBuilderUtil() //public SGraphBuilderUtil newSGraphBuilderUtil() // FIXME TODO global builder util public SGraph buildSGraph(GProtocolName fullname, Map egraphs, - boolean explicit) throws ScribbleException + boolean explicit) throws ScribException { debugPrintln("(" + fullname + ") Building global model using:"); for (Role r : egraphs.keySet()) @@ -89,14 +90,14 @@ public SGraph buildSGraph(GProtocolName fullname, Map egraphs, return this.sgbu.buildSGraph(this, fullname, egraphs, explicit); // FIXME: factor out util } - public void checkWellFormedness() throws ScribbleException + public void checkWellFormedness() throws ScribException { runContextBuildingPasses(); //runUnfoldingPass(); runWellFormednessPasses(); } - public void runContextBuildingPasses() throws ScribbleException + public void runContextBuildingPasses() throws ScribException { /*// FIXME TODO: refactor into a runVisitorPassOnAllModules for SimpleVisitor (and add operation to ModuleDel) Set fullmodnames = this.context.getFullModuleNames(); @@ -162,7 +163,7 @@ else if (n instanceof MessageSigName) } } - public void runWellFormednessPasses() throws ScribbleException + public void runWellFormednessPasses() throws ScribException { /*if (!this.config.noValidation) { @@ -185,7 +186,7 @@ public void runWellFormednessPasses() throws ScribbleException .stream().filter(x -> !used.contains(x)).collect(Collectors.toSet()); if (!unused.isEmpty()) { - throw new ScribbleException( + throw new ScribException( "Unused roles in " + inlined.fullname + ": " + unused); } @@ -250,7 +251,7 @@ public void runWellFormednessPasses() throws ScribbleException // Due to Projector not being a subprotocol visitor, so "external" subprotocols may not be visible in ModuleContext building for the projections of the current root Module // SubprotocolVisitor it doesn't visit the target Module/ProtocolDecls -- that's why the old Projector maintained its own dependencies and created the projection modules after leaving a Do separately from SubprotocolVisiting // So Projection should not be an "inlining" SubprotocolVisitor, it would need to be more a "DependencyVisitor" - protected void runProjectionPasses() throws ScribbleException + protected void runProjectionPasses() throws ScribException { /*runVisitorPassOnAllModules(Projector.class); runProjectionContextBuildingPasses(); @@ -286,7 +287,7 @@ protected void runProjectionPasses() throws ScribbleException // Pre: checkWellFormedness // Returns: fullname -> Module public Map getProjections(GProtocolName fullname, - Role role) throws ScribbleException + Role role) throws ScribException { //Module root = LProtocol proj = diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java index 745fda912..dd8e8a9ac 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java @@ -32,7 +32,8 @@ import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.Role; import org.scribble.core.visit.global.Projector2; -import org.scribble.util.ScribUtil2; +import org.scribble.util.ScribUtil; +import org.scribble.util.ScribException; // Global "static" context information for a Job -- single instance per Job, should not be shared between Jobs // Mutable: projections, graphs, etc are added mutably later -- replaceModule also mutable setter -- "users" get this from the Job and expect to setter mutate "in place" @@ -224,7 +225,7 @@ public void addProjection(LProtocol p) public //Module LProtocol getProjection(GProtocolName fullname, Role role) - throws ScribbleException + throws ScribException { return getProjection(Projector2.projectFullProtocolName(fullname, role)); } @@ -252,7 +253,7 @@ protected void addEGraph(LProtocolName fullname, EGraph graph) // N.B. graphs built from inlined (not unfolded) public EGraph getEGraph(GProtocolName fullname, Role role) - throws ScribbleException + throws ScribException { LProtocolName fulllpn = Projector2.projectFullProtocolName(fullname, role); // Moved form LProtocolDecl @@ -274,7 +275,7 @@ protected void addUnfairEGraph(LProtocolName fullname, EGraph graph) this.unfairEGraphs.put(fullname, graph); } - public EGraph getUnfairEGraph(GProtocolName fullname, Role role) throws ScribbleException + public EGraph getUnfairEGraph(GProtocolName fullname, Role role) throws ScribException { LProtocolName fulllpn = Projector2.projectFullProtocolName(fullname, role); @@ -292,7 +293,7 @@ protected void addSGraph(GProtocolName fullname, SGraph graph) this.fairSGraphs.put(fullname, graph); } - public SGraph getSGraph(GProtocolName fullname) throws ScribbleException + public SGraph getSGraph(GProtocolName fullname) throws ScribException { SGraph graph = this.fairSGraphs.get(fullname); if (graph == null) @@ -313,7 +314,7 @@ public SGraph getSGraph(GProtocolName fullname) throws ScribbleException private Map getEGraphsForSGraphBuilding(GProtocolName fullname, //GProtocolDecl gpd, - boolean fair) throws ScribbleException + boolean fair) throws ScribException { Map egraphs = new HashMap<>(); //for (Role self : gpd.getHeaderChild().getRoleDeclListChild().getRoles()) @@ -331,7 +332,7 @@ protected void addUnfairSGraph(GProtocolName fullname, SGraph graph) this.unfairSGraphs.put(fullname, graph); } - public SGraph getUnfairSGraph(GProtocolName fullname) throws ScribbleException + public SGraph getUnfairSGraph(GProtocolName fullname) throws ScribException { SGraph graph = this.unfairSGraphs.get(fullname); if (graph == null) @@ -355,7 +356,7 @@ protected void addMinimisedEGraph(LProtocolName fullname, EGraph graph) } public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) - throws ScribbleException + throws ScribException { LProtocolName fulllpn = Projector2.projectFullProtocolName(fullname, role); @@ -373,7 +374,7 @@ public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) // Duplicated from CommandLine.runDot // Minimises the FSM up to bisimulation // N.B. ltsconvert will typically re-number the states - private static String runAut(String fsm, String aut) throws ScribbleException + private static String runAut(String fsm, String aut) throws ScribException { String tmpName = aut + ".tmp"; File tmp = new File(tmpName); @@ -383,8 +384,8 @@ private static String runAut(String fsm, String aut) throws ScribbleException } try { - ScribUtil2.writeToFile(tmpName, fsm); - String[] res = ScribUtil2.runProcess("ltsconvert", "-ebisim", "-iaut", + ScribUtil.writeToFile(tmpName, fsm); + String[] res = ScribUtil.runProcess("ltsconvert", "-ebisim", "-iaut", "-oaut", tmpName); if (!res[1].isEmpty()) { diff --git a/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java b/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java index b73e4e810..5a82b8d25 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java @@ -15,7 +15,6 @@ import java.util.Map; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Kind; import org.scribble.core.type.kind.ProtocolKind; @@ -27,6 +26,7 @@ import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.Name; import org.scribble.core.type.name.ProtocolName; +import org.scribble.util.ScribException; // Context information specific to each module as a root (wrt. to visitor passes) // CHECKME: move to main package? @@ -46,7 +46,7 @@ public class ModuleContext // Made by ModuleContextBuilder // ModuleContext is the root context - public ModuleContext(ModuleName root, ScribNames deps, ScribNames visible) throws ScribbleException + public ModuleContext(ModuleName root, ScribNames deps, ScribNames visible) throws ScribException { this.root = root; this.deps = deps; diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index d9cd2eae3..077311bed 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -27,7 +27,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.job.Job; import org.scribble.core.job.JobContext; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.Protocol; import org.scribble.core.lang.ProtocolMod; import org.scribble.core.lang.SubprotoSig; @@ -51,7 +50,8 @@ import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.global.Projector2; -import org.scribble.util.ScribUtil2; +import org.scribble.util.ScribUtil; +import org.scribble.util.ScribException; public class GProtocol extends Protocol implements GNode // Mainly for GDel.translate return (to include GProtocol) @@ -100,13 +100,13 @@ public GProtocol unfoldAllOnce(STypeUnfolder u) } // Following are some top-level entry to GType methods - public Set checkRoleEnabling() throws ScribbleException + public Set checkRoleEnabling() throws ScribException { Set tmp = this.roles.stream().collect(Collectors.toSet()); return this.def.checkRoleEnabling(tmp); } - public Map checkExtChoiceConsistency() throws ScribbleException + public Map checkExtChoiceConsistency() throws ScribException { Map tmp = this.roles.stream() .collect(Collectors.toMap(x -> x, x -> x)); @@ -182,7 +182,7 @@ public boolean canEquals(Object o) // TODO FIXME: refactor following methods (e.g., make non-static?) public static void validateByScribble(Job job2, GProtocolName fullname, - boolean fair) throws ScribbleException + boolean fair) throws ScribException { JobContext jc = job2.getContext(); SGraph graph = (fair) @@ -193,7 +193,7 @@ public static void validateByScribble(Job job2, GProtocolName fullname, } public static void validateBySpin(Job job2, GProtocolName fullname) - throws ScribbleException + throws ScribException { JobContext jobc2 = job2.getContext(); /*Module mod = jc.getModule(fullname.getPrefix()); @@ -319,7 +319,7 @@ public static void validateBySpin(Job job2, GProtocolName fullname) } if (!GProtocol.runSpin(fullname.toString(), pml + "\n\n" + ltl)) { - throw new ScribbleException("Protocol not valid:\n" + gpd); + throw new ScribException("Protocol not valid:\n" + gpd); } i += batchSize; } @@ -335,8 +335,8 @@ public static boolean runSpin(String prefix, String pml) //throws ScribbleExcept try { String tmpName = tmp.getAbsolutePath(); - ScribUtil2.writeToFile(tmpName, pml); - String[] res = ScribUtil2.runProcess("spin", "-a", tmpName); + ScribUtil.writeToFile(tmpName, pml); + String[] res = ScribUtil.runProcess("spin", "-a", tmpName); res[0] = res[0].replaceAll("(?m)^ltl.*$", ""); res[1] = res[1].replace( "'gcc-4' is not recognized as an internal or external command,\noperable program or batch file.", @@ -362,14 +362,14 @@ public static boolean runSpin(String prefix, String pml) //throws ScribbleExcept i++; } int dnfair = (procs <= 6) ? 2 : 3; // FIXME - res = ScribUtil2.runProcess("gcc", "-o", "pan", "pan.c", "-DNFAIR=" + dnfair); + res = ScribUtil.runProcess("gcc", "-o", "pan", "pan.c", "-DNFAIR=" + dnfair); res[0] = res[0].trim(); res[1] = res[1].trim(); if (!res[0].isEmpty() || !res[1].isEmpty()) { throw new RuntimeException("[-spin] [gcc]: " + res[0] + "\n" + res[1]); } - res = ScribUtil2.runProcess("pan", "-a", "-f"); + res = ScribUtil.runProcess("pan", "-a", "-f"); res[1] = res[1].replace("warning: no accept labels are defined, so option -a has no effect (ignored)", ""); res[0] = res[0].trim(); res[1] = res[1].trim(); @@ -385,7 +385,7 @@ public static boolean runSpin(String prefix, String pml) //throws ScribbleExcept } return valid; } - catch (ScribbleException e) + catch (ScribException e) { throw new RuntimeException(e); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 3eb3167b9..db216f6d7 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -20,7 +20,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.job.Job; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.Protocol; import org.scribble.core.lang.ProtocolMod; import org.scribble.core.lang.SubprotoSig; @@ -40,6 +39,7 @@ import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.local.ReachabilityEnv; import org.scribble.util.Constants; +import org.scribble.util.ScribException; public class LProtocol extends Protocol implements LNode @@ -105,7 +105,7 @@ public EGraph toEGraph(Job job) } public ReachabilityEnv checkReachability() - throws ScribbleException + throws ScribException { return this.def .checkReachability(new ReachabilityEnv(false, Collections.emptySet())); diff --git a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java index 3039e341d..3339edee7 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java @@ -13,8 +13,8 @@ */ package org.scribble.core.model; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.util.ScribException; // Helper class for EndpointGraphBuilder -- can access the protected setters of S // N.B. must call init before every "new visit", including first @@ -60,7 +60,7 @@ protected final void addEdgeAux(S s, A a, S succ) s.addEdge(a, succ); } - protected void removeEdgeAux(S s, A a, S succ) throws ScribbleException // Exception necessary? + protected void removeEdgeAux(S s, A a, S succ) throws ScribException // Exception necessary? { s.removeEdge(a, succ); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/MState.java b/scribble-core/src/main/java/org/scribble/core/model/MState.java index 731dc6251..cb77022b7 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MState.java @@ -25,9 +25,9 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.scribble.core.job.RuntimeScribbleException; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.util.RuntimeScribException; +import org.scribble.util.ScribException; public abstract class MState< L, // Node label type (cosmetic) @@ -85,7 +85,7 @@ protected void addEdge(A a, S s) this.succs.add(s); } - protected final void removeEdge(A a, S s) throws ScribbleException + protected final void removeEdge(A a, S s) throws ScribException { Iterator ia = this.actions.iterator(); Iterator is = this.succs.iterator(); @@ -101,7 +101,7 @@ protected final void removeEdge(A a, S s) throws ScribbleException } } //throw new RuntimeException("No such transition to remove: " + a + "->" + s); - throw new ScribbleException( + throw new ScribException( "No such transition to remove: " + a + "->" + s); // Hack? EFSM building on bad-reachability protocols now done before actual reachability check } @@ -112,7 +112,7 @@ public final List getActions() Set as = new HashSet<>(this.actions); if (as.size() != this.actions.size()) { - throw new RuntimeScribbleException("[TODO] Non-deterministic state: " + throw new RuntimeScribException("[TODO] Non-deterministic state: " + this.actions + " (Try -minlts if available)"); // This getter checks for determinism -- affects e.g. API generation } @@ -145,7 +145,7 @@ public final List getSuccessors() Set as = new HashSet<>(this.actions); if (as.size() != this.actions.size()) { - throw new RuntimeScribbleException("[TODO] Non-deterministic state: " + throw new RuntimeScribException("[TODO] Non-deterministic state: " + this.actions + " (Try -minlts if available)"); // This getter checks for determinism -- affects e.g. API generation } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index 3d7465423..a82360674 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -24,11 +24,11 @@ import java.util.Map; import java.util.Set; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.GraphBuilderUtil; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; +import org.scribble.util.ScribException; // Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) // Tailored to support graph building from syntactic local protocol choice and recursion @@ -320,7 +320,7 @@ public void addRecursionEdge(EState s, EAction a, EState succ) // Cf. LGraphBui // succ assumed to be this.getEntry() public void removeEdgeFromPredecessor(EState s, EAction a) - throws ScribbleException + throws ScribException // Removing prev edge, to be replaced by addRecursionEdge { //s.removeEdge(a, this.getEntry()); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java index 6a7161a8e..299d133b8 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java @@ -26,11 +26,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.GraphBuilderUtil; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; +import org.scribble.util.ScribException; // FIXME TODO replace EGraphBuilderUtil // Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) @@ -365,7 +365,7 @@ public void addRecursionEdge(EState s, EAction a, RecVar rv) // succ assumed to be this.getEntry() public void removeEdgeFromPredecessor(EState s, EAction a) - throws ScribbleException + throws ScribException // Removing prev edge, to be replaced by addRecursionEdge { //s.removeEdge(a, this.getEntry()); @@ -389,7 +389,7 @@ public void removeEdgeFromPredecessor(EState s, EAction a) // CHECKME handle preds/prevs like above (cf. this.addEdge) public void removeEdge(EState s, EAction a, EState succ) - throws ScribbleException + throws ScribException { removeEdgeAux(s, a, succ); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index 75eac3165..ff904426d 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -24,13 +24,13 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.MPrettyState; import org.scribble.core.model.MState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; +import org.scribble.util.ScribException; // Label types used to be both RecVar and SubprotocolSigs; now using inlined protocol for FSM building so just RecVar public class EState extends MPrettyState @@ -228,7 +228,7 @@ public EState unfairTransform(EModelFactory ef) curr.removeEdge(tmp, s); } } - catch (ScribbleException e) { throw new RuntimeException(e); } + catch (ScribException e) { throw new RuntimeException(e); } } //for (Entry e : clones.entrySet()) Iterator icloneas = cloneas.iterator(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index 4bf944942..55fa732a2 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -22,7 +22,6 @@ import java.util.stream.Collectors; import org.scribble.core.job.Job; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.GraphBuilderUtil; import org.scribble.core.model.endpoint.EFSM; import org.scribble.core.model.endpoint.EGraph; @@ -33,6 +32,7 @@ import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.Role; +import org.scribble.util.ScribException; public class SGraphBuilderUtil extends GraphBuilderUtil { @@ -66,7 +66,7 @@ protected SConfig createInitialSConfig(EModelFactory ef, Map egrap // Also checks for non-deterministic payloads // Maybe refactor into an SGraph builder util; cf., EGraphBuilderUtil -- but not Visitor-based building (cf. EndpointGraphBuilder), this isn't an AST algorithm //public SGraph buildSGraph(Job job, GProtocolName fullname, SConfig c0) throws ScribbleException - public SGraph buildSGraph(Job job, GProtocolName fullname, Map egraphs, boolean explicit) throws ScribbleException + public SGraph buildSGraph(Job job, GProtocolName fullname, Map egraphs, boolean explicit) throws ScribException { /*Map efsms = egraphs.entrySet().stream().collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().toFsm())); @@ -118,7 +118,7 @@ public SGraph buildSGraph(Job job, GProtocolName fullname, Map egr if (fireable_r.stream().anyMatch((x) -> !a.equals(x) && a.peer.equals(x.peer) && a.mid.equals(x.mid) && !a.payload.equals(x.payload))) { - throw new ScribbleException("Bad non-deterministic action payloads: " + fireable_r); + throw new ScribException("Bad non-deterministic action payloads: " + fireable_r); } } } @@ -129,7 +129,7 @@ else if (k == EStateKind.UNARY_INPUT || k == EStateKind.POLY_INPUT || k == EStat if (currfsm.getAllFireable().stream().anyMatch((x) -> !a.equals(x) && a.peer.equals(x.peer) && a.mid.equals(x.mid) && !a.payload.equals(x.payload))) { - throw new ScribbleException("Bad non-deterministic action payloads: " + currfsm.getAllFireable()); + throw new ScribException("Bad non-deterministic action payloads: " + currfsm.getAllFireable()); } } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index 10c97ebdd..c87dba2c6 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -22,11 +22,11 @@ import java.util.stream.Collectors; import org.scribble.core.job.Job; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EFSM; import org.scribble.core.model.endpoint.actions.ESend; import org.scribble.core.model.global.actions.SAction; import org.scribble.core.type.name.Role; +import org.scribble.util.ScribException; public class SModel { @@ -37,7 +37,7 @@ protected SModel(SGraph graph) this.graph = graph; } - public void validate(Job job) throws ScribbleException + public void validate(Job job) throws ScribException { SState init = this.graph.init; Map states = this.graph.states; @@ -92,7 +92,7 @@ public void validate(Job job) throws ScribbleException if (!errorMsg.equals("")) { //throw new ScribbleException("\n" + init.toDot() + errorMsg); - throw new ScribbleException(errorMsg); + throw new ScribException(errorMsg); } //job.debugPrintln("(" + this.graph.proto + ") Progress satisfied."); // Also safety... current errorMsg approach } @@ -150,7 +150,7 @@ protected String termSetToString(Job job, Set termset, // ** Could subsume terminal state check, if terminal sets included size 1 with reflexive reachability (but not a good approach) protected static Set checkRoleProgress(Map states, - SState init, Set termset) throws ScribbleException + SState init, Set termset) throws ScribException { Set starved = new HashSet<>(); Iterator i = termset.iterator(); @@ -214,7 +214,7 @@ protected static Set checkRoleProgress(Map states, // (eventual reception) protected static Map> checkEventualReception( Map states, SState init, Set termset) - throws ScribbleException + throws ScribException { Set roles = states.get(termset.iterator().next()).config.efsms .keySet(); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java index e00c85d0c..0ae97779a 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java @@ -25,7 +25,6 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; @@ -34,6 +33,7 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.global.Projector2; +import org.scribble.util.ScribException; public class GChoice extends Choice implements GType { @@ -79,11 +79,11 @@ public LType project(Projector2 v) } @Override - public Set checkRoleEnabling(Set enabled) throws ScribbleException + public Set checkRoleEnabling(Set enabled) throws ScribException { if (!enabled.contains(this.subj)) { - throw new ScribbleException("Subject not enabled: " + this.subj); + throw new ScribException("Subject not enabled: " + this.subj); } Set subj = Stream.of(this.subj).collect(Collectors.toSet()); List> blocks = new LinkedList<>(); @@ -101,7 +101,7 @@ public Set checkRoleEnabling(Set enabled) throws ScribbleException @Override public Map checkExtChoiceConsistency(Map enablers) - throws ScribbleException + throws ScribException { Map subj = Stream.of(this.subj) .collect(Collectors.toMap(x -> x, x -> x)); @@ -120,7 +120,7 @@ public Map checkExtChoiceConsistency(Map enablers) if (all.stream().anyMatch( x -> x.getKey().equals(enabled) && !x.getValue().equals(enabler))) { - throw new ScribbleException( + throw new ScribException( "Inconsistent external choice subjects for " + enabled + ": " + all.stream().filter(x -> x.getKey().equals(enabled)) .collect(Collectors.toList())); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java index 39184bf3e..333ad7832 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java @@ -20,7 +20,6 @@ import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.ConnectAction; @@ -30,6 +29,7 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.global.Projector2; +import org.scribble.util.ScribException; public class GConnect extends ConnectAction implements GType @@ -77,11 +77,11 @@ public LType project(Projector2 v) } @Override - public Set checkRoleEnabling(Set enabled) throws ScribbleException + public Set checkRoleEnabling(Set enabled) throws ScribException { if (!enabled.contains(this.src)) { - throw new ScribbleException("Source role not enabled: " + this.src); + throw new ScribException("Source role not enabled: " + this.src); } if (enabled.contains(this.dst)) { @@ -94,7 +94,7 @@ public Set checkRoleEnabling(Set enabled) throws ScribbleException @Override public Map checkExtChoiceConsistency(Map enablers) - throws ScribbleException + throws ScribException { if (enablers.containsKey(this.dst)) { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java index 2f2cced4c..0f6da3c5d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java @@ -17,7 +17,6 @@ import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; @@ -25,6 +24,7 @@ import org.scribble.core.type.session.local.LContinue; import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.global.Projector2; +import org.scribble.util.ScribException; public class GContinue extends Continue implements GType { @@ -63,14 +63,14 @@ public LContinue project(Projector2 v) } @Override - public Set checkRoleEnabling(Set enabled) throws ScribbleException + public Set checkRoleEnabling(Set enabled) throws ScribException { return enabled; } @Override public Map checkExtChoiceConsistency(Map enablers) - throws ScribbleException + throws ScribException { return enablers; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java index f1f8c34fc..d7939bfc6 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java @@ -17,7 +17,6 @@ import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.DisconnectAction; @@ -25,6 +24,7 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.global.Projector2; +import org.scribble.util.ScribException; public class GDisconnect extends DisconnectAction implements GType @@ -71,22 +71,22 @@ public LType project(Projector2 v) } @Override - public Set checkRoleEnabling(Set enabled) throws ScribbleException + public Set checkRoleEnabling(Set enabled) throws ScribException { if (!enabled.contains(this.left)) { - throw new ScribbleException("Role not enabled: " + this.left); + throw new ScribException("Role not enabled: " + this.left); } if (!enabled.contains(this.right)) { - throw new ScribbleException("Role not enabled: " + this.right); + throw new ScribException("Role not enabled: " + this.right); } return enabled; } @Override public Map checkExtChoiceConsistency(Map enablers) - throws ScribbleException + throws ScribException { return enablers; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java index 58cd26830..5a49ab238 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java @@ -21,7 +21,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.job.JobContext; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.kind.Global; @@ -38,6 +37,7 @@ import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.global.Projector2; +import org.scribble.util.ScribException; public class GDo extends Do implements GType { @@ -115,14 +115,14 @@ public LType project(Projector2 v) } @Override - public Set checkRoleEnabling(Set enabled) throws ScribbleException + public Set checkRoleEnabling(Set enabled) throws ScribException { throw new RuntimeException("Unsupported for Do: " + this); } @Override public Map checkExtChoiceConsistency(Map enablers) - throws ScribbleException + throws ScribException { throw new RuntimeException("Unsupported for Do: " + this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java index daff85386..54feb7116 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java @@ -20,7 +20,6 @@ import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; @@ -30,6 +29,7 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.global.Projector2; +import org.scribble.util.ScribException; public class GMessageTransfer extends MessageTransfer implements GType @@ -77,11 +77,11 @@ public LType project(Projector2 v) } @Override - public Set checkRoleEnabling(Set enabled) throws ScribbleException + public Set checkRoleEnabling(Set enabled) throws ScribException { if (!enabled.contains(this.src)) { - throw new ScribbleException("Source role not enabled: " + this.src); + throw new ScribException("Source role not enabled: " + this.src); } if (enabled.contains(this.dst)) { @@ -94,7 +94,7 @@ public Set checkRoleEnabling(Set enabled) throws ScribbleException @Override public Map checkExtChoiceConsistency(Map enablers) - throws ScribbleException + throws ScribException { if (enablers.containsKey(this.dst)) { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java index 48dadacc1..96b712d48 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java @@ -18,7 +18,6 @@ import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; @@ -28,6 +27,7 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.global.Projector2; +import org.scribble.util.ScribException; public class GRecursion extends Recursion implements GType { @@ -82,14 +82,14 @@ public LType project(Projector2 v) } @Override - public Set checkRoleEnabling(Set enabled) throws ScribbleException + public Set checkRoleEnabling(Set enabled) throws ScribException { return this.body.checkRoleEnabling(enabled); } @Override public Map checkExtChoiceConsistency(Map enablers) - throws ScribbleException + throws ScribException { return this.body.checkExtChoiceConsistency(enablers); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java index 7ed3df718..5f6515079 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java @@ -20,7 +20,6 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.SType; @@ -29,6 +28,7 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.global.Projector2; +import org.scribble.util.ScribException; public class GSeq extends Seq implements GType { @@ -70,7 +70,7 @@ public LSeq project(Projector2 v) } @Override - public Set checkRoleEnabling(Set enabled) throws ScribbleException + public Set checkRoleEnabling(Set enabled) throws ScribException { for (GType elem : getElements()) { @@ -81,7 +81,7 @@ public Set checkRoleEnabling(Set enabled) throws ScribbleException @Override public Map checkExtChoiceConsistency(Map enablers) - throws ScribbleException + throws ScribException { for (GType elem : getElements()) { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java index a8d3effea..d526f53eb 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java @@ -16,13 +16,13 @@ import java.util.Map; import java.util.Set; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.global.GNode; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.global.Projector2; +import org.scribble.util.ScribException; public interface GType extends SType, GNode { @@ -33,14 +33,14 @@ public interface GType extends SType, GNode // enabled treated immutably // Returns enabled post visiting // Cf. SType visitors, here we only throw ScribbleException or return nothing, so can use return this way - Set checkRoleEnabling(Set enabled) throws ScribbleException; + Set checkRoleEnabling(Set enabled) throws ScribException; // Pre: use on inlined or later (unsupported for Do, also Protocol) // Pre: checkRoleEnabling // enablers: enabled -> enabler -- treated immutably // Returns enablers post visiting Map checkExtChoiceConsistency(Map enablers) - throws ScribbleException; + throws ScribException; // Pre: conns is reflexive // Also does correlation warnings diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java index 19c246561..77e2d9da6 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java @@ -16,7 +16,6 @@ import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.MessageId; @@ -27,6 +26,7 @@ import org.scribble.core.type.session.MessageSig; import org.scribble.core.type.session.Payload; import org.scribble.core.visit.local.ReachabilityEnv; +import org.scribble.util.ScribException; public class LAcc extends ConnectAction implements LType { @@ -66,7 +66,7 @@ public void buildGraph(EGraphBuilderUtil2 b) @Override public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribbleException + throws ScribException { return env; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java index 4c693a022..24a6f435b 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java @@ -20,7 +20,6 @@ import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; @@ -29,6 +28,7 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; import org.scribble.core.visit.local.ReachabilityEnv; +import org.scribble.util.ScribException; public class LChoice extends Choice implements LType { @@ -126,7 +126,7 @@ else if (first instanceof LContinue) @Override public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribbleException + throws ScribException { List blocks = new LinkedList<>(); for (LSeq block : this.blocks) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java index ff8484f93..0819c5d69 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java @@ -18,7 +18,6 @@ import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; @@ -27,6 +26,7 @@ import org.scribble.core.type.session.Continue; import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.local.ReachabilityEnv; +import org.scribble.util.ScribException; public class LContinue extends Continue implements LType { @@ -79,7 +79,7 @@ public void buildGraph(EGraphBuilderUtil2 b) //b.addEdge(pred, a, entry); //b.addRecursionEdge(pred, prev, b.getRecursionEntry(this.recvar)); b.addRecursionEdge(pred, a, this.recvar); } - catch (ScribbleException e) // CHECKME: necessary for removeEdge to have throws? + catch (ScribException e) // CHECKME: necessary for removeEdge to have throws? { throw new RuntimeException(e); } @@ -91,7 +91,7 @@ public void buildGraph(EGraphBuilderUtil2 b) @Override public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribbleException + throws ScribException { Set tmp = new HashSet<>(env.recvars); tmp.add(this.recvar); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java index 6886b33fc..031700cee 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java @@ -16,13 +16,13 @@ import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.DisconnectAction; import org.scribble.core.visit.local.ReachabilityEnv; +import org.scribble.util.ScribException; public class LDisconnect extends DisconnectAction implements LType @@ -64,7 +64,7 @@ public void buildGraph(EGraphBuilderUtil2 b) @Override public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribbleException + throws ScribException { return env; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java index ff355c274..cddefdb07 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java @@ -17,7 +17,6 @@ import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; @@ -31,6 +30,7 @@ import org.scribble.core.type.session.Do; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.local.ReachabilityEnv; +import org.scribble.util.ScribException; public class LDo extends Do implements LType { @@ -61,7 +61,7 @@ public void buildGraph(EGraphBuilderUtil2 b) @Override public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribbleException + throws ScribException { throw new RuntimeException("Unsupported for LDo: " + this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java index 0f0a29c23..e970de2e3 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java @@ -16,7 +16,6 @@ import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.MessageId; @@ -27,6 +26,7 @@ import org.scribble.core.type.session.MessageTransfer; import org.scribble.core.type.session.Payload; import org.scribble.core.visit.local.ReachabilityEnv; +import org.scribble.util.ScribException; public class LRcv extends MessageTransfer implements LType @@ -67,7 +67,7 @@ public void buildGraph(EGraphBuilderUtil2 b) @Override public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribbleException + throws ScribException { return env; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java index 61f51d6c0..5bc8f2337 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java @@ -17,12 +17,12 @@ import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Recursion; import org.scribble.core.visit.local.ReachabilityEnv; +import org.scribble.util.ScribException; public class LRecursion extends Recursion implements LType { @@ -59,7 +59,7 @@ public void buildGraph(EGraphBuilderUtil2 b) @Override public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribbleException + throws ScribException { env = this.body.checkReachability(env); if (env.recvars.contains(this.recvar)) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java index f14e6f42b..56b0c64e8 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java @@ -16,7 +16,6 @@ import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.MessageId; @@ -27,6 +26,7 @@ import org.scribble.core.type.session.MessageSig; import org.scribble.core.type.session.Payload; import org.scribble.core.visit.local.ReachabilityEnv; +import org.scribble.util.ScribException; public class LReq extends ConnectAction implements LType @@ -68,7 +68,7 @@ public void buildGraph(EGraphBuilderUtil2 b) @Override public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribbleException + throws ScribException { return env; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java index 80a06804e..cfa72fa6e 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java @@ -16,7 +16,6 @@ import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.MessageId; @@ -27,6 +26,7 @@ import org.scribble.core.type.session.MessageTransfer; import org.scribble.core.type.session.Payload; import org.scribble.core.visit.local.ReachabilityEnv; +import org.scribble.util.ScribException; public class LSend extends MessageTransfer implements LType @@ -68,7 +68,7 @@ public void buildGraph(EGraphBuilderUtil2 b) @Override public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribbleException + throws ScribException { return env; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java index e85e56ee1..076da588c 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java @@ -20,7 +20,6 @@ import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.model.endpoint.EState; import org.scribble.core.type.kind.Local; @@ -28,6 +27,7 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; import org.scribble.core.visit.local.ReachabilityEnv; +import org.scribble.util.ScribException; public class LSeq extends Seq implements LType { @@ -83,7 +83,7 @@ public void buildGraph(EGraphBuilderUtil2 b) @Override public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribbleException + throws ScribException { LType prev = null; LType next = null; @@ -93,7 +93,7 @@ public ReachabilityEnv checkReachability(ReachabilityEnv env) next = i.next(); if (!env.isSeqable()) { - throw new ScribbleException( + throw new ScribException( "Illegal sequence: " + (prev == null ? "" : prev + "\n") + next); } env = next.checkReachability(env); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java index 8f933006e..c4127ff91 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java @@ -16,7 +16,6 @@ import java.util.List; import java.util.Set; -import org.scribble.core.job.ScribbleException; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.MemberName; @@ -29,6 +28,7 @@ import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.local.ReachabilityEnv; +import org.scribble.util.ScribException; // Used only *during* projection -- filtered out by GSeq::projection public class LSkip extends STypeBase implements LType @@ -108,7 +108,7 @@ public void buildGraph(EGraphBuilderUtil2 b) @Override public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribbleException + throws ScribException { throw new RuntimeException("Unsupported for: " + this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java index 9c583c69b..944157e56 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java @@ -15,13 +15,13 @@ import java.util.Set; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.local.LNode; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.SType; import org.scribble.core.visit.local.ReachabilityEnv; +import org.scribble.util.ScribException; public interface LType extends SType, LNode { @@ -37,7 +37,7 @@ public interface LType extends SType, LNode // Return: (new) env post visiting // cf. GType "visitor" methods: same pattern, just env as a bespoke data type wrapper ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribbleException; + throws ScribException; /*@Override LType substitute(Substitutions subs);*/ // Otherwise causes return type inconsistency with base abstract classes diff --git a/scribble-core/src/main/java/org/scribble/core/job/AntlrSourceException.java b/scribble-core/src/main/java/org/scribble/util/AntlrSourceException.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/core/job/AntlrSourceException.java rename to scribble-core/src/main/java/org/scribble/util/AntlrSourceException.java index 3d854d29c..fb0d7a165 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/AntlrSourceException.java +++ b/scribble-core/src/main/java/org/scribble/util/AntlrSourceException.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.core.job; +package org.scribble.util; import java.util.stream.Collectors; import java.util.stream.IntStream; diff --git a/scribble-core/src/main/java/org/scribble/core/job/RuntimeScribbleException.java b/scribble-core/src/main/java/org/scribble/util/RuntimeScribException.java similarity index 73% rename from scribble-core/src/main/java/org/scribble/core/job/RuntimeScribbleException.java rename to scribble-core/src/main/java/org/scribble/util/RuntimeScribException.java index 9a5effb9d..988659d6f 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/RuntimeScribbleException.java +++ b/scribble-core/src/main/java/org/scribble/util/RuntimeScribException.java @@ -11,39 +11,39 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.core.job; +package org.scribble.util; -public class RuntimeScribbleException extends RuntimeException +public class RuntimeScribException extends RuntimeException { /** * */ private static final long serialVersionUID = 1L; - public RuntimeScribbleException() + public RuntimeScribException() { // TODO Auto-generated constructor stub } - public RuntimeScribbleException(String arg0) + public RuntimeScribException(String arg0) { super(arg0); // TODO Auto-generated constructor stub } - public RuntimeScribbleException(Throwable arg0) + public RuntimeScribException(Throwable arg0) { super(arg0); // TODO Auto-generated constructor stub } - public RuntimeScribbleException(String arg0, Throwable arg1) + public RuntimeScribException(String arg0, Throwable arg1) { super(arg0, arg1); // TODO Auto-generated constructor stub } - public RuntimeScribbleException(String arg0, Throwable arg1, boolean arg2, + public RuntimeScribException(String arg0, Throwable arg1, boolean arg2, boolean arg3) { super(arg0, arg1, arg2, arg3); diff --git a/scribble-core/src/main/java/org/scribble/core/job/ScribbleException.java b/scribble-core/src/main/java/org/scribble/util/ScribException.java similarity index 73% rename from scribble-core/src/main/java/org/scribble/core/job/ScribbleException.java rename to scribble-core/src/main/java/org/scribble/util/ScribException.java index 3dc4a5c72..59204a9dd 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/ScribbleException.java +++ b/scribble-core/src/main/java/org/scribble/util/ScribException.java @@ -11,46 +11,46 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.core.job; +package org.scribble.util; import org.antlr.runtime.tree.CommonTree; -public class ScribbleException extends AntlrSourceException +public class ScribException extends AntlrSourceException { /** * */ private static final long serialVersionUID = 1L; - public ScribbleException() + public ScribException() { // TODO Auto-generated constructor stub } - public ScribbleException(CommonTree blame, String arg0) + public ScribException(CommonTree blame, String arg0) { super(blame, arg0); } - public ScribbleException(String arg0) + public ScribException(String arg0) { super(arg0); // TODO Auto-generated constructor stub } - public ScribbleException(Throwable arg0) + public ScribException(Throwable arg0) { super(arg0); // TODO Auto-generated constructor stub } - public ScribbleException(String arg0, Throwable arg1) + public ScribException(String arg0, Throwable arg1) { super(arg0, arg1); // TODO Auto-generated constructor stub } - public ScribbleException(String arg0, Throwable arg1, boolean arg2, + public ScribException(String arg0, Throwable arg1, boolean arg2, boolean arg3) { super(arg0, arg1, arg2, arg3); diff --git a/scribble-core/src/main/java/org/scribble/util/ScribParserException.java b/scribble-core/src/main/java/org/scribble/util/ScribParserException.java index 8fe952614..662d23f5d 100644 --- a/scribble-core/src/main/java/org/scribble/util/ScribParserException.java +++ b/scribble-core/src/main/java/org/scribble/util/ScribParserException.java @@ -13,7 +13,7 @@ */ package org.scribble.util; -// FIXME: should be in parser module -- maybe make a ModuleLoadingException wrapper? +// CHECKME: should be in parser module? -- maybe make a ModuleLoadingException wrapper? public class ScribParserException extends Exception { /** diff --git a/scribble-core/src/main/java/org/scribble/util/ScribUtil2.java b/scribble-core/src/main/java/org/scribble/util/ScribUtil.java similarity index 84% rename from scribble-core/src/main/java/org/scribble/util/ScribUtil2.java rename to scribble-core/src/main/java/org/scribble/util/ScribUtil.java index 00da4e84c..94002fd7f 100644 --- a/scribble-core/src/main/java/org/scribble/util/ScribUtil2.java +++ b/scribble-core/src/main/java/org/scribble/util/ScribUtil.java @@ -21,10 +21,7 @@ import java.io.InputStreamReader; import java.util.concurrent.Callable; -import org.scribble.core.job.RuntimeScribbleException; -import org.scribble.core.job.ScribbleException; - -public class ScribUtil2 +public class ScribUtil { public static T handleLambdaScribbleException(Callable c) { @@ -34,13 +31,14 @@ public static T handleLambdaScribbleException(Callable c) } catch (Exception se) { - throw new RuntimeScribbleException(se); // Maybe this hack is not worth it? Better to throw directly as ScribbleException from a regular foreach + throw new RuntimeScribException(se); + // Maybe this hack is not worth it? Better to throw directly as ScribbleException from a regular foreach } } // Returns [ stdout, stderr ] public static String[] runProcess(String... cmdAndArgs) - throws ScribbleException + throws ScribException { try { @@ -66,13 +64,13 @@ public static String[] runProcess(String... cmdAndArgs) } catch (IOException | InterruptedException e) { - throw new ScribbleException(e); + throw new ScribException(e); } } // Warning: doesn't check if file exists public static void writeToFile(String path, String text) - throws ScribbleException + throws ScribException { File file = new File(path); File parent = file.getParentFile(); @@ -87,7 +85,7 @@ public static void writeToFile(String path, String text) } catch (IOException e) { - throw new ScribbleException(e); + throw new ScribException(e); } } } diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index 12e4f06d5..7fe30cc77 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -27,7 +27,6 @@ import org.scribble.ast.ImportDecl; import org.scribble.ast.ImportModule; import org.scribble.ast.Module; -import org.scribble.core.job.ScribbleException; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.model.endpoint.EModelFactory; import org.scribble.core.model.endpoint.EModelFactoryImpl; @@ -42,9 +41,9 @@ import org.scribble.main.resource.loader.ScribModuleLoader; import org.scribble.main.resource.locator.DirectoryResourceLocator; import org.scribble.main.resource.locator.ResourceLocator; -import org.scribble.parser.scribble.ScribbleAntlrWrapper; import org.scribble.util.Pair; import org.scribble.util.ScribParserException; +import org.scribble.util.ScribException; // Scribble tool context for main module // MainContext takes ResourceLocator abstractly (e.g. DirectoryResourceLocator), but because abstract Resource itself works off paths, it takes mainpath (rather than something more abstract, e.g. URI, to identify the "main" resource) @@ -56,7 +55,7 @@ public class Main // Only "manually" used here for loading main module (which should be factored out to front end) -- otherwise, only used within loader - protected final ScribbleAntlrWrapper antlrParser = newAntlrParser(); // Not encapsulated inside ScribbleParser, because ScribbleParser's main function is to "parse" ANTLR CommonTrees into ModelNodes + protected final ScribAntlrWrapper antlrParser = newAntlrParser(); // Not encapsulated inside ScribbleParser, because ScribbleParser's main function is to "parse" ANTLR CommonTrees into ModelNodes //protected final AntlrToScribParser scribParser = newScribParser(); protected final AstFactory af = newAstFactory(); @@ -82,7 +81,7 @@ private Main(boolean debug, ResourceLocator locator, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) - throws ScribParserException, ScribbleException + throws ScribParserException, ScribException { this.locator = locator; this.loader = new ScribModuleLoader(this.locator, this.antlrParser);//, this.scribParser); @@ -93,7 +92,7 @@ public Main(boolean debug, ResourceLocator locator, Path mainpath, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) - throws ScribParserException, ScribbleException + throws ScribParserException, ScribException { this(debug, locator, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, @@ -103,7 +102,7 @@ public Main(boolean debug, ResourceLocator locator, Path mainpath, //Pair p = this.loader.loadMainModule(mainpath); Resource res = DirectoryResourceLocator.getResourceByFullPath(mainpath); // TODO: hardcoded to DirectoryResourceLocator -- main module loading should be factored out to front end (e.g. CommandLine) - Module mod = this.antlrParser.parseAntlrTree(res); // Does del decoration + Module mod = this.antlrParser.parse(res); // Does del decoration // FIXME HERE: deprecate scribParser -- move ANTLR error checking out @@ -129,7 +128,7 @@ public Main(boolean debug, ResourceLocator locator, String inline, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) - throws ScribParserException, ScribbleException + throws ScribParserException, ScribException { this(debug, locator, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, @@ -138,7 +137,7 @@ public Main(boolean debug, ResourceLocator locator, String inline, Resource res = new InlineResource(inline); /*Module mod = (Module) this.scribParser .parse(this.antlrParser.parseAntlrTree(res), this.af);*/ - Module mod = (Module) this.antlrParser.parseAntlrTree(res); // Does del decoration + Module mod = (Module) this.antlrParser.parse(res); // Does del decoration init( debug, locator, useOldWF, @@ -155,7 +154,7 @@ private void init( boolean noValidation, boolean spin, Resource res, Module mainmod) - throws ScribParserException, ScribbleException + throws ScribParserException, ScribException { Pair p = new Pair<>(res, mainmod); @@ -186,9 +185,9 @@ public Lang newJob() return new Lang(this.getParsedModules(), this.mctxts, this.config); } - protected ScribbleAntlrWrapper newAntlrParser() + protected ScribAntlrWrapper newAntlrParser() { - return new ScribbleAntlrWrapper(); + return new ScribAntlrWrapper(); } protected AstFactory newAstFactory() @@ -207,19 +206,19 @@ protected SModelFactory newSModelFactory() } // Populates this.parsed - private void loadAllModules(Pair module) - throws ScribParserException, ScribbleException + private void loadAllModules(Pair m) + throws ScribParserException, ScribException { - this.parsed.put(module.right.getFullModuleName(), module); - for (ImportDecl id : module.right.getImportDeclChildren()) + this.parsed.put(m.right.getFullModuleName(), m); + for (ImportDecl id : m.right.getImportDeclChildren()) { if (id.isImportModule()) { - ModuleName modname = + ModuleName fullname = ((ImportModule) id).getModuleNameNodeChild().toName(); - if (!this.parsed.containsKey(modname)) + if (!this.parsed.containsKey(fullname)) { - loadAllModules(this.loader.loadModule(modname, this.af)); + loadAllModules(this.loader.loadModule(fullname, this.af)); } } } @@ -227,7 +226,7 @@ private void loadAllModules(Pair module) // Hacky? But not Scribble tool's job to check nested directory location of module fully corresponds to the fullname of module? Cf. Java classes private void checkMainModuleName(Path mainpath, Module main, boolean noValidation) - throws ScribbleException + throws ScribException { String path = mainpath.toString(); // FIXME: hack // FileSystems.getDefault().getSeparator() ? @@ -241,7 +240,7 @@ private void checkMainModuleName(Path mainpath, Module main, boolean noValidatio { CommonTree source = main.getModuleDeclChild().getNameNodeChild() .getSource(); - throw new ScribbleException(source, "Simple module name at path " + path + throw new ScribException(source, "Simple module name at path " + path + " mismatch: " + main.getFullModuleName()); } } diff --git a/scribble-main/src/main/java/org/scribble/main/ScribAntlrWrapper.java b/scribble-main/src/main/java/org/scribble/main/ScribAntlrWrapper.java new file mode 100644 index 000000000..67ff82626 --- /dev/null +++ b/scribble-main/src/main/java/org/scribble/main/ScribAntlrWrapper.java @@ -0,0 +1,129 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.main; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.stream.Collectors; + +import org.antlr.runtime.ANTLRStringStream; +import org.antlr.runtime.CommonTokenStream; +import org.antlr.runtime.Lexer; +import org.antlr.runtime.RecognitionException; +import org.antlr.runtime.tree.CommonErrorNode; +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.Module; +import org.scribble.del.DelDecorator; +import org.scribble.del.DelDecoratorImpl; +import org.scribble.main.resource.Resource; +import org.scribble.parser.antlr.ScribbleLexer; +import org.scribble.parser.antlr.ScribbleParser; +import org.scribble.parser.scribble.ScribTreeAdaptor; +import org.scribble.util.ScribParserException; + +// Resource -> ANTLR CommonTree -- parses Resources into ANTLR CommonTrees +// Wraps the ScribbleLexer and ScribbleParser generated by ANTLR from Scribble.g +public class ScribAntlrWrapper +{ + private final DelDecorator df = new DelDecoratorImpl(); + + public ScribAntlrWrapper() + { + + } + + // Scribble extensions should override newScribbleLexer/Parser as appropriate + // A fresh Lexer/Parser is needed by each call to parse + protected Lexer newScribbleLexer(ANTLRStringStream ss) + { + return new ScribbleLexer(ss); + } + + // Scribble extensions should override newScribbleLexer/Parser as appropriate + // ScribbleParser: a Parser that has a top-level "module" method + // (And has "setTreeAdaptor") + protected ScribbleParser newScribbleParser(CommonTokenStream ts) + { + return new ScribbleParser(ts); + } + + // Parse a Resource into a (del decorated) Module + public Module parse(Resource res) throws ScribParserException + { + try + { + String input = ScribAntlrWrapper.readInput(res); + Lexer lex = newScribbleLexer(new ANTLRStringStream(input)); + Module mod = runScribbleParser(new CommonTokenStream(lex)); + this.df.decorate(mod); + return mod; + } + catch (IOException e) + { + throw new ScribParserException(e); + } + } + + protected Module runScribbleParser(CommonTokenStream ts) + throws ScribParserException + { + try + { + ScribbleParser p = newScribbleParser(ts); + p.setTreeAdaptor(new ScribTreeAdaptor()); + return (Module) p.module().getTree(); + // Cast, because no convenient way to expose an interface for all (Scribble)Parsers with top-level "module" method? + } + catch (RecognitionException e) + { + throw new ScribParserException(e); + } + } + + // CHECKME: should this be used somewhere? + public static void checkForAntlrErrors(CommonTree t) + { + if (t.getChildCount() > 0) // getChildren returns null instead of empty list + { + List errors = ((List) t.getChildren()).stream() + .filter(c -> (c instanceof CommonErrorNode)) + .map(c -> (CommonErrorNode) c) + .collect(Collectors.toList()); + if (errors.size() > 0) // Antlr prints errors to System.err by default, but then attempts to carry on + // Should never get here now, Antlr displayRecognitionError overridden to force exit: Antlr error recovery means not all errors produce CommonErrorNode + { + // TODO: improve feedback message + System.err + .println("[ScribParser] Aborting due to parsing errors: " + errors); + System.exit(1); + } + } + } + + protected static String readInput(Resource res) throws IOException + { + return new String(ScribAntlrWrapper.readResource(res)); + } + + protected static byte[] readResource(Resource res) throws IOException + { + try (InputStream is = res.getInputStream()) + { + byte[] bs = new byte[is.available()]; + is.read(bs); + return bs; + } + } +} diff --git a/scribble-main/src/main/java/org/scribble/main/resource/InlineResource.java b/scribble-main/src/main/java/org/scribble/main/resource/InlineResource.java index 54bf61842..0ea392653 100644 --- a/scribble-main/src/main/java/org/scribble/main/resource/InlineResource.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/InlineResource.java @@ -33,7 +33,8 @@ public InlineResource(String res) { super(Resource.INLINE_LOCATION); //this.res = res; - this._inputStream = new ByteArrayInputStream(res.getBytes(StandardCharsets.UTF_8)); + this._inputStream = new ByteArrayInputStream( + res.getBytes(StandardCharsets.UTF_8)); } @Override diff --git a/scribble-main/src/main/java/org/scribble/main/resource/loader/DefaultModuleLoader.java b/scribble-main/src/main/java/org/scribble/main/resource/loader/DefaultModuleLoader.java index 5b1a0c2e9..39a53c32d 100644 --- a/scribble-main/src/main/java/org/scribble/main/resource/loader/DefaultModuleLoader.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/loader/DefaultModuleLoader.java @@ -15,11 +15,11 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Module; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.ModuleName; import org.scribble.main.resource.Resource; import org.scribble.util.Pair; import org.scribble.util.ScribParserException; +import org.scribble.util.ScribException; /** @@ -48,7 +48,7 @@ public void registerModule(Resource res, Module module) * @throws ScribParserException */ @Override - public Pair loadModule(ModuleName modname, AstFactory af) throws ScribParserException, ScribbleException + public Pair loadModule(ModuleName modname, AstFactory af) throws ScribParserException, ScribException { return (_modules.get(modname)); } diff --git a/scribble-main/src/main/java/org/scribble/main/resource/loader/ModuleLoader.java b/scribble-main/src/main/java/org/scribble/main/resource/loader/ModuleLoader.java index da851cd6c..d54e58364 100644 --- a/scribble-main/src/main/java/org/scribble/main/resource/loader/ModuleLoader.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/loader/ModuleLoader.java @@ -15,11 +15,11 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Module; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.ModuleName; import org.scribble.main.resource.Resource; import org.scribble.util.Pair; import org.scribble.util.ScribParserException; +import org.scribble.util.ScribException; /** @@ -39,6 +39,6 @@ public interface ModuleLoader * @return The module, or null if not found * @throws ScribParserException */ - public Pair loadModule(ModuleName modname, AstFactory af) throws ScribParserException, ScribbleException; + public Pair loadModule(ModuleName modname, AstFactory af) throws ScribParserException, ScribException; } diff --git a/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java b/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java index b66789aaf..1f57e9598 100644 --- a/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java @@ -15,57 +15,52 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Module; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.ModuleName; +import org.scribble.main.ScribAntlrWrapper; import org.scribble.main.resource.Resource; import org.scribble.main.resource.locator.ResourceLocator; -import org.scribble.parser.scribble.ScribbleAntlrWrapper; import org.scribble.util.Pair; import org.scribble.util.ScribParserException; +import org.scribble.util.ScribException; -// loading = ModuleName -> Module -// ModuleName --> Path --ResourceLocator--> Resource --AntlrParser--> ANTLR --ScribParser--> ScribNode -// FIXME: should be in core org.scribble.main -- here due to Maven dependency restrictions -public class ScribModuleLoader extends DefaultModuleLoader //implements ModuleLoader +// loading: ModuleName -> Module +// ModuleName --> Path --ResourceLocator--> Resource --ScribAntlrWrapper--> Module +public class ScribModuleLoader extends DefaultModuleLoader { private ResourceLocator locator; - private ScribbleAntlrWrapper antlr; - //private AntlrToScribParser parser; + private ScribAntlrWrapper antlr; - public ScribModuleLoader(ResourceLocator locator, ScribbleAntlrWrapper antlr)//, AntlrToScribParser parser) + public ScribModuleLoader(ResourceLocator locator, ScribAntlrWrapper antlr) { this.locator = locator; this.antlr = antlr; - //this.parser = parser; } @Override - public Pair loadModule(ModuleName modname, AstFactory af) - throws ScribParserException, ScribbleException + public Pair loadModule(ModuleName fullname, AstFactory af) + throws ScribParserException, ScribException { - Pair cached = super.loadModule(modname, af); + Pair cached = super.loadModule(fullname, af); if (cached != null) { return cached; } - Resource res = this.locator.getResource(modname.toPath()); - /*Module parsed = (Module) this.parser.parse(this.antlr.parseAntlrTree(res), - af);*/ - Module parsed = this.antlr.parseAntlrTree(res); // Does del decoration - - //AntlrToScribParser.checkForAntlrErrors(ct); // FIXME: do this somewhere - - checkModuleName(modname, res, parsed); - registerModule(res, parsed); - return new Pair<>(res, parsed); + + Resource res = this.locator.getResource(fullname.toPath()); + Module m = this.antlr.parse(res); // Does del decoration + ScribModuleLoader.checkModuleName(fullname, res, m); + registerModule(res, m); + return new Pair<>(res, m); } - private static void checkModuleName(ModuleName mn, Resource res, Module mod) + // Check module loaded from fullname.toPath has the expected mod decl + private static void checkModuleName(ModuleName fullname, Resource res, + Module m) { - if (!mn.equals(mod.getFullModuleName())) + if (!fullname.equals(m.getFullModuleName())) { throw new RuntimeException("Invalid module name " - + mod.getFullModuleName() + " at location: " + res.getLocation()); + + m.getFullModuleName() + " at location: " + res.getLocation()); } } } diff --git a/scribble-main/src/main/java/org/scribble/main/resource/locator/DirectoryResourceLocator.java b/scribble-main/src/main/java/org/scribble/main/resource/locator/DirectoryResourceLocator.java index 7d9349983..5d5d47fe4 100644 --- a/scribble-main/src/main/java/org/scribble/main/resource/locator/DirectoryResourceLocator.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/locator/DirectoryResourceLocator.java @@ -19,14 +19,14 @@ import java.util.LinkedList; import java.util.List; -import org.scribble.core.job.ScribbleException; import org.scribble.main.resource.FileResource; +import org.scribble.util.ScribException; /** * This class provides a directory based resource locator. * */ -// FIXME: rename exceptions +// TODO: rename exceptions public class DirectoryResourceLocator extends ResourceLocator { //private static final Logger LOG = Logger.getLogger(DirectoryResourceLocator.class.getName()); // TODO: @@ -45,9 +45,10 @@ public DirectoryResourceLocator(List paths) this.impaths = new LinkedList<>(paths); } - // FIXME: need to sort out what "getResource" should mean at level of ResourceLocator abstraction, e.g. if arg is specifically a Path or more abstract, whether it is the complete location or partial, etc + // TODO: need to sort out what "getResource" should mean at level of ResourceLocator abstraction... + // ...e.g. if arg is specifically a Path or more abstract, whether it is the complete location or partial, etc @Override - public FileResource getResource(Path path) throws ScribbleException + public FileResource getResource(Path path) throws ScribException { for (Path impath : this.impaths) { @@ -57,20 +58,22 @@ public FileResource getResource(Path path) throws ScribbleException return openFileInputStreamResource(prefixedpath); } } - throw new ScribbleException("Couldn't open resource: " + path); + throw new ScribException("Couldn't open resource: " + path); } // "full" path from working directory, as opposed to "relative" paths from import prefixes - public static FileResource getResourceByFullPath(Path path) throws ScribbleException // FIXME: should be abstracted out as front-end functionality, e.g. DirectoryResourceLocator, to find/load main module; then MainContext uses abstract ResourceLocator to load rest + public static FileResource getResourceByFullPath(Path path) + throws ScribException // TODO: should be abstracted out as front-end functionality, e.g. DirectoryResourceLocator, to find/load main module; then MainContext uses abstract ResourceLocator to load rest { if (!Files.exists(path)) { - throw new ScribbleException("File couldn't be opened: " + path); + throw new ScribException("File couldn't be opened: " + path); } return openFileInputStreamResource(path); } - private static FileResource openFileInputStreamResource(Path path) throws ScribbleException + private static FileResource openFileInputStreamResource(Path path) + throws ScribException { try { @@ -78,7 +81,7 @@ private static FileResource openFileInputStreamResource(Path path) throws Scribb } catch (IOException e) { - throw new ScribbleException(e); + throw new ScribException(e); } } } diff --git a/scribble-main/src/main/java/org/scribble/main/resource/locator/IResourceLocator.java b/scribble-main/src/main/java/org/scribble/main/resource/locator/IResourceLocator.java index 24bae2495..06b845038 100644 --- a/scribble-main/src/main/java/org/scribble/main/resource/locator/IResourceLocator.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/locator/IResourceLocator.java @@ -15,8 +15,8 @@ import java.nio.file.Path; -import org.scribble.core.job.ScribbleException; import org.scribble.main.resource.Resource; +import org.scribble.util.ScribException; /** @@ -33,5 +33,6 @@ public interface IResourceLocator * @return The resource, or null if not found */ - Resource getResource(Path path) throws ScribbleException; // Path should be made more abstract, e.g. some kind of URI (cf., Resource.getLocation) + Resource getResource(Path path) throws ScribException; + // TODO: Path should be made more abstract, e.g. some kind of URI (cf., Resource.getLocation) } diff --git a/scribble-main/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java b/scribble-main/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java deleted file mode 100644 index 774652205..000000000 --- a/scribble-main/src/main/java/org/scribble/parser/scribble/ScribbleAntlrWrapper.java +++ /dev/null @@ -1,163 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble; - -import java.io.IOException; -import java.io.InputStream; -import java.util.List; -import java.util.stream.Collectors; - -import org.antlr.runtime.ANTLRStringStream; -import org.antlr.runtime.CommonTokenStream; -import org.antlr.runtime.Lexer; -import org.antlr.runtime.RecognitionException; -import org.antlr.runtime.tree.CommonErrorNode; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.Module; -import org.scribble.del.DelDecorator; -import org.scribble.del.DelDecoratorImpl; -import org.scribble.main.resource.Resource; -import org.scribble.parser.antlr.ScribbleLexer; -import org.scribble.parser.antlr.ScribbleParser; - -// Resource -> ANTLR CommonTree -- parses Resources into ANTLR CommonTrees -// Wraps the ScribbleLexer and ScribbleParser generated by ANTLR from Scribble.g -// Not encapsulated inside ScribParser, because ScribParser's main function is the higher-level operation of "parsing" CommonTrees into ScribNodes -public class ScribbleAntlrWrapper -{ - private final DelDecorator df = new DelDecoratorImpl(); - - public ScribbleAntlrWrapper() - { - - } - - // Scribble extensions should override these "new" methods - protected Lexer getScribbleLexer(ANTLRStringStream ass) - { - return new ScribbleLexer(ass); - } - - /*protected Parser newScribbleParser(CommonTokenStream cts) - { - return new ScribbleParser(cts); - }*/ - - // Because no convenient way to expose an interface for all ScribbleParsers with top-level "module" method? - protected CommonTree runScribbleParser(CommonTokenStream cts) throws RecognitionException - { - ScribbleParser p = new ScribbleParser(cts); - p.setTreeAdaptor(new ScribTreeAdaptor()); - return (CommonTree) p.module().getTree(); - } - - // Parse Resource into Module - public Module parseAntlrTree(Resource res) - { - try - { - String input = readInput(res); - Lexer lex = getScribbleLexer(new ANTLRStringStream(input)); - //Parser parser = newScribbleParser(new CommonTokenStream(lex)); - ////return (CommonTree) parser.module().getTree(); - - /*Class c = parser.getClass(); - try*/ - { - /* // FIXME: need an interface for Scribble top-level module method (ANTLR "grammar actions"?) - Method m = c.getMethod("module"); - return (CommonTree) ((ParserRuleReturnScope) m.invoke(parser)).getTree();*/ // No: reflection doesn't work well with ANTLR error handling - Module mod = (Module) runScribbleParser(new CommonTokenStream(lex)); - this.df.decorate(mod); - return mod; - } - /*catch (NoSuchMethodException nsme) - { - throw new RuntimeException("Supplied Parser has no \"module\" method.", nsme); - } - catch (IllegalAccessException e) - { - throw new RuntimeException("Shouldn't get in here: ", e); - } - catch (IllegalArgumentException e) - { - throw new RuntimeException("Shouldn't get in here: ", e); - } - catch (InvocationTargetException e) - { - if (e.getCause() instanceof RecognitionException) - { - throw new RuntimeException(e); - } - throw new RuntimeException("Shouldn't get in here: ", e); - }*/ - } - catch (RecognitionException e) - { - throw new RuntimeException(e); - } - } - - /*public CommonTree parseAntlrTree(Resource res) - { - try - { - String input = readInput(res); - ScribbleLexer lex = new ScribbleLexer(new ANTLRStringStream(input)); - ScribbleParser parser = new ScribbleParser(new CommonTokenStream(lex)); - return (CommonTree) parser.module().getTree(); - } - catch (RecognitionException e) - { - throw new RuntimeException(e); - } - }*/ - - protected static String readInput(Resource res) - { - return new String(readResource(res)); - } - - private static byte[] readResource(Resource res) - { - try (InputStream is = res.getInputStream()) - { - byte[] bs = new byte[is.available()]; - is.read(bs); - return bs; - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - - public static void checkForAntlrErrors(CommonTree ct) - { - if (ct.getChildCount() > 0) // getChildren returns null instead of empty list - { - List errors = ((List) ct.getChildren()).stream() - .filter(c -> (c instanceof CommonErrorNode)) - .map(c -> (CommonErrorNode) c) - .collect(Collectors.toList()); - if (errors.size() > 0) // Antlr prints errors to System.err by default, but then attempts to carry on - // Should never get here now, Antlr displayRecognitionError overridden to force exit: Antlr error recovery means not all errors produce CommonErrorNode - { - //throw new ScribParserException("Parsing errors: " + errors); // FIXME: improve feedback message - System.err.println("[ScribParser] Aborting due to parsing errors: " + errors); - System.exit(1); - } - } - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParserUtil.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParserUtil.java deleted file mode 100644 index c6afd910b..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AntlrToScribParserUtil.java +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble; - -import java.util.List; -import java.util.stream.Collectors; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.parser.scribble.ScribbleAntlrConstants.AntlrNodeType; - -public class AntlrToScribParserUtil -{ - public static List toCommonTreeList(List list) - { - return list.stream().map(x -> (CommonTree) x).collect(Collectors.toList()); - } - - // Cf. Scribble.g output "node types" -- mapping to the AntlrNodeType enum - public static AntlrNodeType getAntlrNodeType(CommonTree ct) - { - String type = ct.getToken().getText(); - switch (type) - { - ////case AntlrConstants.EMPTY_PARAMETERDECLLST_NODE_TYPE: return AntlrNodeType.EMPTY_PARAMETERDECLLST; - case ScribbleAntlrConstants.AMBIGUOUSNAME_NODE_TYPE: return AntlrNodeType.AMBIGUOUSNAME; - case ScribbleAntlrConstants.QUALIFIEDNAME_NODE_TYPE: return AntlrNodeType.QUALIFIEDNAME; - - case ScribbleAntlrConstants.MESSAGESIGNATURE_NODE_TYPE: return AntlrNodeType.MESSAGESIGNATURE; - case ScribbleAntlrConstants.DELEGATION_NODE_TYPE: return AntlrNodeType.DELEGATION; - - case ScribbleAntlrConstants.PAYLOAD_NODE_TYPE: return AntlrNodeType.PAYLOAD; - //case AntlrConstants.PAYLOADELEMENT_NODE_TYPE: return AntlrNodeType.PAYLOADELEMENT; - - case ScribbleAntlrConstants.MODULE_NODE_TYPE: return AntlrNodeType.MODULE; - case ScribbleAntlrConstants.MODULEDECL_NODE_TYPE: return AntlrNodeType.MODULEDECL; - case ScribbleAntlrConstants.IMPORTMODULE_NODE_TYPE: return AntlrNodeType.IMPORTMODULE; - case ScribbleAntlrConstants.IMPORTMEMBER_NODE_TYPE: return AntlrNodeType.IMPORTMEMBER; - case ScribbleAntlrConstants.PAYLOADTYPEDECL_NODE_TYPE: return AntlrNodeType.PAYLOADTYPEDECL; - case ScribbleAntlrConstants.MESSAGESIGNATUREDECL_NODE_TYPE: return AntlrNodeType.MESSAGESIGNATUREDECL; - case ScribbleAntlrConstants.ROLEDECLLIST_NODE_TYPE: return AntlrNodeType.ROLEDECLLIST; - case ScribbleAntlrConstants.ROLEDECL_NODE_TYPE: return AntlrNodeType.ROLEDECL; - case ScribbleAntlrConstants.PARAMETERDECLLIST_NODE_TYPE: return AntlrNodeType.PARAMETERDECLLIST; - case ScribbleAntlrConstants.PARAMETERDECL_NODE_TYPE: return AntlrNodeType.PARAMETERDECL; - case ScribbleAntlrConstants.ROLEINSTANTIATIONLIST_NODE_TYPE: return AntlrNodeType.ROLEINSTANTIATIONLIST; - case ScribbleAntlrConstants.ROLEINSTANTIATION_NODE_TYPE: return AntlrNodeType.ROLEINSTANTIATION; - case ScribbleAntlrConstants.ARGUMENTINSTANTIATIONLIST_NODE_TYPE: return AntlrNodeType.ARGUMENTINSTANTIATIONLIST; - //case ScribbleAntlrConstants.ARGUMENTINSTANTIATION_NODE_TYPE: return AntlrNodeType.ARGUMENTINSTANTIATION; // Not used directly? - - case ScribbleAntlrConstants.GLOBALPROTOCOLDECL_NODE_TYPE: return AntlrNodeType.GLOBALPROTOCOLDECL; - case ScribbleAntlrConstants.GLOBALPROTOCOLHEADER_NODE_TYPE: return AntlrNodeType.GLOBALPROTOCOLHEADER; - case ScribbleAntlrConstants.GLOBALPROTOCOLDEF_NODE_TYPE: return AntlrNodeType.GLOBALPROTOCOLDEF; - case ScribbleAntlrConstants.GLOBALPROTOCOLBLOCK_NODE_TYPE: return AntlrNodeType.GLOBALPROTOCOLBLOCK; - case ScribbleAntlrConstants.GLOBALINTERACTIONSEQUENCE_NODE_TYPE: return AntlrNodeType.GLOBALINTERACTIONSEQUENCE; - case ScribbleAntlrConstants.GLOBALMESSAGETRANSFER_NODE_TYPE: return AntlrNodeType.GLOBALMESSAGETRANSFER; - case ScribbleAntlrConstants.GLOBALCONNECT_NODE_TYPE: return AntlrNodeType.GLOBALCONNECT; - case ScribbleAntlrConstants.GLOBALWRAP_NODE_TYPE: return AntlrNodeType.GLOBALWRAP; - case ScribbleAntlrConstants.GLOBALDISCONNECT_NODE_TYPE: return AntlrNodeType.GLOBALDISCONNECT; - case ScribbleAntlrConstants.GLOBALCHOICE_NODE_TYPE: return AntlrNodeType.GLOBALCHOICE; - case ScribbleAntlrConstants.GLOBALRECURSION_NODE_TYPE: return AntlrNodeType.GLOBALRECURSION; - case ScribbleAntlrConstants.GLOBALCONTINUE_NODE_TYPE: return AntlrNodeType.GLOBALCONTINUE; - /*case ScribbleAntlrConstants.GLOBALPARALLEL_NODE_TYPE: return AntlrNodeType.GLOBALPARALLEL; - case ScribbleAntlrConstants.GLOBALINTERRUPTIBLE_NODE_TYPE: return AntlrNodeType.GLOBALINTERRUPTIBLE; - case ScribbleAntlrConstants.GLOBALINTERRUPT_NODE_TYPE: return AntlrNodeType.GLOBALINTERRUPT;*/ - case ScribbleAntlrConstants.GLOBALDO_NODE_TYPE: return AntlrNodeType.GLOBALDO; - - /*case ScribbleAntlrConstants.LOCALPROTOCOLDECL_NODE_TYPE: return AntlrNodeType.LOCALPROTOCOLDECL; - case ScribbleAntlrConstants.LOCALROLEDECLLIST_NODE_TYPE: return AntlrNodeType.ROLEDECLLIST; - case ScribbleAntlrConstants.LOCALROLEDECL_NODE_TYPE: return AntlrNodeType.ROLEDECL; - case ScribbleAntlrConstants.SELFDECL_NODE_TYPE: return AntlrNodeType.SELFDECL; - case ScribbleAntlrConstants.LOCALPROTOCOLDEF_NODE_TYPE: return AntlrNodeType.LOCALPROTOCOLDEF; - case ScribbleAntlrConstants.LOCALPROTOCOLBLOCK_NODE_TYPE: return AntlrNodeType.LOCALPROTOCOLBLOCK; - case ScribbleAntlrConstants.LOCALINTERACTIONSEQUENCE_NODE_TYPE: return AntlrNodeType.LOCALINTERACTIONSEQUENCE; - case ScribbleAntlrConstants.LOCALSEND_NODE_TYPE: return AntlrNodeType.LOCALSEND; - case ScribbleAntlrConstants.LOCALRECEIVE_NODE_TYPE: return AntlrNodeType.LOCALRECEIVE; - case ScribbleAntlrConstants.LOCALCHOICE_NODE_TYPE: return AntlrNodeType.LOCALCHOICE; - case ScribbleAntlrConstants.LOCALRECURSION_NODE_TYPE: return AntlrNodeType.LOCALRECURSION; - case ScribbleAntlrConstants.LOCALCONTINUE_NODE_TYPE: return AntlrNodeType.LOCALCONTINUE; - case ScribbleAntlrConstants.LOCALPARALLEL_NODE_TYPE: return AntlrNodeType.LOCALPARALLEL; - case ScribbleAntlrConstants.LOCALINTERRUPTIBLE_NODE_TYPE: return AntlrNodeType.LOCALINTERRUPTIBLE; - case ScribbleAntlrConstants.LOCALTHROWS_NODE_TYPE: return AntlrNodeType.LOCALTHROWS; - case ScribbleAntlrConstants.LOCALCATCHES_NODE_TYPE: return AntlrNodeType.LOCALCATCHES; - case ScribbleAntlrConstants.LOCALDO_NODE_TYPE: return AntlrNodeType.LOCALDO;*/ - - // Nodes without a "node type", e.g. parameter names, fall in here - default: throw new RuntimeException("Unknown ANTLR node type label: " + type); - } - } -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribbleAntlrConstants.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribbleAntlrConstants.java deleted file mode 100644 index 47444f361..000000000 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribbleAntlrConstants.java +++ /dev/null @@ -1,198 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.parser.scribble; - -// Constants declared in Scribble.g ANTLR grammer -public class ScribbleAntlrConstants -{ - /** - * Cf. Scribble.g, parser output "node types" - */ - - // Parsed "indirectly" -- i.e., not as explicit cases in AntlrToScribParser::parse - - public static final String EMPTY_ALIAS = "EMPTY_ALIAS"; - public static final String ANTLR_EMPTY_OPERATOR = "EMPTY_OPERATOR"; - //public static final String ANTLR_NO_SCOPE = "NO_SCOPE"; - - public static final String KIND_MESSAGESIGNATURE = "KIND_MESSAGESIGNATURE"; - public static final String KIND_PAYLOADTYPE = "KIND_PAYLOADTYPE"; - - ////public static final String EMPTY_PARAMETERDECLLST_NODE_TYPE = "EMPTY_PARAMETERDECLLIST"; - public static final String AMBIGUOUSNAME_NODE_TYPE = "AMBIGUOUSNAME"; - public static final String QUALIFIEDNAME_NODE_TYPE = "QUALIFIEDNAME"; - - public static final String MESSAGESIGNATURE_NODE_TYPE = "MESSAGESIGNATURE"; - public static final String DELEGATION_NODE_TYPE = "DELEGATION"; - - - // Parsed "directly" by AntlrToScribParser::parse - - public static final String PAYLOAD_NODE_TYPE = "PAYLOAD"; - //public static final String PAYLOADELEMENT_NODE_TYPE = "PAYLOADELEMENT"; - - public static final String MODULE_NODE_TYPE = "MODULE"; - public static final String MODULEDECL_NODE_TYPE = "MODULEDECL"; - public static final String IMPORTMODULE_NODE_TYPE = "IMPORTMODULE"; - public static final String IMPORTMEMBER_NODE_TYPE = "IMPORTMEMBER"; - public static final String PAYLOADTYPEDECL_NODE_TYPE = "PAYLOADTYPEDECL"; - public static final String MESSAGESIGNATUREDECL_NODE_TYPE = "MESSAGESIGNATUREDECL"; - public static final String ROLEDECLLIST_NODE_TYPE = "ROLEDECLLIST"; - public static final String ROLEDECL_NODE_TYPE = "ROLEDECL"; - public static final String PARAMETERDECLLIST_NODE_TYPE = "PARAMETERDECLLIST"; - public static final String PARAMETERDECL_NODE_TYPE = "PARAMETERDECL"; - public static final String ROLEINSTANTIATIONLIST_NODE_TYPE = "ROLEINSTANTIATIONLIST"; - public static final String ROLEINSTANTIATION_NODE_TYPE = "ROLEINSTANTIATION"; - public static final String ARGUMENTINSTANTIATIONLIST_NODE_TYPE = "ARGUMENTINSTANTIATIONLIST"; - public static final String ARGUMENTINSTANTIATION_NODE_TYPE = "ARGUMENTINSTANTIATION"; - - public static final String GLOBALPROTOCOLDECL_NODE_TYPE = "GLOBALPROTOCOLDECL"; - public static final String GLOBALPROTOCOLHEADER_NODE_TYPE = "GLOBALPROTOCOLHEADER"; - public static final String GLOBALPROTOCOLDEF_NODE_TYPE = "GLOBALPROTOCOLDEF"; - public static final String GLOBALPROTOCOLBLOCK_NODE_TYPE = "GLOBALPROTOCOLBLOCK"; - public static final String GLOBALINTERACTIONSEQUENCE_NODE_TYPE = "GLOBALINTERACTIONSEQUENCE"; - public static final String GLOBALMESSAGETRANSFER_NODE_TYPE = "GLOBALMESSAGETRANSFER"; - public static final String GLOBALCONNECT_NODE_TYPE = "GLOBALCONNECT"; - public static final String GLOBALDISCONNECT_NODE_TYPE = "GLOBALDISCONNECT"; - public static final String GLOBALWRAP_NODE_TYPE = "GLOBALWRAP"; - public static final String GLOBALCHOICE_NODE_TYPE = "GLOBALCHOICE"; - public static final String GLOBALRECURSION_NODE_TYPE = "GLOBALRECURSION"; - public static final String GLOBALCONTINUE_NODE_TYPE = "GLOBALCONTINUE"; - /*public static final String GLOBALPARALLEL_NODE_TYPE = "GLOBALPARALLEL"; - public static final String GLOBALINTERRUPTIBLE_NODE_TYPE = "GLOBALINTERRUPTIBLE"; - public static final String GLOBALINTERRUPT_NODE_TYPE = "GLOBALINTERRUPT";*/ - public static final String GLOBALDO_NODE_TYPE = "GLOBALDO"; - - - //FIXME: local nodes are currently not ANTLR nodes -- locals only projected, not parsed - - public static final String LOCALPROTOCOLDECL_NODE_TYPE = "LOCALPROTOCOLDECL"; - /*public static final String LOCALROLEDECLLIST_NODE_TYPE = "LOCALROLEDECLLIST"; - public static final String LOCALROLEDECL_NODE_TYPE = "LOCALROLEDECL"; - public static final String SELFDECL_NODE_TYPE = "SELFDECL"; - public static final String LOCALPROTOCOLDEF_NODE_TYPE = "LOCALPROTOCOLDEF"; - public static final String LOCALPROTOCOLBLOCK_NODE_TYPE = "LOCALPROTOCOLBLOCK"; - public static final String LOCALINTERACTIONSEQUENCE_NODE_TYPE = "LOCALINTERACTIONSEQUENCE"; - public static final String LOCALSEND_NODE_TYPE = "LOCALSEND"; - public static final String LOCALRECEIVE_NODE_TYPE = "LOCALRECEIVE"; - public static final String LOCALCHOICE_NODE_TYPE = "LOCALCHOICE"; - public static final String LOCALRECURSION_NODE_TYPE = "LOCALRECURSION"; - public static final String LOCALCONTINUE_NODE_TYPE = "LOCALCONTINUE"; - public static final String LOCALPARALLEL_NODE_TYPE = "LOCALPARALLEL"; - public static final String LOCALINTERRUPTIBLE_NODE_TYPE = "LOCALINTERRUPTIBLE"; - public static final String LOCALTHROWS_NODE_TYPE = "LOCALTHROWS"; - public static final String LOCALCATCHES_NODE_TYPE = "LOCALCATCHES"; - public static final String LOCALDO_NODE_TYPE = "LOCALDO";*/ - - - // Scribble.g, parser output "node types" as a Java enum - public enum AntlrNodeType - { - //EMPTY_PARAMETERDECLLST, - AMBIGUOUSNAME, - QUALIFIEDNAME, - - MESSAGESIGNATURE, - DELEGATION, - - PAYLOAD, - //PAYLOADELEMENT, - - MODULE, - MODULEDECL, - IMPORTMODULE, - IMPORTMEMBER, - PAYLOADTYPEDECL, - MESSAGESIGNATUREDECL, - ROLEDECLLIST, - ROLEDECL, - //CONNECTDECL, - PARAMETERDECLLIST, - PARAMETERDECL, - ROLEINSTANTIATIONLIST, - ROLEINSTANTIATION, - ARGUMENTINSTANTIATIONLIST, - ARGUMENTINSTANTIATION, - - GLOBALPROTOCOLDECL, - GLOBALPROTOCOLHEADER, - GLOBALPROTOCOLDEF, - GLOBALPROTOCOLBLOCK, - GLOBALINTERACTIONSEQUENCE, - GLOBALMESSAGETRANSFER, - GLOBALCONNECT, - GLOBALDISCONNECT, - GLOBALWRAP, - GLOBALCHOICE, - GLOBALRECURSION, - GLOBALCONTINUE, - /*GLOBALPARALLEL, - GLOBALINTERRUPTIBLE, - GLOBALINTERRUPT,*/ - GLOBALDO, - - LOCALPROTOCOLDECL, - /*LOCALROLEDECLLIST, - LOCALROLEDECL, - SELFDECL, - LOCALPROTOCOLDEF, - LOCALPROTOCOLBLOCK, - LOCALINTERACTIONSEQUENCE, - LOCALSEND, - LOCALRECEIVE, - LOCALCHOICE, - LOCALRECURSION, - LOCALCONTINUE, - LOCALPARALLEL, - LOCALINTERRUPTIBLE, - LOCALTHROWS, - LOCALCATCHES, - LOCALDO*/ - } - - - // Duplicated from Scribble.g (parser input constants) -- what's the best way to share it? - // Mostly used in projection (outputting local types) - // FIXME: refer to core ast Constants? Cannot refer the other way around due to Maven dependencies - public static final String MODULE_KW = "module"; - public static final String IMPORT_KW = "import"; - public static final String TYPE_KW = "type"; - public static final String PROTOCOL_KW = "protocol"; - public static final String GLOBAL_KW = "global"; - public static final String LOCAL_KW = "local"; - public static final String ROLE_KW = "role"; - public static final String SELF_KW = "self"; - public static final String SIG_KW = "sig"; - //public static final String INSTANTIATES_KW = "instantiates"; - public static final String AS_KW = "as"; - - public static final String CONNECT_KW = "connect"; - public static final String DISCONNECT_KW = "disconnect"; - public static final String FROM_KW = "from"; - public static final String TO_KW = "to"; - public static final String CHOICE_KW = "choice"; - public static final String AT_KW = "at"; - public static final String OR_KW = "or"; - public static final String REC_KW = "rec"; - public static final String CONTINUE_KW = "continue"; - //public static final String PAR_KW = "par"; - public static final String AND_KW = "and"; - /*public static final String INTERRUPTIBLE_KW = "interruptible"; - public static final String WITH_KW = "with"; - public static final String BY_KW = "by";*/ - /*public static final String THROWS_KW = "throws"; - public static final String CATCHES_KW = "catches";*/ - public static final String DO_KW = "do"; - //public static final String SPAWN_KW = "spawn"; -} diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelEndpoint.java index 1797ec8fe..ae30dbba2 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/BinaryChannelEndpoint.java @@ -21,10 +21,10 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -import org.scribble.core.job.RuntimeScribbleException; import org.scribble.runtime.message.ScribInterrupt; import org.scribble.runtime.message.ScribMessage; import org.scribble.runtime.session.SessionEndpoint; +import org.scribble.util.RuntimeScribException; public abstract class BinaryChannelEndpoint { @@ -110,13 +110,13 @@ public synchronized CompletableFuture getFuture() ScribMessage m = read(ticket); if (m instanceof ScribInterrupt) // FIXME: hacked in { - throw new RuntimeScribbleException((Throwable) ((ScribInterrupt) m).payload[0]); + throw new RuntimeScribException((Throwable) ((ScribInterrupt) m).payload[0]); } return m; } catch(IOException e) { - throw new RuntimeScribbleException(e); + throw new RuntimeScribException(e); } finally { diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/EndpointInputQueues.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/EndpointInputQueues.java index 3ebc38aed..aef3dcfa0 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/EndpointInputQueues.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/EndpointInputQueues.java @@ -20,10 +20,10 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; -import org.scribble.core.job.RuntimeScribbleException; import org.scribble.core.type.name.Role; import org.scribble.runtime.message.ScribInterrupt; import org.scribble.runtime.message.ScribMessage; +import org.scribble.util.RuntimeScribException; @Deprecated public class EndpointInputQueues @@ -89,13 +89,13 @@ public synchronized CompletableFuture getFuture(Role peer) ScribMessage m = dequeue(peer, getTicket(peer)); if (m instanceof ScribInterrupt) // FIXME: hacked in { - throw new RuntimeScribbleException((Throwable) ((ScribInterrupt) m).payload[0]); + throw new RuntimeScribException((Throwable) ((ScribInterrupt) m).payload[0]); } return m; } catch(IOException e) { - throw new RuntimeScribbleException(e); + throw new RuntimeScribException(e); } }); } diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java index da2dee9a6..260f359cc 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java @@ -19,10 +19,10 @@ import java.util.Map; import java.util.Random; -import org.scribble.core.job.ScribbleException; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.Role; import org.scribble.main.ScribbleRuntimeException; +import org.scribble.util.ScribException; public abstract class Session { @@ -120,11 +120,11 @@ public boolean hasEndpoint(Role role) } //public SessionEndpoint getEndpoint(Role role) throws ScribbleException - public MPSTEndpoint getEndpoint(R role) throws ScribbleException + public MPSTEndpoint getEndpoint(R role) throws ScribException { if (!this.endpoints.containsKey(role)) { - throw new ScribbleException("No endpoint for: " + role); + throw new ScribException("No endpoint for: " + role); } @SuppressWarnings("unchecked") MPSTEndpoint cast = (MPSTEndpoint) this.endpoints.get(role); // FIXME: @@ -136,11 +136,11 @@ public MPSTEndpoint getEndpoint(R role return Session.sessions.containsKey(id); }*/ - public static Session getSession(int id) throws ScribbleException + public static Session getSession(int id) throws ScribException { if (!Session.sessions.containsKey(id)) { - throw new ScribbleException("No such session: " + id); + throw new ScribException("No such session: " + id); } return Session.sessions.get(id); } diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java index a1672213b..065d1bd79 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java @@ -20,7 +20,6 @@ import java.util.Map; import java.util.Set; -import org.scribble.core.job.RuntimeScribbleException; import org.scribble.core.type.name.Role; import org.scribble.main.ScribbleRuntimeException; import org.scribble.runtime.message.ScribMessageFormatter; @@ -28,6 +27,7 @@ import org.scribble.runtime.net.BinaryChannelWrapper; import org.scribble.runtime.net.ScribServerSocket; import org.scribble.runtime.util.Buf; +import org.scribble.util.RuntimeScribException; // FIXME: factor out between role-endpoint based socket and channel-endpoint sockets //.. initiator and joiner endpoints @@ -150,7 +150,7 @@ public BinaryChannelEndpoint getChannelEndpoint(Role role) { if (!this.chans.containsKey(role)) { - throw new RuntimeScribbleException(this.self + " is not connected to: " + role); + throw new RuntimeScribException(this.self + " is not connected to: " + role); } return this.chans.get(role); } @@ -191,7 +191,7 @@ public ScribServerSocket getSelfServerSocket() ScribServerSocket ss = this.servs.get(this.self); if (ss == null) { - throw new RuntimeScribbleException("No server registered."); + throw new RuntimeScribException("No server registered."); } return ss; } diff --git a/scribble-test/src/test/java/org/scribble/test/ScribTestBase.java b/scribble-test/src/test/java/org/scribble/test/ScribTestBase.java index cd3ea4f85..a178504c5 100644 --- a/scribble-test/src/test/java/org/scribble/test/ScribTestBase.java +++ b/scribble-test/src/test/java/org/scribble/test/ScribTestBase.java @@ -22,8 +22,8 @@ import org.scribble.cli.CLArgParser; import org.scribble.cli.CommandLine; import org.scribble.cli.CommandLineException; -import org.scribble.core.job.AntlrSourceException; -import org.scribble.core.job.ScribbleException; +import org.scribble.util.AntlrSourceException; +import org.scribble.util.ScribException; /* * Packaging following pattern of putting tests into same package but different directory as classes being tested: @@ -106,7 +106,7 @@ public void tests() throws IOException, InterruptedException, ExecutionException runTest(dir); Assert.assertFalse("Expecting exception", this.isBadTest); } - catch (ScribbleException e) + catch (ScribException e) { Assert.assertTrue("Unexpected exception '" + e.getMessage() + "'", this.isBadTest); } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index cdecc9d4a..04df5327a 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -69,6 +69,13 @@ module tmp.Test; // move lang types to type.sess, and move new visit // add exp conn checks to model validation // refactor test to use main instead of cli +// simplify cli and arg parsing + + +global protocol Proto1(role A, role B) +{ + 1() from A to B; +} /* @@ -112,10 +119,6 @@ explicit global protocol Foo(role A, role B, role C) } //*/ -global protocol Proto1(role A, role B) -{ - 1() from A to B; -} /* explicit global protocol Foo(role A, role B) From dfebe0128bfe6c7cc98209bbc8f6364adba9219e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 5 Apr 2019 23:13:30 +0100 Subject: [PATCH 176/539] Continued: refactoring Main. --- .../main/java/org/scribble/ast/local/LDo.java | 2 +- .../java/org/scribble/del/DoArgListDel.java | 2 +- .../src/main/java/org/scribble/del/DoDel.java | 2 +- .../main/java/org/scribble/del/ModuleDel.java | 12 +- .../java/org/scribble/del/ProtocolDefDel.java | 2 +- .../java/org/scribble/del/RecursionDel.java | 2 +- .../org/scribble/del/global/GChoiceDel.java | 6 +- .../org/scribble/del/global/GConnectDel.java | 2 +- .../org/scribble/del/global/GContinueDel.java | 4 +- .../del/global/GDelegationElemDel.java | 8 +- .../scribble/del/global/GDisconnectDel.java | 2 +- .../java/org/scribble/del/global/GDoDel.java | 16 +- .../del/global/GInteractionSeqDel.java | 6 +- .../del/global/GMessageTransferDel.java | 2 +- .../del/global/GProtocolBlockDel.java | 4 +- .../scribble/del/global/GProtocolDeclDel.java | 8 +- .../scribble/del/global/GProtocolDefDel.java | 12 +- .../scribble/del/global/GRecursionDel.java | 4 +- .../org/scribble/del/global/GWrapDel.java | 2 +- .../org/scribble/del/local/LAcceptDel.java | 4 +- .../org/scribble/del/local/LChoiceDel.java | 6 +- .../org/scribble/del/local/LContinueDel.java | 2 +- .../scribble/del/local/LDisconnectDel.java | 2 +- .../java/org/scribble/del/local/LDoDel.java | 12 +- .../del/local/LInteractionSeqDel.java | 4 +- .../del/local/LProjectionDeclDel.java | 4 +- .../scribble/del/local/LProtocolBlockDel.java | 2 +- .../scribble/del/local/LProtocolDeclDel.java | 2 +- .../scribble/del/local/LProtocolDefDel.java | 10 +- .../org/scribble/del/local/LReceiveDel.java | 2 +- .../org/scribble/del/local/LRecursionDel.java | 2 +- .../org/scribble/del/local/LRequestDel.java | 2 +- .../java/org/scribble/del/local/LSendDel.java | 2 +- .../scribble/del/local/LWrapClientDel.java | 2 +- .../scribble/del/local/LWrapServerDel.java | 2 +- .../del/name/simple/RecVarNodeDel.java | 2 +- .../src/main/java/org/scribble/lang/Lang.java | 8 +- .../java/org/scribble/lang/LangConfig.java | 6 +- .../java/org/scribble/lang/LangContext.java | 8 +- .../java/org/scribble/visit/AstVisitor.java | 6 +- .../org/scribble/visit/GTypeTranslator.java | 4 +- .../visit/InlinedProtocolUnfolder.java | 4 +- .../scribble/visit/ProtocolDefInliner.java | 6 +- .../org/scribble/visit/SimpleVisitor.java | 8 +- .../scribble/visit/SubprotocolVisitor.java | 6 +- .../context/ProjectedChoiceDoPruner.java | 8 +- .../scribble/visit/wf/WFChoiceChecker.java | 2 +- .../java/org/scribble/cli/CommandLine.java | 131 ++++----- .../org/scribble/codegen/java/ApiGen.java | 10 +- .../codegen/java/JEndpointApiGenerator.java | 16 +- .../callbackapi/CBEndpointApiGenerator3.java | 28 +- .../java/sessionapi/SessionApiGenerator.java | 10 +- .../StateChannelApiGenerator.java | 10 +- .../ioifaces/IOInterfacesGenerator.java | 4 +- .../statetype/STStateChanAPIBuilder.java | 6 +- .../core/model/endpoint/EModelFactory.java | 2 + .../core/model/global/SModelFactory.java | 1 + .../src/main/java/org/scribble/main/Main.java | 253 +++++++----------- .../main/resource/InlineResource.java | 2 +- .../resource/loader/DefaultModuleLoader.java | 18 +- .../main/resource/loader/ModuleLoader.java | 6 +- .../resource/loader/ScribModuleLoader.java | 66 ++++- scribble-test/src/test/scrib/tmp/Test.scr | 2 + 63 files changed, 389 insertions(+), 402 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java b/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java index cc28ac729..b68c50c5a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java @@ -64,7 +64,7 @@ public LDo dupNode() public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) { ModuleContext mc = fixer.getModuleContext(); - LangContext jc = fixer.job.getContext(); + LangContext jc = fixer.lang.getContext(); Role subj = getTargetProtocolDecl(jc, mc).getDefChild().getBlockChild() .getInteractSeqChild().getInteractionChildren().get(0) .inferLocalChoiceSubject(fixer); diff --git a/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java index de754368c..8e06a42df 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java @@ -57,7 +57,7 @@ protected ProtocolDecl getTargetProtocolDecl(Do parent, NameDisambiguator disamb) throws ScribException { ModuleContext mc = disamb.getModuleContext(); - LangContext jc = disamb.job.getContext(); + LangContext jc = disamb.lang.getContext(); Do doo = (Do) parent; ProtocolName pn = doo.getProtocolNameNode().toName(); /*if (!mc.isVisibleProtocolDeclName(simpname)) // FIXME: should be checked somewhere else? earlier (do-entry?) -- done diff --git a/scribble-ast/src/main/java/org/scribble/del/DoDel.java b/scribble-ast/src/main/java/org/scribble/del/DoDel.java index 557d51998..f4aa793d8 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoDel.java @@ -100,7 +100,7 @@ public Do leaveProtocolDeclContextBuilding(ScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) throws ScribException { - LangContext jcontext = builder.job.getContext(); + LangContext jcontext = builder.lang.getContext(); ModuleContext mcontext = builder.getModuleContext(); Do doo = (Do) visited; ProtocolName pn = doo.getProtocolNameNode().toName(); // leaveDisambiguation has fully qualified the target name diff --git a/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java b/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java index 9962980b0..fa7544dd2 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java @@ -61,7 +61,7 @@ public void enterModuleContextBuilding(ScribNode parent, ScribNode child, { builder.setModuleContext( //new ModuleContext(builder.job.getContext().getParsed(), (Module) child) - builder.maker.make(builder.job.getContext().getParsed(), (Module) child) + builder.maker.make(builder.lang.getContext().getParsed(), (Module) child) ); // ModuleContext building is done solely by "new ModuleContext" (no deeper visiting needed) // The only thing ModuleContextBuilder really does is to set the ModuleContext in ModuleDel @@ -159,10 +159,10 @@ public Module createModuleForProjection(Projector proj, Module root, { ModuleDecl rootModDecl = root.getModuleDeclChild(); ModuleNameNode modname = Projector.makeProjectedModuleNameNode( - proj.job.config.af, rootModDecl.getNameNodeChild().getSource(), + proj.lang.config.af, rootModDecl.getNameNodeChild().getSource(), // Or ignore blame source for purely generated? rootModDecl.getFullModuleName(), lpd.getHeaderChild().getDeclName()); - ModuleDecl modDecl = proj.job.config.af + ModuleDecl modDecl = proj.lang.config.af .ModuleDecl(root.getModuleDeclChild().getSource(), modname); List> imports = new LinkedList<>(); for (GProtocolName gpn : deps.keySet()) @@ -172,7 +172,7 @@ public Module createModuleForProjection(Projector proj, Module root, LProtocolName targetsimpname = org.scribble.core.visit.global.Projector2 .projectSimpleProtocolName(gpn.getSimpleName(), role); ModuleNameNode targetmodname = Projector.makeProjectedModuleNameNode( - proj.job.config.af, + proj.lang.config.af, //null, // CHECKME? projected import sources? new CommonTree(), // TODO FIXME -- @@ -182,7 +182,7 @@ public Module createModuleForProjection(Projector proj, Module root, // Self dependency -- each projected local is in its own module now, so can compare module names { imports - .add(proj.job.config.af.ImportModule(null, targetmodname, null)); + .add(proj.lang.config.af.ImportModule(null, targetmodname, null)); // CHECKME? projected import sources? } } @@ -192,7 +192,7 @@ public Module createModuleForProjection(Projector proj, Module root, new LinkedList<>(root.getNonProtoDeclChildren()); // CHECKME: copy? // FIXME: only project the dependencies List> protos = Arrays.asList(lpd); - return proj.job.config.af.Module(gpd.getHeaderChild().getSource(), modDecl, + return proj.lang.config.af.Module(gpd.getHeaderChild().getSource(), modDecl, imports, data, protos); } diff --git a/scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java index 8f901e227..858e920da 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java @@ -49,7 +49,7 @@ public ProtocolDefDel setInlinedProtocolDef(ProtocolDef public void enterRecRemoval(ScribNode parent, ScribNode child, RecRemover rem) { super.enterRecRemoval(parent, child, rem); - RecVarCollector rvc = new RecVarCollector(rem.job); + RecVarCollector rvc = new RecVarCollector(rem.lang); try { this.inlined.accept(rvc); // RecVarCollector not an InlinedProtocolVistor -- do simple visiting directly on inlined diff --git a/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java index b3ced2333..d53844133 100644 --- a/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java @@ -83,7 +83,7 @@ public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, super.enterInlinedProtocolUnfolding(parent, child, unf); Recursion lr = (Recursion) child; RecVar recvar = lr.getRecVarChild().toName(); - unf.setRecVar(unf.job.config.af, recvar, lr); // Cloned on use (on continue) + unf.setRecVar(unf.lang.config.af, recvar, lr); // Cloned on use (on continue) } @Override diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java index 25c0f3654..e3fa0ceab 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -66,7 +66,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, .getTranslation()) .collect(Collectors.toList()); RoleNode subj = gc.getSubjectChild().clone();//inl.job.af); - GChoice inlined = inl.job.config.af.GChoice(gc.getSource(), subj, blocks); + GChoice inlined = inl.lang.config.af.GChoice(gc.getSource(), subj, blocks); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (GChoice) super.leaveProtocolInlining(parent, child, inl, gc); } @@ -99,7 +99,7 @@ public GChoice leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, List all = cho.getBlockChildren().stream().map(b -> (WFChoiceEnv) b.del().env()) .collect(Collectors.toList()); - if (checker.job.config.useOldWf) // **** + if (checker.lang.config.useOldWf) // **** { if (all.size() > 1) { @@ -192,7 +192,7 @@ public GChoice leaveProjection(ScribNode parent, ScribNode child, .getProjection()) .collect(Collectors.toList()); //gc.getBlocks().stream().map(b -> ((GProtocolBlockDel) b.del()).project(b, self)).collect(Collectors.toList()); - LChoice projection = gc.project(proj.job.config.af, proj.peekSelf(), blocks); + LChoice projection = gc.project(proj.lang.config.af, proj.peekSelf(), blocks); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GChoice) GCompoundInteractionNodeDel.super.leaveProjection(parent, child, proj, gc); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java index ab82127b7..903a87aca 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java @@ -109,7 +109,7 @@ public ScribNode leaveProjection(ScribNode parent, ScribNode child, { GConnect gc = (GConnect) visited; Role self = proj.peekSelf(); - LScribNode projection = gc.project(proj.job.config.af, self); + LScribNode projection = gc.project(proj.lang.config.af, self); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GConnect) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gc); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java index b004e7f9c..44545d33a 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java @@ -44,7 +44,7 @@ public GContinue leaveProtocolInlining(ScribNode parent, ScribNode child, GContinue gc = (GContinue) visited; RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) gc.getRecVarChild() .del().env()).getTranslation(); - GContinue inlined = inl.job.config.af.GContinue(gc.getSource(), recvar); + GContinue inlined = inl.lang.config.af.GContinue(gc.getSource(), recvar); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (GContinue) super.leaveProtocolInlining(parent, child, inl, gc); } @@ -62,7 +62,7 @@ public GContinue leaveProjection(ScribNode parent, ScribNode child, { GContinue gc = (GContinue) visited; //LContinue projection = project(proj.job.af, gc, proj.peekSelf()); - LContinue projection = gc.project(proj.job.config.af, proj.peekSelf()); + LContinue projection = gc.project(proj.lang.config.af, proj.peekSelf()); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GContinue) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gc); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java index d247168bd..a51f76ad1 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -70,7 +70,7 @@ public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, RoleNode r = de.getRoleChild(); Role rn = r.toName(); - ProtocolDecl gpd = disamb.job.getContext() + ProtocolDecl gpd = disamb.lang.getContext() .getModule(fullname.getPrefix()) .getProtocolDeclChild(fullname.getSimpleName()); if (!gpd.getHeaderChild().getRoleDeclListChild().getRoles().contains(rn)) @@ -78,7 +78,7 @@ public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, throw new ScribException(r.getSource(), "Invalid delegation role: " + de); } - GProtocolNameNode pnn = (GProtocolNameNode) disamb.job.config.af + GProtocolNameNode pnn = (GProtocolNameNode) disamb.lang.config.af .QualifiedNameNode(de.getProtocolChild().getSource(), fullname.getKind(), fullname.getElements()); // Not keeping original namenode del @@ -122,7 +122,7 @@ public void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, } Set todo = new LinkedHashSet(); - ProtocolDecl targetgpd = checker.job.getContext() + ProtocolDecl targetgpd = checker.lang.getContext() .getModule(targetfullname.getPrefix()) .getProtocolDeclChild(targetfullname.getSimpleName()); // target // CHECKME: does this already contain transitive do-dependencies? But doesn't contain transitive delegation-dependencies..? @@ -148,7 +148,7 @@ public void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, "Recursive protocol dependencies not supported for delegation types: " + de); } - ProtocolDecl nextgpd = checker.job.getContext() + ProtocolDecl nextgpd = checker.lang.getContext() .getModule(targetfullname.getPrefix()) .getProtocolDeclChild(nextfullname.getSimpleName()); Set tmp = ((GProtocolDeclDel) nextgpd.del()) diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java index dc30cb03e..060250f07 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java @@ -108,7 +108,7 @@ public ScribNode leaveProjection(ScribNode parent, ScribNode child, { GDisconnect gd = (GDisconnect) visited; Role self = proj.peekSelf(); - LScribNode projection = gd.project(proj.job.config.af, self); + LScribNode projection = gd.project(proj.lang.config.af, self); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GDisconnect) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gd); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java index 9b3ace9e9..2183d8b5f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java @@ -78,9 +78,9 @@ public GDo visitForSubprotocolInlining(ProtocolDefInliner builder, GDo child) { CommonTree blame = child.getSource(); SubprotoSig subsig = builder.peekStack(); - RecVarNode recvar = (RecVarNode) builder.job.config.af.SimpleNameNode(blame, + RecVarNode recvar = (RecVarNode) builder.lang.config.af.SimpleNameNode(blame, RecVarKind.KIND, builder.getSubprotocolRecVar(subsig).toString()); - GContinue inlined = builder.job.config.af.GContinue(blame, recvar); + GContinue inlined = builder.lang.config.af.GContinue(blame, recvar); builder.pushEnv(builder.popEnv().setTranslation(inlined)); return child; } @@ -93,12 +93,12 @@ public GDo leaveProtocolInlining(ScribNode parent, ScribNode child, { CommonTree blame = visited.getSource(); SubprotoSig subsig = inl.peekStack(); - RecVarNode recvar = (RecVarNode) inl.job.config.af.SimpleNameNode(blame, + RecVarNode recvar = (RecVarNode) inl.lang.config.af.SimpleNameNode(blame, RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString()); GInteractionSeq gis = (GInteractionSeq) (((InlineProtocolEnv) inl .peekEnv()).getTranslation()); - GProtocolBlock gb = inl.job.config.af.GProtocolBlock(blame, gis); - GRecursion inlined = inl.job.config.af.GRecursion(blame, recvar, gb); + GProtocolBlock gb = inl.lang.config.af.GProtocolBlock(blame, gis); + GRecursion inlined = inl.lang.config.af.GRecursion(blame, recvar, gb); inl.pushEnv(inl.popEnv().setTranslation(inlined)); inl.removeSubprotocolRecVar(subsig); } @@ -117,7 +117,7 @@ public void enterProjection(ScribNode parent, ScribNode child, Projector proj) { // For correct name mangling, need to use the parameter corresponding to the self argument // N.B. -- this depends on Projector not following the Subprotocol pattern, otherwise self is wrong - Role param = gd.getTargetRoleParameter(proj.job.getContext(), + Role param = gd.getTargetRoleParameter(proj.lang.getContext(), proj.getModuleContext(), self); proj.pushSelf(param); } @@ -139,9 +139,9 @@ public GDo leaveProjection(ScribNode parent, ScribNode child, Projector proj, { ModuleContext mc = proj.getModuleContext(); LProtocolNameNode target = Projector.makeProjectedFullNameNode( - proj.job.config.af, gd.getProtocolNameNode().getSource(), + proj.lang.config.af, gd.getProtocolNameNode().getSource(), gd.getTargetProtocolDeclFullName(mc), popped); - projection = gd.project(proj.job.config.af, self, target); + projection = gd.project(proj.lang.config.af, self, target); // FIXME: do guarded recursive subprotocol checking (i.e. role is used during chain) in reachability checking? -- required role-usage makes local choice subject inference easier, but is restrictive (e.g. proto(A, B, C) { choice at A {A->B.do Proto(A,B,C)} or {A->B.B->C} })) } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java index 22e0f0466..d57af91b3 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java @@ -72,7 +72,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, gins.add((GSessionNode) inlined); } } - GInteractionSeq inlined = inl.job.config.af.GInteractionSeq(gis.getSource(), + GInteractionSeq inlined = inl.lang.config.af.GInteractionSeq(gis.getSource(), gins); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (GInteractionSeq) ScribDelBase.popAndSetVisitorEnv(this, inl, gis); @@ -112,7 +112,7 @@ else if (ln != null) // null is used for empty projection lis.clear(); } }*/ - LInteractionSeq projection = gis.project(proj.job.config.af, + LInteractionSeq projection = gis.project(proj.lang.config.af, proj.peekSelf(), lis); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GInteractionSeq) ScribDelBase.popAndSetVisitorEnv(this, proj, gis); @@ -156,6 +156,6 @@ public GInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, .getInteractionChildren().stream() : Stream.of(gi)) .collect(Collectors.toList()); - return rem.job.config.af.GInteractionSeq(gis.getSource(), gins); + return rem.lang.config.af.GInteractionSeq(gis.getSource(), gins); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java index 75b6b189e..6f73fa3ab 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -109,7 +109,7 @@ public ScribNode leaveProjection(ScribNode parent, ScribNode child, { GMessageTransfer gmt = (GMessageTransfer) visited; Role self = proj.peekSelf(); - LScribNode projection = gmt.project(proj.job.config.af, self); + LScribNode projection = gmt.project(proj.lang.config.af, self); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GMessageTransfer) GSimpleInteractionNodeDel.super.leaveProjection( parent, child, proj, gmt); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java index a8cd417e4..09c72640e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java @@ -46,7 +46,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, GInteractionSeq seq = (GInteractionSeq) ((InlineProtocolEnv) gpb .getInteractSeqChild().del().env()).getTranslation(); GProtocolBlock inlined = - inl.job.config.af.GProtocolBlock(gpb.getSource(), seq); + inl.lang.config.af.GProtocolBlock(gpb.getSource(), seq); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (GProtocolBlock) ScribDelBase.popAndSetVisitorEnv(this, inl, gpb); } @@ -68,7 +68,7 @@ public GProtocolBlock leaveProjection(ScribNode parent, ScribNode child, .env()).getProjection(); //((GInteractionSeqDel) gpb.seq.del()).project(gpb.getInteractionSeq(), self); LProtocolBlock projection = - gpb.project(proj.job.config.af, proj.peekSelf(), seq); + gpb.project(proj.lang.config.af, proj.peekSelf(), seq); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GProtocolBlock) ScribDelBase.popAndSetVisitorEnv(this, proj, gpb); } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index b87b208f6..e7135a986 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -133,9 +133,9 @@ public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, public GProtocolDecl leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribException { - AstFactory af = proj.job.config.af; + AstFactory af = proj.lang.config.af; - Module root = proj.job.getContext().getModule(proj.getModuleContext().root); + Module root = proj.lang.getContext().getModule(proj.getModuleContext().root); GProtocolDecl gpd = (GProtocolDecl) visited; GProtocolHeader gph = gpd.getHeaderChild(); Role self = proj.peekSelf(); @@ -188,9 +188,9 @@ public void enterValidation(ScribNode parent, ScribNode child, else { GProtocol.validateByScribble(checker.job2, fullname, true); - if (!checker.job.config.fair) + if (!checker.lang.config.fair) { - checker.job.debugPrintln( + checker.lang.debugPrintln( "(" + fullname + ") Validating with \"unfair\" output choices.. "); GProtocol.validateByScribble(checker.job2, fullname, false); // TODO: only need to check progress, not full validation } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java index 70283a50a..d7fcd3abf 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java @@ -66,12 +66,12 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, System.out.println("ccc2: " + visited); //...HERE: update AF to ANTLR nodes - RecVarNode recvar = (RecVarNode) inl.job.config.af.SimpleNameNode(blame, + RecVarNode recvar = (RecVarNode) inl.lang.config.af.SimpleNameNode(blame, RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString()); - GRecursion rec = inl.job.config.af.GRecursion(blame, recvar, block); - GInteractionSeq gis = inl.job.config.af.GInteractionSeq(blame, Arrays.asList(rec)); - GProtocolDef inlined = inl.job.config.af.GProtocolDef(def.getSource(), - inl.job.config.af.GProtocolBlock(blame, gis)); + GRecursion rec = inl.lang.config.af.GRecursion(blame, recvar, block); + GInteractionSeq gis = inl.lang.config.af.GInteractionSeq(blame, Arrays.asList(rec)); + GProtocolDef inlined = inl.lang.config.af.GProtocolDef(def.getSource(), + inl.lang.config.af.GProtocolBlock(blame, gis)); inl.pushEnv(inl.popEnv().setTranslation(inlined)); GProtocolDefDel copy = setInlinedProtocolDef(inlined); return (GProtocolDef) ScribDelBase.popAndSetVisitorEnv(this, inl, @@ -94,7 +94,7 @@ public GProtocolDef leaveProjection(ScribNode parent, ScribNode child, LProtocolBlock block = (LProtocolBlock) ((ProjectionEnv) gpd.getBlockChild() .del().env()).getProjection(); LProtocolDef projection = - gpd.project(proj.job.config.af, proj.peekSelf(), block); + gpd.project(proj.lang.config.af, proj.peekSelf(), block); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GProtocolDef) ScribDelBase.popAndSetVisitorEnv(this, proj, gpd); } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java index c9f3920f6..2a7727507 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java @@ -55,7 +55,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, GProtocolBlock block = (GProtocolBlock) ((InlineProtocolEnv) gr .getBlockChild().del().env()).getTranslation(); GRecursion inlined = - inl.job.config.af.GRecursion(gr.getSource(), recvar, block); + inl.lang.config.af.GRecursion(gr.getSource(), recvar, block); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (GRecursion) super.leaveProtocolInlining(parent, child, inl, gr); } @@ -84,7 +84,7 @@ public GRecursion leaveProjection(ScribNode parent, ScribNode child, .getProjection(); //((GProtocolBlockDel) gr.block.del()).project(gr.getBlock(), self); LRecursion projection = - gr.project(proj.job.config.af, proj.peekSelf(), block); + gr.project(proj.lang.config.af, proj.peekSelf(), block); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GRecursion) GCompoundInteractionNodeDel.super.leaveProjection( parent, child, proj, gr); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java index 5ba74d5b7..3e543df73 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java @@ -90,7 +90,7 @@ public ScribNode leaveProjection(ScribNode parent, ScribNode child, { GWrap gw = (GWrap) visited; Role self = proj.peekSelf(); - LScribNode projection = gw.project(proj.job.config.af, self); + LScribNode projection = gw.project(proj.lang.config.af, self); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GWrap) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gw); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java index 154e58d00..ad4ca5158 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java @@ -46,7 +46,7 @@ public LAccept leaveEGraphBuilding(ScribNode parent, ScribNode child, ? ((MessageSigNode) msg).getPayloadListChild().toPayload() : Payload.EMPTY_PAYLOAD; builder.util.addEdge(builder.util.getEntry(), - builder.job.config.ef.newEAccept(peer, mid, payload), + builder.lang.config.ef.newEAccept(peer, mid, payload), builder.util.getExit()); return (LAccept) super.leaveEGraphBuilding(parent, child, builder, la); } @@ -80,7 +80,7 @@ public LAccept leaveExplicitCorrelationCheck(ScribNode parent, if (!env.canAccept()) { //throw new ScribbleException("Invalid accept action: " + la); - checker.job.warningPrintln("Session correlation warning for: " + la); + checker.lang.warningPrintln("Session correlation warning for: " + la); } checker.pushEnv(env.disableAccept()); return la; diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java index e902e7083..1805d5341 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java @@ -118,12 +118,12 @@ public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, // self not recorded -- can derive from LProtocolDecl RoleDeclList //throw new RuntimeException("Shouldn't get in here: " + subjs); } - RoleNode subj = (RoleNode) fixer.job.config.af.SimpleNameNode(null, RoleKind.KIND, // CHECKME? null source OK? + RoleNode subj = (RoleNode) fixer.lang.config.af.SimpleNameNode(null, RoleKind.KIND, // CHECKME? null source OK? //blocks.get(0).getInteractionSeq().getInteractions().get(0).inferLocalChoiceSubject(fixer).toString()); subjs.iterator().next().toString()); fixer.setChoiceSubject(subj.toName()); LChoice projection = - fixer.job.config.af.LChoice(lc.getSource(), subj, blocks); + fixer.lang.config.af.LChoice(lc.getSource(), subj, blocks); return projection; } @@ -138,7 +138,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, .getTranslation()) .collect(Collectors.toList()); RoleNode subj = lc.getSubjectChild().clone();//inl.job.af); - LChoice inlined = inl.job.config.af.LChoice(lc.getSource(), subj, blocks); + LChoice inlined = inl.lang.config.af.LChoice(lc.getSource(), subj, blocks); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (LChoice) super.leaveProtocolInlining(parent, child, inl, lc); } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java index 39b781491..e1a405820 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java @@ -43,7 +43,7 @@ public LContinue leaveProtocolInlining(ScribNode parent, ScribNode child, LContinue lc = (LContinue) visited; RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) lc.getRecVarChild() .del().env()).getTranslation(); - LContinue inlined = inl.job.config.af.LContinue(lc.getSource(), recvar); + LContinue inlined = inl.lang.config.af.LContinue(lc.getSource(), recvar); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (LContinue) super.leaveProtocolInlining(parent, child, inl, lc); } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java index cc7c3a135..9266f3313 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java @@ -31,7 +31,7 @@ public LDisconnect leaveEGraphBuilding(ScribNode parent, ScribNode child, LDisconnect ld = (LDisconnect) visited; Role peer = ld.getPeerChild().toName(); builder.util.addEdge(builder.util.getEntry(), - builder.job.config.ef.newEDisconnect(peer), builder.util.getExit()); + builder.lang.config.ef.newEDisconnect(peer), builder.util.getExit()); return (LDisconnect) super.leaveEGraphBuilding(parent, child, builder, ld); } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java index 50a7494d7..d022b3c52 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java @@ -61,9 +61,9 @@ public LDo visitForSubprotocolInlining(ProtocolDefInliner builder, LDo child) { CommonTree blame = child.getSource(); // Cf., GDoDel SubprotoSig subsig = builder.peekStack(); - RecVarNode recvar = (RecVarNode) builder.job.config.af.SimpleNameNode(blame, + RecVarNode recvar = (RecVarNode) builder.lang.config.af.SimpleNameNode(blame, RecVarKind.KIND, builder.getSubprotocolRecVar(subsig).toString()); - LContinue inlined = builder.job.config.af.LContinue(blame, recvar); + LContinue inlined = builder.lang.config.af.LContinue(blame, recvar); builder.pushEnv(builder.popEnv().setTranslation(inlined)); return child; } @@ -76,12 +76,12 @@ public LDo leaveProtocolInlining(ScribNode parent, ScribNode child, { CommonTree blame = visited.getSource(); // Cf., GDoDel SubprotoSig subsig = dinlr.peekStack(); - RecVarNode recvar = (RecVarNode) dinlr.job.config.af.SimpleNameNode(blame, + RecVarNode recvar = (RecVarNode) dinlr.lang.config.af.SimpleNameNode(blame, RecVarKind.KIND, dinlr.getSubprotocolRecVar(subsig).toString()); LInteractionSeq gis = (LInteractionSeq) (((InlineProtocolEnv) dinlr .peekEnv()).getTranslation()); - LProtocolBlock gb = dinlr.job.config.af.LProtocolBlock(blame, gis); - LRecursion inlined = dinlr.job.config.af.LRecursion(blame, recvar, gb); + LProtocolBlock gb = dinlr.lang.config.af.LProtocolBlock(blame, gis); + LRecursion inlined = dinlr.lang.config.af.LRecursion(blame, recvar, gb); dinlr.pushEnv(dinlr.popEnv().setTranslation(inlined)); dinlr.removeSubprotocolRecVar(subsig); } @@ -96,7 +96,7 @@ public LDo leaveProtocolInlining(ScribNode parent, ScribNode child, throws ScribException // CHECKME: similar needed for non-role args? Or all params always known? (not ideal for distributed?) { - LangContext jc = fixer.job.getContext(); + LangContext jc = fixer.lang.getContext(); LDo ld = (LDo) visited; RoleArgList roleList = ld.getRoleListChild(); LProtocolDecl lpd = ld.getTargetProtocolDecl(jc, fixer.getModuleContext()); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java index 0fc159e49..e22c2828e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java @@ -70,7 +70,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, } } LInteractionSeq inlined = - inl.job.config.af.LInteractionSeq(lis.getSource(), lins); + inl.lang.config.af.LInteractionSeq(lis.getSource(), lins); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (LInteractionSeq) ScribDelBase.popAndSetVisitorEnv(this, inl, lis); } @@ -156,6 +156,6 @@ public LInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, .getInteractionChildren().stream() : Stream.of(li)) .collect(Collectors.toList()); - return rem.job.config.af.LInteractionSeq(lis.getSource(), lins); + return rem.lang.config.af.LInteractionSeq(lis.getSource(), lins); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java index b0c72e4dc..a474a9103 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java @@ -60,14 +60,14 @@ public ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, .filter(rd -> occs.contains(rd.getDeclName())) .collect(Collectors.toList()); LProtocolHeader tmp = lpd.getHeaderChild(); - RoleDeclList rdl = fixer.job.config.af + RoleDeclList rdl = fixer.lang.config.af .RoleDeclList(tmp.getRoleDeclListChild().getSource(), rds); LProtocolHeader hdr = tmp.reconstruct(tmp.getNameNodeChild(), rdl, tmp.getParamDeclListChild()); ProtocolModList mods = lpd.getModifierListChild(); // CHECKME: erase source? LProtocolDecl fixed = lpd.reconstruct(mods, hdr, lpd.getDefChild()); - fixer.job.debugPrintln("\n[DEBUG] Projected " + getSourceProtocol() + fixer.lang.debugPrintln("\n[DEBUG] Projected " + getSourceProtocol() + " for " + getSelfRole() + ":\n" + fixed); return super.leaveProjectedRoleDeclFixing(parent, child, fixer, fixed); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java index a24d90c17..eb9afb97d 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java @@ -32,7 +32,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, LProtocolBlock lpb = (LProtocolBlock) visited; LInteractionSeq seq = (LInteractionSeq) ((InlineProtocolEnv) lpb .getInteractSeqChild().del().env()).getTranslation(); - LProtocolBlock inlined = inl.job.config.af.LProtocolBlock(lpb.getSource(), seq); + LProtocolBlock inlined = inl.lang.config.af.LProtocolBlock(lpb.getSource(), seq); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (LProtocolBlock) ScribDelBase.popAndSetVisitorEnv(this, inl, lpb); } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java index 972df2091..060d13128 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java @@ -71,7 +71,7 @@ public LProtocolDecl leaveProtocolDeclContextBuilding(ScribNode parent, public void enterEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder builder) { - builder.util.init(builder.job.config.ef.newEState(Collections.emptySet())); + builder.util.init(builder.lang.config.ef.newEState(Collections.emptySet())); // Same util is used for multiple protos, need to (re-)init each time } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java index 66f76949f..8db9d1d09 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java @@ -57,13 +57,13 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, LProtocolDef def = (LProtocolDef) visited; LProtocolBlock block = (LProtocolBlock) ((InlineProtocolEnv) def .getBlockChild().del().env()).getTranslation(); - RecVarNode recvar = (RecVarNode) inl.job.config.af.SimpleNameNode(blame, // The parent do would probably be the better source for blame + RecVarNode recvar = (RecVarNode) inl.lang.config.af.SimpleNameNode(blame, // The parent do would probably be the better source for blame RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString()); - LRecursion rec = inl.job.config.af.LRecursion(blame, recvar, block); + LRecursion rec = inl.lang.config.af.LRecursion(blame, recvar, block); LInteractionSeq lis = - inl.job.config.af.LInteractionSeq(blame, Arrays.asList(rec)); - LProtocolDef inlined = inl.job.config.af.LProtocolDef(def.getSource(), - inl.job.config.af.LProtocolBlock(blame, lis)); + inl.lang.config.af.LInteractionSeq(blame, Arrays.asList(rec)); + LProtocolDef inlined = inl.lang.config.af.LProtocolDef(def.getSource(), + inl.lang.config.af.LProtocolBlock(blame, lis)); inl.pushEnv(inl.popEnv().setTranslation(inlined)); LProtocolDefDel copy = setInlinedProtocolDef(inlined); return (LProtocolDef) ScribDelBase.popAndSetVisitorEnv(this, inl, diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java index 4964875a3..96b6a6346 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java @@ -40,7 +40,7 @@ public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, ? ((MessageSigNode) msg).getPayloadListChild().toPayload() : Payload.EMPTY_PAYLOAD; builder.util.addEdge(builder.util.getEntry(), - builder.job.config.ef.newEReceive(peer, mid, payload), + builder.lang.config.ef.newEReceive(peer, mid, payload), builder.util.getExit()); //builder.builder.addEdge(builder.builder.getEntry(), Receive.get(peer, mid, payload), builder.builder.getExit()); return (LReceive) super.leaveEGraphBuilding(parent, child, builder, lr); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java index ff57269fd..d3a82e05f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java @@ -57,7 +57,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, LProtocolBlock block = (LProtocolBlock) ((InlineProtocolEnv) lr .getBlockChild().del().env()).getTranslation(); LRecursion inlined = - inl.job.config.af.LRecursion(lr.getSource(), recvar, block); + inl.lang.config.af.LRecursion(lr.getSource(), recvar, block); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (LRecursion) super.leaveProtocolInlining(parent, child, inl, lr); } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java index 938e58acd..c82c4cf32 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java @@ -41,7 +41,7 @@ public LRequest leaveEGraphBuilding(ScribNode parent, ScribNode child, ? ((MessageSigNode) msg).getPayloadListChild().toPayload() : Payload.EMPTY_PAYLOAD; builder.util.addEdge(builder.util.getEntry(), - builder.job.config.ef.newERequest(peer, mid, payload), + builder.lang.config.ef.newERequest(peer, mid, payload), builder.util.getExit()); //graph.builder.addEdge(graph.builder.getEntry(), new Connect(peer), graph.builder.getExit()); ////builder.builder.addEdge(builder.builder.getEntry(), Send.get(peer, mid, payload), builder.builder.getExit()); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java index dd4c606d0..4fdb3622e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java @@ -50,7 +50,7 @@ public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, ? ((MessageSigNode) msg).getPayloadListChild().toPayload() : Payload.EMPTY_PAYLOAD; builder.util.addEdge(builder.util.getEntry(), - builder.job.config.ef.newESend(peer, mid, payload), + builder.lang.config.ef.newESend(peer, mid, payload), builder.util.getExit()); //builder.builder.addEdge(builder.builder.getEntry(), Send.get(peer, mid, payload), builder.builder.getExit()); return (LSend) super.leaveEGraphBuilding(parent, child, builder, ls); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java index fb6b9cf0c..2f19ff530 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java @@ -33,7 +33,7 @@ public LWrapClient leaveEGraphBuilding(ScribNode parent, ScribNode child, RoleNode dest = lc.getDestinationChild(); Role peer = dest.toName(); builder.util.addEdge(builder.util.getEntry(), - builder.job.config.ef.newEWrapClient(peer), builder.util.getExit()); + builder.lang.config.ef.newEWrapClient(peer), builder.util.getExit()); return (LWrapClient) super.leaveEGraphBuilding(parent, child, builder, lc); } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java index e7e88750a..5adf7c82f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java @@ -33,7 +33,7 @@ public LWrapServer leaveEGraphBuilding(ScribNode parent, ScribNode child, LWrapServer la = (LWrapServer) visited; Role peer = la.getSourceChild().toName(); builder.util.addEdge(builder.util.getEntry(), - builder.job.config.ef.newEWrapServer(peer), builder.util.getExit()); + builder.lang.config.ef.newEWrapServer(peer), builder.util.getExit()); return (LWrapServer) super.leaveEGraphBuilding(parent, child, builder, la); } diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java index cf086c663..d02d9900b 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java @@ -61,7 +61,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, RecVar rv = rn.toName(); //return super.leaveProtocolInlining(parent, child, inliner, rn.reconstruct(inliner.getCanonicalRecVarName(rv))); // No, affects the source AST //RecVarNode inlined = rn.reconstruct(inliner.getCanonicalRecVarName(rv)); - RecVarNode inlined = (RecVarNode) inliner.job.config.af.SimpleNameNode( + RecVarNode inlined = (RecVarNode) inliner.lang.config.af.SimpleNameNode( rn.getSource(), RecVarKind.KIND, inliner.getCanonicalRecVarName(rv)); inliner.pushEnv(inliner.popEnv().setTranslation(inlined)); return ScribDelBase.popAndSetVisitorEnv(this, inliner, rn); // Not done by any super diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index 12528b0de..a77ddf580 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -43,7 +43,7 @@ public class Lang private final LangContext context; // Mutable (Visitor passes replace modules) //private final SGraphBuilderUtil sgbu; - private Job job2; + private Job job; // Just take MainContext as arg? -- would need to fix Maven dependencies //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) @@ -58,7 +58,7 @@ public Lang(Map parsed, public Job toJob() throws ScribException { - if (this.job2 == null) + if (this.job == null) { Set fullmodnames = this.context.getFullModuleNames(); Set imeds = new HashSet<>(); @@ -74,9 +74,9 @@ public Job toJob() throws ScribException debugPrintln("\nParsed:\n" + gpd + "\n\nScribble intermediate:\n" + g); } } - this.job2 = new Job(imeds, this.modcs, this.config.toJobConfig()); + this.job = new Job(imeds, this.modcs, this.config.toJobConfig()); } - return this.job2; + return this.job; } /*// Scribble extensions should override these "new" methods diff --git a/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java b/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java index 16fb4da3d..84cf1ef01 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java +++ b/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java @@ -40,16 +40,16 @@ public class LangConfig public final SModelFactory sf; // N.B. MainContext is in a different non-visible (by Maven) package - public LangConfig(boolean debug, ModuleName main, boolean useOldWF, boolean noLiveness, boolean minEfsm, + public LangConfig(ModuleName mainFullname, boolean debug, boolean useOldWf, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin, AstFactory af, EModelFactory ef, SModelFactory sf) { - this.main = main; + this.main = mainFullname; //this.jUnit = jUnit; this.debug = debug; - this.useOldWf = useOldWF; + this.useOldWf = useOldWf; this.noProgress = noLiveness; this.minEfsm = minEfsm; this.fair = fair; diff --git a/scribble-ast/src/main/java/org/scribble/lang/LangContext.java b/scribble-ast/src/main/java/org/scribble/lang/LangContext.java index 6218ea463..10829236b 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/LangContext.java +++ b/scribble-ast/src/main/java/org/scribble/lang/LangContext.java @@ -28,7 +28,7 @@ // Mutable: projections, graphs, etc are added mutably later -- replaceModule also mutable setter -- "users" get this from the Job and expect to setter mutate "in place" public class LangContext { - public final Lang job; + public final Lang lang; //public final ModuleName main; // The "main" root module from MainContext @@ -37,16 +37,16 @@ public class LangContext // CHECKME: separate original parsed from "working set"? private final Map parsed;// = new HashMap<>(); - protected LangContext(Lang job, Map parsed)//, ModuleName main) + protected LangContext(Lang lang, Map parsed)//, ModuleName main) { - this.job = job; + this.lang = lang; this.parsed = new HashMap(parsed); } public Module getMainModule() { - return getModule(this.job.config.main); + return getModule(this.lang.config.main); } // Used by Job for pass running, includes projections (e.g. for reachability checking) diff --git a/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java index c7bef0817..e821b414c 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java @@ -20,13 +20,13 @@ // Pattern: node accepts visitor and calls visitor back (standard visitor pattern -- adding a new operation doesn't affect the Ast classes), but then visitor delegates back to node delegate (so routines for handling each node type not centralised in visitor, but decentralised to delegates) public abstract class AstVisitor { - public final Lang job; // Immutable except for JobContext internals + public final Lang lang; // Immutable except for JobContext internals //private ModuleContext mcontext; // Factor up to ModelVisitor? (will be null before context building) -- maybe make a ModuleVisitor - protected AstVisitor(Lang job) + protected AstVisitor(Lang lang) { - this.job = job; + this.lang = lang; } // Used by ScribNodeBase::accept diff --git a/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java index eb88cb5d2..51af7ae0f 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java @@ -23,9 +23,9 @@ // CHECKME: move to visit package? public class GTypeTranslator extends SimpleVisitor { - public GTypeTranslator(Lang job, ModuleName mod) + public GTypeTranslator(Lang lang, ModuleName mod) { - super(job, mod); + super(lang, mod); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java b/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java index 5ca718260..3aac80866 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java +++ b/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java @@ -93,9 +93,9 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribException if (visited instanceof ProtocolDecl) { ProtocolDecl pd = (ProtocolDecl) visited; - this.job.debugPrintln("\n[DEBUG] Unfolded inlined protocol " + this.lang.debugPrintln("\n[DEBUG] Unfolded inlined protocol " + pd.getFullMemberName( - this.job.getContext().getModule(getModuleContext().root)) + this.lang.getContext().getModule(getModuleContext().root)) + ":\n" + ((ProtocolDefDel) pd.getDefChild().del()) .getInlinedProtocolDef()); } diff --git a/scribble-ast/src/main/java/org/scribble/visit/ProtocolDefInliner.java b/scribble-ast/src/main/java/org/scribble/visit/ProtocolDefInliner.java index 0058db55b..b7c21064a 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/ProtocolDefInliner.java +++ b/scribble-ast/src/main/java/org/scribble/visit/ProtocolDefInliner.java @@ -87,8 +87,8 @@ public ScribNode visit(ScribNode parent, ScribNode child) throws ScribException if (visited instanceof ProtocolDecl) { ProtocolDecl pd = (ProtocolDecl) visited; - this.job.debugPrintln("\n[DEBUG] Inlined root protocol " - + pd.getFullMemberName(this.job.getContext().getModule(getModuleContext().root)) + ":\n" + this.lang.debugPrintln("\n[DEBUG] Inlined root protocol " + + pd.getFullMemberName(this.lang.getContext().getModule(getModuleContext().root)) + ":\n" + ((ProtocolDefDel) pd.getDefChild().del()).getInlinedProtocolDef()); } return leave(parent, child, visited); @@ -118,7 +118,7 @@ protected Do visitOverrideForDo(InteractionSeq parent, Do child) throws { //return (GDo) super.visitForSubprotocols(parent, child); // Duplicated from SubprotocolVisitor#visitOverrideFoDo and modified to access discarded env -- FIXME: factor out this facility better - LangContext jc = this.job.getContext(); + LangContext jc = this.lang.getContext(); ModuleContext mc = getModuleContext(); ProtocolDecl pd = child.getTargetProtocolDecl(jc, mc); diff --git a/scribble-ast/src/main/java/org/scribble/visit/SimpleVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/SimpleVisitor.java index d85dcfd7e..4a9eaddb7 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/SimpleVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/SimpleVisitor.java @@ -24,12 +24,12 @@ // TODO CHECKME: refactor AstVisitor as a SimpleVisitor? i.e., T=ScribNode ? public abstract class SimpleVisitor { - public final Lang job; + public final Lang lang; public final ModuleName mod; // fullname - public SimpleVisitor(Lang job, ModuleName fullname) + public SimpleVisitor(Lang lang, ModuleName fullname) { - this.job = job; + this.lang = lang; this.mod = fullname; } @@ -39,6 +39,6 @@ public SimpleVisitor(Lang job, ModuleName fullname) public ModuleContext getModuleContext() { - return this.job.getModuleContext(this.mod); + return this.lang.getModuleContext(this.mod); } } diff --git a/scribble-ast/src/main/java/org/scribble/visit/SubprotocolVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/SubprotocolVisitor.java index 01151603b..3dc3d6295 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/SubprotocolVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/SubprotocolVisitor.java @@ -117,7 +117,7 @@ protected Do visitOverrideForDo(ScribNode parent, Do doo) { if (!isCycle()) { - LangContext jc = this.job.getContext(); + LangContext jc = this.lang.getContext(); ModuleContext mc = getModuleContext(); ProtocolDecl pd = doo.getTargetProtocolDecl(jc, mc); @@ -145,7 +145,7 @@ protected ScribNode applySubstitutions(ScribNode n) try { return n.accept( - new Substitutor(this.job, this.rolemaps.peek(), this.argmaps.peek())); + new Substitutor(this.lang, this.rolemaps.peek(), this.argmaps.peek())); } catch (ScribException e) { @@ -248,7 +248,7 @@ private void pushSubprotocolSig(ProtocolName fullname, List roleargs, private void pushNameMaps(ProtocolName fullname, Do doo) { - ProtocolDecl pd = this.job.getContext().getModule(fullname.getPrefix()) + ProtocolDecl pd = this.lang.getContext().getModule(fullname.getPrefix()) .getProtocolDeclChild(fullname.getSimpleName()); ProtocolHeader hdr = pd.getHeaderChild(); this.rolemaps.push(makeRoleSubsMap(this.rolemaps.get(0), diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java b/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java index 169de188c..9574e5cdc 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java @@ -57,12 +57,12 @@ public ScribNode visit(ScribNode parent, ScribNode child) List ins = lis.getInteractionChildren(); if (ins.get(0) instanceof LDo) // Unlike GRecursion.prune, to-prune "do" could be followed by a continuation? { - LangContext jc = this.job.getContext(); + LangContext jc = this.lang.getContext(); LDo ld = (LDo) ins.get(0); LProtocolDecl lpd = ld.getTargetProtocolDecl(jc, getModuleContext()); UnguardedChoiceDoProjectionChecker checker = new UnguardedChoiceDoProjectionChecker( - this.job, + this.lang, ((ModuleDel) jc .getModule(ld.getProtocolNameNode().toName().getPrefix()).del()) .getModuleContext(), @@ -78,8 +78,8 @@ public ScribNode visit(ScribNode parent, ScribNode child) if (env.subjs.isEmpty()) // Prune check { // Supports singleton case - return this.job.config.af.LProtocolBlock(lb.getSource(), - this.job.config.af.LInteractionSeq(lis.getSource(), + return this.lang.config.af.LProtocolBlock(lb.getSource(), + this.lang.config.af.LInteractionSeq(lis.getSource(), ins.subList(1, ins.size()))); } } diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java b/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java index 6f65d23d9..42aa0c866 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java +++ b/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java @@ -63,7 +63,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) } } - if (this.job.config.useOldWf) + if (this.lang.config.useOldWf) { if (child instanceof Choice) // Only needed for old WF (for distinct enabling message checking) // FIXME: maybe move connectedness checking to a separate pass, i.e. vanilla UnfoldingVisitor (if retained as syntactic check) { diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index a433447b2..5ffb0ca2e 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -43,9 +43,9 @@ import org.scribble.main.resource.locator.ResourceLocator; import org.scribble.util.AntlrSourceException; import org.scribble.util.RuntimeScribException; +import org.scribble.util.ScribException; import org.scribble.util.ScribParserException; import org.scribble.util.ScribUtil; -import org.scribble.util.ScribException; public class CommandLine { @@ -88,17 +88,17 @@ protected Main newMainContext() List impaths = this.args.containsKey(CLArgFlag.IMPORT_PATH) ? CommandLine.parseImportPaths(this.args.get(CLArgFlag.IMPORT_PATH)[0]) : Collections.emptyList(); - ResourceLocator locator = new DirectoryResourceLocator(impaths); if (this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) { - return new Main(debug, locator, this.args.get(CLArgFlag.INLINE_MAIN_MOD)[0], useOldWF, noLiveness, minEfsm, fair, + return new Main(this.args.get(CLArgFlag.INLINE_MAIN_MOD)[0], debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); } else { + ResourceLocator locator = new DirectoryResourceLocator(impaths); Path mainpath = CommandLine.parseMainPath(this.args.get(CLArgFlag.MAIN_MOD)[0]); //return new MainContext(jUnit, debug, locator, mainpath, useOldWF, noLiveness); - return new Main(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, + return new Main(locator, debug, mainpath, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); } } @@ -150,11 +150,11 @@ protected void runBody() throws ScribParserException, AntlrSourceException, CommandLineException { Main mc = newMainContext(); // Represents current instance of tooling for given CL args - Lang job = mc.newJob(); // A Job is some series of passes performed on each Module in the MainContext (e.g., cf. Job::runVisitorPass) + Lang lang = mc.newLang(); // A Job is some series of passes performed on each Module in the MainContext (e.g., cf. Job::runVisitorPass) ScribException fail = null; try { - doValidationTasks(job); // FIXME: refactor into job + doValidationTasks(lang); // FIXME: refactor into job } catch (ScribException x) { @@ -164,7 +164,7 @@ protected void runBody() // Attempt certain "output tasks" even if above failed, in case can still do some useful output (hacky) try { - tryOutputTasks(job); // FIXME: refactor into job + tryOutputTasks(lang); // FIXME: refactor into job } catch (ScribException x) { @@ -180,11 +180,11 @@ protected void runBody() } // "Non-attemptable" output tasks: should not attempt these if any previous failure - doNonAttemptableOutputTasks(job); + doNonAttemptableOutputTasks(lang); } // AntlrSourceException super of ScribbleException -- needed for, e.g., AssrtCoreSyntaxException - protected void doValidationTasks(Lang job) + protected void doValidationTasks(Lang lang) throws AntlrSourceException, ScribParserException, // Latter in case needed by subclasses CommandLineException { @@ -192,55 +192,56 @@ protected void doValidationTasks(Lang job) if (this.args.containsKey(F17CLArgFlag.F17)) { GProtocolName simpname = new GProtocolName(this.args.get(ArgFlag.F17)[0]); - F17Main.parseAndCheckWF(job, simpname); // Includes base passes + F17Main.parseAndCheckWF(lang, simpname); // Includes base passes } // Base Scribble else*/ { - job.runContextBuildingPasses(); // TODO: refactor, w.r.t. below - job.toJob().checkWellFormedness(); + lang.runContextBuildingPasses(); // TODO: refactor, w.r.t. below + lang.toJob().checkWellFormedness(); } + } - protected void tryOutputTasks(Lang job) + protected void tryOutputTasks(Lang lang) throws CommandLineException, ScribException { // Following must be ordered appropriately -- ? if (this.args.containsKey(CLArgFlag.PROJECT)) { - printProjections(job); + printProjections(lang); } if (this.args.containsKey(CLArgFlag.EFSM)) { - printEGraph(job, true, true); + printEGraph(lang, true, true); } if (this.args.containsKey(CLArgFlag.VALIDATION_EFSM)) { - printEGraph(job, false, true); + printEGraph(lang, false, true); } if (this.args.containsKey(CLArgFlag.UNFAIR_EFSM)) { - printEGraph(job, false, false); + printEGraph(lang, false, false); } if (this.args.containsKey(CLArgFlag.EFSM_PNG)) { - drawEGraph(job, true, true); + drawEGraph(lang, true, true); } if (this.args.containsKey(CLArgFlag.VALIDATION_EFSM_PNG)) { - drawEGraph(job, false, true); + drawEGraph(lang, false, true); } if (this.args.containsKey(CLArgFlag.UNFAIR_EFSM_PNG)) { - drawEGraph(job, false, false); + drawEGraph(lang, false, false); } if (this.args.containsKey(CLArgFlag.SGRAPH) || this.args.containsKey(CLArgFlag.SGRAPH_PNG) || this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH) || this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH_PNG)) { - if (job.config.useOldWf) + if (lang.config.useOldWf) { throw new CommandLineException( "Global model flag(s) incompatible with: " @@ -248,57 +249,57 @@ protected void tryOutputTasks(Lang job) } if (this.args.containsKey(CLArgFlag.SGRAPH)) { - printSGraph(job, true); + printSGraph(lang, true); } if (this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH)) { - printSGraph(job, false); + printSGraph(lang, false); } if (this.args.containsKey(CLArgFlag.SGRAPH_PNG)) { - drawSGraph(job, true); + drawSGraph(lang, true); } if (this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH_PNG)) { - drawSGraph(job, false); + drawSGraph(lang, false); } } } // TODO: rename - protected void doNonAttemptableOutputTasks(Lang job) + protected void doNonAttemptableOutputTasks(Lang lang) throws ScribException, CommandLineException { if (this.args.containsKey(CLArgFlag.SESS_API_GEN)) { - outputSessionApi(job); + outputSessionApi(lang); } if (this.args.containsKey(CLArgFlag.SCHAN_API_GEN)) { - outputStateChannelApi(job); + outputStateChannelApi(lang); } if (this.args.containsKey(CLArgFlag.API_GEN)) { - outputEndpointApi(job); + outputEndpointApi(lang); } if (this.args.containsKey(CLArgFlag.ED_API_GEN)) { - outputEventDrivenApi(job); + outputEventDrivenApi(lang); } } // TODO: option to write to file, like classes - private void printProjections(Lang job) + private void printProjections(Lang lang) throws CommandLineException, ScribException { - LangContext jobc = job.getContext(); - Job job2 = job.toJob(); + LangContext jobc = lang.getContext(); + Job job = lang.toJob(); String[] args = this.args.get(CLArgFlag.PROJECT); for (int i = 0; i < args.length; i += 2) { GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); Role role = checkRoleArg(jobc, fullname, args[i+1]); - Map projections = job2.getProjections(fullname, + Map projections = job.getProjections(fullname, role); // FIXME: output Module System.out.println("\n" + projections.values().stream() .map(p -> p.toString()).collect(Collectors.joining("\n\n"))); @@ -308,10 +309,10 @@ private void printProjections(Lang job) // dot/aut text output // forUser: true means for API gen and general user info (may be minimised), false means for validation (non-minimised, fair or unfair) // (forUser && !fair) should not hold, i.e. unfair doesn't make sense if forUser - private void printEGraph(Lang job, boolean forUser, boolean fair) + private void printEGraph(Lang lang, boolean forUser, boolean fair) throws ScribException, CommandLineException { - LangContext jobc = job.getContext(); + LangContext jobc = lang.getContext(); String[] args = forUser ? this.args.get(CLArgFlag.EFSM) : (fair @@ -321,7 +322,7 @@ private void printEGraph(Lang job, boolean forUser, boolean fair) { GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); Role role = checkRoleArg(jobc, fullname, args[i+1]); - EGraph fsm = getEGraph(job, fullname, role, forUser, fair); + EGraph fsm = getEGraph(lang, fullname, role, forUser, fair); String out = this.args.containsKey(CLArgFlag.AUT) ? fsm.toAut() : fsm.toDot(); @@ -329,10 +330,10 @@ private void printEGraph(Lang job, boolean forUser, boolean fair) } } - private void drawEGraph(Lang job, boolean forUser, boolean fair) + private void drawEGraph(Lang lang, boolean forUser, boolean fair) throws ScribException, CommandLineException { - LangContext jobc = job.getContext(); + LangContext jobc = lang.getContext(); String[] args = forUser ? this.args.get(CLArgFlag.EFSM_PNG) : (fair @@ -343,18 +344,18 @@ private void drawEGraph(Lang job, boolean forUser, boolean fair) GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); Role role = checkRoleArg(jobc, fullname, args[i+1]); String png = args[i+2]; - EGraph fsm = getEGraph(job, fullname, role, forUser, fair); + EGraph fsm = getEGraph(lang, fullname, role, forUser, fair); runDot(fsm.toDot(), png); } } // Endpoint graphs are "inlined", so only a single graph is built (cf. projection output) - private EGraph getEGraph(Lang job, GProtocolName fullname, Role role, + private EGraph getEGraph(Lang lang, GProtocolName fullname, Role role, boolean forUser, boolean fair) throws ScribException, CommandLineException { - LangContext jobc = job.getContext(); - JobContext jobc2 = job.toJob().getContext(); + LangContext jobc = lang.getContext(); + JobContext jobc2 = lang.toJob().getContext(); GProtocolDecl gpd = (GProtocolDecl) jobc.getMainModule() .getProtocolDeclChild(fullname.getSimpleName()); if (gpd == null || !gpd.getHeaderChild().getRoleDeclListChild().getRoles() @@ -385,17 +386,17 @@ private EGraph getEGraph(Lang job, GProtocolName fullname, Role role, return graph; } - private void printSGraph(Lang job, boolean fair) + private void printSGraph(Lang lang, boolean fair) throws ScribException, CommandLineException { - LangContext jobc = job.getContext(); + LangContext jobc = lang.getContext(); String[] args = fair ? this.args.get(CLArgFlag.SGRAPH) : this.args.get(CLArgFlag.UNFAIR_SGRAPH); for (int i = 0; i < args.length; i += 1) { GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); - SGraph model = getSGraph(job, fullname, fair); + SGraph model = getSGraph(lang, fullname, fair); String out = this.args.containsKey(CLArgFlag.AUT) ? model.toAut() : model.toDot(); @@ -403,10 +404,10 @@ private void printSGraph(Lang job, boolean fair) } } - private void drawSGraph(Lang job, boolean fair) + private void drawSGraph(Lang lang, boolean fair) throws ScribException, CommandLineException { - LangContext jobc = job.getContext(); + LangContext jobc = lang.getContext(); String[] args = fair ? this.args.get(CLArgFlag.SGRAPH_PNG) : this.args.get(CLArgFlag.UNFAIR_SGRAPH_PNG); @@ -414,15 +415,15 @@ private void drawSGraph(Lang job, boolean fair) { GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); String png = args[i+1]; - SGraph model = getSGraph(job, fullname, fair); + SGraph model = getSGraph(lang, fullname, fair); runDot(model.toDot(), png); } } - private static SGraph getSGraph(Lang job, GProtocolName fullname, boolean fair) + private static SGraph getSGraph(Lang lang, GProtocolName fullname, boolean fair) throws ScribException { - JobContext jobc2 = job.toJob().getContext(); + JobContext jobc2 = lang.toJob().getContext(); SGraph model = fair ? jobc2.getSGraph(fullname) : jobc2.getUnfairSGraph(fullname); @@ -434,12 +435,12 @@ private static SGraph getSGraph(Lang job, GProtocolName fullname, boolean fair) return model; } - private void outputEndpointApi(Lang job) + private void outputEndpointApi(Lang lang) throws ScribException, CommandLineException { - LangContext jobc = job.getContext(); + LangContext jobc = lang.getContext(); String[] args = this.args.get(CLArgFlag.API_GEN); - JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // FIXME: refactor (generalise -- use new API) + JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // FIXME: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) { GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); @@ -452,12 +453,12 @@ private void outputEndpointApi(Lang job) } } - private void outputSessionApi(Lang job) + private void outputSessionApi(Lang lang) throws ScribException, CommandLineException { - LangContext jobc = job.getContext(); + LangContext jobc = lang.getContext(); String[] args = this.args.get(CLArgFlag.SESS_API_GEN); - JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // TODO: refactor (generalise -- use new API) + JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // TODO: refactor (generalise -- use new API) for (String fullname : args) { GProtocolName gpn = checkGlobalProtocolArg(jobc, fullname); @@ -466,12 +467,12 @@ private void outputSessionApi(Lang job) } } - private void outputStateChannelApi(Lang job) + private void outputStateChannelApi(Lang lang) throws ScribException, CommandLineException { - LangContext jobc = job.getContext(); + LangContext jobc = lang.getContext(); String[] args = this.args.get(CLArgFlag.SCHAN_API_GEN); - JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // TODO: refactor (generalise -- use new API) + JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // TODO: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) { GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); @@ -482,12 +483,12 @@ private void outputStateChannelApi(Lang job) } } - private void outputEventDrivenApi(Lang job) + private void outputEventDrivenApi(Lang lang) throws ScribException, CommandLineException { - LangContext jobc = job.getContext(); + LangContext jobc = lang.getContext(); String[] args = this.args.get(CLArgFlag.ED_API_GEN); - /*JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // FIXME: refactor (generalise -- use new API) + /*JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // FIXME: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) { GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); @@ -501,7 +502,7 @@ private void outputEventDrivenApi(Lang job) { GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); Role self = checkRoleArg(jobc, fullname, args[i+1]); - CBEndpointApiGenerator3 edgen = new CBEndpointApiGenerator3(job, fullname, + CBEndpointApiGenerator3 edgen = new CBEndpointApiGenerator3(lang, fullname, self, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); Map out = edgen.build(); outputClasses(out); @@ -584,7 +585,7 @@ protected static GProtocolName checkGlobalProtocolArg(LangContext jobc, throw new CommandLineException( "Invalid aux protocol specified as root: " + simpname); } - return new GProtocolName(jobc.job.config.main, simpgpn); // TODO: take Job param instead of Jobcontext + return new GProtocolName(jobc.lang.config.main, simpgpn); // TODO: take Job param instead of Jobcontext } protected static Role checkRoleArg(LangContext jobc, diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java index 450b31f72..f81593279 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java @@ -23,16 +23,16 @@ // Basic pattern: use TypeGenerators to create all necessary TypeBuilders and cache them, and generateApi should call build on all as a final step public abstract class ApiGen { - public final Lang job; - public final Job job2; + public final Lang lang; + public final Job job; public final GProtocolName gpn; // full name public ApiGen(Lang job, GProtocolName fullname) { - this.job = job; + this.lang = job; try { - this.job2 = job.toJob(); + this.job = job.toJob(); } catch (ScribException e) // TODO: refactor { @@ -47,6 +47,6 @@ public ApiGen(Lang job, GProtocolName fullname) public Lang getJob() { - return this.job; + return this.lang; } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java index 261a9d7cd..12e0f7c67 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java @@ -27,17 +27,17 @@ public class JEndpointApiGenerator { - public final Lang job; + public final Lang lang; - public JEndpointApiGenerator(Lang job) + public JEndpointApiGenerator(Lang lang) { - this.job = job; + this.lang = lang; } public Map generateSessionApi(GProtocolName fullname) throws ScribException { - this.job.debugPrintln("\n[Java API gen] Running " + SessionApiGenerator.class + " for " + fullname); - SessionApiGenerator sg = new SessionApiGenerator(this.job, fullname); // FIXME: reuse? + this.lang.debugPrintln("\n[Java API gen] Running " + SessionApiGenerator.class + " for " + fullname); + SessionApiGenerator sg = new SessionApiGenerator(this.lang, fullname); // FIXME: reuse? Map map = sg.generateApi(); // filepath -> class source return map; } @@ -50,8 +50,8 @@ public Map generateStateChannelApi(GProtocolName fullname, Role { buildGraph(fullname, self); }*/ - job.debugPrintln("\n[Java API gen] Running " + StateChannelApiGenerator.class + " for " + fullname + "@" + self); - StateChannelApiGenerator apigen = new StateChannelApiGenerator(this.job, fullname, self); + lang.debugPrintln("\n[Java API gen] Running " + StateChannelApiGenerator.class + " for " + fullname + "@" + self); + StateChannelApiGenerator apigen = new StateChannelApiGenerator(this.lang, fullname, self); IOInterfacesGenerator iogen = null; try { @@ -60,7 +60,7 @@ public Map generateStateChannelApi(GProtocolName fullname, Role catch (RuntimeScribException e) // FIXME: use IOInterfacesGenerator.skipIOInterfacesGeneration { //System.err.println("[Warning] Skipping I/O Interface generation for protocol featuring: " + fullname); - this.job.warningPrintln("Skipping I/O Interface generation for: " + fullname + "\n Cause: " + e.getMessage()); + this.lang.warningPrintln("Skipping I/O Interface generation for: " + fullname + "\n Cause: " + e.getMessage()); } // Construct the Generators first, to build all the types -- then call generate to "compile" all Builders to text (further building changes will not be output) Map api = new HashMap<>(); // filepath -> class source // Store results? diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index e5850ecd8..63801f8e6 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -53,8 +53,8 @@ // FIXME: consider also "expanding" nested message constructors by op first? -- and consider "partial constructors" along expansions, can they be parameterised typed? public class CBEndpointApiGenerator3 { - public final Lang job; - public final Job job2; + public final Lang lang; + public final Job job; public final GProtocolName proto; public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral @@ -62,12 +62,12 @@ public class CBEndpointApiGenerator3 //private final boolean subtypes; // Generate full hierarchy (states -> states, not just indivdual state -> cases) -- cf. ioifaces - public CBEndpointApiGenerator3(Lang job, GProtocolName fullname, Role self, boolean subtypes) + public CBEndpointApiGenerator3(Lang lang, GProtocolName fullname, Role self, boolean subtypes) { - this.job = job; + this.lang = lang; try { - this.job2 = job.toJob(); + this.job = lang.toJob(); } catch (ScribException e) // TODO: refactor { @@ -94,21 +94,21 @@ public Map build() throws ScribException // FIXME: factor out -- integrate with JEndpointApiGenerator public Map buildSessionApi() throws ScribException { - this.job.debugPrintln("\n[param-core] Running " + CBEndpointApiGenerator3.class + " for " + this.proto + "@" + this.self); + this.lang.debugPrintln("\n[param-core] Running " + CBEndpointApiGenerator3.class + " for " + this.proto + "@" + this.self); Map res = new HashMap<>(); - res.putAll(new SessionApiGenerator(this.job, this.proto).generateApi()); + res.putAll(new SessionApiGenerator(this.lang, this.proto).generateApi()); res.putAll(buildEndpointClass()); return res; } public Map buildEndpointClass() throws ScribException { - Module main = this.job.getContext().getMainModule(); + Module main = this.lang.getContext().getMainModule(); Map res = new HashMap<>(); - JobContext jobc2 = this.job2.getContext(); - EState init = (this.job.config.minEfsm + JobContext jobc2 = this.job.getContext(); + EState init = (this.lang.config.minEfsm ? jobc2.getMinimisedEGraph(this.proto, this.self) : jobc2.getEGraph(this.proto, this.self) ).init; @@ -221,7 +221,7 @@ public Map buildEndpointClass() throws ScribException }*/ // branches - LangContext jobc = this.job.getContext(); + LangContext jobc = this.lang.getContext(); for (EState s : states) { if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) @@ -502,7 +502,7 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, protected String generateStateClass(EState s, String rootPack, EStateKind kind, String stateName, String endpointName) { - Module main = this.job.getContext().getMainModule(); + Module main = this.lang.getContext().getMainModule(); String stateKind; switch (kind) @@ -999,7 +999,7 @@ protected String getMessagesPackage(String rootPack) protected MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) { return (MessageSigNameDecl) - this.job.getContext().getMainModule().getNonProtoDeclChildren().stream() // FIXME: main module? + this.lang.getContext().getMainModule().getNonProtoDeclChildren().stream() // FIXME: main module? .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(mid.toString())) .iterator().next(); } @@ -1007,7 +1007,7 @@ protected MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) //protected final Function, String> getExtName = e -> protected String getExtName(PayloadElemType e) { - String extName = this.job.getContext().getMainModule().getDataTypeDeclChild((DataType) e).extName; + String extName = this.lang.getContext().getMainModule().getDataTypeDeclChild((DataType) e).extName; return (extName.indexOf(".") != -1) ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) : extName; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index f4eeef140..3b8e3cd9d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -53,9 +53,9 @@ public class SessionApiGenerator extends ApiGen private final ClassBuilder cb = new ClassBuilder(); private final Map classes = new HashMap<>(); // All classes in same package, for protected constructor access - public SessionApiGenerator(Lang job, GProtocolName fullname) throws ScribException + public SessionApiGenerator(Lang lang, GProtocolName fullname) throws ScribException { - super(job, fullname); + super(lang, fullname); constructRoleClasses(); constructOpClasses(); constructSessionClass(); // Depends on the above two being done first @@ -181,10 +181,10 @@ private void addSingletonConstant(ClassBuilder cb, String subpack, String type) private void constructOpClasses() throws ScribException { - Module mod = this.job.getContext().getModule(this.gpn.getPrefix()); + Module mod = this.lang.getContext().getModule(this.gpn.getPrefix()); GProtocolName simpname = this.gpn.getSimpleName(); GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDeclChild(simpname); - MessageIdCollector coll = new MessageIdCollector(this.job, ((ModuleDel) mod.del()).getModuleContext()); + MessageIdCollector coll = new MessageIdCollector(this.lang, ((ModuleDel) mod.del()).getModuleContext()); gpd.accept(coll); for (MessageId mid : coll.getNames()) { @@ -197,7 +197,7 @@ private void constructOpClasses() throws ScribException private void constructRoleClasses() throws ScribException { - Module mod = this.job.getContext().getModule(this.gpn.getPrefix()); + Module mod = this.lang.getContext().getModule(this.gpn.getPrefix()); GProtocolName simpname = this.gpn.getSimpleName(); GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDeclChild(simpname); for (Role r : gpd.getRoles()) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 282018966..04b96d195 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -56,16 +56,16 @@ public class StateChannelApiGenerator extends ApiGen private Map types = new HashMap<>(); // class/iface name key - public StateChannelApiGenerator(Lang job, GProtocolName fullname, Role self) + public StateChannelApiGenerator(Lang lang, GProtocolName fullname, Role self) throws ScribException // CHECKME: APIGenerationException? { - super(job, fullname); + super(lang, fullname); this.self = self; this.lpn = Projector2.projectFullProtocolName(fullname, self); //this.init = job.getContext().getEndpointGraph(fullname, self).init; - JobContext jobc2 = this.job2.getContext(); - this.init = job.config.minEfsm + JobContext jobc2 = this.job.getContext(); + this.init = lang.config.minEfsm ? jobc2.getMinimisedEGraph(fullname, self).init : jobc2.getEGraph(fullname, self).init; @@ -209,7 +209,7 @@ protected EState getInitialState() protected Module getMainModule() { - return this.job.getContext().getMainModule(); + return this.lang.getContext().getMainModule(); } protected void addTypeDecl(TypeBuilder tb) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index 8d13cb360..5b6cf3c43 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -79,8 +79,8 @@ public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) GProtocolName fullname = apigen.getGProtocolName(); Role self = getSelf(); //EndpointState init = this.job.getContext().getEndpointGraph(fullname, self).init; - JobContext jobc2 = this.job2.getContext(); - EState init = this.job.config.minEfsm + JobContext jobc2 = this.job.getContext(); + EState init = this.lang.config.minEfsm ? jobc2.getMinimisedEGraph(fullname, self).init : jobc2.getEGraph(fullname, self).init; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index 9121eb7b6..a05886760 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -28,7 +28,7 @@ public abstract class STStateChanAPIBuilder { - public final Lang job; + public final Lang lang; public final GProtocolName gpn; public final Role role; @@ -42,10 +42,10 @@ public abstract class STStateChanAPIBuilder private Map names = new HashMap<>(); - protected STStateChanAPIBuilder(Lang job, GProtocolName gpn, Role role, EGraph graph, + protected STStateChanAPIBuilder(Lang lang, GProtocolName gpn, Role role, EGraph graph, STOutputStateBuilder ob, STReceiveStateBuilder rb, STBranchStateBuilder bb, STCaseBuilder cb, STEndStateBuilder eb) { - this.job = job; + this.lang = lang; this.gpn = gpn; this.role = role; diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java index 9c56d6099..a37089d23 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java @@ -27,6 +27,8 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; + +// Combine with SModelFactory? No point to separate? public interface EModelFactory { ESend newESend(Role peer, MessageId mid, Payload payload); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java index 814506394..3228754ae 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java @@ -28,6 +28,7 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; +// Combine with EModelFactory? No point to separate? public interface SModelFactory { SGraphBuilderUtil newSGraphBuilderUtil(); // Directly created and used by Job.buildSGraph -- cf. EGraphBuilderUtil, encapsulated by EGraphBuilder AST visitor diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index 7fe30cc77..507d04475 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -13,7 +13,6 @@ */ package org.scribble.main; // N.B. the same package is declared in core -import java.io.File; import java.nio.file.Path; import java.util.Collections; import java.util.HashMap; @@ -21,7 +20,6 @@ import java.util.Map.Entry; import java.util.stream.Collectors; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.ImportDecl; @@ -36,156 +34,36 @@ import org.scribble.lang.Lang; import org.scribble.lang.LangConfig; import org.scribble.lang.context.ModuleContextMaker; -import org.scribble.main.resource.InlineResource; import org.scribble.main.resource.Resource; import org.scribble.main.resource.loader.ScribModuleLoader; -import org.scribble.main.resource.locator.DirectoryResourceLocator; import org.scribble.main.resource.locator.ResourceLocator; import org.scribble.util.Pair; -import org.scribble.util.ScribParserException; import org.scribble.util.ScribException; +import org.scribble.util.ScribParserException; // Scribble tool context for main module // MainContext takes ResourceLocator abstractly (e.g. DirectoryResourceLocator), but because abstract Resource itself works off paths, it takes mainpath (rather than something more abstract, e.g. URI, to identify the "main" resource) // Resource and ResourceLocator should be made abstract from (file)paths (cf. use of toPath in ScribbleModuleLoader) public class Main { + //private final ResourceLocator locator; // Path -> Resource + private final ScribModuleLoader loader; // ModuleName -> Pair - // HERE FIXME: refactor constructors/init - - - // Only "manually" used here for loading main module (which should be factored out to front end) -- otherwise, only used within loader - protected final ScribAntlrWrapper antlrParser = newAntlrParser(); // Not encapsulated inside ScribbleParser, because ScribbleParser's main function is to "parse" ANTLR CommonTrees into ModelNodes - //protected final AntlrToScribParser scribParser = newScribParser(); - - protected final AstFactory af = newAstFactory(); - protected final EModelFactory ef = newEModelFactory(); - protected final SModelFactory sf = newSModelFactory(); - - //protected final JScribbleApiGen jgen; // No: API gen depends on the Job - - //public final boolean jUnit; private LangConfig config; + protected Map modcs; // Full names (like this.loaded) - private final ResourceLocator locator; // Path -> Resource - private final ScribModuleLoader loader; // sesstype.ModuleName -> Pair - - protected Map mctxts; // Full names (like this.parsed) - - // ModuleName keys are full module names -- parsed are the modules read from file, distinguished from the generated projection modules + // Keys are full names -- loaded are the modules read from file, distinguished from the generated projection modules // Resource recorded for source path - private final Map> parsed = new HashMap<>(); + private final Map> loaded + = new HashMap<>(); - // TODO: make Path abstract as e.g. URI -- locator is abstract but Path is coupled to concrete DirectoryResourceLocator - private Main(boolean debug, ResourceLocator locator, boolean useOldWF, - boolean noLiveness, boolean minEfsm, boolean fair, - boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, - boolean noValidation, boolean spin) - throws ScribParserException, ScribException + // A Scribble extension should override newLang/Antlr/Ast/ModelFactory as appropriate + public Lang newLang() { - this.locator = locator; - this.loader = new ScribModuleLoader(this.locator, this.antlrParser);//, this.scribParser); - } - - // Load main module from file system - public Main(boolean debug, ResourceLocator locator, Path mainpath, - boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, - boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, - boolean noValidation, boolean spin) - throws ScribParserException, ScribException - { - this(debug, locator, useOldWF, noLiveness, minEfsm, fair, - noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, - spin); - - // TODO: checking main module resource exists at specific location should be factored out to front-end (e.g. CommandLine) -- main module resource is specified at local front end level of abstraction, while MainContext uses abstract resource loading - //Pair p = this.loader.loadMainModule(mainpath); - Resource res = DirectoryResourceLocator.getResourceByFullPath(mainpath); - // TODO: hardcoded to DirectoryResourceLocator -- main module loading should be factored out to front end (e.g. CommandLine) - Module mod = this.antlrParser.parse(res); // Does del decoration - - // FIXME HERE: deprecate scribParser -- move ANTLR error checking out - - /*Module mod = (Module) atree;//this.scribParser.parse(atree, this.af); // TODO: rename exceptions - - /*HERE del decorator - move ast to parser? and make core/lang*/ - - //HERE: debug context building or name disamb (role node child lost)*/ - - checkMainModuleName(mainpath, mod, noValidation); - - init( - debug, locator, useOldWF, - noLiveness, minEfsm, fair, - noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, - noValidation, spin, - res, mod); - } - - // For inline module arg - public Main(boolean debug, ResourceLocator locator, String inline, - boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, - boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, - boolean noValidation, boolean spin) - throws ScribParserException, ScribException - { - this(debug, locator, useOldWF, noLiveness, minEfsm, fair, - noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, - spin); - - Resource res = new InlineResource(inline); - /*Module mod = (Module) this.scribParser - .parse(this.antlrParser.parseAntlrTree(res), this.af);*/ - Module mod = (Module) this.antlrParser.parse(res); // Does del decoration - - init( - debug, locator, useOldWF, - noLiveness, minEfsm, fair, - noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, - noValidation, spin, - res, mod); - } - - private void init( - boolean debug, ResourceLocator locator, - boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, - boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, - boolean noValidation, boolean spin, - - Resource res, Module mainmod) - throws ScribParserException, ScribException - { - - Pair p = new Pair<>(res, mainmod); - ModuleName main = p.right.getFullModuleName(); - // TODO CHECKME: main modname comes from the inlined moddecl -- check for issues if this clashes with an existing file system resource - loadAllModules(p); // Populates this.parsed - - this.config = new LangConfig(debug, main, useOldWF, noLiveness, minEfsm, - fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, - spin, this.af, this.ef, this.sf); - - Map parsed = getParsedModules(); - Map map = new HashMap<>(); - ModuleContextMaker maker = new ModuleContextMaker(); - for (ModuleName fullname : this.parsed.keySet()) - { - Pair e = this.parsed.get(fullname); - map.put(fullname, //new ModuleContext(parsed, e.right)); - maker.make(parsed, e.right)); - // CHECKME: how does this relate to the ModuleContextBuilder pass ? - } - this.mctxts = Collections.unmodifiableMap(map); + return new Lang(getLoadedModules(), this.modcs, this.config); } - // A Scribble extension should override these "new" methods as appropriate. - public Lang newJob() - { - return new Lang(this.getParsedModules(), this.mctxts, this.config); - } - - protected ScribAntlrWrapper newAntlrParser() + protected ScribAntlrWrapper newAntlr() { return new ScribAntlrWrapper(); } @@ -205,50 +83,101 @@ protected SModelFactory newSModelFactory() return new SModelFactoryImpl(); } - // Populates this.parsed - private void loadAllModules(Pair m) + // Load main module from file system + public Main(ResourceLocator locator, + boolean debug, Path mainpath, boolean useOldWF, boolean noLiveness, + boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, + boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) + throws ScribException, ScribParserException + { + this(locator); + Pair main = this.loader.loadMainModule(mainpath); + init(main, + debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, + noAcceptCorrelationCheck, noValidation, spin); + } + + // For inline module arg + public Main(String inline, + boolean debug, boolean useOldWF, boolean noLiveness, boolean minEfsm, + boolean fair, boolean noLocalChoiceSubjectCheck, + boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) + throws ScribException, ScribParserException + { + this(null); + Pair main = this.loader.loadMainModule(inline); + if (main.right.getImportDeclChildren().stream() + .anyMatch(x -> x.isImportModule())) + { + throw new ScribException( + "Module imports not permitted in inline main modules."); + // Because (currently) null locator + } + init(main, + debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, + noAcceptCorrelationCheck, noValidation, spin); + } + + // TODO: make Path abstract as e.g. URI -- locator is abstract but Path is coupled to concrete DirectoryResourceLocator + private Main(ResourceLocator locator) + throws ScribParserException, ScribException + { + //this.locator = locator; + this.loader = new ScribModuleLoader(locator, newAntlr()); + } + + private void init(Pair main, + boolean debug, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, + boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, + boolean noValidation, boolean spin) throws ScribParserException, ScribException { - this.parsed.put(m.right.getFullModuleName(), m); + loadAllModuleImports(main); // Populates this.loaded + + // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource + this.config = new LangConfig(main.right.getFullModuleName(), + debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, + noAcceptCorrelationCheck, noValidation, spin, + newAstFactory(), newEModelFactory(), newSModelFactory()); + + + // CHECKME: how does this relate to the ModuleContextBuilder pass? + // Job.modcs seems unused? Lang.modcs is used though, by old AST visitors -- basically old ModuleContextVisitor is redundant? + // Job.modcs could be used, but disamb already done by Lang + + Map loaded = getLoadedModules(); + ModuleContextMaker maker = new ModuleContextMaker(); + Map modcs = new HashMap<>(); + for (ModuleName fullname : this.loaded.keySet()) + { + Pair e = this.loaded.get(fullname); + modcs.put(fullname, maker.make(loaded, e.right)); // throws ScribException + } + this.modcs = Collections.unmodifiableMap(modcs); + } + + // Populates this.loaded + private void loadAllModuleImports(Pair m) + throws ScribParserException, ScribException + { + this.loaded.put(m.right.getFullModuleName(), m); for (ImportDecl id : m.right.getImportDeclChildren()) { if (id.isImportModule()) { ModuleName fullname = ((ImportModule) id).getModuleNameNodeChild().toName(); - if (!this.parsed.containsKey(fullname)) + if (!this.loaded.containsKey(fullname)) { - loadAllModules(this.loader.loadModule(fullname, this.af)); + loadAllModuleImports(this.loader.loadModule(fullname)); } } } } - // Hacky? But not Scribble tool's job to check nested directory location of module fully corresponds to the fullname of module? Cf. Java classes - private void checkMainModuleName(Path mainpath, Module main, boolean noValidation) - throws ScribException - { - String path = mainpath.toString(); // FIXME: hack - // FileSystems.getDefault().getSeparator() ? - String tmp = path.substring((path.lastIndexOf(File.separator) == -1) - ? 0 - : path.lastIndexOf(File.separator) + 1, path.lastIndexOf('.')); - if (!noValidation) // this.config not made yet - { - if (!tmp.equals(main.getFullModuleName().getSimpleName().toString())) - // ModuleName.toString hack? - { - CommonTree source = main.getModuleDeclChild().getNameNodeChild() - .getSource(); - throw new ScribException(source, "Simple module name at path " + path - + " mismatch: " + main.getFullModuleName()); - } - } - } - - private Map getParsedModules() + private Map getLoadedModules() { - return this.parsed.entrySet().stream() + return this.loaded.entrySet().stream() .collect(Collectors.toMap(Entry::getKey, e -> e.getValue().right)); } } diff --git a/scribble-main/src/main/java/org/scribble/main/resource/InlineResource.java b/scribble-main/src/main/java/org/scribble/main/resource/InlineResource.java index 0ea392653..b1ced5837 100644 --- a/scribble-main/src/main/java/org/scribble/main/resource/InlineResource.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/InlineResource.java @@ -17,7 +17,7 @@ import java.nio.charset.StandardCharsets; -// Module supplied to tool directly as a String arg. +// Module supplied directly as a String arg. public class InlineResource extends AbstractResource { //private final String res; diff --git a/scribble-main/src/main/java/org/scribble/main/resource/loader/DefaultModuleLoader.java b/scribble-main/src/main/java/org/scribble/main/resource/loader/DefaultModuleLoader.java index 39a53c32d..4959bd17c 100644 --- a/scribble-main/src/main/java/org/scribble/main/resource/loader/DefaultModuleLoader.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/loader/DefaultModuleLoader.java @@ -13,13 +13,12 @@ */ package org.scribble.main.resource.loader; -import org.scribble.ast.AstFactory; import org.scribble.ast.Module; import org.scribble.core.type.name.ModuleName; import org.scribble.main.resource.Resource; import org.scribble.util.Pair; -import org.scribble.util.ScribParserException; import org.scribble.util.ScribException; +import org.scribble.util.ScribParserException; /** @@ -28,19 +27,17 @@ */ public abstract class DefaultModuleLoader implements ModuleLoader { - // A caching mechanism? -- not currently used for anything meaningful - // FIXME: redundant? Modules recorded (and updated) in MainContext - // ModuleName is full module name + // CHECKME: redundant? Modules recorded (and updated) in MainContext private java.util.Map> _modules=new java.util.HashMap<>(); /** * This method registers the supplied module. * - * @param module The module + * @param m The module */ - public void registerModule(Resource res, Module module) + public void registerModule(Resource res, Module m) { - _modules.put(module.getFullModuleName(), new Pair<>(res, module)); + _modules.put(m.getFullModuleName(), new Pair<>(res, m)); } /** @@ -48,8 +45,9 @@ public void registerModule(Resource res, Module module) * @throws ScribParserException */ @Override - public Pair loadModule(ModuleName modname, AstFactory af) throws ScribParserException, ScribException + public Pair loadModule(ModuleName fullname) + throws ScribParserException, ScribException { - return (_modules.get(modname)); + return (_modules.get(fullname)); } } diff --git a/scribble-main/src/main/java/org/scribble/main/resource/loader/ModuleLoader.java b/scribble-main/src/main/java/org/scribble/main/resource/loader/ModuleLoader.java index d54e58364..77be9862c 100644 --- a/scribble-main/src/main/java/org/scribble/main/resource/loader/ModuleLoader.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/loader/ModuleLoader.java @@ -13,13 +13,12 @@ */ package org.scribble.main.resource.loader; -import org.scribble.ast.AstFactory; import org.scribble.ast.Module; import org.scribble.core.type.name.ModuleName; import org.scribble.main.resource.Resource; import org.scribble.util.Pair; -import org.scribble.util.ScribParserException; import org.scribble.util.ScribException; +import org.scribble.util.ScribParserException; /** @@ -39,6 +38,7 @@ public interface ModuleLoader * @return The module, or null if not found * @throws ScribParserException */ - public Pair loadModule(ModuleName modname, AstFactory af) throws ScribParserException, ScribException; + public Pair loadModule(ModuleName fullname) + throws ScribParserException, ScribException; } diff --git a/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java b/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java index 1f57e9598..28676bf96 100644 --- a/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java @@ -13,15 +13,20 @@ */ package org.scribble.main.resource.loader; -import org.scribble.ast.AstFactory; +import java.io.File; +import java.nio.file.Path; + +import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.Module; import org.scribble.core.type.name.ModuleName; import org.scribble.main.ScribAntlrWrapper; +import org.scribble.main.resource.InlineResource; import org.scribble.main.resource.Resource; +import org.scribble.main.resource.locator.DirectoryResourceLocator; import org.scribble.main.resource.locator.ResourceLocator; import org.scribble.util.Pair; -import org.scribble.util.ScribParserException; import org.scribble.util.ScribException; +import org.scribble.util.ScribParserException; // loading: ModuleName -> Module // ModuleName --> Path --ResourceLocator--> Resource --ScribAntlrWrapper--> Module @@ -36,16 +41,44 @@ public ScribModuleLoader(ResourceLocator locator, ScribAntlrWrapper antlr) this.antlr = antlr; } + // CHECKME: check only called once? at start? + public Pair loadMainModule(Path mainpath) + throws ScribException, ScribParserException + { + Resource res = DirectoryResourceLocator.getResourceByFullPath(mainpath); + // Hardcoded to DirectoryResourceLocator + Module m = this.antlr.parse(res); // Does del decoration + ScribModuleLoader.checkMainModuleName(mainpath, m); + ModuleName fullname = m.getFullModuleName(); + Pair cached = super.loadModule(fullname); + if (cached != null) + { + return cached; // CHECKME: compare loaded against cached? + } + registerModule(res, m); + return new Pair<>(res, m); + } + + // CHECKME: check only called once? at start? + public Pair loadMainModule(String inline) + throws ScribException, ScribParserException + { + Resource res = new InlineResource(inline); + Module m = (Module) this.antlr.parse(res); // Does del decoration + registerModule(res, m); + return new Pair<>(res, m); + } + + // Used to load import modules (not the main module) @Override - public Pair loadModule(ModuleName fullname, AstFactory af) - throws ScribParserException, ScribException + public Pair loadModule(ModuleName fullname) + throws ScribException, ScribParserException { - Pair cached = super.loadModule(fullname, af); + Pair cached = super.loadModule(fullname); if (cached != null) { return cached; } - Resource res = this.locator.getResource(fullname.toPath()); Module m = this.antlr.parse(res); // Does del decoration ScribModuleLoader.checkModuleName(fullname, res, m); @@ -63,4 +96,25 @@ private static void checkModuleName(ModuleName fullname, Resource res, + m.getFullModuleName() + " at location: " + res.getLocation()); } } + + // For main module loaded from a path, check only the simple module name against the last path element + // Not Scribble's job to check nested directory location of module fully corresponds to the full name of module, cf. Java classes + private static void checkMainModuleName(Path mainpath, Module main) + throws ScribException + { + String path = mainpath.toString(); // FIXME: hack + // FileSystems.getDefault().getSeparator() ? + int last = path.lastIndexOf(File.separator); + String tmp = path.substring((last == -1) + ? 0 + : last + 1, path.lastIndexOf('.')); + if (!tmp.equals(main.getFullModuleName().getSimpleName().toString())) + // ModuleName.toString hack? + { + CommonTree source = main.getModuleDeclChild().getNameNodeChild() + .getSource(); + throw new ScribException(source, "Simple module name at path " + path + + " mismatch: " + main.getFullModuleName()); + } + } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 04df5327a..b9bec83bc 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -68,6 +68,8 @@ module tmp.Test; // integrate new frontend with MainContext? // move lang types to type.sess, and move new visit // add exp conn checks to model validation + +// use stypefactory in core // refactor test to use main instead of cli // simplify cli and arg parsing From 29295fac8fdb18f704b9f1beb92f61c2b8fd4a89 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 5 Apr 2019 23:21:05 +0100 Subject: [PATCH 177/539] Minor. --- .../src/main/java/org/scribble/cli/CommandLine.java | 13 ++++++++----- .../src/main/java/org/scribble/main/Main.java | 8 ++++++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 5ffb0ca2e..10a13d7ad 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -90,16 +90,19 @@ protected Main newMainContext() : Collections.emptyList(); if (this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) { - return new Main(this.args.get(CLArgFlag.INLINE_MAIN_MOD)[0], debug, useOldWF, noLiveness, minEfsm, fair, - noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); + String inline = this.args.get(CLArgFlag.INLINE_MAIN_MOD)[0]; + return new Main(inline, + debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, + noAcceptCorrelationCheck, noValidation, spin); } else { ResourceLocator locator = new DirectoryResourceLocator(impaths); Path mainpath = CommandLine.parseMainPath(this.args.get(CLArgFlag.MAIN_MOD)[0]); - //return new MainContext(jUnit, debug, locator, mainpath, useOldWF, noLiveness); - return new Main(locator, debug, mainpath, useOldWF, noLiveness, minEfsm, fair, - noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); + return new Main(locator, + debug, mainpath, useOldWF, noLiveness, minEfsm, fair, + noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, + spin); } } diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index 507d04475..455432898 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -63,21 +63,26 @@ public Lang newLang() return new Lang(getLoadedModules(), this.modcs, this.config); } + // A Scribble extension should override newLang/Antlr/Ast/ModelFactory as appropriate protected ScribAntlrWrapper newAntlr() { return new ScribAntlrWrapper(); } + // A Scribble extension should override newLang/Antlr/Ast/ModelFactory as appropriate protected AstFactory newAstFactory() { return new AstFactoryImpl(); } + // A Scribble extension should override newLang/Antlr/Ast/ModelFactory as appropriate protected EModelFactory newEModelFactory() { return new EModelFactoryImpl(); } + // A Scribble extension should override newLang/Antlr/Ast/ModelFactory as appropriate + // CHECKME: combine with newEModelFactory ? protected SModelFactory newSModelFactory() { return new SModelFactoryImpl(); @@ -104,7 +109,7 @@ public Main(String inline, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) throws ScribException, ScribParserException { - this(null); + this(null); // CHECKME: null locator Pair main = this.loader.loadMainModule(inline); if (main.right.getImportDeclChildren().stream() .anyMatch(x -> x.isImportModule())) @@ -139,7 +144,6 @@ private void init(Pair main, debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin, newAstFactory(), newEModelFactory(), newSModelFactory()); - // CHECKME: how does this relate to the ModuleContextBuilder pass? // Job.modcs seems unused? Lang.modcs is used though, by old AST visitors -- basically old ModuleContextVisitor is redundant? From fbb8323abf753cbc65c42dbe6c9ab7ff37f1f122 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 5 Apr 2019 23:38:11 +0100 Subject: [PATCH 178/539] Minor. --- .../src/main/java/org/scribble/lang/Lang.java | 6 ++--- .../src/main/java/org/scribble/main/Main.java | 25 ++++++++++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index a77ddf580..d687406b9 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -35,13 +35,13 @@ // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models public class Lang { - // Keys are full names - private final Map modcs; // CHECKME: constant? move to JobConfig? - public final LangConfig config; // Immutable private final LangContext context; // Mutable (Visitor passes replace modules) //private final SGraphBuilderUtil sgbu; + + // Keys are full names + private final Map modcs; // CHECKME: constant? move to JobConfig? private Job job; diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index 455432898..4bddea8fb 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.main; // N.B. the same package is declared in core +package org.scribble.main; import java.nio.file.Path; import java.util.Collections; @@ -41,9 +41,19 @@ import org.scribble.util.ScribException; import org.scribble.util.ScribParserException; -// Scribble tool context for main module -// MainContext takes ResourceLocator abstractly (e.g. DirectoryResourceLocator), but because abstract Resource itself works off paths, it takes mainpath (rather than something more abstract, e.g. URI, to identify the "main" resource) -// Resource and ResourceLocator should be made abstract from (file)paths (cf. use of toPath in ScribbleModuleLoader) +/** + * Main loads the main module, and then all other (transitively) imported + * modules. Its main purpose is to offer the newLang factory method. + * + * Main takes an abstract ResourceLocator, e.g. DirectoryResourceLocator -- (for + * non-inline main modules)... + * ...but because Resource is primarily based on file paths, it takes mainpath + * (rather than something more abstract, e.g., URI) to identify the "main" + * resource. + * + * TODO: Resource and ResourceLocator should be made more abstract from (file) + * paths (cf. use of modname.toPath in ScribModuleLoader). + */ public class Main { //private final ResourceLocator locator; // Path -> Resource @@ -89,6 +99,7 @@ protected SModelFactory newSModelFactory() } // Load main module from file system + // Load other modules via locator -- CHECKME: a bit inconsistent with the main? public Main(ResourceLocator locator, boolean debug, Path mainpath, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, @@ -102,7 +113,7 @@ public Main(ResourceLocator locator, noAcceptCorrelationCheck, noValidation, spin); } - // For inline module arg + // Load an inline module arg -- module imports not allowed (currently no ResourceLocator) public Main(String inline, boolean debug, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, @@ -145,9 +156,11 @@ private void init(Pair main, noAcceptCorrelationCheck, noValidation, spin, newAstFactory(), newEModelFactory(), newSModelFactory()); + //... // CHECKME: how does this relate to the ModuleContextBuilder pass? // Job.modcs seems unused? Lang.modcs is used though, by old AST visitors -- basically old ModuleContextVisitor is redundant? // Job.modcs could be used, but disamb already done by Lang + // Lang/Job modcs should be moved to config/context though Map loaded = getLoadedModules(); ModuleContextMaker maker = new ModuleContextMaker(); @@ -155,7 +168,7 @@ private void init(Pair main, for (ModuleName fullname : this.loaded.keySet()) { Pair e = this.loaded.get(fullname); - modcs.put(fullname, maker.make(loaded, e.right)); // throws ScribException + modcs.put(fullname, maker.make(loaded, e.right)); // Throws ScribException } this.modcs = Collections.unmodifiableMap(modcs); } From 644894711d861832dd66cd329bb41109b08f5e60 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 7 Apr 2019 12:49:22 +0100 Subject: [PATCH 179/539] Continued: refactoring Main and Lang. --- .../main/java/org/scribble/ast/ScribNode.java | 4 +- .../src/main/java/org/scribble/lang/Lang.java | 46 ++++--- .../java/org/scribble/lang/LangContext.java | 1 - .../org/scribble/visit/GTypeTranslator.java | 22 +--- ...mpleVisitor.java => SimpleAstVisitor.java} | 10 +- .../java/org/scribble/cli/CommandLine.java | 2 +- .../main/java/org/scribble/core/job/Job.java | 4 +- .../org/scribble/core/job/JobContext.java | 4 +- .../src/main/java/org/scribble/main/Main.java | 115 +++++++----------- .../resource/loader/ScribModuleLoader.java | 8 +- .../parser/scribble}/ScribAntlrWrapper.java | 27 ++-- scribble-test/src/test/scrib/tmp/Test.scr | 3 +- 12 files changed, 109 insertions(+), 137 deletions(-) rename scribble-ast/src/main/java/org/scribble/visit/{SimpleVisitor.java => SimpleAstVisitor.java} (84%) rename {scribble-main/src/main/java/org/scribble/main => scribble-parser/src/main/java/org/scribble/parser/scribble}/ScribAntlrWrapper.java (83%) diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java index 7c572c19b..4b46c3407 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java @@ -20,7 +20,7 @@ import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -import org.scribble.visit.SimpleVisitor; +import org.scribble.visit.SimpleAstVisitor; import org.scribble.visit.Substitutor; /** @@ -44,7 +44,7 @@ public interface ScribNode extends Tree ScribDel del(); ScribNode del(ScribDel del); - default T visitWith(SimpleVisitor v) throws ScribException // "Top-level" visitor entry method + default T visitWith(SimpleAstVisitor v) throws ScribException // "Top-level" visitor entry method { return v.visit(this); // N.B. ScribNode has getParent } diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index d687406b9..f3ad47e87 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -15,7 +15,7 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; -import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -26,6 +26,7 @@ import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.name.ModuleName; +import org.scribble.lang.context.ModuleContextMaker; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; import org.scribble.visit.GTypeTranslator; @@ -37,39 +38,48 @@ public class Lang { public final LangConfig config; // Immutable - private final LangContext context; // Mutable (Visitor passes replace modules) - //private final SGraphBuilderUtil sgbu; - // Keys are full names - private final Map modcs; // CHECKME: constant? move to JobConfig? + private final Map modcs = new HashMap<>(); // CHECKME: constant? move to JobConfig? + + private final LangContext context; // Mutable: Visitor passes update modules private Job job; // Just take MainContext as arg? -- would need to fix Maven dependencies //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) - public Lang(Map parsed, - Map modcs, LangConfig config) + public Lang(Map parsed, LangConfig config) + throws ScribException { - this.modcs = Collections.unmodifiableMap(modcs); this.config = config; - //this.sgbu = config.sf.newSGraphBuilderUtil(); - this.context = new LangContext(this, parsed); // Single instance per Job and should never be shared + this.context = new LangContext(this, parsed); // Single instance per Lang, should not be shared between Langs + + // CHECKME: how does this relate to the ModuleContextBuilder pass? + // Job.modcs seems unused? Lang.modcs is used though, by old AST visitors -- basically old ModuleContextVisitor is redundant? + // Job.modcs could be used, but disamb already done by Lang + // Lang/Job modcs should be moved to config/context though + ModuleContextMaker maker = new ModuleContextMaker(); + for (ModuleName fullname : parsed.keySet()) + { + this.modcs.put(fullname, maker.make(parsed, parsed.get(fullname))); + // Throws ScribException + } } + // "Finalises" this Lang -- caches the Job at this point, and cannot run futher Visitor passes + // CHECKME: revise this pattern? public Job toJob() throws ScribException { if (this.job == null) { - Set fullmodnames = this.context.getFullModuleNames(); + Set fullnames = this.context.getFullModuleNames(); Set imeds = new HashSet<>(); - for (ModuleName fullmodname : fullmodnames) + for (ModuleName fullname : fullnames) { - Module mod = this.context.getModule(fullmodname); - GTypeTranslator t = new GTypeTranslator(this, fullmodname); - for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) + Module m = this.context.getModule(fullname); + GTypeTranslator t = new GTypeTranslator(this, fullname); + for (GProtocolDecl gpd : m.getGProtoDeclChildren()) { GProtocol g = (GProtocol) gpd.visitWith(t); - //this.context.addIntermediate(g.fullname, g); imeds.add(g); debugPrintln("\nParsed:\n" + gpd + "\n\nScribble intermediate:\n" + g); } @@ -152,6 +162,10 @@ private void runVisitorPass(Set modnames, private void runVisitorOnModule(ModuleName modname, AstVisitor nv) throws ScribException { + if (this.job != null) + { + throw new RuntimeException("toJob already finalised: "); + } Module visited = (Module) this.context.getModule(modname).accept(nv); this.context.replaceModule(visited); } diff --git a/scribble-ast/src/main/java/org/scribble/lang/LangContext.java b/scribble-ast/src/main/java/org/scribble/lang/LangContext.java index 10829236b..b758fb6ad 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/LangContext.java +++ b/scribble-ast/src/main/java/org/scribble/lang/LangContext.java @@ -40,7 +40,6 @@ public class LangContext protected LangContext(Lang lang, Map parsed)//, ModuleName main) { this.lang = lang; - this.parsed = new HashMap(parsed); } diff --git a/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java index 51af7ae0f..733b3b1df 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java @@ -21,11 +21,11 @@ import org.scribble.util.ScribException; // CHECKME: move to visit package? -public class GTypeTranslator extends SimpleVisitor +public class GTypeTranslator extends SimpleAstVisitor { - public GTypeTranslator(Lang lang, ModuleName mod) + public GTypeTranslator(Lang lang, ModuleName fullname) { - super(lang, mod); + super(lang, fullname); } @Override @@ -33,20 +33,4 @@ public GNode visit(ScribNode n) throws ScribException { return ((GDel) n.del()).translate(n, this); } - - /*// sig is the for the current innermost proto - public RecVar makeRecVar(SubprotoSig sig) - { - String lab = "__" + sig.fullname + "__" - + sig.roles.stream().map(x -> x.toString()) - .collect(Collectors.joining("_")) - + "__" + sig.args.stream().map(x -> x.toString()) - .collect(Collectors.joining("_")); - return new RecVar(lab); - } - - public RecVar makeRecVar(SubprotoSig sig, RecVar rv) - { - return new RecVar(makeRecVar(sig).toString() + "__" + rv); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/visit/SimpleVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java similarity index 84% rename from scribble-ast/src/main/java/org/scribble/visit/SimpleVisitor.java rename to scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java index 4a9eaddb7..ce462dd0f 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/SimpleVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java @@ -22,15 +22,15 @@ // A SimpleVisitor visits a Module (or some part of one) for a given Job // Apart from delegating to del-specific visiting methods, SimpleVisitors are mainly for holding data and collecting common operations // TODO CHECKME: refactor AstVisitor as a SimpleVisitor? i.e., T=ScribNode ? -public abstract class SimpleVisitor +public abstract class SimpleAstVisitor { public final Lang lang; - public final ModuleName mod; // fullname + public final ModuleName fullname; // Root module -- used to get ModuleContext - public SimpleVisitor(Lang lang, ModuleName fullname) + public SimpleAstVisitor(Lang lang, ModuleName fullname) { this.lang = lang; - this.mod = fullname; + this.fullname = fullname; } // Override to delegate to del-specific method, e.g., n.del().visit(n, this) @@ -39,6 +39,6 @@ public SimpleVisitor(Lang lang, ModuleName fullname) public ModuleContext getModuleContext() { - return this.lang.getModuleContext(this.mod); + return this.lang.getModuleContext(this.fullname); } } diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 10a13d7ad..03e7ae50c 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -150,7 +150,7 @@ public void run() throws CommandLineException, AntlrSourceException // Scribble } protected void runBody() - throws ScribParserException, AntlrSourceException, CommandLineException + throws ScribException, ScribParserException, AntlrSourceException, CommandLineException { Main mc = newMainContext(); // Represents current instance of tooling for given CL args Lang lang = mc.newLang(); // A Job is some series of passes performed on each Module in the MainContext (e.g., cf. Job::runVisitorPass) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index e864c436f..3cde3f2cf 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -59,13 +59,13 @@ public class Job // Just take MainContext as arg? -- would need to fix Maven dependencies //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) - public Job(Set parsed,//Map parsed, + public Job(Set imeds,//Map parsed, Map modcs, JobConfig config) { this.modcs = Collections.unmodifiableMap(modcs); this.config = config; this.sgbu = config.sf.newSGraphBuilderUtil(); - this.context = new JobContext(this, parsed); // Single instance per Job and should never be shared + this.context = new JobContext(this, imeds); // Single instance per Job and should never be shared } // Scribble extensions should override these "new" methods diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java index dd8e8a9ac..33adbff45 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java @@ -77,13 +77,13 @@ public class JobContext // FIXME: currently only minimising "fair" graph, need to consider minimisation orthogonally to fairness -- NO: minimising (of fair) is for API gen only, unfair-transform does not use minimisation (regardless of user flag) for WF protected JobContext(Job job, //Map parsed)//, ModuleName main) - Set intermed) + Set imeds) { this.job = job; //this.parsed = new HashMap(parsed); //this.main = main; - this.intermed = intermed.stream() + this.intermed = imeds.stream() .collect(Collectors.toMap(x -> x.fullname, x -> x)); } diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index 4bddea8fb..eb8db3815 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -14,29 +14,24 @@ package org.scribble.main; import java.nio.file.Path; -import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.stream.Collectors; -import org.scribble.ast.AstFactory; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.ImportDecl; import org.scribble.ast.ImportModule; import org.scribble.ast.Module; -import org.scribble.core.lang.context.ModuleContext; -import org.scribble.core.model.endpoint.EModelFactory; import org.scribble.core.model.endpoint.EModelFactoryImpl; -import org.scribble.core.model.global.SModelFactory; import org.scribble.core.model.global.SModelFactoryImpl; import org.scribble.core.type.name.ModuleName; import org.scribble.lang.Lang; import org.scribble.lang.LangConfig; -import org.scribble.lang.context.ModuleContextMaker; import org.scribble.main.resource.Resource; import org.scribble.main.resource.loader.ScribModuleLoader; import org.scribble.main.resource.locator.ResourceLocator; +import org.scribble.parser.scribble.ScribAntlrWrapper; import org.scribble.util.Pair; import org.scribble.util.ScribException; import org.scribble.util.ScribParserException; @@ -59,56 +54,61 @@ public class Main //private final ResourceLocator locator; // Path -> Resource private final ScribModuleLoader loader; // ModuleName -> Pair - private LangConfig config; - protected Map modcs; // Full names (like this.loaded) + public final LangConfig config; // Keys are full names -- loaded are the modules read from file, distinguished from the generated projection modules // Resource recorded for source path private final Map> loaded = new HashMap<>(); - // A Scribble extension should override newLang/Antlr/Ast/ModelFactory as appropriate - public Lang newLang() - { - return new Lang(getLoadedModules(), this.modcs, this.config); - } - - // A Scribble extension should override newLang/Antlr/Ast/ModelFactory as appropriate + // A Scribble extension should override newAntlr/Lang/LangConfig as appropriate protected ScribAntlrWrapper newAntlr() { return new ScribAntlrWrapper(); } - // A Scribble extension should override newLang/Antlr/Ast/ModelFactory as appropriate - protected AstFactory newAstFactory() + // A Scribble extension should override newAntlr/Lang/LangConfig as appropriate + public Lang newLang() throws ScribException { - return new AstFactoryImpl(); + return new Lang(getLoadedModules(), this.config); } - // A Scribble extension should override newLang/Antlr/Ast/ModelFactory as appropriate - protected EModelFactory newEModelFactory() - { - return new EModelFactoryImpl(); - } + // A Scribble extension should override newAntlr/Lang/LangConfig as appropriate - // A Scribble extension should override newLang/Antlr/Ast/ModelFactory as appropriate - // CHECKME: combine with newEModelFactory ? - protected SModelFactory newSModelFactory() + //...FIXME: replace bools by a Map -- needed for subclassing -- pass Map to Lang instead of making config here? + //...use Pair to hack a unified constructor + + public LangConfig newLangConfig(ModuleName mainFullname, + boolean debug, boolean useOldWF, boolean noLiveness, + boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, + boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) { - return new SModelFactoryImpl(); + return new LangConfig(mainFullname, + debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, + noAcceptCorrelationCheck, noValidation, spin, + new AstFactoryImpl(), new EModelFactoryImpl(), new SModelFactoryImpl()); + // CHECKME: combine E/SModelFactory? } // Load main module from file system - // Load other modules via locator -- CHECKME: a bit inconsistent with the main? + // Load other modules via locator -- CHECKME: a bit inconsistent w.r.t. main? + // TODO: make Path abstract as e.g. URI -- locator is abstract but Path is coupled to concrete DirectoryResourceLocator public Main(ResourceLocator locator, boolean debug, Path mainpath, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) throws ScribException, ScribParserException { - this(locator); + //this.locator = locator; + this.loader = new ScribModuleLoader(locator, newAntlr()); + Pair main = this.loader.loadMainModule(mainpath); - init(main, + loadAllModuleImports(main, + debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, + noAcceptCorrelationCheck, noValidation, spin); + + // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource + this.config = newLangConfig(main.right.getFullModuleName(), debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); } @@ -120,7 +120,9 @@ public Main(String inline, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) throws ScribException, ScribParserException { - this(null); // CHECKME: null locator + //this.locator = null; + this.loader = new ScribModuleLoader(null, newAntlr()); // CHECKME: null locator OK? + Pair main = this.loader.loadMainModule(inline); if (main.right.getImportDeclChildren().stream() .anyMatch(x -> x.isImportModule())) @@ -129,52 +131,29 @@ public Main(String inline, "Module imports not permitted in inline main modules."); // Because (currently) null locator } - init(main, + loadAllModuleImports(main, + debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, + noAcceptCorrelationCheck, noValidation, spin); + + // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource + this.config = newLangConfig(main.right.getFullModuleName(), debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); } - // TODO: make Path abstract as e.g. URI -- locator is abstract but Path is coupled to concrete DirectoryResourceLocator - private Main(ResourceLocator locator) - throws ScribParserException, ScribException - { - //this.locator = locator; - this.loader = new ScribModuleLoader(locator, newAntlr()); - } - - private void init(Pair main, + // Given the loaded main Module, populates this.loaded and this.modcs + // Does so by transitively loading all module imports + private void loadAllModuleImports(Pair main, boolean debug, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) throws ScribParserException, ScribException { - loadAllModuleImports(main); // Populates this.loaded - - // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource - this.config = new LangConfig(main.right.getFullModuleName(), - debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, - noAcceptCorrelationCheck, noValidation, spin, - newAstFactory(), newEModelFactory(), newSModelFactory()); - - //... - // CHECKME: how does this relate to the ModuleContextBuilder pass? - // Job.modcs seems unused? Lang.modcs is used though, by old AST visitors -- basically old ModuleContextVisitor is redundant? - // Job.modcs could be used, but disamb already done by Lang - // Lang/Job modcs should be moved to config/context though - - Map loaded = getLoadedModules(); - ModuleContextMaker maker = new ModuleContextMaker(); - Map modcs = new HashMap<>(); - for (ModuleName fullname : this.loaded.keySet()) - { - Pair e = this.loaded.get(fullname); - modcs.put(fullname, maker.make(loaded, e.right)); // Throws ScribException - } - this.modcs = Collections.unmodifiableMap(modcs); + loadAllAux(main); // Populates this.loaded } - // Populates this.loaded - private void loadAllModuleImports(Pair m) + // Recursively records m in this.loaded and loads all module imports of m + private void loadAllAux(Pair m) throws ScribParserException, ScribException { this.loaded.put(m.right.getFullModuleName(), m); @@ -186,13 +165,13 @@ private void loadAllModuleImports(Pair m) ((ImportModule) id).getModuleNameNodeChild().toName(); if (!this.loaded.containsKey(fullname)) { - loadAllModuleImports(this.loader.loadModule(fullname)); + loadAllAux(this.loader.loadModule(fullname)); } } } } - private Map getLoadedModules() + public Map getLoadedModules() { return this.loaded.entrySet().stream() .collect(Collectors.toMap(Entry::getKey, e -> e.getValue().right)); diff --git a/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java b/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java index 28676bf96..35294f3e3 100644 --- a/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java @@ -19,11 +19,11 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.Module; import org.scribble.core.type.name.ModuleName; -import org.scribble.main.ScribAntlrWrapper; import org.scribble.main.resource.InlineResource; import org.scribble.main.resource.Resource; import org.scribble.main.resource.locator.DirectoryResourceLocator; import org.scribble.main.resource.locator.ResourceLocator; +import org.scribble.parser.scribble.ScribAntlrWrapper; import org.scribble.util.Pair; import org.scribble.util.ScribException; import org.scribble.util.ScribParserException; @@ -47,7 +47,7 @@ public Pair loadMainModule(Path mainpath) { Resource res = DirectoryResourceLocator.getResourceByFullPath(mainpath); // Hardcoded to DirectoryResourceLocator - Module m = this.antlr.parse(res); // Does del decoration + Module m = this.antlr.parse(res.getInputStream()); // Does del decoration ScribModuleLoader.checkMainModuleName(mainpath, m); ModuleName fullname = m.getFullModuleName(); Pair cached = super.loadModule(fullname); @@ -64,7 +64,7 @@ public Pair loadMainModule(String inline) throws ScribException, ScribParserException { Resource res = new InlineResource(inline); - Module m = (Module) this.antlr.parse(res); // Does del decoration + Module m = (Module) this.antlr.parse(res.getInputStream()); // Does del decoration registerModule(res, m); return new Pair<>(res, m); } @@ -80,7 +80,7 @@ public Pair loadModule(ModuleName fullname) return cached; } Resource res = this.locator.getResource(fullname.toPath()); - Module m = this.antlr.parse(res); // Does del decoration + Module m = this.antlr.parse(res.getInputStream()); // Does del decoration ScribModuleLoader.checkModuleName(fullname, res, m); registerModule(res, m); return new Pair<>(res, m); diff --git a/scribble-main/src/main/java/org/scribble/main/ScribAntlrWrapper.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribAntlrWrapper.java similarity index 83% rename from scribble-main/src/main/java/org/scribble/main/ScribAntlrWrapper.java rename to scribble-parser/src/main/java/org/scribble/parser/scribble/ScribAntlrWrapper.java index 67ff82626..d9c162596 100644 --- a/scribble-main/src/main/java/org/scribble/main/ScribAntlrWrapper.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribAntlrWrapper.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.main; +package org.scribble.parser.scribble; import java.io.IOException; import java.io.InputStream; @@ -27,13 +27,11 @@ import org.scribble.ast.Module; import org.scribble.del.DelDecorator; import org.scribble.del.DelDecoratorImpl; -import org.scribble.main.resource.Resource; import org.scribble.parser.antlr.ScribbleLexer; import org.scribble.parser.antlr.ScribbleParser; -import org.scribble.parser.scribble.ScribTreeAdaptor; import org.scribble.util.ScribParserException; -// Resource -> ANTLR CommonTree -- parses Resources into ANTLR CommonTrees +// InputStream -> ANTLR CommonTree -- parses Resource.getInputStream() into ANTLR CommonTrees // Wraps the ScribbleLexer and ScribbleParser generated by ANTLR from Scribble.g public class ScribAntlrWrapper { @@ -59,12 +57,12 @@ protected ScribbleParser newScribbleParser(CommonTokenStream ts) return new ScribbleParser(ts); } - // Parse a Resource into a (del decorated) Module - public Module parse(Resource res) throws ScribParserException + // Parse InputStream (from a Resource) into a (del decorated) Module + public Module parse(InputStream is) throws ScribParserException { try { - String input = ScribAntlrWrapper.readInput(res); + String input = ScribAntlrWrapper.readInput(is); Lexer lex = newScribbleLexer(new ANTLRStringStream(input)); Module mod = runScribbleParser(new CommonTokenStream(lex)); this.df.decorate(mod); @@ -112,18 +110,15 @@ public static void checkForAntlrErrors(CommonTree t) } } - protected static String readInput(Resource res) throws IOException + protected static String readInput(InputStream is) throws IOException { - return new String(ScribAntlrWrapper.readResource(res)); + return new String(ScribAntlrWrapper.readResource(is)); } - protected static byte[] readResource(Resource res) throws IOException + private static byte[] readResource(InputStream is) throws IOException { - try (InputStream is = res.getInputStream()) - { - byte[] bs = new byte[is.available()]; - is.read(bs); - return bs; - } + byte[] bs = new byte[is.available()]; + is.read(bs); + return bs; } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index b9bec83bc..5358b01b4 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -67,8 +67,9 @@ module tmp.Test; // move ast/del, old visit and new frontend to lang // integrate new frontend with MainContext? // move lang types to type.sess, and move new visit -// add exp conn checks to model validation +// try disamb without modulecontextvisitor, try move antlrwrapper to parser again +// add exp conn checks to model validation // use stypefactory in core // refactor test to use main instead of cli // simplify cli and arg parsing From 571a35fd2529de57c907c840e708f82bc9cd59ce Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 7 Apr 2019 13:20:09 +0100 Subject: [PATCH 180/539] Continued: refactoring Main and Lang. --- .../java/org/scribble/cli/CommandLine.java | 2 +- .../src/main/java/org/scribble/main/Main.java | 107 ++++++++++-------- 2 files changed, 59 insertions(+), 50 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 03e7ae50c..ce7b43256 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -100,7 +100,7 @@ protected Main newMainContext() ResourceLocator locator = new DirectoryResourceLocator(impaths); Path mainpath = CommandLine.parseMainPath(this.args.get(CLArgFlag.MAIN_MOD)[0]); return new Main(locator, - debug, mainpath, useOldWF, noLiveness, minEfsm, fair, + mainpath, debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); } diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index eb8db3815..3b60a4fc9 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -56,59 +56,33 @@ public class Main public final LangConfig config; - // Keys are full names -- loaded are the modules read from file, distinguished from the generated projection modules + // Keys are full names -- parsed are the modules read from file, distinguished from the generated projection modules // Resource recorded for source path - private final Map> loaded + private final Map> parsed = new HashMap<>(); - // A Scribble extension should override newAntlr/Lang/LangConfig as appropriate + // A Scribble extension should override newAntlr/Lang as appropriate protected ScribAntlrWrapper newAntlr() { return new ScribAntlrWrapper(); } - // A Scribble extension should override newAntlr/Lang/LangConfig as appropriate + // A Scribble extension should override newAntlr/Lang as appropriate public Lang newLang() throws ScribException { - return new Lang(getLoadedModules(), this.config); - } - - // A Scribble extension should override newAntlr/Lang/LangConfig as appropriate - - //...FIXME: replace bools by a Map -- needed for subclassing -- pass Map to Lang instead of making config here? - //...use Pair to hack a unified constructor - - public LangConfig newLangConfig(ModuleName mainFullname, - boolean debug, boolean useOldWF, boolean noLiveness, - boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, - boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) - { - return new LangConfig(mainFullname, - debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, - noAcceptCorrelationCheck, noValidation, spin, - new AstFactoryImpl(), new EModelFactoryImpl(), new SModelFactoryImpl()); - // CHECKME: combine E/SModelFactory? + return new Lang(getParsedModules(), this.config); } // Load main module from file system // Load other modules via locator -- CHECKME: a bit inconsistent w.r.t. main? // TODO: make Path abstract as e.g. URI -- locator is abstract but Path is coupled to concrete DirectoryResourceLocator - public Main(ResourceLocator locator, - boolean debug, Path mainpath, boolean useOldWF, boolean noLiveness, + public Main(ResourceLocator locator, Path mainpath, + boolean debug, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) throws ScribException, ScribParserException { - //this.locator = locator; - this.loader = new ScribModuleLoader(locator, newAntlr()); - - Pair main = this.loader.loadMainModule(mainpath); - loadAllModuleImports(main, - debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, - noAcceptCorrelationCheck, noValidation, spin); - - // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource - this.config = newLangConfig(main.right.getFullModuleName(), + this(new Pair<>(locator, null), mainpath, debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); } @@ -120,28 +94,63 @@ public Main(String inline, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) throws ScribException, ScribParserException { - //this.locator = null; - this.loader = new ScribModuleLoader(null, newAntlr()); // CHECKME: null locator OK? + this(new Pair<>(null, inline), null, + debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, + noAcceptCorrelationCheck, noValidation, spin); + } - Pair main = this.loader.loadMainModule(inline); - if (main.right.getImportDeclChildren().stream() - .anyMatch(x -> x.isImportModule())) + private Main(Pair hack, Path mainpath, + boolean debug, boolean useOldWF, boolean noLiveness, boolean minEfsm, + boolean fair, boolean noLocalChoiceSubjectCheck, + boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) + throws ScribException, ScribParserException + { + Pair main; + if (hack.right == null) { - throw new ScribException( - "Module imports not permitted in inline main modules."); - // Because (currently) null locator + this.loader = new ScribModuleLoader(hack.left, newAntlr()); + main = this.loader.loadMainModule(mainpath); } + else + { + //this.locator = null; + this.loader = new ScribModuleLoader(null, newAntlr()); // CHECKME: null locator OK? + main = this.loader.loadMainModule(hack.right); + if (main.right.getImportDeclChildren().stream() + .anyMatch(x -> x.isImportModule())) + { + throw new ScribException( + "Module imports not permitted in inline main modules."); + // Because (currently) null locator + } + } + loadAllModuleImports(main, debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource + // FIXME: wrap flags in Map and move Config construction to Lang this.config = newLangConfig(main.right.getFullModuleName(), debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin); } - // Given the loaded main Module, populates this.loaded and this.modcs + //...FIXME: replace bools by a Map -- needed for subclassing -- pass Map to Lang instead of making config here? + public LangConfig newLangConfig(ModuleName mainFullname, + boolean debug, boolean useOldWF, boolean noLiveness, + boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, + boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) + { + return new LangConfig(mainFullname, + debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, + noAcceptCorrelationCheck, noValidation, spin, + new AstFactoryImpl(), new EModelFactoryImpl(), new SModelFactoryImpl()); + // CHECKME: combine E/SModelFactory? + } + + // Pre: main Module loaded by this.loader + // Given the already loaded main, populates this.parsed and this.modcs // Does so by transitively loading all module imports private void loadAllModuleImports(Pair main, boolean debug, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, @@ -149,21 +158,21 @@ private void loadAllModuleImports(Pair main, boolean noValidation, boolean spin) throws ScribParserException, ScribException { - loadAllAux(main); // Populates this.loaded + loadAllAux(main); // Populates this.parsed } - // Recursively records m in this.loaded and loads all module imports of m + // Recursively records m in this.parsed and loads all module imports of m private void loadAllAux(Pair m) throws ScribParserException, ScribException { - this.loaded.put(m.right.getFullModuleName(), m); + this.parsed.put(m.right.getFullModuleName(), m); for (ImportDecl id : m.right.getImportDeclChildren()) { if (id.isImportModule()) { ModuleName fullname = ((ImportModule) id).getModuleNameNodeChild().toName(); - if (!this.loaded.containsKey(fullname)) + if (!this.parsed.containsKey(fullname)) { loadAllAux(this.loader.loadModule(fullname)); } @@ -171,9 +180,9 @@ private void loadAllAux(Pair m) } } - public Map getLoadedModules() + public Map getParsedModules() { - return this.loaded.entrySet().stream() + return this.parsed.entrySet().stream() .collect(Collectors.toMap(Entry::getKey, e -> e.getValue().right)); } } From ec8cfb78b2f650a3384897c7f6ace954f752da76 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 7 Apr 2019 16:46:48 +0100 Subject: [PATCH 181/539] Continued: refactoring Main and Lang. --- .../src/main/java/org/scribble/lang/Lang.java | 65 ++++--------------- .../java/org/scribble/cli/CommandLine.java | 2 +- 2 files changed, 15 insertions(+), 52 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index f3ad47e87..8196c1c4b 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -15,6 +15,7 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -39,7 +40,7 @@ public class Lang public final LangConfig config; // Immutable // Keys are full names - private final Map modcs = new HashMap<>(); // CHECKME: constant? move to JobConfig? + private final Map modcs; // CHECKME: constant? move to JobConfig? private final LangContext context; // Mutable: Visitor passes update modules @@ -58,11 +59,13 @@ public Lang(Map parsed, LangConfig config) // Job.modcs could be used, but disamb already done by Lang // Lang/Job modcs should be moved to config/context though ModuleContextMaker maker = new ModuleContextMaker(); + Map modcs = new HashMap<>(); for (ModuleName fullname : parsed.keySet()) { - this.modcs.put(fullname, maker.make(parsed, parsed.get(fullname))); + modcs.put(fullname, maker.make(parsed, parsed.get(fullname))); // Throws ScribException } + this.modcs = Collections.unmodifiableMap(modcs); } // "Finalises" this Lang -- caches the Job at this point, and cannot run futher Visitor passes @@ -81,7 +84,8 @@ public Job toJob() throws ScribException { GProtocol g = (GProtocol) gpd.visitWith(t); imeds.add(g); - debugPrintln("\nParsed:\n" + gpd + "\n\nScribble intermediate:\n" + g); + debugPrintln( + "\nParsed:\n" + gpd + "\n\nScribble intermediate:\n" + g); } } this.job = new Job(imeds, this.modcs, this.config.toJobConfig()); @@ -89,36 +93,7 @@ public Job toJob() throws ScribException return this.job; } - /*// Scribble extensions should override these "new" methods - // CHECKME: move to MainContext::newJob? - public EGraphBuilderUtil newEGraphBuilderUtil() - { - return new EGraphBuilderUtil(this.config.ef); - } - - //public SGraphBuilderUtil newSGraphBuilderUtil() // FIXME TODO global builder util - public SGraph buildSGraph(GProtocolName fullname, Map egraphs, - boolean explicit) throws ScribbleException - { - debugPrintln("(" + fullname + ") Building global model using:"); - for (Role r : egraphs.keySet()) - { - // FIXME: refactor - debugPrintln("-- EFSM for " - + r + ":\n" + egraphs.get(r).init.toDot()); - } - //return SGraph.buildSGraph(this, fullname, createInitialSConfig(this, egraphs, explicit)); - return this.sgbu.buildSGraph(this, fullname, egraphs, explicit); // FIXME: factor out util - }*/ - - /*public void checkWellFormedness() throws ScribbleException - { - runContextBuildingPasses(); - //runUnfoldingPass(); - runWellFormednessPasses(); - }*/ - - public void runContextBuildingPasses() throws ScribException + public void runDisambPasses() throws ScribException { // CHECKME: in the end, should these also be refactored into core? (instead of AST visiting) runVisitorPassOnAllModules(ModuleContextBuilder.class); // Always done first (even if other contexts are built later) so that following passes can use ModuleContextVisitor @@ -129,26 +104,19 @@ public void runVisitorPassOnAllModules(Class c) throws ScribException { debugPrintPass("Running " + c + " on all modules:"); - runVisitorPass(this.context.getFullModuleNames(), c); + runVisitorPass(c, this.context.getFullModuleNames()); } - public void runVisitorPassOnParsedModules(Class c) - throws ScribException - { - debugPrintPass("Running " + c + " on parsed modules:"); - runVisitorPass(this.context.getParsedFullModuleNames(), c); - } - - private void runVisitorPass(Set modnames, - Class c) throws ScribException + private void runVisitorPass(Class c, + Set fullnames) throws ScribException { try { Constructor cons = c.getConstructor(Lang.class); - for (ModuleName modname : modnames) + for (ModuleName fullname : fullnames) { AstVisitor nv = cons.newInstance(this); - runVisitorOnModule(modname, nv); + runVisitorOnModule(fullname, nv); } } catch (NoSuchMethodException | SecurityException | InstantiationException @@ -180,11 +148,6 @@ public ModuleContext getModuleContext(ModuleName fullname) return this.modcs.get(fullname); } - public boolean isDebug() - { - return this.config.debug; - } - public void warningPrintln(String s) { System.err.println("[Warning] " + s); @@ -200,6 +163,6 @@ public void debugPrintln(String s) private void debugPrintPass(String s) { - debugPrintln("\n[Job] " + s); + debugPrintln("\n[Lang] " + s); } } diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index ce7b43256..88b9252dc 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -201,7 +201,7 @@ protected void doValidationTasks(Lang lang) // Base Scribble else*/ { - lang.runContextBuildingPasses(); // TODO: refactor, w.r.t. below + lang.runDisambPasses(); // TODO: refactor, w.r.t. below lang.toJob().checkWellFormedness(); } From e8a97be55e653e89216585d1cbabf82890e4024a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 7 Apr 2019 17:34:18 +0100 Subject: [PATCH 182/539] Continued: refactoring Main and Lang. --- .../org/scribble/del/global/GChoiceDel.java | 3 +- .../scribble/del/global/GProtocolDeclDel.java | 12 +-- .../src/main/java/org/scribble/lang/Lang.java | 20 ++++- .../java/org/scribble/lang/LangConfig.java | 45 ++++------- .../java/org/scribble/visit/EnvVisitor.java | 4 +- .../visit/InlinedProtocolVisitor.java | 4 +- .../org/scribble/visit/UnfoldingVisitor.java | 4 +- .../visit/validation/GProtocolValidator.java | 6 +- .../scribble/visit/wf/WFChoiceChecker.java | 7 +- .../main/java/org/scribble/cli/CLArgFlag.java | 2 +- .../java/org/scribble/cli/CommandLine.java | 32 +++++--- .../callbackapi/CBEndpointApiGenerator.java | 16 ++-- .../callbackapi/CBEndpointApiGenerator3.java | 2 +- .../StateChannelApiGenerator.java | 2 +- .../ioifaces/IOInterfacesGenerator.java | 2 +- .../java/org/scribble/core/job/JobConfig.java | 2 +- .../src/main/java/org/scribble/main/Main.java | 77 ++++++------------- 17 files changed, 112 insertions(+), 128 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java index e3fa0ceab..32a037c25 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -29,6 +29,7 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.global.GSeq; import org.scribble.del.ChoiceDel; +import org.scribble.lang.LangArgs; import org.scribble.util.RuntimeScribException; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; @@ -99,7 +100,7 @@ public GChoice leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, List all = cho.getBlockChildren().stream().map(b -> (WFChoiceEnv) b.del().env()) .collect(Collectors.toList()); - if (checker.lang.config.useOldWf) // **** + if (checker.lang.config.args.get(LangArgs.useOldWf)) // **** { if (all.size() > 1) { diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index e7135a986..5dcd638d0 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -176,23 +176,23 @@ public void enterValidation(ScribNode parent, ScribNode child, } GProtocolName fullname = gpd.getFullMemberName((Module) parent); - if (checker.job2.config.spin) + if (checker.job.config.spin) { - if (checker.job2.config.fair) + if (checker.job.config.fair) { throw new RuntimeException( "[TODO]: -spin currently does not support fair ouput choices."); } - GProtocol.validateBySpin(checker.job2, fullname); + GProtocol.validateBySpin(checker.job, fullname); } else { - GProtocol.validateByScribble(checker.job2, fullname, true); - if (!checker.lang.config.fair) + GProtocol.validateByScribble(checker.job, fullname, true); + if (!checker.job.config.fair) { checker.lang.debugPrintln( "(" + fullname + ") Validating with \"unfair\" output choices.. "); - GProtocol.validateByScribble(checker.job2, fullname, false); // TODO: only need to check progress, not full validation + GProtocol.validateByScribble(checker.job, fullname, false); // TODO: only need to check progress, not full validation } } } diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index 8196c1c4b..a05f0d10f 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -21,11 +21,14 @@ import java.util.Map; import java.util.Set; +import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; import org.scribble.core.job.Job; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.lang.global.GProtocol; +import org.scribble.core.model.endpoint.EModelFactoryImpl; +import org.scribble.core.model.global.SModelFactoryImpl; import org.scribble.core.type.name.ModuleName; import org.scribble.lang.context.ModuleContextMaker; import org.scribble.util.ScribException; @@ -48,10 +51,13 @@ public class Lang // Just take MainContext as arg? -- would need to fix Maven dependencies //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) - public Lang(Map parsed, LangConfig config) + public Lang(Map parsed, Map args, ModuleName mainFullname) throws ScribException { - this.config = config; + // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource + // FIXME: wrap flags in Map and move Config construction to Lang + this.config = newLangConfig(mainFullname, args); + this.context = new LangContext(this, parsed); // Single instance per Lang, should not be shared between Langs // CHECKME: how does this relate to the ModuleContextBuilder pass? @@ -67,6 +73,14 @@ public Lang(Map parsed, LangConfig config) } this.modcs = Collections.unmodifiableMap(modcs); } + + public LangConfig newLangConfig(ModuleName mainFullname, + Map args) + { + return new LangConfig(mainFullname, args, new AstFactoryImpl(), + new EModelFactoryImpl(), new SModelFactoryImpl()); + // CHECKME: combine E/SModelFactory? + } // "Finalises" this Lang -- caches the Job at this point, and cannot run futher Visitor passes // CHECKME: revise this pattern? @@ -155,7 +169,7 @@ public void warningPrintln(String s) public void debugPrintln(String s) { - if (this.config.debug) + if (this.config.args.get(LangArgs.debug)) { System.out.println(s); } diff --git a/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java b/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java index 84cf1ef01..a7e7a1096 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java +++ b/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java @@ -13,51 +13,34 @@ */ package org.scribble.lang; +import java.util.Collections; +import java.util.Map; + import org.scribble.ast.AstFactory; import org.scribble.core.job.JobConfig; import org.scribble.core.model.endpoint.EModelFactory; import org.scribble.core.model.global.SModelFactory; import org.scribble.core.type.name.ModuleName; -// The "static" (constant) info for Jobs -- cf. JobContext "dynamic" state +// The "static" (constant) info for Lang -- cf. LangContext "dynamic" state public class LangConfig { public final ModuleName main; // Full name - // CHECKME: verbose/debug printing parameter? - public final boolean debug; - public final boolean useOldWf; - public final boolean noProgress; // TODO: deprecate - public final boolean minEfsm; // Currently only affects EFSM output (i.e. -fsm, -dot) and API gen -- doesn't affect model checking - public final boolean fair; - public final boolean noLocalChoiceSubjectCheck; - public final boolean noAcceptCorrelationCheck; // Currently unused - public final boolean noValidation; - public final boolean spin; + public final Map args; + // CHECKME: verbose/debug printing parameter? public final AstFactory af; public final EModelFactory ef; public final SModelFactory sf; // N.B. MainContext is in a different non-visible (by Maven) package - public LangConfig(ModuleName mainFullname, boolean debug, boolean useOldWf, boolean noLiveness, boolean minEfsm, - boolean fair, boolean noLocalChoiceSubjectCheck, - boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin, + public LangConfig(ModuleName mainFullname, + Map args, AstFactory af, EModelFactory ef, SModelFactory sf) { this.main = mainFullname; - - //this.jUnit = jUnit; - this.debug = debug; - this.useOldWf = useOldWf; - this.noProgress = noLiveness; - this.minEfsm = minEfsm; - this.fair = fair; - this.noLocalChoiceSubjectCheck = noLocalChoiceSubjectCheck; - this.noAcceptCorrelationCheck = noAcceptCorrelationCheck; - this.noValidation = noValidation; - this.spin = spin; - + this.args = Collections.unmodifiableMap(args); this.af = af; this.ef = ef; this.sf = sf; @@ -65,8 +48,12 @@ public LangConfig(ModuleName mainFullname, boolean debug, boolean useOldWf, bool public JobConfig toJobConfig() { - return new JobConfig(debug, main, useOldWf, noProgress, minEfsm, fair, - noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, spin, - ef, sf); + return new JobConfig(this.main, + args.get(LangArgs.debug), args.get(LangArgs.useOldWf), + args.get(LangArgs.noProgress), args.get(LangArgs.minEfsm), + args.get(LangArgs.fair), args.get(LangArgs.noLocalChoiceSubjectCheck), + args.get(LangArgs.noAcceptCorrelationCheck), + args.get(LangArgs.noValidation), args.get(LangArgs.spin), + this.ef, this.sf); } } diff --git a/scribble-ast/src/main/java/org/scribble/visit/EnvVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/EnvVisitor.java index d717b3589..4edc526e6 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/EnvVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/EnvVisitor.java @@ -30,9 +30,9 @@ public abstract class EnvVisitor> extends ModuleContextVisitor { private LinkedList envs = new LinkedList(); // Deque - public EnvVisitor(Lang job) + public EnvVisitor(Lang lang) { - super(job); + super(lang); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java index 3d33ddff6..569198806 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java @@ -22,9 +22,9 @@ public abstract class InlinedProtocolVisitor> extends EnvVisitor { - public InlinedProtocolVisitor(Lang job) + public InlinedProtocolVisitor(Lang lang) { - super(job); + super(lang); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/visit/UnfoldingVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/UnfoldingVisitor.java index 9054b754f..e018a9cee 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/UnfoldingVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/UnfoldingVisitor.java @@ -43,9 +43,9 @@ public abstract class UnfoldingVisitor> // Also FIXME: recvar shadowing: though this stack should be enough private Set unfolded = new HashSet<>(); - public UnfoldingVisitor(Lang job) + public UnfoldingVisitor(Lang lang) { - super(job); + super(lang); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/visit/validation/GProtocolValidator.java b/scribble-ast/src/main/java/org/scribble/visit/validation/GProtocolValidator.java index b628ed585..e4a2a2504 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/validation/GProtocolValidator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/validation/GProtocolValidator.java @@ -21,18 +21,18 @@ public class GProtocolValidator extends ModuleContextVisitor { - public final Job job2; + public final Job job; public GProtocolValidator(Lang job) { super(job); - this.job2 = null; + this.job = null; } public GProtocolValidator(Job job2) { super(null); - this.job2 = job2; + this.job = job2; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java b/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java index 42aa0c866..f632fb362 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java +++ b/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java @@ -23,6 +23,7 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.lang.Lang; +import org.scribble.lang.LangArgs; import org.scribble.util.ScribException; import org.scribble.visit.UnfoldingVisitor; import org.scribble.visit.wf.env.WFChoiceEnv; @@ -36,9 +37,9 @@ public class WFChoiceChecker extends UnfoldingVisitor // equals method identity not suitable unless AST nodes record additional info like syntactic position private Set> visited = new HashSet<>(); - public WFChoiceChecker(Lang job) + public WFChoiceChecker(Lang lang) { - super(job); + super(lang); } @Override @@ -63,7 +64,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) } } - if (this.lang.config.useOldWf) + if (this.lang.config.args.get(LangArgs.useOldWf)) { if (child instanceof Choice) // Only needed for old WF (for distinct enabling message checking) // FIXME: maybe move connectedness checking to a separate pass, i.e. vanilla UnfoldingVisitor (if retained as syntactic check) { diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java index 8301351d9..f58c53bfd 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java @@ -22,7 +22,7 @@ public enum CLArgFlag VERBOSE, SCHAN_API_SUBTYPES, OLD_WF, - NO_LIVENESS, + NO_PROGRESS, LTSCONVERT_MIN, // Currently only affects EFSM output (i.e. -fsm..) and API gen -- doesn't affect validation FAIR, NO_LOCAL_CHOICE_SUBJECT_CHECK, diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 88b9252dc..3ae4c273b 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -18,6 +18,7 @@ import java.nio.file.Paths; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Consumer; @@ -37,6 +38,7 @@ import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.Role; import org.scribble.lang.Lang; +import org.scribble.lang.LangArgs; import org.scribble.lang.LangContext; import org.scribble.main.Main; import org.scribble.main.resource.locator.DirectoryResourceLocator; @@ -72,10 +74,10 @@ public CommandLine(String... args) throws CommandLineException protected Main newMainContext() throws ScribParserException, ScribException { - //boolean jUnit = this.args.containsKey(ArgFlag.JUNIT); + // FIXME: refactor into arg parsing boolean debug = this.args.containsKey(CLArgFlag.VERBOSE); // TODO: factor out (cf. MainContext fields) - boolean useOldWF = this.args.containsKey(CLArgFlag.OLD_WF); - boolean noLiveness = this.args.containsKey(CLArgFlag.NO_LIVENESS); + boolean useOldWf = this.args.containsKey(CLArgFlag.OLD_WF); + boolean noProgress = this.args.containsKey(CLArgFlag.NO_PROGRESS); boolean minEfsm = this.args.containsKey(CLArgFlag.LTSCONVERT_MIN); boolean fair = this.args.containsKey(CLArgFlag.FAIR); boolean noLocalChoiceSubjectCheck = @@ -84,6 +86,19 @@ protected Main newMainContext() this.args.containsKey(CLArgFlag.NO_ACCEPT_CORRELATION_CHECK); boolean noValidation = this.args.containsKey(CLArgFlag.NO_VALIDATION); boolean spin = this.args.containsKey(CLArgFlag.SPIN); + + // FIXME: refactor into arg parsing + Map args = new HashMap<>(); + args.put(LangArgs.debug, debug); + args.put(LangArgs.useOldWf, useOldWf); + args.put(LangArgs.noProgress, noProgress); + args.put(LangArgs.minEfsm, minEfsm); + args.put(LangArgs.fair, fair); + args.put(LangArgs.noLocalChoiceSubjectCheck, noLocalChoiceSubjectCheck); + args.put(LangArgs.noAcceptCorrelationCheck, noAcceptCorrelationCheck); + args.put(LangArgs.noValidation, noValidation); + args.put(LangArgs.spin, spin); + args = Collections.unmodifiableMap(args); List impaths = this.args.containsKey(CLArgFlag.IMPORT_PATH) ? CommandLine.parseImportPaths(this.args.get(CLArgFlag.IMPORT_PATH)[0]) @@ -91,18 +106,13 @@ protected Main newMainContext() if (this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) { String inline = this.args.get(CLArgFlag.INLINE_MAIN_MOD)[0]; - return new Main(inline, - debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, - noAcceptCorrelationCheck, noValidation, spin); + return new Main(inline, args); } else { ResourceLocator locator = new DirectoryResourceLocator(impaths); Path mainpath = CommandLine.parseMainPath(this.args.get(CLArgFlag.MAIN_MOD)[0]); - return new Main(locator, - mainpath, debug, useOldWF, noLiveness, minEfsm, fair, - noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, - spin); + return new Main(locator, mainpath, args); } } @@ -244,7 +254,7 @@ protected void tryOutputTasks(Lang lang) || this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH) || this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH_PNG)) { - if (lang.config.useOldWf) + if (lang.config.args.get(LangArgs.useOldWf)) { throw new CommandLineException( "Global model flag(s) incompatible with: " diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 38d17427b..ef0e210bc 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -44,8 +44,8 @@ @Deprecated public class CBEndpointApiGenerator { - public final Lang job; - public final Job job2; + public final Lang lang; + public final Job job; public final GProtocolName proto; public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral @@ -53,10 +53,10 @@ public class CBEndpointApiGenerator public CBEndpointApiGenerator(Lang job, GProtocolName fullname, Role self, boolean subtypes) { - this.job = job; + this.lang = job; try { - this.job2 = job.toJob(); + this.job = job.toJob(); } catch (ScribException e) // TODO: refactor { @@ -81,18 +81,18 @@ public Map build() throws ScribException public Map buildSessionApi() throws ScribException // FIXME: factor out -- integrate with JEndpointApiGenerator { - this.job.debugPrintln("\n[param-core] Running " + CBEndpointApiGenerator.class + " for " + this.proto + "@" + this.self); + this.lang.debugPrintln("\n[param-core] Running " + CBEndpointApiGenerator.class + " for " + this.proto + "@" + this.self); Map res = new HashMap<>(); - res.putAll(new SessionApiGenerator(this.job, this.proto).generateApi()); + res.putAll(new SessionApiGenerator(this.lang, this.proto).generateApi()); res.putAll(buildEndpointClass()); return res; } public Map buildEndpointClass() throws ScribException { - Module main = this.job.getContext().getMainModule(); - JobContext jobc2 = this.job2.getContext(); + Module main = this.lang.getContext().getMainModule(); + JobContext jobc2 = this.job.getContext(); EState init = (this.job.config.minEfsm ? jobc2.getMinimisedEGraph(this.proto, this.self) : jobc2.getEGraph(this.proto, this.self) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 63801f8e6..9affa84a6 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -108,7 +108,7 @@ public Map buildEndpointClass() throws ScribException Map res = new HashMap<>(); JobContext jobc2 = this.job.getContext(); - EState init = (this.lang.config.minEfsm + EState init = (this.job.config.minEfsm ? jobc2.getMinimisedEGraph(this.proto, this.self) : jobc2.getEGraph(this.proto, this.self) ).init; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 04b96d195..00e0f4145 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -65,7 +65,7 @@ public StateChannelApiGenerator(Lang lang, GProtocolName fullname, Role self) this.lpn = Projector2.projectFullProtocolName(fullname, self); //this.init = job.getContext().getEndpointGraph(fullname, self).init; JobContext jobc2 = this.job.getContext(); - this.init = lang.config.minEfsm + this.init = this.job.config.minEfsm ? jobc2.getMinimisedEGraph(fullname, self).init : jobc2.getEGraph(fullname, self).init; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index 5b6cf3c43..9e5fb5088 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -80,7 +80,7 @@ public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) Role self = getSelf(); //EndpointState init = this.job.getContext().getEndpointGraph(fullname, self).init; JobContext jobc2 = this.job.getContext(); - EState init = this.lang.config.minEfsm + EState init = this.job.config.minEfsm ? jobc2.getMinimisedEGraph(fullname, self).init : jobc2.getEGraph(fullname, self).init; diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java b/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java index d8210c704..e7a617163 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java @@ -37,7 +37,7 @@ public class JobConfig public final SModelFactory sf; // N.B. MainContext is in a different non-visible (by Maven) package - public JobConfig(boolean debug, ModuleName main, boolean useOldWF, boolean noLiveness, boolean minEfsm, + public JobConfig(ModuleName main, boolean debug, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin, EModelFactory ef, SModelFactory sf) diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index 3b60a4fc9..092413c3e 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -14,20 +14,18 @@ package org.scribble.main; import java.nio.file.Path; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.stream.Collectors; -import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.ImportDecl; import org.scribble.ast.ImportModule; import org.scribble.ast.Module; -import org.scribble.core.model.endpoint.EModelFactoryImpl; -import org.scribble.core.model.global.SModelFactoryImpl; import org.scribble.core.type.name.ModuleName; import org.scribble.lang.Lang; -import org.scribble.lang.LangConfig; +import org.scribble.lang.LangArgs; import org.scribble.main.resource.Resource; import org.scribble.main.resource.loader.ScribModuleLoader; import org.scribble.main.resource.locator.ResourceLocator; @@ -51,10 +49,11 @@ */ public class Main { + public final ModuleName main; + public final Map args; + //private final ResourceLocator locator; // Path -> Resource private final ScribModuleLoader loader; // ModuleName -> Pair - - public final LangConfig config; // Keys are full names -- parsed are the modules read from file, distinguished from the generated projection modules // Resource recorded for source path @@ -70,40 +69,34 @@ protected ScribAntlrWrapper newAntlr() // A Scribble extension should override newAntlr/Lang as appropriate public Lang newLang() throws ScribException { - return new Lang(getParsedModules(), this.config); + return newLang(getParsedModules(), this.args, this.main); + } + + // A Scribble extension should override newAntlr/Lang as appropriate + protected Lang newLang(Map parsed, + Map args, ModuleName mainFullname) throws ScribException + { + return new Lang(parsed, args, mainFullname); } // Load main module from file system // Load other modules via locator -- CHECKME: a bit inconsistent w.r.t. main? // TODO: make Path abstract as e.g. URI -- locator is abstract but Path is coupled to concrete DirectoryResourceLocator - public Main(ResourceLocator locator, Path mainpath, - boolean debug, boolean useOldWF, boolean noLiveness, - boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, - boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) - throws ScribException, ScribParserException + public Main(ResourceLocator locator, Path mainpath, + Map args) throws ScribException, ScribParserException { - this(new Pair<>(locator, null), mainpath, - debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, - noAcceptCorrelationCheck, noValidation, spin); + this(new Pair<>(locator, null), mainpath, args); } // Load an inline module arg -- module imports not allowed (currently no ResourceLocator) - public Main(String inline, - boolean debug, boolean useOldWF, boolean noLiveness, boolean minEfsm, - boolean fair, boolean noLocalChoiceSubjectCheck, - boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) + public Main(String inline, Map args) throws ScribException, ScribParserException { - this(new Pair<>(null, inline), null, - debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, - noAcceptCorrelationCheck, noValidation, spin); + this(new Pair<>(null, inline), null, args); } - private Main(Pair hack, Path mainpath, - boolean debug, boolean useOldWF, boolean noLiveness, boolean minEfsm, - boolean fair, boolean noLocalChoiceSubjectCheck, - boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) - throws ScribException, ScribParserException + private Main(Pair hack, Path mainpath, + Map args) throws ScribException, ScribParserException { Pair main; if (hack.right == null) @@ -125,37 +118,15 @@ private Main(Pair hack, Path mainpath, } } - loadAllModuleImports(main, - debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, - noAcceptCorrelationCheck, noValidation, spin); - - // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource - // FIXME: wrap flags in Map and move Config construction to Lang - this.config = newLangConfig(main.right.getFullModuleName(), - debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, - noAcceptCorrelationCheck, noValidation, spin); - } - - //...FIXME: replace bools by a Map -- needed for subclassing -- pass Map to Lang instead of making config here? - public LangConfig newLangConfig(ModuleName mainFullname, - boolean debug, boolean useOldWF, boolean noLiveness, - boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, - boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin) - { - return new LangConfig(mainFullname, - debug, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, - noAcceptCorrelationCheck, noValidation, spin, - new AstFactoryImpl(), new EModelFactoryImpl(), new SModelFactoryImpl()); - // CHECKME: combine E/SModelFactory? + this.main = main.right.getFullModuleName(); + this.args = Collections.unmodifiableMap(args); + loadAllModuleImports(main); } // Pre: main Module loaded by this.loader // Given the already loaded main, populates this.parsed and this.modcs // Does so by transitively loading all module imports - private void loadAllModuleImports(Pair main, - boolean debug, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, - boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, - boolean noValidation, boolean spin) + private void loadAllModuleImports(Pair main) throws ScribParserException, ScribException { loadAllAux(main); // Populates this.parsed From 0d9f7ae1818e9e29eb7bc990eb800563d59a96f6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 7 Apr 2019 17:34:49 +0100 Subject: [PATCH 183/539] Added missing LangArgs.java. --- .../main/java/org/scribble/lang/LangArgs.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 scribble-ast/src/main/java/org/scribble/lang/LangArgs.java diff --git a/scribble-ast/src/main/java/org/scribble/lang/LangArgs.java b/scribble-ast/src/main/java/org/scribble/lang/LangArgs.java new file mode 100644 index 000000000..7c32dbc78 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/lang/LangArgs.java @@ -0,0 +1,39 @@ +package org.scribble.lang; + +public enum LangArgs +{ + debug, + useOldWf, + noProgress, + minEfsm, + fair, + noLocalChoiceSubjectCheck, + noAcceptCorrelationCheck, + noValidation, + spin; + + /*public final boolean debug; + public final boolean useOldWf; + public final boolean noProgress; // TODO: deprecate + public final boolean minEfsm; // Currently only affects EFSM output (i.e. -fsm, -dot) and API gen -- doesn't affect model checking + public final boolean fair; + public final boolean noLocalChoiceSubjectCheck; + public final boolean noAcceptCorrelationCheck; // Currently unused + public final boolean noValidation; + public final boolean spin; + +//boolean debug, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin + public LangArgs(Set args) + { + this.debug = debug; + this.useOldWf = useOldWf; + this.noProgress = noLiveness; + this.minEfsm = minEfsm; + this.fair = fair; + this.noLocalChoiceSubjectCheck = noLocalChoiceSubjectCheck; + this.noAcceptCorrelationCheck = noAcceptCorrelationCheck; + this.noValidation = noValidation; + this.spin = spin; + }*/ + +} From 1cbef2282e82ad8c37d172e6bb15c5fffd524f64 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 7 Apr 2019 18:09:44 +0100 Subject: [PATCH 184/539] Added missing LangArgs.java. --- .../src/main/java/org/scribble/lang/Lang.java | 52 +++++++++++++------ .../java/org/scribble/lang/LangContext.java | 28 +++++----- .../org/scribble/visit/GTypeTranslator.java | 4 +- .../org/scribble/visit/SimpleAstVisitor.java | 8 +-- .../src/main/java/org/scribble/main/Main.java | 42 ++++++++------- 5 files changed, 79 insertions(+), 55 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index a05f0d10f..c7db61f4f 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -25,6 +25,7 @@ import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; import org.scribble.core.job.Job; +import org.scribble.core.job.JobConfig; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.model.endpoint.EModelFactoryImpl; @@ -42,23 +43,24 @@ public class Lang { public final LangConfig config; // Immutable - // Keys are full names - private final Map modcs; // CHECKME: constant? move to JobConfig? - private final LangContext context; // Mutable: Visitor passes update modules + + // Keys are full names + private final Map modcs; + // CHECKME: constant? depends on adding projections? + // CHECKME: move to Config/Context? private Job job; - + // Just take MainContext as arg? -- would need to fix Maven dependencies //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) - public Lang(Map parsed, Map args, ModuleName mainFullname) - throws ScribException + public Lang(Map parsed, Map args, + ModuleName mainFullname) throws ScribException { // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource // FIXME: wrap flags in Map and move Config construction to Lang this.config = newLangConfig(mainFullname, args); - - this.context = new LangContext(this, parsed); // Single instance per Lang, should not be shared between Langs + this.context = newLangContext(this, parsed); // Single instance per Lang, should not be shared between Langs // CHECKME: how does this relate to the ModuleContextBuilder pass? // Job.modcs seems unused? Lang.modcs is used though, by old AST visitors -- basically old ModuleContextVisitor is redundant? @@ -74,27 +76,45 @@ public Lang(Map parsed, Map args, ModuleN this.modcs = Collections.unmodifiableMap(modcs); } - public LangConfig newLangConfig(ModuleName mainFullname, + // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate + protected LangConfig newLangConfig(ModuleName mainFullname, Map args) { return new LangConfig(mainFullname, args, new AstFactoryImpl(), new EModelFactoryImpl(), new SModelFactoryImpl()); // CHECKME: combine E/SModelFactory? } + + // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate + protected LangContext newLangContext(Lang lang, Map parsed) + { + return new LangContext(this, parsed); + } + + // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate + protected GTypeTranslator newTranslator(ModuleName rootFullname) + { + return new GTypeTranslator(this, rootFullname); + } + + // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate + protected Job newJob(Map modcs, Set imeds, JobConfig config) + { + return new Job(imeds, modcs, config); + } // "Finalises" this Lang -- caches the Job at this point, and cannot run futher Visitor passes // CHECKME: revise this pattern? - public Job toJob() throws ScribException + public final Job toJob() throws ScribException { if (this.job == null) { - Set fullnames = this.context.getFullModuleNames(); + Map parsed = this.context.getParsed(); Set imeds = new HashSet<>(); - for (ModuleName fullname : fullnames) + for (ModuleName fullname : parsed.keySet()) { - Module m = this.context.getModule(fullname); - GTypeTranslator t = new GTypeTranslator(this, fullname); - for (GProtocolDecl gpd : m.getGProtoDeclChildren()) + GTypeTranslator t = newTranslator(fullname); + for (GProtocolDecl gpd : parsed.get(fullname).getGProtoDeclChildren()) { GProtocol g = (GProtocol) gpd.visitWith(t); imeds.add(g); @@ -102,7 +122,7 @@ public Job toJob() throws ScribException "\nParsed:\n" + gpd + "\n\nScribble intermediate:\n" + g); } } - this.job = new Job(imeds, this.modcs, this.config.toJobConfig()); + this.job = newJob(this.modcs, imeds, this.config.toJobConfig()); } return this.job; } diff --git a/scribble-ast/src/main/java/org/scribble/lang/LangContext.java b/scribble-ast/src/main/java/org/scribble/lang/LangContext.java index b758fb6ad..85e957428 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/LangContext.java +++ b/scribble-ast/src/main/java/org/scribble/lang/LangContext.java @@ -48,6 +48,20 @@ public Module getMainModule() return getModule(this.lang.config.main); } + // HACK -- CHECKME: separate original parsed from "working set"? + public Map getParsed() + { + return Collections.unmodifiableMap(this.parsed); + } + + public GProtocolDecl getParsed(GProtocolName fullname) + { + return this.parsed.get(fullname.getPrefix()) + .getGProtoDeclChildren().stream().filter(x -> x.getHeaderChild() + .getDeclName().equals(fullname.getSimpleName())) + .findAny().get(); + } + // Used by Job for pass running, includes projections (e.g. for reachability checking) // Safer to get module names and require user to re-fetch the module by the getter each time (after replacing), to make sure the latest is used public Set getFullModuleNames() @@ -102,18 +116,4 @@ protected void replaceModule(Module module) throw new RuntimeException("Unknown module: " + fullname); } } - - // HACK -- CHECKME: separate original parsed from "working set"? - public Map getParsed() - { - return Collections.unmodifiableMap(this.parsed); - } - - public GProtocolDecl getParsed(GProtocolName fullname) - { - return this.parsed.get(fullname.getPrefix()) - .getGProtoDeclChildren().stream().filter(x -> x.getHeaderChild() - .getDeclName().equals(fullname.getSimpleName())) - .findAny().get(); - } } diff --git a/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java index 733b3b1df..760a51500 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java @@ -23,9 +23,9 @@ // CHECKME: move to visit package? public class GTypeTranslator extends SimpleAstVisitor { - public GTypeTranslator(Lang lang, ModuleName fullname) + public GTypeTranslator(Lang lang, ModuleName rootFullname) { - super(lang, fullname); + super(lang, rootFullname); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java index ce462dd0f..9bfc3beac 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java @@ -25,12 +25,12 @@ public abstract class SimpleAstVisitor { public final Lang lang; - public final ModuleName fullname; // Root module -- used to get ModuleContext + public final ModuleName root; // Root module, full name -- used to get ModuleContext - public SimpleAstVisitor(Lang lang, ModuleName fullname) + public SimpleAstVisitor(Lang lang, ModuleName rootFullname) { this.lang = lang; - this.fullname = fullname; + this.root = rootFullname; } // Override to delegate to del-specific method, e.g., n.del().visit(n, this) @@ -39,6 +39,6 @@ public SimpleAstVisitor(Lang lang, ModuleName fullname) public ModuleContext getModuleContext() { - return this.lang.getModuleContext(this.fullname); + return this.lang.getModuleContext(this.root); } } diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index 092413c3e..955618050 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -59,25 +59,6 @@ public class Main // Resource recorded for source path private final Map> parsed = new HashMap<>(); - - // A Scribble extension should override newAntlr/Lang as appropriate - protected ScribAntlrWrapper newAntlr() - { - return new ScribAntlrWrapper(); - } - - // A Scribble extension should override newAntlr/Lang as appropriate - public Lang newLang() throws ScribException - { - return newLang(getParsedModules(), this.args, this.main); - } - - // A Scribble extension should override newAntlr/Lang as appropriate - protected Lang newLang(Map parsed, - Map args, ModuleName mainFullname) throws ScribException - { - return new Lang(parsed, args, mainFullname); - } // Load main module from file system // Load other modules via locator -- CHECKME: a bit inconsistent w.r.t. main? @@ -95,12 +76,16 @@ public Main(String inline, Map args) this(new Pair<>(null, inline), null, args); } + // Pre: hack.left == null xor hack.right == null + // Hack to "unify" the constructors (to satisfy final field init more conveniently) private Main(Pair hack, Path mainpath, Map args) throws ScribException, ScribParserException { + // Set this.loader and load main Pair main; if (hack.right == null) { + //this.locator = hack.left; this.loader = new ScribModuleLoader(hack.left, newAntlr()); main = this.loader.loadMainModule(mainpath); } @@ -123,6 +108,19 @@ private Main(Pair hack, Path mainpath, loadAllModuleImports(main); } + // A Scribble extension should override newAntlr/Lang as appropriate + protected ScribAntlrWrapper newAntlr() + { + return new ScribAntlrWrapper(); + } + + // A Scribble extension should override newAntlr/Lang as appropriate + protected Lang newLang(Map parsed, + Map args, ModuleName mainFullname) throws ScribException + { + return new Lang(parsed, args, mainFullname); + } + // Pre: main Module loaded by this.loader // Given the already loaded main, populates this.parsed and this.modcs // Does so by transitively loading all module imports @@ -151,6 +149,12 @@ private void loadAllAux(Pair m) } } + // For a Scribble extension, override newLang(parsed, args, mainFullname) + public final Lang newLang() throws ScribException + { + return newLang(getParsedModules(), this.args, this.main); + } + public Map getParsedModules() { return this.parsed.entrySet().stream() From f08dce275722cf87607f6510b7ea236c09488855 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 7 Apr 2019 19:20:45 +0100 Subject: [PATCH 185/539] Continued: refactoring Lang and Job. --- .../main/java/org/scribble/del/ModuleDel.java | 2 +- .../org/scribble/del/global/GChoiceDel.java | 4 +- .../scribble/del/global/GProtocolDeclDel.java | 7 ++- .../src/main/java/org/scribble/lang/Lang.java | 63 ++++++++++++------- .../java/org/scribble/lang/LangConfig.java | 13 ++-- .../java/org/scribble/lang/LangContext.java | 2 +- ...Maker.java => ModuleContextCollector.java} | 6 +- .../visit/context/ModuleContextBuilder.java | 4 +- .../scribble/visit/wf/WFChoiceChecker.java | 4 +- .../java/org/scribble/cli/CommandLine.java | 26 ++++---- .../callbackapi/CBEndpointApiGenerator.java | 3 +- .../callbackapi/CBEndpointApiGenerator3.java | 3 +- .../StateChannelApiGenerator.java | 3 +- .../ioifaces/IOInterfacesGenerator.java | 3 +- .../main/java/org/scribble/core/job/Job.java | 10 +-- .../java/org/scribble/core/job/JobArgs.java | 4 +- .../java/org/scribble/core/job/JobConfig.java | 27 ++------ .../scribble/core/lang/global/GProtocol.java | 7 ++- .../core/model/global/SGraphBuilderUtil.java | 3 +- .../scribble/core/model/global/SModel.java | 7 ++- .../src/main/java/org/scribble/main/Main.java | 12 ++-- 21 files changed, 108 insertions(+), 105 deletions(-) rename scribble-ast/src/main/java/org/scribble/lang/context/{ModuleContextMaker.java => ModuleContextCollector.java} (98%) rename scribble-ast/src/main/java/org/scribble/lang/LangArgs.java => scribble-core/src/main/java/org/scribble/core/job/JobArgs.java (95%) diff --git a/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java b/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java index fa7544dd2..439746a1d 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java @@ -61,7 +61,7 @@ public void enterModuleContextBuilding(ScribNode parent, ScribNode child, { builder.setModuleContext( //new ModuleContext(builder.job.getContext().getParsed(), (Module) child) - builder.maker.make(builder.lang.getContext().getParsed(), (Module) child) + builder.maker.build(builder.lang.getContext().getParsed(), (Module) child) ); // ModuleContext building is done solely by "new ModuleContext" (no deeper visiting needed) // The only thing ModuleContextBuilder really does is to set the ModuleContext in ModuleDel diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java index 32a037c25..a48e211d6 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -25,11 +25,11 @@ import org.scribble.ast.local.LChoice; import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.job.JobArgs; import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.global.GSeq; import org.scribble.del.ChoiceDel; -import org.scribble.lang.LangArgs; import org.scribble.util.RuntimeScribException; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; @@ -100,7 +100,7 @@ public GChoice leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, List all = cho.getBlockChildren().stream().map(b -> (WFChoiceEnv) b.del().env()) .collect(Collectors.toList()); - if (checker.lang.config.args.get(LangArgs.useOldWf)) // **** + if (checker.lang.config.args.get(JobArgs.useOldWf)) // **** { if (all.size() > 1) { diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 5dcd638d0..35d394baf 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -31,6 +31,7 @@ import org.scribble.ast.local.LProtocolDef; import org.scribble.ast.local.LProtocolHeader; import org.scribble.ast.name.qualified.LProtocolNameNode; +import org.scribble.core.job.JobArgs; import org.scribble.core.lang.ProtocolMod; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.kind.Global; @@ -176,9 +177,9 @@ public void enterValidation(ScribNode parent, ScribNode child, } GProtocolName fullname = gpd.getFullMemberName((Module) parent); - if (checker.job.config.spin) + if (checker.job.config.args.get(JobArgs.spin)) { - if (checker.job.config.fair) + if (checker.job.config.args.get(JobArgs.fair)) { throw new RuntimeException( "[TODO]: -spin currently does not support fair ouput choices."); @@ -188,7 +189,7 @@ public void enterValidation(ScribNode parent, ScribNode child, else { GProtocol.validateByScribble(checker.job, fullname, true); - if (!checker.job.config.fair) + if (!checker.job.config.args.get(JobArgs.fair)) { checker.lang.debugPrintln( "(" + fullname + ") Validating with \"unfair\" output choices.. "); diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index c7db61f4f..2fd9a682c 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -26,12 +26,13 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.core.job.Job; import org.scribble.core.job.JobConfig; +import org.scribble.core.job.JobArgs; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.model.endpoint.EModelFactoryImpl; import org.scribble.core.model.global.SModelFactoryImpl; import org.scribble.core.type.name.ModuleName; -import org.scribble.lang.context.ModuleContextMaker; +import org.scribble.lang.context.ModuleContextCollector; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; import org.scribble.visit.GTypeTranslator; @@ -45,7 +46,9 @@ public class Lang private final LangContext context; // Mutable: Visitor passes update modules + // Used by, e.g., SimpleAstVisitor (cf. getModuleContext) // Keys are full names + // Currently assuming ModuleContexts are constant, and considering parsed Modules only (i.e., not generated) -- CHECKME private final Map modcs; // CHECKME: constant? depends on adding projections? // CHECKME: move to Config/Context? @@ -54,31 +57,37 @@ public class Lang // Just take MainContext as arg? -- would need to fix Maven dependencies //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) - public Lang(Map parsed, Map args, + public Lang(Map parsed, Map args, ModuleName mainFullname) throws ScribException { // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource // FIXME: wrap flags in Map and move Config construction to Lang this.config = newLangConfig(mainFullname, args); this.context = newLangContext(this, parsed); // Single instance per Lang, should not be shared between Langs + this.modcs = Collections.unmodifiableMap(buildModuleContexts(parsed)); + } + // Currently assuming ModuleContexts are constant, and considering parsed Modules only (i.e., not generated) -- CHECKME + protected Map buildModuleContexts( + Map parsed) throws ScribException + { // CHECKME: how does this relate to the ModuleContextBuilder pass? // Job.modcs seems unused? Lang.modcs is used though, by old AST visitors -- basically old ModuleContextVisitor is redundant? // Job.modcs could be used, but disamb already done by Lang // Lang/Job modcs should be moved to config/context though - ModuleContextMaker maker = new ModuleContextMaker(); + ModuleContextCollector b = new ModuleContextCollector(); // FIXME: rename Builder Map modcs = new HashMap<>(); for (ModuleName fullname : parsed.keySet()) { - modcs.put(fullname, maker.make(parsed, parsed.get(fullname))); + modcs.put(fullname, b.build(parsed, parsed.get(fullname))); // Throws ScribException } - this.modcs = Collections.unmodifiableMap(modcs); + return modcs; } // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate protected LangConfig newLangConfig(ModuleName mainFullname, - Map args) + Map args) { return new LangConfig(mainFullname, args, new AstFactoryImpl(), new EModelFactoryImpl(), new SModelFactoryImpl()); @@ -98,12 +107,27 @@ protected GTypeTranslator newTranslator(ModuleName rootFullname) } // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate - protected Job newJob(Map modcs, Set imeds, JobConfig config) + protected Job newJob(Map modcs, + Set imeds, JobConfig config) + + //...FIXME: move JobConfig construction inside Job (cf. LangConfig construction inside Lang) + //.. move (currently constant) modcs to config + { return new Job(imeds, modcs, config); } + // First run Visitor passes, then call toJob + // Base implementation: name disamb pass only + public void runVisitors() throws ScribException + { + // CHECKME: in the end, should these also be refactored into core? (instead of AST visiting) + runVisitorPassOnAllModules(ModuleContextBuilder.class); // Always done first (even if other contexts are built later) so that following passes can use ModuleContextVisitor + runVisitorPassOnAllModules(NameDisambiguator.class); // Includes validating names used in subprotocol calls.. + } + // "Finalises" this Lang -- caches the Job at this point, and cannot run futher Visitor passes + // So, typically, passes already run // CHECKME: revise this pattern? public final Job toJob() throws ScribException { @@ -127,14 +151,17 @@ public final Job toJob() throws ScribException return this.job; } - public void runDisambPasses() throws ScribException + public LangContext getContext() { - // CHECKME: in the end, should these also be refactored into core? (instead of AST visiting) - runVisitorPassOnAllModules(ModuleContextBuilder.class); // Always done first (even if other contexts are built later) so that following passes can use ModuleContextVisitor - runVisitorPassOnAllModules(NameDisambiguator.class); // Includes validating names used in subprotocol calls.. + return this.context; + } + + public ModuleContext getModuleContext(ModuleName fullname) + { + return this.modcs.get(fullname); } - public void runVisitorPassOnAllModules(Class c) + private void runVisitorPassOnAllModules(Class c) throws ScribException { debugPrintPass("Running " + c + " on all modules:"); @@ -172,16 +199,6 @@ private void runVisitorOnModule(ModuleName modname, AstVisitor nv) this.context.replaceModule(visited); } - public LangContext getContext() - { - return this.context; - } - - public ModuleContext getModuleContext(ModuleName fullname) - { - return this.modcs.get(fullname); - } - public void warningPrintln(String s) { System.err.println("[Warning] " + s); @@ -189,7 +206,7 @@ public void warningPrintln(String s) public void debugPrintln(String s) { - if (this.config.args.get(LangArgs.debug)) + if (this.config.args.get(JobArgs.debug)) { System.out.println(s); } diff --git a/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java b/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java index a7e7a1096..a377205e1 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java +++ b/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java @@ -18,6 +18,7 @@ import org.scribble.ast.AstFactory; import org.scribble.core.job.JobConfig; +import org.scribble.core.job.JobArgs; import org.scribble.core.model.endpoint.EModelFactory; import org.scribble.core.model.global.SModelFactory; import org.scribble.core.type.name.ModuleName; @@ -27,7 +28,7 @@ public class LangConfig { public final ModuleName main; // Full name - public final Map args; + public final Map args; // CHECKME: verbose/debug printing parameter? public final AstFactory af; @@ -36,7 +37,7 @@ public class LangConfig // N.B. MainContext is in a different non-visible (by Maven) package public LangConfig(ModuleName mainFullname, - Map args, + Map args, AstFactory af, EModelFactory ef, SModelFactory sf) { this.main = mainFullname; @@ -48,12 +49,6 @@ public LangConfig(ModuleName mainFullname, public JobConfig toJobConfig() { - return new JobConfig(this.main, - args.get(LangArgs.debug), args.get(LangArgs.useOldWf), - args.get(LangArgs.noProgress), args.get(LangArgs.minEfsm), - args.get(LangArgs.fair), args.get(LangArgs.noLocalChoiceSubjectCheck), - args.get(LangArgs.noAcceptCorrelationCheck), - args.get(LangArgs.noValidation), args.get(LangArgs.spin), - this.ef, this.sf); + return new JobConfig(this.main, this.args, this.ef, this.sf); } } diff --git a/scribble-ast/src/main/java/org/scribble/lang/LangContext.java b/scribble-ast/src/main/java/org/scribble/lang/LangContext.java index 85e957428..4c5e9ba01 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/LangContext.java +++ b/scribble-ast/src/main/java/org/scribble/lang/LangContext.java @@ -34,7 +34,7 @@ public class LangContext // Modules that were originally parsed (obtained from MainContext), but may be modified during the Job // ModuleName keys are full module names -- currently the modules read from file, distinguished from the generated projection modules - // CHECKME: separate original parsed from "working set"? + // CHECKME: separate original parsed from "working set"? -- store parsed constants in config? private final Map parsed;// = new HashMap<>(); protected LangContext(Lang lang, Map parsed)//, ModuleName main) diff --git a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextMaker.java b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java similarity index 98% rename from scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextMaker.java rename to scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java index da288f69a..372299d0b 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextMaker.java +++ b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java @@ -33,7 +33,7 @@ import org.scribble.util.ScribException; // TODO: rename and refactor -public class ModuleContextMaker +public class ModuleContextCollector { private Module root; // full name // The root Module for this ModuleContext (cf. the "main" root module from CLI) @@ -49,12 +49,12 @@ public class ModuleContextMaker // Made by ModuleContextBuilder // ModuleContext is the root context - public ModuleContextMaker() //JobContext jcontext, + public ModuleContextCollector() //JobContext jcontext, { } - public ModuleContext make( + public ModuleContext build( Map parsed, // From MainContext (N.B., in a different non-visible package) Module root) throws ScribException { diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java b/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java index 904253f1e..00b60a56c 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java @@ -16,14 +16,14 @@ import org.scribble.ast.ScribNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.lang.Lang; -import org.scribble.lang.context.ModuleContextMaker; +import org.scribble.lang.context.ModuleContextCollector; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // Disambiguates ambiguous PayloadTypeOrParameter names and inserts implicit Scope names public class ModuleContextBuilder extends AstVisitor { - public final ModuleContextMaker maker = new ModuleContextMaker(); // TODO: HACK, refactor + public final ModuleContextCollector maker = new ModuleContextCollector(); // TODO: HACK, refactor private ModuleContext mcontext; // The "root" Module context (not the "main" module) diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java b/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java index f632fb362..7a5b95255 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java +++ b/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java @@ -21,9 +21,9 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GProtocolDecl; +import org.scribble.core.job.JobArgs; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.lang.Lang; -import org.scribble.lang.LangArgs; import org.scribble.util.ScribException; import org.scribble.visit.UnfoldingVisitor; import org.scribble.visit.wf.env.WFChoiceEnv; @@ -64,7 +64,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) } } - if (this.lang.config.args.get(LangArgs.useOldWf)) + if (this.lang.config.args.get(JobArgs.useOldWf)) { if (child instanceof Choice) // Only needed for old WF (for distinct enabling message checking) // FIXME: maybe move connectedness checking to a separate pass, i.e. vanilla UnfoldingVisitor (if retained as syntactic check) { diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 3ae4c273b..e80074cbd 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -31,6 +31,7 @@ import org.scribble.codegen.java.callbackapi.CBEndpointApiGenerator3; import org.scribble.core.job.Job; import org.scribble.core.job.JobContext; +import org.scribble.core.job.JobArgs; import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.global.SGraph; @@ -38,7 +39,6 @@ import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.Role; import org.scribble.lang.Lang; -import org.scribble.lang.LangArgs; import org.scribble.lang.LangContext; import org.scribble.main.Main; import org.scribble.main.resource.locator.DirectoryResourceLocator; @@ -88,16 +88,16 @@ protected Main newMainContext() boolean spin = this.args.containsKey(CLArgFlag.SPIN); // FIXME: refactor into arg parsing - Map args = new HashMap<>(); - args.put(LangArgs.debug, debug); - args.put(LangArgs.useOldWf, useOldWf); - args.put(LangArgs.noProgress, noProgress); - args.put(LangArgs.minEfsm, minEfsm); - args.put(LangArgs.fair, fair); - args.put(LangArgs.noLocalChoiceSubjectCheck, noLocalChoiceSubjectCheck); - args.put(LangArgs.noAcceptCorrelationCheck, noAcceptCorrelationCheck); - args.put(LangArgs.noValidation, noValidation); - args.put(LangArgs.spin, spin); + Map args = new HashMap<>(); + args.put(JobArgs.debug, debug); + args.put(JobArgs.useOldWf, useOldWf); + args.put(JobArgs.noProgress, noProgress); + args.put(JobArgs.minEfsm, minEfsm); + args.put(JobArgs.fair, fair); + args.put(JobArgs.noLocalChoiceSubjectCheck, noLocalChoiceSubjectCheck); + args.put(JobArgs.noAcceptCorrelationCheck, noAcceptCorrelationCheck); + args.put(JobArgs.noValidation, noValidation); + args.put(JobArgs.spin, spin); args = Collections.unmodifiableMap(args); List impaths = this.args.containsKey(CLArgFlag.IMPORT_PATH) @@ -211,7 +211,7 @@ protected void doValidationTasks(Lang lang) // Base Scribble else*/ { - lang.runDisambPasses(); // TODO: refactor, w.r.t. below + lang.runVisitors(); // TODO: refactor, w.r.t. below lang.toJob().checkWellFormedness(); } @@ -254,7 +254,7 @@ protected void tryOutputTasks(Lang lang) || this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH) || this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH_PNG)) { - if (lang.config.args.get(LangArgs.useOldWf)) + if (lang.config.args.get(JobArgs.useOldWf)) { throw new CommandLineException( "Global model flag(s) incompatible with: " diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index ef0e210bc..7b5b929d7 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -27,6 +27,7 @@ import org.scribble.ast.Module; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.core.job.Job; +import org.scribble.core.job.JobArgs; import org.scribble.core.job.JobContext; import org.scribble.core.model.MState; import org.scribble.core.model.endpoint.EState; @@ -93,7 +94,7 @@ public Map buildEndpointClass() throws ScribException { Module main = this.lang.getContext().getMainModule(); JobContext jobc2 = this.job.getContext(); - EState init = (this.job.config.minEfsm + EState init = (this.job.config.args.get(JobArgs.minEfsm) ? jobc2.getMinimisedEGraph(this.proto, this.self) : jobc2.getEGraph(this.proto, this.self) ).init; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 9affa84a6..e7d1bece7 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -33,6 +33,7 @@ import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.core.job.Job; +import org.scribble.core.job.JobArgs; import org.scribble.core.job.JobContext; import org.scribble.core.model.MState; import org.scribble.core.model.endpoint.EState; @@ -108,7 +109,7 @@ public Map buildEndpointClass() throws ScribException Map res = new HashMap<>(); JobContext jobc2 = this.job.getContext(); - EState init = (this.job.config.minEfsm + EState init = (this.job.config.args.get(JobArgs.minEfsm) ? jobc2.getMinimisedEGraph(this.proto, this.self) : jobc2.getEGraph(this.proto, this.self) ).init; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 00e0f4145..609303f47 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -22,6 +22,7 @@ import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.TypeBuilder; +import org.scribble.core.job.JobArgs; import org.scribble.core.job.JobContext; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; @@ -65,7 +66,7 @@ public StateChannelApiGenerator(Lang lang, GProtocolName fullname, Role self) this.lpn = Projector2.projectFullProtocolName(fullname, self); //this.init = job.getContext().getEndpointGraph(fullname, self).init; JobContext jobc2 = this.job.getContext(); - this.init = this.job.config.minEfsm + this.init = this.job.config.args.get(JobArgs.minEfsm) ? jobc2.getMinimisedEGraph(fullname, self).init : jobc2.getEGraph(fullname, self).init; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index 9e5fb5088..f43dce6a1 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -37,6 +37,7 @@ import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.codegen.java.util.TypeBuilder; +import org.scribble.core.job.JobArgs; import org.scribble.core.job.JobContext; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.EStateKind; @@ -80,7 +81,7 @@ public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) Role self = getSelf(); //EndpointState init = this.job.getContext().getEndpointGraph(fullname, self).init; JobContext jobc2 = this.job.getContext(); - EState init = this.job.config.minEfsm + EState init = this.job.config.args.get(JobArgs.minEfsm) ? jobc2.getMinimisedEGraph(fullname, self).init : jobc2.getEGraph(fullname, self).init; diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index 3cde3f2cf..a8515c753 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -225,9 +225,9 @@ public void runWellFormednessPasses() throws ScribException debugPrintln("\nValidating " + fullname + ":"); - if (this.config.spin) + if (this.config.args.get(JobArgs.spin)) { - if (this.config.fair) + if (this.config.args.get(JobArgs.fair)) { throw new RuntimeException( "[TODO]: -spin currently does not support fair ouput choices."); @@ -237,7 +237,7 @@ public void runWellFormednessPasses() throws ScribException else { GProtocol.validateByScribble(this, fullname, true); - if (!this.config.fair) + if (!this.config.args.get(JobArgs.fair)) { debugPrintln( "(" + fullname + ") Validating with \"unfair\" output choices.. "); @@ -363,7 +363,7 @@ public ModuleContext getModuleContext(ModuleName fullname) public boolean isDebug() { - return this.config.debug; + return this.config.args.get(JobArgs.debug); } public void warningPrintln(String s) @@ -373,7 +373,7 @@ public void warningPrintln(String s) public void debugPrintln(String s) { - if (this.config.debug) + if (this.config.args.get(JobArgs.debug)) { System.out.println(s); } diff --git a/scribble-ast/src/main/java/org/scribble/lang/LangArgs.java b/scribble-core/src/main/java/org/scribble/core/job/JobArgs.java similarity index 95% rename from scribble-ast/src/main/java/org/scribble/lang/LangArgs.java rename to scribble-core/src/main/java/org/scribble/core/job/JobArgs.java index 7c32dbc78..69d6e611d 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/LangArgs.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobArgs.java @@ -1,6 +1,6 @@ -package org.scribble.lang; +package org.scribble.core.job; -public enum LangArgs +public enum JobArgs { debug, useOldWf, diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java b/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java index e7a617163..2d8cb4fbf 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java @@ -13,6 +13,8 @@ */ package org.scribble.core.job; +import java.util.Map; + import org.scribble.core.model.endpoint.EModelFactory; import org.scribble.core.model.global.SModelFactory; import org.scribble.core.type.name.ModuleName; @@ -23,37 +25,18 @@ public class JobConfig public final ModuleName main; // Full name // CHECKME: verbose/debug printing parameter? - public final boolean debug; - public final boolean useOldWf; - public final boolean noProgress; // TODO: deprecate - public final boolean minEfsm; // Currently only affects EFSM output (i.e. -fsm, -dot) and API gen -- doesn't affect model checking - public final boolean fair; - public final boolean noLocalChoiceSubjectCheck; - public final boolean noAcceptCorrelationCheck; // Currently unused - public final boolean noValidation; - public final boolean spin; + public final Map args; public final EModelFactory ef; public final SModelFactory sf; // N.B. MainContext is in a different non-visible (by Maven) package - public JobConfig(ModuleName main, boolean debug, boolean useOldWF, boolean noLiveness, boolean minEfsm, - boolean fair, boolean noLocalChoiceSubjectCheck, - boolean noAcceptCorrelationCheck, boolean noValidation, boolean spin, + public JobConfig(ModuleName main, Map args, EModelFactory ef, SModelFactory sf) { this.main = main; - //this.jUnit = jUnit; - this.debug = debug; - this.useOldWf = useOldWF; - this.noProgress = noLiveness; - this.minEfsm = minEfsm; - this.fair = fair; - this.noLocalChoiceSubjectCheck = noLocalChoiceSubjectCheck; - this.noAcceptCorrelationCheck = noAcceptCorrelationCheck; - this.noValidation = noValidation; - this.spin = spin; + this.args = args; this.ef = ef; this.sf = sf; diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 077311bed..e20daa1a6 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -26,6 +26,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.job.Job; +import org.scribble.core.job.JobArgs; import org.scribble.core.job.JobContext; import org.scribble.core.lang.Protocol; import org.scribble.core.lang.ProtocolMod; @@ -50,8 +51,8 @@ import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.global.Projector2; -import org.scribble.util.ScribUtil; import org.scribble.util.ScribException; +import org.scribble.util.ScribUtil; public class GProtocol extends Protocol implements GNode // Mainly for GDel.translate return (to include GProtocol) @@ -255,7 +256,7 @@ public static void validateBySpin(Job job2, GProtocolName fullname) { pml += "\n\n" + jobc2.getEGraph(fullname, r).toPml(r); } - if (job2.config.debug) + if (job2.config.args.get(JobArgs.debug)) { System.out.println("[-spin]: Promela processes\n" + pml + "\n"); } @@ -313,7 +314,7 @@ public static void validateBySpin(Job job2, GProtocolName fullname) int j = (i+batchSize < clauses.size()) ? i+batchSize : clauses.size(); String batch = clauses.subList(i, j).stream().collect(Collectors.joining(" && ")); String ltl = "ltl {\n" + batch + "\n" + "}"; - if (job2.config.debug) + if (job2.config.args.get(JobArgs.debug)) { System.out.println("[-spin] Batched ltl:\n" + ltl + "\n"); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index 55fa732a2..f7b9a64ca 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -22,6 +22,7 @@ import java.util.stream.Collectors; import org.scribble.core.job.Job; +import org.scribble.core.job.JobArgs; import org.scribble.core.model.GraphBuilderUtil; import org.scribble.core.model.endpoint.EFSM; import org.scribble.core.model.endpoint.EGraph; @@ -90,7 +91,7 @@ public SGraph buildSGraph(Job job, GProtocolName fullname, Map egr i.remove(); seen.put(curr.id, curr); - if (job.config.debug) + if (job.config.args.get(JobArgs.debug)) { count++; if (count % 50 == 0) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index c87dba2c6..fbc172ae2 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -22,6 +22,7 @@ import java.util.stream.Collectors; import org.scribble.core.job.Job; +import org.scribble.core.job.JobArgs; import org.scribble.core.model.endpoint.EFSM; import org.scribble.core.model.endpoint.actions.ESend; import org.scribble.core.model.global.actions.SAction; @@ -47,7 +48,7 @@ public void validate(Job job) throws ScribException int count = 0; for (SState s : states.values()) { - if (job.config.debug) + if (job.config.args.get(JobArgs.debug)) { count++; if (count % 50 == 0) @@ -71,7 +72,7 @@ public void validate(Job job) throws ScribException job.debugPrintln("(" + this.graph.proto + ") Checked all states: " + count); // May include unsafe states //*/ - if (!job.config.noProgress) + if (!job.config.args.get(JobArgs.noProgress)) { //job.debugPrintln("(" + this.graph.proto + ") Checking progress: "); // Incompatible with current errorMsg approach*/ @@ -141,7 +142,7 @@ protected String appendProgressErrorMessages(String errorMsg, protected String termSetToString(Job job, Set termset, Map all) { - return job.config.debug + return job.config.args.get(JobArgs.debug) ? termset.stream().map((i) -> all.get(i).toString()) .collect(Collectors.joining(",")) : termset.stream().map((i) -> new Integer(all.get(i).id).toString()) diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index 955618050..9a710463d 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -23,9 +23,9 @@ import org.scribble.ast.ImportDecl; import org.scribble.ast.ImportModule; import org.scribble.ast.Module; +import org.scribble.core.job.JobArgs; import org.scribble.core.type.name.ModuleName; import org.scribble.lang.Lang; -import org.scribble.lang.LangArgs; import org.scribble.main.resource.Resource; import org.scribble.main.resource.loader.ScribModuleLoader; import org.scribble.main.resource.locator.ResourceLocator; @@ -50,7 +50,7 @@ public class Main { public final ModuleName main; - public final Map args; + public final Map args; //private final ResourceLocator locator; // Path -> Resource private final ScribModuleLoader loader; // ModuleName -> Pair @@ -64,13 +64,13 @@ public class Main // Load other modules via locator -- CHECKME: a bit inconsistent w.r.t. main? // TODO: make Path abstract as e.g. URI -- locator is abstract but Path is coupled to concrete DirectoryResourceLocator public Main(ResourceLocator locator, Path mainpath, - Map args) throws ScribException, ScribParserException + Map args) throws ScribException, ScribParserException { this(new Pair<>(locator, null), mainpath, args); } // Load an inline module arg -- module imports not allowed (currently no ResourceLocator) - public Main(String inline, Map args) + public Main(String inline, Map args) throws ScribException, ScribParserException { this(new Pair<>(null, inline), null, args); @@ -79,7 +79,7 @@ public Main(String inline, Map args) // Pre: hack.left == null xor hack.right == null // Hack to "unify" the constructors (to satisfy final field init more conveniently) private Main(Pair hack, Path mainpath, - Map args) throws ScribException, ScribParserException + Map args) throws ScribException, ScribParserException { // Set this.loader and load main Pair main; @@ -116,7 +116,7 @@ protected ScribAntlrWrapper newAntlr() // A Scribble extension should override newAntlr/Lang as appropriate protected Lang newLang(Map parsed, - Map args, ModuleName mainFullname) throws ScribException + Map args, ModuleName mainFullname) throws ScribException { return new Lang(parsed, args, mainFullname); } From e1ff45afca6c220859f403724d16665853de735f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 7 Apr 2019 19:59:06 +0100 Subject: [PATCH 186/539] Continued: refactoring Main, Lang and Job. --- .../src/main/java/org/scribble/lang/Lang.java | 65 ++++--------------- .../java/org/scribble/lang/LangConfig.java | 18 ++--- .../java/org/scribble/lang/LangContext.java | 45 ++++++++++++- .../org/scribble/visit/SimpleAstVisitor.java | 2 +- .../java/org/scribble/cli/CommandLine.java | 2 +- .../main/java/org/scribble/core/job/Job.java | 53 ++++++++++----- .../java/org/scribble/core/job/JobArgs.java | 13 ++++ .../java/org/scribble/core/job/JobConfig.java | 5 +- .../org/scribble/core/job/JobContext.java | 64 +++++++++--------- scribble-main/pom.xml | 11 ++-- .../src/main/java/org/scribble/main/Main.java | 2 +- 11 files changed, 150 insertions(+), 130 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index 2fd9a682c..e99d310a0 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -15,24 +15,19 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; -import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import org.scribble.ast.AstFactory; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; import org.scribble.core.job.Job; -import org.scribble.core.job.JobConfig; import org.scribble.core.job.JobArgs; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.lang.global.GProtocol; -import org.scribble.core.model.endpoint.EModelFactoryImpl; -import org.scribble.core.model.global.SModelFactoryImpl; import org.scribble.core.type.name.ModuleName; -import org.scribble.lang.context.ModuleContextCollector; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; import org.scribble.visit.GTypeTranslator; @@ -45,57 +40,31 @@ public class Lang public final LangConfig config; // Immutable private final LangContext context; // Mutable: Visitor passes update modules - - // Used by, e.g., SimpleAstVisitor (cf. getModuleContext) - // Keys are full names - // Currently assuming ModuleContexts are constant, and considering parsed Modules only (i.e., not generated) -- CHECKME - private final Map modcs; - // CHECKME: constant? depends on adding projections? - // CHECKME: move to Config/Context? private Job job; // Just take MainContext as arg? -- would need to fix Maven dependencies //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) - public Lang(Map parsed, Map args, - ModuleName mainFullname) throws ScribException + public Lang(ModuleName mainFullname, Map args, + Map parsed) throws ScribException { // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource // FIXME: wrap flags in Map and move Config construction to Lang this.config = newLangConfig(mainFullname, args); this.context = newLangContext(this, parsed); // Single instance per Lang, should not be shared between Langs - this.modcs = Collections.unmodifiableMap(buildModuleContexts(parsed)); - } - - // Currently assuming ModuleContexts are constant, and considering parsed Modules only (i.e., not generated) -- CHECKME - protected Map buildModuleContexts( - Map parsed) throws ScribException - { - // CHECKME: how does this relate to the ModuleContextBuilder pass? - // Job.modcs seems unused? Lang.modcs is used though, by old AST visitors -- basically old ModuleContextVisitor is redundant? - // Job.modcs could be used, but disamb already done by Lang - // Lang/Job modcs should be moved to config/context though - ModuleContextCollector b = new ModuleContextCollector(); // FIXME: rename Builder - Map modcs = new HashMap<>(); - for (ModuleName fullname : parsed.keySet()) - { - modcs.put(fullname, b.build(parsed, parsed.get(fullname))); - // Throws ScribException - } - return modcs; } // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate protected LangConfig newLangConfig(ModuleName mainFullname, Map args) { - return new LangConfig(mainFullname, args, new AstFactoryImpl(), - new EModelFactoryImpl(), new SModelFactoryImpl()); - // CHECKME: combine E/SModelFactory? + AstFactory af = new AstFactoryImpl(); + return new LangConfig(mainFullname, args, af); } // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate - protected LangContext newLangContext(Lang lang, Map parsed) + protected LangContext newLangContext(Lang lang, + Map parsed) throws ScribException { return new LangContext(this, parsed); } @@ -107,19 +76,15 @@ protected GTypeTranslator newTranslator(ModuleName rootFullname) } // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate - protected Job newJob(Map modcs, - Set imeds, JobConfig config) - - //...FIXME: move JobConfig construction inside Job (cf. LangConfig construction inside Lang) - //.. move (currently constant) modcs to config - + protected Job newJob(ModuleName mainFullname, Map args, + Map modcs, Set imeds) { - return new Job(imeds, modcs, config); + return new Job(mainFullname, args, modcs, imeds); } // First run Visitor passes, then call toJob // Base implementation: name disamb pass only - public void runVisitors() throws ScribException + public void runPasses() throws ScribException { // CHECKME: in the end, should these also be refactored into core? (instead of AST visiting) runVisitorPassOnAllModules(ModuleContextBuilder.class); // Always done first (even if other contexts are built later) so that following passes can use ModuleContextVisitor @@ -146,7 +111,8 @@ public final Job toJob() throws ScribException "\nParsed:\n" + gpd + "\n\nScribble intermediate:\n" + g); } } - this.job = newJob(this.modcs, imeds, this.config.toJobConfig()); + this.job = newJob(this.config.main, this.config.args, + this.context.getModuleContexts(), imeds); } return this.job; } @@ -155,11 +121,6 @@ public LangContext getContext() { return this.context; } - - public ModuleContext getModuleContext(ModuleName fullname) - { - return this.modcs.get(fullname); - } private void runVisitorPassOnAllModules(Class c) throws ScribException diff --git a/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java b/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java index a377205e1..01e679c6f 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java +++ b/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java @@ -17,10 +17,8 @@ import java.util.Map; import org.scribble.ast.AstFactory; -import org.scribble.core.job.JobConfig; import org.scribble.core.job.JobArgs; import org.scribble.core.model.endpoint.EModelFactory; -import org.scribble.core.model.global.SModelFactory; import org.scribble.core.type.name.ModuleName; // The "static" (constant) info for Lang -- cf. LangContext "dynamic" state @@ -32,23 +30,15 @@ public class LangConfig // CHECKME: verbose/debug printing parameter? public final AstFactory af; - public final EModelFactory ef; - public final SModelFactory sf; + + public final EModelFactory ef = null; // FIXME: remove -- still referred to by old AST dels // N.B. MainContext is in a different non-visible (by Maven) package - public LangConfig(ModuleName mainFullname, - Map args, - AstFactory af, EModelFactory ef, SModelFactory sf) + public LangConfig(ModuleName mainFullname, Map args, + AstFactory af) { this.main = mainFullname; this.args = Collections.unmodifiableMap(args); this.af = af; - this.ef = ef; - this.sf = sf; - } - - public JobConfig toJobConfig() - { - return new JobConfig(this.main, this.args, this.ef, this.sf); } } diff --git a/scribble-ast/src/main/java/org/scribble/lang/LangContext.java b/scribble-ast/src/main/java/org/scribble/lang/LangContext.java index 4c5e9ba01..f2006cedd 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/LangContext.java +++ b/scribble-ast/src/main/java/org/scribble/lang/LangContext.java @@ -21,8 +21,11 @@ import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; +import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.ModuleName; +import org.scribble.lang.context.ModuleContextCollector; +import org.scribble.util.ScribException; // Global "static" context information for a Job -- single instance per Job, should not be shared between Jobs // Mutable: projections, graphs, etc are added mutably later -- replaceModule also mutable setter -- "users" get this from the Job and expect to setter mutate "in place" @@ -36,11 +39,37 @@ public class LangContext // ModuleName keys are full module names -- currently the modules read from file, distinguished from the generated projection modules // CHECKME: separate original parsed from "working set"? -- store parsed constants in config? private final Map parsed;// = new HashMap<>(); + + // Used by, e.g., SimpleAstVisitor (cf. getModuleContext) + // Keys are full names + // Currently assuming ModuleContexts are constant, and considering parsed Modules only (i.e., not generated) -- CHECKME + private final Map modcs; + // CHECKME: constant? depends on adding projections? - protected LangContext(Lang lang, Map parsed)//, ModuleName main) + protected LangContext(Lang lang, Map parsed) + throws ScribException { this.lang = lang; this.parsed = new HashMap(parsed); + this.modcs = Collections.unmodifiableMap(buildModuleContexts(parsed)); + } + + // Currently assuming ModuleContexts are constant, and considering parsed Modules only (i.e., not generated) -- CHECKME + protected Map buildModuleContexts( + Map parsed) throws ScribException + { + // CHECKME: how does this relate to the ModuleContextBuilder pass? + // Job.modcs seems unused? Lang.modcs is used though, by old AST visitors -- basically old ModuleContextVisitor is redundant? + // Job.modcs could be used, but disamb already done by Lang + // Lang/Job modcs should be moved to config/context though + ModuleContextCollector b = new ModuleContextCollector(); // FIXME: rename Builder + Map modcs = new HashMap<>(); + for (ModuleName fullname : parsed.keySet()) + { + modcs.put(fullname, b.build(parsed, parsed.get(fullname))); + // Throws ScribException + } + return modcs; } public Module getMainModule() @@ -62,7 +91,19 @@ public GProtocolDecl getParsed(GProtocolName fullname) .findAny().get(); } - // Used by Job for pass running, includes projections (e.g. for reachability checking) + public Map getModuleContexts() + { + return this.modcs; + } + + public ModuleContext getModuleContext(ModuleName fullname) + { + return this.modcs.get(fullname); + } + + + // The following are used for Visitor pass running + // Safer to get module names and require user to re-fetch the module by the getter each time (after replacing), to make sure the latest is used public Set getFullModuleNames() { diff --git a/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java index 9bfc3beac..d72470712 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java @@ -39,6 +39,6 @@ public SimpleAstVisitor(Lang lang, ModuleName rootFullname) public ModuleContext getModuleContext() { - return this.lang.getModuleContext(this.root); + return this.lang.getContext().getModuleContext(this.root); } } diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index e80074cbd..0d452e930 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -211,7 +211,7 @@ protected void doValidationTasks(Lang lang) // Base Scribble else*/ { - lang.runVisitors(); // TODO: refactor, w.r.t. below + lang.runPasses(); // TODO: refactor, w.r.t. below lang.toJob().checkWellFormedness(); } diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index a8515c753..5cf582791 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -27,8 +27,11 @@ import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.endpoint.EGraphBuilderUtil; +import org.scribble.core.model.endpoint.EModelFactory; +import org.scribble.core.model.endpoint.EModelFactoryImpl; import org.scribble.core.model.global.SGraph; import org.scribble.core.model.global.SGraphBuilderUtil; +import org.scribble.core.model.global.SModelFactoryImpl; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; @@ -49,25 +52,44 @@ // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models public class Job { - // Keys are full names - private final Map modcs; // CHECKME: constant? move to JobConfig? - public final JobConfig config; // Immutable private final JobContext context; // Mutable (Visitor passes replace modules) - private final SGraphBuilderUtil sgbu; + private final SGraphBuilderUtil sgraphb; - // Just take MainContext as arg? -- would need to fix Maven dependencies - //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) - public Job(Set imeds,//Map parsed, - Map modcs, JobConfig config) + public Job(ModuleName mainFullname, Map args, + Map modcs, Set imeds) + { + this.config = newJobConfig(mainFullname, args); + this.context = newJobContext(modcs, imeds); // Single instance per Job and should never be shared + this.sgraphb = newSGraphBuilderUtil(); + } + + // A Scribble extension should override newJobConfig/Context/etc as appropriate + protected JobConfig newJobConfig(ModuleName mainFullname, + Map args) + { + EModelFactory ef = new EModelFactoryImpl(); + SModelFactoryImpl sf = new SModelFactoryImpl(); + return new JobConfig(mainFullname, args, ef, sf); + // CHECKME: combine E/SModelFactory? + } + + // A Scribble extension should override newJobConfig/Context/etc as appropriate + protected JobContext newJobContext(Map modcs, + Set imeds) { - this.modcs = Collections.unmodifiableMap(modcs); - this.config = config; - this.sgbu = config.sf.newSGraphBuilderUtil(); - this.context = new JobContext(this, imeds); // Single instance per Job and should never be shared + return new JobContext(this, modcs, imeds); } + // A Scribble extension should override newJobConfig/Context/etc as appropriate + public SGraphBuilderUtil newSGraphBuilderUtil() + { + return this.config.sf.newSGraphBuilderUtil(); + } + + // A Scribble extension should override newJobConfig/Context/etc as appropriate + // CHECKME: not reusable? fix? // Scribble extensions should override these "new" methods // CHECKME: move to MainContext::newJob? public EGraphBuilderUtil newEGraphBuilderUtil() @@ -87,7 +109,7 @@ public SGraph buildSGraph(GProtocolName fullname, Map egraphs, + r + ":\n" + egraphs.get(r).init.toDot()); } //return SGraph.buildSGraph(this, fullname, createInitialSConfig(this, egraphs, explicit)); - return this.sgbu.buildSGraph(this, fullname, egraphs, explicit); // FIXME: factor out util + return this.sgraphb.buildSGraph(this, fullname, egraphs, explicit); // FIXME: factor out util } public void checkWellFormedness() throws ScribException @@ -356,11 +378,6 @@ public JobContext getContext() return this.context; } - public ModuleContext getModuleContext(ModuleName fullname) - { - return this.modcs.get(fullname); - } - public boolean isDebug() { return this.config.args.get(JobArgs.debug); diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobArgs.java b/scribble-core/src/main/java/org/scribble/core/job/JobArgs.java index 69d6e611d..7e8210338 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobArgs.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobArgs.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.job; public enum JobArgs diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java b/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java index 2d8cb4fbf..ba6bca126 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java @@ -13,6 +13,7 @@ */ package org.scribble.core.job; +import java.util.Collections; import java.util.Map; import org.scribble.core.model.endpoint.EModelFactory; @@ -35,9 +36,7 @@ public JobConfig(ModuleName main, Map args, EModelFactory ef, SModelFactory sf) { this.main = main; - - this.args = args; - + this.args = Collections.unmodifiableMap(args); this.ef = ef; this.sf = sf; } diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java index 33adbff45..30f6b851c 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java @@ -22,6 +22,7 @@ import java.util.Set; import java.util.stream.Collectors; +import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.endpoint.AutParser; @@ -32,8 +33,8 @@ import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.Role; import org.scribble.core.visit.global.Projector2; -import org.scribble.util.ScribUtil; import org.scribble.util.ScribException; +import org.scribble.util.ScribUtil; // Global "static" context information for a Job -- single instance per Job, should not be shared between Jobs // Mutable: projections, graphs, etc are added mutably later -- replaceModule also mutable setter -- "users" get this from the Job and expect to setter mutate "in place" @@ -41,48 +42,41 @@ public class JobContext { public final Job job; - //public final ModuleName main; // The "main" root module from MainContext - - // Modules that were originally parsed (obtained from MainContext), but may be modified during the Job - // ModuleName keys are full module names -- currently the modules read from file, distinguished from the generated projection modules - // CHECKME: separate original parsed from "working set"? - //private final Map parsed;// = new HashMap<>(); - - //...HERE: delete parsed, take intermeds in constructor - - // Projected (i.e., created) modules -- no: LProtocol - // LProtocolName is the full local protocol name (module name is the prefix) - // LProtocolName key is LProtocol value fullname (i.e., redundant) - private final //Map - Map - projected = new HashMap<>(); - + // Keys are full names + // CHECKME: not currently used by core? -- core fully independent of modules, etc., because full disamb already done? + private final Map modcs; + // "Directly" translated global protos, i.e., separate proto decls without any inlining/unfolding/etc - // Has original decl role list (and args) - private final Map intermed;// = new HashMap<>(); // Keys are full names (though GProtocol already includes full name) + // Protos retain original decl role list (and args) + // Keys are full names (though GProtocol already includes full name) + private final Map intermed; - private final Map iprojected = new HashMap<>(); // From intermediates; keys are full names + // Protos have pruned role decls -- CHECKME: prune args? + // Keys are full names (though GProtocol already includes full name) + private final Map inlined = new HashMap<>(); - // Has pruned role decls -- CHECKME: prune args? - // CHECKME: "global WF" only? - private final Map inlined = new HashMap<>(); // Keys are full names (though GProtocol already includes full name) + // Projected from inlined; keys are full names + private final Map iprojected = new HashMap<>(); + + // Projected from intermediates + // LProtocolName is the full local protocol name (module name is the prefix) + // LProtocolName key is LProtocol value fullname (i.e., redundant) + private final Map projected = new HashMap<>(); private final Map fairEGraphs = new HashMap<>(); - private final Map fairSGraphs = new HashMap<>(); - private final Map unfairEGraphs = new HashMap<>(); - private final Map unfairSGraphs = new HashMap<>(); - - private final Map minimisedEGraphs = new HashMap<>(); // Toolchain currently depends on single instance of each graph (state id equality), e.g. cannot re-build or re-minimise, would not be the same graph instance + private final Map minimisedEGraphs = new HashMap<>(); + // Toolchain currently depends on single instance of each graph (state id equality), e.g. cannot re-build or re-minimise, would not be the same graph instance // FIXME: currently only minimising "fair" graph, need to consider minimisation orthogonally to fairness -- NO: minimising (of fair) is for API gen only, unfair-transform does not use minimisation (regardless of user flag) for WF + + private final Map fairSGraphs = new HashMap<>(); + private final Map unfairSGraphs = new HashMap<>(); - protected JobContext(Job job, //Map parsed)//, ModuleName main) + protected JobContext(Job job, Map modcs, Set imeds) { this.job = job; - - //this.parsed = new HashMap(parsed); - //this.main = main; + this.modcs = Collections.unmodifiableMap(modcs); this.intermed = imeds.stream() .collect(Collectors.toMap(x -> x.fullname, x -> x)); } @@ -370,7 +364,13 @@ public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) } return minimised; } + + public ModuleContext getModuleContext(ModuleName fullname) + { + return this.modcs.get(fullname); + } + // TODO: relocate // Duplicated from CommandLine.runDot // Minimises the FSM up to bisimulation // N.B. ltsconvert will typically re-number the states diff --git a/scribble-main/pom.xml b/scribble-main/pom.xml index adde93713..94adb86de 100644 --- a/scribble-main/pom.xml +++ b/scribble-main/pom.xml @@ -1,17 +1,17 @@ + http://maven.apache.org 4.0.0 + scribble-main + scribble-main + org.scribble parent 0.4.4-SNAPSHOT - org.scribble - scribble-main - 0.4.4-SNAPSHOT - scribble-main - http://maven.apache.org + UTF-8 @@ -31,7 +31,6 @@ junit junit - 3.8.1 test diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index 9a710463d..f44fc75ba 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -118,7 +118,7 @@ protected ScribAntlrWrapper newAntlr() protected Lang newLang(Map parsed, Map args, ModuleName mainFullname) throws ScribException { - return new Lang(parsed, args, mainFullname); + return new Lang(mainFullname, args, parsed); } // Pre: main Module loaded by this.loader From 3e48ba0d4d9b9080b49ad062dcab66a5ed7dbab1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 7 Apr 2019 20:04:21 +0100 Subject: [PATCH 187/539] Minor. --- .../org/scribble/core/job/JobContext.java | 123 +++++------------- 1 file changed, 33 insertions(+), 90 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java index 30f6b851c..d80f74081 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java @@ -49,35 +49,35 @@ public class JobContext // "Directly" translated global protos, i.e., separate proto decls without any inlining/unfolding/etc // Protos retain original decl role list (and args) // Keys are full names (though GProtocol already includes full name) - private final Map intermed; + private final Map imeds; // Protos have pruned role decls -- CHECKME: prune args? // Keys are full names (though GProtocol already includes full name) private final Map inlined = new HashMap<>(); // Projected from inlined; keys are full names - private final Map iprojected = new HashMap<>(); + private final Map iprojs = new HashMap<>(); // Projected from intermediates // LProtocolName is the full local protocol name (module name is the prefix) // LProtocolName key is LProtocol value fullname (i.e., redundant) - private final Map projected = new HashMap<>(); + private final Map projs = new HashMap<>(); - private final Map fairEGraphs = new HashMap<>(); - private final Map unfairEGraphs = new HashMap<>(); - private final Map minimisedEGraphs = new HashMap<>(); + private final Map fEGraphs = new HashMap<>(); + private final Map uEGraphs = new HashMap<>(); + private final Map mEGraphs = new HashMap<>(); // Toolchain currently depends on single instance of each graph (state id equality), e.g. cannot re-build or re-minimise, would not be the same graph instance // FIXME: currently only minimising "fair" graph, need to consider minimisation orthogonally to fairness -- NO: minimising (of fair) is for API gen only, unfair-transform does not use minimisation (regardless of user flag) for WF - private final Map fairSGraphs = new HashMap<>(); - private final Map unfairSGraphs = new HashMap<>(); + private final Map fSGraphs = new HashMap<>(); + private final Map uSGraphs = new HashMap<>(); protected JobContext(Job job, Map modcs, Set imeds) { this.job = job; this.modcs = Collections.unmodifiableMap(modcs); - this.intermed = imeds.stream() + this.imeds = imeds.stream() .collect(Collectors.toMap(x -> x.fullname, x -> x)); } @@ -94,50 +94,24 @@ public Set getFullModuleNames() public Set getParsedFullModuleNames() { //return Collections.unmodifiableSet(this.parsed.keySet()); - return this.intermed.keySet().stream().map(x -> x.getPrefix()) + return this.imeds.keySet().stream().map(x -> x.getPrefix()) .collect(Collectors.toSet()); } public Set getProjectedFullModuleNames() { - return this.projected.keySet().stream().map(x -> x.getPrefix()) + return this.projs.keySet().stream().map(x -> x.getPrefix()) .collect(Collectors.toSet()); } - - /*public boolean hasModule(ModuleName fullname) - { - return isParsedModule(fullname) || isProjectedModule(fullname); - }*/ - - /*private boolean isParsedModule(ModuleName fullname) - { - //return this.parsed.containsKey(fullname); - return this.intermed.keySet().stream() - .anyMatch(x -> x.getPrefix().equals(fullname)); - } - - private boolean isProjectedModule(ModuleName fullname) - { - //return this.projected.keySet().stream().filter((lpn) -> lpn.getPrefix().equals(fullname)).count() > 0; - return getProjectedFullModuleNames().contains(fullname); - }*/ - - // TODO rename better - /*public void addIntermediate(GProtocolName fullname, GProtocol g) - { - this.intermed.put(fullname, g); - }*/ public GProtocol getIntermediate(GProtocolName fullname) { - return this.intermed.get(fullname); + return this.imeds.get(fullname); } - //public Map getIntermediates() public Collection getIntermediates() { - //return Collections.unmodifiableMap(this.intermed); - return this.intermed.values().stream().collect(Collectors.toSet()); + return this.imeds.values().stream().collect(Collectors.toSet()); } public void addInlined(GProtocolName fullname, GProtocol g) @@ -157,11 +131,10 @@ public Set getInlined() public void addInlinedProjection(LProtocolName fullname, LProtocol l) { - this.iprojected.put(fullname, l); + this.iprojs.put(fullname, l); } - // "Projected from inlined" - // FIXME TODO: refactor getProjected and getProjection properly + // Projected from inlined public LProtocol getInlinedProjection(GProtocolName fullname, Role self) { LProtocolName p = Projector2.projectFullProtocolName(fullname, self); @@ -170,51 +143,21 @@ public LProtocol getInlinedProjection(GProtocolName fullname, Role self) public LProtocol getInlinedProjection(LProtocolName fullname) { - return this.iprojected.get(fullname); + return this.iprojs.get(fullname); } public Map getInlinedProjections() { - return Collections.unmodifiableMap(this.iprojected); + return Collections.unmodifiableMap(this.iprojs); } - // Make context immutable? (will need to assign updated context back to Job) -- will also need to do for Module replacing - public void addProjections(Map> projections) - Map> projs) - { - for (GProtocolName g : projs.keySet()) - { - Map mods = projs.get(g); - for (Role role : mods.keySet()) - { - addProjection(mods.get(role)); - } - } - - /*// Doesn't work for external subprotocols now that Projector doesn't record Module-specific dependencies itself - try - { - ContextBuilder builder = new ContextBuilder(this.job); - for (ProtocolName lpn : this.projections.keySet()) - { - Module mod = this.projections.get(lpn); - mod = (Module) mod.accept(builder); - replaceModule(mod); - } - } - catch (ScribbleException e) - { - throw new RuntimeException("Shouldn't get in here: " + e); - }*/ - } - - //private void addProjection(Module mod) + // Projected from intermediate public void addProjection(LProtocol p) { /*LProtocolName lpn = (LProtocolName) mod.getProtoDeclChildren().get(0) .getFullMemberName(mod); this.projected.put(lpn, mod);*/ - this.projected.put(p.fullname, p); + this.projs.put(p.fullname, p); } public //Module @@ -237,12 +180,12 @@ LProtocol getProjection(LProtocolName fullname) // E.g. disamb/enabling error before projection passes (e.g. CommandLine -fsm arg) //CHECKME: should not occur any more? }*/ - return this.projected.get(fullname); + return this.projs.get(fullname); } protected void addEGraph(LProtocolName fullname, EGraph graph) { - this.fairEGraphs.put(fullname, graph); + this.fEGraphs.put(fullname, graph); } // N.B. graphs built from inlined (not unfolded) @@ -251,7 +194,7 @@ public EGraph getEGraph(GProtocolName fullname, Role role) { LProtocolName fulllpn = Projector2.projectFullProtocolName(fullname, role); // Moved form LProtocolDecl - EGraph graph = this.fairEGraphs.get(fulllpn); + EGraph graph = this.fEGraphs.get(fulllpn); if (graph == null) { /*Module proj = getProjection(fullname, role); // Projected module contains a single protocol @@ -266,14 +209,14 @@ public EGraph getEGraph(GProtocolName fullname, Role role) protected void addUnfairEGraph(LProtocolName fullname, EGraph graph) { - this.unfairEGraphs.put(fullname, graph); + this.uEGraphs.put(fullname, graph); } public EGraph getUnfairEGraph(GProtocolName fullname, Role role) throws ScribException { LProtocolName fulllpn = Projector2.projectFullProtocolName(fullname, role); - EGraph unfair = this.unfairEGraphs.get(fulllpn); + EGraph unfair = this.uEGraphs.get(fulllpn); if (unfair == null) { unfair = getEGraph(fullname, role).init.unfairTransform(this.job.config.ef).toGraph(); @@ -284,12 +227,12 @@ public EGraph getUnfairEGraph(GProtocolName fullname, Role role) throws ScribExc protected void addSGraph(GProtocolName fullname, SGraph graph) { - this.fairSGraphs.put(fullname, graph); + this.fSGraphs.put(fullname, graph); } public SGraph getSGraph(GProtocolName fullname) throws ScribException { - SGraph graph = this.fairSGraphs.get(fullname); + SGraph graph = this.fSGraphs.get(fullname); if (graph == null) { /*GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()) @@ -298,7 +241,7 @@ public SGraph getSGraph(GProtocolName fullname) throws ScribException getEGraphsForSGraphBuilding(fullname, //gpd, true); boolean explicit = //gpd.isExplicit(); - this.intermed.get(fullname).isExplicit(); + this.imeds.get(fullname).isExplicit(); //graph = SGraph.buildSGraph(egraphs, explicit, this.job, fullname); graph = this.job.buildSGraph(fullname, egraphs, explicit); addSGraph(fullname, graph); @@ -312,7 +255,7 @@ private Map getEGraphsForSGraphBuilding(GProtocolName fullname, { Map egraphs = new HashMap<>(); //for (Role self : gpd.getHeaderChild().getRoleDeclListChild().getRoles()) - for (Role self : this.intermed.get(fullname).roles) + for (Role self : this.imeds.get(fullname).roles) { egraphs.put(self, fair ? getEGraph(fullname, self) @@ -323,12 +266,12 @@ private Map getEGraphsForSGraphBuilding(GProtocolName fullname, protected void addUnfairSGraph(GProtocolName fullname, SGraph graph) { - this.unfairSGraphs.put(fullname, graph); + this.uSGraphs.put(fullname, graph); } public SGraph getUnfairSGraph(GProtocolName fullname) throws ScribException { - SGraph graph = this.unfairSGraphs.get(fullname); + SGraph graph = this.uSGraphs.get(fullname); if (graph == null) { /*GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()) @@ -336,7 +279,7 @@ public SGraph getUnfairSGraph(GProtocolName fullname) throws ScribException Map egraphs = getEGraphsForSGraphBuilding(fullname, //gpd, false); boolean explicit = //gpd.isExplicit(); - this.intermed.get(fullname).isExplicit(); + this.imeds.get(fullname).isExplicit(); //graph = SGraph.buildSGraph(this.job, fullname, this.job.createInitialSConfig(job, egraphs, explicit)); graph = this.job.buildSGraph(fullname, egraphs, explicit); addUnfairSGraph(fullname, graph); @@ -346,7 +289,7 @@ public SGraph getUnfairSGraph(GProtocolName fullname) throws ScribException protected void addMinimisedEGraph(LProtocolName fullname, EGraph graph) { - this.minimisedEGraphs.put(fullname, graph); + this.mEGraphs.put(fullname, graph); } public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) @@ -354,7 +297,7 @@ public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) { LProtocolName fulllpn = Projector2.projectFullProtocolName(fullname, role); - EGraph minimised = this.minimisedEGraphs.get(fulllpn); + EGraph minimised = this.mEGraphs.get(fulllpn); if (minimised == null) { String aut = runAut(getEGraph(fullname, role).init.toAut(), From f344dfb38b6d563cc6a49428513d8768228bd8b4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 7 Apr 2019 20:10:30 +0100 Subject: [PATCH 188/539] Minor. --- .../org/scribble/del/global/GChoiceDel.java | 2 +- .../scribble/del/global/GProtocolDeclDel.java | 6 +++--- .../src/main/java/org/scribble/lang/Lang.java | 2 +- .../scribble/visit/wf/WFChoiceChecker.java | 2 +- .../java/org/scribble/cli/CommandLine.java | 20 +++++++++---------- .../callbackapi/CBEndpointApiGenerator.java | 2 +- .../callbackapi/CBEndpointApiGenerator3.java | 2 +- .../StateChannelApiGenerator.java | 2 +- .../ioifaces/IOInterfacesGenerator.java | 2 +- .../main/java/org/scribble/core/job/Job.java | 10 +++++----- .../java/org/scribble/core/job/JobArgs.java | 20 ++++++++++--------- .../scribble/core/lang/global/GProtocol.java | 4 ++-- .../core/model/global/SGraphBuilderUtil.java | 2 +- .../scribble/core/model/global/SModel.java | 6 +++--- 14 files changed, 42 insertions(+), 40 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java index a48e211d6..6c025c025 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -100,7 +100,7 @@ public GChoice leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, List all = cho.getBlockChildren().stream().map(b -> (WFChoiceEnv) b.del().env()) .collect(Collectors.toList()); - if (checker.lang.config.args.get(JobArgs.useOldWf)) // **** + if (checker.lang.config.args.get(JobArgs.OLD_WF)) // **** { if (all.size() > 1) { diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 35d394baf..a4a2e40e2 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -177,9 +177,9 @@ public void enterValidation(ScribNode parent, ScribNode child, } GProtocolName fullname = gpd.getFullMemberName((Module) parent); - if (checker.job.config.args.get(JobArgs.spin)) + if (checker.job.config.args.get(JobArgs.SPIN)) { - if (checker.job.config.args.get(JobArgs.fair)) + if (checker.job.config.args.get(JobArgs.FAIR)) { throw new RuntimeException( "[TODO]: -spin currently does not support fair ouput choices."); @@ -189,7 +189,7 @@ public void enterValidation(ScribNode parent, ScribNode child, else { GProtocol.validateByScribble(checker.job, fullname, true); - if (!checker.job.config.args.get(JobArgs.fair)) + if (!checker.job.config.args.get(JobArgs.FAIR)) { checker.lang.debugPrintln( "(" + fullname + ") Validating with \"unfair\" output choices.. "); diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index e99d310a0..dea5a4945 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -167,7 +167,7 @@ public void warningPrintln(String s) public void debugPrintln(String s) { - if (this.config.args.get(JobArgs.debug)) + if (this.config.args.get(JobArgs.DEBUG)) { System.out.println(s); } diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java b/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java index 7a5b95255..dca3aa0d0 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java +++ b/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java @@ -64,7 +64,7 @@ public ScribNode visit(ScribNode parent, ScribNode child) } } - if (this.lang.config.args.get(JobArgs.useOldWf)) + if (this.lang.config.args.get(JobArgs.OLD_WF)) { if (child instanceof Choice) // Only needed for old WF (for distinct enabling message checking) // FIXME: maybe move connectedness checking to a separate pass, i.e. vanilla UnfoldingVisitor (if retained as syntactic check) { diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 0d452e930..d889ba679 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -89,15 +89,15 @@ protected Main newMainContext() // FIXME: refactor into arg parsing Map args = new HashMap<>(); - args.put(JobArgs.debug, debug); - args.put(JobArgs.useOldWf, useOldWf); - args.put(JobArgs.noProgress, noProgress); - args.put(JobArgs.minEfsm, minEfsm); - args.put(JobArgs.fair, fair); - args.put(JobArgs.noLocalChoiceSubjectCheck, noLocalChoiceSubjectCheck); - args.put(JobArgs.noAcceptCorrelationCheck, noAcceptCorrelationCheck); - args.put(JobArgs.noValidation, noValidation); - args.put(JobArgs.spin, spin); + args.put(JobArgs.DEBUG, debug); + args.put(JobArgs.OLD_WF, useOldWf); + args.put(JobArgs.NO_PROGRESS, noProgress); + args.put(JobArgs.MIN_EFSM, minEfsm); + args.put(JobArgs.FAIR, fair); + args.put(JobArgs.NO_LCHOICE_SUBJ_CHECK, noLocalChoiceSubjectCheck); + args.put(JobArgs.NO_ACC_CORRELATION_CHECK, noAcceptCorrelationCheck); + args.put(JobArgs.NO_VALIDATION, noValidation); + args.put(JobArgs.SPIN, spin); args = Collections.unmodifiableMap(args); List impaths = this.args.containsKey(CLArgFlag.IMPORT_PATH) @@ -254,7 +254,7 @@ protected void tryOutputTasks(Lang lang) || this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH) || this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH_PNG)) { - if (lang.config.args.get(JobArgs.useOldWf)) + if (lang.config.args.get(JobArgs.OLD_WF)) { throw new CommandLineException( "Global model flag(s) incompatible with: " diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 7b5b929d7..ae5c624ac 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -94,7 +94,7 @@ public Map buildEndpointClass() throws ScribException { Module main = this.lang.getContext().getMainModule(); JobContext jobc2 = this.job.getContext(); - EState init = (this.job.config.args.get(JobArgs.minEfsm) + EState init = (this.job.config.args.get(JobArgs.MIN_EFSM) ? jobc2.getMinimisedEGraph(this.proto, this.self) : jobc2.getEGraph(this.proto, this.self) ).init; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index e7d1bece7..2fa507b70 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -109,7 +109,7 @@ public Map buildEndpointClass() throws ScribException Map res = new HashMap<>(); JobContext jobc2 = this.job.getContext(); - EState init = (this.job.config.args.get(JobArgs.minEfsm) + EState init = (this.job.config.args.get(JobArgs.MIN_EFSM) ? jobc2.getMinimisedEGraph(this.proto, this.self) : jobc2.getEGraph(this.proto, this.self) ).init; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 609303f47..ea89cb27e 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -66,7 +66,7 @@ public StateChannelApiGenerator(Lang lang, GProtocolName fullname, Role self) this.lpn = Projector2.projectFullProtocolName(fullname, self); //this.init = job.getContext().getEndpointGraph(fullname, self).init; JobContext jobc2 = this.job.getContext(); - this.init = this.job.config.args.get(JobArgs.minEfsm) + this.init = this.job.config.args.get(JobArgs.MIN_EFSM) ? jobc2.getMinimisedEGraph(fullname, self).init : jobc2.getEGraph(fullname, self).init; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index f43dce6a1..3c19d4d94 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -81,7 +81,7 @@ public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) Role self = getSelf(); //EndpointState init = this.job.getContext().getEndpointGraph(fullname, self).init; JobContext jobc2 = this.job.getContext(); - EState init = this.job.config.args.get(JobArgs.minEfsm) + EState init = this.job.config.args.get(JobArgs.MIN_EFSM) ? jobc2.getMinimisedEGraph(fullname, self).init : jobc2.getEGraph(fullname, self).init; diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index 5cf582791..348c45a5b 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -247,9 +247,9 @@ public void runWellFormednessPasses() throws ScribException debugPrintln("\nValidating " + fullname + ":"); - if (this.config.args.get(JobArgs.spin)) + if (this.config.args.get(JobArgs.SPIN)) { - if (this.config.args.get(JobArgs.fair)) + if (this.config.args.get(JobArgs.FAIR)) { throw new RuntimeException( "[TODO]: -spin currently does not support fair ouput choices."); @@ -259,7 +259,7 @@ public void runWellFormednessPasses() throws ScribException else { GProtocol.validateByScribble(this, fullname, true); - if (!this.config.args.get(JobArgs.fair)) + if (!this.config.args.get(JobArgs.FAIR)) { debugPrintln( "(" + fullname + ") Validating with \"unfair\" output choices.. "); @@ -380,7 +380,7 @@ public JobContext getContext() public boolean isDebug() { - return this.config.args.get(JobArgs.debug); + return this.config.args.get(JobArgs.DEBUG); } public void warningPrintln(String s) @@ -390,7 +390,7 @@ public void warningPrintln(String s) public void debugPrintln(String s) { - if (this.config.args.get(JobArgs.debug)) + if (this.config.args.get(JobArgs.DEBUG)) { System.out.println(s); } diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobArgs.java b/scribble-core/src/main/java/org/scribble/core/job/JobArgs.java index 7e8210338..f53d409dc 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobArgs.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobArgs.java @@ -15,15 +15,17 @@ public enum JobArgs { - debug, - useOldWf, - noProgress, - minEfsm, - fair, - noLocalChoiceSubjectCheck, - noAcceptCorrelationCheck, - noValidation, - spin; + DEBUG, + FAIR, + SPIN, + NO_VALIDATION, + NO_PROGRESS, // TODO: deprecate + MIN_EFSM, // Currently only affects EFSM output (i.e. -fsm, -dot) and API gen -- doesn't affect model checking + + OLD_WF, + NO_LCHOICE_SUBJ_CHECK, // For debugging only? + NO_ACC_CORRELATION_CHECK, // Currently unused + ; /*public final boolean debug; public final boolean useOldWf; diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index e20daa1a6..8b668a753 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -256,7 +256,7 @@ public static void validateBySpin(Job job2, GProtocolName fullname) { pml += "\n\n" + jobc2.getEGraph(fullname, r).toPml(r); } - if (job2.config.args.get(JobArgs.debug)) + if (job2.config.args.get(JobArgs.DEBUG)) { System.out.println("[-spin]: Promela processes\n" + pml + "\n"); } @@ -314,7 +314,7 @@ public static void validateBySpin(Job job2, GProtocolName fullname) int j = (i+batchSize < clauses.size()) ? i+batchSize : clauses.size(); String batch = clauses.subList(i, j).stream().collect(Collectors.joining(" && ")); String ltl = "ltl {\n" + batch + "\n" + "}"; - if (job2.config.args.get(JobArgs.debug)) + if (job2.config.args.get(JobArgs.DEBUG)) { System.out.println("[-spin] Batched ltl:\n" + ltl + "\n"); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index f7b9a64ca..f90ebca24 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -91,7 +91,7 @@ public SGraph buildSGraph(Job job, GProtocolName fullname, Map egr i.remove(); seen.put(curr.id, curr); - if (job.config.args.get(JobArgs.debug)) + if (job.config.args.get(JobArgs.DEBUG)) { count++; if (count % 50 == 0) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index fbc172ae2..a7bc126b5 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -48,7 +48,7 @@ public void validate(Job job) throws ScribException int count = 0; for (SState s : states.values()) { - if (job.config.args.get(JobArgs.debug)) + if (job.config.args.get(JobArgs.DEBUG)) { count++; if (count % 50 == 0) @@ -72,7 +72,7 @@ public void validate(Job job) throws ScribException job.debugPrintln("(" + this.graph.proto + ") Checked all states: " + count); // May include unsafe states //*/ - if (!job.config.args.get(JobArgs.noProgress)) + if (!job.config.args.get(JobArgs.NO_PROGRESS)) { //job.debugPrintln("(" + this.graph.proto + ") Checking progress: "); // Incompatible with current errorMsg approach*/ @@ -142,7 +142,7 @@ protected String appendProgressErrorMessages(String errorMsg, protected String termSetToString(Job job, Set termset, Map all) { - return job.config.args.get(JobArgs.debug) + return job.config.args.get(JobArgs.DEBUG) ? termset.stream().map((i) -> all.get(i).toString()) .collect(Collectors.joining(",")) : termset.stream().map((i) -> new Integer(all.get(i).id).toString()) From 9850f6533f2113d997e8f57f2aaea311cdfb471a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 10:57:59 +0100 Subject: [PATCH 189/539] Continued: refactoring cli. --- .../src/main/java/org/scribble/lang/Lang.java | 7 +- .../main/java/org/scribble/cli/CLArgFlag.java | 6 +- .../java/org/scribble/cli/CLArgParser.java | 19 +- .../java/org/scribble/cli/CLArgParser2.java | 169 ++++++++++++ .../src/main/java/org/scribble/cli/CLAux.java | 50 ++++ .../main/java/org/scribble/cli/CLFlags.java | 260 ++++++++++++++++++ .../java/org/scribble/cli/CommandLine.java | 148 +++++----- .../core/lang/context/ModuleContext.java | 2 +- .../core/lang/context/ScribNames.java | 18 +- 9 files changed, 581 insertions(+), 98 deletions(-) create mode 100644 scribble-cli/src/main/java/org/scribble/cli/CLArgParser2.java create mode 100644 scribble-cli/src/main/java/org/scribble/cli/CLAux.java create mode 100644 scribble-cli/src/main/java/org/scribble/cli/CLFlags.java diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index dea5a4945..c89c092c8 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -91,8 +91,9 @@ public void runPasses() throws ScribException runVisitorPassOnAllModules(NameDisambiguator.class); // Includes validating names used in subprotocol calls.. } - // "Finalises" this Lang -- caches the Job at this point, and cannot run futher Visitor passes - // So, typically, passes already run + // "Finalises" this Lang -- initialises the Job at this point, and cannot run futher Visitor passes on Lang + // So, typically, Lang passes should be finished before calling this + // Job passes may subsequently mutate Job(Context) though // CHECKME: revise this pattern? public final Job toJob() throws ScribException { @@ -122,7 +123,7 @@ public LangContext getContext() return this.context; } - private void runVisitorPassOnAllModules(Class c) + public void runVisitorPassOnAllModules(Class c) throws ScribException { debugPrintPass("Running " + c + " on all modules:"); diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java index f58c53bfd..7cd3b836b 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java @@ -15,10 +15,13 @@ public enum CLArgFlag { + // Implicit (and unique) + MAIN_MOD, + // Unique flags JUNIT, // For internal use (JUnit test harness) - MAIN_MOD, IMPORT_PATH, + API_OUTPUT, VERBOSE, SCHAN_API_SUBTYPES, OLD_WF, @@ -35,7 +38,6 @@ public enum CLArgFlag // Non-unique flags PROJECT, - API_OUTPUT, EFSM, VALIDATION_EFSM, UNFAIR_EFSM, diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java index cfe769aed..a1128a232 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java @@ -31,13 +31,13 @@ public class CLArgParser public static final String NO_LIVENESS_FLAG = "-nolive"; public static final String LTSCONVERT_MIN_FLAG = "-minlts"; public static final String FAIR_FLAG = "-fair"; - public static final String NO_LOCAL_CHOICE_SUBJECT_CHECK = "-nolocalchoicecheck"; - public static final String NO_ACCEPT_CORRELATION_CHECK = "-nocorrelation"; + public static final String NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG = "-nolocalchoicecheck"; + public static final String NO_ACCEPT_CORRELATION_CHECK_FLAG = "-nocorrelation"; public static final String DOT_FLAG = "-dot"; public static final String AUT_FLAG = "-aut"; public static final String NO_VALIDATION_FLAG = "-novalid"; public static final String INLINE_MAIN_MOD_FLAG = "-inline"; - public static final String SPIN = "-spin"; + public static final String SPIN_FLAG = "-spin"; // Non-unique flags public static final String PROJECT_FLAG = "-project"; @@ -54,7 +54,6 @@ public class CLArgParser public static final String API_GEN_FLAG = "-api"; public static final String SESSION_API_GEN_FLAG = "-sessapi"; public static final String STATECHAN_API_GEN_FLAG = "-chanapi"; - public static final String EVENTDRIVEN_API_GEN_FLAG = "-cbapi"; private static final Map UNIQUE_FLAGS = new HashMap<>(); @@ -67,13 +66,13 @@ public class CLArgParser CLArgParser.UNIQUE_FLAGS.put(CLArgParser.OLD_WF_FLAG, CLArgFlag.OLD_WF); CLArgParser.UNIQUE_FLAGS.put(CLArgParser.LTSCONVERT_MIN_FLAG, CLArgFlag.LTSCONVERT_MIN); CLArgParser.UNIQUE_FLAGS.put(CLArgParser.FAIR_FLAG, CLArgFlag.FAIR); - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.NO_LOCAL_CHOICE_SUBJECT_CHECK, CLArgFlag.NO_LOCAL_CHOICE_SUBJECT_CHECK); - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.NO_ACCEPT_CORRELATION_CHECK, CLArgFlag.NO_ACCEPT_CORRELATION_CHECK); + CLArgParser.UNIQUE_FLAGS.put(CLArgParser.NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG, CLArgFlag.NO_LOCAL_CHOICE_SUBJECT_CHECK); + CLArgParser.UNIQUE_FLAGS.put(CLArgParser.NO_ACCEPT_CORRELATION_CHECK_FLAG, CLArgFlag.NO_ACCEPT_CORRELATION_CHECK); CLArgParser.UNIQUE_FLAGS.put(CLArgParser.DOT_FLAG, CLArgFlag.DOT); CLArgParser.UNIQUE_FLAGS.put(CLArgParser.AUT_FLAG, CLArgFlag.AUT); CLArgParser.UNIQUE_FLAGS.put(CLArgParser.NO_VALIDATION_FLAG, CLArgFlag.NO_VALIDATION); CLArgParser.UNIQUE_FLAGS.put(CLArgParser.INLINE_MAIN_MOD_FLAG, CLArgFlag.INLINE_MAIN_MOD); - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.SPIN, CLArgFlag.SPIN); + CLArgParser.UNIQUE_FLAGS.put(CLArgParser.SPIN_FLAG, CLArgFlag.SPIN); } private static final Map NON_UNIQUE_FLAGS = new HashMap<>(); @@ -188,10 +187,10 @@ protected int parseFlag(int i) throws CommandLineException case CLArgParser.NO_LIVENESS_FLAG: case CLArgParser.LTSCONVERT_MIN_FLAG: case CLArgParser.FAIR_FLAG: - case CLArgParser.NO_LOCAL_CHOICE_SUBJECT_CHECK: - case CLArgParser.NO_ACCEPT_CORRELATION_CHECK: + case CLArgParser.NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG: + case CLArgParser.NO_ACCEPT_CORRELATION_CHECK_FLAG: case CLArgParser.NO_VALIDATION_FLAG: - case CLArgParser.SPIN: + case CLArgParser.SPIN_FLAG: { checkAndAddNoArgUniqueFlag(flag); return i; diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser2.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser2.java new file mode 100644 index 000000000..d4bdc82e5 --- /dev/null +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser2.java @@ -0,0 +1,169 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.cli; + +import java.io.File; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +// A Scribble extension should call the super constructor, then add any additional flags to this.info -- FIXME: do in CLFlags, not here +// String[] -> Map -- Map array values are the arguments associated to each CommandLine.Arg +public class CLArgParser2 +{ + + public final CLFlags flags = new CLFlags(); + + // Flag String constants from CLFlags -> flag arguments (possibly none) + private final Map parsed = new HashMap<>(); + + private final String[] raw; // main method args + + public CLArgParser2(String[] raw) + { + this.raw = raw; + } + + public Map getParsed() throws CommandLineException + { + parseArgs(); + return Collections.unmodifiableMap(this.parsed); + } + + private void parseArgs() throws CommandLineException + { + for (int i = 0; i < this.raw.length; ) + { + String a = this.raw[i]; + if (this.flags.flags.containsKey(a)) + { + i = this.parseFlag(i); // Returns index of next arg to parse + } + else + { + if (isMainModuleParsed()) + { + if (a.startsWith("-")) + { + throw new CommandLineException("Unknown flag or bad main module arg: " + a); + } + // Could actually be the second "bad argument" -- we didn't validate the value of the (supposed) "main arg" + throw new CommandLineException("Bad/multiple main module arg: " + a); + } + parseMain(i++); + } + } + } + + private boolean isMainModuleParsed() + { + return this.parsed.containsKey(CLFlags.MAIN_MOD_FLAG) + || this.parsed.containsKey(CLFlags.INLINE_MAIN_MOD_FLAG); + } + + // Pre: i = (the index of the current flag to parse) + // Post: i = 1 + (the index of the last argument parsed) + // N.B. currently allows repeat flag decls: last overwrites previous + protected int parseFlag(int i) throws CommandLineException + { + String flag = this.raw[i]; + + if (this.flags.flags.get(flag).unique) + { + if (this.parsed.containsKey(flag)) + { + throw new CommandLineException("duplicate: " + flag); + } + } + + int num = this.flags.flags.get(flag).numArgs; + if ((i + num) >= this.raw.length) + { + throw new CommandLineException(this.flags.flags.get(flag).err); + } + String[] flagArgs = new String[num]; + if (num > 0) + { + System.arraycopy(this.raw, i + 1, flagArgs, 0, num); + } + this.parsed.put(flag, flagArgs); + return i + 1 + num; + } + + private void parseMain(int i) throws CommandLineException + { + String main = this.raw[i]; + if (!CLArgParser2.validateModuleArg(main)) + { + throw new CommandLineException("Bad module arg: " + main); + } + this.parsed.put(CLFlags.MAIN_MOD_FLAG, new String[] { main } ); + } + + // This check guards the subsequent file open attempt? + private static boolean validateModuleArg(String arg) + { + return arg.chars() + .noneMatch(i -> !Character.isLetterOrDigit(i) && i != '.' + && i != File.separatorChar && i != ':' && i != '-' && i != '_' + && i != '/'); // Hack? (cygwin) + } + + private static boolean validatePaths(String paths) + { + for (String path : paths.split(File.pathSeparator)) + { + if (!new File(path).isDirectory()) + { + return false; + } + } + return true; + } + + + + + + + + + + + /*private int parseImportPath(int i) throws CommandLineException + { + if ((i + 1) >= this.raw.length) + { + throw new CommandLineException("Missing path argument"); + } + String path = this.raw[++i]; + if (!validatePaths(path)) + { + // FIXME: move validation to CL + throw new CommandLineException("Scribble module import path '"+ path +"' is not valid\r\n"); + } + checkAndAddUniqueFlag(CLArgParser.IMPORT_PATH_FLAG, new String[] { path }); + return i; + } + + private void checkAndAddUniqueFlag(String flag, String[] args) throws CommandLineException + { + //CLArgFlag argFlag = CLArgParser.UNIQUE_FLAGS.get(flag); + if (this.parsed.containsKey(flag)) + { + throw new CommandLineException("Duplicate flag: " + flag); + } + this.parsed.put(flag, args); + }*/ +} diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLAux.java b/scribble-cli/src/main/java/org/scribble/cli/CLAux.java new file mode 100644 index 000000000..7a18584b5 --- /dev/null +++ b/scribble-cli/src/main/java/org/scribble/cli/CLAux.java @@ -0,0 +1,50 @@ +package org.scribble.cli; + +import java.util.Arrays; +import java.util.List; + +//... FIXME: integrate CLAux with CLFlags, and refactor unique as a boolean field +//..also refactor non/attemptable as a boolean field +public class CLAux +{ + final String flag; // ID field + final int numArgs; + final boolean unique; + final boolean barrier; + final String err; + final List clashes; + + public CLAux(String flag, int numArgs, boolean unique, boolean barrier, + String err, String... clashes) + { + this.flag = flag; + this.numArgs = numArgs; + this.unique = unique; + this.barrier = barrier; + this.err = err; + this.clashes = Arrays.asList(clashes); + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof CLAux)) + { + return false; + } + CLAux them = (CLAux) o; + return this.flag.equals(them.flag); + } + + @Override + public int hashCode() + { + int hash = 14411; + hash = 31 * this.flag.hashCode(); + return hash; + } +} \ No newline at end of file diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java b/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java new file mode 100644 index 000000000..0253827d1 --- /dev/null +++ b/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java @@ -0,0 +1,260 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.cli; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + + +// Flag Strings must start with "-", e.g., "-project" +// A Scribble extension should override getUniqueFlags and getNonUniqueFlags +// E.g., ... new HashMap<>(super.getUniqueFlags()).putAll(myExtraFlags) ... +public class CLFlags +{ + //public final Map uflags = getUniqueFlags(); + //public final Map nflags = getNonUniqueFlags(); + + + /** + * Implicit (and unique) + */ + public static final String MAIN_MOD_FLAG = "__main"; + + + /** + * Unique flags + */ + public static final String JUNIT_FLAG = "-junit"; // For internal use (JUnit test harness) + public static final String IMPORT_PATH_FLAG = "-ip"; + public static final String API_OUTPUT_DIR_FLAG = "-d"; + public static final String VERBOSE_FLAG = "-V"; + public static final String STATECHAN_SUBTYPES_FLAG = "-subtypes"; + public static final String OLD_WF_FLAG = "-oldwf"; + public static final String NO_LIVENESS_FLAG = "-nolive"; + public static final String LTSCONVERT_MIN_FLAG = "-minlts"; // Currently only affects EFSM output (i.e. -fsm..) and API gen -- doesn't affect validation + public static final String FAIR_FLAG = "-fair"; + public static final String NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG = "-nolocalchoicecheck"; + public static final String NO_ACCEPT_CORRELATION_CHECK_FLAG = "-nocorrelation"; + public static final String DOT_FLAG = "-dot"; + public static final String AUT_FLAG = "-aut"; + public static final String NO_VALIDATION_FLAG = "-novalid"; + public static final String INLINE_MAIN_MOD_FLAG = "-inline"; + public static final String SPIN_FLAG = "-spin"; + + + /** + * Non-unique flags + */ + public static final String PROJECT_FLAG = "-project"; + public static final String EFSM_FLAG = "-fsm"; + public static final String VALIDATION_EFSM_FLAG = "-vfsm"; + public static final String UNFAIR_EFSM_FLAG = "-ufsm"; + public static final String UNFAIR_EFSM_PNG_FLAG = "-ufsmpng"; + public static final String EFSM_PNG_FLAG = "-fsmpng"; + public static final String VALIDATION_EFSM_PNG_FLAG = "-vfsmpng"; + public static final String SGRAPH_FLAG = "-model"; + public static final String UNFAIR_SGRAPH_FLAG = "-umodel"; + public static final String SGRAPH_PNG_FLAG = "-modelpng"; + public static final String UNFAIR_SGRAPH_PNG_FLAG = "-umodelpng"; + public static final String API_GEN_FLAG = "-api"; + public static final String SESSION_API_GEN_FLAG = "-sessapi"; + public static final String STATECHAN_API_GEN_FLAG = "-chanapi"; + public static final String EVENTDRIVEN_API_GEN_FLAG = "-cbapi"; + //*/ + + public final Map flags; + + public CLFlags() + { + Map flags = new HashMap<>(); + + // Unique; barrier irrelevant + flags.put(IMPORT_PATH_FLAG, + new CLAux(IMPORT_PATH_FLAG, 1, true, false, "Missing path argument: ")); + flags.put(API_OUTPUT_DIR_FLAG, + new CLAux(API_OUTPUT_DIR_FLAG, 1, true, false, + "Missing directory argument: ")); + flags.put(INLINE_MAIN_MOD_FLAG, + new CLAux(INLINE_MAIN_MOD_FLAG, 1, true, false, "Missing inline module: ")); + + flags.put(JUNIT_FLAG, + new CLAux(JUNIT_FLAG, 0, true, false, "Duplicate flag: ")); + flags.put(VERBOSE_FLAG, + new CLAux(VERBOSE_FLAG, 0, true, false, "Duplicate flag: ")); + flags.put(STATECHAN_SUBTYPES_FLAG, + new CLAux(STATECHAN_SUBTYPES_FLAG, 0, true, false, "Duplicate flag: ")); + flags.put(OLD_WF_FLAG, + new CLAux(OLD_WF_FLAG, 0, true, false, "Duplicate flag: ")); + flags.put(NO_LIVENESS_FLAG, + new CLAux(NO_LIVENESS_FLAG, 0, true, false, "Duplicate flag: ")); + flags.put(LTSCONVERT_MIN_FLAG, + new CLAux(LTSCONVERT_MIN_FLAG, 0, true, false, "Duplicate flag: ")); + flags.put(FAIR_FLAG, + new CLAux(FAIR_FLAG, 0, true, false, "Duplicate flag: ")); + flags.put(NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG, + new CLAux(NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG, 0, true, false, + "Duplicate flag: ")); + flags.put(NO_ACCEPT_CORRELATION_CHECK_FLAG, + new CLAux(NO_ACCEPT_CORRELATION_CHECK_FLAG, 0, true, false, + "Duplicate flag: ")); + flags.put(NO_VALIDATION_FLAG, + new CLAux(NO_VALIDATION_FLAG, 0, true, false, "Duplicate flag: ")); + flags.put(SPIN_FLAG, + new CLAux(SPIN_FLAG, 0, true, false, "Duplicate flag: ")); + + // These two clash + flags.put(DOT_FLAG, + new CLAux(DOT_FLAG, 0, true, false, "Duplicate flag: ", + CLFlags.AUT_FLAG)); + flags.put(AUT_FLAG, + new CLAux(AUT_FLAG, 0, true, false, "Duplicate flag: ", + CLFlags.DOT_FLAG)); + + // Non-unique, no barrier + flags.put(PROJECT_FLAG, + new CLAux(PROJECT_FLAG, 2, false, false, + "Missing protocol/role arguments: ")); + flags.put(EFSM_FLAG, + new CLAux(EFSM_FLAG, 2, false, false, + "Missing protocol/role arguments: ")); + flags.put(VALIDATION_EFSM_FLAG, + new CLAux(VALIDATION_EFSM_FLAG, 2, false, false, + "Missing protocol/role arguments: ")); + flags.put(UNFAIR_EFSM_FLAG, + new CLAux(UNFAIR_EFSM_FLAG, 2, false, false, + "Missing protocol/role arguments: ")); + + flags.put(EFSM_PNG_FLAG, + new CLAux(EFSM_PNG_FLAG, 3, false, false, + "Missing protocol/role/file arguments: ")); + flags.put(VALIDATION_EFSM_PNG_FLAG, + new CLAux(VALIDATION_EFSM_PNG_FLAG, 3, false, false, + "Missing protocol/role/file arguments: ")); + flags.put(UNFAIR_EFSM_PNG_FLAG, + new CLAux(UNFAIR_EFSM_PNG_FLAG, 3, false, false, + "Missing protocol/role/file arguments: ")); + + flags.put(SGRAPH_FLAG, + new CLAux(SGRAPH_FLAG, 2, false, false, "Missing protocol argument: ")); + flags.put(UNFAIR_SGRAPH_FLAG, + new CLAux(UNFAIR_SGRAPH_FLAG, 2, false, false, + "Missing protocol argument: ")); + + flags.put(SGRAPH_PNG_FLAG, + new CLAux(SGRAPH_PNG_FLAG, 1, false, false, + "Missing protocol/file arguments: ")); + flags.put(UNFAIR_SGRAPH_PNG_FLAG, + new CLAux(UNFAIR_SGRAPH_PNG_FLAG, 1, false, false, + "Missing protocol/file arguments: ")); + + // // Non-unique, barrier + flags.put(SESSION_API_GEN_FLAG, + new CLAux(SESSION_API_GEN_FLAG, 1, false, true, + "Missing protocol argument: ")); + flags.put(API_GEN_FLAG, + new CLAux(API_GEN_FLAG, 2, false, true, + "Missing protocol/role arguments: ")); + flags.put(STATECHAN_API_GEN_FLAG, + new CLAux(STATECHAN_API_GEN_FLAG, 2, false, true, + "Missing protocol/role arguments: ")); + flags.put(EVENTDRIVEN_API_GEN_FLAG, + new CLAux(EVENTDRIVEN_API_GEN_FLAG, 2, false, true, + "Missing protocol/role arguments: ")); + + this.flags = Collections.unmodifiableMap(flags); + } + + /*this.info.put(CLFlags.JUNIT_FLAG, new CLAux(0, "Duplicate flag: ")); + this.info.put(CLFlags.VERBOSE_FLAG, new CLAux(0, "Duplicate flag: ")); + this.info.put(CLFlags.STATECHAN_SUBTYPES_FLAG, new CLAux(0, "Duplicate flag: ")); + this.info.put(CLFlags.OLD_WF_FLAG, new CLAux(0, "Duplicate flag: ")); + this.info.put(CLFlags.NO_LIVENESS_FLAG, new CLAux(0, "Duplicate flag: ")); + this.info.put(CLFlags.LTSCONVERT_MIN_FLAG, new CLAux(0, "Duplicate flag: ")); + this.info.put(CLFlags.FAIR_FLAG, new CLAux(0, "Duplicate flag: ")); + this.info.put(CLFlags.NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG, new CLAux(0, "Duplicate flag: ")); + this.info.put(CLFlags.NO_ACCEPT_CORRELATION_CHECK_FLAG, new CLAux(0, "Duplicate flag: ")); + this.info.put(CLFlags.NO_VALIDATION_FLAG, new CLAux(0, "Duplicate flag: ")); + this.info.put(CLFlags.SPIN_FLAG, new CLAux(0, "Duplicate flag: ")); + + this.info.put(CLFlags.DOT_FLAG, new CLAux(0, "Duplicate flag: ", CLFlags.AUT_FLAG)); + this.info.put(CLFlags.AUT_FLAG, new CLAux(0, "Duplicate flag: ", CLFlags.DOT_FLAG)); + + this.info.put(CLFlags.API_OUTPUT_DIR_FLAG, new CLAux(1, "Missing directory argument: ")); + this.info.put(CLFlags.IMPORT_PATH_FLAG, new CLAux(1, "Missing path argument: ")); + + this.info.put(CLFlags.PROJECT_FLAG, new CLAux(2, "Missing protocol/role arguments: ")); + this.info.put(CLFlags.EFSM_FLAG, new CLAux(2, "Missing protocol/role arguments: ")); + this.info.put(CLFlags.VALIDATION_EFSM_FLAG, new CLAux(2, "Missing protocol/role arguments: ")); + this.info.put(CLFlags.UNFAIR_EFSM_FLAG, new CLAux(2, "Missing protocol/role arguments: ")); + this.info.put(CLFlags.API_GEN_FLAG, new CLAux(2, "Missing protocol/role arguments: ")); + this.info.put(CLFlags.STATECHAN_API_GEN_FLAG, new CLAux(2, "Missing protocol/role arguments: ")); + this.info.put(CLFlags.EVENTDRIVEN_API_GEN_FLAG, new CLAux(2, "Missing protocol/role arguments: ")); + + this.info.put(CLFlags.EFSM_PNG_FLAG, new CLAux(3, "Missing protocol/role/file arguments: ")); + this.info.put(CLFlags.VALIDATION_EFSM_PNG_FLAG, new CLAux(3, "Missing protocol/role/file arguments: ")); + this.info.put(CLFlags.UNFAIR_EFSM_PNG_FLAG, new CLAux(3, "Missing protocol/role/file arguments: ")); + + this.info.put(CLFlags.SGRAPH_FLAG, new CLAux(1, "Missing protocol argument: ")); + this.info.put(CLFlags.UNFAIR_SGRAPH_FLAG, new CLAux(1, "Missing protocol argument: ")); + this.info.put(CLFlags.SESSION_API_GEN_FLAG, new CLAux(1, "Missing protocol argument: ")); + + this.info.put(CLFlags.SGRAPH_PNG_FLAG, new CLAux(2, "Missing protocol/file arguments: ")); + this.info.put(CLFlags.UNFAIR_SGRAPH_PNG_FLAG, new CLAux(2, "Missing protocol/file arguments: "));*/ + + /* + public Map getUniqueFlags() + { + Map utmp = new HashMap<>(); + utmp.put(JUNIT, "-junit"); + utmp.put(IMPORT_PATH, IMPORT_PATH_FLAG); + utmp.put(API_OUTPUT, API_OUTPUT_DIR_FLAG); + utmp.put(VERBOSE, VERBOSE_FLAG); + utmp.put(SCHAN_API_SUBTYPES, STATECHAN_SUBTYPES_FLAG); + utmp.put(OLD_WF, OLD_WF_FLAG); + utmp.put(NO_PROGRESS, NO_LIVENESS_FLAG); + utmp.put(LTSCONVERT_MIN, LTSCONVERT_MIN_FLAG); + utmp.put(FAIR, FAIR_FLAG); + utmp.put(NO_LOCAL_CHOICE_SUBJECT_CHECK, NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG); + utmp.put(NO_ACCEPT_CORRELATION_CHECK, NO_ACCEPT_CORRELATION_CHECK_FLAG); + utmp.put(DOT, DOT_FLAG); + utmp.put(AUT, AUT_FLAG); + utmp.put(NO_VALIDATION, NO_VALIDATION_FLAG); + utmp.put(INLINE_MAIN_MOD, INLINE_MAIN_MOD_FLAG); + utmp.put(SPIN, SPIN_FLAG); + return Collections.unmodifiableMap(utmp); + } + + public Map getNonUniqueFlags() + { + Map ntmp = new HashMap<>(); + ntmp.put(PROJECT, PROJECT_FLAG); + ntmp.put(EFSM, EFSM_FLAG); + ntmp.put(VALIDATION_EFSM, VALIDATION_EFSM_FLAG); + ntmp.put(UNFAIR_EFSM, UNFAIR_EFSM_FLAG); + ntmp.put(UNFAIR_EFSM_PNG, UNFAIR_EFSM_PNG_FLAG); + ntmp.put(EFSM_PNG, EFSM_PNG_FLAG); + ntmp.put(VALIDATION_EFSM_PNG, VALIDATION_EFSM_PNG_FLAG); + ntmp.put(SGRAPH, SGRAPH_FLAG); + ntmp.put(UNFAIR_SGRAPH, UNFAIR_SGRAPH_FLAG); + ntmp.put(SGRAPH_PNG, SGRAPH_PNG_FLAG); + ntmp.put(UNFAIR_SGRAPH_PNG, UNFAIR_SGRAPH_PNG_FLAG); + ntmp.put(API_GEN, API_GEN_FLAG); + ntmp.put(SESS_API_GEN, SESSION_API_GEN_FLAG); + ntmp.put(SCHAN_API_GEN, STATECHAN_API_GEN_FLAG); + ntmp.put(ED_API_GEN, EVENTDRIVEN_API_GEN_FLAG); + return Collections.unmodifiableMap(ntmp); + } + //*/ +} diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index d889ba679..448c85d05 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -51,41 +51,47 @@ public class CommandLine { - protected final Map args; // Maps each flag to list of associated argument values + //public final Map args; // Maps each flag to list of associated argument values + public final Map args; // Maps each flag to list of associated argument values - protected CommandLine(CLArgParser p) throws CommandLineException + protected CommandLine(CLArgParser2 p) throws CommandLineException { - p.parse(); - this.args = p.getArgs(); + this.args = p.getParsed(); } public CommandLine(String... args) throws CommandLineException { //this.args = new CLArgParser(args).getArgs(); - this(new CLArgParser(args)); - if (!this.args.containsKey(CLArgFlag.MAIN_MOD) - && !this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) + this(new CLArgParser2(args)); + if (!(this.args.containsKey(CLFlags.MAIN_MOD_FLAG) + || this.args.containsKey(CLFlags.INLINE_MAIN_MOD_FLAG))) { throw new CommandLineException("No main module has been specified\r\n"); } } + public static void main(String[] args) + throws CommandLineException, AntlrSourceException + { + new CommandLine(args).run(); + } + // A Scribble extension should override newMainContext as appropriate. protected Main newMainContext() throws ScribParserException, ScribException { // FIXME: refactor into arg parsing - boolean debug = this.args.containsKey(CLArgFlag.VERBOSE); // TODO: factor out (cf. MainContext fields) - boolean useOldWf = this.args.containsKey(CLArgFlag.OLD_WF); - boolean noProgress = this.args.containsKey(CLArgFlag.NO_PROGRESS); - boolean minEfsm = this.args.containsKey(CLArgFlag.LTSCONVERT_MIN); - boolean fair = this.args.containsKey(CLArgFlag.FAIR); + boolean debug = this.args.containsKey(CLFlags.VERBOSE_FLAG); // TODO: factor out (cf. MainContext fields) + boolean useOldWf = this.args.containsKey(CLFlags.OLD_WF_FLAG); + boolean noProgress = this.args.containsKey(CLFlags.NO_LIVENESS_FLAG); + boolean minEfsm = this.args.containsKey(CLFlags.LTSCONVERT_MIN_FLAG); + boolean fair = this.args.containsKey(CLFlags.FAIR_FLAG); boolean noLocalChoiceSubjectCheck = - this.args.containsKey(CLArgFlag.NO_LOCAL_CHOICE_SUBJECT_CHECK); + this.args.containsKey(CLFlags.NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG); boolean noAcceptCorrelationCheck = - this.args.containsKey(CLArgFlag.NO_ACCEPT_CORRELATION_CHECK); - boolean noValidation = this.args.containsKey(CLArgFlag.NO_VALIDATION); - boolean spin = this.args.containsKey(CLArgFlag.SPIN); + this.args.containsKey(CLFlags.NO_ACCEPT_CORRELATION_CHECK_FLAG); + boolean noValidation = this.args.containsKey(CLFlags.NO_VALIDATION_FLAG); + boolean spin = this.args.containsKey(CLFlags.SPIN_FLAG); // FIXME: refactor into arg parsing Map args = new HashMap<>(); @@ -100,28 +106,22 @@ protected Main newMainContext() args.put(JobArgs.SPIN, spin); args = Collections.unmodifiableMap(args); - List impaths = this.args.containsKey(CLArgFlag.IMPORT_PATH) - ? CommandLine.parseImportPaths(this.args.get(CLArgFlag.IMPORT_PATH)[0]) + List impaths = this.args.containsKey(CLFlags.IMPORT_PATH_FLAG) + ? CommandLine.parseImportPaths(this.args.get(CLFlags.IMPORT_PATH_FLAG)[0]) : Collections.emptyList(); - if (this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) + if (this.args.containsKey(CLFlags.INLINE_MAIN_MOD_FLAG)) { - String inline = this.args.get(CLArgFlag.INLINE_MAIN_MOD)[0]; + String inline = this.args.get(CLFlags.INLINE_MAIN_MOD_FLAG)[0]; return new Main(inline, args); } else { ResourceLocator locator = new DirectoryResourceLocator(impaths); - Path mainpath = CommandLine.parseMainPath(this.args.get(CLArgFlag.MAIN_MOD)[0]); + Path mainpath = CommandLine.parseMainPath(this.args.get(CLFlags.MAIN_MOD_FLAG)[0]); return new Main(locator, mainpath, args); } } - public static void main(String[] args) - throws CommandLineException, AntlrSourceException - { - new CommandLine(args).run(); - } - public void run() throws CommandLineException, AntlrSourceException // ScribbleException is for JUnit testing { try @@ -132,8 +132,8 @@ public void run() throws CommandLineException, AntlrSourceException // Scribble } catch (ScribException e) // Wouldn't need to do this if not Runnable (so maybe change) { - if (this.args.containsKey(CLArgFlag.JUNIT) - || this.args.containsKey(CLArgFlag.VERBOSE)) + if (this.args.containsKey(CLFlags.JUNIT_FLAG) + || this.args.containsKey(CLFlags.VERBOSE_FLAG)) { /*RuntimeScribbleException ee = new RuntimeScribbleException(e.getMessage()); ee.setStackTrace(e.getStackTrace()); @@ -221,38 +221,38 @@ protected void tryOutputTasks(Lang lang) throws CommandLineException, ScribException { // Following must be ordered appropriately -- ? - if (this.args.containsKey(CLArgFlag.PROJECT)) + if (this.args.containsKey(CLFlags.PROJECT_FLAG)) { printProjections(lang); } - if (this.args.containsKey(CLArgFlag.EFSM)) + if (this.args.containsKey(CLFlags.EFSM_FLAG)) { printEGraph(lang, true, true); } - if (this.args.containsKey(CLArgFlag.VALIDATION_EFSM)) + if (this.args.containsKey(CLFlags.VALIDATION_EFSM_FLAG)) { printEGraph(lang, false, true); } - if (this.args.containsKey(CLArgFlag.UNFAIR_EFSM)) + if (this.args.containsKey(CLFlags.UNFAIR_EFSM_FLAG)) { printEGraph(lang, false, false); } - if (this.args.containsKey(CLArgFlag.EFSM_PNG)) + if (this.args.containsKey(CLFlags.EFSM_PNG_FLAG)) { drawEGraph(lang, true, true); } - if (this.args.containsKey(CLArgFlag.VALIDATION_EFSM_PNG)) + if (this.args.containsKey(CLFlags.VALIDATION_EFSM_PNG_FLAG)) { drawEGraph(lang, false, true); } - if (this.args.containsKey(CLArgFlag.UNFAIR_EFSM_PNG)) + if (this.args.containsKey(CLFlags.UNFAIR_EFSM_PNG_FLAG)) { drawEGraph(lang, false, false); } - if (this.args.containsKey(CLArgFlag.SGRAPH) - || this.args.containsKey(CLArgFlag.SGRAPH_PNG) - || this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH) - || this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH_PNG)) + if (this.args.containsKey(CLFlags.SGRAPH_FLAG) + || this.args.containsKey(CLFlags.SGRAPH_PNG_FLAG) + || this.args.containsKey(CLFlags.UNFAIR_SGRAPH_FLAG) + || this.args.containsKey(CLFlags.UNFAIR_SGRAPH_PNG_FLAG)) { if (lang.config.args.get(JobArgs.OLD_WF)) { @@ -260,19 +260,19 @@ protected void tryOutputTasks(Lang lang) "Global model flag(s) incompatible with: " + CLArgParser.OLD_WF_FLAG); } - if (this.args.containsKey(CLArgFlag.SGRAPH)) + if (this.args.containsKey(CLFlags.SGRAPH_FLAG)) { printSGraph(lang, true); } - if (this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH)) + if (this.args.containsKey(CLFlags.UNFAIR_SGRAPH_FLAG)) { printSGraph(lang, false); } - if (this.args.containsKey(CLArgFlag.SGRAPH_PNG)) + if (this.args.containsKey(CLFlags.SGRAPH_PNG_FLAG)) { drawSGraph(lang, true); } - if (this.args.containsKey(CLArgFlag.UNFAIR_SGRAPH_PNG)) + if (this.args.containsKey(CLFlags.UNFAIR_SGRAPH_PNG_FLAG)) { drawSGraph(lang, false); } @@ -283,19 +283,19 @@ protected void tryOutputTasks(Lang lang) protected void doNonAttemptableOutputTasks(Lang lang) throws ScribException, CommandLineException { - if (this.args.containsKey(CLArgFlag.SESS_API_GEN)) + if (this.args.containsKey(CLFlags.SESSION_API_GEN_FLAG)) { outputSessionApi(lang); } - if (this.args.containsKey(CLArgFlag.SCHAN_API_GEN)) + if (this.args.containsKey(CLFlags.STATECHAN_API_GEN_FLAG)) { outputStateChannelApi(lang); } - if (this.args.containsKey(CLArgFlag.API_GEN)) + if (this.args.containsKey(CLFlags.API_GEN_FLAG)) { outputEndpointApi(lang); } - if (this.args.containsKey(CLArgFlag.ED_API_GEN)) + if (this.args.containsKey(CLFlags.EVENTDRIVEN_API_GEN_FLAG)) { outputEventDrivenApi(lang); } @@ -307,7 +307,7 @@ private void printProjections(Lang lang) { LangContext jobc = lang.getContext(); Job job = lang.toJob(); - String[] args = this.args.get(CLArgFlag.PROJECT); + String[] args = this.args.get(CLFlags.PROJECT_FLAG); for (int i = 0; i < args.length; i += 2) { GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); @@ -327,16 +327,16 @@ private void printEGraph(Lang lang, boolean forUser, boolean fair) { LangContext jobc = lang.getContext(); String[] args = forUser - ? this.args.get(CLArgFlag.EFSM) + ? this.args.get(CLFlags.EFSM_FLAG) : (fair - ? this.args.get(CLArgFlag.VALIDATION_EFSM) - : this.args.get(CLArgFlag.UNFAIR_EFSM)); + ? this.args.get(CLFlags.VALIDATION_EFSM_FLAG) + : this.args.get(CLFlags.UNFAIR_EFSM_FLAG)); for (int i = 0; i < args.length; i += 2) { GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); Role role = checkRoleArg(jobc, fullname, args[i+1]); EGraph fsm = getEGraph(lang, fullname, role, forUser, fair); - String out = this.args.containsKey(CLArgFlag.AUT) + String out = this.args.containsKey(CLFlags.AUT_FLAG) ? fsm.toAut() : fsm.toDot(); System.out.println("\n" + out); // Endpoint graphs are "inlined" (a single graph is built) @@ -348,10 +348,10 @@ private void drawEGraph(Lang lang, boolean forUser, boolean fair) { LangContext jobc = lang.getContext(); String[] args = forUser - ? this.args.get(CLArgFlag.EFSM_PNG) + ? this.args.get(CLFlags.EFSM_PNG_FLAG) : (fair - ? this.args.get(CLArgFlag.VALIDATION_EFSM_PNG) - : this.args.get(CLArgFlag.UNFAIR_EFSM_PNG)); + ? this.args.get(CLFlags.VALIDATION_EFSM_PNG_FLAG) + : this.args.get(CLFlags.UNFAIR_EFSM_PNG_FLAG)); for (int i = 0; i < args.length; i += 3) { GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); @@ -375,12 +375,12 @@ private EGraph getEGraph(Lang lang, GProtocolName fullname, Role role, .contains(role)) { throw new CommandLineException("Bad FSM construction args: " - + Arrays.toString(this.args.get(CLArgFlag.DOT))); + + Arrays.toString(this.args.get(CLFlags.DOT_FLAG))); } EGraph graph; if (forUser) // The (possibly minimised) user-output EFSM for API gen { - graph = this.args.containsKey(CLArgFlag.LTSCONVERT_MIN) + graph = this.args.containsKey(CLFlags.LTSCONVERT_MIN_FLAG) ? jobc2.getMinimisedEGraph(fullname, role) : jobc2.getEGraph(fullname, role); } @@ -404,13 +404,13 @@ private void printSGraph(Lang lang, boolean fair) { LangContext jobc = lang.getContext(); String[] args = fair - ? this.args.get(CLArgFlag.SGRAPH) - : this.args.get(CLArgFlag.UNFAIR_SGRAPH); + ? this.args.get(CLFlags.SGRAPH_FLAG) + : this.args.get(CLFlags.UNFAIR_SGRAPH_FLAG); for (int i = 0; i < args.length; i += 1) { GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); SGraph model = getSGraph(lang, fullname, fair); - String out = this.args.containsKey(CLArgFlag.AUT) + String out = this.args.containsKey(CLFlags.AUT_FLAG) ? model.toAut() : model.toDot(); System.out.println("\n" + out); @@ -422,8 +422,8 @@ private void drawSGraph(Lang lang, boolean fair) { LangContext jobc = lang.getContext(); String[] args = fair - ? this.args.get(CLArgFlag.SGRAPH_PNG) - : this.args.get(CLArgFlag.UNFAIR_SGRAPH_PNG); + ? this.args.get(CLFlags.SGRAPH_PNG_FLAG) + : this.args.get(CLFlags.UNFAIR_SGRAPH_PNG_FLAG); for (int i = 0; i < args.length; i += 2) { GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); @@ -452,7 +452,7 @@ private void outputEndpointApi(Lang lang) throws ScribException, CommandLineException { LangContext jobc = lang.getContext(); - String[] args = this.args.get(CLArgFlag.API_GEN); + String[] args = this.args.get(CLFlags.API_GEN_FLAG); JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // FIXME: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) { @@ -461,7 +461,7 @@ private void outputEndpointApi(Lang lang) outputClasses(sessClasses); Role role = checkRoleArg(jobc, fullname, args[i+1]); Map scClasses = jgen.generateStateChannelApi(fullname, - role, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); + role, this.args.containsKey(CLFlags.STATECHAN_API_GEN_FLAG)); outputClasses(scClasses); } } @@ -470,7 +470,7 @@ private void outputSessionApi(Lang lang) throws ScribException, CommandLineException { LangContext jobc = lang.getContext(); - String[] args = this.args.get(CLArgFlag.SESS_API_GEN); + String[] args = this.args.get(CLFlags.SESSION_API_GEN_FLAG); JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // TODO: refactor (generalise -- use new API) for (String fullname : args) { @@ -484,14 +484,14 @@ private void outputStateChannelApi(Lang lang) throws ScribException, CommandLineException { LangContext jobc = lang.getContext(); - String[] args = this.args.get(CLArgFlag.SCHAN_API_GEN); + String[] args = this.args.get(CLFlags.STATECHAN_API_GEN_FLAG); JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // TODO: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) { GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); Role self = checkRoleArg(jobc, fullname, args[i+1]); Map classes = jgen.generateStateChannelApi(fullname, self, - this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); + this.args.containsKey(CLFlags.STATECHAN_API_GEN_FLAG)); outputClasses(classes); } } @@ -500,7 +500,7 @@ private void outputEventDrivenApi(Lang lang) throws ScribException, CommandLineException { LangContext jobc = lang.getContext(); - String[] args = this.args.get(CLArgFlag.ED_API_GEN); + String[] args = this.args.get(CLFlags.EVENTDRIVEN_API_GEN_FLAG); /*JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // FIXME: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) { @@ -508,7 +508,7 @@ private void outputEventDrivenApi(Lang lang) Map sessClasses = jgen.generateSessionApi(fullname); outputClasses(sessClasses); Role role = checkRoleArg(jobc, fullname, args[i+1]); - Map scClasses = jgen.generateStateChannelApi(fullname, role, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); + Map scClasses = jgen.generateStateChannelApi(fullname, role, this.args.containsKey(CLFlags.SCHAN_API_SUBTYPES)); outputClasses(scClasses); }*/ for (int i = 0; i < args.length; i += 2) @@ -516,7 +516,7 @@ private void outputEventDrivenApi(Lang lang) GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); Role self = checkRoleArg(jobc, fullname, args[i+1]); CBEndpointApiGenerator3 edgen = new CBEndpointApiGenerator3(lang, fullname, - self, this.args.containsKey(CLArgFlag.SCHAN_API_SUBTYPES)); + self, this.args.containsKey(CLFlags.STATECHAN_API_GEN_FLAG)); Map out = edgen.build(); outputClasses(out); } @@ -527,13 +527,13 @@ protected void outputClasses(Map classes) throws ScribException { Consumer f; - if (this.args.containsKey(CLArgFlag.API_OUTPUT)) + if (this.args.containsKey(CLFlags.API_GEN_FLAG)) { - String dir = this.args.get(CLArgFlag.API_OUTPUT)[0]; + String dir = this.args.get(CLFlags.API_GEN_FLAG)[0]; f = path -> { ScribUtil.handleLambdaScribbleException(() -> { String tmp = dir + "/" + path; - if (this.args.containsKey(CLArgFlag.VERBOSE)) + if (this.args.containsKey(CLFlags.VERBOSE_FLAG)) { System.out.println("[DEBUG] Writing to: " + tmp); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java b/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java index 5a82b8d25..f8c2b57d3 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java @@ -29,7 +29,7 @@ import org.scribble.util.ScribException; // Context information specific to each module as a root (wrt. to visitor passes) -// CHECKME: move to main package? +// CHECKME: currently unused within core -- refactor out to lang package? public class ModuleContext { public final ModuleName root; // full name // The root Module for this ModuleContext (cf. the "main" root module from CLI) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/context/ScribNames.java b/scribble-core/src/main/java/org/scribble/core/lang/context/ScribNames.java index e2bcb5278..fb493e4c9 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/context/ScribNames.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/context/ScribNames.java @@ -16,7 +16,6 @@ import java.util.HashMap; import java.util.Map; -import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.LProtocolName; @@ -24,7 +23,7 @@ import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.ProtocolName; -// TODO: fix mutable public collection fields +// TODO: fix mutable public collection fields -- currently hacked for ModuleContext(Collector) internal use // TODO: rename better public class ScribNames { @@ -38,15 +37,18 @@ public class ScribNames @Override public String toString() { - return "(modules=" + this.modules + ", types=" + this.data + ", sigs=" + this.sigs - + ", globals=" + this.globals + ", locals=" + this.locals + ")"; + return "(modules=" + + this.modules + ", types=" + this.data + ", sigs=" + this.sigs + + ", globals=" + this.globals + ", locals=" + this.locals + + ")"; } - - public boolean isVisibleProtocolDeclName(ProtocolName visname) + + public boolean isVisibleProtocolDeclName(ProtocolName visname) { - return this.globals.containsKey(visname) || this.locals.containsKey(visname); + return this.globals.containsKey(visname) + || this.locals.containsKey(visname); } - + public boolean isVisibleDataType(DataType visname) { return this.data.containsKey(visname); From 9bc82e5a80f408549a47486ba7229c2fea2f3a8e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 11:17:55 +0100 Subject: [PATCH 190/539] Continued: refactoring cli. --- .../java/org/scribble/cli/CLArgParser2.java | 58 +++++---- .../main/java/org/scribble/cli/CLFlags.java | 119 +++--------------- .../java/org/scribble/cli/CommandLine.java | 28 ++--- 3 files changed, 61 insertions(+), 144 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser2.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser2.java index d4bdc82e5..71d8ff88e 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser2.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser2.java @@ -22,14 +22,13 @@ // String[] -> Map -- Map array values are the arguments associated to each CommandLine.Arg public class CLArgParser2 { - public final CLFlags flags = new CLFlags(); + private final String[] raw; // Raw args from main method + // Flag String constants from CLFlags -> flag arguments (possibly none) private final Map parsed = new HashMap<>(); - private final String[] raw; // main method args - public CLArgParser2(String[] raw) { this.raw = raw; @@ -38,6 +37,23 @@ public CLArgParser2(String[] raw) public Map getParsed() throws CommandLineException { parseArgs(); + if (!(this.parsed.containsKey(CLFlags.MAIN_MOD_FLAG) + ^ this.parsed.containsKey(CLFlags.INLINE_MAIN_MOD_FLAG))) + { + throw new CommandLineException("No/multiple main module specified\n"); + } + if (this.parsed.containsKey(CLFlags.MAIN_MOD_FLAG)) + { + String main = this.parsed.get(CLFlags.MAIN_MOD_FLAG)[0]; + if (!validateModuleArg(main)) + { + throw new CommandLineException("Bad module arg: " + main); + } + } + if (this.parsed.containsKey(CLFlags.IMPORT_PATH_FLAG)) + { + validatePaths(this.parsed.get(CLFlags.IMPORT_PATH_FLAG)[0]); + } return Collections.unmodifiableMap(this.parsed); } @@ -56,29 +72,23 @@ private void parseArgs() throws CommandLineException { if (a.startsWith("-")) { - throw new CommandLineException("Unknown flag or bad main module arg: " + a); + throw new CommandLineException( + "Unknown flag or bad main module arg: " + a); } // Could actually be the second "bad argument" -- we didn't validate the value of the (supposed) "main arg" throw new CommandLineException("Bad/multiple main module arg: " + a); } - parseMain(i++); + i = parseMain(i); } } } - private boolean isMainModuleParsed() - { - return this.parsed.containsKey(CLFlags.MAIN_MOD_FLAG) - || this.parsed.containsKey(CLFlags.INLINE_MAIN_MOD_FLAG); - } - // Pre: i = (the index of the current flag to parse) // Post: i = 1 + (the index of the last argument parsed) // N.B. currently allows repeat flag decls: last overwrites previous protected int parseFlag(int i) throws CommandLineException { String flag = this.raw[i]; - if (this.flags.flags.get(flag).unique) { if (this.parsed.containsKey(flag)) @@ -86,7 +96,6 @@ protected int parseFlag(int i) throws CommandLineException throw new CommandLineException("duplicate: " + flag); } } - int num = this.flags.flags.get(flag).numArgs; if ((i + num) >= this.raw.length) { @@ -95,24 +104,27 @@ protected int parseFlag(int i) throws CommandLineException String[] flagArgs = new String[num]; if (num > 0) { - System.arraycopy(this.raw, i + 1, flagArgs, 0, num); + System.arraycopy(this.raw, i+1, flagArgs, 0, num); } this.parsed.put(flag, flagArgs); - return i + 1 + num; + return i+1 + num; } - private void parseMain(int i) throws CommandLineException + protected int parseMain(int i) throws CommandLineException { String main = this.raw[i]; - if (!CLArgParser2.validateModuleArg(main)) - { - throw new CommandLineException("Bad module arg: " + main); - } - this.parsed.put(CLFlags.MAIN_MOD_FLAG, new String[] { main } ); + this.parsed.put(CLFlags.MAIN_MOD_FLAG, new String[]{main}); + return i+1; + } + + private boolean isMainModuleParsed() + { + return this.parsed.containsKey(CLFlags.MAIN_MOD_FLAG) + || this.parsed.containsKey(CLFlags.INLINE_MAIN_MOD_FLAG); } // This check guards the subsequent file open attempt? - private static boolean validateModuleArg(String arg) + private boolean validateModuleArg(String arg) { return arg.chars() .noneMatch(i -> !Character.isLetterOrDigit(i) && i != '.' @@ -120,7 +132,7 @@ private static boolean validateModuleArg(String arg) && i != '/'); // Hack? (cygwin) } - private static boolean validatePaths(String paths) + private boolean validatePaths(String paths) { for (String path : paths.split(File.pathSeparator)) { diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java b/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java index 0253827d1..4e1bdaddf 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java @@ -19,23 +19,15 @@ // Flag Strings must start with "-", e.g., "-project" -// A Scribble extension should override getUniqueFlags and getNonUniqueFlags -// E.g., ... new HashMap<>(super.getUniqueFlags()).putAll(myExtraFlags) ... +// A Scribble extension should override getFlags public class CLFlags { - //public final Map uflags = getUniqueFlags(); - //public final Map nflags = getNonUniqueFlags(); - + public final Map flags; - /** - * Implicit (and unique) - */ + // Implicit (and unique) public static final String MAIN_MOD_FLAG = "__main"; - - /** - * Unique flags - */ + // Unique flags public static final String JUNIT_FLAG = "-junit"; // For internal use (JUnit test harness) public static final String IMPORT_PATH_FLAG = "-ip"; public static final String API_OUTPUT_DIR_FLAG = "-d"; @@ -53,10 +45,7 @@ public class CLFlags public static final String INLINE_MAIN_MOD_FLAG = "-inline"; public static final String SPIN_FLAG = "-spin"; - - /** - * Non-unique flags - */ + // Non-unique flags public static final String PROJECT_FLAG = "-project"; public static final String EFSM_FLAG = "-fsm"; public static final String VALIDATION_EFSM_FLAG = "-vfsm"; @@ -72,14 +61,18 @@ public class CLFlags public static final String SESSION_API_GEN_FLAG = "-sessapi"; public static final String STATECHAN_API_GEN_FLAG = "-chanapi"; public static final String EVENTDRIVEN_API_GEN_FLAG = "-cbapi"; - //*/ - - public final Map flags; public CLFlags() { - Map flags = new HashMap<>(); + this.flags = Collections.unmodifiableMap(getFlags()); + } + // Return a map of flag Strings to flag objects + // A Scribble extension should override getFlags + protected Map getFlags() + { + Map flags = new HashMap<>(); + // Unique; barrier irrelevant flags.put(IMPORT_PATH_FLAG, new CLAux(IMPORT_PATH_FLAG, 1, true, false, "Missing path argument: ")); @@ -114,7 +107,7 @@ public CLFlags() flags.put(SPIN_FLAG, new CLAux(SPIN_FLAG, 0, true, false, "Duplicate flag: ")); - // These two clash + // These two are mutually exclusive flags.put(DOT_FLAG, new CLAux(DOT_FLAG, 0, true, false, "Duplicate flag: ", CLFlags.AUT_FLAG)); @@ -173,88 +166,6 @@ public CLFlags() new CLAux(EVENTDRIVEN_API_GEN_FLAG, 2, false, true, "Missing protocol/role arguments: ")); - this.flags = Collections.unmodifiableMap(flags); - } - - /*this.info.put(CLFlags.JUNIT_FLAG, new CLAux(0, "Duplicate flag: ")); - this.info.put(CLFlags.VERBOSE_FLAG, new CLAux(0, "Duplicate flag: ")); - this.info.put(CLFlags.STATECHAN_SUBTYPES_FLAG, new CLAux(0, "Duplicate flag: ")); - this.info.put(CLFlags.OLD_WF_FLAG, new CLAux(0, "Duplicate flag: ")); - this.info.put(CLFlags.NO_LIVENESS_FLAG, new CLAux(0, "Duplicate flag: ")); - this.info.put(CLFlags.LTSCONVERT_MIN_FLAG, new CLAux(0, "Duplicate flag: ")); - this.info.put(CLFlags.FAIR_FLAG, new CLAux(0, "Duplicate flag: ")); - this.info.put(CLFlags.NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG, new CLAux(0, "Duplicate flag: ")); - this.info.put(CLFlags.NO_ACCEPT_CORRELATION_CHECK_FLAG, new CLAux(0, "Duplicate flag: ")); - this.info.put(CLFlags.NO_VALIDATION_FLAG, new CLAux(0, "Duplicate flag: ")); - this.info.put(CLFlags.SPIN_FLAG, new CLAux(0, "Duplicate flag: ")); - - this.info.put(CLFlags.DOT_FLAG, new CLAux(0, "Duplicate flag: ", CLFlags.AUT_FLAG)); - this.info.put(CLFlags.AUT_FLAG, new CLAux(0, "Duplicate flag: ", CLFlags.DOT_FLAG)); - - this.info.put(CLFlags.API_OUTPUT_DIR_FLAG, new CLAux(1, "Missing directory argument: ")); - this.info.put(CLFlags.IMPORT_PATH_FLAG, new CLAux(1, "Missing path argument: ")); - - this.info.put(CLFlags.PROJECT_FLAG, new CLAux(2, "Missing protocol/role arguments: ")); - this.info.put(CLFlags.EFSM_FLAG, new CLAux(2, "Missing protocol/role arguments: ")); - this.info.put(CLFlags.VALIDATION_EFSM_FLAG, new CLAux(2, "Missing protocol/role arguments: ")); - this.info.put(CLFlags.UNFAIR_EFSM_FLAG, new CLAux(2, "Missing protocol/role arguments: ")); - this.info.put(CLFlags.API_GEN_FLAG, new CLAux(2, "Missing protocol/role arguments: ")); - this.info.put(CLFlags.STATECHAN_API_GEN_FLAG, new CLAux(2, "Missing protocol/role arguments: ")); - this.info.put(CLFlags.EVENTDRIVEN_API_GEN_FLAG, new CLAux(2, "Missing protocol/role arguments: ")); - - this.info.put(CLFlags.EFSM_PNG_FLAG, new CLAux(3, "Missing protocol/role/file arguments: ")); - this.info.put(CLFlags.VALIDATION_EFSM_PNG_FLAG, new CLAux(3, "Missing protocol/role/file arguments: ")); - this.info.put(CLFlags.UNFAIR_EFSM_PNG_FLAG, new CLAux(3, "Missing protocol/role/file arguments: ")); - - this.info.put(CLFlags.SGRAPH_FLAG, new CLAux(1, "Missing protocol argument: ")); - this.info.put(CLFlags.UNFAIR_SGRAPH_FLAG, new CLAux(1, "Missing protocol argument: ")); - this.info.put(CLFlags.SESSION_API_GEN_FLAG, new CLAux(1, "Missing protocol argument: ")); - - this.info.put(CLFlags.SGRAPH_PNG_FLAG, new CLAux(2, "Missing protocol/file arguments: ")); - this.info.put(CLFlags.UNFAIR_SGRAPH_PNG_FLAG, new CLAux(2, "Missing protocol/file arguments: "));*/ - - /* - public Map getUniqueFlags() - { - Map utmp = new HashMap<>(); - utmp.put(JUNIT, "-junit"); - utmp.put(IMPORT_PATH, IMPORT_PATH_FLAG); - utmp.put(API_OUTPUT, API_OUTPUT_DIR_FLAG); - utmp.put(VERBOSE, VERBOSE_FLAG); - utmp.put(SCHAN_API_SUBTYPES, STATECHAN_SUBTYPES_FLAG); - utmp.put(OLD_WF, OLD_WF_FLAG); - utmp.put(NO_PROGRESS, NO_LIVENESS_FLAG); - utmp.put(LTSCONVERT_MIN, LTSCONVERT_MIN_FLAG); - utmp.put(FAIR, FAIR_FLAG); - utmp.put(NO_LOCAL_CHOICE_SUBJECT_CHECK, NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG); - utmp.put(NO_ACCEPT_CORRELATION_CHECK, NO_ACCEPT_CORRELATION_CHECK_FLAG); - utmp.put(DOT, DOT_FLAG); - utmp.put(AUT, AUT_FLAG); - utmp.put(NO_VALIDATION, NO_VALIDATION_FLAG); - utmp.put(INLINE_MAIN_MOD, INLINE_MAIN_MOD_FLAG); - utmp.put(SPIN, SPIN_FLAG); - return Collections.unmodifiableMap(utmp); - } - - public Map getNonUniqueFlags() - { - Map ntmp = new HashMap<>(); - ntmp.put(PROJECT, PROJECT_FLAG); - ntmp.put(EFSM, EFSM_FLAG); - ntmp.put(VALIDATION_EFSM, VALIDATION_EFSM_FLAG); - ntmp.put(UNFAIR_EFSM, UNFAIR_EFSM_FLAG); - ntmp.put(UNFAIR_EFSM_PNG, UNFAIR_EFSM_PNG_FLAG); - ntmp.put(EFSM_PNG, EFSM_PNG_FLAG); - ntmp.put(VALIDATION_EFSM_PNG, VALIDATION_EFSM_PNG_FLAG); - ntmp.put(SGRAPH, SGRAPH_FLAG); - ntmp.put(UNFAIR_SGRAPH, UNFAIR_SGRAPH_FLAG); - ntmp.put(SGRAPH_PNG, SGRAPH_PNG_FLAG); - ntmp.put(UNFAIR_SGRAPH_PNG, UNFAIR_SGRAPH_PNG_FLAG); - ntmp.put(API_GEN, API_GEN_FLAG); - ntmp.put(SESS_API_GEN, SESSION_API_GEN_FLAG); - ntmp.put(SCHAN_API_GEN, STATECHAN_API_GEN_FLAG); - ntmp.put(ED_API_GEN, EVENTDRIVEN_API_GEN_FLAG); - return Collections.unmodifiableMap(ntmp); + return Collections.unmodifiableMap(flags); } - //*/ } diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 448c85d05..36813895e 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -49,25 +49,20 @@ import org.scribble.util.ScribParserException; import org.scribble.util.ScribUtil; +// A Scribble extension should override newCLArgParser public class CommandLine { - //public final Map args; // Maps each flag to list of associated argument values - public final Map args; // Maps each flag to list of associated argument values + protected final Map args; // Maps each flag to list of associated argument values - protected CommandLine(CLArgParser2 p) throws CommandLineException + public CommandLine(String... args) throws CommandLineException { - this.args = p.getParsed(); + this.args = newCLArgParser(args).getParsed(); } - - public CommandLine(String... args) throws CommandLineException + + // A Scribble extension should override newCLArgParser + protected CLArgParser2 newCLArgParser(String[] args) { - //this.args = new CLArgParser(args).getArgs(); - this(new CLArgParser2(args)); - if (!(this.args.containsKey(CLFlags.MAIN_MOD_FLAG) - || this.args.containsKey(CLFlags.INLINE_MAIN_MOD_FLAG))) - { - throw new CommandLineException("No main module has been specified\r\n"); - } + return new CLArgParser2(args); } public static void main(String[] args) @@ -80,7 +75,6 @@ public static void main(String[] args) protected Main newMainContext() throws ScribParserException, ScribException { - // FIXME: refactor into arg parsing boolean debug = this.args.containsKey(CLFlags.VERBOSE_FLAG); // TODO: factor out (cf. MainContext fields) boolean useOldWf = this.args.containsKey(CLFlags.OLD_WF_FLAG); boolean noProgress = this.args.containsKey(CLFlags.NO_LIVENESS_FLAG); @@ -106,9 +100,6 @@ protected Main newMainContext() args.put(JobArgs.SPIN, spin); args = Collections.unmodifiableMap(args); - List impaths = this.args.containsKey(CLFlags.IMPORT_PATH_FLAG) - ? CommandLine.parseImportPaths(this.args.get(CLFlags.IMPORT_PATH_FLAG)[0]) - : Collections.emptyList(); if (this.args.containsKey(CLFlags.INLINE_MAIN_MOD_FLAG)) { String inline = this.args.get(CLFlags.INLINE_MAIN_MOD_FLAG)[0]; @@ -116,6 +107,9 @@ protected Main newMainContext() } else { + List impaths = this.args.containsKey(CLFlags.IMPORT_PATH_FLAG) + ? CommandLine.parseImportPaths(this.args.get(CLFlags.IMPORT_PATH_FLAG)[0]) + : Collections.emptyList(); ResourceLocator locator = new DirectoryResourceLocator(impaths); Path mainpath = CommandLine.parseMainPath(this.args.get(CLFlags.MAIN_MOD_FLAG)[0]); return new Main(locator, mainpath, args); From 440361c1211ffa72c4dcf412a3e83e85f4d9dcea Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 11:36:23 +0100 Subject: [PATCH 191/539] Continued: refactoring cli. --- .../src/main/java/org/scribble/lang/Lang.java | 2 +- .../main/java/org/scribble/cli/CLArgFlag.java | 55 --- .../java/org/scribble/cli/CLArgParser.java | 448 ++++-------------- .../java/org/scribble/cli/CLArgParser2.java | 181 ------- .../scribble/cli/{CLAux.java => CLFlag.java} | 11 +- .../main/java/org/scribble/cli/CLFlags.java | 72 +-- .../java/org/scribble/cli/CommandLine.java | 83 ++-- .../main/java/org/scribble/core/job/Job.java | 26 +- .../java/org/scribble/core/job/JobArgs.java | 2 +- .../scribble/core/lang/global/GProtocol.java | 4 +- .../core/model/global/SGraphBuilderUtil.java | 6 +- .../scribble/core/model/global/SModel.java | 8 +- .../java/org/scribble/test/ScribTestBase.java | 4 +- 13 files changed, 213 insertions(+), 689 deletions(-) delete mode 100644 scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java delete mode 100644 scribble-cli/src/main/java/org/scribble/cli/CLArgParser2.java rename scribble-cli/src/main/java/org/scribble/cli/{CLAux.java => CLFlag.java} (70%) diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index c89c092c8..497bcae4c 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -168,7 +168,7 @@ public void warningPrintln(String s) public void debugPrintln(String s) { - if (this.config.args.get(JobArgs.DEBUG)) + if (this.config.args.get(JobArgs.VERBOSE)) { System.out.println(s); } diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java deleted file mode 100644 index 7cd3b836b..000000000 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgFlag.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.cli; - -public enum CLArgFlag -{ - // Implicit (and unique) - MAIN_MOD, - - // Unique flags - JUNIT, // For internal use (JUnit test harness) - IMPORT_PATH, - API_OUTPUT, - VERBOSE, - SCHAN_API_SUBTYPES, - OLD_WF, - NO_PROGRESS, - LTSCONVERT_MIN, // Currently only affects EFSM output (i.e. -fsm..) and API gen -- doesn't affect validation - FAIR, - NO_LOCAL_CHOICE_SUBJECT_CHECK, - NO_ACCEPT_CORRELATION_CHECK, - DOT, - AUT, - NO_VALIDATION, - INLINE_MAIN_MOD, - SPIN, - - // Non-unique flags - PROJECT, - EFSM, - VALIDATION_EFSM, - UNFAIR_EFSM, - UNFAIR_EFSM_PNG, - EFSM_PNG, - VALIDATION_EFSM_PNG, - SGRAPH, - UNFAIR_SGRAPH, - SGRAPH_PNG, - UNFAIR_SGRAPH_PNG, - API_GEN, - SESS_API_GEN, - SCHAN_API_GEN, - ED_API_GEN -} diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java index a1128a232..ffd3113bc 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java @@ -1,4 +1,4 @@ -/** +/**f * Copyright 2008 The Scribble Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except @@ -14,126 +14,65 @@ package org.scribble.cli; import java.io.File; -import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +// A Scribble extension should call the super constructor, then add any additional flags to this.info -- FIXME: do in CLFlags, not here // String[] -> Map -- Map array values are the arguments associated to each CommandLine.Arg public class CLArgParser { - // Unique flags - public static final String JUNIT_FLAG = "-junit"; // For internal use (JUnit test harness) - public static final String VERBOSE_FLAG = "-V"; - public static final String IMPORT_PATH_FLAG = "-ip"; - public static final String API_OUTPUT_DIR_FLAG = "-d"; - public static final String STATECHAN_SUBTYPES_FLAG = "-subtypes"; - public static final String OLD_WF_FLAG = "-oldwf"; - public static final String NO_LIVENESS_FLAG = "-nolive"; - public static final String LTSCONVERT_MIN_FLAG = "-minlts"; - public static final String FAIR_FLAG = "-fair"; - public static final String NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG = "-nolocalchoicecheck"; - public static final String NO_ACCEPT_CORRELATION_CHECK_FLAG = "-nocorrelation"; - public static final String DOT_FLAG = "-dot"; - public static final String AUT_FLAG = "-aut"; - public static final String NO_VALIDATION_FLAG = "-novalid"; - public static final String INLINE_MAIN_MOD_FLAG = "-inline"; - public static final String SPIN_FLAG = "-spin"; - - // Non-unique flags - public static final String PROJECT_FLAG = "-project"; - public static final String EFSM_FLAG = "-fsm"; - public static final String VALIDATION_EFSM_FLAG = "-vfsm"; - public static final String UNFAIR_EFSM_FLAG = "-ufsm"; - public static final String EFSM_PNG_FLAG = "-fsmpng"; - public static final String VALIDATION_EFSM_PNG_FLAG = "-vfsmpng"; - public static final String UNFAIR_EFSM_PNG_FLAG = "-ufsmpng"; - public static final String SGRAPH_FLAG = "-model"; - public static final String UNFAIR_SGRAPH_FLAG = "-umodel"; - public static final String SGRAPH_PNG_FLAG = "-modelpng"; - public static final String UNFAIR_SGRAPH_PNG_FLAG = "-umodelpng"; - public static final String API_GEN_FLAG = "-api"; - public static final String SESSION_API_GEN_FLAG = "-sessapi"; - public static final String STATECHAN_API_GEN_FLAG = "-chanapi"; - public static final String EVENTDRIVEN_API_GEN_FLAG = "-cbapi"; - - private static final Map UNIQUE_FLAGS = new HashMap<>(); - { - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.JUNIT_FLAG, CLArgFlag.JUNIT); - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.VERBOSE_FLAG, CLArgFlag.VERBOSE); - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.IMPORT_PATH_FLAG, CLArgFlag.IMPORT_PATH); - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.API_OUTPUT_DIR_FLAG, CLArgFlag.API_OUTPUT); - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.STATECHAN_SUBTYPES_FLAG, CLArgFlag.SCHAN_API_SUBTYPES); - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.OLD_WF_FLAG, CLArgFlag.OLD_WF); - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.LTSCONVERT_MIN_FLAG, CLArgFlag.LTSCONVERT_MIN); - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.FAIR_FLAG, CLArgFlag.FAIR); - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG, CLArgFlag.NO_LOCAL_CHOICE_SUBJECT_CHECK); - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.NO_ACCEPT_CORRELATION_CHECK_FLAG, CLArgFlag.NO_ACCEPT_CORRELATION_CHECK); - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.DOT_FLAG, CLArgFlag.DOT); - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.AUT_FLAG, CLArgFlag.AUT); - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.NO_VALIDATION_FLAG, CLArgFlag.NO_VALIDATION); - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.INLINE_MAIN_MOD_FLAG, CLArgFlag.INLINE_MAIN_MOD); - CLArgParser.UNIQUE_FLAGS.put(CLArgParser.SPIN_FLAG, CLArgFlag.SPIN); - } - - private static final Map NON_UNIQUE_FLAGS = new HashMap<>(); - { - CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.PROJECT_FLAG, CLArgFlag.PROJECT); - CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.EFSM_FLAG, CLArgFlag.EFSM); - CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.VALIDATION_EFSM_FLAG, CLArgFlag.VALIDATION_EFSM); - CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.UNFAIR_EFSM_FLAG, CLArgFlag.UNFAIR_EFSM); - CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.EFSM_PNG_FLAG, CLArgFlag.EFSM_PNG); - CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.VALIDATION_EFSM_PNG_FLAG, CLArgFlag.VALIDATION_EFSM_PNG); - CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.UNFAIR_EFSM_PNG_FLAG, CLArgFlag.UNFAIR_EFSM_PNG); - CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.SGRAPH_FLAG, CLArgFlag.SGRAPH); - CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.UNFAIR_SGRAPH_FLAG, CLArgFlag.UNFAIR_SGRAPH); - CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.SGRAPH_PNG_FLAG, CLArgFlag.SGRAPH_PNG); - CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.UNFAIR_SGRAPH_PNG_FLAG, CLArgFlag.UNFAIR_SGRAPH_PNG); - CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.API_GEN_FLAG, CLArgFlag.API_GEN); - CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.SESSION_API_GEN_FLAG, CLArgFlag.SESS_API_GEN); - CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.STATECHAN_API_GEN_FLAG, CLArgFlag.SCHAN_API_GEN); - CLArgParser.NON_UNIQUE_FLAGS.put(CLArgParser.EVENTDRIVEN_API_GEN_FLAG, CLArgFlag.ED_API_GEN); - } - - private static final Map FLAGS = new HashMap<>(); - { - CLArgParser.FLAGS.putAll(CLArgParser.UNIQUE_FLAGS); - CLArgParser.FLAGS.putAll(CLArgParser.NON_UNIQUE_FLAGS); - } + private final Map flags; + private final String[] raw; // Raw args from main method - protected final String[] args; - - private final Map parsed = new HashMap<>(); + // Flag String constants from CLFlags -> flag arguments (possibly none) + private final Map parsed = new HashMap<>(); - public CLArgParser(String[] args) + public CLArgParser(CLFlags _flags, String[] raw) { - this.args = args; - //parseArgs(); // No: constructors should not invoke overridable methods (subclass constructor not yet called) + this.flags = _flags.flags; + this.raw = raw; } - // For overriding pattern -- should be used explicitly on subclasses (cannot call overridden from constructor) - public final void parse() throws CommandLineException + public Map getParsed() throws CommandLineException { parseArgs(); - } - - public final Map getArgs() throws CommandLineException - { - return this.parsed; - } - - protected boolean isFlag(String arg) - { - return CLArgParser.FLAGS.containsKey(arg); + if (!(this.parsed.containsKey(CLFlags.MAIN_MOD_FLAG) + ^ this.parsed.containsKey(CLFlags.INLINE_MAIN_MOD_FLAG))) + { + throw new CommandLineException("No/multiple main module specified\n"); + } + if (this.parsed.containsKey(CLFlags.MAIN_MOD_FLAG)) + { + String main = this.parsed.get(CLFlags.MAIN_MOD_FLAG)[0]; + if (!validateModuleArg(main)) + { + throw new CommandLineException("Bad module arg: " + main); + } + } + if (this.parsed.containsKey(CLFlags.IMPORT_PATH_FLAG)) + { + validatePaths(this.parsed.get(CLFlags.IMPORT_PATH_FLAG)[0]); + } + return Collections.unmodifiableMap(this.parsed); } private void parseArgs() throws CommandLineException { - for (int i = 0; i < this.args.length; i++) + for (int i = 0; i < this.raw.length; ) { - String arg = this.args[i]; - if (isFlag(arg)) + String arg = this.raw[i]; + if (this.flags.containsKey(arg)) { - i = this.parseFlag(i); + List clashes = this.flags.get(arg).clashes.stream() + .filter(x -> this.parsed.containsKey(x)).collect(Collectors.toList()); + if (!clashes.isEmpty()) + { + throw new CommandLineException("Flag clash for " + arg + ": "+ clashes); + } + i = this.parseFlag(i); // Returns index of next arg to parse } else { @@ -141,291 +80,110 @@ private void parseArgs() throws CommandLineException { if (arg.startsWith("-")) { - throw new CommandLineException("Unknown flag or bad main module arg: " + arg); + throw new CommandLineException( + "Unknown flag or bad main module arg: " + arg); } - // May actually be the second bad argument -- we didn't validate the value of the main arg + // Could actually be the second "bad argument" -- we didn't validate the value of the (supposed) "main arg" throw new CommandLineException("Bad/multiple main module arg: " + arg); } - parseMain(i); + i = parseMain(i); } } } - private boolean isMainModuleParsed() - { - return this.parsed.containsKey(CLArgFlag.MAIN_MOD) || this.parsed.containsKey(CLArgFlag.INLINE_MAIN_MOD); - } - - // Pre: i is the index of the current flag to parse - // Post: i is the index of the last argument parsed -- parseArgs does the index increment to the next current flag - // Currently allows repeat flag decls: next overrides previous + // Pre: i = (the index of the current flag to parse) + // Post: i = 1 + (the index of the last argument parsed) + // N.B. currently allows repeat flag decls: last overwrites previous protected int parseFlag(int i) throws CommandLineException { - String flag = this.args[i]; - switch (flag) + String flag = this.raw[i]; + if (this.flags.get(flag).unique) { - // Unique flags - - // "Special" args -- not handled via this.parsed - case CLArgParser.IMPORT_PATH_FLAG: - { - return parseImportPath(i); - } - case CLArgParser.INLINE_MAIN_MOD_FLAG: - { - if (isMainModuleParsed()) - { - throw new CommandLineException("Multiple main modules given."); - } - return parseInlineMainModule(i); - } - // No-value args -- just boolean flags - case CLArgParser.JUNIT_FLAG: - case CLArgParser.VERBOSE_FLAG: - case CLArgParser.STATECHAN_SUBTYPES_FLAG: - case CLArgParser.OLD_WF_FLAG: - case CLArgParser.NO_LIVENESS_FLAG: - case CLArgParser.LTSCONVERT_MIN_FLAG: - case CLArgParser.FAIR_FLAG: - case CLArgParser.NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG: - case CLArgParser.NO_ACCEPT_CORRELATION_CHECK_FLAG: - case CLArgParser.NO_VALIDATION_FLAG: - case CLArgParser.SPIN_FLAG: - { - checkAndAddNoArgUniqueFlag(flag); - return i; - } - // Args with one or more values to go in this.parsed - case CLArgParser.API_OUTPUT_DIR_FLAG: - { - return parseOutput(i); - } - case CLArgParser.DOT_FLAG: - { - if (this.parsed.containsKey(CLArgParser.UNIQUE_FLAGS.get(AUT_FLAG))) - { - throw new CommandLineException("Incompatible flags: " + DOT_FLAG + " and " + AUT_FLAG); - } - checkAndAddNoArgUniqueFlag(flag); - return i; - } - case CLArgParser.AUT_FLAG: - { - if (this.parsed.containsKey(CLArgParser.UNIQUE_FLAGS.get(DOT_FLAG))) - { - throw new CommandLineException("Incompatible flags: " + DOT_FLAG + " and " + AUT_FLAG); - } - checkAndAddNoArgUniqueFlag(flag); - return i; - } - - - // Non-unique flags - - case CLArgParser.PROJECT_FLAG: - { - return parseProject(i); - } - case CLArgParser.EFSM_FLAG: - case CLArgParser.VALIDATION_EFSM_FLAG: - case CLArgParser.UNFAIR_EFSM_FLAG: - case CLArgParser.API_GEN_FLAG: - case CLArgParser.STATECHAN_API_GEN_FLAG: - case CLArgParser.EVENTDRIVEN_API_GEN_FLAG: - { - return parseProtoAndRoleArgs(flag, i); - } - case CLArgParser.EFSM_PNG_FLAG: - case CLArgParser.VALIDATION_EFSM_PNG_FLAG: - case CLArgParser.UNFAIR_EFSM_PNG_FLAG: - { - return parseProtoRoleAndFileArgs(flag, i); - } - case CLArgParser.SGRAPH_FLAG: - case CLArgParser.UNFAIR_SGRAPH_FLAG: - case CLArgParser.SESSION_API_GEN_FLAG: - { - return parseProtoArg(flag, i); - } - case CLArgParser.SGRAPH_PNG_FLAG: - case CLArgParser.UNFAIR_SGRAPH_PNG_FLAG: + if (this.parsed.containsKey(flag)) { - return parseProtoAndFileArgs(flag, i); - } - - - default: - { - throw new RuntimeException("[TODO] Unknown flag: " + flag); + throw new CommandLineException("duplicate: " + flag); } } - } - - private void checkAndAddNoArgUniqueFlag(String flag) throws CommandLineException - { - checkAndAddUniqueFlag(flag, new String[0]); - } - - private void checkAndAddUniqueFlag(String flag, String[] args) throws CommandLineException - { - CLArgFlag argFlag = CLArgParser.UNIQUE_FLAGS.get(flag); - if (this.parsed.containsKey(argFlag)) + int num = this.flags.get(flag).numArgs; + if ((i + num) >= this.raw.length) { - throw new CommandLineException("Duplicate flag: " + flag); + throw new CommandLineException(this.flags.get(flag).err); } - this.parsed.put(argFlag, args); - } - - private int parseOutput(int i) throws CommandLineException - { - if ((i + 1) >= this.args.length) + String[] flagArgs = new String[num]; + if (num > 0) { - throw new CommandLineException("Missing directory argument"); + System.arraycopy(this.raw, i+1, flagArgs, 0, num); } - String dir = this.args[++i]; - this.parsed.put(CLArgParser.UNIQUE_FLAGS.get(CLArgParser.API_OUTPUT_DIR_FLAG), new String[] { dir } ); - return i; + this.parsed.put(flag, flagArgs); + return i+1 + num; } - private void parseMain(int i) throws CommandLineException + protected int parseMain(int i) throws CommandLineException { - String main = args[i]; - if (!CLArgParser.validateModuleArg(main)) - { - throw new CommandLineException("Bad module arg: " + main); - } - this.parsed.put(CLArgFlag.MAIN_MOD, new String[] { main } ); + String main = this.raw[i]; + this.parsed.put(CLFlags.MAIN_MOD_FLAG, new String[]{main}); + return i+1; } - - private int parseImportPath(int i) throws CommandLineException - { - if ((i + 1) >= this.args.length) - { - throw new CommandLineException("Missing path argument"); - } - String path = this.args[++i]; - if (!validatePaths(path)) - { - throw new CommandLineException("Scribble module import path '"+ path +"' is not valid\r\n"); - } - //this.parsed.put(CommandLineArgParser.FLAGS.get(CommandLineArgParser.PATH_FLAG), new String[] { path }); - checkAndAddUniqueFlag(CLArgParser.IMPORT_PATH_FLAG, new String[] { path }); - return i; - } - - private int parseInlineMainModule(int i) throws CommandLineException + + private boolean isMainModuleParsed() { - if ((i + 1) >= this.args.length) - { - throw new CommandLineException("Missing module definition"); - } - String inline = this.args[++i]; - checkAndAddUniqueFlag(CLArgParser.INLINE_MAIN_MOD_FLAG, new String[] { inline }); - return i; + return this.parsed.containsKey(CLFlags.MAIN_MOD_FLAG) + || this.parsed.containsKey(CLFlags.INLINE_MAIN_MOD_FLAG); } - private int parseProject(int i) throws CommandLineException // Similar to parseProtoAndRoleArgs + // This check guards the subsequent file open attempt? + private boolean validateModuleArg(String arg) { - if ((i + 2) >= this.args.length) - { - throw new CommandLineException("Missing protocol/role arguments"); - } - String proto = this.args[++i]; - String role = this.args[++i]; - /*if (!validateProtocolName(proto)) // TODO - { - throw new RuntimeException("Protocol name '"+ proto +"' is not valid\r\n"); - }*/ - concatArgs(CLArgParser.NON_UNIQUE_FLAGS.get(CLArgParser.PROJECT_FLAG), proto, role); - return i; + return arg.chars() + .noneMatch(i -> !Character.isLetterOrDigit(i) && i != '.' + && i != File.separatorChar && i != ':' && i != '-' && i != '_' + && i != '/'); // Hack? (cygwin) } - private int parseProtoAndRoleArgs(String f, int i) throws CommandLineException + private boolean validatePaths(String paths) { - CLArgFlag flag = CLArgParser.NON_UNIQUE_FLAGS.get(f); - if ((i + 2) >= this.args.length) + for (String path : paths.split(File.pathSeparator)) { - throw new CommandLineException("Missing protocol/role arguments"); + if (!new File(path).isDirectory()) + { + return false; + } } - String proto = this.args[++i]; - String role = this.args[++i]; - concatArgs(flag, proto, role); - return i; + return true; } + + + + + + + + + - protected int parseProtoRoleAndFileArgs(String f, int i) throws CommandLineException + /*private int parseImportPath(int i) throws CommandLineException { - CLArgFlag flag = CLArgParser.NON_UNIQUE_FLAGS.get(f); - if ((i + 3) >= this.args.length) + if ((i + 1) >= this.raw.length) { - throw new CommandLineException("Missing protocol/role/file arguments"); + throw new CommandLineException("Missing path argument"); } - String proto = this.args[++i]; - String role = this.args[++i]; - String png = this.args[++i]; - concatArgs(flag, proto, role, png); - return i; - } - - private int parseProtoArg(String f, int i) throws CommandLineException - { - CLArgFlag flag = CLArgParser.NON_UNIQUE_FLAGS.get(f); - if ((i + 1) >= this.args.length) + String path = this.raw[++i]; + if (!validatePaths(path)) { - throw new CommandLineException("Missing protocol argument"); + // FIXME: move validation to CL + throw new CommandLineException("Scribble module import path '"+ path +"' is not valid\r\n"); } - String proto = this.args[++i]; - concatArgs(flag, proto); + checkAndAddUniqueFlag(CLArgParser.IMPORT_PATH_FLAG, new String[] { path }); return i; } - private int parseProtoAndFileArgs(String f, int i) throws CommandLineException - { - CLArgFlag flag = CLArgParser.NON_UNIQUE_FLAGS.get(f); - if ((i + 2) >= this.args.length) - { - throw new CommandLineException("Missing protocol/file arguments"); - } - String proto = this.args[++i]; - String png = this.args[++i]; - concatArgs(flag, proto, png); - return i; - } - - private void concatArgs(CLArgFlag flag, String... toAdd) + private void checkAndAddUniqueFlag(String flag, String[] args) throws CommandLineException { - String[] args = this.parsed.get(flag); - if (args == null) + //CLArgFlag argFlag = CLArgParser.UNIQUE_FLAGS.get(flag); + if (this.parsed.containsKey(flag)) { - args = Arrays.copyOf(toAdd, toAdd.length); - } - else - { - String[] tmp = new String[args.length + toAdd.length]; - System.arraycopy(args, 0, tmp, 0, args.length); - System.arraycopy(toAdd, 0, tmp, args.length, toAdd.length); - args = tmp; + throw new CommandLineException("Duplicate flag: " + flag); } this.parsed.put(flag, args); - } - - // Used to guard subsequent file open attempt? - private static boolean validateModuleArg(String arg) - { - return arg.chars().noneMatch((i) -> - !Character.isLetterOrDigit(i) && i != '.' && i != File.separatorChar && i != ':' && i != '-' && i != '_' - && i != '/'); // Hack? (cygwin) - } - - private static boolean validatePaths(String paths) - { - for (String path : paths.split(File.pathSeparator)) - { - if (!new File(path).isDirectory()) - { - return false; - } - } - return true; - } + }*/ } diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser2.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser2.java deleted file mode 100644 index 71d8ff88e..000000000 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser2.java +++ /dev/null @@ -1,181 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.cli; - -import java.io.File; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -// A Scribble extension should call the super constructor, then add any additional flags to this.info -- FIXME: do in CLFlags, not here -// String[] -> Map -- Map array values are the arguments associated to each CommandLine.Arg -public class CLArgParser2 -{ - public final CLFlags flags = new CLFlags(); - - private final String[] raw; // Raw args from main method - - // Flag String constants from CLFlags -> flag arguments (possibly none) - private final Map parsed = new HashMap<>(); - - public CLArgParser2(String[] raw) - { - this.raw = raw; - } - - public Map getParsed() throws CommandLineException - { - parseArgs(); - if (!(this.parsed.containsKey(CLFlags.MAIN_MOD_FLAG) - ^ this.parsed.containsKey(CLFlags.INLINE_MAIN_MOD_FLAG))) - { - throw new CommandLineException("No/multiple main module specified\n"); - } - if (this.parsed.containsKey(CLFlags.MAIN_MOD_FLAG)) - { - String main = this.parsed.get(CLFlags.MAIN_MOD_FLAG)[0]; - if (!validateModuleArg(main)) - { - throw new CommandLineException("Bad module arg: " + main); - } - } - if (this.parsed.containsKey(CLFlags.IMPORT_PATH_FLAG)) - { - validatePaths(this.parsed.get(CLFlags.IMPORT_PATH_FLAG)[0]); - } - return Collections.unmodifiableMap(this.parsed); - } - - private void parseArgs() throws CommandLineException - { - for (int i = 0; i < this.raw.length; ) - { - String a = this.raw[i]; - if (this.flags.flags.containsKey(a)) - { - i = this.parseFlag(i); // Returns index of next arg to parse - } - else - { - if (isMainModuleParsed()) - { - if (a.startsWith("-")) - { - throw new CommandLineException( - "Unknown flag or bad main module arg: " + a); - } - // Could actually be the second "bad argument" -- we didn't validate the value of the (supposed) "main arg" - throw new CommandLineException("Bad/multiple main module arg: " + a); - } - i = parseMain(i); - } - } - } - - // Pre: i = (the index of the current flag to parse) - // Post: i = 1 + (the index of the last argument parsed) - // N.B. currently allows repeat flag decls: last overwrites previous - protected int parseFlag(int i) throws CommandLineException - { - String flag = this.raw[i]; - if (this.flags.flags.get(flag).unique) - { - if (this.parsed.containsKey(flag)) - { - throw new CommandLineException("duplicate: " + flag); - } - } - int num = this.flags.flags.get(flag).numArgs; - if ((i + num) >= this.raw.length) - { - throw new CommandLineException(this.flags.flags.get(flag).err); - } - String[] flagArgs = new String[num]; - if (num > 0) - { - System.arraycopy(this.raw, i+1, flagArgs, 0, num); - } - this.parsed.put(flag, flagArgs); - return i+1 + num; - } - - protected int parseMain(int i) throws CommandLineException - { - String main = this.raw[i]; - this.parsed.put(CLFlags.MAIN_MOD_FLAG, new String[]{main}); - return i+1; - } - - private boolean isMainModuleParsed() - { - return this.parsed.containsKey(CLFlags.MAIN_MOD_FLAG) - || this.parsed.containsKey(CLFlags.INLINE_MAIN_MOD_FLAG); - } - - // This check guards the subsequent file open attempt? - private boolean validateModuleArg(String arg) - { - return arg.chars() - .noneMatch(i -> !Character.isLetterOrDigit(i) && i != '.' - && i != File.separatorChar && i != ':' && i != '-' && i != '_' - && i != '/'); // Hack? (cygwin) - } - - private boolean validatePaths(String paths) - { - for (String path : paths.split(File.pathSeparator)) - { - if (!new File(path).isDirectory()) - { - return false; - } - } - return true; - } - - - - - - - - - - - /*private int parseImportPath(int i) throws CommandLineException - { - if ((i + 1) >= this.raw.length) - { - throw new CommandLineException("Missing path argument"); - } - String path = this.raw[++i]; - if (!validatePaths(path)) - { - // FIXME: move validation to CL - throw new CommandLineException("Scribble module import path '"+ path +"' is not valid\r\n"); - } - checkAndAddUniqueFlag(CLArgParser.IMPORT_PATH_FLAG, new String[] { path }); - return i; - } - - private void checkAndAddUniqueFlag(String flag, String[] args) throws CommandLineException - { - //CLArgFlag argFlag = CLArgParser.UNIQUE_FLAGS.get(flag); - if (this.parsed.containsKey(flag)) - { - throw new CommandLineException("Duplicate flag: " + flag); - } - this.parsed.put(flag, args); - }*/ -} diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLAux.java b/scribble-cli/src/main/java/org/scribble/cli/CLFlag.java similarity index 70% rename from scribble-cli/src/main/java/org/scribble/cli/CLAux.java rename to scribble-cli/src/main/java/org/scribble/cli/CLFlag.java index 7a18584b5..d0fee1a2f 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLAux.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLFlag.java @@ -3,9 +3,8 @@ import java.util.Arrays; import java.util.List; -//... FIXME: integrate CLAux with CLFlags, and refactor unique as a boolean field -//..also refactor non/attemptable as a boolean field -public class CLAux + +public class CLFlag { final String flag; // ID field final int numArgs; @@ -14,7 +13,7 @@ public class CLAux final String err; final List clashes; - public CLAux(String flag, int numArgs, boolean unique, boolean barrier, + public CLFlag(String flag, int numArgs, boolean unique, boolean barrier, String err, String... clashes) { this.flag = flag; @@ -32,11 +31,11 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof CLAux)) + if (!(o instanceof CLFlag)) { return false; } - CLAux them = (CLAux) o; + CLFlag them = (CLFlag) o; return this.flag.equals(them.flag); } diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java b/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java index 4e1bdaddf..5268932eb 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java @@ -22,7 +22,7 @@ // A Scribble extension should override getFlags public class CLFlags { - public final Map flags; + public final Map flags; // Implicit (and unique) public static final String MAIN_MOD_FLAG = "__main"; @@ -34,7 +34,7 @@ public class CLFlags public static final String VERBOSE_FLAG = "-V"; public static final String STATECHAN_SUBTYPES_FLAG = "-subtypes"; public static final String OLD_WF_FLAG = "-oldwf"; - public static final String NO_LIVENESS_FLAG = "-nolive"; + public static final String NO_PROGRESS_FLAG = "-nolive"; public static final String LTSCONVERT_MIN_FLAG = "-minlts"; // Currently only affects EFSM output (i.e. -fsm..) and API gen -- doesn't affect validation public static final String FAIR_FLAG = "-fair"; public static final String NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG = "-nolocalchoicecheck"; @@ -69,101 +69,101 @@ public CLFlags() // Return a map of flag Strings to flag objects // A Scribble extension should override getFlags - protected Map getFlags() + protected Map getFlags() { - Map flags = new HashMap<>(); + Map flags = new HashMap<>(); // Unique; barrier irrelevant flags.put(IMPORT_PATH_FLAG, - new CLAux(IMPORT_PATH_FLAG, 1, true, false, "Missing path argument: ")); + new CLFlag(IMPORT_PATH_FLAG, 1, true, false, "Missing path argument: ")); flags.put(API_OUTPUT_DIR_FLAG, - new CLAux(API_OUTPUT_DIR_FLAG, 1, true, false, + new CLFlag(API_OUTPUT_DIR_FLAG, 1, true, false, "Missing directory argument: ")); flags.put(INLINE_MAIN_MOD_FLAG, - new CLAux(INLINE_MAIN_MOD_FLAG, 1, true, false, "Missing inline module: ")); + new CLFlag(INLINE_MAIN_MOD_FLAG, 1, true, false, "Missing inline module: ")); flags.put(JUNIT_FLAG, - new CLAux(JUNIT_FLAG, 0, true, false, "Duplicate flag: ")); + new CLFlag(JUNIT_FLAG, 0, true, false, "Duplicate flag: ")); flags.put(VERBOSE_FLAG, - new CLAux(VERBOSE_FLAG, 0, true, false, "Duplicate flag: ")); + new CLFlag(VERBOSE_FLAG, 0, true, false, "Duplicate flag: ")); flags.put(STATECHAN_SUBTYPES_FLAG, - new CLAux(STATECHAN_SUBTYPES_FLAG, 0, true, false, "Duplicate flag: ")); + new CLFlag(STATECHAN_SUBTYPES_FLAG, 0, true, false, "Duplicate flag: ")); flags.put(OLD_WF_FLAG, - new CLAux(OLD_WF_FLAG, 0, true, false, "Duplicate flag: ")); - flags.put(NO_LIVENESS_FLAG, - new CLAux(NO_LIVENESS_FLAG, 0, true, false, "Duplicate flag: ")); + new CLFlag(OLD_WF_FLAG, 0, true, false, "Duplicate flag: ")); + flags.put(NO_PROGRESS_FLAG, + new CLFlag(NO_PROGRESS_FLAG, 0, true, false, "Duplicate flag: ")); flags.put(LTSCONVERT_MIN_FLAG, - new CLAux(LTSCONVERT_MIN_FLAG, 0, true, false, "Duplicate flag: ")); + new CLFlag(LTSCONVERT_MIN_FLAG, 0, true, false, "Duplicate flag: ")); flags.put(FAIR_FLAG, - new CLAux(FAIR_FLAG, 0, true, false, "Duplicate flag: ")); + new CLFlag(FAIR_FLAG, 0, true, false, "Duplicate flag: ")); flags.put(NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG, - new CLAux(NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG, 0, true, false, + new CLFlag(NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG, 0, true, false, "Duplicate flag: ")); flags.put(NO_ACCEPT_CORRELATION_CHECK_FLAG, - new CLAux(NO_ACCEPT_CORRELATION_CHECK_FLAG, 0, true, false, + new CLFlag(NO_ACCEPT_CORRELATION_CHECK_FLAG, 0, true, false, "Duplicate flag: ")); flags.put(NO_VALIDATION_FLAG, - new CLAux(NO_VALIDATION_FLAG, 0, true, false, "Duplicate flag: ")); + new CLFlag(NO_VALIDATION_FLAG, 0, true, false, "Duplicate flag: ")); flags.put(SPIN_FLAG, - new CLAux(SPIN_FLAG, 0, true, false, "Duplicate flag: ")); + new CLFlag(SPIN_FLAG, 0, true, false, "Duplicate flag: ")); // These two are mutually exclusive flags.put(DOT_FLAG, - new CLAux(DOT_FLAG, 0, true, false, "Duplicate flag: ", + new CLFlag(DOT_FLAG, 0, true, false, "Duplicate flag: ", CLFlags.AUT_FLAG)); flags.put(AUT_FLAG, - new CLAux(AUT_FLAG, 0, true, false, "Duplicate flag: ", + new CLFlag(AUT_FLAG, 0, true, false, "Duplicate flag: ", CLFlags.DOT_FLAG)); // Non-unique, no barrier flags.put(PROJECT_FLAG, - new CLAux(PROJECT_FLAG, 2, false, false, + new CLFlag(PROJECT_FLAG, 2, false, false, "Missing protocol/role arguments: ")); flags.put(EFSM_FLAG, - new CLAux(EFSM_FLAG, 2, false, false, + new CLFlag(EFSM_FLAG, 2, false, false, "Missing protocol/role arguments: ")); flags.put(VALIDATION_EFSM_FLAG, - new CLAux(VALIDATION_EFSM_FLAG, 2, false, false, + new CLFlag(VALIDATION_EFSM_FLAG, 2, false, false, "Missing protocol/role arguments: ")); flags.put(UNFAIR_EFSM_FLAG, - new CLAux(UNFAIR_EFSM_FLAG, 2, false, false, + new CLFlag(UNFAIR_EFSM_FLAG, 2, false, false, "Missing protocol/role arguments: ")); flags.put(EFSM_PNG_FLAG, - new CLAux(EFSM_PNG_FLAG, 3, false, false, + new CLFlag(EFSM_PNG_FLAG, 3, false, false, "Missing protocol/role/file arguments: ")); flags.put(VALIDATION_EFSM_PNG_FLAG, - new CLAux(VALIDATION_EFSM_PNG_FLAG, 3, false, false, + new CLFlag(VALIDATION_EFSM_PNG_FLAG, 3, false, false, "Missing protocol/role/file arguments: ")); flags.put(UNFAIR_EFSM_PNG_FLAG, - new CLAux(UNFAIR_EFSM_PNG_FLAG, 3, false, false, + new CLFlag(UNFAIR_EFSM_PNG_FLAG, 3, false, false, "Missing protocol/role/file arguments: ")); flags.put(SGRAPH_FLAG, - new CLAux(SGRAPH_FLAG, 2, false, false, "Missing protocol argument: ")); + new CLFlag(SGRAPH_FLAG, 2, false, false, "Missing protocol argument: ")); flags.put(UNFAIR_SGRAPH_FLAG, - new CLAux(UNFAIR_SGRAPH_FLAG, 2, false, false, + new CLFlag(UNFAIR_SGRAPH_FLAG, 2, false, false, "Missing protocol argument: ")); flags.put(SGRAPH_PNG_FLAG, - new CLAux(SGRAPH_PNG_FLAG, 1, false, false, + new CLFlag(SGRAPH_PNG_FLAG, 1, false, false, "Missing protocol/file arguments: ")); flags.put(UNFAIR_SGRAPH_PNG_FLAG, - new CLAux(UNFAIR_SGRAPH_PNG_FLAG, 1, false, false, + new CLFlag(UNFAIR_SGRAPH_PNG_FLAG, 1, false, false, "Missing protocol/file arguments: ")); // // Non-unique, barrier flags.put(SESSION_API_GEN_FLAG, - new CLAux(SESSION_API_GEN_FLAG, 1, false, true, + new CLFlag(SESSION_API_GEN_FLAG, 1, false, true, "Missing protocol argument: ")); flags.put(API_GEN_FLAG, - new CLAux(API_GEN_FLAG, 2, false, true, + new CLFlag(API_GEN_FLAG, 2, false, true, "Missing protocol/role arguments: ")); flags.put(STATECHAN_API_GEN_FLAG, - new CLAux(STATECHAN_API_GEN_FLAG, 2, false, true, + new CLFlag(STATECHAN_API_GEN_FLAG, 2, false, true, "Missing protocol/role arguments: ")); flags.put(EVENTDRIVEN_API_GEN_FLAG, - new CLAux(EVENTDRIVEN_API_GEN_FLAG, 2, false, true, + new CLFlag(EVENTDRIVEN_API_GEN_FLAG, 2, false, true, "Missing protocol/role arguments: ")); return Collections.unmodifiableMap(flags); diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 36813895e..accdbaba1 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -49,57 +49,32 @@ import org.scribble.util.ScribParserException; import org.scribble.util.ScribUtil; -// A Scribble extension should override newCLArgParser +// A Scribble extension should override newCLFlags, newCLArgParser and newMain as appropriate public class CommandLine { protected final Map args; // Maps each flag to list of associated argument values public CommandLine(String... args) throws CommandLineException { - this.args = newCLArgParser(args).getParsed(); + this.args = newCLArgParser(newCLFlags(), args).getParsed(); } - // A Scribble extension should override newCLArgParser - protected CLArgParser2 newCLArgParser(String[] args) + // A Scribble extension should override newCLFlags, newCLArgParser and newMain as appropriate + protected CLFlags newCLFlags() { - return new CLArgParser2(args); + return new CLFlags(); } - public static void main(String[] args) - throws CommandLineException, AntlrSourceException + // A Scribble extension should override newCLFlags, newCLArgParser and newMain as appropriate + protected CLArgParser newCLArgParser(CLFlags flags, String[] args) { - new CommandLine(args).run(); + return new CLArgParser(flags, args); } - // A Scribble extension should override newMainContext as appropriate. - protected Main newMainContext() - throws ScribParserException, ScribException + // A Scribble extension should override newCLFlags, newCLArgParser and newMain as appropriate + protected Main newMain() throws ScribParserException, ScribException { - boolean debug = this.args.containsKey(CLFlags.VERBOSE_FLAG); // TODO: factor out (cf. MainContext fields) - boolean useOldWf = this.args.containsKey(CLFlags.OLD_WF_FLAG); - boolean noProgress = this.args.containsKey(CLFlags.NO_LIVENESS_FLAG); - boolean minEfsm = this.args.containsKey(CLFlags.LTSCONVERT_MIN_FLAG); - boolean fair = this.args.containsKey(CLFlags.FAIR_FLAG); - boolean noLocalChoiceSubjectCheck = - this.args.containsKey(CLFlags.NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG); - boolean noAcceptCorrelationCheck = - this.args.containsKey(CLFlags.NO_ACCEPT_CORRELATION_CHECK_FLAG); - boolean noValidation = this.args.containsKey(CLFlags.NO_VALIDATION_FLAG); - boolean spin = this.args.containsKey(CLFlags.SPIN_FLAG); - - // FIXME: refactor into arg parsing - Map args = new HashMap<>(); - args.put(JobArgs.DEBUG, debug); - args.put(JobArgs.OLD_WF, useOldWf); - args.put(JobArgs.NO_PROGRESS, noProgress); - args.put(JobArgs.MIN_EFSM, minEfsm); - args.put(JobArgs.FAIR, fair); - args.put(JobArgs.NO_LCHOICE_SUBJ_CHECK, noLocalChoiceSubjectCheck); - args.put(JobArgs.NO_ACC_CORRELATION_CHECK, noAcceptCorrelationCheck); - args.put(JobArgs.NO_VALIDATION, noValidation); - args.put(JobArgs.SPIN, spin); - args = Collections.unmodifiableMap(args); - + Map args = Collections.unmodifiableMap(parseJobArgs()); if (this.args.containsKey(CLFlags.INLINE_MAIN_MOD_FLAG)) { String inline = this.args.get(CLFlags.INLINE_MAIN_MOD_FLAG)[0]; @@ -108,13 +83,41 @@ protected Main newMainContext() else { List impaths = this.args.containsKey(CLFlags.IMPORT_PATH_FLAG) - ? CommandLine.parseImportPaths(this.args.get(CLFlags.IMPORT_PATH_FLAG)[0]) + ? CommandLine + .parseImportPaths(this.args.get(CLFlags.IMPORT_PATH_FLAG)[0]) : Collections.emptyList(); ResourceLocator locator = new DirectoryResourceLocator(impaths); - Path mainpath = CommandLine.parseMainPath(this.args.get(CLFlags.MAIN_MOD_FLAG)[0]); + Path mainpath = CommandLine + .parseMainPath(this.args.get(CLFlags.MAIN_MOD_FLAG)[0]); return new Main(locator, mainpath, args); } } + + protected Map parseJobArgs() + { + Map args = new HashMap<>(); + args.put(JobArgs.VERBOSE, this.args.containsKey(CLFlags.VERBOSE_FLAG)); + args.put(JobArgs.OLD_WF, this.args.containsKey(CLFlags.OLD_WF_FLAG)); + args.put(JobArgs.NO_PROGRESS, + this.args.containsKey(CLFlags.NO_PROGRESS_FLAG)); + args.put(JobArgs.MIN_EFSM, + this.args.containsKey(CLFlags.LTSCONVERT_MIN_FLAG)); + args.put(JobArgs.FAIR, this.args.containsKey(CLFlags.FAIR_FLAG)); + args.put(JobArgs.NO_LCHOICE_SUBJ_CHECK, + this.args.containsKey(CLFlags.NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG)); + args.put(JobArgs.NO_ACC_CORRELATION_CHECK, + this.args.containsKey(CLFlags.NO_ACCEPT_CORRELATION_CHECK_FLAG)); + args.put(JobArgs.NO_VALIDATION, + this.args.containsKey(CLFlags.NO_VALIDATION_FLAG)); + args.put(JobArgs.SPIN, this.args.containsKey(CLFlags.SPIN_FLAG)); + return args; + } + + public static void main(String[] args) + throws CommandLineException, AntlrSourceException + { + new CommandLine(args).run(); + } public void run() throws CommandLineException, AntlrSourceException // ScribbleException is for JUnit testing { @@ -156,7 +159,7 @@ public void run() throws CommandLineException, AntlrSourceException // Scribble protected void runBody() throws ScribException, ScribParserException, AntlrSourceException, CommandLineException { - Main mc = newMainContext(); // Represents current instance of tooling for given CL args + Main mc = newMain(); // Represents current instance of tooling for given CL args Lang lang = mc.newLang(); // A Job is some series of passes performed on each Module in the MainContext (e.g., cf. Job::runVisitorPass) ScribException fail = null; try @@ -252,7 +255,7 @@ protected void tryOutputTasks(Lang lang) { throw new CommandLineException( "Global model flag(s) incompatible with: " - + CLArgParser.OLD_WF_FLAG); + + CLFlags.OLD_WF_FLAG); } if (this.args.containsKey(CLFlags.SGRAPH_FLAG)) { diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index 348c45a5b..810b918a0 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -101,11 +101,11 @@ public EGraphBuilderUtil newEGraphBuilderUtil() public SGraph buildSGraph(GProtocolName fullname, Map egraphs, boolean explicit) throws ScribException { - debugPrintln("(" + fullname + ") Building global model using:"); + verbosePrintln("(" + fullname + ") Building global model using:"); for (Role r : egraphs.keySet()) { // FIXME: refactor - debugPrintln("-- EFSM for " + verbosePrintln("-- EFSM for " + r + ":\n" + egraphs.get(r).init.toDot()); } //return SGraph.buildSGraph(this, fullname, createInitialSConfig(this, egraphs, explicit)); @@ -159,7 +159,7 @@ else if (n instanceof MessageSigName) STypeInliner i = new STypeInliner(this); i.pushSig(sig); // TODO: factor into constructor GProtocol inlined = g.getInlined(i); // Protocol.getInlined does pruneRecs - debugPrintln("\nSubprotocols inlined:\n" + inlined); + verbosePrintln("\nSubprotocols inlined:\n" + inlined); this.context.addInlined(g.fullname, inlined); } @@ -169,7 +169,7 @@ else if (n instanceof MessageSigName) STypeUnfolder unf1 = new STypeUnfolder<>(); //GTypeUnfolder unf2 = new GTypeUnfolder(); GProtocol unf = (GProtocol) inlined.unfoldAllOnce(unf1);//.unfoldAllOnce(unf2); CHECKME: twice unfolding? instead of "unguarded"-unfolding? - debugPrintln("\nAll recursions unfolded once:\n" + unf); + verbosePrintln("\nAll recursions unfolded once:\n" + unf); } runProjectionPasses(); @@ -181,7 +181,7 @@ else if (n instanceof MessageSigName) LProtocol proj = e.getValue(); EGraph graph = proj.toEGraph(this); this.context.addEGraph(proj.fullname, graph); - debugPrintln("\nEFSM for " + proj.fullname + ":\n" + graph.toDot()); + verbosePrintln("\nEFSM for " + proj.fullname + ":\n" + graph.toDot()); } } @@ -245,7 +245,7 @@ public void runWellFormednessPasses() throws ScribException GProtocolName fullname = gpd.fullname;//.getFullMemberName(mod); - debugPrintln("\nValidating " + fullname + ":"); + verbosePrintln("\nValidating " + fullname + ":"); if (this.config.args.get(JobArgs.SPIN)) { @@ -261,7 +261,7 @@ public void runWellFormednessPasses() throws ScribException GProtocol.validateByScribble(this, fullname, true); if (!this.config.args.get(JobArgs.FAIR)) { - debugPrintln( + verbosePrintln( "(" + fullname + ") Validating with \"unfair\" output choices.. "); GProtocol.validateByScribble(this, fullname, false); // TODO: only need to check progress, not full validation } @@ -290,7 +290,7 @@ protected void runProjectionPasses() throws ScribException GProtocol inlined = this.context.getInlined(g.fullname); // pruneRecs already done for pruneRecs (cf. runContextBuildingPasses) LProtocol iproj = inlined.projectInlined(self); // CHECKME: projection and inling commutative? this.context.addInlinedProjection(iproj.fullname, iproj); - debugPrintln("\nProjected inlined onto " + self + ":\n" + iproj); + verbosePrintln("\nProjected inlined onto " + self + ":\n" + iproj); } } @@ -301,7 +301,7 @@ protected void runProjectionPasses() throws ScribException { LProtocol proj = g.project(new Projector2(this, self)); // Does pruneRecs this.context.addProjection(proj); - debugPrintln("\nProjected onto " + self + ":\n" + proj); + verbosePrintln("\nProjected onto " + self + ":\n" + proj); } } } @@ -378,9 +378,9 @@ public JobContext getContext() return this.context; } - public boolean isDebug() + public boolean isVerbose() { - return this.config.args.get(JobArgs.DEBUG); + return this.config.args.get(JobArgs.VERBOSE); } public void warningPrintln(String s) @@ -388,9 +388,9 @@ public void warningPrintln(String s) System.err.println("[Warning] " + s); } - public void debugPrintln(String s) + public void verbosePrintln(String s) { - if (this.config.args.get(JobArgs.DEBUG)) + if (this.config.args.get(JobArgs.VERBOSE)) { System.out.println(s); } diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobArgs.java b/scribble-core/src/main/java/org/scribble/core/job/JobArgs.java index f53d409dc..c0ba5e890 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobArgs.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobArgs.java @@ -15,7 +15,7 @@ public enum JobArgs { - DEBUG, + VERBOSE, FAIR, SPIN, NO_VALIDATION, diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 8b668a753..c0499648e 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -256,7 +256,7 @@ public static void validateBySpin(Job job2, GProtocolName fullname) { pml += "\n\n" + jobc2.getEGraph(fullname, r).toPml(r); } - if (job2.config.args.get(JobArgs.DEBUG)) + if (job2.config.args.get(JobArgs.VERBOSE)) { System.out.println("[-spin]: Promela processes\n" + pml + "\n"); } @@ -314,7 +314,7 @@ public static void validateBySpin(Job job2, GProtocolName fullname) int j = (i+batchSize < clauses.size()) ? i+batchSize : clauses.size(); String batch = clauses.subList(i, j).stream().collect(Collectors.joining(" && ")); String ltl = "ltl {\n" + batch + "\n" + "}"; - if (job2.config.args.get(JobArgs.DEBUG)) + if (job2.config.args.get(JobArgs.VERBOSE)) { System.out.println("[-spin] Batched ltl:\n" + ltl + "\n"); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index f90ebca24..0d82a1c99 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -91,12 +91,12 @@ public SGraph buildSGraph(Job job, GProtocolName fullname, Map egr i.remove(); seen.put(curr.id, curr); - if (job.config.args.get(JobArgs.DEBUG)) + if (job.config.args.get(JobArgs.VERBOSE)) { count++; if (count % 50 == 0) { - job.debugPrintln("(" + fullname + ") Building global states: " + count); + job.verbosePrintln("(" + fullname + ") Building global states: " + count); } } @@ -186,7 +186,7 @@ else if (a.isWrapClient() || a.isWrapServer()) SGraph graph = job.config.sf.newSGraph(fullname, seen, init); - job.debugPrintln( + job.verbosePrintln( "(" + fullname + ") Built global model..\n" + graph.init.toDot() + "\n(" + fullname + ") .." + graph.states.size() + " states"); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index a7bc126b5..89c3a2ff7 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -48,13 +48,13 @@ public void validate(Job job) throws ScribException int count = 0; for (SState s : states.values()) { - if (job.config.args.get(JobArgs.DEBUG)) + if (job.config.args.get(JobArgs.VERBOSE)) { count++; if (count % 50 == 0) { //job.debugPrintln("(" + this.graph.proto + ") Checking safety: " + count + " states"); - job.debugPrintln( + job.verbosePrintln( "(" + this.graph.proto + ") Checking states: " + count); } } @@ -69,7 +69,7 @@ public void validate(Job job) throws ScribException } errorMsg = appendSafetyErrorMessages(errorMsg, errors); } - job.debugPrintln("(" + this.graph.proto + ") Checked all states: " + count); // May include unsafe states + job.verbosePrintln("(" + this.graph.proto + ") Checked all states: " + count); // May include unsafe states //*/ if (!job.config.args.get(JobArgs.NO_PROGRESS)) @@ -142,7 +142,7 @@ protected String appendProgressErrorMessages(String errorMsg, protected String termSetToString(Job job, Set termset, Map all) { - return job.config.args.get(JobArgs.DEBUG) + return job.config.args.get(JobArgs.VERBOSE) ? termset.stream().map((i) -> all.get(i).toString()) .collect(Collectors.joining(",")) : termset.stream().map((i) -> new Integer(all.get(i).id).toString()) diff --git a/scribble-test/src/test/java/org/scribble/test/ScribTestBase.java b/scribble-test/src/test/java/org/scribble/test/ScribTestBase.java index a178504c5..2780a3fbf 100644 --- a/scribble-test/src/test/java/org/scribble/test/ScribTestBase.java +++ b/scribble-test/src/test/java/org/scribble/test/ScribTestBase.java @@ -19,7 +19,7 @@ import org.junit.Assert; import org.junit.Test; -import org.scribble.cli.CLArgParser; +import org.scribble.cli.CLFlags; import org.scribble.cli.CommandLine; import org.scribble.cli.CommandLineException; import org.scribble.util.AntlrSourceException; @@ -76,7 +76,7 @@ protected boolean checkSkip() protected void runTest(String dir) throws CommandLineException, AntlrSourceException { - new CommandLine(this.example, CLArgParser.JUNIT_FLAG, CLArgParser.IMPORT_PATH_FLAG, dir).run(); + new CommandLine(this.example, CLFlags.JUNIT_FLAG, CLFlags.IMPORT_PATH_FLAG, dir).run(); // Added JUNIT flag -- but for some reason only bad DoArgList01.scr was breaking without it... } From dc2f5fc710cb6c7c8b64cb6b24c80bc19fda6c2c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 13:22:55 +0100 Subject: [PATCH 192/539] Continued: refactoring cli. --- .../java/org/scribble/cli/CLArgParser.java | 13 ++--- .../main/java/org/scribble/cli/CLFlags.java | 2 +- .../java/org/scribble/cli/CommandLine.java | 48 ++++++++++++++++--- scribble-test/src/test/scrib/tmp/Test.scr | 6 ++- 4 files changed, 54 insertions(+), 15 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java index ffd3113bc..2fee7fd3d 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java @@ -14,8 +14,7 @@ package org.scribble.cli; import java.io.File; -import java.util.Collections; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -28,7 +27,7 @@ public class CLArgParser private final String[] raw; // Raw args from main method // Flag String constants from CLFlags -> flag arguments (possibly none) - private final Map parsed = new HashMap<>(); + private final LinkedHashMap parsed = new LinkedHashMap<>(); public CLArgParser(CLFlags _flags, String[] raw) { @@ -36,7 +35,7 @@ public CLArgParser(CLFlags _flags, String[] raw) this.raw = raw; } - public Map getParsed() throws CommandLineException + public LinkedHashMap getParsed() throws CommandLineException { parseArgs(); if (!(this.parsed.containsKey(CLFlags.MAIN_MOD_FLAG) @@ -56,12 +55,12 @@ public Map getParsed() throws CommandLineException { validatePaths(this.parsed.get(CLFlags.IMPORT_PATH_FLAG)[0]); } - return Collections.unmodifiableMap(this.parsed); + return this.parsed; } private void parseArgs() throws CommandLineException { - for (int i = 0; i < this.raw.length; ) + for (int i = 0; i < this.raw.length; ) // Parse args in order { String arg = this.raw[i]; if (this.flags.containsKey(arg)) @@ -92,6 +91,7 @@ private void parseArgs() throws CommandLineException } // Pre: i = (the index of the current flag to parse) + // Puts into this.parsed // Post: i = 1 + (the index of the last argument parsed) // N.B. currently allows repeat flag decls: last overwrites previous protected int parseFlag(int i) throws CommandLineException @@ -118,6 +118,7 @@ protected int parseFlag(int i) throws CommandLineException return i+1 + num; } + // Puts into this.parsed protected int parseMain(int i) throws CommandLineException { String main = this.raw[i]; diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java b/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java index 5268932eb..8e86c0ca6 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java @@ -34,7 +34,7 @@ public class CLFlags public static final String VERBOSE_FLAG = "-V"; public static final String STATECHAN_SUBTYPES_FLAG = "-subtypes"; public static final String OLD_WF_FLAG = "-oldwf"; - public static final String NO_PROGRESS_FLAG = "-nolive"; + public static final String NO_PROGRESS_FLAG = "-noprogress"; public static final String LTSCONVERT_MIN_FLAG = "-minlts"; // Currently only affects EFSM output (i.e. -fsm..) and API gen -- doesn't affect validation public static final String FAIR_FLAG = "-fair"; public static final String NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG = "-nolocalchoicecheck"; diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index accdbaba1..9a106a8e3 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -19,8 +19,10 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -30,8 +32,8 @@ import org.scribble.codegen.java.JEndpointApiGenerator; import org.scribble.codegen.java.callbackapi.CBEndpointApiGenerator3; import org.scribble.core.job.Job; -import org.scribble.core.job.JobContext; import org.scribble.core.job.JobArgs; +import org.scribble.core.job.JobContext; import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.global.SGraph; @@ -52,11 +54,15 @@ // A Scribble extension should override newCLFlags, newCLArgParser and newMain as appropriate public class CommandLine { - protected final Map args; // Maps each flag to list of associated argument values + protected final CLFlags _flags; + protected final Map flags; + protected final LinkedHashMap args; // Maps each flag to its arg values, ordered by parsing order public CommandLine(String... args) throws CommandLineException { - this.args = newCLArgParser(newCLFlags(), args).getParsed(); + this._flags = newCLFlags(); + this.flags = this._flags.flags; + this.args = newCLArgParser(this._flags, args).getParsed(); } // A Scribble extension should override newCLFlags, newCLArgParser and newMain as appropriate @@ -157,12 +163,40 @@ public void run() throws CommandLineException, AntlrSourceException // Scribble } protected void runBody() - throws ScribException, ScribParserException, AntlrSourceException, CommandLineException + throws AntlrSourceException, ScribParserException, CommandLineException { Main mc = newMain(); // Represents current instance of tooling for given CL args Lang lang = mc.newLang(); // A Job is some series of passes performed on each Module in the MainContext (e.g., cf. Job::runVisitorPass) - ScribException fail = null; - try + ScribException err = null; + try { doValidationTasks(lang); } catch (ScribException x) { err = x; } + for (Entry e : this.args.entrySet()) + { + String flag = e.getKey(); + if (flag.equals(CLFlags.MAIN_MOD_FLAG) + || flag.equals(CLFlags.INLINE_MAIN_MOD_FLAG)) + { + continue; + } + if (!this.flags.get(flag).barrier) + { + try { tryOutputTasks(lang); } + catch (ScribException x) { if (err == null) { err = x; } } + } + else + { + if (err == null) + { + try { doNonAttemptableOutputTasks(lang); } + catch (ScribException x) { err = x; } + } + } + } + if (err != null) + { + throw err; + } + + /*try { doValidationTasks(lang); // FIXME: refactor into job } @@ -190,7 +224,7 @@ protected void runBody() } // "Non-attemptable" output tasks: should not attempt these if any previous failure - doNonAttemptableOutputTasks(lang); + doNonAttemptableOutputTasks(lang);*/ } // AntlrSourceException super of ScribbleException -- needed for, e.g., AssrtCoreSyntaxException diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 5358b01b4..8b05f30f1 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -77,7 +77,11 @@ module tmp.Test; global protocol Proto1(role A, role B) { - 1() from A to B; + //1() from A to B; + choice at A + { + 1() from A to B; + } } From dbb14ce91d96e064c7d763f4bb0152e1b68acf86 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 13:29:10 +0100 Subject: [PATCH 193/539] Minor. --- .../java/org/scribble/cli/CommandLine.java | 55 ++++++------------- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 2 files changed, 17 insertions(+), 40 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 9a106a8e3..57e3312e2 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -58,11 +58,20 @@ public class CommandLine protected final Map flags; protected final LinkedHashMap args; // Maps each flag to its arg values, ordered by parsing order - public CommandLine(String... args) throws CommandLineException + public CommandLine(String... args) { this._flags = newCLFlags(); this.flags = this._flags.flags; - this.args = newCLArgParser(this._flags, args).getParsed(); + try + { + this.args = newCLArgParser(this._flags, args).getParsed(); + } + catch (CommandLineException e) + { + System.err.println(e.getMessage()); + System.exit(1); + throw new RuntimeException("Dummy"); // Already exited above + } } // A Scribble extension should override newCLFlags, newCLArgParser and newMain as appropriate @@ -125,7 +134,8 @@ public static void main(String[] args) new CommandLine(args).run(); } - public void run() throws CommandLineException, AntlrSourceException // ScribbleException is for JUnit testing + public void run() throws CommandLineException, + AntlrSourceException // AntlrSourceException (ScribbleException) is for JUnit harness { try { @@ -135,17 +145,14 @@ public void run() throws CommandLineException, AntlrSourceException // Scribble } catch (ScribException e) // Wouldn't need to do this if not Runnable (so maybe change) { - if (this.args.containsKey(CLFlags.JUNIT_FLAG) - || this.args.containsKey(CLFlags.VERBOSE_FLAG)) + if (this.args.containsKey(CLFlags.JUNIT_FLAG) // JUnit harness looks for an exception + || this.args.containsKey(CLFlags.VERBOSE_FLAG)) // Also print full trace for -V { - /*RuntimeScribbleException ee = new RuntimeScribbleException(e.getMessage()); - ee.setStackTrace(e.getStackTrace()); - throw ee;*/ throw e; } else { - System.err.println(e.getMessage()); // JUnit harness looks for an exception + System.err.println(e.getMessage()); System.exit(1); } } @@ -195,36 +202,6 @@ protected void runBody() { throw err; } - - /*try - { - doValidationTasks(lang); // FIXME: refactor into job - } - catch (ScribException x) - { - fail = x; - } - - // Attempt certain "output tasks" even if above failed, in case can still do some useful output (hacky) - try - { - tryOutputTasks(lang); // FIXME: refactor into job - } - catch (ScribException x) - { - if (fail == null) - { - fail = x; - } - } - - if (fail != null) // Well-formedness check and/or an "attemptable output task" failed - { - throw fail; - } - - // "Non-attemptable" output tasks: should not attempt these if any previous failure - doNonAttemptableOutputTasks(lang);*/ } // AntlrSourceException super of ScribbleException -- needed for, e.g., AssrtCoreSyntaxException diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 8b05f30f1..a10d68aad 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -78,7 +78,7 @@ module tmp.Test; global protocol Proto1(role A, role B) { //1() from A to B; - choice at A + choice at B { 1() from A to B; } From 3abe7a6c44e3df655e3057749e2ba21228ffc5ab Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 15:03:19 +0100 Subject: [PATCH 194/539] Continued: refactoring cli. --- .../java/org/scribble/cli/CLArgParser.java | 74 ++-- .../main/java/org/scribble/cli/CLFlag.java | 16 +- .../main/java/org/scribble/cli/CLFlags.java | 92 +++-- .../java/org/scribble/cli/CommandLine.java | 375 +++++++++--------- .../codegen/java/JEndpointApiGenerator.java | 18 +- .../callbackapi/CBEndpointApiGenerator3.java | 3 +- .../main/java/org/scribble/core/job/Job.java | 2 +- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 8 files changed, 307 insertions(+), 275 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java index 2fee7fd3d..bc8bd407b 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java @@ -14,46 +14,50 @@ package org.scribble.cli; import java.io.File; -import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; -import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; +import org.scribble.util.Pair; + // A Scribble extension should call the super constructor, then add any additional flags to this.info -- FIXME: do in CLFlags, not here // String[] -> Map -- Map array values are the arguments associated to each CommandLine.Arg public class CLArgParser { - private final Map flags; + private final CLFlags flags; private final String[] raw; // Raw args from main method // Flag String constants from CLFlags -> flag arguments (possibly none) - private final LinkedHashMap parsed = new LinkedHashMap<>(); + private final List> parsed = new LinkedList<>(); - public CLArgParser(CLFlags _flags, String[] raw) + public CLArgParser(CLFlags flags, String[] raw) { - this.flags = _flags.flags; + this.flags = flags; this.raw = raw; } - public LinkedHashMap getParsed() throws CommandLineException + // Return: left = CLFlags String constant, right = flag args (if any) + public List> getParsed() throws CommandLineException { parseArgs(); - if (!(this.parsed.containsKey(CLFlags.MAIN_MOD_FLAG) - ^ this.parsed.containsKey(CLFlags.INLINE_MAIN_MOD_FLAG))) + List labs = getParsedKeys(); + if (!(labs.contains(CLFlags.MAIN_MOD_FLAG) + ^ labs.contains(CLFlags.INLINE_MAIN_MOD_FLAG))) { throw new CommandLineException("No/multiple main module specified\n"); } - if (this.parsed.containsKey(CLFlags.MAIN_MOD_FLAG)) + if (labs.contains(CLFlags.MAIN_MOD_FLAG)) { - String main = this.parsed.get(CLFlags.MAIN_MOD_FLAG)[0]; + String main = getParsedUnique(CLFlags.MAIN_MOD_FLAG)[0]; if (!validateModuleArg(main)) { throw new CommandLineException("Bad module arg: " + main); } } - if (this.parsed.containsKey(CLFlags.IMPORT_PATH_FLAG)) + if (labs.contains(CLFlags.IMPORT_PATH_FLAG)) { - validatePaths(this.parsed.get(CLFlags.IMPORT_PATH_FLAG)[0]); + validatePaths(getParsedUnique(CLFlags.IMPORT_PATH_FLAG)[0]); } return this.parsed; } @@ -63,13 +67,15 @@ private void parseArgs() throws CommandLineException for (int i = 0; i < this.raw.length; ) // Parse args in order { String arg = this.raw[i]; - if (this.flags.containsKey(arg)) + if (this.flags.explicit.containsKey(arg)) { - List clashes = this.flags.get(arg).clashes.stream() - .filter(x -> this.parsed.containsKey(x)).collect(Collectors.toList()); + List labs = getParsedKeys(); + List clashes = this.flags.explicit.get(arg).clashes.stream() + .filter(x -> labs.contains(x)).collect(Collectors.toList()); if (!clashes.isEmpty()) { - throw new CommandLineException("Flag clash for " + arg + ": "+ clashes); + throw new CommandLineException( + "Flag clash for " + arg + ": " + clashes); } i = this.parseFlag(i); // Returns index of next arg to parse } @@ -96,25 +102,25 @@ private void parseArgs() throws CommandLineException // N.B. currently allows repeat flag decls: last overwrites previous protected int parseFlag(int i) throws CommandLineException { - String flag = this.raw[i]; - if (this.flags.get(flag).unique) + String lab = this.raw[i]; + if (this.flags.explicit.get(lab).unique) { - if (this.parsed.containsKey(flag)) + if (getParsedKeys().contains(lab)) { - throw new CommandLineException("duplicate: " + flag); + throw new CommandLineException("duplicate: " + lab); } } - int num = this.flags.get(flag).numArgs; + int num = this.flags.explicit.get(lab).numArgs; if ((i + num) >= this.raw.length) { - throw new CommandLineException(this.flags.get(flag).err); + throw new CommandLineException(this.flags.explicit.get(lab).err); } String[] flagArgs = new String[num]; if (num > 0) { System.arraycopy(this.raw, i+1, flagArgs, 0, num); } - this.parsed.put(flag, flagArgs); + this.parsed.add(new Pair<>(lab, flagArgs)); return i+1 + num; } @@ -122,14 +128,15 @@ protected int parseFlag(int i) throws CommandLineException protected int parseMain(int i) throws CommandLineException { String main = this.raw[i]; - this.parsed.put(CLFlags.MAIN_MOD_FLAG, new String[]{main}); + this.parsed.add(new Pair<>(CLFlags.MAIN_MOD_FLAG, new String[]{main})); return i+1; } private boolean isMainModuleParsed() { - return this.parsed.containsKey(CLFlags.MAIN_MOD_FLAG) - || this.parsed.containsKey(CLFlags.INLINE_MAIN_MOD_FLAG); + List labs = getParsedKeys(); + return labs.contains(CLFlags.MAIN_MOD_FLAG) + || labs.contains(CLFlags.INLINE_MAIN_MOD_FLAG); } // This check guards the subsequent file open attempt? @@ -152,6 +159,19 @@ private boolean validatePaths(String paths) } return true; } + + private List getParsedKeys() + { + return this.parsed.stream().map(x -> x.left).collect(Collectors.toList()); + } + + // Hardcoded to find any one, so applies to uniques only + private String[] getParsedUnique(String flag) + { + Optional> res = this.parsed.stream() + .filter(x -> x.left.equals(flag)).findAny(); + return res.isPresent() ? res.get().right : null; + } diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLFlag.java b/scribble-cli/src/main/java/org/scribble/cli/CLFlag.java index d0fee1a2f..fcc47e368 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLFlag.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLFlag.java @@ -6,19 +6,21 @@ public class CLFlag { - final String flag; // ID field + final String lab; // ID field: CLFlags String constant -- N.B. includes "-" prefix final int numArgs; final boolean unique; - final boolean barrier; + final boolean enact; + final boolean barrier; // TODO: rename, barrier misleading (sounds like a sync) final String err; final List clashes; - public CLFlag(String flag, int numArgs, boolean unique, boolean barrier, - String err, String... clashes) + public CLFlag(String lab, int numArgs, boolean unique, boolean enact, + boolean barrier, String err, String... clashes) { - this.flag = flag; + this.lab = lab; this.numArgs = numArgs; this.unique = unique; + this.enact = enact; this.barrier = barrier; this.err = err; this.clashes = Arrays.asList(clashes); @@ -36,14 +38,14 @@ public boolean equals(Object o) return false; } CLFlag them = (CLFlag) o; - return this.flag.equals(them.flag); + return this.lab.equals(them.lab); } @Override public int hashCode() { int hash = 14411; - hash = 31 * this.flag.hashCode(); + hash = 31 * this.lab.hashCode(); return hash; } } \ No newline at end of file diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java b/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java index 8e86c0ca6..80dd35eba 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java @@ -22,10 +22,9 @@ // A Scribble extension should override getFlags public class CLFlags { - public final Map flags; - - // Implicit (and unique) - public static final String MAIN_MOD_FLAG = "__main"; + // Maps flag String constant to CLFlag object + // N.B. does not include MAIN_MOD_FLAG + public final Map explicit; // Unique flags public static final String JUNIT_FLAG = "-junit"; // For internal use (JUnit test harness) @@ -61,111 +60,122 @@ public class CLFlags public static final String SESSION_API_GEN_FLAG = "-sessapi"; public static final String STATECHAN_API_GEN_FLAG = "-chanapi"; public static final String EVENTDRIVEN_API_GEN_FLAG = "-cbapi"; + + // Implicit (and unique) -- N.B. not added to this.flags, because implicit + public static final String MAIN_MOD_FLAG = "__main"; public CLFlags() { - this.flags = Collections.unmodifiableMap(getFlags()); + this.explicit = Collections.unmodifiableMap(getFlags()); } // Return a map of flag Strings to flag objects - // A Scribble extension should override getFlags + // A Scribble extension should override getFlags -- e.g., call super, then put any additional protected Map getFlags() { Map flags = new HashMap<>(); // Unique; barrier irrelevant flags.put(IMPORT_PATH_FLAG, - new CLFlag(IMPORT_PATH_FLAG, 1, true, false, "Missing path argument: ")); + new CLFlag(IMPORT_PATH_FLAG, 1, true, false, false, + "Missing path argument: ")); flags.put(API_OUTPUT_DIR_FLAG, - new CLFlag(API_OUTPUT_DIR_FLAG, 1, true, false, + new CLFlag(API_OUTPUT_DIR_FLAG, 1, true, false, false, "Missing directory argument: ")); flags.put(INLINE_MAIN_MOD_FLAG, - new CLFlag(INLINE_MAIN_MOD_FLAG, 1, true, false, "Missing inline module: ")); + new CLFlag(INLINE_MAIN_MOD_FLAG, 1, true, false, false, + "Missing inline module: ")); flags.put(JUNIT_FLAG, - new CLFlag(JUNIT_FLAG, 0, true, false, "Duplicate flag: ")); + new CLFlag(JUNIT_FLAG, 0, true, false, false, "Duplicate flag: ")); flags.put(VERBOSE_FLAG, - new CLFlag(VERBOSE_FLAG, 0, true, false, "Duplicate flag: ")); + new CLFlag(VERBOSE_FLAG, 0, true, false, false, "Duplicate flag: ")); flags.put(STATECHAN_SUBTYPES_FLAG, - new CLFlag(STATECHAN_SUBTYPES_FLAG, 0, true, false, "Duplicate flag: ")); + new CLFlag(STATECHAN_SUBTYPES_FLAG, 0, true, false, false, + "Duplicate flag: ")); flags.put(OLD_WF_FLAG, - new CLFlag(OLD_WF_FLAG, 0, true, false, "Duplicate flag: ")); + new CLFlag(OLD_WF_FLAG, 0, true, false, false, "Duplicate flag: ", + SGRAPH_FLAG, UNFAIR_SGRAPH_FLAG, SGRAPH_PNG_FLAG, + UNFAIR_SGRAPH_PNG_FLAG)); flags.put(NO_PROGRESS_FLAG, - new CLFlag(NO_PROGRESS_FLAG, 0, true, false, "Duplicate flag: ")); + new CLFlag(NO_PROGRESS_FLAG, 0, true, false, false, "Duplicate flag: ")); flags.put(LTSCONVERT_MIN_FLAG, - new CLFlag(LTSCONVERT_MIN_FLAG, 0, true, false, "Duplicate flag: ")); + new CLFlag(LTSCONVERT_MIN_FLAG, 0, true, false, false, + "Duplicate flag: ")); flags.put(FAIR_FLAG, - new CLFlag(FAIR_FLAG, 0, true, false, "Duplicate flag: ")); + new CLFlag(FAIR_FLAG, 0, true, false, false, "Duplicate flag: ")); flags.put(NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG, - new CLFlag(NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG, 0, true, false, + new CLFlag(NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG, 0, true, false, false, "Duplicate flag: ")); flags.put(NO_ACCEPT_CORRELATION_CHECK_FLAG, - new CLFlag(NO_ACCEPT_CORRELATION_CHECK_FLAG, 0, true, false, + new CLFlag(NO_ACCEPT_CORRELATION_CHECK_FLAG, 0, true, false, false, "Duplicate flag: ")); flags.put(NO_VALIDATION_FLAG, - new CLFlag(NO_VALIDATION_FLAG, 0, true, false, "Duplicate flag: ")); + new CLFlag(NO_VALIDATION_FLAG, 0, true, false, false, + "Duplicate flag: ")); flags.put(SPIN_FLAG, - new CLFlag(SPIN_FLAG, 0, true, false, "Duplicate flag: ")); + new CLFlag(SPIN_FLAG, 0, true, false, false, "Duplicate flag: ")); // These two are mutually exclusive flags.put(DOT_FLAG, - new CLFlag(DOT_FLAG, 0, true, false, "Duplicate flag: ", + new CLFlag(DOT_FLAG, 0, true, false, false, "Duplicate flag: ", CLFlags.AUT_FLAG)); flags.put(AUT_FLAG, - new CLFlag(AUT_FLAG, 0, true, false, "Duplicate flag: ", + new CLFlag(AUT_FLAG, 0, true, false, false, "Duplicate flag: ", CLFlags.DOT_FLAG)); // Non-unique, no barrier flags.put(PROJECT_FLAG, - new CLFlag(PROJECT_FLAG, 2, false, false, + new CLFlag(PROJECT_FLAG, 2, false, true, false, "Missing protocol/role arguments: ")); flags.put(EFSM_FLAG, - new CLFlag(EFSM_FLAG, 2, false, false, + new CLFlag(EFSM_FLAG, 2, false, true, false, "Missing protocol/role arguments: ")); flags.put(VALIDATION_EFSM_FLAG, - new CLFlag(VALIDATION_EFSM_FLAG, 2, false, false, + new CLFlag(VALIDATION_EFSM_FLAG, 2, false, true, false, "Missing protocol/role arguments: ")); flags.put(UNFAIR_EFSM_FLAG, - new CLFlag(UNFAIR_EFSM_FLAG, 2, false, false, + new CLFlag(UNFAIR_EFSM_FLAG, 2, false, true, false, "Missing protocol/role arguments: ")); flags.put(EFSM_PNG_FLAG, - new CLFlag(EFSM_PNG_FLAG, 3, false, false, + new CLFlag(EFSM_PNG_FLAG, 3, false, true, false, "Missing protocol/role/file arguments: ")); flags.put(VALIDATION_EFSM_PNG_FLAG, - new CLFlag(VALIDATION_EFSM_PNG_FLAG, 3, false, false, + new CLFlag(VALIDATION_EFSM_PNG_FLAG, 3, false, true, false, "Missing protocol/role/file arguments: ")); flags.put(UNFAIR_EFSM_PNG_FLAG, - new CLFlag(UNFAIR_EFSM_PNG_FLAG, 3, false, false, + new CLFlag(UNFAIR_EFSM_PNG_FLAG, 3, false, true, false, "Missing protocol/role/file arguments: ")); flags.put(SGRAPH_FLAG, - new CLFlag(SGRAPH_FLAG, 2, false, false, "Missing protocol argument: ")); + new CLFlag(SGRAPH_FLAG, 2, false, true, false, + "Missing protocol argument: ", OLD_WF_FLAG)); flags.put(UNFAIR_SGRAPH_FLAG, - new CLFlag(UNFAIR_SGRAPH_FLAG, 2, false, false, - "Missing protocol argument: ")); + new CLFlag(UNFAIR_SGRAPH_FLAG, 2, false, true, false, + "Missing protocol argument: ", OLD_WF_FLAG)); flags.put(SGRAPH_PNG_FLAG, - new CLFlag(SGRAPH_PNG_FLAG, 1, false, false, - "Missing protocol/file arguments: ")); + new CLFlag(SGRAPH_PNG_FLAG, 1, false, true, false, + "Missing protocol/file arguments: ", OLD_WF_FLAG)); flags.put(UNFAIR_SGRAPH_PNG_FLAG, - new CLFlag(UNFAIR_SGRAPH_PNG_FLAG, 1, false, false, - "Missing protocol/file arguments: ")); + new CLFlag(UNFAIR_SGRAPH_PNG_FLAG, 1, false, true, false, + "Missing protocol/file arguments: ", OLD_WF_FLAG)); // // Non-unique, barrier flags.put(SESSION_API_GEN_FLAG, - new CLFlag(SESSION_API_GEN_FLAG, 1, false, true, + new CLFlag(SESSION_API_GEN_FLAG, 1, false, true, true, "Missing protocol argument: ")); flags.put(API_GEN_FLAG, - new CLFlag(API_GEN_FLAG, 2, false, true, + new CLFlag(API_GEN_FLAG, 2, false, true, true, "Missing protocol/role arguments: ")); flags.put(STATECHAN_API_GEN_FLAG, - new CLFlag(STATECHAN_API_GEN_FLAG, 2, false, true, + new CLFlag(STATECHAN_API_GEN_FLAG, 2, false, true, true, "Missing protocol/role arguments: ")); flags.put(EVENTDRIVEN_API_GEN_FLAG, - new CLFlag(EVENTDRIVEN_API_GEN_FLAG, 2, false, true, + new CLFlag(EVENTDRIVEN_API_GEN_FLAG, 2, false, true, true, "Missing protocol/role arguments: ")); - return Collections.unmodifiableMap(flags); + return flags; } } diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 57e3312e2..8096bab55 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -19,10 +19,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -46,6 +44,7 @@ import org.scribble.main.resource.locator.DirectoryResourceLocator; import org.scribble.main.resource.locator.ResourceLocator; import org.scribble.util.AntlrSourceException; +import org.scribble.util.Pair; import org.scribble.util.RuntimeScribException; import org.scribble.util.ScribException; import org.scribble.util.ScribParserException; @@ -55,13 +54,14 @@ public class CommandLine { protected final CLFlags _flags; - protected final Map flags; - protected final LinkedHashMap args; // Maps each flag to its arg values, ordered by parsing order + protected final Map flags; // this._flags.flags -- directly cache this Map for convenience + protected final List> args; + // left = CLFlags String constant, right = flag args (if any) -- ordered by parsing order public CommandLine(String... args) { this._flags = newCLFlags(); - this.flags = this._flags.flags; + this.flags = this._flags.explicit; try { this.args = newCLArgParser(this._flags, args).getParsed(); @@ -74,6 +74,17 @@ public CommandLine(String... args) } } + private boolean hasFlag(String flag) + { + return this.args.stream().anyMatch(x -> x.left.equals(flag)); + } + + private String[] getUniqueFlagArgs(String flag) + { + return this.args.stream().filter(x -> x.left.equals(flag)).findAny() + .get().right; + } + // A Scribble extension should override newCLFlags, newCLArgParser and newMain as appropriate protected CLFlags newCLFlags() { @@ -90,20 +101,20 @@ protected CLArgParser newCLArgParser(CLFlags flags, String[] args) protected Main newMain() throws ScribParserException, ScribException { Map args = Collections.unmodifiableMap(parseJobArgs()); - if (this.args.containsKey(CLFlags.INLINE_MAIN_MOD_FLAG)) + if (hasFlag(CLFlags.INLINE_MAIN_MOD_FLAG)) { - String inline = this.args.get(CLFlags.INLINE_MAIN_MOD_FLAG)[0]; + String inline = getUniqueFlagArgs(CLFlags.INLINE_MAIN_MOD_FLAG)[0]; return new Main(inline, args); } else { - List impaths = this.args.containsKey(CLFlags.IMPORT_PATH_FLAG) + List impaths = hasFlag(CLFlags.IMPORT_PATH_FLAG) ? CommandLine - .parseImportPaths(this.args.get(CLFlags.IMPORT_PATH_FLAG)[0]) + .parseImportPaths(getUniqueFlagArgs(CLFlags.IMPORT_PATH_FLAG)[0]) : Collections.emptyList(); ResourceLocator locator = new DirectoryResourceLocator(impaths); Path mainpath = CommandLine - .parseMainPath(this.args.get(CLFlags.MAIN_MOD_FLAG)[0]); + .parseMainPath(getUniqueFlagArgs(CLFlags.MAIN_MOD_FLAG)[0]); return new Main(locator, mainpath, args); } } @@ -111,23 +122,110 @@ protected Main newMain() throws ScribParserException, ScribException protected Map parseJobArgs() { Map args = new HashMap<>(); - args.put(JobArgs.VERBOSE, this.args.containsKey(CLFlags.VERBOSE_FLAG)); - args.put(JobArgs.OLD_WF, this.args.containsKey(CLFlags.OLD_WF_FLAG)); - args.put(JobArgs.NO_PROGRESS, - this.args.containsKey(CLFlags.NO_PROGRESS_FLAG)); - args.put(JobArgs.MIN_EFSM, - this.args.containsKey(CLFlags.LTSCONVERT_MIN_FLAG)); - args.put(JobArgs.FAIR, this.args.containsKey(CLFlags.FAIR_FLAG)); + args.put(JobArgs.VERBOSE, hasFlag(CLFlags.VERBOSE_FLAG)); + args.put(JobArgs.OLD_WF, hasFlag(CLFlags.OLD_WF_FLAG)); + args.put(JobArgs.NO_PROGRESS, hasFlag(CLFlags.NO_PROGRESS_FLAG)); + args.put(JobArgs.MIN_EFSM, hasFlag(CLFlags.LTSCONVERT_MIN_FLAG)); + args.put(JobArgs.FAIR, hasFlag(CLFlags.FAIR_FLAG)); args.put(JobArgs.NO_LCHOICE_SUBJ_CHECK, - this.args.containsKey(CLFlags.NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG)); + hasFlag(CLFlags.NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG)); args.put(JobArgs.NO_ACC_CORRELATION_CHECK, - this.args.containsKey(CLFlags.NO_ACCEPT_CORRELATION_CHECK_FLAG)); - args.put(JobArgs.NO_VALIDATION, - this.args.containsKey(CLFlags.NO_VALIDATION_FLAG)); - args.put(JobArgs.SPIN, this.args.containsKey(CLFlags.SPIN_FLAG)); + hasFlag(CLFlags.NO_ACCEPT_CORRELATION_CHECK_FLAG)); + args.put(JobArgs.NO_VALIDATION, hasFlag(CLFlags.NO_VALIDATION_FLAG)); + args.put(JobArgs.SPIN, hasFlag(CLFlags.SPIN_FLAG)); return args; } + // AntlrSourceException super of ScribbleException -- needed for, e.g., AssrtCoreSyntaxException + protected void doValidationTasks(Lang lang) + throws AntlrSourceException, ScribParserException, // Latter in case needed by subclasses + CommandLineException + { + /*// Scribble extensions (custom Job passes) + if (this.args.containsKey(F17CLArgFlag.F17)) + { + GProtocolName simpname = new GProtocolName(this.args.get(ArgFlag.F17)[0]); + F17Main.parseAndCheckWF(lang, simpname); // Includes base passes + } + + // Base Scribble + else*/ + { + lang.runPasses(); // TODO: refactor, w.r.t. below + lang.toJob().checkWellFormedness(); + } + + } + + // TODO: rename, barrier misleading (sounds like a sync) + protected void tryNonBarrierTask(Lang lang, Pair task) + throws CommandLineException, ScribException + { + switch (task.left) // Flag lab (CLFlags String constants) + { + case CLFlags.PROJECT_FLAG: + printProjection(lang, task.right); + break; + case CLFlags.EFSM_FLAG: + printEGraph(lang, task.right, true, true); // TODO: factor print/draw + break; + case CLFlags.VALIDATION_EFSM_FLAG: + printEGraph(lang, task.right, false, true); + break; + case CLFlags.UNFAIR_EFSM_FLAG: + printEGraph(lang, task.right, false, false); + break; + case CLFlags.EFSM_PNG_FLAG: + drawEGraph(lang, task.right, true, true); + break; + case CLFlags.VALIDATION_EFSM_PNG_FLAG: + drawEGraph(lang, task.right, false, true); + break; + case CLFlags.UNFAIR_EFSM_PNG_FLAG: + drawEGraph(lang, task.right, false, false); + break; + case CLFlags.SGRAPH_FLAG: + printSGraph(lang, task.right, true); + break; + case CLFlags.UNFAIR_SGRAPH_FLAG: + printSGraph(lang, task.right, false); + break; + case CLFlags.SGRAPH_PNG_FLAG: + drawSGraph(lang, task.right, true); + break; + case CLFlags.UNFAIR_SGRAPH_PNG_FLAG: + drawSGraph(lang, task.right, false); + break; + default: + throw new RuntimeException("Shouldn't get here: " + task.left); + // Bad flag should be caught by CLArgParser + } + } + + // TODO: rename, barrier misleading (sounds like a sync) + protected void tryBarrierTask(Lang lang, + Pair task) throws ScribException, CommandLineException + { + switch (task.left) + { + case CLFlags.SESSION_API_GEN_FLAG: + outputSessionApi(lang, task.right); + break; + case CLFlags.STATECHAN_API_GEN_FLAG: + outputStateChannelApi(lang, task.right); + break; + case CLFlags.API_GEN_FLAG: + outputEndpointApi(lang, task.right); + break; + case CLFlags.EVENTDRIVEN_API_GEN_FLAG: + outputEventDrivenApi(lang, task.right); + break; + default: + throw new RuntimeException("Shouldn't get here: " + task.left); + // Bad flag should be caught by CLArgParser + } + } + public static void main(String[] args) throws CommandLineException, AntlrSourceException { @@ -135,18 +233,18 @@ public static void main(String[] args) } public void run() throws CommandLineException, - AntlrSourceException // AntlrSourceException (ScribbleException) is for JUnit harness + AntlrSourceException // For JUnit harness (ScribException) { try { try { - runBody(); + runTasks(); } catch (ScribException e) // Wouldn't need to do this if not Runnable (so maybe change) { - if (this.args.containsKey(CLFlags.JUNIT_FLAG) // JUnit harness looks for an exception - || this.args.containsKey(CLFlags.VERBOSE_FLAG)) // Also print full trace for -V + if (hasFlag(CLFlags.JUNIT_FLAG) // JUnit harness looks for an exception + || hasFlag(CLFlags.VERBOSE_FLAG)) // Also print full trace for -V { throw e; } @@ -169,31 +267,30 @@ public void run() throws CommandLineException, } } - protected void runBody() + protected void runTasks() throws AntlrSourceException, ScribParserException, CommandLineException { Main mc = newMain(); // Represents current instance of tooling for given CL args Lang lang = mc.newLang(); // A Job is some series of passes performed on each Module in the MainContext (e.g., cf. Job::runVisitorPass) ScribException err = null; try { doValidationTasks(lang); } catch (ScribException x) { err = x; } - for (Entry e : this.args.entrySet()) + for (Pair a : this.args) { - String flag = e.getKey(); - if (flag.equals(CLFlags.MAIN_MOD_FLAG) - || flag.equals(CLFlags.INLINE_MAIN_MOD_FLAG)) + CLFlag flag = this.flags.get(a.left); // null for CLFlags.MAIN_MOD_FLAG + if (a.left.equals(CLFlags.MAIN_MOD_FLAG) || !flag.enact) { continue; } - if (!this.flags.get(flag).barrier) + if (!flag.barrier) { - try { tryOutputTasks(lang); } + try { tryNonBarrierTask(lang, a); } catch (ScribException x) { if (err == null) { err = x; } } } else { if (err == null) { - try { doNonAttemptableOutputTasks(lang); } + try { tryBarrierTask(lang, a); } catch (ScribException x) { err = x; } } } @@ -204,124 +301,18 @@ protected void runBody() } } - // AntlrSourceException super of ScribbleException -- needed for, e.g., AssrtCoreSyntaxException - protected void doValidationTasks(Lang lang) - throws AntlrSourceException, ScribParserException, // Latter in case needed by subclasses - CommandLineException - { - /*// Scribble extensions (custom Job passes) - if (this.args.containsKey(F17CLArgFlag.F17)) - { - GProtocolName simpname = new GProtocolName(this.args.get(ArgFlag.F17)[0]); - F17Main.parseAndCheckWF(lang, simpname); // Includes base passes - } - - // Base Scribble - else*/ - { - lang.runPasses(); // TODO: refactor, w.r.t. below - lang.toJob().checkWellFormedness(); - } - - } - - protected void tryOutputTasks(Lang lang) - throws CommandLineException, ScribException - { - // Following must be ordered appropriately -- ? - if (this.args.containsKey(CLFlags.PROJECT_FLAG)) - { - printProjections(lang); - } - if (this.args.containsKey(CLFlags.EFSM_FLAG)) - { - printEGraph(lang, true, true); - } - if (this.args.containsKey(CLFlags.VALIDATION_EFSM_FLAG)) - { - printEGraph(lang, false, true); - } - if (this.args.containsKey(CLFlags.UNFAIR_EFSM_FLAG)) - { - printEGraph(lang, false, false); - } - if (this.args.containsKey(CLFlags.EFSM_PNG_FLAG)) - { - drawEGraph(lang, true, true); - } - if (this.args.containsKey(CLFlags.VALIDATION_EFSM_PNG_FLAG)) - { - drawEGraph(lang, false, true); - } - if (this.args.containsKey(CLFlags.UNFAIR_EFSM_PNG_FLAG)) - { - drawEGraph(lang, false, false); - } - if (this.args.containsKey(CLFlags.SGRAPH_FLAG) - || this.args.containsKey(CLFlags.SGRAPH_PNG_FLAG) - || this.args.containsKey(CLFlags.UNFAIR_SGRAPH_FLAG) - || this.args.containsKey(CLFlags.UNFAIR_SGRAPH_PNG_FLAG)) - { - if (lang.config.args.get(JobArgs.OLD_WF)) - { - throw new CommandLineException( - "Global model flag(s) incompatible with: " - + CLFlags.OLD_WF_FLAG); - } - if (this.args.containsKey(CLFlags.SGRAPH_FLAG)) - { - printSGraph(lang, true); - } - if (this.args.containsKey(CLFlags.UNFAIR_SGRAPH_FLAG)) - { - printSGraph(lang, false); - } - if (this.args.containsKey(CLFlags.SGRAPH_PNG_FLAG)) - { - drawSGraph(lang, true); - } - if (this.args.containsKey(CLFlags.UNFAIR_SGRAPH_PNG_FLAG)) - { - drawSGraph(lang, false); - } - } - } - - // TODO: rename - protected void doNonAttemptableOutputTasks(Lang lang) - throws ScribException, CommandLineException - { - if (this.args.containsKey(CLFlags.SESSION_API_GEN_FLAG)) - { - outputSessionApi(lang); - } - if (this.args.containsKey(CLFlags.STATECHAN_API_GEN_FLAG)) - { - outputStateChannelApi(lang); - } - if (this.args.containsKey(CLFlags.API_GEN_FLAG)) - { - outputEndpointApi(lang); - } - if (this.args.containsKey(CLFlags.EVENTDRIVEN_API_GEN_FLAG)) - { - outputEventDrivenApi(lang); - } - } - // TODO: option to write to file, like classes - private void printProjections(Lang lang) + private void printProjection(Lang lang, String[] args) throws CommandLineException, ScribException { - LangContext jobc = lang.getContext(); + LangContext langc = lang.getContext(); Job job = lang.toJob(); - String[] args = this.args.get(CLFlags.PROJECT_FLAG); for (int i = 0; i < args.length; i += 2) { - GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); - Role role = checkRoleArg(jobc, fullname, args[i+1]); + GProtocolName fullname = checkGlobalProtocolArg(langc, args[i]); + Role role = checkRoleArg(langc, fullname, args[i+1]); Map projections = job.getProjections(fullname, - role); // FIXME: output Module + role); // FIXME: generate and output Module container -- should be done via Lang? System.out.println("\n" + projections.values().stream() .map(p -> p.toString()).collect(Collectors.joining("\n\n"))); } @@ -330,49 +321,49 @@ private void printProjections(Lang lang) // dot/aut text output // forUser: true means for API gen and general user info (may be minimised), false means for validation (non-minimised, fair or unfair) // (forUser && !fair) should not hold, i.e. unfair doesn't make sense if forUser - private void printEGraph(Lang lang, boolean forUser, boolean fair) + private void printEGraph(Lang lang, String[] args, boolean forUser, boolean fair) throws ScribException, CommandLineException { - LangContext jobc = lang.getContext(); - String[] args = forUser + LangContext langc = lang.getContext(); + /*String[] args = forUser ? this.args.get(CLFlags.EFSM_FLAG) : (fair ? this.args.get(CLFlags.VALIDATION_EFSM_FLAG) - : this.args.get(CLFlags.UNFAIR_EFSM_FLAG)); + : this.args.get(CLFlags.UNFAIR_EFSM_FLAG));*/ for (int i = 0; i < args.length; i += 2) { - GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); - Role role = checkRoleArg(jobc, fullname, args[i+1]); - EGraph fsm = getEGraph(lang, fullname, role, forUser, fair); - String out = this.args.containsKey(CLFlags.AUT_FLAG) + GProtocolName fullname = checkGlobalProtocolArg(langc, args[i]); + Role role = checkRoleArg(langc, fullname, args[i+1]); + EGraph fsm = getEGraph(lang, fullname, role, forUser, fair, args); + String out = hasFlag(CLFlags.AUT_FLAG) ? fsm.toAut() : fsm.toDot(); System.out.println("\n" + out); // Endpoint graphs are "inlined" (a single graph is built) } } - private void drawEGraph(Lang lang, boolean forUser, boolean fair) + private void drawEGraph(Lang lang, String[] args, boolean forUser, boolean fair) throws ScribException, CommandLineException { - LangContext jobc = lang.getContext(); - String[] args = forUser + LangContext langc = lang.getContext(); + /*String[] args = forUser ? this.args.get(CLFlags.EFSM_PNG_FLAG) : (fair ? this.args.get(CLFlags.VALIDATION_EFSM_PNG_FLAG) - : this.args.get(CLFlags.UNFAIR_EFSM_PNG_FLAG)); + : this.args.get(CLFlags.UNFAIR_EFSM_PNG_FLAG));*/ for (int i = 0; i < args.length; i += 3) { - GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); - Role role = checkRoleArg(jobc, fullname, args[i+1]); + GProtocolName fullname = checkGlobalProtocolArg(langc, args[i]); + Role role = checkRoleArg(langc, fullname, args[i+1]); String png = args[i+2]; - EGraph fsm = getEGraph(lang, fullname, role, forUser, fair); + EGraph fsm = getEGraph(lang, fullname, role, forUser, fair, args); // CHECKME: factor fullname/role inside? runDot(fsm.toDot(), png); } } // Endpoint graphs are "inlined", so only a single graph is built (cf. projection output) private EGraph getEGraph(Lang lang, GProtocolName fullname, Role role, - boolean forUser, boolean fair) + boolean forUser, boolean fair, String[] args) // args only error message throws ScribException, CommandLineException { LangContext jobc = lang.getContext(); @@ -383,12 +374,12 @@ private EGraph getEGraph(Lang lang, GProtocolName fullname, Role role, .contains(role)) { throw new CommandLineException("Bad FSM construction args: " - + Arrays.toString(this.args.get(CLFlags.DOT_FLAG))); + + Arrays.toString(args)); } EGraph graph; if (forUser) // The (possibly minimised) user-output EFSM for API gen { - graph = this.args.containsKey(CLFlags.LTSCONVERT_MIN_FLAG) + graph = hasFlag(CLFlags.LTSCONVERT_MIN_FLAG) ? jobc2.getMinimisedEGraph(fullname, role) : jobc2.getEGraph(fullname, role); } @@ -407,31 +398,31 @@ private EGraph getEGraph(Lang lang, GProtocolName fullname, Role role, return graph; } - private void printSGraph(Lang lang, boolean fair) + private void printSGraph(Lang lang, String[] args, boolean fair) throws ScribException, CommandLineException { LangContext jobc = lang.getContext(); - String[] args = fair + /*String[] args = fair ? this.args.get(CLFlags.SGRAPH_FLAG) - : this.args.get(CLFlags.UNFAIR_SGRAPH_FLAG); + : this.args.get(CLFlags.UNFAIR_SGRAPH_FLAG);*/ for (int i = 0; i < args.length; i += 1) { GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); SGraph model = getSGraph(lang, fullname, fair); - String out = this.args.containsKey(CLFlags.AUT_FLAG) + String out = hasFlag(CLFlags.AUT_FLAG) ? model.toAut() : model.toDot(); System.out.println("\n" + out); } } - private void drawSGraph(Lang lang, boolean fair) + private void drawSGraph(Lang lang, String[] args, boolean fair) throws ScribException, CommandLineException { LangContext jobc = lang.getContext(); - String[] args = fair + /*String[] args = fair ? this.args.get(CLFlags.SGRAPH_PNG_FLAG) - : this.args.get(CLFlags.UNFAIR_SGRAPH_PNG_FLAG); + : this.args.get(CLFlags.UNFAIR_SGRAPH_PNG_FLAG);*/ for (int i = 0; i < args.length; i += 2) { GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); @@ -456,11 +447,11 @@ private static SGraph getSGraph(Lang lang, GProtocolName fullname, boolean fair) return model; } - private void outputEndpointApi(Lang lang) + private void outputEndpointApi(Lang lang, String[] args) throws ScribException, CommandLineException { LangContext jobc = lang.getContext(); - String[] args = this.args.get(CLFlags.API_GEN_FLAG); + //String[] args = this.args.get(CLFlags.API_GEN_FLAG); JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // FIXME: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) { @@ -469,16 +460,16 @@ private void outputEndpointApi(Lang lang) outputClasses(sessClasses); Role role = checkRoleArg(jobc, fullname, args[i+1]); Map scClasses = jgen.generateStateChannelApi(fullname, - role, this.args.containsKey(CLFlags.STATECHAN_API_GEN_FLAG)); + role, hasFlag(CLFlags.STATECHAN_SUBTYPES_FLAG)); outputClasses(scClasses); } } - private void outputSessionApi(Lang lang) + private void outputSessionApi(Lang lang, String[] args) throws ScribException, CommandLineException { LangContext jobc = lang.getContext(); - String[] args = this.args.get(CLFlags.SESSION_API_GEN_FLAG); + //String[] args = this.args.get(CLFlags.SESSION_API_GEN_FLAG); JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // TODO: refactor (generalise -- use new API) for (String fullname : args) { @@ -488,27 +479,27 @@ private void outputSessionApi(Lang lang) } } - private void outputStateChannelApi(Lang lang) + private void outputStateChannelApi(Lang lang, String[] args) throws ScribException, CommandLineException { LangContext jobc = lang.getContext(); - String[] args = this.args.get(CLFlags.STATECHAN_API_GEN_FLAG); + //String[] args = this.args.get(CLFlags.STATECHAN_API_GEN_FLAG); JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // TODO: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) { GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); Role self = checkRoleArg(jobc, fullname, args[i+1]); Map classes = jgen.generateStateChannelApi(fullname, self, - this.args.containsKey(CLFlags.STATECHAN_API_GEN_FLAG)); + hasFlag(CLFlags.STATECHAN_SUBTYPES_FLAG)); outputClasses(classes); } } - private void outputEventDrivenApi(Lang lang) + private void outputEventDrivenApi(Lang lang, String[] args) throws ScribException, CommandLineException { LangContext jobc = lang.getContext(); - String[] args = this.args.get(CLFlags.EVENTDRIVEN_API_GEN_FLAG); + //String[] args = this.args.get(CLFlags.EVENTDRIVEN_API_GEN_FLAG); /*JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // FIXME: refactor (generalise -- use new API) for (int i = 0; i < args.length; i += 2) { @@ -524,7 +515,7 @@ private void outputEventDrivenApi(Lang lang) GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); Role self = checkRoleArg(jobc, fullname, args[i+1]); CBEndpointApiGenerator3 edgen = new CBEndpointApiGenerator3(lang, fullname, - self, this.args.containsKey(CLFlags.STATECHAN_API_GEN_FLAG)); + self, hasFlag(CLFlags.STATECHAN_SUBTYPES_FLAG)); Map out = edgen.build(); outputClasses(out); } @@ -535,18 +526,20 @@ protected void outputClasses(Map classes) throws ScribException { Consumer f; - if (this.args.containsKey(CLFlags.API_GEN_FLAG)) + if (hasFlag(CLFlags.API_OUTPUT_DIR_FLAG)) { - String dir = this.args.get(CLFlags.API_GEN_FLAG)[0]; + String dir = getUniqueFlagArgs(CLFlags.API_OUTPUT_DIR_FLAG)[0]; f = path -> { ScribUtil.handleLambdaScribbleException(() -> - { - String tmp = dir + "/" + path; - if (this.args.containsKey(CLFlags.VERBOSE_FLAG)) - { - System.out.println("[DEBUG] Writing to: " + tmp); - } - ScribUtil.writeToFile(tmp, classes.get(path)); return null; - }); }; + { + String tmp = dir + "/" + path; + if (hasFlag(CLFlags.VERBOSE_FLAG)) + { + System.out.println("[DEBUG] Writing to: " + tmp); + } + ScribUtil.writeToFile(tmp, classes.get(path)); + return null; + }); + }; } else { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java index 12e0f7c67..0b216d466 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java @@ -34,24 +34,29 @@ public JEndpointApiGenerator(Lang lang) this.lang = lang; } - public Map generateSessionApi(GProtocolName fullname) throws ScribException + public Map generateSessionApi(GProtocolName fullname) + throws ScribException { - this.lang.debugPrintln("\n[Java API gen] Running " + SessionApiGenerator.class + " for " + fullname); + this.lang.debugPrintln("\n[Java API gen] Running " + + SessionApiGenerator.class + " for " + fullname); SessionApiGenerator sg = new SessionApiGenerator(this.lang, fullname); // FIXME: reuse? Map map = sg.generateApi(); // filepath -> class source return map; } // FIXME: refactor an EndpointApiGenerator -- ? - public Map generateStateChannelApi(GProtocolName fullname, Role self, boolean subtypes) throws ScribException + public Map generateStateChannelApi(GProtocolName fullname, + Role self, boolean subtypes) throws ScribException { /*JobContext jc = this.job.getContext(); if (jc.getEndpointGraph(fullname, self) == null) { buildGraph(fullname, self); }*/ - lang.debugPrintln("\n[Java API gen] Running " + StateChannelApiGenerator.class + " for " + fullname + "@" + self); - StateChannelApiGenerator apigen = new StateChannelApiGenerator(this.lang, fullname, self); + lang.debugPrintln("\n[Java API gen] Running " + + StateChannelApiGenerator.class + " for " + fullname + "@" + self); + StateChannelApiGenerator apigen = new StateChannelApiGenerator(this.lang, + fullname, self); IOInterfacesGenerator iogen = null; try { @@ -60,7 +65,8 @@ public Map generateStateChannelApi(GProtocolName fullname, Role catch (RuntimeScribException e) // FIXME: use IOInterfacesGenerator.skipIOInterfacesGeneration { //System.err.println("[Warning] Skipping I/O Interface generation for protocol featuring: " + fullname); - this.lang.warningPrintln("Skipping I/O Interface generation for: " + fullname + "\n Cause: " + e.getMessage()); + this.lang.warningPrintln("Skipping I/O Interface generation for: " + + fullname + "\n Cause: " + e.getMessage()); } // Construct the Generators first, to build all the types -- then call generate to "compile" all Builders to text (further building changes will not be output) Map api = new HashMap<>(); // filepath -> class source // Store results? diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 2fa507b70..4f67b725c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -63,7 +63,8 @@ public class CBEndpointApiGenerator3 //private final boolean subtypes; // Generate full hierarchy (states -> states, not just indivdual state -> cases) -- cf. ioifaces - public CBEndpointApiGenerator3(Lang lang, GProtocolName fullname, Role self, boolean subtypes) + public CBEndpointApiGenerator3(Lang lang, GProtocolName fullname, Role self, + boolean subtypes) { this.lang = lang; try diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index 810b918a0..4a2108cd4 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -307,7 +307,7 @@ protected void runProjectionPasses() throws ScribException } // Pre: checkWellFormedness - // Returns: fullname -> Module + // Returns: fullname -> Module -- CHECKME TODO: refactor local Module creation to Lang? public Map getProjections(GProtocolName fullname, Role role) throws ScribException { diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index a10d68aad..8b05f30f1 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -78,7 +78,7 @@ module tmp.Test; global protocol Proto1(role A, role B) { //1() from A to B; - choice at B + choice at A { 1() from A to B; } From cf0586f997b1aff8854e0d5cbf70d99f16d62574 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 15:15:26 +0100 Subject: [PATCH 195/539] Minor. --- .../src/main/java/org/scribble/lang/Lang.java | 4 +- .../scribble/visit/context/EGraphBuilder.java | 2 +- .../java/org/scribble/cli/CommandLine.java | 39 +++++++++---------- .../org/scribble/codegen/java/ApiGen.java | 2 +- .../callbackapi/CBEndpointApiGenerator.java | 2 +- .../callbackapi/CBEndpointApiGenerator3.java | 2 +- .../main/java/org/scribble/core/job/Job.java | 2 +- 7 files changed, 25 insertions(+), 28 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index 497bcae4c..bc47ba1d0 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -94,8 +94,8 @@ public void runPasses() throws ScribException // "Finalises" this Lang -- initialises the Job at this point, and cannot run futher Visitor passes on Lang // So, typically, Lang passes should be finished before calling this // Job passes may subsequently mutate Job(Context) though - // CHECKME: revise this pattern? - public final Job toJob() throws ScribException + // CHECKME: revise this pattern? -- maybe fork Job for a snapshot of current Lang(Context) -- and, possibly, convert Job back to Lang + public final Job getJob() throws ScribException { if (this.job == null) { diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/EGraphBuilder.java b/scribble-ast/src/main/java/org/scribble/visit/context/EGraphBuilder.java index bf11f4a5a..bb6a2372f 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/context/EGraphBuilder.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/EGraphBuilder.java @@ -36,7 +36,7 @@ public EGraphBuilder(Lang job) super(job); try { - this.util = job.toJob().newEGraphBuilderUtil(); + this.util = job.getJob().newEGraphBuilderUtil(); } catch (ScribException e) // TODO: refactor { diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 8096bab55..b4957a092 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -50,7 +50,13 @@ import org.scribble.util.ScribParserException; import org.scribble.util.ScribUtil; -// A Scribble extension should override newCLFlags, newCLArgParser and newMain as appropriate +/** + * A Scribble extension should override newCLFlags, newCLArgParser, newMain, + * parseJobArgs, doValidationTasks, tryNonBarrierTask and tryBarrierTask as + * appropriate + * + * @author rhu1 + */ public class CommandLine { protected final CLFlags _flags; @@ -85,19 +91,18 @@ private String[] getUniqueFlagArgs(String flag) .get().right; } - // A Scribble extension should override newCLFlags, newCLArgParser and newMain as appropriate protected CLFlags newCLFlags() { return new CLFlags(); } - // A Scribble extension should override newCLFlags, newCLArgParser and newMain as appropriate + // A Scribble extension should override as appropriate protected CLArgParser newCLArgParser(CLFlags flags, String[] args) { return new CLArgParser(flags, args); } - // A Scribble extension should override newCLFlags, newCLArgParser and newMain as appropriate + // A Scribble extension should override as appropriate protected Main newMain() throws ScribParserException, ScribException { Map args = Collections.unmodifiableMap(parseJobArgs()); @@ -119,6 +124,7 @@ protected Main newMain() throws ScribParserException, ScribException } } + // A Scribble extension should override as appropriate protected Map parseJobArgs() { Map args = new HashMap<>(); @@ -137,26 +143,16 @@ protected Map parseJobArgs() } // AntlrSourceException super of ScribbleException -- needed for, e.g., AssrtCoreSyntaxException + // A Scribble extension should override as appropriate protected void doValidationTasks(Lang lang) throws AntlrSourceException, ScribParserException, // Latter in case needed by subclasses CommandLineException { - /*// Scribble extensions (custom Job passes) - if (this.args.containsKey(F17CLArgFlag.F17)) - { - GProtocolName simpname = new GProtocolName(this.args.get(ArgFlag.F17)[0]); - F17Main.parseAndCheckWF(lang, simpname); // Includes base passes - } - - // Base Scribble - else*/ - { - lang.runPasses(); // TODO: refactor, w.r.t. below - lang.toJob().checkWellFormedness(); - } - + lang.runPasses(); + lang.getJob().runPasses(); } + // A Scribble extension should override as appropriate // TODO: rename, barrier misleading (sounds like a sync) protected void tryNonBarrierTask(Lang lang, Pair task) throws CommandLineException, ScribException @@ -202,6 +198,7 @@ protected void tryNonBarrierTask(Lang lang, Pair task) } } + // A Scribble extension should override as appropriate // TODO: rename, barrier misleading (sounds like a sync) protected void tryBarrierTask(Lang lang, Pair task) throws ScribException, CommandLineException @@ -306,7 +303,7 @@ private void printProjection(Lang lang, String[] args) throws CommandLineException, ScribException { LangContext langc = lang.getContext(); - Job job = lang.toJob(); + Job job = lang.getJob(); for (int i = 0; i < args.length; i += 2) { GProtocolName fullname = checkGlobalProtocolArg(langc, args[i]); @@ -367,7 +364,7 @@ private EGraph getEGraph(Lang lang, GProtocolName fullname, Role role, throws ScribException, CommandLineException { LangContext jobc = lang.getContext(); - JobContext jobc2 = lang.toJob().getContext(); + JobContext jobc2 = lang.getJob().getContext(); GProtocolDecl gpd = (GProtocolDecl) jobc.getMainModule() .getProtocolDeclChild(fullname.getSimpleName()); if (gpd == null || !gpd.getHeaderChild().getRoleDeclListChild().getRoles() @@ -435,7 +432,7 @@ private void drawSGraph(Lang lang, String[] args, boolean fair) private static SGraph getSGraph(Lang lang, GProtocolName fullname, boolean fair) throws ScribException { - JobContext jobc2 = lang.toJob().getContext(); + JobContext jobc2 = lang.getJob().getContext(); SGraph model = fair ? jobc2.getSGraph(fullname) : jobc2.getUnfairSGraph(fullname); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java index f81593279..e1e63601d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java @@ -32,7 +32,7 @@ public ApiGen(Lang job, GProtocolName fullname) this.lang = job; try { - this.job = job.toJob(); + this.job = job.getJob(); } catch (ScribException e) // TODO: refactor { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index ae5c624ac..38ccb5e61 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -57,7 +57,7 @@ public CBEndpointApiGenerator(Lang job, GProtocolName fullname, Role self, boole this.lang = job; try { - this.job = job.toJob(); + this.job = job.getJob(); } catch (ScribException e) // TODO: refactor { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 4f67b725c..2c722db04 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -69,7 +69,7 @@ public CBEndpointApiGenerator3(Lang lang, GProtocolName fullname, Role self, this.lang = lang; try { - this.job = lang.toJob(); + this.job = lang.getJob(); } catch (ScribException e) // TODO: refactor { diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index 4a2108cd4..4dbb6b4cc 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -112,7 +112,7 @@ public SGraph buildSGraph(GProtocolName fullname, Map egraphs, return this.sgraphb.buildSGraph(this, fullname, egraphs, explicit); // FIXME: factor out util } - public void checkWellFormedness() throws ScribException + public void runPasses() throws ScribException { runContextBuildingPasses(); //runUnfoldingPass(); From 7929c88c05874bfa34eedef326cb5bc86caa395a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 19:03:02 +0100 Subject: [PATCH 196/539] Continued: refactoring cli. --- .../java/org/scribble/cli/CommandLine.java | 263 +++++++----------- .../codegen/java/JEndpointApiGenerator.java | 2 +- .../org/scribble/core/job/JobContext.java | 1 + 3 files changed, 100 insertions(+), 166 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index b4957a092..4544c0038 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -14,6 +14,7 @@ package org.scribble.cli; import java.io.File; +import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; @@ -163,34 +164,34 @@ protected void tryNonBarrierTask(Lang lang, Pair task) printProjection(lang, task.right); break; case CLFlags.EFSM_FLAG: - printEGraph(lang, task.right, true, true); // TODO: factor print/draw + outputEGraph(lang, task.right, true, true, false); break; case CLFlags.VALIDATION_EFSM_FLAG: - printEGraph(lang, task.right, false, true); + outputEGraph(lang, task.right, false, true, false); break; case CLFlags.UNFAIR_EFSM_FLAG: - printEGraph(lang, task.right, false, false); + outputEGraph(lang, task.right, false, false, false); break; case CLFlags.EFSM_PNG_FLAG: - drawEGraph(lang, task.right, true, true); + outputEGraph(lang, task.right, true, true, true); break; case CLFlags.VALIDATION_EFSM_PNG_FLAG: - drawEGraph(lang, task.right, false, true); + outputEGraph(lang, task.right, false, true, true); break; case CLFlags.UNFAIR_EFSM_PNG_FLAG: - drawEGraph(lang, task.right, false, false); + outputEGraph(lang, task.right, false, false, true); break; case CLFlags.SGRAPH_FLAG: - printSGraph(lang, task.right, true); + outputSGraph(lang, task.right, true, false); break; case CLFlags.UNFAIR_SGRAPH_FLAG: - printSGraph(lang, task.right, false); + outputSGraph(lang, task.right, false, false); break; case CLFlags.SGRAPH_PNG_FLAG: - drawSGraph(lang, task.right, true); + outputSGraph(lang, task.right, true, true); break; case CLFlags.UNFAIR_SGRAPH_PNG_FLAG: - drawSGraph(lang, task.right, false); + outputSGraph(lang, task.right, false, true); break; default: throw new RuntimeException("Shouldn't get here: " + task.left); @@ -206,20 +207,20 @@ protected void tryBarrierTask(Lang lang, switch (task.left) { case CLFlags.SESSION_API_GEN_FLAG: - outputSessionApi(lang, task.right); + outputEndpointApi(lang, task.right, true, false, false); break; case CLFlags.STATECHAN_API_GEN_FLAG: - outputStateChannelApi(lang, task.right); + outputEndpointApi(lang, task.right, false, true, false); break; case CLFlags.API_GEN_FLAG: - outputEndpointApi(lang, task.right); + outputEndpointApi(lang, task.right, true, true, false); break; case CLFlags.EVENTDRIVEN_API_GEN_FLAG: - outputEventDrivenApi(lang, task.right); + outputEndpointApi(lang, task.right, false, true, true); // FIXME: currently need to gen sess API separately? break; default: throw new RuntimeException("Shouldn't get here: " + task.left); - // Bad flag should be caught by CLArgParser + // Bad flag should be caught by CLArgParser } } @@ -318,43 +319,79 @@ private void printProjection(Lang lang, String[] args) // dot/aut text output // forUser: true means for API gen and general user info (may be minimised), false means for validation (non-minimised, fair or unfair) // (forUser && !fair) should not hold, i.e. unfair doesn't make sense if forUser - private void printEGraph(Lang lang, String[] args, boolean forUser, boolean fair) - throws ScribException, CommandLineException + private void outputEGraph(Lang lang, String[] args, boolean forUser, + boolean fair, boolean draw) throws ScribException, CommandLineException { LangContext langc = lang.getContext(); - /*String[] args = forUser - ? this.args.get(CLFlags.EFSM_FLAG) - : (fair - ? this.args.get(CLFlags.VALIDATION_EFSM_FLAG) - : this.args.get(CLFlags.UNFAIR_EFSM_FLAG));*/ - for (int i = 0; i < args.length; i += 2) + + GProtocolName fullname = checkGlobalProtocolArg(langc, args[0]); + Role role = checkRoleArg(langc, fullname, args[1]); + EGraph fsm = getEGraph(lang, fullname, role, forUser, fair, args); // CHECKME: factor fullname/role inside? + if (draw) + { + String png = args[2]; + runDot(fsm.toDot(), png); + } + else // print + { + String out = hasFlag(CLFlags.AUT_FLAG) + ? fsm.toAut() + : fsm.toDot(); // default: dot + System.out.println("\n" + out); // Endpoint graphs are "inlined" (a single graph is built) + } + } + + private void outputSGraph(Lang lang, String[] args, boolean fair, + boolean draw) throws ScribException, CommandLineException + { + LangContext jobc = lang.getContext(); { - GProtocolName fullname = checkGlobalProtocolArg(langc, args[i]); - Role role = checkRoleArg(langc, fullname, args[i+1]); - EGraph fsm = getEGraph(lang, fullname, role, forUser, fair, args); - String out = hasFlag(CLFlags.AUT_FLAG) - ? fsm.toAut() - : fsm.toDot(); - System.out.println("\n" + out); // Endpoint graphs are "inlined" (a single graph is built) + GProtocolName fullname = checkGlobalProtocolArg(jobc, args[0]); + SGraph model = getSGraph(lang, fullname, fair); + if (draw) + { + String png = args[1]; + runDot(model.toDot(), png); + } + else // print + { + String out = hasFlag(CLFlags.AUT_FLAG) + ? model.toAut() + : model.toDot(); + System.out.println("\n" + out); + } } } - private void drawEGraph(Lang lang, String[] args, boolean forUser, boolean fair) - throws ScribException, CommandLineException + private void outputEndpointApi(Lang lang, String[] args, boolean sess, + boolean schan, boolean cb) throws ScribException, CommandLineException { LangContext langc = lang.getContext(); - /*String[] args = forUser - ? this.args.get(CLFlags.EFSM_PNG_FLAG) - : (fair - ? this.args.get(CLFlags.VALIDATION_EFSM_PNG_FLAG) - : this.args.get(CLFlags.UNFAIR_EFSM_PNG_FLAG));*/ - for (int i = 0; i < args.length; i += 3) + JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // FIXME: refactor (generalise -- use new API) { - GProtocolName fullname = checkGlobalProtocolArg(langc, args[i]); - Role role = checkRoleArg(langc, fullname, args[i+1]); - String png = args[i+2]; - EGraph fsm = getEGraph(lang, fullname, role, forUser, fair, args); // CHECKME: factor fullname/role inside? - runDot(fsm.toDot(), png); + GProtocolName fullname = checkGlobalProtocolArg(langc, args[0]); + if (sess) + { + Map out = jgen.generateSessionApi(fullname); + outputClasses(out); + } + if (schan) // CHECKME: does not implicitly generate sess API? + { + Role self = checkRoleArg(langc, fullname, args[1]); + if (cb) + { + CBEndpointApiGenerator3 cbgen = new CBEndpointApiGenerator3(lang, + fullname, self, hasFlag(CLFlags.STATECHAN_SUBTYPES_FLAG)); + Map out = cbgen.build(); + outputClasses(out); + } + else + { + Map out = jgen.generateStateChannelApi(fullname, + self, hasFlag(CLFlags.STATECHAN_SUBTYPES_FLAG)); + outputClasses(out); + } + } } } @@ -395,41 +432,7 @@ private EGraph getEGraph(Lang lang, GProtocolName fullname, Role role, return graph; } - private void printSGraph(Lang lang, String[] args, boolean fair) - throws ScribException, CommandLineException - { - LangContext jobc = lang.getContext(); - /*String[] args = fair - ? this.args.get(CLFlags.SGRAPH_FLAG) - : this.args.get(CLFlags.UNFAIR_SGRAPH_FLAG);*/ - for (int i = 0; i < args.length; i += 1) - { - GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); - SGraph model = getSGraph(lang, fullname, fair); - String out = hasFlag(CLFlags.AUT_FLAG) - ? model.toAut() - : model.toDot(); - System.out.println("\n" + out); - } - } - - private void drawSGraph(Lang lang, String[] args, boolean fair) - throws ScribException, CommandLineException - { - LangContext jobc = lang.getContext(); - /*String[] args = fair - ? this.args.get(CLFlags.SGRAPH_PNG_FLAG) - : this.args.get(CLFlags.UNFAIR_SGRAPH_PNG_FLAG);*/ - for (int i = 0; i < args.length; i += 2) - { - GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); - String png = args[i+1]; - SGraph model = getSGraph(lang, fullname, fair); - runDot(model.toDot(), png); - } - } - - private static SGraph getSGraph(Lang lang, GProtocolName fullname, boolean fair) + private SGraph getSGraph(Lang lang, GProtocolName fullname, boolean fair) throws ScribException { JobContext jobc2 = lang.getJob().getContext(); @@ -444,81 +447,7 @@ private static SGraph getSGraph(Lang lang, GProtocolName fullname, boolean fair) return model; } - private void outputEndpointApi(Lang lang, String[] args) - throws ScribException, CommandLineException - { - LangContext jobc = lang.getContext(); - //String[] args = this.args.get(CLFlags.API_GEN_FLAG); - JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // FIXME: refactor (generalise -- use new API) - for (int i = 0; i < args.length; i += 2) - { - GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); - Map sessClasses = jgen.generateSessionApi(fullname); - outputClasses(sessClasses); - Role role = checkRoleArg(jobc, fullname, args[i+1]); - Map scClasses = jgen.generateStateChannelApi(fullname, - role, hasFlag(CLFlags.STATECHAN_SUBTYPES_FLAG)); - outputClasses(scClasses); - } - } - - private void outputSessionApi(Lang lang, String[] args) - throws ScribException, CommandLineException - { - LangContext jobc = lang.getContext(); - //String[] args = this.args.get(CLFlags.SESSION_API_GEN_FLAG); - JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // TODO: refactor (generalise -- use new API) - for (String fullname : args) - { - GProtocolName gpn = checkGlobalProtocolArg(jobc, fullname); - Map classes = jgen.generateSessionApi(gpn); - outputClasses(classes); - } - } - - private void outputStateChannelApi(Lang lang, String[] args) - throws ScribException, CommandLineException - { - LangContext jobc = lang.getContext(); - //String[] args = this.args.get(CLFlags.STATECHAN_API_GEN_FLAG); - JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // TODO: refactor (generalise -- use new API) - for (int i = 0; i < args.length; i += 2) - { - GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); - Role self = checkRoleArg(jobc, fullname, args[i+1]); - Map classes = jgen.generateStateChannelApi(fullname, self, - hasFlag(CLFlags.STATECHAN_SUBTYPES_FLAG)); - outputClasses(classes); - } - } - - private void outputEventDrivenApi(Lang lang, String[] args) - throws ScribException, CommandLineException - { - LangContext jobc = lang.getContext(); - //String[] args = this.args.get(CLFlags.EVENTDRIVEN_API_GEN_FLAG); - /*JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // FIXME: refactor (generalise -- use new API) - for (int i = 0; i < args.length; i += 2) - { - GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); - Map sessClasses = jgen.generateSessionApi(fullname); - outputClasses(sessClasses); - Role role = checkRoleArg(jobc, fullname, args[i+1]); - Map scClasses = jgen.generateStateChannelApi(fullname, role, this.args.containsKey(CLFlags.SCHAN_API_SUBTYPES)); - outputClasses(scClasses); - }*/ - for (int i = 0; i < args.length; i += 2) - { - GProtocolName fullname = checkGlobalProtocolArg(jobc, args[i]); - Role self = checkRoleArg(jobc, fullname, args[i+1]); - CBEndpointApiGenerator3 edgen = new CBEndpointApiGenerator3(lang, fullname, - self, hasFlag(CLFlags.STATECHAN_SUBTYPES_FLAG)); - Map out = edgen.build(); - outputClasses(out); - } - } - - // filepath -> class source + // classes: filepath -> class source protected void outputClasses(Map classes) throws ScribException { @@ -548,21 +477,25 @@ protected void outputClasses(Map classes) protected static void runDot(String dot, String png) throws ScribException, CommandLineException { - String tmpName = png + ".tmp"; - File tmp = new File(tmpName); - if (tmp.exists()) - { - throw new CommandLineException("Cannot overwrite: " + tmpName); - } + File tmp = null; try { + tmp = File.createTempFile(png, ".tmp"); + String tmpName = tmp.getAbsolutePath(); ScribUtil.writeToFile(tmpName, dot); String[] res = ScribUtil.runProcess("dot", "-Tpng", "-o" + png, tmpName); System.out.print(!res[1].isEmpty() ? res[1] : res[0]); // already "\n" terminated } + catch (IOException e) + { + throw new CommandLineException(e); + } finally { - tmp.delete(); + if (tmp != null) + { + tmp.delete(); + } } } @@ -577,11 +510,11 @@ protected static List parseImportPaths(String paths) .collect(Collectors.toList()); } - protected static GProtocolName checkGlobalProtocolArg(LangContext jobc, + protected static GProtocolName checkGlobalProtocolArg(LangContext langc, String simpname) throws CommandLineException { GProtocolName simpgpn = new GProtocolName(simpname); - Module main = jobc.getMainModule(); + Module main = langc.getMainModule(); if (!main.hasProtocolDecl(simpgpn)) { throw new CommandLineException("Global protocol not found: " + simpname); @@ -596,13 +529,13 @@ protected static GProtocolName checkGlobalProtocolArg(LangContext jobc, throw new CommandLineException( "Invalid aux protocol specified as root: " + simpname); } - return new GProtocolName(jobc.lang.config.main, simpgpn); // TODO: take Job param instead of Jobcontext + return new GProtocolName(langc.lang.config.main, simpgpn); // TODO: take Job param instead of Jobcontext } - protected static Role checkRoleArg(LangContext jobc, + protected static Role checkRoleArg(LangContext langc, GProtocolName fullname, String rolename) throws CommandLineException { - ProtocolDecl pd = jobc.getMainModule() + ProtocolDecl pd = langc.getMainModule() .getProtocolDeclChild(fullname.getSimpleName()); Role role = new Role(rolename); if (!pd.getHeaderChild().getRoleDeclListChild().getRoles().contains(role)) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java index 0b216d466..ae625c307 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java @@ -44,7 +44,7 @@ public Map generateSessionApi(GProtocolName fullname) return map; } - // FIXME: refactor an EndpointApiGenerator -- ? + // CHECKME: refactor an EndpointApiGenerator -- ? public Map generateStateChannelApi(GProtocolName fullname, Role self, boolean subtypes) throws ScribException { diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java index d80f74081..8896230c7 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java @@ -63,6 +63,7 @@ public class JobContext // LProtocolName key is LProtocol value fullname (i.e., redundant) private final Map projs = new HashMap<>(); + // Built from inlined private final Map fEGraphs = new HashMap<>(); private final Map uEGraphs = new HashMap<>(); private final Map mEGraphs = new HashMap<>(); From 1740d8bd4190dddb4e37cf5e219c07e2b161ff8b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 19:29:34 +0100 Subject: [PATCH 197/539] Continued: refactoring cli. --- .../java/org/scribble/cli/CommandLine.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 4544c0038..3e38ddf5a 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -299,7 +299,7 @@ protected void runTasks() } } - // TODO: option to write to file, like classes + // TODO: option to write to file, like API classes private void printProjection(Lang lang, String[] args) throws CommandLineException, ScribException { @@ -326,7 +326,7 @@ private void outputEGraph(Lang lang, String[] args, boolean forUser, GProtocolName fullname = checkGlobalProtocolArg(langc, args[0]); Role role = checkRoleArg(langc, fullname, args[1]); - EGraph fsm = getEGraph(lang, fullname, role, forUser, fair, args); // CHECKME: factor fullname/role inside? + EGraph fsm = getEGraph(lang, fullname, role, forUser, fair); if (draw) { String png = args[2]; @@ -397,37 +397,37 @@ private void outputEndpointApi(Lang lang, String[] args, boolean sess, // Endpoint graphs are "inlined", so only a single graph is built (cf. projection output) private EGraph getEGraph(Lang lang, GProtocolName fullname, Role role, - boolean forUser, boolean fair, String[] args) // args only error message + boolean forUser, boolean fair) throws ScribException, CommandLineException { - LangContext jobc = lang.getContext(); - JobContext jobc2 = lang.getJob().getContext(); - GProtocolDecl gpd = (GProtocolDecl) jobc.getMainModule() + LangContext langc = lang.getContext(); + JobContext jobc = lang.getJob().getContext(); + GProtocolDecl gpd = (GProtocolDecl) langc.getMainModule() .getProtocolDeclChild(fullname.getSimpleName()); if (gpd == null || !gpd.getHeaderChild().getRoleDeclListChild().getRoles() .contains(role)) { throw new CommandLineException("Bad FSM construction args: " - + Arrays.toString(args)); + + gpd + ", " + role); } EGraph graph; if (forUser) // The (possibly minimised) user-output EFSM for API gen { graph = hasFlag(CLFlags.LTSCONVERT_MIN_FLAG) - ? jobc2.getMinimisedEGraph(fullname, role) - : jobc2.getEGraph(fullname, role); + ? jobc.getMinimisedEGraph(fullname, role) + : jobc.getEGraph(fullname, role); } else // The (possibly unfair-transformed) internal EFSM for validation { graph = //(!this.args.containsKey(ArgFlag.FAIR) && !this.args.containsKey(ArgFlag.NO_LIVENESS)) // Cf. GlobalModelChecker.getEndpointFSMs !fair - ? jobc2.getUnfairEGraph(fullname, role) - : jobc2.getEGraph(fullname, role); + ? jobc.getUnfairEGraph(fullname, role) + : jobc.getEGraph(fullname, role); } if (graph == null) { throw new RuntimeScribException("Shouldn't see this: " + fullname); - // Should be suppressed by an earlier failure + // Should be caught by some earlier failure } return graph; } @@ -442,7 +442,7 @@ private SGraph getSGraph(Lang lang, GProtocolName fullname, boolean fair) if (model == null) { throw new RuntimeScribException("Shouldn't see this: " + fullname); - // Should be suppressed by an earlier failure + // Should be caught by some earlier failure } return model; } From 87a8cd3711b7582432bff491d47a43fde430463a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 19:46:05 +0100 Subject: [PATCH 198/539] Minor. --- .../java/org/scribble/cli/CLArgParser.java | 39 ++----------------- .../java/org/scribble/cli/CommandLine.java | 10 ++--- .../main/java/org/scribble/core/job/Job.java | 25 ++++-------- .../scribble/core/lang/global/GProtocol.java | 2 +- 4 files changed, 15 insertions(+), 61 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java index bc8bd407b..8dd25fa22 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java @@ -89,7 +89,8 @@ private void parseArgs() throws CommandLineException "Unknown flag or bad main module arg: " + arg); } // Could actually be the second "bad argument" -- we didn't validate the value of the (supposed) "main arg" - throw new CommandLineException("Bad/multiple main module arg: " + arg); + throw new CommandLineException( + "Bad/multiple main module arg: " + arg); } i = parseMain(i); } @@ -172,39 +173,5 @@ private String[] getParsedUnique(String flag) .filter(x -> x.left.equals(flag)).findAny(); return res.isPresent() ? res.get().right : null; } - - - - - - - - - - - /*private int parseImportPath(int i) throws CommandLineException - { - if ((i + 1) >= this.raw.length) - { - throw new CommandLineException("Missing path argument"); - } - String path = this.raw[++i]; - if (!validatePaths(path)) - { - // FIXME: move validation to CL - throw new CommandLineException("Scribble module import path '"+ path +"' is not valid\r\n"); - } - checkAndAddUniqueFlag(CLArgParser.IMPORT_PATH_FLAG, new String[] { path }); - return i; - } - - private void checkAndAddUniqueFlag(String flag, String[] args) throws CommandLineException - { - //CLArgFlag argFlag = CLArgParser.UNIQUE_FLAGS.get(flag); - if (this.parsed.containsKey(flag)) - { - throw new CommandLineException("Duplicate flag: " + flag); - } - this.parsed.put(flag, args); - }*/ } + diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 3e38ddf5a..56ece6154 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -60,18 +60,16 @@ */ public class CommandLine { - protected final CLFlags _flags; - protected final Map flags; // this._flags.flags -- directly cache this Map for convenience + protected final CLFlags flags; protected final List> args; // left = CLFlags String constant, right = flag args (if any) -- ordered by parsing order public CommandLine(String... args) { - this._flags = newCLFlags(); - this.flags = this._flags.explicit; + this.flags = newCLFlags(); try { - this.args = newCLArgParser(this._flags, args).getParsed(); + this.args = newCLArgParser(this.flags, args).getParsed(); } catch (CommandLineException e) { @@ -274,7 +272,7 @@ protected void runTasks() try { doValidationTasks(lang); } catch (ScribException x) { err = x; } for (Pair a : this.args) { - CLFlag flag = this.flags.get(a.left); // null for CLFlags.MAIN_MOD_FLAG + CLFlag flag = this.flags.explicit.get(a.left); // null for CLFlags.MAIN_MOD_FLAG if (a.left.equals(CLFlags.MAIN_MOD_FLAG) || !flag.enact) { continue; diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index 4dbb6b4cc..096dbff13 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -116,7 +116,7 @@ public void runPasses() throws ScribException { runContextBuildingPasses(); //runUnfoldingPass(); - runWellFormednessPasses(); + runValidationPasses(); } public void runContextBuildingPasses() throws ScribException @@ -185,26 +185,15 @@ else if (n instanceof MessageSigName) } } - public void runWellFormednessPasses() throws ScribException + public void runValidationPasses() throws ScribException { - /*if (!this.config.noValidation) - { - runVisitorPassOnAllModules(WFChoiceChecker.class); // For enabled roles and disjoint enabling messages -- includes connectedness checks - runProjectionPasses(); - runVisitorPassOnAllModules(ReachabilityChecker.class); // Moved before GlobalModelChecker.class, OK? - if (!this.config.useOldWf) - { - runVisitorPassOnAllModules(GProtocolValidator.class); - } - }*/ - - //HERE WF (unfolding? unguarded-unfolder -- and lazy-unfolder-with-choice-pruning, e.g., bad.wfchoice.enabling.threeparty.Test02), projection, validation for (GProtocol inlined : this.context.getInlined()) { - //TODO: relegate to "warning" + //TODO: relegate to "warning" ? // Check unused roles Set used = inlined.def.getRoles(); - Set unused = this.context.getIntermediate(inlined.fullname).roles // imeds have original role decls (inlined's are pruned) + Set unused = this.context.getIntermediate(inlined.fullname).roles + // imeds have original role decls (inlined's are pruned) .stream().filter(x -> !used.contains(x)).collect(Collectors.toSet()); if (!unused.isEmpty()) { @@ -216,9 +205,9 @@ public void runWellFormednessPasses() throws ScribException { continue; } - STypeUnfolder unf = new STypeUnfolder<>(); + STypeUnfolder u = new STypeUnfolder<>(); //e.g., C->D captured under an A->B choice after unfolding, cf. bad.wfchoice.enabling.twoparty.Test01b; - inlined.unfoldAllOnce(unf).checkRoleEnabling(); + inlined.unfoldAllOnce(u).checkRoleEnabling(); inlined.checkExtChoiceConsistency(); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index c0499648e..6f35ad501 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -219,7 +219,7 @@ public static void validateBySpin(Job job2, GProtocolName fullname) pml += "mtype {" + mids.stream().map(mid -> mid.toString()) .collect(Collectors.joining(", ")) + "};\n"; - // FIXME: explicit + // TODO CHECKME: explicit ? pml += "\n"; List pairs = new LinkedList<>(); From 590cccee8874974b99cdcd0282c62fa4a886f892 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 20:13:00 +0100 Subject: [PATCH 199/539] Refactored ModuleContextVisitor to use "statically" collected ModuleContext. Dropped ModuleContexts from JobContext. --- .../src/main/java/org/scribble/del/DoDel.java | 4 ++-- .../src/main/java/org/scribble/lang/Lang.java | 15 ++++++++++++--- .../visit/context/ModuleContextVisitor.java | 16 ++++++++++------ .../src/main/java/org/scribble/core/job/Job.java | 12 +++++++----- .../java/org/scribble/core/job/JobContext.java | 11 +++++------ .../good/syntax/disamb/imports/Import01.scr | 2 ++ 6 files changed, 38 insertions(+), 22 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/del/DoDel.java b/scribble-ast/src/main/java/org/scribble/del/DoDel.java index f4aa793d8..edc3762c8 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoDel.java @@ -66,10 +66,10 @@ private ScribNode leaveDisambiguationAux( { @SuppressWarnings("unchecked") // Doesn't matter what K is, just need to propagate it down Do doo = (Do) visited; - ModuleContext mc = disamb.getModuleContext(); ProtocolNameNode proto = doo.getProtocolNameNode(); + /*ModuleContext mc = disamb.lang.getMainModuleContext(); ProtocolName fullname = mc - .getVisibleProtocolDeclFullName(proto.toName()); + .getVisibleProtocolDeclFullName(proto.toName());*/ ProtocolNameNode pnn;/* = (ProtocolNameNode) disamb.job.config.af .QualifiedNameNode(proto.getSource(), fullname.getKind(), diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index bc47ba1d0..6903e61ad 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -77,9 +77,11 @@ protected GTypeTranslator newTranslator(ModuleName rootFullname) // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate protected Job newJob(ModuleName mainFullname, Map args, - Map modcs, Set imeds) + //Map modcs, + Set imeds) { - return new Job(mainFullname, args, modcs, imeds); + return new Job(mainFullname, args, //modcs, + imeds); } // First run Visitor passes, then call toJob @@ -113,7 +115,8 @@ public final Job getJob() throws ScribException } } this.job = newJob(this.config.main, this.config.args, - this.context.getModuleContexts(), imeds); + //this.context.getModuleContexts(), + imeds); } return this.job; } @@ -122,6 +125,12 @@ public LangContext getContext() { return this.context; } + + // For convenience + /*public ModuleContext getMainModuleContext() + { + return this.context.getModuleContext(this.config.main); + }*/ public void runVisitorPassOnAllModules(Class c) throws ScribException diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java index fc43e0d48..bfd48537e 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java @@ -16,19 +16,21 @@ import org.scribble.ast.Module; import org.scribble.ast.ScribNode; import org.scribble.core.lang.context.ModuleContext; -import org.scribble.del.ModuleDel; +import org.scribble.core.type.name.ModuleName; import org.scribble.lang.Lang; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -// A visitor that caches the ModuleContext from an entered Module, for later access +// A visitor that caches the ModuleContext from the *entered* Module, for later access +// N.B. may be a different Module than the "root" Module of the job +// Looking up the "entered" Module context is otherwise inconvenient public abstract class ModuleContextVisitor extends AstVisitor { private ModuleContext mcontext; // The "root" module context (different than the front-end "main" module) // Factor up to ModelVisitor? (would be null before context building) - public ModuleContextVisitor(Lang job) + public ModuleContextVisitor(Lang lang) { - super(job); + super(lang); } @Override @@ -38,8 +40,10 @@ protected void enter(ScribNode parent, ScribNode child) super.enter(parent, child); if (child instanceof Module) // Factor out? { - ModuleDel del = (ModuleDel) ((Module) child).del(); - setModuleContext(del.getModuleContext()); + /*ModuleDel del = (ModuleDel) ((Module) child).del(); + setModuleContext(del.getModuleContext());*/ + ModuleName fullname = ((Module) child).getFullModuleName(); + setModuleContext(this.lang.getContext().getModuleContext(fullname)); } } diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index 096dbff13..62fcdaec0 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -22,7 +22,6 @@ import java.util.stream.Collectors; import org.scribble.core.lang.SubprotoSig; -import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.endpoint.EGraph; @@ -58,10 +57,12 @@ public class Job private final SGraphBuilderUtil sgraphb; public Job(ModuleName mainFullname, Map args, - Map modcs, Set imeds) + //Map modcs, + Set imeds) { this.config = newJobConfig(mainFullname, args); - this.context = newJobContext(modcs, imeds); // Single instance per Job and should never be shared + this.context = newJobContext(//modcs, + imeds); // Single instance per Job and should never be shared this.sgraphb = newSGraphBuilderUtil(); } @@ -76,10 +77,11 @@ protected JobConfig newJobConfig(ModuleName mainFullname, } // A Scribble extension should override newJobConfig/Context/etc as appropriate - protected JobContext newJobContext(Map modcs, + protected JobContext newJobContext(//Map modcs, Set imeds) { - return new JobContext(this, modcs, imeds); + return new JobContext(this, //modcs, + imeds); } // A Scribble extension should override newJobConfig/Context/etc as appropriate diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java index 8896230c7..05a73a426 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java @@ -22,7 +22,6 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.endpoint.AutParser; @@ -44,7 +43,7 @@ public class JobContext // Keys are full names // CHECKME: not currently used by core? -- core fully independent of modules, etc., because full disamb already done? - private final Map modcs; + //private final Map modcs; // "Directly" translated global protos, i.e., separate proto decls without any inlining/unfolding/etc // Protos retain original decl role list (and args) @@ -73,11 +72,11 @@ public class JobContext private final Map fSGraphs = new HashMap<>(); private final Map uSGraphs = new HashMap<>(); - protected JobContext(Job job, Map modcs, + protected JobContext(Job job, //Map modcs, Set imeds) { this.job = job; - this.modcs = Collections.unmodifiableMap(modcs); + //this.modcs = Collections.unmodifiableMap(modcs); this.imeds = imeds.stream() .collect(Collectors.toMap(x -> x.fullname, x -> x)); } @@ -309,10 +308,10 @@ public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) return minimised; } - public ModuleContext getModuleContext(ModuleName fullname) + /*public ModuleContext getModuleContext(ModuleName fullname) { return this.modcs.get(fullname); - } + }*/ // TODO: relocate // Duplicated from CommandLine.runDot diff --git a/scribble-test/src/test/resources/good/syntax/disamb/imports/Import01.scr b/scribble-test/src/test/resources/good/syntax/disamb/imports/Import01.scr index 9272a17c8..fb8d1507c 100644 --- a/scribble-test/src/test/resources/good/syntax/disamb/imports/Import01.scr +++ b/scribble-test/src/test/resources/good/syntax/disamb/imports/Import01.scr @@ -1,3 +1,5 @@ +//$ bin/scribblec.sh -ip scribble-test/src/test/resources scribble-test/src/test/resources/good/syntax/disamb/imports/Import01.scr + module good.syntax.disamb.imports.Import01; From 1ee04f49f6a3dfff9393d40e8dc83ddad8078ca5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 20:13:41 +0100 Subject: [PATCH 200/539] Minor. --- scribble-ast/src/main/java/org/scribble/lang/Lang.java | 1 - scribble-core/src/main/java/org/scribble/core/job/Job.java | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index 6903e61ad..6a1f2371c 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -25,7 +25,6 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.core.job.Job; import org.scribble.core.job.JobArgs; -import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.name.ModuleName; import org.scribble.util.ScribException; diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index 62fcdaec0..258a4f426 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -299,6 +299,7 @@ protected void runProjectionPasses() throws ScribException // Pre: checkWellFormedness // Returns: fullname -> Module -- CHECKME TODO: refactor local Module creation to Lang? + // CHECKME: generate projection Modules for an inline main? public Map getProjections(GProtocolName fullname, Role role) throws ScribException { From 22756c2b622507680f50b9d1fe4eb824ef9e1d8a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 21:20:04 +0100 Subject: [PATCH 201/539] Continued: stripped most of del. --- .../java/org/scribble/ast/AstFactoryImpl.java | 6 +- .../java/org/scribble/ast/MessageNode.java | 2 - .../java/org/scribble/ast/MessageSigNode.java | 8 - .../java/org/scribble/ast/PayloadElem.java | 2 - .../org/scribble/ast/PayloadElemList.java | 6 - .../main/java/org/scribble/ast/ScribNode.java | 5 +- .../java/org/scribble/ast/ScribNodeBase.java | 19 +- .../org/scribble/ast/UnaryPayloadElem.java | 6 - .../java/org/scribble/ast/global/GChoice.java | 50 --- .../scribble/ast/global/GDelegationElem.java | 10 - .../scribble/ast/global/GMessageTransfer.java | 46 --- .../java/org/scribble/ast/local/LAccept.java | 36 -- .../java/org/scribble/ast/local/LChoice.java | 48 --- .../org/scribble/ast/local/LContinue.java | 46 --- .../org/scribble/ast/local/LDisconnect.java | 38 -- .../main/java/org/scribble/ast/local/LDo.java | 51 --- .../scribble/ast/local/LInteractionSeq.java | 19 - .../scribble/ast/local/LProtocolBlock.java | 13 - .../java/org/scribble/ast/local/LReceive.java | 37 -- .../org/scribble/ast/local/LRecursion.java | 50 --- .../java/org/scribble/ast/local/LRequest.java | 36 -- .../java/org/scribble/ast/local/LSend.java | 34 -- .../org/scribble/ast/local/LSessionNode.java | 17 +- .../org/scribble/ast/local/LWrapClient.java | 36 -- .../org/scribble/ast/local/LWrapServer.java | 35 -- .../name/qualified/MessageSigNameNode.java | 7 - .../ast/name/simple/AmbigNameNode.java | 7 - .../ast/name/simple/SigParamNode.java | 7 - .../main/java/org/scribble/del/ChoiceDel.java | 48 --- .../scribble/del/CompoundInteractionDel.java | 103 ----- .../scribble/del/CompoundSessionNodeDel.java | 61 --- .../org/scribble/del/ConnectionActionDel.java | 86 ---- .../java/org/scribble/del/ContinueDel.java | 48 --- .../java/org/scribble/del/DoArgListDel.java | 3 +- .../src/main/java/org/scribble/del/DoDel.java | 56 +-- .../scribble/del/HeaderParamDeclListDel.java | 12 +- .../org/scribble/del/InteractionSeqDel.java | 10 +- .../org/scribble/del/MessageTransferDel.java | 114 ------ .../main/java/org/scribble/del/ModuleDel.java | 130 +----- .../org/scribble/del/NonRoleArgListDel.java | 6 +- .../org/scribble/del/NonRoleParamDeclDel.java | 3 +- .../org/scribble/del/ProtocolBlockDel.java | 10 +- .../org/scribble/del/ProtocolDeclDel.java | 78 +--- .../java/org/scribble/del/ProtocolDefDel.java | 44 -- .../java/org/scribble/del/RecursionDel.java | 74 +--- .../java/org/scribble/del/RoleArgListDel.java | 5 +- .../java/org/scribble/del/RoleDeclDel.java | 15 +- .../main/java/org/scribble/del/ScribDel.java | 275 +------------ .../java/org/scribble/del/ScribDelBase.java | 43 -- .../scribble/del/SimpleSessionNodeDel.java | 17 +- .../org/scribble/del/global/GChoiceDel.java | 160 +------- .../org/scribble/del/global/GConnectDel.java | 88 +--- .../org/scribble/del/global/GContinueDel.java | 39 +- .../java/org/scribble/del/global/GDel.java | 6 +- .../del/global/GDelegationElemDel.java | 111 +----- .../scribble/del/global/GDisconnectDel.java | 68 +--- .../java/org/scribble/del/global/GDoDel.java | 103 +---- .../del/global/GInteractionNodeDel.java | 16 - .../del/global/GInteractionSeqDel.java | 118 ------ .../del/global/GMessageTransferDel.java | 73 +--- .../del/global/GProtocolBlockDel.java | 43 -- .../scribble/del/global/GProtocolDeclDel.java | 144 ------- .../scribble/del/global/GProtocolDefDel.java | 89 ----- .../scribble/del/global/GRecursionDel.java | 82 +--- .../org/scribble/del/global/GWrapDel.java | 62 +-- .../org/scribble/del/local/LAcceptDel.java | 70 +--- .../org/scribble/del/local/LChoiceDel.java | 174 -------- .../local/LCompoundInteractionNodeDel.java | 20 +- .../del/local/LConnectionActionDel.java | 12 +- .../org/scribble/del/local/LContinueDel.java | 79 ---- .../scribble/del/local/LDisconnectDel.java | 24 +- .../java/org/scribble/del/local/LDoDel.java | 145 ------- .../del/local/LInteractionNodeDel.java | 16 - .../del/local/LInteractionSeqDel.java | 140 ------- .../del/local/LMessageTransferDel.java | 12 +- .../del/local/LProjectionDeclDel.java | 67 ---- .../scribble/del/local/LProtocolBlockDel.java | 35 -- .../scribble/del/local/LProtocolDeclDel.java | 77 ---- .../scribble/del/local/LProtocolDefDel.java | 61 --- .../org/scribble/del/local/LReceiveDel.java | 48 --- .../org/scribble/del/local/LRecursionDel.java | 101 ----- .../org/scribble/del/local/LRequestDel.java | 39 +- .../java/org/scribble/del/local/LSendDel.java | 57 --- .../scribble/del/local/LWrapClientDel.java | 27 +- .../scribble/del/local/LWrapServerDel.java | 36 -- .../del/name/qualified/DataTypeNodeDel.java | 3 +- .../name/qualified/MessageSigNameNodeDel.java | 3 +- .../del/name/simple/AmbigNameNodeDel.java | 5 +- .../del/name/simple/RecVarNodeDel.java | 29 +- .../scribble/del/name/simple/RoleNodeDel.java | 3 +- .../src/main/java/org/scribble/lang/Lang.java | 2 - .../java/org/scribble/visit/AstVisitor.java | 13 +- .../java/org/scribble/visit/EnvVisitor.java | 103 ----- .../visit/InlinedProtocolUnfolder.java | 172 -------- .../visit/InlinedProtocolVisitor.java | 94 ----- .../visit/NoEnvInlinedProtocolVisitor.java | 32 -- .../visit/NoEnvOffsetSubprotocolVisitor.java | 32 -- .../visit/NoEnvSubprotocolVisitor.java | 32 -- .../scribble/visit/NoEnvUnfoldingVisitor.java | 32 -- .../visit/OffsetSubprotocolVisitor.java | 100 ----- .../scribble/visit/ProtocolDefInliner.java | 187 --------- .../scribble/visit/SubprotocolVisitor.java | 377 ------------------ .../java/org/scribble/visit/Substitutor.java | 2 +- .../org/scribble/visit/UnfoldingVisitor.java | 133 ------ .../scribble/visit/context/EGraphBuilder.java | 99 ----- .../visit/context/ModuleContextBuilder.java | 60 --- .../visit/context/ModuleContextVisitor.java | 4 +- .../context/ProjectedChoiceDoPruner.java | 110 ----- .../context/ProjectedChoiceSubjectFixer.java | 110 ----- .../visit/context/ProjectedRoleDeclFixer.java | 40 -- .../org/scribble/visit/context/Projector.java | 226 ----------- .../context/ProtocolDeclContextBuilder.java | 76 ---- .../scribble/visit/context/RecRemover.java | 64 --- .../UnguardedChoiceDoProjectionChecker.java | 129 ------ .../visit/context/env/ProjectionEnv.java | 61 --- .../context/env/UnguardedChoiceDoEnv.java | 105 ----- .../java/org/scribble/visit/env/DummyEnv.java | 36 -- .../main/java/org/scribble/visit/env/Env.java | 59 --- .../scribble/visit/env/InlineProtocolEnv.java | 56 --- .../org/scribble/visit/env/UnfoldingEnv.java | 85 ---- .../visit/util/MessageIdCollector.java | 42 -- .../scribble/visit/util/NameCollector.java | 64 --- .../scribble/visit/util/RecVarCollector.java | 53 --- .../scribble/visit/util/RoleCollector.java | 55 --- .../visit/validation/GProtocolValidator.java | 51 --- .../wf/DelegationProtocolRefChecker.java | 62 --- .../visit/wf/ExplicitCorrelationChecker.java | 83 ---- .../scribble/visit/wf/NameDisambiguator.java | 31 +- .../visit/wf/ReachabilityChecker.java | 79 ---- .../scribble/visit/wf/WFChoiceChecker.java | 119 ------ .../visit/wf/env/ExplicitCorrelationEnv.java | 85 ---- .../visit/wf/env/ReachabilityEnv.java | 105 ----- .../scribble/visit/wf/env/WFChoiceEnv.java | 249 ------------ .../java/sessionapi/SessionApiGenerator.java | 11 +- 134 files changed, 134 insertions(+), 7989 deletions(-) delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/EnvVisitor.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/ProtocolDefInliner.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/SubprotocolVisitor.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/UnfoldingVisitor.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/context/EGraphBuilder.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/context/Projector.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/context/RecRemover.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/context/env/UnguardedChoiceDoEnv.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/env/DummyEnv.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/env/Env.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/env/InlineProtocolEnv.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/env/UnfoldingEnv.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/util/MessageIdCollector.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/util/NameCollector.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/util/RecVarCollector.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/util/RoleCollector.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/validation/GProtocolValidator.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/wf/env/ExplicitCorrelationEnv.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java index db38405a0..3c8ac71d9 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -24,7 +24,6 @@ import org.scribble.ast.global.GDelegationElem; import org.scribble.ast.global.GDisconnect; import org.scribble.ast.global.GDo; -import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GInteractionSeq; import org.scribble.ast.global.GMessageTransfer; import org.scribble.ast.global.GProtocolBlock; @@ -32,6 +31,7 @@ import org.scribble.ast.global.GProtocolDef; import org.scribble.ast.global.GProtocolHeader; import org.scribble.ast.global.GRecursion; +import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GWrap; import org.scribble.ast.local.LAccept; import org.scribble.ast.local.LChoice; @@ -39,7 +39,6 @@ import org.scribble.ast.local.LDelegationElem; import org.scribble.ast.local.LDisconnect; import org.scribble.ast.local.LDo; -import org.scribble.ast.local.LSessionNode; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProjectionDecl; import org.scribble.ast.local.LProtocolBlock; @@ -50,6 +49,7 @@ import org.scribble.ast.local.LRecursion; import org.scribble.ast.local.LRequest; import org.scribble.ast.local.LSend; +import org.scribble.ast.local.LSessionNode; import org.scribble.ast.local.LWrapClient; import org.scribble.ast.local.LWrapServer; import org.scribble.ast.local.SelfRoleDecl; @@ -587,7 +587,7 @@ public LProjectionDecl LProjectionDecl(CommonTree source, // del extends that of LProtocolDecl { LProjectionDecl lpd = new LProjectionDecl(source, mods, header, def); - lpd = del(lpd, new LProjectionDeclDel(fullname, self)); + lpd = del(lpd, new LProjectionDeclDel());//fullname, self)); return lpd; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/MessageNode.java b/scribble-ast/src/main/java/org/scribble/ast/MessageNode.java index f0d9d55ef..6f00d8033 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/MessageNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/MessageNode.java @@ -23,6 +23,4 @@ public interface MessageNode extends NonRoleArgNode //MessageNode clone(AstFactory af); //Arg toArg(); // Not possible due to "diamond" with PayloadElemNameNode at AmbigNameNode - - MessageNode project(AstFactory af); // Not role sensitive // Factor into visitor/env pattern? Currently not } diff --git a/scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java b/scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java index 33591ba14..a9ae7ec9c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java @@ -73,14 +73,6 @@ public MessageSigNode visitChildren(AstVisitor nv) throws ScribException visitChild(getPayloadListChild(), nv); return reconstruct(op, pay); } - - @Override - public MessageNode project(AstFactory af) // Currently outside of visitor/env pattern - { - return af.MessageSigNode(this.source, getOpChild(), - getPayloadListChild().project(af)); - // Original del not retained by projection - } @Override public boolean isMessageSigNode() diff --git a/scribble-ast/src/main/java/org/scribble/ast/PayloadElem.java b/scribble-ast/src/main/java/org/scribble/ast/PayloadElem.java index 5ee02a979..7460c92f8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/PayloadElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/PayloadElem.java @@ -23,8 +23,6 @@ //public interface PayloadElem extends ScribNode public interface PayloadElem extends ScribNode { - PayloadElem project(AstFactory af); // Currently outside of visitor/env pattern (cf. MessageNode) - default boolean isGlobalDelegationElem() { return false; diff --git a/scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java b/scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java index 7c661bdb4..07e8cf76a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java @@ -69,12 +69,6 @@ public PayloadElemList visitChildren(AstVisitor nv) throws ScribException visitChildListWithClassEqualityCheck(this, getElementChildren(), nv); return reconstruct(elems); } - - protected PayloadElemList project(AstFactory af) - { - return af.PayloadElemList(this.source, getElementChildren().stream() - .map(pe -> pe.project(af)).collect(Collectors.toList())); - } public Payload toPayload() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java index 4b46c3407..3089c0df3 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java @@ -27,9 +27,12 @@ * This is the generic object from which all Scribble model objects * are derived. */ -// Part of core (not lang) -- core is coupled via source to ScribNode/CommonTree public interface ScribNode extends Tree { + @Override + ScribNode getParent(); + + //@Override -- super return isn't generic List getChildren(); //void setChildren(List children); // protected diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java index 39271bfed..24188eedf 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -66,6 +66,12 @@ public final CommonTree getSource() return this.source; } + @Override + public ScribNode getParent() + { + return (ScribNode) super.getParent(); + } + @Override public ScribNode getChild(int i) { @@ -96,8 +102,7 @@ protected void setChildren(List children) }); } - // FIXME: rework as ANTLR node (deep) copy (maybe "clone") -- no: ANTLR dupNode is node only copy (actually, dupNode is node "shell" only, doesn't even keep children, let alone copy them) - // FIXME TODO: rework children using ANTLR children + // CHECKME: rework as ANTLR node (deep) copy (maybe "clone") -- no: ANTLR dupNode is node only copy (actually, dupNode is node "shell" only, doesn't even keep children, let alone copy them) // N.B. does not copy children nor del // Should call Tree#dupNode constructor (i.e., children not dup'd) -- do not "return this" (unless childress), ends up with children duplicated (because node "dup'd" with children, then children added again) @Override @@ -135,11 +140,7 @@ public final ScribDel del() @Override public final ScribNodeBase del(ScribDel del) { - /*ScribNodeBase copy = copy(); - copy.del = del; - return copy;*/ ScribNodeBase clone = clone(); // Need full clone because parent field prevents immutable construction - //clone.del = del; clone.setDel(del); return clone; } @@ -154,9 +155,7 @@ public final void setDel(ScribDel del) // Defensive helper with cast check public static final T del(T n, ScribDel del) { - //ScribNodeBase copy = ((ScribNodeBase) n).copy(); ScribNodeBase copy = ((ScribNodeBase) n).clone(); // Need deep clone, since children have parent field - //copy.del = del; copy.setDel(del); return ScribNodeUtil.castNodeByClass(n, copy); } @@ -164,7 +163,7 @@ public static final T del(T n, ScribDel del) @Override public ScribNode accept(AstVisitor nv) throws ScribException { - return nv.visit(null, this); + return nv.visit(this); } @Override @@ -175,7 +174,7 @@ public ScribNode visitChildren(AstVisitor nv) throws ScribException protected ScribNode visitChild(ScribNode child, AstVisitor nv) throws ScribException { - return nv.visit(this, child); // cf. child.accept(nv) ? + return nv.visit(child); // cf. child.accept(nv) ? } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java index ca8f471f7..33bbfc454 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java @@ -82,12 +82,6 @@ public UnaryPayloadElem visitChildren(AstVisitor nv) return reconstruct(name); } - @Override - public UnaryPayloadElem project(AstFactory af) - { - return this; - } - @Override public PayloadElemType toPayloadType() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java index d2c5103f7..313d676fe 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java @@ -13,22 +13,15 @@ */ package org.scribble.ast.global; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.Choice; import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LChoice; -import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.Role; -import org.scribble.util.RuntimeScribException; -import org.scribble.util.ScribException; public class GChoice extends Choice implements GCompoundInteraction { @@ -58,49 +51,6 @@ public List getBlockChildren() .collect(Collectors.toList()); } - // Similar pattern to reconstruct - // Idea is, if extending the AST class (more fields), then reconstruct/project should also be extended (and called from extended del) - public LChoice project(AstFactory af, Role self, List blocks) - { - LChoice projection = null; // Individual GlobalInteractionNodes become null if not projected -- projected seqs and blocks are never null though - /*if (blocks.size() == 1) - { - if (!blocks.get(0).isEmpty()) // WF allows empty (blocks/seq are never null) - { - RoleNode subj = AstFactoryImpl.FACTORY.DummyProjectionRoleNode(); - projection = AstFactoryImpl.FACTORY.LChoice(subj, blocks); - } - } - else //if (blocks.size() > 1)*/ - blocks = blocks.stream().filter((b) -> !b.isEmpty()).collect(Collectors.toList()); - if (!blocks.isEmpty()) - { - RoleNode subj = getSubjectChild(); - // CHECKME: initially keep global subject, and later overwrite as necessary in projections? (algorithm currently checks for DUMMY) - RoleNode subj1 = self.equals(subj.toName()) - ? subj.clone()//af) - : af.DummyProjectionRoleNode(); - List cs = blocks.stream() - .map(b -> af.LChoice(this.source, subj1, Arrays.asList(b))) - .collect(Collectors.toList()); - // Hacky: keeping this.source for each LChoice (will end up as the source for the final merged LChoice) - LChoice merged = cs.get(0); - try - { - for (int i = 1; i < cs.size(); i++) - { - merged = merged.merge(af, cs.get(i)); // Merge currently does "nothing"; validation takes direct non-deterministic interpretation -- purpose of syntactic merge is to convert non-det to "equivalent" safe det in certain sitations - } - } - catch (ScribException e) // HACK - { - throw new RuntimeScribException(e); - } - projection = merged; - } - - return projection; - } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java index 6a887c26a..a34ca7d12 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java @@ -15,10 +15,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.PayloadElem; import org.scribble.ast.ScribNodeBase; -import org.scribble.ast.local.LDelegationElem; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Local; @@ -27,7 +25,6 @@ import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -import org.scribble.visit.context.Projector; // A "name pair" payload elem (current AST hierarchy induces this pattern), cf. UnaryPayloadElem (also differs in no parsing ambig against parameters) // The this.name will be global kind, but overall this node is local kind @@ -66,13 +63,6 @@ public GDelegationElem dupNode() { return new GDelegationElem(this); } - - @Override - public LDelegationElem project(AstFactory af) - { - return af.LDelegationElem(this.source, Projector.makeProjectedFullNameNode( - af, this.source, getProtocolChild().toName(), getRoleChild().toName())); - } @Override public boolean isGlobalDelegationElem() diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GMessageTransfer.java b/scribble-ast/src/main/java/org/scribble/ast/global/GMessageTransfer.java index f763f574e..96db89565 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GMessageTransfer.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GMessageTransfer.java @@ -13,22 +13,15 @@ */ package org.scribble.ast.global; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.MessageTransfer; -import org.scribble.ast.local.LSessionNode; -import org.scribble.ast.local.LScribNode; -import org.scribble.ast.local.LReceive; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.kind.RoleKind; -import org.scribble.core.type.name.Role; import org.scribble.util.Constants; public class GMessageTransfer extends MessageTransfer @@ -52,45 +45,6 @@ public GMessageTransfer dupNode() return new GMessageTransfer(this); } - public LScribNode project(AstFactory af, Role self) - { - RoleNode srcNode = getSourceChild(); - Role src = srcNode.toName(); - List dests = this.getDestinationRoles(); - LScribNode proj = null; - if (src.equals(self) || dests.contains(self)) - { - RoleNode srcNode1 = (RoleNode) af.SimpleNameNode(srcNode.getSource(), - RoleKind.KIND, src.toString()); // clone? - MessageNode msg = (MessageNode) - getMessageNodeChild().project(af); // CHECKME: need namespace prefix update? - List destNodes = - getDestinationChildren().stream() - .map(x -> (RoleNode) af.SimpleNameNode(x.getSource(), - RoleKind.KIND, x.toName().toString())) - .collect(Collectors.toList()); - if (src.equals(self)) - { - proj = af.LSend(this.source, srcNode1, msg, destNodes); - } - if (dests.contains(self)) - { - if (proj == null) - { - proj = af.LReceive(this.source, srcNode1, msg, destNodes); - } - else - { - LReceive lr = af.LReceive(this.source, srcNode1, msg, destNodes); - List lis = Arrays.asList( - new LSessionNode[]{(LSessionNode) proj, lr}); - proj = af.LInteractionSeq(this.source, lis); - } - } - } - return proj; - } - @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java b/scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java index 9378363ee..43658c202 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java @@ -13,20 +13,11 @@ */ package org.scribble.ast.local; -import java.util.Collections; -import java.util.Set; - import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; import org.scribble.util.Constants; -import org.scribble.util.RuntimeScribException; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LAccept extends LConnectionAction implements LSimpleSessionNode { @@ -48,33 +39,6 @@ public LAccept dupNode() return new LAccept(this); } - @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) - { - RoleNode src = getSourceChild(); - fixer.setChoiceSubject(src.toName()); - return src.toName(); - } - - @Override - public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribException - { - throw new RuntimeScribException("Invalid merge on LAccept: " + this); - } - - @Override - public boolean canMerge(LSessionNode ln) - { - return false; - } - - @Override - public Set getEnabling() - { - return Collections.emptySet(); - } - @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java b/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java index 566036ab8..93e784ed4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java @@ -13,22 +13,15 @@ */ package org.scribble.ast.local; -import java.util.LinkedList; import java.util.List; -import java.util.Set; import java.util.stream.Collectors; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.Choice; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LChoice extends Choice implements LCompoundInteraction { @@ -57,47 +50,6 @@ public List getBlockChildren() return cs.subList(1, cs.size()).stream().map(x -> (LProtocolBlock) x) .collect(Collectors.toList()); } - - // Pre: not inferring from a "continue X;" -- if choice is first statement in seq, continue must be guarded; if continue is not guarded, choice cannot be first statement in seq - @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) - { - return getBlockChildren().get(0).getInteractSeqChild() - .getInteractionChildren().get(0).inferLocalChoiceSubject(fixer); - } - - @Override - public LChoice merge(AstFactory af, LSessionNode ln) throws ScribException - { - if (!(ln instanceof LChoice) || !this.canMerge(ln)) - { - throw new ScribException("Cannot merge " + this.getClass() + " and " - + ln.getClass() + ": " + this + ", " + ln); - } - LChoice them = (LChoice) ln; - /*if (!this.subj.toName().equals(them.subj.toName())) // NO: pointless, always DummyProjectionRoleNode at this point -- maybe unnecessary? - { - throw new ScribbleException("Cannot merge choices for " + this.subj + " and " + them.subj + ": " + this + ", " + ln); - }*/ - List blocks = new LinkedList<>(); - getBlockChildren().forEach(b -> blocks.add(b.clone())); - them.getBlockChildren().forEach(b -> blocks.add(b.clone())); - return af.LChoice(this.source, getSubjectChild(), blocks); // Note: not reconstruct -- leave context building to post-projection passes - // FIXME: this.source - } - - @Override - public boolean canMerge(LSessionNode ln) - { - // Merge currently does "nothing"; validation takes direct non-deterministic interpretation -- purpose of syntactic merge is to convert non-det to "equivalent" safe det in certain sitations - return ln instanceof LChoice; - } - - @Override - public Set getEnabling() - { - return getBlockChildren().stream().flatMap((b) -> b.getEnabling().stream()).collect(Collectors.toSet()); - } diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java b/scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java index 854ace1a7..2bc8f3bd7 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java @@ -13,19 +13,11 @@ */ package org.scribble.ast.local; -import java.util.Collections; -import java.util.Set; - import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.Continue; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LContinue extends Continue implements LSimpleSessionNode { @@ -53,44 +45,6 @@ public LContinue clone() return (LContinue) super.clone(); } - @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) - { - //return new DummyProjectionRoleNode().toName(); // For e.g. rec X { 1() from A to B; choice at A { continue X; } or { 2() from A to B; } } - return fixer.createRecVarRole(getRecVarChild().toName()); // Never used? - //return null; - } - - @Override - public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribException - { - if (!(ln instanceof LContinue) || !this.canMerge(ln)) - { - throw new ScribException("Cannot merge " + this.getClass() + " and " - + ln.getClass() + ": " + this + ", " + ln); - } - LContinue them = ((LContinue) ln); - if (!getRecVarChild().equals(them.getRecVarChild())) - { - throw new ScribException("Cannot merge choices for " + getRecVarChild() - + " and " + them.getRecVarChild() + ": " + this + ", " + ln); - } - return clone(); - } - - @Override - public boolean canMerge(LSessionNode ln) - { - return ln instanceof LContinue; - } - - @Override - public Set getEnabling() - { - return Collections.emptySet(); - } - diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java b/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java index 55f13c0b3..09d966a34 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java @@ -13,22 +13,13 @@ */ package org.scribble.ast.local; -import java.util.HashSet; -import java.util.Set; - import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.DisconnectAction; import org.scribble.ast.MessageSigNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; import org.scribble.util.Constants; -import org.scribble.util.RuntimeScribException; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; // "left" of LDisconnect is used for self public class LDisconnect extends DisconnectAction @@ -60,41 +51,12 @@ public RoleNode getPeerChild() return getRightChild(); } - @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) - { - RoleNode src = getSelfChild(); - fixer.setChoiceSubject(src.toName()); - return src.toName(); - } - @Override public LDisconnect dupNode() { return new LDisconnect(this); } - @Override - public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribException - { - throw new RuntimeScribException("Invalid merge on LDisconnect: " + this); - } - - @Override - public boolean canMerge(LSessionNode ln) - { - return false; - } - - @Override - public Set getEnabling() - { - Set enab = new HashSet<>(); - //enab.add(this.msg.toMessage()); // Return empty to skip over this in LInteractionSeq - return enab; - } - @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java b/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java index b68c50c5a..0d2f1c2fd 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java @@ -13,13 +13,8 @@ */ package org.scribble.ast.local; -import java.util.Collections; -import java.util.Iterator; -import java.util.Set; - import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.Do; import org.scribble.ast.NonRoleArgList; import org.scribble.ast.RoleArgList; @@ -27,12 +22,7 @@ import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.LProtocolName; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; import org.scribble.lang.LangContext; -import org.scribble.util.RuntimeScribException; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LDo extends Do implements LSimpleSessionNode { @@ -60,47 +50,6 @@ public LDo dupNode() return new LDo(this); } - @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) - { - ModuleContext mc = fixer.getModuleContext(); - LangContext jc = fixer.lang.getContext(); - Role subj = getTargetProtocolDecl(jc, mc).getDefChild().getBlockChild() - .getInteractSeqChild().getInteractionChildren().get(0) - .inferLocalChoiceSubject(fixer); - // FIXME: need equivalent of (e.g) rec X { continue X; } pruning (cf GRecursion.prune) for irrelevant recursive-do (e.g. proto(A, B, C) { choice at A {A->B.do Proto(A,B,C)} or {A->B.B->C} })) - Iterator roleargs = getRoleListChild().getRoles().iterator(); - for (Role decl : getTargetProtocolDecl(jc, mc).getHeaderChild() - .getRoleDeclListChild().getRoles()) - { - Role arg = roleargs.next(); - if (decl.equals(subj)) - { - return arg; - } - } - throw new RuntimeException("Shouldn't get here: " + this); - } - - @Override - public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribException - { - throw new RuntimeScribException("Invalid merge on LDo: " + this); - } - - @Override - public boolean canMerge(LSessionNode ln) - { - return false; - } - - @Override - public Set getEnabling() - { - return Collections.emptySet(); - } - @Override public LProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) { diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LInteractionSeq.java b/scribble-ast/src/main/java/org/scribble/ast/local/LInteractionSeq.java index b9efa72a0..04dc30456 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LInteractionSeq.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LInteractionSeq.java @@ -13,16 +13,13 @@ */ package org.scribble.ast.local; -import java.util.Collections; import java.util.List; -import java.util.Set; import java.util.stream.Collectors; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.InteractionSeq; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.session.Message; public class LInteractionSeq extends InteractionSeq implements LScribNode { @@ -56,22 +53,6 @@ public boolean isLocal() { return true; } - - public Set getEnabling() - { - if (!this.isEmpty()) - { - for (LSessionNode ln : getInteractionChildren()) - { - Set enab = ln.getEnabling(); - if (!enab.isEmpty()) - { - return enab; - } - } - } - return Collections.emptySet(); - } diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java index 4261bcaa0..395f4e4cf 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java @@ -13,13 +13,10 @@ */ package org.scribble.ast.local; -import java.util.Set; - import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.ProtocolBlock; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.session.Message; public class LProtocolBlock extends ProtocolBlock implements LScribNode { @@ -53,16 +50,6 @@ public LInteractionSeq getInteractSeqChild() return (LInteractionSeq) getChild(0); } - public Set getEnabling() - { - return getInteractSeqChild().getEnabling(); - } - - public LProtocolBlock merge(LProtocolBlock lpb) - { - throw new RuntimeException("TODO: " + this + ", " + lpb); - } - diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LReceive.java b/scribble-ast/src/main/java/org/scribble/ast/local/LReceive.java index 382a3c8b8..6114bec8b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LReceive.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LReceive.java @@ -13,21 +13,13 @@ */ package org.scribble.ast.local; -import java.util.HashSet; import java.util.List; -import java.util.Set; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; import org.scribble.util.Constants; -import org.scribble.util.RuntimeScribException; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LReceive extends LMessageTransfer implements LSimpleSessionNode { @@ -49,35 +41,6 @@ public LReceive dupNode() return new LReceive(this); } - @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) - { - RoleNode src = this.getSourceChild(); - fixer.setChoiceSubject(src.toName()); - return src.toName(); - } - - @Override - public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribException - { - throw new RuntimeScribException("Invalid merge on LReceive: " + this); - } - - @Override - public boolean canMerge(LSessionNode ln) - { - return false; - } - - @Override - public Set getEnabling() - { - Set enab = new HashSet<>(); - enab.add(getMessageNodeChild().toMessage()); - return enab; - } - @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java b/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java index c949b182f..6923299fc 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java @@ -13,18 +13,11 @@ */ package org.scribble.ast.local; -import java.util.Set; - import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.Recursion; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LRecursion extends Recursion implements LCompoundInteraction { @@ -52,49 +45,6 @@ public LProtocolBlock getBlockChild() return (LProtocolBlock) getChild(1); } - @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) - { - //fixer.pushRec(this.recvar.toName()); - return getBlockChild().getInteractSeqChild().getInteractionChildren() - .get(0).inferLocalChoiceSubject(fixer); - } - - @Override - public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribException - { - if (!(ln instanceof LRecursion) || !this.canMerge(ln)) - { - throw new ScribException("Cannot merge " + getClass() + " and " - + ln.getClass() + ": " + this + ", " + ln); - } - LRecursion them = ((LRecursion) ln); - if (!getRecVarChild().toName() - .equals(them.getRecVarChild().toName())) - { - throw new ScribException( - "Cannot merge recursions for " + getRecVarChild() + " and " - + them.getRecVarChild() + ": " + this + ", " + ln); - } - return af.LRecursion(this.source, getRecVarChild().clone(),//af), - getBlockChild().merge(them.getBlockChild())); - // Not reconstruct: leave context building to post-projection passes - // HACK: this source - } - - @Override - public boolean canMerge(LSessionNode ln) - { - return ln instanceof LRecursion; - } - - @Override - public Set getEnabling() - { - return getBlockChild().getEnabling(); - } - diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java b/scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java index 1bf410549..d5c9a4bb2 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java @@ -13,20 +13,11 @@ */ package org.scribble.ast.local; -import java.util.Collections; -import java.util.Set; - import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; import org.scribble.util.Constants; -import org.scribble.util.RuntimeScribException; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LRequest extends LConnectionAction implements LSimpleSessionNode { @@ -48,33 +39,6 @@ public LRequest dupNode() return new LRequest(this); } - // Could make a LMessageTransfer to factor this out with LReceive - @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) - { - return getSourceChild().toName(); - //throw new RuntimeException("TODO: " + this); - } - - @Override - public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribException - { - throw new RuntimeScribException("Invalid merge on LRequest: " + this); - } - - @Override - public boolean canMerge(LSessionNode ln) - { - return false; - } - - @Override - public Set getEnabling() - { - return Collections.emptySet(); - } - @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java index a281ede07..7c9e95ff8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java @@ -13,22 +13,14 @@ */ package org.scribble.ast.local; -import java.util.Collections; import java.util.List; -import java.util.Set; import java.util.stream.Collectors; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; import org.scribble.util.Constants; -import org.scribble.util.RuntimeScribException; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LSend extends LMessageTransfer implements LSimpleSessionNode // Explicitly needed here for getKind @@ -51,32 +43,6 @@ public LSend dupNode() return new LSend(this); } - // Could make a LMessageTransfer to factor this out with LReceive - @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) - { - return getSourceChild().toName(); - } - - @Override - public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribException - { - throw new RuntimeScribException("Invalid merge on LSend: " + this); - } - - @Override - public boolean canMerge(LSessionNode ln) - { - return false; - } - - @Override - public Set getEnabling() - { - return Collections.emptySet(); - } - @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java index a5bd11504..ac4cacb3b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java @@ -13,24 +13,11 @@ */ package org.scribble.ast.local; -import java.util.Set; - -import org.scribble.ast.AstFactory; import org.scribble.ast.SessionNode; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -// Alternatively to interface, use GlobalNode subclass with delegation to "super" base (e.g. Choice) classes +// Alternatively to interface, use GNode subclass with delegation to "super" base (e.g. Choice) classes public interface LSessionNode extends SessionNode, LScribNode { - Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer); - - // "merge" currently does "nothing"; validation takes direct non-deterministic interpretation -- purpose of syntactic merge would be to convert non-det to "equivalent" safe det in certain sitations - LSessionNode merge(AstFactory af, LSessionNode ln) throws ScribException; - boolean canMerge(LSessionNode ln); - - Set getEnabling(); + } diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java index 634a8cc57..0ff7633c4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java @@ -13,20 +13,11 @@ */ package org.scribble.ast.local; -import java.util.Collections; -import java.util.Set; - import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.MessageSigNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; import org.scribble.util.Constants; -import org.scribble.util.RuntimeScribException; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LWrapClient extends LConnectionAction implements LSimpleSessionNode @@ -49,33 +40,6 @@ public LWrapClient dupNode() return new LWrapClient(this); } - // Could make a LMessageTransfer to factor this out with LReceive - @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) - { - return getSourceChild().toName(); - //throw new RuntimeException("TODO: " + this); - } - - @Override - public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribException - { - throw new RuntimeScribException("Invalid merge on LWrapClient: " + this); - } - - @Override - public boolean canMerge(LSessionNode ln) - { - return false; - } - - @Override - public Set getEnabling() - { - return Collections.emptySet(); - } - @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java index 3b3788ec3..fc2cfc286 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java @@ -13,20 +13,11 @@ */ package org.scribble.ast.local; -import java.util.Collections; -import java.util.Set; - import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.MessageSigNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; import org.scribble.util.Constants; -import org.scribble.util.RuntimeScribException; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LWrapServer extends LConnectionAction implements LSimpleSessionNode { @@ -48,32 +39,6 @@ public LWrapServer dupNode() return new LWrapServer(this); } - @Override - public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) - { - fixer.setChoiceSubject(getSourceChild().toName()); - return getSourceChild().toName(); - } - - @Override - public LSessionNode merge(AstFactory af, LSessionNode ln) - throws ScribException - { - throw new RuntimeScribException("Invalid merge on LWrapServer: " + this); - } - - @Override - public boolean canMerge(LSessionNode ln) - { - return false; - } - - @Override - public Set getEnabling() - { - return Collections.emptySet(); - } - @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java index 2fe3921d8..8f3336b63 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java @@ -15,7 +15,6 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.MessageSigName; @@ -41,12 +40,6 @@ public MessageSigNameNode dupNode() return new MessageSigNameNode(this);//, getElements()); } - @Override - public MessageNode project(AstFactory af) - { - return this; - } - @Override public MessageSigName toName() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index 83a284fed..da5d19945 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -15,7 +15,6 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.name.PayloadElemNameNode; import org.scribble.core.type.kind.AmbigKind; @@ -59,12 +58,6 @@ public String getText() return super.getText(); }*/ - @Override - public MessageNode project(AstFactory af) - { - throw new RuntimeException("Shouldn't get in here: " + this); - } - @Override public Arg toArg() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java index ee072ea9a..cf1cef991 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java @@ -14,7 +14,6 @@ package org.scribble.ast.name.simple; import org.antlr.runtime.Token; -import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.MessageSigNode; import org.scribble.core.type.kind.SigKind; @@ -46,12 +45,6 @@ public SigParamNode dupNode() return new SigParamNode(this);//, getIdentifier()); } - @Override - public SigParamNode project(AstFactory af) // MessageSigName params - { - return this; - } - @Override public MessageSigNode substituteNames(Substitutor subs) { diff --git a/scribble-ast/src/main/java/org/scribble/del/ChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/ChoiceDel.java index 8b192bb8e..c59dc1b86 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ChoiceDel.java @@ -13,58 +13,10 @@ */ package org.scribble.del; -import java.util.List; -import java.util.stream.Collectors; - -import org.scribble.ast.Choice; -import org.scribble.ast.ScribNode; -import org.scribble.util.ScribException; -import org.scribble.visit.InlinedProtocolUnfolder; -import org.scribble.visit.env.UnfoldingEnv; -import org.scribble.visit.wf.ExplicitCorrelationChecker; -import org.scribble.visit.wf.env.ExplicitCorrelationEnv; - public abstract class ChoiceDel extends CompoundInteractionDel { public ChoiceDel() { } - - @Override - public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf) throws ScribException - { - UnfoldingEnv env = unf.peekEnv().enterContext(); - env = env.pushChoiceParent(); // Above is already a copy, but fine - unf.pushEnv(env); - } - - @Override - public Choice leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) throws ScribException - { - Choice cho = (Choice) visited; - List benvs = - cho.getBlockChildren().stream().map((b) -> (UnfoldingEnv) b.del().env()).collect(Collectors.toList()); - UnfoldingEnv merged = unf.popEnv().mergeContexts(benvs); - unf.pushEnv(merged); - return (Choice) super.leaveInlinedProtocolUnfolding(parent, child, unf, visited); // Done merge of children here, super does merge into parent - } - - @Override - public void enterExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker) throws ScribException - { - ExplicitCorrelationEnv env = checker.peekEnv().enterContext(); - checker.pushEnv(env); - } - - @Override - public Choice leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribException - { - Choice cho = (Choice) visited; - List benvs = - cho.getBlockChildren().stream().map((b) -> (ExplicitCorrelationEnv) b.del().env()).collect(Collectors.toList()); - ExplicitCorrelationEnv merged = checker.popEnv().mergeContexts(benvs); - checker.pushEnv(merged); - return (Choice) super.leaveExplicitCorrelationCheck(parent, child, checker, visited); // Done merge of children here, super does merge into parent - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/CompoundInteractionDel.java b/scribble-ast/src/main/java/org/scribble/del/CompoundInteractionDel.java index 32a57013c..c0ed0827d 100644 --- a/scribble-ast/src/main/java/org/scribble/del/CompoundInteractionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/CompoundInteractionDel.java @@ -13,113 +13,10 @@ */ package org.scribble.del; -import org.scribble.ast.CompoundInteraction; -import org.scribble.ast.ScribNode; -import org.scribble.util.ScribException; -import org.scribble.visit.InlinedProtocolUnfolder; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; -import org.scribble.visit.context.env.UnguardedChoiceDoEnv; -import org.scribble.visit.env.UnfoldingEnv; -import org.scribble.visit.wf.ExplicitCorrelationChecker; -import org.scribble.visit.wf.WFChoiceChecker; -import org.scribble.visit.wf.env.ExplicitCorrelationEnv; -import org.scribble.visit.wf.env.WFChoiceEnv; - public abstract class CompoundInteractionDel extends CompoundSessionNodeDel implements InteractionNodeDel { public CompoundInteractionDel() { } - - @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribException - { - ScribDelBase.pushVisitorEnv(this, inl); - } - - @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribException - { - return ScribDelBase.popAndSetVisitorEnv(this, inl, visited); - } - - // In the following only leaves are overridden to do additional merging -- enters remain as for super by default - // Specialised enters will be overridden per node (e.g., GChoiceDel.enterInlinedWFChoiceCheck) -- corresponding leaves will use their super (i.e., the below) to do merging - - // Should only do for projections, but OK here (visitor only run on projections) - @Override - public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribException - { - // Override super routine (in CompoundInteractionDel, which just does base popAndSet) to do merging of child context into parent context - UnguardedChoiceDoEnv visited_env = checker.popEnv(); // popAndSet current - setEnv(visited_env); - UnguardedChoiceDoEnv parent_env = checker.popEnv(); // pop-merge-push parent - parent_env = parent_env.mergeContext(visited_env); - checker.pushEnv(parent_env); - return (CompoundInteraction) visited; - } - - @Override - public ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) throws ScribException - { - // Override super routine (in CompoundInteractionDel, which just does base popAndSet) to do merging of child context into parent context - // Need to further override for "compound" nodes with block children, e.g., Choice/RecursionDel, to merge children together and then into current (then call here via super to set and merge current into parent) - UnfoldingEnv visited_env = unf.popEnv(); // popAndSet current - setEnv(visited_env); - UnfoldingEnv parent_env = unf.popEnv(); // pop-merge-push parent - parent_env = parent_env.mergeContext(visited_env); - unf.pushEnv(parent_env); - return (CompoundInteraction) visited; - } - - @Override - public CompoundInteraction leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribException - { - WFChoiceEnv visited_env = checker.popEnv(); // popAndSet current - setEnv(visited_env); - WFChoiceEnv parent_env = checker.popEnv(); // pop-merge-push parent - parent_env = parent_env.mergeContext(visited_env); - checker.pushEnv(parent_env); - return (CompoundInteraction) visited; - } - - @Override - public ScribNode leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribException - { - // Override super routine (in CompoundInteractionDel, which just does base popAndSet) to do merging of child context into parent context - // Need to further override for "multi-compound" nodes, e.g., ChoiceDel - ExplicitCorrelationEnv visited_env = checker.popEnv(); // popAndSet current - setEnv(visited_env); - ExplicitCorrelationEnv parent_env = checker.popEnv(); // pop-merge-push parent - parent_env = parent_env.mergeContext(visited_env); - checker.pushEnv(parent_env); - return (CompoundInteraction) visited; - } - - /*@Override - public void enterWFChoicePathCheck(ScribNode parent, ScribNode child, WFChoicePathChecker coll) throws ScribbleException - { - WFChoicePathEnv env = coll.peekEnv().enterContext(); - env = env.clear(); - coll.pushEnv(env); - }*/ - - /*@Override - public CompoundInteractionNode leaveWFChoicePathCheck(ScribNode parent, ScribNode child, WFChoicePathChecker coll, ScribNode visited) throws ScribbleException - //public CompoundInteractionNode leavePathCollection(ScribNode parent, ScribNode child, PathCollectionVisitor coll, ScribNode visited) throws ScribbleException - { - WFChoicePathEnv visited_env = coll.popEnv(); // popAndSet current - setEnv(visited_env); - WFChoicePathEnv parent_env = coll.popEnv(); // pop-merge-push parent - parent_env = parent_env.mergeContext(visited_env); - coll.pushEnv(parent_env); - - /*System.out.println("3: " + parent_env.getPaths().size()); - System.out.println("4: " + parent_env.getPaths() + ""); - System.out.println("4: " + visited + "\n");* / - - return (CompoundInteractionNode) visited; - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/CompoundSessionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/CompoundSessionNodeDel.java index 473f0d842..b2da33198 100644 --- a/scribble-ast/src/main/java/org/scribble/del/CompoundSessionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/CompoundSessionNodeDel.java @@ -13,13 +13,6 @@ */ package org.scribble.del; -import org.scribble.ast.ScribNode; -import org.scribble.util.ScribException; -import org.scribble.visit.InlinedProtocolUnfolder; -import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; -import org.scribble.visit.wf.ExplicitCorrelationChecker; -import org.scribble.visit.wf.WFChoiceChecker; - // For CompoundInteractionNode and ProtocolBlock public abstract class CompoundSessionNodeDel extends ScribDelBase { @@ -27,58 +20,4 @@ public CompoundSessionNodeDel() { } - - // Should only do for projections, but OK here (visitor only run on projections) - @Override - public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker) throws ScribException - { - ScribDelBase.pushVisitorEnv(this, checker); - } - - // Should only do for projections, but OK here (visitor only run on projections) - @Override - public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribException - { - // Overridden in CompoundInteractionNodeDel to do merging of child context into parent context - return ScribDelBase.popAndSetVisitorEnv(this, checker, visited); - } - - @Override - public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf) throws ScribException - { - ScribDelBase.pushVisitorEnv(this, unf); - } - - @Override - public ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) throws ScribException - { - // Overridden in CompoundInteractionNodeDel to do merging of child context into parent context - return ScribDelBase.popAndSetVisitorEnv(this, unf, visited); - } - - @Override - public void enterInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker) throws ScribException - { - ScribDelBase.pushVisitorEnv(this, checker); - } - - @Override - public ScribNode leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribException - { - // Overridden in CompoundInteractionNodeDel to do merging of child context into parent context - return ScribDelBase.popAndSetVisitorEnv(this, checker, visited); - } - - @Override - public void enterExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker) throws ScribException - { - ScribDelBase.pushVisitorEnv(this, checker); - } - - @Override - public ScribNode leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribException - { - // Overridden in CompoundInteractionNodeDel to do merging of child context into parent context - return ScribDelBase.popAndSetVisitorEnv(this, checker, visited); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java b/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java index 165b60b9d..59eb02734 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java @@ -13,14 +13,6 @@ */ package org.scribble.del; -import org.scribble.ast.ConnectAction; -import org.scribble.ast.ScribNode; -import org.scribble.util.ScribException; -import org.scribble.visit.InlinedProtocolUnfolder; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.env.UnfoldingEnv; -import org.scribble.visit.util.RoleCollector; - // TODO: factor with MessageTransferDel public abstract class ConnectionActionDel extends SimpleSessionNodeDel { @@ -28,82 +20,4 @@ public ConnectionActionDel() { } - - @Override - public ConnectAction leaveProtocolInlining(ScribNode parent, - ScribNode child, ProtocolDefInliner inl, ScribNode visited) - throws ScribException - { - ConnectAction c = (ConnectAction) visited; - ConnectAction inlined = (ConnectAction) c.clone();//inl.job.af); - inl.pushEnv(inl.popEnv().setTranslation(inlined)); - return (ConnectAction) super.leaveProtocolInlining(parent, child, inl, c); - } - - @Override - public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, - InlinedProtocolUnfolder unf) throws ScribException - { - UnfoldingEnv env = unf.popEnv(); - env = env.disableUnfold(); - unf.pushEnv(env); - } - - @Override - public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, - RoleCollector coll, ScribNode visited) - { - ConnectAction c = (ConnectAction) visited; - coll.addName(c.getSourceChild().toName()); - coll.addName(c.getDestinationChild().toName()); - return visited; - } - - - - - - - - - - - - - - - - - - - /*@Override - public ScribNode leaveMessageIdCollection(ScribNode parent, ScribNode child, MessageIdCollector coll, ScribNode visited) - { - Connect c = (Connect) visited; - if (c.msg.isMessageSigNode() || c.msg.isMessageSigNameNode()) - { - coll.addName((MessageId) c.msg.toMessage().getId()); - } - else - { - throw new RuntimeException("Shouldn't get in here: " + c.msg); - } - return visited; - }*/ - - /*@Override - public ScribNode leaveEnablingMessageCollection(ScribNode parent, ScribNode child, EnablingMessageCollector coll, ScribNode visited) - { - Connect mt = (Connect) visited; - coll.addEnabling(mt.src.toName(), mt.getDestinations().get(0).toName(), mt.msg.toMessage().getId()); // FIXME: multicast - return visited; - }*/ - - /*@Override - public void enterChoiceUnguardedSubprotocolCheck(ScribNode parent, ScribNode child, ChoiceUnguardedSubprotocolChecker checker) throws ScribbleException - { - ChoiceUnguardedSubprotocolEnv env = checker.popEnv(); - env = env.disablePrune(); - checker.pushEnv(env); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/ContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/ContinueDel.java index a99116e1d..e7fbb67ce 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ContinueDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ContinueDel.java @@ -13,58 +13,10 @@ */ package org.scribble.del; -import org.scribble.ast.Continue; -import org.scribble.ast.Recursion; -import org.scribble.ast.ScribNode; -import org.scribble.core.type.name.RecVar; -import org.scribble.util.ScribException; -import org.scribble.visit.InlinedProtocolUnfolder; -import org.scribble.visit.util.RecVarCollector; - public abstract class ContinueDel extends SimpleSessionNodeDel { public ContinueDel() { } - - /*@Override - public Continue leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException - { - Continue c = (Continue) visited; - Continue inlined = (Continue) c.clone(); - inl.pushEnv(inl.popEnv().setTranslation(inlined)); - return (Continue) super.leaveProtocolInlining(parent, child, inl, c); - }*/ - - @Override - public ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, - ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) - throws ScribException - { - Continue cont = (Continue) visited; - RecVar rv = cont.getRecVarChild().toName(); - if (unf.isContinueUnguarded(rv)) // Without this, graph building becomes sensitive to the order of choice blocks (specifically, the relative position where the side effect (re-set entry to rec state) of an unguarded continue is performed) - { - Recursion tmp = unf.getRecVar(rv); - if (tmp == null) // Hacky? for recursive unfolding of cached blocks - { - return cont; - } - return unf.getRecVar(rv).clone();//unf.job.af); - } - else if (unf.shouldUnfoldForUnguardedRec(rv)) - { - return unf.getRecVar(rv).clone();//unf.job.af); - } - return cont; - } - - @Override - public ScribNode leaveRecVarCollection(ScribNode parent, ScribNode child, - RecVarCollector coll, ScribNode visited) throws ScribException - { - coll.removeName(((Continue) visited).getRecVarChild().toName()); - return visited; - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java index 8e06a42df..ea62540ef 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java @@ -37,9 +37,10 @@ public DoArgListDel() // Doing in leave allows the arguments to be individually checked first @Override - public DoArgList leaveDisambiguation(ScribNode parent, ScribNode child, + public DoArgList leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { + ScribNode parent = child.getParent(); DoArgList dal = (DoArgList) visited; List args = dal.getArgChildren(); ProtocolDecl pd = getTargetProtocolDecl((Do) parent, disamb); diff --git a/scribble-ast/src/main/java/org/scribble/del/DoDel.java b/scribble-ast/src/main/java/org/scribble/del/DoDel.java index edc3762c8..7399d4fe7 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoDel.java @@ -16,15 +16,10 @@ import org.scribble.ast.Do; import org.scribble.ast.ScribNode; import org.scribble.ast.name.qualified.ProtocolNameNode; -import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.ProtocolName; -import org.scribble.core.type.name.Role; -import org.scribble.lang.LangContext; import org.scribble.util.ScribException; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.ProtocolDeclContextBuilder; import org.scribble.visit.wf.NameDisambiguator; public abstract class DoDel extends SimpleSessionNodeDel @@ -35,8 +30,8 @@ public DoDel() } @Override - public void enterDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb) throws ScribException + public void enterDisambiguation(ScribNode child, NameDisambiguator disamb) + throws ScribException { ModuleContext mc = disamb.getModuleContext(); Do doo = (Do) child; @@ -50,10 +45,10 @@ public void enterDisambiguation(ScribNode parent, ScribNode child, } @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + public ScribNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { - return leaveDisambiguationAux(parent, child, disamb, visited); + return leaveDisambiguationAux(child, disamb, visited); // To introduce type parameter } @@ -61,7 +56,7 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, // Not done in G/LProtocolNameNodeDel because it's only for do-targets that this is needed (cf. ProtocolHeader) // TODO: refactor into G/LDoDel to bypass generic cast issues private ScribNode leaveDisambiguationAux( - ScribNode parent, ScribNode child, NameDisambiguator disamb, + ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { @SuppressWarnings("unchecked") // Doesn't matter what K is, just need to propagate it down @@ -75,54 +70,19 @@ private ScribNode leaveDisambiguationAux( .QualifiedNameNode(proto.getSource(), fullname.getKind(), fullname.getElements());*/ - // FIXME: refactor, make an AST node and set its children -- rework AstFactory? - // FIXME: issue is to make an AST node, need a Token (but those are mainly obtained by parsing only) + // CHECKME: refactor, make an AST node and set its children -- rework AstFactory? + // CHECKME: issue is to make an AST node, need a Token (but those are mainly obtained by parsing only) /*pnn = (ProtocolNameNode) new GProtocolNameNode(proto.token); pnn.addChildren(proto.getChildren());*/ /*pnn = (ProtocolNameNode) proto.dupNode(); // Token and start/stopIndex pnn.addChildren(Arrays.asList(fullname.getElements()).stream().map(x -> new AmbigNameNode(new Token(arg0, arg1))));*/ pnn = proto; - /*(fullname.getKind().equals(Global.KIND) ? - new GProtocolNameNode(proto.getSource(), fullname.getElements()) : - new LProtocolNameNode(proto.getSource(), fullname.getElements()) - );*/ //HERE either hack Token to make new AST node, or redo proto context building on intermed -- consideration is projection output a la parsed AST subprotos, or from (inlined?) intermed // probably hack Token for now -- or just skip protocol context building (do inlning and WF/valid first) - // Didn't keep original namenode del + // Didn't keep original namenode del -- ? return doo.reconstruct(doo.getRoleListChild(), doo.getNonRoleListChild(), pnn); } - - @Override - public Do leaveProtocolDeclContextBuilding(ScribNode parent, - ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) - throws ScribException - { - LangContext jcontext = builder.lang.getContext(); - ModuleContext mcontext = builder.getModuleContext(); - Do doo = (Do) visited; - ProtocolName pn = doo.getProtocolNameNode().toName(); // leaveDisambiguation has fully qualified the target name - doo.getRoleListChild().getRoles() - .forEach(r -> addProtocolDependency(builder, r, pn, - doo.getTargetRoleParameter(jcontext, mcontext, r))); - return doo; - } - - protected abstract void addProtocolDependency( - ProtocolDeclContextBuilder builder, Role self, ProtocolName proto, - Role target); - - @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl) throws ScribException - { - super.enterProtocolInlining(parent, child, inl); - if (!inl.isCycle()) - { - SubprotoSig subsig = inl.peekStack(); // SubprotocolVisitor has already entered subprotocol - inl.setSubprotocolRecVar(subsig); - } - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java b/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java index f602364dd..1af921584 100644 --- a/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java @@ -30,13 +30,17 @@ public HeaderParamDeclListDel() // Doing in leave allows the arguments to be individually checked first @Override - public HeaderParamDeclList leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException + public HeaderParamDeclList leaveDisambiguation(ScribNode child, + NameDisambiguator disamb, ScribNode visited) throws ScribException { HeaderParamDeclList pdl = (HeaderParamDeclList) visited; - List> decls = pdl.getParamDeclChildren(); // grammar enforces RoleDeclList size > 0 - if (decls.size() != decls.stream().map((d) -> d.getDeclName()).distinct().count()) + List> decls = pdl.getParamDeclChildren(); + // grammar enforces RoleDeclList size > 0 + if (decls.size() != decls.stream().map((d) -> d.getDeclName()).distinct() + .count()) { - throw new ScribException(pdl.getSource(), "Duplicate header decls: " + pdl); + throw new ScribException(pdl.getSource(), + "Duplicate header decls: " + pdl); } return pdl; } diff --git a/scribble-ast/src/main/java/org/scribble/del/InteractionSeqDel.java b/scribble-ast/src/main/java/org/scribble/del/InteractionSeqDel.java index 4471fd256..23cd02548 100644 --- a/scribble-ast/src/main/java/org/scribble/del/InteractionSeqDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/InteractionSeqDel.java @@ -13,15 +13,7 @@ */ package org.scribble.del; -import org.scribble.ast.ScribNode; -import org.scribble.util.ScribException; -import org.scribble.visit.ProtocolDefInliner; - public abstract class InteractionSeqDel extends ScribDelBase { - @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribException - { - ScribDelBase.pushVisitorEnv(this, inl); - } + } diff --git a/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java index 6f0d2e589..08da87cfc 100644 --- a/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java @@ -13,124 +13,10 @@ */ package org.scribble.del; - -import org.scribble.ast.MessageNode; -import org.scribble.ast.MessageSigNode; -import org.scribble.ast.MessageTransfer; -import org.scribble.ast.PayloadElem; -import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GDelegationElem; -import org.scribble.core.type.name.MessageId; -import org.scribble.del.global.GDelegationElemDel; -import org.scribble.util.ScribException; -import org.scribble.visit.InlinedProtocolUnfolder; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.ProtocolDeclContextBuilder; -import org.scribble.visit.env.UnfoldingEnv; -import org.scribble.visit.util.MessageIdCollector; -import org.scribble.visit.util.RoleCollector; - public abstract class MessageTransferDel extends SimpleSessionNodeDel { public MessageTransferDel() { } - - @Override - public MessageTransfer leaveProtocolInlining(ScribNode parent, - ScribNode child, ProtocolDefInliner inl, ScribNode visited) - throws ScribException - { - MessageTransfer lr = (MessageTransfer) visited; - MessageTransfer inlined = (MessageTransfer) lr.clone();//inl.job.af); - inl.pushEnv(inl.popEnv().setTranslation(inlined)); - return (MessageTransfer) super.leaveProtocolInlining(parent, child, inl, lr); - } - - /*@Override - public void enterChoiceUnguardedSubprotocolCheck(ScribNode parent, ScribNode child, ChoiceUnguardedSubprotocolChecker checker) throws ScribbleException - { - ChoiceUnguardedSubprotocolEnv env = checker.popEnv(); - env = env.disablePrune(); - checker.pushEnv(env); - }*/ - - @Override - public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, - InlinedProtocolUnfolder unf) throws ScribException - { - UnfoldingEnv env = unf.popEnv(); - env = env.disableUnfold(); - unf.pushEnv(env); - } - - @Override - public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, - RoleCollector coll, ScribNode visited) - { - MessageTransfer mt = (MessageTransfer) visited; - coll.addName(mt.getSourceChild().toName()); - mt.getDestinationRoles().stream().forEach(rd -> coll.addName(rd)); - return visited; - } - - @Override - public ScribNode leaveMessageIdCollection(ScribNode parent, ScribNode child, - MessageIdCollector coll, ScribNode visited) - { - MessageTransfer mt = (MessageTransfer) visited; - MessageNode msg = mt.getMessageNodeChild(); - if (msg.isMessageSigNode() || msg.isMessageSigNameNode()) - { - coll.addName((MessageId) msg.toMessage().getId()); - } - else - { - throw new RuntimeException("Shouldn't get in here: " + msg); - } - return visited; - } - - @Override - public MessageTransfer leaveProtocolDeclContextBuilding(ScribNode parent, - ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) - throws ScribException - { - MessageTransfer mt = (MessageTransfer) visited; - MessageNode msg = mt.getMessageNodeChild(); - if (msg.isMessageSigNode()) - { - for (PayloadElem pe : ((MessageSigNode) msg).getPayloadListChild() - .getElementChildren()) - { - if (pe.isGlobalDelegationElem()) // TODO: should always be GMessageTransfer - { - ((GDelegationElemDel) pe.del()) - .leaveMessageTransferInProtocolDeclContextBuilding(mt, - (GDelegationElem) pe, builder); - } - } - } - return mt; - } - - - - - - - - - - - - - /*@Override - public ScribNode leaveEnablingMessageCollection(ScribNode parent, ScribNode child, EnablingMessageCollector coll, ScribNode visited) - { - MessageTransfer mt = (MessageTransfer) visited; - coll.addEnabling(mt.src.toName(), mt.getDestinations().get(0).toName(), mt.msg.toMessage().getId()); // FIXME: multicast - return visited; - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java b/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java index 439746a1d..c2223f68a 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java @@ -13,73 +13,29 @@ */ package org.scribble.del; -import java.util.Arrays; import java.util.Collection; import java.util.HashSet; -import java.util.LinkedList; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.ImportDecl; import org.scribble.ast.Module; -import org.scribble.ast.ModuleDecl; import org.scribble.ast.NonProtocolDecl; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ast.local.LProtocolDecl; -import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.core.lang.context.ModuleContext; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.LProtocolName; -import org.scribble.core.type.name.Role; import org.scribble.util.ScribException; -import org.scribble.visit.context.ModuleContextBuilder; -import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; public class ModuleDel extends ScribDelBase { - private ModuleContext mcontext; - public ModuleDel() { } - - private ModuleDel copy() - { - return new ModuleDel(); - } - - @Override - public void enterModuleContextBuilding(ScribNode parent, ScribNode child, - ModuleContextBuilder builder) throws ScribException - { - builder.setModuleContext( - //new ModuleContext(builder.job.getContext().getParsed(), (Module) child) - builder.maker.build(builder.lang.getContext().getParsed(), (Module) child) - ); - // ModuleContext building is done solely by "new ModuleContext" (no deeper visiting needed) - // The only thing ModuleContextBuilder really does is to set the ModuleContext in ModuleDel - // FIXME: obtain from MainContext instead of creating on entry by this visitor - } - - // Maybe better to create on enter, so can be used during the context build pass (Context would need to be "cached" in the visitor to be accessed) - @Override - public Module leaveModuleContextBuilding(ScribNode parent, ScribNode child, - ModuleContextBuilder builder, ScribNode visited) throws ScribException - { - ModuleDel del = setModuleContext(builder.getModuleContext()); - return (Module) visited.del(del); - } @Override - public Module leaveDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb, ScribNode visited) throws ScribException + public Module leaveDisambiguation(ScribNode child, NameDisambiguator disamb, + ScribNode visited) throws ScribException { Module mod = (Module) visited; // Imports checked in ModuleContext -- that is built before disamb is run @@ -89,7 +45,6 @@ public Module leaveDisambiguation(ScribNode parent, ScribNode child, .collect(Collectors.toList()); // Have to use Strings, as can be different kinds (datatype, sig) final Set dups1 = getDuplicates(npdnames); - //if (npds.size() != npdnames.stream().distinct().count()) if (!dups1.isEmpty()) { NonProtocolDecl first = @@ -124,8 +79,7 @@ public Module leaveDisambiguation(ScribNode parent, ScribNode child, private static Set getDuplicates(Collection ss) { Set uniques = new HashSet<>(); - Set - dups = new HashSet<>(); + Set dups = new HashSet<>(); for (String npd : ss) { if (!uniques.add(npd)) @@ -135,82 +89,4 @@ private static Set getDuplicates(Collection ss) } return dups; } - - @Override - public Module leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) - { - //proj.job.getJobContext().addProjections(proj.getProjections()); - /*Map> res = new HashMap<>(); - for (Entry> e : proj.getProjections() - .entrySet()) - { - Map tmp = e.getValue().entrySet().stream() - .collect(Collectors.toMap(Entry::getKey, - x -> x.getValue().getLProtoDeclChildren().get(0))); - res.put(e.getKey(), tmp); // FIXME: need LTypeTranslator (local intermediate) - }*/ - return (Module) visited; - } - - // lpd is the projected local protocol - public Module createModuleForProjection(Projector proj, Module root, - GProtocolDecl gpd, LProtocolDecl lpd, Map> deps) - { - ModuleDecl rootModDecl = root.getModuleDeclChild(); - ModuleNameNode modname = Projector.makeProjectedModuleNameNode( - proj.lang.config.af, rootModDecl.getNameNodeChild().getSource(), - // Or ignore blame source for purely generated? - rootModDecl.getFullModuleName(), lpd.getHeaderChild().getDeclName()); - ModuleDecl modDecl = proj.lang.config.af - .ModuleDecl(root.getModuleDeclChild().getSource(), modname); - List> imports = new LinkedList<>(); - for (GProtocolName gpn : deps.keySet()) - { - for (Role role : deps.get(gpn)) - { - LProtocolName targetsimpname = org.scribble.core.visit.global.Projector2 - .projectSimpleProtocolName(gpn.getSimpleName(), role); - ModuleNameNode targetmodname = Projector.makeProjectedModuleNameNode( - proj.lang.config.af, - //null, // CHECKME? projected import sources? - - new CommonTree(), // TODO FIXME -- - - gpn.getPrefix(), targetsimpname); - if (!targetmodname.toName().equals(modname.toName())) - // Self dependency -- each projected local is in its own module now, so can compare module names - { - imports - .add(proj.lang.config.af.ImportModule(null, targetmodname, null)); - // CHECKME? projected import sources? - } - } - } - - List> data = - new LinkedList<>(root.getNonProtoDeclChildren()); - // CHECKME: copy? // FIXME: only project the dependencies - List> protos = Arrays.asList(lpd); - return proj.lang.config.af.Module(gpd.getHeaderChild().getSource(), modDecl, - imports, data, protos); - } - - @Override - public String toString() - { - return (this.mcontext == null) ? "[]" : this.mcontext.toString(); // null before and during context building - } - - public ModuleContext getModuleContext() - { - return this.mcontext; - } - - protected ModuleDel setModuleContext(ModuleContext mcontext) - { - ModuleDel copy = copy(); // FIXME: should be a deep clone in principle - copy.mcontext = mcontext; - return copy; - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java index 006e55594..655480d25 100644 --- a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java @@ -39,11 +39,13 @@ public NonRoleArgListDel() // Doing in leave allows the arguments to be individually checked first @Override - public NonRoleArgList leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException + public NonRoleArgList leaveDisambiguation(ScribNode child, + NameDisambiguator disamb, ScribNode visited) throws ScribException { - NonRoleArgList nral = (NonRoleArgList) super.leaveDisambiguation(parent, child, disamb, visited); + NonRoleArgList nral = (NonRoleArgList) super.leaveDisambiguation(child, disamb, visited); // Checks matching arity + Do parent = (Do) child.getParent(); ProtocolDecl pd = getTargetProtocolDecl((Do) parent, disamb); Iterator args = nral.getArgChildren().iterator(); for (NonRoleParamDecl param : pd.getHeaderChild().getParamDeclListChild() diff --git a/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java index 74421ea81..e4e415329 100644 --- a/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java @@ -21,7 +21,8 @@ public class NonRoleParamDeclDel extends ScribDelBase { @Override - public void enterDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb) throws ScribException + public void enterDisambiguation(ScribNode child, NameDisambiguator disamb) + throws ScribException { NonRoleParamDecl pd = (NonRoleParamDecl) child; disamb.addParameter(pd.getDeclName(), pd.kind); diff --git a/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java index 9b337d8c9..7cafa752f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java @@ -13,15 +13,7 @@ */ package org.scribble.del; -import org.scribble.ast.ScribNode; -import org.scribble.util.ScribException; -import org.scribble.visit.ProtocolDefInliner; - public abstract class ProtocolBlockDel extends CompoundSessionNodeDel { - @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribException - { - ScribDelBase.pushVisitorEnv(this, inl); - } + } diff --git a/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java index f9af96d25..ed71ea10b 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java @@ -13,99 +13,23 @@ */ package org.scribble.del; -import java.util.Set; - -import org.scribble.ast.Module; -import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.ProtocolDeclContext; -import org.scribble.core.lang.SubprotoSig; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.ProtocolName; -import org.scribble.core.type.name.Role; import org.scribble.util.ScribException; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.ProtocolDeclContextBuilder; -import org.scribble.visit.util.RoleCollector; import org.scribble.visit.wf.NameDisambiguator; public abstract class ProtocolDeclDel extends ScribDelBase { - private ProtocolDeclContext pdcontext; - protected ProtocolDeclDel() { } - - protected abstract ProtocolDeclDel copy(); - @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + public ScribNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { disamb.clear(); return visited; } - - @Override - public void enterProtocolDeclContextBuilding(ScribNode parent, - ScribNode child, ProtocolDeclContextBuilder builder) - throws ScribException - { - builder.clearProtocolDependencies(); // collect per protocoldecl all together, do not clear? - - Module main = (Module) parent; - ProtocolDecl pd = (ProtocolDecl) child; - MemberName pn = pd.getFullMemberName(main); - // Is it really needed to add self protocoldecl dependencies? - pd.getHeaderChild().getRoleDeclListChild().getRoles().stream() - .forEach(r -> addSelfDependency(builder, (ProtocolName) pn, r)); - } - - protected abstract void addSelfDependency(ProtocolDeclContextBuilder builder, - ProtocolName proto, Role role); - - @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl) throws ScribException - { - SubprotoSig subsig = inl.peekStack(); // SubprotocolVisitor has already entered subprotocol - inl.setSubprotocolRecVar(subsig); - } - - @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribException - { - return visited; - } - - @Override - public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, - RoleCollector coll, ScribNode visited) throws ScribException - { - ProtocolDecl pd = (ProtocolDecl) visited; - Set occs = coll.getNames(); - // Needs ProtocolDeclContextBuilder to have built the context already - ProtocolDeclDel del = setProtocolDeclContext( - getProtocolDeclContext().setRoleOccurrences(occs)); - return pd.del(del); - } - - public ProtocolDeclContext getProtocolDeclContext() - { - return this.pdcontext; - } - - protected ProtocolDeclDel setProtocolDeclContext( - ProtocolDeclContext pdcontext) - { - ProtocolDeclDel copy = copy(); - // TODO: should be a deep clone in principle -- but if any other children are immutable, they can be shared - copy.pdcontext = pdcontext; - return copy; - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java index 858e920da..b3c50d1fe 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java @@ -13,51 +13,7 @@ */ package org.scribble.del; -import org.scribble.ast.ProtocolDef; -import org.scribble.ast.ScribNode; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.util.ScribException; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.RecRemover; -import org.scribble.visit.util.RecVarCollector; - public abstract class ProtocolDefDel extends ScribDelBase { - protected ProtocolDef inlined = null; - - protected abstract ProtocolDefDel copy(); - - @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribException - { - ScribDelBase.pushVisitorEnv(this, inl); - } - - public ProtocolDef getInlinedProtocolDef() - { - return this.inlined; - } - - //public ProtocolDefDel setInlinedProtocolDef(ProtocolDef inlined) // Compiles in Eclipse, but not javac? wrt. subclass overriding - public ProtocolDefDel setInlinedProtocolDef(ProtocolDef inlined) - { - ProtocolDefDel copy = copy(); - copy.inlined = inlined; - return copy; - } - public void enterRecRemoval(ScribNode parent, ScribNode child, RecRemover rem) - { - super.enterRecRemoval(parent, child, rem); - RecVarCollector rvc = new RecVarCollector(rem.lang); - try - { - this.inlined.accept(rvc); // RecVarCollector not an InlinedProtocolVistor -- do simple visiting directly on inlined - } - catch (ScribException e) - { - throw new RuntimeException(e); - } - rem.setToRemove(rvc.getNames()); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java index d53844133..264ad45fb 100644 --- a/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java @@ -17,10 +17,6 @@ import org.scribble.ast.ScribNode; import org.scribble.core.type.name.RecVar; import org.scribble.util.ScribException; -import org.scribble.visit.InlinedProtocolUnfolder; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.env.UnfoldingEnv; -import org.scribble.visit.util.RecVarCollector; import org.scribble.visit.wf.NameDisambiguator; public abstract class RecursionDel extends CompoundInteractionDel @@ -31,84 +27,22 @@ public RecursionDel() } @Override - public void enterDisambiguation(ScribNode parent, ScribNode child, + public void enterDisambiguation(ScribNode child, NameDisambiguator disamb) throws ScribException { Recursion rec = (Recursion) child; RecVar rv = rec.getRecVarChild().toName(); - /*if (disamb.isBoundRecVar(rv)) - { - throw new ScribbleException("Rec variable shadowing not currently allowed: " + rv); - // Inconsistent to disallow due to subprotocols and that NameDisambiguator is not an inlined or subprotocol visitor - }*/ - //disamb.addRecVar(rv); disamb.pushRecVar(rv); } @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + public ScribNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { Recursion rec = (Recursion) visited; - /*RecVar rv = rec.recvar.toName(); - disamb.popRecVar(rv);*/ - RecVar rv = ((Recursion) child).getRecVarChild().toName(); // visited may be already name mangled // Not any more (refactored to inlining) + RecVar rv = ((Recursion) child).getRecVarChild().toName(); + // visited may be already name mangled // Not any more (refactored to inlining) disamb.popRecVar(rv); return rec; } - - @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inliner) throws ScribException - { - super.enterProtocolInlining(parent, child, inliner); - Recursion rec = (Recursion) child; - inliner.pushRecVar(rec.getRecVarChild().toName()); - } - - @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inliner, ScribNode visited) throws ScribException - { - //Recursion rec = (Recursion) visited; - RecVar origRV = ((Recursion) child).getRecVarChild().toName(); // visited may be already name mangled - inliner.popRecVar(origRV); - return super.leaveProtocolInlining(parent, child, inliner, visited); - } - - @Override - public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, - InlinedProtocolUnfolder unf) throws ScribException - { - super.enterInlinedProtocolUnfolding(parent, child, unf); - Recursion lr = (Recursion) child; - RecVar recvar = lr.getRecVarChild().toName(); - unf.setRecVar(unf.lang.config.af, recvar, lr); // Cloned on use (on continue) - } - - @Override - public Recursion leaveInlinedProtocolUnfolding(ScribNode parent, - ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) - throws ScribException - { - Recursion rec = (Recursion) visited; - RecVar recvar = rec.getRecVarChild().toName(); - unf.removeRecVar(recvar); - UnfoldingEnv merged = unf.popEnv().mergeContext((UnfoldingEnv) rec.getBlockChild().del().env()); - unf.pushEnv(merged); - return (Recursion) super.leaveInlinedProtocolUnfolding(parent, child, unf, rec); - } - - /*@Override - public void enterChoiceUnguardedSubprotocolCheck(ScribNode parent, ScribNode child, ChoiceUnguardedSubprotocolChecker checker) throws ScribbleException - { - ScribDelBase.pushVisitorEnv(this, checker); - }*/ - - @Override - public void enterRecVarCollection(ScribNode parent, ScribNode child, - RecVarCollector coll) - { - coll.addName(((Recursion) child).getRecVarChild().toName()); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java index d579b73bb..a4b4c3a01 100644 --- a/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java @@ -31,15 +31,14 @@ public RoleArgListDel() } @Override - public RoleArgList leaveDisambiguation(ScribNode parent, ScribNode child, + public RoleArgList leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { - visited = super.leaveDisambiguation(parent, child, disamb, visited); + visited = super.leaveDisambiguation(child, disamb, visited); // Duplicate check not needed for NonRoleArgList RoleArgList ral = (RoleArgList) visited; List roles = ral.getRoles(); - //if (roles.size() != new HashSet<>(roles).size()) if (roles.size() != roles.stream().distinct().count()) { throw new ScribException(ral.getSource(), diff --git a/scribble-ast/src/main/java/org/scribble/del/RoleDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/RoleDeclDel.java index 053788bb2..3f33183d7 100644 --- a/scribble-ast/src/main/java/org/scribble/del/RoleDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/RoleDeclDel.java @@ -15,27 +15,16 @@ import org.scribble.ast.RoleDecl; import org.scribble.ast.ScribNode; -import org.scribble.core.type.name.Role; import org.scribble.util.ScribException; import org.scribble.visit.wf.NameDisambiguator; -import org.scribble.visit.wf.WFChoiceChecker; public class RoleDeclDel extends ScribDelBase { @Override - public void enterDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb) throws ScribException + public void enterDisambiguation(ScribNode child, NameDisambiguator disamb) + throws ScribException { RoleDecl rd = (RoleDecl) child; disamb.addRole(rd.getDeclName()); // Could check distinct here, but doing it uniformly in HeaderParamDeclListDel } - - @Override - public RoleDecl leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribException - { - RoleDecl rd = (RoleDecl) visited; - Role role = rd.getDeclName(); - // enabled even for explicit connection protocols: otherwise no way to bootstrap initial connection(s) - checker.pushEnv(checker.popEnv().enableRoleForRootProtocolDecl(role)); - return (RoleDecl) super.leaveInlinedWFChoiceCheck(parent, child, checker, rd); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/ScribDel.java b/scribble-ast/src/main/java/org/scribble/del/ScribDel.java index bc692992b..c28b7e2fc 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ScribDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ScribDel.java @@ -15,292 +15,21 @@ import org.scribble.ast.ScribNode; import org.scribble.util.ScribException; -import org.scribble.visit.InlinedProtocolUnfolder; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.EGraphBuilder; -import org.scribble.visit.context.ModuleContextBuilder; -import org.scribble.visit.context.ProjectedChoiceDoPruner; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -import org.scribble.visit.context.ProjectedRoleDeclFixer; -import org.scribble.visit.context.Projector; -import org.scribble.visit.context.ProtocolDeclContextBuilder; -import org.scribble.visit.context.RecRemover; -import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; -import org.scribble.visit.env.Env; -import org.scribble.visit.util.MessageIdCollector; -import org.scribble.visit.util.RecVarCollector; -import org.scribble.visit.util.RoleCollector; -import org.scribble.visit.validation.GProtocolValidator; -import org.scribble.visit.wf.DelegationProtocolRefChecker; -import org.scribble.visit.wf.ExplicitCorrelationChecker; import org.scribble.visit.wf.NameDisambiguator; -import org.scribble.visit.wf.ReachabilityChecker; -import org.scribble.visit.wf.WFChoiceChecker; // TODO: parent params now redundant -// FIXME: refactor as appropriate into G/LDel -// Immutable except for pass-specific Envs (by visitors) only -- Envs considered transient, not treated immutably (i.e. non defensive setter on del) // Parameterise by AstNode type? Would inhibit del sharing between types (but that's not currently needed) -// Part of core (not lang), because ScribNode -- CHECKME: can move del methods from ScribNode to Base? public interface ScribDel { - // "Transient" - Env env(); - - void setEnv(Env env); // Non defensive - - default void enterModuleContextBuilding(ScribNode parent, ScribNode child, - ModuleContextBuilder builder) throws ScribException - { - - } - - default ScribNode leaveModuleContextBuilding(ScribNode parent, - ScribNode child, ModuleContextBuilder builder, ScribNode visited) + default void enterDisambiguation(ScribNode child, NameDisambiguator disamb) throws ScribException { - return visited; - } - - default void enterDisambiguation(ScribNode parent, ScribNode child, - NameDisambiguator disamb) throws ScribException - { } - default ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + default ScribNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { return visited; } - - default void enterDelegationProtocolRefCheck(ScribNode parent, - ScribNode child, DelegationProtocolRefChecker checker) - throws ScribException - { - - } - - default ScribNode leaveDelegationProtocolRefCheck(ScribNode parent, - ScribNode child, DelegationProtocolRefChecker checker, ScribNode visited) - throws ScribException - { - return visited; - } - - default void enterProtocolDeclContextBuilding(ScribNode parent, - ScribNode child, ProtocolDeclContextBuilder builder) - throws ScribException - { - - } - - default ScribNode leaveProtocolDeclContextBuilding(ScribNode parent, - ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) - throws ScribException - { - return visited; - } - - default void enterRoleCollection(ScribNode parent, ScribNode child, - RoleCollector coll) - { - - } - - default ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, - RoleCollector coll, ScribNode visited) throws ScribException - { - return visited; - } - - default void enterProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl) throws ScribException - { - - } - - default ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribException - { - return visited; - } - - default void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, - InlinedProtocolUnfolder unf) throws ScribException - { - - } - - // These are for "choice-rec" unfolding, i.e. InlinedProtocolUnfolder -- cf. - // UnfoldingVisitor, which does continue unfolding by revisiting a clone of - // the rec body - default ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, - ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) - throws ScribException - { - return visited; - } - - default void enterInlinedWFChoiceCheck(ScribNode parent, ScribNode child, - WFChoiceChecker checker) throws ScribException - { - - } - - default ScribNode leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, - WFChoiceChecker checker, ScribNode visited) throws ScribException - { - return visited; - } - - default void enterProjection(ScribNode parent, ScribNode child, - Projector proj) throws ScribException - { - - } - - default ScribNode leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribException - { - return visited; - } - - default void enterProjectedChoiceSubjectFixing(ScribNode parent, - ScribNode child, ProjectedChoiceSubjectFixer fixer) - { - - } - - default ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, - ScribNode child, ProjectedChoiceSubjectFixer fixer, ScribNode visited) - throws ScribException - { - return visited; - } - - default void enterProjectedRoleDeclFixing(ScribNode parent, ScribNode child, - ProjectedRoleDeclFixer fixer) - { - - } - - default ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, - ScribNode child, ProjectedRoleDeclFixer fixer, ScribNode visited) - throws ScribException - { - return visited; - } - - default void enterReachabilityCheck(ScribNode parent, ScribNode child, - ReachabilityChecker checker) throws ScribException - { - - } - - default ScribNode leaveReachabilityCheck(ScribNode parent, ScribNode child, - ReachabilityChecker checker, ScribNode visited) throws ScribException - { - return visited; - } - - default void enterEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder graph) - { - - } - - default ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder gb, ScribNode visited) throws ScribException - { - return visited; - } - - default void enterMessageIdCollection(ScribNode parent, ScribNode child, - MessageIdCollector coll) - { - - } - - default ScribNode leaveMessageIdCollection(ScribNode parent, ScribNode child, - MessageIdCollector coll, ScribNode visited) - { - return visited; - } - - default void enterValidation(ScribNode parent, ScribNode child, - GProtocolValidator coll) throws ScribException - { - - } - - default ScribNode leaveValidation(ScribNode parent, ScribNode child, - GProtocolValidator coll, ScribNode visited) throws ScribException - { - return visited; - } - - default void enterProjectedChoiceDoPruning(ScribNode parent, ScribNode child, - ProjectedChoiceDoPruner pruner) throws ScribException - { - - } - - default ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, - ScribNode child, ProjectedChoiceDoPruner proj, ScribNode visited) - throws ScribException - { - return visited; - } - - default void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, - ScribNode child, UnguardedChoiceDoProjectionChecker checker) - throws ScribException - { - - } - - default ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, - ScribNode child, UnguardedChoiceDoProjectionChecker checker, - ScribNode visited) throws ScribException - { - return visited; - } - - default void enterExplicitCorrelationCheck(ScribNode parent, ScribNode child, - ExplicitCorrelationChecker checker) throws ScribException - { - - } - - default ScribNode leaveExplicitCorrelationCheck(ScribNode parent, - ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) - throws ScribException - { - return visited; - } - - default void enterRecVarCollection(ScribNode parent, ScribNode child, - RecVarCollector coll) - { - - } - - default ScribNode leaveRecVarCollection(ScribNode parent, ScribNode child, - RecVarCollector coll, ScribNode visited) throws ScribException - { - return visited; - } - - default void enterRecRemoval(ScribNode parent, ScribNode child, - RecRemover rem) - { - - } - - default ScribNode leaveRecRemoval(ScribNode parent, ScribNode child, - RecRemover rem, ScribNode visited) throws ScribException - { - return visited; - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/ScribDelBase.java b/scribble-ast/src/main/java/org/scribble/del/ScribDelBase.java index 9c9f7d557..d8a3a4db6 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ScribDelBase.java +++ b/scribble-ast/src/main/java/org/scribble/del/ScribDelBase.java @@ -13,53 +13,10 @@ */ package org.scribble.del; -import org.scribble.ast.ScribNode; -import org.scribble.visit.EnvVisitor; -import org.scribble.visit.env.Env; - -// Mutable for pass-specific Envs (by visitors) public abstract class ScribDelBase implements ScribDel { - private Env env; - public ScribDelBase() { } - - @Override - public Env env() - { - return this.env; - } - - // "setEnv" rather than "env" as a non-defensive setter (cf. ModelNodeBase#del) - @Override - //protected void setEnv(Env env) - public void setEnv(Env env) - { - this.env = env; - } - - public static > void pushVisitorEnv(ScribDel del, EnvVisitor ev) - { - T env = castEnv(ev, ev.peekEnv().enterContext()); // By default: copy - ev.pushEnv(env); - } - - public static , T2 extends ScribNode> - T2 popAndSetVisitorEnv(ScribDel del, EnvVisitor ev, T2 visited) - { - // No merge here: merging of child contexts into parent context is handled "manually" for each pass and (compound) interaction node as needed (e.g. WF-choice and reachability) - T1 env = ev.popEnv(); - ((ScribDelBase) del).setEnv(env); - return visited; - } - - private static > T castEnv(EnvVisitor ev, Env env) - { - @SuppressWarnings("unchecked") - T tmp = (T) env; - return tmp; - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/SimpleSessionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/SimpleSessionNodeDel.java index c5e102a3f..02356451d 100644 --- a/scribble-ast/src/main/java/org/scribble/del/SimpleSessionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/SimpleSessionNodeDel.java @@ -13,21 +13,8 @@ */ package org.scribble.del; -import org.scribble.ast.ScribNode; -import org.scribble.util.ScribException; -import org.scribble.visit.ProtocolDefInliner; - -public abstract class SimpleSessionNodeDel extends ScribDelBase implements InteractionNodeDel +public abstract class SimpleSessionNodeDel extends ScribDelBase + implements InteractionNodeDel { - @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl) throws ScribException - { - ScribDelBase.pushVisitorEnv(this, inl); - } - @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribException - { - return ScribDelBase.popAndSetVisitorEnv(this, inl, visited); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java index 6c025c025..a93bfc18d 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -13,32 +13,17 @@ */ package org.scribble.del.global; -import java.util.Collections; import java.util.LinkedList; import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.local.LChoice; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.job.JobArgs; -import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.global.GSeq; import org.scribble.del.ChoiceDel; -import org.scribble.util.RuntimeScribException; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.Projector; -import org.scribble.visit.context.env.ProjectionEnv; -import org.scribble.visit.env.InlineProtocolEnv; -import org.scribble.visit.wf.WFChoiceChecker; -import org.scribble.visit.wf.env.WFChoiceEnv; public class GChoiceDel extends ChoiceDel implements GCompoundInteractionNodeDel { @@ -54,148 +39,7 @@ public org.scribble.core.type.session.global.GChoice translate(ScribNode n, { blocks.add((GSeq) b.visitWith(t)); } - return new org.scribble.core.type.session.global.GChoice(source, subj, blocks); - } - - @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribException - { - GChoice gc = (GChoice) visited; - List blocks = gc.getBlockChildren().stream() - .map(b -> (GProtocolBlock) ((InlineProtocolEnv) b.del().env()) - .getTranslation()) - .collect(Collectors.toList()); - RoleNode subj = gc.getSubjectChild().clone();//inl.job.af); - GChoice inlined = inl.lang.config.af.GChoice(gc.getSource(), subj, blocks); - inl.pushEnv(inl.popEnv().setTranslation(inlined)); - return (GChoice) super.leaveProtocolInlining(parent, child, inl, gc); - } - - @Override - public void enterInlinedWFChoiceCheck(ScribNode parent, ScribNode child, - WFChoiceChecker checker) throws ScribException - { - // No super call -- replacing base routine with this one - WFChoiceEnv env = checker.peekEnv().enterContext(); - env = env.clear(); - env = env.enableChoiceSubject(((GChoice) child).getSubjectChild().toName()); - checker.pushEnv(env); - } - - @Override - public GChoice leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, - WFChoiceChecker checker, ScribNode visited) throws ScribException - { - GChoice cho = (GChoice) visited; - RoleNode subjNode = cho.getSubjectChild(); - Role subj = subjNode.toName(); - if (!checker.peekParentEnv().isEnabled(subj)) - { - throw new ScribException(subjNode.getSource(), - "Subject not enabled: " + subj); - } - - // Enabled senders checked in GMessageTransferDel - List all = - cho.getBlockChildren().stream().map(b -> (WFChoiceEnv) b.del().env()) - .collect(Collectors.toList()); - if (checker.lang.config.args.get(JobArgs.OLD_WF)) // **** - { - if (all.size() > 1) - { - try - { - WFChoiceEnv benv0 = all.get(0); - List benvs = all.subList(1, all.size()); - - Set dests = benv0.getEnabled().getDestinations(); - // Same roles enabled in every block - benvs.stream().map(e -> e.getEnabled().getDestinations()) - .forEach(rs -> - { - if (!dests.equals(rs)) - { - throw new RuntimeScribException( - "Mismatched enabled roles: " + dests + ", " + rs); - } - }); - - dests.remove(subj); - for (Role dest : dests) - { - // Same enabler(s) for each enabled role - Set srcs = benv0.getEnabled().getSources(dest); // Always singleton? - benvs.stream().map(e -> e.getEnabled().getSources(dest)) - .forEach(rs -> - { - if (!srcs.equals(rs)) - { - throw new RuntimeScribException( - "Mismatched enabler roles for " + dest + ": " + srcs - + ", " + rs); - } - }); - - // Distinct enabling messages - Set> mids = benv0.getEnabled().getMessages(dest); - benvs.stream().map(e -> e.getEnabled().getMessages(dest)) - .forEach(ms -> - { - if (!Collections.disjoint(mids, ms)) - { - throw new RuntimeScribException( - "Non disjoint enabling messages for " + dest + ": " - + mids + ", " + ms); - } - mids.addAll(ms); - }); - } - } - catch (RuntimeScribException rse) // Lambda hack - { - throw new ScribException(rse.getMessage(), rse.getCause()); - } - } - } - - /*// No: do via Env merge, with "trinary state semantics" - ConnectedMap c0 = all.get(0).getConnected(); - //if (all.subList(1, all.size() - 1).stream().anyMatch((e) -> !c0.equals(e.getConnected()))) - for (WFChoiceEnv e : all.subList(1, all.size())) - { - ConnectedMap c = e.getConnected(); - if (!c0.equals(c)) - { - // FIXME: check on model? - throw new ScribbleException("Inconsistent connection configurations:\n " + c0 + "\n " + c); - } - }*/ - - // On leaving global choice, we're doing both the merging of block envs into the choice env, and the merging of the choice env to the parent-of-choice env - // In principle, for the envLeave we should only be doing the latter (as countpart to enterEnv), but it is much more convenient for the compound-node (choice) to collect all the child block envs and merge here, rather than each individual block env trying to (partially) merge into the parent-choice as they are visited - WFChoiceEnv merged = checker.popEnv().mergeContexts(all); - checker.pushEnv(merged); // Merges the child block envs into the current choice env; super call below merges this choice env into the parent env of the choice - return (GChoice) super.leaveInlinedWFChoiceCheck(parent, child, checker, - visited); - // Replaces base popAndSet to do pop, merge and set - // super call, unlike enter -- only leave is overridden in CompoundInteractionNodeDel, to do the "single" merge (cf. the "multiple" merge done above here) - } - - @Override - public GChoice leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribException - { - GChoice gc = (GChoice) visited; - List blocks = - gc.getBlockChildren().stream() - .map(b -> (LProtocolBlock) ((ProjectionEnv) b.del().env()) - .getProjection()) - .collect(Collectors.toList()); - //gc.getBlocks().stream().map(b -> ((GProtocolBlockDel) b.del()).project(b, self)).collect(Collectors.toList()); - LChoice projection = gc.project(proj.lang.config.af, proj.peekSelf(), blocks); - proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GChoice) GCompoundInteractionNodeDel.super.leaveProjection(parent, - child, proj, gc); + return new org.scribble.core.type.session.global.GChoice(source, subj, + blocks); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java index 903a87aca..be7119837 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java @@ -15,20 +15,15 @@ import java.util.List; -import org.scribble.ast.MessageNode; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GConnect; -import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; import org.scribble.del.ConnectionActionDel; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; -import org.scribble.visit.wf.WFChoiceChecker; -import org.scribble.visit.wf.env.WFChoiceEnv; public class GConnectDel extends ConnectionActionDel implements GSimpleInteractionNodeDel @@ -39,12 +34,10 @@ public GConnectDel() } @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + public ScribNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { GConnect gc = (GConnect) visited; - /*Role src = gc.src.toName(); - Role dest = gc.dest.toName();*/ return gc; } @@ -63,83 +56,4 @@ public org.scribble.core.type.session.global.GConnect translate(ScribNode n, Message msg = source.getMessageNodeChild().toMessage(); return new org.scribble.core.type.session.global.GConnect(source, src, msg, dst); } - - @Override - public GConnect leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, - WFChoiceChecker checker, ScribNode visited) throws ScribException - { - GConnect gc = (GConnect) visited; - RoleNode srcNode = gc.getSourceChild(); - MessageNode msgNode = gc.getMessageNodeChild(); - RoleNode destNode = gc.getDestinationChild(); - - Role src = srcNode.toName(); - if (!checker.peekEnv().isEnabled(src)) - { - throw new ScribException(srcNode.getSource(), "Role not enabled: " + src); - } - Message msg = msgNode.toMessage(); - WFChoiceEnv env = checker.popEnv(); - //for (Role dest : gc.getDestinationRoles()) - Role dest = destNode.toName(); - { - if (src.equals(dest)) - { - throw new ScribException(gc.getSource(), - "[TODO] Self connections not supported: " + gc); - } - if (env.isConnected(src, dest)) - { - throw new ScribException(gc.getSource(), - "Roles (possibly) already connected: " + src + ", " + dest); - } - - env = env.connect(src, dest).addMessage(src, dest, msg); - /*env = env - .connect(src, dest) - .addMessage(src, dest, new MessageSig(Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD));*/ - } - checker.pushEnv(env); - return gc; - } - - @Override - public ScribNode leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribException - { - GConnect gc = (GConnect) visited; - Role self = proj.peekSelf(); - LScribNode projection = gc.project(proj.lang.config.af, self); - proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GConnect) GSimpleInteractionNodeDel.super.leaveProjection(parent, - child, proj, gc); - } - - - - - - - - - - - - - - - - - /*// Duplicated from GMessageTransferDel - @Override - public ScribNode leaveF17Parsing(ScribNode parent, ScribNode child, F17Parser parser, ScribNode visited) throws ScribbleException - { - F17ParserEnv env = parser.peekEnv(); - if (env.isUnguarded()) - { - parser.popEnv(); - parser.pushEnv(new F17ParserEnv()); // Maybe make "setGuarded" method - } - return super.leaveF17Parsing(parent, child, parser, visited); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java index 44545d33a..a7b713c5a 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java @@ -15,17 +15,13 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GContinue; -import org.scribble.ast.local.LContinue; -import org.scribble.ast.name.simple.RecVarNode; import org.scribble.core.type.name.RecVar; import org.scribble.del.ContinueDel; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.Projector; -import org.scribble.visit.env.InlineProtocolEnv; -public class GContinueDel extends ContinueDel implements GSimpleInteractionNodeDel +public class GContinueDel extends ContinueDel + implements GSimpleInteractionNodeDel { @Override @@ -36,35 +32,4 @@ public org.scribble.core.type.session.global.GContinue translate(ScribNode n, RecVar recvar = source.getRecVarChild().toName(); return new org.scribble.core.type.session.global.GContinue(source, recvar); } - - @Override - public GContinue leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribException - { - GContinue gc = (GContinue) visited; - RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) gc.getRecVarChild() - .del().env()).getTranslation(); - GContinue inlined = inl.lang.config.af.GContinue(gc.getSource(), recvar); - inl.pushEnv(inl.popEnv().setTranslation(inlined)); - return (GContinue) super.leaveProtocolInlining(parent, child, inl, gc); - } - - /*public LContinue project(AstFactory af, GNode n, Role self) - { - GContinue gc = (GContinue) n; - LContinue projection = gc.project(af, self); - return projection; - }*/ - - @Override - public GContinue leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribException - { - GContinue gc = (GContinue) visited; - //LContinue projection = project(proj.job.af, gc, proj.peekSelf()); - LContinue projection = gc.project(proj.lang.config.af, proj.peekSelf()); - proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GContinue) GSimpleInteractionNodeDel.super.leaveProjection(parent, - child, proj, gc); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDel.java index 549d3a3ee..05672ff5d 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDel.java @@ -21,9 +21,5 @@ public interface GDel extends ScribDel { - default GNode translate(ScribNode n, GTypeTranslator t) - throws ScribException - { - throw new RuntimeException("TODO: " + n); - } + GNode translate(ScribNode n, GTypeTranslator t) throws ScribException; } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java index a51f76ad1..c7f7c6169 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -13,13 +13,6 @@ */ package org.scribble.del.global; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.Set; -import java.util.stream.Collectors; - -import org.scribble.ast.MessageTransfer; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GDelegationElem; @@ -28,12 +21,9 @@ import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.del.ScribDelBase; import org.scribble.util.ScribException; -import org.scribble.visit.context.ProtocolDeclContextBuilder; -import org.scribble.visit.wf.DelegationProtocolRefChecker; import org.scribble.visit.wf.NameDisambiguator; public class GDelegationElemDel extends ScribDelBase @@ -45,7 +35,7 @@ public GDelegationElemDel() // Duplicated from DoDel @Override - public void enterDisambiguation(ScribNode parent, ScribNode child, + public void enterDisambiguation(ScribNode child, NameDisambiguator disamb) throws ScribException { ModuleContext mc = disamb.getModuleContext(); @@ -61,7 +51,7 @@ public void enterDisambiguation(ScribNode parent, ScribNode child, // Duplicated from DoDel //@Override - public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, + public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, // CHECKME: why "visitFor" pattern? GDelegationElem de) throws ScribException { ModuleContext mc = disamb.getModuleContext(); @@ -84,101 +74,4 @@ public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, // Not keeping original namenode del return de.reconstruct(pnn, r); } - - //@Override - //public DelegationElem leaveProtocolDeclContextBuilding(ScribNodeScribNode parent, ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) throws ScribbleException // FIXME: cannot access MessageTransfer roles from here - // TODO: apply this pattern (delegate from parent back to child class) to all other existing instances - // TODO: should always be GMessageTransfer - public void leaveMessageTransferInProtocolDeclContextBuilding( - MessageTransfer mt, GDelegationElem de, - ProtocolDeclContextBuilder builder) throws ScribException - { - RoleNode role = de.getRoleChild(); - GProtocolName gpn = de.getProtocolChild().toName(); // leaveDisambiguation has fully qualified the target name - builder.addGlobalProtocolDependency(mt.getSourceChild().toName(), gpn, - role.toName()); - // CHECKME: does it make sense to use projection role as dependency target role? (seems to be used for Job.getProjections) - mt.getDestinationRoles().forEach( - r -> builder.addGlobalProtocolDependency(r, gpn, role.toName())); - } - - @Override - public void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, - DelegationProtocolRefChecker checker) throws ScribException - { - GDelegationElem de = (GDelegationElem) child; - ModuleContext mc = checker.getModuleContext(); - GProtocolName targetfullname = (GProtocolName) - mc.getVisibleProtocolDeclFullName(de.getProtocolChild().toName()); - GProtocolName rootfullname = (GProtocolName) - mc.getVisibleProtocolDeclFullName( - checker.getProtocolDeclOnEntry().getHeaderChild().getDeclName()); - if (targetfullname.equals(rootfullname)) - // Explicit check here because ProtocolDeclContextBuilder dependencies explicitly include self protocoldecl dependencies (cf. GProtocolDeclDel.addSelfDependency) - { - throw new ScribException(de.getSource(), - "Recursive protocol dependencies not supported for delegation types: " - + de); - } - - Set todo = new LinkedHashSet(); - ProtocolDecl targetgpd = checker.lang.getContext() - .getModule(targetfullname.getPrefix()) - .getProtocolDeclChild(targetfullname.getSimpleName()); // target - // CHECKME: does this already contain transitive do-dependencies? But doesn't contain transitive delegation-dependencies..? - Set init = ((GProtocolDeclDel) targetgpd.del()) - .getProtocolDeclContext().getDependencyMap().getDependencies().values() - .stream().flatMap(v -> v.keySet().stream()) - .collect(Collectors.toSet()); - todo.addAll(init); - - Set seen = new HashSet<>(); - while (!todo.isEmpty()) - { - Iterator it = todo.iterator(); - GProtocolName next = it.next(); - it.remove(); - seen.add(next); - - ProtocolName nextfullname = - mc.getVisibleProtocolDeclFullName(next); - if (rootfullname.equals(nextfullname)) - { - throw new ScribException(de.getSource(), - "Recursive protocol dependencies not supported for delegation types: " - + de); - } - ProtocolDecl nextgpd = checker.lang.getContext() - .getModule(targetfullname.getPrefix()) - .getProtocolDeclChild(nextfullname.getSimpleName()); - Set tmp = ((GProtocolDeclDel) nextgpd.del()) - .getProtocolDeclContext().getDependencyMap().getDependencies() - .values().stream().flatMap(v -> v.keySet().stream()) - .filter(n -> !seen.contains(n)).collect(Collectors.toSet()); - todo.addAll(tmp); - } - } - - - - - - - - - - - - - /*// Is this needed? Or DataTypeNodes always created from AmbigNameNode? (in this same pass) - @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) - throws ScribbleException - { - ModuleContext mc = disamb.getModuleContext(); - DataTypeNode dtn = (DataTypeNode) visited; - DataType fullname = mc.getVisibleDataTypeFullName(dtn.toName()); - return (DataTypeNode) - AstFactoryImpl.FACTORY.QualifiedNameNode(DataTypeKind.KIND, fullname.getElements()); // Didn't keep original del - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java index 060250f07..c0c99f8e1 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java @@ -15,16 +15,11 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GDisconnect; -import org.scribble.ast.local.LScribNode; -import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.name.Role; import org.scribble.del.ConnectionActionDel; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; -import org.scribble.visit.wf.WFChoiceChecker; -import org.scribble.visit.wf.env.WFChoiceEnv; // TODO: make DisconnectDel (cf., G/LMessageTransferDel) public class GDisconnectDel extends ConnectionActionDel @@ -36,12 +31,10 @@ public GDisconnectDel() } @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + public ScribNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { GDisconnect gc = (GDisconnect) visited; - /*Role src = gc.src.toName(); - Role dest = gc.dest.toName();*/ return gc; } @@ -54,63 +47,4 @@ public org.scribble.core.type.session.global.GDisconnect translate(ScribNode n, Role right = source.getRightChild().toName(); return new org.scribble.core.type.session.global.GDisconnect(source, left, right); } - - @Override - public GDisconnect leaveInlinedWFChoiceCheck(ScribNode parent, - ScribNode child, WFChoiceChecker checker, ScribNode visited) - throws ScribException - { - GDisconnect gd = (GDisconnect) visited; - RoleNode leftNode = gd.getLeftChild(); - RoleNode rightNode = gd.getRightChild(); - - Role left = leftNode.toName(); - if (!checker.peekEnv().isEnabled(left)) - { - throw new ScribException(leftNode.getSource(), - "Role not enabled: " + left); - } - //Message msg = gd.msg.toMessage(); // Unit message - WFChoiceEnv env = checker.popEnv(); - //for (Role dest : gc.getDestinationRoles()) - Role right = rightNode.toName(); - if (!env.isEnabled(right)) - { - throw new ScribException(rightNode.getSource(), - "Role not enabled: " + right); - } - { - if (left.equals(right)) - { - throw new ScribException(gd.getSource(), - "[TODO] Self connections not supported: " + gd); // Would currently - // be subsumed by - // the below - } - if (!env.isConnected(left, right)) - { - throw new ScribException(gd.getSource(), - "Roles not (necessarily) connected: " + left + ", " + right); - } - - env = env.disconnect(left, right);//.removeMessage(src, dest, ...); // Is remove really needed? - /*env = env - .disconnect(src, dest) - .removeMessage(src, dest, new MessageSig(Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD)); // FIXME: factor out dummy connection message with GConnect etc.*/ - } - checker.pushEnv(env); - return gd; - } - - @Override - public ScribNode leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribException - { - GDisconnect gd = (GDisconnect) visited; - Role self = proj.peekSelf(); - LScribNode projection = gd.project(proj.lang.config.af, self); - proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GDisconnect) GSimpleInteractionNodeDel.super.leaveProjection(parent, - child, proj, gd); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java index 2183d8b5f..6eff098c1 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java @@ -15,31 +15,16 @@ import java.util.List; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GContinue; import org.scribble.ast.global.GDo; -import org.scribble.ast.global.GInteractionSeq; -import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.global.GRecursion; -import org.scribble.ast.local.LDo; -import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.kind.RecVarKind; import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.del.DoDel; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.Projector; -import org.scribble.visit.context.ProtocolDeclContextBuilder; -import org.scribble.visit.env.InlineProtocolEnv; public class GDoDel extends DoDel implements GSimpleInteractionNodeDel { @@ -62,91 +47,7 @@ public org.scribble.core.type.session.global.GDo translate(ScribNode n, List roles = source.getRoleListChild().getRoles(); List> params = source.getNonRoleListChild() .getParamKindArgs(); - return new org.scribble.core.type.session.global.GDo(source, fullname, roles, params); - } - - // Part of context building - @Override - protected void addProtocolDependency(ProtocolDeclContextBuilder builder, - Role self, ProtocolName proto, Role target) - { - builder.addGlobalProtocolDependency(self, (GProtocolName) proto, target); - } - - // Only called if cycle - public GDo visitForSubprotocolInlining(ProtocolDefInliner builder, GDo child) - { - CommonTree blame = child.getSource(); - SubprotoSig subsig = builder.peekStack(); - RecVarNode recvar = (RecVarNode) builder.lang.config.af.SimpleNameNode(blame, - RecVarKind.KIND, builder.getSubprotocolRecVar(subsig).toString()); - GContinue inlined = builder.lang.config.af.GContinue(blame, recvar); - builder.pushEnv(builder.popEnv().setTranslation(inlined)); - return child; - } - - @Override - public GDo leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribException - { - if (!inl.isCycle()) - { - CommonTree blame = visited.getSource(); - SubprotoSig subsig = inl.peekStack(); - RecVarNode recvar = (RecVarNode) inl.lang.config.af.SimpleNameNode(blame, - RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString()); - GInteractionSeq gis = (GInteractionSeq) (((InlineProtocolEnv) inl - .peekEnv()).getTranslation()); - GProtocolBlock gb = inl.lang.config.af.GProtocolBlock(blame, gis); - GRecursion inlined = inl.lang.config.af.GRecursion(blame, recvar, gb); - inl.pushEnv(inl.popEnv().setTranslation(inlined)); - inl.removeSubprotocolRecVar(subsig); - } - return (GDo) super.leaveProtocolInlining(parent, child, inl, visited); - } - - @Override - public void enterProjection(ScribNode parent, ScribNode child, Projector proj) - throws ScribException - { - GSimpleInteractionNodeDel.super.enterProjection(parent, child, proj); - - GDo gd = (GDo) child; - Role self = proj.peekSelf(); - if (gd.getRoleListChild().getRoles().contains(self)) - { - // For correct name mangling, need to use the parameter corresponding to the self argument - // N.B. -- this depends on Projector not following the Subprotocol pattern, otherwise self is wrong - Role param = gd.getTargetRoleParameter(proj.lang.getContext(), - proj.getModuleContext(), self); - proj.pushSelf(param); - } - else - { - proj.pushSelf(self); // Dummy: just to make pop in leave work - } - } - - @Override - public GDo leaveProjection(ScribNode parent, ScribNode child, Projector proj, - ScribNode visited) throws ScribException // throws ScribbleException - { - GDo gd = (GDo) visited; - Role popped = proj.popSelf(); - Role self = proj.peekSelf(); - LDo projection = null; - if (gd.getRoleListChild().getRoles().contains(self)) - { - ModuleContext mc = proj.getModuleContext(); - LProtocolNameNode target = Projector.makeProjectedFullNameNode( - proj.lang.config.af, gd.getProtocolNameNode().getSource(), - gd.getTargetProtocolDeclFullName(mc), popped); - projection = gd.project(proj.lang.config.af, self, target); - - // FIXME: do guarded recursive subprotocol checking (i.e. role is used during chain) in reachability checking? -- required role-usage makes local choice subject inference easier, but is restrictive (e.g. proto(A, B, C) { choice at A {A->B.do Proto(A,B,C)} or {A->B.B->C} })) - } - proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GDo) GSimpleInteractionNodeDel.super - .leaveProjection(parent, child, proj, gd); + return new org.scribble.core.type.session.global.GDo(source, fullname, + roles, params); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java index 5b8cd277f..51729c2fb 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java @@ -13,25 +13,9 @@ */ package org.scribble.del.global; -import org.scribble.ast.ScribNode; import org.scribble.del.InteractionNodeDel; -import org.scribble.del.ScribDelBase; -import org.scribble.util.ScribException; -import org.scribble.visit.context.Projector; public interface GInteractionNodeDel extends InteractionNodeDel, GDel { - //public abstract LNode project(GNode n, Role self); // Generalised return, e.g. returning a seq - - @Override - default void enterProjection(ScribNode parent, ScribNode child, Projector proj) throws ScribException - { - ScribDelBase.pushVisitorEnv(this, proj); - } - @Override - default ScribNode leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribException - { - return ScribDelBase.popAndSetVisitorEnv(this, proj, visited); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java index d57af91b3..9ef40c8b9 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java @@ -15,27 +15,15 @@ import java.util.LinkedList; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GInteractionSeq; -import org.scribble.ast.global.GRecursion; import org.scribble.ast.global.GSessionNode; -import org.scribble.ast.local.LInteractionSeq; -import org.scribble.ast.local.LScribNode; -import org.scribble.ast.local.LSessionNode; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.global.GType; import org.scribble.del.InteractionSeqDel; -import org.scribble.del.ScribDelBase; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.Projector; -import org.scribble.visit.context.RecRemover; -import org.scribble.visit.context.env.ProjectionEnv; -import org.scribble.visit.env.InlineProtocolEnv; public class GInteractionSeqDel extends InteractionSeqDel implements GDel { @@ -52,110 +40,4 @@ public GSeq translate(ScribNode n, GTypeTranslator t) } return new GSeq(source, elems); } - - // enter in super - @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribException - { - GInteractionSeq gis = (GInteractionSeq) visited; - List gins = new LinkedList(); - for (GSessionNode gi : gis.getInteractionChildren()) - { - ScribNode inlined = ((InlineProtocolEnv) gi.del().env()).getTranslation(); - if (inlined instanceof GInteractionSeq) // A do got inlined - { - gins.addAll(((GInteractionSeq) inlined).getInteractionChildren()); - } - else - { - gins.add((GSessionNode) inlined); - } - } - GInteractionSeq inlined = inl.lang.config.af.GInteractionSeq(gis.getSource(), - gins); - inl.pushEnv(inl.popEnv().setTranslation(inlined)); - return (GInteractionSeq) ScribDelBase.popAndSetVisitorEnv(this, inl, gis); - } - - @Override - public void enterProjection(ScribNode parent, ScribNode child, Projector proj) - throws ScribException - { - ScribDelBase.pushVisitorEnv(this, proj); // Unlike WF-choice and Reachability, Projection uses an Env for InteractionSequences - } - - @Override - public GInteractionSeq leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribException - { - GInteractionSeq gis = (GInteractionSeq) visited; - List lis = new LinkedList<>(); - for (GSessionNode gi : gis.getInteractionChildren()) // FIXME: rewrite using flatMap - { - LScribNode ln = (LScribNode) ((ProjectionEnv) gi.del().env()).getProjection(); - //LNode ln = ((GInteractionNodeDel) gi.del()).project(gi, self); // FIXME: won't work for do - // TODO: move node-specific projects to G nodes (not dels) and take child projections as params, bit like reconstruct - if (ln instanceof LInteractionSeq) // Self comm sequence - { - lis.addAll(((LInteractionSeq) ln).getInteractionChildren()); - } - else if (ln != null) // null is used for empty projection - { - lis.add((LSessionNode) ln); - } - } - /*if (lis.size() == 1) // NO: needed for e.g. rec X { 1() from A to B; choice at A { continue X; } or { 2() from A to B; } } -- do instead in GRecursion - { - if (lis.get(0) instanceof Continue) - { - lis.clear(); - } - }*/ - LInteractionSeq projection = gis.project(proj.lang.config.af, - proj.peekSelf(), lis); - proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GInteractionSeq) ScribDelBase.popAndSetVisitorEnv(this, proj, gis); - } - - /*@Override - public GInteractionSeq leaveF17Parsing(ScribNode parent, ScribNode child, F17Parser parser, ScribNode visited) throws ScribbleException - { - GInteractionSeq gis = (GInteractionSeq) visited; - List gins = gis.getInteractions(); - Iterator i = gins.iterator(); - while (i.hasNext()) - { - GInteractionNode gin = i.next(); - if (!i.hasNext()) - { - break; - } - /*F17ParserEnv env = (F17ParserEnv) gin.del().env(); - if (env.isUnguarded()) - { - throw new ScribbleException("[FASE17] unguarded choice case: " + gin); - }* / - if (!(gin instanceof GMessageTransfer || gin instanceof GConnect || gin instanceof GDisconnect)) - { - throw new ScribbleException("[FASE17] Bad sequence composition following:\n" + gin); - } - } - return gis; - }*/ - - @Override - public GInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, - RecRemover rem, ScribNode visited) throws ScribException - { - GInteractionSeq gis = (GInteractionSeq) visited; - List gins = gis.getInteractionChildren().stream() - .flatMap((gi) -> (gi instanceof GRecursion - && rem.toRemove(((GRecursion) gi).getRecVarChild().toName())) - ? ((GRecursion) gi).getBlockChild().getInteractSeqChild() - .getInteractionChildren().stream() - : Stream.of(gi)) - .collect(Collectors.toList()); - return rem.lang.config.af.GInteractionSeq(gis.getSource(), gins); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java index 6f73fa3ab..f66eab005 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -17,17 +17,13 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GMessageTransfer; -import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; import org.scribble.del.MessageTransferDel; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -import org.scribble.visit.context.Projector; import org.scribble.visit.wf.NameDisambiguator; -import org.scribble.visit.wf.WFChoiceChecker; -import org.scribble.visit.wf.env.WFChoiceEnv; public class GMessageTransferDel extends MessageTransferDel implements GSimpleInteractionNodeDel @@ -38,7 +34,7 @@ public GMessageTransferDel() } @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + public ScribNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { GMessageTransfer gmt = (GMessageTransfer) visited; @@ -47,8 +43,8 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, if (dests.contains(src)) { throw new ScribException(gmt.getSource(), - "[TODO] Self connections not supported: " + gmt); - // Would currently be subsumed by unconnected check + "[TODO] Self connections not supported: " + gmt); // TODO: refactor to Job validation pass + // CHECKME: subsumed by unconnected check ? } return gmt; } @@ -62,68 +58,11 @@ public org.scribble.core.type.session.global.GMessageTransfer translate(ScribNod List ds = source.getDestinationChildren(); if (ds.size() > 1) { - throw new RuntimeException("TODO: multiple destination roles: " + source); + throw new RuntimeException("[TODO] multiple destination roles: " + source); } Role dst = ds.get(0).toName(); Message msg = source.getMessageNodeChild().toMessage(); - return new org.scribble.core.type.session.global.GMessageTransfer(source, src, msg, dst); + return new org.scribble.core.type.session.global.GMessageTransfer(source, + src, msg, dst); } - - @Override - public GMessageTransfer leaveInlinedWFChoiceCheck(ScribNode parent, - ScribNode child, WFChoiceChecker checker, ScribNode visited) - throws ScribException - { - GMessageTransfer gmt = (GMessageTransfer) visited; - - Role src = gmt.getSourceChild().toName(); - if (!checker.peekEnv().isEnabled(src)) - { - throw new ScribException(gmt.getSourceChild().getSource(), - "Role not enabled: " + src); - } - Message msg = gmt.getMessageNodeChild().toMessage(); - WFChoiceEnv env = checker.popEnv(); - for (Role dest : gmt.getDestinationRoles()) - { - // FIXME: better to check as global model error (role stuck on uncomnected send) - if (!env.isConnected(src, dest)) - { - throw new ScribException(gmt.getSource(), - "Roles not (necessarily) connected: " + src + ", " + dest); - } - - env = env.addMessage(src, dest, msg); - - //System.out.println("a: " + src + ", " + dest + ", " + msg); - } - checker.pushEnv(env); - return gmt; - } - - @Override - //public GMessageTransfer leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException //throws ScribbleException - public ScribNode leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribException - //throws ScribbleException - { - GMessageTransfer gmt = (GMessageTransfer) visited; - Role self = proj.peekSelf(); - LScribNode projection = gmt.project(proj.lang.config.af, self); - proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GMessageTransfer) GSimpleInteractionNodeDel.super.leaveProjection( - parent, child, proj, gmt); - } - - /*@Override - public ScribNode leaveF17Parsing(ScribNode parent, ScribNode child, F17Parser parser, ScribNode visited) throws ScribbleException - { - F17ParserEnv env = parser.peekEnv(); - if (env.isUnguarded()) - { - parser.popEnv(); - parser.pushEnv(new F17ParserEnv()); // Maybe make "setGuarded" method - } - return super.leaveF17Parsing(parent, child, parser, visited); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java index 09c72640e..c00d71234 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java @@ -14,19 +14,11 @@ package org.scribble.del.global; import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GInteractionSeq; import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.local.LInteractionSeq; -import org.scribble.ast.local.LProtocolBlock; import org.scribble.core.type.session.global.GSeq; import org.scribble.del.ProtocolBlockDel; -import org.scribble.del.ScribDelBase; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.Projector; -import org.scribble.visit.context.env.ProjectionEnv; -import org.scribble.visit.env.InlineProtocolEnv; public class GProtocolBlockDel extends ProtocolBlockDel implements GDel { @@ -37,39 +29,4 @@ public GSeq translate(ScribNode n, GTypeTranslator t) { return (GSeq) ((GProtocolBlock) n).getInteractSeqChild().visitWith(t); } - - @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribException - { - GProtocolBlock gpb = (GProtocolBlock) visited; - GInteractionSeq seq = (GInteractionSeq) ((InlineProtocolEnv) gpb - .getInteractSeqChild().del().env()).getTranslation(); - GProtocolBlock inlined = - inl.lang.config.af.GProtocolBlock(gpb.getSource(), seq); - inl.pushEnv(inl.popEnv().setTranslation(inlined)); - return (GProtocolBlock) ScribDelBase.popAndSetVisitorEnv(this, inl, gpb); - } - - @Override - public void enterProjection(ScribNode parent, ScribNode child, Projector proj) - throws ScribException - { - ScribDelBase.pushVisitorEnv(this, proj); - } - - @Override - public GProtocolBlock leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribException - { - GProtocolBlock gpb = (GProtocolBlock) visited; - LInteractionSeq seq = - (LInteractionSeq) ((ProjectionEnv) gpb.getInteractSeqChild().del() - .env()).getProjection(); - //((GInteractionSeqDel) gpb.seq.del()).project(gpb.getInteractionSeq(), self); - LProtocolBlock projection = - gpb.project(proj.lang.config.af, proj.peekSelf(), seq); - proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GProtocolBlock) ScribDelBase.popAndSetVisitorEnv(this, proj, gpb); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index a4a2e40e2..5b762e823 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -14,42 +14,22 @@ package org.scribble.del.global; import java.util.List; -import java.util.Map; -import java.util.Set; import java.util.stream.Collectors; -import org.scribble.ast.AstFactory; import org.scribble.ast.Module; -import org.scribble.ast.NonRoleParamDeclList; -import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScribNode; -import org.scribble.ast.context.DependencyMap; -import org.scribble.ast.context.global.GProtocolDeclContext; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ast.global.GProtocolHeader; -import org.scribble.ast.local.LProtocolDecl; -import org.scribble.ast.local.LProtocolDef; -import org.scribble.ast.local.LProtocolHeader; -import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.core.job.JobArgs; import org.scribble.core.lang.ProtocolMod; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.global.GSeq; -import org.scribble.del.ModuleDel; import org.scribble.del.ProtocolDeclDel; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -import org.scribble.visit.context.Projector; -import org.scribble.visit.context.ProtocolDeclContextBuilder; -import org.scribble.visit.context.env.ProjectionEnv; -import org.scribble.visit.util.RoleCollector; -import org.scribble.visit.validation.GProtocolValidator; public class GProtocolDeclDel extends ProtocolDeclDel implements GDel { @@ -74,128 +54,4 @@ public GProtocol translate(ScribNode n, GTypeTranslator t) GSeq body = (GSeq) source.getDefChild().getBlockChild().visitWith(t); return new GProtocol(source, mods, fullname, rs, ps, body); } - - @Override - public GProtocolDeclContext getProtocolDeclContext() - { - return (GProtocolDeclContext) super.getProtocolDeclContext(); - } - - @Override - protected GProtocolDeclDel copy() - { - return new GProtocolDeclDel(); - } - - @Override - protected void addSelfDependency(ProtocolDeclContextBuilder builder, - ProtocolName proto, Role role) - { - builder.addGlobalProtocolDependency(role, (GProtocolName) proto, role); - } - - @Override - public GProtocolDecl - leaveProtocolDeclContextBuilding(ScribNode parent, ScribNode child, - ProtocolDeclContextBuilder builder, ScribNode visited) - throws ScribException - { - GProtocolDecl gpd = (GProtocolDecl) visited; - GProtocolDeclContext gcontext = new GProtocolDeclContext( - builder.getGlobalProtocolDependencyMap()); - GProtocolDeclDel del = (GProtocolDeclDel) setProtocolDeclContext(gcontext); - return (GProtocolDecl) gpd.del(del); - } - - @Override - public ScribNode leaveRoleCollection(ScribNode parent, ScribNode child, - RoleCollector coll, ScribNode visited) throws ScribException - { - GProtocolDecl gpd = (GProtocolDecl) visited; - - // Need to do here (e.g. RoleDeclList too early, def not visited yet) - // Currently only done for global, local does roledecl fixing after role collection -- should separate this check to a later pass after context building - // Maybe relax to check only occs.size() > 1 - List decls = gpd.getHeaderChild().getRoleDeclListChild().getRoles(); - Set occs = coll.getNames(); - if (occs.size() != decls.size()) - { - decls.removeAll(occs); - throw new ScribException( - gpd.getHeaderChild().getRoleDeclListChild().getSource(), - "Unused role decl(s) in " + gpd.getHeaderChild().getDeclName() + ": " - + decls); - } - - return super.leaveRoleCollection(parent, child, coll, gpd); - } - - @Override - public GProtocolDecl leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribException - { - AstFactory af = proj.lang.config.af; - - Module root = proj.lang.getContext().getModule(proj.getModuleContext().root); - GProtocolDecl gpd = (GProtocolDecl) visited; - GProtocolHeader gph = gpd.getHeaderChild(); - Role self = proj.peekSelf(); - - LProtocolNameNode pn = Projector.makeProjectedSimpleNameNode(af, - gph.getSource(), gph.getDeclName(), self); - RoleDeclList roledecls = gph.getRoleDeclListChild().project(af, self); - NonRoleParamDeclList paramdecls = gph.getParamDeclListChild().project(af, - self); - //LProtocolHeader hdr = af.LProtocolHeader(gpd.header.getSource(), pn, roledecls, paramdecls); // FIXME: make a header del and move there? - LProtocolHeader hdr = gph.project(af, self, pn, roledecls, paramdecls); - LProtocolDef def = (LProtocolDef) ((ProjectionEnv) gpd.getDefChild().del() - .env()).getProjection(); - LProtocolDecl lpd = gpd.project(af, root, self, hdr, def); // CHECKME: is root (always) the correct module? (wrt. LProjectionDeclDel?) - - Map> deps = ((GProtocolDeclDel) gpd.del()) - .getGlobalProtocolDependencies(self); - Module projected = ((ModuleDel) root.del()).createModuleForProjection(proj, - root, gpd, lpd, deps); - proj.addProjection(gpd.getFullMemberName(root), self, projected); - return gpd; - } - - protected Map> getGlobalProtocolDependencies(Role self) - { - DependencyMap deps = getProtocolDeclContext().getDependencyMap(); - return deps.getDependencies().get(self); - } - - @Override - public void enterValidation(ScribNode parent, ScribNode child, - GProtocolValidator checker) throws ScribException - { - GProtocolDecl gpd = (GProtocolDecl) child; - if (gpd.isAux()) - { - return; - } - - GProtocolName fullname = gpd.getFullMemberName((Module) parent); - if (checker.job.config.args.get(JobArgs.SPIN)) - { - if (checker.job.config.args.get(JobArgs.FAIR)) - { - throw new RuntimeException( - "[TODO]: -spin currently does not support fair ouput choices."); - } - GProtocol.validateBySpin(checker.job, fullname); - } - else - { - GProtocol.validateByScribble(checker.job, fullname, true); - if (!checker.job.config.args.get(JobArgs.FAIR)) - { - checker.lang.debugPrintln( - "(" + fullname + ") Validating with \"unfair\" output choices.. "); - GProtocol.validateByScribble(checker.job, fullname, false); // TODO: only need to check progress, not full validation - } - } - } } - diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java index d7fcd3abf..7045f6eda 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java @@ -13,29 +13,7 @@ */ package org.scribble.del.global; -import java.util.Arrays; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.ProtocolDef; -import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GInteractionSeq; -import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ast.global.GProtocolDef; -import org.scribble.ast.global.GRecursion; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.ast.local.LProtocolDef; -import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.lang.SubprotoSig; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.kind.RecVarKind; import org.scribble.del.ProtocolDefDel; -import org.scribble.del.ScribDelBase; -import org.scribble.util.ScribException; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.Projector; -import org.scribble.visit.context.env.ProjectionEnv; -import org.scribble.visit.env.InlineProtocolEnv; public class GProtocolDefDel extends ProtocolDefDel { @@ -43,71 +21,4 @@ public GProtocolDefDel() { } - - @Override - protected GProtocolDefDel copy() - { - GProtocolDefDel copy = new GProtocolDefDel(); - copy.inlined = this.inlined; - return copy; - } - - @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribException - { - CommonTree blame = ((GProtocolDecl) parent).getHeaderChild().getSource(); - SubprotoSig subsig = inl.peekStack(); - GProtocolDef def = (GProtocolDef) visited; - GProtocolBlock block = (GProtocolBlock) ((InlineProtocolEnv) def - .getBlockChild().del().env()).getTranslation(); - - System.out.println("ccc1: " + child); - System.out.println("ccc2: " + visited); - //...HERE: update AF to ANTLR nodes - - RecVarNode recvar = (RecVarNode) inl.lang.config.af.SimpleNameNode(blame, - RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString()); - GRecursion rec = inl.lang.config.af.GRecursion(blame, recvar, block); - GInteractionSeq gis = inl.lang.config.af.GInteractionSeq(blame, Arrays.asList(rec)); - GProtocolDef inlined = inl.lang.config.af.GProtocolDef(def.getSource(), - inl.lang.config.af.GProtocolBlock(blame, gis)); - inl.pushEnv(inl.popEnv().setTranslation(inlined)); - GProtocolDefDel copy = setInlinedProtocolDef(inlined); - return (GProtocolDef) ScribDelBase.popAndSetVisitorEnv(this, inl, - (GProtocolDef) def.del(copy)); - } - - @Override - public void enterProjection(ScribNode parent, ScribNode child, Projector proj) - throws ScribException - { - //pushVisitorEnv(parent, child, proj); - ScribDelBase.pushVisitorEnv(this, proj); - } - - @Override - public GProtocolDef leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribException - { - GProtocolDef gpd = (GProtocolDef) visited; - LProtocolBlock block = (LProtocolBlock) ((ProjectionEnv) gpd.getBlockChild() - .del().env()).getProjection(); - LProtocolDef projection = - gpd.project(proj.lang.config.af, proj.peekSelf(), block); - proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GProtocolDef) ScribDelBase.popAndSetVisitorEnv(this, proj, gpd); - } - - @Override - public GProtocolDef getInlinedProtocolDef() - { - return (GProtocolDef) super.getInlinedProtocolDef(); - } - - @Override - public GProtocolDefDel setInlinedProtocolDef(ProtocolDef inlined) - { - return (GProtocolDefDel) super.setInlinedProtocolDef(inlined); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java index 2a7727507..5ee6d8f68 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java @@ -14,24 +14,15 @@ package org.scribble.del.global; import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.global.GRecursion; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.ast.local.LRecursion; -import org.scribble.ast.name.simple.RecVarNode; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.global.GSeq; import org.scribble.del.RecursionDel; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.Projector; -import org.scribble.visit.context.env.ProjectionEnv; -import org.scribble.visit.env.InlineProtocolEnv; -import org.scribble.visit.wf.WFChoiceChecker; -import org.scribble.visit.wf.env.WFChoiceEnv; -public class GRecursionDel extends RecursionDel implements GCompoundInteractionNodeDel +public class GRecursionDel extends RecursionDel + implements GCompoundInteractionNodeDel { @Override @@ -43,73 +34,4 @@ public org.scribble.core.type.session.global.GRecursion translate(ScribNode n, GSeq block = (GSeq) source.getBlockChild().visitWith(t); return new org.scribble.core.type.session.global.GRecursion(source, recvar, block); } - - @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribException - { - GRecursion gr = (GRecursion) visited; - //RecVarNode recvar = gr.recvar.clone(); - RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) gr.getRecVarChild() - .del().env()).getTranslation(); - GProtocolBlock block = (GProtocolBlock) ((InlineProtocolEnv) gr - .getBlockChild().del().env()).getTranslation(); - GRecursion inlined = - inl.lang.config.af.GRecursion(gr.getSource(), recvar, block); - inl.pushEnv(inl.popEnv().setTranslation(inlined)); - return (GRecursion) super.leaveProtocolInlining(parent, child, inl, gr); - } - - @Override - public GRecursion leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, - WFChoiceChecker checker, ScribNode visited) throws ScribException - { - GRecursion rec = (GRecursion) visited; - WFChoiceEnv merged = checker.popEnv() - .mergeContext((WFChoiceEnv) rec.getBlockChild().del().env()); - // Merge block child env into current rec env - checker.pushEnv(merged); - return (GRecursion) super.leaveInlinedWFChoiceCheck(parent, child, checker, - rec); - // Will merge current rec env into parent (and set env on del) - } - - @Override - public GRecursion leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribException - { - GRecursion gr = (GRecursion) visited; - LProtocolBlock block = - (LProtocolBlock) ((ProjectionEnv) gr.getBlockChild().del().env()) - .getProjection(); - //((GProtocolBlockDel) gr.block.del()).project(gr.getBlock(), self); - LRecursion projection = - gr.project(proj.lang.config.af, proj.peekSelf(), block); - proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GRecursion) GCompoundInteractionNodeDel.super.leaveProjection( - parent, child, proj, gr); - } - - - - - - - - - - - - - /*@Override - public void enterAnnotCheck(ScribNode parent, ScribNode child, AnnotationChecker checker) throws ScribbleException - { - ScribDelBase.pushVisitorEnv(this, checker); - } - - @Override - public GRecursion leaveAnnotCheck(ScribNode parent, ScribNode child, AnnotationChecker checker, ScribNode visited) throws ScribbleException - { - return (GRecursion) ScribDelBase.popAndSetVisitorEnv(this, checker, visited); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java index 3e543df73..db47e85f2 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java @@ -15,15 +15,11 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GWrap; -import org.scribble.ast.local.LScribNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.name.Role; +import org.scribble.core.lang.global.GNode; import org.scribble.del.ConnectionActionDel; import org.scribble.util.ScribException; -import org.scribble.visit.context.Projector; +import org.scribble.visit.GTypeTranslator; import org.scribble.visit.wf.NameDisambiguator; -import org.scribble.visit.wf.WFChoiceChecker; -import org.scribble.visit.wf.env.WFChoiceEnv; // TODO: make WrapDel (cf., G/LMessageTransferDel) public class GWrapDel extends ConnectionActionDel @@ -35,7 +31,7 @@ public GWrapDel() } @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + public ScribNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { GWrap gw = (GWrap) visited; @@ -43,56 +39,8 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, } @Override - public GWrap leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, - WFChoiceChecker checker, ScribNode visited) throws ScribException + public GNode translate(ScribNode n, GTypeTranslator t) throws ScribException { - GWrap gw = (GWrap) visited; - - RoleNode srcNode = gw.getSourceChild(); - RoleNode destNode = gw.getDestinationChild(); - Role src = srcNode.toName(); - Role dest = destNode.toName(); - if (!checker.peekEnv().isEnabled(src)) - { - throw new ScribException(srcNode.getSource(), - "Role not enabled: " + src); - } - if (!checker.peekEnv().isEnabled(dest)) - { - throw new ScribException(destNode.getSource(), - "Role not enabled: " + dest); - } - //Message msg = gw.msg.toMessage(); // Unit message - if (src.equals(dest)) - { - throw new ScribException(gw.getSource(), - "[TODO] Self connections not supported: " + gw); - } - WFChoiceEnv env = checker.popEnv(); - if (!env.isConnected(src, dest)) - { - throw new ScribException(gw.getSource(), - "Roles not (necessarily) connected: " + src + ", " + dest); - } - - //env = env.addMessage(src, dest, msg); - /*env = env - .connect(src, dest) - .addMessage(src, dest, new MessageSig(Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD));*/ - checker.pushEnv(env); - return gw; - } - - @Override - public ScribNode leaveProjection(ScribNode parent, ScribNode child, - Projector proj, ScribNode visited) throws ScribException - // throwsScribbleException - { - GWrap gw = (GWrap) visited; - Role self = proj.peekSelf(); - LScribNode projection = gw.project(proj.lang.config.af, self); - proj.pushEnv(proj.popEnv().setProjection(projection)); - return (GWrap) GSimpleInteractionNodeDel.super.leaveProjection(parent, - child, proj, gw); + throw new RuntimeException("[TODO] :" + n); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java index ad4ca5158..3ec102509 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java @@ -13,76 +13,8 @@ */ package org.scribble.del.local; -import org.scribble.ast.MessageNode; -import org.scribble.ast.MessageSigNode; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LAccept; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Payload; -import org.scribble.util.ScribException; -import org.scribble.visit.context.EGraphBuilder; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; -import org.scribble.visit.context.env.UnguardedChoiceDoEnv; -import org.scribble.visit.wf.ExplicitCorrelationChecker; -import org.scribble.visit.wf.env.ExplicitCorrelationEnv; - public class LAcceptDel extends LConnectionActionDel implements LSimpleInteractionNodeDel { - @Override - public LAccept leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder builder, ScribNode visited) throws ScribException - { - LAccept la = (LAccept) visited; - RoleNode src = la.getSourceChild(); - MessageNode msg = la.getMessageNodeChild(); - - Role peer = src.toName(); - MessageId mid = msg.toMessage().getId(); - Payload payload = msg.isMessageSigNode() // Hacky? - ? ((MessageSigNode) msg).getPayloadListChild().toPayload() - : Payload.EMPTY_PAYLOAD; - builder.util.addEdge(builder.util.getEntry(), - builder.lang.config.ef.newEAccept(peer, mid, payload), - builder.util.getExit()); - return (LAccept) super.leaveEGraphBuilding(parent, child, builder, la); - } - - @Override - public void enterProjectedChoiceSubjectFixing(ScribNode parent, - ScribNode child, ProjectedChoiceSubjectFixer fixer) - { - fixer.setChoiceSubject(((LAccept) child).getSourceChild().toName()); - } - - @Override - public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, - ScribNode child, UnguardedChoiceDoProjectionChecker checker) - throws ScribException - { - super.enterUnguardedChoiceDoProjectionCheck(parent, child, checker); - LAccept la = (LAccept) child; - UnguardedChoiceDoEnv env = checker.popEnv(); - env = env.setChoiceSubject(la.getSourceChild().toName()); - checker.pushEnv(env); - } - - @Override - public LAccept leaveExplicitCorrelationCheck(ScribNode parent, - ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) - throws ScribException - { - LAccept la = (LAccept) visited; - ExplicitCorrelationEnv env = checker.popEnv(); - if (!env.canAccept()) - { - //throw new ScribbleException("Invalid accept action: " + la); - checker.lang.warningPrintln("Session correlation warning for: " + la); - } - checker.pushEnv(env.disableAccept()); - return la; - } + } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java index 1805d5341..5d8ca0068 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java @@ -13,183 +13,9 @@ */ package org.scribble.del.local; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import org.scribble.ast.Choice; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LChoice; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.kind.RoleKind; -import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; import org.scribble.del.ChoiceDel; -import org.scribble.util.ScribException; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.EGraphBuilder; -import org.scribble.visit.context.ProjectedChoiceDoPruner; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; -import org.scribble.visit.context.env.UnguardedChoiceDoEnv; -import org.scribble.visit.env.InlineProtocolEnv; -import org.scribble.visit.wf.ReachabilityChecker; -import org.scribble.visit.wf.env.ReachabilityEnv; public class LChoiceDel extends ChoiceDel implements LCompoundInteractionNodeDel { - /* // Not needed: just enters and pushes, done by base routine (only overwite if do extra stuff, like pushChoiceParent) - @Override - public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, ChoiceUnguardedSubprotocolChecker checker) throws ScribbleException - { - ChoiceUnguardedSubprotocolEnv env = checker.peekEnv().enterContext(); - checker.pushEnv(env); - }*/ - - @Override - public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, - ScribNode child, UnguardedChoiceDoProjectionChecker checker, - ScribNode visited) throws ScribException - { - Choice cho = (Choice) visited; - List benvs = cho.getBlockChildren().stream() - .map(b -> (UnguardedChoiceDoEnv) b.del().env()) - .collect(Collectors.toList()); - UnguardedChoiceDoEnv merged = checker.popEnv().mergeContexts(benvs); - checker.pushEnv(merged); - return (Choice) super.leaveUnguardedChoiceDoProjectionCheck(parent, - child, checker, cho); - // Done merge of children here, super does merge into parent - } - - @Override - public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, - ScribNode child, ProjectedChoiceDoPruner pruner, ScribNode visited) - throws ScribException - { - LChoice lc = (LChoice) visited; - List blocks = lc.getBlockChildren().stream() - .filter(b -> !b.isEmpty()).collect(Collectors.toList()); - if (blocks.isEmpty()) - { - return null; - } - return lc.reconstruct(lc.getSubjectChild(), blocks); - } - @Override - public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, - ScribNode child, ProjectedChoiceSubjectFixer fixer, ScribNode visited) - throws ScribException - { - LChoice lc = (LChoice) visited; - List blocks = lc.getBlockChildren(); - - Set subjs = blocks.stream() - .map(b -> b.getInteractSeqChild().getInteractionChildren().get(0) - .inferLocalChoiceSubject(fixer)) - //.filter((r) -> !r.toString().equals(DummyProjectionRoleNode.DUMMY_PROJECTION_ROLE)) - .collect(Collectors.toSet()); - if (subjs.size() == 0) - { - //throw new RuntimeScribbleException("TODO: unable to infer projection subject: " + parent); - throw new RuntimeException("Shouldn't get in here: " + subjs); // FIXME: should be OK now by model-based WF - } - else - { - subjs = subjs.stream() - .map(r -> fixer.isRecVarRole(r) - ? fixer.getChoiceSubject(new RecVar(r.toString())) - : r) - // Never needed? - .collect(Collectors.toSet()); - } - - // HACK? (for non- role-balanced choice cases) - subjs = subjs.stream().filter((s) -> s != null).collect(Collectors.toSet()); - - if (subjs.size() > 1) // Unnecessary: due to WF check in GChoiceDel.leaveInlinedPathCollection -- would be better as a check on locals than in projection anyway - { - String self = fixer.getModuleContext().root.getSimpleName().toString(); // HACK - self = self.substring(self.lastIndexOf('_')+1, self.length()); // FIXME: not comaptible with role names that include "_" - throw new ScribException(lc.getSource(), "Cannot project onto " + self - + " due to inconsistent local choice subjects: " + subjs); - // self not recorded -- can derive from LProtocolDecl RoleDeclList - //throw new RuntimeException("Shouldn't get in here: " + subjs); - } - RoleNode subj = (RoleNode) fixer.lang.config.af.SimpleNameNode(null, RoleKind.KIND, // CHECKME? null source OK? - //blocks.get(0).getInteractionSeq().getInteractions().get(0).inferLocalChoiceSubject(fixer).toString()); - subjs.iterator().next().toString()); - fixer.setChoiceSubject(subj.toName()); - LChoice projection = - fixer.lang.config.af.LChoice(lc.getSource(), subj, blocks); - return projection; - } - - @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribException - { - LChoice lc = (LChoice) visited; - List blocks = - lc.getBlockChildren().stream() - .map(b -> (LProtocolBlock) ((InlineProtocolEnv) b.del().env()) - .getTranslation()) - .collect(Collectors.toList()); - RoleNode subj = lc.getSubjectChild().clone();//inl.job.af); - LChoice inlined = inl.lang.config.af.LChoice(lc.getSource(), subj, blocks); - inl.pushEnv(inl.popEnv().setTranslation(inlined)); - return (LChoice) super.leaveProtocolInlining(parent, child, inl, lc); - } - - @Override - public LChoice leaveReachabilityCheck(ScribNode parent, ScribNode child, - ReachabilityChecker checker, ScribNode visited) throws ScribException - { - LChoice cho = (LChoice) visited; - List benvs = - cho.getBlockChildren().stream() - .map(b -> (ReachabilityEnv) b.del().env()) - .collect(Collectors.toList()); - ReachabilityEnv merged = checker.popEnv().mergeForChoice(benvs); - checker.pushEnv(merged); - return (LChoice) LCompoundInteractionNodeDel.super.leaveReachabilityCheck( - parent, child, checker, visited); - // records the current checker Env to the current del; also pops and merges that env into the parent env - } - - @Override - public void enterEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder graph) - { - super.enterEGraphBuilding(parent, child, graph); - graph.util.enterChoice(); - } - - public LChoice visitForFsmConversion(EGraphBuilder graph, LChoice child) - { - try - { - for (LProtocolBlock block : child.getBlockChildren()) - { - graph.util.pushChoiceBlock(); - block.accept(graph); - graph.util.popChoiceBlock(); - } - } - catch (ScribException e) - { - throw new RuntimeException("Shouldn't get in here: " + e); - } - return child; - } - - @Override - public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder graph, ScribNode visited) throws ScribException - { - graph.util.leaveChoice(); - return super.leaveEGraphBuilding(parent, child, graph, visited); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java index daa59db0b..f88f45b0e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java @@ -13,25 +13,7 @@ */ package org.scribble.del.local; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LCompoundInteraction; -import org.scribble.util.ScribException; -import org.scribble.visit.wf.ReachabilityChecker; -import org.scribble.visit.wf.env.ReachabilityEnv; - public interface LCompoundInteractionNodeDel extends LInteractionNodeDel { - @Override - default LCompoundInteraction leaveReachabilityCheck(ScribNode parent, - ScribNode child, ReachabilityChecker checker, ScribNode visited) - throws ScribException - { - // Following CompoundInteractionNodeDel#leaveInlinedProtocolUnfolding/leaveWFChoiceCheck - ReachabilityEnv visited_env = checker.popEnv(); - setEnv(visited_env); - ReachabilityEnv parent_env = checker.popEnv(); - parent_env = parent_env.mergeContext(visited_env); - checker.pushEnv(parent_env); - return (LCompoundInteraction) visited; - } + } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java index 793391ce7..8e65312bb 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java @@ -13,19 +13,9 @@ */ package org.scribble.del.local; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LConnectionAction; import org.scribble.del.ConnectionActionDel; -import org.scribble.util.ScribException; -import org.scribble.visit.wf.ExplicitCorrelationChecker; public abstract class LConnectionActionDel extends ConnectionActionDel implements LSimpleInteractionNodeDel { - @Override - public LConnectionAction leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribException - { - LConnectionAction lca = (LConnectionAction) visited; - checker.pushEnv(checker.popEnv().disableAccept()); - return lca; - } + } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java index e1a405820..b75cc32d3 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java @@ -13,89 +13,10 @@ */ package org.scribble.del.local; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LContinue; -import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.model.endpoint.EState; -import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.RecVar; import org.scribble.del.ContinueDel; -import org.scribble.util.ScribException; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.EGraphBuilder; -import org.scribble.visit.env.InlineProtocolEnv; -import org.scribble.visit.wf.ReachabilityChecker; -import org.scribble.visit.wf.env.ReachabilityEnv; public class LContinueDel extends ContinueDel implements LSimpleInteractionNodeDel { - @Override - public LContinue leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribException - { - LContinue lc = (LContinue) visited; - RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) lc.getRecVarChild() - .del().env()).getTranslation(); - LContinue inlined = inl.lang.config.af.LContinue(lc.getSource(), recvar); - inl.pushEnv(inl.popEnv().setTranslation(inlined)); - return (LContinue) super.leaveProtocolInlining(parent, child, inl, lc); - } - - @Override - public LContinue leaveReachabilityCheck(ScribNode parent, ScribNode child, - ReachabilityChecker checker, ScribNode visited) throws ScribException - { - // "Entering" the continue here in leave, where we can merge the new state into the parent Env - // Generally: if side effecting Env state to be merged into the parent (not just popped and discarded), leave must be overridden to do so - LContinue lc = (LContinue) visited; - ReachabilityEnv env = checker.popEnv() - .addContinueLabel(lc.getRecVarChild().toName()); - setEnv(env); // Env recording probably not needed for all LocalInteractionNodes, just the compound ones, like for WF-choice checking - checker.pushEnv(checker.popEnv().mergeContext(env)); - return lc; - } - - @Override - public LContinue leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder graph, ScribNode visited) throws ScribException - { - LContinue lr = (LContinue) visited; - RecVar rv = lr.getRecVarChild().toName(); - if (graph.util.isUnguardedInChoice()) - { - graph.util.addContinueEdge(graph.util.getEntry(), rv); - } - else // ** "Overwrites" previous edge built by send/receive(s) leading to this continue - { - Iterator preds = graph.util.getPredecessors().iterator(); - Iterator prevs = graph.util.getPreviousActions().iterator(); - EState entry = graph.util.getEntry(); - Set> removed = new HashSet<>(); - // HACK: for identical edges, i.e. same pred/prev/succ (e.g. rec X { choice at A { A->B:1 } or { A->B:1 } continue X; }) // FIXME: do here, or refactor into GraphBuilder? - // Because duplicate edges preemptively pruned by ModelState.addEdge, but corresponding predecessors not pruned // FIXME: make uniform - while (preds.hasNext()) - { - EState pred = preds.next(); - EAction prev = prevs.next(); - List tmp = Arrays.asList(pred, prev, entry); - if (!removed.contains(tmp)) - { - removed.add(tmp); - graph.util.removeEdgeFromPredecessor(pred, prev); // Assumes pred is a predecessor, and removes pred from current predecessors.. - } - graph.util.addRecursionEdge(pred, prev, - graph.util.getRecursionEntry(rv)); - // May be repeated for non-det, but OK // Combine with removeEdgeFromPredecessor? - } - } - return (LContinue) super.leaveEGraphBuilding(parent, child, graph, lr); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java index 9266f3313..128981179 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java @@ -13,32 +13,10 @@ */ package org.scribble.del.local; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LDisconnect; -import org.scribble.core.type.name.Role; import org.scribble.del.ConnectionActionDel; -import org.scribble.util.ScribException; -import org.scribble.visit.context.EGraphBuilder; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LDisconnectDel extends ConnectionActionDel implements LSimpleInteractionNodeDel { - @Override - public LDisconnect leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder builder, ScribNode visited) throws ScribException - { - LDisconnect ld = (LDisconnect) visited; - Role peer = ld.getPeerChild().toName(); - builder.util.addEdge(builder.util.getEntry(), - builder.lang.config.ef.newEDisconnect(peer), builder.util.getExit()); - return (LDisconnect) super.leaveEGraphBuilding(parent, child, builder, ld); - } - - @Override - public void enterProjectedChoiceSubjectFixing(ScribNode parent, - ScribNode child, ProjectedChoiceSubjectFixer fixer) - { - fixer.setChoiceSubject(((LDisconnect) child).getSelfChild().toName()); - } + } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java index d022b3c52..cd4c3e582 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java @@ -13,154 +13,9 @@ */ package org.scribble.del.local; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.RoleArg; -import org.scribble.ast.RoleArgList; -import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ast.local.LContinue; -import org.scribble.ast.local.LDo; -import org.scribble.ast.local.LInteractionSeq; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.ast.local.LProtocolDecl; -import org.scribble.ast.local.LRecursion; -import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.lang.SubprotoSig; -import org.scribble.core.type.kind.RecVarKind; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.LProtocolName; -import org.scribble.core.type.name.ProtocolName; -import org.scribble.core.type.name.Role; import org.scribble.del.DoDel; -import org.scribble.lang.LangContext; -import org.scribble.util.ScribException; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.ProjectedRoleDeclFixer; -import org.scribble.visit.context.ProtocolDeclContextBuilder; -import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; -import org.scribble.visit.env.InlineProtocolEnv; public class LDoDel extends DoDel implements LSimpleInteractionNodeDel { - // Part of context building - @Override - protected void addProtocolDependency(ProtocolDeclContextBuilder builder, - Role self, ProtocolName proto, Role target) - { - builder.addLocalProtocolDependency(self, (LProtocolName) proto, target); - } - - // Only called if cycle - public LDo visitForSubprotocolInlining(ProtocolDefInliner builder, LDo child) - { - CommonTree blame = child.getSource(); // Cf., GDoDel - SubprotoSig subsig = builder.peekStack(); - RecVarNode recvar = (RecVarNode) builder.lang.config.af.SimpleNameNode(blame, - RecVarKind.KIND, builder.getSubprotocolRecVar(subsig).toString()); - LContinue inlined = builder.lang.config.af.LContinue(blame, recvar); - builder.pushEnv(builder.popEnv().setTranslation(inlined)); - return child; - } - - @Override - public LDo leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner dinlr, ScribNode visited) throws ScribException - { - if (!dinlr.isCycle()) - { - CommonTree blame = visited.getSource(); // Cf., GDoDel - SubprotoSig subsig = dinlr.peekStack(); - RecVarNode recvar = (RecVarNode) dinlr.lang.config.af.SimpleNameNode(blame, - RecVarKind.KIND, dinlr.getSubprotocolRecVar(subsig).toString()); - LInteractionSeq gis = (LInteractionSeq) (((InlineProtocolEnv) dinlr - .peekEnv()).getTranslation()); - LProtocolBlock gb = dinlr.lang.config.af.LProtocolBlock(blame, gis); - LRecursion inlined = dinlr.lang.config.af.LRecursion(blame, recvar, gb); - dinlr.pushEnv(dinlr.popEnv().setTranslation(inlined)); - dinlr.removeSubprotocolRecVar(subsig); - } - return (LDo) super.leaveProtocolInlining(parent, child, dinlr, visited); - } - - // Pre: this pass is only run on projections (LProjectionDeclDel has source global protocol info) - @Override - public ScribNode - leaveProjectedRoleDeclFixing(ScribNode parent, ScribNode child, - ProjectedRoleDeclFixer fixer, ScribNode visited) - throws ScribException - // CHECKME: similar needed for non-role args? Or all params always known? (not ideal for distributed?) - { - LangContext jc = fixer.lang.getContext(); - LDo ld = (LDo) visited; - RoleArgList roleList = ld.getRoleListChild(); - LProtocolDecl lpd = ld.getTargetProtocolDecl(jc, fixer.getModuleContext()); - - // do role args are currently as inherited from the global type -- so need to derive role map against the global protocol header - // Doing it off the global roledecls allows this to be done in one pass, but would probably be easier to split into two (e.g. 1st cache the proposed changes, 2nd write all changes -- the problem with a single pass is e.g. looking up the localdecl info while localdecls are being rewritten during the pass) - // Could possibly factor out rolemap making with SubprotocolVisitor a bit, but there it maps to RoleNode and works off a root map - GProtocolName source = ((LProjectionDeclDel) lpd.del()).getSourceProtocol(); - GProtocolDecl gpd = (GProtocolDecl) jc.getModule(source.getPrefix()) - .getProtocolDeclChild(source.getSimpleName()); - Iterator i = roleList.getArgChildren().iterator(); - Map rolemap = gpd.getHeaderChild().getRoleDeclListChild().getRoles().stream().collect( - Collectors.toMap(r -> r, r -> i.next().getValChild().toName())); - Set occs = ((LProtocolDeclDel) lpd.del()).getProtocolDeclContext() - .getRoleOccurrences().stream().map(r -> rolemap.get(r)) - .collect(Collectors.toSet()); - - List roleArgs = roleList.getArgChildren().stream() - .filter(ra -> occs.contains(ra.getValChild().toName())) - .collect(Collectors.toList()); - RoleArgList roleList1 = roleList.reconstruct(roleArgs); - return super.leaveProjectedRoleDeclFixing(parent, child, fixer, - ld.reconstruct(roleList1, ld.getNonRoleListChild(), ld.getProtocolNameNode())); - } - - @Override - public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, - ScribNode child, UnguardedChoiceDoProjectionChecker checker, - ScribNode visited) throws ScribException - { - /*//if (checker.isCycle()) - if (checker.isRootedCycle()) // ChoiceUnguardedSubprotocolChecker is a (regular) SubprotocolVisitor which pushes a subprotosig on root decl entry (ProjectedSubprotocolPruner.visit) - // Check for "rooted" cycle to ensure it's specifically the cycle from the root proto decl (back) to the target do - // FIXME: but cycle to specific "target do" is not ensured: could be another instance of a do with the same subprotosig... an inherent issue of the current subprotocolvisitor framework - - // FIXME: this algorithm works for some use cases for is still wrong (prunes some that it shouldn't -- e.g. mutually pruneable choice-unguarded do's) - // *** what we really need is to check for 0 inferred choice subjects up to recursion back (if any) to to the parent choice -- problem is current framework doesn't make identifying (e.g. ==) the original choice easy *** - // the issue is arising since WF was relaxed to allow unbalanced choice case roles: with balanced, subject inference is always fine as long as roles are used? (and prev assumed no choice-unguarded do's?) - { - //System.out.println("ABC: " + checker.peekEnv().subjs + ", " + checker.SHOULD_PRUNE); - - //if (checker.peekEnv().shouldPrune()) - if (checker.peekEnv().subjs.isEmpty()) - { - /*ChoiceUnguardedSubprotocolEnv env = checker.popEnv(); - checker.pushEnv(env.disablePrune());* / - //checker.enablePrune(); - } - }*/ - return super.leaveUnguardedChoiceDoProjectionCheck(parent, child, checker, - visited); - // for each do: check shouldPrune condition by following the control flow: if terminates or cycles with no actions then prune - // Let the main pruning visitor be a regular visitor, and use the subprotocol visitor to follow the calls for pruning analysis - - //CHECKME: maybe similar to project roledecl fixing? use role occurrences saved in protocoldecl? - // role occurrences collected by RoleCollector which is indeed subprotocol visitor - // problem is RoleCollector currently comes after subject fixing... but maybe it doesn't need to collect subject roles in the end? due to WF enabling checks? - - //..not role collection, that's a "may" usage of roles - //..should be: start from a candidate unguarded-do inside a choice: want to know if this choice case should be removed - //......follow protocol flow through do until either end or return to this choice, looking for actions - // ... but look only on direct path or across all branches? - - //...or else it should be: start from the target protocoldecl and go through to the candidate do (cf grecursion.prune) - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java index 20357940e..3ec9de190 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java @@ -13,25 +13,9 @@ */ package org.scribble.del.local; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LSessionNode; import org.scribble.del.InteractionNodeDel; -import org.scribble.del.ScribDelBase; -import org.scribble.util.ScribException; -import org.scribble.visit.wf.ReachabilityChecker; public interface LInteractionNodeDel extends InteractionNodeDel { - // Unlike WF-choice enter/leave for CompoundInteractionNodeDelegate (i.e. both global/local), reachability is limited to local only - @Override - default void enterReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker) throws ScribException - { - ScribDelBase.pushVisitorEnv(this, checker); - } - @Override - default LSessionNode leaveReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker, ScribNode visited) throws ScribException - { - return (LSessionNode) ScribDelBase.popAndSetVisitorEnv(this, checker, visited); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java index e22c2828e..b3dbc7f0f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java @@ -13,149 +13,9 @@ */ package org.scribble.del.local; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import org.scribble.ast.SessionNode; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LSessionNode; -import org.scribble.core.model.endpoint.EState; -import org.scribble.core.type.kind.Local; -import org.scribble.ast.local.LInteractionSeq; -import org.scribble.ast.local.LRecursion; import org.scribble.del.InteractionSeqDel; -import org.scribble.del.ScribDelBase; -import org.scribble.util.ScribException; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.EGraphBuilder; -import org.scribble.visit.context.ProjectedChoiceDoPruner; -import org.scribble.visit.context.RecRemover; -import org.scribble.visit.env.InlineProtocolEnv; -import org.scribble.visit.wf.ReachabilityChecker; -import org.scribble.visit.wf.env.ReachabilityEnv; public class LInteractionSeqDel extends InteractionSeqDel { - @Override - public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, - ScribNode child, ProjectedChoiceDoPruner pruner, ScribNode visited) - throws ScribException - { - LInteractionSeq lc = (LInteractionSeq) visited; - List actions = lc.getInteractionChildren().stream() - .filter(li -> li != null).collect(Collectors.toList()); - return lc.reconstruct(actions); - } - - // enter in super - @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribException - { - LInteractionSeq lis = (LInteractionSeq) visited; - List lins = new LinkedList(); - for (LSessionNode li : lis.getInteractionChildren()) - { - ScribNode inlined = ((InlineProtocolEnv) li.del().env()).getTranslation(); - if (inlined instanceof LInteractionSeq) - { - lins.addAll(((LInteractionSeq) inlined).getInteractionChildren()); - } - else - { - lins.add((LSessionNode) inlined); - } - } - LInteractionSeq inlined = - inl.lang.config.af.LInteractionSeq(lis.getSource(), lins); - inl.pushEnv(inl.popEnv().setTranslation(inlined)); - return (LInteractionSeq) ScribDelBase.popAndSetVisitorEnv(this, inl, lis); - } - - // Replaces visitChildrenInSubprotocols for LocalInteractionSequence - public LInteractionSeq visitForReachabilityChecking( - ReachabilityChecker checker, LInteractionSeq child) - throws ScribException - { - List visited = new LinkedList<>(); - for (SessionNode li : child.getInteractionChildren()) - { - ReachabilityEnv re = checker.peekEnv(); - if (!re.isSequenceable()) - { - throw new ScribException(li.getSource(), - "Invalid/unreachable sequence to: " + li); - } - visited.add((LSessionNode) li.accept(checker)); - } - return child; - } - public LInteractionSeq visitForFsmConversion(EGraphBuilder gb, - LInteractionSeq child) throws ScribException - { - EState entry = gb.util.getEntry(); - EState exit = gb.util.getExit(); - //try - { - /*for (int i = child.getInteractions().size() - 1; i >= 0; i--) // Backwards for "tau-less" continue - { - if (i > 0) - { - EndpointState tmp = conv.builder.newState(Collections.emptySet()); - conv.builder.setEntry(tmp); - child.getInteractions().get(i).accept(conv); - conv.builder.setExit(conv.builder.getEntry()); // entry may not be tmp, entry/exit can be modified, e.g. continue - } - else - { - conv.builder.setEntry(entry); - child.getInteractions().get(i).accept(conv); - } - }*/ - for (int i = 0; i < child.getInteractionChildren().size(); i++) - { - if (i == child.getInteractionChildren().size() - 1) - { - gb.util.setExit(exit); - child.getInteractionChildren().get(i).accept(gb); - } - else - { - EState tmp = // conv.util.newState(Collections.emptySet()); - gb.util.ef.newEState(Collections.emptySet()); - gb.util.setExit(tmp); - child.getInteractionChildren().get(i).accept(gb); - gb.util.setEntry(gb.util.getExit()); - // exit may not be tmp, entry/exit can be modified, e.g. continue - } - } - } - /*catch (ScribbleException e) // Hack: EFSM building now done before reachability check, removeEdge can fail - { - throw new RuntimeException("Shouldn't get in here: " + e); - }*/ - //conv.builder.setExit(exit); - gb.util.setEntry(entry); - return child; - } - - // Duplicated from GInteractionSeq - @Override - public LInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, - RecRemover rem, ScribNode visited) throws ScribException - { - LInteractionSeq lis = (LInteractionSeq) visited; - List lins = lis.getInteractionChildren().stream() - .flatMap((li) -> (li instanceof LRecursion - && rem.toRemove(((LRecursion) li).getRecVarChild().toName())) - ? ((LRecursion) li).getBlockChild().getInteractSeqChild() - .getInteractionChildren().stream() - : Stream.of(li)) - .collect(Collectors.toList()); - return rem.lang.config.af.LInteractionSeq(lis.getSource(), lins); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java index 4c0301431..34fd7046d 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java @@ -13,19 +13,9 @@ */ package org.scribble.del.local; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LMessageTransfer; import org.scribble.del.MessageTransferDel; -import org.scribble.util.ScribException; -import org.scribble.visit.wf.ExplicitCorrelationChecker; public abstract class LMessageTransferDel extends MessageTransferDel implements LSimpleInteractionNodeDel { - @Override - public ScribNode leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribException - { - LMessageTransfer lmt = (LMessageTransfer) visited; - checker.pushEnv(checker.popEnv().disableAccept()); - return lmt; - } + } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java index a474a9103..e112851ac 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java @@ -13,74 +13,7 @@ */ package org.scribble.del.local; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import org.scribble.ast.ProtocolModList; -import org.scribble.ast.RoleDecl; -import org.scribble.ast.RoleDeclList; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LProtocolDecl; -import org.scribble.ast.local.LProtocolHeader; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.Role; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedRoleDeclFixer; - public class LProjectionDeclDel extends LProtocolDeclDel { - // Maybe better to store in context, but more convenient to pass to here via factory (than infer in context building) -- could alternatively store in projected module - protected final GProtocolName fullname; - protected final Role self; // Can be obtained from LProtocolHeader? - - public LProjectionDeclDel(GProtocolName fullname, Role self) - { - this.fullname = fullname; - this.self = self; - } - - @Override - protected LProtocolDeclDel copy() - { - return new LProjectionDeclDel(this.fullname, this.self); - } - @Override - public ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, - ScribNode child, ProjectedRoleDeclFixer fixer, ScribNode visited) - throws ScribException - { - LProtocolDecl lpd = (LProtocolDecl) visited; - // TODO: ensure all role params are used, to avoid empty roledecllist - Set occs = ((LProtocolDeclDel) lpd.del()).getProtocolDeclContext() - .getRoleOccurrences(); - List rds = lpd.getHeaderChild().getRoleDeclListChild() - .getParamDeclChildren().stream() - .filter(rd -> occs.contains(rd.getDeclName())) - .collect(Collectors.toList()); - LProtocolHeader tmp = lpd.getHeaderChild(); - RoleDeclList rdl = fixer.lang.config.af - .RoleDeclList(tmp.getRoleDeclListChild().getSource(), rds); - LProtocolHeader hdr = tmp.reconstruct(tmp.getNameNodeChild(), rdl, - tmp.getParamDeclListChild()); - ProtocolModList mods = lpd.getModifierListChild(); // CHECKME: erase source? - LProtocolDecl fixed = lpd.reconstruct(mods, hdr, lpd.getDefChild()); - - fixer.lang.debugPrintln("\n[DEBUG] Projected " + getSourceProtocol() - + " for " + getSelfRole() + ":\n" + fixed); - - return super.leaveProjectedRoleDeclFixing(parent, child, fixer, fixed); - } - - public GProtocolName getSourceProtocol() - { - return this.fullname; - } - - // Redundant with SelfRoleDecl in header - public Role getSelfRole() - { - return this.self; - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java index eb9afb97d..a272996d8 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java @@ -13,44 +13,9 @@ */ package org.scribble.del.local; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LInteractionSeq; -import org.scribble.ast.local.LProtocolBlock; import org.scribble.del.ProtocolBlockDel; -import org.scribble.del.ScribDelBase; -import org.scribble.util.ScribException; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.env.InlineProtocolEnv; -import org.scribble.visit.wf.ReachabilityChecker; public class LProtocolBlockDel extends ProtocolBlockDel { - @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribException - { - LProtocolBlock lpb = (LProtocolBlock) visited; - LInteractionSeq seq = (LInteractionSeq) ((InlineProtocolEnv) lpb - .getInteractSeqChild().del().env()).getTranslation(); - LProtocolBlock inlined = inl.lang.config.af.LProtocolBlock(lpb.getSource(), seq); - inl.pushEnv(inl.popEnv().setTranslation(inlined)); - return (LProtocolBlock) ScribDelBase.popAndSetVisitorEnv(this, inl, lpb); - } - @Override - public void enterReachabilityCheck(ScribNode parent, ScribNode child, - ReachabilityChecker checker) throws ScribException - { - ScribDelBase.pushVisitorEnv(this, checker); - } - - @Override - public LProtocolBlock leaveReachabilityCheck(ScribNode parent, - ScribNode child, ReachabilityChecker checker, ScribNode visited) - throws ScribException - { - return (LProtocolBlock) ScribDelBase.popAndSetVisitorEnv(this, checker, - visited); - // records the current checker Env to the current del; also pops and merges that env into the parent env - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java index 060d13128..e0accce81 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java @@ -13,19 +13,8 @@ */ package org.scribble.del.local; -import java.util.Collections; - -import org.scribble.ast.ScribNode; -import org.scribble.ast.context.local.LProtocolDeclContext; -import org.scribble.ast.local.LProtocolDecl; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.LProtocolName; -import org.scribble.core.type.name.ProtocolName; -import org.scribble.core.type.name.Role; import org.scribble.del.ProtocolDeclDel; -import org.scribble.util.ScribException; -import org.scribble.visit.context.EGraphBuilder; -import org.scribble.visit.context.ProtocolDeclContextBuilder; public class LProtocolDeclDel extends ProtocolDeclDel { @@ -33,70 +22,4 @@ public LProtocolDeclDel() { } - - @Override - protected LProtocolDeclDel copy() - { - return new LProtocolDeclDel(); - } - - @Override - protected void addSelfDependency(ProtocolDeclContextBuilder builder, - ProtocolName proto, Role role) - { - builder.addLocalProtocolDependency(role, (LProtocolName) proto, role); - } - - @Override - public void enterProtocolDeclContextBuilding(ScribNode parent, - ScribNode child, ProtocolDeclContextBuilder builder) - throws ScribException - { - super.enterProtocolDeclContextBuilding(parent, child, builder); - } - - @Override - public LProtocolDecl leaveProtocolDeclContextBuilding(ScribNode parent, - ScribNode child, ProtocolDeclContextBuilder builder, ScribNode visited) - throws ScribException - { - LProtocolDecl lpd = (LProtocolDecl) visited; - LProtocolDeclContext lcontext = new LProtocolDeclContext( - builder.getLocalProtocolDependencyMap()); - LProtocolDeclDel del = (LProtocolDeclDel) setProtocolDeclContext(lcontext); - return (LProtocolDecl) lpd.del(del); - } - - @Override - public void enterEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder builder) - { - builder.util.init(builder.lang.config.ef.newEState(Collections.emptySet())); - // Same util is used for multiple protos, need to (re-)init each time - } - - @Override - public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder graph, ScribNode visited) - { - /*LProtocolDecl lpd = (LProtocolDecl) visited; // Refactored into JobContext - - JobContext jc = graph.getJobContext(); - // FIXME: should just bypass builder visit if already built - LProtocolName lpn = lpd.getFullMemberName((Module) parent); - if (jc.getEndpointGraph(lpn) == null) // FIXME: what is the routine to obtain gpn from lpn? - { - //EndpointGraph fsm = new EndpointGraph(graph.builder.getEntry(), graph.builder.getExit()); - EndpointGraph graph = graph.builder.finalise(); - - jc.addEndpointGraph(lpn, graph); - }*/ - return visited; - } - - @Override - public LProtocolDeclContext getProtocolDeclContext() - { - return (LProtocolDeclContext) super.getProtocolDeclContext(); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java index 8db9d1d09..23c95c082 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java @@ -13,25 +13,7 @@ */ package org.scribble.del.local; -import java.util.Arrays; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.ProtocolDef; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LInteractionSeq; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.ast.local.LProtocolDecl; -import org.scribble.ast.local.LProtocolDef; -import org.scribble.ast.local.LRecursion; -import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.lang.SubprotoSig; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.kind.RecVarKind; import org.scribble.del.ProtocolDefDel; -import org.scribble.del.ScribDelBase; -import org.scribble.util.ScribException; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.env.InlineProtocolEnv; public class LProtocolDefDel extends ProtocolDefDel { @@ -39,47 +21,4 @@ public LProtocolDefDel() { } - - @Override - protected LProtocolDefDel copy() - { - LProtocolDefDel copy = new LProtocolDefDel(); - copy.inlined = this.inlined; - return copy; - } - - @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribException - { - CommonTree blame = ((LProtocolDecl) parent).getHeaderChild().getSource(); // Cf., GProtocolDefDel - SubprotoSig subsig = inl.peekStack(); - LProtocolDef def = (LProtocolDef) visited; - LProtocolBlock block = (LProtocolBlock) ((InlineProtocolEnv) def - .getBlockChild().del().env()).getTranslation(); - RecVarNode recvar = (RecVarNode) inl.lang.config.af.SimpleNameNode(blame, // The parent do would probably be the better source for blame - RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString()); - LRecursion rec = inl.lang.config.af.LRecursion(blame, recvar, block); - LInteractionSeq lis = - inl.lang.config.af.LInteractionSeq(blame, Arrays.asList(rec)); - LProtocolDef inlined = inl.lang.config.af.LProtocolDef(def.getSource(), - inl.lang.config.af.LProtocolBlock(blame, lis)); - inl.pushEnv(inl.popEnv().setTranslation(inlined)); - LProtocolDefDel copy = setInlinedProtocolDef(inlined); - return (LProtocolDef) ScribDelBase.popAndSetVisitorEnv(this, inl, - (LProtocolDef) def.del(copy)); - } - - @Override - public LProtocolDef getInlinedProtocolDef() - { - return (LProtocolDef) super.getInlinedProtocolDef(); - } - - @Override - public LProtocolDefDel setInlinedProtocolDef( - ProtocolDef inlined) - { - return (LProtocolDefDel) super.setInlinedProtocolDef(inlined); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java index 96b6a6346..d25ea8734 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java @@ -13,55 +13,7 @@ */ package org.scribble.del.local; -import org.scribble.ast.MessageNode; -import org.scribble.ast.MessageSigNode; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LReceive; -import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Payload; -import org.scribble.util.ScribException; -import org.scribble.visit.context.EGraphBuilder; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; -import org.scribble.visit.context.env.UnguardedChoiceDoEnv; - public class LReceiveDel extends LMessageTransferDel { - @Override - public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder builder, ScribNode visited) throws ScribException - { - LReceive lr = (LReceive) visited; - Role peer = lr.getSourceChild().toName(); - MessageNode msg = lr.getMessageNodeChild(); - MessageId mid = msg.toMessage().getId(); - Payload payload = (msg.isMessageSigNode()) // CHECKME: Hacky? - ? ((MessageSigNode) msg).getPayloadListChild().toPayload() - : Payload.EMPTY_PAYLOAD; - builder.util.addEdge(builder.util.getEntry(), - builder.lang.config.ef.newEReceive(peer, mid, payload), - builder.util.getExit()); - //builder.builder.addEdge(builder.builder.getEntry(), Receive.get(peer, mid, payload), builder.builder.getExit()); - return (LReceive) super.leaveEGraphBuilding(parent, child, builder, lr); - } - @Override - public void enterProjectedChoiceSubjectFixing(ScribNode parent, - ScribNode child, ProjectedChoiceSubjectFixer fixer) - { - fixer.setChoiceSubject(((LReceive) child).getSourceChild().toName()); - } - - @Override - public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, - ScribNode child, UnguardedChoiceDoProjectionChecker checker) - throws ScribException - { - super.enterUnguardedChoiceDoProjectionCheck(parent, child, checker); - LReceive lr = (LReceive) child; - UnguardedChoiceDoEnv env = checker.popEnv(); - env = env.setChoiceSubject(lr.getSourceChild().toName()); - checker.pushEnv(env); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java index d3a82e05f..8fbbd3eac 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java @@ -13,111 +13,10 @@ */ package org.scribble.del.local; -import org.scribble.ast.Recursion; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.ast.local.LRecursion; -import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.type.name.RecVar; import org.scribble.del.RecursionDel; -import org.scribble.util.ScribException; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.EGraphBuilder; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; -import org.scribble.visit.context.env.UnguardedChoiceDoEnv; -import org.scribble.visit.env.InlineProtocolEnv; -import org.scribble.visit.wf.ReachabilityChecker; -import org.scribble.visit.wf.env.ReachabilityEnv; public class LRecursionDel extends RecursionDel implements LCompoundInteractionNodeDel { - @Override - public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, - ScribNode child, UnguardedChoiceDoProjectionChecker checker, - ScribNode visited) throws ScribException - { - Recursion rec = (Recursion) visited; - UnguardedChoiceDoEnv merged = checker.popEnv() - .mergeContext((UnguardedChoiceDoEnv) rec.getBlockChild().del().env()); - checker.pushEnv(merged); - return (Recursion) super.leaveUnguardedChoiceDoProjectionCheck(parent, - child, checker, rec); - } - @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inl, ScribNode visited) throws ScribException - { - LRecursion lr = (LRecursion) visited; - //RecVarNode recvar = lr.recvar.clone(); - RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) lr.getRecVarChild() - .del().env()).getTranslation(); - LProtocolBlock block = (LProtocolBlock) ((InlineProtocolEnv) lr - .getBlockChild().del().env()).getTranslation(); - LRecursion inlined = - inl.lang.config.af.LRecursion(lr.getSource(), recvar, block); - inl.pushEnv(inl.popEnv().setTranslation(inlined)); - return (LRecursion) super.leaveProtocolInlining(parent, child, inl, lr); - } - - @Override - public LRecursion leaveReachabilityCheck(ScribNode parent, ScribNode child, - ReachabilityChecker checker, ScribNode visited) throws ScribException - { - LRecursion lr = (LRecursion) visited; - ReachabilityEnv env = checker.popEnv() - .mergeContext((ReachabilityEnv) lr.getBlockChild().del().env()); - env = env.removeContinueLabel(lr.getRecVarChild().toName()); - checker.pushEnv(env); - return (LRecursion) LCompoundInteractionNodeDel.super.leaveReachabilityCheck( - parent, child, checker, visited); - // records the current checker Env to the current del; also pops and merges that env into the parent env - } - - @Override - public void enterEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder graph) - { - super.enterEGraphBuilding(parent, child, graph); - LRecursion lr = (LRecursion) child; - RecVar rv = lr.getRecVarChild().toName(); - // Update existing state, not replace it -- cf. LDoDel - /*if (graph.builder.isUnguardedInChoice()) // Actually, not needed since unfoldings are enough to make graph building work (and this makes combined unguarded choice-rec and continue protocols work) - { - // Using "previous" entry for this rec lab works because unguarded recs already unfolded (including nested recvar shadowing -- if unguarded choice-rec, it will be unfolded and rec entry recorded for guarded unfolding) - graph.builder.pushRecursionEntry(rv, graph.builder.getRecursionEntry(rv)); - } - else*/ - { - graph.util.addEntryLabel(rv); - graph.util.pushRecursionEntry(rv, graph.util.getEntry()); - } - } - - @Override - public LRecursion leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder graph, ScribNode visited) throws ScribException - { - LRecursion lr = (LRecursion) visited; - RecVar rv = lr.getRecVarChild().toName(); - graph.util.popRecursionEntry(rv); - return (LRecursion) super.leaveEGraphBuilding(parent, child, graph, lr); - } - - @Override - public void enterProjectedChoiceSubjectFixing(ScribNode parent, - ScribNode child, ProjectedChoiceSubjectFixer fixer) - { - fixer.pushRec(((LRecursion) child).getRecVarChild().toName()); - } - - @Override - public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, - ScribNode child, ProjectedChoiceSubjectFixer fixer, ScribNode visited) - { - fixer.popRec(((LRecursion) child).getRecVarChild().toName()); - return visited; - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java index c82c4cf32..ba00e35ca 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java @@ -13,45 +13,8 @@ */ package org.scribble.del.local; -import org.scribble.ast.MessageNode; -import org.scribble.ast.MessageSigNode; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LRequest; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Payload; -import org.scribble.util.ScribException; -import org.scribble.visit.context.EGraphBuilder; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; - public class LRequestDel extends LConnectionActionDel implements LSimpleInteractionNodeDel { - @Override - public LRequest leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder builder, ScribNode visited) throws ScribException - { - LRequest lc = (LRequest) visited; - MessageNode msg = lc.getMessageNodeChild(); - RoleNode dest = lc.getDestinationChild(); - Role peer = dest.toName(); - MessageId mid = msg.toMessage().getId(); - Payload payload = msg.isMessageSigNode() // Hacky? - ? ((MessageSigNode) msg).getPayloadListChild().toPayload() - : Payload.EMPTY_PAYLOAD; - builder.util.addEdge(builder.util.getEntry(), - builder.lang.config.ef.newERequest(peer, mid, payload), - builder.util.getExit()); - //graph.builder.addEdge(graph.builder.getEntry(), new Connect(peer), graph.builder.getExit()); - ////builder.builder.addEdge(builder.builder.getEntry(), Send.get(peer, mid, payload), builder.builder.getExit()); - return (LRequest) super.leaveEGraphBuilding(parent, child, builder, lc); - } - - @Override - public void enterProjectedChoiceSubjectFixing(ScribNode parent, - ScribNode child, ProjectedChoiceSubjectFixer fixer) - { - fixer.setChoiceSubject(((LRequest) child).getSourceChild().toName()); - } + } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java index 4fdb3622e..b09d47c0d 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java @@ -13,64 +13,7 @@ */ package org.scribble.del.local; -import java.util.List; - -import org.scribble.ast.MessageNode; -import org.scribble.ast.MessageSigNode; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LMessageTransfer; -import org.scribble.ast.local.LSend; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Payload; -import org.scribble.util.ScribException; -import org.scribble.visit.context.EGraphBuilder; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -import org.scribble.visit.wf.ExplicitCorrelationChecker; - public class LSendDel extends LMessageTransferDel { - @Override - public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder builder, ScribNode visited) throws ScribException - { - LSend ls = (LSend) visited; - List dests = ls.getDestinationChildren(); - if (dests.size() > 1) - { - throw new ScribException( - "[TODO] EFSM building for multicast not supported: " + ls); - } - Role peer = dests.get(0).toName(); - MessageNode msg = ls.getMessageNodeChild(); - MessageId mid = msg.toMessage().getId(); - Payload payload = msg.isMessageSigNode() // Hacky? - ? ((MessageSigNode) msg).getPayloadListChild().toPayload() - : Payload.EMPTY_PAYLOAD; - builder.util.addEdge(builder.util.getEntry(), - builder.lang.config.ef.newESend(peer, mid, payload), - builder.util.getExit()); - //builder.builder.addEdge(builder.builder.getEntry(), Send.get(peer, mid, payload), builder.builder.getExit()); - return (LSend) super.leaveEGraphBuilding(parent, child, builder, ls); - } - - // Could make a LMessageTransferDel to factor this out with LReceiveDel - @Override - public void enterProjectedChoiceSubjectFixing(ScribNode parent, - ScribNode child, ProjectedChoiceSubjectFixer fixer) - { - fixer.setChoiceSubject(((LSend) child).getSourceChild().toName()); - } - - @Override - public LMessageTransfer leaveExplicitCorrelationCheck(ScribNode parent, - ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) - throws ScribException - { - LMessageTransfer lmt = (LMessageTransfer) visited; - checker.pushEnv(checker.popEnv().disableAccept()); - return lmt; - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java index 2f19ff530..30c40b2ec 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java @@ -13,35 +13,10 @@ */ package org.scribble.del.local; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LWrapClient; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.name.Role; import org.scribble.del.ConnectionActionDel; -import org.scribble.util.ScribException; -import org.scribble.visit.context.EGraphBuilder; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LWrapClientDel extends ConnectionActionDel implements LSimpleInteractionNodeDel { - @Override - public LWrapClient leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder builder, ScribNode visited) throws ScribException - { - LWrapClient lc = (LWrapClient) visited; - RoleNode dest = lc.getDestinationChild(); - Role peer = dest.toName(); - builder.util.addEdge(builder.util.getEntry(), - builder.lang.config.ef.newEWrapClient(peer), builder.util.getExit()); - return (LWrapClient) super.leaveEGraphBuilding(parent, child, builder, lc); - } - - @Override - public void enterProjectedChoiceSubjectFixing(ScribNode parent, - ScribNode child, ProjectedChoiceSubjectFixer fixer) - { - fixer - .setChoiceSubject(((LWrapClient) child).getDestinationChild().toName()); - } + } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java index 5adf7c82f..6fe19c5a3 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java @@ -13,46 +13,10 @@ */ package org.scribble.del.local; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LWrapServer; -import org.scribble.core.type.name.Role; import org.scribble.del.ConnectionActionDel; -import org.scribble.util.ScribException; -import org.scribble.visit.context.EGraphBuilder; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; -import org.scribble.visit.context.env.UnguardedChoiceDoEnv; public class LWrapServerDel extends ConnectionActionDel implements LSimpleInteractionNodeDel { - @Override - public LWrapServer leaveEGraphBuilding(ScribNode parent, ScribNode child, - EGraphBuilder builder, ScribNode visited) throws ScribException - { - LWrapServer la = (LWrapServer) visited; - Role peer = la.getSourceChild().toName(); - builder.util.addEdge(builder.util.getEntry(), - builder.lang.config.ef.newEWrapServer(peer), builder.util.getExit()); - return (LWrapServer) super.leaveEGraphBuilding(parent, child, builder, la); - } - @Override - public void enterProjectedChoiceSubjectFixing(ScribNode parent, - ScribNode child, ProjectedChoiceSubjectFixer fixer) - { - fixer.setChoiceSubject(((LWrapServer) child).getSourceChild().toName()); - } - - @Override - public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, - ScribNode child, UnguardedChoiceDoProjectionChecker checker) - throws ScribException - { - super.enterUnguardedChoiceDoProjectionCheck(parent, child, checker); - LWrapServer la = (LWrapServer) child; - UnguardedChoiceDoEnv env = checker.popEnv(); - env = env.setChoiceSubject(la.getSourceChild().toName()); - checker.pushEnv(env); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java index 470e316aa..d64629ee8 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java @@ -33,9 +33,10 @@ public DataTypeNodeDel() // Is this needed? Or DataTypeNodes always created from AmbigNameNode? (in this same pass) @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + public ScribNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { + ScribNode parent = child.getParent(); if (parent instanceof DataTypeDecl) // Hacky? don't want to do for decl simplenames (generally, don't do if parent is namedeclnode) { return visited; diff --git a/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java index 874b71c76..1357d0ea7 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java @@ -33,9 +33,10 @@ public MessageSigNameNodeDel() // Is this needed? Or DataTypeNodes always created from AmbigNameNode? (in this same pass) @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + public ScribNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { + ScribNode parent = child.getParent(); if (parent instanceof MessageSigNameDecl) // Hacky? don't want to do for decl simplenames (generally, don't do if parent is namedeclnode) { return visited; diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java index 8e4f89fcc..84ffaf612 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java @@ -37,11 +37,12 @@ public AmbigNameNodeDel() } - // Currently only in "message positions (see Scribble.g ambiguousname) + // Currently only in "message positions (see Scribble.g, ambiguousname) @Override - public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, + public ScribNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { + ScribNode parent = child.getParent(); ModuleContext mcontext = disamb.getModuleContext(); AmbigNameNode ann = (AmbigNameNode) visited; AmbigName name = ann.toName(); diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java index d02d9900b..50e71d974 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java @@ -15,11 +15,9 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.type.kind.RecVarKind; import org.scribble.core.type.name.RecVar; import org.scribble.del.ScribDelBase; import org.scribble.util.ScribException; -import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.wf.NameDisambiguator; public class RecVarNodeDel extends ScribDelBase @@ -30,7 +28,7 @@ public RecVarNodeDel() } @Override - public RecVarNode leaveDisambiguation(ScribNode parent, ScribNode child, + public RecVarNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { // Consistent with bound RoleNode checking @@ -41,29 +39,6 @@ public RecVarNode leaveDisambiguation(ScribNode parent, ScribNode child, throw new ScribException(rn.getSource(), "Rec variable not bound: " + rn); } - return (RecVarNode) super.leaveDisambiguation(parent, child, disamb, rn); - //return super.leaveDisambiguation(parent, child, disamb, rn.reconstruct(disamb.getCanonicalRecVarName(rv))); - } - - @Override - public void enterProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inliner) throws ScribException - { - super.enterProtocolInlining(parent, child, inliner); - ScribDelBase.pushVisitorEnv(this, inliner); - } - - @Override - public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, - ProtocolDefInliner inliner, ScribNode visited) throws ScribException - { - RecVarNode rn = (RecVarNode) visited; - RecVar rv = rn.toName(); - //return super.leaveProtocolInlining(parent, child, inliner, rn.reconstruct(inliner.getCanonicalRecVarName(rv))); // No, affects the source AST - //RecVarNode inlined = rn.reconstruct(inliner.getCanonicalRecVarName(rv)); - RecVarNode inlined = (RecVarNode) inliner.lang.config.af.SimpleNameNode( - rn.getSource(), RecVarKind.KIND, inliner.getCanonicalRecVarName(rv)); - inliner.pushEnv(inliner.popEnv().setTranslation(inlined)); - return ScribDelBase.popAndSetVisitorEnv(this, inliner, rn); // Not done by any super + return (RecVarNode) super.leaveDisambiguation(child, disamb, rn); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java index 06600a09c..927a7d7d4 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java @@ -27,7 +27,8 @@ public RoleNodeDel() } @Override - public RoleNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException + public RoleNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, + ScribNode visited) throws ScribException { RoleNode rn = (RoleNode) visited; if (!disamb.isBoundRole(rn.toName())) // Added on RoleDecl entry diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index 6a1f2371c..3f055e8a6 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -30,7 +30,6 @@ import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; import org.scribble.visit.GTypeTranslator; -import org.scribble.visit.context.ModuleContextBuilder; import org.scribble.visit.wf.NameDisambiguator; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models @@ -88,7 +87,6 @@ protected Job newJob(ModuleName mainFullname, Map args, public void runPasses() throws ScribException { // CHECKME: in the end, should these also be refactored into core? (instead of AST visiting) - runVisitorPassOnAllModules(ModuleContextBuilder.class); // Always done first (even if other contexts are built later) so that following passes can use ModuleContextVisitor runVisitorPassOnAllModules(NameDisambiguator.class); // Includes validating names used in subprotocol calls.. } diff --git a/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java index e821b414c..c3150edb1 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java @@ -30,22 +30,21 @@ protected AstVisitor(Lang lang) } // Used by ScribNodeBase::accept - public ScribNode visit(ScribNode parent, ScribNode child) - throws ScribException + public ScribNode visit(ScribNode child) throws ScribException { - enter(parent, child); + enter(child); ScribNode visited = child.visitChildren(this); // visited means "children visited so far"; we're about to visit "this" now via "leave" - return leave(parent, child, visited); + return leave(child, visited); } - protected void enter(ScribNode parent, ScribNode child) + protected void enter(ScribNode child) throws ScribException { } - protected ScribNode leave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribException + protected ScribNode leave(ScribNode child, ScribNode visited) + throws ScribException { return visited; } diff --git a/scribble-ast/src/main/java/org/scribble/visit/EnvVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/EnvVisitor.java deleted file mode 100644 index 4edc526e6..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/EnvVisitor.java +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit; - -import java.util.LinkedList; - -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ScribNode; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ModuleContextVisitor; -import org.scribble.visit.env.Env; - -// By default, EnvVisitor only manipulates internal Env stack -- so AST/dels not affected -// Attaching Envs to Dels has to be done manually by each pass -// FIXME: make a ProtocolDeclContextVisitor (caches ProtocolDeclContext, e.g. roles, modifiers) between this and ModuleContextVisitor -public abstract class EnvVisitor> extends ModuleContextVisitor -{ - private LinkedList envs = new LinkedList(); // Deque - - public EnvVisitor(Lang lang) - { - super(lang); - } - - @Override - protected final void enter(ScribNode parent, ScribNode child) throws ScribException - { - super.enter(parent, child); - if (child instanceof ProtocolDecl) // Only the root ProtocolDecl is visited: subprotocols visit the body directly - { - ProtocolDecl pd = (ProtocolDecl) child; - pushEnv(makeRootProtocolDeclEnv(pd)); - } - envEnter(parent, child); - } - - @Override - protected final ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException - { - ScribNode n = envLeave(parent, child, visited); - if (n instanceof ProtocolDecl) // Only the root ProtocolDecl is visited by SubprotocolVisitor (subprotocols visit the body directly) - { - this.envs.pop(); - } - return super.leave(parent, child, n); - } - - protected abstract T makeRootProtocolDeclEnv(ProtocolDecl pd); - - protected void envEnter(ScribNode parent, ScribNode child) throws ScribException - { - //..could push copy of parent Env onto visitor stack for use by visitor pass (del env-leave routine should pop and push back the final result) - //..but only if want an env for every node (unless restrict to specific nodes types -- e.g. interaction nodes) -- as opposed to only e.g. compound nodes, as done via del - //..so either do base env management here or via del -- here, need to do instanceof; in delegates, need to duplicate base push/pop for each pass - //..no: should be only compound interaction nodes, as typing environments - //return this; - } - - protected ScribNode envLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException - { - return visited; - } - - // Hack? e.g. for ModuleDecl - public boolean hasEnv() - { - return !this.envs.isEmpty(); - } - - public T peekEnv() - { - return this.envs.peek(); - } - - public T peekParentEnv() - { - //return this.envs.get(this.envs.size() - 2); - return this.envs.get(1); - } - - public void pushEnv(T env) - { - this.envs.push(env); - } - - public T popEnv() - { - return this.envs.pop(); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java b/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java deleted file mode 100644 index 3aac80866..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolUnfolder.java +++ /dev/null @@ -1,172 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import org.scribble.ast.AstFactory; -import org.scribble.ast.InteractionSeq; -import org.scribble.ast.ProtocolBlock; -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.Recursion; -import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.global.GRecursion; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.ast.local.LRecursion; -import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.type.kind.Global; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.RecVar; -import org.scribble.del.ProtocolDefDel; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; -import org.scribble.visit.env.UnfoldingEnv; - -// Statically unfolds unguarded recursions and continues "directly under" choices -// N.B. cf. UnfoldingVisitor "lazily" unfolds every rec once on demand -public class InlinedProtocolUnfolder - extends InlinedProtocolVisitor -{ - public static final String DUMMY_REC_LABEL = "__"; - - // NOTE: assumes unique recvars up to this point, i.e. no recvar shadowing (treated internally by protocoldef-inlining) -- unfolding of unguardeds will, however, result in "unfolding shadowing" - protected Map> recs = new HashMap<>(); // Could parameterise recvars to be global/local - private Set recsToUnfold = new HashSet<>(); - - public InlinedProtocolUnfolder(Lang job) - { - super(job); - } - - public boolean shouldUnfoldForUnguardedRec(RecVar rv) - { - return this.recsToUnfold.contains(rv); - } - - // Unguarded continues directly under choices need to be unfolded to make current graph building work (continue side effects GraphBuilder state to re-set entry to rec state -- which makes output dependent on choice block order, and can attach subsequent choice paths onto the rec state instead of the original choice state) - // Maybe fix this problem inside graph building rather than unfolding here (this unfolding is conservative -- not always needed for every unguarded continue) -- depends if it helps any other inlined passes? - public boolean isContinueUnguarded(RecVar rv) - { - return peekEnv().shouldUnfold(); - } - - @Override - protected UnfoldingEnv makeRootProtocolDeclEnv(ProtocolDecl pd) - { - return new UnfoldingEnv(); - } - - @Override - public ScribNode visit(ScribNode parent, ScribNode child) throws ScribException - { - if (child instanceof Recursion) - { - if (peekEnv().shouldUnfold()) - { - enter(parent, child); - ScribNode visited = unfold((Recursion) child); - return leave(parent, child, visited); - } - else - { - return super.visit(parent, child); - } - } - else - { - ScribNode visited = super.visit(parent, child); - if (visited instanceof ProtocolDecl) - { - ProtocolDecl pd = (ProtocolDecl) visited; - this.lang.debugPrintln("\n[DEBUG] Unfolded inlined protocol " - + pd.getFullMemberName( - this.lang.getContext().getModule(getModuleContext().root)) - + ":\n" + ((ProtocolDefDel) pd.getDefChild().del()) - .getInlinedProtocolDef()); - } - return visited; - } - } - - // Not doing the actual unfolding here: replace the rec with a dummy (i.e. alpha the original rec to another unused lab) and will do any actual unfolding inside the recursive child accept (upon Continue) - private ScribNode unfold(Recursion rec) - throws ScribException - { - RecVar rv = rec.getRecVarChild().toName(); - ProtocolBlock pb = rec.getBlockChild(); - // Clone unnecessary: can visit the original block, apart from any continues to substitute (done in InteractionSeqDel) - this.recsToUnfold.add(rv); - /*RecVarNode dummy = (RecVarNode) AstFactoryImpl.FACTORY.SimpleNameNode(RecVarKind.KIND, DUMMY_REC_LABEL); - //RecVarNode dummy = rec.recvar.clone(); - ScribNode n = rec.reconstruct(dummy, ScribUtil.checkNodeClassEquality(pb, pb.accept(this))); // Returning a rec because it needs to go into the InteractionSeq - // reconstruct makes sense here, actually reconstructing this rec with new label but same block (and keep the same del etc)*/ - InteractionSeq seq = pb.getInteractSeqChild(); - ScribNode n = seq.accept(this); - this.recsToUnfold.remove(rv); - return n; - } - - @Override - protected void inlinedEnter(ScribNode parent, ScribNode child) - throws ScribException - { - super.inlinedEnter(parent, child); - child.del().enterInlinedProtocolUnfolding(parent, child, this); - } - - @Override - protected ScribNode inlinedLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribException - { - visited = visited.del().leaveInlinedProtocolUnfolding(parent, child, this, - visited); - return super.inlinedLeave(parent, child, visited); - } - - public Recursion getRecVar(RecVar recvar) - { - return this.recs.get(recvar); - } - - // Maybe possible to revise this algorithm to handle shadowed recs, but currently requires unique recvar names - public void setRecVar(AstFactory af, RecVar recvar, Recursion rec) - throws ScribException - { - ProtocolBlock block = (ProtocolBlock) rec.getBlockChild() - .accept(this); - RecVarNode rv = rec.getRecVarChild().clone();//af); - Recursion unfolded; - if (rec.getKind() == Global.KIND) - { - unfolded = ((GRecursion) rec).reconstruct(rv, (GProtocolBlock) block); - } - else - { - unfolded = ((LRecursion) rec).reconstruct(rv, (LProtocolBlock) block); - /*LRecursion clone = (LRecursion) rec.clone(af); // Try to be more compatible with extensions that have different reconstructs // FIXME: reconstruct should be "protected"? - clone.block = (LProtocolBlock) block; // No: cannot set new block - unfolded = (LRecursion) clone.del(rec.del());*/ - } - this.recs.put(recvar, unfolded); - } - - public void removeRecVar(RecVar recvar) - { - this.recs.remove(recvar); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java deleted file mode 100644 index 569198806..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/InlinedProtocolVisitor.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit; - -import org.scribble.ast.ProtocolDef; -import org.scribble.ast.ScribNode; -import org.scribble.del.ProtocolDefDel; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; -import org.scribble.visit.env.Env; - -public abstract class InlinedProtocolVisitor> extends EnvVisitor -{ - public InlinedProtocolVisitor(Lang lang) - { - super(lang); - } - - @Override - public ScribNode visit(ScribNode parent, ScribNode child) throws ScribException - { - enter(parent, child); - ScribNode visited = visitInlinedProtocol(parent, child); - return leave(parent, child, visited); - } - - protected ScribNode visitInlinedProtocol(ScribNode parent, ScribNode child) throws ScribException - { - if (child instanceof ProtocolDef) - { - return visitOverrideForProtocolDef(parent, (ProtocolDef) child); // parent is InteractionSequence - } - else - { - return child.visitChildren(this); - // The base (super) behaviour (could factor it out in ModelVisitor as its own visitor method) -- not super.visit because that does enter/exit - } - } - - // N.B. results of visiting inlined version are stored back to inlined field, but original AST is unaffected -- so any Env/Del or AST updates to inlined version do not reflect back onto original AST -- a motivation for the original SubprotocolVisitor approach - private ScribNode visitOverrideForProtocolDef(ScribNode parent, ProtocolDef pd) throws ScribException - { - ProtocolDef inlined = ((ProtocolDefDel) pd.del()).getInlinedProtocolDef(); - if (inlined == null) - { - throw new ScribException("InlineProtocolVisitor error: " + pd); // E.g. -fsm when inconsistent choice subjects - // FIXME: shouldn't occur any more? - } - - /*if (this instanceof EndpointGraphBuilder) - { - System.out.println("\nBuilding graph from: " + inlined + "\n"); - }*/ - - ProtocolDef visited = (ProtocolDef) inlined.visitChildren(this); - ProtocolDefDel del = (ProtocolDefDel) pd.del(); - return pd.del(del.setInlinedProtocolDef(visited)); - } - - @Override - protected final void envEnter(ScribNode parent, ScribNode child) throws ScribException - { - super.envEnter(parent, child); - inlinedEnter(parent, child); - } - - @Override - protected final ScribNode envLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException - { - ScribNode n = inlinedLeave(parent, child, visited); - return super.envLeave(parent, child, n); - } - - protected void inlinedEnter(ScribNode parent, ScribNode child) throws ScribException - { - - } - - protected ScribNode inlinedLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException - { - return visited; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java deleted file mode 100644 index d801f859c..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit; - -import org.scribble.ast.ProtocolDecl; -import org.scribble.lang.Lang; -import org.scribble.visit.env.DummyEnv; - -public abstract class NoEnvInlinedProtocolVisitor extends InlinedProtocolVisitor -{ - public NoEnvInlinedProtocolVisitor(Lang job) - { - super(job); - } - - @Override - protected final DummyEnv makeRootProtocolDeclEnv(ProtocolDecl pd) - { - return DummyEnv.DUMMY; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java deleted file mode 100644 index c70f53460..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/NoEnvOffsetSubprotocolVisitor.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit; - -import org.scribble.ast.ProtocolDecl; -import org.scribble.lang.Lang; -import org.scribble.visit.env.DummyEnv; - -public abstract class NoEnvOffsetSubprotocolVisitor extends OffsetSubprotocolVisitor -{ - public NoEnvOffsetSubprotocolVisitor(Lang job) - { - super(job); - } - - @Override - protected final DummyEnv makeRootProtocolDeclEnv(ProtocolDecl pd) - { - return DummyEnv.DUMMY; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java deleted file mode 100644 index 23fea69be..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/NoEnvSubprotocolVisitor.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit; - -import org.scribble.ast.ProtocolDecl; -import org.scribble.lang.Lang; -import org.scribble.visit.env.DummyEnv; - -public abstract class NoEnvSubprotocolVisitor extends SubprotocolVisitor -{ - public NoEnvSubprotocolVisitor(Lang job) - { - super(job); - } - - @Override - protected final DummyEnv makeRootProtocolDeclEnv(ProtocolDecl pd) - { - return DummyEnv.DUMMY; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java deleted file mode 100644 index 78e19df56..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/NoEnvUnfoldingVisitor.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit; - -import org.scribble.ast.ProtocolDecl; -import org.scribble.lang.Lang; -import org.scribble.visit.env.DummyEnv; - -public abstract class NoEnvUnfoldingVisitor extends UnfoldingVisitor -{ - public NoEnvUnfoldingVisitor(Lang job) - { - super(job); - } - - @Override - protected final DummyEnv makeRootProtocolDeclEnv(ProtocolDecl pd) - { - return DummyEnv.DUMMY; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java deleted file mode 100644 index 146060cf3..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/OffsetSubprotocolVisitor.java +++ /dev/null @@ -1,100 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit; - -import java.util.Map; - -import org.scribble.ast.NonRoleArgNode; -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ScribNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.kind.NonRoleArgKind; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Arg; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; -import org.scribble.visit.env.Env; - -// Can probably be fully replaced by SubprotocolVisitor -// Projector, ReachabilityChecker, etc don't need to be offset visitors -public abstract class OffsetSubprotocolVisitor> - extends SubprotocolVisitor -{ - public OffsetSubprotocolVisitor(Lang job) - { - super(job); - } - - // Doesn't push a subprotocol signature (i.e. on root entry); only records the roles/args -- why? because sigs are based on vals (from the first do), not the root proto params? -- but it would be fine to use the params? - @Override - protected void enterRootProtocolDecl(ProtocolDecl pd) - { - Map rolemap = makeRootRoleSubsMap( - pd.getHeaderChild().getRoleDeclListChild()); - Map, NonRoleArgNode> argmap = - makeRootNonRoleSubsMap(pd.getHeaderChild().getParamDeclListChild()); - this.rolemaps.push(rolemap); - this.argmaps.push(argmap); - } - - @Override - protected final ScribNode visitForSubprotocols(ScribNode parent, - ScribNode child) throws ScribException - { - return visitForOffsetSubprotocols(parent, child); - } - - protected ScribNode visitForOffsetSubprotocols(ScribNode parent, - ScribNode child) throws ScribException - { - return super.visitForSubprotocols(parent, child); - } - - @Override - protected final void envLeaveProtocolDeclOverride(ScribNode parent, - ScribNode child, ScribNode visited) throws ScribException - { - this.rolemaps.pop(); - this.argmaps.pop(); - } - - @Override - protected final void subprotocolEnter(ScribNode parent, ScribNode child) - throws ScribException - { - super.subprotocolEnter(parent, child); - offsetSubprotocolEnter(parent, child); - } - - @Override - protected final ScribNode subprotocolLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribException - { - ScribNode n = offsetSubprotocolLeave(parent, child, visited); - return super.subprotocolLeave(parent, child, n); - } - - protected void offsetSubprotocolEnter(ScribNode parent, ScribNode child) - throws ScribException - { - - } - - protected ScribNode offsetSubprotocolLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribException - { - return visited; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/ProtocolDefInliner.java b/scribble-ast/src/main/java/org/scribble/visit/ProtocolDefInliner.java deleted file mode 100644 index b7c21064a..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/ProtocolDefInliner.java +++ /dev/null @@ -1,187 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit; - -import java.util.HashMap; -import java.util.Map; - -import org.scribble.ast.Do; -import org.scribble.ast.InteractionSeq; -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GDo; -import org.scribble.ast.local.LDo; -import org.scribble.core.lang.SubprotoSig; -import org.scribble.core.lang.context.ModuleContext; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.RecVar; -import org.scribble.del.ProtocolDefDel; -import org.scribble.del.global.GDoDel; -import org.scribble.del.local.LDoDel; -import org.scribble.lang.Lang; -import org.scribble.lang.LangContext; -import org.scribble.util.ScribException; -import org.scribble.visit.env.InlineProtocolEnv; - -public class ProtocolDefInliner extends SubprotocolVisitor -{ - private Map subprotoRecVars = new HashMap<>(); // RecVars translation for subprotocol inlining - - private Map recvars = new HashMap<>(); // Original RecVars, nesting count - - public ProtocolDefInliner(Lang job) - { - super(job); - } - - public RecVar getSubprotocolRecVar(SubprotoSig subsig) - { - return this.subprotoRecVars.get(subsig); - } - - public void setSubprotocolRecVar(SubprotoSig subsig) - { - this.subprotoRecVars.put(subsig, new RecVar(newSubprotocoolRecVarId(subsig))); - } - - public void removeSubprotocolRecVar(SubprotoSig subsig) - { - this.subprotoRecVars.remove(subsig); - } - - private String newSubprotocoolRecVarId(SubprotoSig sig) - { - // TODO: Hacky, reconsider - return sig.toString() - .replace('.', '_') - .replace('<', '_') - .replace('>', '_') - .replace('(', '_') - .replace(')', '_') - .replace(' ', '_') - .replace(',', '_'); - } - - @Override - protected InlineProtocolEnv makeRootProtocolDeclEnv(ProtocolDecl pd) - { - return new InlineProtocolEnv(); - } - - @Override - public ScribNode visit(ScribNode parent, ScribNode child) throws ScribException - { - enter(parent, child); - ScribNode visited = visitForSubprotocols(parent, child); - if (visited instanceof ProtocolDecl) - { - ProtocolDecl pd = (ProtocolDecl) visited; - this.lang.debugPrintln("\n[DEBUG] Inlined root protocol " - + pd.getFullMemberName(this.lang.getContext().getModule(getModuleContext().root)) + ":\n" - + ((ProtocolDefDel) pd.getDefChild().del()).getInlinedProtocolDef()); - } - return leave(parent, child, visited); - } - - @Override - public ScribNode visitForSubprotocols(ScribNode parent, ScribNode child) throws ScribException - { - if (child instanceof Do) - { - return visitOverrideForDo((InteractionSeq) parent, (Do) child); - } - ScribNode visited = super.visitForSubprotocols(parent, child); - /*if (visited instanceof ProtocolDecl) - { - ProtocolDecl pd = (ProtocolDecl) visited; - getJob().debugPrintln("\n[DEBUG] Inlined protocol " - + pd.getFullMemberName(getJobContext().getModule(getModuleContext().root)) + ":\n" - + ((ProtocolDefDel) pd.def.del()).getInlinedProtocolDef()); - }*/ - return visited; - } - - protected Do visitOverrideForDo(InteractionSeq parent, Do child) throws ScribException - { - if (!isCycle()) - { - //return (GDo) super.visitForSubprotocols(parent, child); - // Duplicated from SubprotocolVisitor#visitOverrideFoDo and modified to access discarded env -- FIXME: factor out this facility better - LangContext jc = this.lang.getContext(); - ModuleContext mc = getModuleContext(); - ProtocolDecl pd = - child.getTargetProtocolDecl(jc, mc); - ScribNode seq = applySubstitutions( - pd.getDefChild().getBlockChild().getInteractSeqChild().clone()); - //this.job.af)); - seq = seq.accept(this); - pushEnv(popEnv().setTranslation(((InlineProtocolEnv) seq.del().env()).getTranslation())); - return child; - } - - // If cycle, super routine does nothing anyway, so we can just replace with new stuff here - return (child instanceof GDo) - ? ((GDoDel) child.del()).visitForSubprotocolInlining(this, (GDo) child) - : ((LDoDel) child.del()).visitForSubprotocolInlining(this, (LDo) child); - } - - @Override - protected void subprotocolEnter(ScribNode parent, ScribNode child) - throws ScribException - { - super.subprotocolEnter(parent, child); - child.del().enterProtocolInlining(parent, child, this); - } - - @Override - protected ScribNode subprotocolLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribException - { - visited = visited.del().leaveProtocolInlining(parent, child, this, visited); - return super.subprotocolLeave(parent, child, visited); - } - - public void pushRecVar(RecVar rv) - { - if (!this.recvars.containsKey(rv)) - { - this.recvars.put(rv, 0); - } - else - { - this.recvars.put(rv, this.recvars.get(rv) + 1); - } - } - - public void popRecVar(RecVar rv) - { - Integer i = this.recvars.get(rv); - if (i == 0) - { - this.recvars.remove(rv); - } - else - { - this.recvars.put(rv, i - 1); - } - } - - // Refactored here from NameDisambiguation - public String getCanonicalRecVarName(RecVar rv) - { - //return getCanonicalRecVarName(this.getModuleContext().root, this.root.header.getDeclName(), rv.toString() + "_" + this.recvars.get(rv)); - Integer i = this.recvars.get(rv); - return (i == 0) ? rv.toString() : (rv.toString() + i); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/SubprotocolVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/SubprotocolVisitor.java deleted file mode 100644 index 3dc3d6295..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/SubprotocolVisitor.java +++ /dev/null @@ -1,377 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Stack; -import java.util.stream.Collectors; - -import org.scribble.ast.Do; -import org.scribble.ast.NonRoleArgList; -import org.scribble.ast.NonRoleArgNode; -import org.scribble.ast.NonRoleParamDecl; -import org.scribble.ast.NonRoleParamDeclList; -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ProtocolHeader; -import org.scribble.ast.RoleArgList; -import org.scribble.ast.RoleDeclList; -import org.scribble.ast.ScopedNode; -import org.scribble.ast.ScribNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.lang.SubprotoSig; -import org.scribble.core.lang.context.ModuleContext; -import org.scribble.core.type.kind.NonRoleArgKind; -import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.Name; -import org.scribble.core.type.name.ProtocolName; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.name.Scope; -import org.scribble.core.type.session.Arg; -import org.scribble.lang.Lang; -import org.scribble.lang.LangContext; -import org.scribble.util.ScribException; -import org.scribble.visit.env.Env; - -public abstract class SubprotocolVisitor> extends EnvVisitor -{ - protected List stack = new LinkedList<>(); - - // name in the current protocoldecl scope -> the original name node in the root protocol decl - protected Stack> rolemaps = new Stack<>(); - protected Stack, NonRoleArgNode>> argmaps = new Stack<>(); - - private Scope scope = null; - - public SubprotocolVisitor(Lang job) - { - super(job); - } - - // Pushes a subprotocol signature (i.e. on root entry) - protected void enterRootProtocolDecl(ProtocolDecl pd) - { - ProtocolHeader hdr = pd.getHeaderChild(); - RoleDeclList rds = hdr.getRoleDeclListChild(); - NonRoleParamDeclList pds = hdr.getParamDeclListChild(); - - Map rolemap = makeRootRoleSubsMap(rds); - Map, NonRoleArgNode> argmap = makeRootNonRoleSubsMap( - pds); - this.rolemaps.push(rolemap); - this.argmaps.push(argmap); - - ModuleContext mcontext = getModuleContext(); - ProtocolName fullname = mcontext - .getVisibleProtocolDeclFullName(hdr.getDeclName()); - List roleargs = rds.getRoles(); - List> nonroleargs = - pds.getParamDeclChildren().stream().map(param -> paramDeclToArg(param)) - .collect(Collectors.toList()); - pushSubprotocolSig(fullname, roleargs, nonroleargs); - } - - // Most subclasses will override visitForSubprotocols (e.g. ReachabilityChecker, FsmConstructor), but sometimes still want to change whole visit pattern (e.g. Projector) - @Override - public ScribNode visit(ScribNode parent, ScribNode child) - throws ScribException - { - enter(parent, child); - ScribNode visited = visitForSubprotocols(parent, child); - return leave(parent, child, visited); - } - - // Subclasses can override this to disable subprotocol visiting - protected ScribNode visitForSubprotocols(ScribNode parent, ScribNode child) - throws ScribException - { - if (child instanceof Do) - { - return visitOverrideForDo(parent, (Do) child); // parent is InteractionSequence - } - else - { - return child.visitChildren(this); - // The base (super) behaviour (could factor it out in ModelVisitor as its own visitor method) - } - } - - // The Do node itself is no longer visited -- FIXME: projection needs to visit it -- no: that's in enter/leave, visited means "visit children" - protected Do visitOverrideForDo(ScribNode parent, Do doo) - throws ScribException - { - if (!isCycle()) - { - LangContext jc = this.lang.getContext(); - ModuleContext mc = getModuleContext(); - ProtocolDecl pd = - doo.getTargetProtocolDecl(jc, mc); - // Target is cloned: fresh dels and envs, which will be discarded - ScribNode seq = applySubstitutions(pd.getDefChild().getBlockChild() - .getInteractSeqChild().clone()); //this.job.af)); - // Visit the seq? -- or visit the interactions in the seq directly? - // Visit seq/interactions under current environment - seq.accept(this); // Result from visiting subprotocol body is discarded - } - return doo; - } - - protected boolean overrideSubstitution() - { - return false; - } - - protected ScribNode applySubstitutions(ScribNode n) - { - if (overrideSubstitution()) - { - return n; - } - try - { - return n.accept( - new Substitutor(this.lang, this.rolemaps.peek(), this.argmaps.peek())); - } - catch (ScribException e) - { - throw new RuntimeException("Shouldn't get in here: " + n); - } - } - - @Override - protected final void envEnter(ScribNode parent, ScribNode child) - throws ScribException - { - super.envEnter(parent, child); - - if (child instanceof ProtocolDecl) - { - setScope(Scope.ROOT_SCOPE); - enterRootProtocolDecl((ProtocolDecl) child); - } - if (child instanceof ScopedNode) - { - ScopedNode sn = (ScopedNode) child; - if(!sn.isEmptyScope()) - { - setScope(new Scope(getScope(), sn.getScopeElement())); - } - } - if (child instanceof Do) - { - enterSubprotocol((Do) child); // Scope already pushed - } - subprotocolEnter(parent, child); - } - - @Override - protected final ScribNode envLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribException - { - ScribNode n = subprotocolLeave(parent, child, visited); - if (child instanceof ProtocolDecl) - { - envLeaveProtocolDeclOverride(parent, child, visited); - } - if (child instanceof Do) // child or visited/n? - { - leaveSubprotocol(); - } - if (child instanceof ScopedNode && !((ScopedNode) child).isEmptyScope()) - { - setScope(getScope().getPrefix()); - } - return super.envLeave(parent, child, n); - } - - // Hack for OffsetSubprotocolVisitor - protected void envLeaveProtocolDeclOverride(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribException - { - leaveSubprotocol(); - } - - protected void subprotocolEnter(ScribNode parent, ScribNode child) - throws ScribException - { - - } - - protected ScribNode subprotocolLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribException - { - return visited; - } - - private void enterSubprotocol(Do doo) - { - ProtocolName fullname = - getModuleContext().checkProtocolDeclDependencyFullName( - doo.getProtocolNameNode().toName()); - // namedisamb should already have converted proto to the fullname -- in order for inlining to work - List> cast = doo.getNonRoleListChild() - .getParamKindArgs(); - // namedisamb should also ensure no ambigs in args - pushSubprotocolSig(fullname, doo.getRoleListChild().getRoles(), cast); - pushNameMaps(fullname, doo); - } - - // Also used for leaving root protocoldecl, for convenience - private void leaveSubprotocol() - { - this.stack.remove(this.stack.size() - 1); - this.rolemaps.pop(); - this.argmaps.pop(); - } - - private void pushSubprotocolSig(ProtocolName fullname, List roleargs, - List> nonroleargs) - { - SubprotoSig subsig = new SubprotoSig(fullname, roleargs, nonroleargs); - this.stack.add(subsig); - } - - private void pushNameMaps(ProtocolName fullname, Do doo) - { - ProtocolDecl pd = this.lang.getContext().getModule(fullname.getPrefix()) - .getProtocolDeclChild(fullname.getSimpleName()); - ProtocolHeader hdr = pd.getHeaderChild(); - this.rolemaps.push(makeRoleSubsMap(this.rolemaps.get(0), - doo.getRoleListChild(), hdr.getRoleDeclListChild())); - this.argmaps.push(makeNonRoleSubsMap(this.argmaps.get(0), - doo.getNonRoleListChild(), hdr.getParamDeclListChild())); - } - - public boolean isRootedCycle() - { - return this.stack.size() > 1 - && this.stack.get(0).equals(this.stack.get(this.stack.size() - 1)); - } - - public boolean isCycle() - { - return getCycleEntryIndex() != -1; - } - - public int getCycleEntryIndex() - { - int size = this.stack.size(); - if (size > 1) - { - SubprotoSig last = this.stack.get(size - 1); - for (int i = size - 2; i >= 0; i--) - { - if (this.stack.get(i).equals(last)) // TODO CHECKME: doesn't support recursive scoped subprotocols, i.e. cycle detection not general enough? - { - return i; - } - } - } - return -1; - } - - public List getStack() - { - return this.stack; - } - - public boolean isStackEmpty() - { - return this.stack.isEmpty(); - } - - public SubprotoSig peekStack() - { - return this.stack.get(this.stack.size() - 1); - } - - public Scope getScope() - { - return this.scope; - } - - protected void setScope(Scope scope) - { - this.scope = scope; - } - - protected static Map makeRootRoleSubsMap(RoleDeclList rdl) - { - return rdl.getParamDeclChildren().stream().collect(Collectors - .toMap(r -> r.getDeclName(), r -> (RoleNode) r.getNameNodeChild())); - } - - protected static Map, NonRoleArgNode> makeRootNonRoleSubsMap( - NonRoleParamDeclList pdl) - { - return pdl.getParamDeclChildren().stream() - .collect(Collectors.toMap(p -> (Arg) p.getDeclName(), - p -> (NonRoleArgNode) p.getNameNodeChild())); - } - - protected static Map makeRoleSubsMap(Map root, - RoleArgList ral, RoleDeclList rdl) - { - Iterator roleargs = ral.getRoles().iterator(); - return rdl.getRoles().stream() - .collect(Collectors.toMap(r -> r, r -> root.get(roleargs.next()))); - } - - protected static Map, NonRoleArgNode> makeNonRoleSubsMap( - Map, NonRoleArgNode> root, - NonRoleArgList nral, NonRoleParamDeclList nrpdl) - { - Map, NonRoleArgNode> newmap = new HashMap<>(); - - // Using arg and argnode views of the arglist - Iterator> nonroleargs = nral.getArguments() - .iterator(); - Iterator nonroleargnodes = nral.getArgumentNodes() - .iterator(); - for (Name param : nrpdl.getParameters()) - { - Arg arg = nonroleargs.next(); - NonRoleArgNode argnode; - if (root.containsKey(arg)) // A root param propagated through to here as an arg: get the root argnode - { - argnode = root.get(arg); - nonroleargnodes.next(); - } - else - { - argnode = nonroleargnodes.next(); // The argnode correspoding to the current arg - } - newmap.put((Arg) param, argnode); - } - - return newmap; - } - - private static Arg paramDeclToArg( - NonRoleParamDecl pd) - { - Name n = pd.getDeclName(); - if (!(n instanceof Arg)) - { - throw new RuntimeException("Shouldn't get in here: " + n); - } - @SuppressWarnings("unchecked") - Arg tmp = (Arg) n; - return tmp; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/Substitutor.java b/scribble-ast/src/main/java/org/scribble/visit/Substitutor.java index da9768d74..0d9c5eb6b 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/Substitutor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/Substitutor.java @@ -40,7 +40,7 @@ public Substitutor(Lang job, Map rolemap, } @Override - public ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) + public ScribNode leave(ScribNode child, ScribNode visited) throws ScribException { return visited.substituteNames(this); diff --git a/scribble-ast/src/main/java/org/scribble/visit/UnfoldingVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/UnfoldingVisitor.java deleted file mode 100644 index e018a9cee..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/UnfoldingVisitor.java +++ /dev/null @@ -1,133 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit; - -import java.util.Deque; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.Map; -import java.util.Set; - -import org.scribble.ast.Continue; -import org.scribble.ast.ProtocolBlock; -import org.scribble.ast.Recursion; -import org.scribble.ast.ScribNode; -import org.scribble.core.type.name.RecVar; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; -import org.scribble.visit.env.Env; - -// FIXME: unfolding/unrolling algorithm would be easier if we would use an "affine rec var" normal form: a single rec can have multiple labels, each label used at most once in a continue - -// "Lazily unfolds" each recursion once (by reentering the original rec ast) on reaching a continue -// FIXME: would be better to only unfold "as needed" (unguarded choice-recs) -// N.B. so subclass should manually keep track of when to cut off visiting, as visiting the "unfolding" will eventually reach the same continue (e.g. an unguarded choice-continue) -- currently using pointer equality in e.g. InlinedWFChoice to cut off traversal on reaching the "same" choice again -// Cf. InlinedProtocolUnfolder, statically unfolds unguarded recursions and continues "directly under" choices -public abstract class UnfoldingVisitor> - extends InlinedProtocolVisitor -{ - private Map>> recs = new HashMap<>(); - // Stack needed to handle bad reachability cases (e.g. ... continue X; continue Y; -- if rec Y inside unfolding of X, need to push again before popping so Y still in scope for continue) -- since reachability isn't checked until after projection - // Also FIXME: recvar shadowing: though this stack should be enough - private Set unfolded = new HashSet<>(); - - public UnfoldingVisitor(Lang lang) - { - super(lang); - } - - @Override - public ScribNode visit(ScribNode parent, ScribNode child) - throws ScribException - { - enter(parent, child); - ScribNode visited = visitForUnfolding(parent, child); - return leave(parent, child, visited); - } - - protected ScribNode visitForUnfolding(ScribNode parent, ScribNode child) - throws ScribException - { - if (child instanceof Continue) - { - Continue cont = (Continue) child; - RecVar rv = cont.getRecVarChild().toName(); - if (!this.unfolded.contains(rv)) - { - this.unfolded.add(rv); - // Visiting the children of the seq of the block so as to visit *under the existing env contexts* (i.e. the top Visitor Env) - // N.B. not visiting a clone because subclasses currently using pointer equality to cut off traversal inside the unfolding (e.g. InlinedWFChoiceChecker) - // Also visitChildren, not accept (so not doing enter/exit for the seq) - // Also not returning the seq, just the original continue (cf. do visiting) - //this.recs.get(rv).peek().seq.clone().visitChildren(this); // No: e.g. InlinedWFChoiceChecker uses pointer equality to check if Choice already visited - this.recs.get(rv).peek().getInteractSeqChild().visitChildren(this); - // CHECKME: ok to visit the same AST? any problems with dels/envs? -- maybe do proper equals/hashCode for AST classes - this.unfolded.remove(rv); - return cont; - } - } - return super.visitInlinedProtocol(parent, child); // Not super.visit because that does enter/exit - } - - @Override - protected final void inlinedEnter(ScribNode parent, ScribNode child) - throws ScribException - { - super.inlinedEnter(parent, child); - if (child instanceof Recursion) - { - Recursion rec = (Recursion) child; - RecVar rv = rec.getRecVarChild().toName(); - if (!this.recs.containsKey(rv)) - { - this.recs.put(rv, new LinkedList<>()); - } - Deque> blocks = this.recs.get(rv); - blocks.push(rec.getBlockChild()); - } - unfoldingEnter(parent, child); - } - - @Override - protected final ScribNode inlinedLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribException - { - ScribNode n = unfoldingLeave(parent, child, visited); - if (child instanceof Recursion) - { - Recursion rec = (Recursion) child; - RecVar rv = rec.getRecVarChild().toName(); - Deque> blocks = this.recs.get(rv); - blocks.pop(); - /*if (blocks.isEmpty()) // Unnecessary? But tidier? - { - this.recs.remove(rv); - }*/ - } - return super.inlinedLeave(parent, child, n); - } - - protected void unfoldingEnter(ScribNode parent, ScribNode child) - throws ScribException - { - - } - - protected ScribNode unfoldingLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribException - { - return visited; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/EGraphBuilder.java b/scribble-ast/src/main/java/org/scribble/visit/context/EGraphBuilder.java deleted file mode 100644 index bb6a2372f..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/context/EGraphBuilder.java +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.context; - -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LChoice; -import org.scribble.ast.local.LInteractionSeq; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.core.model.endpoint.EGraphBuilderUtil; -import org.scribble.del.local.LChoiceDel; -import org.scribble.del.local.LInteractionSeqDel; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; -import org.scribble.visit.NoEnvInlinedProtocolVisitor; - -// Changed from offsetsubprot visitor to inlined visitor to reduce state label accumulation to rec only -- then, wfc-checking for "unguarded" recursive-do-as-continue in choice blocks handled by unfolding inlineds -// Inlined visitor, not unfolding -- but the inlined is already statically unfolded; this just means we don't do a "dynamic" unfolding as part of the AST visit -public class EGraphBuilder extends NoEnvInlinedProtocolVisitor -//public class EndpointGraphBuilder extends NoEnvUnfoldingVisitor // Doesn't work -{ - public final EGraphBuilderUtil util;// = new EGraphBuilderUtil(); - - public EGraphBuilder(Lang job) - { - super(job); - try - { - this.util = job.getJob().newEGraphBuilderUtil(); - } - catch (ScribException e) // TODO: refactor - { - throw new RuntimeException(e); - } - } - - // Override visitInlinedProtocol -- not visit, or else enter/exit is lost - @Override - public ScribNode visitInlinedProtocol(ScribNode parent, ScribNode child) - throws ScribException - { - if (child instanceof LInteractionSeq) - { - return visitOverrideForLInteractionSeq((LProtocolBlock) parent, - (LInteractionSeq) child); - } - else if (child instanceof LChoice) - { - return visitOverrideForLChoice((LInteractionSeq) parent, (LChoice) child); - } - else - { - return super.visitInlinedProtocol(parent, child); - } - } - - protected LInteractionSeq visitOverrideForLInteractionSeq( - LProtocolBlock parent, LInteractionSeq child) throws ScribException - { - return ((LInteractionSeqDel) child.del()).visitForFsmConversion(this, - child); - } - - protected LChoice visitOverrideForLChoice(LInteractionSeq parent, - LChoice child) - { - return ((LChoiceDel) child.del()).visitForFsmConversion(this, child); - } - - @Override - protected final void inlinedEnter(ScribNode parent, ScribNode child) - throws ScribException - //protected final void unfoldingEnter(ScribNode parent, ScribNode child) throws ScribbleException - { - super.inlinedEnter(parent, child); - //super.unfoldingEnter(parent, child); - child.del().enterEGraphBuilding(parent, child, this); - } - - @Override - protected ScribNode inlinedLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribException - //protected ScribNode unfoldingLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException - { - visited = visited.del().leaveEGraphBuilding(parent, child, this, visited); - return super.inlinedLeave(parent, child, visited); - //return super.unfoldingLeave(parent, child, visited); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java b/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java deleted file mode 100644 index 00b60a56c..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextBuilder.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.context; - -import org.scribble.ast.ScribNode; -import org.scribble.core.lang.context.ModuleContext; -import org.scribble.lang.Lang; -import org.scribble.lang.context.ModuleContextCollector; -import org.scribble.util.ScribException; -import org.scribble.visit.AstVisitor; - -// Disambiguates ambiguous PayloadTypeOrParameter names and inserts implicit Scope names -public class ModuleContextBuilder extends AstVisitor -{ - public final ModuleContextCollector maker = new ModuleContextCollector(); // TODO: HACK, refactor - - private ModuleContext mcontext; // The "root" Module context (not the "main" module) - - public ModuleContextBuilder(Lang job) - { - super(job); - } - - @Override - protected void enter(ScribNode parent, ScribNode child) - throws ScribException - { - //System.out.println("mmm1: " + child.getClass() + " ,, " + child.del()); - child.del().enterModuleContextBuilding(parent, child, this); - } - - @Override - protected ScribNode leave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribException - { - return visited.del().leaveModuleContextBuilding(parent, child, this, - visited); - } - - public void setModuleContext(ModuleContext mcontext) - { - this.mcontext = mcontext; - } - - public ModuleContext getModuleContext() - { - return this.mcontext; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java index bfd48537e..e94f38072 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java @@ -34,10 +34,10 @@ public ModuleContextVisitor(Lang lang) } @Override - protected void enter(ScribNode parent, ScribNode child) + protected void enter(ScribNode child) throws ScribException { - super.enter(parent, child); + super.enter(child); if (child instanceof Module) // Factor out? { /*ModuleDel del = (ModuleDel) ((Module) child).del(); diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java b/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java deleted file mode 100644 index 9574e5cdc..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceDoPruner.java +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.context; - -import java.util.List; - -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LChoice; -import org.scribble.ast.local.LDo; -import org.scribble.ast.local.LSessionNode; -import org.scribble.ast.local.LInteractionSeq; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.ast.local.LProtocolDecl; -import org.scribble.ast.name.simple.DummyProjectionRoleNode; -import org.scribble.del.ModuleDel; -import org.scribble.lang.Lang; -import org.scribble.lang.LangContext; -import org.scribble.util.ScribException; -import org.scribble.visit.context.env.UnguardedChoiceDoEnv; - -// Basically infers all local choice subject candidates: if *none* are found for a given "choice-unguarded" do-call then the call is pruned (along with parent block and choice as necessary) -// i.e. prune if no choice subject candidates, because that means (passive) role is never enabled and thus not involved -// TODO: ambiguous choice subject (i.e. > 1 candidate) is checked subsequently by ProjectedChoiceSubjectFixer -- should be better integrated (e.g. reuse ChoiceUnguardedSubprotocolChecker, rather than adhoc LInteractionNode.inferLocalChoiceSubject) -- NOTE: but cannot do all pruning and fixing in one pass, as fixing the subject roles here will interfere with the pruning algorithm (currently it looks for dummy role choices) -public class ProjectedChoiceDoPruner extends ModuleContextVisitor -{ - public ProjectedChoiceDoPruner(Lang job) - { - super(job); - } - - /*@Override - protected ProjectedSubprotocolPruningEnv makeRootProtocolDeclEnv(ProtocolDecl pd) - { - return new ProjectedSubprotocolPruningEnv(); - }*/ - - @Override - public ScribNode visit(ScribNode parent, ScribNode child) - throws ScribException - { - if (child instanceof LProtocolBlock && parent instanceof LChoice) - { - LChoice lc = (LChoice) parent; - LProtocolBlock lb = (LProtocolBlock) child; - LInteractionSeq lis = lb.getInteractSeqChild(); - List ins = lis.getInteractionChildren(); - if (ins.get(0) instanceof LDo) // Unlike GRecursion.prune, to-prune "do" could be followed by a continuation? - { - LangContext jc = this.lang.getContext(); - LDo ld = (LDo) ins.get(0); - LProtocolDecl lpd = ld.getTargetProtocolDecl(jc, getModuleContext()); - - UnguardedChoiceDoProjectionChecker checker = new UnguardedChoiceDoProjectionChecker( - this.lang, - ((ModuleDel) jc - .getModule(ld.getProtocolNameNode().toName().getPrefix()).del()) - .getModuleContext(), - lc); - lpd.accept(checker); - - if ((lc.getSubjectChild() instanceof DummyProjectionRoleNode) - && checker.shouldCheckPrune()) - { - UnguardedChoiceDoEnv env = (UnguardedChoiceDoEnv) lpd.getDefChild() - .getBlockChild().del().env(); - // Although AST is cloned, del is the same (HACKY?) - if (env.subjs.isEmpty()) // Prune check - { - // Supports singleton case - return this.lang.config.af.LProtocolBlock(lb.getSource(), - this.lang.config.af.LInteractionSeq(lis.getSource(), - ins.subList(1, ins.size()))); - } - } - } - } - return super.visit(parent, child); - } - - @Override - //protected void subprotocolEnter(ScribNode parent, ScribNode child) throws ScribbleException - public void enter(ScribNode parent, ScribNode child) throws ScribException - { - //super.subprotocolEnter(parent, child); - super.enter(parent, child); - child.del().enterProjectedChoiceDoPruning(parent, child, this); - } - - @Override - //protected ScribNode subprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException - public ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) - throws ScribException - { - visited = visited.del().leaveProjectedChoiceDoPruning(parent, child, this, - visited); - //return super.subprotocolLeave(parent, child, visited); - return super.leave(parent, child, visited); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java b/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java deleted file mode 100644 index 6fc034e5f..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedChoiceSubjectFixer.java +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.context; - -import java.util.Deque; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.Map; - -import org.scribble.ast.ScribNode; -import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; - -public class ProjectedChoiceSubjectFixer extends ModuleContextVisitor -{ - private Map> recs = new HashMap>(); - - public ProjectedChoiceSubjectFixer(Lang job) - { - super(job); - } - - @Override - protected final void enter(ScribNode parent, ScribNode child) throws ScribException - { - super.enter(parent, child); - child.del().enterProjectedChoiceSubjectFixing(parent, child, this); - - /*if (child instanceof LProtocolDecl) - { - System.out.println("aaa:\n" + ((LProtocolDecl) child)); - }*/ - } - - @Override - protected ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException - { - visited = visited.del().leaveProjectedChoiceSubjectFixing(parent, child, this, visited); - return super.leave(parent, child, visited); - } - - public Role getChoiceSubject(RecVar rv) - { - return this.recs.get(rv).peek(); - } - - public void setChoiceSubject(Role subj) - { - for (Deque rs : this.recs.values()) - { - if (!rs.isEmpty()) // E.g. rec X { ... } rec Y { ... } -- after X, X is still in map but is empty - { - if (rs.peek() == null) - { - rs.pop(); - rs.push(subj); - } - } - } - } - - public void pushRec(RecVar rv) - { - Deque tmp = this.recs.get(rv); - if (tmp == null) - { - tmp = new LinkedList<>(); - this.recs.put(rv, tmp); - } - tmp.push(null); - } - - public void popRec(RecVar rv) - { - this.recs.get(rv).pop(); - } - - public RecVarRole createRecVarRole(RecVar rv) - { - return new RecVarRole(rv.toString()); - } - - public boolean isRecVarRole(Role r) - { - return (r instanceof RecVarRole); - } -} - -class RecVarRole extends Role // HACK for unguarded continues -- but not actually needed? -{ - private static final long serialVersionUID = 1L; - - public RecVarRole(String text) - { - super(text); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java b/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java deleted file mode 100644 index a5d266010..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/context/ProjectedRoleDeclFixer.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.context; - -import org.scribble.ast.ScribNode; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; - -public class ProjectedRoleDeclFixer extends ModuleContextVisitor -{ - public ProjectedRoleDeclFixer(Lang job) - { - super(job); - } - - @Override - protected final void enter(ScribNode parent, ScribNode child) throws ScribException - { - super.enter(parent, child); - child.del().enterProjectedRoleDeclFixing(parent, child, this); - } - - @Override - protected ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException - { - visited = visited.del().leaveProjectedRoleDeclFixing(parent, child, this, visited); - return super.leave(parent, child, visited); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/Projector.java b/scribble-ast/src/main/java/org/scribble/visit/context/Projector.java deleted file mode 100644 index 3d4531c26..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/context/Projector.java +++ /dev/null @@ -1,226 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.context; - -import java.util.HashMap; -import java.util.Map; -import java.util.Stack; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.Module; -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.core.type.kind.Local; -import org.scribble.core.type.kind.ModuleKind; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.LProtocolName; -import org.scribble.core.type.name.ModuleName; -import org.scribble.core.type.name.Role; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; -import org.scribble.visit.EnvVisitor; -import org.scribble.visit.context.env.ProjectionEnv; - -// Uses visitor infrastructure to traverse AST and generate local nodes from global with original nodes unchanged (so does not use normal visitChildren pattern -- env used to pass the working projections) -public class Projector extends EnvVisitor -{ - private Stack selfs = new Stack<>(); // Is a stack needed? roles only pushed from GlobalProtocolDecl, which should be only done once at the root? - - // protocol name is full global protocol name - private Map> projections = new HashMap<>(); - - public Projector(Lang job) - { - super(job); - } - - @Override - protected ProjectionEnv makeRootProtocolDeclEnv( - ProtocolDecl pd) - { - return new ProjectionEnv(); - } - - @Override - public ScribNode visit(ScribNode parent, ScribNode child) - throws ScribException - { - // "Override" SubprotocolVisitor visitChildrenInSubprotocols pattern, avoids adding visitForProjection to every ModelNode - // Or else need to build in a "visit override" mechanism into the parent visitors - if (child instanceof GProtocolDecl) - { - return visitOverrideForGProtocolDecl((Module) parent, - (GProtocolDecl) child); - } - else - { - return super.visit(parent, child); - } - } - - // Projector uses this to "override" the base SubprotocolVisitor visitChildrenInSubprotocols pattern - // Better to be in the visitor than in the del for visibility of visitor enter/leave -- also localises special visiting pattern inside the visitor, while keeping the del enter/leave methods uniform (e.g. GlobalProtocolDeclDelegate enter/leave relies on the same peekSelf API as for other nodes) - protected GProtocolDecl visitOverrideForGProtocolDecl(Module parent, - GProtocolDecl child) throws ScribException - { - for (Role self : child.getRoles()) - { - pushSelf(self); - enter(parent, child); - GProtocolDecl visited = (GProtocolDecl) child.visitChildren(this); // enter/leave around visitChildren for this GlobalProtocolDecl done above -- cf. SubprotocolVisitor.visit - visited = (GProtocolDecl) leave(parent, child, visited); // projection will not change original global protocol (visited can be discarded) - popSelf(); - } - return child; - } - - @Override - protected final void envEnter(ScribNode parent, ScribNode child) - throws ScribException - { - super.envEnter(parent, child); - child.del().enterProjection(parent, child, this); - } - - @Override - protected ScribNode envLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribException - { - visited = visited.del().leaveProjection(parent, child, this, visited); - return super.envLeave(parent, child, visited); - } - - public void pushSelf(Role self) - { - this.selfs.push(self); - } - - public Role peekSelf() - { - return this.selfs.peek(); - } - - public Role popSelf() - { - return this.selfs.pop(); - } - - // gpn is full global protocol name, mod is a module with the single local protocol projection - public void addProjection(GProtocolName gpn, Role role, Module mod) - { - Map tmp = this.projections.get(gpn); - if (tmp == null) - { - tmp = new HashMap<>(); - this.projections.put(gpn, tmp); - } - tmp.put(role, mod); - } - - public Map> getProjections() - { - return this.projections; - } - - public static LProtocolNameNode makeProjectedSimpleNameNode(AstFactory af, - CommonTree source, GProtocolName simpname, Role role) - { - return (LProtocolNameNode) af.QualifiedNameNode(source, Local.KIND, - org.scribble.core.visit.global.Projector2.projectSimpleProtocolName(simpname, role).toString()); - } - - public static LProtocolNameNode makeProjectedFullNameNode(AstFactory af, - CommonTree source, GProtocolName fullname, Role role) - { - return (LProtocolNameNode) af.QualifiedNameNode(source, Local.KIND, - org.scribble.core.visit.global.Projector2.projectFullProtocolName(fullname, role).getElements()); - } - - // fullname is the un-projected name; localname is the already projected simple name - public static ModuleNameNode makeProjectedModuleNameNode(AstFactory af, - CommonTree source, ModuleName fullname, LProtocolName localname) - { - return (ModuleNameNode) af.QualifiedNameNode(source, ModuleKind.KIND, - org.scribble.core.visit.global.Projector2.projectModuleName(fullname, localname).getElements()); - } - - - - - - - - - - - - - - - - - - // Returns true if should ignore for projection - /*public static boolean prune(LProtocolBlock block) - { - if (block.isEmpty()) - { - return true; - } - List lis = block.getInteractionSeq().getInteractions(); - if (lis.size() > 1) - { - return false; - } - else //if (lis.size() == 1) - { - LInteractionNode lin = lis.get(0); - if (lin instanceof LContinue) - { - return true; - } - else if (lin instanceof MessageTransfer) - { - return false; - } - else - { - if (lin instanceof LChoice) - { - for (LProtocolBlock b : ((LChoice) lin).getBlocks()) - { - if (!prune(b)) - { - return false; - } - } - return true; - } - else if (lin instanceof LRecursion) - { - return prune(((LRecursion) lin).getBlock()); - } - else - { - throw new RuntimeException("TODO: " + lin); - } - } - } - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java b/scribble-ast/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java deleted file mode 100644 index a818a0818..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/context/ProtocolDeclContextBuilder.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.context; - -import org.scribble.ast.ScribNode; -import org.scribble.ast.context.global.GDependencyMap; -import org.scribble.ast.context.local.LDependencyMap; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.LProtocolName; -import org.scribble.core.type.name.Role; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; -import org.scribble.visit.NoEnvSubprotocolVisitor; - -// Disambiguates ambiguous PayloadTypeOrParameter names and inserts implicit Scope names -- no: old? -public class ProtocolDeclContextBuilder extends NoEnvSubprotocolVisitor // For transitive dependency collection (cf. NameCollector) -{ - private GDependencyMap gdeps; - private LDependencyMap ldeps; - - public ProtocolDeclContextBuilder(Lang job) - { - super(job); - } - - @Override - protected void subprotocolEnter(ScribNode parent, ScribNode child) throws ScribException - { - super.subprotocolEnter(parent, child); - child.del().enterProtocolDeclContextBuilding(parent, child, this); - } - - @Override - protected ScribNode subprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException - { - visited = visited.del().leaveProtocolDeclContextBuilding(parent, child, this, visited); - return super.subprotocolLeave(parent, child, visited); - } - - public void clearProtocolDependencies() - { - this.gdeps = new GDependencyMap(); - this.ldeps = new LDependencyMap(); - } - - public void addGlobalProtocolDependency(Role self, GProtocolName gpn, Role target) - { - this.gdeps.addProtocolDependency(self, gpn, target); - } - - public void addLocalProtocolDependency(Role self, LProtocolName lpn, Role target) - { - this.ldeps.addProtocolDependency(self, lpn, target); - } - - public GDependencyMap getGlobalProtocolDependencyMap() - { - return this.gdeps; - } - - public LDependencyMap getLocalProtocolDependencyMap() - { - return this.ldeps; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/RecRemover.java b/scribble-ast/src/main/java/org/scribble/visit/context/RecRemover.java deleted file mode 100644 index 683a1b61c..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/context/RecRemover.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.context; - -import java.util.HashSet; -import java.util.Set; - -import org.scribble.ast.ScribNode; -import org.scribble.core.type.name.RecVar; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; -import org.scribble.visit.NoEnvInlinedProtocolVisitor; - -// FIXME: shadowed recvars -public class RecRemover extends NoEnvInlinedProtocolVisitor -{ - private final Set rvs = new HashSet<>(); - - public RecRemover(Lang job) - { - super(job); - } - - public void setToRemove(Set rv) - { - this.rvs.clear(); - this.rvs.addAll(rv); - } - - public boolean toRemove(RecVar rv) - { - return this.rvs.contains(rv); - } - - public void remove(RecVar rv) - { - this.rvs.remove(rv); - } - - @Override - public void inlinedEnter(ScribNode parent, ScribNode child) throws ScribException - { - super.inlinedEnter(parent, child); - child.del().enterRecRemoval(parent, child, this); - } - - @Override - public ScribNode inlinedLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException - { - visited = visited.del().leaveRecRemoval(parent, child, this, visited); - return super.inlinedLeave(parent, child, visited); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java b/scribble-ast/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java deleted file mode 100644 index 15a0449c3..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/context/UnguardedChoiceDoProjectionChecker.java +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.context; - -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LChoice; -import org.scribble.ast.local.LDo; -import org.scribble.ast.local.LSessionNode; -import org.scribble.core.lang.SubprotoSig; -import org.scribble.core.lang.context.ModuleContext; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.visit.SubprotocolVisitor; -import org.scribble.visit.context.env.UnguardedChoiceDoEnv; - -// TODO: refactor as a choice subject candidate collector (i.e. NameCollector -- thought that is an OffsetSubprotocolCollector, does that make a difference?) -public class UnguardedChoiceDoProjectionChecker - extends SubprotocolVisitor -//public class ChoiceUnguardedSubprotocolChecker extends NoEnvSubprotocolVisitor -{ - //private final LChoice cho; // Useless: subprotocovisitor visits a role-substituted clone - - private boolean shouldPrune = false; // OK here, or reinstant in env? - - public UnguardedChoiceDoProjectionChecker(Lang job, ModuleContext mcontext, - LChoice cho) - { - super(job); - setModuleContext(mcontext); - } - - public void setPruneCheck() - { - this.shouldPrune = true; - } - - public boolean shouldCheckPrune() - { - return this.shouldPrune; - } - - @Override - protected UnguardedChoiceDoEnv makeRootProtocolDeclEnv( - ProtocolDecl pd) - { - return new UnguardedChoiceDoEnv(); - } - - @Override - public ScribNode visit(ScribNode parent, ScribNode child) - throws ScribException - { - if (child instanceof LChoice) - { - LChoice lc = (LChoice) child; - return visitOverrideForLDoPruning(parent, lc); - } - return super.visit(parent, child); - } - - private ScribNode visitOverrideForLDoPruning(ScribNode parent, LChoice lc) - throws ScribException - { - for (LProtocolBlock b : lc.getBlockChildren()) - { - LSessionNode in = - b.getInteractSeqChild().getInteractionChildren().get(0); - if (in instanceof LDo) - { - LDo ld = (LDo) in; - ProtocolName fullname = getModuleContext() - .checkProtocolDeclDependencyFullName( - ld.getProtocolNameNode().toName()); - SubprotoSig sig = new SubprotoSig(fullname, - ld.getRoleListChild().getRoles(), - ld.getNonRoleListChild().getParamKindArgs()); - - if (sig.equals(getStack().get(0))) // Cf. SubprotocolVisitor.isRootedCycle - { - //if (isRootedCycle()) // ChoiceUnguardedSubprotocolChecker is a (regular) SubprotocolVisitor which pushes a subprotosig on root decl entry (ProjectedSubprotocolPruner.visit) - // Check for "rooted" cycle to ensure it's specifically the cycle from the root proto decl (back) to the target do - // FIXME: but cycle to specific "target do" is not ensured: could be another instance of a do with the same subprotosig... an inherent issue of the current subprotocolvisitor framework - // FIXME: this algorithm works for some use cases for is still wrong (prunes some that it shouldn't -- e.g. mutually pruneable choice-unguarded do's) - // *** what we really need is to check for 0 inferred choice subjects up to recursion back (if any) to to the parent choice -- problem is current framework doesn't make identifying (e.g. ==) the original choice easy *** - // no?: we don't need to come back to specifically the original choice: we follow the control flow into the target protocoldecl and if we encounter a recursion, regardless of whether it is back to the original choice-do or not, then it's a recursion and that's where the control flow (from this original do) will remain - // the issue is arising since WF was relaxed to allow unbalanced choice case roles: with balanced, subject inference is always fine as long as roles are used? (and prev assumed no choice-unguarded do's?) - - { - setPruneCheck(); - return lc; - } - } - } - } - return super.visit(parent, lc); - } - - @Override - protected void subprotocolEnter(ScribNode parent, ScribNode child) - throws ScribException - { - super.subprotocolEnter(parent, child); - child.del().enterUnguardedChoiceDoProjectionCheck(parent, child, this); - } - - @Override - protected ScribNode subprotocolLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribException - { - visited = visited.del().leaveUnguardedChoiceDoProjectionCheck(parent, child, - this, visited); - return super.subprotocolLeave(parent, child, visited); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java b/scribble-ast/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java deleted file mode 100644 index 2fa98731c..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/context/env/ProjectionEnv.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.context.env; - -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LScribNode; -import org.scribble.visit.env.Env; - -// Could make projection type a class parameter -public class ProjectionEnv extends Env -{ - private ScribNode projection; // Make local // FIXME: need to generalise for do projection (target protocol as well as the do) - - public ProjectionEnv() - { - - } - - @Override - public ProjectionEnv copy() - { - ProjectionEnv copy = new ProjectionEnv(); - copy.projection = this.projection; - return copy; - } - - @Override - public ProjectionEnv enterContext() - { - return copy(); - } - - public ScribNode getProjection() - { - return this.projection; - } - - public ProjectionEnv setProjection(LScribNode projection) - { - ProjectionEnv copy = new ProjectionEnv(); - copy.projection = projection; - return copy; - } - - @Override - public String toString() - { - return "projection=" + this.projection; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/env/UnguardedChoiceDoEnv.java b/scribble-ast/src/main/java/org/scribble/visit/context/env/UnguardedChoiceDoEnv.java deleted file mode 100644 index f2b91c7e9..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/context/env/UnguardedChoiceDoEnv.java +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.context.env; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import org.scribble.core.type.name.Role; -import org.scribble.visit.env.Env; - -// Cf. UnfoldingEnv -public class UnguardedChoiceDoEnv extends Env -{ - //private boolean shouldPrune; - public Set subjs; // If well-formed (including wrt. local choice syntax) should be a singleton: but this is currently checked in subsequent choice subject inference pass, not here - - public UnguardedChoiceDoEnv() - { - //this.shouldPrune = true; - this.subjs = new HashSet<>(); - } - - //protected ChoiceUnguardedSubprotocolEnv(boolean shouldPrune, Set subjs) - protected UnguardedChoiceDoEnv(Set subjs) - { - //this.shouldPrune = shouldUnfold; - this.subjs = new HashSet<>(subjs); - } - - @Override - protected UnguardedChoiceDoEnv copy() - { - //return new ChoiceUnguardedSubprotocolEnv(this.shouldPrune, this.subjs); - return new UnguardedChoiceDoEnv(this.subjs); - } - - @Override - public UnguardedChoiceDoEnv enterContext() - { - return copy(); - } - - @Override - public UnguardedChoiceDoEnv mergeContext(UnguardedChoiceDoEnv env) - { - return mergeContexts(Arrays.asList(env)); - } - - @Override - public UnguardedChoiceDoEnv mergeContexts(List envs) - { - UnguardedChoiceDoEnv copy = copy(); - //copy.shouldPrune = (envs.stream().filter((e) -> !e.shouldPrune).count() > 0); // Look for false, cf. UnfoldingEnv - //copy.subjs = envs.stream().flatMap((e) -> e.subjs.stream()).collect(Collectors.toSet()); - copy.subjs.addAll(envs.stream().flatMap((e) -> e.subjs.stream()).collect(Collectors.toSet())); - - //System.out.println("ddd1: " + envs); - //System.out.println("ddd2: " + copy.subjs); - - return copy; - } - - public UnguardedChoiceDoEnv setChoiceSubject(Role r) - { - UnguardedChoiceDoEnv copy = copy(); - if (copy.subjs.isEmpty()) - { - //System.out.println("BBB: " + r); - copy.subjs.add(r); - } - return copy; - } - - /*public boolean shouldPrune() - { - return this.shouldPrune; - } - - public ChoiceUnguardedSubprotocolEnv disablePrune() - { - ChoiceUnguardedSubprotocolEnv copy = copy(); - copy.shouldPrune = false; - return copy; - }*/ - - @Override - public String toString() - { - return super.toString() + ": " + this.subjs; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/env/DummyEnv.java b/scribble-ast/src/main/java/org/scribble/visit/env/DummyEnv.java deleted file mode 100644 index 591d409fa..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/env/DummyEnv.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.env; - -public class DummyEnv extends Env -{ - public static final DummyEnv DUMMY = new DummyEnv(); - - protected DummyEnv() - { - - } - - @Override - protected DummyEnv copy() - { - return this; - } - - @Override - public DummyEnv enterContext() - { - return this; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/env/Env.java b/scribble-ast/src/main/java/org/scribble/visit/env/Env.java deleted file mode 100644 index e1a704fa4..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/env/Env.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.env; - -import java.util.List; - -// Consider subclasses like Exception Subclasses, wrt. their purpose in a package -- although using explicit env subpackages (no special API doc treatment, cf. Exceptions) - -// Immutable -// Generic parameter inhibits further subclassing of concrete Env classes -public abstract class Env> -{ - protected Env() - { - - } - - protected abstract E copy(); // Shallow copy - - // Default push for entering a compound interaction context (e.g. used in CompoundInteractionDel via pushVisitorEnv) - public abstract E enterContext(); // copy by default - // FIXME: it's always just copy, so not useful -- e.g., WFChoiceEnv just does enterContext (copy) and then manually enableChoiceSubject - - // Mostly for merging a *compound interaction node* context into the parent *block* context - // Usually used in the base compound interaction node del when leaving and restoring the parent env in the visitor env stack (e.g. CompoundInteractionNodeDel for WF-choice) - // By default: merge just discards the argument(s) -- not all EnvVisitors need to merge (e.g. projection) - // FIXME: maybe not "expressive" enough -- e.g. has to be "overloaded" for "horizontal composition" and "vertical parent-child" merging of contexts (e.g. path collection) - protected Env mergeContext(E env) - { - //return mergeContexts(Arrays.asList(env)); - return this; - } - - // Can't use vargs with parameterized types - // Mostly for merging child *block* contexts into the parent *compound interaction node* context - // Usually used in the parent compound interaction node del to update the parent context after visting each child block before leaving (e.g. GChoiceDel for WF-choice) - // FIXME: deprecate (should use "compose" first on children, then "merge" to parent) -- or make a utility composeAndMerge method - protected Env mergeContexts(List envs) - { - return this; - } - - // FIXME: refactor older Envs to use "merge" for parent-child merging, and "compose" for horizontal merging - protected Env composeContext(E env) - { - return this; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/env/InlineProtocolEnv.java b/scribble-ast/src/main/java/org/scribble/visit/env/InlineProtocolEnv.java deleted file mode 100644 index fb646b52b..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/env/InlineProtocolEnv.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.env; - -import org.scribble.ast.ScribNode; - -public class InlineProtocolEnv extends Env -{ - private ScribNode inlined; - - public InlineProtocolEnv() - { - - } - - @Override - protected InlineProtocolEnv copy() - { - return new InlineProtocolEnv(); - } - - @Override - public InlineProtocolEnv enterContext() - { - return copy(); - } - - public ScribNode getTranslation() - { - return this.inlined; - } - - public InlineProtocolEnv setTranslation(ScribNode inlined) - { - InlineProtocolEnv copy = new InlineProtocolEnv(); - copy.inlined = inlined; - return copy; - } - - @Override - public String toString() - { - return "inlined=" + this.inlined; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/env/UnfoldingEnv.java b/scribble-ast/src/main/java/org/scribble/visit/env/UnfoldingEnv.java deleted file mode 100644 index cb727ef91..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/env/UnfoldingEnv.java +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.env; - -import java.util.Arrays; -import java.util.List; - -public class UnfoldingEnv extends Env -{ - private boolean shouldUnfold; // i.e. unguarded choice context - - public UnfoldingEnv() - { - this.shouldUnfold = false; - } - - protected UnfoldingEnv(boolean shouldUnfold) - { - this.shouldUnfold = shouldUnfold; - } - - @Override - protected UnfoldingEnv copy() - { - return new UnfoldingEnv(this.shouldUnfold); - } - - @Override - public UnfoldingEnv enterContext() - { - return copy(); - } - - @Override - public UnfoldingEnv mergeContext(UnfoldingEnv env) - { - return mergeContexts(Arrays.asList(env)); - } - - @Override - public UnfoldingEnv mergeContexts(List envs) - { - UnfoldingEnv copy = copy(); - boolean merge = (envs.stream().filter((e) -> e.shouldUnfold).count() > 0); - copy.shouldUnfold = merge; - return copy; - } - - public boolean shouldUnfold() - { - return this.shouldUnfold; - } - - public UnfoldingEnv pushChoiceParent() - { - UnfoldingEnv copy = copy(); - copy.shouldUnfold = true; - return copy; - } - - // Disable unfold upon encountering a guarding action for current choice context - public UnfoldingEnv disableUnfold() - { - UnfoldingEnv copy = copy(); - copy.shouldUnfold = false; - return copy; - } - - @Override - public String toString() - { - return super.toString() + ": " + this.shouldUnfold; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/util/MessageIdCollector.java b/scribble-ast/src/main/java/org/scribble/visit/util/MessageIdCollector.java deleted file mode 100644 index 545d89772..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/util/MessageIdCollector.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.util; - -import org.scribble.ast.ScribNode; -import org.scribble.core.lang.context.ModuleContext; -import org.scribble.core.type.name.MessageId; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; - -public class MessageIdCollector extends NameCollector> -{ - public MessageIdCollector(Lang job, ModuleContext mcontext) - { - super(job, mcontext); - } - - @Override - protected final void offsetSubprotocolEnter(ScribNode parent, ScribNode child) throws ScribException - { - super.offsetSubprotocolEnter(parent, child); - child.del().enterMessageIdCollection(parent, child, this); - } - - @Override - protected ScribNode offsetSubprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException - { - visited = visited.del().leaveMessageIdCollection(parent, child, this, visited); - return super.offsetSubprotocolLeave(parent, child, visited); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/util/NameCollector.java b/scribble-ast/src/main/java/org/scribble/visit/util/NameCollector.java deleted file mode 100644 index 534dae7b5..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/util/NameCollector.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.util; - -import java.util.HashSet; -import java.util.Set; - -import org.scribble.core.lang.context.ModuleContext; -import org.scribble.core.type.name.Name; -import org.scribble.lang.Lang; -import org.scribble.visit.NoEnvOffsetSubprotocolVisitor; - -// Make SubprotocolVisitor? -- should be at least SubprotocolVisitor for get all occurrences up to recursive subprotocols (e.g. role occurrences for protocoldeclcontext) -public abstract class NameCollector> extends NoEnvOffsetSubprotocolVisitor -{ - private Set names = new HashSet<>(); - - public NameCollector(Lang job) - { - super(job); - } - - // Can take ModuleContext here, so no need to visit from Module as root -- maybe factor this facility out - // Although has to enter at least at protocoldecl for subprotocol visitor root sig pushing - public NameCollector(Lang job, ModuleContext mcontext) - { - super(job); - setModuleContext(mcontext); - } - - public void addName(N name) - { - this.names.add(name); - } - - public void removeName(N name) - { - if (this.names.contains(name)) - { - this.names.remove(name); - } - } - - public Set getNames() - { - return this.names; - } - - public void clear() - { - this.names.clear(); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/util/RecVarCollector.java b/scribble-ast/src/main/java/org/scribble/visit/util/RecVarCollector.java deleted file mode 100644 index c471d47c4..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/util/RecVarCollector.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.util; - -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ScribNode; -import org.scribble.core.lang.context.ModuleContext; -import org.scribble.core.type.name.RecVar; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; - -// Collects continues (not recs) -public class RecVarCollector extends NameCollector -{ - public RecVarCollector(Lang job) - { - super(job); - } - - public RecVarCollector(Lang job, ModuleContext mcontext) - { - super(job, mcontext); - } - - @Override - protected final void offsetSubprotocolEnter(ScribNode parent, ScribNode child) throws ScribException - { - super.offsetSubprotocolEnter(parent, child); - if (child instanceof ProtocolDecl) - { - super.clear(); - } - child.del().enterRecVarCollection(parent, child, this); - } - - @Override - protected ScribNode offsetSubprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException - { - visited = visited.del().leaveRecVarCollection(parent, child, this, visited); - return super.offsetSubprotocolLeave(parent, child, visited); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/util/RoleCollector.java b/scribble-ast/src/main/java/org/scribble/visit/util/RoleCollector.java deleted file mode 100644 index 0e343e963..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/util/RoleCollector.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.util; - -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ScribNode; -import org.scribble.core.lang.context.ModuleContext; -import org.scribble.core.type.name.Role; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; - -// Second pass for ProtocolDeclContext building -// Maybe generalise to integrate enabled message collection? -// NOTE: doesn't collect from choice subjects -public class RoleCollector extends NameCollector -{ - public RoleCollector(Lang job) - { - super(job); - } - - public RoleCollector(Lang job, ModuleContext mcontext) - { - super(job, mcontext); - } - - @Override - protected final void offsetSubprotocolEnter(ScribNode parent, ScribNode child) throws ScribException - { - super.offsetSubprotocolEnter(parent, child); - if (child instanceof ProtocolDecl) - { - super.clear(); - } - child.del().enterRoleCollection(parent, child, this); - } - - @Override - protected ScribNode offsetSubprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException - { - visited = visited.del().leaveRoleCollection(parent, child, this, visited); - return super.offsetSubprotocolLeave(parent, child, visited); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/validation/GProtocolValidator.java b/scribble-ast/src/main/java/org/scribble/visit/validation/GProtocolValidator.java deleted file mode 100644 index e4a2a2504..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/validation/GProtocolValidator.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.validation; - -import org.scribble.ast.ScribNode; -import org.scribble.core.job.Job; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ModuleContextVisitor; - -public class GProtocolValidator extends ModuleContextVisitor -{ - public final Job job; - - public GProtocolValidator(Lang job) - { - super(job); - this.job = null; - } - - public GProtocolValidator(Job job2) - { - super(null); - this.job = job2; - } - - @Override - public void enter(ScribNode parent, ScribNode child) throws ScribException - { - super.enter(parent, child); - child.del().enterValidation(parent, child, this); - } - - @Override - public ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException - { - visited = visited.del().leaveValidation(parent, child, this, visited); - return super.leave(parent, child, visited); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java b/scribble-ast/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java deleted file mode 100644 index 02ee59602..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/DelegationProtocolRefChecker.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.wf; - -import java.util.Deque; -import java.util.LinkedList; - -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ScribNode; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ModuleContextVisitor; - -// Checks for recursive protocoldecl dependencies in the presence of delegations (currently, both via the delegation, and in of the protocoldelcs themselves -- FIXME over restrictive) -public class DelegationProtocolRefChecker extends ModuleContextVisitor -{ - private Deque> pds = new LinkedList<>(); // Stack should be unnecessary - // HACK: for DelegationElem recursive protocoldecl dependency checking // FIXME: should factor out more generally - - public DelegationProtocolRefChecker(Lang job) - { - super(job); - } - - @Override - public void enter(ScribNode parent, ScribNode child) throws ScribException - { - super.enter(parent, child); - if (child instanceof ProtocolDecl) - { - this.pds.push((ProtocolDecl) child); - } - child.del().enterDelegationProtocolRefCheck(parent, child, this); - } - - @Override - public ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException - { - visited = visited.del().leaveDelegationProtocolRefCheck(parent, child, this, visited); - if (visited instanceof ProtocolDecl) - { - this.pds.pop(); - } - return super.leave(parent, child, visited); - } - - public ProtocolDecl getProtocolDeclOnEntry() // Result of visiting (on leave) will be a different instance - { - return this.pds.peek(); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java b/scribble-ast/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java deleted file mode 100644 index 5c6d0c543..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/ExplicitCorrelationChecker.java +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.wf; - -import org.scribble.ast.Module; -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GProtocolDecl; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.Role; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; -import org.scribble.visit.SubprotocolVisitor; -import org.scribble.visit.wf.env.ExplicitCorrelationEnv; - -public class ExplicitCorrelationChecker - extends SubprotocolVisitor - // Need to follow /unfolded/ subprotos (inlined is already unfolded by context building when this pass is run) -{ - public ExplicitCorrelationChecker(Lang job) - { - super(job); - } - - - @Override - public ScribNode visit(ScribNode parent, ScribNode child) - throws ScribException - { - if (child instanceof GProtocolDecl) - { - GProtocolDecl gpd = (GProtocolDecl) child; - if (!gpd.isAux() && gpd.isExplicit()) - { - Module mod = (Module) parent; - GProtocolName gpn = gpd.getFullMemberName(mod); - for (Role r : gpd.getHeaderChild().getRoleDeclListChild().getRoles()) - { - /*Module proj = this.job.getJobContext().getProjection(gpn, r); - proj.accept(this);*/ - throw new RuntimeException("[TODO]: " + gpn + "@" + r); - } - } - return gpd; - } - return super.visit(parent, child); - } - - @Override - public void subprotocolEnter(ScribNode parent, ScribNode child) - throws ScribException - { - super.subprotocolEnter(parent, child); - child.del().enterExplicitCorrelationCheck(parent, child, this); - } - - @Override - public ScribNode subprotocolLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribException - { - visited = visited.del().leaveExplicitCorrelationCheck(parent, child, this, visited); - return super.subprotocolLeave(parent, child, visited); - } - - @Override - protected ExplicitCorrelationEnv makeRootProtocolDeclEnv( - ProtocolDecl pd) - { - return new ExplicitCorrelationEnv(); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/NameDisambiguator.java b/scribble-ast/src/main/java/org/scribble/visit/wf/NameDisambiguator.java index 18422a4ab..ca1521ca6 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/NameDisambiguator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/wf/NameDisambiguator.java @@ -57,23 +57,24 @@ public NameDisambiguator(Lang job) // Most subclasses will override visitForSubprotocols (e.g. ReachabilityChecker, FsmConstructor), but sometimes still want to change whole visit pattern (e.g. Projector) @Override - public ScribNode visit(ScribNode parent, ScribNode child) throws ScribException + public ScribNode visit(ScribNode child) throws ScribException { /*if (child instanceof ProtocolDecl) // FIXME: factor out { this.root = (ProtocolDecl) child; }*/ - enter(parent, child); - ScribNode visited = visitForDisamb(parent, child); - return leave(parent, child, visited); + enter(child); + ScribNode visited = visitForDisamb(child); + return leave(child, visited); } - protected ScribNode visitForDisamb(ScribNode parent, ScribNode child) throws ScribException + // CHECKME: why "visitFor" pattern? + protected ScribNode visitForDisamb(ScribNode child) throws ScribException { if (child instanceof GDelegationElem) { - //return visitOverrideForDelegationElem(parent, (Do) child); - return ((GDelegationElemDel) child.del()).visitForNameDisambiguation(this, (GDelegationElem) child); + return ((GDelegationElemDel) child.del()).visitForNameDisambiguation(this, + (GDelegationElem) child); } else { @@ -83,17 +84,18 @@ protected ScribNode visitForDisamb(ScribNode parent, ScribNode child) throws Scr @Override //public NameDisambiguator enter(ModelNode parent, ModelNode child) throws ScribbleException - public void enter(ScribNode parent, ScribNode child) throws ScribException + public void enter(ScribNode child) throws ScribException { - super.enter(parent, child); - child.del().enterDisambiguation(parent, child, this); + super.enter(child); + child.del().enterDisambiguation(child, this); } @Override - public ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribException + public ScribNode leave(ScribNode child, ScribNode visited) + throws ScribException { - visited = visited.del().leaveDisambiguation(parent, child, this, visited); - return super.leave(parent, child, visited); + visited = visited.del().leaveDisambiguation(child, this, visited); + return super.leave(child, visited); } public void clear() @@ -116,7 +118,8 @@ public boolean isBoundRole(Role role) return this.roles.contains(role); } - public void addParameter(Name param, NonRoleParamKind kind) + public void addParameter(Name param, + NonRoleParamKind kind) { this.params.put(param.toString(), kind); } diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java b/scribble-ast/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java deleted file mode 100644 index 9320b0696..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/ReachabilityChecker.java +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.wf; - -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LInteractionSeq; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.del.local.LInteractionSeqDel; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; -import org.scribble.visit.UnfoldingVisitor; -import org.scribble.visit.wf.env.ReachabilityEnv; - -public class ReachabilityChecker extends UnfoldingVisitor -{ - public ReachabilityChecker(Lang job) - { - super(job); - } - - @Override - protected ReachabilityEnv makeRootProtocolDeclEnv(ProtocolDecl pd) - { - ReachabilityEnv env = new ReachabilityEnv(); - return env; - } - - // Following Projector visit pattern -- for overriding base enter/visit/leave pattern - @Override - protected ScribNode visitForUnfolding(ScribNode parent, ScribNode child) - throws ScribException - { - if (child instanceof LInteractionSeq) - { - return visitOverrideForLInteractionSequence((LProtocolBlock) parent, - (LInteractionSeq) child); - } - else - { - return super.visitForUnfolding(parent, child); - } - } - - protected LInteractionSeq visitOverrideForLInteractionSequence( - LProtocolBlock parent, LInteractionSeq child) throws ScribException - { - return ((LInteractionSeqDel) child.del()).visitForReachabilityChecking(this, - (LInteractionSeq) child); - } - - @Override - protected void unfoldingEnter(ScribNode parent, ScribNode child) - throws ScribException - { - super.unfoldingEnter(parent, child); - child.del().enterReachabilityCheck(parent, child, this); - } - - @Override - protected ScribNode unfoldingLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribException - { - visited = visited.del().leaveReachabilityCheck(parent, child, this, - visited); - return super.unfoldingLeave(parent, child, visited); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java b/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java deleted file mode 100644 index dca3aa0d0..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/WFChoiceChecker.java +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.wf; - -import java.util.HashSet; -import java.util.Set; - -import org.scribble.ast.Choice; -import org.scribble.ast.InteractionSeq; -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GProtocolDecl; -import org.scribble.core.job.JobArgs; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; -import org.scribble.visit.UnfoldingVisitor; -import org.scribble.visit.wf.env.WFChoiceEnv; - -// Note: now only used for choice subject and enabled checking -// TODO: refactor as distinct enabling messages checker (cf. GChoiceDel, WFChoicePathChecker) -public class WFChoiceChecker extends UnfoldingVisitor -{ - // N.B. using pointer equality for checking if choice previously visited - // So UnfoldingVisitor cannot visit a clone - // equals method identity not suitable unless AST nodes record additional info like syntactic position - private Set> visited = new HashSet<>(); - - public WFChoiceChecker(Lang lang) - { - super(lang); - } - - @Override - protected WFChoiceEnv makeRootProtocolDeclEnv( - ProtocolDecl pd) - { - return new WFChoiceEnv(new HashSet<>(pd.getRoles()), - !(pd.isGlobal() && pd.isExplicit())); - // FIXME: consider locals; also, explicit modifier should be carried over to local projections - } - - @Override - public ScribNode visit(ScribNode parent, ScribNode child) - throws ScribException - { - if (child instanceof GProtocolDecl) - { - GProtocolDecl gpd = (GProtocolDecl) child; - if (gpd.isAux()) - { - return child; // bypass aux protocols // TODO: integrate bypass functionality into made enter/visit/leave pattern - } - } - - if (this.lang.config.args.get(JobArgs.OLD_WF)) - { - if (child instanceof Choice) // Only needed for old WF (for distinct enabling message checking) // FIXME: maybe move connectedness checking to a separate pass, i.e. vanilla UnfoldingVisitor (if retained as syntactic check) - { - return visitOverrideForChoice((InteractionSeq) parent, - (Choice) child); - } - } - return super.visit(parent, child); - } - - private ScribNode visitOverrideForChoice(InteractionSeq parent, - Choice child) throws ScribException - { - if (child instanceof Choice) - { - Choice cho = (Choice) child; - if (!this.visited.contains(cho)) // ** Old WF breaks connectedness checking, e.g. rec X { choice at A { connect A to B; continue X; } } because of choice visit pruning - { - this.visited.add(cho); - //ScribNode n = cho.visitChildren(this); - ScribNode n = super.visit(parent, child); - this.visited.remove(cho); - return n; - } - else - { - return cho; - } - } - else - { - return super.visit(parent, child); - } - } - - @Override - protected void unfoldingEnter(ScribNode parent, ScribNode child) - throws ScribException - { - super.unfoldingEnter(parent, child); - child.del().enterInlinedWFChoiceCheck(parent, child, this); - } - - @Override - protected ScribNode unfoldingLeave(ScribNode parent, ScribNode child, - ScribNode visited) throws ScribException - { - visited = visited.del().leaveInlinedWFChoiceCheck(parent, child, this, - visited); - return super.unfoldingLeave(parent, child, visited); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/env/ExplicitCorrelationEnv.java b/scribble-ast/src/main/java/org/scribble/visit/wf/env/ExplicitCorrelationEnv.java deleted file mode 100644 index 8d0caeffa..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/env/ExplicitCorrelationEnv.java +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.wf.env; - -import java.util.Arrays; -import java.util.List; - -import org.scribble.visit.env.Env; - -public class ExplicitCorrelationEnv extends Env -{ - private boolean canAccept; - - public ExplicitCorrelationEnv() - { - this.canAccept = true; - } - - protected ExplicitCorrelationEnv(boolean canAccept) - { - this.canAccept = canAccept; - } - - @Override - protected ExplicitCorrelationEnv copy() - { - return new ExplicitCorrelationEnv(this.canAccept); - } - - @Override - public ExplicitCorrelationEnv enterContext() - { - return copy(); - } - - @Override - public ExplicitCorrelationEnv mergeContext(ExplicitCorrelationEnv env) - { - return mergeContexts(Arrays.asList(env)); - } - - @Override - public ExplicitCorrelationEnv mergeContexts(List envs) - { - ExplicitCorrelationEnv copy = copy(); - if (copy.canAccept) - { - copy.canAccept = !envs.stream().anyMatch((e) -> !e.canAccept); - } - return copy; - } - - public boolean canAccept() - { - return this.canAccept; - } - - public ExplicitCorrelationEnv disableAccept() - { - if (!this.canAccept) - { - return this; - } - ExplicitCorrelationEnv copy = copy(); - copy.canAccept = false; - return copy; - } - - @Override - public String toString() - { - return super.toString() + ": " + this.canAccept; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java b/scribble-ast/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java deleted file mode 100644 index d4982c0de..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/env/ReachabilityEnv.java +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.wf.env; - -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import org.scribble.core.type.name.RecVar; -import org.scribble.visit.env.Env; - -public class ReachabilityEnv extends Env -{ - private boolean seqable; // For checking bad sequencing of unreachable code: false after a continue; true if choice has an exit (false inherited for all other constructs) - private final Set contlabs; // For checking "reachable code" satisfies tail recursion (in the presence of sequencing, e.g., after choice) - - public ReachabilityEnv() - { - this(true, Collections.emptySet()); - } - - protected ReachabilityEnv(boolean seqable, Set contlabs) - { - this.contlabs = new HashSet(contlabs); - this.seqable = seqable; - } - - @Override - public ReachabilityEnv copy() - { - return new ReachabilityEnv(this.seqable, this.contlabs); - } - - @Override - public ReachabilityEnv enterContext() - { - return copy(); - } - - // Should not be used for single block choice - @Override - public ReachabilityEnv mergeContext(ReachabilityEnv child) - { - return mergeContexts(Arrays.asList(child)); - } - - // Should not be used for Choice - @Override - public ReachabilityEnv mergeContexts(List children) - { - return merge(false, children); - } - - public ReachabilityEnv mergeForChoice(List children) - { - return merge(true, children); - } - - // Does merge depend on choice/par etc? - private ReachabilityEnv merge(boolean isChoice, - List children) - { - ReachabilityEnv copy = copy(); - copy.seqable = - isChoice - ? children.stream().filter(e -> e.seqable).count() > 0 - : children.stream().filter(e -> !e.seqable).count() == 0; - children.forEach(e -> copy.contlabs.addAll(e.contlabs)); - return copy; - } - - // i.e. control flow has the potential to exit from this context - public boolean isSequenceable() - { - return this.seqable && this.contlabs.isEmpty(); - } - - public ReachabilityEnv addContinueLabel(RecVar recvar) - { - ReachabilityEnv copy = copy(); - copy.seqable = false; - copy.contlabs.add(recvar); - return copy; - } - - public ReachabilityEnv removeContinueLabel(RecVar recvar) - { - ReachabilityEnv copy = copy(); - copy.contlabs.remove(recvar); - return copy; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java b/scribble-ast/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java deleted file mode 100644 index f9b9a4071..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/env/WFChoiceEnv.java +++ /dev/null @@ -1,249 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit.wf.env; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.Op; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; -import org.scribble.core.type.session.MessageSig; -import org.scribble.core.type.session.Payload; -import org.scribble.util.ConnectedMap; -import org.scribble.util.MessageIdMap; -import org.scribble.visit.env.Env; - -public class WFChoiceEnv extends Env -{ - private static final Role DUMMY_ROLE = new Role("__ROLE"); - private static final Op ROOT_OPERATOR = new Op("__ROOT"); - private static final Op SUBJECT_OPERATOR = new Op("__SUBJECT"); - - private static final MessageSig ROOT_MESSAGESIGNATURE = new MessageSig(ROOT_OPERATOR, Payload.EMPTY_PAYLOAD); - private static final MessageSig SUBJECT_MESSAGESIGNATURE = new MessageSig(SUBJECT_OPERATOR, Payload.EMPTY_PAYLOAD); - - // dest -> src -> msg - private MessageIdMap initial; // message transfers recorded here in block envs - //private MessageIdMap initialInterrupts; // interrupts recorded here in interruptible env - - private ConnectedMap connected; - - // FIXME: use roles to initialise MessageIdMap properly, cf. WFBuffers - public WFChoiceEnv(Set roles, boolean implicit) - { - //this(new MessageIdMap(), new MessageIdMap()); - this(new MessageIdMap(), new ConnectedMap(roles, implicit)); - } - - //protected InlinedWFChoiceEnv(MessageIdMap initial, MessageIdMap initialInterrupts) - protected WFChoiceEnv(MessageIdMap initial, ConnectedMap connected) - { - this.initial = new MessageIdMap(initial); - //this.initialInterrupts = new MessageIdMap(initialInterrupts); - this.connected = new ConnectedMap(connected); - } - - @Override - protected WFChoiceEnv copy() - { - //return new InlinedWFChoiceEnv(this.initial, this.initialInterrupts); - return new WFChoiceEnv(this.initial, this.connected); - } - - public WFChoiceEnv clear() - { - WFChoiceEnv copy = copy(); - copy.initial.clear(); - //copy.initialInterrupts.clear(); - return copy; - } - - @Override - public WFChoiceEnv enterContext() - { - //return new InlinedWFChoiceEnv(this.initial, this.initialInterrupts); - return new WFChoiceEnv(this.initial, this.connected); // i.e., copy - } - - @Override - public WFChoiceEnv mergeContext(WFChoiceEnv child) - { - return mergeContexts(Arrays.asList(child)); - } - - // FIXME: refactor to use Stream.reduce? - @Override - public WFChoiceEnv mergeContexts(List children) - { - WFChoiceEnv copy = copy(); - for (WFChoiceEnv child : children) - { - mergeMessageIdMap(this, copy.initial, child.initial); - ////merge(this, copy.initialInterrupts, child.initialInterrupts); - //merge(this, copy.connected, child.connected); - } - - // FIXME: refactor, cf. mergeMessageIdMap - ConnectedMap cm = children.get(0).getConnected(); - for (WFChoiceEnv e : children.subList(1, children.size())) - { - cm = cm.merge(e.getConnected()); - } - copy.connected = cm; - return copy; - } - - // Pre: foo is orig.copy().initial -- orig is "parent" - // Updates running according to state of orig and child - private static void mergeMessageIdMap(WFChoiceEnv orig, MessageIdMap running, MessageIdMap child) - { - for (Role dest : child.getDestinations()) - { - for (Role src : child.getSources(dest)) - { - if (!orig.isEnabled(dest)) - { - running.putMessages(dest, src, child.getMessages(dest, src)); - } - } - } - } - - /*// FIXME: factor out with MessageIdMap - private static void merge(WFChoiceEnv parent, ConnectedMap foo, ConnectedMap child) - { - for (Role dest : child.getDestinations()) - { - for (Role src : child.getSources(dest)) - { - //if (!parent.isConnected(src, dest)) - { - // If not previously connected, update connected according to latest state -- No: also need to write disconnected (if parent is connected) - foo.setConnected(dest, src, child.isConnected(dest, src)); - } - } - } - }*/ - - public WFChoiceEnv enableRoleForRootProtocolDecl(Role role) - { - return addMessage(WFChoiceEnv.DUMMY_ROLE, role, WFChoiceEnv.ROOT_MESSAGESIGNATURE); - } - - public WFChoiceEnv enableChoiceSubject(Role role) - { - return addMessage(WFChoiceEnv.DUMMY_ROLE, role, WFChoiceEnv.SUBJECT_MESSAGESIGNATURE); - } - - public WFChoiceEnv connect(Role src, Role dest) - { - WFChoiceEnv copy = copy(); - copy.connected.connect(src, dest); - return copy; - } - - public WFChoiceEnv disconnect(Role src, Role dest) - { - WFChoiceEnv copy = copy(); - copy.connected.disconnect(src, dest); - return copy; - } - - // The "main" public routine - // Rename: more like enable-if-not-already - public WFChoiceEnv addMessage(Role src, Role dest, Message msg) - { - WFChoiceEnv copy = copy(); - addMessages(copy.initial, src, dest, Arrays.asList(msg.getId())); - return copy; - } - - /*public WFChoiceEnv removeMessage(Role src, Role dest, Message msg) - { - WFChoiceEnv copy = copy(); - copy.initial.removeMessage(dest, src, msg.getId()); - return copy; - } - - public WFChoiceEnv disableRole(Role r) - { - WFChoiceEnv copy = copy(); - for (...) - { - copy.initial.removeMessage(dest, src, ...); - } - return copy; - }*/ - - // FIXME: List/Set argument - // Means: record message as initial enabling message if dest not already enabled - private static void addMessages(MessageIdMap map, Role src, Role dest, List> msgs) - { - if (!map.containsDestination(dest)) // FIXME: factor out isEnabled - { - map.putMessages(dest, src, new HashSet<>(msgs)); - } - } - - /*public InlinedWFChoiceEnv addInterrupt(Role src, Role dest, Message msg) - { - InlinedWFChoiceEnv copy = copy(); - if (!copy.initial.containsLeftKey(dest)) - { - copy.initialInterrupts.putMessage(dest, src, msg.getId()); - } - return copy; - }*/ - - public boolean isEnabled(Role role) - { - return this.initial.containsDestination(role); - } - - public MessageIdMap getEnabled() - { - MessageIdMap tmp = new MessageIdMap(this.initial); - //tmp.merge(this.initialInterrupts); - return tmp; - } - - public ConnectedMap getConnected() - { - ConnectedMap tmp = new ConnectedMap(this.connected); - return tmp; - } - - /*public WFChoiceEnv setConnected(ConnectedMap cm) - { - WFChoiceEnv copy = copy(); - copy.connected = cm; - return copy; - }*/ - - public boolean isConnected(Role r1, Role r2) - { - return this.connected.isConnected(r1, r2); - } - - @Override - public String toString() - { - //return "initial=" + this.initial.toString() + ", initialInterrupts=" + this.initialInterrupts.toString(); - return "initial=" + this.initial.toString(); - } -} diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index 3b8e3cd9d..b47738026 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -21,19 +21,18 @@ import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.ApiGen; import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.ConstructorBuilder; import org.scribble.codegen.java.util.FieldBuilder; +import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; +import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; -import org.scribble.del.ModuleDel; import org.scribble.lang.Lang; import org.scribble.util.ScribException; -import org.scribble.visit.util.MessageIdCollector; public class SessionApiGenerator extends ApiGen { @@ -181,12 +180,14 @@ private void addSingletonConstant(ClassBuilder cb, String subpack, String type) private void constructOpClasses() throws ScribException { - Module mod = this.lang.getContext().getModule(this.gpn.getPrefix()); + /*Module mod = this.lang.getContext().getModule(this.gpn.getPrefix()); GProtocolName simpname = this.gpn.getSimpleName(); GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDeclChild(simpname); MessageIdCollector coll = new MessageIdCollector(this.lang, ((ModuleDel) mod.del()).getModuleContext()); gpd.accept(coll); - for (MessageId mid : coll.getNames()) + for (MessageId mid : coll.getNames())*/ + GProtocol inlined = this.job.getContext().getInlined(this.gpn); + for (MessageId mid : inlined.def.getMessageIds()) { //constructOpClass(this.cb.newClass(), mid); //constructOpClass(new ClassBuilder(), getEndpointApiRootPackageName(this.gpn), mid); From c0ad68ac1d123e5bbc1b758daafda55b0fa3d131 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 21:42:25 +0100 Subject: [PATCH 202/539] Continued: refactoring ast/del. --- .../java/org/scribble/ast/CompoundInteraction.java | 2 +- .../{CompoundNode.java => CompoundSessionNode.java} | 10 ++++++---- .../src/main/java/org/scribble/ast/ProtocolBlock.java | 2 +- .../src/main/java/org/scribble/ast/ScribNode.java | 2 +- .../src/main/java/org/scribble/ast/SessionNode.java | 4 +--- .../main/java/org/scribble/ast/SimpleSessionNode.java | 3 +-- .../src/main/java/org/scribble/ast/global/GChoice.java | 2 +- ...poundInteraction.java => GCompoundSessionNode.java} | 2 +- .../java/org/scribble/ast/global/GProtocolBlock.java | 3 ++- .../main/java/org/scribble/ast/global/GRecursion.java | 2 +- .../src/main/java/org/scribble/ast/local/LChoice.java | 2 +- ...poundInteraction.java => LCompoundSessionNode.java} | 2 +- .../java/org/scribble/ast/local/LProtocolBlock.java | 3 ++- .../main/java/org/scribble/ast/local/LRecursion.java | 2 +- .../java/org/scribble/del/CompoundInteractionDel.java | 2 +- .../java/org/scribble/del/CompoundSessionNodeDel.java | 1 + .../{InteractionNodeDel.java => SessionNodeDel.java} | 2 +- .../java/org/scribble/del/SimpleSessionNodeDel.java | 2 +- .../org/scribble/del/global/GInteractionNodeDel.java | 4 ++-- .../org/scribble/del/local/LInteractionNodeDel.java | 4 ++-- 20 files changed, 29 insertions(+), 27 deletions(-) rename scribble-ast/src/main/java/org/scribble/ast/{CompoundNode.java => CompoundSessionNode.java} (74%) rename scribble-ast/src/main/java/org/scribble/ast/global/{GCompoundInteraction.java => GCompoundSessionNode.java} (91%) rename scribble-ast/src/main/java/org/scribble/ast/local/{LCompoundInteraction.java => LCompoundSessionNode.java} (91%) rename scribble-ast/src/main/java/org/scribble/del/{InteractionNodeDel.java => SessionNodeDel.java} (92%) diff --git a/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java index 8e16de38a..3b9c8d732 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java @@ -19,7 +19,7 @@ // Name should be read (Compound ( InteractionNode )) public abstract class CompoundInteraction - extends CompoundNode implements SessionNode + extends CompoundSessionNode { // ScribTreeAdaptor#create constructor public CompoundInteraction(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/CompoundNode.java b/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java similarity index 74% rename from scribble-ast/src/main/java/org/scribble/ast/CompoundNode.java rename to scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java index c40add1ac..c5e6234ac 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/CompoundNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java @@ -15,18 +15,20 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.type.kind.ProtocolKind; // ProtocolBlock or CompoundInteractionNode -public abstract class CompoundNode extends ScribNodeBase +public abstract class CompoundSessionNode + extends ScribNodeBase implements SessionNode { // ScribTreeAdaptor#create constructor - public CompoundNode(Token t) + public CompoundSessionNode(Token t) { super(t); } // Tree#dupNode constructor - protected CompoundNode(CompoundNode node) + protected CompoundSessionNode(CompoundSessionNode node) { super(node); } @@ -39,7 +41,7 @@ protected CompoundNode(CompoundNode node) - public CompoundNode(CommonTree source) + public CompoundSessionNode(CommonTree source) { super(source); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java index a87823823..aa2a7438b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java @@ -21,7 +21,7 @@ import org.scribble.visit.AstVisitor; public abstract class ProtocolBlock - extends CompoundNode implements ProtocolKindNode + extends CompoundSessionNode { // ScribTreeAdaptor#create constructor public ProtocolBlock(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java index 3089c0df3..e6928f932 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java @@ -24,7 +24,7 @@ import org.scribble.visit.Substitutor; /** - * This is the generic object from which all Scribble model objects + * This is the generic object from which all Scribble AST objects * are derived. */ public interface ScribNode extends Tree diff --git a/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java index a2de3def5..1ce86cc41 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java @@ -16,9 +16,7 @@ import org.scribble.core.type.kind.ProtocolKind; // AST nodes that correspond to session type constructors -- elements of InteractionSeq nodes -// Make a compound interaction subclass for choice/parallel etc? public interface SessionNode extends ProtocolKindNode { - //Set> collectMessageIds(); // Not worth implementing this homomorphically for every case except MessageTransfer, better to use visitChildren pattern - //Map> getEnablingMessages(); + } diff --git a/scribble-ast/src/main/java/org/scribble/ast/SimpleSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/SimpleSessionNode.java index 90c218755..5fef17e63 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/SimpleSessionNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SimpleSessionNode.java @@ -17,8 +17,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -// Name should be read (Simple ( InteractionNode )) -// FIXME: rename: Continue/Do aren't really interactions +// Name should be read (Simple ( SessionNode )) public abstract class SimpleSessionNode extends ScribNodeBase implements SessionNode { diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java index 313d676fe..86c2a1344 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java @@ -23,7 +23,7 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Global; -public class GChoice extends Choice implements GCompoundInteraction +public class GChoice extends Choice implements GCompoundSessionNode { // ScribTreeAdaptor#create constructor public GChoice(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GCompoundInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/global/GCompoundSessionNode.java similarity index 91% rename from scribble-ast/src/main/java/org/scribble/ast/global/GCompoundInteraction.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GCompoundSessionNode.java index b02d86c4d..07306a52c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GCompoundInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GCompoundSessionNode.java @@ -13,7 +13,7 @@ */ package org.scribble.ast.global; -public interface GCompoundInteraction extends GSessionNode +public interface GCompoundSessionNode extends GSessionNode { } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java index 2266578d3..adc909c2a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java @@ -22,7 +22,8 @@ import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; -public class GProtocolBlock extends ProtocolBlock implements GScribNode +public class GProtocolBlock extends ProtocolBlock + implements GCompoundSessionNode { // ScribTreeAdaptor#create constructor public GProtocolBlock(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java b/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java index 5aaaa1a24..4665e8127 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java @@ -40,7 +40,7 @@ public class GRecursion extends Recursion - implements GCompoundInteraction + implements GCompoundSessionNode { // ScribTreeAdaptor#create constructor public GRecursion(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java b/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java index 93e784ed4..16f9c2465 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java @@ -23,7 +23,7 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Local; -public class LChoice extends Choice implements LCompoundInteraction +public class LChoice extends Choice implements LCompoundSessionNode { // ScribTreeAdaptor#create constructor public LChoice(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LCompoundInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/local/LCompoundSessionNode.java similarity index 91% rename from scribble-ast/src/main/java/org/scribble/ast/local/LCompoundInteraction.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LCompoundSessionNode.java index 314fd90d6..3072c52ab 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LCompoundInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LCompoundSessionNode.java @@ -13,7 +13,7 @@ */ package org.scribble.ast.local; -public interface LCompoundInteraction extends LSessionNode +public interface LCompoundSessionNode extends LSessionNode { } diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java index 395f4e4cf..7e72ac133 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java @@ -18,7 +18,8 @@ import org.scribble.ast.ProtocolBlock; import org.scribble.core.type.kind.Local; -public class LProtocolBlock extends ProtocolBlock implements LScribNode +public class LProtocolBlock extends ProtocolBlock + implements LCompoundSessionNode { // ScribTreeAdaptor#create constructor public LProtocolBlock(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java b/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java index 6923299fc..e57878b5d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java @@ -19,7 +19,7 @@ import org.scribble.ast.name.simple.RecVarNode; import org.scribble.core.type.kind.Local; -public class LRecursion extends Recursion implements LCompoundInteraction +public class LRecursion extends Recursion implements LCompoundSessionNode { // ScribTreeAdaptor#create constructor public LRecursion(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/del/CompoundInteractionDel.java b/scribble-ast/src/main/java/org/scribble/del/CompoundInteractionDel.java index c0ed0827d..692447ab7 100644 --- a/scribble-ast/src/main/java/org/scribble/del/CompoundInteractionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/CompoundInteractionDel.java @@ -13,7 +13,7 @@ */ package org.scribble.del; -public abstract class CompoundInteractionDel extends CompoundSessionNodeDel implements InteractionNodeDel +public abstract class CompoundInteractionDel extends CompoundSessionNodeDel { public CompoundInteractionDel() { diff --git a/scribble-ast/src/main/java/org/scribble/del/CompoundSessionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/CompoundSessionNodeDel.java index b2da33198..6861fd7f5 100644 --- a/scribble-ast/src/main/java/org/scribble/del/CompoundSessionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/CompoundSessionNodeDel.java @@ -15,6 +15,7 @@ // For CompoundInteractionNode and ProtocolBlock public abstract class CompoundSessionNodeDel extends ScribDelBase + implements SessionNodeDel { public CompoundSessionNodeDel() { diff --git a/scribble-ast/src/main/java/org/scribble/del/InteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/SessionNodeDel.java similarity index 92% rename from scribble-ast/src/main/java/org/scribble/del/InteractionNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/SessionNodeDel.java index 603e8cc3f..bd264b2bd 100644 --- a/scribble-ast/src/main/java/org/scribble/del/InteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/SessionNodeDel.java @@ -13,7 +13,7 @@ */ package org.scribble.del; -public interface InteractionNodeDel extends ScribDel +public interface SessionNodeDel extends ScribDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/SimpleSessionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/SimpleSessionNodeDel.java index 02356451d..2b41b09f4 100644 --- a/scribble-ast/src/main/java/org/scribble/del/SimpleSessionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/SimpleSessionNodeDel.java @@ -14,7 +14,7 @@ package org.scribble.del; public abstract class SimpleSessionNodeDel extends ScribDelBase - implements InteractionNodeDel + implements SessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java index 51729c2fb..7a0aa58a2 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java @@ -13,9 +13,9 @@ */ package org.scribble.del.global; -import org.scribble.del.InteractionNodeDel; +import org.scribble.del.SessionNodeDel; -public interface GInteractionNodeDel extends InteractionNodeDel, GDel +public interface GInteractionNodeDel extends SessionNodeDel, GDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java index 3ec9de190..74e5ac40d 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java @@ -13,9 +13,9 @@ */ package org.scribble.del.local; -import org.scribble.del.InteractionNodeDel; +import org.scribble.del.SessionNodeDel; -public interface LInteractionNodeDel extends InteractionNodeDel +public interface LInteractionNodeDel extends SessionNodeDel { } From c250f53a230db6252bce93965621df6f73f23183 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 21:51:39 +0100 Subject: [PATCH 203/539] Continued: refactoring ast/del. --- scribble-ast/src/main/java/org/scribble/ast/SessionNode.java | 1 + .../src/main/java/org/scribble/del/ConnectionActionDel.java | 3 ++- .../src/main/java/org/scribble/del/MessageTransferDel.java | 1 + .../src/main/java/org/scribble/del/global/GChoiceDel.java | 2 +- ...leInteractionNodeDel.java => GCompoundSessionNodeDel.java} | 2 +- .../src/main/java/org/scribble/del/global/GConnectDel.java | 2 +- .../src/main/java/org/scribble/del/global/GContinueDel.java | 2 +- .../src/main/java/org/scribble/del/global/GDisconnectDel.java | 2 +- .../src/main/java/org/scribble/del/global/GDoDel.java | 2 +- .../java/org/scribble/del/global/GMessageTransferDel.java | 2 +- .../main/java/org/scribble/del/global/GProtocolBlockDel.java | 3 ++- .../src/main/java/org/scribble/del/global/GRecursionDel.java | 2 +- .../global/{GInteractionNodeDel.java => GSessionNodeDel.java} | 2 +- ...oundInteractionNodeDel.java => GSimpleSessionNodeDel.java} | 2 +- .../src/main/java/org/scribble/del/global/GWrapDel.java | 2 +- .../src/main/java/org/scribble/del/local/LAcceptDel.java | 2 +- .../src/main/java/org/scribble/del/local/LChoiceDel.java | 2 +- ...leInteractionNodeDel.java => LCompoundSessionNodeDel.java} | 4 ++-- .../java/org/scribble/del/local/LConnectionActionDel.java | 2 +- .../src/main/java/org/scribble/del/local/LContinueDel.java | 2 +- .../src/main/java/org/scribble/del/local/LDisconnectDel.java | 2 +- scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java | 2 +- .../main/java/org/scribble/del/local/LMessageTransferDel.java | 2 +- .../main/java/org/scribble/del/local/LProtocolBlockDel.java | 1 + .../src/main/java/org/scribble/del/local/LRecursionDel.java | 2 +- .../src/main/java/org/scribble/del/local/LRequestDel.java | 2 +- .../local/{LInteractionNodeDel.java => LSessionNodeDel.java} | 2 +- ...oundInteractionNodeDel.java => LSimpleSessionNodeDel.java} | 4 ++-- .../src/main/java/org/scribble/del/local/LWrapClientDel.java | 2 +- .../src/main/java/org/scribble/del/local/LWrapServerDel.java | 2 +- 30 files changed, 34 insertions(+), 29 deletions(-) rename scribble-ast/src/main/java/org/scribble/del/global/{GSimpleInteractionNodeDel.java => GCompoundSessionNodeDel.java} (89%) rename scribble-ast/src/main/java/org/scribble/del/global/{GInteractionNodeDel.java => GSessionNodeDel.java} (91%) rename scribble-ast/src/main/java/org/scribble/del/global/{GCompoundInteractionNodeDel.java => GSimpleSessionNodeDel.java} (89%) rename scribble-ast/src/main/java/org/scribble/del/local/{LSimpleInteractionNodeDel.java => LCompoundSessionNodeDel.java} (89%) rename scribble-ast/src/main/java/org/scribble/del/local/{LInteractionNodeDel.java => LSessionNodeDel.java} (91%) rename scribble-ast/src/main/java/org/scribble/del/local/{LCompoundInteractionNodeDel.java => LSimpleSessionNodeDel.java} (89%) diff --git a/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java index 1ce86cc41..b68eeceb7 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java @@ -16,6 +16,7 @@ import org.scribble.core.type.kind.ProtocolKind; // AST nodes that correspond to session type constructors -- elements of InteractionSeq nodes +// The SessionNodeDel hierarchy corresponds to this SessionNode hierarchy public interface SessionNode extends ProtocolKindNode { diff --git a/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java b/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java index 59eb02734..495a20c5e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java @@ -13,7 +13,8 @@ */ package org.scribble.del; -// TODO: factor with MessageTransferDel +// TODO: refactor according to ast hierarchy, i.e., basic->directed->connect/message, basic->disconnect +// (Currently, connect/disconnect grouped together -- instead, disconnect should be separated from connect/message) public abstract class ConnectionActionDel extends SimpleSessionNodeDel { public ConnectionActionDel() diff --git a/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java index 08da87cfc..62eabe640 100644 --- a/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java @@ -13,6 +13,7 @@ */ package org.scribble.del; +// TODO: refactor according to ast hierarchy, i.e., basic->directed->connect/message, basic->disconnect public abstract class MessageTransferDel extends SimpleSessionNodeDel { public MessageTransferDel() diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java index a93bfc18d..329bdac14 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -25,7 +25,7 @@ import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -public class GChoiceDel extends ChoiceDel implements GCompoundInteractionNodeDel +public class GChoiceDel extends ChoiceDel implements GCompoundSessionNodeDel { @Override diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GSimpleInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GCompoundSessionNodeDel.java similarity index 89% rename from scribble-ast/src/main/java/org/scribble/del/global/GSimpleInteractionNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GCompoundSessionNodeDel.java index 97621986e..5f6e4f35c 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GSimpleInteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GCompoundSessionNodeDel.java @@ -13,7 +13,7 @@ */ package org.scribble.del.global; -public interface GSimpleInteractionNodeDel extends GInteractionNodeDel +public interface GCompoundSessionNodeDel extends GSessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java index be7119837..689a3544e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java @@ -26,7 +26,7 @@ import org.scribble.visit.wf.NameDisambiguator; public class GConnectDel extends ConnectionActionDel - implements GSimpleInteractionNodeDel + implements GSimpleSessionNodeDel { public GConnectDel() { diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java index a7b713c5a..ecc3311b7 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java @@ -21,7 +21,7 @@ import org.scribble.visit.GTypeTranslator; public class GContinueDel extends ContinueDel - implements GSimpleInteractionNodeDel + implements GSimpleSessionNodeDel { @Override diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java index c0c99f8e1..a4876eddc 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java @@ -23,7 +23,7 @@ // TODO: make DisconnectDel (cf., G/LMessageTransferDel) public class GDisconnectDel extends ConnectionActionDel - implements GSimpleInteractionNodeDel + implements GSimpleSessionNodeDel { public GDisconnectDel() { diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java index 6eff098c1..23e161256 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java @@ -26,7 +26,7 @@ import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -public class GDoDel extends DoDel implements GSimpleInteractionNodeDel +public class GDoDel extends DoDel implements GSimpleSessionNodeDel { @Override public org.scribble.core.type.session.global.GDo translate(ScribNode n, diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java index f66eab005..e47610e38 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -26,7 +26,7 @@ import org.scribble.visit.wf.NameDisambiguator; public class GMessageTransferDel extends MessageTransferDel - implements GSimpleInteractionNodeDel + implements GSimpleSessionNodeDel { public GMessageTransferDel() { diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java index c00d71234..a47306bb8 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java @@ -20,7 +20,8 @@ import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -public class GProtocolBlockDel extends ProtocolBlockDel implements GDel +public class GProtocolBlockDel extends ProtocolBlockDel + implements GCompoundSessionNodeDel { @Override diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java index 5ee6d8f68..4cd094450 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java @@ -22,7 +22,7 @@ import org.scribble.visit.GTypeTranslator; public class GRecursionDel extends RecursionDel - implements GCompoundInteractionNodeDel + implements GCompoundSessionNodeDel { @Override diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GSessionNodeDel.java similarity index 91% rename from scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GSessionNodeDel.java index 7a0aa58a2..91556ec47 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GSessionNodeDel.java @@ -15,7 +15,7 @@ import org.scribble.del.SessionNodeDel; -public interface GInteractionNodeDel extends SessionNodeDel, GDel +public interface GSessionNodeDel extends SessionNodeDel, GDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GCompoundInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GSimpleSessionNodeDel.java similarity index 89% rename from scribble-ast/src/main/java/org/scribble/del/global/GCompoundInteractionNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GSimpleSessionNodeDel.java index 02d894107..56098bbbd 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GCompoundInteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GSimpleSessionNodeDel.java @@ -13,7 +13,7 @@ */ package org.scribble.del.global; -public interface GCompoundInteractionNodeDel extends GInteractionNodeDel +public interface GSimpleSessionNodeDel extends GSessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java index db47e85f2..07f8015fc 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java @@ -23,7 +23,7 @@ // TODO: make WrapDel (cf., G/LMessageTransferDel) public class GWrapDel extends ConnectionActionDel - implements GSimpleInteractionNodeDel + implements GSimpleSessionNodeDel { public GWrapDel() { diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java index 3ec102509..9835c8462 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java @@ -14,7 +14,7 @@ package org.scribble.del.local; public class LAcceptDel extends LConnectionActionDel - implements LSimpleInteractionNodeDel + implements LSimpleSessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java index 5d8ca0068..f72a40670 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java @@ -15,7 +15,7 @@ import org.scribble.del.ChoiceDel; -public class LChoiceDel extends ChoiceDel implements LCompoundInteractionNodeDel +public class LChoiceDel extends ChoiceDel implements LCompoundSessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LSimpleInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LCompoundSessionNodeDel.java similarity index 89% rename from scribble-ast/src/main/java/org/scribble/del/local/LSimpleInteractionNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LCompoundSessionNodeDel.java index 32cf6592b..842703aa7 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LSimpleInteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LCompoundSessionNodeDel.java @@ -13,7 +13,7 @@ */ package org.scribble.del.local; -public interface LSimpleInteractionNodeDel extends LInteractionNodeDel +public interface LCompoundSessionNodeDel extends LSessionNodeDel { - + } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java index 8e65312bb..705837e76 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java @@ -15,7 +15,7 @@ import org.scribble.del.ConnectionActionDel; -public abstract class LConnectionActionDel extends ConnectionActionDel implements LSimpleInteractionNodeDel +public abstract class LConnectionActionDel extends ConnectionActionDel implements LSimpleSessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java index b75cc32d3..a7511e752 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java @@ -16,7 +16,7 @@ import org.scribble.del.ContinueDel; public class LContinueDel extends ContinueDel - implements LSimpleInteractionNodeDel + implements LSimpleSessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java index 128981179..60c6d1764 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java @@ -16,7 +16,7 @@ import org.scribble.del.ConnectionActionDel; public class LDisconnectDel extends ConnectionActionDel - implements LSimpleInteractionNodeDel + implements LSimpleSessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java index cd4c3e582..d140e6166 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java @@ -15,7 +15,7 @@ import org.scribble.del.DoDel; -public class LDoDel extends DoDel implements LSimpleInteractionNodeDel +public class LDoDel extends DoDel implements LSimpleSessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java index 34fd7046d..39442d3a3 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java @@ -15,7 +15,7 @@ import org.scribble.del.MessageTransferDel; -public abstract class LMessageTransferDel extends MessageTransferDel implements LSimpleInteractionNodeDel +public abstract class LMessageTransferDel extends MessageTransferDel implements LSimpleSessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java index a272996d8..d964ffc66 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java @@ -16,6 +16,7 @@ import org.scribble.del.ProtocolBlockDel; public class LProtocolBlockDel extends ProtocolBlockDel + implements LCompoundSessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java index 8fbbd3eac..6131886be 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java @@ -16,7 +16,7 @@ import org.scribble.del.RecursionDel; public class LRecursionDel extends RecursionDel - implements LCompoundInteractionNodeDel + implements LCompoundSessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java index ba00e35ca..bae71ab29 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java @@ -14,7 +14,7 @@ package org.scribble.del.local; public class LRequestDel extends LConnectionActionDel - implements LSimpleInteractionNodeDel + implements LSimpleSessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LSessionNodeDel.java similarity index 91% rename from scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LSessionNodeDel.java index 74e5ac40d..acf0ed060 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LSessionNodeDel.java @@ -15,7 +15,7 @@ import org.scribble.del.SessionNodeDel; -public interface LInteractionNodeDel extends SessionNodeDel +public interface LSessionNodeDel extends SessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LSimpleSessionNodeDel.java similarity index 89% rename from scribble-ast/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LSimpleSessionNodeDel.java index f88f45b0e..df94d5c19 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LCompoundInteractionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LSimpleSessionNodeDel.java @@ -13,7 +13,7 @@ */ package org.scribble.del.local; -public interface LCompoundInteractionNodeDel extends LInteractionNodeDel +public interface LSimpleSessionNodeDel extends LSessionNodeDel { - + } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java index 30c40b2ec..a0d57ac60 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java @@ -16,7 +16,7 @@ import org.scribble.del.ConnectionActionDel; public class LWrapClientDel extends ConnectionActionDel - implements LSimpleInteractionNodeDel + implements LSimpleSessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java index 6fe19c5a3..c3f41403f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java @@ -16,7 +16,7 @@ import org.scribble.del.ConnectionActionDel; public class LWrapServerDel extends ConnectionActionDel - implements LSimpleInteractionNodeDel + implements LSimpleSessionNodeDel { } From 175515b89f2a38f84aa49305f82d9822fed361e2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 22:13:38 +0100 Subject: [PATCH 204/539] Continued: refactoring ast/del. --- .../java/org/scribble/ast/AstFactory.java | 4 ++-- .../java/org/scribble/ast/AstFactoryImpl.java | 6 +++--- .../org/scribble/ast/CompoundInteraction.java | 1 - .../org/scribble/ast/CompoundSessionNode.java | 2 +- .../java/org/scribble/ast/ProtocolBlock.java | 2 +- .../scribble/ast/global/GProtocolBlock.java | 3 +-- .../java/org/scribble/ast/local/LAccept.java | 2 +- .../scribble/ast/local/LMessageTransfer.java | 3 ++- .../scribble/ast/local/LProtocolBlock.java | 3 +-- .../ast/local/{LReceive.java => LRecv.java} | 12 +++++------ .../java/org/scribble/ast/local/LRequest.java | 2 +- .../java/org/scribble/ast/local/LSend.java | 1 - .../org/scribble/ast/local/LWrapClient.java | 1 - .../org/scribble/ast/local/LWrapServer.java | 2 +- .../org/scribble/del/BasicInteractionDel.java | 19 +++++++++++++++++ .../org/scribble/del/ConnectionActionDel.java | 4 +--- .../scribble/del/DirectedInteractionDel.java | 19 +++++++++++++++++ .../java/org/scribble/del/DisconnectDel.java | 19 +++++++++++++++++ .../org/scribble/del/MessageTransferDel.java | 3 +-- .../org/scribble/del/ProtocolBlockDel.java | 2 +- .../del/global/GProtocolBlockDel.java | 4 +--- .../org/scribble/del/local/LAcceptDel.java | 1 - .../del/local/LConnectionActionDel.java | 3 ++- .../java/org/scribble/del/local/LDel.java | 21 +++++++++++++++++++ .../scribble/del/local/LDisconnectDel.java | 4 ++-- .../del/local/LInteractionSeqDel.java | 2 +- .../del/local/LMessageTransferDel.java | 3 ++- .../scribble/del/local/LProtocolBlockDel.java | 3 +-- .../scribble/del/local/LProtocolDeclDel.java | 2 +- .../org/scribble/del/local/LRequestDel.java | 1 - .../scribble/del/local/LSessionNodeDel.java | 2 +- .../scribble/del/local/LWrapClientDel.java | 5 +---- .../scribble/del/local/LWrapServerDel.java | 5 +---- 33 files changed, 114 insertions(+), 52 deletions(-) rename scribble-ast/src/main/java/org/scribble/ast/local/{LReceive.java => LRecv.java} (86%) create mode 100644 scribble-ast/src/main/java/org/scribble/del/BasicInteractionDel.java create mode 100644 scribble-ast/src/main/java/org/scribble/del/DirectedInteractionDel.java create mode 100644 scribble-ast/src/main/java/org/scribble/del/DisconnectDel.java create mode 100644 scribble-ast/src/main/java/org/scribble/del/local/LDel.java diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index d82ef5a7f..b9a6d648a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -44,7 +44,7 @@ import org.scribble.ast.local.LProtocolDecl; import org.scribble.ast.local.LProtocolDef; import org.scribble.ast.local.LProtocolHeader; -import org.scribble.ast.local.LReceive; +import org.scribble.ast.local.LRecv; import org.scribble.ast.local.LRecursion; import org.scribble.ast.local.LRequest; import org.scribble.ast.local.LSend; @@ -198,7 +198,7 @@ LInteractionSeq LInteractionSeq(CommonTree source, LSend LSend(CommonTree source, RoleNode src, MessageNode msg, List dests); - LReceive LReceive(CommonTree source, RoleNode src, MessageNode msg, + LRecv LReceive(CommonTree source, RoleNode src, MessageNode msg, List dests); LRequest LRequest(CommonTree source, RoleNode src, MessageNode msg, diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java index 3c8ac71d9..a43df5688 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -45,7 +45,7 @@ import org.scribble.ast.local.LProtocolDecl; import org.scribble.ast.local.LProtocolDef; import org.scribble.ast.local.LProtocolHeader; -import org.scribble.ast.local.LReceive; +import org.scribble.ast.local.LRecv; import org.scribble.ast.local.LRecursion; import org.scribble.ast.local.LRequest; import org.scribble.ast.local.LSend; @@ -645,10 +645,10 @@ public LSend LSend(CommonTree source, RoleNode src, MessageNode msg, } @Override - public LReceive LReceive(CommonTree source, RoleNode src, MessageNode msg, + public LRecv LReceive(CommonTree source, RoleNode src, MessageNode msg, List dests) { - LReceive ls = new LReceive(source, src, msg, dests); + LRecv ls = new LRecv(source, src, msg, dests); ls = del(ls, new LReceiveDel()); return ls; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java index 3b9c8d732..10d5d872d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java @@ -17,7 +17,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -// Name should be read (Compound ( InteractionNode )) public abstract class CompoundInteraction extends CompoundSessionNode { diff --git a/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java index c5e6234ac..feb360d9e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java @@ -17,7 +17,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -// ProtocolBlock or CompoundInteractionNode +// Redundant? Is always a CompoundInteraction public abstract class CompoundSessionNode extends ScribNodeBase implements SessionNode { diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java index aa2a7438b..0b74f46b9 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java @@ -21,7 +21,7 @@ import org.scribble.visit.AstVisitor; public abstract class ProtocolBlock - extends CompoundSessionNode + extends ScribNodeBase { // ScribTreeAdaptor#create constructor public ProtocolBlock(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java index adc909c2a..2266578d3 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java @@ -22,8 +22,7 @@ import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; -public class GProtocolBlock extends ProtocolBlock - implements GCompoundSessionNode +public class GProtocolBlock extends ProtocolBlock implements GScribNode { // ScribTreeAdaptor#create constructor public GProtocolBlock(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java b/scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java index 43658c202..e5b3d8a9a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java @@ -19,7 +19,7 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.util.Constants; -public class LAccept extends LConnectionAction implements LSimpleSessionNode +public class LAccept extends LConnectionAction { // ScribTreeAdaptor#create constructor public LAccept(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LMessageTransfer.java b/scribble-ast/src/main/java/org/scribble/ast/local/LMessageTransfer.java index 81fb4412e..353f430a8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LMessageTransfer.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LMessageTransfer.java @@ -22,7 +22,8 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Local; -public abstract class LMessageTransfer extends MessageTransfer implements LSimpleSessionNode +public abstract class LMessageTransfer extends MessageTransfer + implements LSimpleSessionNode { // ScribTreeAdaptor#create constructor public LMessageTransfer(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java index 7e72ac133..395f4e4cf 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java @@ -18,8 +18,7 @@ import org.scribble.ast.ProtocolBlock; import org.scribble.core.type.kind.Local; -public class LProtocolBlock extends ProtocolBlock - implements LCompoundSessionNode +public class LProtocolBlock extends ProtocolBlock implements LScribNode { // ScribTreeAdaptor#create constructor public LProtocolBlock(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LReceive.java b/scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java similarity index 86% rename from scribble-ast/src/main/java/org/scribble/ast/local/LReceive.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java index 6114bec8b..019958a4f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LReceive.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java @@ -21,24 +21,24 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.util.Constants; -public class LReceive extends LMessageTransfer implements LSimpleSessionNode +public class LRecv extends LMessageTransfer { // ScribTreeAdaptor#create constructor - public LReceive(Token t) + public LRecv(Token t) { super(t); } // Tree#dupNode constructor - public LReceive(LReceive node) + public LRecv(LRecv node) { super(node); } @Override - public LReceive dupNode() + public LRecv dupNode() { - return new LReceive(this); + return new LRecv(this); } @Override @@ -56,7 +56,7 @@ public String toString() - public LReceive(CommonTree source, RoleNode src, MessageNode msg, List dests) + public LRecv(CommonTree source, RoleNode src, MessageNode msg, List dests) { super(source, src, msg, dests); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java b/scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java index d5c9a4bb2..666d02814 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java @@ -19,7 +19,7 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.util.Constants; -public class LRequest extends LConnectionAction implements LSimpleSessionNode +public class LRequest extends LConnectionAction { // ScribTreeAdaptor#create constructor public LRequest(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java index 7c9e95ff8..f47a440a5 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java @@ -23,7 +23,6 @@ import org.scribble.util.Constants; public class LSend extends LMessageTransfer - implements LSimpleSessionNode // Explicitly needed here for getKind { // ScribTreeAdaptor#create constructor public LSend(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java index 0ff7633c4..d80628120 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java @@ -20,7 +20,6 @@ import org.scribble.util.Constants; public class LWrapClient extends LConnectionAction - implements LSimpleSessionNode { // ScribTreeAdaptor#create constructor public LWrapClient(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java index fc2cfc286..8174f70f2 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java @@ -19,7 +19,7 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.util.Constants; -public class LWrapServer extends LConnectionAction implements LSimpleSessionNode +public class LWrapServer extends LConnectionAction { // ScribTreeAdaptor#create constructor public LWrapServer(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/del/BasicInteractionDel.java b/scribble-ast/src/main/java/org/scribble/del/BasicInteractionDel.java new file mode 100644 index 000000000..6c30afb2d --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/del/BasicInteractionDel.java @@ -0,0 +1,19 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.del; + +public abstract class BasicInteractionDel extends SimpleSessionNodeDel +{ + +} diff --git a/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java b/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java index 495a20c5e..74e74c398 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ConnectionActionDel.java @@ -13,9 +13,7 @@ */ package org.scribble.del; -// TODO: refactor according to ast hierarchy, i.e., basic->directed->connect/message, basic->disconnect -// (Currently, connect/disconnect grouped together -- instead, disconnect should be separated from connect/message) -public abstract class ConnectionActionDel extends SimpleSessionNodeDel +public abstract class ConnectionActionDel extends DirectedInteractionDel { public ConnectionActionDel() { diff --git a/scribble-ast/src/main/java/org/scribble/del/DirectedInteractionDel.java b/scribble-ast/src/main/java/org/scribble/del/DirectedInteractionDel.java new file mode 100644 index 000000000..2831692b7 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/del/DirectedInteractionDel.java @@ -0,0 +1,19 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.del; + +public abstract class DirectedInteractionDel extends BasicInteractionDel +{ + +} diff --git a/scribble-ast/src/main/java/org/scribble/del/DisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/DisconnectDel.java new file mode 100644 index 000000000..7001d7a12 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/del/DisconnectDel.java @@ -0,0 +1,19 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.del; + +public abstract class DisconnectDel extends BasicInteractionDel +{ + +} diff --git a/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java index 62eabe640..60581ef87 100644 --- a/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java @@ -13,8 +13,7 @@ */ package org.scribble.del; -// TODO: refactor according to ast hierarchy, i.e., basic->directed->connect/message, basic->disconnect -public abstract class MessageTransferDel extends SimpleSessionNodeDel +public abstract class MessageTransferDel extends DirectedInteractionDel { public MessageTransferDel() { diff --git a/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java index 7cafa752f..d47d92c28 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java @@ -13,7 +13,7 @@ */ package org.scribble.del; -public abstract class ProtocolBlockDel extends CompoundSessionNodeDel +public abstract class ProtocolBlockDel extends ScribDelBase { } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java index a47306bb8..53621fb4b 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java @@ -20,10 +20,8 @@ import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -public class GProtocolBlockDel extends ProtocolBlockDel - implements GCompoundSessionNodeDel +public class GProtocolBlockDel extends ProtocolBlockDel implements GDel { - @Override public GSeq translate(ScribNode n, GTypeTranslator t) throws ScribException diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java index 9835c8462..4c878b49b 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java @@ -14,7 +14,6 @@ package org.scribble.del.local; public class LAcceptDel extends LConnectionActionDel - implements LSimpleSessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java index 705837e76..2d78eebc1 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LConnectionActionDel.java @@ -15,7 +15,8 @@ import org.scribble.del.ConnectionActionDel; -public abstract class LConnectionActionDel extends ConnectionActionDel implements LSimpleSessionNodeDel +public abstract class LConnectionActionDel extends ConnectionActionDel + implements LSimpleSessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDel.java new file mode 100644 index 000000000..596e1937f --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/del/local/LDel.java @@ -0,0 +1,21 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.del.local; + +import org.scribble.del.ScribDel; + +public interface LDel extends ScribDel +{ + +} diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java index 60c6d1764..86c2e2133 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java @@ -13,9 +13,9 @@ */ package org.scribble.del.local; -import org.scribble.del.ConnectionActionDel; +import org.scribble.del.DisconnectDel; -public class LDisconnectDel extends ConnectionActionDel +public class LDisconnectDel extends DisconnectDel implements LSimpleSessionNodeDel { diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java index b3dbc7f0f..30ad0e5c3 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java @@ -15,7 +15,7 @@ import org.scribble.del.InteractionSeqDel; -public class LInteractionSeqDel extends InteractionSeqDel +public class LInteractionSeqDel extends InteractionSeqDel implements LDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java index 39442d3a3..9346dd7c7 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java @@ -15,7 +15,8 @@ import org.scribble.del.MessageTransferDel; -public abstract class LMessageTransferDel extends MessageTransferDel implements LSimpleSessionNodeDel +public abstract class LMessageTransferDel extends MessageTransferDel + implements LSimpleSessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java index d964ffc66..28f64eec8 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java @@ -15,8 +15,7 @@ import org.scribble.del.ProtocolBlockDel; -public class LProtocolBlockDel extends ProtocolBlockDel - implements LCompoundSessionNodeDel +public class LProtocolBlockDel extends ProtocolBlockDel implements LDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java index e0accce81..5f7abfc4f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java @@ -16,7 +16,7 @@ import org.scribble.core.type.kind.Local; import org.scribble.del.ProtocolDeclDel; -public class LProtocolDeclDel extends ProtocolDeclDel +public class LProtocolDeclDel extends ProtocolDeclDel implements LDel { public LProtocolDeclDel() { diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java index bae71ab29..cfc5f300b 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java @@ -14,7 +14,6 @@ package org.scribble.del.local; public class LRequestDel extends LConnectionActionDel - implements LSimpleSessionNodeDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LSessionNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LSessionNodeDel.java index acf0ed060..1c379a4d3 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LSessionNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LSessionNodeDel.java @@ -15,7 +15,7 @@ import org.scribble.del.SessionNodeDel; -public interface LSessionNodeDel extends SessionNodeDel +public interface LSessionNodeDel extends SessionNodeDel, LDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java index a0d57ac60..eaaea2fa7 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java @@ -13,10 +13,7 @@ */ package org.scribble.del.local; -import org.scribble.del.ConnectionActionDel; - -public class LWrapClientDel extends ConnectionActionDel - implements LSimpleSessionNodeDel +public class LWrapClientDel extends LConnectionActionDel { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java index c3f41403f..d8ab23a2c 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java @@ -13,10 +13,7 @@ */ package org.scribble.del.local; -import org.scribble.del.ConnectionActionDel; - -public class LWrapServerDel extends ConnectionActionDel - implements LSimpleSessionNodeDel +public class LWrapServerDel extends LConnectionActionDel { } From e007ad35ae46d54a7d28b0a8eac3d03add3277d3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 22:17:41 +0100 Subject: [PATCH 205/539] Minor. --- .../src/main/java/org/scribble/ast/CompoundSessionNode.java | 2 +- scribble-ast/src/main/java/org/scribble/ast/SessionNode.java | 2 +- .../src/main/java/org/scribble/del/ProtocolBlockDel.java | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java index feb360d9e..d7fda6b60 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java @@ -17,7 +17,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -// Redundant? Is always a CompoundInteraction +// Redundant? Is always a CompoundInteraction -- cf. SimpleSessionNode public abstract class CompoundSessionNode extends ScribNodeBase implements SessionNode { diff --git a/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java index b68eeceb7..088220a84 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java @@ -15,7 +15,7 @@ import org.scribble.core.type.kind.ProtocolKind; -// AST nodes that correspond to session type constructors -- elements of InteractionSeq nodes +// A SessionNode is an AST node that corresponds to a session type constructor -- elements of InteractionSeq nodes // The SessionNodeDel hierarchy corresponds to this SessionNode hierarchy public interface SessionNode extends ProtocolKindNode { diff --git a/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java index d47d92c28..74d5a3f1e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java @@ -13,6 +13,9 @@ */ package org.scribble.del; + +// Not a CompoundSessionNodeDel -- corresponds to ProtocolBlock, not a CompoundSessionNode +// A ProtocolBlock is not a "direct" session type constructor (cf. SessionNode) public abstract class ProtocolBlockDel extends ScribDelBase { From cdbeb197f45c6e0fb35dffa138584f68d304d42e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Apr 2019 22:38:12 +0100 Subject: [PATCH 206/539] Minor. --- .../src/main/java/org/scribble/del/DoDel.java | 3 ++- .../src/main/java/org/scribble/del/ScribDel.java | 1 - .../src/main/java/org/scribble/lang/Lang.java | 12 +++++++----- .../scribble/codegen/java/JEndpointApiGenerator.java | 4 ++-- .../java/callbackapi/CBEndpointApiGenerator.java | 2 +- .../java/callbackapi/CBEndpointApiGenerator3.java | 2 +- .../main/java/org/scribble/core/job/JobContext.java | 2 +- scribble-test/src/test/scrib/tmp/Test.scr | 9 +++++++-- 8 files changed, 21 insertions(+), 14 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/del/DoDel.java b/scribble-ast/src/main/java/org/scribble/del/DoDel.java index 7399d4fe7..9ffb90ba8 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoDel.java @@ -78,7 +78,8 @@ private ScribNode leaveDisambiguationAux( pnn.addChildren(Arrays.asList(fullname.getElements()).stream().map(x -> new AmbigNameNode(new Token(arg0, arg1))));*/ pnn = proto; - //HERE either hack Token to make new AST node, or redo proto context building on intermed -- consideration is projection output a la parsed AST subprotos, or from (inlined?) intermed + // CHECKME: do full name expansion in disamb? or leave to imed translation? + // either hack Token to make new AST node, or redo proto context building on intermed -- consideration is projection output a la parsed AST subprotos, or from (inlined?) intermed // probably hack Token for now -- or just skip protocol context building (do inlning and WF/valid first) // Didn't keep original namenode del -- ? diff --git a/scribble-ast/src/main/java/org/scribble/del/ScribDel.java b/scribble-ast/src/main/java/org/scribble/del/ScribDel.java index c28b7e2fc..1c90da65a 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ScribDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ScribDel.java @@ -17,7 +17,6 @@ import org.scribble.util.ScribException; import org.scribble.visit.wf.NameDisambiguator; -// TODO: parent params now redundant // Parameterise by AstNode type? Would inhibit del sharing between types (but that's not currently needed) public interface ScribDel { diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index 3f055e8a6..0ff79e689 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -83,10 +83,12 @@ protected Job newJob(ModuleName mainFullname, Map args, } // First run Visitor passes, then call toJob - // Base implementation: name disamb pass only + // Base implementation: ambigname disamb pass only public void runPasses() throws ScribException { - // CHECKME: in the end, should these also be refactored into core? (instead of AST visiting) + // Disamb is a "leftover" aspect of parsing -- so not in core + // N.B. disamb is mainly w.r.t. ambignames -- e.g., doesn't fully qualify names (currently mainly done by imed translation) + // CHECKME: disamb also currently does checks like do-arg kind and arity -- refactor into core? -- also does, e.g., distinct roledecls, protodecls, etc. runVisitorPassOnAllModules(NameDisambiguator.class); // Includes validating names used in subprotocol calls.. } @@ -107,7 +109,7 @@ public final Job getJob() throws ScribException { GProtocol g = (GProtocol) gpd.visitWith(t); imeds.add(g); - debugPrintln( + verbosePrintln( "\nParsed:\n" + gpd + "\n\nScribble intermediate:\n" + g); } } @@ -172,7 +174,7 @@ public void warningPrintln(String s) System.err.println("[Warning] " + s); } - public void debugPrintln(String s) + public void verbosePrintln(String s) { if (this.config.args.get(JobArgs.VERBOSE)) { @@ -182,6 +184,6 @@ public void debugPrintln(String s) private void debugPrintPass(String s) { - debugPrintln("\n[Lang] " + s); + verbosePrintln("\n[Lang] " + s); } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java index ae625c307..f956bcd60 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java @@ -37,7 +37,7 @@ public JEndpointApiGenerator(Lang lang) public Map generateSessionApi(GProtocolName fullname) throws ScribException { - this.lang.debugPrintln("\n[Java API gen] Running " + this.lang.verbosePrintln("\n[Java API gen] Running " + SessionApiGenerator.class + " for " + fullname); SessionApiGenerator sg = new SessionApiGenerator(this.lang, fullname); // FIXME: reuse? Map map = sg.generateApi(); // filepath -> class source @@ -53,7 +53,7 @@ public Map generateStateChannelApi(GProtocolName fullname, { buildGraph(fullname, self); }*/ - lang.debugPrintln("\n[Java API gen] Running " + lang.verbosePrintln("\n[Java API gen] Running " + StateChannelApiGenerator.class + " for " + fullname + "@" + self); StateChannelApiGenerator apigen = new StateChannelApiGenerator(this.lang, fullname, self); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 38ccb5e61..cbff5a84b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -82,7 +82,7 @@ public Map build() throws ScribException public Map buildSessionApi() throws ScribException // FIXME: factor out -- integrate with JEndpointApiGenerator { - this.lang.debugPrintln("\n[param-core] Running " + CBEndpointApiGenerator.class + " for " + this.proto + "@" + this.self); + this.lang.verbosePrintln("\n[param-core] Running " + CBEndpointApiGenerator.class + " for " + this.proto + "@" + this.self); Map res = new HashMap<>(); res.putAll(new SessionApiGenerator(this.lang, this.proto).generateApi()); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 2c722db04..9cfbb9479 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -96,7 +96,7 @@ public Map build() throws ScribException // FIXME: factor out -- integrate with JEndpointApiGenerator public Map buildSessionApi() throws ScribException { - this.lang.debugPrintln("\n[param-core] Running " + CBEndpointApiGenerator3.class + " for " + this.proto + "@" + this.self); + this.lang.verbosePrintln("\n[param-core] Running " + CBEndpointApiGenerator3.class + " for " + this.proto + "@" + this.self); Map res = new HashMap<>(); res.putAll(new SessionApiGenerator(this.lang, this.proto).generateApi()); diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java index 05a73a426..e480207f6 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java @@ -42,7 +42,7 @@ public class JobContext public final Job job; // Keys are full names - // CHECKME: not currently used by core? -- core fully independent of modules, etc., because full disamb already done? + // CHECKME: not currently used by core? -- core fully independent of modules, etc., because full disamb already done? (by imed translation) //private final Map modcs; // "Directly" translated global protos, i.e., separate proto decls without any inlining/unfolding/etc diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 8b05f30f1..20e92cf3d 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -67,12 +67,16 @@ module tmp.Test; // move ast/del, old visit and new frontend to lang // integrate new frontend with MainContext? // move lang types to type.sess, and move new visit +// try modulecontextvisitor by "static lookup" +// try move antlrwrapper to parser again + +// re-check disamb pass -- e.g., do-target disamb done by translation -- check, e.g., message transfer message disamb (signames, payloads) +// refactor additional disamb syntactic checks into core? e.g., do-calls, distinct roledecls, protodecls, etc. +// refactor scribble.g, simplify ast/del/etc class names -// try disamb without modulecontextvisitor, try move antlrwrapper to parser again // add exp conn checks to model validation // use stypefactory in core // refactor test to use main instead of cli -// simplify cli and arg parsing global protocol Proto1(role A, role B) @@ -81,6 +85,7 @@ global protocol Proto1(role A, role B) choice at A { 1() from A to B; + do Proto1(A, B); } } From f065174b437785946a5fb1e35a22c5e29a787c39 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 09:28:16 +0100 Subject: [PATCH 207/539] Continued: refactoring ast/del. --- .../main/java/org/scribble/ast/ScribNode.java | 6 -- .../java/org/scribble/ast/ScribNodeBase.java | 10 +--- .../name/simple/DummyProjectionRoleNode.java | 8 --- .../scribble/ast/name/simple/RoleNode.java | 8 --- .../ast/name/simple/SigParamNode.java | 12 ---- .../ast/name/simple/TypeParamNode.java | 12 ---- .../java/org/scribble/del/DoArgListDel.java | 2 +- .../src/main/java/org/scribble/del/DoDel.java | 2 +- .../scribble/del/HeaderParamDeclListDel.java | 2 +- .../main/java/org/scribble/del/ModuleDel.java | 2 +- .../org/scribble/del/NonRoleArgListDel.java | 2 +- .../org/scribble/del/NonRoleParamDeclDel.java | 2 +- .../org/scribble/del/ProtocolDeclDel.java | 2 +- .../java/org/scribble/del/RecursionDel.java | 2 +- .../java/org/scribble/del/RoleArgListDel.java | 2 +- .../java/org/scribble/del/RoleDeclDel.java | 2 +- .../main/java/org/scribble/del/ScribDel.java | 2 +- .../org/scribble/del/global/GConnectDel.java | 2 +- .../del/global/GDelegationElemDel.java | 2 +- .../scribble/del/global/GDisconnectDel.java | 2 +- .../del/global/GMessageTransferDel.java | 2 +- .../org/scribble/del/global/GWrapDel.java | 2 +- .../del/name/qualified/DataTypeNodeDel.java | 2 +- .../name/qualified/MessageSigNameNodeDel.java | 2 +- .../del/name/simple/AmbigNameNodeDel.java | 2 +- .../del/name/simple/RecVarNodeDel.java | 2 +- .../scribble/del/name/simple/RoleNodeDel.java | 2 +- .../src/main/java/org/scribble/lang/Lang.java | 28 +++------ .../java/org/scribble/visit/AstVisitor.java | 3 +- .../{context => }/ModuleContextVisitor.java | 9 ++- .../visit/{wf => }/NameDisambiguator.java | 3 +- .../org/scribble/visit/SimpleAstVisitor.java | 1 + .../java/org/scribble/visit/Substitutor.java | 60 ------------------- .../core/lang/context/ModuleContext.java | 5 +- 34 files changed, 40 insertions(+), 167 deletions(-) rename scribble-ast/src/main/java/org/scribble/visit/{context => }/ModuleContextVisitor.java (85%) rename scribble-ast/src/main/java/org/scribble/visit/{wf => }/NameDisambiguator.java (98%) delete mode 100644 scribble-ast/src/main/java/org/scribble/visit/Substitutor.java diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java index e6928f932..bef71e1b6 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java @@ -21,7 +21,6 @@ import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; import org.scribble.visit.SimpleAstVisitor; -import org.scribble.visit.Substitutor; /** * This is the generic object from which all Scribble AST objects @@ -51,11 +50,6 @@ default T visitWith(SimpleAstVisitor v) throws ScribException // "Top-le { return v.visit(this); // N.B. ScribNode has getParent } - - // Simple operations, not worth doing del enter/leave pattern for - // Rely on visitChildren reconstruction pattern to do recursive reconstruction - ScribNode substituteNames(Substitutor subs); - // Cf. LInteractionNode.inferLocalChoiceSubject CommonTree getSource(); // Previously: for parsed entities, null if not parsed diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java index 24188eedf..e4f29d640 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -25,11 +25,10 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.del.ScribDel; import org.scribble.util.RuntimeScribException; +import org.scribble.util.ScribException; import org.scribble.util.ScribNodeUtil; import org.scribble.util.ScribUtil; -import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -import org.scribble.visit.Substitutor; /** * This is the generic object from which all Scribble model objects @@ -172,16 +171,11 @@ public ScribNode visitChildren(AstVisitor nv) throws ScribException return this; } + // Used to be more relevant, previously there was an explicit parent parameter protected ScribNode visitChild(ScribNode child, AstVisitor nv) throws ScribException { return nv.visit(child); // cf. child.accept(nv) ? } - - @Override - public ScribNode substituteNames(Substitutor subs) - { - return this; - } // FIXME: remove parent parameter, to make uniform with visitChild // Used when a generic cast would otherwise be needed (non-generic children casts don't need this) -- doesn't check any generic parameters, relies on concrete values being instances of non-parameterised types diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java index 7dd669a3e..1b3505450 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java @@ -15,7 +15,6 @@ import org.antlr.runtime.Token; import org.scribble.core.type.name.Role; -import org.scribble.visit.Substitutor; // For local choice subjects public class DummyProjectionRoleNode extends RoleNode @@ -46,13 +45,6 @@ protected DummyProjectionRoleNode reconstruct(String id) return (DummyProjectionRoleNode) super.reconstruct(id); } - @Override - public DummyProjectionRoleNode substituteNames(Substitutor subs) - { - //throw new RuntimeException("Shouldn't get in here: " + this); - return reconstruct(null); // HACK: for ProjectedSubprotocolPruner, but maybe useful for others - } - @Override public Role toName() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java index 84577ce57..39cf330b4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java @@ -20,7 +20,6 @@ import org.scribble.core.type.kind.RoleKind; import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; -import org.scribble.visit.Substitutor; public class RoleNode extends SimpleNameNode implements DoArgNode //RoleDecl, RoleInstantiation { @@ -59,13 +58,6 @@ protected RoleNode reconstruct(String id) return r; } - @Override - public RoleNode substituteNames(Substitutor subs) - { - // Reconstruct: subprotocolvisitor uses a fullycloned body (and getRoleSubstitution also returns a clone) -- here rename the clone but keep the fresh dels/envs - return reconstruct(subs.getRoleSubstitution(toName()).toName().toString()); - } - @Override public Role toName() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java index cf1cef991..ef00a158d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java @@ -15,10 +15,8 @@ import org.antlr.runtime.Token; import org.scribble.ast.MessageNode; -import org.scribble.ast.MessageSigNode; import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.MessageSigName; -import org.scribble.visit.Substitutor; public class SigParamNode extends NonRoleParamNode implements MessageNode @@ -45,16 +43,6 @@ public SigParamNode dupNode() return new SigParamNode(this);//, getIdentifier()); } - @Override - public MessageSigNode substituteNames(Substitutor subs) - { - MessageSigName arg = toArg(); - MessageSigNode an; - an = (MessageSigNode) subs.getArgumentSubstitution(arg); // getArgumentSubstitution returns a clone - an = (MessageSigNode) an.del(del()); - return an; - } - @Override public MessageSigName toName() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java index 90565de6e..9f88591c9 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java @@ -15,10 +15,8 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.PayloadElemNameNode; -import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.core.type.kind.DataTypeKind; import org.scribble.core.type.name.DataType; -import org.scribble.visit.Substitutor; public class TypeParamNode extends NonRoleParamNode implements PayloadElemNameNode @@ -42,16 +40,6 @@ public TypeParamNode dupNode() return new TypeParamNode(this); } - @Override - public DataTypeNode substituteNames(Substitutor subs) - { - DataType arg = toArg(); - DataTypeNode an; - an = (DataTypeNode) subs.getArgumentSubstitution(arg); // getArgumentSubstitution returns a clone - an = (DataTypeNode) an.del(del()); - return an; - } - @Override public DataType toName() { diff --git a/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java index ea62540ef..7f49f96a3 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java @@ -26,7 +26,7 @@ import org.scribble.core.type.name.ProtocolName; import org.scribble.lang.LangContext; import org.scribble.util.ScribException; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public abstract class DoArgListDel extends ScribDelBase { diff --git a/scribble-ast/src/main/java/org/scribble/del/DoDel.java b/scribble-ast/src/main/java/org/scribble/del/DoDel.java index 9ffb90ba8..4bb6e1ebc 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoDel.java @@ -20,7 +20,7 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.ProtocolName; import org.scribble.util.ScribException; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public abstract class DoDel extends SimpleSessionNodeDel { diff --git a/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java b/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java index 1af921584..b2ed5c24d 100644 --- a/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java @@ -19,7 +19,7 @@ import org.scribble.ast.HeaderParamDeclList; import org.scribble.ast.ScribNode; import org.scribble.util.ScribException; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public abstract class HeaderParamDeclListDel extends ScribDelBase { diff --git a/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java b/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java index c2223f68a..8dab67fbb 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java @@ -24,7 +24,7 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.util.ScribException; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public class ModuleDel extends ScribDelBase { diff --git a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java index 655480d25..ee3984c08 100644 --- a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java @@ -28,7 +28,7 @@ import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.SigKind; import org.scribble.util.ScribException; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public class NonRoleArgListDel extends DoArgListDel { diff --git a/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java index e4e415329..f0d544534 100644 --- a/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java @@ -16,7 +16,7 @@ import org.scribble.ast.NonRoleParamDecl; import org.scribble.ast.ScribNode; import org.scribble.util.ScribException; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public class NonRoleParamDeclDel extends ScribDelBase { diff --git a/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java index ed71ea10b..0d66d6e98 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java @@ -16,7 +16,7 @@ import org.scribble.ast.ScribNode; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.util.ScribException; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public abstract class ProtocolDeclDel extends ScribDelBase diff --git a/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java index 264ad45fb..1a0d3d34e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/RecursionDel.java @@ -17,7 +17,7 @@ import org.scribble.ast.ScribNode; import org.scribble.core.type.name.RecVar; import org.scribble.util.ScribException; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public abstract class RecursionDel extends CompoundInteractionDel { diff --git a/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java index a4b4c3a01..4cba64f9e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java @@ -21,7 +21,7 @@ import org.scribble.ast.ScribNode; import org.scribble.core.type.name.Role; import org.scribble.util.ScribException; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public class RoleArgListDel extends DoArgListDel { diff --git a/scribble-ast/src/main/java/org/scribble/del/RoleDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/RoleDeclDel.java index 3f33183d7..55eaefdd5 100644 --- a/scribble-ast/src/main/java/org/scribble/del/RoleDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/RoleDeclDel.java @@ -16,7 +16,7 @@ import org.scribble.ast.RoleDecl; import org.scribble.ast.ScribNode; import org.scribble.util.ScribException; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public class RoleDeclDel extends ScribDelBase { diff --git a/scribble-ast/src/main/java/org/scribble/del/ScribDel.java b/scribble-ast/src/main/java/org/scribble/del/ScribDel.java index 1c90da65a..0d5a82b6e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ScribDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ScribDel.java @@ -15,7 +15,7 @@ import org.scribble.ast.ScribNode; import org.scribble.util.ScribException; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; // Parameterise by AstNode type? Would inhibit del sharing between types (but that's not currently needed) public interface ScribDel diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java index 689a3544e..e8a983db5 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java @@ -23,7 +23,7 @@ import org.scribble.del.ConnectionActionDel; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public class GConnectDel extends ConnectionActionDel implements GSimpleSessionNodeDel diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java index c7f7c6169..dc11db323 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -24,7 +24,7 @@ import org.scribble.core.type.name.Role; import org.scribble.del.ScribDelBase; import org.scribble.util.ScribException; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public class GDelegationElemDel extends ScribDelBase { diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java index a4876eddc..b881eec27 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java @@ -19,7 +19,7 @@ import org.scribble.del.ConnectionActionDel; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; // TODO: make DisconnectDel (cf., G/LMessageTransferDel) public class GDisconnectDel extends ConnectionActionDel diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java index e47610e38..dc8230ca3 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -23,7 +23,7 @@ import org.scribble.del.MessageTransferDel; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public class GMessageTransferDel extends MessageTransferDel implements GSimpleSessionNodeDel diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java index 07f8015fc..ab7c85fe9 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java @@ -19,7 +19,7 @@ import org.scribble.del.ConnectionActionDel; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; // TODO: make WrapDel (cf., G/LMessageTransferDel) public class GWrapDel extends ConnectionActionDel diff --git a/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java index d64629ee8..b1e0a4073 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java @@ -22,7 +22,7 @@ import org.scribble.core.type.name.DataType; import org.scribble.del.ScribDelBase; import org.scribble.util.ScribException; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public class DataTypeNodeDel extends ScribDelBase { diff --git a/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java index 1357d0ea7..09b43bb27 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java @@ -22,7 +22,7 @@ import org.scribble.core.type.name.MessageSigName; import org.scribble.del.ScribDelBase; import org.scribble.util.ScribException; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public class MessageSigNameNodeDel extends ScribDelBase { diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java index 84ffaf612..1b6feedb8 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java @@ -28,7 +28,7 @@ import org.scribble.core.type.name.AmbigName; import org.scribble.del.ScribDelBase; import org.scribble.util.ScribException; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public class AmbigNameNodeDel extends ScribDelBase { diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java index 50e71d974..8cbad895f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/RecVarNodeDel.java @@ -18,7 +18,7 @@ import org.scribble.core.type.name.RecVar; import org.scribble.del.ScribDelBase; import org.scribble.util.ScribException; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public class RecVarNodeDel extends ScribDelBase { diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java index 927a7d7d4..e96b27f1e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/RoleNodeDel.java @@ -17,7 +17,7 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDelBase; import org.scribble.util.ScribException; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; public class RoleNodeDel extends ScribDelBase { diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index 0ff79e689..99483df17 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -13,8 +13,6 @@ */ package org.scribble.lang; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -30,7 +28,7 @@ import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; import org.scribble.visit.GTypeTranslator; -import org.scribble.visit.wf.NameDisambiguator; +import org.scribble.visit.NameDisambiguator; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models public class Lang @@ -89,7 +87,7 @@ public void runPasses() throws ScribException // Disamb is a "leftover" aspect of parsing -- so not in core // N.B. disamb is mainly w.r.t. ambignames -- e.g., doesn't fully qualify names (currently mainly done by imed translation) // CHECKME: disamb also currently does checks like do-arg kind and arity -- refactor into core? -- also does, e.g., distinct roledecls, protodecls, etc. - runVisitorPassOnAllModules(NameDisambiguator.class); // Includes validating names used in subprotocol calls.. + runVisitorPassOnAllModules(new NameDisambiguator(this)); // Includes validating names used in subprotocol calls.. } // "Finalises" this Lang -- initialises the Job at this point, and cannot run futher Visitor passes on Lang @@ -131,31 +129,19 @@ public LangContext getContext() return this.context.getModuleContext(this.config.main); }*/ - public void runVisitorPassOnAllModules(Class c) - throws ScribException + public void runVisitorPassOnAllModules(AstVisitor v) throws ScribException { - debugPrintPass("Running " + c + " on all modules:"); - runVisitorPass(c, this.context.getFullModuleNames()); + debugPrintPass("Running " + v.getClass() + " on all modules:"); + runVisitorPass(v, this.context.getFullModuleNames()); } - private void runVisitorPass(Class c, + private void runVisitorPass(AstVisitor v, Set fullnames) throws ScribException { - try - { - Constructor cons = c.getConstructor(Lang.class); for (ModuleName fullname : fullnames) { - AstVisitor nv = cons.newInstance(this); - runVisitorOnModule(fullname, nv); + runVisitorOnModule(fullname, v); } - } - catch (NoSuchMethodException | SecurityException | InstantiationException - | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - { - throw new RuntimeException(e); - } } private void runVisitorOnModule(ModuleName modname, AstVisitor nv) diff --git a/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java index c3150edb1..b5c52fe1d 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java @@ -18,11 +18,10 @@ import org.scribble.util.ScribException; // Pattern: node accepts visitor and calls visitor back (standard visitor pattern -- adding a new operation doesn't affect the Ast classes), but then visitor delegates back to node delegate (so routines for handling each node type not centralised in visitor, but decentralised to delegates) +// More general than SimpleAstVisitor, retrieves ModuleContext on entry and offers enter/leave around visitChildren public abstract class AstVisitor { public final Lang lang; // Immutable except for JobContext internals - - //private ModuleContext mcontext; // Factor up to ModelVisitor? (will be null before context building) -- maybe make a ModuleVisitor protected AstVisitor(Lang lang) { diff --git a/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/ModuleContextVisitor.java similarity index 85% rename from scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java rename to scribble-ast/src/main/java/org/scribble/visit/ModuleContextVisitor.java index e94f38072..522c8fe75 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/context/ModuleContextVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/ModuleContextVisitor.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.visit.context; +package org.scribble.visit; import org.scribble.ast.Module; import org.scribble.ast.ScribNode; @@ -19,14 +19,13 @@ import org.scribble.core.type.name.ModuleName; import org.scribble.lang.Lang; import org.scribble.util.ScribException; -import org.scribble.visit.AstVisitor; // A visitor that caches the ModuleContext from the *entered* Module, for later access // N.B. may be a different Module than the "root" Module of the job // Looking up the "entered" Module context is otherwise inconvenient public abstract class ModuleContextVisitor extends AstVisitor { - private ModuleContext mcontext; // The "root" module context (different than the front-end "main" module) // Factor up to ModelVisitor? (would be null before context building) + private ModuleContext mcon; // The "current" module context, gathered on entry -- different than the front-end "main" module public ModuleContextVisitor(Lang lang) { @@ -49,12 +48,12 @@ protected void enter(ScribNode child) public ModuleContext getModuleContext() { - return this.mcontext; + return this.mcon; } // Factor out -- e.g. some Visitors want to root on ProtocolDecl, not Module protected void setModuleContext(ModuleContext mcontext) { - this.mcontext = mcontext; + this.mcon = mcontext; } } diff --git a/scribble-ast/src/main/java/org/scribble/visit/wf/NameDisambiguator.java b/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java similarity index 98% rename from scribble-ast/src/main/java/org/scribble/visit/wf/NameDisambiguator.java rename to scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java index ca1521ca6..20b7853a7 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/wf/NameDisambiguator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.visit.wf; +package org.scribble.visit; import java.util.HashMap; import java.util.HashSet; @@ -28,7 +28,6 @@ import org.scribble.del.global.GDelegationElemDel; import org.scribble.lang.Lang; import org.scribble.util.ScribException; -import org.scribble.visit.context.ModuleContextVisitor; // Disambiguates ambiguous PayloadTypeOrParameter names and inserts implicit Scope names // Also canonicalises recvars diff --git a/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java index d72470712..feb41038f 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java @@ -21,6 +21,7 @@ // A SimpleVisitor visits a Module (or some part of one) for a given Job // Apart from delegating to del-specific visiting methods, SimpleVisitors are mainly for holding data and collecting common operations +// A SimpleVisitor must be given the root ModuleContext, cf. ModuleContextVisitor that retrieves the "current" ModuleContext on entry // TODO CHECKME: refactor AstVisitor as a SimpleVisitor? i.e., T=ScribNode ? public abstract class SimpleAstVisitor { diff --git a/scribble-ast/src/main/java/org/scribble/visit/Substitutor.java b/scribble-ast/src/main/java/org/scribble/visit/Substitutor.java deleted file mode 100644 index 0d9c5eb6b..000000000 --- a/scribble-ast/src/main/java/org/scribble/visit/Substitutor.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.visit; - -import java.util.Map; - -import org.scribble.ast.NonRoleArgNode; -import org.scribble.ast.ScribNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.kind.NonRoleArgKind; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Arg; -import org.scribble.lang.Lang; -import org.scribble.util.ScribException; - -public class Substitutor extends AstVisitor -{ - // name in the current protocoldecl scope -> the original name node in the root protocol decl - // Applications of the maps (i.e. substitution) should reconstruct/clone the original nodes - private final Map rolemap; - private final Map, NonRoleArgNode> argmap; - - public Substitutor(Lang job, Map rolemap, - Map, NonRoleArgNode> argmap) - { - super(job); - this.rolemap = rolemap; - this.argmap = argmap; - } - - @Override - public ScribNode leave(ScribNode child, ScribNode visited) - throws ScribException - { - return visited.substituteNames(this); - } - - public RoleNode getRoleSubstitution(Role role) - { - return this.rolemap.get(role).clone();//this.job.af); - } - - public NonRoleArgNode getArgumentSubstitution( - Arg arg) - { - return (NonRoleArgNode) this.argmap.get(arg).clone();//this.job.af); - // Makes new dels that will be discarded in NonRoleParamNode (just as calling the factory manually would) - } -} diff --git a/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java b/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java index f8c2b57d3..4424aa8f4 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java @@ -32,7 +32,7 @@ // CHECKME: currently unused within core -- refactor out to lang package? public class ModuleContext { - public final ModuleName root; // full name // The root Module for this ModuleContext (cf. the "main" root module from CLI) + public final ModuleName root; // full name // The root Module for this ModuleContext -- cf. separate to the "main" module // All transitive name dependencies of this module: all names fully qualified // The ScribNames maps are basically just used as sets (identity map) @@ -46,7 +46,8 @@ public class ModuleContext // Made by ModuleContextBuilder // ModuleContext is the root context - public ModuleContext(ModuleName root, ScribNames deps, ScribNames visible) throws ScribException + public ModuleContext(ModuleName root, ScribNames deps, ScribNames visible) + throws ScribException { this.root = root; this.deps = deps; From 56bd23f889415b73a796808a0fb4862731209610 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 15:30:34 +0100 Subject: [PATCH 208/539] Continued: refactoring core visitors. --- .../main/java/org/scribble/core/job/Job.java | 10 ++- .../scribble/core/lang/global/GProtocol.java | 19 ++++- .../scribble/core/type/session/Choice.java | 15 ++++ .../core/type/session/ConnectAction.java | 4 +- .../scribble/core/type/session/Continue.java | 14 ++++ .../type/session/DirectedInteraction.java | 30 ++++++-- .../core/type/session/DisconnectAction.java | 15 ++++ .../org/scribble/core/type/session/Do.java | 14 ++++ .../core/type/session/MessageTransfer.java | 4 +- .../scribble/core/type/session/Recursion.java | 15 ++++ .../org/scribble/core/type/session/SType.java | 19 ++++- .../org/scribble/core/type/session/Seq.java | 17 +++++ .../core/type/session/global/GChoice.java | 14 ++++ .../core/type/session/global/GConnect.java | 4 +- .../type/session/global/GMessageTransfer.java | 4 +- .../core/type/session/local/LAcc.java | 4 +- .../core/type/session/local/LRcv.java | 4 +- .../core/type/session/local/LReq.java | 4 +- .../core/type/session/local/LSend.java | 4 +- .../core/type/session/local/LSkip.java | 16 ++++ .../core/visit/MessageIdCollector.java | 21 +++++ .../scribble/core/visit/RecVarCollector.java | 20 +++++ .../scribble/core/visit/RoleCollector.java | 34 +++++++++ .../scribble/core/visit/STypeCollector.java | 70 +++++++++++++++++ .../org/scribble/core/visit/STypeVisitor.java | 69 +++++++++++++++++ .../java/org/scribble/core/visit/Unf.java | 76 +++++++++++++++++++ .../org/scribble/core/visit/global/GUnf.java | 18 +++++ 27 files changed, 506 insertions(+), 32 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/MessageIdCollector.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/RecVarCollector.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/RoleCollector.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/STypeCollector.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/Unf.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/global/GUnf.java diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index 258a4f426..ed4c3c2fb 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -43,6 +43,8 @@ import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; +import org.scribble.core.type.session.global.GSeq; +import org.scribble.core.visit.RoleCollector; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.global.Projector2; @@ -186,14 +188,16 @@ else if (n instanceof MessageSigName) verbosePrintln("\nEFSM for " + proj.fullname + ":\n" + graph.toDot()); } } - + public void runValidationPasses() throws ScribException { for (GProtocol inlined : this.context.getInlined()) { - //TODO: relegate to "warning" ? + // CHECKME: relegate to "warning" ? -- some downsteam operations may depend on this though (e.g., graph building?) // Check unused roles - Set used = inlined.def.getRoles(); + Set used = inlined.def + .collect(new RoleCollector()::visit) + .collect(Collectors.toSet()); Set unused = this.context.getIntermediate(inlined.fullname).roles // imeds have original role decls (inlined's are pruned) .stream().filter(x -> !used.contains(x)).collect(Collectors.toSet()); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 6f35ad501..50b54a9e8 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -37,6 +37,7 @@ import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.global.SGraph; import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.LProtocolName; @@ -48,8 +49,11 @@ import org.scribble.core.type.session.global.GRecursion; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.visit.MessageIdCollector; +import org.scribble.core.visit.RoleCollector; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; +import org.scribble.core.visit.global.GUnf; import org.scribble.core.visit.global.Projector2; import org.scribble.util.ScribException; import org.scribble.util.ScribUtil; @@ -85,7 +89,9 @@ public GProtocol getInlined(STypeInliner v) GRecursion rec = new GRecursion(null, rv, body); // CHECKME: or protodecl source? CommonTree source = getSource(); GSeq def = new GSeq(null, Stream.of(rec).collect(Collectors.toList())); - Set used = def.getRoles(); + Set used = //def.getRoles(); + def.collect(new RoleCollector()::visit) + .collect(Collectors.toSet()); List rs = this.roles.stream().filter(x -> used.contains(x)) // Prune role decls .collect(Collectors.toList()); return new GProtocol(source, this.mods, this.fullname, rs, @@ -95,7 +101,8 @@ public GProtocol getInlined(STypeInliner v) @Override public GProtocol unfoldAllOnce(STypeUnfolder u) { - GSeq unf = (GSeq) this.def.unfoldAllOnce(u); + GSeq unf = (GSeq) //this.def.unfoldAllOnce(u); + this.def.visitWith(new GUnf()); return reconstruct(getSource(), this.mods, this.fullname, this.roles, this.params, unf); } @@ -125,7 +132,9 @@ private LProjection projectAux(Role self, List decls, LSeq body) { LProtocolName fullname = Projector2 .projectFullProtocolName(this.fullname, self); - Set tmp = body.getRoles(); + Set tmp = //body.getRoles(); + body.collect(new RoleCollector()::visit) + .collect(Collectors.toSet()); List roles = decls.stream() .filter(x -> x.equals(self) || tmp.contains(x)) // Implicitly filters Role.SELF .collect(Collectors.toList()); @@ -211,7 +220,9 @@ public static void validateBySpin(Job job2, GProtocolName fullname) ((ModuleDel) mod.del()).getModuleContext()); // TODO: get ModuleContext from Job(Context) gpd.accept(coll); Set> mids = coll.getNames();*/ - Set> mids = gpd.def.getMessageIds(); + Set> mids = gpd.def.//getMessageIds(); + collect(new MessageIdCollector()::visit) + .collect(Collectors.toSet()); //..........FIXME: get mids from SType, instead of old AST Collector diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java index 442973c63..85f3bf235 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java @@ -16,6 +16,7 @@ import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -29,6 +30,7 @@ import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; +import org.scribble.core.visit.STypeVisitor; public abstract class Choice> extends STypeBase implements SType @@ -49,6 +51,19 @@ public abstract Choice reconstruct(CommonTree source, Role subj, List blocks); //List> blocks); + @Override + public Stream collect(Function, Stream> f) + { + return Stream.concat(f.apply(this), + this.blocks.stream().flatMap(x -> x.collect(f))); + } + + @Override + public SType visitWith(STypeVisitor> v) + { + return v.visitChoice(this); + } + @Override public Set getRoles() { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java index 2ced8f1e9..0e793c782 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java @@ -28,9 +28,9 @@ public abstract class ConnectAction> extends DirectedInteraction { public ConnectAction(CommonTree source, // BaseInteractionNode not ideal - Role src, Message msg, Role dst) + Message msg, Role src, Role dst) { - super(source, src, msg, dst); + super(source, msg, src, dst); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java index 0cfb431e2..9b0ae6144 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java @@ -16,6 +16,7 @@ import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -28,6 +29,7 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeInliner; +import org.scribble.core.visit.STypeVisitor; public abstract class Continue> extends STypeBase @@ -45,6 +47,18 @@ public Continue(//org.scribble.ast.Continue source, public abstract Continue reconstruct( CommonTree source, RecVar recvar); + @Override + public Stream collect(Function, Stream> f) + { + return f.apply(this); + } + + @Override + public SType visitWith(STypeVisitor> v) + { + return v.visitContinue(this); + } + @Override public Set getRoles() { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java index 9122b69f0..280d86aca 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java @@ -14,6 +14,7 @@ package org.scribble.core.type.session; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -21,29 +22,44 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; +import org.scribble.core.visit.STypeVisitor; // Besides directed-ness, also features a Message public abstract class DirectedInteraction> extends BasicInteraction { - public final Role src; + // Following ast children order public final Message msg; + public final Role src; public final Role dst; public DirectedInteraction(CommonTree source, - Role src, Message msg, Role dst) + Message msg, Role src, Role dst) { super(source); - this.src = src; this.msg = msg; + this.src = src; this.dst = dst; } public abstract DirectedInteraction reconstruct( - CommonTree source, Role src, Message msg, + CommonTree source, Message msg, Role src, Role dst); + + @Override + public Stream collect(Function, Stream> f) + { + return f.apply(this); + } + + @Override + public SType visitWith(STypeVisitor> v) + { + return v.visitDirectedInteraction(this); + } @Override public Set getRoles() @@ -70,7 +86,7 @@ public DirectedInteraction substitute(Substitutions subs) msg = (Message) subs.subsArg(n); } } - return reconstruct(getSource(), subs.subsRole(this.src), msg, + return reconstruct(getSource(), msg, subs.subsRole(this.src), subs.subsRole(this.dst)); } @@ -85,8 +101,8 @@ public int hashCode() { int hash = 10631; hash = 31 * hash + super.hashCode(); - hash = 31 * hash + this.src.hashCode(); hash = 31 * hash + this.msg.hashCode(); + hash = 31 * hash + this.src.hashCode(); hash = 31 * hash + this.dst.hashCode(); return hash; } @@ -104,7 +120,7 @@ public boolean equals(Object o) } DirectedInteraction them = (DirectedInteraction) o; return super.equals(this) // Does canEquals - && this.src.equals(them.src) && this.msg.equals(them.msg) + && this.msg.equals(them.msg) && this.src.equals(them.src) && this.dst.equals(them.dst); } } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java index 1223a1094..658fd186a 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java @@ -16,6 +16,7 @@ import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -23,8 +24,10 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; +import org.scribble.core.visit.STypeVisitor; // Base class would be "SymmetricInteraction" (cf., DirectedInteraction) public abstract class DisconnectAction> @@ -43,6 +46,18 @@ public DisconnectAction(CommonTree source, public abstract DisconnectAction reconstruct( CommonTree source, Role src, Role dst); + + @Override + public Stream collect(Function, Stream> f) + { + return f.apply(this); + } + + @Override + public SType visitWith(STypeVisitor> v) + { + return v.visitDisconnect(this); + } @Override public Set getRoles() diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java index c63d66dfc..d87d9fa80 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java @@ -18,6 +18,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -33,6 +34,7 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeUnfolder; +import org.scribble.core.visit.STypeVisitor; public abstract class Do , N extends ProtocolName> @@ -54,6 +56,18 @@ public Do(CommonTree source, N proto, public abstract Do reconstruct(CommonTree source, N proto, List roles, List> args); + + @Override + public Stream collect(Function, Stream> f) + { + return f.apply(this); + } + + @Override + public SType visitWith(STypeVisitor> v) + { + return v.visitDo(this); + } @Override public Set getRoles() diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/core/type/session/MessageTransfer.java index d0848e433..8682df1b5 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/MessageTransfer.java @@ -29,9 +29,9 @@ public abstract class MessageTransfer { public MessageTransfer(CommonTree source, - Role src, Message msg, Role dst) + Message msg, Role src, Role dst) { - super(source, src, msg, dst); + super(source, msg, src, dst); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java index f3e0e1bfa..1e3e9d9eb 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java @@ -15,6 +15,8 @@ import java.util.List; import java.util.Set; +import java.util.function.Function; +import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; @@ -26,6 +28,7 @@ import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; +import org.scribble.core.visit.STypeVisitor; public abstract class Recursion> extends STypeBase @@ -41,6 +44,18 @@ public Recursion(//org.scribble.ast.Recursion source, this.recvar = recvar; this.body = body; } + + @Override + public Stream collect(Function, Stream> f) + { + return Stream.concat(f.apply(this), this.body.collect(f)); + } + + @Override + public SType visitWith(STypeVisitor> v) + { + return v.visitRecursion(this); + } public abstract Recursion reconstruct( CommonTree source, RecVar recvar, B body); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index 727346e7c..2d55d16b0 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -15,6 +15,8 @@ import java.util.List; import java.util.Set; +import java.util.function.Function; +import java.util.stream.Stream; import org.scribble.core.lang.SNode; import org.scribble.core.type.kind.ProtocolKind; @@ -26,19 +28,32 @@ import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; +import org.scribble.core.visit.STypeVisitor; + +@FunctionalInterface +interface STypeVisitorFunction, N extends ProtocolName, R extends Stream> +{ + R f(SType n, STypeVisitor v); +} // B needed(?) to factor up several methods from G/L compounds to bases, e.g., getInlined and unfoldAllOnce // Generic works to "specialise" G/L subclasses (and works with immutable pattern) -- cf. not supported by contravariant method parameter subtyping for getters/setters public interface SType> extends SNode { - // Unsupported for Protocol (Protocol should not be an SType) + Stream collect(Function, Stream> f); + + // T = children, not always SType, e.g., Role -- CHECKME: shouldn't "visit" non STypes? + //SType visit(Function, Stream> f); + //SType visit(STypeVisitorFunction, Stream> f); + SType visitWith(STypeVisitor> v); + Set getRoles(); Set> getMessageIds(); SType substitute(Substitutions subs); - Set getRecVars(); + Set getRecVars(); // Gets Continue RecVars (not Recursion) SType pruneRecs(); // Assumes no shadowing (e.g., use after inlining recvar disamb) // CHECKME: OK to (re-)use GTypeTranslator for inlining? diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java index 186da1be3..a75adec58 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java @@ -17,7 +17,9 @@ import java.util.LinkedList; import java.util.List; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; @@ -29,6 +31,7 @@ import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; +import org.scribble.core.visit.STypeVisitor; public abstract class Seq> extends STypeBase @@ -44,6 +47,20 @@ public Seq(CommonTree source, List> elems) public abstract B reconstruct(CommonTree source, List> elems); + + @Override + public Stream collect(Function, Stream> f) + { + return this.elems.stream().flatMap(x -> x.collect(f)); + } + + @Override + public B visitWith(STypeVisitor> v) + { + @SuppressWarnings("unchecked") + B cast = (B) this; // CHECKME: OK as long as G/LSeq specify themselves as B param + return v.visitSeq(cast); + } @Override public Set getRoles() diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java index 0ae97779a..267445a91 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java @@ -50,6 +50,20 @@ public GChoice reconstruct(CommonTree source, Role subj, { return new GChoice(source, subj, blocks); } + + /*@Override + public GChoice visit(Function, Stream> f) + { + Stream tmp = f.apply(this); + if (tmp.count() != 1) + { + throw new RuntimeException(": " + tmp.collect(Collectors.toList())); + } + Role subj = (Role) tmp.findFirst().get(); + List blocks = this.blocks.stream() + .map(x -> (GSeq) x.visit(f)).collect(Collectors.toList()); + return reconstruct(getSource(), subj, blocks); + }*/ @Override public LType projectInlined(Role self) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java index 333ad7832..f9de5ceeb 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java @@ -38,12 +38,12 @@ public class GConnect extends ConnectAction public GConnect(CommonTree source, // DirectedInteraction not ideal (imprecise) Role src, Message msg, Role dst) { - super(source, src, msg, dst); + super(source, msg, src, dst); } @Override public GConnect reconstruct( - CommonTree source, Role src, Message msg, + CommonTree source, Message msg, Role src, Role dst) { return new GConnect(source, src, msg, dst); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java index 54feb7116..7e1025ecf 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java @@ -38,12 +38,12 @@ public class GMessageTransfer extends MessageTransfer public GMessageTransfer(CommonTree source, Role src, Message msg, Role dst) { - super(source, src, msg, dst); + super(source, msg, src, dst); } @Override public GMessageTransfer reconstruct( - CommonTree source, Role src, Message msg, + CommonTree source, Message msg, Role src, Role dst) { return new GMessageTransfer(source, src, msg, dst); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java index 77e2d9da6..958fa084f 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java @@ -35,13 +35,13 @@ public class LAcc extends ConnectAction implements LType public LAcc(CommonTree source, Role src, Message msg) { - super(source, src, msg, Role.SELF); + super(source, msg, src, Role.SELF); } // FIXME: unnecessary dst @Override public LAcc reconstruct( - CommonTree source, Role src, Message msg, + CommonTree source, Message msg, Role src, Role dst) { return new LAcc(source, src, msg); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java index e970de2e3..da6c9e2b4 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java @@ -36,13 +36,13 @@ public class LRcv extends MessageTransfer public LRcv(CommonTree source, Role src, Message msg) { - super(source, src, msg, Role.SELF); + super(source, msg, src, Role.SELF); } // FIXME: unnecessary dst @Override public LRcv reconstruct( - CommonTree source, Role src, Message msg, + CommonTree source, Message msg, Role src, Role dst) { return new LRcv(source, src, msg); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java index 56b0c64e8..853c6ba32 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java @@ -36,13 +36,13 @@ public class LReq extends ConnectAction public LReq(CommonTree source, Message msg, Role dst) { - super(source, Role.SELF, msg, dst); + super(source, msg, Role.SELF, dst); } // CHECKME: remove unnecessary src ? @Override public LReq reconstruct( - CommonTree source, Role src, Message msg, + CommonTree source, Message msg, Role src, Role dst) { return new LReq(source, msg, dst); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java index cfa72fa6e..90a5b440f 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java @@ -36,13 +36,13 @@ public class LSend extends MessageTransfer public LSend(CommonTree source, Message msg, Role dst) { - super(source, Role.SELF, msg, dst); + super(source, msg, Role.SELF, dst); } // CHECKME: remove unnecessary src ? @Override public LSend reconstruct( - CommonTree source, Role src, Message msg, + CommonTree source, Message msg, Role src, Role dst) { return new LSend(source, msg, dst); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java index c4127ff91..ec67ebe02 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java @@ -15,6 +15,8 @@ import java.util.List; import java.util.Set; +import java.util.function.Function; +import java.util.stream.Stream; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; @@ -24,9 +26,11 @@ import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; +import org.scribble.core.type.session.SType; import org.scribble.core.type.session.STypeBase; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; +import org.scribble.core.visit.STypeVisitor; import org.scribble.core.visit.local.ReachabilityEnv; import org.scribble.util.ScribException; @@ -39,6 +43,18 @@ private LSkip() { super(null); } + + @Override + public Stream collect(Function, Stream> f) + { + throw new RuntimeException("Unsupported for Skip: " + this); + } + + @Override + public LSkip visitWith(STypeVisitor> v) + { + throw new RuntimeException("Unsupported for Skip: " + this); + } @Override public Set getRoles() diff --git a/scribble-core/src/main/java/org/scribble/core/visit/MessageIdCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/MessageIdCollector.java new file mode 100644 index 000000000..f9fbc17ca --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/MessageIdCollector.java @@ -0,0 +1,21 @@ +package org.scribble.core.visit; + +import java.util.stream.Stream; + +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.Seq; + +public class MessageIdCollector> + extends STypeCollector, MessageId> +{ + + @Override + public Stream> visitDirectedInteraction( + DirectedInteraction n) + { + return Stream.of(n.msg.getId()); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecVarCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/RecVarCollector.java new file mode 100644 index 000000000..4e80f2248 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecVarCollector.java @@ -0,0 +1,20 @@ +package org.scribble.core.visit; + +import java.util.stream.Stream; + +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.session.Continue; +import org.scribble.core.type.session.global.GSeq; + +public class RecVarCollector + extends STypeCollector +{ + @Override + public Stream visitContinue + (Continue n) + { + return Stream.of(n.recvar); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RoleCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/RoleCollector.java new file mode 100644 index 000000000..a2aefdfb5 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/RoleCollector.java @@ -0,0 +1,34 @@ +package org.scribble.core.visit; + +import java.util.stream.Stream; + +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.DisconnectAction; +import org.scribble.core.type.session.Seq; + +public class RoleCollector> + extends STypeCollector, Role> +{ + + @Override + public Stream visitChoice(Choice n) + { + return Stream.of(n.subj); + } + + @Override + public Stream visitDirectedInteraction(DirectedInteraction n) + { + return Stream.of(n.src, n.dst); + } + + @Override + public Stream visitDisconnect(DisconnectAction n) + { + return Stream.of(n.left, n.right); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeCollector.java new file mode 100644 index 000000000..5e8e2867b --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeCollector.java @@ -0,0 +1,70 @@ +package org.scribble.core.visit; + +import java.util.Optional; +import java.util.stream.Stream; + +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.Continue; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.DisconnectAction; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.Seq; + +public abstract class STypeCollector, + N extends ProtocolName, T> +{ + public Stream visit(SType n) + { + return typeSwitch(n).get(); + } + + // Can override by adding new cases when super call returns empty + protected Optional> typeSwitch(SType n) + { + return (n instanceof DirectedInteraction) + ? Optional.of(visitDirectedInteraction((DirectedInteraction) n)) + : (n instanceof DisconnectAction) + ? Optional.of(visitDisconnect((DisconnectAction) n)) + : (n instanceof Choice) + ? Optional.of(visitChoice((Choice) n)) + : (n instanceof Seq) + ? Optional.of(visitSeq((Seq) n)) + : (n instanceof Continue) + ? Optional.of(visitContinue((Continue) n)) + : (n instanceof Recursion) + ? Optional.of(visitRecursion((Recursion) n)) + : (n instanceof Do) + ? Optional.of(visitDo((Do) n)) // FIXME: + : Optional.empty(); // Better for extensibility than "manually" throwing Exception + + /*if (n instanceof DirectedInteraction) + return directedinter((DirectedInteraction) n); + else if (n instanceof DisconnectAction) + return disconnect((DisconnectAction) n); + else if (n instanceof Choice) return choice((Choice) n); + else if (n instanceof Seq) return seq((Seq) n); + else if (n instanceof Continue) return continu((Continue) n); + else if (n instanceof Recursion) + return recursion((Recursion) n); + else if (n instanceof Do) return doo((Do) n); + else throw new RuntimeException("Unknown node type: " + n.getClass());*/ + } + + public Stream visitContinue(Continue n) { return Stream.of(); } + + public Stream visitChoice(Choice n) { return Stream.of(); } + + public Stream visitDirectedInteraction(DirectedInteraction n) { return Stream.of(); } + + public Stream visitDisconnect(DisconnectAction n) { return Stream.of(); } + + public Stream visitDo(Do n) { return Stream.of(); } + + public Stream visitRecursion(Recursion n) { return Stream.of(); } + + public Stream visitSeq(Seq n) { return Stream.of(); } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java new file mode 100644 index 000000000..480c2e258 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java @@ -0,0 +1,69 @@ +package org.scribble.core.visit; + +import java.util.List; +import java.util.stream.Collectors; + +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.Continue; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.DisconnectAction; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.Seq; + +public abstract class STypeVisitor, + N extends ProtocolName> +{ + // SType return for extensibility/flexibility + public SType visitContinue(Continue n) + { + //return n.reconstruct(n.getSource(), n.recvar); + return n; + } + + public SType visitChoice(Choice n) + { + List blocks = n.blocks.stream() + .map(x -> x.visitWith((STypeVisitor>) this)) // FIXME + .collect(Collectors.toList()); + return n.reconstruct(n.getSource(), n.subj, blocks); + } + + public SType visitDirectedInteraction(DirectedInteraction n) + { + //return n.reconstruct(n.getSource(), n.msg, n.src, n.dst); + return n; + } + + public SType visitDisconnect(DisconnectAction n) + { + //return n.reconstruct(n.getSource(), n.left, n.right); + return n; + } + + public SType visitDo(Do n) + { + //return n.reconstruct(n.getSource(), n.proto, n.roles, n.args); + return n; + } + + public SType visitRecursion(Recursion n) + { + B body = n.body.visitWith((STypeVisitor>) this); // FIXME + return n.reconstruct(n.getSource(), n.recvar, body); + } + + // "Hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction + // This means a Visitor that needs to restructure a Seq should handle this within visitSeq (e.g., Seq "injection") + // For this purpose, visited children passed "directly" instead of via a reconstruction (cf. above methods) + public B visitSeq(B n) + { + List> elems = n.elems.stream() + .map(x -> x.visitWith((STypeVisitor>) this)) // FIXME + .collect(Collectors.toList()); + return n.reconstruct(n.getSource(), elems); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/Unf.java b/scribble-core/src/main/java/org/scribble/core/visit/Unf.java new file mode 100644 index 000000000..b07b8a8cc --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/Unf.java @@ -0,0 +1,76 @@ +package org.scribble.core.visit; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.Seq; + +public abstract class Unf> + extends STypeVisitor> +{ + private final Map> recs = new HashMap<>(); + + @Override + public SType visitRecursion(Recursion n) + { + if (!hasRec(n.recvar)) // N.B. doesn't work if recvars shadowed + { + pushRec(n.recvar, n.body); + SType unf = n.body.visitWith(this); + popRec(n.recvar); + // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs + return unf; + } + return n; + } + + @Override + public B visitSeq(B n) + { + List> elems = new LinkedList<>(); + for (SType e : n.elems) + { + SType e1 = e.visitWith(this); + if (e1 instanceof Seq) + { + elems.addAll(((Seq) e1).elems); + } + else + { + elems.add(e1); + } + } + return n.reconstruct(n.getSource(), elems); + } + + public void pushRec(RecVar rv, Seq body) + { + if (this.recs.containsKey(rv)) + { + throw new RuntimeException("Shouldn't get here: " + rv); + } + this.recs.put(rv, body); + } + + public boolean hasRec(RecVar rv) + { + return this.recs.containsKey(rv); + } + + public Seq getRec(RecVar rv) + { + return this.recs.get(rv); + } + + public void popRec(RecVar rv) + { + this.recs.remove(rv); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GUnf.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GUnf.java new file mode 100644 index 000000000..c4a6d4669 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GUnf.java @@ -0,0 +1,18 @@ +package org.scribble.core.visit.global; + +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.session.Continue; +import org.scribble.core.type.session.global.GRecursion; +import org.scribble.core.type.session.global.GSeq; +import org.scribble.core.type.session.global.GType; +import org.scribble.core.visit.Unf; + +public class GUnf extends Unf +{ + + @Override + public GType visitContinue(Continue n) + { + return new GRecursion(n.getSource(), n.recvar, (GSeq) getRec(n.recvar)); + } +} From 7bb962a2a229f69252096fa3bb04a9d37af6bccb Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 15:48:57 +0100 Subject: [PATCH 209/539] Continued: refactoring core visitors. --- .../scribble/core/type/session/Choice.java | 2 +- .../scribble/core/type/session/Continue.java | 2 +- .../type/session/DirectedInteraction.java | 3 +- .../core/type/session/DisconnectAction.java | 3 +- .../org/scribble/core/type/session/Do.java | 2 +- .../scribble/core/type/session/Recursion.java | 2 +- .../org/scribble/core/type/session/SType.java | 7 +--- .../org/scribble/core/type/session/Seq.java | 2 +- .../core/type/session/local/LSkip.java | 2 +- .../org/scribble/core/visit/STypeVisitor.java | 35 +++++++++++++++---- .../java/org/scribble/core/visit/Unf.java | 3 +- .../org/scribble/core/visit/global/GUnf.java | 1 - 12 files changed, 39 insertions(+), 25 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java index 85f3bf235..a437c09f1 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java @@ -59,7 +59,7 @@ public Stream collect(Function, Stream> f) } @Override - public SType visitWith(STypeVisitor> v) + public SType visitWith(STypeVisitor v) { return v.visitChoice(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java index 9b0ae6144..0ae8c2ec0 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java @@ -54,7 +54,7 @@ public Stream collect(Function, Stream> f) } @Override - public SType visitWith(STypeVisitor> v) + public SType visitWith(STypeVisitor v) { return v.visitContinue(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java index 280d86aca..95900c619 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java @@ -22,7 +22,6 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeVisitor; @@ -56,7 +55,7 @@ public Stream collect(Function, Stream> f) } @Override - public SType visitWith(STypeVisitor> v) + public SType visitWith(STypeVisitor v) { return v.visitDirectedInteraction(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java index 658fd186a..7a2c0be44 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java @@ -24,7 +24,6 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeVisitor; @@ -54,7 +53,7 @@ public Stream collect(Function, Stream> f) } @Override - public SType visitWith(STypeVisitor> v) + public SType visitWith(STypeVisitor v) { return v.visitDisconnect(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java index d87d9fa80..737b974e8 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java @@ -64,7 +64,7 @@ public Stream collect(Function, Stream> f) } @Override - public SType visitWith(STypeVisitor> v) + public SType visitWith(STypeVisitor v) { return v.visitDo(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java index 1e3e9d9eb..1feeb1c45 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java @@ -52,7 +52,7 @@ public Stream collect(Function, Stream> f) } @Override - public SType visitWith(STypeVisitor> v) + public SType visitWith(STypeVisitor v) { return v.visitRecursion(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index 2d55d16b0..372cee49b 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -30,11 +30,6 @@ import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.STypeVisitor; -@FunctionalInterface -interface STypeVisitorFunction, N extends ProtocolName, R extends Stream> -{ - R f(SType n, STypeVisitor v); -} // B needed(?) to factor up several methods from G/L compounds to bases, e.g., getInlined and unfoldAllOnce // Generic works to "specialise" G/L subclasses (and works with immutable pattern) -- cf. not supported by contravariant method parameter subtyping for getters/setters @@ -46,7 +41,7 @@ public interface SType> // T = children, not always SType, e.g., Role -- CHECKME: shouldn't "visit" non STypes? //SType visit(Function, Stream> f); //SType visit(STypeVisitorFunction, Stream> f); - SType visitWith(STypeVisitor> v); + SType visitWith(STypeVisitor v); Set getRoles(); Set> getMessageIds(); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java index a75adec58..8f26a7694 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java @@ -55,7 +55,7 @@ public Stream collect(Function, Stream> f) } @Override - public B visitWith(STypeVisitor> v) + public B visitWith(STypeVisitor v) { @SuppressWarnings("unchecked") B cast = (B) this; // CHECKME: OK as long as G/LSeq specify themselves as B param diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java index ec67ebe02..725b1fec8 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java @@ -51,7 +51,7 @@ public Stream collect(Function, Stream> f) } @Override - public LSkip visitWith(STypeVisitor> v) + public LSkip visitWith(STypeVisitor v) { throw new RuntimeException("Unsupported for Skip: " + this); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java index 480c2e258..fbfa86509 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java @@ -4,7 +4,6 @@ import java.util.stream.Collectors; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.DirectedInteraction; @@ -14,8 +13,7 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; -public abstract class STypeVisitor, - N extends ProtocolName> +public abstract class STypeVisitor> { // SType return for extensibility/flexibility public SType visitContinue(Continue n) @@ -27,7 +25,7 @@ public SType visitContinue(Continue n) public SType visitChoice(Choice n) { List blocks = n.blocks.stream() - .map(x -> x.visitWith((STypeVisitor>) this)) // FIXME + .map(x -> x.visitWith((STypeVisitor) this)) // FIXME .collect(Collectors.toList()); return n.reconstruct(n.getSource(), n.subj, blocks); } @@ -52,7 +50,7 @@ public SType visitDo(Do n) public SType visitRecursion(Recursion n) { - B body = n.body.visitWith((STypeVisitor>) this); // FIXME + B body = n.body.visitWith((STypeVisitor) this); // FIXME return n.reconstruct(n.getSource(), n.recvar, body); } @@ -62,8 +60,33 @@ public SType visitRecursion(Recursion n) public B visitSeq(B n) { List> elems = n.elems.stream() - .map(x -> x.visitWith((STypeVisitor>) this)) // FIXME + .map(x -> x.visitWith((STypeVisitor) this)) // FIXME .collect(Collectors.toList()); return n.reconstruct(n.getSource(), elems); } } + + + + + + + + + + + + + + + + + + + + +/*@FunctionalInterface +interface STypeVisitorFunction, R extends Stream> +{ + R f(SType n, STypeVisitor v); +}*/ diff --git a/scribble-core/src/main/java/org/scribble/core/visit/Unf.java b/scribble-core/src/main/java/org/scribble/core/visit/Unf.java index b07b8a8cc..f60384b7f 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/Unf.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/Unf.java @@ -6,14 +6,13 @@ import java.util.Map; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; public abstract class Unf> - extends STypeVisitor> + extends STypeVisitor { private final Map> recs = new HashMap<>(); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GUnf.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GUnf.java index c4a6d4669..bc2d839a7 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GUnf.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GUnf.java @@ -9,7 +9,6 @@ public class GUnf extends Unf { - @Override public GType visitContinue(Continue n) { From 942a118ac58fd15d4ad965d6834379d23606bfd8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 18:01:42 +0100 Subject: [PATCH 210/539] Continued: refactoring core visitors. --- .../java/sessionapi/SessionApiGenerator.java | 7 +- .../StateChannelApiGenerator.java | 4 +- .../main/java/org/scribble/core/job/Job.java | 52 ++----- .../org/scribble/core/job/JobContext.java | 12 +- .../java/org/scribble/core/lang/Protocol.java | 18 +-- .../scribble/core/lang/global/GProtocol.java | 52 +++++-- .../scribble/core/lang/local/LProjection.java | 3 +- .../scribble/core/lang/local/LProtocol.java | 36 ++++- .../core/type/session/BasicInteraction.java | 49 +++--- .../scribble/core/type/session/Choice.java | 101 ++++++------ .../scribble/core/type/session/Continue.java | 66 ++++---- .../type/session/DirectedInteraction.java | 43 ++++-- .../core/type/session/DisconnectAction.java | 49 ++++-- .../org/scribble/core/type/session/Do.java | 85 +++++----- .../scribble/core/type/session/Recursion.java | 128 ++++++--------- .../org/scribble/core/type/session/SType.java | 50 +++--- .../org/scribble/core/type/session/Seq.java | 146 +++++++++--------- .../core/type/session/global/GChoice.java | 4 +- .../core/type/session/global/GConnect.java | 4 +- .../core/type/session/global/GContinue.java | 32 ++-- .../core/type/session/global/GDisconnect.java | 4 +- .../core/type/session/global/GDo.java | 62 ++++---- .../type/session/global/GMessageTransfer.java | 4 +- .../core/type/session/global/GRecursion.java | 4 +- .../core/type/session/global/GSeq.java | 4 +- .../core/type/session/global/GType.java | 4 +- .../core/type/session/local/LContinue.java | 28 ++-- .../scribble/core/type/session/local/LDo.java | 57 ++++--- .../core/type/session/local/LSkip.java | 79 +++++----- .../core/visit/MessageIdCollector.java | 2 +- .../scribble/core/visit/RecVarCollector.java | 13 +- .../scribble/core/visit/RoleCollector.java | 2 +- .../{STypeCollector.java => STypeGather.java} | 2 +- .../org/scribble/core/visit/STypeInliner.java | 86 +++++++++-- .../scribble/core/visit/STypeUnfolder.java | 52 +++++-- .../org/scribble/core/visit/STypeVisitor.java | 6 +- .../java/org/scribble/core/visit/Unf.java | 75 --------- .../global/{GUnf.java => GTypeUnfolder.java} | 4 +- .../{Projector2.java => Projector.java} | 4 +- 39 files changed, 769 insertions(+), 664 deletions(-) rename scribble-core/src/main/java/org/scribble/core/visit/{STypeCollector.java => STypeGather.java} (97%) mode change 100644 => 100755 scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java delete mode 100644 scribble-core/src/main/java/org/scribble/core/visit/Unf.java rename scribble-core/src/main/java/org/scribble/core/visit/global/{GUnf.java => GTypeUnfolder.java} (80%) rename scribble-core/src/main/java/org/scribble/core/visit/global/{Projector2.java => Projector.java} (96%) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index b47738026..971e8eb5c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -28,9 +28,12 @@ import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.core.lang.global.GProtocol; +import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.global.GSeq; +import org.scribble.core.visit.MessageIdCollector; import org.scribble.lang.Lang; import org.scribble.util.ScribException; @@ -187,7 +190,9 @@ private void constructOpClasses() throws ScribException gpd.accept(coll); for (MessageId mid : coll.getNames())*/ GProtocol inlined = this.job.getContext().getInlined(this.gpn); - for (MessageId mid : inlined.def.getMessageIds()) + for (MessageId mid : inlined.def + .gather(new MessageIdCollector()::visit) + .collect(Collectors.toList())) { //constructOpClass(this.cb.newClass(), mid); //constructOpClass(new ClassBuilder(), getEndpointApiRootPackageName(this.gpn), mid); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index ea89cb27e..406f2e465 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -29,7 +29,7 @@ import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.Role; -import org.scribble.core.visit.global.Projector2; +import org.scribble.core.visit.global.Projector; import org.scribble.lang.Lang; import org.scribble.util.ScribException; @@ -63,7 +63,7 @@ public StateChannelApiGenerator(Lang lang, GProtocolName fullname, Role self) super(lang, fullname); this.self = self; - this.lpn = Projector2.projectFullProtocolName(fullname, self); + this.lpn = Projector.projectFullProtocolName(fullname, self); //this.init = job.getContext().getEndpointGraph(fullname, self).init; JobContext jobc2 = this.job.getContext(); this.init = this.job.config.args.get(JobArgs.MIN_EFSM) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index ed4c3c2fb..be0bd6997 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -14,14 +14,12 @@ package org.scribble.core.job; import java.util.Collections; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; -import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.endpoint.EGraph; @@ -33,21 +31,17 @@ import org.scribble.core.model.global.SModelFactoryImpl; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.visit.RoleCollector; -import org.scribble.core.visit.STypeInliner; -import org.scribble.core.visit.STypeUnfolder; -import org.scribble.core.visit.global.Projector2; +import org.scribble.core.visit.global.GTypeInliner; +import org.scribble.core.visit.global.GTypeUnfolder; +import org.scribble.core.visit.global.Projector; import org.scribble.util.ScribException; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models @@ -141,28 +135,12 @@ public void runContextBuildingPasses() throws ScribException for (GProtocol g : this.context.getIntermediates()) { - List> params = new LinkedList<>(); - // Convert MemberName params to Args -- cf. NonRoleArgList::getParamKindArgs - for (MemberName n : g.params) - { - if (n instanceof DataType) - { - params.add((DataType) n); - } - else if (n instanceof MessageSigName) - { - params.add((MessageSigName) n); - } - else - { - throw new RuntimeException("TODO: " + n); - } - } - SubprotoSig sig = new SubprotoSig(g.fullname, g.roles, params); + /*SubprotoSig sig = new SubprotoSig(g.fullname, g.roles, params); //Deque stack = new LinkedList<>(); STypeInliner i = new STypeInliner(this); - i.pushSig(sig); // TODO: factor into constructor - GProtocol inlined = g.getInlined(i); // Protocol.getInlined does pruneRecs + i.pushSig(sig); // TODO: factor into constructor*/ + GTypeInliner v = new GTypeInliner(this); + GProtocol inlined = g.getInlined(v); // Protocol.getInlined does pruneRecs verbosePrintln("\nSubprotocols inlined:\n" + inlined); this.context.addInlined(g.fullname, inlined); } @@ -170,9 +148,10 @@ else if (n instanceof MessageSigName) //runUnfoldingPass(); for (GProtocol inlined : this.context.getInlined()) { - STypeUnfolder unf1 = new STypeUnfolder<>(); - //GTypeUnfolder unf2 = new GTypeUnfolder(); - GProtocol unf = (GProtocol) inlined.unfoldAllOnce(unf1);//.unfoldAllOnce(unf2); CHECKME: twice unfolding? instead of "unguarded"-unfolding? + //STypeUnfolder unf1 = new STypeUnfolder<>(); + ////GTypeUnfolder unf2 = new GTypeUnfolder(); + GTypeUnfolder v = new GTypeUnfolder(); + GProtocol unf = (GProtocol) inlined.unfoldAllOnce(v);//.unfoldAllOnce(unf2); CHECKME: twice unfolding? instead of "unguarded"-unfolding? verbosePrintln("\nAll recursions unfolded once:\n" + unf); } @@ -196,7 +175,7 @@ public void runValidationPasses() throws ScribException // CHECKME: relegate to "warning" ? -- some downsteam operations may depend on this though (e.g., graph building?) // Check unused roles Set used = inlined.def - .collect(new RoleCollector()::visit) + .gather(new RoleCollector()::visit) .collect(Collectors.toSet()); Set unused = this.context.getIntermediate(inlined.fullname).roles // imeds have original role decls (inlined's are pruned) @@ -211,9 +190,10 @@ public void runValidationPasses() throws ScribException { continue; } - STypeUnfolder u = new STypeUnfolder<>(); + //STypeUnfolder u = new STypeUnfolder<>(); + GTypeUnfolder v = new GTypeUnfolder(); //e.g., C->D captured under an A->B choice after unfolding, cf. bad.wfchoice.enabling.twoparty.Test01b; - inlined.unfoldAllOnce(u).checkRoleEnabling(); + inlined.unfoldAllOnce(v).checkRoleEnabling(); inlined.checkExtChoiceConsistency(); } @@ -294,7 +274,7 @@ protected void runProjectionPasses() throws ScribException { for (Role self : g.roles) { - LProtocol proj = g.project(new Projector2(this, self)); // Does pruneRecs + LProtocol proj = g.project(new Projector(this, self)); // Does pruneRecs this.context.addProjection(proj); verbosePrintln("\nProjected onto " + self + ":\n" + proj); } diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java index e480207f6..2e9920fdb 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java @@ -31,7 +31,7 @@ import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.Role; -import org.scribble.core.visit.global.Projector2; +import org.scribble.core.visit.global.Projector; import org.scribble.util.ScribException; import org.scribble.util.ScribUtil; @@ -137,7 +137,7 @@ public void addInlinedProjection(LProtocolName fullname, LProtocol l) // Projected from inlined public LProtocol getInlinedProjection(GProtocolName fullname, Role self) { - LProtocolName p = Projector2.projectFullProtocolName(fullname, self); + LProtocolName p = Projector.projectFullProtocolName(fullname, self); return getInlinedProjection(p); } @@ -164,7 +164,7 @@ public void addProjection(LProtocol p) LProtocol getProjection(GProtocolName fullname, Role role) throws ScribException { - return getProjection(Projector2.projectFullProtocolName(fullname, role)); + return getProjection(Projector.projectFullProtocolName(fullname, role)); } public //Module @@ -192,7 +192,7 @@ protected void addEGraph(LProtocolName fullname, EGraph graph) public EGraph getEGraph(GProtocolName fullname, Role role) throws ScribException { - LProtocolName fulllpn = Projector2.projectFullProtocolName(fullname, role); + LProtocolName fulllpn = Projector.projectFullProtocolName(fullname, role); // Moved form LProtocolDecl EGraph graph = this.fEGraphs.get(fulllpn); if (graph == null) @@ -214,7 +214,7 @@ protected void addUnfairEGraph(LProtocolName fullname, EGraph graph) public EGraph getUnfairEGraph(GProtocolName fullname, Role role) throws ScribException { - LProtocolName fulllpn = Projector2.projectFullProtocolName(fullname, role); + LProtocolName fulllpn = Projector.projectFullProtocolName(fullname, role); EGraph unfair = this.uEGraphs.get(fulllpn); if (unfair == null) @@ -295,7 +295,7 @@ protected void addMinimisedEGraph(LProtocolName fullname, EGraph graph) public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) throws ScribException { - LProtocolName fulllpn = Projector2.projectFullProtocolName(fullname, role); + LProtocolName fulllpn = Projector.projectFullProtocolName(fullname, role); EGraph minimised = this.mEGraphs.get(fulllpn); if (minimised == null) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java index 78ad10051..fb0edb7ef 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java @@ -68,20 +68,10 @@ public boolean isExplicit() return this.mods.contains(ProtocolMod.EXPLICIT); } - /*@Override - public List> getProtoDependencies() - { - return this.def.getProtoDependencies(); - } - - @Override - public List> getNonProtoDependencies() - { - return this.def.getNonProtoDependencies(); - }*/ - - public abstract Protocol getInlined(STypeInliner v); - public abstract Protocol unfoldAllOnce(STypeUnfolder u); + //public abstract Protocol getInlined(STypeInliner v); + //public abstract Protocol unfoldAllOnce(STypeUnfolder u); + public abstract Protocol getInlined(STypeInliner v); + public abstract Protocol unfoldAllOnce(STypeUnfolder v); public boolean hasSource() // i.e., was parsed { diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 50b54a9e8..153e8add3 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -39,22 +39,24 @@ import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; +import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.global.GRecursion; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.MessageIdCollector; import org.scribble.core.visit.RoleCollector; -import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; -import org.scribble.core.visit.global.GUnf; -import org.scribble.core.visit.global.Projector2; +import org.scribble.core.visit.global.Projector; import org.scribble.util.ScribException; import org.scribble.util.ScribUtil; @@ -79,19 +81,38 @@ public GProtocol reconstruct(CommonTree source, // Pre: stack.peek is the sig for the calling Do (or top-level entry) // i.e., it gives the roles/args at the call-site @Override - public GProtocol getInlined(STypeInliner v) + public GProtocol getInlined(STypeInliner v) { - SubprotoSig sig = v.peek(); + // TODO: factor out with LProtocol + List> params = new LinkedList<>(); + // Convert MemberName params to Args -- cf. NonRoleArgList::getParamKindArgs + for (MemberName n : this.params) + { + if (n instanceof DataType) + { + params.add((DataType) n); + } + else if (n instanceof MessageSigName) + { + params.add((MessageSigName) n); + } + else + { + throw new RuntimeException("TODO: " + n); + } + } + SubprotoSig sig = new SubprotoSig(this.fullname, this.roles, params); + v.pushSig(sig); + Substitutions subs = new Substitutions(this.roles, sig.roles, this.params, sig.args); - GSeq body = this.def.substitute(subs).getInlined(v).pruneRecs(); + GSeq body = this.def.substitute(subs).visitWith(v).pruneRecs(); RecVar rv = v.getInlinedRecVar(sig); GRecursion rec = new GRecursion(null, rv, body); // CHECKME: or protodecl source? CommonTree source = getSource(); GSeq def = new GSeq(null, Stream.of(rec).collect(Collectors.toList())); - Set used = //def.getRoles(); - def.collect(new RoleCollector()::visit) - .collect(Collectors.toSet()); + Set used = def.gather(new RoleCollector()::visit) + .collect(Collectors.toSet()); List rs = this.roles.stream().filter(x -> used.contains(x)) // Prune role decls .collect(Collectors.toList()); return new GProtocol(source, this.mods, this.fullname, rs, @@ -99,10 +120,9 @@ public GProtocol getInlined(STypeInliner v) } @Override - public GProtocol unfoldAllOnce(STypeUnfolder u) + public GProtocol unfoldAllOnce(STypeUnfolder v) { - GSeq unf = (GSeq) //this.def.unfoldAllOnce(u); - this.def.visitWith(new GUnf()); + GSeq unf = (GSeq) this.def.visitWith(v); return reconstruct(getSource(), this.mods, this.fullname, this.roles, this.params, unf); } @@ -130,10 +150,10 @@ public LProjection projectInlined(Role self) private LProjection projectAux(Role self, List decls, LSeq body) { - LProtocolName fullname = Projector2 + LProtocolName fullname = Projector .projectFullProtocolName(this.fullname, self); Set tmp = //body.getRoles(); - body.collect(new RoleCollector()::visit) + body.gather(new RoleCollector()::visit) .collect(Collectors.toSet()); List roles = decls.stream() .filter(x -> x.equals(self) || tmp.contains(x)) // Implicitly filters Role.SELF @@ -144,7 +164,7 @@ private LProjection projectAux(Role self, List decls, LSeq body) body); } - public LProjection project(Projector2 v) + public LProjection project(Projector v) { LSeq body = (LSeq) this.def.project(v).pruneRecs(); return projectAux(v.self, @@ -221,7 +241,7 @@ public static void validateBySpin(Job job2, GProtocolName fullname) gpd.accept(coll); Set> mids = coll.getNames();*/ Set> mids = gpd.def.//getMessageIds(); - collect(new MessageIdCollector()::visit) + gather(new MessageIdCollector()::visit) .collect(Collectors.toSet()); //..........FIXME: get mids from SType, instead of old AST Collector diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java index 7919e7c02..fd3527e13 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java @@ -18,6 +18,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.lang.ProtocolMod; +import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.LProtocolName; @@ -60,7 +61,7 @@ public LType substitute(Substitutions subs) // Pre: stack.peek is the sig for the calling Do (or top-level entry) // i.e., it gives the roles/args at the call-site @Override - public LProjection getInlined(STypeInliner v) + public LProjection getInlined(STypeInliner v) { throw new RuntimeException("[TODO]: " + this); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index db216f6d7..9542dacea 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -14,6 +14,7 @@ package org.scribble.core.lang.local; import java.util.Collections; +import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -28,15 +29,19 @@ import org.scribble.core.model.endpoint.EState; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; +import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.local.LRecursion; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; +import org.scribble.core.visit.local.LTypeInliner; import org.scribble.core.visit.local.ReachabilityEnv; import org.scribble.util.Constants; import org.scribble.util.ScribException; @@ -65,12 +70,33 @@ public LProtocol reconstruct(CommonTree source, // Pre: stack.peek is the sig for the calling Do (or top-level entry) // i.e., it gives the roles/args at the call-site @Override - public LProtocol getInlined(STypeInliner v)//, Deque stack) + public LProtocol getInlined(STypeInliner v) { - SubprotoSig sig = v.peek(); + // TODO: factor out with GProtocol + List> params = new LinkedList<>(); + // Convert MemberName params to Args -- cf. NonRoleArgList::getParamKindArgs + for (MemberName n : this.params) + { + if (n instanceof DataType) + { + params.add((DataType) n); + } + else if (n instanceof MessageSigName) + { + params.add((MessageSigName) n); + } + else + { + throw new RuntimeException("TODO: " + n); + } + } + SubprotoSig sig = new SubprotoSig(this.fullname, this.roles, params); + v.pushSig(sig); + Substitutions subs = new Substitutions(this.roles, sig.roles, this.params, sig.args); - LSeq body = this.def.substitute(subs).getInlined(v).pruneRecs(); + LTypeInliner linl = new LTypeInliner(v.job); + LSeq body = this.def.substitute(subs).visitWith(linl).pruneRecs(); RecVar rv = v.getInlinedRecVar(sig); LRecursion rec = new LRecursion(null, rv, body); // CHECKME: or protodecl source? CommonTree source = getSource(); // CHECKME: or null source? @@ -80,9 +106,9 @@ public LProtocol getInlined(STypeInliner v)//, Deque stack) } @Override - public LProtocol unfoldAllOnce(STypeUnfolder u) + public LProtocol unfoldAllOnce(STypeUnfolder v) { - LSeq unf = (LSeq) this.def.unfoldAllOnce(u); + LSeq unf = (LSeq) this.def.visitWith(v); return reconstruct(getSource(), this.mods, this.fullname, this.roles, this.self, this.params, unf); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java index e7cb8d598..03422e1a4 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java @@ -15,14 +15,10 @@ import java.util.Collections; import java.util.List; -import java.util.Set; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.ProtocolName; -import org.scribble.core.type.name.RecVar; -import org.scribble.core.visit.STypeInliner; -import org.scribble.core.visit.STypeUnfolder; public abstract class BasicInteraction> extends STypeBase implements SType @@ -31,12 +27,6 @@ public BasicInteraction(CommonTree source) { super(source); } - - @Override - public Set getRecVars() - { - return Collections.emptySet(); - } @Override public BasicInteraction pruneRecs() @@ -45,26 +35,43 @@ public BasicInteraction pruneRecs() } @Override - public BasicInteraction getInlined(STypeInliner v) + public List> getProtoDependencies() { - return this; + return Collections.emptyList(); } - + @Override - public BasicInteraction unfoldAllOnce(STypeUnfolder u) + public CommonTree getSource() { - return this; + return (CommonTree) super.getSource(); } + + + + + + + + + + + - @Override - public List> getProtoDependencies() + /*@Override + public Set getRecVars() { - return Collections.emptyList(); + return Collections.emptySet(); } - + @Override - public CommonTree getSource() + public BasicInteraction getInlined(STypeInliner v) { - return (CommonTree) super.getSource(); + return this; } + + @Override + public BasicInteraction unfoldAllOnce(STypeUnfolder u) + { + return this; + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java index a437c09f1..85ad23aee 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java @@ -15,7 +15,6 @@ import java.util.Collections; import java.util.List; -import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -23,13 +22,9 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.ProtocolName; -import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; -import org.scribble.core.visit.STypeInliner; -import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.STypeVisitor; public abstract class Choice> @@ -52,10 +47,10 @@ public abstract Choice reconstruct(CommonTree source, Role subj, //List> blocks); @Override - public Stream collect(Function, Stream> f) + public Stream gather(Function, Stream> f) { return Stream.concat(f.apply(this), - this.blocks.stream().flatMap(x -> x.collect(f))); + this.blocks.stream().flatMap(x -> x.gather(f))); } @Override @@ -63,14 +58,6 @@ public SType visitWith(STypeVisitor v) { return v.visitChoice(this); } - - @Override - public Set getRoles() - { - Set res = Stream.of(this.subj).collect(Collectors.toSet()); - this.blocks.forEach(x -> res.addAll(x.getRoles())); - return res; - } @Override public Choice substitute(Substitutions subs) @@ -88,38 +75,6 @@ public Choice pruneRecs() return reconstruct(getSource(), this.subj, blocks); } - @Override - public Set> getMessageIds() - { - return this.blocks.stream().flatMap(x -> x.getMessageIds().stream()) - .collect(Collectors.toSet()); - } - - @Override - public Set getRecVars() - { - return this.blocks.stream().flatMap(x -> x.getRecVars().stream()) - .collect(Collectors.toSet()); - } - - @Override - public Choice getInlined(STypeInliner v) - { - CommonTree source = getSource(); // CHECKME: or empty source? - List blocks = this.blocks.stream().map(x -> x.getInlined(v)) - .collect(Collectors.toList()); - return reconstruct(source, this.subj, blocks); - } - - @Override - public Choice unfoldAllOnce(STypeUnfolder u) - { - CommonTree source = getSource(); // CHECKME: or empty source? - List blocks = this.blocks.stream().map(x -> x.unfoldAllOnce(u)) - .collect(Collectors.toList()); - return reconstruct(source, this.subj, blocks); - } - @Override public List> getProtoDependencies() { @@ -170,4 +125,56 @@ public boolean equals(Object o) return super.equals(this) // Does canEquals && this.subj.equals(them.subj) && this.blocks.equals(them.blocks); } + + + + + + + + + + + + + + /*@Override + public Set getRoles() + { + Set res = Stream.of(this.subj).collect(Collectors.toSet()); + this.blocks.forEach(x -> res.addAll(x.getRoles())); + return res; + } + + @Override + public Set> getMessageIds() + { + return this.blocks.stream().flatMap(x -> x.getMessageIds().stream()) + .collect(Collectors.toSet()); + } + + @Override + public Set getRecVars() + { + return this.blocks.stream().flatMap(x -> x.getRecVars().stream()) + .collect(Collectors.toSet()); + } + + @Override + public Choice getInlined(STypeInliner v) + { + CommonTree source = getSource(); // CHECKME: or empty source? + List blocks = this.blocks.stream().map(x -> x.getInlined(v)) + .collect(Collectors.toList()); + return reconstruct(source, this.subj, blocks); + } + + @Override + public Choice unfoldAllOnce(STypeUnfolder u) + { + CommonTree source = getSource(); // CHECKME: or empty source? + List blocks = this.blocks.stream().map(x -> x.unfoldAllOnce(u)) + .collect(Collectors.toList()); + return reconstruct(source, this.subj, blocks); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java index 0ae8c2ec0..4683b4eb3 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java @@ -15,20 +15,15 @@ import java.util.Collections; import java.util.List; -import java.util.Set; import java.util.function.Function; -import java.util.stream.Collectors; import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; -import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeVisitor; public abstract class Continue> @@ -48,7 +43,7 @@ public abstract Continue reconstruct( CommonTree source, RecVar recvar); @Override - public Stream collect(Function, Stream> f) + public Stream gather(Function, Stream> f) { return f.apply(this); } @@ -58,24 +53,6 @@ public SType visitWith(STypeVisitor v) { return v.visitContinue(this); } - - @Override - public Set getRoles() - { - return Collections.emptySet(); - } - - @Override - public Set> getMessageIds() - { - return Collections.emptySet(); - } - - @Override - public Set getRecVars() - { - return Stream.of(this.recvar).collect(Collectors.toSet()); - } @Override public List> getProtoDependencies() @@ -103,13 +80,6 @@ public Continue pruneRecs() return this; } - @Override - public Continue getInlined(STypeInliner v) - { - RecVar rv = v.getInlinedRecVar(this.recvar); - return reconstruct(getSource(), rv); - } - @Override public String toString() { @@ -140,4 +110,38 @@ public boolean equals(Object o) return super.equals(this) // Does canEquals && this.recvar.equals(them.recvar); } + + + + + + + + + + + /*@Override + public Set getRoles() + { + return Collections.emptySet(); + } + + @Override + public Set> getMessageIds() + { + return Collections.emptySet(); + } + + @Override + public Set getRecVars() + { + return Stream.of(this.recvar).collect(Collectors.toSet()); + } + + @Override + public Continue getInlined(STypeInliner v) + { + RecVar rv = v.getInlinedRecVar(this.recvar); + return reconstruct(getSource(), rv); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java index 95900c619..5b87f145b 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java @@ -13,15 +13,12 @@ */ package org.scribble.core.type.session; -import java.util.Set; import java.util.function.Function; -import java.util.stream.Collectors; import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeVisitor; @@ -49,7 +46,7 @@ public abstract DirectedInteraction reconstruct( Role dst); @Override - public Stream collect(Function, Stream> f) + public Stream gather(Function, Stream> f) { return f.apply(this); } @@ -59,19 +56,6 @@ public SType visitWith(STypeVisitor v) { return v.visitDirectedInteraction(this); } - - @Override - public Set getRoles() - { - // Includes self - return Stream.of(this.src, this.dst).collect(Collectors.toSet()); - } - - @Override - public Set> getMessageIds() - { - return Stream.of(this.msg.getId()).collect(Collectors.toSet()); - } @Override public DirectedInteraction substitute(Substitutions subs) @@ -122,4 +106,29 @@ public boolean equals(Object o) && this.msg.equals(them.msg) && this.src.equals(them.src) && this.dst.equals(them.dst); } + + + + + + + + + + + + + + /*@Override + public Set getRoles() + { + // Includes self + return Stream.of(this.src, this.dst).collect(Collectors.toSet()); + } + + @Override + public Set> getMessageIds() + { + return Stream.of(this.msg.getId()).collect(Collectors.toSet()); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java index 7a2c0be44..d91a3d117 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java @@ -15,15 +15,12 @@ import java.util.Collections; import java.util.List; -import java.util.Set; import java.util.function.Function; -import java.util.stream.Collectors; import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeVisitor; @@ -47,7 +44,7 @@ public abstract DisconnectAction reconstruct( CommonTree source, Role src, Role dst); @Override - public Stream collect(Function, Stream> f) + public Stream gather(Function, Stream> f) { return f.apply(this); } @@ -58,19 +55,6 @@ public SType visitWith(STypeVisitor v) return v.visitDisconnect(this); } - @Override - public Set getRoles() - { - // Includes self - return Stream.of(this.left, this.right).collect(Collectors.toSet()); - } - - @Override - public Set> getMessageIds() - { - return Collections.emptySet(); - } - @Override public DisconnectAction substitute(Substitutions subs) { @@ -109,4 +93,35 @@ public boolean equals(Object o) return super.equals(this) // Does canEquals && this.left.equals(them.left) && this.right.equals(them.right); } + + + + + + + + + + + + + + + + + + + /*@Override + public Set getRoles() + { + // Includes self + return Stream.of(this.left, this.right).collect(Collectors.toSet()); + } + + @Override + public Set> getMessageIds() + { + return Collections.emptySet(); + }*/ + } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java index 737b974e8..924eee8bc 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java @@ -14,10 +14,8 @@ package org.scribble.core.type.session; import java.util.Collections; -import java.util.HashSet; import java.util.LinkedList; import java.util.List; -import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -27,13 +25,10 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.ProtocolName; -import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; -import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.STypeVisitor; public abstract class Do @@ -58,7 +53,7 @@ public abstract Do reconstruct(CommonTree source, N proto, List roles, List> args); @Override - public Stream collect(Function, Stream> f) + public Stream gather(Function, Stream> f) { return f.apply(this); } @@ -69,32 +64,6 @@ public SType visitWith(STypeVisitor v) return v.visitDo(this); } - @Override - public Set getRoles() - { - return this.roles.stream().collect(Collectors.toSet()); - } - - @Override - public Set> getMessageIds() - { - Set> mids = new HashSet<>(); - for (Arg a : this.args) - { - if (a instanceof Message) - { - mids.add(((Message) a).getId()); - } - } - return mids; - } - - @Override - public Set getRecVars() - { - return Collections.emptySet(); - } - @Override public List> getProtoDependencies() { @@ -138,12 +107,6 @@ public Do pruneRecs() { return this; } - - @Override - public SType unfoldAllOnce(STypeUnfolder u) - { - throw new RuntimeException("Unsupported for Do: " + this); - } @Override public String toString() @@ -185,4 +148,50 @@ public boolean equals(Object o) && this.proto.equals(them.proto) && this.roles.equals(them.roles) && this.args.equals(them.args); } + + + + + + + + + + + + + + + /*@Override + public Set getRoles() + { + return this.roles.stream().collect(Collectors.toSet()); + } + + @Override + public Set> getMessageIds() + { + Set> mids = new HashSet<>(); + for (Arg a : this.args) + { + if (a instanceof Message) + { + mids.add(((Message) a).getId()); + } + } + return mids; + } + + @Override + public Set getRecVars() + { + return Collections.emptySet(); + } + + @Override + public SType unfoldAllOnce(STypeUnfolder u) + { + throw new RuntimeException("Unsupported for Do: " + this); + } + */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java index 1feeb1c45..de35bedac 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java @@ -16,18 +16,16 @@ import java.util.List; import java.util.Set; import java.util.function.Function; +import java.util.stream.Collectors; import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; -import org.scribble.core.visit.STypeInliner; -import org.scribble.core.visit.STypeUnfolder; +import org.scribble.core.visit.RecVarCollector; import org.scribble.core.visit.STypeVisitor; public abstract class Recursion> @@ -46,9 +44,9 @@ public Recursion(//org.scribble.ast.Recursion source, } @Override - public Stream collect(Function, Stream> f) + public Stream gather(Function, Stream> f) { - return Stream.concat(f.apply(this), this.body.collect(f)); + return Stream.concat(f.apply(this), this.body.gather(f)); } @Override @@ -60,92 +58,23 @@ public SType visitWith(STypeVisitor v) public abstract Recursion reconstruct( CommonTree source, RecVar recvar, B body); - @Override - public Set getRoles() - { - return this.body.getRoles(); - } - - @Override - public Set> getMessageIds() - { - return this.body.getMessageIds(); - } - @Override public Recursion substitute(Substitutions subs) { return reconstruct(getSource(), this.recvar, this.body.substitute(subs)); } - @Override - public Set getRecVars() - { - return this.body.getRecVars(); - } - @Override public SType pruneRecs() { // Assumes no shadowing (e.g., use after SType#getInlined recvar disamb) - return this.body.getRecVars().contains(this.recvar) + Set rvs = this.body.gather(new RecVarCollector()::visit) + .collect(Collectors.toSet()); + return rvs.contains(this.recvar) ? this : this.body; // i.e., return a Seq, to be "inlined" by Seq.pruneRecs -- N.B. must handle empty Seq case } - @Override - public Recursion getInlined(STypeInliner v) - { - CommonTree source = getSource(); // CHECKME: or empty source? - RecVar rv = v.enterRec(//stack.peek(), - this.recvar); // FIXME: make GTypeInliner, and record recvars to check freshness (e.g., rec X in two choice cases) - B body = this.body.getInlined(v);//, stack); - Recursion res = reconstruct(source, rv, body); - v.exitRec(this.recvar); - return res; - } - - @Override - public SType unfoldAllOnce(STypeUnfolder u) - { - if (!u.hasRec(this.recvar)) // N.B. doesn't work if recvars shadowed - { - u.pushRec(this.recvar, this.body); - SType unf = this.body.unfoldAllOnce(u); - u.popRec(this.recvar); - // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs - return unf; - } - return this; - } - - /* // CHECKME: try adding B to Seq - Override - public Recursion getInlined(STypeInliner v) - { - CommonTree source = getSource(); // CHECKME: or empty source? - RecVar rv = i.enterRec(//stack.peek(), - this.recvar); // FIXME: make GTypeInliner, and record recvars to check freshness (e.g., rec X in two choice cases) - B body = this.body.getInlined(v); - Recursion res = reconstruct(source, rv, body); - i.exitRec(this.recvar); - return res; - } - - @Override - public GType unfoldAllOnce(STypeUnfolder u) - { - if (!u.hasRec(this.recvar)) // N.B. doesn't work if recvars shadowed - { - u.pushRec(this.recvar, this.body); - GType unf = (GType) this.body.unfoldAllOnce(u); - u.popRec(this.recvar); - // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs - return unf; - } - return this; - }*/ - @Override public List> getProtoDependencies() { @@ -189,4 +118,47 @@ public boolean equals(Object o) return super.equals(this) // Does canEquals && this.recvar.equals(them.recvar) && this.body.equals(them.body); } + + + + + + + + + + + + /*@Override + public Set getRoles() + { + return this.body.getRoles(); + } + + @Override + public Set> getMessageIds() + { + return this.body.getMessageIds(); + } + + @Override + public Set getRecVars() + { + return this.body.getRecVars(); + } + + + @Override + public SType unfoldAllOnce(STypeUnfolder u) + { + if (!u.hasRec(this.recvar)) // N.B. doesn't work if recvars shadowed + { + u.pushRec(this.recvar, this.body); + SType unf = this.body.unfoldAllOnce(u); + u.popRec(this.recvar); + // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs + return unf; + } + return this; + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index 372cee49b..d6744078a 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -14,20 +14,14 @@ package org.scribble.core.type.session; import java.util.List; -import java.util.Set; import java.util.function.Function; import java.util.stream.Stream; import org.scribble.core.lang.SNode; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.ProtocolName; -import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; -import org.scribble.core.visit.STypeInliner; -import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.STypeVisitor; @@ -36,28 +30,14 @@ public interface SType> extends SNode { - Stream collect(Function, Stream> f); + Stream gather(Function, Stream> f); - // T = children, not always SType, e.g., Role -- CHECKME: shouldn't "visit" non STypes? - //SType visit(Function, Stream> f); - //SType visit(STypeVisitorFunction, Stream> f); SType visitWith(STypeVisitor v); - Set getRoles(); - Set> getMessageIds(); - SType substitute(Substitutions subs); - Set getRecVars(); // Gets Continue RecVars (not Recursion) SType pruneRecs(); // Assumes no shadowing (e.g., use after inlining recvar disamb) - - // CHECKME: OK to (re-)use GTypeTranslator for inlining? - SType getInlined(STypeInliner i); - - // Unsupported for Do - // CHECKME: repeat recvar names OK? including non-shadowing (e.g., choice cases) - SType unfoldAllOnce(STypeUnfolder u); - + // Resulting Lists should not contain duplicates (i.e., Choice/Seq) // Result does not necessarily contain root proto (protodecl is not an SType), but may do so via dependencies List> getProtoDependencies(); @@ -65,4 +45,30 @@ public interface SType> // subclass equals should call this by: them.canEquals(this) boolean canEquals(Object o); + + + + + + + + + + + + + + + + /*Set getRoles(); + Set> getMessageIds(); + Set getRecVars(); // Gets Continue RecVars (not Recursion) + + // CHECKME: OK to (re-)use GTypeTranslator for inlining? + SType + getInlined(STypeInliner i); + + // Unsupported for Do + // CHECKME: repeat recvar names OK? including non-shadowing (e.g., choice cases) + SType unfoldAllOnce(STypeUnfolder u);*/ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java index 8f26a7694..72ac771d5 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java @@ -16,7 +16,6 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; -import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -24,13 +23,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.ProtocolName; -import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; -import org.scribble.core.visit.STypeInliner; -import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.STypeVisitor; public abstract class Seq> @@ -49,9 +43,9 @@ public abstract B reconstruct(CommonTree source, List> elems); @Override - public Stream collect(Function, Stream> f) + public Stream gather(Function, Stream> f) { - return this.elems.stream().flatMap(x -> x.collect(f)); + return this.elems.stream().flatMap(x -> x.gather(f)); } @Override @@ -62,27 +56,6 @@ public B visitWith(STypeVisitor v) return v.visitSeq(cast); } - @Override - public Set getRoles() - { - return this.elems.stream().flatMap(x -> x.getRoles().stream()) - .collect(Collectors.toSet()); - } - - @Override - public Set> getMessageIds() - { - return this.elems.stream().flatMap(x -> x.getMessageIds().stream()) - .collect(Collectors.toSet()); - } - - @Override - public Set getRecVars() - { - return this.elems.stream().flatMap(x -> x.getRecVars().stream()) - .collect(Collectors.toSet()); - } - @Override public B pruneRecs() { @@ -109,46 +82,6 @@ public B substitute(Substitutions subs) .map(x -> x.substitute(subs)).collect(Collectors.toList()); return reconstruct(getSource(), elems); } - - @Override - public B getInlined(STypeInliner v) - { - CommonTree source = getSource(); // CHECKME: or empty source? - List> elems = new LinkedList<>(); - for (SType e : this.elems) - { - SType e1 = e.getInlined(v); - if (e1 instanceof Seq) - { - elems.addAll(((Seq) e1).elems); // Inline Seq's returned by Do.getInlined - } - else - { - elems.add(e1); - } - } - return reconstruct(source, elems); - } - - @Override - public B unfoldAllOnce(STypeUnfolder u) - { - CommonTree source = getSource(); - List> elems = new LinkedList<>(); - for (SType e : this.elems) - { - SType e1 = e.unfoldAllOnce(u); - if (e1 instanceof Seq) - { - elems.addAll(((Seq) e1).elems); - } - else - { - elems.add(e1); - } - } - return reconstruct(source, elems); - } @Override public List> getProtoDependencies() @@ -204,4 +137,79 @@ public boolean equals(Object o) return super.equals(this) // Does canEquals && this.elems.equals(them.elems); } + + + + + + + + + + + + + + + /*@Override + public Set getRoles() + { + return this.elems.stream().flatMap(x -> x.getRoles().stream()) + .collect(Collectors.toSet()); + } + + @Override + public Set> getMessageIds() + { + return this.elems.stream().flatMap(x -> x.getMessageIds().stream()) + .collect(Collectors.toSet()); + } + + @Override + public Set getRecVars() + { + return this.elems.stream().flatMap(x -> x.getRecVars().stream()) + .collect(Collectors.toSet()); + } + + @Override + public B getInlined(STypeInliner v) + { + CommonTree source = getSource(); // CHECKME: or empty source? + List> elems = new LinkedList<>(); + for (SType e : this.elems) + { + SType e1 = e.getInlined(v); + if (e1 instanceof Seq) + { + elems.addAll(((Seq) e1).elems); // Inline Seq's returned by Do.getInlined + } + else + { + elems.add(e1); + } + } + return reconstruct(source, elems); + } + + @Override + public B unfoldAllOnce(STypeUnfolder u) + { + CommonTree source = getSource(); + List> elems = new LinkedList<>(); + for (SType e : this.elems) + { + SType e1 = e.unfoldAllOnce(u); + if (e1 instanceof Seq) + { + elems.addAll(((Seq) e1).elems); + } + else + { + elems.add(e1); + } + } + return reconstruct(source, elems); + } + */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java index 267445a91..2f604edf7 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java @@ -32,7 +32,7 @@ import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.Projector2; +import org.scribble.core.visit.global.Projector; import org.scribble.util.ScribException; public class GChoice extends Choice implements GType @@ -87,7 +87,7 @@ private LType projectAux(Role self, Stream blocks) } @Override - public LType project(Projector2 v) + public LType project(Projector v) { return projectAux(v.self, this.blocks.stream().map(x -> x.project(v))); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java index f9de5ceeb..25cf2930e 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java @@ -28,7 +28,7 @@ import org.scribble.core.type.session.local.LReq; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.Projector2; +import org.scribble.core.visit.global.Projector; import org.scribble.util.ScribException; public class GConnect extends ConnectAction @@ -71,7 +71,7 @@ else if (this.dst.equals(self)) } @Override - public LType project(Projector2 v) + public LType project(Projector v) { return projectInlined(v.self); // No need for "aux", no recursive call } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java index 0f6da3c5d..0546786f4 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java @@ -22,8 +22,7 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.local.LContinue; -import org.scribble.core.visit.STypeUnfolder; -import org.scribble.core.visit.global.Projector2; +import org.scribble.core.visit.global.Projector; import org.scribble.util.ScribException; public class GContinue extends Continue implements GType @@ -42,14 +41,6 @@ public GContinue reconstruct(CommonTree source, return new GContinue(source, recvar); } - @Override - public GRecursion unfoldAllOnce(STypeUnfolder u) - { - return new GRecursion(getSource(), this.recvar, - (GSeq) u.getRec(this.recvar)); - // CHECKME: Continue (not Recursion) as the source of the unfolding ? - } - @Override public LContinue projectInlined(Role self) { @@ -57,7 +48,7 @@ public LContinue projectInlined(Role self) } @Override - public LContinue project(Projector2 v) + public LContinue project(Projector v) { return projectInlined(v.self); // No need for "aux", no recursive call } @@ -102,4 +93,23 @@ public boolean canEquals(Object o) { return o instanceof GContinue; } + + + + + + + + + + + + + /*@Override + public GRecursion unfoldAllOnce(STypeUnfolder u) + { + return new GRecursion(getSource(), this.recvar, + (GSeq) u.getRec(this.recvar)); + // CHECKME: Continue (not Recursion) as the source of the unfolding ? + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java index d7939bfc6..20c64c482 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java @@ -23,7 +23,7 @@ import org.scribble.core.type.session.local.LDisconnect; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.Projector2; +import org.scribble.core.visit.global.Projector; import org.scribble.util.ScribException; public class GDisconnect extends DisconnectAction @@ -65,7 +65,7 @@ else if (this.right.equals(self)) } @Override - public LType project(Projector2 v) + public LType project(Projector v) { return projectInlined(v.self); // No need for "aux", no recursive call } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java index 5a49ab238..f0410cabe 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java @@ -21,13 +21,11 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.job.JobContext; -import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.LProtocolName; -import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; import org.scribble.core.type.session.Arg; @@ -35,8 +33,7 @@ import org.scribble.core.type.session.local.LDo; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.STypeInliner; -import org.scribble.core.visit.global.Projector2; +import org.scribble.core.visit.global.Projector; import org.scribble.util.ScribException; public class GDo extends Do implements GType @@ -55,27 +52,6 @@ public GDo reconstruct(CommonTree source, return new GDo(source, proto, roles, args); } - // CHECKME: factor up to base? - @Override - public GType getInlined(STypeInliner v) - { - GProtocolName fullname = this.proto; - SubprotoSig sig = new SubprotoSig(fullname, this.roles, this.args); - RecVar rv = v.getInlinedRecVar(sig); - if (v.hasSig(sig)) - { - return new GContinue(getSource(), rv); - } - v.pushSig(sig); - GProtocol g = v.job.getContext().getIntermediate(fullname); - Substitutions subs = - new Substitutions(g.roles, this.roles, g.params, this.args); - GSeq inlined = g.def.substitute(subs).getInlined(v);//, stack); - // i.e. returning a GSeq -- rely on parent GSeq to inline - v.popSig(); - return new GRecursion(null, rv, inlined); - } - @Override public LType projectInlined(Role self) { @@ -83,7 +59,7 @@ public LType projectInlined(Role self) } @Override - public LType project(Projector2 v) + public LType project(Projector v) { if (!this.roles.contains(v.self)) { @@ -101,7 +77,7 @@ public LType project(Projector2 v) return LSkip.SKIP; } - LProtocolName fullname = Projector2.projectFullProtocolName(this.proto, + LProtocolName fullname = Projector.projectFullProtocolName(this.proto, targSelf); Substitutions subs = new Substitutions(imed.roles, this.roles, Collections.emptyList(), Collections.emptyList()); @@ -154,5 +130,37 @@ public boolean canEquals(Object o) { return o instanceof GDo; } + + + + + + + + + + + + + /*// CHECKME: factor up to base? + @Override + public GType getInlined(STypeInliner v) + { + GProtocolName fullname = this.proto; + SubprotoSig sig = new SubprotoSig(fullname, this.roles, this.args); + RecVar rv = v.getInlinedRecVar(sig); + if (v.hasSig(sig)) + { + return new GContinue(getSource(), rv); + } + v.pushSig(sig); + GProtocol g = v.job.getContext().getIntermediate(fullname); + Substitutions subs = + new Substitutions(g.roles, this.roles, g.params, this.args); + GSeq inlined = g.def.substitute(subs).getInlined(v); + // i.e. returning a GSeq -- rely on parent GSeq to inline + v.popSig(); + return new GRecursion(null, rv, inlined); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java index 7e1025ecf..121cf0961 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java @@ -28,7 +28,7 @@ import org.scribble.core.type.session.local.LSend; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.Projector2; +import org.scribble.core.visit.global.Projector; import org.scribble.util.ScribException; public class GMessageTransfer extends MessageTransfer @@ -71,7 +71,7 @@ else if (this.dst.equals(self)) } @Override - public LType project(Projector2 v) + public LType project(Projector v) { return projectInlined(v.self); // No need for "aux", no recursive call } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java index 96b712d48..6234c3094 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java @@ -26,7 +26,7 @@ import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.Projector2; +import org.scribble.core.visit.global.Projector; import org.scribble.util.ScribException; public class GRecursion extends Recursion implements GType @@ -75,7 +75,7 @@ private LType projectAux(LSeq body) } @Override - public LType project(Projector2 v) + public LType project(Projector v) { LSeq body = this.body.project(v); return projectAux(body); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java index 5f6515079..cb37224d6 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java @@ -27,7 +27,7 @@ import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.Projector2; +import org.scribble.core.visit.global.Projector; import org.scribble.util.ScribException; public class GSeq extends Seq implements GType @@ -63,7 +63,7 @@ private LSeq projectAux(Stream elems) } @Override - public LSeq project(Projector2 v) + public LSeq project(Projector v) { return projectAux(this.elems.stream() .map(x -> ((GType) x).project(v))); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java index d526f53eb..f82e5c126 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java @@ -21,13 +21,13 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.Projector2; +import org.scribble.core.visit.global.Projector; import org.scribble.util.ScribException; public interface GType extends SType, GNode { LType projectInlined(Role self); // Use on inlined (i.e., Do inlined, roles pruned) - LType project(Projector2 v); // Use on parsed (intermed) + LType project(Projector v); // Use on parsed (intermed) // Pre: use on inlined or later (unsupported for Do, also Protocol) // enabled treated immutably diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java index 0819c5d69..668954ae5 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java @@ -24,7 +24,6 @@ import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Continue; -import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.local.ReachabilityEnv; import org.scribble.util.ScribException; @@ -48,14 +47,6 @@ public boolean isSingleConts(Set rvs) { return rvs.contains(this.recvar); } - - @Override - public LRecursion unfoldAllOnce(STypeUnfolder u) - { - return new LRecursion(getSource(), this.recvar, // CHECKME: Continue (not Recursion) as the source of the unfolding - (LSeq) u.getRec(this.recvar)); - - } @Override public void buildGraph(EGraphBuilderUtil2 b) @@ -125,4 +116,23 @@ public boolean canEquals(Object o) { return o instanceof LContinue; } + + + + + + + + + + + + + + /*@Override + public LRecursion unfoldAllOnce(STypeUnfolder u) + { + return new LRecursion(getSource(), this.recvar, // CHECKME: Continue (not Recursion) as the source of the unfolding + (LSeq) u.getRec(this.recvar)); + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java index cddefdb07..d67dcd828 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java @@ -17,18 +17,14 @@ import java.util.Set; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.lang.SubprotoSig; -import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; -import org.scribble.core.type.name.Substitutions; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Do; -import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.local.ReachabilityEnv; import org.scribble.util.ScribException; @@ -66,27 +62,6 @@ public ReachabilityEnv checkReachability(ReachabilityEnv env) throw new RuntimeException("Unsupported for LDo: " + this); } - // CHECKME: factor up to base? - @Override - public LType getInlined(STypeInliner v) - { - LProtocolName fullname = this.proto; - SubprotoSig sig = new SubprotoSig(fullname, this.roles, this.args); - RecVar rv = v.getInlinedRecVar(sig); - if (v.hasSig(sig)) - { - return new LContinue(getSource(), rv); - } - v.pushSig(sig); - LProtocol p = v.job.getContext().getProjection(fullname); // This line differs from GDo version - Substitutions subs = - new Substitutions(p.roles, this.roles, p.params, this.args); - LSeq inlined = p.def.substitute(subs).getInlined(v);//, stack); - // i.e. returning a Seq -- rely on parent Seq to inline - v.popSig(); - return new LRecursion(null, rv, inlined); - } - @Override public int hashCode() { @@ -114,5 +89,37 @@ public boolean canEquals(Object o) { return o instanceof LDo; } + + + + + + + + + + + + /*// CHECKME: factor up to base? + @Override + public LType getInlined(STypeInliner v) + { + LProtocolName fullname = this.proto; + SubprotoSig sig = new SubprotoSig(fullname, this.roles, this.args); + RecVar rv = v.getInlinedRecVar(sig); + if (v.hasSig(sig)) + { + return new LContinue(getSource(), rv); + } + v.pushSig(sig); + LProtocol p = v.job.getContext().getProjection(fullname); // This line differs from GDo version + Substitutions subs = + new Substitutions(p.roles, this.roles, p.params, this.args); + LSeq inlined = p.def.substitute(subs).getInlined(v);//, stack); + // i.e. returning a Seq -- rely on parent Seq to inline + v.popSig(); + return new LRecursion(null, rv, inlined); + }*/ } + diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java index 725b1fec8..ee1ad0301 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java @@ -21,15 +21,11 @@ import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.STypeBase; -import org.scribble.core.visit.STypeInliner; -import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.STypeVisitor; import org.scribble.core.visit.local.ReachabilityEnv; import org.scribble.util.ScribException; @@ -45,7 +41,7 @@ private LSkip() } @Override - public Stream collect(Function, Stream> f) + public Stream gather(Function, Stream> f) { throw new RuntimeException("Unsupported for Skip: " + this); } @@ -55,24 +51,6 @@ public LSkip visitWith(STypeVisitor v) { throw new RuntimeException("Unsupported for Skip: " + this); } - - @Override - public Set getRoles() - { - throw new RuntimeException("Unsupported for Skip: " + this); - } - - @Override - public Set> getMessageIds() - { - throw new RuntimeException("Unsupported for Skip: " + this); - } - - @Override - public Set getRecVars() - { - throw new RuntimeException("Unsupported for Skip: " + this); - } @Override public LSkip pruneRecs() @@ -104,18 +82,6 @@ public LSkip substitute(Substitutions subs) return this; } - @Override - public LSkip getInlined(STypeInliner i) - { - return this; - } - - @Override - public LType unfoldAllOnce(STypeUnfolder u) - { - throw new RuntimeException("Unsupported for Skip: " + this); - } - @Override public void buildGraph(EGraphBuilderUtil2 b) { @@ -162,5 +128,48 @@ public boolean canEquals(Object o) { return o instanceof LSkip; } + + + + + + + + + + + + + /*@Override + public Set getRoles() + { + throw new RuntimeException("Unsupported for Skip: " + this); + } + + @Override + public Set> getMessageIds() + { + throw new RuntimeException("Unsupported for Skip: " + this); + } + + @Override + public Set getRecVars() + { + throw new RuntimeException("Unsupported for Skip: " + this); + } + + @Override + public LSkip getInlined(STypeInliner i) + { + return this; + } + + @Override + public LType unfoldAllOnce(STypeUnfolder u) + { + throw new RuntimeException("Unsupported for Skip: " + this); + } + */ } + diff --git a/scribble-core/src/main/java/org/scribble/core/visit/MessageIdCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/MessageIdCollector.java index f9fbc17ca..c6099cd82 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/MessageIdCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/MessageIdCollector.java @@ -9,7 +9,7 @@ import org.scribble.core.type.session.Seq; public class MessageIdCollector> - extends STypeCollector, MessageId> + extends STypeGather, MessageId> { @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecVarCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/RecVarCollector.java index 4e80f2248..b63f065e7 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecVarCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecVarCollector.java @@ -2,18 +2,17 @@ import java.util.stream.Stream; -import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Continue; -import org.scribble.core.type.session.global.GSeq; +import org.scribble.core.type.session.Seq; -public class RecVarCollector - extends STypeCollector +public class RecVarCollector> + extends STypeGather, RecVar> { @Override - public Stream visitContinue - (Continue n) + public Stream visitContinue(Continue n) { return Stream.of(n.recvar); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RoleCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/RoleCollector.java index a2aefdfb5..18d6920fb 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RoleCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RoleCollector.java @@ -11,7 +11,7 @@ import org.scribble.core.type.session.Seq; public class RoleCollector> - extends STypeCollector, Role> + extends STypeGather, Role> { @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/core/visit/STypeCollector.java rename to scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java index 5e8e2867b..fd4f87ebe 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java @@ -14,7 +14,7 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; -public abstract class STypeCollector, +public abstract class STypeGather, N extends ProtocolName, T> { public Stream visit(SType n) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java old mode 100644 new mode 100755 index a07b22d58..901a1c937 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java @@ -1,29 +1,24 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ package org.scribble.core.visit; import java.util.Deque; import java.util.HashMap; import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import org.antlr.runtime.tree.CommonTree; import org.scribble.core.job.Job; import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.session.Continue; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.Seq; -public class STypeInliner +public abstract class STypeInliner> + extends STypeVisitor { public final Job job; @@ -34,11 +29,74 @@ public class STypeInliner private Map> recvars = new HashMap<>(); private Map counter = new HashMap<>(); + private final Map> recs = new HashMap<>(); + public STypeInliner(Job job) { this.job = job; } + @Override + public SType visitContinue(Continue n) + { + RecVar rv = getInlinedRecVar(n.recvar); + return n.reconstruct(n.getSource(), rv); + } + + @Override + public SType visitRecursion(Recursion n) + { + CommonTree source = n.getSource(); // CHECKME: or empty source? + RecVar rv = enterRec(n.recvar); // FIXME: make GTypeInliner, and record recvars to check freshness (e.g., rec X in two choice cases) + B body = n.body.visitWith(this);//, stack); + Recursion res = n.reconstruct(source, rv, body); + exitRec(n.recvar); + return res; + } + + @Override + public B visitSeq(B n) + { + List> elems = new LinkedList<>(); + for (SType e : n.elems) + { + SType e1 = e.visitWith(this); + if (e1 instanceof Seq) + { + elems.addAll(((Seq) e1).elems); + } + else + { + elems.add(e1); + } + } + return n.reconstruct(n.getSource(), elems); + } + + public void pushRec(RecVar rv, Seq body) + { + if (this.recs.containsKey(rv)) + { + throw new RuntimeException("Shouldn't get here: " + rv); + } + this.recs.put(rv, body); + } + + public boolean hasRec(RecVar rv) + { + return this.recs.containsKey(rv); + } + + public Seq getRec(RecVar rv) + { + return this.recs.get(rv); + } + + public void popRec(RecVar rv) + { + this.recs.remove(rv); + } + public void pushSig(SubprotoSig sig) { if (this.stack.contains(sig)) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java index a2a3f690a..c879d14ac 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java @@ -1,34 +1,52 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ package org.scribble.core.visit; import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; import java.util.Map; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; -// Currently once usage only, no popRec -- CHECKME: fix? -// FIXME: take B, and refactor getRec -public class STypeUnfolder +public abstract class STypeUnfolder> + extends STypeVisitor { private final Map> recs = new HashMap<>(); - public STypeUnfolder() + @Override + public SType visitRecursion(Recursion n) { + if (!hasRec(n.recvar)) // N.B. doesn't work if recvars shadowed + { + pushRec(n.recvar, n.body); + SType unf = n.body.visitWith(this); + popRec(n.recvar); + // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs + return unf; + } + return n; + } + @Override + public B visitSeq(B n) + { + List> elems = new LinkedList<>(); + for (SType e : n.elems) + { + SType e1 = e.visitWith(this); + if (e1 instanceof Seq) + { + elems.addAll(((Seq) e1).elems); + } + else + { + elems.add(e1); + } + } + return n.reconstruct(n.getSource(), elems); } public void pushRec(RecVar rv, Seq body) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java index fbfa86509..cce299cd8 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java @@ -4,6 +4,7 @@ import java.util.stream.Collectors; import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.DirectedInteraction; @@ -42,7 +43,7 @@ public SType visitDisconnect(DisconnectAction n) return n; } - public SType visitDo(Do n) + public SType visitDo(Do> n) { //return n.reconstruct(n.getSource(), n.proto, n.roles, n.args); return n; @@ -55,7 +56,8 @@ public SType visitRecursion(Recursion n) } // "Hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction - // This means a Visitor that needs to restructure a Seq should handle this within visitSeq (e.g., Seq "injection") + // This means a Visitor that needs to restructure a Seq should handle this within visitSeq + // E.g., Seq "injection" by inlining and unfolding // For this purpose, visited children passed "directly" instead of via a reconstruction (cf. above methods) public B visitSeq(B n) { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/Unf.java b/scribble-core/src/main/java/org/scribble/core/visit/Unf.java deleted file mode 100644 index f60384b7f..000000000 --- a/scribble-core/src/main/java/org/scribble/core/visit/Unf.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.scribble.core.visit; - -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.session.Recursion; -import org.scribble.core.type.session.SType; -import org.scribble.core.type.session.Seq; - -public abstract class Unf> - extends STypeVisitor -{ - private final Map> recs = new HashMap<>(); - - @Override - public SType visitRecursion(Recursion n) - { - if (!hasRec(n.recvar)) // N.B. doesn't work if recvars shadowed - { - pushRec(n.recvar, n.body); - SType unf = n.body.visitWith(this); - popRec(n.recvar); - // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs - return unf; - } - return n; - } - - @Override - public B visitSeq(B n) - { - List> elems = new LinkedList<>(); - for (SType e : n.elems) - { - SType e1 = e.visitWith(this); - if (e1 instanceof Seq) - { - elems.addAll(((Seq) e1).elems); - } - else - { - elems.add(e1); - } - } - return n.reconstruct(n.getSource(), elems); - } - - public void pushRec(RecVar rv, Seq body) - { - if (this.recs.containsKey(rv)) - { - throw new RuntimeException("Shouldn't get here: " + rv); - } - this.recs.put(rv, body); - } - - public boolean hasRec(RecVar rv) - { - return this.recs.containsKey(rv); - } - - public Seq getRec(RecVar rv) - { - return this.recs.get(rv); - } - - public void popRec(RecVar rv) - { - this.recs.remove(rv); - } -} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GUnf.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeUnfolder.java similarity index 80% rename from scribble-core/src/main/java/org/scribble/core/visit/global/GUnf.java rename to scribble-core/src/main/java/org/scribble/core/visit/global/GTypeUnfolder.java index bc2d839a7..97b46e872 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GUnf.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeUnfolder.java @@ -5,9 +5,9 @@ import org.scribble.core.type.session.global.GRecursion; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.global.GType; -import org.scribble.core.visit.Unf; +import org.scribble.core.visit.STypeUnfolder; -public class GUnf extends Unf +public class GTypeUnfolder extends STypeUnfolder { @Override public GType visitContinue(Continue n) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector2.java b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/core/visit/global/Projector2.java rename to scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java index da8d779db..260a68ce8 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector2.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java @@ -19,12 +19,12 @@ import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.Role; -public class Projector2 +public class Projector { public final Job job; public final Role self; - public Projector2(Job job, Role self) + public Projector(Job job, Role self) { this.job = job; this.self = self; From 68e0a0dcd75660a7cd46b5bba17a71d0bc696229 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 18:02:30 +0100 Subject: [PATCH 211/539] Added missing core visitor classes. --- .../core/visit/global/GTypeInliner.java | 44 +++++++++++++++++++ .../core/visit/local/LTypeInliner.java | 44 +++++++++++++++++++ .../core/visit/local/LTypeUnfolder.java | 17 +++++++ 3 files changed, 105 insertions(+) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java new file mode 100644 index 000000000..a531c8238 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java @@ -0,0 +1,44 @@ +package org.scribble.core.visit.global; + +import org.scribble.core.job.Job; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.lang.global.GProtocol; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Substitutions; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.global.GContinue; +import org.scribble.core.type.session.global.GRecursion; +import org.scribble.core.type.session.global.GSeq; +import org.scribble.core.type.session.global.GType; +import org.scribble.core.visit.STypeInliner; + +public class GTypeInliner extends STypeInliner +{ + public GTypeInliner(Job job) + { + super(job); + } + + @Override + public GType visitDo(Do> n) + { + GProtocolName fullname = (GProtocolName) n.proto; + SubprotoSig sig = new SubprotoSig(fullname, n.roles, n.args); + RecVar rv = getInlinedRecVar(sig); + if (hasSig(sig)) + { + return new GContinue(n.getSource(), rv); + } + pushSig(sig); + GProtocol g = this.job.getContext().getIntermediate(fullname); + Substitutions subs = + new Substitutions(g.roles, n.roles, g.params, n.args); + GSeq inlined = g.def.substitute(subs).visitWith(this); + // i.e. returning a GSeq -- rely on parent GSeq to inline + popSig(); + return new GRecursion(null, rv, inlined); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java new file mode 100644 index 000000000..3ec045425 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java @@ -0,0 +1,44 @@ +package org.scribble.core.visit.local; + +import org.scribble.core.job.Job; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.lang.local.LProtocol; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Substitutions; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.local.LContinue; +import org.scribble.core.type.session.local.LRecursion; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.type.session.local.LType; +import org.scribble.core.visit.STypeInliner; + +public class LTypeInliner extends STypeInliner +{ + public LTypeInliner(Job job) + { + super(job); + } + + @Override + public LType visitDo(Do> n) + { + LProtocolName fullname = (LProtocolName) n.proto; + SubprotoSig sig = new SubprotoSig(fullname, n.roles, n.args); + RecVar rv = getInlinedRecVar(sig); + if (hasSig(sig)) + { + return new LContinue(n.getSource(), rv); + } + pushSig(sig); + LProtocol p = this.job.getContext().getProjection(fullname); // This line differs from GDo version + Substitutions subs = + new Substitutions(p.roles, n.roles, p.params, n.args); + LSeq inlined = p.def.substitute(subs).visitWith(this); + // i.e. returning a Seq -- rely on parent Seq to inline + popSig(); + return new LRecursion(null, rv, inlined); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java new file mode 100644 index 000000000..068955146 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java @@ -0,0 +1,17 @@ +package org.scribble.core.visit.local; + +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.session.Continue; +import org.scribble.core.type.session.local.LRecursion; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.type.session.local.LType; +import org.scribble.core.visit.STypeUnfolder; + +public class LTypeUnfolder extends STypeUnfolder +{ + @Override + public LType visitContinue(Continue n) + { + return new LRecursion(n.getSource(), n.recvar, (LSeq) getRec(n.recvar)); + } +} From 15ee37ca400d4e7c7bb016da6c6043a503c9144e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 19:10:13 +0100 Subject: [PATCH 212/539] Continued: refactoring core visitors. --- .../core/visit/MessageIdCollector.java | 3 +-- .../scribble/core/visit/RecVarCollector.java | 3 +-- .../scribble/core/visit/RoleCollector.java | 3 +-- .../org/scribble/core/visit/STypeGather.java | 21 ++++--------------- 4 files changed, 7 insertions(+), 23 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/MessageIdCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/MessageIdCollector.java index c6099cd82..883a1d15a 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/MessageIdCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/MessageIdCollector.java @@ -4,12 +4,11 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.session.DirectedInteraction; import org.scribble.core.type.session.Seq; public class MessageIdCollector> - extends STypeGather, MessageId> + extends STypeGather> { @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecVarCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/RecVarCollector.java index b63f065e7..5aafa6c15 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecVarCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecVarCollector.java @@ -3,13 +3,12 @@ import java.util.stream.Stream; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.Seq; public class RecVarCollector> - extends STypeGather, RecVar> + extends STypeGather { @Override public Stream visitContinue(Continue n) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RoleCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/RoleCollector.java index 18d6920fb..86dc45108 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RoleCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RoleCollector.java @@ -3,7 +3,6 @@ import java.util.stream.Stream; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.DirectedInteraction; @@ -11,7 +10,7 @@ import org.scribble.core.type.session.Seq; public class RoleCollector> - extends STypeGather, Role> + extends STypeGather { @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java index fd4f87ebe..14c1d98ab 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java @@ -14,8 +14,7 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; -public abstract class STypeGather, - N extends ProtocolName, T> +public abstract class STypeGather, T> { public Stream visit(SType n) { @@ -38,20 +37,8 @@ protected Optional> typeSwitch(SType n) : (n instanceof Recursion) ? Optional.of(visitRecursion((Recursion) n)) : (n instanceof Do) - ? Optional.of(visitDo((Do) n)) // FIXME: - : Optional.empty(); // Better for extensibility than "manually" throwing Exception - - /*if (n instanceof DirectedInteraction) - return directedinter((DirectedInteraction) n); - else if (n instanceof DisconnectAction) - return disconnect((DisconnectAction) n); - else if (n instanceof Choice) return choice((Choice) n); - else if (n instanceof Seq) return seq((Seq) n); - else if (n instanceof Continue) return continu((Continue) n); - else if (n instanceof Recursion) - return recursion((Recursion) n); - else if (n instanceof Do) return doo((Do) n); - else throw new RuntimeException("Unknown node type: " + n.getClass());*/ + ? Optional.of(visitDo((Do) n)) // FIXME: + : Optional.empty(); // Better for extensibility than "manually" throwing Exception (e.g., for overriding) } public Stream visitContinue(Continue n) { return Stream.of(); } @@ -62,7 +49,7 @@ else if (n instanceof Recursion) public Stream visitDisconnect(DisconnectAction n) { return Stream.of(); } - public Stream visitDo(Do n) { return Stream.of(); } + public Stream visitDo(Do> n) { return Stream.of(); } public Stream visitRecursion(Recursion n) { return Stream.of(); } From fc20bf85ae066005f52bd23e0cd7c87fe44d4e44 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 19:38:24 +0100 Subject: [PATCH 213/539] Continued: refactored core proto/nonproto deps collection. --- .../main/java/org/scribble/core/job/Job.java | 11 ++- .../core/type/session/BasicInteraction.java | 19 ++--- .../scribble/core/type/session/Choice.java | 37 ++++---- .../core/type/session/ConnectAction.java | 30 +++++-- .../scribble/core/type/session/Continue.java | 31 ++++--- .../core/type/session/DisconnectAction.java | 17 ++-- .../org/scribble/core/type/session/Do.java | 28 +++---- .../core/type/session/MessageTransfer.java | 28 +++++-- .../scribble/core/type/session/Recursion.java | 30 ++++--- .../org/scribble/core/type/session/SType.java | 19 ++--- .../org/scribble/core/type/session/Seq.java | 32 ++++--- .../core/type/session/local/LSkip.java | 27 +++--- .../core/visit/NonProtoDepsCollector.java | 84 +++++++++++++++++++ .../core/visit/ProtoDepsCollector.java | 34 ++++++++ .../org/scribble/core/visit/STypeGather.java | 2 + .../scribble/core/visit/STypeUnfolder.java | 9 ++ 16 files changed, 287 insertions(+), 151 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsCollector.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index be0bd6997..7b09ac566 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -38,6 +38,9 @@ import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.global.GSeq; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.visit.NonProtoDepsCollector; +import org.scribble.core.visit.ProtoDepsCollector; import org.scribble.core.visit.RoleCollector; import org.scribble.core.visit.global.GTypeInliner; import org.scribble.core.visit.global.GTypeUnfolder; @@ -291,7 +294,9 @@ public Map getProjections(GProtocolName fullname, LProtocol proj = this.context.getProjection(fullname, role); - List> ps = proj.def.getProtoDependencies(); + List> ps = proj.def + .gather(new ProtoDepsCollector()::visit) + .collect(Collectors.toList()); for (ProtocolName p : ps) { System.out.println("\n" + this.context.getProjection((LProtocolName) p)); @@ -301,7 +306,9 @@ public Map getProjections(GProtocolName fullname, System.out.println("\n" + proj); } - List> ns = proj.def.getNonProtoDependencies(); + List> ns = proj.def + .gather(new NonProtoDepsCollector()::visit) + .collect(Collectors.toList()); warningPrintln(""); warningPrintln("[TODO] Full module projection and imports: " diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java index 03422e1a4..43bc94f4e 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java @@ -13,12 +13,8 @@ */ package org.scribble.core.type.session; -import java.util.Collections; -import java.util.List; - import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; public abstract class BasicInteraction> extends STypeBase implements SType @@ -33,12 +29,6 @@ public BasicInteraction pruneRecs() { return this; } - - @Override - public List> getProtoDependencies() - { - return Collections.emptyList(); - } @Override public CommonTree getSource() @@ -73,5 +63,12 @@ public BasicInteraction getInlined(STypeInliner v) public BasicInteraction unfoldAllOnce(STypeUnfolder u) { return this; - }*/ + } + + @Override + public List> getProtoDependencies() + { + return Collections.emptyList(); + } + */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java index 85ad23aee..272e71aee 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java @@ -21,8 +21,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeVisitor; @@ -74,23 +72,6 @@ public Choice pruneRecs() .collect(Collectors.toList()); return reconstruct(getSource(), this.subj, blocks); } - - @Override - public List> getProtoDependencies() - { - return this.blocks.stream().flatMap(x -> x.getProtoDependencies().stream()) - .distinct().collect(Collectors.toList()); - } - - @Override - public List> getNonProtoDependencies() - { - return this.blocks.stream() - .flatMap(x -> x.getNonProtoDependencies().stream()).distinct() - .collect(Collectors.toList()); - } - - //public abstract List getBlocks(); @Override public String toString() @@ -176,5 +157,21 @@ public Choice unfoldAllOnce(STypeUnfolder u) List blocks = this.blocks.stream().map(x -> x.unfoldAllOnce(u)) .collect(Collectors.toList()); return reconstruct(source, this.subj, blocks); - }*/ + } + + @Override + public List> getProtoDependencies() + { + return this.blocks.stream().flatMap(x -> x.getProtoDependencies().stream()) + .distinct().collect(Collectors.toList()); + } + + @Override + public List> getNonProtoDependencies() + { + return this.blocks.stream() + .flatMap(x -> x.getNonProtoDependencies().stream()).distinct() + .collect(Collectors.toList()); + } + */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java index 0e793c782..b1ebbff87 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java @@ -13,15 +13,8 @@ */ package org.scribble.core.type.session; -import java.util.LinkedList; -import java.util.List; - import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageSigName; -import org.scribble.core.type.name.PayloadElemType; import org.scribble.core.type.name.Role; public abstract class ConnectAction> @@ -33,7 +26,26 @@ public ConnectAction(CommonTree source, // BaseInteractionNode not ideal super(source, msg, src, dst); } - @Override + + + + + + + + + + + + + + + + + + + + /*@Override public List> getNonProtoDependencies() { List> res = new LinkedList<>(); @@ -61,5 +73,5 @@ else if (p.isGDelegationType()) } } return res; - } + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java index 4683b4eb3..ee342d8b5 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java @@ -13,15 +13,11 @@ */ package org.scribble.core.type.session; -import java.util.Collections; -import java.util.List; import java.util.function.Function; import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeVisitor; @@ -54,18 +50,6 @@ public SType visitWith(STypeVisitor v) return v.visitContinue(this); } - @Override - public List> getProtoDependencies() - { - return Collections.emptyList(); - } - - @Override - public List> getNonProtoDependencies() - { - return Collections.emptyList(); - } - @Override public Continue substitute(Substitutions subs) { @@ -143,5 +127,18 @@ public Continue getInlined(STypeInliner v) { RecVar rv = v.getInlinedRecVar(this.recvar); return reconstruct(getSource(), rv); - }*/ + } + + @Override + public List> getProtoDependencies() + { + return Collections.emptyList(); + } + + @Override + public List> getNonProtoDependencies() + { + return Collections.emptyList(); + } + */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java index d91a3d117..53aba9560 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java @@ -13,14 +13,11 @@ */ package org.scribble.core.type.session; -import java.util.Collections; -import java.util.List; import java.util.function.Function; import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeVisitor; @@ -61,12 +58,6 @@ public DisconnectAction substitute(Substitutions subs) return reconstruct(getSource(), subs.subsRole(this.left), subs.subsRole(this.right)); } - - @Override - public List> getNonProtoDependencies() - { - return Collections.emptyList(); - } @Override public int hashCode() @@ -122,6 +113,12 @@ public Set getRoles() public Set> getMessageIds() { return Collections.emptySet(); - }*/ + } + @Override + public List> getNonProtoDependencies() + { + return Collections.emptyList(); + } + */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java index 924eee8bc..db2be2201 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java @@ -64,20 +64,6 @@ public SType visitWith(STypeVisitor v) return v.visitDo(this); } - @Override - public List> getProtoDependencies() - { - return Stream.of(this.proto).collect(Collectors.toList()); - } - - @Override - public List> getNonProtoDependencies() - { - return this.args.stream() - .filter(x -> (x instanceof MessageSig) || (x instanceof DataType)) // CHECKME: refactor? - .map(x -> (MemberName) x).collect(Collectors.toList()); - } - @Override public Do substitute(Substitutions subs) { @@ -193,5 +179,19 @@ public SType unfoldAllOnce(STypeUnfolder u) { throw new RuntimeException("Unsupported for Do: " + this); } + + @Override + public List> getProtoDependencies() + { + return Stream.of(this.proto).collect(Collectors.toList()); + } + + @Override + public List> getNonProtoDependencies() + { + return this.args.stream() + .filter(x -> (x instanceof MessageSig) || (x instanceof DataType)) // CHECKME: refactor? + .map(x -> (MemberName) x).collect(Collectors.toList()); + } */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/core/type/session/MessageTransfer.java index 8682df1b5..a54e8517b 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/MessageTransfer.java @@ -13,16 +13,8 @@ */ package org.scribble.core.type.session; -import java.util.LinkedList; -import java.util.List; - import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.GDelegationType; -import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageSigName; -import org.scribble.core.type.name.PayloadElemType; import org.scribble.core.type.name.Role; public abstract class MessageTransfer> @@ -34,6 +26,24 @@ public MessageTransfer(CommonTree source, super(source, msg, src, dst); } + + + + + + + + + + + + + + + + + + /* @Override public List> getNonProtoDependencies() { @@ -62,5 +72,5 @@ else if (p.isGDelegationType()) // TODO FIXME: should be projected to local nam } } return res; - } + }*/ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java index de35bedac..210439bc1 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java @@ -13,7 +13,6 @@ */ package org.scribble.core.type.session; -import java.util.List; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @@ -21,8 +20,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.RecVarCollector; @@ -75,18 +72,6 @@ public SType pruneRecs() : this.body; // i.e., return a Seq, to be "inlined" by Seq.pruneRecs -- N.B. must handle empty Seq case } - @Override - public List> getProtoDependencies() - { - return this.body.getProtoDependencies(); - } - - @Override - public List> getNonProtoDependencies() - { - return this.body.getNonProtoDependencies(); - } - @Override public String toString() { @@ -160,5 +145,18 @@ public SType unfoldAllOnce(STypeUnfolder u) return unf; } return this; - }*/ + } + + @Override + public List> getProtoDependencies() + { + return this.body.getProtoDependencies(); + } + + @Override + public List> getNonProtoDependencies() + { + return this.body.getNonProtoDependencies(); + } + */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index d6744078a..40a6634b9 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -13,14 +13,11 @@ */ package org.scribble.core.type.session; -import java.util.List; import java.util.function.Function; import java.util.stream.Stream; import org.scribble.core.lang.SNode; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeVisitor; @@ -38,11 +35,6 @@ public interface SType> SType pruneRecs(); // Assumes no shadowing (e.g., use after inlining recvar disamb) - // Resulting Lists should not contain duplicates (i.e., Choice/Seq) - // Result does not necessarily contain root proto (protodecl is not an SType), but may do so via dependencies - List> getProtoDependencies(); - List> getNonProtoDependencies(); // N.B. delegation payloads currently here, not getProtoDependencies (CHECKME: refactor?) - // subclass equals should call this by: them.canEquals(this) boolean canEquals(Object o); @@ -65,10 +57,15 @@ public interface SType> Set getRecVars(); // Gets Continue RecVars (not Recursion) // CHECKME: OK to (re-)use GTypeTranslator for inlining? - SType - getInlined(STypeInliner i); + SType getInlined(STypeInliner i); // Unsupported for Do // CHECKME: repeat recvar names OK? including non-shadowing (e.g., choice cases) - SType unfoldAllOnce(STypeUnfolder u);*/ + SType unfoldAllOnce(STypeUnfolder u); + + // Resulting Lists should not contain duplicates (i.e., Choice/Seq use distinct) + // Result does not necessarily contain root proto (protodecl is not an SType), but may do so via dependencies + List> getProtoDependencies(); + List> getNonProtoDependencies(); // N.B. delegation payloads currently here, not getProtoDependencies (CHECKME: refactor?) + */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java index 72ac771d5..bf54e0ce0 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java @@ -22,8 +22,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeVisitor; @@ -82,21 +80,6 @@ public B substitute(Substitutions subs) .map(x -> x.substitute(subs)).collect(Collectors.toList()); return reconstruct(getSource(), elems); } - - @Override - public List> getProtoDependencies() - { - return this.elems.stream().flatMap(x -> x.getProtoDependencies().stream()) - .distinct().collect(Collectors.toList()); - } - - @Override - public List> getNonProtoDependencies() - { - return this.elems.stream() - .flatMap(x -> x.getNonProtoDependencies().stream()).distinct() - .collect(Collectors.toList()); - } // Re. return type, could make SType subclasses take themself as another param, but not worth it public abstract List> getElements(); @@ -211,5 +194,20 @@ public B unfoldAllOnce(STypeUnfolder u) } return reconstruct(source, elems); } + + @Override + public List> getProtoDependencies() + { + return this.elems.stream().flatMap(x -> x.getProtoDependencies().stream()) + .distinct().collect(Collectors.toList()); + } + + @Override + public List> getNonProtoDependencies() + { + return this.elems.stream() + .flatMap(x -> x.getNonProtoDependencies().stream()).distinct() + .collect(Collectors.toList()); + } */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java index ee1ad0301..01a2be7bc 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java @@ -13,15 +13,12 @@ */ package org.scribble.core.type.session.local; -import java.util.List; import java.util.Set; import java.util.function.Function; import java.util.stream.Stream; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Substitutions; import org.scribble.core.type.session.SType; @@ -57,18 +54,6 @@ public LSkip pruneRecs() { throw new RuntimeException("Unsupported for Skip: " + this); } - - @Override - public List> getProtoDependencies() - { - throw new RuntimeException("Unsupported for Skip: " + this); - } - - @Override - public List> getNonProtoDependencies() - { - throw new RuntimeException("Unsupported for Skip: " + this); - } @Override public boolean isSingleConts(Set rvs) @@ -169,6 +154,18 @@ public LType unfoldAllOnce(STypeUnfolder u) { throw new RuntimeException("Unsupported for Skip: " + this); } + + @Override + public List> getProtoDependencies() + { + throw new RuntimeException("Unsupported for Skip: " + this); + } + + @Override + public List> getNonProtoDependencies() + { + throw new RuntimeException("Unsupported for Skip: " + this); + } */ } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsCollector.java new file mode 100644 index 000000000..c2617b33d --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsCollector.java @@ -0,0 +1,84 @@ +package org.scribble.core.visit; + +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Stream; + +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.GDelegationType; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.ConnectAction; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.MessageSig; +import org.scribble.core.type.session.Payload; +import org.scribble.core.type.session.Seq; + + +// Result should not contain duplicates (i.e., due to Choice/Seq) +// Result does not necessarily contain root proto (protodecl is not an SType), but may do so via dependencies +// N.B. delegation payloads currently gathered here, not by getProtoDependencies -- CHECKME: refactor? +public class NonProtoDepsCollector> + extends STypeGather> +{ + @Override + public Stream> visitChoice(Choice n) + { + return super.visitChoice(n).distinct(); + } + + @Override + public Stream> visitSeq(Seq n) + { + return super.visitSeq(n).distinct(); + } + + @Override + public Stream> visitDirectedInteraction(DirectedInteraction n) + { + { + List> res = new LinkedList<>(); + if (n.msg.isMessageSigName()) + { + res.add((MessageSigName) n.msg); + } + else //if (this.msg.isMessageSig) + { + Payload pay = ((MessageSig) n.msg).payload; + for (PayloadElemType p : pay.elems) + { + if (p.isDataType()) + { + res.add((DataType) p); + } + else if (p.isGDelegationType()) // TODO FIXME: should be projected to local name + { + if (n instanceof ConnectAction) + { + throw new RuntimeException("Shouldn't get in here: " + n); + } + res.add(((GDelegationType) p).getGlobalProtocol()); + } + else + { + throw new RuntimeException("[TODO]: " + this); + } + } + } + return res.stream(); + } + } + + @Override + public Stream> visitDo(Do> n) + { + return n.args.stream() + .filter(x -> (x instanceof MessageSig) || (x instanceof DataType)) // CHECKME: refactor? + .map(x -> (MemberName) x); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java new file mode 100644 index 000000000..47df82b50 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java @@ -0,0 +1,34 @@ +package org.scribble.core.visit; + +import java.util.stream.Stream; + +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.Seq; + +// Result should not contain duplicates (i.e., due to Choice/Seq) +// Result does not necessarily contain root proto (protodecl is not an SType), but may do so via dependencies +public class ProtoDepsCollector> + extends STypeGather> +{ + + @Override + public Stream> visitChoice(Choice n) + { + return super.visitChoice(n).distinct(); + } + + @Override + public Stream> visitSeq(Seq n) + { + return super.visitSeq(n).distinct(); + } + + @Override + public Stream> visitDo(Do> n) + { + return Stream.of(n.proto); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java index 14c1d98ab..5cbd66401 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java @@ -45,6 +45,8 @@ protected Optional> typeSwitch(SType n) public Stream visitChoice(Choice n) { return Stream.of(); } + // CHECKME: split into ConnectionAction and MessageTransfer? cf. NonProtoDepsCollector -- and how about locals? + // Or offer all, with ConnectionAction and MessageTransfer delegating to DirectedInteraction by default? (must order correctly in typeSwitch) public Stream visitDirectedInteraction(DirectedInteraction n) { return Stream.of(); } public Stream visitDisconnect(DisconnectAction n) { return Stream.of(); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java index c879d14ac..fce87451a 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java @@ -6,16 +6,25 @@ import java.util.Map; import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.session.Do; import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; +// Not supported for Do public abstract class STypeUnfolder> extends STypeVisitor { private final Map> recs = new HashMap<>(); + @Override + public SType visitDo(Do> n) + { + throw new RuntimeException("Unsupported for Do: " + n); + } + @Override public SType visitRecursion(Recursion n) { From 7d6ec4f0478915291645cd41226f32b2ceae8259 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 19:58:58 +0100 Subject: [PATCH 214/539] Continued: refactored core substitutor visitor. --- .../scribble/core/lang/global/GProtocol.java | 11 +- .../org/scribble/core/type/session/Do.java | 5 + .../org/scribble/core/visit/STypeGather.java | 36 +++- .../scribble/core/visit/STypeUnfolder.java | 2 +- .../org/scribble/core/visit/STypeVisitor.java | 2 +- .../org/scribble/core/visit/Substitutor.java | 160 ++++++++++++++++++ .../core/visit/global/GTypeInliner.java | 2 +- .../core/visit/local/LTypeInliner.java | 2 +- 8 files changed, 204 insertions(+), 16 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 153e8add3..17caed006 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -47,15 +47,15 @@ import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; -import org.scribble.core.type.name.Substitutions; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.global.GRecursion; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.local.LSeq; -import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.MessageIdCollector; import org.scribble.core.visit.RoleCollector; +import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; +import org.scribble.core.visit.Substitutor; import org.scribble.core.visit.global.Projector; import org.scribble.util.ScribException; import org.scribble.util.ScribUtil; @@ -104,9 +104,10 @@ else if (n instanceof MessageSigName) SubprotoSig sig = new SubprotoSig(this.fullname, this.roles, params); v.pushSig(sig); - Substitutions subs = new Substitutions(this.roles, sig.roles, this.params, - sig.args); - GSeq body = this.def.substitute(subs).visitWith(v).pruneRecs(); + GSeq body = this.def + .visitWith( + new Substitutor<>(this.roles, sig.roles, this.params, sig.args)) + .visitWith(v).pruneRecs(); RecVar rv = v.getInlinedRecVar(sig); GRecursion rec = new GRecursion(null, rv, body); // CHECKME: or protodecl source? CommonTree source = getSource(); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java index db2be2201..dea5987c0 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java @@ -94,6 +94,11 @@ public Do pruneRecs() return this; } + public N getProtocolName() + { + return this.proto; + } + @Override public String toString() { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java index 5cbd66401..1bc59e437 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java @@ -41,19 +41,41 @@ protected Optional> typeSwitch(SType n) : Optional.empty(); // Better for extensibility than "manually" throwing Exception (e.g., for overriding) } - public Stream visitContinue(Continue n) { return Stream.of(); } + public Stream visitContinue(Continue n) + { + return Stream.of(); + } - public Stream visitChoice(Choice n) { return Stream.of(); } + public Stream visitChoice(Choice n) + { + return Stream.of(); + } // CHECKME: split into ConnectionAction and MessageTransfer? cf. NonProtoDepsCollector -- and how about locals? + // This is the "level" of reconstruct, though // Or offer all, with ConnectionAction and MessageTransfer delegating to DirectedInteraction by default? (must order correctly in typeSwitch) - public Stream visitDirectedInteraction(DirectedInteraction n) { return Stream.of(); } + public Stream visitDirectedInteraction(DirectedInteraction n) + { + return Stream.of(); + } - public Stream visitDisconnect(DisconnectAction n) { return Stream.of(); } + public Stream visitDisconnect(DisconnectAction n) + { + return Stream.of(); + } - public Stream visitDo(Do> n) { return Stream.of(); } + public Stream visitDo(Do> n) + { + return Stream.of(); + } - public Stream visitRecursion(Recursion n) { return Stream.of(); } + public Stream visitRecursion(Recursion n) + { + return Stream.of(); + } - public Stream visitSeq(Seq n) { return Stream.of(); } + public Stream visitSeq(Seq n) + { + return Stream.of(); + } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java index fce87451a..04e2281a9 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java @@ -20,7 +20,7 @@ public abstract class STypeUnfolder> private final Map> recs = new HashMap<>(); @Override - public SType visitDo(Do> n) + public > SType visitDo(Do n) { throw new RuntimeException("Unsupported for Do: " + n); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java index cce299cd8..eda2d7a3c 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java @@ -43,7 +43,7 @@ public SType visitDisconnect(DisconnectAction n) return n; } - public SType visitDo(Do> n) + public > SType visitDo(Do n) { //return n.reconstruct(n.getSource(), n.proto, n.roles, n.args); return n; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java new file mode 100644 index 000000000..392b6fba2 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java @@ -0,0 +1,160 @@ +package org.scribble.core.visit; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Arg; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.DisconnectAction; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.Seq; + +public class Substitutor> + extends STypeVisitor +{ + // Old name -> new name + private final Map rsubs = new HashMap<>(); + private final Map, Arg> + asubs = new HashMap<>(); + // Keys are actually simple names (params) + // args are MessageSigName or DataType (but not MessageSig) -- N.B. substitution may replace sig name with a sig + // NonRoleParamKind, not NonRoleArgKind, because latter includes AmbigKind due to parsing requirements + // Better (CHECKME: necessary?) to separate roles and args -- but MessageSigName and DataType need to be distinct (so can group up, cf. NonRoleArgList) + + public Substitutor(List rold, List rnew, + List> aold, + List> anew) + { + if (rold.size() != rnew.size()) + { + throw new RuntimeException( + "Role lists don't match: " + rold + " ; " + rnew); + } + if (aold.size() != anew.size()) + { + throw new RuntimeException( + "Arg lists don't match: " + aold + " ; " + anew); + } + Iterator i = rnew.iterator(); + rold.forEach(x -> this.rsubs.put(x, i.next())); + Iterator> j = anew.iterator(); + aold.forEach(x -> this.asubs.put(x, j.next())); + } + + @Override + public SType visitChoice(Choice n) + { + List blocks = n.blocks.stream() + .map(x -> x.visitWith((STypeVisitor) this)) // FIXME + .collect(Collectors.toList()); + return n.reconstruct(n.getSource(), subsRole(n.subj), blocks); + } + + @Override + public SType visitDirectedInteraction(DirectedInteraction n) + { + Message msg = n.msg; + if (msg instanceof MemberName) + { + MemberName name = (MemberName) msg; + if (hasArg(name)) + { + msg = (Message) subsArg(name); + } + } + return n.reconstruct(n.getSource(), msg, subsRole(n.src), + subsRole(n.dst)); + } + + @Override + public SType visitDisconnect(DisconnectAction n) + { + return n.reconstruct(n.getSource(), subsRole(n.left), subsRole(n.right)); + } + + @Override + public > SType visitDo(Do n) + { + List roles = n.roles.stream().map(x -> subsRole(x)) + .collect(Collectors.toList()); + List> args = new LinkedList<>(); + for (Arg a : n.args) + { + if (a instanceof MemberName && hasArg((MemberName) a)) + { + if (a instanceof DataType) + { + a = subsArg((DataType) a); + } + else if (a instanceof MessageSigName) + { + a = subsArg((MessageSigName) a); + } + } + args.add(a); + } + return n.reconstruct(n.getSource(), n.getProtocolName(), roles, args); + } + + public Role subsRole(Role old) + { + return this.rsubs.get(old); + } + + public // + Arg subsArg(MemberName old) + // ? param more convenient for accepting DataType/MessageSigName params + { + return this.asubs.get(old); + } + + public boolean hasArg(MemberName old) + // ? param more convenient for accepting DataType/MessageSigName params + { + return this.asubs.containsKey(old); + } + + /*@Override + public String toString() + { + return this.rsubs + "; " + this.asubs; + } + + @Override + public int hashCode() + { + int hash = 1889; + hash = 31 * hash + this.rsubs.hashCode(); + hash = 31 * hash + this.asubs.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof Substitutions)) + { + return false; + } + Substitutions them = (Substitutions) o; + return this.rsubs.equals(them.rsubs) && this.asubs.equals(them.asubs); + }*/ +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java index a531c8238..f4fd97592 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java @@ -23,7 +23,7 @@ public GTypeInliner(Job job) } @Override - public GType visitDo(Do> n) + public > GType visitDo(Do n) { GProtocolName fullname = (GProtocolName) n.proto; SubprotoSig sig = new SubprotoSig(fullname, n.roles, n.args); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java index 3ec045425..bd9b94cce 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java @@ -23,7 +23,7 @@ public LTypeInliner(Job job) } @Override - public LType visitDo(Do> n) + public > LType visitDo(Do n) { LProtocolName fullname = (LProtocolName) n.proto; SubprotoSig sig = new SubprotoSig(fullname, n.roles, n.args); From a710830f19276df32f8d115675f92940367521fe Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 20:10:28 +0100 Subject: [PATCH 215/539] Continued: refactoring core substitutor and rec pruning visitors. --- .../scribble/core/lang/global/GProtocol.java | 5 +- .../scribble/core/lang/local/LProtocol.java | 10 +-- .../core/type/session/BasicInteraction.java | 12 ++-- .../scribble/core/type/session/Choice.java | 33 +++++----- .../scribble/core/type/session/Continue.java | 29 ++++----- .../type/session/DirectedInteraction.java | 37 +++++------ .../core/type/session/DisconnectAction.java | 15 ++--- .../org/scribble/core/type/session/Do.java | 65 +++++++++---------- .../scribble/core/type/session/Recursion.java | 38 +++++------ .../org/scribble/core/type/session/SType.java | 9 ++- .../org/scribble/core/type/session/Seq.java | 56 ++++++++-------- .../core/type/session/local/LSkip.java | 25 ++++--- .../org/scribble/core/visit/RecPruner.java | 47 ++++++++++++++ .../org/scribble/core/visit/Substitutor.java | 11 ++++ .../core/visit/global/GTypeInliner.java | 8 +-- .../core/visit/local/LTypeInliner.java | 8 +-- 16 files changed, 226 insertions(+), 182 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 17caed006..dbb165fd2 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -52,6 +52,7 @@ import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.visit.MessageIdCollector; +import org.scribble.core.visit.RecPruner; import org.scribble.core.visit.RoleCollector; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; @@ -107,7 +108,7 @@ else if (n instanceof MessageSigName) GSeq body = this.def .visitWith( new Substitutor<>(this.roles, sig.roles, this.params, sig.args)) - .visitWith(v).pruneRecs(); + .visitWith(v).visitWith(new RecPruner<>()); RecVar rv = v.getInlinedRecVar(sig); GRecursion rec = new GRecursion(null, rv, body); // CHECKME: or protodecl source? CommonTree source = getSource(); @@ -167,7 +168,7 @@ private LProjection projectAux(Role self, List decls, LSeq body) public LProjection project(Projector v) { - LSeq body = (LSeq) this.def.project(v).pruneRecs(); + LSeq body = (LSeq) this.def.project(v).visitWith(new RecPruner<>()); return projectAux(v.self, v.job.getContext().getInlined(this.fullname).roles, // Used inlined decls, already pruned body); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 9542dacea..c698b0928 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -35,12 +35,13 @@ import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; -import org.scribble.core.type.name.Substitutions; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.local.LRecursion; import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.visit.RecPruner; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; +import org.scribble.core.visit.Substitutor; import org.scribble.core.visit.local.LTypeInliner; import org.scribble.core.visit.local.ReachabilityEnv; import org.scribble.util.Constants; @@ -93,10 +94,11 @@ else if (n instanceof MessageSigName) SubprotoSig sig = new SubprotoSig(this.fullname, this.roles, params); v.pushSig(sig); - Substitutions subs = new Substitutions(this.roles, sig.roles, this.params, - sig.args); + Substitutor subs = new Substitutor<>(this.roles, sig.roles, + this.params, sig.args); LTypeInliner linl = new LTypeInliner(v.job); - LSeq body = this.def.substitute(subs).visitWith(linl).pruneRecs(); + LSeq body = this.def.visitWith(subs).visitWith(linl) + .visitWith(new RecPruner<>()); RecVar rv = v.getInlinedRecVar(sig); LRecursion rec = new LRecursion(null, rv, body); // CHECKME: or protodecl source? CommonTree source = getSource(); // CHECKME: or null source? diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java index 43bc94f4e..3534e5dae 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java @@ -24,12 +24,6 @@ public BasicInteraction(CommonTree source) super(source); } - @Override - public BasicInteraction pruneRecs() - { - return this; - } - @Override public CommonTree getSource() { @@ -70,5 +64,11 @@ public List> getProtoDependencies() { return Collections.emptyList(); } + + @Override + public BasicInteraction pruneRecs() + { + return this; + } */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java index 272e71aee..32058e179 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java @@ -22,7 +22,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; -import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeVisitor; public abstract class Choice> @@ -56,22 +55,6 @@ public SType visitWith(STypeVisitor v) { return v.visitChoice(this); } - - @Override - public Choice substitute(Substitutions subs) - { - List blocks = this.blocks.stream().map(x -> x.substitute(subs)) - .collect(Collectors.toList()); - return reconstruct(getSource(), subs.subsRole(this.subj), blocks); - } - - @Override - public Choice pruneRecs() - { - List blocks = this.blocks.stream().map(x -> x.pruneRecs()) - .collect(Collectors.toList()); - return reconstruct(getSource(), this.subj, blocks); - } @Override public String toString() @@ -173,5 +156,21 @@ public List> getNonProtoDependencies() .flatMap(x -> x.getNonProtoDependencies().stream()).distinct() .collect(Collectors.toList()); } + + @Override + public Choice substitute(Substitutions subs) + { + List blocks = this.blocks.stream().map(x -> x.substitute(subs)) + .collect(Collectors.toList()); + return reconstruct(getSource(), subs.subsRole(this.subj), blocks); + } + + @Override + public Choice pruneRecs() + { + List blocks = this.blocks.stream().map(x -> x.pruneRecs()) + .collect(Collectors.toList()); + return reconstruct(getSource(), this.subj, blocks); + } */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java index ee342d8b5..12d09afbb 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java @@ -19,7 +19,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeVisitor; public abstract class Continue> @@ -50,20 +49,6 @@ public SType visitWith(STypeVisitor v) return v.visitContinue(this); } - @Override - public Continue substitute(Substitutions subs) - { - //return reconstruct(getSource(), this.recvar); - return this; - } - - @Override - public Continue pruneRecs() - { - //return reconstruct(getSource(), this.recvar); - return this; - } - @Override public String toString() { @@ -140,5 +125,19 @@ public List> getNonProtoDependencies() { return Collections.emptyList(); } + + @Override + public Continue substitute(Substitutions subs) + { + //return reconstruct(getSource(), this.recvar); + return this; + } + + @Override + public Continue pruneRecs() + { + //return reconstruct(getSource(), this.recvar); + return this; + } */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java index 5b87f145b..470bd39ba 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java @@ -18,9 +18,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.Role; -import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeVisitor; // Besides directed-ness, also features a Message @@ -57,22 +55,6 @@ public SType visitWith(STypeVisitor v) return v.visitDirectedInteraction(this); } - @Override - public DirectedInteraction substitute(Substitutions subs) - { - Message msg = this.msg; - if (msg instanceof MemberName) - { - MemberName n = (MemberName) msg; - if (subs.hasArg(n)) - { - msg = (Message) subs.subsArg(n); - } - } - return reconstruct(getSource(), msg, subs.subsRole(this.src), - subs.subsRole(this.dst)); - } - @Override public CommonTree getSource() { @@ -130,5 +112,22 @@ public Set getRoles() public Set> getMessageIds() { return Stream.of(this.msg.getId()).collect(Collectors.toSet()); - }*/ + } + + @Override + public DirectedInteraction substitute(Substitutions subs) + { + Message msg = this.msg; + if (msg instanceof MemberName) + { + MemberName n = (MemberName) msg; + if (subs.hasArg(n)) + { + msg = (Message) subs.subsArg(n); + } + } + return reconstruct(getSource(), msg, subs.subsRole(this.src), + subs.subsRole(this.dst)); + } + */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java index 53aba9560..f98197c98 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java @@ -19,7 +19,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; -import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeVisitor; // Base class would be "SymmetricInteraction" (cf., DirectedInteraction) @@ -51,13 +50,6 @@ public SType visitWith(STypeVisitor v) { return v.visitDisconnect(this); } - - @Override - public DisconnectAction substitute(Substitutions subs) - { - return reconstruct(getSource(), subs.subsRole(this.left), - subs.subsRole(this.right)); - } @Override public int hashCode() @@ -120,5 +112,12 @@ public List> getNonProtoDependencies() { return Collections.emptyList(); } + + @Override + public DisconnectAction substitute(Substitutions subs) + { + return reconstruct(getSource(), subs.subsRole(this.left), + subs.subsRole(this.right)); + } */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java index dea5987c0..b54df8a9f 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java @@ -14,7 +14,6 @@ package org.scribble.core.type.session; import java.util.Collections; -import java.util.LinkedList; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; @@ -23,12 +22,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; -import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeVisitor; public abstract class Do @@ -63,36 +58,6 @@ public SType visitWith(STypeVisitor v) { return v.visitDo(this); } - - @Override - public Do substitute(Substitutions subs) - { - List roles = this.roles.stream().map(x -> subs.subsRole(x)) - .collect(Collectors.toList()); - List> args = new LinkedList<>(); - for (Arg a : this.args) - { - if (a instanceof MemberName && subs.hasArg((MemberName) a)) - { - if (a instanceof DataType) - { - a = subs.subsArg((DataType) a); - } - else if (a instanceof MessageSigName) - { - a = subs.subsArg((MessageSigName) a); - } - } - args.add(a); - } - return reconstruct(getSource(), this.proto, roles, args); - } - - @Override - public Do pruneRecs() - { - return this; - } public N getProtocolName() { @@ -198,5 +163,35 @@ public List> getNonProtoDependencies() .filter(x -> (x instanceof MessageSig) || (x instanceof DataType)) // CHECKME: refactor? .map(x -> (MemberName) x).collect(Collectors.toList()); } + + @Override + public Do pruneRecs() + { + return this; + } + + @Override + public Do substitute(Substitutions subs) + { + List roles = this.roles.stream().map(x -> subs.subsRole(x)) + .collect(Collectors.toList()); + List> args = new LinkedList<>(); + for (Arg a : this.args) + { + if (a instanceof MemberName && subs.hasArg((MemberName) a)) + { + if (a instanceof DataType) + { + a = subs.subsArg((DataType) a); + } + else if (a instanceof MessageSigName) + { + a = subs.subsArg((MessageSigName) a); + } + } + args.add(a); + } + return reconstruct(getSource(), this.proto, roles, args); + } */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java index 210439bc1..6e3d21817 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java @@ -13,16 +13,12 @@ */ package org.scribble.core.type.session; -import java.util.Set; import java.util.function.Function; -import java.util.stream.Collectors; import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Substitutions; -import org.scribble.core.visit.RecVarCollector; import org.scribble.core.visit.STypeVisitor; public abstract class Recursion> @@ -54,23 +50,6 @@ public SType visitWith(STypeVisitor v) public abstract Recursion reconstruct( CommonTree source, RecVar recvar, B body); - - @Override - public Recursion substitute(Substitutions subs) - { - return reconstruct(getSource(), this.recvar, this.body.substitute(subs)); - } - - @Override - public SType pruneRecs() - { - // Assumes no shadowing (e.g., use after SType#getInlined recvar disamb) - Set rvs = this.body.gather(new RecVarCollector()::visit) - .collect(Collectors.toSet()); - return rvs.contains(this.recvar) - ? this - : this.body; // i.e., return a Seq, to be "inlined" by Seq.pruneRecs -- N.B. must handle empty Seq case - } @Override public String toString() @@ -158,5 +137,22 @@ public List> getNonProtoDependencies() { return this.body.getNonProtoDependencies(); } + + @Override + public Recursion substitute(Substitutions subs) + { + return reconstruct(getSource(), this.recvar, this.body.substitute(subs)); + } + + @Override + public SType pruneRecs() + { + // Assumes no shadowing (e.g., use after SType#getInlined recvar disamb) + Set rvs = this.body.gather(new RecVarCollector()::visit) + .collect(Collectors.toSet()); + return rvs.contains(this.recvar) + ? this + : this.body; // i.e., return a Seq, to be "inlined" by Seq.pruneRecs -- N.B. must handle empty Seq case + } */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index 40a6634b9..b6e14ff76 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -18,7 +18,6 @@ import org.scribble.core.lang.SNode; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeVisitor; @@ -31,10 +30,6 @@ public interface SType> SType visitWith(STypeVisitor v); - SType substitute(Substitutions subs); - - SType pruneRecs(); // Assumes no shadowing (e.g., use after inlining recvar disamb) - // subclass equals should call this by: them.canEquals(this) boolean canEquals(Object o); @@ -67,5 +62,9 @@ public interface SType> // Result does not necessarily contain root proto (protodecl is not an SType), but may do so via dependencies List> getProtoDependencies(); List> getNonProtoDependencies(); // N.B. delegation payloads currently here, not getProtoDependencies (CHECKME: refactor?) + + SType substitute(Substitutions subs); + + SType pruneRecs(); // Assumes no shadowing (e.g., use after inlining recvar disamb) */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java index bf54e0ce0..916555d39 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java @@ -14,7 +14,6 @@ package org.scribble.core.type.session; import java.util.Collections; -import java.util.LinkedList; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; @@ -22,7 +21,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.Substitutions; import org.scribble.core.visit.STypeVisitor; public abstract class Seq> @@ -54,33 +52,6 @@ public B visitWith(STypeVisitor v) return v.visitSeq(cast); } - @Override - public B pruneRecs() - { - List> elems = new LinkedList<>(); - for (SType e : this.elems) - { - SType e1 = (SType) e.pruneRecs(); - if (e1 instanceof Seq) // cf. Recursion::pruneRecs - { - elems.addAll(((Seq) e1).getElements()); // Handles empty Seq case - } - else - { - elems.add(e1); - } - } - return reconstruct(getSource(), elems); - } - - @Override - public B substitute(Substitutions subs) - { - List> elems = this.elems.stream() - .map(x -> x.substitute(subs)).collect(Collectors.toList()); - return reconstruct(getSource(), elems); - } - // Re. return type, could make SType subclasses take themself as another param, but not worth it public abstract List> getElements(); @@ -209,5 +180,32 @@ public List> getNonProtoDependencies() .flatMap(x -> x.getNonProtoDependencies().stream()).distinct() .collect(Collectors.toList()); } + + @Override + public B substitute(Substitutions subs) + { + List> elems = this.elems.stream() + .map(x -> x.substitute(subs)).collect(Collectors.toList()); + return reconstruct(getSource(), elems); + } + + @Override + public B pruneRecs() + { + List> elems = new LinkedList<>(); + for (SType e : this.elems) + { + SType e1 = (SType) e.pruneRecs(); + if (e1 instanceof Seq) // cf. Recursion::pruneRecs + { + elems.addAll(((Seq) e1).getElements()); // Handles empty Seq case + } + else + { + elems.add(e1); + } + } + return reconstruct(getSource(), elems); + } */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java index 01a2be7bc..3f7c56b5f 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java @@ -20,7 +20,6 @@ import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Substitutions; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.STypeBase; import org.scribble.core.visit.STypeVisitor; @@ -49,24 +48,12 @@ public LSkip visitWith(STypeVisitor v) throw new RuntimeException("Unsupported for Skip: " + this); } - @Override - public LSkip pruneRecs() - { - throw new RuntimeException("Unsupported for Skip: " + this); - } - @Override public boolean isSingleConts(Set rvs) { throw new RuntimeException("Unsupported for Skip:\n" + this); } - @Override - public LSkip substitute(Substitutions subs) - { - return this; - } - @Override public void buildGraph(EGraphBuilderUtil2 b) { @@ -166,6 +153,18 @@ public List> getNonProtoDependencies() { throw new RuntimeException("Unsupported for Skip: " + this); } + + @Override + public LSkip pruneRecs() + { + throw new RuntimeException("Unsupported for Skip: " + this); + } + + @Override + public LSkip substitute(Substitutions subs) + { + return this; + } */ } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java new file mode 100644 index 000000000..4f12cb914 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java @@ -0,0 +1,47 @@ +package org.scribble.core.visit; + +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.Seq; + +// Assumes no shadowing (e.g., use after inlining recvar disamb) +public class RecPruner> + extends STypeVisitor +{ + @Override + public SType visitRecursion(Recursion n) + { + // Assumes no shadowing (e.g., use after SType#getInlined recvar disamb) + Set rvs = n.body.gather(new RecVarCollector()::visit) + .collect(Collectors.toSet()); + return rvs.contains(n.recvar) + ? n + : n.body; // i.e., return a Seq, to be "inlined" by Seq.pruneRecs -- N.B. must handle empty Seq case + } + + @Override + public B visitSeq(B n) + { + List> elems = new LinkedList<>(); + for (SType e : n.elems) + { + SType e1 = (SType) e.visitWith(this); + if (e1 instanceof Seq) // cf. Recursion::pruneRecs + { + elems.addAll(((Seq) e1).getElements()); // Handles empty Seq case + } + else + { + elems.add(e1); + } + } + return n.reconstruct(n.getSource(), elems); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java index 392b6fba2..bca001520 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java @@ -127,6 +127,17 @@ public boolean hasArg(MemberName old) { return this.asubs.containsKey(old); } + + + + + + + + + + + /*@Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java index f4fd97592..3faf980dc 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java @@ -7,13 +7,13 @@ import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Substitutions; import org.scribble.core.type.session.Do; import org.scribble.core.type.session.global.GContinue; import org.scribble.core.type.session.global.GRecursion; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.global.GType; import org.scribble.core.visit.STypeInliner; +import org.scribble.core.visit.Substitutor; public class GTypeInliner extends STypeInliner { @@ -34,9 +34,9 @@ public > GType visitDo(Do n) } pushSig(sig); GProtocol g = this.job.getContext().getIntermediate(fullname); - Substitutions subs = - new Substitutions(g.roles, n.roles, g.params, n.args); - GSeq inlined = g.def.substitute(subs).visitWith(this); + GSeq inlined = g.def + .visitWith(new Substitutor<>(g.roles, n.roles, g.params, n.args)) + .visitWith(this); // i.e. returning a GSeq -- rely on parent GSeq to inline popSig(); return new GRecursion(null, rv, inlined); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java index bd9b94cce..d8bedc8c0 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java @@ -7,13 +7,13 @@ import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Substitutions; import org.scribble.core.type.session.Do; import org.scribble.core.type.session.local.LContinue; import org.scribble.core.type.session.local.LRecursion; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.STypeInliner; +import org.scribble.core.visit.Substitutor; public class LTypeInliner extends STypeInliner { @@ -34,9 +34,9 @@ public > LType visitDo(Do n) } pushSig(sig); LProtocol p = this.job.getContext().getProjection(fullname); // This line differs from GDo version - Substitutions subs = - new Substitutions(p.roles, n.roles, p.params, n.args); - LSeq inlined = p.def.substitute(subs).visitWith(this); + Substitutor subs = + new Substitutor<>(p.roles, n.roles, p.params, n.args); + LSeq inlined = p.def.visitWith(subs).visitWith(this); // i.e. returning a Seq -- rely on parent Seq to inline popSig(); return new LRecursion(null, rv, inlined); From 26c8db2d839086dadeafde9e2055d2faf26a9ce9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 20:10:48 +0100 Subject: [PATCH 216/539] Minor. --- .../src/main/java/org/scribble/core/type/session/SType.java | 1 + 1 file changed, 1 insertion(+) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index b6e14ff76..caa757f0e 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -38,6 +38,7 @@ public interface SType> + From 22733d2a22da535a01ba65c43848e59fce97fcc3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 20:38:40 +0100 Subject: [PATCH 217/539] Continued: refactoring core visitors. --- .../main/java/org/scribble/core/job/Job.java | 7 +- .../org/scribble/core/job/JobContext.java | 3 + .../scribble/core/lang/global/GProtocol.java | 8 +- .../core/model/endpoint/AutParser.java | 7 +- .../model/endpoint/EGraphBuilderUtil.java | 1 + .../model/endpoint/EGraphBuilderUtil2.java | 1 + .../org/scribble/core/type/session/Do.java | 5 - .../core/visit/NonProtoDepsCollector.java | 3 +- .../core/visit/ProtoDepsCollector.java | 3 +- .../org/scribble/core/visit/STypeGather.java | 4 +- .../org/scribble/core/visit/Substitutor.java | 110 +++--------------- .../core/visit/global/GTypeInliner.java | 6 +- 12 files changed, 43 insertions(+), 115 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index 7b09ac566..f80b0e5f2 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -23,7 +23,7 @@ import org.scribble.core.lang.global.GProtocol; import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.endpoint.EGraph; -import org.scribble.core.model.endpoint.EGraphBuilderUtil; +import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.model.endpoint.EModelFactory; import org.scribble.core.model.endpoint.EModelFactoryImpl; import org.scribble.core.model.global.SGraph; @@ -89,13 +89,14 @@ public SGraphBuilderUtil newSGraphBuilderUtil() return this.config.sf.newSGraphBuilderUtil(); } + // FIXME: not currently used // A Scribble extension should override newJobConfig/Context/etc as appropriate // CHECKME: not reusable? fix? // Scribble extensions should override these "new" methods // CHECKME: move to MainContext::newJob? - public EGraphBuilderUtil newEGraphBuilderUtil() + public EGraphBuilderUtil2 newEGraphBuilderUtil() { - return new EGraphBuilderUtil(this.config.ef); + return new EGraphBuilderUtil2(this.config.ef); } //public SGraphBuilderUtil newSGraphBuilderUtil() // FIXME TODO global builder util diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java index 2e9920fdb..93596491d 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java @@ -302,6 +302,9 @@ public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) { String aut = runAut(getEGraph(fullname, role).init.toAut(), fulllpn + ".aut"); + + System.out.println("jjj1: " + getEGraph(fullname, role).toAut() + " \n" + aut); + minimised = new AutParser(this.job).parse(aut); addMinimisedEGraph(fulllpn, minimised); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index dbb165fd2..6e4fb80ae 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -105,10 +105,10 @@ else if (n instanceof MessageSigName) SubprotoSig sig = new SubprotoSig(this.fullname, this.roles, params); v.pushSig(sig); - GSeq body = this.def - .visitWith( - new Substitutor<>(this.roles, sig.roles, this.params, sig.args)) - .visitWith(v).visitWith(new RecPruner<>()); + Substitutor subs = new Substitutor<>(this.roles, sig.roles, + this.params, sig.args); + GSeq body = this.def.visitWith(subs).visitWith(v) + .visitWith(new RecPruner<>()); RecVar rv = v.getInlinedRecVar(sig); GRecursion rec = new GRecursion(null, rv, body); // CHECKME: or protodecl source? CommonTree source = getSource(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java index fc9847432..f2cd748f8 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java @@ -114,9 +114,12 @@ public EGraph parse(String aut) term = terms.iterator().next(); } //EGraphBuilderUtil util = new EGraphBuilderUtil(ef); - EGraphBuilderUtil util = this.job2.newEGraphBuilderUtil(); + //EGraphBuilderUtil util = this.job2.newEGraphBuilderUtil2(); + EGraphBuilderUtil2 util = new EGraphBuilderUtil2(this.job2.config.ef); + util.init(null); // FIXME: arg is deprecated Map map = new HashMap<>(); map.put(init, util.getEntry()); + System.out.println("bbb: " + init + " ,, " + util.getEntry()); if (term != -1) { map.put(term, util.getExit()); @@ -141,6 +144,8 @@ public EGraph parse(String aut) //for (int i : edges.keySet()) for (int i : as.keySet()) { + System.out.println("aaa: " + i + " ,, " + map); + EState s = map.get(i); //Map tmp = edges.get(i); List tmp1 = as.get(i); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index a82360674..e6b2f3efb 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -32,6 +32,7 @@ // Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) // Tailored to support graph building from syntactic local protocol choice and recursion +@Deprecated public class EGraphBuilderUtil extends GraphBuilderUtil { diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java index 299d133b8..7212ad55e 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java @@ -32,6 +32,7 @@ import org.scribble.core.type.name.RecVar; import org.scribble.util.ScribException; + // N.B. init must be called before every "new visit", including first // FIXME TODO replace EGraphBuilderUtil // Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) // Tailored to support graph building from syntactic local protocol choice and recursion diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java index b54df8a9f..4f62afcce 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java @@ -59,11 +59,6 @@ public SType visitWith(STypeVisitor v) return v.visitDo(this); } - public N getProtocolName() - { - return this.proto; - } - @Override public String toString() { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsCollector.java index c2617b33d..f6a09efa2 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsCollector.java @@ -75,7 +75,8 @@ else if (p.isGDelegationType()) // TODO FIXME: should be projected to local nam } @Override - public Stream> visitDo(Do> n) + public > Stream> visitDo( + Do n) { return n.args.stream() .filter(x -> (x instanceof MessageSig) || (x instanceof DataType)) // CHECKME: refactor? diff --git a/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java index 47df82b50..752edab9e 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java @@ -27,7 +27,8 @@ public Stream> visitSeq(Seq n) } @Override - public Stream> visitDo(Do> n) + public > Stream> visitDo( + Do n) { return Stream.of(n.proto); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java index 1bc59e437..bf26d4a89 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java @@ -37,7 +37,7 @@ protected Optional> typeSwitch(SType n) : (n instanceof Recursion) ? Optional.of(visitRecursion((Recursion) n)) : (n instanceof Do) - ? Optional.of(visitDo((Do) n)) // FIXME: + ? Optional.of(this.visitDo((Do) n)) // FIXME: : Optional.empty(); // Better for extensibility than "manually" throwing Exception (e.g., for overriding) } @@ -64,7 +64,7 @@ public Stream visitDisconnect(DisconnectAction n) return Stream.of(); } - public Stream visitDo(Do> n) + public > Stream visitDo(Do n) { return Stream.of(); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java index bca001520..d63faffc4 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java @@ -1,10 +1,7 @@ package org.scribble.core.visit; -import java.util.HashMap; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; import org.scribble.core.type.kind.NonRoleParamKind; @@ -14,6 +11,7 @@ import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.Substitutions; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.DirectedInteraction; @@ -26,33 +24,13 @@ public class Substitutor> extends STypeVisitor { - // Old name -> new name - private final Map rsubs = new HashMap<>(); - private final Map, Arg> - asubs = new HashMap<>(); - // Keys are actually simple names (params) - // args are MessageSigName or DataType (but not MessageSig) -- N.B. substitution may replace sig name with a sig - // NonRoleParamKind, not NonRoleArgKind, because latter includes AmbigKind due to parsing requirements - // Better (CHECKME: necessary?) to separate roles and args -- but MessageSigName and DataType need to be distinct (so can group up, cf. NonRoleArgList) + private Substitutions subs; public Substitutor(List rold, List rnew, List> aold, List> anew) { - if (rold.size() != rnew.size()) - { - throw new RuntimeException( - "Role lists don't match: " + rold + " ; " + rnew); - } - if (aold.size() != anew.size()) - { - throw new RuntimeException( - "Arg lists don't match: " + aold + " ; " + anew); - } - Iterator i = rnew.iterator(); - rold.forEach(x -> this.rsubs.put(x, i.next())); - Iterator> j = anew.iterator(); - aold.forEach(x -> this.asubs.put(x, j.next())); + this.subs = new Substitutions(rold, rnew, aold, anew); } @Override @@ -61,7 +39,7 @@ public SType visitChoice(Choice n) List blocks = n.blocks.stream() .map(x -> x.visitWith((STypeVisitor) this)) // FIXME .collect(Collectors.toList()); - return n.reconstruct(n.getSource(), subsRole(n.subj), blocks); + return n.reconstruct(n.getSource(), this.subs.subsRole(n.subj), blocks); } @Override @@ -71,101 +49,43 @@ public SType visitDirectedInteraction(DirectedInteraction n) if (msg instanceof MemberName) { MemberName name = (MemberName) msg; - if (hasArg(name)) + if (this.subs.hasArg(name)) { - msg = (Message) subsArg(name); + msg = (Message) this.subs.subsArg(name); } } - return n.reconstruct(n.getSource(), msg, subsRole(n.src), - subsRole(n.dst)); + return n.reconstruct(n.getSource(), msg, this.subs.subsRole(n.src), + this.subs.subsRole(n.dst)); } @Override public SType visitDisconnect(DisconnectAction n) { - return n.reconstruct(n.getSource(), subsRole(n.left), subsRole(n.right)); + return n.reconstruct(n.getSource(), this.subs.subsRole(n.left), + this.subs.subsRole(n.right)); } @Override public > SType visitDo(Do n) { - List roles = n.roles.stream().map(x -> subsRole(x)) + List roles = n.roles.stream().map(x -> this.subs.subsRole(x)) .collect(Collectors.toList()); List> args = new LinkedList<>(); for (Arg a : n.args) { - if (a instanceof MemberName && hasArg((MemberName) a)) + if (a instanceof MemberName && this.subs.hasArg((MemberName) a)) { if (a instanceof DataType) { - a = subsArg((DataType) a); + a = this.subs.subsArg((DataType) a); } else if (a instanceof MessageSigName) { - a = subsArg((MessageSigName) a); + a = this.subs.subsArg((MessageSigName) a); } } args.add(a); } - return n.reconstruct(n.getSource(), n.getProtocolName(), roles, args); - } - - public Role subsRole(Role old) - { - return this.rsubs.get(old); + return n.reconstruct(n.getSource(), n.proto, roles, args); } - - public // - Arg subsArg(MemberName old) - // ? param more convenient for accepting DataType/MessageSigName params - { - return this.asubs.get(old); - } - - public boolean hasArg(MemberName old) - // ? param more convenient for accepting DataType/MessageSigName params - { - return this.asubs.containsKey(old); - } - - - - - - - - - - - - - /*@Override - public String toString() - { - return this.rsubs + "; " + this.asubs; - } - - @Override - public int hashCode() - { - int hash = 1889; - hash = 31 * hash + this.rsubs.hashCode(); - hash = 31 * hash + this.asubs.hashCode(); - return hash; - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof Substitutions)) - { - return false; - } - Substitutions them = (Substitutions) o; - return this.rsubs.equals(them.rsubs) && this.asubs.equals(them.asubs); - }*/ } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java index 3faf980dc..3e7eb3479 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java @@ -34,9 +34,9 @@ public > GType visitDo(Do n) } pushSig(sig); GProtocol g = this.job.getContext().getIntermediate(fullname); - GSeq inlined = g.def - .visitWith(new Substitutor<>(g.roles, n.roles, g.params, n.args)) - .visitWith(this); + Substitutor subs = new Substitutor<>(g.roles, n.roles, + g.params, n.args); + GSeq inlined = g.def.visitWith(subs).visitWith(this); // i.e. returning a GSeq -- rely on parent GSeq to inline popSig(); return new GRecursion(null, rv, inlined); From c20a18427ca0ee90362ad2997cf8cf914f8e1c13 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 21:50:49 +0100 Subject: [PATCH 218/539] Minor. --- .../codegen/java/sessionapi/SessionApiGenerator.java | 4 ++-- .../src/main/java/org/scribble/core/job/Job.java | 8 ++++---- .../java/org/scribble/core/lang/global/GProtocol.java | 10 +++++----- ...{MessageIdCollector.java => MessageIdGatherer.java} | 2 +- ...otoDepsCollector.java => NonProtoDepsGatherer.java} | 2 +- .../main/java/org/scribble/core/visit/RecPruner.java | 2 +- .../{RecVarCollector.java => RecVarGatherer.java} | 2 +- .../visit/{RoleCollector.java => RoleGatherer.java} | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) rename scribble-core/src/main/java/org/scribble/core/visit/{MessageIdCollector.java => MessageIdGatherer.java} (85%) rename scribble-core/src/main/java/org/scribble/core/visit/{NonProtoDepsCollector.java => NonProtoDepsGatherer.java} (96%) rename scribble-core/src/main/java/org/scribble/core/visit/{RecVarCollector.java => RecVarGatherer.java} (84%) rename scribble-core/src/main/java/org/scribble/core/visit/{RoleCollector.java => RoleGatherer.java} (91%) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index 971e8eb5c..5715c9ff0 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -33,7 +33,7 @@ import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.global.GSeq; -import org.scribble.core.visit.MessageIdCollector; +import org.scribble.core.visit.MessageIdGatherer; import org.scribble.lang.Lang; import org.scribble.util.ScribException; @@ -191,7 +191,7 @@ private void constructOpClasses() throws ScribException for (MessageId mid : coll.getNames())*/ GProtocol inlined = this.job.getContext().getInlined(this.gpn); for (MessageId mid : inlined.def - .gather(new MessageIdCollector()::visit) + .gather(new MessageIdGatherer()::visit) .collect(Collectors.toList())) { //constructOpClass(this.cb.newClass(), mid); diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index f80b0e5f2..4947d5884 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -39,9 +39,9 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.local.LSeq; -import org.scribble.core.visit.NonProtoDepsCollector; +import org.scribble.core.visit.NonProtoDepsGatherer; import org.scribble.core.visit.ProtoDepsCollector; -import org.scribble.core.visit.RoleCollector; +import org.scribble.core.visit.RoleGatherer; import org.scribble.core.visit.global.GTypeInliner; import org.scribble.core.visit.global.GTypeUnfolder; import org.scribble.core.visit.global.Projector; @@ -179,7 +179,7 @@ public void runValidationPasses() throws ScribException // CHECKME: relegate to "warning" ? -- some downsteam operations may depend on this though (e.g., graph building?) // Check unused roles Set used = inlined.def - .gather(new RoleCollector()::visit) + .gather(new RoleGatherer()::visit) .collect(Collectors.toSet()); Set unused = this.context.getIntermediate(inlined.fullname).roles // imeds have original role decls (inlined's are pruned) @@ -308,7 +308,7 @@ public Map getProjections(GProtocolName fullname, } List> ns = proj.def - .gather(new NonProtoDepsCollector()::visit) + .gather(new NonProtoDepsGatherer()::visit) .collect(Collectors.toList()); warningPrintln(""); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 6e4fb80ae..819e4c5e6 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -51,9 +51,9 @@ import org.scribble.core.type.session.global.GRecursion; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.local.LSeq; -import org.scribble.core.visit.MessageIdCollector; +import org.scribble.core.visit.MessageIdGatherer; import org.scribble.core.visit.RecPruner; -import org.scribble.core.visit.RoleCollector; +import org.scribble.core.visit.RoleGatherer; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.Substitutor; @@ -113,7 +113,7 @@ else if (n instanceof MessageSigName) GRecursion rec = new GRecursion(null, rv, body); // CHECKME: or protodecl source? CommonTree source = getSource(); GSeq def = new GSeq(null, Stream.of(rec).collect(Collectors.toList())); - Set used = def.gather(new RoleCollector()::visit) + Set used = def.gather(new RoleGatherer()::visit) .collect(Collectors.toSet()); List rs = this.roles.stream().filter(x -> used.contains(x)) // Prune role decls .collect(Collectors.toList()); @@ -155,7 +155,7 @@ private LProjection projectAux(Role self, List decls, LSeq body) LProtocolName fullname = Projector .projectFullProtocolName(this.fullname, self); Set tmp = //body.getRoles(); - body.gather(new RoleCollector()::visit) + body.gather(new RoleGatherer()::visit) .collect(Collectors.toSet()); List roles = decls.stream() .filter(x -> x.equals(self) || tmp.contains(x)) // Implicitly filters Role.SELF @@ -243,7 +243,7 @@ public static void validateBySpin(Job job2, GProtocolName fullname) gpd.accept(coll); Set> mids = coll.getNames();*/ Set> mids = gpd.def.//getMessageIds(); - gather(new MessageIdCollector()::visit) + gather(new MessageIdGatherer()::visit) .collect(Collectors.toSet()); //..........FIXME: get mids from SType, instead of old AST Collector diff --git a/scribble-core/src/main/java/org/scribble/core/visit/MessageIdCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java similarity index 85% rename from scribble-core/src/main/java/org/scribble/core/visit/MessageIdCollector.java rename to scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java index 883a1d15a..deeead037 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/MessageIdCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java @@ -7,7 +7,7 @@ import org.scribble.core.type.session.DirectedInteraction; import org.scribble.core.type.session.Seq; -public class MessageIdCollector> +public class MessageIdGatherer> extends STypeGather> { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsCollector.java rename to scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java index f6a09efa2..31cadaef9 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java @@ -23,7 +23,7 @@ // Result should not contain duplicates (i.e., due to Choice/Seq) // Result does not necessarily contain root proto (protodecl is not an SType), but may do so via dependencies // N.B. delegation payloads currently gathered here, not by getProtoDependencies -- CHECKME: refactor? -public class NonProtoDepsCollector> +public class NonProtoDepsGatherer> extends STypeGather> { @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java index 4f12cb914..262e66139 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java @@ -19,7 +19,7 @@ public class RecPruner> public SType visitRecursion(Recursion n) { // Assumes no shadowing (e.g., use after SType#getInlined recvar disamb) - Set rvs = n.body.gather(new RecVarCollector()::visit) + Set rvs = n.body.gather(new RecVarGatherer()::visit) .collect(Collectors.toSet()); return rvs.contains(n.recvar) ? n diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecVarCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java similarity index 84% rename from scribble-core/src/main/java/org/scribble/core/visit/RecVarCollector.java rename to scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java index 5aafa6c15..4bf64ffc1 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecVarCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java @@ -7,7 +7,7 @@ import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.Seq; -public class RecVarCollector> +public class RecVarGatherer> extends STypeGather { @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RoleCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java similarity index 91% rename from scribble-core/src/main/java/org/scribble/core/visit/RoleCollector.java rename to scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java index 86dc45108..280b3e845 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RoleCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java @@ -9,7 +9,7 @@ import org.scribble.core.type.session.DisconnectAction; import org.scribble.core.type.session.Seq; -public class RoleCollector> +public class RoleGatherer> extends STypeGather { From 6f9a8c80471b556183e367646ba1bb301e96b773 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 21:55:14 +0100 Subject: [PATCH 219/539] Factored out core InlinedVisitor. --- .../org/scribble/core/visit/InlinedVisitor.java | 17 +++++++++++++++++ .../org/scribble/core/visit/STypeUnfolder.java | 10 +--------- 2 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitor.java diff --git a/scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitor.java new file mode 100644 index 000000000..ffd8d1647 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitor.java @@ -0,0 +1,17 @@ +package org.scribble.core.visit; + +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.Seq; + +public abstract class InlinedVisitor> + extends STypeVisitor +{ + @Override + public final > SType visitDo(Do n) + { + throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java index 04e2281a9..d59ebc5f7 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java @@ -6,25 +6,17 @@ import java.util.Map; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.session.Do; import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; // Not supported for Do public abstract class STypeUnfolder> - extends STypeVisitor + extends InlinedVisitor { private final Map> recs = new HashMap<>(); - @Override - public > SType visitDo(Do n) - { - throw new RuntimeException("Unsupported for Do: " + n); - } - @Override public SType visitRecursion(Recursion n) { From 62ebd3d1ed47a7f6e84bd225e532ab29177c6615 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 22:38:50 +0100 Subject: [PATCH 220/539] Added core STypeVisitorNoEx. --- .../scribble/core/lang/global/GProtocol.java | 8 +- .../scribble/core/type/session/Choice.java | 10 +- .../scribble/core/type/session/Continue.java | 10 +- .../type/session/DirectedInteraction.java | 10 +- .../core/type/session/DisconnectAction.java | 10 +- .../org/scribble/core/type/session/Do.java | 10 +- .../scribble/core/type/session/Recursion.java | 10 +- .../org/scribble/core/type/session/SType.java | 6 +- .../org/scribble/core/type/session/Seq.java | 12 ++- .../core/type/session/local/LSkip.java | 7 ++ ...edVisitor.java => InlinedVisitorNoEx.java} | 4 +- .../org/scribble/core/visit/RecPruner.java | 4 +- .../org/scribble/core/visit/STypeInliner.java | 27 +++--- .../scribble/core/visit/STypeUnfolder.java | 14 +-- .../org/scribble/core/visit/STypeVisitor.java | 34 ++++--- .../scribble/core/visit/STypeVisitorNoEx.java | 92 +++++++++++++++++++ .../org/scribble/core/visit/Substitutor.java | 5 +- .../core/visit/global/GTypeInliner.java | 2 +- .../core/visit/local/LTypeInliner.java | 2 +- 19 files changed, 222 insertions(+), 55 deletions(-) rename scribble-core/src/main/java/org/scribble/core/visit/{InlinedVisitor.java => InlinedVisitorNoEx.java} (78%) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 819e4c5e6..eed093126 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -107,8 +107,8 @@ else if (n instanceof MessageSigName) Substitutor subs = new Substitutor<>(this.roles, sig.roles, this.params, sig.args); - GSeq body = this.def.visitWith(subs).visitWith(v) - .visitWith(new RecPruner<>()); + GSeq body = this.def.visitWithNoEx(subs).visitWithNoEx(v) + .visitWithNoEx(new RecPruner<>()); RecVar rv = v.getInlinedRecVar(sig); GRecursion rec = new GRecursion(null, rv, body); // CHECKME: or protodecl source? CommonTree source = getSource(); @@ -124,7 +124,7 @@ else if (n instanceof MessageSigName) @Override public GProtocol unfoldAllOnce(STypeUnfolder v) { - GSeq unf = (GSeq) this.def.visitWith(v); + GSeq unf = (GSeq) this.def.visitWithNoEx(v); return reconstruct(getSource(), this.mods, this.fullname, this.roles, this.params, unf); } @@ -168,7 +168,7 @@ private LProjection projectAux(Role self, List decls, LSeq body) public LProjection project(Projector v) { - LSeq body = (LSeq) this.def.project(v).visitWith(new RecPruner<>()); + LSeq body = (LSeq) this.def.project(v).visitWithNoEx(new RecPruner<>()); return projectAux(v.self, v.job.getContext().getInlined(this.fullname).roles, // Used inlined decls, already pruned body); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java index 32058e179..ac03c4b63 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java @@ -23,6 +23,8 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; import org.scribble.core.visit.STypeVisitor; +import org.scribble.core.visit.STypeVisitorNoEx; +import org.scribble.util.ScribException; public abstract class Choice> extends STypeBase implements SType @@ -51,7 +53,13 @@ public Stream gather(Function, Stream> f) } @Override - public SType visitWith(STypeVisitor v) + public SType visitWith(STypeVisitor v) throws ScribException + { + return v.visitChoice(this); + } + + @Override + public SType visitWithNoEx(STypeVisitorNoEx v) { return v.visitChoice(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java index 12d09afbb..4ac2cb584 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java @@ -20,6 +20,8 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.RecVar; import org.scribble.core.visit.STypeVisitor; +import org.scribble.core.visit.STypeVisitorNoEx; +import org.scribble.util.ScribException; public abstract class Continue> extends STypeBase @@ -44,7 +46,13 @@ public Stream gather(Function, Stream> f) } @Override - public SType visitWith(STypeVisitor v) + public SType visitWith(STypeVisitor v) throws ScribException + { + return v.visitContinue(this); + } + + @Override + public SType visitWithNoEx(STypeVisitorNoEx v) { return v.visitContinue(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java index 470bd39ba..2e76f2eec 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java @@ -20,6 +20,8 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; import org.scribble.core.visit.STypeVisitor; +import org.scribble.core.visit.STypeVisitorNoEx; +import org.scribble.util.ScribException; // Besides directed-ness, also features a Message public abstract class DirectedInteraction> @@ -50,7 +52,13 @@ public Stream gather(Function, Stream> f) } @Override - public SType visitWith(STypeVisitor v) + public SType visitWith(STypeVisitor v) throws ScribException + { + return v.visitDirectedInteraction(this); + } + + @Override + public SType visitWithNoEx(STypeVisitorNoEx v) { return v.visitDirectedInteraction(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java index f98197c98..540803ff1 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java @@ -20,6 +20,8 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; import org.scribble.core.visit.STypeVisitor; +import org.scribble.core.visit.STypeVisitorNoEx; +import org.scribble.util.ScribException; // Base class would be "SymmetricInteraction" (cf., DirectedInteraction) public abstract class DisconnectAction> @@ -46,7 +48,13 @@ public Stream gather(Function, Stream> f) } @Override - public SType visitWith(STypeVisitor v) + public SType visitWith(STypeVisitor v) throws ScribException + { + return v.visitDisconnect(this); + } + + @Override + public SType visitWithNoEx(STypeVisitorNoEx v) { return v.visitDisconnect(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java index 4f62afcce..3b1077c66 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java @@ -25,6 +25,8 @@ import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.core.visit.STypeVisitor; +import org.scribble.core.visit.STypeVisitorNoEx; +import org.scribble.util.ScribException; public abstract class Do , N extends ProtocolName> @@ -54,7 +56,13 @@ public Stream gather(Function, Stream> f) } @Override - public SType visitWith(STypeVisitor v) + public SType visitWith(STypeVisitor v) throws ScribException + { + return v.visitDo(this); + } + + @Override + public SType visitWithNoEx(STypeVisitorNoEx v) { return v.visitDo(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java index 6e3d21817..88aabf3fc 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java @@ -20,6 +20,8 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.RecVar; import org.scribble.core.visit.STypeVisitor; +import org.scribble.core.visit.STypeVisitorNoEx; +import org.scribble.util.ScribException; public abstract class Recursion> extends STypeBase @@ -43,7 +45,13 @@ public Stream gather(Function, Stream> f) } @Override - public SType visitWith(STypeVisitor v) + public SType visitWith(STypeVisitor v) throws ScribException + { + return v.visitRecursion(this); + } + + @Override + public SType visitWithNoEx(STypeVisitorNoEx v) { return v.visitRecursion(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index caa757f0e..f37857c48 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -19,6 +19,8 @@ import org.scribble.core.lang.SNode; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.visit.STypeVisitor; +import org.scribble.core.visit.STypeVisitorNoEx; +import org.scribble.util.ScribException; // B needed(?) to factor up several methods from G/L compounds to bases, e.g., getInlined and unfoldAllOnce @@ -28,7 +30,9 @@ public interface SType> { Stream gather(Function, Stream> f); - SType visitWith(STypeVisitor v); + SType visitWith(STypeVisitor v) throws ScribException; + + SType visitWithNoEx(STypeVisitorNoEx v); // subclass equals should call this by: them.canEquals(this) boolean canEquals(Object o); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java index 916555d39..f2844c08a 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java @@ -22,6 +22,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.visit.STypeVisitor; +import org.scribble.core.visit.STypeVisitorNoEx; +import org.scribble.util.ScribException; public abstract class Seq> extends STypeBase @@ -45,7 +47,15 @@ public Stream gather(Function, Stream> f) } @Override - public B visitWith(STypeVisitor v) + public B visitWith(STypeVisitor v) throws ScribException + { + @SuppressWarnings("unchecked") + B cast = (B) this; // CHECKME: OK as long as G/LSeq specify themselves as B param + return v.visitSeq(cast); + } + + @Override + public B visitWithNoEx(STypeVisitorNoEx v) { @SuppressWarnings("unchecked") B cast = (B) this; // CHECKME: OK as long as G/LSeq specify themselves as B param diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java index 3f7c56b5f..3e5cbe4e1 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java @@ -23,6 +23,7 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.STypeBase; import org.scribble.core.visit.STypeVisitor; +import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.core.visit.local.ReachabilityEnv; import org.scribble.util.ScribException; @@ -48,6 +49,12 @@ public LSkip visitWith(STypeVisitor v) throw new RuntimeException("Unsupported for Skip: " + this); } + @Override + public LSkip visitWithNoEx(STypeVisitorNoEx v) + { + throw new RuntimeException("Unsupported for Skip: " + this); + } + @Override public boolean isSingleConts(Set rvs) { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitorNoEx.java similarity index 78% rename from scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitor.java rename to scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitorNoEx.java index ffd8d1647..14b3bbd75 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitorNoEx.java @@ -6,8 +6,8 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; -public abstract class InlinedVisitor> - extends STypeVisitor +public abstract class InlinedVisitorNoEx> + extends STypeVisitorNoEx { @Override public final > SType visitDo(Do n) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java index 262e66139..abf2d10ba 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java @@ -13,7 +13,7 @@ // Assumes no shadowing (e.g., use after inlining recvar disamb) public class RecPruner> - extends STypeVisitor + extends STypeVisitorNoEx { @Override public SType visitRecursion(Recursion n) @@ -32,7 +32,7 @@ public B visitSeq(B n) List> elems = new LinkedList<>(); for (SType e : n.elems) { - SType e1 = (SType) e.visitWith(this); + SType e1 = (SType) e.visitWithNoEx(this); if (e1 instanceof Seq) // cf. Recursion::pruneRecs { elems.addAll(((Seq) e1).getElements()); // Handles empty Seq case diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java index 901a1c937..e0b9cced8 100755 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java @@ -18,7 +18,7 @@ import org.scribble.core.type.session.Seq; public abstract class STypeInliner> - extends STypeVisitor + extends STypeVisitorNoEx { public final Job job; @@ -48,7 +48,7 @@ public SType visitRecursion(Recursion n) { CommonTree source = n.getSource(); // CHECKME: or empty source? RecVar rv = enterRec(n.recvar); // FIXME: make GTypeInliner, and record recvars to check freshness (e.g., rec X in two choice cases) - B body = n.body.visitWith(this);//, stack); + B body = n.body.visitWithNoEx(this); Recursion res = n.reconstruct(source, rv, body); exitRec(n.recvar); return res; @@ -60,7 +60,7 @@ public B visitSeq(B n) List> elems = new LinkedList<>(); for (SType e : n.elems) { - SType e1 = e.visitWith(this); + SType e1 = e.visitWithNoEx(this); if (e1 instanceof Seq) { elems.addAll(((Seq) e1).elems); @@ -73,7 +73,7 @@ public B visitSeq(B n) return n.reconstruct(n.getSource(), elems); } - public void pushRec(RecVar rv, Seq body) + protected void pushRec(RecVar rv, Seq body) { if (this.recs.containsKey(rv)) { @@ -82,17 +82,17 @@ public void pushRec(RecVar rv, Seq body) this.recs.put(rv, body); } - public boolean hasRec(RecVar rv) + protected boolean hasRec(RecVar rv) { return this.recs.containsKey(rv); } - public Seq getRec(RecVar rv) + protected Seq getRec(RecVar rv) { return this.recs.get(rv); } - public void popRec(RecVar rv) + protected void popRec(RecVar rv) { this.recs.remove(rv); } @@ -106,17 +106,17 @@ public void pushSig(SubprotoSig sig) this.stack.push(sig); } - public SubprotoSig peek() + protected SubprotoSig peek() { return this.stack.peek(); } - public boolean hasSig(SubprotoSig sig) + protected boolean hasSig(SubprotoSig sig) { return this.stack.contains(sig); } - public void popSig() + protected void popSig() { this.stack.pop(); } @@ -132,8 +132,7 @@ public RecVar getInlinedRecVar(SubprotoSig sig) return new RecVar(lab); } - public RecVar enterRec(//SubprotoSig sig, - RecVar rv) + protected RecVar enterRec(RecVar rv) { String text = getInlinedRecVar(this.stack.peek()) + "__" + rv; if (this.counter.containsKey(rv)) @@ -158,12 +157,12 @@ public RecVar enterRec(//SubprotoSig sig, } // For Continue - public RecVar getInlinedRecVar(RecVar rv) + protected RecVar getInlinedRecVar(RecVar rv) { return this.recvars.get(rv).peek(); } - public void exitRec(RecVar rv) + protected void exitRec(RecVar rv) { this.recvars.get(rv).pop(); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java index d59ebc5f7..c4de9baf2 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java @@ -13,7 +13,7 @@ // Not supported for Do public abstract class STypeUnfolder> - extends InlinedVisitor + extends InlinedVisitorNoEx { private final Map> recs = new HashMap<>(); @@ -23,7 +23,7 @@ public SType visitRecursion(Recursion n) if (!hasRec(n.recvar)) // N.B. doesn't work if recvars shadowed { pushRec(n.recvar, n.body); - SType unf = n.body.visitWith(this); + SType unf = n.body.visitWithNoEx(this); popRec(n.recvar); // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs return unf; @@ -37,7 +37,7 @@ public B visitSeq(B n) List> elems = new LinkedList<>(); for (SType e : n.elems) { - SType e1 = e.visitWith(this); + SType e1 = e.visitWithNoEx(this); if (e1 instanceof Seq) { elems.addAll(((Seq) e1).elems); @@ -50,7 +50,7 @@ public B visitSeq(B n) return n.reconstruct(n.getSource(), elems); } - public void pushRec(RecVar rv, Seq body) + protected void pushRec(RecVar rv, Seq body) { if (this.recs.containsKey(rv)) { @@ -59,17 +59,17 @@ public void pushRec(RecVar rv, Seq body) this.recs.put(rv, body); } - public boolean hasRec(RecVar rv) + protected boolean hasRec(RecVar rv) { return this.recs.containsKey(rv); } - public Seq getRec(RecVar rv) + protected Seq getRec(RecVar rv) { return this.recs.get(rv); } - public void popRec(RecVar rv) + protected void popRec(RecVar rv) { this.recs.remove(rv); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java index eda2d7a3c..6d32cdb53 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java @@ -1,7 +1,7 @@ package org.scribble.core.visit; +import java.util.LinkedList; import java.util.List; -import java.util.stream.Collectors; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.ProtocolName; @@ -13,45 +13,51 @@ import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; +import org.scribble.util.ScribException; public abstract class STypeVisitor> { // SType return for extensibility/flexibility - public SType visitContinue(Continue n) + public SType visitContinue(Continue n) throws ScribException { //return n.reconstruct(n.getSource(), n.recvar); return n; } - public SType visitChoice(Choice n) + public SType visitChoice(Choice n) throws ScribException { - List blocks = n.blocks.stream() - .map(x -> x.visitWith((STypeVisitor) this)) // FIXME - .collect(Collectors.toList()); + List blocks = new LinkedList<>(); + for (B b : n.blocks) + { + blocks.add(b.visitWith(this)); + } return n.reconstruct(n.getSource(), n.subj, blocks); } - public SType visitDirectedInteraction(DirectedInteraction n) + public SType visitDirectedInteraction(DirectedInteraction n) + throws ScribException { //return n.reconstruct(n.getSource(), n.msg, n.src, n.dst); return n; } public SType visitDisconnect(DisconnectAction n) + throws ScribException { //return n.reconstruct(n.getSource(), n.left, n.right); return n; } public > SType visitDo(Do n) + throws ScribException { //return n.reconstruct(n.getSource(), n.proto, n.roles, n.args); return n; } - public SType visitRecursion(Recursion n) + public SType visitRecursion(Recursion n) throws ScribException { - B body = n.body.visitWith((STypeVisitor) this); // FIXME + B body = n.body.visitWith(this); return n.reconstruct(n.getSource(), n.recvar, body); } @@ -59,11 +65,13 @@ public SType visitRecursion(Recursion n) // This means a Visitor that needs to restructure a Seq should handle this within visitSeq // E.g., Seq "injection" by inlining and unfolding // For this purpose, visited children passed "directly" instead of via a reconstruction (cf. above methods) - public B visitSeq(B n) + public B visitSeq(B n) throws ScribException { - List> elems = n.elems.stream() - .map(x -> x.visitWith((STypeVisitor) this)) // FIXME - .collect(Collectors.toList()); + List> elems = new LinkedList<>(); + for (SType e : n.elems) + { + elems.add(e.visitWith(this)); + } return n.reconstruct(n.getSource(), elems); } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java new file mode 100644 index 000000000..38e017e27 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java @@ -0,0 +1,92 @@ +package org.scribble.core.visit; + +import java.util.List; +import java.util.stream.Collectors; + +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.Continue; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.DisconnectAction; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.Seq; + +public abstract class STypeVisitorNoEx> + //extends STypeVisitor // Not useful, and causes mixups ? +{ + // SType return for extensibility/flexibility + public SType visitContinue(Continue n) + { + return n; + } + + public SType visitChoice(Choice n) + { + List blocks = n.blocks.stream().map(x -> x.visitWithNoEx(this)) + .collect(Collectors.toList()); + return n.reconstruct(n.getSource(), n.subj, blocks); + } + + public SType visitDirectedInteraction(DirectedInteraction n) + { + //return n.reconstruct(n.getSource(), n.msg, n.src, n.dst); + return n; + } + + public SType visitDisconnect(DisconnectAction n) + { + //return n.reconstruct(n.getSource(), n.left, n.right); + return n; + } + + public > SType visitDo(Do n) + { + //return n.reconstruct(n.getSource(), n.proto, n.roles, n.args); + return n; + } + + public SType visitRecursion(Recursion n) + { + B body = n.body.visitWithNoEx(this); + return n.reconstruct(n.getSource(), n.recvar, body); + } + + // "Hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction + // This means a Visitor that needs to restructure a Seq should handle this within visitSeq + // E.g., Seq "injection" by inlining and unfolding + // For this purpose, visited children passed "directly" instead of via a reconstruction (cf. above methods) + public B visitSeq(B n) + { + List> elems = n.elems.stream().map(x -> x.visitWithNoEx(this)) + .collect(Collectors.toList()); + return n.reconstruct(n.getSource(), elems); + } +} + + + + + + + + + + + + + + + + + + + + +/*@FunctionalInterface +interface STypeVisitorFunction, R extends Stream> +{ + R f(SType n, STypeVisitor v); +}*/ diff --git a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java index d63faffc4..32a5eee40 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java @@ -22,7 +22,7 @@ import org.scribble.core.type.session.Seq; public class Substitutor> - extends STypeVisitor + extends STypeVisitorNoEx { private Substitutions subs; @@ -36,8 +36,7 @@ public Substitutor(List rold, List rnew, @Override public SType visitChoice(Choice n) { - List blocks = n.blocks.stream() - .map(x -> x.visitWith((STypeVisitor) this)) // FIXME + List blocks = n.blocks.stream().map(x -> x.visitWithNoEx(this)) .collect(Collectors.toList()); return n.reconstruct(n.getSource(), this.subs.subsRole(n.subj), blocks); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java index 3e7eb3479..b51217f92 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java @@ -36,7 +36,7 @@ public > GType visitDo(Do n) GProtocol g = this.job.getContext().getIntermediate(fullname); Substitutor subs = new Substitutor<>(g.roles, n.roles, g.params, n.args); - GSeq inlined = g.def.visitWith(subs).visitWith(this); + GSeq inlined = g.def.visitWithNoEx(subs).visitWithNoEx(this); // i.e. returning a GSeq -- rely on parent GSeq to inline popSig(); return new GRecursion(null, rv, inlined); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java index d8bedc8c0..3f91fe94f 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java @@ -36,7 +36,7 @@ public > LType visitDo(Do n) LProtocol p = this.job.getContext().getProjection(fullname); // This line differs from GDo version Substitutor subs = new Substitutor<>(p.roles, n.roles, p.params, n.args); - LSeq inlined = p.def.visitWith(subs).visitWith(this); + LSeq inlined = p.def.visitWithNoEx(subs).visitWithNoEx(this); // i.e. returning a Seq -- rely on parent Seq to inline popSig(); return new LRecursion(null, rv, inlined); From fecfd5f5a8c4590874dea49aed61bbb792286f2e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 22:51:39 +0100 Subject: [PATCH 221/539] Factored out RoleEnablingChecker. --- .../scribble/core/lang/global/GProtocol.java | 7 +- .../scribble/core/lang/local/LProtocol.java | 6 +- .../scribble/core/visit/InlinedVisitor.java | 19 ++++ .../core/visit/RoleEnablingChecker.java | 103 ++++++++++++++++++ 4 files changed, 130 insertions(+), 5 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitor.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/RoleEnablingChecker.java diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index eed093126..6cd1c612d 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -53,6 +53,7 @@ import org.scribble.core.type.session.local.LSeq; import org.scribble.core.visit.MessageIdGatherer; import org.scribble.core.visit.RecPruner; +import org.scribble.core.visit.RoleEnablingChecker; import org.scribble.core.visit.RoleGatherer; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; @@ -132,8 +133,10 @@ public GProtocol unfoldAllOnce(STypeUnfolder v) // Following are some top-level entry to GType methods public Set checkRoleEnabling() throws ScribException { - Set tmp = this.roles.stream().collect(Collectors.toSet()); - return this.def.checkRoleEnabling(tmp); + Set rs = this.roles.stream().collect(Collectors.toSet()); + RoleEnablingChecker v = new RoleEnablingChecker(rs); + this.def.visitWith(v); + return v.getEnabled(); } public Map checkExtChoiceConsistency() throws ScribException diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index c698b0928..8fcdaf472 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -97,8 +97,8 @@ else if (n instanceof MessageSigName) Substitutor subs = new Substitutor<>(this.roles, sig.roles, this.params, sig.args); LTypeInliner linl = new LTypeInliner(v.job); - LSeq body = this.def.visitWith(subs).visitWith(linl) - .visitWith(new RecPruner<>()); + LSeq body = this.def.visitWithNoEx(subs).visitWithNoEx(linl) + .visitWithNoEx(new RecPruner<>()); RecVar rv = v.getInlinedRecVar(sig); LRecursion rec = new LRecursion(null, rv, body); // CHECKME: or protodecl source? CommonTree source = getSource(); // CHECKME: or null source? @@ -110,7 +110,7 @@ else if (n instanceof MessageSigName) @Override public LProtocol unfoldAllOnce(STypeUnfolder v) { - LSeq unf = (LSeq) this.def.visitWith(v); + LSeq unf = (LSeq) this.def.visitWithNoEx(v); return reconstruct(getSource(), this.mods, this.fullname, this.roles, this.self, this.params, unf); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitor.java new file mode 100644 index 000000000..5864838de --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitor.java @@ -0,0 +1,19 @@ +package org.scribble.core.visit; + +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.Seq; +import org.scribble.util.ScribException; + +public abstract class InlinedVisitor> + extends STypeVisitor +{ + @Override + public final > SType visitDo(Do n) + throws ScribException + { + throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RoleEnablingChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/RoleEnablingChecker.java new file mode 100644 index 000000000..c91951746 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/RoleEnablingChecker.java @@ -0,0 +1,103 @@ +package org.scribble.core.visit; + +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.DisconnectAction; +import org.scribble.core.type.session.global.GSeq; +import org.scribble.util.ScribException; + +// Not supported for Do +public class RoleEnablingChecker extends InlinedVisitor +{ + private Set enabled; + + public RoleEnablingChecker() + { + this(Collections.emptySet()); + } + + public RoleEnablingChecker(Set enabled) + { + setEnabled(enabled); + } + + public Choice visitChoice(Choice n) + throws ScribException + { + Set enabled = new HashSet<>(getEnabled()); + if (!enabled.contains(n.subj)) + { + throw new ScribException("Subject not enabled: " + n.subj); + } + Set subj = Stream.of(n.subj).collect(Collectors.toSet()); + RoleEnablingChecker nested = new RoleEnablingChecker(); + List> blocks = new LinkedList<>(); + for (GSeq block : n.blocks) + { + nested.setEnabled(subj); // Copies defensively + block.visitWith(nested); + blocks.add(nested.getEnabled()); + } + Set res = new HashSet<>(enabled); + Set tmp = blocks.stream().flatMap(x -> x.stream()) + .filter(x -> blocks.stream().allMatch(y -> y.contains(x))) + .collect(Collectors.toSet()); + res.addAll(tmp); + setEnabled(res); + return n; + } + + @Override + public DirectedInteraction visitDirectedInteraction( + DirectedInteraction n) throws ScribException + { + Set enabled = new HashSet<>(getEnabled()); + if (!enabled.contains(n.src)) + { + throw new ScribException("Source role not enabled: " + n.src); + } + if (enabled.contains(n.dst)) + { + return n; + } + enabled.add(n.dst); + setEnabled(enabled); + return n; + } + + @Override + public DisconnectAction visitDisconnect( + DisconnectAction n) throws ScribException + { + Set enabled = getEnabled(); + if (!enabled.contains(n.left)) + { + throw new ScribException("Role not enabled: " + n.left); + } + if (!enabled.contains(n.right)) + { + throw new ScribException("Role not enabled: " + n.right); + } + return n; + } + + public Set getEnabled() + { + return this.enabled; + } + + public void setEnabled(Set enabled) + { + this.enabled = Collections.unmodifiableSet(enabled); + } +} From db9f68250c155978ffffaf90425f1f956f191ee4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 22:56:16 +0100 Subject: [PATCH 222/539] Minor. --- .../scribble/core/visit/RoleEnablingChecker.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RoleEnablingChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/RoleEnablingChecker.java index c91951746..3782f096d 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RoleEnablingChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RoleEnablingChecker.java @@ -19,11 +19,11 @@ // Not supported for Do public class RoleEnablingChecker extends InlinedVisitor { - private Set enabled; + private Set enabled; // Invariant: unmodifiable public RoleEnablingChecker() { - this(Collections.emptySet()); + this.enabled = Collections.emptySet(); // Already immutable } public RoleEnablingChecker(Set enabled) @@ -34,7 +34,7 @@ public RoleEnablingChecker(Set enabled) public Choice visitChoice(Choice n) throws ScribException { - Set enabled = new HashSet<>(getEnabled()); + Set enabled = getEnabled(); if (!enabled.contains(n.subj)) { throw new ScribException("Subject not enabled: " + n.subj); @@ -61,7 +61,7 @@ public Choice visitChoice(Choice n) public DirectedInteraction visitDirectedInteraction( DirectedInteraction n) throws ScribException { - Set enabled = new HashSet<>(getEnabled()); + Set enabled = getEnabled(); if (!enabled.contains(n.src)) { throw new ScribException("Source role not enabled: " + n.src); @@ -70,8 +70,9 @@ public DirectedInteraction visitDirectedInteraction( { return n; } - enabled.add(n.dst); - setEnabled(enabled); + Set res = new HashSet<>(enabled); + res.add(n.dst); + setEnabled(res); return n; } @@ -96,7 +97,7 @@ public Set getEnabled() return this.enabled; } - public void setEnabled(Set enabled) + protected void setEnabled(Set enabled) { this.enabled = Collections.unmodifiableSet(enabled); } From 9798fd8eb06c3e5fd011c481b25cf087a066ac5b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 23:07:35 +0100 Subject: [PATCH 223/539] Factored out ExtChoiceConsistencyChecker. --- .../scribble/core/lang/global/GProtocol.java | 11 ++- .../core/type/session/global/GChoice.java | 98 +++++++++---------- .../core/type/session/global/GConnect.java | 79 ++++++++------- .../core/type/session/global/GContinue.java | 45 +++++---- .../core/type/session/global/GDisconnect.java | 63 +++++++----- .../core/type/session/global/GDo.java | 50 ++++++---- .../type/session/global/GMessageTransfer.java | 81 ++++++++------- .../core/type/session/global/GRecursion.java | 45 ++++++--- .../core/type/session/global/GSeq.java | 75 +++++++------- .../core/type/session/global/GType.java | 27 +++-- .../core/visit/RoleEnablingChecker.java | 2 +- 11 files changed, 329 insertions(+), 247 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 6cd1c612d..743de4b9e 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -51,6 +51,7 @@ import org.scribble.core.type.session.global.GRecursion; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.visit.ExtChoiceConsistencyChecker; import org.scribble.core.visit.MessageIdGatherer; import org.scribble.core.visit.RecPruner; import org.scribble.core.visit.RoleEnablingChecker; @@ -131,19 +132,21 @@ public GProtocol unfoldAllOnce(STypeUnfolder v) } // Following are some top-level entry to GType methods - public Set checkRoleEnabling() throws ScribException + public void checkRoleEnabling() throws ScribException { Set rs = this.roles.stream().collect(Collectors.toSet()); RoleEnablingChecker v = new RoleEnablingChecker(rs); this.def.visitWith(v); - return v.getEnabled(); + //return v.getEnabled(); } - public Map checkExtChoiceConsistency() throws ScribException + public void checkExtChoiceConsistency() throws ScribException { Map tmp = this.roles.stream() .collect(Collectors.toMap(x -> x, x -> x)); - return this.def.checkExtChoiceConsistency(tmp); + ExtChoiceConsistencyChecker v = new ExtChoiceConsistencyChecker(tmp); + this.def.visitWith(v); + //return v.getEnablers(); } // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java index 2f604edf7..9edff377b 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java @@ -13,14 +13,7 @@ */ package org.scribble.core.type.session.global; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -33,7 +26,6 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.global.Projector; -import org.scribble.util.ScribException; public class GChoice extends Choice implements GType { @@ -92,6 +84,51 @@ public LType project(Projector v) return projectAux(v.self, this.blocks.stream().map(x -> x.project(v))); } + @Override + public int hashCode() + { + int hash = 3067; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof GChoice)) + { + return false; + } + return super.equals(o); + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof GChoice; + } +} + + + + + + + + + + + + + + + + +/* @Override public Set checkRoleEnabling(Set enabled) throws ScribException { @@ -146,47 +183,4 @@ public Map checkExtChoiceConsistency(Map enablers) } return Collections.unmodifiableMap(res); } - - /*@Override - public Map checkConnections(Map conns) - throws ScribbleException - { - List> blocks = new LinkedList<>(); - for (GSeq block : this.blocks) - { - blocks.add(block.checkConnections(conns)); - } - return blocks.stream().flatMap(x -> x.entrySet().stream()).distinct() - .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); - // "may" merge -- check for possible duplicate connections - // FIXME: but unconnected error needs "must" connections; also "duplicate" disconnect - }*/ - - @Override - public int hashCode() - { - int hash = 3067; - hash = 31 * hash + super.hashCode(); - return hash; - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof GChoice)) - { - return false; - } - return super.equals(o); - } - - @Override - public boolean canEquals(Object o) - { - return o instanceof GChoice; - } -} + }*/ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java index 25cf2930e..dbd55e233 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java @@ -13,12 +13,6 @@ */ package org.scribble.core.type.session.global; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; @@ -29,7 +23,6 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.global.Projector; -import org.scribble.util.ScribException; public class GConnect extends ConnectAction implements GType @@ -76,35 +69,6 @@ public LType project(Projector v) return projectInlined(v.self); // No need for "aux", no recursive call } - @Override - public Set checkRoleEnabling(Set enabled) throws ScribException - { - if (!enabled.contains(this.src)) - { - throw new ScribException("Source role not enabled: " + this.src); - } - if (enabled.contains(this.dst)) - { - return enabled; - } - Set tmp = new HashSet<>(enabled); - tmp.add(this.dst); - return Collections.unmodifiableSet(tmp); - } - - @Override - public Map checkExtChoiceConsistency(Map enablers) - throws ScribException - { - if (enablers.containsKey(this.dst)) - { - return enablers; - } - Map tmp = new HashMap<>(enablers); - tmp.put(this.dst, this.src); - return Collections.unmodifiableMap(tmp); - } - @Override public String toString() { @@ -139,3 +103,46 @@ public boolean canEquals(Object o) return o instanceof GConnect; } } + + + + + + + + + + + + + + +/* + @Override + public Set checkRoleEnabling(Set enabled) throws ScribException + { + if (!enabled.contains(this.src)) + { + throw new ScribException("Source role not enabled: " + this.src); + } + if (enabled.contains(this.dst)) + { + return enabled; + } + Set tmp = new HashSet<>(enabled); + tmp.add(this.dst); + return Collections.unmodifiableSet(tmp); + } + + @Override + public Map checkExtChoiceConsistency(Map enablers) + throws ScribException + { + if (enablers.containsKey(this.dst)) + { + return enablers; + } + Map tmp = new HashMap<>(enablers); + tmp.put(this.dst, this.src); + return Collections.unmodifiableMap(tmp); + */ diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java index 0546786f4..c670917f7 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java @@ -13,9 +13,6 @@ */ package org.scribble.core.type.session.global; -import java.util.Map; -import java.util.Set; - import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.RecVar; @@ -23,7 +20,6 @@ import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.local.LContinue; import org.scribble.core.visit.global.Projector; -import org.scribble.util.ScribException; public class GContinue extends Continue implements GType { @@ -53,19 +49,6 @@ public LContinue project(Projector v) return projectInlined(v.self); // No need for "aux", no recursive call } - @Override - public Set checkRoleEnabling(Set enabled) throws ScribException - { - return enabled; - } - - @Override - public Map checkExtChoiceConsistency(Map enablers) - throws ScribException - { - return enablers; - } - @Override public int hashCode() { @@ -94,6 +77,7 @@ public boolean canEquals(Object o) return o instanceof GContinue; } +} @@ -111,5 +95,28 @@ public GRecursion unfoldAllOnce(STypeUnfolder u) return new GRecursion(getSource(), this.recvar, (GSeq) u.getRec(this.recvar)); // CHECKME: Continue (not Recursion) as the source of the unfolding ? - }*/ -} + } + + @Override + public Set checkRoleEnabling(Set enabled) throws ScribException + { + return enabled; + } + + @Override + public Map checkExtChoiceConsistency(Map enablers) + throws ScribException + { + return enablers; + } + + */ + + + + + + + + + diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java index 20c64c482..93a0345b5 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java @@ -13,9 +13,6 @@ */ package org.scribble.core.type.session.global; -import java.util.Map; -import java.util.Set; - import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; @@ -24,7 +21,6 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.global.Projector; -import org.scribble.util.ScribException; public class GDisconnect extends DisconnectAction implements GType @@ -70,27 +66,6 @@ public LType project(Projector v) return projectInlined(v.self); // No need for "aux", no recursive call } - @Override - public Set checkRoleEnabling(Set enabled) throws ScribException - { - if (!enabled.contains(this.left)) - { - throw new ScribException("Role not enabled: " + this.left); - } - if (!enabled.contains(this.right)) - { - throw new ScribException("Role not enabled: " + this.right); - } - return enabled; - } - - @Override - public Map checkExtChoiceConsistency(Map enablers) - throws ScribException - { - return enablers; - } - @Override public String toString() { @@ -125,3 +100,41 @@ public boolean canEquals(Object o) return o instanceof GDisconnect; } } + + + + + + + + + + + + + + + + +/* + @Override + public Set checkRoleEnabling(Set enabled) throws ScribException + { + if (!enabled.contains(this.left)) + { + throw new ScribException("Role not enabled: " + this.left); + } + if (!enabled.contains(this.right)) + { + throw new ScribException("Role not enabled: " + this.right); + } + return enabled; + } + + @Override + public Map checkExtChoiceConsistency(Map enablers) + throws ScribException + { + return enablers; + } +*/ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java index f0410cabe..1ba344625 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java @@ -15,8 +15,6 @@ import java.util.Collections; import java.util.List; -import java.util.Map; -import java.util.Set; import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; @@ -34,7 +32,6 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.global.Projector; -import org.scribble.util.ScribException; public class GDo extends Do implements GType { @@ -90,19 +87,6 @@ public LType project(Projector v) return new LDo(null, fullname, rs, this.args); // TODO CHECKME: prune args? } - @Override - public Set checkRoleEnabling(Set enabled) throws ScribException - { - throw new RuntimeException("Unsupported for Do: " + this); - } - - @Override - public Map checkExtChoiceConsistency(Map enablers) - throws ScribException - { - throw new RuntimeException("Unsupported for Do: " + this); - } - @Override public int hashCode() { @@ -131,6 +115,14 @@ public boolean canEquals(Object o) return o instanceof GDo; } +} + + + + + + + @@ -161,6 +153,28 @@ public GType getInlined(STypeInliner v) // i.e. returning a GSeq -- rely on parent GSeq to inline v.popSig(); return new GRecursion(null, rv, inlined); - }*/ -} + } + + @Override + public Set checkRoleEnabling(Set enabled) throws ScribException + { + throw new RuntimeException("Unsupported for Do: " + this); + } + + @Override + public Map checkExtChoiceConsistency(Map enablers) + throws ScribException + { + throw new RuntimeException("Unsupported for Do: " + this); + } + */ + + + + + + + + + diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java index 121cf0961..6f154d8c1 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java @@ -13,12 +13,6 @@ */ package org.scribble.core.type.session.global; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; @@ -29,7 +23,6 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.global.Projector; -import org.scribble.util.ScribException; public class GMessageTransfer extends MessageTransfer implements GType @@ -76,35 +69,6 @@ public LType project(Projector v) return projectInlined(v.self); // No need for "aux", no recursive call } - @Override - public Set checkRoleEnabling(Set enabled) throws ScribException - { - if (!enabled.contains(this.src)) - { - throw new ScribException("Source role not enabled: " + this.src); - } - if (enabled.contains(this.dst)) - { - return enabled; - } - Set tmp = new HashSet<>(enabled); - tmp.add(this.dst); - return Collections.unmodifiableSet(tmp); - } - - @Override - public Map checkExtChoiceConsistency(Map enablers) - throws ScribException - { - if (enablers.containsKey(this.dst)) - { - return enablers; - } - Map tmp = new HashMap<>(enablers); - tmp.put(this.dst, this.src); - return Collections.unmodifiableMap(tmp); - } - @Override public String toString() { @@ -139,3 +103,48 @@ public boolean canEquals(Object o) return o instanceof GMessageTransfer; } } + + + + + + + + + + + + + + + +/* + @Override + public Set checkRoleEnabling(Set enabled) throws ScribException + { + if (!enabled.contains(this.src)) + { + throw new ScribException("Source role not enabled: " + this.src); + } + if (enabled.contains(this.dst)) + { + return enabled; + } + Set tmp = new HashSet<>(enabled); + tmp.add(this.dst); + return Collections.unmodifiableSet(tmp); + } + + @Override + public Map checkExtChoiceConsistency(Map enablers) + throws ScribException + { + if (enablers.containsKey(this.dst)) + { + return enablers; + } + Map tmp = new HashMap<>(enablers); + tmp.put(this.dst, this.src); + return Collections.unmodifiableMap(tmp); + } +*/ diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java index 6234c3094..fe065bc8e 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java @@ -14,7 +14,6 @@ package org.scribble.core.type.session.global; import java.util.HashSet; -import java.util.Map; import java.util.Set; import org.antlr.runtime.tree.CommonTree; @@ -27,7 +26,6 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.global.Projector; -import org.scribble.util.ScribException; public class GRecursion extends Recursion implements GType { @@ -81,19 +79,6 @@ public LType project(Projector v) return projectAux(body); } - @Override - public Set checkRoleEnabling(Set enabled) throws ScribException - { - return this.body.checkRoleEnabling(enabled); - } - - @Override - public Map checkExtChoiceConsistency(Map enablers) - throws ScribException - { - return this.body.checkExtChoiceConsistency(enablers); - } - @Override public int hashCode() { @@ -122,3 +107,33 @@ public boolean canEquals(Object o) return o instanceof GRecursion; } } + + + + + + + + + + + + + + + + +/* + @Override + public Set checkRoleEnabling(Set enabled) throws ScribException + { + return this.body.checkRoleEnabling(enabled); + } + + @Override + public Map checkExtChoiceConsistency(Map enablers) + throws ScribException + { + return this.body.checkExtChoiceConsistency(enablers); + } +*/ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java index cb37224d6..716585fd0 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java @@ -14,8 +14,6 @@ package org.scribble.core.type.session.global; import java.util.List; -import java.util.Map; -import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -28,7 +26,6 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.global.Projector; -import org.scribble.util.ScribException; public class GSeq extends Seq implements GType { @@ -69,38 +66,6 @@ public LSeq project(Projector v) .map(x -> ((GType) x).project(v))); } - @Override - public Set checkRoleEnabling(Set enabled) throws ScribException - { - for (GType elem : getElements()) - { - enabled = elem.checkRoleEnabling(enabled); - } - return enabled; - } - - @Override - public Map checkExtChoiceConsistency(Map enablers) - throws ScribException - { - for (GType elem : getElements()) - { - enablers = elem.checkExtChoiceConsistency(enablers); - } - return enablers; - } - - /*@Override - public Map checkConnections(Map conns) - throws ScribbleException - { - for (GType elem : getElements()) - { - conns = elem.checkConnections(conns); - } - return conns; - }*/ - @Override public List getElements() { @@ -135,3 +100,43 @@ public boolean canEquals(Object o) return o instanceof GSeq; } } + + + + + + + + + + + + + + + + + + + +/* @Override + public Set checkRoleEnabling(Set enabled) throws ScribException + { + for (GType elem : getElements()) + { + enabled = elem.checkRoleEnabling(enabled); + } + return enabled; + } + + @Override + public Map checkExtChoiceConsistency(Map enablers) + throws ScribException + { + for (GType elem : getElements()) + { + enablers = elem.checkExtChoiceConsistency(enablers); + } + return enablers; + } +*/ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java index f82e5c126..824cd91fe 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java @@ -13,23 +13,38 @@ */ package org.scribble.core.type.session.global; -import java.util.Map; -import java.util.Set; - import org.scribble.core.lang.global.GNode; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.global.Projector; -import org.scribble.util.ScribException; public interface GType extends SType, GNode { LType projectInlined(Role self); // Use on inlined (i.e., Do inlined, roles pruned) LType project(Projector v); // Use on parsed (intermed) - // Pre: use on inlined or later (unsupported for Do, also Protocol) + +} + + + + + + + + + + + + + + + + + + /*// Pre: use on inlined or later (unsupported for Do, also Protocol) // enabled treated immutably // Returns enabled post visiting // Cf. SType visitors, here we only throw ScribbleException or return nothing, so can use return this way @@ -46,6 +61,7 @@ Map checkExtChoiceConsistency(Map enablers) // Also does correlation warnings //Map checkConnections(Map conns) throws ScribbleException; // Check on model instead: could possibly do syntactically on once-unfolding, but still need separate checks for dup-conn, unconnected and bad-dconn (may vs. must) + */ /*@Override GType substitute(Substitutions subs);*/ // Otherwise causes return type inconsistency with base abstract classes @@ -57,5 +73,4 @@ Map checkExtChoiceConsistency(Map enablers) @Override SType unfoldAllOnce(STypeUnfolder u); // Not GType return, o/w need to override again in GDo */ -} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RoleEnablingChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/RoleEnablingChecker.java index 3782f096d..5ca76f20b 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RoleEnablingChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RoleEnablingChecker.java @@ -16,7 +16,7 @@ import org.scribble.core.type.session.global.GSeq; import org.scribble.util.ScribException; -// Not supported for Do +// Pre: use on inlined or later (unsupported for Do, also Protocol) public class RoleEnablingChecker extends InlinedVisitor { private Set enabled; // Invariant: unmodifiable From fe4863740b6de5597f130eba70f13e4343b4b90b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 23:07:54 +0100 Subject: [PATCH 224/539] Added missing file. --- .../visit/ExtChoiceConsistencyChecker.java | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/ExtChoiceConsistencyChecker.java diff --git a/scribble-core/src/main/java/org/scribble/core/visit/ExtChoiceConsistencyChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/ExtChoiceConsistencyChecker.java new file mode 100644 index 000000000..c343020a5 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/ExtChoiceConsistencyChecker.java @@ -0,0 +1,97 @@ +package org.scribble.core.visit; + +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.global.GSeq; +import org.scribble.util.ScribException; + +// Pre: use on inlined or later (unsupported for Do, also Protocol) +public class ExtChoiceConsistencyChecker extends InlinedVisitor +{ + private Map enablers; // Invariant: unmodifiable + + public ExtChoiceConsistencyChecker() + { + this.enablers = Collections.emptyMap(); // Already immutable + } + + public ExtChoiceConsistencyChecker(Map enabled) + { + setEnablers(enabled); + } + + public Choice visitChoice(Choice n) + throws ScribException + { + Map subj = Stream.of(n.subj) + .collect(Collectors.toMap(x -> x, x -> x)); + List> blocks = new LinkedList<>(); + ExtChoiceConsistencyChecker nested = new ExtChoiceConsistencyChecker(); + for (GSeq block : n.blocks) + { + nested.setEnablers(subj); + block.visitWith(nested); + blocks.add(nested.getEnablers()); + } + Map res = new HashMap<>(getEnablers()); + Set> all = blocks.stream() + .flatMap(x -> x.entrySet().stream()).collect(Collectors.toSet()); + for (Entry e : all) + { + Role enabled = e.getKey(); + Role enabler = e.getValue(); + if (all.stream().anyMatch( + x -> x.getKey().equals(enabled) && !x.getValue().equals(enabler))) + { + throw new ScribException( + "Inconsistent external choice subjects for " + enabled + ": " + + all.stream().filter(x -> x.getKey().equals(enabled)) + .collect(Collectors.toList())); + } + if (!res.containsKey(enabled)) + { + res.put(enabled, enabler); + } + } + setEnablers(res); + return n; + } + + @Override + public DirectedInteraction visitDirectedInteraction( + DirectedInteraction n) throws ScribException + { + Map enablers = getEnablers(); + if (enablers.containsKey(n.dst)) + + { + return n; + } + Map res = new HashMap<>(enablers); + res.put(n.dst, n.src); + setEnablers(res); + return n; + } + + public Map getEnablers() + { + return this.enablers; + } + + protected void setEnablers(Map enabled) + { + this.enablers = Collections.unmodifiableMap(enabled); + } +} From efb99e253b3757643664367a7fcca7b8129bf3c5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Apr 2019 23:43:04 +0100 Subject: [PATCH 225/539] Minor. --- .../scribble/core/lang/global/GProtocol.java | 4 ++-- .../org/scribble/core/type/session/SType.java | 5 ++-- .../core/type/session/global/GType.java | 3 ++- .../core/type/session/local/LChoice.java | 3 +-- .../core/type/session/local/LType.java | 24 +++++++++++++++++-- .../core/visit/MessageIdGatherer.java | 2 +- .../core/visit/NonProtoDepsGatherer.java | 2 +- .../core/visit/ProtoDepsCollector.java | 2 +- .../org/scribble/core/visit/RecPruner.java | 2 +- .../scribble/core/visit/RecVarGatherer.java | 2 +- .../org/scribble/core/visit/RoleGatherer.java | 2 +- .../{STypeGather.java => STypeGatherer.java} | 3 ++- .../ExtChoiceConsistencyChecker.java | 11 ++++----- .../{ => global}/RoleEnablingChecker.java | 11 ++++----- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 15 files changed, 47 insertions(+), 31 deletions(-) rename scribble-core/src/main/java/org/scribble/core/visit/{STypeGather.java => STypeGatherer.java} (93%) rename scribble-core/src/main/java/org/scribble/core/visit/{ => global}/ExtChoiceConsistencyChecker.java (93%) rename scribble-core/src/main/java/org/scribble/core/visit/{ => global}/RoleEnablingChecker.java (91%) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 743de4b9e..3fd6064ff 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -51,15 +51,15 @@ import org.scribble.core.type.session.global.GRecursion; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.local.LSeq; -import org.scribble.core.visit.ExtChoiceConsistencyChecker; import org.scribble.core.visit.MessageIdGatherer; import org.scribble.core.visit.RecPruner; -import org.scribble.core.visit.RoleEnablingChecker; import org.scribble.core.visit.RoleGatherer; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.Substitutor; +import org.scribble.core.visit.global.ExtChoiceConsistencyChecker; import org.scribble.core.visit.global.Projector; +import org.scribble.core.visit.global.RoleEnablingChecker; import org.scribble.util.ScribException; import org.scribble.util.ScribUtil; diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index f37857c48..80fc54dc0 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -28,12 +28,13 @@ public interface SType> extends SNode { - Stream gather(Function, Stream> f); - SType visitWith(STypeVisitor v) throws ScribException; SType visitWithNoEx(STypeVisitorNoEx v); + // Pass in an STypeGatherer::visit, e.g., n.(new RoleGatherer()::visit) + Stream gather(Function, Stream> f); + // subclass equals should call this by: them.canEquals(this) boolean canEquals(Object o); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java index 824cd91fe..495ef55f4 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java @@ -22,10 +22,11 @@ public interface GType extends SType, GNode { + LType projectInlined(Role self); // Use on inlined (i.e., Do inlined, roles pruned) + LType project(Projector v); // Use on parsed (intermed) - } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java index 24a6f435b..e4ae943d3 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java @@ -78,10 +78,9 @@ public void buildGraph(EGraphBuilderUtil2 b) } else { - //.. HERE reuse existing b for nested (set entry/exit), and fix module imports and FQ names - /*first.buildGraph(b1); nested = b1.finalise();*/ + // Reuse existing b, to directly add continue-edges back to the "outer" graph EState nestedExit = b.newState(Collections.emptySet()); b.setExit(nestedExit); first.buildGraph(b); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java index 944157e56..f7833f0a8 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java @@ -27,7 +27,7 @@ public interface LType extends SType, LNode { //Role getSelf(); // CHECKME: useful? - // Return true iff LType is "equivalent" to a single "continue X", where X in rvs + // Return true iff this LType is "equivalent" to a single "continue X", where X is in rvs boolean isSingleConts(Set rvs); // Uses b to builds graph "progressively" (working graph is mutable) @@ -38,6 +38,27 @@ public interface LType extends SType, LNode // cf. GType "visitor" methods: same pattern, just env as a bespoke data type wrapper ReachabilityEnv checkReachability(ReachabilityEnv env) throws ScribException; + + //HERE refactor out remainining operations as visitors + //make a visitor factory + //for isSingleConts (and project, buildGraph), make T visitWith(STypeReducer v) ? -- roleenabling and extchoicecons are more like reducers? +} + + + + + + + + + + + + + + + + /*@Override LType substitute(Substitutions subs);*/ // Otherwise causes return type inconsistency with base abstract classes @@ -49,4 +70,3 @@ ReachabilityEnv checkReachability(ReachabilityEnv env) @Override SType unfoldAllOnce(STypeUnfolder u); */ -} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java index deeead037..fd6b357fb 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java @@ -8,7 +8,7 @@ import org.scribble.core.type.session.Seq; public class MessageIdGatherer> - extends STypeGather> + extends STypeGatherer> { @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java index 31cadaef9..74a49f558 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java @@ -24,7 +24,7 @@ // Result does not necessarily contain root proto (protodecl is not an SType), but may do so via dependencies // N.B. delegation payloads currently gathered here, not by getProtoDependencies -- CHECKME: refactor? public class NonProtoDepsGatherer> - extends STypeGather> + extends STypeGatherer> { @Override public Stream> visitChoice(Choice n) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java index 752edab9e..beb22b4f3 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java @@ -11,7 +11,7 @@ // Result should not contain duplicates (i.e., due to Choice/Seq) // Result does not necessarily contain root proto (protodecl is not an SType), but may do so via dependencies public class ProtoDepsCollector> - extends STypeGather> + extends STypeGatherer> { @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java index abf2d10ba..9859f77a5 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java @@ -33,7 +33,7 @@ public B visitSeq(B n) for (SType e : n.elems) { SType e1 = (SType) e.visitWithNoEx(this); - if (e1 instanceof Seq) // cf. Recursion::pruneRecs + if (e1 instanceof Seq) // cf. visitRecursion { elems.addAll(((Seq) e1).getElements()); // Handles empty Seq case } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java index 4bf64ffc1..b9e433f77 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java @@ -8,7 +8,7 @@ import org.scribble.core.type.session.Seq; public class RecVarGatherer> - extends STypeGather + extends STypeGatherer { @Override public Stream visitContinue(Continue n) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java index 280b3e845..b21ae2bd6 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java @@ -10,7 +10,7 @@ import org.scribble.core.type.session.Seq; public class RoleGatherer> - extends STypeGather + extends STypeGatherer { @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java rename to scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java index bf26d4a89..55830dd13 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeGather.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java @@ -14,8 +14,9 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; -public abstract class STypeGather, T> +public abstract class STypeGatherer, T> { + // Pass this to SType.gather, e.g., n.gather(new RoleGatherer()::visit) public Stream visit(SType n) { return typeSwitch(n).get(); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/ExtChoiceConsistencyChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/core/visit/ExtChoiceConsistencyChecker.java rename to scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java index c343020a5..a65270816 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/ExtChoiceConsistencyChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java @@ -1,4 +1,4 @@ -package org.scribble.core.visit; +package org.scribble.core.visit.global; import java.util.Collections; import java.util.HashMap; @@ -15,6 +15,7 @@ import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.DirectedInteraction; import org.scribble.core.type.session.global.GSeq; +import org.scribble.core.visit.InlinedVisitor; import org.scribble.util.ScribException; // Pre: use on inlined or later (unsupported for Do, also Protocol) @@ -22,11 +23,6 @@ public class ExtChoiceConsistencyChecker extends InlinedVisitor { private Map enablers; // Invariant: unmodifiable - public ExtChoiceConsistencyChecker() - { - this.enablers = Collections.emptyMap(); // Already immutable - } - public ExtChoiceConsistencyChecker(Map enabled) { setEnablers(enabled); @@ -38,7 +34,8 @@ public Choice visitChoice(Choice n) Map subj = Stream.of(n.subj) .collect(Collectors.toMap(x -> x, x -> x)); List> blocks = new LinkedList<>(); - ExtChoiceConsistencyChecker nested = new ExtChoiceConsistencyChecker(); + ExtChoiceConsistencyChecker nested = new ExtChoiceConsistencyChecker(subj); + // Arg redundant, but better to keep a single constructor, for factory pattern for (GSeq block : n.blocks) { nested.setEnablers(subj); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RoleEnablingChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java similarity index 91% rename from scribble-core/src/main/java/org/scribble/core/visit/RoleEnablingChecker.java rename to scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java index 5ca76f20b..82b704b6b 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RoleEnablingChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java @@ -1,4 +1,4 @@ -package org.scribble.core.visit; +package org.scribble.core.visit.global; import java.util.Collections; import java.util.HashSet; @@ -14,6 +14,7 @@ import org.scribble.core.type.session.DirectedInteraction; import org.scribble.core.type.session.DisconnectAction; import org.scribble.core.type.session.global.GSeq; +import org.scribble.core.visit.InlinedVisitor; import org.scribble.util.ScribException; // Pre: use on inlined or later (unsupported for Do, also Protocol) @@ -21,11 +22,6 @@ public class RoleEnablingChecker extends InlinedVisitor { private Set enabled; // Invariant: unmodifiable - public RoleEnablingChecker() - { - this.enabled = Collections.emptySet(); // Already immutable - } - public RoleEnablingChecker(Set enabled) { setEnabled(enabled); @@ -40,7 +36,8 @@ public Choice visitChoice(Choice n) throw new ScribException("Subject not enabled: " + n.subj); } Set subj = Stream.of(n.subj).collect(Collectors.toSet()); - RoleEnablingChecker nested = new RoleEnablingChecker(); + RoleEnablingChecker nested = new RoleEnablingChecker(subj); + // Arg redundant, but better to keep a single constructor, for factory pattern List> blocks = new LinkedList<>(); for (GSeq block : n.blocks) { diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 20e92cf3d..6c83362ae 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -75,7 +75,7 @@ module tmp.Test; // refactor scribble.g, simplify ast/del/etc class names // add exp conn checks to model validation -// use stypefactory in core +// use stypefactory in core -- also make a visitorfactory // refactor test to use main instead of cli From 0a3035c7a5e348b46a207fbbaf9b8d6bfa437cc2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 11:24:31 +0100 Subject: [PATCH 226/539] Continued: refactoring core LType operations as visitors. --- .../scribble/core/type/session/Choice.java | 21 +++-- .../scribble/core/type/session/Continue.java | 19 +++-- .../type/session/DirectedInteraction.java | 19 +++-- .../core/type/session/DisconnectAction.java | 19 +++-- .../org/scribble/core/type/session/Do.java | 19 +++-- .../scribble/core/type/session/Recursion.java | 25 ++++-- .../org/scribble/core/type/session/SType.java | 3 + .../org/scribble/core/type/session/Seq.java | 23 ++++-- .../core/type/session/global/GRecursion.java | 3 +- .../core/type/session/local/LSkip.java | 13 ++- .../org/scribble/core/visit/STypeAgg.java | 82 +++++++++++++++++++ .../scribble/core/visit/STypeGatherer.java | 1 + .../visit/local/SingleContinueChecker.java | 74 +++++++++++++++++ 13 files changed, 270 insertions(+), 51 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java index ac03c4b63..986626597 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java @@ -22,6 +22,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeVisitor; import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.util.ScribException; @@ -44,13 +45,6 @@ public Choice(CommonTree source, Role subj, public abstract Choice reconstruct(CommonTree source, Role subj, List blocks); //List> blocks); - - @Override - public Stream gather(Function, Stream> f) - { - return Stream.concat(f.apply(this), - this.blocks.stream().flatMap(x -> x.gather(f))); - } @Override public SType visitWith(STypeVisitor v) throws ScribException @@ -64,6 +58,19 @@ public SType visitWithNoEx(STypeVisitorNoEx v) return v.visitChoice(this); } + @Override + public T aggregate(STypeAgg v) + { + return v.visitChoice(this); + } + + @Override + public Stream gather(Function, Stream> f) + { + return Stream.concat(f.apply(this), + this.blocks.stream().flatMap(x -> x.gather(f))); + } + @Override public String toString() { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java index 4ac2cb584..e3a5f1b9b 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java @@ -19,6 +19,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.RecVar; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeVisitor; import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.util.ScribException; @@ -38,12 +39,6 @@ public Continue(//org.scribble.ast.Continue source, public abstract Continue reconstruct( CommonTree source, RecVar recvar); - - @Override - public Stream gather(Function, Stream> f) - { - return f.apply(this); - } @Override public SType visitWith(STypeVisitor v) throws ScribException @@ -56,6 +51,18 @@ public SType visitWithNoEx(STypeVisitorNoEx v) { return v.visitContinue(this); } + + @Override + public T aggregate(STypeAgg v) + { + return v.visitContinue(this); + } + + @Override + public Stream gather(Function, Stream> f) + { + return f.apply(this); + } @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java index 2e76f2eec..1ef5ce27d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java @@ -19,6 +19,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeVisitor; import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.util.ScribException; @@ -44,12 +45,6 @@ public DirectedInteraction(CommonTree source, public abstract DirectedInteraction reconstruct( CommonTree source, Message msg, Role src, Role dst); - - @Override - public Stream gather(Function, Stream> f) - { - return f.apply(this); - } @Override public SType visitWith(STypeVisitor v) throws ScribException @@ -63,6 +58,18 @@ public SType visitWithNoEx(STypeVisitorNoEx v) return v.visitDirectedInteraction(this); } + @Override + public T aggregate(STypeAgg v) + { + return v.visitDirectedInteraction(this); + } + + @Override + public Stream gather(Function, Stream> f) + { + return f.apply(this); + } + @Override public CommonTree getSource() { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java index 540803ff1..40e30da6c 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java @@ -19,6 +19,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeVisitor; import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.util.ScribException; @@ -40,12 +41,6 @@ public DisconnectAction(CommonTree source, public abstract DisconnectAction reconstruct( CommonTree source, Role src, Role dst); - - @Override - public Stream gather(Function, Stream> f) - { - return f.apply(this); - } @Override public SType visitWith(STypeVisitor v) throws ScribException @@ -59,6 +54,18 @@ public SType visitWithNoEx(STypeVisitorNoEx v) return v.visitDisconnect(this); } + @Override + public T aggregate(STypeAgg v) + { + return v.visitDisconnect(this); + } + + @Override + public Stream gather(Function, Stream> f) + { + return f.apply(this); + } + @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java index 3b1077c66..e74ae9f99 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java @@ -24,6 +24,7 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeVisitor; import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.util.ScribException; @@ -48,12 +49,6 @@ public Do(CommonTree source, N proto, public abstract Do reconstruct(CommonTree source, N proto, List roles, List> args); - - @Override - public Stream gather(Function, Stream> f) - { - return f.apply(this); - } @Override public SType visitWith(STypeVisitor v) throws ScribException @@ -67,6 +62,18 @@ public SType visitWithNoEx(STypeVisitorNoEx v) return v.visitDo(this); } + @Override + public T aggregate(STypeAgg v) + { + return v.visitDo(this); + } + + @Override + public Stream gather(Function, Stream> f) + { + return f.apply(this); + } + @Override public String toString() { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java index 88aabf3fc..0234e7b7d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java @@ -19,6 +19,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.RecVar; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeVisitor; import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.util.ScribException; @@ -37,12 +38,9 @@ public Recursion(//org.scribble.ast.Recursion source, this.recvar = recvar; this.body = body; } - - @Override - public Stream gather(Function, Stream> f) - { - return Stream.concat(f.apply(this), this.body.gather(f)); - } + + public abstract Recursion reconstruct( + CommonTree source, RecVar recvar, B body); @Override public SType visitWith(STypeVisitor v) throws ScribException @@ -55,9 +53,18 @@ public SType visitWithNoEx(STypeVisitorNoEx v) { return v.visitRecursion(this); } - - public abstract Recursion reconstruct( - CommonTree source, RecVar recvar, B body); + + @Override + public T aggregate(STypeAgg v) + { + return v.visitRecursion(this); + } + + @Override + public Stream gather(Function, Stream> f) + { + return Stream.concat(f.apply(this), this.body.gather(f)); + } @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index 80fc54dc0..372124b02 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -18,6 +18,7 @@ import org.scribble.core.lang.SNode; import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeVisitor; import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.util.ScribException; @@ -32,6 +33,8 @@ public interface SType> SType visitWithNoEx(STypeVisitorNoEx v); + T aggregate(STypeAgg v); + // Pass in an STypeGatherer::visit, e.g., n.(new RoleGatherer()::visit) Stream gather(Function, Stream> f); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java index f2844c08a..5b03fc1a8 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java @@ -21,6 +21,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeVisitor; import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.util.ScribException; @@ -39,12 +40,6 @@ public Seq(CommonTree source, List> elems) public abstract B reconstruct(CommonTree source, List> elems); - - @Override - public Stream gather(Function, Stream> f) - { - return this.elems.stream().flatMap(x -> x.gather(f)); - } @Override public B visitWith(STypeVisitor v) throws ScribException @@ -58,9 +53,23 @@ public B visitWith(STypeVisitor v) throws ScribException public B visitWithNoEx(STypeVisitorNoEx v) { @SuppressWarnings("unchecked") - B cast = (B) this; // CHECKME: OK as long as G/LSeq specify themselves as B param + B cast = (B) this; return v.visitSeq(cast); } + + @Override + public T aggregate(STypeAgg v) + { + @SuppressWarnings("unchecked") + B cast = (B) this; + return v.visitSeq(cast); + } + + @Override + public Stream gather(Function, Stream> f) + { + return this.elems.stream().flatMap(x -> x.gather(f)); + } // Re. return type, could make SType subclasses take themself as another param, but not worth it public abstract List> getElements(); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java index fe065bc8e..9a10c053b 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java @@ -26,6 +26,7 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.global.Projector; +import org.scribble.core.visit.local.SingleContinueChecker; public class GRecursion extends Recursion implements GType { @@ -65,7 +66,7 @@ private LType projectAux(LSeq body) }*/ Set rvs = new HashSet<>(); rvs.add(this.recvar); - if (body.isSingleConts(rvs)) + if (body.aggregate(new SingleContinueChecker(rvs))) { return LSkip.SKIP; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java index 3e5cbe4e1..d12814379 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java @@ -22,6 +22,7 @@ import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.STypeBase; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeVisitor; import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.core.visit.local.ReachabilityEnv; @@ -38,19 +39,25 @@ private LSkip() } @Override - public Stream gather(Function, Stream> f) + public LSkip visitWith(STypeVisitor v) { throw new RuntimeException("Unsupported for Skip: " + this); } @Override - public LSkip visitWith(STypeVisitor v) + public LSkip visitWithNoEx(STypeVisitorNoEx v) { throw new RuntimeException("Unsupported for Skip: " + this); } @Override - public LSkip visitWithNoEx(STypeVisitorNoEx v) + public T aggregate(STypeAgg v) + { + throw new RuntimeException("Unsupported for Skip: " + this); + } + + @Override + public Stream gather(Function, Stream> f) { throw new RuntimeException("Unsupported for Skip: " + this); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java new file mode 100644 index 000000000..4b0a46fbe --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java @@ -0,0 +1,82 @@ +package org.scribble.core.visit; + +import java.util.stream.Stream; + +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.Continue; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.DisconnectAction; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.Seq; + +// Visitor could be refactored as an Agg, but not worth it? (unit = n.getChildren(), agg = reconstruct) +public abstract class STypeAgg, T> +{ + public abstract T unit(); + public abstract T agg(Stream ts); // Generic varargs has heap pollution issue + + // SType return for extensibility/flexibility + public T visitContinue(Continue n) + { + return agg(Stream.of(unit())); + } + + public T visitChoice(Choice n) + { + return agg(n.blocks.stream().map(x -> x.aggregate(this))); + } + + public T visitDirectedInteraction(DirectedInteraction n) + { + return agg(Stream.of(unit())); + } + + public T visitDisconnect(DisconnectAction n) + { + return agg(Stream.of(unit())); + } + + public > T visitDo(Do n) + { + return agg(Stream.of(unit())); + } + + public T visitRecursion(Recursion n) + { + return agg(Stream.of(n.body.aggregate(this))); + } + + // "Hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction + public T visitSeq(B n) + { + return agg(n.elems.stream().map(x -> x.aggregate(this))); + } +} + + + + + + + + + + + + + + + + + + + + +/*@FunctionalInterface +interface STypeVisitorFunction, R extends Stream> +{ + R f(SType n, STypeVisitor v); +}*/ diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java index 55830dd13..96411ce1f 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java @@ -14,6 +14,7 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; +// Refactor as special case of Agg? public abstract class STypeGatherer, T> { // Pass this to SType.gather, e.g., n.gather(new RoleGatherer()::visit) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java new file mode 100644 index 000000000..4ee0a7ac6 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java @@ -0,0 +1,74 @@ +package org.scribble.core.visit.local; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Stream; + +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.Continue; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.type.session.local.LType; +import org.scribble.core.visit.STypeAgg; + +// "InlinedAgg" +public class SingleContinueChecker extends STypeAgg +{ + private Set rvs; + + public SingleContinueChecker(Set rvs) + { + this.rvs = Collections.unmodifiableSet(rvs); + } + + @Override + public Boolean unit() + { + return false; + } + + @Override + public Boolean agg(Stream bs) + { + return bs.allMatch(x -> x); + } + + @Override + public Boolean visitContinue(Continue n) + { + return rvs.contains(n.recvar); // Single continue for an "outer" recvar caught later on + } + + @Override + public Boolean visitChoice(Choice n) + { + return agg(n.blocks.stream().map(x -> x.aggregate(this))); + } + + @Override + public > Boolean visitDo(Do n) + { + //return (Boolean) InlinedVisitor1.super.visitDo(n); + //return (Boolean) super.visitDo(n); // CHECKME: resolves to the extends super, even with a default i/f implementation ? + throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); + } + + @Override + public Boolean visitRecursion(Recursion n) + { + Set tmp = new HashSet<>(this.rvs); + tmp.add(n.recvar); + return n.body.aggregate(new SingleContinueChecker(tmp)); + } + + @Override + public Boolean visitSeq(LSeq n) + { + return n.elems.size() == 1 && ((LType) n.elems.get(0)).aggregate(this); + } +} From 3c24ec974bdfd781781b256f252add3da196e7d6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 12:04:52 +0100 Subject: [PATCH 227/539] Continued: refactored ReachabilityChecker. --- .../scribble/core/lang/global/GProtocol.java | 7 +- .../scribble/core/lang/local/LProtocol.java | 9 +- .../core/type/session/local/LAcc.java | 43 +++--- .../core/type/session/local/LChoice.java | 67 +++++---- .../core/type/session/local/LContinue.java | 37 +++-- .../core/type/session/local/LDisconnect.java | 45 +++--- .../scribble/core/type/session/local/LDo.java | 32 ++--- .../core/type/session/local/LRcv.java | 50 ++++--- .../core/type/session/local/LRecursion.java | 66 +++++---- .../core/type/session/local/LReq.java | 51 ++++--- .../core/type/session/local/LSend.java | 52 ++++--- .../core/type/session/local/LSeq.java | 81 ++++++----- .../core/type/session/local/LSkip.java | 30 ++-- .../core/type/session/local/LType.java | 25 ++-- .../org/scribble/core/visit/STypeAgg.java | 4 +- .../global/ExtChoiceConsistencyChecker.java | 8 +- .../visit/global/RoleEnablingChecker.java | 8 +- .../core/visit/local/ReachabilityChecker.java | 128 ++++++++++++++++++ .../core/visit/local/ReachabilityEnv.java | 36 ----- .../visit/local/SingleContinueChecker.java | 3 +- scribble-test/src/test/scrib/tmp/Test.scr | 2 + 21 files changed, 484 insertions(+), 300 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java delete mode 100644 scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityEnv.java diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 3fd6064ff..75b2519da 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -131,22 +131,19 @@ public GProtocol unfoldAllOnce(STypeUnfolder v) this.params, unf); } - // Following are some top-level entry to GType methods public void checkRoleEnabling() throws ScribException { Set rs = this.roles.stream().collect(Collectors.toSet()); RoleEnablingChecker v = new RoleEnablingChecker(rs); this.def.visitWith(v); - //return v.getEnabled(); } public void checkExtChoiceConsistency() throws ScribException { - Map tmp = this.roles.stream() + Map rs = this.roles.stream() .collect(Collectors.toMap(x -> x, x -> x)); - ExtChoiceConsistencyChecker v = new ExtChoiceConsistencyChecker(tmp); + ExtChoiceConsistencyChecker v = new ExtChoiceConsistencyChecker(rs); this.def.visitWith(v); - //return v.getEnablers(); } // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 8fcdaf472..a497a778f 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -13,7 +13,6 @@ */ package org.scribble.core.lang.local; -import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; @@ -43,7 +42,7 @@ import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.Substitutor; import org.scribble.core.visit.local.LTypeInliner; -import org.scribble.core.visit.local.ReachabilityEnv; +import org.scribble.core.visit.local.ReachabilityChecker; import org.scribble.util.Constants; import org.scribble.util.ScribException; @@ -132,11 +131,9 @@ public EGraph toEGraph(Job job) return new EGraph(init, term);*/ } - public ReachabilityEnv checkReachability() - throws ScribException + public void checkReachability() throws ScribException { - return this.def - .checkReachability(new ReachabilityEnv(false, Collections.emptySet())); + this.def.visitWith(new ReachabilityChecker()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java index 958fa084f..c352a2b5d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java @@ -13,20 +13,15 @@ */ package org.scribble.core.type.session.local; -import java.util.Set; - import org.antlr.runtime.tree.CommonTree; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.ConnectAction; import org.scribble.core.type.session.Message; import org.scribble.core.type.session.MessageSig; import org.scribble.core.type.session.Payload; -import org.scribble.core.visit.local.ReachabilityEnv; -import org.scribble.util.ScribException; public class LAcc extends ConnectAction implements LType { @@ -47,12 +42,6 @@ public LAcc reconstruct( return new LAcc(source, src, msg); } - @Override - public boolean isSingleConts(Set rvs) - { - return false; - } - @Override public void buildGraph(EGraphBuilderUtil2 b) { @@ -64,13 +53,6 @@ public void buildGraph(EGraphBuilderUtil2 b) b.addEdge(b.getEntry(), b.ef.newEAccept(peer, mid, payload), b.getExit()); } - @Override - public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribException - { - return env; - } - @Override public String toString() { @@ -106,3 +88,28 @@ public boolean canEquals(Object o) } } + + + + + + + + + + + +/* + @Override + public boolean isSingleConts(Set rvs) + { + return false; + } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribException + { + return env; + } +*/ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java index e4ae943d3..766c677c6 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java @@ -14,21 +14,15 @@ package org.scribble.core.type.session.local; import java.util.Collections; -import java.util.LinkedList; import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; -import org.scribble.core.visit.local.ReachabilityEnv; -import org.scribble.util.ScribException; public class LChoice extends Choice implements LType { @@ -44,12 +38,6 @@ public LChoice reconstruct(CommonTree source, Role subj, { return new LChoice(source, subj, blocks); } - - @Override - public boolean isSingleConts(Set rvs) - { - return this.blocks.stream().allMatch(x -> x.isSingleConts(rvs)); - } @Override public void buildGraph(EGraphBuilderUtil2 b) @@ -123,21 +111,6 @@ else if (first instanceof LContinue) b.leaveChoice(); } - @Override - public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribException - { - List blocks = new LinkedList<>(); - for (LSeq block : this.blocks) - { - blocks.add(block.checkReachability(env)); - } - boolean postcont = blocks.stream().allMatch(x -> x.postcont); // i.e., no exits - Set recvars = blocks.stream().flatMap(x -> x.recvars.stream()) - .collect(Collectors.toSet()); - return new ReachabilityEnv(postcont, recvars); - } - /*@Override public List getBlocks() { @@ -172,3 +145,43 @@ public boolean canEquals(Object o) return o instanceof LChoice; } } + + + + + + + + + + + + + + + + + +/* + + @Override + public boolean isSingleConts(Set rvs) + { + return this.blocks.stream().allMatch(x -> x.isSingleConts(rvs)); + } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribException + { + List blocks = new LinkedList<>(); + for (LSeq block : this.blocks) + { + blocks.add(block.checkReachability(env)); + } + boolean postcont = blocks.stream().allMatch(x -> x.postcont); // i.e., no exits + Set recvars = blocks.stream().flatMap(x -> x.recvars.stream()) + .collect(Collectors.toSet()); + return new ReachabilityEnv(postcont, recvars); + } + */ diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java index 668954ae5..a335246ee 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java @@ -13,9 +13,7 @@ */ package org.scribble.core.type.session.local; -import java.util.HashSet; import java.util.LinkedList; -import java.util.Set; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; @@ -24,7 +22,6 @@ import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Continue; -import org.scribble.core.visit.local.ReachabilityEnv; import org.scribble.util.ScribException; public class LContinue extends Continue implements LType @@ -41,12 +38,6 @@ public LContinue reconstruct(CommonTree source, { return new LContinue(source, recvar); } - - @Override - public boolean isSingleConts(Set rvs) - { - return rvs.contains(this.recvar); - } @Override public void buildGraph(EGraphBuilderUtil2 b) @@ -79,15 +70,6 @@ public void buildGraph(EGraphBuilderUtil2 b) } } } - - @Override - public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribException - { - Set tmp = new HashSet<>(env.recvars); - tmp.add(this.recvar); - return new ReachabilityEnv(true, tmp); - } @Override public int hashCode() @@ -134,5 +116,22 @@ public LRecursion unfoldAllOnce(STypeUnfolder u) { return new LRecursion(getSource(), this.recvar, // CHECKME: Continue (not Recursion) as the source of the unfolding (LSeq) u.getRec(this.recvar)); - }*/ + } + + @Override + public boolean isSingleConts(Set rvs) + { + return rvs.contains(this.recvar); + } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribException + { + Set tmp = new HashSet<>(env.recvars); + tmp.add(this.recvar); + return new ReachabilityEnv(true, tmp); + } + */ } + diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java index 031700cee..87e2c3730 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java @@ -13,16 +13,11 @@ */ package org.scribble.core.type.session.local; -import java.util.Set; - import org.antlr.runtime.tree.CommonTree; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.DisconnectAction; -import org.scribble.core.visit.local.ReachabilityEnv; -import org.scribble.util.ScribException; public class LDisconnect extends DisconnectAction implements LType @@ -48,12 +43,6 @@ public LDisconnect reconstruct( return new LDisconnect(source, peer); } - @Override - public boolean isSingleConts(Set rvs) - { - return false; - } - @Override public void buildGraph(EGraphBuilderUtil2 b) { @@ -61,13 +50,6 @@ public void buildGraph(EGraphBuilderUtil2 b) // TODO: add toAction method to base Interaction b.addEdge(b.getEntry(), b.ef.newEDisconnect(peer), b.getExit()); } - - @Override - public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribException - { - return env; - } @Override public String toString() @@ -103,3 +85,30 @@ public boolean canEquals(Object o) return o instanceof LDisconnect; } } + + + + + + + + + + + + +/* + + @Override + public boolean isSingleConts(Set rvs) + { + return false; + } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribException + { + return env; + } + */ diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java index d67dcd828..e23faf49c 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java @@ -14,19 +14,15 @@ package org.scribble.core.type.session.local; import java.util.List; -import java.util.Set; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.LProtocolName; -import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Do; -import org.scribble.core.visit.local.ReachabilityEnv; -import org.scribble.util.ScribException; public class LDo extends Do implements LType { @@ -43,11 +39,6 @@ public LDo reconstruct(CommonTree source, { return new LDo(source, proto, roles, args); } - @Override - public boolean isSingleConts(Set rvs) - { - throw new RuntimeException("Unsupported for LDo: " + this); - } @Override public void buildGraph(EGraphBuilderUtil2 b) @@ -55,13 +46,6 @@ public void buildGraph(EGraphBuilderUtil2 b) throw new RuntimeException("Unsupported for LDo: " + this); } - @Override - public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribException - { - throw new RuntimeException("Unsupported for LDo: " + this); - } - @Override public int hashCode() { @@ -119,7 +103,21 @@ public LType getInlined(STypeInliner v) // i.e. returning a Seq -- rely on parent Seq to inline v.popSig(); return new LRecursion(null, rv, inlined); - }*/ + } + + @Override + public boolean isSingleConts(Set rvs) + { + throw new RuntimeException("Unsupported for LDo: " + this); + } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribException + { + throw new RuntimeException("Unsupported for LDo: " + this); + } + */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java index da6c9e2b4..0601b6544 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java @@ -13,20 +13,15 @@ */ package org.scribble.core.type.session.local; -import java.util.Set; - import org.antlr.runtime.tree.CommonTree; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; import org.scribble.core.type.session.MessageSig; import org.scribble.core.type.session.MessageTransfer; import org.scribble.core.type.session.Payload; -import org.scribble.core.visit.local.ReachabilityEnv; -import org.scribble.util.ScribException; public class LRcv extends MessageTransfer implements LType @@ -48,12 +43,6 @@ public LRcv reconstruct( return new LRcv(source, src, msg); } - @Override - public boolean isSingleConts(Set rvs) - { - return false; - } - @Override public void buildGraph(EGraphBuilderUtil2 b) { @@ -65,13 +54,6 @@ public void buildGraph(EGraphBuilderUtil2 b) b.addEdge(b.getEntry(), b.ef.newEReceive(peer, mid, payload), b.getExit()); } - @Override - public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribException - { - return env; - } - @Override public String toString() { @@ -107,3 +89,35 @@ public boolean canEquals(Object o) } } + + + + + + + + + + + + + + + + + + +/* + @Override + public boolean isSingleConts(Set rvs) + { + return false; + } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribException + { + return env; + } + */ diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java index 5bc8f2337..2d3f6a095 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java @@ -13,16 +13,11 @@ */ package org.scribble.core.type.session.local; -import java.util.HashSet; -import java.util.Set; - import org.antlr.runtime.tree.CommonTree; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Recursion; -import org.scribble.core.visit.local.ReachabilityEnv; -import org.scribble.util.ScribException; public class LRecursion extends Recursion implements LType { @@ -39,14 +34,6 @@ public LRecursion reconstruct(CommonTree source, { return new LRecursion(source, recvar, block); } - - @Override - public boolean isSingleConts(Set rvs) - { - Set tmp = new HashSet<>(rvs); - tmp.add(this.recvar); - return this.body.isSingleConts(tmp); - } @Override public void buildGraph(EGraphBuilderUtil2 b) @@ -57,20 +44,6 @@ public void buildGraph(EGraphBuilderUtil2 b) b.popRecursionEntry(this.recvar); } - @Override - public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribException - { - env = this.body.checkReachability(env); - if (env.recvars.contains(this.recvar)) - { - Set tmp = new HashSet<>(env.recvars); - tmp.remove(this.recvar); - env = new ReachabilityEnv(env.postcont, tmp); - } - return env; - } - @Override public int hashCode() { @@ -99,3 +72,42 @@ public boolean canEquals(Object o) return o instanceof LRecursion; } } + + + + + + + + + + + + + + + + +/* + @Override + public boolean isSingleConts(Set rvs) + { + Set tmp = new HashSet<>(rvs); + tmp.add(this.recvar); + return this.body.isSingleConts(tmp); + } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribException + { + env = this.body.checkReachability(env); + if (env.recvars.contains(this.recvar)) + { + Set tmp = new HashSet<>(env.recvars); + tmp.remove(this.recvar); + env = new ReachabilityEnv(env.postcont, tmp); + } + return env; + } + */ diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java index 853c6ba32..7e4e3c968 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java @@ -13,20 +13,15 @@ */ package org.scribble.core.type.session.local; -import java.util.Set; - import org.antlr.runtime.tree.CommonTree; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.ConnectAction; import org.scribble.core.type.session.Message; import org.scribble.core.type.session.MessageSig; import org.scribble.core.type.session.Payload; -import org.scribble.core.visit.local.ReachabilityEnv; -import org.scribble.util.ScribException; public class LReq extends ConnectAction implements LType @@ -48,12 +43,6 @@ public LReq reconstruct( return new LReq(source, msg, dst); } - @Override - public boolean isSingleConts(Set rvs) - { - return false; - } - @Override public void buildGraph(EGraphBuilderUtil2 b) { @@ -65,13 +54,6 @@ public void buildGraph(EGraphBuilderUtil2 b) // TODO: add toAction method to base Interaction b.addEdge(b.getEntry(), b.ef.newERequest(peer, mid, payload), b.getExit()); } - - @Override - public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribException - { - return env; - } @Override public String toString() @@ -108,3 +90,36 @@ public boolean canEquals(Object o) } } + + + + + + + + + + + + + + + + + + +/* + + @Override + public boolean isSingleConts(Set rvs) + { + return false; + } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribException + { + return env; + } +*/ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java index 90a5b440f..4459c0c4e 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java @@ -13,20 +13,15 @@ */ package org.scribble.core.type.session.local; -import java.util.Set; - import org.antlr.runtime.tree.CommonTree; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; import org.scribble.core.type.session.MessageSig; import org.scribble.core.type.session.MessageTransfer; import org.scribble.core.type.session.Payload; -import org.scribble.core.visit.local.ReachabilityEnv; -import org.scribble.util.ScribException; public class LSend extends MessageTransfer implements LType @@ -48,12 +43,6 @@ public LSend reconstruct( return new LSend(source, msg, dst); } - @Override - public boolean isSingleConts(Set rvs) - { - return false; - } - @Override public void buildGraph(EGraphBuilderUtil2 b) { @@ -65,13 +54,6 @@ public void buildGraph(EGraphBuilderUtil2 b) // TODO: add toAction method to base Interaction b.addEdge(b.getEntry(), b.ef.newESend(peer, mid, payload), b.getExit()); } - - @Override - public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribException - { - return env; - } @Override public String toString() @@ -108,3 +90,37 @@ public boolean canEquals(Object o) } } + + + + + + + + + + + + + + + + + + + + +/* + @Override + public boolean isSingleConts(Set rvs) + { + return false; + } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribException + { + return env; + } +*/ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java index 076da588c..e68f1b799 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java @@ -16,18 +16,14 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; -import java.util.Set; import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.model.endpoint.EState; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; -import org.scribble.core.visit.local.ReachabilityEnv; -import org.scribble.util.ScribException; public class LSeq extends Seq implements LType { @@ -44,13 +40,6 @@ public LSeq reconstruct(CommonTree source, return new LSeq(source, elems); } - @Override - public boolean isSingleConts(Set rvs) - { - return this.elems.size() == 1 - && ((LType) this.elems.get(0)).isSingleConts(rvs); - } - @Override public void buildGraph(EGraphBuilderUtil2 b) { @@ -81,26 +70,6 @@ public void buildGraph(EGraphBuilderUtil2 b) b.setEntry(entry); } - @Override - public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribException - { - LType prev = null; - LType next = null; - for (Iterator i = getElements().iterator(); i.hasNext(); ) - { - prev = next; - next = i.next(); - if (!env.isSeqable()) - { - throw new ScribException( - "Illegal sequence: " + (prev == null ? "" : prev + "\n") + next); - } - env = next.checkReachability(env); - } - return env; - } - @Override public List getElements() { @@ -135,3 +104,53 @@ public boolean canEquals(Object o) return o instanceof LSeq; } } + + + + + + + + + + + + + + + + + + + + + + +/* + @Override + public boolean isSingleConts(Set rvs) + { + return this.elems.size() == 1 + && ((LType) this.elems.get(0)).isSingleConts(rvs); + } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribException + { + LType prev = null; + LType next = null; + for (Iterator i = getElements().iterator(); i.hasNext(); ) + { + prev = next; + next = i.next(); + if (!env.isSeqable()) + { + throw new ScribException( + "Illegal sequence: " + (prev == null ? "" : prev + "\n") + next); + } + env = next.checkReachability(env); + } + return env; + } +*/ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java index d12814379..7a91efe2c 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java @@ -13,20 +13,16 @@ */ package org.scribble.core.type.session.local; -import java.util.Set; import java.util.function.Function; import java.util.stream.Stream; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.STypeBase; import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeVisitor; import org.scribble.core.visit.STypeVisitorNoEx; -import org.scribble.core.visit.local.ReachabilityEnv; -import org.scribble.util.ScribException; // Used only *during* projection -- filtered out by GSeq::projection public class LSkip extends STypeBase implements LType @@ -62,24 +58,11 @@ public Stream gather(Function, Stream> f) throw new RuntimeException("Unsupported for Skip: " + this); } - @Override - public boolean isSingleConts(Set rvs) - { - throw new RuntimeException("Unsupported for Skip:\n" + this); - } - @Override public void buildGraph(EGraphBuilderUtil2 b) { throw new RuntimeException("Unsupported for: " + this); } - - @Override - public ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribException - { - throw new RuntimeException("Unsupported for: " + this); - } @Override public String toString() @@ -179,6 +162,19 @@ public LSkip substitute(Substitutions subs) { return this; } + + @Override + public boolean isSingleConts(Set rvs) + { + throw new RuntimeException("Unsupported for Skip:\n" + this); + } + + @Override + public ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribException + { + throw new RuntimeException("Unsupported for: " + this); + } */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java index f7833f0a8..19db2a055 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java @@ -13,35 +13,18 @@ */ package org.scribble.core.type.session.local; -import java.util.Set; - import org.scribble.core.lang.local.LNode; import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.SType; -import org.scribble.core.visit.local.ReachabilityEnv; -import org.scribble.util.ScribException; public interface LType extends SType, LNode { //Role getSelf(); // CHECKME: useful? - // Return true iff this LType is "equivalent" to a single "continue X", where X is in rvs - boolean isSingleConts(Set rvs); - // Uses b to builds graph "progressively" (working graph is mutable) // Use EGraphBuilderUtil2::finalise for final result void buildGraph(EGraphBuilderUtil2 b); - - // Return: (new) env post visiting - // cf. GType "visitor" methods: same pattern, just env as a bespoke data type wrapper - ReachabilityEnv checkReachability(ReachabilityEnv env) - throws ScribException; - - //HERE refactor out remainining operations as visitors - //make a visitor factory - //for isSingleConts (and project, buildGraph), make T visitWith(STypeReducer v) ? -- roleenabling and extchoicecons are more like reducers? } @@ -69,4 +52,12 @@ ReachabilityEnv checkReachability(ReachabilityEnv env) @Override SType unfoldAllOnce(STypeUnfolder u); + + // Return true iff this LType is "equivalent" to a single "continue X", where X is in rvs + boolean isSingleConts(Set rvs); + + // Return: (new) env post visiting + // cf. GType "visitor" methods: same pattern, just env as a bespoke data type wrapper + ReachabilityEnv checkReachability(ReachabilityEnv env) + throws ScribException; */ diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java index 4b0a46fbe..d6bdf7b36 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java @@ -12,7 +12,9 @@ import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.Seq; -// Visitor could be refactored as an Agg, but not worth it? (unit = n.getChildren(), agg = reconstruct) +// Visitor could be refactored as an Agg, but not worth it? (T = List, unit = n.getChildren(), agg = reconstruct) +// (Could also do T = SType, unit = n and if agg method extended to take n as a param, for n-sensitive agg, e.g., Choice) +// Another factor is about throws ScribException public abstract class STypeAgg, T> { public abstract T unit(); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java index a65270816..bab1d2bb9 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java @@ -14,6 +14,7 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.SType; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.visit.InlinedVisitor; import org.scribble.util.ScribException; @@ -28,7 +29,7 @@ public ExtChoiceConsistencyChecker(Map enabled) setEnablers(enabled); } - public Choice visitChoice(Choice n) + public SType visitChoice(Choice n) throws ScribException { Map subj = Stream.of(n.subj) @@ -67,7 +68,7 @@ public Choice visitChoice(Choice n) } @Override - public DirectedInteraction visitDirectedInteraction( + public SType visitDirectedInteraction( DirectedInteraction n) throws ScribException { Map enablers = getEnablers(); @@ -82,11 +83,12 @@ public DirectedInteraction visitDirectedInteraction( return n; } - public Map getEnablers() + protected Map getEnablers() { return this.enablers; } + // Guards this.enablers unmodifiable protected void setEnablers(Map enabled) { this.enablers = Collections.unmodifiableMap(enabled); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java index 82b704b6b..8535964fd 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java @@ -13,6 +13,7 @@ import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.DirectedInteraction; import org.scribble.core.type.session.DisconnectAction; +import org.scribble.core.type.session.SType; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.visit.InlinedVisitor; import org.scribble.util.ScribException; @@ -27,7 +28,7 @@ public RoleEnablingChecker(Set enabled) setEnabled(enabled); } - public Choice visitChoice(Choice n) + public SType visitChoice(Choice n) throws ScribException { Set enabled = getEnabled(); @@ -55,7 +56,7 @@ public Choice visitChoice(Choice n) } @Override - public DirectedInteraction visitDirectedInteraction( + public SType visitDirectedInteraction( DirectedInteraction n) throws ScribException { Set enabled = getEnabled(); @@ -74,7 +75,7 @@ public DirectedInteraction visitDirectedInteraction( } @Override - public DisconnectAction visitDisconnect( + public SType visitDisconnect( DisconnectAction n) throws ScribException { Set enabled = getEnabled(); @@ -94,6 +95,7 @@ public Set getEnabled() return this.enabled; } + // Guards this.enabled unmodifiable protected void setEnabled(Set enabled) { this.enabled = Collections.unmodifiableSet(enabled); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java new file mode 100644 index 000000000..667d868dc --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java @@ -0,0 +1,128 @@ +package org.scribble.core.visit.local; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.Continue; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.type.session.local.LType; +import org.scribble.core.visit.InlinedVisitor; +import org.scribble.util.ScribException; + +// Pre: use on inlined or later (unsupported for Do, also Protocol) +public class ReachabilityChecker extends InlinedVisitor +{ + private ReachabilityEnv env; // Immutable + + public ReachabilityChecker() + { + this.env = new ReachabilityEnv(false, Collections.emptySet()); + } + + @Override + public SType visitChoice(Choice n) + throws ScribException + { + ReachabilityEnv entry = getEnv(); + List blocks = new LinkedList<>(); + ReachabilityChecker nested = new ReachabilityChecker(); + for (LSeq block : n.blocks) + { + nested.setEnv(entry); + block.visitWith(nested); + blocks.add(nested.getEnv()); + } + boolean postcont = blocks.stream().allMatch(x -> x.postcont); // i.e., no exits + Set recvars = blocks.stream().flatMap(x -> x.recvars.stream()) + .collect(Collectors.toSet()); + setEnv(new ReachabilityEnv(postcont, recvars)); + return n; + } + + public SType visitContinue(Continue n) throws ScribException + { + ReachabilityEnv env = getEnv(); + Set tmp = new HashSet<>(env.recvars); + tmp.add(n.recvar); + setEnv(new ReachabilityEnv(true, tmp)); + return n; + } + + @Override + public SType visitRecursion(Recursion n) + throws ScribException + { + n.body.visitWith(this); + ReachabilityEnv env = getEnv(); + if (env.recvars.contains(n.recvar)) + { + Set tmp = new HashSet<>(env.recvars); + tmp.remove(n.recvar); + setEnv(new ReachabilityEnv(env.postcont, tmp)); + } + return n; + } + + @Override + public LSeq visitSeq(LSeq n) + throws ScribException + { + LType prev = null; + LType next = null; + for (Iterator i = n.getElements().iterator(); i.hasNext(); ) + { + prev = next; + next = i.next(); + ReachabilityEnv env = getEnv(); + if (!env.isSeqable()) + { + throw new ScribException( + "Illegal sequence: " + (prev == null ? "" : prev + "\n") + next); + } + next.visitWith(this); + } + return n; + } + + protected ReachabilityEnv getEnv() + { + return this.env; + } + + protected void setEnv(ReachabilityEnv env) + { + this.env = env; + } +} + + +// Immutable +class ReachabilityEnv +{ + // For checking bad sequencing of unreachable code: false after a continue; true if choice has an exit (false inherited for all other constructs) + public final boolean postcont; + + // For checking "reachable code" also satisfies tail recursion (e.g., after choice-with-exit) + public final Set recvars; + + public ReachabilityEnv(boolean postcont, Set recvars) + { + this.postcont = postcont; + this.recvars = Collections.unmodifiableSet(recvars); + } + + public boolean isSeqable() + { + return !this.postcont && this.recvars.isEmpty(); + } +} \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityEnv.java b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityEnv.java deleted file mode 100644 index ebfd24087..000000000 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityEnv.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.core.visit.local; - -import java.util.Collections; -import java.util.Set; - -import org.scribble.core.type.name.RecVar; - -public class ReachabilityEnv -{ - public final boolean postcont; // For checking bad sequencing of unreachable code: false after a continue; true if choice has an exit (false inherited for all other constructs) - public final Set recvars; // For checking "reachable code" also satisfies tail recursion (e.g., after choice-with-exit) - - public ReachabilityEnv(boolean postcont, Set recvars) - { - this.postcont = postcont; - this.recvars = Collections.unmodifiableSet(recvars); - } - - public boolean isSeqable() - { - return !this.postcont && this.recvars.isEmpty(); - } -} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java index 4ee0a7ac6..a13888a1d 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java @@ -16,7 +16,8 @@ import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.STypeAgg; -// "InlinedAgg" +// Return true iff this LType is "equivalent" to a single "continue X", where X is in rvs +// Would be an "InlinedAgg" public class SingleContinueChecker extends STypeAgg { private Set rvs; diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 6c83362ae..5fecf9aa0 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -73,6 +73,8 @@ module tmp.Test; // re-check disamb pass -- e.g., do-target disamb done by translation -- check, e.g., message transfer message disamb (signames, payloads) // refactor additional disamb syntactic checks into core? e.g., do-calls, distinct roledecls, protodecls, etc. // refactor scribble.g, simplify ast/del/etc class names + //make a visitor factory + //for isSingleConts (and project, buildGraph), make T visitWith(STypeReducer v) ? -- roleenabling and extchoicecons are more like reducers? // add exp conn checks to model validation // use stypefactory in core -- also make a visitorfactory From ea164b3f70bcda266aff896ca45bbbf7e7f435e9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 12:14:33 +0100 Subject: [PATCH 228/539] Minor. --- .../core/type/session/local/LType.java | 4 ++++ .../org/scribble/core/visit/STypeAgg.java | 22 +++++++++++-------- .../scribble/core/visit/STypeVisitorNoEx.java | 8 +++++++ .../visit/local/SingleContinueChecker.java | 7 +++--- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java index 19db2a055..6dcb53e4d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java @@ -42,6 +42,10 @@ public interface LType extends SType, LNode + + + + /*@Override LType substitute(Substitutions subs);*/ // Otherwise causes return type inconsistency with base abstract classes diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java index d6bdf7b36..d4705bc5c 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java @@ -10,6 +10,7 @@ import org.scribble.core.type.session.DisconnectAction; import org.scribble.core.type.session.Do; import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; // Visitor could be refactored as an Agg, but not worth it? (T = List, unit = n.getChildren(), agg = reconstruct) @@ -17,44 +18,47 @@ // Another factor is about throws ScribException public abstract class STypeAgg, T> { - public abstract T unit(); - public abstract T agg(Stream ts); // Generic varargs has heap pollution issue + // Internal use + protected abstract T unit(SType n); + + // Internal use + protected abstract T agg(SType n, Stream ts); // Cf. generic varargs, heap pollution issue // SType return for extensibility/flexibility public T visitContinue(Continue n) { - return agg(Stream.of(unit())); + return agg(n, Stream.of(unit(n))); } public T visitChoice(Choice n) { - return agg(n.blocks.stream().map(x -> x.aggregate(this))); + return agg(n, n.blocks.stream().map(x -> x.aggregate(this))); } public T visitDirectedInteraction(DirectedInteraction n) { - return agg(Stream.of(unit())); + return agg(n, Stream.of(unit(n))); } public T visitDisconnect(DisconnectAction n) { - return agg(Stream.of(unit())); + return agg(n, Stream.of(unit(n))); } public > T visitDo(Do n) { - return agg(Stream.of(unit())); + return agg(n, Stream.of(unit(n))); } public T visitRecursion(Recursion n) { - return agg(Stream.of(n.body.aggregate(this))); + return agg(n, Stream.of(n.body.aggregate(this))); } // "Hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction public T visitSeq(B n) { - return agg(n.elems.stream().map(x -> x.aggregate(this))); + return agg(n, n.elems.stream().map(x -> x.aggregate(this))); } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java index 38e017e27..1d03693a8 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.ProtocolName; @@ -15,8 +16,15 @@ import org.scribble.core.type.session.Seq; public abstract class STypeVisitorNoEx> + //extends STypeAgg> //extends STypeVisitor // Not useful, and causes mixups ? { +// @Override +// protected SType unit() +// { +// return null; +// } + // SType return for extensibility/flexibility public SType visitContinue(Continue n) { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java index a13888a1d..eae7732ea 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java @@ -12,6 +12,7 @@ import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.Do; import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.SType; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.STypeAgg; @@ -28,13 +29,13 @@ public SingleContinueChecker(Set rvs) } @Override - public Boolean unit() + public Boolean unit(SType n) { return false; } @Override - public Boolean agg(Stream bs) + public Boolean agg(SType n, Stream bs) { return bs.allMatch(x -> x); } @@ -48,7 +49,7 @@ public Boolean visitContinue(Continue n) @Override public Boolean visitChoice(Choice n) { - return agg(n.blocks.stream().map(x -> x.aggregate(this))); + return agg(n, n.blocks.stream().map(x -> x.aggregate(this))); } @Override From c0c68acaa58689ef3044bcbb3fea0bca1464cf75 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 12:42:19 +0100 Subject: [PATCH 229/539] Continued: refactored STypeVisitorNoEx as an STypeAgg. --- .../org/scribble/core/type/session/SType.java | 2 +- .../org/scribble/core/visit/STypeAgg.java | 1 + .../scribble/core/visit/STypeVisitorNoEx.java | 57 ++++++++++++++++--- 3 files changed, 50 insertions(+), 10 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index 372124b02..c30ea6537 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -31,7 +31,7 @@ public interface SType> { SType visitWith(STypeVisitor v) throws ScribException; - SType visitWithNoEx(STypeVisitorNoEx v); + SType visitWithNoEx(STypeVisitorNoEx v); // Gives B return for visitSeq, cf. Agg T aggregate(STypeAgg v); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java index d4705bc5c..eda0e8f7c 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java @@ -15,6 +15,7 @@ // Visitor could be refactored as an Agg, but not worth it? (T = List, unit = n.getChildren(), agg = reconstruct) // (Could also do T = SType, unit = n and if agg method extended to take n as a param, for n-sensitive agg, e.g., Choice) +// (Or T = B ... ? cf. Stream, for Choice reconstruct) // Another factor is about throws ScribException public abstract class STypeAgg, T> { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java index 1d03693a8..95c2ecd2d 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java @@ -5,7 +5,6 @@ import java.util.stream.Stream; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.DirectedInteraction; @@ -16,16 +15,56 @@ import org.scribble.core.type.session.Seq; public abstract class STypeVisitorNoEx> - //extends STypeAgg> + extends STypeAgg> // T = SType, for extensibility/flexibility //extends STypeVisitor // Not useful, and causes mixups ? { -// @Override -// protected SType unit() -// { -// return null; -// } + @Override + protected SType unit(SType n) + { + return n; + } + + // agg = reconstruct, ns = "structural" (i.e, B) children + @Override + protected SType agg(SType n, Stream> ns) + { + if (n instanceof Continue || n instanceof DirectedInteraction + || n instanceof DisconnectAction || n instanceof Do) + { + return ns.iterator().next(); + } + else if (n instanceof Choice) + { + Choice c = (Choice) n; + return c.reconstruct(c.getSource(), c.subj, + ns.map(x -> (B) x).collect(Collectors.toList())); + } + else if (n instanceof Recursion) + { + Recursion r = (Recursion) n; + return r.reconstruct(r.getSource(), r.recvar, (B) ns.iterator().next()); + } + else + { + throw new RuntimeException("Shouldn't get in here: " + n + " ,, " + ns); + // agg should only be called from internal visit dispatch methods, so n's type has already been cased + } + } - // SType return for extensibility/flexibility + // Distinguished from main agg pattern to return B (cf. T) -- for Seq.visitWith + // "Hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction + // This means a Visitor that needs to restructure a Seq should handle this within visitSeq + // E.g., Seq "injection" by inlining and unfolding + // For this purpose, visited children passed "directly" instead of via a reconstruction (cf. above methods) + @Override + public B visitSeq(B n) + { + List> elems = n.elems.stream().map(x -> x.visitWithNoEx(this)) + .collect(Collectors.toList()); + return n.reconstruct(n.getSource(), elems); + } + + /* public SType visitContinue(Continue n) { return n; @@ -71,7 +110,7 @@ public B visitSeq(B n) List> elems = n.elems.stream().map(x -> x.visitWithNoEx(this)) .collect(Collectors.toList()); return n.reconstruct(n.getSource(), elems); - } + }*/ } From 1a8e0330346cf8239411da93051c52681da8c4c5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 12:44:20 +0100 Subject: [PATCH 230/539] Minor. --- .../scribble/core/visit/STypeVisitorNoEx.java | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java index 95c2ecd2d..fc323c1ca 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java @@ -19,14 +19,15 @@ public abstract class STypeVisitorNoEx // Not useful, and causes mixups ? { @Override - protected SType unit(SType n) + protected final SType unit(SType n) { return n; } // agg = reconstruct, ns = "structural" (i.e, B) children + @SuppressWarnings("unchecked") // FIXME @Override - protected SType agg(SType n, Stream> ns) + protected final SType agg(SType n, Stream> ns) { if (n instanceof Continue || n instanceof DirectedInteraction || n instanceof DisconnectAction || n instanceof Do) @@ -51,7 +52,7 @@ else if (n instanceof Recursion) } } - // Distinguished from main agg pattern to return B (cf. T) -- for Seq.visitWith + // Distinguished from main agg-reconstruct pattern to return B (cf. T) -- for Seq.visitWith // "Hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction // This means a Visitor that needs to restructure a Seq should handle this within visitSeq // E.g., Seq "injection" by inlining and unfolding @@ -64,6 +65,25 @@ public B visitSeq(B n) return n.reconstruct(n.getSource(), elems); } +} + + + + + + + + + + + + + + + + + + /* public SType visitContinue(Continue n) { @@ -111,25 +131,6 @@ public B visitSeq(B n) .collect(Collectors.toList()); return n.reconstruct(n.getSource(), elems); }*/ -} - - - - - - - - - - - - - - - - - - /*@FunctionalInterface From 435afb38ce6901e8cb6ca4143f064f0cc9876413 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 13:19:17 +0100 Subject: [PATCH 231/539] Continued: refactoring core visitors. --- .../scribble/core/type/session/Choice.java | 17 +++++++-------- .../scribble/core/type/session/Continue.java | 21 ++++++++++--------- .../type/session/DirectedInteraction.java | 20 +++++++++--------- .../core/type/session/DisconnectAction.java | 20 +++++++++--------- .../org/scribble/core/type/session/Do.java | 20 +++++++++--------- .../scribble/core/type/session/Recursion.java | 21 ++++++++++--------- .../org/scribble/core/type/session/SType.java | 6 +++--- .../scribble/core/type/session/STypeBase.java | 7 +++++++ .../org/scribble/core/type/session/Seq.java | 5 +++-- .../core/type/session/local/LSkip.java | 11 ++-------- .../{STypeAgg.java => STypeAggNoEx.java} | 9 ++++---- .../scribble/core/visit/STypeVisitorNoEx.java | 3 +-- .../visit/local/SingleContinueChecker.java | 4 ++-- 13 files changed, 82 insertions(+), 82 deletions(-) rename scribble-core/src/main/java/org/scribble/core/visit/{STypeAgg.java => STypeAggNoEx.java} (80%) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java index 986626597..5aeb0e1e4 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java @@ -22,9 +22,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; -import org.scribble.core.visit.STypeAgg; +import org.scribble.core.visit.STypeAggNoEx; import org.scribble.core.visit.STypeVisitor; -import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.util.ScribException; public abstract class Choice> @@ -51,15 +50,9 @@ public SType visitWith(STypeVisitor v) throws ScribException { return v.visitChoice(this); } - - @Override - public SType visitWithNoEx(STypeVisitorNoEx v) - { - return v.visitChoice(this); - } @Override - public T aggregate(STypeAgg v) + public T aggregate(STypeAggNoEx v) { return v.visitChoice(this); } @@ -118,6 +111,12 @@ public boolean equals(Object o) /*@Override + public SType visitWithNoEx(STypeVisitorNoEx v) + { + return v.visitChoice(this); + } + + @Override public Set getRoles() { Set res = Stream.of(this.subj).collect(Collectors.toSet()); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java index e3a5f1b9b..ededcebc8 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java @@ -19,9 +19,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.RecVar; -import org.scribble.core.visit.STypeAgg; +import org.scribble.core.visit.STypeAggNoEx; import org.scribble.core.visit.STypeVisitor; -import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.util.ScribException; public abstract class Continue> @@ -45,15 +44,9 @@ public SType visitWith(STypeVisitor v) throws ScribException { return v.visitContinue(this); } - - @Override - public SType visitWithNoEx(STypeVisitorNoEx v) - { - return v.visitContinue(this); - } @Override - public T aggregate(STypeAgg v) + public T aggregate(STypeAggNoEx v) { return v.visitContinue(this); } @@ -104,7 +97,15 @@ public boolean equals(Object o) - /*@Override + /* + + @Override + public SType visitWithNoEx(STypeVisitorNoEx v) + { + return v.visitContinue(this); + } + + @Override public Set getRoles() { return Collections.emptySet(); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java index 1ef5ce27d..197228b10 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java @@ -19,9 +19,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; -import org.scribble.core.visit.STypeAgg; +import org.scribble.core.visit.STypeAggNoEx; import org.scribble.core.visit.STypeVisitor; -import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.util.ScribException; // Besides directed-ness, also features a Message @@ -51,15 +50,9 @@ public SType visitWith(STypeVisitor v) throws ScribException { return v.visitDirectedInteraction(this); } - - @Override - public SType visitWithNoEx(STypeVisitorNoEx v) - { - return v.visitDirectedInteraction(this); - } @Override - public T aggregate(STypeAgg v) + public T aggregate(STypeAggNoEx v) { return v.visitDirectedInteraction(this); } @@ -116,7 +109,14 @@ public boolean equals(Object o) - /*@Override + /* + @Override + public SType visitWithNoEx(STypeVisitorNoEx v) + { + return v.visitDirectedInteraction(this); + } + + @Override public Set getRoles() { // Includes self diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java index 40e30da6c..fdda430c7 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java @@ -19,9 +19,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; -import org.scribble.core.visit.STypeAgg; +import org.scribble.core.visit.STypeAggNoEx; import org.scribble.core.visit.STypeVisitor; -import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.util.ScribException; // Base class would be "SymmetricInteraction" (cf., DirectedInteraction) @@ -47,15 +46,9 @@ public SType visitWith(STypeVisitor v) throws ScribException { return v.visitDisconnect(this); } - - @Override - public SType visitWithNoEx(STypeVisitorNoEx v) - { - return v.visitDisconnect(this); - } @Override - public T aggregate(STypeAgg v) + public T aggregate(STypeAggNoEx v) { return v.visitDisconnect(this); } @@ -109,7 +102,14 @@ public boolean equals(Object o) - /*@Override + /* + @Override + public SType visitWithNoEx(STypeVisitorNoEx v) + { + return v.visitDisconnect(this); + } + + @Override public Set getRoles() { // Includes self diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java index e74ae9f99..ea802e270 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java @@ -24,9 +24,8 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; -import org.scribble.core.visit.STypeAgg; +import org.scribble.core.visit.STypeAggNoEx; import org.scribble.core.visit.STypeVisitor; -import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.util.ScribException; public abstract class Do @@ -55,15 +54,9 @@ public SType visitWith(STypeVisitor v) throws ScribException { return v.visitDo(this); } - - @Override - public SType visitWithNoEx(STypeVisitorNoEx v) - { - return v.visitDo(this); - } @Override - public T aggregate(STypeAgg v) + public T aggregate(STypeAggNoEx v) { return v.visitDo(this); } @@ -128,7 +121,14 @@ public boolean equals(Object o) - /*@Override + /* + @Override + public SType visitWithNoEx(STypeVisitorNoEx v) + { + return v.visitDo(this); + } + + @Override public Set getRoles() { return this.roles.stream().collect(Collectors.toSet()); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java index 0234e7b7d..0da82128d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java @@ -19,9 +19,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.RecVar; -import org.scribble.core.visit.STypeAgg; +import org.scribble.core.visit.STypeAggNoEx; import org.scribble.core.visit.STypeVisitor; -import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.util.ScribException; public abstract class Recursion> @@ -47,15 +46,9 @@ public SType visitWith(STypeVisitor v) throws ScribException { return v.visitRecursion(this); } - - @Override - public SType visitWithNoEx(STypeVisitorNoEx v) - { - return v.visitRecursion(this); - } @Override - public T aggregate(STypeAgg v) + public T aggregate(STypeAggNoEx v) { return v.visitRecursion(this); } @@ -108,7 +101,15 @@ public boolean equals(Object o) - /*@Override + /* + @Override + public SType visitWithNoEx(STypeVisitorNoEx v) + { + return v.visitRecursion(this); + } + + + @Override public Set getRoles() { return this.body.getRoles(); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index c30ea6537..97067365c 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -18,7 +18,7 @@ import org.scribble.core.lang.SNode; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.visit.STypeAgg; +import org.scribble.core.visit.STypeAggNoEx; import org.scribble.core.visit.STypeVisitor; import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.util.ScribException; @@ -30,11 +30,11 @@ public interface SType> extends SNode { SType visitWith(STypeVisitor v) throws ScribException; + + T aggregate(STypeAggNoEx v); SType visitWithNoEx(STypeVisitorNoEx v); // Gives B return for visitSeq, cf. Agg - T aggregate(STypeAgg v); - // Pass in an STypeGatherer::visit, e.g., n.(new RoleGatherer()::visit) Stream gather(Function, Stream> f); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java b/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java index 5248e56ba..08c4a82fc 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java @@ -15,6 +15,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.visit.STypeVisitorNoEx; // SessTypeBase is to SessType as ScribNodeBase is to ScribNode public abstract class STypeBase> @@ -31,6 +32,12 @@ public STypeBase(CommonTree source) this.source = source; } + @Override + public SType visitWithNoEx(STypeVisitorNoEx v) + { + return aggregate(v); + } + @Override public boolean hasSource() { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java index 5b03fc1a8..ea0080c77 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java @@ -21,7 +21,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.visit.STypeAgg; +import org.scribble.core.visit.STypeAggNoEx; import org.scribble.core.visit.STypeVisitor; import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.util.ScribException; @@ -49,6 +49,7 @@ public B visitWith(STypeVisitor v) throws ScribException return v.visitSeq(cast); } + // Override STypeBase.visitWithNoEx for B return @Override public B visitWithNoEx(STypeVisitorNoEx v) { @@ -58,7 +59,7 @@ public B visitWithNoEx(STypeVisitorNoEx v) } @Override - public T aggregate(STypeAgg v) + public T aggregate(STypeAggNoEx v) { @SuppressWarnings("unchecked") B cast = (B) this; diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java index 7a91efe2c..a5a241bd1 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java @@ -20,9 +20,8 @@ import org.scribble.core.type.kind.Local; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.STypeBase; -import org.scribble.core.visit.STypeAgg; +import org.scribble.core.visit.STypeAggNoEx; import org.scribble.core.visit.STypeVisitor; -import org.scribble.core.visit.STypeVisitorNoEx; // Used only *during* projection -- filtered out by GSeq::projection public class LSkip extends STypeBase implements LType @@ -41,13 +40,7 @@ public LSkip visitWith(STypeVisitor v) } @Override - public LSkip visitWithNoEx(STypeVisitorNoEx v) - { - throw new RuntimeException("Unsupported for Skip: " + this); - } - - @Override - public T aggregate(STypeAgg v) + public T aggregate(STypeAggNoEx v) { throw new RuntimeException("Unsupported for Skip: " + this); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java similarity index 80% rename from scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java rename to scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java index eda0e8f7c..4a5a8a4a9 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java @@ -13,11 +13,10 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; -// Visitor could be refactored as an Agg, but not worth it? (T = List, unit = n.getChildren(), agg = reconstruct) -// (Could also do T = SType, unit = n and if agg method extended to take n as a param, for n-sensitive agg, e.g., Choice) -// (Or T = B ... ? cf. Stream, for Choice reconstruct) -// Another factor is about throws ScribException -public abstract class STypeAgg, T> +// Alternative characterisations of STypeVisitor as STypeAgg? +// T = List, unit = n.getChildren(), agg = reconstruct +// T = B ... ? cf. Stream, for Choice reconstruct +public abstract class STypeAggNoEx, T> { // Internal use protected abstract T unit(SType n); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java index fc323c1ca..8c5a7821a 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java @@ -15,8 +15,7 @@ import org.scribble.core.type.session.Seq; public abstract class STypeVisitorNoEx> - extends STypeAgg> // T = SType, for extensibility/flexibility - //extends STypeVisitor // Not useful, and causes mixups ? + extends STypeAggNoEx> // T = SType gives reconstruction flexibility/extensibility { @Override protected final SType unit(SType n) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java index eae7732ea..cd9efbb81 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java @@ -15,11 +15,11 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.STypeAgg; +import org.scribble.core.visit.STypeAggNoEx; // Return true iff this LType is "equivalent" to a single "continue X", where X is in rvs // Would be an "InlinedAgg" -public class SingleContinueChecker extends STypeAgg +public class SingleContinueChecker extends STypeAggNoEx { private Set rvs; From c281f93b4fc10ca4633e95a05735051797d34a07 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 14:20:08 +0100 Subject: [PATCH 232/539] Continued: refactoring core visitors. --- .../scribble/core/type/session/Choice.java | 21 ++- .../scribble/core/type/session/Continue.java | 12 +- .../type/session/DirectedInteraction.java | 15 +- .../core/type/session/DisconnectAction.java | 15 +- .../org/scribble/core/type/session/Do.java | 14 +- .../scribble/core/type/session/Recursion.java | 14 +- .../org/scribble/core/type/session/SType.java | 10 +- .../scribble/core/type/session/STypeBase.java | 10 +- .../org/scribble/core/type/session/Seq.java | 26 ++-- .../core/type/session/global/GRecursion.java | 2 +- .../core/type/session/local/LSkip.java | 6 +- .../org/scribble/core/visit/STypeAgg.java | 102 ++++++++++++++ .../org/scribble/core/visit/STypeAggNoEx.java | 22 +-- .../org/scribble/core/visit/STypeVisitor.java | 128 +++++++++++++----- .../scribble/core/visit/STypeVisitorNoEx.java | 34 +++-- .../visit/local/SingleContinueChecker.java | 11 +- 16 files changed, 341 insertions(+), 101 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java index 5aeb0e1e4..c1d47be86 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java @@ -22,8 +22,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoEx; -import org.scribble.core.visit.STypeVisitor; import org.scribble.util.ScribException; public abstract class Choice> @@ -44,15 +44,15 @@ public Choice(CommonTree source, Role subj, public abstract Choice reconstruct(CommonTree source, Role subj, List blocks); //List> blocks); - + @Override - public SType visitWith(STypeVisitor v) throws ScribException + public T aggregate(STypeAgg v) throws ScribException { return v.visitChoice(this); } @Override - public T aggregate(STypeAggNoEx v) + public T aggregateNoEx(STypeAggNoEx v) { return v.visitChoice(this); } @@ -110,7 +110,18 @@ public boolean equals(Object o) - /*@Override + + + + /* + + @Override + public SType visitWith(STypeVisitor v) throws ScribException + { + return v.visitChoice(this); + } + + @Override public SType visitWithNoEx(STypeVisitorNoEx v) { return v.visitChoice(this); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java index ededcebc8..803ad640d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java @@ -19,8 +19,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.RecVar; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoEx; -import org.scribble.core.visit.STypeVisitor; import org.scribble.util.ScribException; public abstract class Continue> @@ -40,13 +40,13 @@ public abstract Continue reconstruct( CommonTree source, RecVar recvar); @Override - public SType visitWith(STypeVisitor v) throws ScribException + public T aggregate(STypeAgg v) throws ScribException { return v.visitContinue(this); } @Override - public T aggregate(STypeAggNoEx v) + public T aggregateNoEx(STypeAggNoEx v) { return v.visitContinue(this); } @@ -99,6 +99,12 @@ public boolean equals(Object o) /* + @Override + public SType visitWith(STypeVisitor v) throws ScribException + { + return v.visitContinue(this); + } + @Override public SType visitWithNoEx(STypeVisitorNoEx v) { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java index 197228b10..795d4e66e 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java @@ -19,8 +19,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoEx; -import org.scribble.core.visit.STypeVisitor; import org.scribble.util.ScribException; // Besides directed-ness, also features a Message @@ -44,15 +44,15 @@ public DirectedInteraction(CommonTree source, public abstract DirectedInteraction reconstruct( CommonTree source, Message msg, Role src, Role dst); - + @Override - public SType visitWith(STypeVisitor v) throws ScribException + public T aggregate(STypeAgg v) throws ScribException { return v.visitDirectedInteraction(this); } @Override - public T aggregate(STypeAggNoEx v) + public T aggregateNoEx(STypeAggNoEx v) { return v.visitDirectedInteraction(this); } @@ -110,6 +110,13 @@ public boolean equals(Object o) /* + + @Override + public SType visitWith(STypeVisitor v) throws ScribException + { + return v.visitDirectedInteraction(this); + } + @Override public SType visitWithNoEx(STypeVisitorNoEx v) { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java index fdda430c7..8b29b888a 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java @@ -19,8 +19,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoEx; -import org.scribble.core.visit.STypeVisitor; import org.scribble.util.ScribException; // Base class would be "SymmetricInteraction" (cf., DirectedInteraction) @@ -40,15 +40,15 @@ public DisconnectAction(CommonTree source, public abstract DisconnectAction reconstruct( CommonTree source, Role src, Role dst); - + @Override - public SType visitWith(STypeVisitor v) throws ScribException + public T aggregate(STypeAgg v) throws ScribException { return v.visitDisconnect(this); } @Override - public T aggregate(STypeAggNoEx v) + public T aggregateNoEx(STypeAggNoEx v) { return v.visitDisconnect(this); } @@ -103,6 +103,13 @@ public boolean equals(Object o) /* + + @Override + public SType visitWith(STypeVisitor v) throws ScribException + { + return v.visitDisconnect(this); + } + @Override public SType visitWithNoEx(STypeVisitorNoEx v) { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java index ea802e270..4113ac322 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java @@ -24,8 +24,8 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoEx; -import org.scribble.core.visit.STypeVisitor; import org.scribble.util.ScribException; public abstract class Do @@ -48,15 +48,15 @@ public Do(CommonTree source, N proto, public abstract Do reconstruct(CommonTree source, N proto, List roles, List> args); - + @Override - public SType visitWith(STypeVisitor v) throws ScribException + public T aggregate(STypeAgg v) throws ScribException { return v.visitDo(this); } @Override - public T aggregate(STypeAggNoEx v) + public T aggregateNoEx(STypeAggNoEx v) { return v.visitDo(this); } @@ -122,6 +122,12 @@ public boolean equals(Object o) /* + @Override + public SType visitWith(STypeVisitor v) throws ScribException + { + return v.visitDo(this); + } + @Override public SType visitWithNoEx(STypeVisitorNoEx v) { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java index 0da82128d..79e048a39 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java @@ -19,8 +19,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.RecVar; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoEx; -import org.scribble.core.visit.STypeVisitor; import org.scribble.util.ScribException; public abstract class Recursion> @@ -40,15 +40,15 @@ public Recursion(//org.scribble.ast.Recursion source, public abstract Recursion reconstruct( CommonTree source, RecVar recvar, B body); - + @Override - public SType visitWith(STypeVisitor v) throws ScribException + public T aggregate(STypeAgg v) throws ScribException { return v.visitRecursion(this); } @Override - public T aggregate(STypeAggNoEx v) + public T aggregateNoEx(STypeAggNoEx v) { return v.visitRecursion(this); } @@ -102,6 +102,12 @@ public boolean equals(Object o) /* + @Override + public SType visitWith(STypeVisitor v) throws ScribException + { + return v.visitRecursion(this); + } + @Override public SType visitWithNoEx(STypeVisitorNoEx v) { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index 97067365c..935a0f756 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -18,6 +18,7 @@ import org.scribble.core.lang.SNode; import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoEx; import org.scribble.core.visit.STypeVisitor; import org.scribble.core.visit.STypeVisitorNoEx; @@ -29,11 +30,12 @@ public interface SType> extends SNode { - SType visitWith(STypeVisitor v) throws ScribException; + T aggregate(STypeAgg v) throws ScribException; + T aggregateNoEx(STypeAggNoEx v); - T aggregate(STypeAggNoEx v); - - SType visitWithNoEx(STypeVisitorNoEx v); // Gives B return for visitSeq, cf. Agg + // Wrappers for STypeVisitor around aggregate -- give B return for visitSeq, cf. STypeAgg + SType visitWith(STypeVisitor v) throws ScribException; + SType visitWithNoEx(STypeVisitorNoEx v); // Pass in an STypeGatherer::visit, e.g., n.(new RoleGatherer()::visit) Stream gather(Function, Stream> f); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java b/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java index 08c4a82fc..10fdd5df8 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java @@ -15,7 +15,9 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.visit.STypeVisitor; import org.scribble.core.visit.STypeVisitorNoEx; +import org.scribble.util.ScribException; // SessTypeBase is to SessType as ScribNodeBase is to ScribNode public abstract class STypeBase> @@ -33,11 +35,17 @@ public STypeBase(CommonTree source) } @Override - public SType visitWithNoEx(STypeVisitorNoEx v) + public SType visitWith(STypeVisitor v) throws ScribException { return aggregate(v); } + @Override + public SType visitWithNoEx(STypeVisitorNoEx v) + { + return aggregateNoEx(v); + } + @Override public boolean hasSource() { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java index ea0080c77..bf2896f33 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java @@ -21,6 +21,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoEx; import org.scribble.core.visit.STypeVisitor; import org.scribble.core.visit.STypeVisitorNoEx; @@ -40,26 +41,35 @@ public Seq(CommonTree source, List> elems) public abstract B reconstruct(CommonTree source, List> elems); - + @Override - public B visitWith(STypeVisitor v) throws ScribException + public T aggregate(STypeAgg v) throws ScribException { @SuppressWarnings("unchecked") - B cast = (B) this; // CHECKME: OK as long as G/LSeq specify themselves as B param + B cast = (B) this; return v.visitSeq(cast); } - - // Override STypeBase.visitWithNoEx for B return + @Override - public B visitWithNoEx(STypeVisitorNoEx v) + public T aggregateNoEx(STypeAggNoEx v) { @SuppressWarnings("unchecked") B cast = (B) this; return v.visitSeq(cast); } - + + // Override STypeBase.visitWith for B return @Override - public T aggregate(STypeAggNoEx v) + public B visitWith(STypeVisitor v) throws ScribException + { + @SuppressWarnings("unchecked") + B cast = (B) this; // CHECKME: OK as long as G/LSeq specify themselves as B param + return v.visitSeq(cast); + } + + // Override STypeBase.visitWithNoEx for B return + @Override + public B visitWithNoEx(STypeVisitorNoEx v) { @SuppressWarnings("unchecked") B cast = (B) this; diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java index 9a10c053b..d3ce05f59 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java @@ -66,7 +66,7 @@ private LType projectAux(LSeq body) }*/ Set rvs = new HashSet<>(); rvs.add(this.recvar); - if (body.aggregate(new SingleContinueChecker(rvs))) + if (body.aggregateNoEx(new SingleContinueChecker(rvs))) { return LSkip.SKIP; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java index a5a241bd1..fcafc1227 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java @@ -20,8 +20,8 @@ import org.scribble.core.type.kind.Local; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.STypeBase; +import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoEx; -import org.scribble.core.visit.STypeVisitor; // Used only *during* projection -- filtered out by GSeq::projection public class LSkip extends STypeBase implements LType @@ -34,13 +34,13 @@ private LSkip() } @Override - public LSkip visitWith(STypeVisitor v) + public T aggregate(STypeAgg v) { throw new RuntimeException("Unsupported for Skip: " + this); } @Override - public T aggregate(STypeAggNoEx v) + public T aggregateNoEx(STypeAggNoEx v) { throw new RuntimeException("Unsupported for Skip: " + this); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java new file mode 100644 index 000000000..3347fb7be --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java @@ -0,0 +1,102 @@ +package org.scribble.core.visit; + +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Stream; + +import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.Continue; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.DisconnectAction; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.Seq; +import org.scribble.util.ScribException; + +public abstract class STypeAgg, T> +{ + // Internal use + // Pre: agg(Stream.of(unit())) = unit() + protected abstract T unit(SType n) throws ScribException; + + // Internal use -- by default, agg applied to all cases (including unit) + // Pre: agg(Stream.of(unit())) = unit() + protected abstract T agg(SType n, Stream ts) throws ScribException; // Cf. generic varargs, heap pollution issue + + // SType return for extensibility/flexibility + public T visitContinue(Continue n) throws ScribException + { + return unit(n); + } + + public T visitChoice(Choice n) throws ScribException + { + List blocks = new LinkedList<>(); + for (SType e : n.blocks) + { + blocks.add(e.aggregate(this)); + } + return agg(n, blocks.stream()); + } + + public T visitDirectedInteraction(DirectedInteraction n) + throws ScribException + { + return unit(n); + } + + public T visitDisconnect(DisconnectAction n) throws ScribException + { + return unit(n); + } + + public > T visitDo(Do n) + throws ScribException + { + return unit(n); + } + + public T visitRecursion(Recursion n) throws ScribException + { + return agg(n, Stream.of(n.body.aggregate(this))); + } + + // Param "hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction + public T visitSeq(B n) throws ScribException + { + List elems = new LinkedList<>(); + for (SType e : n.elems) + { + elems.add(e.aggregate(this)); + } + return agg(n, elems.stream()); + } +} + + + + + + + + + + + + + + + + + + + + +/*@FunctionalInterface +interface STypeVisitorFunction, R extends Stream> +{ + R f(SType n, STypeVisitor v); +}*/ diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java index 4a5a8a4a9..0ac965789 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java @@ -13,52 +13,52 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; -// Alternative characterisations of STypeVisitor as STypeAgg? -// T = List, unit = n.getChildren(), agg = reconstruct -// T = B ... ? cf. Stream, for Choice reconstruct public abstract class STypeAggNoEx, T> + //extends STypeAgg // Not worth it, ex and noex method variants easily confused { // Internal use + // Pre: agg(Stream.of(unit())) = unit() protected abstract T unit(SType n); // Internal use + // Pre: agg(Stream.of(unit())) = unit() protected abstract T agg(SType n, Stream ts); // Cf. generic varargs, heap pollution issue // SType return for extensibility/flexibility public T visitContinue(Continue n) { - return agg(n, Stream.of(unit(n))); + return unit(n); } public T visitChoice(Choice n) { - return agg(n, n.blocks.stream().map(x -> x.aggregate(this))); + return agg(n, n.blocks.stream().map(x -> x.aggregateNoEx(this))); } public T visitDirectedInteraction(DirectedInteraction n) { - return agg(n, Stream.of(unit(n))); + return unit(n); } public T visitDisconnect(DisconnectAction n) { - return agg(n, Stream.of(unit(n))); + return unit(n); } public > T visitDo(Do n) { - return agg(n, Stream.of(unit(n))); + return unit(n); } public T visitRecursion(Recursion n) { - return agg(n, Stream.of(n.body.aggregate(this))); + return agg(n, Stream.of(n.body.aggregateNoEx(this))); } - // "Hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction + // Param "hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction public T visitSeq(B n) { - return agg(n, n.elems.stream().map(x -> x.aggregate(this))); + return agg(n, n.elems.stream().map(x -> x.aggregateNoEx(this))); } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java index 6d32cdb53..93be2f458 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java @@ -2,28 +2,61 @@ import java.util.LinkedList; import java.util.List; +import java.util.stream.Stream; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.session.Choice; -import org.scribble.core.type.session.Continue; -import org.scribble.core.type.session.DirectedInteraction; -import org.scribble.core.type.session.DisconnectAction; -import org.scribble.core.type.session.Do; import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; import org.scribble.util.ScribException; +// "Instantiates" Agg by implicitly treating Stream as always a singleton Stream of the *reconstructed* node +// Alternative characterisations of STypeVisitor as STypeAgg? +// T = SType, unit = empty, agg = reconstruct, ns = "structural" (i.e, B) children -- issues with generic cast to B inside agg +// T = SType, unit = n.getChildren(), agg = reconstruct, ns = all children -- all children require dynamic casts +// T = B ... ? cf. Stream, for Choice reconstruct public abstract class STypeVisitor> + extends STypeAgg> // T = SType gives reconstruction flexibility/extensibility { - // SType return for extensibility/flexibility - public SType visitContinue(Continue n) throws ScribException + @Override + protected final SType unit(SType n) throws ScribException { - //return n.reconstruct(n.getSource(), n.recvar); return n; } + // Should generally disregard agg for STypeVisitors -- pattern is now to manually do reconstruct within visit dispatches + @Override + protected final SType agg(SType n, Stream> ns) + throws ScribException + { + return ns.iterator().next(); + + /*// agg = reconstruct, ns = "structural" (i.e, B) children -- problem with generic casts + if (n instanceof Continue || n instanceof DirectedInteraction + || n instanceof DisconnectAction || n instanceof Do) + { + return ns.iterator().next(); + } + else if (n instanceof Choice) + { + Choice c = (Choice) n; + return c.reconstruct(c.getSource(), c.subj, + ns.map(x -> (B) x).collect(Collectors.toList())); + } + else if (n instanceof Recursion) + { + Recursion r = (Recursion) n; + return r.reconstruct(r.getSource(), r.recvar, (B) ns.iterator().next()); + } + else + { + throw new RuntimeException("Shouldn't get in here: " + n + " ,, " + ns); + // agg should only be called from internal visit dispatch methods, so n's type has already been cased + }*/ + } + + @Override public SType visitChoice(Choice n) throws ScribException { List blocks = new LinkedList<>(); @@ -31,40 +64,21 @@ public SType visitChoice(Choice n) throws ScribException { blocks.add(b.visitWith(this)); } - return n.reconstruct(n.getSource(), n.subj, blocks); - } - - public SType visitDirectedInteraction(DirectedInteraction n) - throws ScribException - { - //return n.reconstruct(n.getSource(), n.msg, n.src, n.dst); - return n; - } - - public SType visitDisconnect(DisconnectAction n) - throws ScribException - { - //return n.reconstruct(n.getSource(), n.left, n.right); - return n; - } - - public > SType visitDo(Do n) - throws ScribException - { - //return n.reconstruct(n.getSource(), n.proto, n.roles, n.args); - return n; + return n.reconstruct(n.getSource(), n.subj, blocks); // Skipping agg (reconstruction done here) } + @Override public SType visitRecursion(Recursion n) throws ScribException { B body = n.body.visitWith(this); - return n.reconstruct(n.getSource(), n.recvar, body); + return n.reconstruct(n.getSource(), n.recvar, body); // Skipping agg (reconstruction done here) } // "Hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction // This means a Visitor that needs to restructure a Seq should handle this within visitSeq // E.g., Seq "injection" by inlining and unfolding // For this purpose, visited children passed "directly" instead of via a reconstruction (cf. above methods) + @Override public B visitSeq(B n) throws ScribException { List> elems = new LinkedList<>(); @@ -72,7 +86,7 @@ public B visitSeq(B n) throws ScribException { elems.add(e.visitWith(this)); } - return n.reconstruct(n.getSource(), elems); + return n.reconstruct(n.getSource(), elems); // N.B. skipping agg (reconstruction done here) } } @@ -95,6 +109,56 @@ public B visitSeq(B n) throws ScribException + + + +/* + // SType return for extensibility/flexibility + public SType visitContinue(Continue n) throws ScribException + { + //return n.reconstruct(n.getSource(), n.recvar); + return n; + } + + public SType visitChoice(Choice n) throws ScribException + { + List blocks = new LinkedList<>(); + for (B b : n.blocks) + { + blocks.add(b.visitWith(this)); + } + return n.reconstruct(n.getSource(), n.subj, blocks); + } + + public SType visitDirectedInteraction(DirectedInteraction n) + throws ScribException + { + //return n.reconstruct(n.getSource(), n.msg, n.src, n.dst); + return n; + } + + public SType visitDisconnect(DisconnectAction n) + throws ScribException + { + //return n.reconstruct(n.getSource(), n.left, n.right); + return n; + } + + public > SType visitDo(Do n) + throws ScribException + { + //return n.reconstruct(n.getSource(), n.proto, n.roles, n.args); + return n; + } + + public SType visitRecursion(Recursion n) throws ScribException + { + B body = n.body.visitWith(this); + return n.reconstruct(n.getSource(), n.recvar, body); + } +*/ + + /*@FunctionalInterface interface STypeVisitorFunction, R extends Stream> { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java index 8c5a7821a..302125f92 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java @@ -6,14 +6,15 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.session.Choice; -import org.scribble.core.type.session.Continue; -import org.scribble.core.type.session.DirectedInteraction; -import org.scribble.core.type.session.DisconnectAction; -import org.scribble.core.type.session.Do; import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; +// "Instantiates" Agg by implicitly treating Stream as always a singleton Stream of the *reconstructed* node +// Alternative characterisations of STypeVisitor as STypeAgg? +// T = SType, unit = empty, agg = reconstruct, ns = "structural" (i.e, B) children -- issues with generic cast to B inside agg +// T = SType, unit = n.getChildren(), agg = reconstruct, ns = all children -- all children require dynamic casts +// T = B ... ? cf. Stream, for Choice reconstruct public abstract class STypeVisitorNoEx> extends STypeAggNoEx> // T = SType gives reconstruction flexibility/extensibility { @@ -23,11 +24,13 @@ protected final SType unit(SType n) return n; } - // agg = reconstruct, ns = "structural" (i.e, B) children - @SuppressWarnings("unchecked") // FIXME + // Should generally disregard agg for STypeVisitors -- pattern is now to manually do reconstruct within visit dispatches @Override protected final SType agg(SType n, Stream> ns) { + return ns.iterator().next(); + + /*// agg = reconstruct, ns = "structural" (i.e, B) children -- problem with generic casts if (n instanceof Continue || n instanceof DirectedInteraction || n instanceof DisconnectAction || n instanceof Do) { @@ -48,7 +51,22 @@ else if (n instanceof Recursion) { throw new RuntimeException("Shouldn't get in here: " + n + " ,, " + ns); // agg should only be called from internal visit dispatch methods, so n's type has already been cased - } + }*/ + } + + @Override + public SType visitChoice(Choice n) + { + List blocks = n.blocks.stream().map(x -> x.visitWithNoEx(this)) + .collect(Collectors.toList()); + return n.reconstruct(n.getSource(), n.subj, blocks); // Skipping agg (reconstruction done here) + } + + @Override + public SType visitRecursion(Recursion n) + { + B body = n.body.visitWithNoEx(this); + return n.reconstruct(n.getSource(), n.recvar, body); // Skipping agg (reconstruction done here) } // Distinguished from main agg-reconstruct pattern to return B (cf. T) -- for Seq.visitWith @@ -61,7 +79,7 @@ public B visitSeq(B n) { List> elems = n.elems.stream().map(x -> x.visitWithNoEx(this)) .collect(Collectors.toList()); - return n.reconstruct(n.getSource(), elems); + return n.reconstruct(n.getSource(), elems); // N.B. skipping agg (reconstruction done here) } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java index cd9efbb81..9266b05c9 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java @@ -8,7 +8,6 @@ import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.Do; import org.scribble.core.type.session.Recursion; @@ -46,12 +45,6 @@ public Boolean visitContinue(Continue n) return rvs.contains(n.recvar); // Single continue for an "outer" recvar caught later on } - @Override - public Boolean visitChoice(Choice n) - { - return agg(n, n.blocks.stream().map(x -> x.aggregate(this))); - } - @Override public > Boolean visitDo(Do n) { @@ -65,12 +58,12 @@ public Boolean visitRecursion(Recursion n) { Set tmp = new HashSet<>(this.rvs); tmp.add(n.recvar); - return n.body.aggregate(new SingleContinueChecker(tmp)); + return n.body.aggregateNoEx(new SingleContinueChecker(tmp)); } @Override public Boolean visitSeq(LSeq n) { - return n.elems.size() == 1 && ((LType) n.elems.get(0)).aggregate(this); + return n.elems.size() == 1 && ((LType) n.elems.get(0)).aggregateNoEx(this); } } From 02c388dbb632aa82a572feb0456c26b462ff181b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 14:24:09 +0100 Subject: [PATCH 233/539] Minor. --- .../src/main/java/org/scribble/core/visit/STypeVisitor.java | 2 +- .../main/java/org/scribble/core/visit/STypeVisitorNoEx.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java index 93be2f458..d295b8542 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java @@ -15,7 +15,7 @@ // Alternative characterisations of STypeVisitor as STypeAgg? // T = SType, unit = empty, agg = reconstruct, ns = "structural" (i.e, B) children -- issues with generic cast to B inside agg // T = SType, unit = n.getChildren(), agg = reconstruct, ns = all children -- all children require dynamic casts -// T = B ... ? cf. Stream, for Choice reconstruct +// T = B ... ? Considering Stream like a Seq, and elems as singleton Seqs -- cf. Stream, for Choice/etc reconstruct public abstract class STypeVisitor> extends STypeAgg> // T = SType gives reconstruction flexibility/extensibility { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java index 302125f92..70a9e0cfa 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java @@ -10,11 +10,11 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; -// "Instantiates" Agg by implicitly treating Stream as always a singleton Stream of the *reconstructed* node +// "Instantiates" Agg by implicitly treating Stream as always a singleton Stream of the *reconstructed* node // Alternative characterisations of STypeVisitor as STypeAgg? // T = SType, unit = empty, agg = reconstruct, ns = "structural" (i.e, B) children -- issues with generic cast to B inside agg // T = SType, unit = n.getChildren(), agg = reconstruct, ns = all children -- all children require dynamic casts -// T = B ... ? cf. Stream, for Choice reconstruct +// T = B ... ? Considering Stream like a Seq, and elems as singleton Seqs -- cf. Stream, for Choice/etc reconstruct public abstract class STypeVisitorNoEx> extends STypeAggNoEx> // T = SType gives reconstruction flexibility/extensibility { From 51d29f9f211bda00be755645394994e023096215 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 14:29:52 +0100 Subject: [PATCH 234/539] Minor. --- .../src/main/java/org/scribble/core/visit/STypeVisitor.java | 3 ++- .../main/java/org/scribble/core/visit/STypeVisitorNoEx.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java index d295b8542..8198eec56 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java @@ -30,7 +30,8 @@ protected final SType unit(SType n) throws ScribException protected final SType agg(SType n, Stream> ns) throws ScribException { - return ns.iterator().next(); + //return ns.iterator().next(); + throw new RuntimeException("Disregarded for STypeVisitor: " + n + " ,, " + ns); /*// agg = reconstruct, ns = "structural" (i.e, B) children -- problem with generic casts if (n instanceof Continue || n instanceof DirectedInteraction diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java index 70a9e0cfa..d6db6e35c 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java @@ -28,7 +28,8 @@ protected final SType unit(SType n) @Override protected final SType agg(SType n, Stream> ns) { - return ns.iterator().next(); + //return ns.iterator().next(); + throw new RuntimeException("Disregarded for STypeVisitorNoEx: " + n + " ,, " + ns); /*// agg = reconstruct, ns = "structural" (i.e, B) children -- problem with generic casts if (n instanceof Continue || n instanceof DirectedInteraction From a4323c2d18ec4b398724d5b802409786ce2dd261 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 16:07:56 +0100 Subject: [PATCH 235/539] Factored out Projector visitors. --- .../StateChannelApiGenerator.java | 4 +- .../main/java/org/scribble/core/job/Job.java | 6 +- .../org/scribble/core/job/JobContext.java | 12 +- .../scribble/core/lang/global/GProtocol.java | 19 ++- .../scribble/core/lang/local/LProtocol.java | 8 +- .../org/scribble/core/type/session/Seq.java | 9 +- .../core/type/session/global/GChoice.java | 18 +-- .../core/type/session/global/GConnect.java | 4 +- .../core/type/session/global/GContinue.java | 4 +- .../core/type/session/global/GDisconnect.java | 4 +- .../core/type/session/global/GDo.java | 6 +- .../type/session/global/GMessageTransfer.java | 4 +- .../core/type/session/global/GRecursion.java | 4 +- .../core/type/session/global/GSeq.java | 19 ++- .../core/type/session/global/GType.java | 4 +- .../core/type/session/local/LSeq.java | 15 ++ .../org/scribble/core/visit/STypeAgg.java | 19 +-- .../org/scribble/core/visit/STypeAggNoEx.java | 7 +- .../org/scribble/core/visit/STypeInliner.java | 3 +- .../scribble/core/visit/STypeUnfolder.java | 2 +- .../org/scribble/core/visit/STypeVisitor.java | 5 +- .../scribble/core/visit/STypeVisitorNoEx.java | 41 +---- .../org/scribble/core/visit/Substitutor.java | 2 +- .../global/ExtChoiceConsistencyChecker.java | 2 +- .../core/visit/global/GTypeInliner.java | 3 +- .../core/visit/global/InlinedProjector.java | 148 ++++++++++++++++++ .../scribble/core/visit/global/ProjEnv.java | 58 +++++++ .../scribble/core/visit/global/Projector.java | 87 +++++----- .../visit/global/RoleEnablingChecker.java | 2 +- .../core/visit/local/LTypeInliner.java | 3 +- .../core/visit/local/ReachabilityChecker.java | 2 +- .../visit/local/SingleContinueChecker.java | 3 +- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 33 files changed, 365 insertions(+), 164 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/global/ProjEnv.java diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 406f2e465..f4203c2e5 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -29,7 +29,7 @@ import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.Role; -import org.scribble.core.visit.global.Projector; +import org.scribble.core.visit.global.ProjEnv; import org.scribble.lang.Lang; import org.scribble.util.ScribException; @@ -63,7 +63,7 @@ public StateChannelApiGenerator(Lang lang, GProtocolName fullname, Role self) super(lang, fullname); this.self = self; - this.lpn = Projector.projectFullProtocolName(fullname, self); + this.lpn = ProjEnv.projectFullProtocolName(fullname, self); //this.init = job.getContext().getEndpointGraph(fullname, self).init; JobContext jobc2 = this.job.getContext(); this.init = this.job.config.args.get(JobArgs.MIN_EFSM) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index 4947d5884..88ccb1596 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -44,7 +44,7 @@ import org.scribble.core.visit.RoleGatherer; import org.scribble.core.visit.global.GTypeInliner; import org.scribble.core.visit.global.GTypeUnfolder; -import org.scribble.core.visit.global.Projector; +import org.scribble.core.visit.global.ProjEnv; import org.scribble.util.ScribException; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models @@ -267,7 +267,7 @@ protected void runProjectionPasses() throws ScribException for (Role self : g.roles) { GProtocol inlined = this.context.getInlined(g.fullname); // pruneRecs already done for pruneRecs (cf. runContextBuildingPasses) - LProtocol iproj = inlined.projectInlined(self); // CHECKME: projection and inling commutative? + LProtocol iproj = inlined.projectInlined(this, self); // CHECKME: projection and inling commutative? this.context.addInlinedProjection(iproj.fullname, iproj); verbosePrintln("\nProjected inlined onto " + self + ":\n" + iproj); } @@ -278,7 +278,7 @@ protected void runProjectionPasses() throws ScribException { for (Role self : g.roles) { - LProtocol proj = g.project(new Projector(this, self)); // Does pruneRecs + LProtocol proj = g.project(new ProjEnv(this, self)); // Does pruneRecs this.context.addProjection(proj); verbosePrintln("\nProjected onto " + self + ":\n" + proj); } diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java index 93596491d..b20fa38fb 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java @@ -31,7 +31,7 @@ import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.Role; -import org.scribble.core.visit.global.Projector; +import org.scribble.core.visit.global.ProjEnv; import org.scribble.util.ScribException; import org.scribble.util.ScribUtil; @@ -137,7 +137,7 @@ public void addInlinedProjection(LProtocolName fullname, LProtocol l) // Projected from inlined public LProtocol getInlinedProjection(GProtocolName fullname, Role self) { - LProtocolName p = Projector.projectFullProtocolName(fullname, self); + LProtocolName p = ProjEnv.projectFullProtocolName(fullname, self); return getInlinedProjection(p); } @@ -164,7 +164,7 @@ public void addProjection(LProtocol p) LProtocol getProjection(GProtocolName fullname, Role role) throws ScribException { - return getProjection(Projector.projectFullProtocolName(fullname, role)); + return getProjection(ProjEnv.projectFullProtocolName(fullname, role)); } public //Module @@ -192,7 +192,7 @@ protected void addEGraph(LProtocolName fullname, EGraph graph) public EGraph getEGraph(GProtocolName fullname, Role role) throws ScribException { - LProtocolName fulllpn = Projector.projectFullProtocolName(fullname, role); + LProtocolName fulllpn = ProjEnv.projectFullProtocolName(fullname, role); // Moved form LProtocolDecl EGraph graph = this.fEGraphs.get(fulllpn); if (graph == null) @@ -214,7 +214,7 @@ protected void addUnfairEGraph(LProtocolName fullname, EGraph graph) public EGraph getUnfairEGraph(GProtocolName fullname, Role role) throws ScribException { - LProtocolName fulllpn = Projector.projectFullProtocolName(fullname, role); + LProtocolName fulllpn = ProjEnv.projectFullProtocolName(fullname, role); EGraph unfair = this.uEGraphs.get(fulllpn); if (unfair == null) @@ -295,7 +295,7 @@ protected void addMinimisedEGraph(LProtocolName fullname, EGraph graph) public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) throws ScribException { - LProtocolName fulllpn = Projector.projectFullProtocolName(fullname, role); + LProtocolName fulllpn = ProjEnv.projectFullProtocolName(fullname, role); EGraph minimised = this.mEGraphs.get(fulllpn); if (minimised == null) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 75b2519da..5413a4cbd 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -58,6 +58,8 @@ import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.Substitutor; import org.scribble.core.visit.global.ExtChoiceConsistencyChecker; +import org.scribble.core.visit.global.InlinedProjector; +import org.scribble.core.visit.global.ProjEnv; import org.scribble.core.visit.global.Projector; import org.scribble.core.visit.global.RoleEnablingChecker; import org.scribble.util.ScribException; @@ -109,8 +111,10 @@ else if (n instanceof MessageSigName) Substitutor subs = new Substitutor<>(this.roles, sig.roles, this.params, sig.args); - GSeq body = this.def.visitWithNoEx(subs).visitWithNoEx(v) - .visitWithNoEx(new RecPruner<>()); + /*GSeq body = (GSeq) this.def.visitWithNoEx(subs).visitWithNoEx(v) + .visitWithNoEx(new RecPruner<>());*/ + GSeq body = new RecPruner() + .visitSeq(v.visitSeq(subs.visitSeq(this.def))); RecVar rv = v.getInlinedRecVar(sig); GRecursion rec = new GRecursion(null, rv, body); // CHECKME: or protodecl source? CommonTree source = getSource(); @@ -147,15 +151,15 @@ public void checkExtChoiceConsistency() throws ScribException } // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) - public LProjection projectInlined(Role self) + public LProjection projectInlined(Job job, Role self) { - LSeq body = (LSeq) this.def.projectInlined(self); + LSeq body = (LSeq) this.def.aggregateNoEx(new InlinedProjector(job, self)); return projectAux(self, this.roles, body); } private LProjection projectAux(Role self, List decls, LSeq body) { - LProtocolName fullname = Projector + LProtocolName fullname = ProjEnv .projectFullProtocolName(this.fullname, self); Set tmp = //body.getRoles(); body.gather(new RoleGatherer()::visit) @@ -169,9 +173,10 @@ private LProjection projectAux(Role self, List decls, LSeq body) body); } - public LProjection project(Projector v) + public LProjection project(ProjEnv v) { - LSeq body = (LSeq) this.def.project(v).visitWithNoEx(new RecPruner<>()); + LSeq body = (LSeq) this.def.aggregateNoEx(new Projector(v.job, v.self)) + .visitWithNoEx(new RecPruner<>()); return projectAux(v.self, v.job.getContext().getInlined(this.fullname).roles, // Used inlined decls, already pruned body); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index a497a778f..2e7525611 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -41,7 +41,6 @@ import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.Substitutor; -import org.scribble.core.visit.local.LTypeInliner; import org.scribble.core.visit.local.ReachabilityChecker; import org.scribble.util.Constants; import org.scribble.util.ScribException; @@ -95,9 +94,10 @@ else if (n instanceof MessageSigName) Substitutor subs = new Substitutor<>(this.roles, sig.roles, this.params, sig.args); - LTypeInliner linl = new LTypeInliner(v.job); - LSeq body = this.def.visitWithNoEx(subs).visitWithNoEx(linl) - .visitWithNoEx(new RecPruner<>()); + /*LSeq body = (LSeq) this.def.visitWithNoEx(subs).visitWithNoEx(v) + .visitWithNoEx(new RecPruner<>());*/ + LSeq body = new RecPruner() + .visitSeq(v.visitSeq(subs.visitSeq(this.def))); RecVar rv = v.getInlinedRecVar(sig); LRecursion rec = new LRecursion(null, rv, body); // CHECKME: or protodecl source? CommonTree source = getSource(); // CHECKME: or null source? diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java index bf2896f33..959743d41 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java @@ -21,11 +21,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.visit.STypeAgg; -import org.scribble.core.visit.STypeAggNoEx; -import org.scribble.core.visit.STypeVisitor; -import org.scribble.core.visit.STypeVisitorNoEx; -import org.scribble.util.ScribException; public abstract class Seq> extends STypeBase @@ -42,7 +37,7 @@ public Seq(CommonTree source, List> elems) public abstract B reconstruct(CommonTree source, List> elems); - @Override + /*@Override public T aggregate(STypeAgg v) throws ScribException { @SuppressWarnings("unchecked") @@ -59,6 +54,7 @@ public T aggregateNoEx(STypeAggNoEx v) } // Override STypeBase.visitWith for B return + // Alternatively: call v.visitSeq directly, bypasses generic cast @Override public B visitWith(STypeVisitor v) throws ScribException { @@ -75,6 +71,7 @@ public B visitWithNoEx(STypeVisitorNoEx v) B cast = (B) this; return v.visitSeq(cast); } + */ @Override public Stream gather(Function, Stream> f) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java index 9edff377b..a7ced557c 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java @@ -25,7 +25,7 @@ import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.Projector; +import org.scribble.core.visit.global.ProjEnv; public class GChoice extends Choice implements GType { @@ -42,20 +42,6 @@ public GChoice reconstruct(CommonTree source, Role subj, { return new GChoice(source, subj, blocks); } - - /*@Override - public GChoice visit(Function, Stream> f) - { - Stream tmp = f.apply(this); - if (tmp.count() != 1) - { - throw new RuntimeException(": " + tmp.collect(Collectors.toList())); - } - Role subj = (Role) tmp.findFirst().get(); - List blocks = this.blocks.stream() - .map(x -> (GSeq) x.visit(f)).collect(Collectors.toList()); - return reconstruct(getSource(), subj, blocks); - }*/ @Override public LType projectInlined(Role self) @@ -79,7 +65,7 @@ private LType projectAux(Role self, Stream blocks) } @Override - public LType project(Projector v) + public LType project(ProjEnv v) { return projectAux(v.self, this.blocks.stream().map(x -> x.project(v))); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java index dbd55e233..1455b96f5 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java @@ -22,7 +22,7 @@ import org.scribble.core.type.session.local.LReq; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.Projector; +import org.scribble.core.visit.global.ProjEnv; public class GConnect extends ConnectAction implements GType @@ -64,7 +64,7 @@ else if (this.dst.equals(self)) } @Override - public LType project(Projector v) + public LType project(ProjEnv v) { return projectInlined(v.self); // No need for "aux", no recursive call } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java index c670917f7..62ceaa09d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java @@ -19,7 +19,7 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.local.LContinue; -import org.scribble.core.visit.global.Projector; +import org.scribble.core.visit.global.ProjEnv; public class GContinue extends Continue implements GType { @@ -44,7 +44,7 @@ public LContinue projectInlined(Role self) } @Override - public LContinue project(Projector v) + public LContinue project(ProjEnv v) { return projectInlined(v.self); // No need for "aux", no recursive call } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java index 93a0345b5..cf3831934 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java @@ -20,7 +20,7 @@ import org.scribble.core.type.session.local.LDisconnect; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.Projector; +import org.scribble.core.visit.global.ProjEnv; public class GDisconnect extends DisconnectAction implements GType @@ -61,7 +61,7 @@ else if (this.right.equals(self)) } @Override - public LType project(Projector v) + public LType project(ProjEnv v) { return projectInlined(v.self); // No need for "aux", no recursive call } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java index 1ba344625..efe144342 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java @@ -31,7 +31,7 @@ import org.scribble.core.type.session.local.LDo; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.Projector; +import org.scribble.core.visit.global.ProjEnv; public class GDo extends Do implements GType { @@ -56,7 +56,7 @@ public LType projectInlined(Role self) } @Override - public LType project(Projector v) + public LType project(ProjEnv v) { if (!this.roles.contains(v.self)) { @@ -74,7 +74,7 @@ public LType project(Projector v) return LSkip.SKIP; } - LProtocolName fullname = Projector.projectFullProtocolName(this.proto, + LProtocolName fullname = ProjEnv.projectFullProtocolName(this.proto, targSelf); Substitutions subs = new Substitutions(imed.roles, this.roles, Collections.emptyList(), Collections.emptyList()); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java index 6f154d8c1..a72d021a6 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java @@ -22,7 +22,7 @@ import org.scribble.core.type.session.local.LSend; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.Projector; +import org.scribble.core.visit.global.ProjEnv; public class GMessageTransfer extends MessageTransfer implements GType @@ -64,7 +64,7 @@ else if (this.dst.equals(self)) } @Override - public LType project(Projector v) + public LType project(ProjEnv v) { return projectInlined(v.self); // No need for "aux", no recursive call } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java index d3ce05f59..3d605d570 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java @@ -25,7 +25,7 @@ import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.Projector; +import org.scribble.core.visit.global.ProjEnv; import org.scribble.core.visit.local.SingleContinueChecker; public class GRecursion extends Recursion implements GType @@ -74,7 +74,7 @@ private LType projectAux(LSeq body) } @Override - public LType project(Projector v) + public LType project(ProjEnv v) { LSeq body = this.body.project(v); return projectAux(body); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java index 716585fd0..24935892f 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java @@ -25,7 +25,10 @@ import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.Projector; +import org.scribble.core.visit.STypeAgg; +import org.scribble.core.visit.STypeAggNoEx; +import org.scribble.core.visit.global.ProjEnv; +import org.scribble.util.ScribException; public class GSeq extends Seq implements GType { @@ -41,6 +44,18 @@ public GSeq reconstruct(CommonTree source, { return new GSeq(source, elems); } + + @Override + public T aggregate(STypeAgg v) throws ScribException + { + return v.visitSeq(this); + } + + @Override + public T aggregateNoEx(STypeAggNoEx v) + { + return v.visitSeq(this); + } @Override public LSeq projectInlined(Role self) @@ -60,7 +75,7 @@ private LSeq projectAux(Stream elems) } @Override - public LSeq project(Projector v) + public LSeq project(ProjEnv v) { return projectAux(this.elems.stream() .map(x -> ((GType) x).project(v))); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java index 495ef55f4..65ba5186c 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java @@ -18,14 +18,14 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.Projector; +import org.scribble.core.visit.global.ProjEnv; public interface GType extends SType, GNode { LType projectInlined(Role self); // Use on inlined (i.e., Do inlined, roles pruned) - LType project(Projector v); // Use on parsed (intermed) + LType project(ProjEnv v); // Use on parsed (intermed) } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java index e68f1b799..1ea4855fc 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java @@ -24,6 +24,9 @@ import org.scribble.core.type.kind.Local; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; +import org.scribble.core.visit.STypeAgg; +import org.scribble.core.visit.STypeAggNoEx; +import org.scribble.util.ScribException; public class LSeq extends Seq implements LType { @@ -39,6 +42,18 @@ public LSeq reconstruct(CommonTree source, { return new LSeq(source, elems); } + + @Override + public T aggregate(STypeAgg v) throws ScribException + { + return v.visitSeq(this); + } + + @Override + public T aggregateNoEx(STypeAggNoEx v) + { + return v.visitSeq(this); + } @Override public void buildGraph(EGraphBuilderUtil2 b) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java index 3347fb7be..f34b2909e 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java @@ -25,22 +25,22 @@ public abstract class STypeAgg, T> // Internal use -- by default, agg applied to all cases (including unit) // Pre: agg(Stream.of(unit())) = unit() protected abstract T agg(SType n, Stream ts) throws ScribException; // Cf. generic varargs, heap pollution issue - - // SType return for extensibility/flexibility - public T visitContinue(Continue n) throws ScribException - { - return unit(n); - } public T visitChoice(Choice n) throws ScribException { List blocks = new LinkedList<>(); - for (SType e : n.blocks) + for (B b : n.blocks) { - blocks.add(e.aggregate(this)); + //blocks.add(b.aggregate(this)); + blocks.add(visitSeq(b)); } return agg(n, blocks.stream()); } + + public T visitContinue(Continue n) throws ScribException + { + return unit(n); + } public T visitDirectedInteraction(DirectedInteraction n) throws ScribException @@ -61,7 +61,8 @@ public > T visitDo(Do n) public T visitRecursion(Recursion n) throws ScribException { - return agg(n, Stream.of(n.body.aggregate(this))); + //return agg(n, Stream.of(n.body.aggregate(this))); + return agg(n, Stream.of(visitSeq(n.body))); } // Param "hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java index 0ac965789..bca1575ba 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java @@ -13,8 +13,9 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; +// Worth it to maintain alongside STypeAgg? -- does touch a lot of places public abstract class STypeAggNoEx, T> - //extends STypeAgg // Not worth it, ex and noex method variants easily confused + //extends STypeAgg // Not worth it, ex/no-ex method variants easily confused { // Internal use // Pre: agg(Stream.of(unit())) = unit() @@ -32,7 +33,7 @@ public T visitContinue(Continue n) public T visitChoice(Choice n) { - return agg(n, n.blocks.stream().map(x -> x.aggregateNoEx(this))); + return agg(n, n.blocks.stream().map(x -> visitSeq(x))); } public T visitDirectedInteraction(DirectedInteraction n) @@ -52,7 +53,7 @@ public > T visitDo(Do n) public T visitRecursion(Recursion n) { - return agg(n, Stream.of(n.body.aggregateNoEx(this))); + return agg(n, Stream.of(visitSeq(n.body))); } // Param "hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java index e0b9cced8..1939d4a3f 100755 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java @@ -48,7 +48,8 @@ public SType visitRecursion(Recursion n) { CommonTree source = n.getSource(); // CHECKME: or empty source? RecVar rv = enterRec(n.recvar); // FIXME: make GTypeInliner, and record recvars to check freshness (e.g., rec X in two choice cases) - B body = n.body.visitWithNoEx(this); + //B body = n.body.visitWithNoEx(this); + B body = visitSeq(n.body);//.visitWithNoEx(this); Recursion res = n.reconstruct(source, rv, body); exitRec(n.recvar); return res; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java index c4de9baf2..9ce6ce122 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java @@ -23,7 +23,7 @@ public SType visitRecursion(Recursion n) if (!hasRec(n.recvar)) // N.B. doesn't work if recvars shadowed { pushRec(n.recvar, n.body); - SType unf = n.body.visitWithNoEx(this); + SType unf = visitSeq(n.body);//n.body.visitWithNoEx(this); popRec(n.recvar); // Needed for, e.g., repeat do's in separate choice cases -- cf. stack.pop in GDo::getInlined, must pop sig there for Seqs return unf; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java index 8198eec56..223996b28 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java @@ -63,7 +63,8 @@ public SType visitChoice(Choice n) throws ScribException List blocks = new LinkedList<>(); for (B b : n.blocks) { - blocks.add(b.visitWith(this)); + blocks.add(visitSeq(b)); + } return n.reconstruct(n.getSource(), n.subj, blocks); // Skipping agg (reconstruction done here) } @@ -71,7 +72,7 @@ public SType visitChoice(Choice n) throws ScribException @Override public SType visitRecursion(Recursion n) throws ScribException { - B body = n.body.visitWith(this); + B body = visitSeq(n.body); return n.reconstruct(n.getSource(), n.recvar, body); // Skipping agg (reconstruction done here) } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java index d6db6e35c..af1a0dca7 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java @@ -10,13 +10,9 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; -// "Instantiates" Agg by implicitly treating Stream as always a singleton Stream of the *reconstructed* node -// Alternative characterisations of STypeVisitor as STypeAgg? -// T = SType, unit = empty, agg = reconstruct, ns = "structural" (i.e, B) children -- issues with generic cast to B inside agg -// T = SType, unit = n.getChildren(), agg = reconstruct, ns = all children -- all children require dynamic casts -// T = B ... ? Considering Stream like a Seq, and elems as singleton Seqs -- cf. Stream, for Choice/etc reconstruct +// For comments, see STypeVisitor public abstract class STypeVisitorNoEx> - extends STypeAggNoEx> // T = SType gives reconstruction flexibility/extensibility + extends STypeAggNoEx> { @Override protected final SType unit(SType n) @@ -28,37 +24,13 @@ protected final SType unit(SType n) @Override protected final SType agg(SType n, Stream> ns) { - //return ns.iterator().next(); throw new RuntimeException("Disregarded for STypeVisitorNoEx: " + n + " ,, " + ns); - - /*// agg = reconstruct, ns = "structural" (i.e, B) children -- problem with generic casts - if (n instanceof Continue || n instanceof DirectedInteraction - || n instanceof DisconnectAction || n instanceof Do) - { - return ns.iterator().next(); - } - else if (n instanceof Choice) - { - Choice c = (Choice) n; - return c.reconstruct(c.getSource(), c.subj, - ns.map(x -> (B) x).collect(Collectors.toList())); - } - else if (n instanceof Recursion) - { - Recursion r = (Recursion) n; - return r.reconstruct(r.getSource(), r.recvar, (B) ns.iterator().next()); - } - else - { - throw new RuntimeException("Shouldn't get in here: " + n + " ,, " + ns); - // agg should only be called from internal visit dispatch methods, so n's type has already been cased - }*/ } @Override public SType visitChoice(Choice n) { - List blocks = n.blocks.stream().map(x -> x.visitWithNoEx(this)) + List blocks = n.blocks.stream().map(x -> visitSeq(x)) .collect(Collectors.toList()); return n.reconstruct(n.getSource(), n.subj, blocks); // Skipping agg (reconstruction done here) } @@ -66,15 +38,10 @@ public SType visitChoice(Choice n) @Override public SType visitRecursion(Recursion n) { - B body = n.body.visitWithNoEx(this); + B body = visitSeq(n.body); return n.reconstruct(n.getSource(), n.recvar, body); // Skipping agg (reconstruction done here) } - // Distinguished from main agg-reconstruct pattern to return B (cf. T) -- for Seq.visitWith - // "Hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction - // This means a Visitor that needs to restructure a Seq should handle this within visitSeq - // E.g., Seq "injection" by inlining and unfolding - // For this purpose, visited children passed "directly" instead of via a reconstruction (cf. above methods) @Override public B visitSeq(B n) { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java index 32a5eee40..f142a1130 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java @@ -36,7 +36,7 @@ public Substitutor(List rold, List rnew, @Override public SType visitChoice(Choice n) { - List blocks = n.blocks.stream().map(x -> x.visitWithNoEx(this)) + List blocks = n.blocks.stream().map(x -> visitSeq(x)) .collect(Collectors.toList()); return n.reconstruct(n.getSource(), this.subs.subsRole(n.subj), blocks); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java index bab1d2bb9..8b09891e9 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java @@ -40,7 +40,7 @@ public SType visitChoice(Choice n) for (GSeq block : n.blocks) { nested.setEnablers(subj); - block.visitWith(nested); + nested.visitSeq(block); blocks.add(nested.getEnablers()); } Map res = new HashMap<>(getEnablers()); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java index b51217f92..11247bafe 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java @@ -36,7 +36,8 @@ public > GType visitDo(Do n) GProtocol g = this.job.getContext().getIntermediate(fullname); Substitutor subs = new Substitutor<>(g.roles, n.roles, g.params, n.args); - GSeq inlined = g.def.visitWithNoEx(subs).visitWithNoEx(this); + //GSeq inlined = (GSeq) g.def.visitWithNoEx(subs).visitWithNoEx(this); + GSeq inlined = visitSeq(subs.visitSeq(g.def)); // i.e. returning a GSeq -- rely on parent GSeq to inline popSig(); return new GRecursion(null, rv, inlined); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java new file mode 100644 index 000000000..1e0e6ffea --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -0,0 +1,148 @@ +package org.scribble.core.visit.global; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.core.job.Job; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.Continue; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.DisconnectAction; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.global.GConnect; +import org.scribble.core.type.session.global.GSeq; +import org.scribble.core.type.session.local.LAcc; +import org.scribble.core.type.session.local.LChoice; +import org.scribble.core.type.session.local.LContinue; +import org.scribble.core.type.session.local.LDisconnect; +import org.scribble.core.type.session.local.LRcv; +import org.scribble.core.type.session.local.LRecursion; +import org.scribble.core.type.session.local.LReq; +import org.scribble.core.type.session.local.LSend; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.type.session.local.LSkip; +import org.scribble.core.type.session.local.LType; +import org.scribble.core.visit.STypeAggNoEx; +import org.scribble.core.visit.local.SingleContinueChecker; + +// Pre: use on inlined (i.e., Do inlined, roles pruned) +public class InlinedProjector extends STypeAggNoEx +{ + public final Job job; + public final Role self; + + public InlinedProjector(Job job, Role self) + { + this.job = job; + this.self = self; + } + + @Override + protected LType unit(SType n) + { + throw new RuntimeException("Disregarded for Projector: " + n); + } + + @Override + protected LType agg(SType n, Stream ts) + { + throw new RuntimeException("Disregarded for Projector: " + n + " ,, " + ts); + } + + @Override + public LType visitChoice(Choice n) + { + Role subj = n.subj.equals(self) ? Role.SELF : n.subj; + // CHECKME: "self" also explcitily used for Do, but implicitly for MessageTransfer, inconsistent? + List tmp = n.blocks.stream().map(x -> visitSeq(x)) + .filter(x -> !x.isEmpty()).collect(Collectors.toList()); + if (tmp.isEmpty()) + { + return LSkip.SKIP; // CHECKME: OK, or "empty" choice at subj still important? + } + return new LChoice(null, subj, tmp); + } + + @Override + public LType visitContinue(Continue n) + { + return new LContinue(null, n.recvar); + } + + @Override + public LType visitDirectedInteraction(DirectedInteraction n) + { + /*if (n.src.equals(self) && n.dst.equals(self)) + { + // CHECKME: already checked? + }*/ + if (n instanceof GConnect) // FIXME + { + return n.src.equals(self) ? new LReq(null, n.msg, n.dst) + : n.dst.equals(self) ? new LAcc(null, n.src, n.msg) + : LSkip.SKIP; + } + else //if (n instanceof GMessageTransfer) + { + return n.src.equals(self) ? new LSend(null, n.msg, n.dst) + : n.dst.equals(self) ? new LRcv(null, n.src, n.msg) + : LSkip.SKIP; + } + } + + @Override + public LType visitDisconnect(DisconnectAction n) + { + /*if (n.src.equals(self) && n.dst.equals(self)) + { + // CHECKME: already checked? + }*/ + return (n.left.equals(self)) ? new LDisconnect(null, n.right) + : (n.right.equals(self)) ? new LDisconnect(null, n.left) + : LSkip.SKIP; + } + + @Override + public > LType visitDo(Do n) + { + throw new RuntimeException("Unsupported for Do: " + n); + } + + @Override + public LType visitRecursion(Recursion n) + { + LSeq body = visitSeq(n.body); + if (body.isEmpty()) // N.B. projection is doing empty-rec pruning + { + return LSkip.SKIP; + } + Set rvs = new HashSet<>(); + rvs.add(n.recvar); + if (body.aggregateNoEx(new SingleContinueChecker(rvs))) + { + return LSkip.SKIP; + } + return new LRecursion(null, n.recvar, body); + } + + // Param "hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction + @Override + public LSeq visitSeq(GSeq n) + { + List elems = n.elems.stream().map(x -> x.aggregateNoEx(this)) + .filter(x -> !x.equals(LSkip.SKIP)).collect(Collectors.toList()); + return new LSeq(null, elems); + // Empty seqs converted to LSkip by GChoice/Recursion projection + // And a WF top-level protocol cannot produce empty LSeq + // So a projection never contains an empty LSeq -- i.e., "empty choice/rec" pruning unnecessary + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/ProjEnv.java b/scribble-core/src/main/java/org/scribble/core/visit/global/ProjEnv.java new file mode 100644 index 000000000..6bfdf12ae --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/ProjEnv.java @@ -0,0 +1,58 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.visit.global; + +import org.scribble.core.job.Job; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.name.Role; + +public class ProjEnv +{ + public final Job job; + public final Role self; + + public ProjEnv(Job job, Role self) + { + this.job = job; + this.self = self; + } + + public static LProtocolName projectSimpleProtocolName(GProtocolName simpname, + Role role) + { + return new LProtocolName(simpname.toString() + "_" + role.toString()); + } + + // Role is the target subprotocol parameter (not the current projector self -- actually the self just popped) + public static LProtocolName projectFullProtocolName(GProtocolName fullname, + Role role) + { + LProtocolName simplename = projectSimpleProtocolName( + fullname.getSimpleName(), role); + ModuleName modname = projectModuleName(fullname.getPrefix(), simplename); + return new LProtocolName(modname, simplename); + } + + // fullname is the un-projected name; localname is the already projected simple name + public static ModuleName projectModuleName(ModuleName fullname, + LProtocolName localname) + { + ModuleName simpname = new ModuleName( + fullname.getSimpleName().toString() + "_" + localname.toString()); + return new ModuleName(fullname.getPrefix(), simpname); // Supports unary + // fullname + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java index 260a68ce8..5975e386c 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java @@ -1,58 +1,61 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ package org.scribble.core.visit.global; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + import org.scribble.core.job.Job; +import org.scribble.core.job.JobContext; +import org.scribble.core.lang.global.GProtocol; +import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.LProtocolName; -import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.Substitutions; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.global.GSeq; +import org.scribble.core.type.session.local.LDo; +import org.scribble.core.type.session.local.LSkip; +import org.scribble.core.type.session.local.LType; -public class Projector +// Pre: Use on parsed (intermed) +public class Projector extends InlinedProjector // This way or the other way round? { - public final Job job; - public final Role self; - public Projector(Job job, Role self) { - this.job = job; - this.self = self; + super(job, self); } - - public static LProtocolName projectSimpleProtocolName(GProtocolName simpname, - Role role) + @Override + public > LType visitDo(Do n) { - return new LProtocolName(simpname.toString() + "_" + role.toString()); - } + if (!n.roles.contains(this.self)) + { + return LSkip.SKIP; + } - // Role is the target subprotocol parameter (not the current projector self -- actually the self just popped) - public static LProtocolName projectFullProtocolName(GProtocolName fullname, - Role role) - { - LProtocolName simplename = projectSimpleProtocolName( - fullname.getSimpleName(), role); - ModuleName modname = projectModuleName(fullname.getPrefix(), simplename); - return new LProtocolName(modname, simplename); - } + JobContext jobc = this.job.getContext(); + GProtocolName proto = (GProtocolName) n.proto; + GProtocol gpd = jobc.getIntermediate(proto); + Role targSelf = gpd.roles.get(n.roles.indexOf(this.self)); - // fullname is the un-projected name; localname is the already projected simple name - public static ModuleName projectModuleName(ModuleName fullname, - LProtocolName localname) - { - ModuleName simpname = new ModuleName( - fullname.getSimpleName().toString() + "_" + localname.toString()); - return new ModuleName(fullname.getPrefix(), simpname); // Supports unary - // fullname + GProtocol imed = jobc.getIntermediate(proto); + if (!imed.roles.contains(targSelf)) // CHECKME: because roles already pruned for intermed decl? + { + return LSkip.SKIP; + } + + LProtocolName fullname = ProjEnv.projectFullProtocolName(proto, + targSelf); + Substitutions subs = new Substitutions(imed.roles, n.roles, + Collections.emptyList(), Collections.emptyList()); + List used = jobc.getInlined(proto).roles.stream() + .map(x -> subs.subsRole(x)).collect(Collectors.toList()); + List rs = n.roles.stream().filter(x -> used.contains(x)) + .map(x -> x.equals(this.self) ? Role.SELF : x) + // CHECKME: "self" also explcitily used for Choice, but implicitly for MessageTransfer, inconsistent? + .collect(Collectors.toList()); + return new LDo(null, fullname, rs, n.args); // TODO CHECKME: prune args? } } + diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java index 8535964fd..3eec43196 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java @@ -43,7 +43,7 @@ public SType visitChoice(Choice n) for (GSeq block : n.blocks) { nested.setEnabled(subj); // Copies defensively - block.visitWith(nested); + nested.visitSeq(block); blocks.add(nested.getEnabled()); } Set res = new HashSet<>(enabled); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java index 3f91fe94f..58a4ee24b 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java @@ -36,7 +36,8 @@ public > LType visitDo(Do n) LProtocol p = this.job.getContext().getProjection(fullname); // This line differs from GDo version Substitutor subs = new Substitutor<>(p.roles, n.roles, p.params, n.args); - LSeq inlined = p.def.visitWithNoEx(subs).visitWithNoEx(this); + //LSeq inlined = (LSeq) p.def.visitWithNoEx(subs).visitWithNoEx(this); + LSeq inlined = visitSeq(subs.visitSeq(p.def)); // i.e. returning a Seq -- rely on parent Seq to inline popSig(); return new LRecursion(null, rv, inlined); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java index 667d868dc..fcd4cbc98 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java @@ -39,7 +39,7 @@ public SType visitChoice(Choice n) for (LSeq block : n.blocks) { nested.setEnv(entry); - block.visitWith(nested); + nested.visitSeq(block);//block.visitWith(nested); blocks.add(nested.getEnv()); } boolean postcont = blocks.stream().allMatch(x -> x.postcont); // i.e., no exits diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java index 9266b05c9..8fe796c41 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java @@ -58,7 +58,8 @@ public Boolean visitRecursion(Recursion n) { Set tmp = new HashSet<>(this.rvs); tmp.add(n.recvar); - return n.body.aggregateNoEx(new SingleContinueChecker(tmp)); + //return n.body.aggregateNoEx(new SingleContinueChecker(tmp)); + return new SingleContinueChecker(tmp).visitSeq(n.body); } @Override diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 5fecf9aa0..84b19dcb9 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -72,7 +72,7 @@ module tmp.Test; // re-check disamb pass -- e.g., do-target disamb done by translation -- check, e.g., message transfer message disamb (signames, payloads) // refactor additional disamb syntactic checks into core? e.g., do-calls, distinct roledecls, protodecls, etc. -// refactor scribble.g, simplify ast/del/etc class names +// refactor scribble.g, simplify ast/del/etc class names and deprecated class code //make a visitor factory //for isSingleConts (and project, buildGraph), make T visitWith(STypeReducer v) ? -- roleenabling and extchoicecons are more like reducers? From 41838db8981faecc292f716e8d25120ffec3f34f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 16:48:19 +0100 Subject: [PATCH 236/539] Continued: refactoring projection visitors. --- .../core/type/session/global/GChoice.java | 63 ++++++-------- .../core/type/session/global/GConnect.java | 60 ++++++------- .../core/type/session/global/GContinue.java | 27 +++--- .../core/type/session/global/GDisconnect.java | 58 ++++++------- .../core/type/session/global/GDo.java | 86 ++++++++----------- .../type/session/global/GMessageTransfer.java | 59 ++++++------- .../core/type/session/global/GRecursion.java | 82 ++++++++---------- .../core/type/session/global/GSeq.java | 54 ++++++------ .../core/type/session/global/GType.java | 12 ++- .../org/scribble/core/visit/STypeVisitor.java | 2 +- 10 files changed, 226 insertions(+), 277 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java index a7ced557c..cebce53c8 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java @@ -14,18 +14,11 @@ package org.scribble.core.type.session.global; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; -import org.scribble.core.type.session.local.LChoice; -import org.scribble.core.type.session.local.LSeq; -import org.scribble.core.type.session.local.LSkip; -import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.ProjEnv; public class GChoice extends Choice implements GType { @@ -42,33 +35,6 @@ public GChoice reconstruct(CommonTree source, Role subj, { return new GChoice(source, subj, blocks); } - - @Override - public LType projectInlined(Role self) - { - return projectAux(self, - this.blocks.stream().map(x -> x.projectInlined(self))); - } - - private LType projectAux(Role self, Stream blocks) - { - Role subj = this.subj.equals(self) ? Role.SELF : this.subj; - // CHECKME: "self" also explcitily used for Do, but implicitly for MessageTransfer, inconsistent? - List tmp = blocks - .filter(x -> !x.isEmpty()) - .collect(Collectors.toList()); - if (tmp.isEmpty()) - { - return LSkip.SKIP; // CHECKME: OK, or "empty" choice at subj still important? - } - return new LChoice(null, subj, tmp); - } - - @Override - public LType project(ProjEnv v) - { - return projectAux(v.self, this.blocks.stream().map(x -> x.project(v))); - } @Override public int hashCode() @@ -169,4 +135,31 @@ public Map checkExtChoiceConsistency(Map enablers) } return Collections.unmodifiableMap(res); } - }*/ \ No newline at end of file + + @Override + public LType projectInlined(Role self) + { + return projectAux(self, + this.blocks.stream().map(x -> x.projectInlined(self))); + } + + private LType projectAux(Role self, Stream blocks) + { + Role subj = this.subj.equals(self) ? Role.SELF : this.subj; + // CHECKME: "self" also explcitily used for Do, but implicitly for MessageTransfer, inconsistent? + List tmp = blocks + .filter(x -> !x.isEmpty()) + .collect(Collectors.toList()); + if (tmp.isEmpty()) + { + return LSkip.SKIP; // CHECKME: OK, or "empty" choice at subj still important? + } + return new LChoice(null, subj, tmp); + } + + @Override + public LType project(ProjEnv v) + { + return projectAux(v.self, this.blocks.stream().map(x -> x.project(v))); + } +*/ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java index 1455b96f5..a3589194c 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java @@ -18,11 +18,6 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.ConnectAction; import org.scribble.core.type.session.Message; -import org.scribble.core.type.session.local.LAcc; -import org.scribble.core.type.session.local.LReq; -import org.scribble.core.type.session.local.LSkip; -import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.ProjEnv; public class GConnect extends ConnectAction implements GType @@ -41,33 +36,6 @@ public GConnect reconstruct( { return new GConnect(source, src, msg, dst); } - - @Override - public LType projectInlined(Role self) - { - if (this.src.equals(self)) - { - /*if (this.dst.equals(self)) - { - // CHECKME: already checked? - }*/ - return new LReq(null, this.msg, this.dst); - } - else if (this.dst.equals(self)) - { - return new LAcc(null, this.src, this.msg); - } - else - { - return LSkip.SKIP; - } - } - - @Override - public LType project(ProjEnv v) - { - return projectInlined(v.self); // No need for "aux", no recursive call - } @Override public String toString() @@ -145,4 +113,32 @@ public Map checkExtChoiceConsistency(Map enablers) Map tmp = new HashMap<>(enablers); tmp.put(this.dst, this.src); return Collections.unmodifiableMap(tmp); + } + + @Override + public LType projectInlined(Role self) + { + if (this.src.equals(self)) + { + /*if (this.dst.equals(self)) + { + // CHECKME: already checked? + }* / + return new LReq(null, this.msg, this.dst); + } + else if (this.dst.equals(self)) + { + return new LAcc(null, this.src, this.msg); + } + else + { + return LSkip.SKIP; + } + } + + @Override + public LType project(ProjEnv v) + { + return projectInlined(v.self); // No need for "aux", no recursive call + } */ diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java index 62ceaa09d..374782674 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java @@ -16,10 +16,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Continue; -import org.scribble.core.type.session.local.LContinue; -import org.scribble.core.visit.global.ProjEnv; public class GContinue extends Continue implements GType { @@ -37,18 +34,6 @@ public GContinue reconstruct(CommonTree source, return new GContinue(source, recvar); } - @Override - public LContinue projectInlined(Role self) - { - return new LContinue(null, this.recvar); - } - - @Override - public LContinue project(ProjEnv v) - { - return projectInlined(v.self); // No need for "aux", no recursive call - } - @Override public int hashCode() { @@ -109,6 +94,18 @@ public Map checkExtChoiceConsistency(Map enablers) { return enablers; } + + @Override + public LContinue projectInlined(Role self) + { + return new LContinue(null, this.recvar); + } + + @Override + public LContinue project(ProjEnv v) + { + return projectInlined(v.self); // No need for "aux", no recursive call + } */ diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java index cf3831934..fbd242383 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java @@ -17,10 +17,6 @@ import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.DisconnectAction; -import org.scribble.core.type.session.local.LDisconnect; -import org.scribble.core.type.session.local.LSkip; -import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.ProjEnv; public class GDisconnect extends DisconnectAction implements GType @@ -38,33 +34,6 @@ public GDisconnect reconstruct( { return new GDisconnect(source, left, right); } - - @Override - public LType projectInlined(Role self) - { - if (this.left.equals(self)) - { - /*if (this.dst.equals(self)) - { - // CHECKME: already checked? - }*/ - return new LDisconnect(null, this.right); - } - else if (this.right.equals(self)) - { - return new LDisconnect(null, this.left); - } - else - { - return LSkip.SKIP; - } - } - - @Override - public LType project(ProjEnv v) - { - return projectInlined(v.self); // No need for "aux", no recursive call - } @Override public String toString() @@ -137,4 +106,31 @@ public Map checkExtChoiceConsistency(Map enablers) { return enablers; } + + @Override + public LType projectInlined(Role self) + { + if (this.left.equals(self)) + { + /*if (this.dst.equals(self)) + { + // CHECKME: already checked? + }* / + return new LDisconnect(null, this.right); + } + else if (this.right.equals(self)) + { + return new LDisconnect(null, this.left); + } + else + { + return LSkip.SKIP; + } + } + + @Override + public LType project(ProjEnv v) + { + return projectInlined(v.self); // No need for "aux", no recursive call + } */ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java index efe144342..7eea2005a 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java @@ -13,25 +13,15 @@ */ package org.scribble.core.type.session.global; -import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.JobContext; -import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.Role; -import org.scribble.core.type.name.Substitutions; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Do; -import org.scribble.core.type.session.local.LDo; -import org.scribble.core.type.session.local.LSkip; -import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.ProjEnv; public class GDo extends Do implements GType { @@ -49,44 +39,6 @@ public GDo reconstruct(CommonTree source, return new GDo(source, proto, roles, args); } - @Override - public LType projectInlined(Role self) - { - throw new RuntimeException("Unsupported for Do: " + this); - } - - @Override - public LType project(ProjEnv v) - { - if (!this.roles.contains(v.self)) - { - return LSkip.SKIP; - } - - JobContext jobc = v.job.getContext(); - //GProtocolDecl gpd = jobc.getParsed(this.proto); - GProtocol gpd = jobc.getIntermediate(this.proto); - Role targSelf = gpd.roles.get(this.roles.indexOf(v.self)); - - GProtocol imed = jobc.getIntermediate(this.proto); - if (!imed.roles.contains(targSelf)) // CHECKME: because roles already pruned for intermed decl? - { - return LSkip.SKIP; - } - - LProtocolName fullname = ProjEnv.projectFullProtocolName(this.proto, - targSelf); - Substitutions subs = new Substitutions(imed.roles, this.roles, - Collections.emptyList(), Collections.emptyList()); - List used = jobc.getInlined(this.proto).roles.stream() - .map(x -> subs.subsRole(x)).collect(Collectors.toList()); - List rs = this.roles.stream().filter(x -> used.contains(x)) - .map(x -> x.equals(v.self) ? Role.SELF : x) - // CHECKME: "self" also explcitily used for Choice, but implicitly for MessageTransfer, inconsistent? - .collect(Collectors.toList()); - return new LDo(null, fullname, rs, this.args); // TODO CHECKME: prune args? - } - @Override public int hashCode() { @@ -167,6 +119,44 @@ public Map checkExtChoiceConsistency(Map enablers) { throw new RuntimeException("Unsupported for Do: " + this); } + + @Override + public LType projectInlined(Role self) + { + throw new RuntimeException("Unsupported for Do: " + this); + } + + @Override + public LType project(ProjEnv v) + { + if (!this.roles.contains(v.self)) + { + return LSkip.SKIP; + } + + JobContext jobc = v.job.getContext(); + //GProtocolDecl gpd = jobc.getParsed(this.proto); + GProtocol gpd = jobc.getIntermediate(this.proto); + Role targSelf = gpd.roles.get(this.roles.indexOf(v.self)); + + GProtocol imed = jobc.getIntermediate(this.proto); + if (!imed.roles.contains(targSelf)) // CHECKME: because roles already pruned for intermed decl? + { + return LSkip.SKIP; + } + + LProtocolName fullname = ProjEnv.projectFullProtocolName(this.proto, + targSelf); + Substitutions subs = new Substitutions(imed.roles, this.roles, + Collections.emptyList(), Collections.emptyList()); + List used = jobc.getInlined(this.proto).roles.stream() + .map(x -> subs.subsRole(x)).collect(Collectors.toList()); + List rs = this.roles.stream().filter(x -> used.contains(x)) + .map(x -> x.equals(v.self) ? Role.SELF : x) + // CHECKME: "self" also explcitily used for Choice, but implicitly for MessageTransfer, inconsistent? + .collect(Collectors.toList()); + return new LDo(null, fullname, rs, this.args); // TODO CHECKME: prune args? + } */ diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java index a72d021a6..8aa5e7758 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java @@ -18,11 +18,6 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; import org.scribble.core.type.session.MessageTransfer; -import org.scribble.core.type.session.local.LRcv; -import org.scribble.core.type.session.local.LSend; -import org.scribble.core.type.session.local.LSkip; -import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.ProjEnv; public class GMessageTransfer extends MessageTransfer implements GType @@ -41,33 +36,6 @@ public GMessageTransfer reconstruct( { return new GMessageTransfer(source, src, msg, dst); } - - @Override - public LType projectInlined(Role self) - { - if (this.src.equals(self)) - { - /*if (this.dst.equals(self)) - { - // CHECKME: already checked? - }*/ - return new LSend(null, this.msg, this.dst); - } - else if (this.dst.equals(self)) - { - return new LRcv(null, this.src, this.msg); - } - else - { - return LSkip.SKIP; - } - } - - @Override - public LType project(ProjEnv v) - { - return projectInlined(v.self); // No need for "aux", no recursive call - } @Override public String toString() @@ -147,4 +115,31 @@ public Map checkExtChoiceConsistency(Map enablers) tmp.put(this.dst, this.src); return Collections.unmodifiableMap(tmp); } + + @Override + public LType projectInlined(Role self) + { + if (this.src.equals(self)) + { + /*if (this.dst.equals(self)) + { + // CHECKME: already checked? + }* / + return new LSend(null, this.msg, this.dst); + } + else if (this.dst.equals(self)) + { + return new LRcv(null, this.src, this.msg); + } + else + { + return LSkip.SKIP; + } + } + + @Override + public LType project(ProjEnv v) + { + return projectInlined(v.self); // No need for "aux", no recursive call + } */ diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java index 3d605d570..88b1e3a0d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java @@ -13,20 +13,10 @@ */ package org.scribble.core.type.session.global; -import java.util.HashSet; -import java.util.Set; - import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Recursion; -import org.scribble.core.type.session.local.LRecursion; -import org.scribble.core.type.session.local.LSeq; -import org.scribble.core.type.session.local.LSkip; -import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.ProjEnv; -import org.scribble.core.visit.local.SingleContinueChecker; public class GRecursion extends Recursion implements GType { @@ -44,42 +34,6 @@ public GRecursion reconstruct(CommonTree source, return new GRecursion(source, recvar, block); } - @Override - public LType projectInlined(Role self) - { - LSeq body = this.body.projectInlined(self); - return projectAux(body); - } - - private LType projectAux(LSeq body) - { - if (body.isEmpty()) // N.B. projection is doing empty-rec pruning - { - return LSkip.SKIP; - } - /*RecVar rv = body.isSingleCont(); // CHECKME: should do more "compressing" of "single continue" (subset) choice cases? or should not do "single continue" checking for choice at all? - if (rv != null) - { - return this.recvar.equals(rv) - ? LSkip.SKIP - : new LContinue(null, rv); // CHECKME: source - }*/ - Set rvs = new HashSet<>(); - rvs.add(this.recvar); - if (body.aggregateNoEx(new SingleContinueChecker(rvs))) - { - return LSkip.SKIP; - } - return new LRecursion(null, this.recvar, body); - } - - @Override - public LType project(ProjEnv v) - { - LSeq body = this.body.project(v); - return projectAux(body); - } - @Override public int hashCode() { @@ -137,4 +91,40 @@ public Map checkExtChoiceConsistency(Map enablers) { return this.body.checkExtChoiceConsistency(enablers); } + + @Override + public LType projectInlined(Role self) + { + LSeq body = this.body.projectInlined(self); + return projectAux(body); + } + + private LType projectAux(LSeq body) + { + if (body.isEmpty()) // N.B. projection is doing empty-rec pruning + { + return LSkip.SKIP; + } + /*RecVar rv = body.isSingleCont(); // CHECKME: should do more "compressing" of "single continue" (subset) choice cases? or should not do "single continue" checking for choice at all? + if (rv != null) + { + return this.recvar.equals(rv) + ? LSkip.SKIP + : new LContinue(null, rv); // CHECKME: source + }* / + Set rvs = new HashSet<>(); + rvs.add(this.recvar); + if (body.aggregateNoEx(new SingleContinueChecker(rvs))) + { + return LSkip.SKIP; + } + return new LRecursion(null, this.recvar, body); + } + + @Override + public LType project(ProjEnv v) + { + LSeq body = this.body.project(v); + return projectAux(body); + } */ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java index 24935892f..ebfa8654c 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java @@ -15,19 +15,13 @@ import java.util.List; import java.util.stream.Collectors; -import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.Role; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; -import org.scribble.core.type.session.local.LSeq; -import org.scribble.core.type.session.local.LSkip; -import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoEx; -import org.scribble.core.visit.global.ProjEnv; import org.scribble.util.ScribException; public class GSeq extends Seq implements GType @@ -57,30 +51,6 @@ public T aggregateNoEx(STypeAggNoEx v) return v.visitSeq(this); } - @Override - public LSeq projectInlined(Role self) - { - return projectAux(this.elems.stream() - .map(x -> ((GType) x).projectInlined(self))); - } - - private LSeq projectAux(Stream elems) - { - List tmp = elems.filter(x -> !x.equals(LSkip.SKIP)) - .collect(Collectors.toList()); - return new LSeq(null, tmp); - // Empty seqs converted to LSkip by GChoice/Recursion projection - // And a WF top-level protocol cannot produce empty LSeq - // So a projection never contains an empty LSeq -- i.e., "empty choice/rec" pruning unnecessary - } - - @Override - public LSeq project(ProjEnv v) - { - return projectAux(this.elems.stream() - .map(x -> ((GType) x).project(v))); - } - @Override public List getElements() { @@ -153,5 +123,29 @@ public Map checkExtChoiceConsistency(Map enablers) enablers = elem.checkExtChoiceConsistency(enablers); } return enablers; + + @Override + public LSeq projectInlined(Role self) + { + return projectAux(this.elems.stream() + .map(x -> ((GType) x).projectInlined(self))); + } + + private LSeq projectAux(Stream elems) + { + List tmp = elems.filter(x -> !x.equals(LSkip.SKIP)) + .collect(Collectors.toList()); + return new LSeq(null, tmp); + // Empty seqs converted to LSkip by GChoice/Recursion projection + // And a WF top-level protocol cannot produce empty LSeq + // So a projection never contains an empty LSeq -- i.e., "empty choice/rec" pruning unnecessary + } + + @Override + public LSeq project(ProjEnv v) + { + return projectAux(this.elems.stream() + .map(x -> ((GType) x).project(v))); + } } */ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java index 65ba5186c..25d1cbef2 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GType.java @@ -15,17 +15,10 @@ import org.scribble.core.lang.global.GNode; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.Role; import org.scribble.core.type.session.SType; -import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.global.ProjEnv; public interface GType extends SType, GNode { - - LType projectInlined(Role self); // Use on inlined (i.e., Do inlined, roles pruned) - - LType project(ProjEnv v); // Use on parsed (intermed) } @@ -73,5 +66,10 @@ Map checkExtChoiceConsistency(Map enablers) @Override SType unfoldAllOnce(STypeUnfolder u); // Not GType return, o/w need to override again in GDo + + LType + projectInlined(Role self); // Use on inlined (i.e., Do inlined, roles pruned) + + LType project(ProjEnv v); // Use on parsed (intermed) */ diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java index 223996b28..d62a5102f 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java @@ -17,7 +17,7 @@ // T = SType, unit = n.getChildren(), agg = reconstruct, ns = all children -- all children require dynamic casts // T = B ... ? Considering Stream like a Seq, and elems as singleton Seqs -- cf. Stream, for Choice/etc reconstruct public abstract class STypeVisitor> - extends STypeAgg> // T = SType gives reconstruction flexibility/extensibility + extends STypeAgg> // T = SType gives reconstruction flexibility/extensibility { @Override protected final SType unit(SType n) throws ScribException From 6b52a61e54efd04415a25e66df5915e532d9ccc5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 19:08:36 +0100 Subject: [PATCH 237/539] Minor refactoring to EGraphBuilder2 -- added implicit init calls on construction and finalise. --- .../src/main/java/org/scribble/core/job/JobContext.java | 3 --- .../main/java/org/scribble/core/lang/local/LProtocol.java | 2 +- .../java/org/scribble/core/model/endpoint/AutParser.java | 6 ++---- .../scribble/core/model/endpoint/EGraphBuilderUtil2.java | 5 ++++- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java index b20fa38fb..1384e8ca5 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java @@ -302,9 +302,6 @@ public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) { String aut = runAut(getEGraph(fullname, role).init.toAut(), fulllpn + ".aut"); - - System.out.println("jjj1: " + getEGraph(fullname, role).toAut() + " \n" + aut); - minimised = new AutParser(this.job).parse(aut); addMinimisedEGraph(fulllpn, minimised); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 2e7525611..c497a59bd 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -117,7 +117,7 @@ public LProtocol unfoldAllOnce(STypeUnfolder v) public EGraph toEGraph(Job job) { EGraphBuilderUtil2 b = new EGraphBuilderUtil2(job.config.ef); - b.init(null); // FIXME: init param not used + //b.init(null); // FIXME: init param not used if (this.def.isEmpty()) // Empty Seq special case for top-level -- in general, Seq must be non-empty, cf. LSeq::buildGraph entry/exit { EState s = b.getEntry(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java index f2cd748f8..9b44b4402 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java @@ -116,10 +116,9 @@ public EGraph parse(String aut) //EGraphBuilderUtil util = new EGraphBuilderUtil(ef); //EGraphBuilderUtil util = this.job2.newEGraphBuilderUtil2(); EGraphBuilderUtil2 util = new EGraphBuilderUtil2(this.job2.config.ef); - util.init(null); // FIXME: arg is deprecated + //util.init(null); // FIXME: arg is deprecated Map map = new HashMap<>(); map.put(init, util.getEntry()); - System.out.println("bbb: " + init + " ,, " + util.getEntry()); if (term != -1) { map.put(term, util.getExit()); @@ -144,8 +143,6 @@ public EGraph parse(String aut) //for (int i : edges.keySet()) for (int i : as.keySet()) { - System.out.println("aaa: " + i + " ,, " + map); - EState s = map.get(i); //Map tmp = edges.get(i); List tmp1 = as.get(i); @@ -163,6 +160,7 @@ public EGraph parse(String aut) } } } + util.finalise(); // redundant //return builder.finalise(); return new EGraph(util.getEntry(), util.getExit()); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java index 7212ad55e..5c4da9488 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java @@ -32,7 +32,7 @@ import org.scribble.core.type.name.RecVar; import org.scribble.util.ScribException; - // N.B. init must be called before every "new visit", including first + // N.B. init must be called before every "new visit", including first -- no: now init implicit on construction, and finalise also does init // FIXME TODO replace EGraphBuilderUtil // Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) // Tailored to support graph building from syntactic local protocol choice and recursion @@ -60,6 +60,7 @@ public EGraphBuilderUtil2(EModelFactory ef) this.ef = ef; ////clear(); //reset(); + init(null); } /*// FIXME: cannot be reused for different protos, because of recvars and clear/reset @@ -444,6 +445,8 @@ public EGraph finalise() EndpointState dfa = determinise(all, res, resTerm); System.out.println("111: " + dfa.toDot());*/ + init(null); + return new EGraph(entry, exit); } From be2eaa547f8a79447aed3075915d2609df33f87f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 20:55:13 +0100 Subject: [PATCH 238/539] Factored out core EGraphBuilder visitor. --- .../scribble/core/lang/local/LProtocol.java | 19 +- .../core/model/endpoint/AutParser.java | 15 +- .../core/type/session/local/LAcc.java | 26 +- .../core/type/session/local/LChoice.java | 148 ++++++----- .../core/type/session/local/LContinue.java | 70 +++--- .../core/type/session/local/LDisconnect.java | 17 +- .../scribble/core/type/session/local/LDo.java | 13 +- .../core/type/session/local/LRcv.java | 26 +- .../core/type/session/local/LRecursion.java | 19 +- .../core/type/session/local/LReq.java | 28 +-- .../core/type/session/local/LSend.java | 28 +-- .../core/type/session/local/LSeq.java | 64 +++-- .../core/type/session/local/LSkip.java | 13 +- .../core/type/session/local/LType.java | 5 +- .../core/visit/local/EGraphBuilder.java | 235 ++++++++++++++++++ scribble-test/src/test/scrib/tmp/Test.scr | 5 +- 16 files changed, 462 insertions(+), 269 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index c497a59bd..f34fe4618 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -13,6 +13,7 @@ */ package org.scribble.core.lang.local; +import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; @@ -24,7 +25,6 @@ import org.scribble.core.lang.ProtocolMod; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.model.endpoint.EGraph; -import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.model.endpoint.EState; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; @@ -41,6 +41,7 @@ import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.Substitutor; +import org.scribble.core.visit.local.EGraphBuilder; import org.scribble.core.visit.local.ReachabilityChecker; import org.scribble.util.Constants; import org.scribble.util.ScribException; @@ -116,19 +117,17 @@ public LProtocol unfoldAllOnce(STypeUnfolder v) public EGraph toEGraph(Job job) { - EGraphBuilderUtil2 b = new EGraphBuilderUtil2(job.config.ef); - //b.init(null); // FIXME: init param not used + //EGraphBuilderUtil2 b = job.newEGraphBuilderUtil(); + ////b.init(null); // FIXME: init param not used if (this.def.isEmpty()) // Empty Seq special case for top-level -- in general, Seq must be non-empty, cf. LSeq::buildGraph entry/exit { - EState s = b.getEntry(); + //EState s = b.getEntry(); + EState s = job.config.ef.newEState(Collections.emptySet()); return new EGraph(s, s); } - this.def.buildGraph(b); - EGraph g = b.finalise(); - return g; - /*EState init = toGraph(b); - EState term = init.getTerminal(); - return new EGraph(init, term);*/ + EGraphBuilder b = new EGraphBuilder(job); + this.def.visitWithNoEx(b); + return b.finalise(); } public void checkReachability() throws ScribException diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java index 9b44b4402..25b30b283 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java @@ -37,16 +37,16 @@ public class AutParser { - private final Job job2; + private final Job job; - public AutParser(Job job2) + public AutParser(Job job) { - this.job2 = job2; + this.job = job; } public EGraph parse(String aut) { - EModelFactory ef = this.job2.config.ef; + EModelFactory ef = this.job.config.ef; //Map> edges = new HashMap<>(); Map> as = new HashMap<>(); @@ -115,7 +115,7 @@ public EGraph parse(String aut) } //EGraphBuilderUtil util = new EGraphBuilderUtil(ef); //EGraphBuilderUtil util = this.job2.newEGraphBuilderUtil2(); - EGraphBuilderUtil2 util = new EGraphBuilderUtil2(this.job2.config.ef); + EGraphBuilderUtil2 util = new EGraphBuilderUtil2(this.job.config.ef); //util.init(null); // FIXME: arg is deprecated Map map = new HashMap<>(); map.put(init, util.getEntry()); @@ -160,9 +160,8 @@ public EGraph parse(String aut) } } } - util.finalise(); // redundant - //return builder.finalise(); - return new EGraph(util.getEntry(), util.getExit()); + return util.finalise(); // Redundant, except that it creates the EGraph + //return new EGraph(util.getEntry(), util.getExit()); } // Cf. getCommSymbol of IOActions diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java index c352a2b5d..a8d60c759 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java @@ -14,14 +14,10 @@ package org.scribble.core.type.session.local; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.ConnectAction; import org.scribble.core.type.session.Message; -import org.scribble.core.type.session.MessageSig; -import org.scribble.core.type.session.Payload; public class LAcc extends ConnectAction implements LType { @@ -42,17 +38,6 @@ public LAcc reconstruct( return new LAcc(source, src, msg); } - @Override - public void buildGraph(EGraphBuilderUtil2 b) - { - Role peer = this.src; - MessageId mid = this.msg.getId(); - Payload payload = this.msg.isMessageSig() // CHECKME: generalise? (e.g., hasPayload) - ? ((MessageSig) msg).payload - : Payload.EMPTY_PAYLOAD; - b.addEdge(b.getEntry(), b.ef.newEAccept(peer, mid, payload), b.getExit()); - } - @Override public String toString() { @@ -112,4 +97,15 @@ public ReachabilityEnv checkReachability(ReachabilityEnv env) { return env; } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + Role peer = this.src; + MessageId mid = this.msg.getId(); + Payload payload = this.msg.isMessageSig() // CHECKME: generalise? (e.g., hasPayload) + ? ((MessageSig) msg).payload + : Payload.EMPTY_PAYLOAD; + b.addEdge(b.getEntry(), b.ef.newEAccept(peer, mid, payload), b.getExit()); + } */ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java index 766c677c6..f3e64ab54 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java @@ -13,13 +13,9 @@ */ package org.scribble.core.type.session.local; -import java.util.Collections; import java.util.List; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.model.endpoint.EGraphBuilderUtil2; -import org.scribble.core.model.endpoint.EState; -import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; @@ -38,78 +34,6 @@ public LChoice reconstruct(CommonTree source, Role subj, { return new LChoice(source, subj, blocks); } - - @Override - public void buildGraph(EGraphBuilderUtil2 b) - { - b.enterChoice(); - for (LSeq block : this.blocks) - { - List elems = block.getElements(); - LType first = elems.get(0); - if (first instanceof LRecursion) // CHECKME: do this here? refactor into builderutil? - { - //EGraphBuilderUtil2 b1 = new EGraphBuilderUtil2(b); - // "Inherits" b.recvars, for continue edge building (to "outer" recs) - //EGraph nested; - EState entry = b.getEntry(); - EState exit = b.getExit(); - - EState nestedEntry = b.newState(Collections.emptySet()); - b.setEntry(nestedEntry); - if (elems.size() == 1) - { - /*b1.setExit(b.getExit()); - first.buildGraph(b1); - nested = b1.finalise();*/ - first.buildGraph(b); - } - else - { - /*first.buildGraph(b1); - nested = b1.finalise();*/ - // Reuse existing b, to directly add continue-edges back to the "outer" graph - EState nestedExit = b.newState(Collections.emptySet()); - b.setExit(nestedExit); - first.buildGraph(b); - - b.setEntry(nestedExit); // Must be non null - b.setExit(exit); - LSeq tail = new LSeq(null, elems.subList(1, elems.size())); - tail.buildGraph(b); - } - //EState init = nested.init; - EState init = nestedEntry; - ////for (EAction a : first.getEnabling()) - for (EAction a : (Iterable) - init.getAllActions().stream().distinct()::iterator) - // Enabling actions - { - for (EState s : init.getSuccessors(a)) - { - b.addEdge(entry, a, s); - } - } - - b.setEntry(entry); - b.setExit(exit); - } - else if (first instanceof LContinue) - { - // Cannot treat choice-unguarded-continue in "a single pass" because may not have built all recursion enacting edges yet - // (Single-pass building would be sensitive to order of choice block visiting) - LContinue cont = (LContinue) first; // First and only element - b.addContinueEdge(b.getEntry(), cont.recvar); - } - else - { - b.pushChoiceBlock(); // CHECKME: still needed? LContinue doesn't check isUnguardedInChoice any more - block.buildGraph(b); - b.popChoiceBlock(); - } - } - b.leaveChoice(); - } /*@Override public List getBlocks() @@ -184,4 +108,76 @@ public ReachabilityEnv checkReachability(ReachabilityEnv env) .collect(Collectors.toSet()); return new ReachabilityEnv(postcont, recvars); } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + b.enterChoice(); + for (LSeq block : this.blocks) + { + List elems = block.getElements(); + LType first = elems.get(0); + if (first instanceof LRecursion) // CHECKME: do this here? refactor into builderutil? + { + //EGraphBuilderUtil2 b1 = new EGraphBuilderUtil2(b); + // "Inherits" b.recvars, for continue edge building (to "outer" recs) + //EGraph nested; + EState entry = b.getEntry(); + EState exit = b.getExit(); + + EState nestedEntry = b.newState(Collections.emptySet()); + b.setEntry(nestedEntry); + if (elems.size() == 1) + { + /*b1.setExit(b.getExit()); + first.buildGraph(b1); + nested = b1.finalise();* / + first.buildGraph(b); + } + else + { + /*first.buildGraph(b1); + nested = b1.finalise();* / + // Reuse existing b, to directly add continue-edges back to the "outer" graph + EState nestedExit = b.newState(Collections.emptySet()); + b.setExit(nestedExit); + first.buildGraph(b); + + b.setEntry(nestedExit); // Must be non null + b.setExit(exit); + LSeq tail = new LSeq(null, elems.subList(1, elems.size())); + tail.buildGraph(b); + } + //EState init = nested.init; + EState init = nestedEntry; + ////for (EAction a : first.getEnabling()) + for (EAction a : (Iterable) + init.getAllActions().stream().distinct()::iterator) + // Enabling actions + { + for (EState s : init.getSuccessors(a)) + { + b.addEdge(entry, a, s); + } + } + + b.setEntry(entry); + b.setExit(exit); + } + else if (first instanceof LContinue) + { + // Cannot treat choice-unguarded-continue in "a single pass" because may not have built all recursion enacting edges yet + // (Single-pass building would be sensitive to order of choice block visiting) + LContinue cont = (LContinue) first; // First and only element + b.addContinueEdge(b.getEntry(), cont.recvar); + } + else + { + b.pushChoiceBlock(); // CHECKME: still needed? LContinue doesn't check isUnguardedInChoice any more + block.buildGraph(b); + b.popChoiceBlock(); + } + } + b.leaveChoice(); + } */ diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java index a335246ee..b8b60dbb0 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java @@ -13,16 +13,10 @@ */ package org.scribble.core.type.session.local; -import java.util.LinkedList; - import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.model.endpoint.EGraphBuilderUtil2; -import org.scribble.core.model.endpoint.EState; -import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Continue; -import org.scribble.util.ScribException; public class LContinue extends Continue implements LType { @@ -38,38 +32,6 @@ public LContinue reconstruct(CommonTree source, { return new LContinue(source, recvar); } - - @Override - public void buildGraph(EGraphBuilderUtil2 b) - { - // CHECKME: identical edges, i.e. same pred/prev/succ (e.g. rec X { choice at A { A->B:1 } or { A->B:1 } continue X; }) - // Choice-guarded continue -- choice-unguarded continue detected and handled in LChoice - EState curr = b.getEntry(); - for (EState pred : b.getAllPredecessors(curr)) // Does getAllSuccessors - { - for (EAction a : new LinkedList<>(pred.getAllActions())) - { - // Following is because pred.getSuccessor doesn't support non-det edges - // FIXME: refactor actions/successor Lists in MState to list of edges? - for (EState succ : pred.getSuccessors(a)) - { - if (succ.equals(curr)) - { - try - { - b.removeEdge(pred, a, curr); //b.removeEdgeFromPredecessor(pred, prev); - //b.addEdge(pred, a, entry); //b.addRecursionEdge(pred, prev, b.getRecursionEntry(this.recvar)); - b.addRecursionEdge(pred, a, this.recvar); - } - catch (ScribException e) // CHECKME: necessary for removeEdge to have throws? - { - throw new RuntimeException(e); - } - } - } - } - } - } @Override public int hashCode() @@ -132,6 +94,38 @@ public ReachabilityEnv checkReachability(ReachabilityEnv env) tmp.add(this.recvar); return new ReachabilityEnv(true, tmp); } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + // CHECKME: identical edges, i.e. same pred/prev/succ (e.g. rec X { choice at A { A->B:1 } or { A->B:1 } continue X; }) + // Choice-guarded continue -- choice-unguarded continue detected and handled in LChoice + EState curr = b.getEntry(); + for (EState pred : b.getAllPredecessors(curr)) // Does getAllSuccessors + { + for (EAction a : new LinkedList<>(pred.getAllActions())) + { + // Following is because pred.getSuccessor doesn't support non-det edges + // FIXME: refactor actions/successor Lists in MState to list of edges? + for (EState succ : pred.getSuccessors(a)) + { + if (succ.equals(curr)) + { + try + { + b.removeEdge(pred, a, curr); //b.removeEdgeFromPredecessor(pred, prev); + //b.addEdge(pred, a, entry); //b.addRecursionEdge(pred, prev, b.getRecursionEntry(this.recvar)); + b.addRecursionEdge(pred, a, this.recvar); + } + catch (ScribException e) // CHECKME: necessary for removeEdge to have throws? + { + throw new RuntimeException(e); + } + } + } + } + } + } */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java index 87e2c3730..11f60922f 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java @@ -14,7 +14,6 @@ package org.scribble.core.type.session.local; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.DisconnectAction; @@ -42,14 +41,6 @@ public LDisconnect reconstruct( { return new LDisconnect(source, peer); } - - @Override - public void buildGraph(EGraphBuilderUtil2 b) - { - Role peer = getPeer(); - // TODO: add toAction method to base Interaction - b.addEdge(b.getEntry(), b.ef.newEDisconnect(peer), b.getExit()); - } @Override public String toString() @@ -111,4 +102,12 @@ public ReachabilityEnv checkReachability(ReachabilityEnv env) { return env; } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + Role peer = getPeer(); + // TODO: add toAction method to base Interaction + b.addEdge(b.getEntry(), b.ef.newEDisconnect(peer), b.getExit()); + } */ diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java index e23faf49c..d8955a596 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java @@ -16,7 +16,6 @@ import java.util.List; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.LProtocolName; @@ -40,12 +39,6 @@ public LDo reconstruct(CommonTree source, return new LDo(source, proto, roles, args); } - @Override - public void buildGraph(EGraphBuilderUtil2 b) - { - throw new RuntimeException("Unsupported for LDo: " + this); - } - @Override public int hashCode() { @@ -117,6 +110,12 @@ public ReachabilityEnv checkReachability(ReachabilityEnv env) { throw new RuntimeException("Unsupported for LDo: " + this); } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + throw new RuntimeException("Unsupported for LDo: " + this); + } */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java index 0601b6544..e31836192 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java @@ -14,14 +14,10 @@ package org.scribble.core.type.session.local; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; -import org.scribble.core.type.session.MessageSig; import org.scribble.core.type.session.MessageTransfer; -import org.scribble.core.type.session.Payload; public class LRcv extends MessageTransfer implements LType @@ -43,17 +39,6 @@ public LRcv reconstruct( return new LRcv(source, src, msg); } - @Override - public void buildGraph(EGraphBuilderUtil2 b) - { - Role peer = this.src; - MessageId mid = this.msg.getId(); - Payload payload = this.msg.isMessageSig() // CHECKME: generalise? (e.g., hasPayload) - ? ((MessageSig) msg).payload - : Payload.EMPTY_PAYLOAD; - b.addEdge(b.getEntry(), b.ef.newEReceive(peer, mid, payload), b.getExit()); - } - @Override public String toString() { @@ -120,4 +105,15 @@ public ReachabilityEnv checkReachability(ReachabilityEnv env) { return env; } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + Role peer = this.src; + MessageId mid = this.msg.getId(); + Payload payload = this.msg.isMessageSig() // CHECKME: generalise? (e.g., hasPayload) + ? ((MessageSig) msg).payload + : Payload.EMPTY_PAYLOAD; + b.addEdge(b.getEntry(), b.ef.newEReceive(peer, mid, payload), b.getExit()); + } */ diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java index 2d3f6a095..0140d3ff2 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java @@ -14,7 +14,6 @@ package org.scribble.core.type.session.local; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Recursion; @@ -34,15 +33,6 @@ public LRecursion reconstruct(CommonTree source, { return new LRecursion(source, recvar, block); } - - @Override - public void buildGraph(EGraphBuilderUtil2 b) - { - b.addEntryLabel(this.recvar); - b.pushRecursionEntry(this.recvar, b.getEntry()); - this.body.buildGraph(b); - b.popRecursionEntry(this.recvar); - } @Override public int hashCode() @@ -110,4 +100,13 @@ public ReachabilityEnv checkReachability(ReachabilityEnv env) } return env; } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + b.addEntryLabel(this.recvar); + b.pushRecursionEntry(this.recvar, b.getEntry()); + this.body.buildGraph(b); + b.popRecursionEntry(this.recvar); + } */ diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java index 7e4e3c968..516626049 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java @@ -14,14 +14,10 @@ package org.scribble.core.type.session.local; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.ConnectAction; import org.scribble.core.type.session.Message; -import org.scribble.core.type.session.MessageSig; -import org.scribble.core.type.session.Payload; public class LReq extends ConnectAction implements LType @@ -42,18 +38,6 @@ public LReq reconstruct( { return new LReq(source, msg, dst); } - - @Override - public void buildGraph(EGraphBuilderUtil2 b) - { - Role peer = this.dst; - MessageId mid = this.msg.getId(); - Payload payload = this.msg.isMessageSig() // CHECKME: generalise? (e.g., hasPayload) - ? ((MessageSig) msg).payload - : Payload.EMPTY_PAYLOAD; - // TODO: add toAction method to base Interaction - b.addEdge(b.getEntry(), b.ef.newERequest(peer, mid, payload), b.getExit()); - } @Override public String toString() @@ -122,4 +106,16 @@ public ReachabilityEnv checkReachability(ReachabilityEnv env) { return env; } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + Role peer = this.dst; + MessageId mid = this.msg.getId(); + Payload payload = this.msg.isMessageSig() // CHECKME: generalise? (e.g., hasPayload) + ? ((MessageSig) msg).payload + : Payload.EMPTY_PAYLOAD; + // TODO: add toAction method to base Interaction + b.addEdge(b.getEntry(), b.ef.newERequest(peer, mid, payload), b.getExit()); + } */ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java index 4459c0c4e..a51bba186 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java @@ -14,14 +14,10 @@ package org.scribble.core.type.session.local; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; -import org.scribble.core.type.session.MessageSig; import org.scribble.core.type.session.MessageTransfer; -import org.scribble.core.type.session.Payload; public class LSend extends MessageTransfer implements LType @@ -42,18 +38,6 @@ public LSend reconstruct( { return new LSend(source, msg, dst); } - - @Override - public void buildGraph(EGraphBuilderUtil2 b) - { - Role peer = this.dst; - MessageId mid = this.msg.getId(); - Payload payload = this.msg.isMessageSig() // CHECKME: generalise? (e.g., hasPayload) - ? ((MessageSig) msg).payload - : Payload.EMPTY_PAYLOAD; - // TODO: add toAction method to base Interaction - b.addEdge(b.getEntry(), b.ef.newESend(peer, mid, payload), b.getExit()); - } @Override public String toString() @@ -123,4 +107,16 @@ public ReachabilityEnv checkReachability(ReachabilityEnv env) { return env; } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + Role peer = this.dst; + MessageId mid = this.msg.getId(); + Payload payload = this.msg.isMessageSig() // CHECKME: generalise? (e.g., hasPayload) + ? ((MessageSig) msg).payload + : Payload.EMPTY_PAYLOAD; + // TODO: add toAction method to base Interaction + b.addEdge(b.getEntry(), b.ef.newESend(peer, mid, payload), b.getExit()); + } */ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java index 1ea4855fc..5fbe68248 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java @@ -13,14 +13,10 @@ */ package org.scribble.core.type.session.local; -import java.util.Collections; -import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.model.endpoint.EGraphBuilderUtil2; -import org.scribble.core.model.endpoint.EState; import org.scribble.core.type.kind.Local; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; @@ -55,36 +51,6 @@ public T aggregateNoEx(STypeAggNoEx v) return v.visitSeq(this); } - @Override - public void buildGraph(EGraphBuilderUtil2 b) - { - EState entry = b.getEntry(); - EState exit = b.getExit(); - List elems = getElements(); - if (elems.isEmpty()) - { - throw new RuntimeException("Shouldn't get here: " + this); - } - for (Iterator i = getElements().iterator(); i.hasNext(); ) - { - LType next = i.next(); - if (!i.hasNext()) - { - b.setExit(exit); - next.buildGraph(b); - } - else - { - EState tmp = b.newState(Collections.emptySet()); - b.setExit(tmp); - next.buildGraph(b); - b.setEntry(b.getExit()); - // CHECKME: exit may not be tmp, entry/exit can be modified, e.g. continue - } - } - b.setEntry(entry); - } - @Override public List getElements() { @@ -168,4 +134,34 @@ public ReachabilityEnv checkReachability(ReachabilityEnv env) } return env; } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + EState entry = b.getEntry(); + EState exit = b.getExit(); + List elems = getElements(); + if (elems.isEmpty()) + { + throw new RuntimeException("Shouldn't get here: " + this); + } + for (Iterator i = getElements().iterator(); i.hasNext(); ) + { + LType next = i.next(); + if (!i.hasNext()) + { + b.setExit(exit); + next.buildGraph(b); + } + else + { + EState tmp = b.newState(Collections.emptySet()); + b.setExit(tmp); + next.buildGraph(b); + b.setEntry(b.getExit()); + // CHECKME: exit may not be tmp, entry/exit can be modified, e.g. continue + } + } + b.setEntry(entry); + } */ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java index fcafc1227..ac4352dbb 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java @@ -16,7 +16,6 @@ import java.util.function.Function; import java.util.stream.Stream; -import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.STypeBase; @@ -51,12 +50,6 @@ public Stream gather(Function, Stream> f) throw new RuntimeException("Unsupported for Skip: " + this); } - @Override - public void buildGraph(EGraphBuilderUtil2 b) - { - throw new RuntimeException("Unsupported for: " + this); - } - @Override public String toString() { @@ -168,6 +161,12 @@ public ReachabilityEnv checkReachability(ReachabilityEnv env) { throw new RuntimeException("Unsupported for: " + this); } + + @Override + public void buildGraph(EGraphBuilderUtil2 b) + { + throw new RuntimeException("Unsupported for: " + this); + } */ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java index 6dcb53e4d..a74d6c852 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java @@ -14,7 +14,6 @@ package org.scribble.core.type.session.local; import org.scribble.core.lang.local.LNode; -import org.scribble.core.model.endpoint.EGraphBuilderUtil2; import org.scribble.core.type.kind.Local; import org.scribble.core.type.session.SType; @@ -22,9 +21,7 @@ public interface LType extends SType, LNode { //Role getSelf(); // CHECKME: useful? - // Uses b to builds graph "progressively" (working graph is mutable) - // Use EGraphBuilderUtil2::finalise for final result - void buildGraph(EGraphBuilderUtil2 b); + //void buildGraph(EGraphBuilderUtil2 b); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java new file mode 100644 index 000000000..fe4c28501 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -0,0 +1,235 @@ +package org.scribble.core.visit.local; + +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import org.scribble.core.job.Job; +import org.scribble.core.model.endpoint.EGraph; +import org.scribble.core.model.endpoint.EGraphBuilderUtil2; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.Continue; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.DisconnectAction; +import org.scribble.core.type.session.MessageSig; +import org.scribble.core.type.session.Payload; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.local.LAcc; +import org.scribble.core.type.session.local.LContinue; +import org.scribble.core.type.session.local.LDisconnect; +import org.scribble.core.type.session.local.LRcv; +import org.scribble.core.type.session.local.LRecursion; +import org.scribble.core.type.session.local.LReq; +import org.scribble.core.type.session.local.LSend; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.type.session.local.LType; +import org.scribble.core.visit.InlinedVisitorNoEx; +import org.scribble.util.ScribException; + +// Pre: use on inlined or later (unsupported for Do, also Protocol) +// Uses EGraphBuilderUtil2 to build graph "progressively" (working graph is mutable) +// Must use build as top-level call (does EGraphBuilderUtil2.finalise -- "resets" the util) +public class EGraphBuilder extends InlinedVisitorNoEx +{ + public final Job job; + + private EGraphBuilderUtil2 util; + + public EGraphBuilder(Job job) + { + this.job = job; + this.util = new EGraphBuilderUtil2(job.config.ef); + this.util.init(null); + } + + public EGraph finalise() + { + return this.util.finalise(); + } + + @Override + public SType visitChoice(Choice n) + { + EGraphBuilderUtil2 util = this.util; + util.enterChoice(); + for (LSeq block : n.blocks) + { + List elems = block.getElements(); + LType first = elems.get(0); + if (first instanceof LRecursion) // CHECKME: do this here? refactor into builderutil? + { + EState entry = util.getEntry(); + EState exit = util.getExit(); + + EState nestedEntry = util.newState(Collections.emptySet()); + util.setEntry(nestedEntry); + if (elems.size() == 1) + { + //first.buildGraph(util); + first.visitWithNoEx(this); + } + else + { + // Reuse existing b, to directly add continue-edges back to the "outer" graph + EState nestedExit = util.newState(Collections.emptySet()); + util.setExit(nestedExit); + //first.buildGraph(util); + first.visitWithNoEx(this); + + util.setEntry(nestedExit); // Must be non null + util.setExit(exit); + LSeq tail = new LSeq(null, elems.subList(1, elems.size())); + //tail.buildGraph(util); + tail.visitWithNoEx(this); + } + EState init = nestedEntry; + for (EAction a : (Iterable) + init.getAllActions().stream().distinct()::iterator) + // Enabling actions + { + for (EState s : init.getSuccessors(a)) + { + util.addEdge(entry, a, s); + } + } + + util.setEntry(entry); + util.setExit(exit); + } + else if (first instanceof LContinue) + { + // Cannot treat choice-unguarded-continue in "a single pass" because may not have built all recursion enacting edges yet + // (Single-pass building would be sensitive to order of choice block visiting) + LContinue cont = (LContinue) first; // First and only element + util.addContinueEdge(util.getEntry(), cont.recvar); + } + else + { + util.pushChoiceBlock(); // CHECKME: still needed? LContinue doesn't check isUnguardedInChoice any more + //block.buildGraph(util); + block.visitWithNoEx(this); + util.popChoiceBlock(); + } + } + util.leaveChoice(); + return n; + } + + @Override + public SType visitContinue(Continue n) + { + // CHECKME: identical edges, i.e. same pred/prev/succ (e.g. rec X { choice at A { A->B:1 } or { A->B:1 } continue X; }) + // Choice-guarded continue -- choice-unguarded continue detected and handled in LChoice + EState curr = this.util.getEntry(); + for (EState pred : this.util.getAllPredecessors(curr)) // Does getAllSuccessors + { + for (EAction a : new LinkedList<>(pred.getAllActions())) + { + // Following is because pred.getSuccessor doesn't support non-det edges + // FIXME: refactor actions/successor Lists in MState to list of edges? + for (EState succ : pred.getSuccessors(a)) + { + if (succ.equals(curr)) + { + try + { + this.util.removeEdge(pred, a, curr); //b.removeEdgeFromPredecessor(pred, prev); + //b.addEdge(pred, a, entry); //b.addRecursionEdge(pred, prev, b.getRecursionEntry(this.recvar)); + this.util.addRecursionEdge(pred, a, n.recvar); + } + catch (ScribException e) // CHECKME: necessary for removeEdge to have throws? + { + throw new RuntimeException(e); + } + } + } + } + } + return n; + } + + @Override + public SType visitDirectedInteraction(DirectedInteraction n) + { + Role peer = ((n instanceof LSend) || (n instanceof LReq)) ? n.dst + : ((n instanceof LRcv) || (n instanceof LAcc)) ? n.src + : null; + if (peer == null) + { + throw new RuntimeException("Unknown action type: " + n); + } + MessageId mid = n.msg.getId(); + Payload payload = n.msg.isMessageSig() // CHECKME: generalise? (e.g., hasPayload) + ? ((MessageSig) n.msg).payload + : Payload.EMPTY_PAYLOAD; + // TODO: add toAction method to base Interaction + EAction a = (n instanceof LSend) ? this.util.ef.newESend(peer, mid, payload) + : (n instanceof LRcv) ? this.util.ef.newEReceive(peer, mid, payload) + : (n instanceof LReq) ? this.util.ef.newERequest(peer, mid, payload) + : //(n instanceof LAcc) ? + this.util.ef.newEAccept(peer, mid, payload); // Action type already checked above + this.util.addEdge(this.util.getEntry(), a, this.util.getExit()); + return n; + } + + @Override + public SType visitDisconnect(DisconnectAction n) + { + Role peer = ((LDisconnect) n).getPeer(); // CHECKME + EAction a = this.util.ef.newEDisconnect(peer); // TODO: add toAction method to base Interaction + this.util.addEdge(this.util.getEntry(), a, this.util.getExit()); + return n; + } + + @Override + public SType visitRecursion(Recursion n) + { + this.util.addEntryLabel(n.recvar); + this.util.pushRecursionEntry(n.recvar, this.util.getEntry()); + //n.body.buildGraph(this.util); + n.body.visitWithNoEx(this); + this.util.popRecursionEntry(n.recvar); + return n; + } + + @Override + public LSeq visitSeq(LSeq n) + { + EGraphBuilderUtil2 util = this.util; + EState entry = util.getEntry(); + EState exit = util.getExit(); + List elems = n.getElements(); + if (elems.isEmpty()) + { + throw new RuntimeException("Shouldn't get here: " + this); + } + for (Iterator i = n.getElements().iterator(); i.hasNext(); ) + { + LType next = i.next(); + if (!i.hasNext()) + { + util.setExit(exit); + //next.buildGraph(util); + next.visitWithNoEx(this); + } + else + { + EState tmp = util.newState(Collections.emptySet()); + util.setExit(tmp); + //next.buildGraph(util); + next.visitWithNoEx(this); + util.setEntry(util.getExit()); + // CHECKME: exit may not be tmp, entry/exit can be modified, e.g. continue + } + } + util.setEntry(entry); + return n; + } +} diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 84b19dcb9..b67ddfb97 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -84,11 +84,8 @@ module tmp.Test; global protocol Proto1(role A, role B) { //1() from A to B; - choice at A - { 1() from A to B; - do Proto1(A, B); - } + //do Proto1(A, B); } From abbd67358f4d4e86dc3c2105f1265fdb3d1a2c91 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 21:07:51 +0100 Subject: [PATCH 239/539] Continued: removed explicit Inlined core visitors. --- .../scribble/core/lang/global/GProtocol.java | 12 ++++----- .../scribble/core/lang/local/LProtocol.java | 6 ++--- .../scribble/core/type/session/Choice.java | 4 +-- .../scribble/core/type/session/Continue.java | 4 +-- .../type/session/DirectedInteraction.java | 4 +-- .../core/type/session/DisconnectAction.java | 4 +-- .../org/scribble/core/type/session/Do.java | 4 +-- .../scribble/core/type/session/Recursion.java | 4 +-- .../org/scribble/core/type/session/SType.java | 10 +++---- .../scribble/core/type/session/STypeBase.java | 6 ++--- .../core/type/session/global/GSeq.java | 4 +-- .../core/type/session/local/LSeq.java | 4 +-- .../core/type/session/local/LSkip.java | 4 +-- .../scribble/core/visit/InlinedVisitor.java | 19 -------------- .../core/visit/InlinedVisitorNoEx.java | 17 ------------ .../org/scribble/core/visit/RecPruner.java | 4 +-- .../org/scribble/core/visit/STypeAgg.java | 2 +- .../org/scribble/core/visit/STypeAggNoEx.java | 2 +- .../org/scribble/core/visit/STypeInliner.java | 4 +-- .../scribble/core/visit/STypeUnfolder.java | 12 +++++++-- .../org/scribble/core/visit/STypeVisitor.java | 2 +- ...itorNoEx.java => STypeVisitorNoThrow.java} | 4 +-- .../org/scribble/core/visit/Substitutor.java | 2 +- .../global/ExtChoiceConsistencyChecker.java | 13 ++++++++-- .../core/visit/global/InlinedProjector.java | 4 +-- .../visit/global/RoleEnablingChecker.java | 13 ++++++++-- .../core/visit/local/EGraphBuilder.java | 26 ++++++++++++------- .../core/visit/local/ReachabilityChecker.java | 17 +++++++++--- .../visit/local/SingleContinueChecker.java | 2 +- 29 files changed, 109 insertions(+), 104 deletions(-) delete mode 100644 scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitor.java delete mode 100644 scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitorNoEx.java rename scribble-core/src/main/java/org/scribble/core/visit/{STypeVisitorNoEx.java => STypeVisitorNoThrow.java} (95%) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 5413a4cbd..2c098cd2f 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -130,7 +130,7 @@ else if (n instanceof MessageSigName) @Override public GProtocol unfoldAllOnce(STypeUnfolder v) { - GSeq unf = (GSeq) this.def.visitWithNoEx(v); + GSeq unf = (GSeq) this.def.visitNoThrow(v); return reconstruct(getSource(), this.mods, this.fullname, this.roles, this.params, unf); } @@ -139,7 +139,7 @@ public void checkRoleEnabling() throws ScribException { Set rs = this.roles.stream().collect(Collectors.toSet()); RoleEnablingChecker v = new RoleEnablingChecker(rs); - this.def.visitWith(v); + this.def.visit(v); } public void checkExtChoiceConsistency() throws ScribException @@ -147,13 +147,13 @@ public void checkExtChoiceConsistency() throws ScribException Map rs = this.roles.stream() .collect(Collectors.toMap(x -> x, x -> x)); ExtChoiceConsistencyChecker v = new ExtChoiceConsistencyChecker(rs); - this.def.visitWith(v); + this.def.visit(v); } // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) public LProjection projectInlined(Job job, Role self) { - LSeq body = (LSeq) this.def.aggregateNoEx(new InlinedProjector(job, self)); + LSeq body = (LSeq) this.def.visitNoThrow(new InlinedProjector(job, self)); return projectAux(self, this.roles, body); } @@ -175,8 +175,8 @@ private LProjection projectAux(Role self, List decls, LSeq body) public LProjection project(ProjEnv v) { - LSeq body = (LSeq) this.def.aggregateNoEx(new Projector(v.job, v.self)) - .visitWithNoEx(new RecPruner<>()); + LSeq body = (LSeq) this.def.visitNoThrow(new Projector(v.job, v.self)) + .visitNoThrow(new RecPruner<>()); return projectAux(v.self, v.job.getContext().getInlined(this.fullname).roles, // Used inlined decls, already pruned body); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index f34fe4618..7da2c4ab3 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -110,7 +110,7 @@ else if (n instanceof MessageSigName) @Override public LProtocol unfoldAllOnce(STypeUnfolder v) { - LSeq unf = (LSeq) this.def.visitWithNoEx(v); + LSeq unf = (LSeq) this.def.visitNoThrow(v); return reconstruct(getSource(), this.mods, this.fullname, this.roles, this.self, this.params, unf); } @@ -126,13 +126,13 @@ public EGraph toEGraph(Job job) return new EGraph(s, s); } EGraphBuilder b = new EGraphBuilder(job); - this.def.visitWithNoEx(b); + this.def.visitNoThrow(b); return b.finalise(); } public void checkReachability() throws ScribException { - this.def.visitWith(new ReachabilityChecker()); + this.def.visit(new ReachabilityChecker()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java index c1d47be86..fe921fb64 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java @@ -46,13 +46,13 @@ public abstract Choice reconstruct(CommonTree source, Role subj, //List> blocks); @Override - public T aggregate(STypeAgg v) throws ScribException + public T visit(STypeAgg v) throws ScribException { return v.visitChoice(this); } @Override - public T aggregateNoEx(STypeAggNoEx v) + public T visitNoThrow(STypeAggNoEx v) { return v.visitChoice(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java index 803ad640d..e8d16c18b 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java @@ -40,13 +40,13 @@ public abstract Continue reconstruct( CommonTree source, RecVar recvar); @Override - public T aggregate(STypeAgg v) throws ScribException + public T visit(STypeAgg v) throws ScribException { return v.visitContinue(this); } @Override - public T aggregateNoEx(STypeAggNoEx v) + public T visitNoThrow(STypeAggNoEx v) { return v.visitContinue(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java index 795d4e66e..f6c274ea9 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java @@ -46,13 +46,13 @@ public abstract DirectedInteraction reconstruct( Role dst); @Override - public T aggregate(STypeAgg v) throws ScribException + public T visit(STypeAgg v) throws ScribException { return v.visitDirectedInteraction(this); } @Override - public T aggregateNoEx(STypeAggNoEx v) + public T visitNoThrow(STypeAggNoEx v) { return v.visitDirectedInteraction(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java index 8b29b888a..56d462635 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java @@ -42,13 +42,13 @@ public abstract DisconnectAction reconstruct( CommonTree source, Role src, Role dst); @Override - public T aggregate(STypeAgg v) throws ScribException + public T visit(STypeAgg v) throws ScribException { return v.visitDisconnect(this); } @Override - public T aggregateNoEx(STypeAggNoEx v) + public T visitNoThrow(STypeAggNoEx v) { return v.visitDisconnect(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java index 4113ac322..2e97010c0 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java @@ -50,13 +50,13 @@ public abstract Do reconstruct(CommonTree source, N proto, List roles, List> args); @Override - public T aggregate(STypeAgg v) throws ScribException + public T visit(STypeAgg v) throws ScribException { return v.visitDo(this); } @Override - public T aggregateNoEx(STypeAggNoEx v) + public T visitNoThrow(STypeAggNoEx v) { return v.visitDo(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java index 79e048a39..a9afb2c61 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java @@ -42,13 +42,13 @@ public abstract Recursion reconstruct( CommonTree source, RecVar recvar, B body); @Override - public T aggregate(STypeAgg v) throws ScribException + public T visit(STypeAgg v) throws ScribException { return v.visitRecursion(this); } @Override - public T aggregateNoEx(STypeAggNoEx v) + public T visitNoThrow(STypeAggNoEx v) { return v.visitRecursion(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index 935a0f756..19d6a65e6 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -20,8 +20,6 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoEx; -import org.scribble.core.visit.STypeVisitor; -import org.scribble.core.visit.STypeVisitorNoEx; import org.scribble.util.ScribException; @@ -30,12 +28,12 @@ public interface SType> extends SNode { - T aggregate(STypeAgg v) throws ScribException; - T aggregateNoEx(STypeAggNoEx v); + T visit(STypeAgg v) throws ScribException; + T visitNoThrow(STypeAggNoEx v); - // Wrappers for STypeVisitor around aggregate -- give B return for visitSeq, cf. STypeAgg + /*// Wrappers for STypeVisitor around aggregate -- give B return for visitSeq, cf. STypeAgg SType visitWith(STypeVisitor v) throws ScribException; - SType visitWithNoEx(STypeVisitorNoEx v); + SType visitWithNoEx(STypeVisitorNoEx v);*/ // Pass in an STypeGatherer::visit, e.g., n.(new RoleGatherer()::visit) Stream gather(Function, Stream> f); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java b/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java index 10fdd5df8..aa06fec93 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java @@ -16,7 +16,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.visit.STypeVisitor; -import org.scribble.core.visit.STypeVisitorNoEx; +import org.scribble.core.visit.STypeVisitorNoThrow; import org.scribble.util.ScribException; // SessTypeBase is to SessType as ScribNodeBase is to ScribNode @@ -34,7 +34,7 @@ public STypeBase(CommonTree source) this.source = source; } - @Override + /*@Override public SType visitWith(STypeVisitor v) throws ScribException { return aggregate(v); @@ -44,7 +44,7 @@ public SType visitWith(STypeVisitor v) throws ScribException public SType visitWithNoEx(STypeVisitorNoEx v) { return aggregateNoEx(v); - } + }*/ @Override public boolean hasSource() diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java index ebfa8654c..1b95a82fb 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java @@ -40,13 +40,13 @@ public GSeq reconstruct(CommonTree source, } @Override - public T aggregate(STypeAgg v) throws ScribException + public T visit(STypeAgg v) throws ScribException { return v.visitSeq(this); } @Override - public T aggregateNoEx(STypeAggNoEx v) + public T visitNoThrow(STypeAggNoEx v) { return v.visitSeq(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java index 5fbe68248..e2ebf06eb 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java @@ -40,13 +40,13 @@ public LSeq reconstruct(CommonTree source, } @Override - public T aggregate(STypeAgg v) throws ScribException + public T visit(STypeAgg v) throws ScribException { return v.visitSeq(this); } @Override - public T aggregateNoEx(STypeAggNoEx v) + public T visitNoThrow(STypeAggNoEx v) { return v.visitSeq(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java index ac4352dbb..fd8553ce6 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java @@ -33,13 +33,13 @@ private LSkip() } @Override - public T aggregate(STypeAgg v) + public T visit(STypeAgg v) { throw new RuntimeException("Unsupported for Skip: " + this); } @Override - public T aggregateNoEx(STypeAggNoEx v) + public T visitNoThrow(STypeAggNoEx v) { throw new RuntimeException("Unsupported for Skip: " + this); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitor.java deleted file mode 100644 index 5864838de..000000000 --- a/scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitor.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.scribble.core.visit; - -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; -import org.scribble.core.type.session.Do; -import org.scribble.core.type.session.SType; -import org.scribble.core.type.session.Seq; -import org.scribble.util.ScribException; - -public abstract class InlinedVisitor> - extends STypeVisitor -{ - @Override - public final > SType visitDo(Do n) - throws ScribException - { - throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); - } -} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitorNoEx.java b/scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitorNoEx.java deleted file mode 100644 index 14b3bbd75..000000000 --- a/scribble-core/src/main/java/org/scribble/core/visit/InlinedVisitorNoEx.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.scribble.core.visit; - -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; -import org.scribble.core.type.session.Do; -import org.scribble.core.type.session.SType; -import org.scribble.core.type.session.Seq; - -public abstract class InlinedVisitorNoEx> - extends STypeVisitorNoEx -{ - @Override - public final > SType visitDo(Do n) - { - throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); - } -} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java index 9859f77a5..00f4a774c 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java @@ -13,7 +13,7 @@ // Assumes no shadowing (e.g., use after inlining recvar disamb) public class RecPruner> - extends STypeVisitorNoEx + extends STypeVisitorNoThrow { @Override public SType visitRecursion(Recursion n) @@ -32,7 +32,7 @@ public B visitSeq(B n) List> elems = new LinkedList<>(); for (SType e : n.elems) { - SType e1 = (SType) e.visitWithNoEx(this); + SType e1 = (SType) e.visitNoThrow(this); if (e1 instanceof Seq) // cf. visitRecursion { elems.addAll(((Seq) e1).getElements()); // Handles empty Seq case diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java index f34b2909e..3afb4a6a3 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java @@ -71,7 +71,7 @@ public T visitSeq(B n) throws ScribException List elems = new LinkedList<>(); for (SType e : n.elems) { - elems.add(e.aggregate(this)); + elems.add(e.visit(this)); } return agg(n, elems.stream()); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java index bca1575ba..4b94cfad0 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java @@ -59,7 +59,7 @@ public T visitRecursion(Recursion n) // Param "hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction public T visitSeq(B n) { - return agg(n, n.elems.stream().map(x -> x.aggregateNoEx(this))); + return agg(n, n.elems.stream().map(x -> x.visitNoThrow(this))); } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java index 1939d4a3f..08cea36bd 100755 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java @@ -18,7 +18,7 @@ import org.scribble.core.type.session.Seq; public abstract class STypeInliner> - extends STypeVisitorNoEx + extends STypeVisitorNoThrow { public final Job job; @@ -61,7 +61,7 @@ public B visitSeq(B n) List> elems = new LinkedList<>(); for (SType e : n.elems) { - SType e1 = e.visitWithNoEx(this); + SType e1 = e.visitNoThrow(this); if (e1 instanceof Seq) { elems.addAll(((Seq) e1).elems); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java index 9ce6ce122..f8b0e9fa5 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java @@ -6,17 +6,25 @@ import java.util.Map; import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.session.Do; import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; // Not supported for Do public abstract class STypeUnfolder> - extends InlinedVisitorNoEx + extends STypeVisitorNoThrow { private final Map> recs = new HashMap<>(); + @Override + public final > SType visitDo(Do n) + { + throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); + } + @Override public SType visitRecursion(Recursion n) { @@ -37,7 +45,7 @@ public B visitSeq(B n) List> elems = new LinkedList<>(); for (SType e : n.elems) { - SType e1 = e.visitWithNoEx(this); + SType e1 = e.visitNoThrow(this); if (e1 instanceof Seq) { elems.addAll(((Seq) e1).elems); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java index d62a5102f..b452f9e46 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java @@ -86,7 +86,7 @@ public B visitSeq(B n) throws ScribException List> elems = new LinkedList<>(); for (SType e : n.elems) { - elems.add(e.visitWith(this)); + elems.add(e.visit(this)); } return n.reconstruct(n.getSource(), elems); // N.B. skipping agg (reconstruction done here) } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java similarity index 95% rename from scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java rename to scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java index af1a0dca7..df45ba3bc 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoEx.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java @@ -11,7 +11,7 @@ import org.scribble.core.type.session.Seq; // For comments, see STypeVisitor -public abstract class STypeVisitorNoEx> +public abstract class STypeVisitorNoThrow> extends STypeAggNoEx> { @Override @@ -45,7 +45,7 @@ public SType visitRecursion(Recursion n) @Override public B visitSeq(B n) { - List> elems = n.elems.stream().map(x -> x.visitWithNoEx(this)) + List> elems = n.elems.stream().map(x -> x.visitNoThrow(this)) .collect(Collectors.toList()); return n.reconstruct(n.getSource(), elems); // N.B. skipping agg (reconstruction done here) } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java index f142a1130..94ae7045f 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java @@ -22,7 +22,7 @@ import org.scribble.core.type.session.Seq; public class Substitutor> - extends STypeVisitorNoEx + extends STypeVisitorNoThrow { private Substitutions subs; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java index 8b09891e9..ec5959163 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java @@ -11,16 +11,18 @@ import java.util.stream.Stream; import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.Do; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.global.GSeq; -import org.scribble.core.visit.InlinedVisitor; +import org.scribble.core.visit.STypeVisitor; import org.scribble.util.ScribException; // Pre: use on inlined or later (unsupported for Do, also Protocol) -public class ExtChoiceConsistencyChecker extends InlinedVisitor +public class ExtChoiceConsistencyChecker extends STypeVisitor { private Map enablers; // Invariant: unmodifiable @@ -82,6 +84,13 @@ public SType visitDirectedInteraction( setEnablers(res); return n; } + + @Override + public final > SType visitDo( + Do n) throws ScribException + { + throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); + } protected Map getEnablers() { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index 1e0e6ffea..8d07ebc4b 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -127,7 +127,7 @@ public LType visitRecursion(Recursion n) } Set rvs = new HashSet<>(); rvs.add(n.recvar); - if (body.aggregateNoEx(new SingleContinueChecker(rvs))) + if (body.visitNoThrow(new SingleContinueChecker(rvs))) { return LSkip.SKIP; } @@ -138,7 +138,7 @@ public LType visitRecursion(Recursion n) @Override public LSeq visitSeq(GSeq n) { - List elems = n.elems.stream().map(x -> x.aggregateNoEx(this)) + List elems = n.elems.stream().map(x -> x.visitNoThrow(this)) .filter(x -> !x.equals(LSkip.SKIP)).collect(Collectors.toList()); return new LSeq(null, elems); // Empty seqs converted to LSkip by GChoice/Recursion projection diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java index 3eec43196..fca7a23af 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java @@ -9,17 +9,19 @@ import java.util.stream.Stream; import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.DirectedInteraction; import org.scribble.core.type.session.DisconnectAction; +import org.scribble.core.type.session.Do; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.global.GSeq; -import org.scribble.core.visit.InlinedVisitor; +import org.scribble.core.visit.STypeVisitor; import org.scribble.util.ScribException; // Pre: use on inlined or later (unsupported for Do, also Protocol) -public class RoleEnablingChecker extends InlinedVisitor +public class RoleEnablingChecker extends STypeVisitor { private Set enabled; // Invariant: unmodifiable @@ -74,6 +76,13 @@ public SType visitDirectedInteraction( return n; } + @Override + public final > SType visitDo( + Do n) throws ScribException + { + throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); + } + @Override public SType visitDisconnect( DisconnectAction n) throws ScribException diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index fe4c28501..28b3b71c3 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -12,11 +12,13 @@ import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.DirectedInteraction; import org.scribble.core.type.session.DisconnectAction; +import org.scribble.core.type.session.Do; import org.scribble.core.type.session.MessageSig; import org.scribble.core.type.session.Payload; import org.scribble.core.type.session.Recursion; @@ -30,13 +32,13 @@ import org.scribble.core.type.session.local.LSend; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.InlinedVisitorNoEx; +import org.scribble.core.visit.STypeVisitorNoThrow; import org.scribble.util.ScribException; // Pre: use on inlined or later (unsupported for Do, also Protocol) // Uses EGraphBuilderUtil2 to build graph "progressively" (working graph is mutable) // Must use build as top-level call (does EGraphBuilderUtil2.finalise -- "resets" the util) -public class EGraphBuilder extends InlinedVisitorNoEx +public class EGraphBuilder extends STypeVisitorNoThrow { public final Job job; @@ -73,7 +75,7 @@ public SType visitChoice(Choice n) if (elems.size() == 1) { //first.buildGraph(util); - first.visitWithNoEx(this); + first.visitNoThrow(this); } else { @@ -81,13 +83,13 @@ public SType visitChoice(Choice n) EState nestedExit = util.newState(Collections.emptySet()); util.setExit(nestedExit); //first.buildGraph(util); - first.visitWithNoEx(this); + first.visitNoThrow(this); util.setEntry(nestedExit); // Must be non null util.setExit(exit); LSeq tail = new LSeq(null, elems.subList(1, elems.size())); //tail.buildGraph(util); - tail.visitWithNoEx(this); + tail.visitNoThrow(this); } EState init = nestedEntry; for (EAction a : (Iterable) @@ -114,7 +116,7 @@ else if (first instanceof LContinue) { util.pushChoiceBlock(); // CHECKME: still needed? LContinue doesn't check isUnguardedInChoice any more //block.buildGraph(util); - block.visitWithNoEx(this); + block.visitNoThrow(this); util.popChoiceBlock(); } } @@ -188,13 +190,19 @@ public SType visitDisconnect(DisconnectAction n) return n; } + @Override + public final > SType visitDo(Do n) + { + throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); + } + @Override public SType visitRecursion(Recursion n) { this.util.addEntryLabel(n.recvar); this.util.pushRecursionEntry(n.recvar, this.util.getEntry()); //n.body.buildGraph(this.util); - n.body.visitWithNoEx(this); + n.body.visitNoThrow(this); this.util.popRecursionEntry(n.recvar); return n; } @@ -217,14 +225,14 @@ public LSeq visitSeq(LSeq n) { util.setExit(exit); //next.buildGraph(util); - next.visitWithNoEx(this); + next.visitNoThrow(this); } else { EState tmp = util.newState(Collections.emptySet()); util.setExit(tmp); //next.buildGraph(util); - next.visitWithNoEx(this); + next.visitNoThrow(this); util.setEntry(util.getExit()); // CHECKME: exit may not be tmp, entry/exit can be modified, e.g. continue } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java index fcd4cbc98..b17a9143d 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java @@ -9,18 +9,20 @@ import java.util.stream.Collectors; import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Continue; +import org.scribble.core.type.session.Do; import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.InlinedVisitor; +import org.scribble.core.visit.STypeVisitor; import org.scribble.util.ScribException; // Pre: use on inlined or later (unsupported for Do, also Protocol) -public class ReachabilityChecker extends InlinedVisitor +public class ReachabilityChecker extends STypeVisitor { private ReachabilityEnv env; // Immutable @@ -58,11 +60,18 @@ public SType visitContinue(Continue n) throws ScribExc return n; } + @Override + public final > SType visitDo( + Do n) throws ScribException + { + throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); + } + @Override public SType visitRecursion(Recursion n) throws ScribException { - n.body.visitWith(this); + n.body.visit(this); ReachabilityEnv env = getEnv(); if (env.recvars.contains(n.recvar)) { @@ -89,7 +98,7 @@ public LSeq visitSeq(LSeq n) throw new ScribException( "Illegal sequence: " + (prev == null ? "" : prev + "\n") + next); } - next.visitWith(this); + next.visit(this); } return n; } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java index 8fe796c41..4d66a752c 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java @@ -65,6 +65,6 @@ public Boolean visitRecursion(Recursion n) @Override public Boolean visitSeq(LSeq n) { - return n.elems.size() == 1 && ((LType) n.elems.get(0)).aggregateNoEx(this); + return n.elems.size() == 1 && ((LType) n.elems.get(0)).visitNoThrow(this); } } From 5d64fd92cc4f97cb63e23574e32f973f8dabca42 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 21:29:00 +0100 Subject: [PATCH 240/539] Minor. --- .../src/main/java/org/scribble/core/job/Job.java | 8 +++----- .../scribble/core/model/endpoint/AutParser.java | 2 +- .../org/scribble/core/type/session/STypeBase.java | 15 --------------- .../org/scribble/core/visit/STypeGatherer.java | 2 +- .../scribble/core/visit/local/EGraphBuilder.java | 2 +- 5 files changed, 6 insertions(+), 23 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index 88ccb1596..139f4719b 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -83,18 +83,16 @@ protected JobContext newJobContext(//Map modcs, imeds); } + // TODO: deprecate, caller should go through config // A Scribble extension should override newJobConfig/Context/etc as appropriate public SGraphBuilderUtil newSGraphBuilderUtil() { return this.config.sf.newSGraphBuilderUtil(); } - // FIXME: not currently used + // TODO: deprecate, caller should go through config // A Scribble extension should override newJobConfig/Context/etc as appropriate - // CHECKME: not reusable? fix? - // Scribble extensions should override these "new" methods - // CHECKME: move to MainContext::newJob? - public EGraphBuilderUtil2 newEGraphBuilderUtil() + public EGraphBuilderUtil2 newEGraphBuilderUtil2() { return new EGraphBuilderUtil2(this.config.ef); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java index 25b30b283..34ed29ed5 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java @@ -115,7 +115,7 @@ public EGraph parse(String aut) } //EGraphBuilderUtil util = new EGraphBuilderUtil(ef); //EGraphBuilderUtil util = this.job2.newEGraphBuilderUtil2(); - EGraphBuilderUtil2 util = new EGraphBuilderUtil2(this.job.config.ef); + EGraphBuilderUtil2 util = this.job.newEGraphBuilderUtil2(); //util.init(null); // FIXME: arg is deprecated Map map = new HashMap<>(); map.put(init, util.getEntry()); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java b/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java index aa06fec93..5248e56ba 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java @@ -15,9 +15,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.visit.STypeVisitor; -import org.scribble.core.visit.STypeVisitorNoThrow; -import org.scribble.util.ScribException; // SessTypeBase is to SessType as ScribNodeBase is to ScribNode public abstract class STypeBase> @@ -34,18 +31,6 @@ public STypeBase(CommonTree source) this.source = source; } - /*@Override - public SType visitWith(STypeVisitor v) throws ScribException - { - return aggregate(v); - } - - @Override - public SType visitWithNoEx(STypeVisitorNoEx v) - { - return aggregateNoEx(v); - }*/ - @Override public boolean hasSource() { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java index 96411ce1f..9868c1750 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java @@ -39,7 +39,7 @@ protected Optional> typeSwitch(SType n) : (n instanceof Recursion) ? Optional.of(visitRecursion((Recursion) n)) : (n instanceof Do) - ? Optional.of(this.visitDo((Do) n)) // FIXME: + ? Optional.of(this.visitDo((Do) n)) // FIXME: since we know K, we should know ? extends ProtocolName ? : Optional.empty(); // Better for extensibility than "manually" throwing Exception (e.g., for overriding) } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 28b3b71c3..25714b8dc 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -47,7 +47,7 @@ public class EGraphBuilder extends STypeVisitorNoThrow public EGraphBuilder(Job job) { this.job = job; - this.util = new EGraphBuilderUtil2(job.config.ef); + this.util = job.newEGraphBuilderUtil2(); this.util.init(null); } From 316b314fbcb76f398be0b6fecef6532635b513d2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 21:31:17 +0100 Subject: [PATCH 241/539] Minor. --- .../org/scribble/core/lang/global/GProtocol.java | 12 ++++++------ .../org/scribble/core/lang/local/LProtocol.java | 6 +++--- .../org/scribble/core/type/session/Choice.java | 6 +++--- .../org/scribble/core/type/session/Continue.java | 6 +++--- .../core/type/session/DirectedInteraction.java | 6 +++--- .../core/type/session/DisconnectAction.java | 6 +++--- .../java/org/scribble/core/type/session/Do.java | 6 +++--- .../org/scribble/core/type/session/Recursion.java | 6 +++--- .../java/org/scribble/core/type/session/SType.java | 10 +++------- .../scribble/core/type/session/global/GSeq.java | 6 +++--- .../org/scribble/core/type/session/local/LSeq.java | 6 +++--- .../scribble/core/type/session/local/LSkip.java | 6 +++--- .../java/org/scribble/core/visit/RecPruner.java | 2 +- .../java/org/scribble/core/visit/STypeAgg.java | 6 +++--- .../{STypeAggNoEx.java => STypeAggNoThrow.java} | 4 ++-- .../java/org/scribble/core/visit/STypeInliner.java | 2 +- .../org/scribble/core/visit/STypeUnfolder.java | 2 +- .../java/org/scribble/core/visit/STypeVisitor.java | 2 +- .../scribble/core/visit/STypeVisitorNoThrow.java | 4 ++-- .../core/visit/global/InlinedProjector.java | 8 ++++---- .../scribble/core/visit/local/EGraphBuilder.java | 14 +++++++------- .../core/visit/local/ReachabilityChecker.java | 4 ++-- .../core/visit/local/SingleContinueChecker.java | 6 +++--- 23 files changed, 66 insertions(+), 70 deletions(-) rename scribble-core/src/main/java/org/scribble/core/visit/{STypeAggNoEx.java => STypeAggNoThrow.java} (92%) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 2c098cd2f..88d94bb5a 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -130,7 +130,7 @@ else if (n instanceof MessageSigName) @Override public GProtocol unfoldAllOnce(STypeUnfolder v) { - GSeq unf = (GSeq) this.def.visitNoThrow(v); + GSeq unf = (GSeq) this.def.visitWithNoThrow(v); return reconstruct(getSource(), this.mods, this.fullname, this.roles, this.params, unf); } @@ -139,7 +139,7 @@ public void checkRoleEnabling() throws ScribException { Set rs = this.roles.stream().collect(Collectors.toSet()); RoleEnablingChecker v = new RoleEnablingChecker(rs); - this.def.visit(v); + this.def.visitWith(v); } public void checkExtChoiceConsistency() throws ScribException @@ -147,13 +147,13 @@ public void checkExtChoiceConsistency() throws ScribException Map rs = this.roles.stream() .collect(Collectors.toMap(x -> x, x -> x)); ExtChoiceConsistencyChecker v = new ExtChoiceConsistencyChecker(rs); - this.def.visit(v); + this.def.visitWith(v); } // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) public LProjection projectInlined(Job job, Role self) { - LSeq body = (LSeq) this.def.visitNoThrow(new InlinedProjector(job, self)); + LSeq body = (LSeq) this.def.visitWithNoThrow(new InlinedProjector(job, self)); return projectAux(self, this.roles, body); } @@ -175,8 +175,8 @@ private LProjection projectAux(Role self, List decls, LSeq body) public LProjection project(ProjEnv v) { - LSeq body = (LSeq) this.def.visitNoThrow(new Projector(v.job, v.self)) - .visitNoThrow(new RecPruner<>()); + LSeq body = (LSeq) this.def.visitWithNoThrow(new Projector(v.job, v.self)) + .visitWithNoThrow(new RecPruner<>()); return projectAux(v.self, v.job.getContext().getInlined(this.fullname).roles, // Used inlined decls, already pruned body); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 7da2c4ab3..4e53c43c2 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -110,7 +110,7 @@ else if (n instanceof MessageSigName) @Override public LProtocol unfoldAllOnce(STypeUnfolder v) { - LSeq unf = (LSeq) this.def.visitNoThrow(v); + LSeq unf = (LSeq) this.def.visitWithNoThrow(v); return reconstruct(getSource(), this.mods, this.fullname, this.roles, this.self, this.params, unf); } @@ -126,13 +126,13 @@ public EGraph toEGraph(Job job) return new EGraph(s, s); } EGraphBuilder b = new EGraphBuilder(job); - this.def.visitNoThrow(b); + this.def.visitWithNoThrow(b); return b.finalise(); } public void checkReachability() throws ScribException { - this.def.visit(new ReachabilityChecker()); + this.def.visitWith(new ReachabilityChecker()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java index fe921fb64..5e16527b5 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java @@ -23,7 +23,7 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; import org.scribble.core.visit.STypeAgg; -import org.scribble.core.visit.STypeAggNoEx; +import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.util.ScribException; public abstract class Choice> @@ -46,13 +46,13 @@ public abstract Choice reconstruct(CommonTree source, Role subj, //List> blocks); @Override - public T visit(STypeAgg v) throws ScribException + public T visitWith(STypeAgg v) throws ScribException { return v.visitChoice(this); } @Override - public T visitNoThrow(STypeAggNoEx v) + public T visitWithNoThrow(STypeAggNoThrow v) { return v.visitChoice(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java index e8d16c18b..5f82d06da 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java @@ -20,7 +20,7 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.RecVar; import org.scribble.core.visit.STypeAgg; -import org.scribble.core.visit.STypeAggNoEx; +import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.util.ScribException; public abstract class Continue> @@ -40,13 +40,13 @@ public abstract Continue reconstruct( CommonTree source, RecVar recvar); @Override - public T visit(STypeAgg v) throws ScribException + public T visitWith(STypeAgg v) throws ScribException { return v.visitContinue(this); } @Override - public T visitNoThrow(STypeAggNoEx v) + public T visitWithNoThrow(STypeAggNoThrow v) { return v.visitContinue(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java index f6c274ea9..0a8a2796c 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java @@ -20,7 +20,7 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; import org.scribble.core.visit.STypeAgg; -import org.scribble.core.visit.STypeAggNoEx; +import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.util.ScribException; // Besides directed-ness, also features a Message @@ -46,13 +46,13 @@ public abstract DirectedInteraction reconstruct( Role dst); @Override - public T visit(STypeAgg v) throws ScribException + public T visitWith(STypeAgg v) throws ScribException { return v.visitDirectedInteraction(this); } @Override - public T visitNoThrow(STypeAggNoEx v) + public T visitWithNoThrow(STypeAggNoThrow v) { return v.visitDirectedInteraction(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java index 56d462635..4bc2ce996 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java @@ -20,7 +20,7 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; import org.scribble.core.visit.STypeAgg; -import org.scribble.core.visit.STypeAggNoEx; +import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.util.ScribException; // Base class would be "SymmetricInteraction" (cf., DirectedInteraction) @@ -42,13 +42,13 @@ public abstract DisconnectAction reconstruct( CommonTree source, Role src, Role dst); @Override - public T visit(STypeAgg v) throws ScribException + public T visitWith(STypeAgg v) throws ScribException { return v.visitDisconnect(this); } @Override - public T visitNoThrow(STypeAggNoEx v) + public T visitWithNoThrow(STypeAggNoThrow v) { return v.visitDisconnect(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java index 2e97010c0..09ac91128 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java @@ -25,7 +25,7 @@ import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; import org.scribble.core.visit.STypeAgg; -import org.scribble.core.visit.STypeAggNoEx; +import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.util.ScribException; public abstract class Do @@ -50,13 +50,13 @@ public abstract Do reconstruct(CommonTree source, N proto, List roles, List> args); @Override - public T visit(STypeAgg v) throws ScribException + public T visitWith(STypeAgg v) throws ScribException { return v.visitDo(this); } @Override - public T visitNoThrow(STypeAggNoEx v) + public T visitWithNoThrow(STypeAggNoThrow v) { return v.visitDo(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java index a9afb2c61..bf6091e39 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java @@ -20,7 +20,7 @@ import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.RecVar; import org.scribble.core.visit.STypeAgg; -import org.scribble.core.visit.STypeAggNoEx; +import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.util.ScribException; public abstract class Recursion> @@ -42,13 +42,13 @@ public abstract Recursion reconstruct( CommonTree source, RecVar recvar, B body); @Override - public T visit(STypeAgg v) throws ScribException + public T visitWith(STypeAgg v) throws ScribException { return v.visitRecursion(this); } @Override - public T visitNoThrow(STypeAggNoEx v) + public T visitWithNoThrow(STypeAggNoThrow v) { return v.visitRecursion(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index 19d6a65e6..0dadc04b1 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -19,7 +19,7 @@ import org.scribble.core.lang.SNode; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.visit.STypeAgg; -import org.scribble.core.visit.STypeAggNoEx; +import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.util.ScribException; @@ -28,12 +28,8 @@ public interface SType> extends SNode { - T visit(STypeAgg v) throws ScribException; - T visitNoThrow(STypeAggNoEx v); - - /*// Wrappers for STypeVisitor around aggregate -- give B return for visitSeq, cf. STypeAgg - SType visitWith(STypeVisitor v) throws ScribException; - SType visitWithNoEx(STypeVisitorNoEx v);*/ + T visitWith(STypeAgg v) throws ScribException; + T visitWithNoThrow(STypeAggNoThrow v); // Pass in an STypeGatherer::visit, e.g., n.(new RoleGatherer()::visit) Stream gather(Function, Stream> f); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java index 1b95a82fb..1ed4702c9 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java @@ -21,7 +21,7 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; import org.scribble.core.visit.STypeAgg; -import org.scribble.core.visit.STypeAggNoEx; +import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.util.ScribException; public class GSeq extends Seq implements GType @@ -40,13 +40,13 @@ public GSeq reconstruct(CommonTree source, } @Override - public T visit(STypeAgg v) throws ScribException + public T visitWith(STypeAgg v) throws ScribException { return v.visitSeq(this); } @Override - public T visitNoThrow(STypeAggNoEx v) + public T visitWithNoThrow(STypeAggNoThrow v) { return v.visitSeq(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java index e2ebf06eb..3d119d024 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java @@ -21,7 +21,7 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; import org.scribble.core.visit.STypeAgg; -import org.scribble.core.visit.STypeAggNoEx; +import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.util.ScribException; public class LSeq extends Seq implements LType @@ -40,13 +40,13 @@ public LSeq reconstruct(CommonTree source, } @Override - public T visit(STypeAgg v) throws ScribException + public T visitWith(STypeAgg v) throws ScribException { return v.visitSeq(this); } @Override - public T visitNoThrow(STypeAggNoEx v) + public T visitWithNoThrow(STypeAggNoThrow v) { return v.visitSeq(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java index fd8553ce6..84a48d3f3 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java @@ -20,7 +20,7 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.STypeBase; import org.scribble.core.visit.STypeAgg; -import org.scribble.core.visit.STypeAggNoEx; +import org.scribble.core.visit.STypeAggNoThrow; // Used only *during* projection -- filtered out by GSeq::projection public class LSkip extends STypeBase implements LType @@ -33,13 +33,13 @@ private LSkip() } @Override - public T visit(STypeAgg v) + public T visitWith(STypeAgg v) { throw new RuntimeException("Unsupported for Skip: " + this); } @Override - public T visitNoThrow(STypeAggNoEx v) + public T visitWithNoThrow(STypeAggNoThrow v) { throw new RuntimeException("Unsupported for Skip: " + this); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java index 00f4a774c..6c57a0c74 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java @@ -32,7 +32,7 @@ public B visitSeq(B n) List> elems = new LinkedList<>(); for (SType e : n.elems) { - SType e1 = (SType) e.visitNoThrow(this); + SType e1 = (SType) e.visitWithNoThrow(this); if (e1 instanceof Seq) // cf. visitRecursion { elems.addAll(((Seq) e1).getElements()); // Handles empty Seq case diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java index 3afb4a6a3..26f6071ce 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java @@ -31,7 +31,7 @@ public T visitChoice(Choice n) throws ScribException List blocks = new LinkedList<>(); for (B b : n.blocks) { - //blocks.add(b.aggregate(this)); + //blocks.add(b.visitWith(this)); blocks.add(visitSeq(b)); } return agg(n, blocks.stream()); @@ -61,7 +61,7 @@ public > T visitDo(Do n) public T visitRecursion(Recursion n) throws ScribException { - //return agg(n, Stream.of(n.body.aggregate(this))); + //return agg(n, Stream.of(n.body.visitWith(this))); return agg(n, Stream.of(visitSeq(n.body))); } @@ -71,7 +71,7 @@ public T visitSeq(B n) throws ScribException List elems = new LinkedList<>(); for (SType e : n.elems) { - elems.add(e.visit(this)); + elems.add(e.visitWith(this)); } return agg(n, elems.stream()); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java similarity index 92% rename from scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java rename to scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java index 4b94cfad0..ef594df56 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoEx.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java @@ -14,7 +14,7 @@ import org.scribble.core.type.session.Seq; // Worth it to maintain alongside STypeAgg? -- does touch a lot of places -public abstract class STypeAggNoEx, T> +public abstract class STypeAggNoThrow, T> //extends STypeAgg // Not worth it, ex/no-ex method variants easily confused { // Internal use @@ -59,7 +59,7 @@ public T visitRecursion(Recursion n) // Param "hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction public T visitSeq(B n) { - return agg(n, n.elems.stream().map(x -> x.visitNoThrow(this))); + return agg(n, n.elems.stream().map(x -> x.visitWithNoThrow(this))); } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java index 08cea36bd..4e62de055 100755 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java @@ -61,7 +61,7 @@ public B visitSeq(B n) List> elems = new LinkedList<>(); for (SType e : n.elems) { - SType e1 = e.visitNoThrow(this); + SType e1 = e.visitWithNoThrow(this); if (e1 instanceof Seq) { elems.addAll(((Seq) e1).elems); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java index f8b0e9fa5..8f1e3348d 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java @@ -45,7 +45,7 @@ public B visitSeq(B n) List> elems = new LinkedList<>(); for (SType e : n.elems) { - SType e1 = e.visitNoThrow(this); + SType e1 = e.visitWithNoThrow(this); if (e1 instanceof Seq) { elems.addAll(((Seq) e1).elems); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java index b452f9e46..d62a5102f 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java @@ -86,7 +86,7 @@ public B visitSeq(B n) throws ScribException List> elems = new LinkedList<>(); for (SType e : n.elems) { - elems.add(e.visit(this)); + elems.add(e.visitWith(this)); } return n.reconstruct(n.getSource(), elems); // N.B. skipping agg (reconstruction done here) } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java index df45ba3bc..25f5ce3c7 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java @@ -12,7 +12,7 @@ // For comments, see STypeVisitor public abstract class STypeVisitorNoThrow> - extends STypeAggNoEx> + extends STypeAggNoThrow> { @Override protected final SType unit(SType n) @@ -45,7 +45,7 @@ public SType visitRecursion(Recursion n) @Override public B visitSeq(B n) { - List> elems = n.elems.stream().map(x -> x.visitNoThrow(this)) + List> elems = n.elems.stream().map(x -> x.visitWithNoThrow(this)) .collect(Collectors.toList()); return n.reconstruct(n.getSource(), elems); // N.B. skipping agg (reconstruction done here) } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index 8d07ebc4b..61305a265 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -31,11 +31,11 @@ import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.STypeAggNoEx; +import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.core.visit.local.SingleContinueChecker; // Pre: use on inlined (i.e., Do inlined, roles pruned) -public class InlinedProjector extends STypeAggNoEx +public class InlinedProjector extends STypeAggNoThrow { public final Job job; public final Role self; @@ -127,7 +127,7 @@ public LType visitRecursion(Recursion n) } Set rvs = new HashSet<>(); rvs.add(n.recvar); - if (body.visitNoThrow(new SingleContinueChecker(rvs))) + if (body.visitWithNoThrow(new SingleContinueChecker(rvs))) { return LSkip.SKIP; } @@ -138,7 +138,7 @@ public LType visitRecursion(Recursion n) @Override public LSeq visitSeq(GSeq n) { - List elems = n.elems.stream().map(x -> x.visitNoThrow(this)) + List elems = n.elems.stream().map(x -> x.visitWithNoThrow(this)) .filter(x -> !x.equals(LSkip.SKIP)).collect(Collectors.toList()); return new LSeq(null, elems); // Empty seqs converted to LSkip by GChoice/Recursion projection diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 25714b8dc..dca938263 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -75,7 +75,7 @@ public SType visitChoice(Choice n) if (elems.size() == 1) { //first.buildGraph(util); - first.visitNoThrow(this); + first.visitWithNoThrow(this); } else { @@ -83,13 +83,13 @@ public SType visitChoice(Choice n) EState nestedExit = util.newState(Collections.emptySet()); util.setExit(nestedExit); //first.buildGraph(util); - first.visitNoThrow(this); + first.visitWithNoThrow(this); util.setEntry(nestedExit); // Must be non null util.setExit(exit); LSeq tail = new LSeq(null, elems.subList(1, elems.size())); //tail.buildGraph(util); - tail.visitNoThrow(this); + tail.visitWithNoThrow(this); } EState init = nestedEntry; for (EAction a : (Iterable) @@ -116,7 +116,7 @@ else if (first instanceof LContinue) { util.pushChoiceBlock(); // CHECKME: still needed? LContinue doesn't check isUnguardedInChoice any more //block.buildGraph(util); - block.visitNoThrow(this); + block.visitWithNoThrow(this); util.popChoiceBlock(); } } @@ -202,7 +202,7 @@ public SType visitRecursion(Recursion n) this.util.addEntryLabel(n.recvar); this.util.pushRecursionEntry(n.recvar, this.util.getEntry()); //n.body.buildGraph(this.util); - n.body.visitNoThrow(this); + n.body.visitWithNoThrow(this); this.util.popRecursionEntry(n.recvar); return n; } @@ -225,14 +225,14 @@ public LSeq visitSeq(LSeq n) { util.setExit(exit); //next.buildGraph(util); - next.visitNoThrow(this); + next.visitWithNoThrow(this); } else { EState tmp = util.newState(Collections.emptySet()); util.setExit(tmp); //next.buildGraph(util); - next.visitNoThrow(this); + next.visitWithNoThrow(this); util.setEntry(util.getExit()); // CHECKME: exit may not be tmp, entry/exit can be modified, e.g. continue } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java index b17a9143d..7729ceb2e 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java @@ -71,7 +71,7 @@ public final > SType visitDo( public SType visitRecursion(Recursion n) throws ScribException { - n.body.visit(this); + n.body.visitWith(this); ReachabilityEnv env = getEnv(); if (env.recvars.contains(n.recvar)) { @@ -98,7 +98,7 @@ public LSeq visitSeq(LSeq n) throw new ScribException( "Illegal sequence: " + (prev == null ? "" : prev + "\n") + next); } - next.visit(this); + next.visitWith(this); } return n; } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java index 4d66a752c..b9015f14d 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java @@ -14,11 +14,11 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.STypeAggNoEx; +import org.scribble.core.visit.STypeAggNoThrow; // Return true iff this LType is "equivalent" to a single "continue X", where X is in rvs // Would be an "InlinedAgg" -public class SingleContinueChecker extends STypeAggNoEx +public class SingleContinueChecker extends STypeAggNoThrow { private Set rvs; @@ -65,6 +65,6 @@ public Boolean visitRecursion(Recursion n) @Override public Boolean visitSeq(LSeq n) { - return n.elems.size() == 1 && ((LType) n.elems.get(0)).visitNoThrow(this); + return n.elems.size() == 1 && ((LType) n.elems.get(0)).visitWithNoThrow(this); } } From a028938a62ac1b640739ec06d53b842737905190 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 21:37:17 +0100 Subject: [PATCH 242/539] Minor. --- .../src/main/java/org/scribble/core/type/session/SType.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index 0dadc04b1..a73668e7c 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -28,6 +28,9 @@ public interface SType> extends SNode { + // N.B. visitWith should be considered a "top-level" entry point only + // i.e., do not assume visitWith is called (or not) again during the recursive traversal + // (Typically, visitWith is called enroute to each visitNode, except for Seq, which is "entered directly" via visitSeq due to a generic typing issue) T visitWith(STypeAgg v) throws ScribException; T visitWithNoThrow(STypeAggNoThrow v); From 88ece49bdb0515d58295ce0b96604b9e23e4cf94 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 21:50:46 +0100 Subject: [PATCH 243/539] Minor. --- .../StateChannelApiGenerator.java | 4 +- .../main/java/org/scribble/core/job/Job.java | 3 +- .../org/scribble/core/job/JobContext.java | 21 ++-- .../scribble/core/lang/global/GProtocol.java | 95 +++++++++---------- .../scribble/core/lang/local/LProtocol.java | 10 +- .../core/visit/global/InlinedProjector.java | 28 ++++++ .../scribble/core/visit/global/ProjEnv.java | 58 ----------- .../scribble/core/visit/global/Projector.java | 5 +- .../core/visit/local/EGraphBuilder.java | 7 -- 9 files changed, 99 insertions(+), 132 deletions(-) delete mode 100644 scribble-core/src/main/java/org/scribble/core/visit/global/ProjEnv.java diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index f4203c2e5..0e5e342a8 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -29,7 +29,7 @@ import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.Role; -import org.scribble.core.visit.global.ProjEnv; +import org.scribble.core.visit.global.InlinedProjector; import org.scribble.lang.Lang; import org.scribble.util.ScribException; @@ -63,7 +63,7 @@ public StateChannelApiGenerator(Lang lang, GProtocolName fullname, Role self) super(lang, fullname); this.self = self; - this.lpn = ProjEnv.projectFullProtocolName(fullname, self); + this.lpn = InlinedProjector.getFullProjectionName(fullname, self); //this.init = job.getContext().getEndpointGraph(fullname, self).init; JobContext jobc2 = this.job.getContext(); this.init = this.job.config.args.get(JobArgs.MIN_EFSM) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index 139f4719b..d79b8203f 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -44,7 +44,6 @@ import org.scribble.core.visit.RoleGatherer; import org.scribble.core.visit.global.GTypeInliner; import org.scribble.core.visit.global.GTypeUnfolder; -import org.scribble.core.visit.global.ProjEnv; import org.scribble.util.ScribException; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models @@ -276,7 +275,7 @@ protected void runProjectionPasses() throws ScribException { for (Role self : g.roles) { - LProtocol proj = g.project(new ProjEnv(this, self)); // Does pruneRecs + LProtocol proj = g.project(this, self); // Does pruneRecs this.context.addProjection(proj); verbosePrintln("\nProjected onto " + self + ":\n" + proj); } diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java index 1384e8ca5..9e7a02fb2 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java @@ -31,7 +31,7 @@ import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.Role; -import org.scribble.core.visit.global.ProjEnv; +import org.scribble.core.visit.global.InlinedProjector; import org.scribble.util.ScribException; import org.scribble.util.ScribUtil; @@ -137,7 +137,7 @@ public void addInlinedProjection(LProtocolName fullname, LProtocol l) // Projected from inlined public LProtocol getInlinedProjection(GProtocolName fullname, Role self) { - LProtocolName p = ProjEnv.projectFullProtocolName(fullname, self); + LProtocolName p = InlinedProjector.getFullProjectionName(fullname, self); return getInlinedProjection(p); } @@ -164,7 +164,7 @@ public void addProjection(LProtocol p) LProtocol getProjection(GProtocolName fullname, Role role) throws ScribException { - return getProjection(ProjEnv.projectFullProtocolName(fullname, role)); + return getProjection(InlinedProjector.getFullProjectionName(fullname, role)); } public //Module @@ -192,7 +192,8 @@ protected void addEGraph(LProtocolName fullname, EGraph graph) public EGraph getEGraph(GProtocolName fullname, Role role) throws ScribException { - LProtocolName fulllpn = ProjEnv.projectFullProtocolName(fullname, role); + LProtocolName fulllpn = InlinedProjector.getFullProjectionName(fullname, + role); // Moved form LProtocolDecl EGraph graph = this.fEGraphs.get(fulllpn); if (graph == null) @@ -212,14 +213,17 @@ protected void addUnfairEGraph(LProtocolName fullname, EGraph graph) this.uEGraphs.put(fullname, graph); } - public EGraph getUnfairEGraph(GProtocolName fullname, Role role) throws ScribException + public EGraph getUnfairEGraph(GProtocolName fullname, Role role) + throws ScribException { - LProtocolName fulllpn = ProjEnv.projectFullProtocolName(fullname, role); + LProtocolName fulllpn = InlinedProjector.getFullProjectionName(fullname, + role); EGraph unfair = this.uEGraphs.get(fulllpn); if (unfair == null) { - unfair = getEGraph(fullname, role).init.unfairTransform(this.job.config.ef).toGraph(); + unfair = getEGraph(fullname, role).init + .unfairTransform(this.job.config.ef).toGraph(); addUnfairEGraph(fulllpn, unfair); } return unfair; @@ -295,7 +299,8 @@ protected void addMinimisedEGraph(LProtocolName fullname, EGraph graph) public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) throws ScribException { - LProtocolName fulllpn = ProjEnv.projectFullProtocolName(fullname, role); + LProtocolName fulllpn = InlinedProjector.getFullProjectionName(fullname, + role); EGraph minimised = this.mEGraphs.get(fulllpn); if (minimised == null) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 88d94bb5a..6ddd24d3c 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -59,7 +59,6 @@ import org.scribble.core.visit.Substitutor; import org.scribble.core.visit.global.ExtChoiceConsistencyChecker; import org.scribble.core.visit.global.InlinedProjector; -import org.scribble.core.visit.global.ProjEnv; import org.scribble.core.visit.global.Projector; import org.scribble.core.visit.global.RoleEnablingChecker; import org.scribble.util.ScribException; @@ -81,6 +80,53 @@ public GProtocol reconstruct(CommonTree source, { return new GProtocol(source, mods, fullname, roles, params, def); } + + public void checkRoleEnabling() throws ScribException + { + Set rs = this.roles.stream().collect(Collectors.toSet()); + RoleEnablingChecker v = new RoleEnablingChecker(rs); + this.def.visitWith(v); + } + + public void checkExtChoiceConsistency() throws ScribException + { + Map rs = this.roles.stream() + .collect(Collectors.toMap(x -> x, x -> x)); + ExtChoiceConsistencyChecker v = new ExtChoiceConsistencyChecker(rs); + this.def.visitWith(v); + } + + // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) + public LProjection projectInlined(Job job, Role self) + { + LSeq body = (LSeq) this.def + .visitWithNoThrow(new InlinedProjector(job, self)); + return projectAux(self, this.roles, body); + } + + public LProjection project(Job job, Role self) + { + LSeq body = (LSeq) this.def.visitWithNoThrow(new Projector(job, self)) + .visitWithNoThrow(new RecPruner<>()); + return projectAux(self, + job.getContext().getInlined(this.fullname).roles, // Used inlined decls, already pruned + body); + } + + private LProjection projectAux(Role self, List decls, LSeq body) + { + LProtocolName fullname = InlinedProjector + .getFullProjectionName(this.fullname, self); + Set tmp = body.gather(new RoleGatherer()::visit) + .collect(Collectors.toSet()); + List roles = decls.stream() + .filter(x -> x.equals(self) || tmp.contains(x)) // Implicitly filters Role.SELF + .collect(Collectors.toList()); + List> params = + new LinkedList<>(this.params); // CHECKME: filter params by usage? + return new LProjection(this.mods, fullname, roles, self, params, + this.fullname, body); + } // CHECKME: drop from Protocol (after removing Protocol from SType?) // Pre: stack.peek is the sig for the calling Do (or top-level entry) @@ -134,53 +180,6 @@ public GProtocol unfoldAllOnce(STypeUnfolder v) return reconstruct(getSource(), this.mods, this.fullname, this.roles, this.params, unf); } - - public void checkRoleEnabling() throws ScribException - { - Set rs = this.roles.stream().collect(Collectors.toSet()); - RoleEnablingChecker v = new RoleEnablingChecker(rs); - this.def.visitWith(v); - } - - public void checkExtChoiceConsistency() throws ScribException - { - Map rs = this.roles.stream() - .collect(Collectors.toMap(x -> x, x -> x)); - ExtChoiceConsistencyChecker v = new ExtChoiceConsistencyChecker(rs); - this.def.visitWith(v); - } - - // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) - public LProjection projectInlined(Job job, Role self) - { - LSeq body = (LSeq) this.def.visitWithNoThrow(new InlinedProjector(job, self)); - return projectAux(self, this.roles, body); - } - - private LProjection projectAux(Role self, List decls, LSeq body) - { - LProtocolName fullname = ProjEnv - .projectFullProtocolName(this.fullname, self); - Set tmp = //body.getRoles(); - body.gather(new RoleGatherer()::visit) - .collect(Collectors.toSet()); - List roles = decls.stream() - .filter(x -> x.equals(self) || tmp.contains(x)) // Implicitly filters Role.SELF - .collect(Collectors.toList()); - List> params = - new LinkedList<>(this.params); // CHECKME: filter params by usage? - return new LProjection(this.mods, fullname, roles, self, params, this.fullname, - body); - } - - public LProjection project(ProjEnv v) - { - LSeq body = (LSeq) this.def.visitWithNoThrow(new Projector(v.job, v.self)) - .visitWithNoThrow(new RecPruner<>()); - return projectAux(v.self, - v.job.getContext().getInlined(this.fullname).roles, // Used inlined decls, already pruned - body); - } @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 4e53c43c2..4dcc9e882 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -65,6 +65,11 @@ public LProtocol reconstruct(CommonTree source, { return new LProtocol(source, mods, fullname, roles, self, params, def); } + + public void checkReachability() throws ScribException + { + this.def.visitWith(new ReachabilityChecker()); + } // CHECKME: drop from Protocol (after removing Protocol from SType?) // Pre: stack.peek is the sig for the calling Do (or top-level entry) @@ -129,11 +134,6 @@ public EGraph toEGraph(Job job) this.def.visitWithNoThrow(b); return b.finalise(); } - - public void checkReachability() throws ScribException - { - this.def.visitWith(new ReachabilityChecker()); - } @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index 61305a265..317eec62f 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -8,6 +8,9 @@ import org.scribble.core.job.Job; import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; @@ -145,4 +148,29 @@ public LSeq visitSeq(GSeq n) // And a WF top-level protocol cannot produce empty LSeq // So a projection never contains an empty LSeq -- i.e., "empty choice/rec" pruning unnecessary } + + public static LProtocolName getSimpledProjectionName(GProtocolName simpname, + Role role) + { + return new LProtocolName(simpname.toString() + "_" + role.toString()); + } + + // Role is the target subprotocol parameter (not the current projector self -- actually the self just popped) -- ? + public static LProtocolName getFullProjectionName(GProtocolName fullname, + Role role) + { + LProtocolName simplename = InlinedProjector.getSimpledProjectionName( + fullname.getSimpleName(), role); + ModuleName modname = getProjectionModuleName(fullname.getPrefix(), simplename); + return new LProtocolName(modname, simplename); + } + + // fullname is the un-projected name; localname is the already projected simple name + public static ModuleName getProjectionModuleName(ModuleName fullname, + LProtocolName localname) + { + ModuleName simpname = new ModuleName( + fullname.getSimpleName().toString() + "_" + localname.toString()); + return new ModuleName(fullname.getPrefix(), simpname); // Supports unary fullname + } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/ProjEnv.java b/scribble-core/src/main/java/org/scribble/core/visit/global/ProjEnv.java deleted file mode 100644 index 6bfdf12ae..000000000 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/ProjEnv.java +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.core.visit.global; - -import org.scribble.core.job.Job; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.LProtocolName; -import org.scribble.core.type.name.ModuleName; -import org.scribble.core.type.name.Role; - -public class ProjEnv -{ - public final Job job; - public final Role self; - - public ProjEnv(Job job, Role self) - { - this.job = job; - this.self = self; - } - - public static LProtocolName projectSimpleProtocolName(GProtocolName simpname, - Role role) - { - return new LProtocolName(simpname.toString() + "_" + role.toString()); - } - - // Role is the target subprotocol parameter (not the current projector self -- actually the self just popped) - public static LProtocolName projectFullProtocolName(GProtocolName fullname, - Role role) - { - LProtocolName simplename = projectSimpleProtocolName( - fullname.getSimpleName(), role); - ModuleName modname = projectModuleName(fullname.getPrefix(), simplename); - return new LProtocolName(modname, simplename); - } - - // fullname is the un-projected name; localname is the already projected simple name - public static ModuleName projectModuleName(ModuleName fullname, - LProtocolName localname) - { - ModuleName simpname = new ModuleName( - fullname.getSimpleName().toString() + "_" + localname.toString()); - return new ModuleName(fullname.getPrefix(), simpname); // Supports unary - // fullname - } -} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java index 5975e386c..84436a0e3 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java @@ -19,13 +19,14 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; -// Pre: Use on parsed (intermed) +// Supports Do -- can use on parsed (intermed) public class Projector extends InlinedProjector // This way or the other way round? { public Projector(Job job, Role self) { super(job, self); } + @Override public > LType visitDo(Do n) { @@ -45,7 +46,7 @@ public > LType visitDo(Do n) return LSkip.SKIP; } - LProtocolName fullname = ProjEnv.projectFullProtocolName(proto, + LProtocolName fullname = InlinedProjector.getFullProjectionName(proto, targSelf); Substitutions subs = new Substitutions(imed.roles, n.roles, Collections.emptyList(), Collections.emptyList()); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index dca938263..5f5a54e8a 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -74,7 +74,6 @@ public SType visitChoice(Choice n) util.setEntry(nestedEntry); if (elems.size() == 1) { - //first.buildGraph(util); first.visitWithNoThrow(this); } else @@ -82,13 +81,11 @@ public SType visitChoice(Choice n) // Reuse existing b, to directly add continue-edges back to the "outer" graph EState nestedExit = util.newState(Collections.emptySet()); util.setExit(nestedExit); - //first.buildGraph(util); first.visitWithNoThrow(this); util.setEntry(nestedExit); // Must be non null util.setExit(exit); LSeq tail = new LSeq(null, elems.subList(1, elems.size())); - //tail.buildGraph(util); tail.visitWithNoThrow(this); } EState init = nestedEntry; @@ -115,7 +112,6 @@ else if (first instanceof LContinue) else { util.pushChoiceBlock(); // CHECKME: still needed? LContinue doesn't check isUnguardedInChoice any more - //block.buildGraph(util); block.visitWithNoThrow(this); util.popChoiceBlock(); } @@ -201,7 +197,6 @@ public SType visitRecursion(Recursion n) { this.util.addEntryLabel(n.recvar); this.util.pushRecursionEntry(n.recvar, this.util.getEntry()); - //n.body.buildGraph(this.util); n.body.visitWithNoThrow(this); this.util.popRecursionEntry(n.recvar); return n; @@ -224,14 +219,12 @@ public LSeq visitSeq(LSeq n) if (!i.hasNext()) { util.setExit(exit); - //next.buildGraph(util); next.visitWithNoThrow(this); } else { EState tmp = util.newState(Collections.emptySet()); util.setExit(tmp); - //next.buildGraph(util); next.visitWithNoThrow(this); util.setEntry(util.getExit()); // CHECKME: exit may not be tmp, entry/exit can be modified, e.g. continue From 0be88441e045e8645386a6a7bc1fa28b88d2beee Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 22:02:27 +0100 Subject: [PATCH 244/539] Continued: combining E/SModelFactory. --- .../java/org/scribble/lang/LangConfig.java | 3 - .../main/java/org/scribble/core/job/Job.java | 15 +- .../java/org/scribble/core/job/JobConfig.java | 9 +- .../core/model/endpoint/AutParser.java | 7 +- .../model/endpoint/EGraphBuilderUtil.java | 179 ++++-- .../model/endpoint/EGraphBuilderUtil2.java | 521 ------------------ .../core/model/endpoint/EModelFactory.java | 43 -- .../model/endpoint/EModelFactoryImpl.java | 81 --- .../scribble/core/model/endpoint/EState.java | 11 +- .../endpoint/IntermediateContinueEdge.java | 6 +- .../model/endpoint/IntermediateRecEdge.java | 6 +- .../core/model/endpoint/actions/EAccept.java | 7 +- .../core/model/endpoint/actions/EAction.java | 11 +- .../model/endpoint/actions/EDisconnect.java | 7 +- .../core/model/endpoint/actions/EReceive.java | 7 +- .../core/model/endpoint/actions/ERequest.java | 7 +- .../core/model/endpoint/actions/ESend.java | 7 +- .../model/endpoint/actions/EWrapClient.java | 7 +- .../model/endpoint/actions/EWrapServer.java | 7 +- .../scribble/core/model/global/SBuffers.java | 8 +- .../scribble/core/model/global/SConfig.java | 5 +- .../scribble/core/model/global/SGraph.java | 2 +- .../core/model/global/SGraphBuilderUtil.java | 10 +- .../scribble/core/model/global/SModel.java | 2 +- .../core/model/global/SModelFactory.java | 48 -- .../core/model/global/SModelFactoryImpl.java | 105 ---- .../scribble/core/model/global/SState.java | 2 +- .../core/visit/local/EGraphBuilder.java | 10 +- 28 files changed, 199 insertions(+), 934 deletions(-) delete mode 100644 scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java delete mode 100644 scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java delete mode 100644 scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java delete mode 100644 scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java delete mode 100644 scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java diff --git a/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java b/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java index 01e679c6f..968c9fd4f 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java +++ b/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java @@ -18,7 +18,6 @@ import org.scribble.ast.AstFactory; import org.scribble.core.job.JobArgs; -import org.scribble.core.model.endpoint.EModelFactory; import org.scribble.core.type.name.ModuleName; // The "static" (constant) info for Lang -- cf. LangContext "dynamic" state @@ -31,8 +30,6 @@ public class LangConfig public final AstFactory af; - public final EModelFactory ef = null; // FIXME: remove -- still referred to by old AST dels - // N.B. MainContext is in a different non-visible (by Maven) package public LangConfig(ModuleName mainFullname, Map args, AstFactory af) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index d79b8203f..f34eb1492 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -22,13 +22,12 @@ import org.scribble.core.lang.global.GProtocol; import org.scribble.core.lang.local.LProtocol; +import org.scribble.core.model.ModelFactory; +import org.scribble.core.model.ModelFactoryImpl; import org.scribble.core.model.endpoint.EGraph; -import org.scribble.core.model.endpoint.EGraphBuilderUtil2; -import org.scribble.core.model.endpoint.EModelFactory; -import org.scribble.core.model.endpoint.EModelFactoryImpl; +import org.scribble.core.model.endpoint.EGraphBuilderUtil; import org.scribble.core.model.global.SGraph; import org.scribble.core.model.global.SGraphBuilderUtil; -import org.scribble.core.model.global.SModelFactoryImpl; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.GProtocolName; @@ -68,8 +67,8 @@ public Job(ModuleName mainFullname, Map args, protected JobConfig newJobConfig(ModuleName mainFullname, Map args) { - EModelFactory ef = new EModelFactoryImpl(); - SModelFactoryImpl sf = new SModelFactoryImpl(); + ModelFactory ef = new ModelFactoryImpl(); + ModelFactoryImpl sf = new ModelFactoryImpl(); return new JobConfig(mainFullname, args, ef, sf); // CHECKME: combine E/SModelFactory? } @@ -91,9 +90,9 @@ public SGraphBuilderUtil newSGraphBuilderUtil() // TODO: deprecate, caller should go through config // A Scribble extension should override newJobConfig/Context/etc as appropriate - public EGraphBuilderUtil2 newEGraphBuilderUtil2() + public EGraphBuilderUtil newEGraphBuilderUtil() { - return new EGraphBuilderUtil2(this.config.ef); + return new EGraphBuilderUtil(this.config.ef); } //public SGraphBuilderUtil newSGraphBuilderUtil() // FIXME TODO global builder util diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java b/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java index ba6bca126..98656a2af 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java @@ -16,8 +16,7 @@ import java.util.Collections; import java.util.Map; -import org.scribble.core.model.endpoint.EModelFactory; -import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.ModelFactory; import org.scribble.core.type.name.ModuleName; // The "static" (constant) info for Jobs -- cf. JobContext "dynamic" state @@ -28,12 +27,12 @@ public class JobConfig public final Map args; - public final EModelFactory ef; - public final SModelFactory sf; + public final ModelFactory ef; + public final ModelFactory sf; // N.B. MainContext is in a different non-visible (by Maven) package public JobConfig(ModuleName main, Map args, - EModelFactory ef, SModelFactory sf) + ModelFactory ef, ModelFactory sf) { this.main = main; this.args = Collections.unmodifiableMap(args); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java index 34ed29ed5..34906f417 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java @@ -27,6 +27,7 @@ import java.util.stream.Collectors; import org.scribble.core.job.Job; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.MessageId; @@ -46,7 +47,7 @@ public AutParser(Job job) public EGraph parse(String aut) { - EModelFactory ef = this.job.config.ef; + ModelFactory ef = this.job.config.ef; //Map> edges = new HashMap<>(); Map> as = new HashMap<>(); @@ -115,7 +116,7 @@ public EGraph parse(String aut) } //EGraphBuilderUtil util = new EGraphBuilderUtil(ef); //EGraphBuilderUtil util = this.job2.newEGraphBuilderUtil2(); - EGraphBuilderUtil2 util = this.job.newEGraphBuilderUtil2(); + EGraphBuilderUtil util = this.job.newEGraphBuilderUtil(); //util.init(null); // FIXME: arg is deprecated Map map = new HashMap<>(); map.put(init, util.getEntry()); @@ -166,7 +167,7 @@ public EGraph parse(String aut) // Cf. getCommSymbol of IOActions // FIXME: simply do a match for getCommSymbol? - private static EAction parseIOAction(EModelFactory ef, String a) + private static EAction parseIOAction(ModelFactory ef, String a) { String peer; String action; diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index e6b2f3efb..89a4200e1 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -23,23 +23,30 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.core.model.GraphBuilderUtil; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; import org.scribble.util.ScribException; + // N.B. init must be called before every "new visit", including first -- no: now init implicit on construction, and finalise also does init +// FIXME TODO replace EGraphBuilderUtil // Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) // Tailored to support graph building from syntactic local protocol choice and recursion -@Deprecated public class EGraphBuilderUtil extends GraphBuilderUtil { - public final EModelFactory ef; + public final ModelFactory ef; // N.B. new states should be made by this.newState, not this.ef.newEState - private final Map> recvars = new HashMap<>(); - //private final Map>> enacting = new HashMap<>(); // First action(s) inside a rec scope ("enacting" means how to enact an unguarded choice-continue) + private final Map outerRecvars = new HashMap<>(); // FIXME: deprecate + private final Map> recvars = new HashMap<>(); // CHECKME: Deque is for shadowing? + + // First action(s) inside a rec scope ("enacting" means how to enact an unguarded choice-continue) + //private final Map>> enacting = new HashMap<>(); private final Map>> enacting = new HashMap<>(); // CHECKME: Set sufficient? or List? (consider non-determinism -- does it matter?) @@ -49,20 +56,35 @@ public class EGraphBuilderUtil private final Deque> pred = new LinkedList<>(); private final Deque> prev = new LinkedList<>(); - public EGraphBuilderUtil(EModelFactory ef) + public EGraphBuilderUtil(ModelFactory ef) { this.ef = ef; ////clear(); //reset(); + init(null); } + + /*// FIXME: cannot be reused for different protos, because of recvars and clear/reset + // CHECKME: refactor as factory method? (e.g., push?) + public EGraphBuilderUtil2(EGraphBuilderUtil2 b) + { + this.ef = b.ef; + init(null); // FIXME: init param not used + b.outerRecvars.entrySet().forEach(x -> + this.outerRecvars.put(x.getKey(), x.getValue())); + b.recvars.entrySet().forEach(x -> + this.outerRecvars.put(x.getKey(), x.getValue().peek())); + }*/ // N.B. must be called before every "new visit", including first + // FIXME: now cannot be reused for different protos, because of recvars and clear/reset @Override - public void init(EState init) // FIXME: init not used? + public void init(EState init) // FIXME: init not used (but inherited from super) { clear(); - reset(this.ef.newEState(Collections.emptySet()), - this.ef.newEState(Collections.emptySet())); + /*reset(this.ef.newEState(Collections.emptySet()), + this.ef.newEState(Collections.emptySet()));*/ + reset(newState(Collections.emptySet()), newState(Collections.emptySet())); } protected void clear() @@ -77,13 +99,22 @@ protected void clear() this.prev.push(new LinkedList<>()); this.enactingMap.clear(); + + this.states.clear(); } - /*@Override + private final Set states = new HashSet<>(); + + // For the util to additionally record states + // CHECKME: make interface less messy w.r.t. this.ef.newEState + //@Override public EState newState(Set labs) { - return new EState(labs); - }*/ + //return new EState(labs); + EState s = this.ef.newEState(labs); + this.states.add(s); + return s; + } // Records 's' as predecessor state, and 'a' as previous action and the "enacting action" for "fresh" recursion scopes @Override @@ -218,18 +249,18 @@ public void popChoiceBlock() /* * Dealing with Recursion contexts */ - public void pushRecursionEntry(RecVar recvar, EState entry) + public void pushRecursionEntry(RecVar rv, EState entry) { /*if (!isUnguardedInChoice()) // Don't record rec entry if it is an unguarded choice-rec { this.entry.addLabel(recvar); }*/ //this.recvars.put(recvar, this.entry); - Deque tmp = this.recvars.get(recvar); + Deque tmp = this.recvars.get(rv); if (tmp == null) { tmp = new LinkedList<>(); - this.recvars.put(recvar, tmp); + this.recvars.put(rv, tmp); } /*if (isUnguardedInChoice()) { @@ -242,25 +273,25 @@ public void pushRecursionEntry(RecVar recvar, EState entry) tmp.push(entry); //Deque> tmp2 = this.enacting.get(recvar); - Deque> tmp2 = this.enacting.get(recvar); + Deque> tmp2 = this.enacting.get(rv); if (tmp2 == null) { tmp2 = new LinkedList<>(); // New Stack for this recvar - this.enacting.put(recvar, tmp2); + this.enacting.put(rv, tmp2); } //tmp2.push(new HashSet<>()); // Push new Set element onto stack tmp2.push(new LinkedList<>()); // Push new Set element onto stack } - public void popRecursionEntry(RecVar recvar) + public void popRecursionEntry(RecVar rv) { - this.recvars.get(recvar).pop(); // Pop the entry of this rec + this.recvars.get(rv).pop(); // Pop the entry of this rec //Set pop = this.enacting.get(recvar).pop(); - List pop = this.enacting.get(recvar).pop(); - if (this.enacting.get(recvar).isEmpty()) // All Sets popped from the stack of this recvar + List pop = this.enacting.get(rv).pop(); + if (this.enacting.get(rv).isEmpty()) // All Sets popped from the stack of this recvar { - this.enacting.remove(recvar); + this.enacting.remove(rv); } EState curr = getEntry(); @@ -271,7 +302,7 @@ public void popRecursionEntry(RecVar recvar) tmp = new HashMap<>(); this.enactingMap.put(curr, tmp); } - tmp.put(recvar, pop); + tmp.put(rv, pop); } @@ -288,6 +319,7 @@ public boolean isUnguardedInChoice() } // Choice-unguarded continues -- fixed in finalise pass + // Now currently used for all continues, cf. LContinue::buildGraph public void addContinueEdge(EState s, RecVar rv) { /*this.contStates.add(s); @@ -318,6 +350,21 @@ public void addRecursionEdge(EState s, EAction a, EState succ) // Cf. LGraphBui } } } + + // Cf. add ContinueEdge + public void addRecursionEdge(EState s, EAction a, RecVar rv) + { + if (this.recvars.containsKey(rv)) + { + EState entry = getRecursionEntry(rv); + addEdge(s, a, entry); + } + else // FIXME: should now be obsolete + { + addEdgeAux(s, new IntermediateRecEdge(this.ef, a, rv), + newState(Stream.of(rv).collect(Collectors.toSet()))); + } + } // succ assumed to be this.getEntry() public void removeEdgeFromPredecessor(EState s, EAction a) @@ -342,6 +389,13 @@ public void removeEdgeFromPredecessor(EState s, EAction a) } throw new RuntimeException("Shouldn't get in here: " + s + ", " + a); } + + // CHECKME handle preds/prevs like above (cf. this.addEdge) + public void removeEdge(EState s, EAction a, EState succ) + throws ScribException + { + removeEdgeAux(s, a, succ); + } public List getPredecessors() { @@ -360,6 +414,13 @@ public EState getRecursionEntry(RecVar recvar) return this.recvars.get(recvar).peek(); } + // Returns List, cf. getAllSucessors/Actions + public List getAllPredecessors(EState s) + { + return this.states.stream().filter(x -> x.getAllSuccessors().contains(s)) + .collect(Collectors.toList()); + } + /* * Finalise graph by treating IntermediateContinueEdges @@ -368,82 +429,94 @@ public EGraph finalise() { /*EState res = new EState(this.entry.getLabels()); EState resTerm = new EState(this.exit.getLabels());*/ - EState res = this.entry.cloneNode(this.ef, this.entry.getLabels()); //this.ef.newEState(this.entry.getLabels()); - EState resTerm = this.exit.cloneNode(this.ef, this.exit.getLabels()); //this.ef.newEState(this.exit.getLabels()); + EState entry = this.entry.cloneNode(this.ef, this.entry.getLabels()); //this.ef.newEState(this.entry.getLabels()); + EState exit = this.exit.cloneNode(this.ef, this.exit.getLabels()); //this.ef.newEState(this.exit.getLabels()); Map map = new HashMap<>(); - map.put(this.entry, res); - map.put(this.exit, resTerm); + map.put(this.entry, entry); + map.put(this.exit, exit); Set seen = new HashSet<>(); - fixContinueEdges(seen, map, this.entry, res); + fixContinueEdges(seen, map, this.entry, entry); if (!seen.contains(this.exit)) { - resTerm = null; + exit = null; } /*Map all = getAllStates(res); EndpointState dfa = determinise(all, res, resTerm); System.out.println("111: " + dfa.toDot());*/ - return new EGraph(res, resTerm); + init(null); + + return new EGraph(entry, exit); } // FIXME: incomplete -- won't fully correctly handle situations involving, e.g., transitive continue-edge fixing? - protected void fixContinueEdges(Set seen, Map map, - EState curr, EState res) + protected void fixContinueEdges(Set seen, Map clones, + EState orig, EState clone) { - if (seen.contains(curr)) + if (seen.contains(orig)) { return; } - seen.add(curr); - Iterator as = curr.getAllActions().iterator(); - Iterator ss = curr.getAllSuccessors().iterator(); + seen.add(orig); + Iterator as = orig.getAllActions().iterator(); + Iterator ss = orig.getAllSuccessors().iterator(); while (as.hasNext()) { EAction a = as.next(); - EState succ = ss.next(); - EState next; - next = getNext(map, succ); + EState origSucc = ss.next(); + EState cloneSucc = getClone(clones, origSucc); - if (!(a instanceof IntermediateContinueEdge)) + if (!(a instanceof IntermediateContinueEdge) && !(a instanceof IntermediateRecEdge)) { - addEdgeAux(res, a, next); + addEdgeAux(clone, a, cloneSucc); - fixContinueEdges(seen, map, succ, next); + fixContinueEdges(seen, clones, origSucc, cloneSucc); + } + else if (a instanceof IntermediateRecEdge) + { + // TODO FIXME: won't handle deeper nesting of int-rev-edges -- need to keep int-rec-edge if succ is from futher out than parent level + // So need to record recvars as a stack of Maps + + addEdgeAux(clone, ((IntermediateRecEdge) a).action, + this.outerRecvars.get(origSucc.getLabels().iterator().next())); + // N.B. no recursive call, i.e., don't follow intermediate rec edge successors } else { IntermediateContinueEdge ice = (IntermediateContinueEdge) a; //for (IOAction e : this.enactingMap.get(succ)) RecVar rv = new RecVar(ice.mid.toString()); - for (EAction e : this.enactingMap.get(succ).get(rv)) + for (EAction e : this.enactingMap.get(origSucc).get(rv)) { - for (EState n : succ.getSuccessors(e)) + for (EState n : origSucc.getSuccessors(e)) { - next = getNext(map, n); - addEdgeAux(res, e, next); + cloneSucc = getClone(clones, n); + addEdgeAux(clone, e, cloneSucc); - fixContinueEdges(seen, map, succ, next); + fixContinueEdges(seen, clones, origSucc, cloneSucc); } } } } } - private EState getNext(Map map, EState succ) + private EState getClone(Map clones, EState orig) { - EState next; - if (map.containsKey(succ)) + EState res; + if (clones.containsKey(orig)) { - next = map.get(succ); + res = clones.get(orig); } else { //next = this.ef.newEState(succ.getLabels()); - next = succ.cloneNode(this.ef, succ.getLabels()); - map.put(succ, next); + res = orig.cloneNode(this.ef, orig.getLabels()); + clones.put(orig, res); } - return next; + return res; } } + + diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java deleted file mode 100644 index 5c4da9488..000000000 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil2.java +++ /dev/null @@ -1,521 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.core.model.endpoint; - -import java.util.Arrays; -import java.util.Collections; -import java.util.Deque; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import org.scribble.core.model.GraphBuilderUtil; -import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.RecVar; -import org.scribble.util.ScribException; - - // N.B. init must be called before every "new visit", including first -- no: now init implicit on construction, and finalise also does init -// FIXME TODO replace EGraphBuilderUtil -// Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) -// Tailored to support graph building from syntactic local protocol choice and recursion -public class EGraphBuilderUtil2 - extends GraphBuilderUtil -{ - public final EModelFactory ef; // N.B. new states should be made by this.newState, not this.ef.newEState - - private final Map outerRecvars = new HashMap<>(); // FIXME: deprecate - private final Map> recvars = new HashMap<>(); // CHECKME: Deque is for shadowing? - - // First action(s) inside a rec scope ("enacting" means how to enact an unguarded choice-continue) - //private final Map>> enacting = new HashMap<>(); - private final Map>> enacting = new HashMap<>(); - // CHECKME: Set sufficient? or List? (consider non-determinism -- does it matter?) - - //private final Map>> enactingMap = new HashMap<>(); // Record enacting per-recvar, since a state could have multi-recvars - private final Map>> enactingMap = new HashMap<>(); - - private final Deque> pred = new LinkedList<>(); - private final Deque> prev = new LinkedList<>(); - - public EGraphBuilderUtil2(EModelFactory ef) - { - this.ef = ef; - ////clear(); - //reset(); - init(null); - } - - /*// FIXME: cannot be reused for different protos, because of recvars and clear/reset - // CHECKME: refactor as factory method? (e.g., push?) - public EGraphBuilderUtil2(EGraphBuilderUtil2 b) - { - this.ef = b.ef; - init(null); // FIXME: init param not used - b.outerRecvars.entrySet().forEach(x -> - this.outerRecvars.put(x.getKey(), x.getValue())); - b.recvars.entrySet().forEach(x -> - this.outerRecvars.put(x.getKey(), x.getValue().peek())); - }*/ - - // N.B. must be called before every "new visit", including first - // FIXME: now cannot be reused for different protos, because of recvars and clear/reset - @Override - public void init(EState init) // FIXME: init not used (but inherited from super) - { - clear(); - /*reset(this.ef.newEState(Collections.emptySet()), - this.ef.newEState(Collections.emptySet()));*/ - reset(newState(Collections.emptySet()), newState(Collections.emptySet())); - } - - protected void clear() - { - this.recvars.clear(); - this.enacting.clear(); - - this.pred.clear(); - this.pred.push(new LinkedList<>()); - - this.prev.clear(); - this.prev.push(new LinkedList<>()); - - this.enactingMap.clear(); - - this.states.clear(); - } - - private final Set states = new HashSet<>(); - - // For the util to additionally record states - // CHECKME: make interface less messy w.r.t. this.ef.newEState - //@Override - public EState newState(Set labs) - { - //return new EState(labs); - EState s = this.ef.newEState(labs); - this.states.add(s); - return s; - } - - // Records 's' as predecessor state, and 'a' as previous action and the "enacting action" for "fresh" recursion scopes - @Override - public void addEdge(EState s, EAction a, EState succ) - { - addEdgeAux(s, a, succ); - - //if (!this.pred.isEmpty()) - { - this.pred.pop(); - this.prev.pop(); - } - this.pred.push(new LinkedList<>(Arrays.asList(s))); - this.prev.push(new LinkedList<>(Arrays.asList(a))); - - //for (Deque> ens : this.enacting.values()) - for (Deque> ens : this.enacting.values()) - { - if (!ens.isEmpty()) // Unnecessary? - { - //Set tmp = ens.peek(); - List tmp = ens.peek(); - if (tmp.isEmpty()) - { - tmp.add(a); - } - } - } - } - - - /* - * Dealing with Choice contexts - */ - public void enterChoice() - { - this.pred.push(new LinkedList<>()); - this.prev.push(new LinkedList<>()); - - for (RecVar rv : this.enacting.keySet()) - { - ////Deque> tmp = this.enacting.get(rv); - Deque> tmp = this.enacting.get(rv); - ////tmp.push(new HashSet<>(tmp.peek())); - //tmp.push(new HashSet<>()); // Initially empty to record nested enablings in choice blocks - tmp.push(new LinkedList<>()); // Initially empty to record nested enablings in choice blocks - } - } - - public void leaveChoice() - { - List pred = this.pred.pop(); - List prev = this.prev.pop(); - if (!pred.isEmpty()) - { - this.pred.pop(); - this.prev.pop(); - this.pred.push(pred); - this.prev.push(prev); - } - - for (RecVar rv : this.enacting.keySet()) - { - /*Set pop = this.enacting.get(rv).pop(); - Set peek = this.enacting.get(rv).peek();*/ - List pop = this.enacting.get(rv).pop(); - List peek = this.enacting.get(rv).peek(); - if (peek.isEmpty()) // Cf. addEdge - { - peek.addAll(pop); - } - } - } - - public void pushChoiceBlock() - { - this.pred.push(null); // Signifies following statement is "unguarded" in this choice block - this.prev.push(null); - - for (RecVar rv : this.enacting.keySet()) - { - //Deque> tmp = this.enacting.get(rv); - Deque> tmp = this.enacting.get(rv); - //tmp.push(new HashSet<>()); // Must be empty for addEdge to record (nested) enabling - tmp.push(new LinkedList<>()); - } - } - - public void popChoiceBlock() - { - List pred = this.pred.pop(); - List prev = this.prev.pop(); - - if (pred != null) // Unguarded choice-continue? - { - List peek1 = this.pred.peek(); - if (peek1 == null) - { - this.pred.pop(); - peek1 = new LinkedList<>(); - this.pred.push(peek1); - } - peek1.addAll(pred); - } - - if (prev != null) - { - List peek2 = this.prev.peek(); - if (peek2 == null) - { - this.prev.pop(); - peek2 = new LinkedList<>(); - this.prev.push(peek2); - } - peek2.addAll(prev); - } - - for (RecVar rv : this.enacting.keySet()) - { - /*Set pop = this.enacting.get(rv).pop(); - Set peek = this.enacting.get(rv).peek();*/ - List pop = this.enacting.get(rv).pop(); - List peek = this.enacting.get(rv).peek(); - //if (peek.isEmpty()) - { - peek.addAll(pop); - } - } - } - - - /* - * Dealing with Recursion contexts - */ - public void pushRecursionEntry(RecVar rv, EState entry) - { - /*if (!isUnguardedInChoice()) // Don't record rec entry if it is an unguarded choice-rec - { - this.entry.addLabel(recvar); - }*/ - //this.recvars.put(recvar, this.entry); - Deque tmp = this.recvars.get(rv); - if (tmp == null) - { - tmp = new LinkedList<>(); - this.recvars.put(rv, tmp); - } - /*if (isUnguardedInChoice()) - { - tmp.push(tmp.peek()); // Works because unguarded recs unfolded (including nested recvar shadowing -- if unguarded choice-rec, it will be unfolded and rec entry recorded for guarded unfolding) - } - else - { - tmp.push(this.entry); - }*/ - tmp.push(entry); - - //Deque> tmp2 = this.enacting.get(recvar); - Deque> tmp2 = this.enacting.get(rv); - if (tmp2 == null) - { - tmp2 = new LinkedList<>(); // New Stack for this recvar - this.enacting.put(rv, tmp2); - } - //tmp2.push(new HashSet<>()); // Push new Set element onto stack - tmp2.push(new LinkedList<>()); // Push new Set element onto stack - } - - public void popRecursionEntry(RecVar rv) - { - this.recvars.get(rv).pop(); // Pop the entry of this rec - - //Set pop = this.enacting.get(recvar).pop(); - List pop = this.enacting.get(rv).pop(); - if (this.enacting.get(rv).isEmpty()) // All Sets popped from the stack of this recvar - { - this.enacting.remove(rv); - } - - EState curr = getEntry(); - //Map> tmp = this.enactingMap.get(curr); - Map> tmp = this.enactingMap.get(curr); - if (tmp == null) - { - tmp = new HashMap<>(); - this.enactingMap.put(curr, tmp); - } - tmp.put(rv, pop); - } - - - /* - * Edge construction for Continues - */ - public boolean isUnguardedInChoice() - //public boolean isUnguardedInChoice(RecVar rv) - { - return - ////!this.entry.equals(this.root) && // Hacky? for protocols that start with unguarded choice-rec, e.g. choice at A { rec X { ... at root - //!this.pred.isEmpty() && // This and above fixed by initialising non-null pred/prev? - this.pred.peek() == null; - } - - // Choice-unguarded continues -- fixed in finalise pass - // Now currently used for all continues, cf. LContinue::buildGraph - public void addContinueEdge(EState s, RecVar rv) - { - /*this.contStates.add(s); - this.contRecVars.add(rv);*/ - EState entry = getRecursionEntry(rv); - addEdgeAux(s, new IntermediateContinueEdge(this.ef, rv), entry); - //addEdge(s, new IntermediateContinueEdge(rv), entry); // **FIXME: broken on purpose for testing - } - - // Doesn't set predecessor, cf. addEdge (and cf. addEdgeAux) - // Choice-guarded continues (can be done in one pass) - public void addRecursionEdge(EState s, EAction a, EState succ) // Cf. LGraphBuilder.addContinueEdge, for choice-unguarded cases -- addRecursionEdge, for guarded cases, should also be in LGraphBuilder, but here for convenience (private state) - { - addEdgeAux(s, a, succ); - - // Still needed here? - //for (Deque> ens : this.enacting.values()) - for (Deque> ens : this.enacting.values()) - { - if (!ens.isEmpty()) - { - //Set tmp = ens.peek(); - List tmp = ens.peek(); - if (tmp.isEmpty()) - { - tmp.add(a); - } - } - } - } - - // Cf. add ContinueEdge - public void addRecursionEdge(EState s, EAction a, RecVar rv) - { - if (this.recvars.containsKey(rv)) - { - EState entry = getRecursionEntry(rv); - addEdge(s, a, entry); - } - else // FIXME: should now be obsolete - { - addEdgeAux(s, new IntermediateRecEdge(this.ef, a, rv), - newState(Stream.of(rv).collect(Collectors.toSet()))); - } - } - - // succ assumed to be this.getEntry() - public void removeEdgeFromPredecessor(EState s, EAction a) - throws ScribException - // Removing prev edge, to be replaced by addRecursionEdge - { - //s.removeEdge(a, this.getEntry()); - removeEdgeAux(s, a, this.getEntry()); - //this.pred.peek().remove(s); // Need to update both preds and prevs accordingly (consider non-det) - Iterator preds = this.pred.peek().iterator(); - Iterator prevs = this.prev.peek().iterator(); - while (preds.hasNext()) - { - EState nexts = preds.next(); - EAction nexta = prevs.next(); - if (nexts.equals(s) && nexta.equals(a)) - { - preds.remove(); - prevs.remove(); - return; - } - } - throw new RuntimeException("Shouldn't get in here: " + s + ", " + a); - } - - // CHECKME handle preds/prevs like above (cf. this.addEdge) - public void removeEdge(EState s, EAction a, EState succ) - throws ScribException - { - removeEdgeAux(s, a, succ); - } - - public List getPredecessors() - { - //return this.pred.peek(); - return new LinkedList<>(this.pred.peek()); // Cf. removeEdgeFromPredecessor - } - - public List getPreviousActions() - { - //return this.prev.peek(); - return new LinkedList<>(this.prev.peek()); - } - - public EState getRecursionEntry(RecVar recvar) - { - return this.recvars.get(recvar).peek(); - } - - // Returns List, cf. getAllSucessors/Actions - public List getAllPredecessors(EState s) - { - return this.states.stream().filter(x -> x.getAllSuccessors().contains(s)) - .collect(Collectors.toList()); - } - - - /* - * Finalise graph by treating IntermediateContinueEdges - */ - public EGraph finalise() - { - /*EState res = new EState(this.entry.getLabels()); - EState resTerm = new EState(this.exit.getLabels());*/ - EState entry = this.entry.cloneNode(this.ef, this.entry.getLabels()); //this.ef.newEState(this.entry.getLabels()); - EState exit = this.exit.cloneNode(this.ef, this.exit.getLabels()); //this.ef.newEState(this.exit.getLabels()); - - Map map = new HashMap<>(); - map.put(this.entry, entry); - map.put(this.exit, exit); - Set seen = new HashSet<>(); - fixContinueEdges(seen, map, this.entry, entry); - if (!seen.contains(this.exit)) - { - exit = null; - } - - /*Map all = getAllStates(res); - EndpointState dfa = determinise(all, res, resTerm); - System.out.println("111: " + dfa.toDot());*/ - - init(null); - - return new EGraph(entry, exit); - } - - // FIXME: incomplete -- won't fully correctly handle situations involving, e.g., transitive continue-edge fixing? - protected void fixContinueEdges(Set seen, Map clones, - EState orig, EState clone) - { - if (seen.contains(orig)) - { - return; - } - seen.add(orig); - Iterator as = orig.getAllActions().iterator(); - Iterator ss = orig.getAllSuccessors().iterator(); - while (as.hasNext()) - { - EAction a = as.next(); - EState origSucc = ss.next(); - EState cloneSucc = getClone(clones, origSucc); - - if (!(a instanceof IntermediateContinueEdge) && !(a instanceof IntermediateRecEdge)) - { - addEdgeAux(clone, a, cloneSucc); - - fixContinueEdges(seen, clones, origSucc, cloneSucc); - } - else if (a instanceof IntermediateRecEdge) - { - // TODO FIXME: won't handle deeper nesting of int-rev-edges -- need to keep int-rec-edge if succ is from futher out than parent level - // So need to record recvars as a stack of Maps - - addEdgeAux(clone, ((IntermediateRecEdge) a).action, - this.outerRecvars.get(origSucc.getLabels().iterator().next())); - // N.B. no recursive call, i.e., don't follow intermediate rec edge successors - } - else - { - IntermediateContinueEdge ice = (IntermediateContinueEdge) a; - //for (IOAction e : this.enactingMap.get(succ)) - RecVar rv = new RecVar(ice.mid.toString()); - for (EAction e : this.enactingMap.get(origSucc).get(rv)) - { - for (EState n : origSucc.getSuccessors(e)) - { - cloneSucc = getClone(clones, n); - addEdgeAux(clone, e, cloneSucc); - - fixContinueEdges(seen, clones, origSucc, cloneSucc); - } - } - } - } - } - - private EState getClone(Map clones, EState orig) - { - EState res; - if (clones.containsKey(orig)) - { - res = clones.get(orig); - } - else - { - //next = this.ef.newEState(succ.getLabels()); - res = orig.cloneNode(this.ef, orig.getLabels()); - clones.put(orig, res); - } - return res; - } -} - - diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java deleted file mode 100644 index a37089d23..000000000 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.core.model.endpoint; - -import java.util.Set; - -import org.scribble.core.model.endpoint.actions.EAccept; -import org.scribble.core.model.endpoint.actions.EDisconnect; -import org.scribble.core.model.endpoint.actions.EReceive; -import org.scribble.core.model.endpoint.actions.ERequest; -import org.scribble.core.model.endpoint.actions.ESend; -import org.scribble.core.model.endpoint.actions.EWrapClient; -import org.scribble.core.model.endpoint.actions.EWrapServer; -import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Payload; - - -// Combine with SModelFactory? No point to separate? -public interface EModelFactory -{ - ESend newESend(Role peer, MessageId mid, Payload payload); - EReceive newEReceive(Role peer, MessageId mid, Payload payload); - ERequest newERequest(Role peer, MessageId mid, Payload payload); - EAccept newEAccept(Role peer, MessageId mid, Payload payload); - EDisconnect newEDisconnect(Role peer); - EWrapClient newEWrapClient(Role peer); - EWrapServer newEWrapServer(Role peer); - - EState newEState(Set labs); -} diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java deleted file mode 100644 index a21780383..000000000 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.core.model.endpoint; - -import java.util.Set; - -import org.scribble.core.model.endpoint.actions.EAccept; -import org.scribble.core.model.endpoint.actions.EDisconnect; -import org.scribble.core.model.endpoint.actions.EReceive; -import org.scribble.core.model.endpoint.actions.ERequest; -import org.scribble.core.model.endpoint.actions.ESend; -import org.scribble.core.model.endpoint.actions.EWrapClient; -import org.scribble.core.model.endpoint.actions.EWrapServer; -import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Payload; - -// Separate E/SModelFactories fits protected E/SState constructor pattern -public class EModelFactoryImpl implements EModelFactory -{ - - @Override - public ESend newESend(Role peer, MessageId mid, Payload payload) - { - return new ESend(this, peer, mid, payload); - } - - @Override - public EReceive newEReceive(Role peer, MessageId mid, Payload payload) - { - return new EReceive(this, peer, mid, payload); - } - - @Override - public ERequest newERequest(Role peer, MessageId mid, Payload payload) - { - return new ERequest(this, peer, mid, payload); - } - - @Override - public EAccept newEAccept(Role peer, MessageId mid, Payload payload) - { - return new EAccept(this, peer, mid, payload); - } - - @Override - public EDisconnect newEDisconnect(Role peer) - { - return new EDisconnect(this, peer); - } - - @Override - public EWrapClient newEWrapClient(Role peer) - { - return new EWrapClient(this, peer); - } - - @Override - public EWrapServer newEWrapServer(Role peer) - { - return new EWrapServer(this, peer); - } - - @Override - public EState newEState(Set labs) - { - return new EState(labs); - } -} diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index ff904426d..14aa09eae 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -26,6 +26,7 @@ import org.scribble.core.model.MPrettyState; import org.scribble.core.model.MState; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; @@ -35,7 +36,7 @@ // Label types used to be both RecVar and SubprotocolSigs; now using inlined protocol for FSM building so just RecVar public class EState extends MPrettyState { - protected EState(Set labs) + public EState(Set labs) { super(labs); } @@ -122,7 +123,7 @@ private static String getLabel(Map seen, EState s, Role r) // To be overridden by subclasses, to obtain the subclass nodes // FIXME: remove labs arg, and modify the underlying Set if needed? - protected EState cloneNode(EModelFactory ef, Set labs) + protected EState cloneNode(ModelFactory ef, Set labs) { //return ef.newEState(this.labs); return ef.newEState(labs); @@ -143,7 +144,7 @@ public EGraph toGraph() .. easier to implement as a direct check on the standard global model, rather than model hacking -- i.e. liveness is not just about terminal sets, but about "branching condition", c.f. julien? .. the issue is connect/accept -- makes direct check a bit more complicated, maybe value in doing it by model hacking to rely on standard liveness checking? .. should be fine, check set of roles on each path is equal, except for accept-guarded initial roles*/ - public EState unfairTransform(EModelFactory ef) + public EState unfairTransform(ModelFactory ef) { EState init = clone(ef); @@ -260,7 +261,7 @@ public EState unfairTransform(EModelFactory ef) } // Fully clones the reachable graph (i.e. the "general" graph -- cf., EGraph, the specific Scribble concept of an endpoint protocol graph) - protected EState clone(EModelFactory ef) + protected EState clone(ModelFactory ef) { Set all = new HashSet<>(); all.add(this); @@ -289,7 +290,7 @@ protected EState clone(EModelFactory ef) // i.e., this -a-> succ (maybe non-det) // Returns the clone of the subgraph rooted at succ, with all non- "this-a->succ" actions pruned from the clone of "this" state // i.e., we took "a" from "this" to get to succ (the subgraph root); if we enter "this" again (inside the subgraph), then always take "a" again - protected EState unfairClone(EModelFactory ef, EState term, EAction a, EState succ) // Need succ param for non-det + protected EState unfairClone(ModelFactory ef, EState term, EAction a, EState succ) // Need succ param for non-det { //EndpointState succ = take(a); Set all = new HashSet<>(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java index 2ac1bcf05..7c13ec328 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java @@ -13,8 +13,8 @@ */ package org.scribble.core.model.endpoint; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.model.global.SModelFactory; import org.scribble.core.model.global.actions.SAction; import org.scribble.core.type.name.Op; import org.scribble.core.type.name.RecVar; @@ -23,7 +23,7 @@ class IntermediateContinueEdge extends EAction { - public IntermediateContinueEdge(EModelFactory ef, RecVar rv) + public IntermediateContinueEdge(ModelFactory ef, RecVar rv) { super(ef, Role.EMPTY_ROLE, new Op(rv.toString()), Payload.EMPTY_PAYLOAD); // HACK } @@ -35,7 +35,7 @@ public EAction toDual(Role self) } @Override - public SAction toGlobal(SModelFactory sf, Role self) + public SAction toGlobal(ModelFactory sf, Role self) { throw new RuntimeException("Shouldn't get in here: " + this); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateRecEdge.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateRecEdge.java index 670a928b6..0ca30158b 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateRecEdge.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateRecEdge.java @@ -13,8 +13,8 @@ */ package org.scribble.core.model.endpoint; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.model.global.SModelFactory; import org.scribble.core.model.global.actions.SAction; import org.scribble.core.type.name.Op; import org.scribble.core.type.name.RecVar; @@ -27,7 +27,7 @@ class IntermediateRecEdge extends EAction { public final EAction action; - public IntermediateRecEdge(EModelFactory ef, EAction a, RecVar rv) + public IntermediateRecEdge(ModelFactory ef, EAction a, RecVar rv) { super(ef, Role.EMPTY_ROLE, new Op(rv.toString()), Payload.EMPTY_PAYLOAD); // HACK this.action = a; @@ -40,7 +40,7 @@ public EAction toDual(Role self) } @Override - public SAction toGlobal(SModelFactory sf, Role self) + public SAction toGlobal(ModelFactory sf, Role self) { throw new RuntimeException("Shouldn't get in here: " + this); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAccept.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAccept.java index 60108c1ef..63442e2b5 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAccept.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAccept.java @@ -13,8 +13,7 @@ */ package org.scribble.core.model.endpoint.actions; -import org.scribble.core.model.endpoint.EModelFactory; -import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.global.actions.SAccept; import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; @@ -22,7 +21,7 @@ public class EAccept extends EAction { - public EAccept(EModelFactory ef, Role peer, MessageId mid, Payload payload) + public EAccept(ModelFactory ef, Role peer, MessageId mid, Payload payload) //public Accept(Role peer) { super(ef, peer, mid, payload); @@ -37,7 +36,7 @@ public ERequest toDual(Role self) } @Override - public SAccept toGlobal(SModelFactory sf, Role self) + public SAccept toGlobal(ModelFactory sf, Role self) { return sf.newSAccept(self, this.peer, this.mid, this.payload); //return new GAccept(self, this.peer); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java index a5261aec9..2f3ee4c70 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java @@ -14,8 +14,7 @@ package org.scribble.core.model.endpoint.actions; import org.scribble.core.model.MAction; -import org.scribble.core.model.endpoint.EModelFactory; -import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.global.actions.SAction; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.MessageId; @@ -28,9 +27,9 @@ public abstract class EAction extends MAction /*public final MessageId mid; public final Payload payload; // Empty for MessageSigNames*/ - protected EModelFactory ef; + protected ModelFactory ef; - protected EAction(EModelFactory ef, Role peer, MessageId mid, Payload payload) + protected EAction(ModelFactory ef, Role peer, MessageId mid, Payload payload) { /*this.mid = mid; this.payload = payload;*/ @@ -40,7 +39,7 @@ protected EAction(EModelFactory ef, Role peer, MessageId mid, Payload payload this.ef = ef; } - public EModelFactory getEModelFactory() + public ModelFactory getEModelFactory() { return this.ef; } @@ -48,7 +47,7 @@ public EModelFactory getEModelFactory() public abstract EAction toDual(Role self); //public abstract GModelAction toGlobal(Role self); - public abstract SAction toGlobal(SModelFactory sf, Role self); + public abstract SAction toGlobal(ModelFactory sf, Role self); public boolean isSend() { diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java index 22fdccf3e..7cfd3f7a2 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java @@ -13,8 +13,7 @@ */ package org.scribble.core.model.endpoint.actions; -import org.scribble.core.model.endpoint.EModelFactory; -import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.global.actions.SDisconnect; import org.scribble.core.type.name.Op; import org.scribble.core.type.name.Role; @@ -22,7 +21,7 @@ public class EDisconnect extends EAction { - public EDisconnect(EModelFactory ef, Role peer) + public EDisconnect(ModelFactory ef, Role peer) { super(ef, peer, Op.EMPTY_OP, Payload.EMPTY_PAYLOAD); // Must correspond with GDisconnect.UNIT_MESSAGE_SIG_NODE } @@ -34,7 +33,7 @@ public EDisconnect toDual(Role self) } @Override - public SDisconnect toGlobal(SModelFactory sf, Role self) + public SDisconnect toGlobal(ModelFactory sf, Role self) { return sf.newSDisconnect(self, this.peer); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReceive.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReceive.java index 5c316b168..e000af883 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReceive.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReceive.java @@ -13,8 +13,7 @@ */ package org.scribble.core.model.endpoint.actions; -import org.scribble.core.model.endpoint.EModelFactory; -import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.global.actions.SReceive; import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; @@ -43,7 +42,7 @@ private Receive(Role peer, MessageId mid, Payload payload, boolean hack) super(peer, mid, payload); }*/ - public EReceive(EModelFactory ef, Role peer, MessageId mid, Payload payload) + public EReceive(ModelFactory ef, Role peer, MessageId mid, Payload payload) { super(ef, peer, mid, payload); //Receive.RECEIVES.add(this); @@ -58,7 +57,7 @@ public ESend toDual(Role self) @Override //public GModelAction toGlobal(Role self) - public SReceive toGlobal(SModelFactory sf, Role self) + public SReceive toGlobal(ModelFactory sf, Role self) { //return new GModelAction(this.peer, self, this.mid, this.payload); ////return GModelAction.get(this.peer, self, this.mid, this.payload); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERequest.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERequest.java index 4032a383d..16904ab3a 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERequest.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERequest.java @@ -13,8 +13,7 @@ */ package org.scribble.core.model.endpoint.actions; -import org.scribble.core.model.endpoint.EModelFactory; -import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.global.actions.SRequest; import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; @@ -22,7 +21,7 @@ public class ERequest extends EAction { - public ERequest(EModelFactory ef, Role peer, MessageId mid, Payload payload) + public ERequest(ModelFactory ef, Role peer, MessageId mid, Payload payload) //public Connect(Role peer) { super(ef, peer, mid, payload); @@ -37,7 +36,7 @@ public EAccept toDual(Role self) } @Override - public SRequest toGlobal(SModelFactory sf, Role self) + public SRequest toGlobal(ModelFactory sf, Role self) { //return new GConnect(self, this.peer); return sf.newSConnect(self, this.peer, this.mid, this.payload); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java index ea3684c5a..d1a831a15 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java @@ -13,8 +13,7 @@ */ package org.scribble.core.model.endpoint.actions; -import org.scribble.core.model.endpoint.EModelFactory; -import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.global.actions.SSend; import org.scribble.core.type.name.MessageId; import org.scribble.core.type.name.Role; @@ -43,7 +42,7 @@ public Send(Role peer, MessageId mid, Payload payload, boolean hack) super(peer, mid, payload); }*/ - public ESend(EModelFactory ef, Role peer, MessageId mid, Payload payload) + public ESend(ModelFactory ef, Role peer, MessageId mid, Payload payload) { super(ef, peer, mid, payload); //Send.SENDS.add(this); @@ -58,7 +57,7 @@ public EReceive toDual(Role self) @Override //public GModelAction toGlobal(Role self) - public SSend toGlobal(SModelFactory sf, Role self) + public SSend toGlobal(ModelFactory sf, Role self) { //return new GModelAction(self, this.peer, this.mid, this.payload); ////return GModelAction.get(self, this.peer, this.mid, this.payload); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapClient.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapClient.java index ba8de3b9b..f75435112 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapClient.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapClient.java @@ -13,8 +13,7 @@ */ package org.scribble.core.model.endpoint.actions; -import org.scribble.core.model.endpoint.EModelFactory; -import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.global.actions.SWrapClient; import org.scribble.core.type.name.Op; import org.scribble.core.type.name.Role; @@ -23,7 +22,7 @@ // Duplicated from Disconnect public class EWrapClient extends EAction { - public EWrapClient(EModelFactory ef, Role peer) + public EWrapClient(ModelFactory ef, Role peer) { super(ef, peer, Op.EMPTY_OP, Payload.EMPTY_PAYLOAD); // Must correspond with GWrap.UNIT_MESSAGE_SIG_NODE } @@ -35,7 +34,7 @@ public EWrapServer toDual(Role self) } @Override - public SWrapClient toGlobal(SModelFactory sf, Role self) + public SWrapClient toGlobal(ModelFactory sf, Role self) { return sf.newSWrapClient(self, this.peer); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapServer.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapServer.java index 6ca2361c6..fe41c47e7 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapServer.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapServer.java @@ -13,8 +13,7 @@ */ package org.scribble.core.model.endpoint.actions; -import org.scribble.core.model.endpoint.EModelFactory; -import org.scribble.core.model.global.SModelFactory; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.global.actions.SWrapServer; import org.scribble.core.type.name.Op; import org.scribble.core.type.name.Role; @@ -23,7 +22,7 @@ // Duplicated from Disconnect public class EWrapServer extends EAction { - public EWrapServer(EModelFactory ef, Role peer) + public EWrapServer(ModelFactory ef, Role peer) { super(ef, peer, Op.EMPTY_OP, Payload.EMPTY_PAYLOAD); // Must correspond with GWrap.UNIT_MESSAGE_SIG_NODE } @@ -35,7 +34,7 @@ public EWrapClient toDual(Role self) } @Override - public SWrapServer toGlobal(SModelFactory sf, Role self) + public SWrapServer toGlobal(ModelFactory sf, Role self) { return sf.newSWrapServer(self, this.peer); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java b/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java index 9bf6e0723..aad27b7d3 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java @@ -22,7 +22,7 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.core.model.endpoint.EModelFactory; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAccept; import org.scribble.core.model.endpoint.actions.EAction; @@ -36,12 +36,12 @@ public class SBuffers { - private final EModelFactory ef; // FIXME: only used by wrapable -- refactor? + private final ModelFactory ef; // FIXME: only used by wrapable -- refactor? private final Map> connected = new HashMap<>(); private final Map> buffs = new HashMap<>(); // dest -> src -> msg - public SBuffers(EModelFactory ef, Set roles, boolean implicit) + public SBuffers(ModelFactory ef, Set roles, boolean implicit) { this(ef, roles); @@ -62,7 +62,7 @@ public SBuffers(EModelFactory ef, Set roles, boolean implicit) } } - public SBuffers(EModelFactory ef, Set roles) + public SBuffers(ModelFactory ef, Set roles) { this.ef = ef; diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index c6bd34cb6..6b29f4ed6 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -24,6 +24,7 @@ import java.util.Set; import java.util.stream.Collectors; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.endpoint.EFSM; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.EStateKind; @@ -39,7 +40,7 @@ public class SConfig { - protected final SModelFactory sf; + protected final ModelFactory sf; //public final Map states; public final Map efsms; @@ -47,7 +48,7 @@ public class SConfig //public WFConfig(Map state, Map> buff) //public WFConfig(Map state, WFBuffers buffs) - protected SConfig(SModelFactory sf, Map state, SBuffers buffs) + public SConfig(ModelFactory sf, Map state, SBuffers buffs) { this.sf = sf; diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java index c75c36fb1..e1286a84c 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java @@ -41,7 +41,7 @@ public class SGraph implements MPrettyPrint private Set> termSets; // Unlike EState, SGraph is not just a "simple wrapper" for an existing graph of nodes -- it is a "semantic structure" that needs to be fully built properly (so no arbitrary "toGraph" method; cf., EState) - protected SGraph(GProtocolName proto, Map states, SState init) + public SGraph(GProtocolName proto, Map states, SState init) { this.proto = proto; this.init = init; diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index 0d82a1c99..94887ce49 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -24,9 +24,9 @@ import org.scribble.core.job.Job; import org.scribble.core.job.JobArgs; import org.scribble.core.model.GraphBuilderUtil; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.endpoint.EFSM; import org.scribble.core.model.endpoint.EGraph; -import org.scribble.core.model.endpoint.EModelFactory; import org.scribble.core.model.endpoint.EStateKind; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.model.global.actions.SAction; @@ -37,9 +37,9 @@ public class SGraphBuilderUtil extends GraphBuilderUtil { - public final SModelFactory sf; + public final ModelFactory sf; - protected SGraphBuilderUtil(SModelFactory sf) + public SGraphBuilderUtil(ModelFactory sf) { this.sf = sf; //reset(); @@ -55,7 +55,7 @@ public void init(SState init) } // Do as an initial state rather than config? - protected SConfig createInitialSConfig(EModelFactory ef, Map egraphs, boolean explicit) // FIXME: ef + protected SConfig createInitialSConfig(ModelFactory ef, Map egraphs, boolean explicit) // FIXME: ef { Map efsms = egraphs.entrySet().stream().collect(Collectors.toMap(Entry::getKey, e -> e.getValue().toFsm())); SBuffers b0 = new SBuffers(ef, efsms.keySet(), !explicit); @@ -193,7 +193,7 @@ else if (a.isWrapClient() || a.isWrapServer()) return graph; } - private void getNextStates(SModelFactory sf, LinkedHashSet todo, + private void getNextStates(ModelFactory sf, LinkedHashSet todo, Map seen, SState curr, SAction a, List nexts) { for (SConfig next : nexts) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index 89c3a2ff7..141a4abb7 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -33,7 +33,7 @@ public class SModel { public final SGraph graph; - protected SModel(SGraph graph) + public SModel(SGraph graph) { this.graph = graph; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java deleted file mode 100644 index 3228754ae..000000000 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.core.model.global; - -import java.util.Map; - -import org.scribble.core.model.endpoint.EFSM; -import org.scribble.core.model.global.actions.SAccept; -import org.scribble.core.model.global.actions.SDisconnect; -import org.scribble.core.model.global.actions.SReceive; -import org.scribble.core.model.global.actions.SRequest; -import org.scribble.core.model.global.actions.SSend; -import org.scribble.core.model.global.actions.SWrapClient; -import org.scribble.core.model.global.actions.SWrapServer; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Payload; - -// Combine with EModelFactory? No point to separate? -public interface SModelFactory -{ - SGraphBuilderUtil newSGraphBuilderUtil(); // Directly created and used by Job.buildSGraph -- cf. EGraphBuilderUtil, encapsulated by EGraphBuilder AST visitor - - SSend newSSend(Role subj, Role obj, MessageId mid, Payload payload); - SReceive newSReceive(Role subj, Role obj, MessageId mid, Payload payload); - SRequest newSConnect(Role subj, Role obj, MessageId mid, Payload payload); - SAccept newSAccept(Role subj, Role obj, MessageId mid, Payload payload); - SDisconnect newSDisconnect(Role subj, Role obj); - SWrapClient newSWrapClient(Role subj, Role obj); - SWrapServer newSWrapServer(Role subj, Role obj); - - SState newSState(SConfig config); - SGraph newSGraph(GProtocolName proto, Map states, SState init); - SConfig newSConfig(Map state, SBuffers buffs); - SModel newSModel(SGraph g); -} diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java deleted file mode 100644 index 0db717b9d..000000000 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.core.model.global; - -import java.util.Map; - -import org.scribble.core.model.endpoint.EFSM; -import org.scribble.core.model.global.actions.SAccept; -import org.scribble.core.model.global.actions.SDisconnect; -import org.scribble.core.model.global.actions.SReceive; -import org.scribble.core.model.global.actions.SRequest; -import org.scribble.core.model.global.actions.SSend; -import org.scribble.core.model.global.actions.SWrapClient; -import org.scribble.core.model.global.actions.SWrapServer; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Payload; - -// Separate E/SModelFactories fits protected E/SState constructor pattern -public class SModelFactoryImpl implements SModelFactory -{ - @Override - public SGraphBuilderUtil newSGraphBuilderUtil() - { - return new SGraphBuilderUtil(this); - } - - @Override - public SSend newSSend(Role subj, Role obj, MessageId mid, Payload payload) - { - return new SSend(subj, obj, mid, payload); - } - - @Override - public SReceive newSReceive(Role subj, Role obj, MessageId mid, Payload payload) - { - return new SReceive(subj, obj, mid, payload); - } - - @Override - public SRequest newSConnect(Role subj, Role obj, MessageId mid, Payload payload) - { - return new SRequest(subj, obj, mid, payload); - } - - @Override - public SAccept newSAccept(Role subj, Role obj, MessageId mid, Payload payload) - { - return new SAccept(subj, obj, mid, payload); - } - - @Override - public SDisconnect newSDisconnect(Role subj, Role obj) - { - return new SDisconnect(subj, obj); - } - - @Override - public SWrapClient newSWrapClient(Role subj, Role obj) - { - return new SWrapClient(subj, obj); - } - - @Override - public SWrapServer newSWrapServer(Role subj, Role obj) - { - return new SWrapServer(subj, obj); - } - - @Override - public SState newSState(SConfig config) - { - return new SState(config); - } - - @Override - public SGraph newSGraph(GProtocolName proto, Map states, SState init) - { - return new SGraph(proto, states, init); - } - - @Override - public SConfig newSConfig(Map state, SBuffers buffs) - { - return new SConfig(this, state, buffs); - } - - @Override - public SModel newSModel(SGraph g) - { - return new SModel(g); - } -} diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java index cc30fb33a..fc192606a 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java @@ -35,7 +35,7 @@ public class SState extends MPrettyState public final SConfig config; //protected SState(SConfig config) - protected SState(SConfig config) // FIXME: now publically mutable + public SState(SConfig config) // FIXME: now publically mutable { super(Collections.emptySet()); this.config = config; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 5f5a54e8a..6e54d03c2 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -7,7 +7,7 @@ import org.scribble.core.job.Job; import org.scribble.core.model.endpoint.EGraph; -import org.scribble.core.model.endpoint.EGraphBuilderUtil2; +import org.scribble.core.model.endpoint.EGraphBuilderUtil; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.kind.Local; @@ -42,12 +42,12 @@ public class EGraphBuilder extends STypeVisitorNoThrow { public final Job job; - private EGraphBuilderUtil2 util; + private EGraphBuilderUtil util; public EGraphBuilder(Job job) { this.job = job; - this.util = job.newEGraphBuilderUtil2(); + this.util = job.newEGraphBuilderUtil(); this.util.init(null); } @@ -59,7 +59,7 @@ public EGraph finalise() @Override public SType visitChoice(Choice n) { - EGraphBuilderUtil2 util = this.util; + EGraphBuilderUtil util = this.util; util.enterChoice(); for (LSeq block : n.blocks) { @@ -205,7 +205,7 @@ public SType visitRecursion(Recursion n) @Override public LSeq visitSeq(LSeq n) { - EGraphBuilderUtil2 util = this.util; + EGraphBuilderUtil util = this.util; EState entry = util.getEntry(); EState exit = util.getExit(); List elems = n.getElements(); From 70d5fcab86ccb94a13241049ace35ac52e91a974 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 22:03:03 +0100 Subject: [PATCH 245/539] Added missing files. --- .../org/scribble/core/model/ModelFactory.java | 74 ++++++++ .../scribble/core/model/ModelFactoryImpl.java | 170 ++++++++++++++++++ 2 files changed, 244 insertions(+) create mode 100644 scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java create mode 100644 scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java new file mode 100644 index 000000000..f5411d62f --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java @@ -0,0 +1,74 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.model; + +import java.util.Map; +import java.util.Set; + +import org.scribble.core.model.endpoint.EFSM; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAccept; +import org.scribble.core.model.endpoint.actions.EDisconnect; +import org.scribble.core.model.endpoint.actions.EReceive; +import org.scribble.core.model.endpoint.actions.ERequest; +import org.scribble.core.model.endpoint.actions.ESend; +import org.scribble.core.model.endpoint.actions.EWrapClient; +import org.scribble.core.model.endpoint.actions.EWrapServer; +import org.scribble.core.model.global.SBuffers; +import org.scribble.core.model.global.SConfig; +import org.scribble.core.model.global.SGraph; +import org.scribble.core.model.global.SGraphBuilderUtil; +import org.scribble.core.model.global.SModel; +import org.scribble.core.model.global.SState; +import org.scribble.core.model.global.actions.SAccept; +import org.scribble.core.model.global.actions.SDisconnect; +import org.scribble.core.model.global.actions.SReceive; +import org.scribble.core.model.global.actions.SRequest; +import org.scribble.core.model.global.actions.SSend; +import org.scribble.core.model.global.actions.SWrapClient; +import org.scribble.core.model.global.actions.SWrapServer; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; + +// Combine with EModelFactory? No point to separate? +public interface ModelFactory +{ + ESend newESend(Role peer, MessageId mid, Payload payload); + EReceive newEReceive(Role peer, MessageId mid, Payload payload); + ERequest newERequest(Role peer, MessageId mid, Payload payload); + EAccept newEAccept(Role peer, MessageId mid, Payload payload); + EDisconnect newEDisconnect(Role peer); + EWrapClient newEWrapClient(Role peer); + EWrapServer newEWrapServer(Role peer); + + EState newEState(Set labs); + + SGraphBuilderUtil newSGraphBuilderUtil(); // Directly created and used by Job.buildSGraph -- cf. EGraphBuilderUtil, encapsulated by EGraphBuilder AST visitor + + SSend newSSend(Role subj, Role obj, MessageId mid, Payload payload); + SReceive newSReceive(Role subj, Role obj, MessageId mid, Payload payload); + SRequest newSConnect(Role subj, Role obj, MessageId mid, Payload payload); + SAccept newSAccept(Role subj, Role obj, MessageId mid, Payload payload); + SDisconnect newSDisconnect(Role subj, Role obj); + SWrapClient newSWrapClient(Role subj, Role obj); + SWrapServer newSWrapServer(Role subj, Role obj); + + SState newSState(SConfig config); + SGraph newSGraph(GProtocolName proto, Map states, SState init); + SConfig newSConfig(Map state, SBuffers buffs); + SModel newSModel(SGraph g); +} diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java new file mode 100644 index 000000000..bbe7ff482 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java @@ -0,0 +1,170 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.model; + +import java.util.Map; +import java.util.Set; + +import org.scribble.core.model.endpoint.EFSM; +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAccept; +import org.scribble.core.model.endpoint.actions.EDisconnect; +import org.scribble.core.model.endpoint.actions.EReceive; +import org.scribble.core.model.endpoint.actions.ERequest; +import org.scribble.core.model.endpoint.actions.ESend; +import org.scribble.core.model.endpoint.actions.EWrapClient; +import org.scribble.core.model.endpoint.actions.EWrapServer; +import org.scribble.core.model.global.SBuffers; +import org.scribble.core.model.global.SConfig; +import org.scribble.core.model.global.SGraph; +import org.scribble.core.model.global.SGraphBuilderUtil; +import org.scribble.core.model.global.SModel; +import org.scribble.core.model.global.SState; +import org.scribble.core.model.global.actions.SAccept; +import org.scribble.core.model.global.actions.SDisconnect; +import org.scribble.core.model.global.actions.SReceive; +import org.scribble.core.model.global.actions.SRequest; +import org.scribble.core.model.global.actions.SSend; +import org.scribble.core.model.global.actions.SWrapClient; +import org.scribble.core.model.global.actions.SWrapServer; +import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; + +// Separate E/SModelFactories fits protected E/SState constructor pattern +public class ModelFactoryImpl implements ModelFactory +{ + + @Override + public ESend newESend(Role peer, MessageId mid, Payload payload) + { + return new ESend(this, peer, mid, payload); + } + + @Override + public EReceive newEReceive(Role peer, MessageId mid, Payload payload) + { + return new EReceive(this, peer, mid, payload); + } + + @Override + public ERequest newERequest(Role peer, MessageId mid, Payload payload) + { + return new ERequest(this, peer, mid, payload); + } + + @Override + public EAccept newEAccept(Role peer, MessageId mid, Payload payload) + { + return new EAccept(this, peer, mid, payload); + } + + @Override + public EDisconnect newEDisconnect(Role peer) + { + return new EDisconnect(this, peer); + } + + @Override + public EWrapClient newEWrapClient(Role peer) + { + return new EWrapClient(this, peer); + } + + @Override + public EWrapServer newEWrapServer(Role peer) + { + return new EWrapServer(this, peer); + } + + @Override + public EState newEState(Set labs) + { + return new EState(labs); + } + + @Override + public SGraphBuilderUtil newSGraphBuilderUtil() + { + return new SGraphBuilderUtil(this); + } + + @Override + public SSend newSSend(Role subj, Role obj, MessageId mid, Payload payload) + { + return new SSend(subj, obj, mid, payload); + } + + @Override + public SReceive newSReceive(Role subj, Role obj, MessageId mid, Payload payload) + { + return new SReceive(subj, obj, mid, payload); + } + + @Override + public SRequest newSConnect(Role subj, Role obj, MessageId mid, Payload payload) + { + return new SRequest(subj, obj, mid, payload); + } + + @Override + public SAccept newSAccept(Role subj, Role obj, MessageId mid, Payload payload) + { + return new SAccept(subj, obj, mid, payload); + } + + @Override + public SDisconnect newSDisconnect(Role subj, Role obj) + { + return new SDisconnect(subj, obj); + } + + @Override + public SWrapClient newSWrapClient(Role subj, Role obj) + { + return new SWrapClient(subj, obj); + } + + @Override + public SWrapServer newSWrapServer(Role subj, Role obj) + { + return new SWrapServer(subj, obj); + } + + @Override + public SState newSState(SConfig config) + { + return new SState(config); + } + + @Override + public SGraph newSGraph(GProtocolName proto, Map states, SState init) + { + return new SGraph(proto, states, init); + } + + @Override + public SConfig newSConfig(Map state, SBuffers buffs) + { + return new SConfig(this, state, buffs); + } + + @Override + public SModel newSModel(SGraph g) + { + return new SModel(g); + } +} From 7e675d34e048306a441f3914e0b7f10be2fb3bff Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 22:09:41 +0100 Subject: [PATCH 246/539] Continued: combining E/SModelFactory. --- .../main/java/org/scribble/core/job/Job.java | 9 +++---- .../java/org/scribble/core/job/JobConfig.java | 15 ++++------- .../org/scribble/core/job/JobContext.java | 6 ++--- .../scribble/core/lang/global/GProtocol.java | 20 +++++++-------- .../scribble/core/lang/local/LProtocol.java | 2 +- .../org/scribble/core/model/ModelFactory.java | 1 - .../{AutParser.java => AutGraphParser.java} | 6 ++--- .../core/model/global/SGraphBuilderUtil.java | 25 ++++++++++--------- 8 files changed, 39 insertions(+), 45 deletions(-) rename scribble-core/src/main/java/org/scribble/core/model/endpoint/{AutParser.java => AutGraphParser.java} (98%) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index f34eb1492..db36b5499 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -67,9 +67,8 @@ public Job(ModuleName mainFullname, Map args, protected JobConfig newJobConfig(ModuleName mainFullname, Map args) { - ModelFactory ef = new ModelFactoryImpl(); - ModelFactoryImpl sf = new ModelFactoryImpl(); - return new JobConfig(mainFullname, args, ef, sf); + ModelFactory mf = new ModelFactoryImpl(); + return new JobConfig(mainFullname, args, mf); // CHECKME: combine E/SModelFactory? } @@ -85,14 +84,14 @@ protected JobContext newJobContext(//Map modcs, // A Scribble extension should override newJobConfig/Context/etc as appropriate public SGraphBuilderUtil newSGraphBuilderUtil() { - return this.config.sf.newSGraphBuilderUtil(); + return this.config.mf.newSGraphBuilderUtil(); } // TODO: deprecate, caller should go through config // A Scribble extension should override newJobConfig/Context/etc as appropriate public EGraphBuilderUtil newEGraphBuilderUtil() { - return new EGraphBuilderUtil(this.config.ef); + return new EGraphBuilderUtil(this.config.mf); } //public SGraphBuilderUtil newSGraphBuilderUtil() // FIXME TODO global builder util diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java b/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java index 98656a2af..e7fc73707 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java @@ -22,21 +22,16 @@ // The "static" (constant) info for Jobs -- cf. JobContext "dynamic" state public class JobConfig { - public final ModuleName main; // Full name - // CHECKME: verbose/debug printing parameter? - - public final Map args; - - public final ModelFactory ef; - public final ModelFactory sf; + public final ModuleName main; // Full name + public final Map args; // CHECKME: verbose/debug printing parameter ? + public final ModelFactory mf; // N.B. MainContext is in a different non-visible (by Maven) package public JobConfig(ModuleName main, Map args, - ModelFactory ef, ModelFactory sf) + ModelFactory ef) { this.main = main; this.args = Collections.unmodifiableMap(args); - this.ef = ef; - this.sf = sf; + this.mf = ef; } } diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java index 9e7a02fb2..afe80e5a9 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java @@ -24,7 +24,7 @@ import org.scribble.core.lang.global.GProtocol; import org.scribble.core.lang.local.LProtocol; -import org.scribble.core.model.endpoint.AutParser; +import org.scribble.core.model.endpoint.AutGraphParser; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.global.SGraph; import org.scribble.core.type.name.GProtocolName; @@ -223,7 +223,7 @@ public EGraph getUnfairEGraph(GProtocolName fullname, Role role) if (unfair == null) { unfair = getEGraph(fullname, role).init - .unfairTransform(this.job.config.ef).toGraph(); + .unfairTransform(this.job.config.mf).toGraph(); addUnfairEGraph(fulllpn, unfair); } return unfair; @@ -307,7 +307,7 @@ public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) { String aut = runAut(getEGraph(fullname, role).init.toAut(), fulllpn + ".aut"); - minimised = new AutParser(this.job).parse(aut); + minimised = new AutGraphParser(this.job).parse(aut); addMinimisedEGraph(fulllpn, minimised); } return minimised; diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 6ddd24d3c..9d57da828 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -220,25 +220,25 @@ public boolean canEquals(Object o) // TODO FIXME: refactor following methods (e.g., make non-static?) - public static void validateByScribble(Job job2, GProtocolName fullname, + public static void validateByScribble(Job job, GProtocolName fullname, boolean fair) throws ScribException { - JobContext jc = job2.getContext(); + JobContext jc = job.getContext(); SGraph graph = (fair) ? jc.getSGraph(fullname) : jc.getUnfairSGraph(fullname); //graph.toModel().validate(job); - job2.config.sf.newSModel(graph).validate(job2); + job.config.mf.newSModel(graph).validate(job); } - public static void validateBySpin(Job job2, GProtocolName fullname) + public static void validateBySpin(Job job, GProtocolName fullname) throws ScribException { - JobContext jobc2 = job2.getContext(); + JobContext jobc = job.getContext(); /*Module mod = jc.getModule(fullname.getPrefix()); GProtocolDecl gpd = (GProtocolDecl) mod .getProtocolDeclChild(fullname.getSimpleName());*/ - GProtocol gpd = jobc2.getInlined(fullname); + GProtocol gpd = jobc.getInlined(fullname); List rs = //gpd.getHeaderChild().getRoleDeclListChild().getRoles() gpd.roles @@ -294,9 +294,9 @@ public static void validateBySpin(Job job2, GProtocolName fullname) for (Role r : rs) { - pml += "\n\n" + jobc2.getEGraph(fullname, r).toPml(r); + pml += "\n\n" + jobc.getEGraph(fullname, r).toPml(r); } - if (job2.config.args.get(JobArgs.VERBOSE)) + if (job.config.args.get(JobArgs.VERBOSE)) { System.out.println("[-spin]: Promela processes\n" + pml + "\n"); } @@ -305,7 +305,7 @@ public static void validateBySpin(Job job2, GProtocolName fullname) for (Role r : rs) { Set tmp = new HashSet<>(); - EGraph g = jobc2.getEGraph(fullname, r); + EGraph g = jobc.getEGraph(fullname, r); tmp.add(g.init); tmp.addAll(MState.getReachableStates(g.init)); if (g.term != null) @@ -354,7 +354,7 @@ public static void validateBySpin(Job job2, GProtocolName fullname) int j = (i+batchSize < clauses.size()) ? i+batchSize : clauses.size(); String batch = clauses.subList(i, j).stream().collect(Collectors.joining(" && ")); String ltl = "ltl {\n" + batch + "\n" + "}"; - if (job2.config.args.get(JobArgs.VERBOSE)) + if (job.config.args.get(JobArgs.VERBOSE)) { System.out.println("[-spin] Batched ltl:\n" + ltl + "\n"); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 4dcc9e882..96c5712e0 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -127,7 +127,7 @@ public EGraph toEGraph(Job job) if (this.def.isEmpty()) // Empty Seq special case for top-level -- in general, Seq must be non-empty, cf. LSeq::buildGraph entry/exit { //EState s = b.getEntry(); - EState s = job.config.ef.newEState(Collections.emptySet()); + EState s = job.config.mf.newEState(Collections.emptySet()); return new EGraph(s, s); } EGraphBuilder b = new EGraphBuilder(job); diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java index f5411d62f..9ba4c73df 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java @@ -44,7 +44,6 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; -// Combine with EModelFactory? No point to separate? public interface ModelFactory { ESend newESend(Role peer, MessageId mid, Payload payload); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java index 34906f417..40e910247 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutParser.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java @@ -36,18 +36,18 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; -public class AutParser +public class AutGraphParser { private final Job job; - public AutParser(Job job) + public AutGraphParser(Job job) { this.job = job; } public EGraph parse(String aut) { - ModelFactory ef = this.job.config.ef; + ModelFactory ef = this.job.config.mf; //Map> edges = new HashMap<>(); Map> as = new HashMap<>(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index 94887ce49..c5e06028b 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -35,7 +35,8 @@ import org.scribble.core.type.name.Role; import org.scribble.util.ScribException; -public class SGraphBuilderUtil extends GraphBuilderUtil +public class SGraphBuilderUtil + extends GraphBuilderUtil { public final ModelFactory sf; @@ -74,9 +75,9 @@ public SGraph buildSGraph(Job job, GProtocolName fullname, Map egr SBuffers b0 = new SBuffers(job.ef, efsms.keySet(), !explicit);*/ //SConfig c0 = job.sf.newSConfig(efsms, b0); - SConfig c0 = createInitialSConfig(job.config.ef, egraphs, explicit); + SConfig c0 = createInitialSConfig(job.config.mf, egraphs, explicit); - SState init = job.config.sf.newSState(c0); + SState init = job.config.mf.newSState(c0); Map seen = new HashMap<>(); LinkedHashSet todo = new LinkedHashSet<>(); @@ -144,8 +145,8 @@ else if (k == EStateKind.UNARY_INPUT || k == EStateKind.POLY_INPUT || k == EStat { if (a.isSend() || a.isReceive() || a.isDisconnect()) { - getNextStates(job.config.sf, todo, seen, curr, - a.toGlobal(job.config.sf, r), curr.fire(r, a)); + getNextStates(job.config.mf, todo, seen, curr, + a.toGlobal(job.config.mf, r), curr.fire(r, a)); } else if (a.isAccept() || a.isRequest()) { @@ -156,10 +157,10 @@ else if (a.isAccept() || a.isRequest()) as.remove(d); // Removes one occurrence //getNextStates(seen, todo, curr.sync(r, a, a.peer, d)); SAction g = (a.isRequest()) - ? a.toGlobal(job.config.sf, r) - : d.toGlobal(job.config.sf, a.peer); + ? a.toGlobal(job.config.mf, r) + : d.toGlobal(job.config.mf, a.peer); // Edge will be drawn as the connect, but should be read as the sync. of both -- something like "r1, r2: sync" may be more consistent (or take a set of actions as the edge label) - getNextStates(job.config.sf, todo, seen, curr, g, + getNextStates(job.config.mf, todo, seen, curr, g, curr.sync(r, a, a.peer, d)); } } @@ -171,9 +172,9 @@ else if (a.isWrapClient() || a.isWrapServer()) { as.remove(w); // Removes one occurrence SAction g = (a.isRequest()) - ? a.toGlobal(job.config.sf, r) - : w.toGlobal(job.config.sf, a.peer); - getNextStates(job.config.sf, todo, seen, curr, g, curr.sync(r, a, a.peer, w)); + ? a.toGlobal(job.config.mf, r) + : w.toGlobal(job.config.mf, a.peer); + getNextStates(job.config.mf, todo, seen, curr, g, curr.sync(r, a, a.peer, w)); } } else @@ -184,7 +185,7 @@ else if (a.isWrapClient() || a.isWrapServer()) } } - SGraph graph = job.config.sf.newSGraph(fullname, seen, init); + SGraph graph = job.config.mf.newSGraph(fullname, seen, init); job.verbosePrintln( "(" + fullname + ") Built global model..\n" + graph.init.toDot() + "\n(" From 282754c203e19280f0e58a49ed4649b7f2af7289 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 22:25:11 +0100 Subject: [PATCH 247/539] Minor. --- .../src/main/java/org/scribble/core/type/session/SType.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index a73668e7c..149818f66 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -25,6 +25,9 @@ // B needed(?) to factor up several methods from G/L compounds to bases, e.g., getInlined and unfoldAllOnce // Generic works to "specialise" G/L subclasses (and works with immutable pattern) -- cf. not supported by contravariant method parameter subtyping for getters/setters +// N.B. Taking G/LSeq as the B param "limits" the "cast-freeness" of this hierarchy at this point -- i.e., potential G/LSeq subclasses would be beyond that point +// However, the framework is mainly intended to be extended "horizontally" w.r.t. node types (additional types), and "vertically" (subclasses) for behaviour only via Visitors +// In case of "vertical" extension of node types (e.g., additional node fields), still considering extension of Seq necessary less often public interface SType> extends SNode { From 8f7d203367ddb7b19c33ad45ced306dbc6e40383 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 10 Apr 2019 22:43:48 +0100 Subject: [PATCH 248/539] Continued: deleted ast.local. --- .../java/org/scribble/ast/AstFactory.java | 50 +++--- .../java/org/scribble/ast/AstFactoryImpl.java | 105 +++++-------- .../org/scribble/ast/HeaderParamDecl.java | 3 - .../main/java/org/scribble/ast/Module.java | 14 +- .../main/java/org/scribble/ast/RoleDecl.java | 15 -- .../java/org/scribble/ast/SigParamDecl.java | 13 +- .../java/org/scribble/ast/TypeParamDecl.java | 13 +- .../org/scribble/ast/global/GConnect.java | 39 ----- .../org/scribble/ast/global/GContinue.java | 13 -- .../org/scribble/ast/global/GDisconnect.java | 30 ---- .../java/org/scribble/ast/global/GDo.java | 12 -- .../scribble/ast/global/GInteractionSeq.java | 11 -- .../scribble/ast/global/GProtocolBlock.java | 10 -- .../scribble/ast/global/GProtocolDecl.java | 26 ---- .../org/scribble/ast/global/GProtocolDef.java | 11 +- .../scribble/ast/global/GProtocolHeader.java | 12 -- .../org/scribble/ast/global/GRecursion.java | 147 ------------------ .../java/org/scribble/ast/global/GWrap.java | 30 +--- .../java/org/scribble/ast/local/LAccept.java | 95 ----------- .../java/org/scribble/ast/local/LChoice.java | 99 ------------ .../ast/local/LCompoundSessionNode.java | 19 --- .../scribble/ast/local/LConnectionAction.java | 54 ------- .../org/scribble/ast/local/LContinue.java | 83 ---------- .../scribble/ast/local/LDelegationElem.java | 97 ------------ .../org/scribble/ast/local/LDisconnect.java | 115 -------------- .../main/java/org/scribble/ast/local/LDo.java | 106 ------------- .../scribble/ast/local/LInteractionSeq.java | 95 ----------- .../scribble/ast/local/LMessageTransfer.java | 52 ------- .../scribble/ast/local/LProjectionDecl.java | 86 ---------- .../scribble/ast/local/LProtocolBlock.java | 88 ----------- .../org/scribble/ast/local/LProtocolDecl.java | 130 ---------------- .../org/scribble/ast/local/LProtocolDef.java | 87 ----------- .../scribble/ast/local/LProtocolHeader.java | 129 --------------- .../org/scribble/ast/local/LRecursion.java | 87 ----------- .../java/org/scribble/ast/local/LRecv.java | 87 ----------- .../java/org/scribble/ast/local/LRequest.java | 97 ------------ .../org/scribble/ast/local/LScribNode.java | 32 ---- .../java/org/scribble/ast/local/LSend.java | 94 ----------- .../org/scribble/ast/local/LSessionNode.java | 23 --- .../ast/local/LSimpleSessionNode.java | 19 --- .../org/scribble/ast/local/LWrapClient.java | 94 ----------- .../org/scribble/ast/local/LWrapServer.java | 89 ----------- .../org/scribble/ast/local/SelfRoleDecl.java | 89 ----------- .../lang/context/ModuleContextCollector.java | 14 -- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 45 files changed, 70 insertions(+), 2546 deletions(-) delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LCompoundSessionNode.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LConnectionAction.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LDelegationElem.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LDo.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LInteractionSeq.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LMessageTransfer.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LProtocolDecl.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LProtocolDef.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LProtocolHeader.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LScribNode.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LSend.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/SelfRoleDecl.java diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index b9a6d648a..5ec5d7a2f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -22,7 +22,6 @@ import org.scribble.ast.global.GDelegationElem; import org.scribble.ast.global.GDisconnect; import org.scribble.ast.global.GDo; -import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GInteractionSeq; import org.scribble.ast.global.GMessageTransfer; import org.scribble.ast.global.GProtocolBlock; @@ -30,37 +29,16 @@ import org.scribble.ast.global.GProtocolDef; import org.scribble.ast.global.GProtocolHeader; import org.scribble.ast.global.GRecursion; +import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GWrap; -import org.scribble.ast.local.LAccept; -import org.scribble.ast.local.LChoice; -import org.scribble.ast.local.LContinue; -import org.scribble.ast.local.LDelegationElem; -import org.scribble.ast.local.LDisconnect; -import org.scribble.ast.local.LDo; -import org.scribble.ast.local.LSessionNode; -import org.scribble.ast.local.LInteractionSeq; -import org.scribble.ast.local.LProjectionDecl; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.ast.local.LProtocolDecl; -import org.scribble.ast.local.LProtocolDef; -import org.scribble.ast.local.LProtocolHeader; -import org.scribble.ast.local.LRecv; -import org.scribble.ast.local.LRecursion; -import org.scribble.ast.local.LRequest; -import org.scribble.ast.local.LSend; -import org.scribble.ast.local.LWrapClient; -import org.scribble.ast.local.LWrapServer; -import org.scribble.ast.local.SelfRoleDecl; import org.scribble.ast.name.NameNode; import org.scribble.ast.name.PayloadElemNameNode; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.qualified.GProtocolNameNode; -import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.qualified.QualifiedNameNode; import org.scribble.ast.name.simple.AmbigNameNode; -import org.scribble.ast.name.simple.DummyProjectionRoleNode; import org.scribble.ast.name.simple.NonRoleParamNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; @@ -68,10 +46,9 @@ import org.scribble.core.type.kind.Kind; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.PayloadTypeKind; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.Role; +// Currently, used only in relatively niche places (since ANTLR now constructs all parsed nodes "directly") public interface AstFactory { Module Module(CommonTree source, ModuleDecl moddecl, @@ -84,8 +61,6 @@ MessageSigNode MessageSigNode(CommonTree source, OpNode op, GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode name, RoleNode role); - LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode name); - // PayloadElemList PayloadElemList(List> payloadelems); PayloadElemList PayloadElemList(CommonTree source, List> payloadelems); @@ -171,9 +146,25 @@ QualifiedNameNode QualifiedNameNode(CommonTree source, NonRoleParamNode NonRoleParamNode( CommonTree source, K kind, String identifier); +} + + + + + + + + + + + + +/* DummyProjectionRoleNode DummyProjectionRoleNode(); + LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode name); + LProtocolDecl LProtocolDecl(CommonTree source, List modifiers, LProtocolHeader header, LProtocolDef def); // Not currently used -- local protos not parsed, only projected @@ -208,7 +199,8 @@ LAccept LAccept(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest); /*LConnect LConnect(CommonTree source, RoleNode src, RoleNode dest); - LAccept LAccept(CommonTree source, RoleNode src, RoleNode dest);*/ + LAccept LAccept(CommonTree source, RoleNode src, RoleNode dest);* / + LDisconnect LDisconnect(CommonTree source, RoleNode self, RoleNode peer); LWrapClient LWrapClient(CommonTree source, RoleNode self, RoleNode peer); @@ -225,4 +217,4 @@ LRecursion LRecursion(CommonTree source, RecVarNode recvar, LDo LDo(CommonTree source, RoleArgList roles, NonRoleArgList args, LProtocolNameNode proto); -} +*/ diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java index a43df5688..b4cb2b7bd 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -33,26 +33,6 @@ import org.scribble.ast.global.GRecursion; import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GWrap; -import org.scribble.ast.local.LAccept; -import org.scribble.ast.local.LChoice; -import org.scribble.ast.local.LContinue; -import org.scribble.ast.local.LDelegationElem; -import org.scribble.ast.local.LDisconnect; -import org.scribble.ast.local.LDo; -import org.scribble.ast.local.LInteractionSeq; -import org.scribble.ast.local.LProjectionDecl; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.ast.local.LProtocolDecl; -import org.scribble.ast.local.LProtocolDef; -import org.scribble.ast.local.LProtocolHeader; -import org.scribble.ast.local.LRecv; -import org.scribble.ast.local.LRecursion; -import org.scribble.ast.local.LRequest; -import org.scribble.ast.local.LSend; -import org.scribble.ast.local.LSessionNode; -import org.scribble.ast.local.LWrapClient; -import org.scribble.ast.local.LWrapServer; -import org.scribble.ast.local.SelfRoleDecl; import org.scribble.ast.name.NameNode; import org.scribble.ast.name.PayloadElemNameNode; import org.scribble.ast.name.qualified.DataTypeNode; @@ -62,7 +42,6 @@ import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.qualified.QualifiedNameNode; import org.scribble.ast.name.simple.AmbigNameNode; -import org.scribble.ast.name.simple.DummyProjectionRoleNode; import org.scribble.ast.name.simple.NonRoleParamNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; @@ -80,9 +59,7 @@ import org.scribble.core.type.kind.RecVarKind; import org.scribble.core.type.kind.RoleKind; import org.scribble.core.type.kind.SigKind; -import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.Op; -import org.scribble.core.type.name.Role; import org.scribble.del.DefaultDel; import org.scribble.del.ImportModuleDel; import org.scribble.del.ModuleDel; @@ -105,22 +82,6 @@ import org.scribble.del.global.GProtocolDefDel; import org.scribble.del.global.GRecursionDel; import org.scribble.del.global.GWrapDel; -import org.scribble.del.local.LAcceptDel; -import org.scribble.del.local.LChoiceDel; -import org.scribble.del.local.LContinueDel; -import org.scribble.del.local.LDisconnectDel; -import org.scribble.del.local.LDoDel; -import org.scribble.del.local.LInteractionSeqDel; -import org.scribble.del.local.LProjectionDeclDel; -import org.scribble.del.local.LProtocolBlockDel; -import org.scribble.del.local.LProtocolDeclDel; -import org.scribble.del.local.LProtocolDefDel; -import org.scribble.del.local.LReceiveDel; -import org.scribble.del.local.LRecursionDel; -import org.scribble.del.local.LRequestDel; -import org.scribble.del.local.LSendDel; -import org.scribble.del.local.LWrapClientDel; -import org.scribble.del.local.LWrapServerDel; import org.scribble.del.name.qualified.DataTypeNodeDel; import org.scribble.del.name.qualified.MessageSigNameNodeDel; import org.scribble.del.name.simple.AmbigNameNodeDel; @@ -139,6 +100,24 @@ public AstFactoryImpl() { } + + protected ScribDel createDefaultDelegate() + { + return new DefaultDel(); + } + + // FIXME: factor out + //@SuppressWarnings("unchecked") + protected static T del(T n, ScribDel del) + { + /*ScribNodeBase ret = n.del(del); // FIXME: del makes another shallow copy of n + if (ret.getClass() != n.getClass()) + { + throw new RuntimeException("Shouldn't get in here: " + ret.getClass() + ", " + n.getClass()); + } + return (T) ret;*/ + return ScribNodeBase.del(n, del); + } // FIXME: inconsistent wrt. this.source -- it is essentially parsed (in the sense of *omitted* syntax), but not recorded // FIXME: this pattern is not ideal ("exposed" public constructor arg in GWrap/GDisconnect) @@ -203,15 +182,6 @@ public GDelegationElem GDelegationElem(CommonTree source, de = del(de, new GDelegationElemDel()); // FIXME: GDelegationElemDel return de; } - - @Override - public LDelegationElem LDelegationElem(CommonTree source, - LProtocolNameNode proto) - { - LDelegationElem de = new LDelegationElem(source, proto); - de = del(de, createDefaultDelegate()); - return de; - } @Override public Module Module(CommonTree source, ModuleDecl moddecl, @@ -562,7 +532,17 @@ public NonRoleParamNode NonRoleParamNode( pn = del(pn, new NonRoleParamNodeDel()); return pn; } +} + + + + + + + + +/* @Override public DummyProjectionRoleNode DummyProjectionRoleNode() { @@ -571,6 +551,15 @@ public DummyProjectionRoleNode DummyProjectionRoleNode() return dprn; } + @Override + public LDelegationElem LDelegationElem(CommonTree source, + LProtocolNameNode proto) + { + LDelegationElem de = new LDelegationElem(source, proto); + de = del(de, createDefaultDelegate()); + return de; + } + @Override // Called from LProtocolDecl::clone, but currently never used -- local proto decls only projected, not parsed public LProtocolDecl LProtocolDecl(CommonTree source, List mods, LProtocolHeader header, LProtocolDef def) @@ -736,22 +725,4 @@ public LDo LDo(CommonTree source, RoleArgList roleinstans, ld = del(ld, new LDoDel()); return ld; } - - protected ScribDel createDefaultDelegate() - { - return new DefaultDel(); - } - - // FIXME: factor out - //@SuppressWarnings("unchecked") - protected static T del(T n, ScribDel del) - { - /*ScribNodeBase ret = n.del(del); // FIXME: del makes another shallow copy of n - if (ret.getClass() != n.getClass()) - { - throw new RuntimeException("Shouldn't get in here: " + ret.getClass() + ", " + n.getClass()); - } - return (T) ret;*/ - return ScribNodeBase.del(n, del); - } -} +*/ diff --git a/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java index b16b34f25..a17eb3872 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java @@ -18,7 +18,6 @@ import org.scribble.ast.name.NameNode; import org.scribble.ast.name.simple.SimpleNameNode; import org.scribble.core.type.kind.ParamKind; -import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -65,8 +64,6 @@ public HeaderParamDecl visitChildren(AstVisitor nv) public abstract String getKeyword(); - public abstract HeaderParamDecl project(AstFactory af, Role self); // Move to delegate? - @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/Module.java b/scribble-ast/src/main/java/org/scribble/ast/Module.java index a2a51752c..5edbd4aa8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Module.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Module.java @@ -22,7 +22,6 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ast.local.LProtocolDecl; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Kind; import org.scribble.core.type.kind.ProtocolKind; @@ -167,7 +166,7 @@ public boolean hasProtocolDecl( List> pds = simpname.getKind().equals(Global.KIND) ? getGProtoDeclChildren() - : getLProtoDeclChildren(); + : null; // FIXME return pds.stream().anyMatch(x -> x.getHeaderChild().getDeclName().equals(simpname)); } @@ -180,7 +179,7 @@ public ProtocolDecl getProtocolDeclChild( List> pds = simpname.getKind().equals(Global.KIND) ? getGProtoDeclChildren() - : getLProtoDeclChildren(); + : null; // FIXME List> filt = pds.stream() .filter(x -> x.getHeaderChild().getDeclName().equals(simpname)) .collect(Collectors.toList()); @@ -199,12 +198,6 @@ public List getGProtoDeclChildren() .collect(Collectors.toList()); } - public List getLProtoDeclChildren() - { - return getChildren().stream().filter(IS_LPROTOCOLDECL).map(TO_LPROTOCOLDECL) - .collect(Collectors.toList()); - } - private static final Predicate IS_GPROTOCOLDECL = pd -> (pd instanceof ProtocolDecl) && ((ProtocolDecl) pd).isGlobal(); @@ -214,9 +207,6 @@ public List getLProtoDeclChildren() private static final Function TO_GPROTOCOLDECL = pd -> (GProtocolDecl) pd; - private static final Function TO_LPROTOCOLDECL = - pd -> (LProtocolDecl) pd; - @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java b/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java index 9e10cd46c..7f50ec318 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java @@ -17,7 +17,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.RoleKind; -import org.scribble.core.type.name.Name; import org.scribble.core.type.name.Role; import org.scribble.util.Constants; @@ -47,20 +46,6 @@ public RoleDecl dupNode() return new RoleDecl(this); } - @Override - public RoleDecl project(AstFactory af, Role self) - { - RoleNode name = getNameNodeChild(); - Name role = name.toName(); - RoleNode rn = (RoleNode) - af.SimpleNameNode(name.source, RoleKind.KIND, role.toString()); - if (role.equals(self)) - { - return af.SelfRoleDecl(name.source, rn); - } - return af.RoleDecl(this.source, rn); - } - @Override public Role getDeclName() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/SigParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/SigParamDecl.java index 284df864d..8387db57a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/SigParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SigParamDecl.java @@ -17,7 +17,6 @@ import org.scribble.ast.name.simple.SigParamNode; import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.MessageSigName; -import org.scribble.core.type.name.Role; import org.scribble.util.Constants; public class SigParamDecl extends NonRoleParamDecl @@ -34,22 +33,16 @@ public SigParamDecl(SigParamDecl node) super(node); } - @Override - public SigParamDecl dupNode() - { - return new SigParamDecl(this); - } - @Override public SigParamNode getNameNodeChild() { return (SigParamNode) getRawNameNodeChild(); // CHECKME: make Type/Sig(Param)Node? } - + @Override - public SigParamDecl project(AstFactory af, Role self) + public SigParamDecl dupNode() { - return dupNode(); + return new SigParamDecl(this); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/TypeParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/TypeParamDecl.java index 10b1fda4f..e740e11cb 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/TypeParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/TypeParamDecl.java @@ -17,7 +17,6 @@ import org.scribble.ast.name.simple.TypeParamNode; import org.scribble.core.type.kind.DataTypeKind; import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.Role; import org.scribble.util.Constants; public class TypeParamDecl extends NonRoleParamDecl @@ -34,22 +33,16 @@ public TypeParamDecl(TypeParamDecl node) super(node); } - @Override - public TypeParamDecl dupNode() - { - return new TypeParamDecl(this); - } - @Override public TypeParamNode getNameNodeChild() { return (TypeParamNode) getRawNameNodeChild(); // CHECKME: make Type/SigParamNode? } - + @Override - public TypeParamDecl project(AstFactory af, Role self) + public TypeParamDecl dupNode() { - return dupNode(); + return new TypeParamDecl(this); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GConnect.java b/scribble-ast/src/main/java/org/scribble/ast/global/GConnect.java index 9caa42155..4249bc85e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GConnect.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GConnect.java @@ -15,14 +15,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.ConnectAction; import org.scribble.ast.MessageNode; -import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.kind.RoleKind; -import org.scribble.core.type.name.Role; import org.scribble.util.Constants; // TODO: make GConnectionAction and factor this class with GWrap (cf. LConnectionAction) @@ -47,41 +43,6 @@ public GConnect dupNode() return new GConnect(this); } - public LScribNode project(AstFactory af, Role self) - { - Role src = this.getSourceChild().toName(); - MessageNode msgNode = this.getMessageNodeChild(); - Role dest = this.getDestinationChild().toName(); - LScribNode proj = null; - if (src.equals(self) || dest.equals(self)) - { - if (src.equals(dest)) - { - throw new RuntimeException( - "Shouldn't get in here (self-connection): " + this); - } - - RoleNode srcNode = getSourceChild(); - RoleNode destNode = getDestinationChild(); - RoleNode srcNode1 = (RoleNode) af.SimpleNameNode(srcNode.getSource(), - RoleKind.KIND, srcNode.toName().toString()); // clone? - MessageNode msgNode1 = (MessageNode) msgNode; // CHECKME: need namespace prefix update? - RoleNode destNode1 = (RoleNode) af.SimpleNameNode(destNode.getSource(), - RoleKind.KIND, destNode.toName().toString()); - if (src.equals(self)) - { - proj = af.LRequest(this.source, srcNode1, msgNode1, destNode1); - //projection = AstFactoryImpl.FACTORY.LConnect(src, dest); // src and dest (not self and peer) - } - if (dest.equals(self)) - { - proj = af.LAccept(this.source, srcNode1, msgNode1, destNode1); - //projection = AstFactoryImpl.FACTORY.LAccept(src, dest); - } - } - return proj; - } - @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GContinue.java b/scribble-ast/src/main/java/org/scribble/ast/global/GContinue.java index 3f40b10ca..3cd5fefa3 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GContinue.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GContinue.java @@ -15,13 +15,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.Continue; -import org.scribble.ast.local.LContinue; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.kind.RecVarKind; -import org.scribble.core.type.name.Role; public class GContinue extends Continue implements GSimpleSessionNode { @@ -42,15 +38,6 @@ public GContinue dupNode() { return new GContinue(this); } - - public LContinue project(AstFactory af, Role self) - { - RecVarNode recvar = getRecVarChild(); - RecVarNode recvar1 = (RecVarNode) af.SimpleNameNode(recvar.getSource(), - RecVarKind.KIND, recvar.toName().toString()); // clone? - LContinue projection = af.LContinue(this.source, recvar1); - return projection; - } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java index 8e33dc452..a757663a0 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java @@ -15,13 +15,9 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.DisconnectAction; -import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.kind.RoleKind; -import org.scribble.core.type.name.Role; import org.scribble.util.Constants; public class GDisconnect extends DisconnectAction @@ -45,32 +41,6 @@ public GDisconnect dupNode() return new GDisconnect(this); } - public LScribNode project(AstFactory af, Role self) - { - RoleNode leftNode = this.getLeftChild(); - RoleNode rightNode = this.getRightChild(); - Role left = leftNode.toName(); - Role right = rightNode.toName(); - LScribNode proj = null; - if (left.equals(self) || right.equals(self)) - { - RoleNode leftNode1 = (RoleNode) af.SimpleNameNode(leftNode.getSource(), - RoleKind.KIND, leftNode.toName().toString()); // clone? - RoleNode rightNode1 = (RoleNode) af.SimpleNameNode(rightNode.getSource(), - RoleKind.KIND, rightNode.toName().toString()); - // "left" of LDisconnect is used for self - if (left.equals(self)) - { - proj = af.LDisconnect(this.source, leftNode1, rightNode1); - } - else if (right.equals(self)) // CHECKME: self-comm via self-connections? so self-disconn? - { - proj = af.LDisconnect(this.source, rightNode1, leftNode1); - } - } - return proj; - } - @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java index e31f7f568..f49c1dc3f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java @@ -15,17 +15,13 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.Do; import org.scribble.ast.NonRoleArgList; import org.scribble.ast.RoleArgList; -import org.scribble.ast.local.LDo; import org.scribble.ast.name.qualified.GProtocolNameNode; -import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.Role; import org.scribble.lang.LangContext; public class GDo extends Do implements GSimpleSessionNode @@ -54,14 +50,6 @@ public GDo dupNode() return new GDo(this); } - public LDo project(AstFactory af, Role self, LProtocolNameNode fullname) - { - RoleArgList roles = this.getRoleListChild().project(af, self); - NonRoleArgList args = this.getNonRoleListChild().project(af, self); - LDo projection = af.LDo(this.source, roles, args, fullname); - return projection; - } - @Override public GProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) { diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GInteractionSeq.java b/scribble-ast/src/main/java/org/scribble/ast/global/GInteractionSeq.java index c9348b3ac..c8d6530c3 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GInteractionSeq.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GInteractionSeq.java @@ -18,12 +18,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.InteractionSeq; -import org.scribble.ast.local.LSessionNode; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.Role; -import org.scribble.ast.local.LInteractionSeq; public class GInteractionSeq extends InteractionSeq implements GScribNode { @@ -44,13 +40,6 @@ public GInteractionSeq dupNode() { return new GInteractionSeq(this); } - - // Move node-specific projects to G nodes (not dels) and take child projections as params, bit like reconstruct - public LInteractionSeq project(AstFactory af, Role self, List lis) - { - LInteractionSeq projection = af.LInteractionSeq(this.source, lis); - return projection; - } @Override public List getInteractionChildren() diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java index 2266578d3..f9b1fdc20 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java @@ -15,12 +15,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.ProtocolBlock; -import org.scribble.ast.local.LInteractionSeq; -import org.scribble.ast.local.LProtocolBlock; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.Role; public class GProtocolBlock extends ProtocolBlock implements GScribNode { @@ -47,12 +43,6 @@ public GInteractionSeq getInteractSeqChild() { return (GInteractionSeq) getChild(0); } - - public LProtocolBlock project(AstFactory af, Role self, LInteractionSeq seq) - { - LProtocolBlock projection = af.LProtocolBlock(this.source, seq); - return projection; - } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java index 4d428bf7f..e5699a4ac 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java @@ -17,17 +17,11 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ProtocolMod; -import org.scribble.ast.local.LProjectionDecl; -import org.scribble.ast.local.LProtocolDef; -import org.scribble.ast.local.LProtocolHeader; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.Role; -import org.scribble.util.ScribException; public class GProtocolDecl extends ProtocolDecl implements GScribNode { @@ -49,26 +43,6 @@ public GProtocolDecl dupNode() { return new GProtocolDecl(this); } - - // CHECKME: project modifiers? - public LProjectionDecl project(AstFactory af, Module mod, Role self, - LProtocolHeader hdr, LProtocolDef def) throws ScribException - // mod is just the parent? - { - /*//Role self = proj.peekSelf(); - GProtocolHeader gph = getHeader(); - LProtocolNameNode pn = Projector.makeProjectedSimpleNameNode(af, gph.getSource(), gph.getDeclName(), self); - - // Move to delegates? -- maybe fully integrate into projection pass - RoleDeclList roledecls = this.header.roledecls.project(af, self); - NonRoleParamDeclList paramdecls = this.header.paramdecls.project(af, self); - LProtocolHeader lph = af.LProtocolHeader(this.header.getSource(), pn, roledecls, paramdecls);*/ - - GProtocolName gpn = this.getFullMemberName(mod); - LProjectionDecl proj = - af.LProjectionDecl(this.source, this.modifiers, gpn, self, hdr, def); - return proj; - } @Override public GProtocolHeader getHeaderChild() diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDef.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDef.java index 1a4d44b8f..716f8a639 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDef.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDef.java @@ -15,12 +15,8 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.ProtocolDef; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.ast.local.LProtocolDef; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.Role; public class GProtocolDef extends ProtocolDef implements GScribNode { @@ -48,12 +44,7 @@ public GProtocolDef dupNode() return new GProtocolDef(this); } - public LProtocolDef project(AstFactory af, Role self, LProtocolBlock block) - { - LProtocolDef projection = af.LProtocolDef(this.source, block); - return projection; - } - + diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java index 98a365c19..6275f8d1c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java @@ -15,16 +15,12 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.NonRoleParamDeclList; import org.scribble.ast.ProtocolHeader; import org.scribble.ast.RoleDeclList; -import org.scribble.ast.local.LProtocolHeader; import org.scribble.ast.name.qualified.GProtocolNameNode; -import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.Role; import org.scribble.util.Constants; public class GProtocolHeader extends ProtocolHeader implements GScribNode @@ -57,14 +53,6 @@ public GProtocolName getDeclName() { return getNameNodeChild().toName(); } - - // CHECKME: make a delegate and move there? - public LProtocolHeader project(AstFactory af, Role self, - LProtocolNameNode name, RoleDeclList roledecls, - NonRoleParamDeclList paramdecls) - { - return af.LProtocolHeader(this.source, name, roledecls, paramdecls); - } @Override public String toString() diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java b/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java index 4665e8127..db68c38b1 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java @@ -13,30 +13,11 @@ */ package org.scribble.ast.global; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; - import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.ConnectAction; -import org.scribble.ast.Do; -import org.scribble.ast.MessageTransfer; import org.scribble.ast.Recursion; -import org.scribble.ast.local.LChoice; -import org.scribble.ast.local.LContinue; -import org.scribble.ast.local.LSessionNode; -import org.scribble.ast.local.LInteractionSeq; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.ast.local.LRecursion; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; public class GRecursion extends Recursion @@ -66,134 +47,6 @@ public GProtocolBlock getBlockChild() return (GProtocolBlock) getChild(1); } - public LRecursion project(AstFactory af, Role self, LProtocolBlock block) - { - RecVarNode recvar = getRecVarChild().clone();//af); - LRecursion projection = null; - Set rvs = new HashSet<>(); - rvs.add(recvar.toName()); - LProtocolBlock pruned = prune(af, block, rvs); - if (!pruned.isEmpty()) - { - projection = af.LRecursion(this.source, recvar, pruned); - } - return projection; - } - - // Pruning must be considered here (at Recursion) due to unguarded recvars - // Set should be unnecessary (singleton OK) -- *nested* irrelevant continues should already have been pruned - // CHECKME? refactor and separate into dels? -- maybe not: since pruning is a bit too much of a "centralised algorithm" -- currently relying on TODO exception for unhandled cases - protected static LProtocolBlock prune(AstFactory af, LProtocolBlock block, - Set rvs) // FIXME: Set unnecessary - { - LInteractionSeq seq = block.getInteractSeqChild(); - if (block.isEmpty()) - { - return block; - } - List lis = block.getInteractSeqChild() - .getInteractionChildren(); - if (lis.size() > 1) - { - return block; - } - else //if (lis.size() == 1) - { - // Only pruning if single statement body: if more than 1, must be some (non-empty?) statement before a continue -- cannot (shouldn't?) be a continue followed by some other statement due to reachability - LSessionNode lin = lis.get(0); - if (lin instanceof LContinue) - { - if (rvs.contains(((LContinue) lin).getRecVarChild().toName())) - { - // FIXME: need equivalent for projection-irrelevant recursive-do in a protocoldecl - return af.LProtocolBlock(block.getSource(), - af.LInteractionSeq(seq.getSource(), Collections.emptyList())); - } - else - { - return block; - } - } - else if (lin instanceof MessageTransfer || lin instanceof Do - || lin instanceof ConnectAction) - { - return block; - } - else - { - if (lin instanceof LChoice) - { - List pruned = new LinkedList(); - for (LProtocolBlock b : ((LChoice) lin).getBlockChildren()) - { - if (!prune(af, b, rvs).isEmpty()) - { - pruned.add(b); - } - } - if (pruned.isEmpty()) - { - return af.LProtocolBlock(block.getSource(), - af.LInteractionSeq(seq.getSource(), Collections.emptyList())); - } - else - { - return af.LProtocolBlock(block.getSource(), - af.LInteractionSeq(seq.getSource(), - Arrays.asList(af.LChoice(lin.getSource(), - ((LChoice) lin).getSubjectChild(), pruned)))); - } - } - else if (lin instanceof LRecursion) - { - rvs = new HashSet<>(rvs); - //rvs.add(((LRecursion) lin).recvar.toName()); // Set unnecessary - LProtocolBlock pruned = prune(af, ((LRecursion) lin).getBlockChild(), - rvs); // Need to check if the current rec has any cases to prune in the nested rec (already pruned, but for the nested recvars only) - if (pruned.isEmpty()) - { - return pruned; - } - else - { - return af.LProtocolBlock(block.getSource(), - af.LInteractionSeq(seq.getSource(), - Arrays.asList(af.LRecursion(lin.getSource(), - ((LRecursion) lin).getRecVarChild(), pruned)))); - } - /*if (((LRecursion) lin).block.isEmpty()) - { - return AstFactoryImpl.FACTORY.LProtocolBlock(AstFactoryImpl.FACTORY.LInteractionSeq(Arrays.asList(AstFactoryImpl.FACTORY.LRecursion(((LRecursion) lin).recvar, ((LRecursion) lin).getBlock())))); - } - else - { - return ((LRecursion) lin).getBlock(); - }*/ - } - else - { - throw new RuntimeException("TODO: " + lin); - } - } - } - } - - - - - - - - - - - - - - - - - public GRecursion(CommonTree source, RecVarNode recvar, GProtocolBlock block) { super(source, recvar, block); diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java index c12d9a182..5d1da1e10 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java @@ -15,14 +15,10 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; import org.scribble.ast.ConnectAction; import org.scribble.ast.MessageSigNode; -import org.scribble.ast.local.LScribNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.kind.RoleKind; -import org.scribble.core.type.name.Role; import org.scribble.util.Constants; public class GWrap extends ConnectAction implements GSimpleSessionNode @@ -38,32 +34,8 @@ public GWrap(GWrap node) { super(node); } - - public LScribNode project(AstFactory af, Role self) - { - RoleNode srcNode = getSourceChild(); - RoleNode destNode = getDestinationChild(); - Role srcrole = srcNode.toName(); - Role destrole = destNode.toName(); - LScribNode projection = null; - if (srcrole.equals(self) || destrole.equals(self)) - { - RoleNode srcNode1 = (RoleNode) af.SimpleNameNode(srcNode.getSource(), - RoleKind.KIND, srcNode.toName().toString()); // clone? - RoleNode destNode1 = (RoleNode) af.SimpleNameNode(destNode.getSource(), - RoleKind.KIND, destNode.toName().toString()); - if (srcrole.equals(self)) - { - projection = af.LWrapClient(this.source, srcNode1, destNode1); // src and dest (not self and peer) - } - if (destrole.equals(self)) - { - projection = af.LWrapServer(this.source, srcNode1, destNode1); - } - } - return projection; - } + @Override public GWrap dupNode() { return new GWrap(this); diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java b/scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java deleted file mode 100644 index e5b3d8a9a..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LAccept.java +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.MessageNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.util.Constants; - -public class LAccept extends LConnectionAction -{ - // ScribTreeAdaptor#create constructor - public LAccept(Token t) - { - super(t); - } - - // Tree#dupNode constructor - public LAccept(LAccept node) - { - super(node); - } - - @Override - public LAccept dupNode() - { - return new LAccept(this); - } - - @Override - public String toString() - { - return (isUnitMessage() ? "" : getMessageNodeChild() + " ") - + Constants.ACCEPT_KW + " " + getSourceChild() + ";"; - } - - - - - - - - - - - - - - - public LAccept(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) - //public LAccept(RoleNode src, RoleNode dest) - { - super(source, src, msg, dest); - //super(src, dest); - } - - /*@Override - protected ScribNodeBase copy() - { - return new LAccept(this.source, this.src, this.msg, this.dest); - //return new LAccept(this.src, this.dest); - } - - @Override - public LAccept clone(AstFactory af) - { - RoleNode src = this.src.clone(af); - MessageNode msg = this.msg.clone(af); - RoleNode dest = this.dest.clone(af); - return af.LAccept(this.source, src, msg, dest); - //return AstFactoryImpl.FACTORY.LAccept(src, dest); - }*/ - - /*@Override - public LAccept reconstruct(RoleNode src, MessageNode msg, RoleNode dest) - { - ScribDel del = del(); - LAccept lr = new LAccept(this.source, src, msg, dest); - //LAccept lr = new LAccept(src, dest); - lr = (LAccept) lr.del(del); - return lr; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java b/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java deleted file mode 100644 index 16f9c2465..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import java.util.List; -import java.util.stream.Collectors; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.Choice; -import org.scribble.ast.ScribNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.kind.Local; - -public class LChoice extends Choice implements LCompoundSessionNode -{ - // ScribTreeAdaptor#create constructor - public LChoice(Token t) - { - super(t); - } - - // Tree#dupNode constructor - protected LChoice(LChoice node) - { - super(node); - } - - @Override - public LChoice dupNode() - { - return new LChoice(this); - } - - @Override - public List getBlockChildren() - { - List cs = getChildren(); - return cs.subList(1, cs.size()).stream().map(x -> (LProtocolBlock) x) - .collect(Collectors.toList()); - } - - - - - - - - - - - - - - - - - - - - public LChoice(CommonTree source, RoleNode subj, List blocks) - { - super(source, subj, blocks); - } - - /*@Override - protected ScribNodeBase copy() - { - return new LChoice(this.source, this.subj, getBlockChildren()); - } - - @Override - public LChoice clone(AstFactory af) - { - RoleNode subj = this.subj.clone(af); - List blocks = ScribUtil.cloneList(af, getBlockChildren()); - return af.LChoice(this.source, subj, blocks); - }*/ - - /*@Override - public LChoice reconstruct(RoleNode subj, List> blocks) - { - ScribDel del = del(); - LChoice lc = new LChoice(this.source, subj, castBlocks(blocks)); - lc = (LChoice) lc.del(del); - return lc; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LCompoundSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/local/LCompoundSessionNode.java deleted file mode 100644 index 3072c52ab..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LCompoundSessionNode.java +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -public interface LCompoundSessionNode extends LSessionNode -{ - -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LConnectionAction.java b/scribble-ast/src/main/java/org/scribble/ast/local/LConnectionAction.java deleted file mode 100644 index 8e13df0fa..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LConnectionAction.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.ConnectAction; -import org.scribble.ast.MessageNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.kind.Local; - -public abstract class LConnectionAction extends ConnectAction - implements LSimpleSessionNode -{ - // ScribTreeAdaptor#create constructor - public LConnectionAction(Token t) - { - super(t); - } - - // Tree#dupNode constructor - public LConnectionAction(LConnectionAction node) - { - super(node); - } - - - - - - - - - - - - - public LConnectionAction(CommonTree source, RoleNode src, MessageNode msg, - RoleNode dest) - { - super(source, src, msg, dest); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java b/scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java deleted file mode 100644 index 2bc8f3bd7..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.Continue; -import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.type.kind.Local; - -public class LContinue extends Continue implements LSimpleSessionNode -{ - // ScribTreeAdaptor#create constructor - public LContinue(Token t) - { - super(t); - } - - // Tree#dupNode constructor - protected LContinue(LContinue node) - { - super(node); - } - - @Override - public LContinue dupNode() - { - return new LContinue(this); - } - - @Override - public LContinue clone() - { - return (LContinue) super.clone(); - } - - - - - - - - - - - public LContinue(CommonTree source, RecVarNode recvar) - { - super(source, recvar); - } - - /*@Override - protected LContinue copy() - { - return new LContinue(this.source, this.recvar); - } - - @Override - public LContinue clone(AstFactory af) - { - RecVarNode rv = this.recvar.clone(af); - return af.LContinue(this.source, rv); - } - - @Override - public LContinue reconstruct(RecVarNode recvar) - { - ScribDel del = del(); - LContinue lc = new LContinue(this.source, recvar); - lc = (LContinue) lc.del(del); - return lc; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LDelegationElem.java b/scribble-ast/src/main/java/org/scribble/ast/local/LDelegationElem.java deleted file mode 100644 index 73fe09599..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LDelegationElem.java +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.UnaryPayloadElem; -import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.core.type.kind.Local; - -// N.B. extends UnaryPayloadElem, not DelegationElem -public class LDelegationElem extends UnaryPayloadElem -{ - // ScribTreeAdaptor#create constructor - public LDelegationElem(Token t) - { - super(t); - } - - // Tree#dupNode constructor - public LDelegationElem(LDelegationElem node) - { - super(node); - } - - @Override - public LDelegationElem dupNode() - { - return new LDelegationElem(this); - } - - @Override - public boolean isLocalDelegationElem() - { - return true; - } - - /*@Override - public LDelegationElem visitChildren(AstVisitor nv) throws ScribbleException - { - LProtocolNameNode name = (LProtocolNameNode) visitChild(this.name, nv); - return reconstruct(name); - }*/ - - /*@Override - public PayloadElemType toPayloadType() - { - return getNameChild().toPayloadType(); - }*/ - - - - - - - - - - - // Currently no potential for ambiguity because only generated, not parsed - public LDelegationElem(CommonTree source, LProtocolNameNode proto) - { - super(source, proto); - } - - /*@Override - protected LDelegationElem copy() - { - return new LDelegationElem(this.source, (LProtocolNameNode) this.name); - } - - @Override - public LDelegationElem clone(AstFactory af) - { - LProtocolNameNode name = (LProtocolNameNode) this.name.clone(af); - return af.LDelegationElem(this.source, name); - } - - public LDelegationElem reconstruct(LProtocolNameNode proto) - { - ScribDel del = del(); - LDelegationElem elem = new LDelegationElem(this.source, proto); - elem = (LDelegationElem) elem.del(del); - return elem; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java b/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java deleted file mode 100644 index 09d966a34..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.DisconnectAction; -import org.scribble.ast.MessageSigNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.kind.Local; -import org.scribble.util.Constants; - -// "left" of LDisconnect is used for self -public class LDisconnect extends DisconnectAction - implements LSimpleSessionNode -{ - // ScribTreeAdaptor#create constructor - public LDisconnect(Token t) - { - super(t); - this.self = null; - this.peer = null; - } - - // Tree#dupNode constructor - public LDisconnect(LDisconnect node) - { - super(node); - this.self = null; - this.peer = null; - } - - public RoleNode getSelfChild() - { - return getLeftChild(); - } - - public RoleNode getPeerChild() - { - return getRightChild(); - } - - @Override - public LDisconnect dupNode() - { - return new LDisconnect(this); - } - - @Override - public String toString() - { - return Constants.DISCONNECT_KW + " " + getPeerChild() + ";"; - } - - - - - - - - - - - - - - - - - private final RoleNode self; // super.src - private final RoleNode peer; // super.dest - - public LDisconnect(CommonTree source, MessageSigNode unit, RoleNode self, RoleNode peer) - { - //super(source, self, GDisconnect.UNIT_MESSAGE_SIG_NODE, peer); - super(source, self, peer); - this.self = self; - this.peer = peer; - } - - /*@Override - protected ScribNodeBase copy() - { - return new LDisconnect(this.source, (MessageSigNode) this.msg, this.self, this.peer); - } - - @Override - public LDisconnect clone(AstFactory af) - { - RoleNode self = this.self.clone(af); - RoleNode peer = this.peer.clone(af); - return af.LDisconnect(this.source, self, peer); - }*/ - - /*@Override - public LDisconnect reconstruct(RoleNode src, MessageNode msg, RoleNode dest) - //public LDisconnect reconstruct(RoleNode self, RoleNode peer) - { - ScribDel del = del(); - LDisconnect lr = new LDisconnect(this.source, (MessageSigNode) this.msg, this.self, this.peer); - lr = (LDisconnect) lr.del(del); - return lr; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java b/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java deleted file mode 100644 index 0d2f1c2fd..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.Do; -import org.scribble.ast.NonRoleArgList; -import org.scribble.ast.RoleArgList; -import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.core.lang.context.ModuleContext; -import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.LProtocolName; -import org.scribble.lang.LangContext; - -public class LDo extends Do implements LSimpleSessionNode -{ - // ScribTreeAdaptor#create constructor - public LDo(Token t) - { - super(t); - } - - // Tree#dupNode constructor - public LDo(LDo node) - { - super(node); - } - - @Override - public LProtocolNameNode getProtocolNameNode() - { - return (LProtocolNameNode) getChild(2); - } - - @Override - public LDo dupNode() - { - return new LDo(this); - } - - @Override - public LProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) - { - return (LProtocolName) super.getTargetProtocolDeclFullName(mcontext); - } - - @Override - public LProtocolDecl getTargetProtocolDecl(LangContext jcontext, - ModuleContext mcontext) - { - return (LProtocolDecl) super.getTargetProtocolDecl(jcontext, mcontext); - } - - - - - - - - - - - - - - public LDo(CommonTree source, RoleArgList roleinstans, NonRoleArgList arginstans, LProtocolNameNode proto) - { - super(source, roleinstans, arginstans, proto); - } - - /*@Override - protected LDo copy() - { - return new LDo(this.source, this.roles, this.args, getProtocolNameNode()); - } - - @Override - public LDo clone(AstFactory af) - { - RoleArgList roles = this.roles.clone(af); - NonRoleArgList args = this.args.clone(af); - LProtocolNameNode proto = this.getProtocolNameNode().clone(af); - return af.LDo(this.source, roles, args, proto); - } - - @Override - public LDo reconstruct(RoleArgList roles, NonRoleArgList args, ProtocolNameNode proto) - { - ScribDel del = del(); - LDo ld = new LDo(this.source, roles, args, (LProtocolNameNode) proto); - ld = (LDo) ld.del(del); - return ld; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LInteractionSeq.java b/scribble-ast/src/main/java/org/scribble/ast/local/LInteractionSeq.java deleted file mode 100644 index 04dc30456..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LInteractionSeq.java +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import java.util.List; -import java.util.stream.Collectors; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.InteractionSeq; -import org.scribble.core.type.kind.Local; - -public class LInteractionSeq extends InteractionSeq implements LScribNode -{ - // ScribTreeAdaptor#create constructor - public LInteractionSeq(Token t) - { - super(t); - } - - // Tree#dupNode constructor - public LInteractionSeq(LInteractionSeq node) - { - super(node); - } - - @Override - public LInteractionSeq dupNode() - { - return new LInteractionSeq(this); - } - - @Override - public List getInteractionChildren() - { - return getChildren().stream().map(n -> (LSessionNode) n) - .collect(Collectors.toList()); - } - - @Override - public boolean isLocal() - { - return true; - } - - - - - - - - - - - - - - public LInteractionSeq(CommonTree source, List lis) - { - super(source, lis); - } - - /*@Override - protected ScribNodeBase copy() - { - return new LInteractionSeq(this.source, getInteractNodeChildren()); - } - - @Override - public LInteractionSeq clone(AstFactory af) - { - List lis = ScribUtil.cloneList(af, getInteractNodeChildren()); - return af.LInteractionSeq(this.source, lis); - } - - @Override - public LInteractionSeq reconstruct(List> actions) - { - ScribDel del = del(); - LInteractionSeq lis = new LInteractionSeq(this.source, castNodes(actions)); - lis = (LInteractionSeq) lis.del(del); - return lis; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LMessageTransfer.java b/scribble-ast/src/main/java/org/scribble/ast/local/LMessageTransfer.java deleted file mode 100644 index 353f430a8..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LMessageTransfer.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import java.util.List; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.MessageNode; -import org.scribble.ast.MessageTransfer; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.kind.Local; - -public abstract class LMessageTransfer extends MessageTransfer - implements LSimpleSessionNode -{ - // ScribTreeAdaptor#create constructor - public LMessageTransfer(Token t) - { - super(t); - } - - // Tree#dupNode constructor - public LMessageTransfer(LMessageTransfer node) - { - super(node); - } - - - - - - - - - - public LMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List dests) - { - super(source, src, msg, dests); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java deleted file mode 100644 index cfb328b4d..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import java.util.List; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.ProtocolMod; - -// A projected local proto -- cf. parsed -public class LProjectionDecl extends LProtocolDecl -{ - // ScribTreeAdaptor#create constructor - public LProjectionDecl(Token t) - { - super(t); - } - - // Tree#dupNode constructor - protected LProjectionDecl(LProjectionDecl node) - { - super(node); - } - - // Cf. CommonTree#dupNode - @Override - public LProjectionDecl dupNode() - { - return new LProjectionDecl(this); - } - - - - - - - - - - - - - - - - public LProjectionDecl(CommonTree source, List modifiers, LProtocolHeader header, LProtocolDef def) - { - super(source, modifiers, header, def); - } - - /*@Override - protected ScribNodeBase copy() - { - return new LProjectionDecl(this.source, this.modifiers, getHeaderChild(), getDefChild()); - } - - @Override - public LProjectionDecl clone(AstFactory af) - { - LProtocolHeader header = getHeaderChild().clone(af); - LProtocolDef def = getDefChild().clone(af); - LProjectionDeclDel del = (LProjectionDeclDel) del(); - return af.LProjectionDecl(this.source, this.modifiers, del.getSourceProtocol(), del.getSelfRole(), header, def); - } - - @Override - public LProjectionDecl reconstruct(ProtocolHeader header, ProtocolDef def) - { - ScribDel del = del(); - LProjectionDecl lpd = new LProjectionDecl(this.source, this.modifiers, (LProtocolHeader) header, (LProtocolDef) def); - lpd = (LProjectionDecl) lpd.del(del); - return lpd; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java deleted file mode 100644 index 395f4e4cf..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolBlock.java +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.ProtocolBlock; -import org.scribble.core.type.kind.Local; - -public class LProtocolBlock extends ProtocolBlock implements LScribNode -{ - // ScribTreeAdaptor#create constructor - public LProtocolBlock(Token t) - { - super(t); - } - - // Tree#dupNode constructor - protected LProtocolBlock(LProtocolBlock node) - { - super(node); - } - - @Override - public LProtocolBlock dupNode() - { - return new LProtocolBlock(this); - } - - @Override - public LProtocolBlock clone() - { - return (LProtocolBlock) super.clone(); - } - - @Override - public LInteractionSeq getInteractSeqChild() - { - return (LInteractionSeq) getChild(0); - } - - - - - - - - - - - public LProtocolBlock(CommonTree source, LInteractionSeq seq) - { - super(source, seq); - } - - /*@Override - protected LProtocolBlock copy() - { - return new LProtocolBlock(this.source, getInteractSeqChild()); - } - - @Override - public LProtocolBlock clone(AstFactory af) - { - LInteractionSeq lis = getInteractSeqChild().clone(af); - return af.LProtocolBlock(this.source, lis); - } - - @Override - public LProtocolBlock reconstruct(InteractionSeq seq) - { - ScribDel del = del(); - LProtocolBlock lpb = new LProtocolBlock(this.source, (LInteractionSeq) seq); - lpb = (LProtocolBlock) lpb.del(del); - return lpb; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolDecl.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolDecl.java deleted file mode 100644 index c070f0e70..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolDecl.java +++ /dev/null @@ -1,130 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import java.util.List; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.Module; -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ProtocolDef; -import org.scribble.ast.ProtocolHeader; -import org.scribble.ast.ProtocolMod; -import org.scribble.ast.ProtocolModList; -import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.LProtocolName; -import org.scribble.core.type.name.ModuleName; -import org.scribble.core.type.name.Role; - -// CHECKME: maybe make abstract with concrete parsed (LParsedDecl) and projected (LProjectionDecl) subclasses -public class LProtocolDecl extends ProtocolDecl implements LScribNode -{ - // ScribTreeAdaptor#create constructor - public LProtocolDecl(Token t) - { - super(t); - } - - // Tree#dupNode constructor - protected LProtocolDecl(LProtocolDecl node) - { - super(node); - } - - @Override - public LProtocolHeader getHeaderChild() - { - return (LProtocolHeader) getChild(1); - } - - @Override - public LProtocolDef getDefChild() - { - return (LProtocolDef) getChild(2); - } - - // Cf. CommonTree#dupNode - @Override - public LProtocolDecl dupNode() - { - return new LProtocolDecl(this); - } - - @Override - public LProtocolDecl reconstruct(ProtocolModList mods, - ProtocolHeader header, ProtocolDef def) - { - return (LProtocolDecl) super.reconstruct(mods, header, def); - } - - @Override - public LProtocolName getFullMemberName(Module mod) - { - ModuleName fullmodname = mod.getFullModuleName(); - return new LProtocolName(fullmodname, getHeaderChild().getDeclName()); - } - - public Role getSelfRole() - { - return getHeaderChild().getSelfRole(); - } - - - - - - - - - - - - - - - - - - - - public LProtocolDecl(CommonTree source, List modifiers, - LProtocolHeader header, LProtocolDef def) - { - super(source, modifiers, header, def); - } - - /*@Override - protected ScribNodeBase copy() - { - return new LProtocolDecl(this.source, this.modifiers, getHeaderChild(), getDefChild()); - } - - @Override - public LProtocolDecl clone(AstFactory af) - { - LProtocolHeader header = getHeaderChild().clone(af); - LProtocolDef def = getDefChild().clone(af); - return af.LProtocolDecl(this.source, this.modifiers, header, def); - } - - @Override - public LProtocolDecl reconstruct(ProtocolHeader header, ProtocolDef def) - { - ScribDel del = del(); - LProtocolDecl lpd = new LProtocolDecl(this.source, this.modifiers, (LProtocolHeader) header, (LProtocolDef) def); - lpd = (LProtocolDecl) lpd.del(del); - return lpd; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolDef.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolDef.java deleted file mode 100644 index f5c858944..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolDef.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.ProtocolDef; -import org.scribble.core.type.kind.Local; - -public class LProtocolDef extends ProtocolDef implements LScribNode -{ - // ScribTreeAdaptor#create constructor - public LProtocolDef(Token t) - { - super(t); - } - - // Tree#dupNode constructor - protected LProtocolDef(LProtocolDef node) - { - super(node); - } - - @Override - public LProtocolDef dupNode() - { - return new LProtocolDef(this); - } - - @Override - public LProtocolBlock getBlockChild() - { - return (LProtocolBlock) getChild(0); - } - - - - - - - - - - - - - - - - public LProtocolDef(CommonTree source, LProtocolBlock block) - { - super(source, block); - } - - /*@Override - protected LProtocolDef copy() - { - return new LProtocolDef(this.source, getBlock()); - } - - @Override - public LProtocolDef clone(AstFactory af) - { - LProtocolBlock block = getBlock().clone(af); - return af.LProtocolDef(this.source, block); - } - - @Override - public LProtocolDef reconstruct(ProtocolBlock block) - { - ScribDel del = del(); - LProtocolDef lpd = new LProtocolDef(this.source, (LProtocolBlock) block); - lpd = (LProtocolDef) lpd.del(del); - return lpd; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolHeader.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolHeader.java deleted file mode 100644 index 0aa23dafa..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LProtocolHeader.java +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.NameDeclNode; -import org.scribble.ast.NonRoleParamDeclList; -import org.scribble.ast.ProtocolHeader; -import org.scribble.ast.RoleDecl; -import org.scribble.ast.RoleDeclList; -import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.ast.name.qualified.ProtocolNameNode; -import org.scribble.core.type.kind.Local; -import org.scribble.core.type.kind.RoleKind; -import org.scribble.core.type.name.LProtocolName; -import org.scribble.core.type.name.Role; -import org.scribble.util.Constants; - -public class LProtocolHeader extends ProtocolHeader implements LScribNode -{ - // ScribTreeAdaptor#create constructor - public LProtocolHeader(Token t) - { - super(t); - } - - // Tree#dupNode constructor - protected LProtocolHeader(LProtocolHeader node) - { - super(node); - } - - @Override - public LProtocolNameNode getNameNodeChild() - { - return (LProtocolNameNode) getNameNodeChild(); - } - - @Override - public LProtocolHeader dupNode() - { - return new LProtocolHeader(this); - } - - @Override - public LProtocolHeader reconstruct(ProtocolNameNode name, - RoleDeclList rdl, NonRoleParamDeclList pdl) - { - return (LProtocolHeader) super.reconstruct(name, rdl, pdl); - } - - public Role getSelfRole() - { - RoleDeclList rdl = getRoleDeclListChild(); - for (NameDeclNode rd : rdl.getParamDeclChildren()) - { - RoleDecl tmp = (RoleDecl) rd; - if (tmp.isSelfRoleDecl()) - { - return tmp.getDeclName(); - } - } - throw new RuntimeException("Shouldn't get here: " + rdl); - } - - @Override - public LProtocolName getDeclName() - { - return getNameNodeChild().toName(); - } - - @Override - public String toString() - { - return Constants.LOCAL_KW + " " + super.toString(); - } - - - - - - - - - - - - - public LProtocolHeader(CommonTree source, LProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) - { - super(source, name, roledecls, paramdecls); - } - - /*@Override - protected ScribNodeBase copy() - { - return new LProtocolHeader(this.source, getNameNodeChild(), this.roledecls, this.paramdecls); - } - - @Override - public LProtocolHeader clone(AstFactory af) - { - LProtocolNameNode name = getNameNodeChild().clone(af); - RoleDeclList roledecls = this.roledecls.clone(af); - NonRoleParamDeclList paramdecls = this.paramdecls.clone(af); - return af.LProtocolHeader(this.source, name, roledecls, paramdecls); - } - - @Override - public LProtocolHeader reconstruct(ProtocolNameNode name, RoleDeclList rdl, NonRoleParamDeclList pdl) - { - ScribDel del = del(); - LProtocolHeader gph = new LProtocolHeader(this.source, (LProtocolNameNode) name, rdl, pdl); - gph = (LProtocolHeader) gph.del(del); - return gph; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java b/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java deleted file mode 100644 index e57878b5d..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.Recursion; -import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.type.kind.Local; - -public class LRecursion extends Recursion implements LCompoundSessionNode -{ - // ScribTreeAdaptor#create constructor - public LRecursion(Token t) - { - super(t); - } - - // Tree#dupNode constructor - protected LRecursion(LRecursion node) - { - super(node); - } - - @Override - public LRecursion dupNode() - { - return new LRecursion(this); - } - - @Override - public LProtocolBlock getBlockChild() - { - return (LProtocolBlock) getChild(1); - } - - - - - - - - - - - - - - public LRecursion(CommonTree source, RecVarNode recvar, LProtocolBlock block) - { - super(source, recvar, block); - } - - /*@Override - protected LRecursion copy() - { - return new LRecursion(this.source, this.recvar, getBlockChild()); - } - - @Override - public LRecursion reconstruct(RecVarNode recvar, ProtocolBlock block) - { - ScribDel del = del(); - LRecursion lr = new LRecursion(this.source, recvar, (LProtocolBlock) block); - lr = (LRecursion) lr.del(del); - return lr; - } - - @Override - public LRecursion clone(AstFactory af) - { - RecVarNode recvar = this.recvar.clone(af); - LProtocolBlock block = getBlockChild().clone(af); - return af.LRecursion(this.source, recvar, block); - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java b/scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java deleted file mode 100644 index 019958a4f..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import java.util.List; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.MessageNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.util.Constants; - -public class LRecv extends LMessageTransfer -{ - // ScribTreeAdaptor#create constructor - public LRecv(Token t) - { - super(t); - } - - // Tree#dupNode constructor - public LRecv(LRecv node) - { - super(node); - } - - @Override - public LRecv dupNode() - { - return new LRecv(this); - } - - @Override - public String toString() - { - return getMessageNodeChild() + " " + Constants.FROM_KW + " " - + getSourceChild() + ";"; - } - - - - - - - - - - public LRecv(CommonTree source, RoleNode src, MessageNode msg, List dests) - { - super(source, src, msg, dests); - } - - /*@Override - protected ScribNodeBase copy() - { - return new LReceive(this.source, this.src, this.msg, getDestinationChildren()); - } - - @Override - public LReceive clone(AstFactory af) - { - RoleNode src = this.src.clone(af); - MessageNode msg = this.msg.clone(af); - List dests = ScribUtil.cloneList(af, getDestinationChildren()); - return af.LReceive(this.source, src, msg, dests); - } - - @Override - public LReceive reconstruct(RoleNode src, MessageNode msg, List dests) - { - ScribDel del = del(); - LReceive lr = new LReceive(this.source, src, msg, dests); - lr = (LReceive) lr.del(del); - return lr; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java b/scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java deleted file mode 100644 index 666d02814..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LRequest.java +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.MessageNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.util.Constants; - -public class LRequest extends LConnectionAction -{ - // ScribTreeAdaptor#create constructor - public LRequest(Token t) - { - super(t); - } - - // Tree#dupNode constructor - public LRequest(LRequest node) - { - super(node); - } - - @Override - public LRequest dupNode() - { - return new LRequest(this); - } - - @Override - public String toString() - { - return (isUnitMessage() ? "" : getMessageNodeChild() + " ") - + Constants.CONNECT_KW + " " + getDestinationChild().toString() + ";"; - } - - - - - - - - - - - - - - - - public LRequest(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) - //public LConnect(RoleNode src, RoleNode dest) - { - super(source, src, msg, dest); - //super(src, dest); - } - - /*@Override - protected ScribNodeBase copy() - { - return new LRequest(this.source, this.src, this.msg, this.dest); - //return new LConnect(this.src, this.dest); - } - - @Override - public LRequest clone(AstFactory af) - { - RoleNode src = this.src.clone(af); - MessageNode msg = this.msg.clone(af); - RoleNode dest = this.dest.clone(af); - return af.LConnect(this.source, src, msg, dest); - //return AstFactoryImpl.FACTORY.LConnect(src, dest); - } - - @Override - public LRequest reconstruct(RoleNode src, MessageNode msg, RoleNode dest) - //public LConnect reconstruct(RoleNode src, RoleNode dest) - { - ScribDel del = del(); - LRequest ls = new LRequest(this.source, src, msg, dest); - //LConnect ls = new LConnect(src, dest); - ls = (LRequest) ls.del(del); - return ls; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LScribNode.java b/scribble-ast/src/main/java/org/scribble/ast/local/LScribNode.java deleted file mode 100644 index da6d84bc5..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LScribNode.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import org.scribble.ast.ProtocolKindNode; -import org.scribble.core.type.kind.Local; - -public interface LScribNode extends ProtocolKindNode -{ - @Override - default boolean isLocal() - { - return true; - } - - @Override - default Local getKind() - { - return Local.KIND; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java deleted file mode 100644 index f47a440a5..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import java.util.List; -import java.util.stream.Collectors; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.MessageNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.util.Constants; - -public class LSend extends LMessageTransfer -{ - // ScribTreeAdaptor#create constructor - public LSend(Token t) - { - super(t); - } - - // Tree#dupNode constructor - public LSend(LSend node) - { - super(node); - } - - @Override - public LSend dupNode() - { - return new LSend(this); - } - - @Override - public String toString() - { - return getMessageNodeChild() + " " - + Constants.TO_KW + " " + getDestinationChildren().stream() - .map(dest -> dest.toString()).collect(Collectors.joining(", ")) - + ";"; - } - - - - - - - - - - - - - - public LSend(CommonTree source, RoleNode src, MessageNode msg, List dests) - { - super(source, src, msg, dests); - } - - /*@Override - protected ScribNodeBase copy() - { - return new LSend(this.source, this.src, this.msg, getDestinationChildren()); - } - - @Override - public LSend clone(AstFactory af) - { - RoleNode src = this.src.clone(af); - MessageNode msg = this.msg.clone(af); - List dests = ScribUtil.cloneList(af, getDestinationChildren()); - return af.LSend(this.source, src, msg, dests); - } - - @Override - public LSend reconstruct(RoleNode src, MessageNode msg, List dests) - { - ScribDel del = del(); - LSend ls = new LSend(this.source, src, msg, dests); - ls = (LSend) ls.del(del); - return ls; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java deleted file mode 100644 index ac4cacb3b..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import org.scribble.ast.SessionNode; -import org.scribble.core.type.kind.Local; - -// Alternatively to interface, use GNode subclass with delegation to "super" base (e.g. Choice) classes -public interface LSessionNode extends SessionNode, LScribNode -{ - -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java deleted file mode 100644 index 88861cd57..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -public interface LSimpleSessionNode extends LSessionNode -{ - -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java deleted file mode 100644 index d80628120..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LWrapClient.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.MessageSigNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.util.Constants; - -public class LWrapClient extends LConnectionAction -{ - // ScribTreeAdaptor#create constructor - public LWrapClient(Token t) - { - super(t); - } - - // Tree#dupNode constructor - public LWrapClient(LWrapClient node) - { - super(node); - } - - @Override - public LWrapClient dupNode() - { - return new LWrapClient(this); - } - - @Override - public String toString() - { - return Constants.WRAP_KW + " " + Constants.TO_KW + " " - + getDestinationChild().toString() + ";"; - } - - - - - - - - - - - - - - - - - - public LWrapClient(CommonTree source, MessageSigNode unit, RoleNode src, RoleNode dest) - { - //super(source, src, GWrap.UNIT_MESSAGE_SIG_NODE, dest); - super(source, src, unit, dest); - } - - /*@Override - protected ScribNodeBase copy() - { - return new LWrapClient(this.source, (MessageSigNode) this.msg, this.src, this.dest); - } - - @Override - public LWrapClient clone(AstFactory af) - { - RoleNode src = this.src.clone(af); - RoleNode dest = this.dest.clone(af); - return af.LWrapClient(this.source, src, dest); - } - - @Override - public LWrapClient reconstruct(RoleNode src, MessageNode msg, RoleNode dest) - //public LWrapClient reconstruct(RoleNode src, RoleNode dest) - { - ScribDel del = del(); - LWrapClient ls = new LWrapClient(this.source, (MessageSigNode) this.msg, src, dest); - ls = (LWrapClient) ls.del(del); - return ls; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java deleted file mode 100644 index 8174f70f2..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LWrapServer.java +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.MessageSigNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.util.Constants; - -public class LWrapServer extends LConnectionAction -{ - // ScribTreeAdaptor#create constructor - public LWrapServer(Token t) - { - super(t); - } - - // Tree#dupNode constructor - public LWrapServer(LWrapServer node) - { - super(node); - } - - @Override - public LWrapServer dupNode() - { - return new LWrapServer(this); - } - - @Override - public String toString() - { - return Constants.WRAP_KW + " " + Constants.FROM_KW + " " - + this.getSourceChild() + ";"; - } - - - - - - - - - - - - - - public LWrapServer(CommonTree source, MessageSigNode unit, RoleNode src, RoleNode dest) - { - super(source, src, unit, dest); - } - - /*@Override - protected ScribNodeBase copy() - { - return new LWrapServer(this.source, (MessageSigNode) this.msg, this.src, this.dest); - } - - @Override - public LWrapServer clone(AstFactory af) - { - RoleNode src = this.src.clone(af); - RoleNode dest = this.dest.clone(af); - return af.LWrapServer(this.source, src, dest); - } - - @Override - public LWrapServer reconstruct(RoleNode src, MessageNode msg, RoleNode dest) - //public LWrapServer reconstruct(RoleNode src, RoleNode dest) - { - ScribDel del = del(); - LWrapServer lr = new LWrapServer(this.source, (MessageSigNode) this.msg, src, dest); - lr = (LWrapServer) lr.del(del); - return lr; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/SelfRoleDecl.java b/scribble-ast/src/main/java/org/scribble/ast/local/SelfRoleDecl.java deleted file mode 100644 index 3166685fb..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/local/SelfRoleDecl.java +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.local; - -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.RoleDecl; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.name.Role; - -// Child should be a "self" ID node -public class SelfRoleDecl extends RoleDecl -{ - // ScribTreeAdaptor#create constructor - public SelfRoleDecl(Token t) - { - super(t); - } - - // Tree#dupNode constructor - public SelfRoleDecl(SelfRoleDecl node) - { - super(node); - } - - @Override - public SelfRoleDecl dupNode() - { - return new SelfRoleDecl(this); - } - - @Override - public SelfRoleDecl project(AstFactory af, Role self) - { - throw new RuntimeException("Shouldn't get in here: " + this); - } - - @Override - public boolean isSelfRoleDecl() - { - return true; - } - - - - - - - - - - - - - - - - public SelfRoleDecl(CommonTree source, RoleNode rn) - { - super(source, rn); - } - - /*@Override - protected SelfRoleDecl copy() - { - return new SelfRoleDecl(this.source, (RoleNode) this.name); - } - - @Override - public RoleDecl reconstruct(SimpleNameNode name) - { - ScribDel del = del(); - SelfRoleDecl rd = new SelfRoleDecl(this.source, (RoleNode) name); - rd = (SelfRoleDecl) rd.del(del); - return rd; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java index 372299d0b..b89a09c09 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java +++ b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java @@ -22,12 +22,10 @@ import org.scribble.ast.Module; import org.scribble.ast.NonProtocolDecl; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ast.local.LProtocolDecl; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.lang.context.ScribNames; import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.ModuleName; import org.scribble.util.ScribException; @@ -110,12 +108,6 @@ private static void addModule(ScribNames names, Module mod, gpd.getHeaderChild().getDeclName()); names.globals.put(qualif, gpd.getFullMemberName(mod)); } - for (LProtocolDecl lpd : mod.getLProtoDeclChildren()) - { - LProtocolName qualif = new LProtocolName(modname, - lpd.getHeaderChild().getDeclName()); - names.locals.put(qualif, lpd.getFullMemberName(mod)); - } } // Could move to ImportModule but would need a defensive copy setter, or cache info in builder and create on leave @@ -192,12 +184,6 @@ private void addVisible(Map parsed, Module root) gpd.getHeaderChild().getDeclName().toString()); this.visible.globals.put(visname, gpd.getFullMemberName(root)); } - for (LProtocolDecl lpd : root.getLProtoDeclChildren()) - { - LProtocolName visname = new LProtocolName( - lpd.getHeaderChild().getDeclName().toString()); - this.visible.locals.put(visname, lpd.getFullMemberName(root)); - } } /*@Override diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index b67ddfb97..6b467190a 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -70,7 +70,7 @@ module tmp.Test; // try modulecontextvisitor by "static lookup" // try move antlrwrapper to parser again -// re-check disamb pass -- e.g., do-target disamb done by translation -- check, e.g., message transfer message disamb (signames, payloads) +// re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) // refactor additional disamb syntactic checks into core? e.g., do-calls, distinct roledecls, protodecls, etc. // refactor scribble.g, simplify ast/del/etc class names and deprecated class code //make a visitor factory From 32033ed4b4ef9ee2cb87118420f6ebaa9b269284 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 11 Apr 2019 00:09:01 +0100 Subject: [PATCH 249/539] Continued: WIP cleaning up ast classes. --- .../java/org/scribble/ast/AstFactory.java | 44 +++-- .../java/org/scribble/ast/AstFactoryImpl.java | 163 +++++++++++------- .../main/java/org/scribble/ast/AuxMod.java | 12 +- .../org/scribble/ast/BasicInteraction.java | 20 --- .../java/org/scribble/ast/ConnectAction.java | 34 +--- .../main/java/org/scribble/ast/Continue.java | 28 +-- .../org/scribble/ast/DirectedInteraction.java | 52 +----- .../org/scribble/ast/DisconnectAction.java | 41 +---- .../src/main/java/org/scribble/ast/Do.java | 49 ++---- .../src/main/java/org/scribble/ast/DoArg.java | 31 +--- .../main/java/org/scribble/ast/DoArgList.java | 37 +--- .../org/scribble/ast/HeaderParamDeclList.java | 52 ++---- .../org/scribble/ast/MessageTransfer.java | 40 +---- .../java/org/scribble/ast/NonRoleArg.java | 49 +----- .../java/org/scribble/ast/NonRoleArgList.java | 68 ++------ .../scribble/ast/NonRoleParamDeclList.java | 51 +----- .../java/org/scribble/ast/ProtocolDecl.java | 53 ++---- .../java/org/scribble/ast/ProtocolHeader.java | 51 ++---- .../org/scribble/ast/ProtocolModList.java | 43 ++--- .../main/java/org/scribble/ast/Recursion.java | 41 +---- .../main/java/org/scribble/ast/RoleArg.java | 57 +----- .../java/org/scribble/ast/RoleArgList.java | 67 +------ .../main/java/org/scribble/ast/RoleDecl.java | 45 ----- .../java/org/scribble/ast/RoleDeclList.java | 56 +----- .../java/org/scribble/ast/ScopedNode.java | 30 ---- .../main/java/org/scribble/ast/ScribNode.java | 22 +-- .../java/org/scribble/ast/ScribNodeBase.java | 2 +- .../org/scribble/ast/SimpleSessionNode.java | 15 -- .../org/scribble/ast/UnaryPayloadElem.java | 61 +------ .../org/scribble/ast/global/GConnect.java | 52 ------ .../org/scribble/ast/global/GContinue.java | 38 ---- .../org/scribble/ast/global/GDisconnect.java | 46 ----- .../java/org/scribble/ast/global/GDo.java | 50 +----- .../scribble/ast/global/GMessageTransfer.java | 48 ------ .../scribble/ast/global/GProtocolDecl.java | 79 +-------- .../scribble/ast/global/GProtocolHeader.java | 53 +----- .../org/scribble/ast/global/GRecursion.java | 36 +--- .../java/org/scribble/ast/global/GWrap.java | 45 ----- .../org/scribble/del/NonRoleArgListDel.java | 2 +- .../org/scribble/del/ProtocolDeclDel.java | 1 + .../lang/context/ModuleContextCollector.java | 1 - scribble-test/src/test/scrib/tmp/Test.scr | 6 +- 42 files changed, 289 insertions(+), 1482 deletions(-) delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/ScopedNode.java diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 5ec5d7a2f..162ede416 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -15,6 +15,7 @@ import java.util.List; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; @@ -66,10 +67,8 @@ PayloadElemList PayloadElemList(CommonTree source, List> payloadelems); // PayloadElem PayloadElem(PayloadElemNameNode name); - // UnaryPayloadElem DataTypeElem(PayloadElemNameNode name); - // UnaryPayloadElem UnaryPayloadElem(PayloadElemNameNode name); - UnaryPayloadElem UnaryPayloadElem( - CommonTree source, PayloadElemNameNode name); + UnaryPayloadElem UnaryPayloadElem(Token t, + PayloadElemNameNode name); ModuleDecl ModuleDecl(CommonTree source, ModuleNameNode fullmodname); @@ -82,18 +81,19 @@ MessageSigNameDecl MessageSigNameDecl(CommonTree source, String schema, DataTypeDecl DataTypeDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name); - GProtocolDecl GProtocolDecl(CommonTree source, List modifiers, + GProtocolDecl GProtocolDecl(Token t, ProtocolModList modifiers, GProtocolHeader header, GProtocolDef def); - GProtocolHeader GProtocolHeader(CommonTree source, GProtocolNameNode name, + GProtocolHeader GProtocolHeader(Token t, GProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls); - RoleDeclList RoleDeclList(CommonTree source, List rds); + RoleDeclList RoleDeclList(Token t, List rds); - RoleDecl RoleDecl(CommonTree source, RoleNode role); + RoleDecl RoleDecl(Token t, RoleNode role); // ConnectDecl ConnectDecl(CommonTree source, RoleNode src, RoleNode role); - NonRoleParamDeclList NonRoleParamDeclList(CommonTree source, + + NonRoleParamDeclList NonRoleParamDeclList(Token t, List> pds); NonRoleParamDecl NonRoleParamDecl( @@ -106,35 +106,33 @@ NonRoleParamDecl NonRoleParamDecl( GInteractionSeq GInteractionSeq(CommonTree source, List gis); - GMessageTransfer GMessageTransfer(CommonTree source, RoleNode src, - MessageNode msg, List dests); + GMessageTransfer GMessageTransfer(Token t, RoleNode src, + MessageNode msg, List dsts); - GConnect GConnect(CommonTree source, RoleNode src, MessageNode msg, + GConnect GConnect(Token t, RoleNode src, MessageNode msg, RoleNode dest); - // GConnect GConnect(CommonTree source, RoleNode src, RoleNode dest); - GDisconnect GDisconnect(CommonTree source, RoleNode src, RoleNode dest); + GDisconnect GDisconnect(Token t, RoleNode src, RoleNode dst); - GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest); + GWrap GWrap(Token t, RoleNode src, RoleNode dst); GChoice GChoice(CommonTree source, RoleNode subj, List blocks); - GRecursion GRecursion(CommonTree source, RecVarNode recvar, - GProtocolBlock block); + GRecursion GRecursion(Token t, RecVarNode recvar, GProtocolBlock block); - GContinue GContinue(CommonTree source, RecVarNode recvar); + GContinue GContinue(Token t, RecVarNode recvar); - GDo GDo(CommonTree source, RoleArgList roles, NonRoleArgList args, + GDo GDo(Token t, RoleArgList roles, NonRoleArgList args, GProtocolNameNode proto); - RoleArgList RoleArgList(CommonTree source, List roles); + RoleArgList RoleArgList(Token t, List roles); - RoleArg RoleArg(CommonTree source, RoleNode role); + RoleArg RoleArg(Token t, RoleNode role); - NonRoleArgList NonRoleArgList(CommonTree source, List args); + NonRoleArgList NonRoleArgList(Token t, List args); - NonRoleArg NonRoleArg(CommonTree source, NonRoleArgNode arg); + NonRoleArg NonRoleArg(Token t, NonRoleArgNode arg); NameNode SimpleNameNode(CommonTree source, K kind, String identifier); diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java index b4cb2b7bd..763da7ffb 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -17,6 +17,7 @@ import java.util.Collections; import java.util.List; +import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; @@ -163,14 +164,15 @@ public PayloadElem PayloadElem(PayloadElemNameNode name) }*/ @Override - //public UnaryPayloadElem DataTypeElem(PayloadElemNameNode name) - //public UnaryPayloadElem UnaryPayloadElem(PayloadElemNameNode name) public UnaryPayloadElem UnaryPayloadElem( - CommonTree source, PayloadElemNameNode name) + Token t, PayloadElemNameNode name) { - UnaryPayloadElem de= new UnaryPayloadElem<>(source, name); + UnaryPayloadElem de = new UnaryPayloadElem<>(t); + // Cf. Scribble.g children order + de.addChild(name); de = del(de, createDefaultDelegate()); return de; + //throw new RuntimeException("[TODO] : " + name); // Currently parsed "directly" by ANTLR -- do we still need to construct manually? } @Override @@ -231,39 +233,47 @@ public DataTypeDecl DataTypeDecl(CommonTree source, String schema, } @Override - public GProtocolDecl GProtocolDecl(CommonTree source, List mods, + public GProtocolDecl GProtocolDecl(Token t, ProtocolModList mods, GProtocolHeader header, GProtocolDef def) { - GProtocolDecl gpd = new GProtocolDecl(source, mods, header, def); + GProtocolDecl gpd = new GProtocolDecl(t); + gpd.addChild(mods); + gpd.addChild(header); + gpd.addChild(def); gpd = del(gpd, new GProtocolDeclDel()); return gpd; } @Override - public GProtocolHeader GProtocolHeader(CommonTree source, + public GProtocolHeader GProtocolHeader(Token t, GProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) { - GProtocolHeader gph = new GProtocolHeader(source, name, roledecls, - paramdecls); - gph = del(gph, createDefaultDelegate()); - return gph; + GProtocolHeader n = new GProtocolHeader(t); + n.addChild(name); + n.addChild(paramdecls); + n.addChild(roledecls); + n = del(n, createDefaultDelegate()); + return n; } @Override - public RoleDeclList RoleDeclList(CommonTree source, List rds) + public RoleDeclList RoleDeclList(Token t, List rds) { - RoleDeclList rdl = new RoleDeclList(source, rds); + RoleDeclList rdl = new RoleDeclList(t); + // Cf. Scribble.g children order + rdl.addChildren(rds); rdl = del(rdl, new RoleDeclListDel()); return rdl; } @Override - public RoleDecl RoleDecl(CommonTree source, RoleNode namenode) + public RoleDecl RoleDecl(Token t, RoleNode namenode) { - RoleDecl rd = new RoleDecl(source, namenode); - rd = del(rd, new RoleDeclDel()); - return rd; + RoleDecl n = new RoleDecl(t); + n.addChild(namenode); + n = del(n, new RoleDeclDel()); + return n; } /*@Override @@ -275,10 +285,12 @@ public ConnectDecl ConnectDecl(RoleNode src, RoleNode role) }*/ @Override - public NonRoleParamDeclList NonRoleParamDeclList(CommonTree source, + public NonRoleParamDeclList NonRoleParamDeclList(Token t, List> pds) { - NonRoleParamDeclList pdl = new NonRoleParamDeclList(source, pds); + NonRoleParamDeclList pdl = new NonRoleParamDeclList(t); + // Cf. Scribble.g children order + pdl.addChildren(pds); pdl = del(pdl, new NonRoleParamDeclListDel()); return pdl; } @@ -319,39 +331,46 @@ public GInteractionSeq GInteractionSeq(CommonTree source, } @Override - public GMessageTransfer GMessageTransfer(CommonTree source, RoleNode src, - MessageNode msg, List dests) + public GMessageTransfer GMessageTransfer(Token t, RoleNode src, + MessageNode msg, List dsts) { - GMessageTransfer gmt = new GMessageTransfer(source, src, msg, dests); - gmt = del(gmt, new GMessageTransferDel()); - return gmt; + GMessageTransfer n = new GMessageTransfer(t); + n.addChild(msg); + n.addChild(src); + n.addChildren(dsts); + n = del(n, new GMessageTransferDel()); + return n; } @Override - public GConnect GConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) - //public GConnect GConnect(RoleNode src, RoleNode dest) + public GConnect GConnect(Token t, RoleNode src, MessageNode msg, RoleNode dst) { - GConnect gc = new GConnect(source, src, msg, dest); - //GConnect gc = new GConnect(src, dest); - gc = del(gc, new GConnectDel()); - return gc; + GConnect n = new GConnect(t); + n.addChild(msg); + n.addChild(src); + n.addChild(dst); + n = del(n, new GConnectDel()); + return n; } @Override - public GDisconnect GDisconnect(CommonTree source, RoleNode src, RoleNode dest) + public GDisconnect GDisconnect(Token t, RoleNode left, RoleNode right) { - GDisconnect gc = new GDisconnect(source, //UnitMessageSigNode(), - src, dest); - gc = del(gc, new GDisconnectDel()); - return gc; + GDisconnect n = new GDisconnect(t); + n.addChild(left); + n.addChild(right); + n = del(n, new GDisconnectDel()); + return n; } @Override - public GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest) + public GWrap GWrap(Token t, RoleNode src, RoleNode dst) { - GWrap gw = new GWrap(source, UnitMessageSigNode(), src, dest); - gw = del(gw, new GWrapDel()); - return gw; + GWrap n = new GWrap(t); + n.addChild(src); + n.addChild(dst); + n = del(n, new GWrapDel()); + return n; } @Override @@ -364,61 +383,71 @@ public GChoice GChoice(CommonTree source, RoleNode subj, } @Override - public GRecursion GRecursion(CommonTree source, RecVarNode recvar, + public GRecursion GRecursion(Token t, RecVarNode recvar, GProtocolBlock block) { - GRecursion gr = new GRecursion(source, recvar, block); - gr = del(gr, new GRecursionDel()); - return gr; + GRecursion n = new GRecursion(t); + n.addChild(recvar); + n.addChild(block); + n = del(n, new GRecursionDel()); + return n; } @Override - public GContinue GContinue(CommonTree source, RecVarNode recvar) + public GContinue GContinue(Token t, RecVarNode recvar) { - GContinue gc = new GContinue(source, recvar); - gc = del(gc, new GContinueDel()); - return gc; + GContinue n = new GContinue(t); + n.addChild(recvar); + n = del(n, new GContinueDel()); + return n; } @Override - public GDo GDo(CommonTree source, RoleArgList roleinstans, + public GDo GDo(Token t, RoleArgList roleinstans, NonRoleArgList arginstans, GProtocolNameNode proto) { - GDo gd = new GDo(source, roleinstans, arginstans, proto); - gd = del(gd, new GDoDel()); - return gd; + GDo n = new GDo(t); + n.addChild(proto); + n.addChild(roleinstans); + n.addChild(arginstans); + n = del(n, new GDoDel()); + return n; } @Override - public RoleArgList RoleArgList(CommonTree source, List ris) + public RoleArgList RoleArgList(Token t, List ris) { - RoleArgList rdl = new RoleArgList(source, ris); - rdl = del(rdl, new RoleArgListDel()); - return rdl; + RoleArgList n = new RoleArgList(t); + n.addChildren(ris); + n = del(n, new RoleArgListDel()); + return n; } @Override - public RoleArg RoleArg(CommonTree source, RoleNode role) + public RoleArg RoleArg(Token t, RoleNode role) { - RoleArg ri = new RoleArg(source, role); - ri = del(ri, createDefaultDelegate()); - return ri; + RoleArg n = new RoleArg(t); + n.addChild(role); + n = del(n, createDefaultDelegate()); + return n; } @Override - public NonRoleArgList NonRoleArgList(CommonTree source, List ais) + public NonRoleArgList NonRoleArgList(Token t, List ais) { - NonRoleArgList rdl = new NonRoleArgList(source, ais); - rdl = del(rdl, new NonRoleArgListDel()); - return rdl; + NonRoleArgList n = new NonRoleArgList(t); + n.addChildren(ais); + n = del(n, new NonRoleArgListDel()); + return n; } @Override - public NonRoleArg NonRoleArg(CommonTree source, NonRoleArgNode arg) + public NonRoleArg NonRoleArg(Token t, NonRoleArgNode arg) { - NonRoleArg ri = new NonRoleArg(source, arg); - ri = del(ri, createDefaultDelegate()); - return ri; + NonRoleArg n = new NonRoleArg(t); + n.addChild(arg); + n = del(n, createDefaultDelegate()); + return n; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/AuxMod.java b/scribble-ast/src/main/java/org/scribble/ast/AuxMod.java index 2146d0585..5839f03cf 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AuxMod.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AuxMod.java @@ -28,18 +28,18 @@ protected AuxMod(AuxMod node) { super(node); } - - @Override - public boolean isAux() - { - return true; - } @Override public AuxMod dupNode() { return new AuxMod(this); // return this also OK, since no children } + + @Override + public boolean isAux() + { + return true; + } @Override public String toString() diff --git a/scribble-ast/src/main/java/org/scribble/ast/BasicInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/BasicInteraction.java index 136e403d3..29505a63f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/BasicInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/BasicInteraction.java @@ -14,7 +14,6 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; public abstract class BasicInteraction @@ -31,24 +30,5 @@ public BasicInteraction(BasicInteraction node) { super(node); } - - - - - - - - - - - - - - - protected BasicInteraction(CommonTree source) - { - super(source); - } - } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java b/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java index 67a3313dc..883e70a79 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java @@ -14,11 +14,8 @@ package org.scribble.ast; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.ProtocolKind; @@ -30,18 +27,12 @@ public abstract class ConnectAction public ConnectAction(Token t) { super(t); - this.src = null; - this.msg = null; - this.dest = null; } // Tree#dupNode constructor public ConnectAction(ConnectAction node) { super(node); - this.src = null; - this.msg = null; - this.dest = null; } // TODO: refactor @@ -55,7 +46,7 @@ public RoleNode getDestinationChild() return dests.get(0); } - // Currently only used for toString, because current syntax allows "connect" with no explicit message + // CHECKME: currently only used for toString, because current syntax allows "connect" with no explicit message ? protected boolean isUnitMessage() { MessageNode n = getMessageNodeChild(); @@ -66,27 +57,4 @@ protected boolean isUnitMessage() MessageSigNode msn = (MessageSigNode) n; return msn.getOpChild().isEmpty() && msn.getPayloadListChild().isEmpty(); } - - - - - - - - - - - - private final RoleNode src; - private final MessageNode msg; - private final RoleNode dest; - - protected ConnectAction(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) - //protected ConnectionAction(RoleNode src, RoleNode dest) - { - super(source, src, msg, Stream.of(dest).collect(Collectors.toList())); - this.src = src; - this.msg = msg; - this.dest = dest; - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/Continue.java b/scribble-ast/src/main/java/org/scribble/ast/Continue.java index 368ab865e..001eb71a3 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Continue.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Continue.java @@ -14,10 +14,8 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.del.ScribDel; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -25,33 +23,32 @@ public abstract class Continue extends SimpleSessionNode { + public static final int RECVAR_CHILD_INDEX = 0; + // ScribTreeAdaptor#create constructor public Continue(Token t) { super(t); - this.recvar = null; } // Tree#dupNode constructor protected Continue(Continue node) { super(node); - this.recvar = null; } public abstract Continue dupNode(); public RecVarNode getRecVarChild() { - return (RecVarNode) getChild(0); + return (RecVarNode) getChild(RECVAR_CHILD_INDEX); } public Continue reconstruct(RecVarNode recvar) { Continue r = dupNode(); - ScribDel del = del(); r.addChild(recvar); - r.setDel(del); // No copy + r.setDel(del()); // No copy return r; } @@ -67,21 +64,4 @@ public String toString() { return Constants.CONTINUE_KW + " " + getRecVarChild() + ";"; } - - - - - - - - - - - private final RecVarNode recvar; - - protected Continue(CommonTree source, RecVarNode recvar) - { - super(source); - this.recvar = recvar; - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java index 79b1b0ee4..61791b0af 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java @@ -30,41 +30,37 @@ public abstract class DirectedInteraction extends BasicInteraction { + public static final int MSG_CHILD_INDEX = 0; + public static final int SRC_CHILD_INDEX = 1; + public static final int DST_CHILDREN_START_INDEX = 2; + // ScribTreeAdaptor#create constructor public DirectedInteraction(Token t) { super(t); - this.src = null; - this.msg = null; - this.dests = null; } // Tree#dupNode constructor public DirectedInteraction(DirectedInteraction node) { super(node); - this.src = null; - this.msg = null; - this.dests = null; } public MessageNode getMessageNodeChild() { - return (MessageNode) getChild(0); + return (MessageNode) getChild(MSG_CHILD_INDEX); } public RoleNode getSourceChild() { - return (RoleNode) getChild(1); + return (RoleNode) getChild(SRC_CHILD_INDEX); } - // CHECKME: OK for (future) connect? public List getDestinationChildren() { - //return Collections.unmodifiableList(this.dests); List cs = getChildren(); - return cs.subList(2, cs.size()).stream().map(x -> (RoleNode) x) - .collect(Collectors.toList()); + return cs.subList(DST_CHILDREN_START_INDEX, cs.size()).stream() + .map(x -> (RoleNode) x).collect(Collectors.toList()); } public final List getDestinationRoles() @@ -83,8 +79,7 @@ public DirectedInteraction reconstruct(MessageNode msg, RoleNode src, mt.addChild(msg); mt.addChild(src); mt.addChildren(dests); - ScribDel del = del(); - mt.setDel(del); // No copy + mt.setDel(del()); // No copy return mt; } @@ -98,34 +93,5 @@ public DirectedInteraction visitChildren(AstVisitor nv) getDestinationChildren(), nv); return reconstruct(msg, src, dests); } - - @Override - public abstract String toString(); - - - - - - - - - - - - - - - private final RoleNode src; - private final MessageNode msg; // CHECKME: ambig may get resolved to an unexpected kind, e.g. DataTypeNode (cf. DoArg, PayloadElem wrappers) - private final List dests; - - protected DirectedInteraction(CommonTree source, RoleNode src, MessageNode msg, List dests) - { - super(source); - this.src = src; - this.msg = msg; - this.dests = new LinkedList<>(dests); // CHECKME: Collections.unmodifiable? - } - } diff --git a/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java b/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java index 27bec11d0..5d8b34dea 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java @@ -14,10 +14,8 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -26,30 +24,29 @@ public abstract class DisconnectAction extends BasicInteraction { + public static final int LEFT_CHILD_INDEX = 0; + public static final int RIGHT_CHILD_INDEX = 1; + // ScribTreeAdaptor#create constructor public DisconnectAction(Token t) { super(t); - this.left = null; - this.right = null; } // Tree#dupNode constructor public DisconnectAction(DisconnectAction node) { super(node); - this.left = null; - this.right = null; } public RoleNode getLeftChild() { - return (RoleNode) getChild(0); + return (RoleNode) getChild(LEFT_CHILD_INDEX); } public RoleNode getRightChild() { - return (RoleNode) getChild(1); + return (RoleNode) getChild(RIGHT_CHILD_INDEX); } public abstract DisconnectAction dupNode(); @@ -59,8 +56,7 @@ public DisconnectAction reconstruct(RoleNode left, RoleNode right) DisconnectAction da = dupNode(); da.addChild(left); da.addChild(right); - ScribDel del = del(); - da.setDel(del); // No copy + da.setDel(del()); // No copy return da; } @@ -72,29 +68,4 @@ public DisconnectAction visitChildren(AstVisitor nv) RoleNode dest = (RoleNode) visitChild(getRightChild(), nv); return reconstruct(src, dest); } - - @Override - public abstract String toString(); - - - - - - - - - - - - - - public final RoleNode left; - public final RoleNode right; - - protected DisconnectAction(CommonTree source, RoleNode src, RoleNode dest) - { - super(source); - this.left = src; - this.right = dest; - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/Do.java b/scribble-ast/src/main/java/org/scribble/ast/Do.java index 963754ff8..6e9366b88 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Do.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Do.java @@ -16,13 +16,11 @@ import java.util.Iterator; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.ProtocolNameNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.ProtocolName; import org.scribble.core.type.name.Role; -import org.scribble.del.ScribDel; import org.scribble.lang.LangContext; import org.scribble.util.Constants; import org.scribble.util.ScribException; @@ -31,48 +29,45 @@ public abstract class Do extends SimpleSessionNode // implements ScopedNode { + public static final int NAME_CHILD_INDEX = 0; + public static final int ARG_LIST_CHILD_INDEX = 1; + public static final int ROLE_LIST_CHILD_INDEX = 2; + // ScribTreeAdaptor#create constructor public Do(Token t) { super(t); - this.roles = null; - this.args = null; - this.proto = null; } // Tree#dupNode constructor public Do(Do node) { super(node); - this.roles = null; - this.args = null; - this.proto = null; } - // getChild(0) public abstract ProtocolNameNode getProtocolNameNode(); public NonRoleArgList getNonRoleListChild() { - return (NonRoleArgList) getChild(1); + return (NonRoleArgList) getChild(ARG_LIST_CHILD_INDEX); } // CHECKME: maybe wrap up role args and non-role args within the same container? public RoleArgList getRoleListChild() { - return (RoleArgList) getChild(2); + return (RoleArgList) getChild(ROLE_LIST_CHILD_INDEX); } public abstract Do dupNode(); - public Do reconstruct(RoleArgList roles, NonRoleArgList args, ProtocolNameNode proto) + public Do reconstruct(RoleArgList roles, NonRoleArgList args, + ProtocolNameNode proto) { Do sig = dupNode(); sig.addChild(proto); // Order re. getter indices sig.addChild(args); sig.addChild(roles); - ScribDel del = del(); - sig.setDel(del); // No copy + sig.setDel(del()); // No copy return sig; } @@ -86,7 +81,7 @@ public Do visitChildren(AstVisitor nv) throws ScribException return reconstruct(ril, al, proto); } - // FIXME: mcontext now redundant because NameDisambiguator converts all targets to full names + // FIXME: mcontext now redundant because NameDisambiguator converts all targets to full names -- NO: currently disamb doesn't // To get full name from original target name, use mcontext visible names (e.g. in or before name disambiguation pass) // This is still useful for subclass casting to G/LProtocolName public ProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) @@ -129,28 +124,4 @@ public String toString() return s + getProtocolNameNode() + getNonRoleListChild() + getRoleListChild() + ";"; } - - - - - - - - - - - - - - private final RoleArgList roles; - private final NonRoleArgList args; - private final ProtocolNameNode proto; // Maybe use an "Ambiguous" version until names resolved -- is a visible protocol, but not necessarily a simple or full member name - - protected Do(CommonTree source, RoleArgList roleinstans, NonRoleArgList arginstans, ProtocolNameNode proto) - { - super(source); - this.roles = roleinstans; - this.args = arginstans; - this.proto = proto; - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/DoArg.java b/scribble-ast/src/main/java/org/scribble/ast/DoArg.java index 712b94bd0..30bd03113 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DoArg.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DoArg.java @@ -14,8 +14,6 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -30,17 +28,15 @@ public abstract class DoArg extends ScribNodeBase public DoArg(Token t) { super(t); - this.val = null; } // Tree#dupNode constructor public DoArg(DoArg node) { super(node); - this.val = null; } - public abstract T getValChild(); + public abstract T getArgNodeChild(); public abstract DoArg dupNode(); @@ -56,7 +52,7 @@ public DoArg reconstruct(T arg) @Override public DoArg visitChildren(AstVisitor nv) throws ScribException { - ScribNode visited = visitChild(getValChild(), nv); // Disambiguation will replace AmbiguousNameNodes + ScribNode visited = visitChild(getArgNodeChild(), nv); // Disambiguation will replace AmbiguousNameNodes // CHECKME: use visitChildWithClassEqualityCheck? if (!(visited instanceof DoArgNode)) { @@ -66,31 +62,10 @@ public DoArg visitChildren(AstVisitor nv) throws ScribException T arg = (T) visited; return reconstruct(arg); } - - public abstract DoArg project(AstFactory af, Role self); @Override public String toString() { - return getValChild().toString(); - } - - - - - - - - - - - - private final T val; - - protected DoArg(CommonTree source, T arg) - { - super(source); - this.val = arg; + return getArgNodeChild().toString(); } - } diff --git a/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java b/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java index 31a443893..038cd5c40 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java @@ -13,13 +13,10 @@ */ package org.scribble.ast; -import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -27,20 +24,18 @@ // Cf. HeaderParameterDeclList -- but not kinded, because cannot determine Arg kind directly from node syntax itself (kinding for ModelNodes is to supplement syntactic information, not "typing" work) // DoArgList (NonRoleArgList) can be of mixed kinds, so DoArg (NonRoleArg) used as "wildcard" wrapper // "? extends InstantiationNode" not enforced here (e.g. can put "? extends ModelNode"), because ultimately any instantiation of this class needs an actual instance of "Instantiation" which has to have a parameter that extends "InstantiationNode" -public abstract class DoArgList> extends ScribNodeBase +public abstract class DoArgList> extends ScribNodeBase { // ScribTreeAdaptor#create constructor public DoArgList(Token t) { super(t); - this.args = null; } // Tree#dupNode constructor public DoArgList(DoArgList node) { super(node); - this.args = null; } protected List getRawArgChildren() @@ -49,6 +44,11 @@ protected List getRawArgChildren() } public abstract List getArgChildren(); + + public int length() + { + return getChildCount(); + } @Override public abstract DoArgList dupNode(); @@ -62,8 +62,6 @@ public DoArgList reconstruct(List args) return argList; } - public abstract DoArgList project(AstFactory af, Role self); - @Override public DoArgList visitChildren(AstVisitor nv) throws ScribException { @@ -71,11 +69,6 @@ public DoArgList visitChildren(AstVisitor nv) throws ScribException visitChildListWithClassEqualityCheck(this, getArgChildren(), nv); return reconstruct(nds); } - - public int length() - { - return getChildCount(); - } // Like HeaderParamDeclList, without enclosing braces -- added by subclasses @Override @@ -84,22 +77,4 @@ public String toString() return getArgChildren().stream().map(a -> a.toString()) .collect(Collectors.joining(", ")); } - - - - - - - - - - - private final List args; - - public DoArgList(CommonTree source, List is) - { - super(source); - this.args = new LinkedList<>(is); - } - } diff --git a/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDeclList.java index a0e21e472..8d83ef5f7 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDeclList.java @@ -13,14 +13,11 @@ */ package org.scribble.ast; -import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ParamKind; -import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -33,18 +30,26 @@ public abstract class HeaderParamDeclList extends ScribNode public HeaderParamDeclList(Token t) { super(t); - this.decls = null; } // Tree#dupNode constructor public HeaderParamDeclList(HeaderParamDeclList node) { super(node); - this.decls = null; } public abstract List> getParamDeclChildren(); + public final int length() + { + return getParamDeclChildren().size(); + } + + public final boolean isEmpty() + { + return length() == 0; + } + @Override public abstract HeaderParamDeclList dupNode(); @@ -59,46 +64,19 @@ public HeaderParamDeclList reconstruct( } @Override - public HeaderParamDeclList visitChildren(AstVisitor nv) + public HeaderParamDeclList visitChildren(AstVisitor v) throws ScribException { - List> nds = - visitChildListWithClassEqualityCheck(this, getParamDeclChildren(), nv); - return reconstruct(nds); - } - - public abstract HeaderParamDeclList project(AstFactory af, Role self); // CHECKME: move to delegate? - - public int length() - { - return getParamDeclChildren().size(); - } - - public boolean isEmpty() - { - return length() == 0; + List> ps = + visitChildListWithClassEqualityCheck(this, getParamDeclChildren(), v); + return reconstruct(ps); } // Without enclosing braces -- added by subclasses @Override public String toString() { - return getParamDeclChildren().stream().map(nd -> nd.toString()) + return getParamDeclChildren().stream().map(x -> x.toString()) .collect(Collectors.joining(", ")); } - - - - - - - - - private final List> decls; - - protected HeaderParamDeclList(CommonTree source, List> decls) - { - super(source); - this.decls = new LinkedList<>(decls); - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/MessageTransfer.java b/scribble-ast/src/main/java/org/scribble/ast/MessageTransfer.java index 69530dfc2..da6fe1399 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/MessageTransfer.java +++ b/scribble-ast/src/main/java/org/scribble/ast/MessageTransfer.java @@ -13,12 +13,7 @@ */ package org.scribble.ast; -import java.util.LinkedList; -import java.util.List; - import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.ProtocolKind; public abstract class MessageTransfer @@ -28,46 +23,13 @@ public abstract class MessageTransfer public MessageTransfer(Token t) { super(t); - this.src = null; - this.msg = null; - this.dests = null; } // Tree#dupNode constructor public MessageTransfer(MessageTransfer node) { super(node); - this.src = null; - this.msg = null; - this.dests = null; } - - public abstract MessageTransfer dupNode(); - - - - - - - - - - - - - - - private final RoleNode src; - private final MessageNode msg; // CHECKME: ambig may get resolved to an unexpected kind, e.g. DataTypeNode (cf. DoArg, PayloadElem wrappers) - private final List dests; - - protected MessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List dests) - { - super(source, src, msg, dests); - this.src = src; - this.msg = msg; - this.dests = new LinkedList<>(dests); // CHECKME: Collections.unmodifiable? - } - } + diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArg.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArg.java index 36d3e2338..d97a1d489 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArg.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArg.java @@ -14,11 +14,11 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.type.name.Role; public class NonRoleArg extends DoArg { + public static final int ARG_NODE_CHILD_INDEX = 0; + // ScribTreeAdaptor#create constructor public NonRoleArg(Token t) { @@ -32,9 +32,9 @@ public NonRoleArg(NonRoleArg node) } @Override - public NonRoleArgNode getValChild() + public NonRoleArgNode getArgNodeChild() { - return (NonRoleArgNode) getChild(0); + return (NonRoleArgNode) getChild(ARG_NODE_CHILD_INDEX); } @Override @@ -42,45 +42,4 @@ public NonRoleArg dupNode() { return new NonRoleArg(this); } - - @Override - public NonRoleArg project(AstFactory af, Role self) - { - return af.NonRoleArg(this.source, getValChild()); // arg needs projection? - } - - - - - - - - - - public NonRoleArg(CommonTree source, NonRoleArgNode arg) - { - super(source, arg); - } - - /*@Override - protected ScribNodeBase copy() - { - return new NonRoleArg(this.source, getValChild()); - } - - @Override - public NonRoleArg clone(AstFactory af) - { - NonRoleArgNode arg = (NonRoleArgNode) getValChild().clone(af); - return af.NonRoleArg(this.source, arg); - } - - @Override - public NonRoleArg reconstruct(NonRoleArgNode arg) - { - ScribDel del = del(); - NonRoleArg ai = new NonRoleArg(this.source, arg); - ai = (NonRoleArg) ai.del(del); - return ai; - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java index 3d593699a..2d8cce9a5 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java @@ -18,12 +18,10 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.NonRoleArgKind; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.MessageSigName; -import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.MessageSig; @@ -49,36 +47,22 @@ public List getArgChildren() .collect(Collectors.toList()); } - @Override - public NonRoleArgList dupNode() + public List getArgNodes() { - return new NonRoleArgList(this); - } - - @Override - public NonRoleArgList project(AstFactory af, Role self) - { - List args = getArgChildren().stream() - .map(ai -> ai.project(af, self)).collect(Collectors.toList()); - return af.NonRoleArgList(this.source, args); + return getArgChildren().stream().map(ai -> ai.getArgNodeChild()) + .collect(Collectors.toList()); } public boolean isEmpty() { return getArgChildren().isEmpty(); } - - public List getArgumentNodes() - { - return getArgChildren().stream().map(ai -> ai.getValChild()) - .collect(Collectors.toList()); - } // Can return a mix of arg kinds public List> getArguments() { return getArgChildren().stream() - .map(ai -> (Arg) ai.getValChild().toArg()) + .map(ai -> (Arg) ai.getArgNodeChild().toArg()) .collect(Collectors.toList()); } @@ -107,6 +91,12 @@ else if (a instanceof MessageSigName) } return cast; } + + @Override + public NonRoleArgList dupNode() + { + return new NonRoleArgList(this); + } @Override public String toString() @@ -115,42 +105,4 @@ public String toString() ? "" : "<" + super.toString() + ">"; } - - - - - - - - - - - - - public NonRoleArgList(CommonTree source, List args) - { - super(source, args); - } - - /*@Override - protected ScribNodeBase copy() - { - return new NonRoleArgList(this.source, getArgChildren()); - } - - @Override - public NonRoleArgList clone(AstFactory af) - { - List args = ScribUtil.cloneList(af, getArgChildren()); - return af.NonRoleArgList(this.source, args); - } - - @Override - public DoArgList reconstruct(List instans) - { - ScribDel del = del(); - NonRoleArgList ail = new NonRoleArgList(this.source, instans); - ail = (NonRoleArgList) ail.del(del); - return ail; - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java index 3a7d7b68a..c62c72d99 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java @@ -17,10 +17,8 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; // Can contain "mixed" type/sig kinds @@ -51,6 +49,12 @@ public List> getParamDeclChildren() return cast; } + public List> getParameters() + { + return getParamDeclChildren().stream().map(decl -> decl.getDeclName()) + .collect(Collectors.toList()); + } + @Override public NonRoleParamDeclList dupNode() { @@ -67,19 +71,6 @@ public NonRoleParamDeclList reconstruct( sig.setDel(del); // No copy return sig; } - - // CHECKME: move to delegate? - @Override - public NonRoleParamDeclList project(AstFactory af, Role self) - { - return af.NonRoleParamDeclList(this.source, getParamDeclChildren()); - } - - public List> getParameters() - { - return getParamDeclChildren().stream().map(decl -> decl.getDeclName()) - .collect(Collectors.toList()); - } @Override public String toString() @@ -88,34 +79,4 @@ public String toString() ? "" : "<" + super.toString() + ">"; } - - - - - - - - - - - - - - public NonRoleParamDeclList(CommonTree source, List> decls) - { - super(source, decls); - } - - /*@Override - protected NonRoleParamDeclList copy() - { - return new NonRoleParamDeclList(this.source, getParamDeclChildren()); - } - - @Override - public NonRoleParamDeclList clone(AstFactory af) - { - List> decls = ScribUtil.cloneList(af, getParamDeclChildren()); - return af.NonRoleParamDeclList(this.source, decls); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolDecl.java index d5ba9eb3e..f57f674d9 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolDecl.java @@ -13,11 +13,9 @@ */ package org.scribble.ast; -import java.util.Collections; import java.util.List; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; @@ -28,49 +26,48 @@ public abstract class ProtocolDecl extends ScribNodeBase implements ModuleMember, ProtocolKindNode { + public static final int MODLIST_CHILD = 0; + public static final int HEADER_CHILD = 1; + public static final int DEF_CHILD = 2; // ScribTreeAdaptor#create constructor protected ProtocolDecl(Token t) { super(t); - this.modifiers = null; - this.header = null; - this.def = null; } // Tree#dupNode constructor protected ProtocolDecl(ProtocolDecl node) { super(node); - this.modifiers = null; - this.header = null; - this.def = null; } public abstract ProtocolDecl dupNode(); public boolean isAux() { - //return getModifierListChild().getModList().contains(ProtocolMod.AUX); return getModifierListChild().hasAux(); } public boolean isExplicit() { - //return getModifierListChild().getModList().contains(ProtocolMod.EXPLICIT); return getModifierListChild().hasExplicit(); } public ProtocolModList getModifierListChild() { - return (ProtocolModList) getChild(0); + return (ProtocolModList) getChild(MODLIST_CHILD); } // Implement in subclasses to avoid generic cast public abstract ProtocolHeader getHeaderChild(); public abstract ProtocolDef getDefChild(); - - //public abstract ProtocolName getFullProtocolName(Module mod); + + public List getRoles() + { + // WF disallows unused role declarations + return getHeaderChild().getRoleDeclListChild().getRoles(); + } public ProtocolDecl reconstruct(ProtocolModList mods, ProtocolHeader header, ProtocolDef def) @@ -96,12 +93,6 @@ public ProtocolDecl visitChildren(AstVisitor nv) throws ScribException return reconstruct(mods, header, def); } - public List getRoles() - { - // WF disallows unused role declarations - return getHeaderChild().getRoleDeclListChild().getRoles(); - } - @Override public String toString() { @@ -109,28 +100,4 @@ public String toString() return (mods.isEmpty() ? "" : mods + " ") + getHeaderChild() + " " + getDefChild(); } - - - - - - - - - - - - // Maybe just use standard pattern, make private with casting getters -- works better (e.g. to use overridden getName) - public final List modifiers; - private final ProtocolHeader header; - private final ProtocolDef def; - - protected ProtocolDecl(CommonTree source, List modifiers, - ProtocolHeader header, ProtocolDef def) - { - super(source); - this.modifiers = Collections.unmodifiableList(modifiers); - this.header = header; - this.def = def; - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolHeader.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolHeader.java index 4e48dc853..8fed3f878 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolHeader.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolHeader.java @@ -14,8 +14,6 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.name.NameNode; import org.scribble.ast.name.qualified.ProtocolNameNode; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.ProtocolName; @@ -28,38 +26,43 @@ public abstract class ProtocolHeader extends NameDeclNode implements ProtocolKindNode { + public static final int NAMENODE_CHILD = 0; + public static final int PARAMDECLLIST_CHILD = 1; + public static final int ROLEDECLLIST_CHILD = 2; + // ScribTreeAdaptor#create constructor public ProtocolHeader(Token t) { super(t); - this.roledecls = null; - this.paramdecls = null; } // Tree#dupNode constructor protected ProtocolHeader(ProtocolHeader node) { super(node); - this.roledecls = null; - this.paramdecls = null; } - public abstract ProtocolHeader dupNode(); - // Simple name @Override public abstract ProtocolNameNode getNameNodeChild(); - public RoleDeclList getRoleDeclListChild() + public NonRoleParamDeclList getParamDeclListChild() { - return (RoleDeclList) getChild(2); // TODO: swap order with paramdecllist (in grammar) + return (NonRoleParamDeclList) getChild(PARAMDECLLIST_CHILD); } - public NonRoleParamDeclList getParamDeclListChild() + public RoleDeclList getRoleDeclListChild() { - return (NonRoleParamDeclList) getChild(1); + return (RoleDeclList) getChild(ROLEDECLLIST_CHILD); // TODO: swap order with paramdecllist (in grammar) + } + + public boolean isParamDeclListEmpty() + { + return getParamDeclListChild().isEmpty(); } + public abstract ProtocolHeader dupNode(); + public ProtocolHeader reconstruct(ProtocolNameNode name, RoleDeclList rdl, NonRoleParamDeclList pdl) { @@ -83,11 +86,6 @@ public ProtocolHeader visitChildren(AstVisitor nv) throws ScribException return reconstruct(getNameNodeChild(), rdl, pdl); } - public boolean isParameterDeclListEmpty() - { - return getParamDeclListChild().isEmpty(); - } - @Override public ProtocolName getDeclName() { @@ -98,27 +96,10 @@ public ProtocolName getDeclName() public String toString() { String s = Constants.PROTOCOL_KW + " " + getNameNodeChild(); - if (!isParameterDeclListEmpty()) + if (!isParamDeclListEmpty()) { s += getParamDeclListChild(); } return s + getRoleDeclListChild(); } - - - - - - - - private final RoleDeclList roledecls; - private final NonRoleParamDeclList paramdecls; - - // name = simple name - protected ProtocolHeader(CommonTree source, NameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) - { - super(source, name); - this.roledecls = roledecls; - this.paramdecls = paramdecls; - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolModList.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolModList.java index e9f23dbb0..cd488fa59 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolModList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolModList.java @@ -34,41 +34,21 @@ protected ProtocolModList(ProtocolModList node) { super(node); } - - @Override - public ProtocolModList dupNode() - { - return new ProtocolModList(this); - } - - @Override - public ProtocolModList visitChildren(AstVisitor nv) throws ScribException - { - // CHECKME: no child visiting, no reconstruct? - return this; - } // Cf., NameNode::getSimpleNameList public List getModList() { - /*return ((List) getChildren()).stream() - .map(x -> parseModifier(((CommonTree) x).getText())) - .collect(Collectors.toList()); - // CHECKME: currently AmbigNameNode(?) - // CHECKME: factor out getText?*/ return ((List) getChildren()).stream().map(x -> (ProtocolMod) x) .collect(Collectors.toList()); } public boolean hasAux() { - //return getModList().contains(ProtocolMod.AUX); return getModList().stream().anyMatch(x -> x.isAux()); } public boolean hasExplicit() { - //return getModList().contains(ProtocolMod.EXPLICIT); return getModList().stream().anyMatch(x -> x.isExplicit()); } @@ -76,6 +56,19 @@ public boolean isEmpty() { return getChildCount() == 0; } + + @Override + public ProtocolModList dupNode() + { + return new ProtocolModList(this); + } + + @Override + public ProtocolModList visitChildren(AstVisitor nv) throws ScribException + { + // CHECKME: no child visiting, no reconstruct? + return this; + } @Override public String toString() @@ -83,14 +76,4 @@ public String toString() return getModList().stream().map(x -> x.toString()) .collect(Collectors.joining(" ")); } - - /*private ProtocolMod parseModifier(String mod) - { - switch (mod) - { - case "aux": return ProtocolMod.AUX; - case "explicit": return ProtocolMod.EXPLICIT; - default: throw new RuntimeException("Unknown modifier: " + mod); - } - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/Recursion.java b/scribble-ast/src/main/java/org/scribble/ast/Recursion.java index 88e671d33..268021da3 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Recursion.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Recursion.java @@ -14,10 +14,8 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.del.ScribDel; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -25,27 +23,26 @@ public abstract class Recursion extends CompoundInteraction { + public static final int RECVAR_CHILD_INDEX = 0; + public static final int BODY_CHILD_INDEX = 1; + // ScribTreeAdaptor#create constructor public Recursion(Token t) { super(t); - this.recvar = null; - this.block = null; } // Tree#dupNode constructor protected Recursion(Recursion node) { super(node); - this.recvar = null; - this.block = null; } public abstract Recursion dupNode(); public RecVarNode getRecVarChild() { - return (RecVarNode) getChild(0); + return (RecVarNode) getChild(RECVAR_CHILD_INDEX); } public abstract ProtocolBlock getBlockChild(); @@ -53,10 +50,9 @@ public RecVarNode getRecVarChild() public Recursion reconstruct(RecVarNode recvar, ProtocolBlock block) { Recursion r = dupNode(); - ScribDel del = del(); r.addChild(recvar); r.addChild(block); - r.setDel(del); // No copy + r.setDel(del()); // No copy return r; } @@ -74,31 +70,4 @@ public String toString() { return Constants.REC_KW + " " + getRecVarChild() + " " + getBlockChild(); } - - - - - - - - - - - - - - - private final RecVarNode recvar; - private final ProtocolBlock block; - - protected Recursion(CommonTree source, RecVarNode recvar, ProtocolBlock block) - { - super(source); - this.recvar = recvar; - this.block = block; - } - - /*@Override - public abstract Recursion clone(AstFactory af);*/ - } diff --git a/scribble-ast/src/main/java/org/scribble/ast/RoleArg.java b/scribble-ast/src/main/java/org/scribble/ast/RoleArg.java index b91fb7b0e..3f67d3688 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/RoleArg.java +++ b/scribble-ast/src/main/java/org/scribble/ast/RoleArg.java @@ -14,10 +14,7 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.kind.RoleKind; -import org.scribble.core.type.name.Role; // CHECKME: can this be simplified to an interface? (also NonRoleArg) public class RoleArg extends DoArg @@ -35,7 +32,7 @@ public RoleArg(RoleArg node) } @Override - public RoleNode getValChild() + public RoleNode getArgNodeChild() { return (RoleNode) getChild(0); } @@ -45,56 +42,4 @@ public RoleArg dupNode() { return new RoleArg(this); } - - // CHECKME: move to delegate? - @Override - public RoleArg project(AstFactory af, Role self) - { - RoleNode r = getValChild(); - RoleNode rn = (RoleNode) af.SimpleNameNode(r.source, RoleKind.KIND, - r.toName().toString()); - return af.RoleArg(this.source, rn); - } - - - - - - - - - - - public RoleArg(CommonTree source, RoleNode arg) - { - super(source, arg); - } - - /*@Override - protected ScribNodeBase copy() - { - return new RoleArg(this.source, getValChild()); - } - - @Override - public RoleArg clone(AstFactory af) - { - RoleNode role = getValChild().clone(af); - return af.RoleArg(this.source, role); - } - - @Override - public RoleArg reconstruct(RoleNode arg) - { - ScribDel del = del(); - RoleArg ri = new RoleArg(this.source, arg); - ri = (RoleArg) ri.del(del); - return ri; - } - - @Override - public RoleNode getValChild() - { - return (RoleNode) super.getValChild(); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/RoleArgList.java b/scribble-ast/src/main/java/org/scribble/ast/RoleArgList.java index 95b2e4d56..011a15c7e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/RoleArgList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/RoleArgList.java @@ -17,7 +17,6 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.name.Role; public class RoleArgList extends DoArgList @@ -40,6 +39,13 @@ public List getArgChildren() return getRawArgChildren().stream().map(x -> (RoleArg) x) .collect(Collectors.toList()); } + + // The role arguments + public List getRoles() + { + return getArgChildren().stream().map(ri -> ri.getArgNodeChild().toName()) + .collect(Collectors.toList()); + } @Override public RoleArgList dupNode() @@ -53,68 +59,9 @@ public RoleArgList reconstruct(List args) return (RoleArgList) super.reconstruct(args); } - // Move to delegate? - @Override - public RoleArgList project(AstFactory af, Role self) - { - List args = - getArgChildren().stream().map(ri -> ri.project(af, self)) - .collect(Collectors.toList()); - return af.RoleArgList(this.source, args); - } - - // The role arguments - public List getRoles() - { - return getArgChildren().stream().map(ri -> ri.getValChild().toName()) - .collect(Collectors.toList()); - } - @Override public String toString() { return "(" + super.toString() + ")"; } - - - - - - - - - - - - - - - - - public RoleArgList(CommonTree source, List roles) - { - super(source, roles); - } - - /*@Override - protected RoleArgList copy() - { - return new RoleArgList(this.source, getArgChildren()); - } - - @Override - public RoleArgList clone(AstFactory af) - { - List roles = ScribUtil.cloneList(af, getArgChildren()); - return af.RoleArgList(this.source, roles); - } - - @Override - public RoleArgList reconstruct(List roles) - { - ScribDel del = del(); - RoleArgList rl = new RoleArgList(this.source, roles); - rl = (RoleArgList) rl.del(del); - return rl; - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java b/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java index 7f50ec318..e4c1a4dbc 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java @@ -14,7 +14,6 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.RoleKind; import org.scribble.core.type.name.Role; @@ -51,54 +50,10 @@ public Role getDeclName() { return getNameNodeChild().toName(); } - - public boolean isSelfRoleDecl() - { - return false; - } @Override public String getKeyword() { return Constants.ROLE_KW; } - - - - - - - - - - - - - public RoleDecl(CommonTree source, RoleNode name) - { - super(source, name); - } - - /*@Override - protected RoleDecl copy() - { - return new RoleDecl(this.source, (RoleNode) this.name); - } - - @Override - public RoleDecl clone(AstFactory af) - { - RoleNode role = (RoleNode) this.name.clone(af); - return af.RoleDecl(this.source, role); - } - - @Override - public RoleDecl reconstruct(SimpleNameNode name) - { - ScribDel del = del(); - RoleDecl rd = new RoleDecl(this.source, (RoleNode) name); - rd = (RoleDecl) rd.del(del); - return rd; - }*/ - } diff --git a/scribble-ast/src/main/java/org/scribble/ast/RoleDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/RoleDeclList.java index 3a09e3304..f6a490fad 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/RoleDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/RoleDeclList.java @@ -17,7 +17,6 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.RoleKind; import org.scribble.core.type.name.Role; @@ -41,67 +40,22 @@ public List getParamDeclChildren() return ((List) getChildren()).stream().map(x -> (RoleDecl) x) .collect(Collectors.toList()); } - - @Override - public RoleDeclList dupNode() - { - return new RoleDeclList(this); - } - - // CHECKME: Move to del? - @Override - public RoleDeclList project(AstFactory af, Role self) - { - return af.RoleDeclList(this.source, getParamDeclChildren()); - } public List getRoles() { return getParamDeclChildren().stream().map(decl -> decl.getDeclName()) .collect(Collectors.toList()); } - - @Override - public String toString() - { - return "(" + super.toString() + ")"; - } - - - - - - - - - - - - - public RoleDeclList(CommonTree source, List decls) - { - super(source, decls); - } - - /*@Override - protected RoleDeclList copy() - { - return new RoleDeclList(this.source, getParamDeclChildren()); - } @Override - public RoleDeclList clone(AstFactory af) + public RoleDeclList dupNode() { - List decls = ScribUtil.cloneList(af, getParamDeclChildren()); - return af.RoleDeclList(this.source, decls); + return new RoleDeclList(this); } @Override - public HeaderParamDeclList reconstruct(List> decls) + public String toString() { - ScribDel del = del(); - RoleDeclList rdl = new RoleDeclList(this.source, castRoleDecls(decls)); - rdl = (RoleDeclList) rdl.del(del); - return rdl; - }*/ + return "(" + super.toString() + ")"; + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScopedNode.java b/scribble-ast/src/main/java/org/scribble/ast/ScopedNode.java deleted file mode 100644 index 8cec73514..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/ScopedNode.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast; - -import org.scribble.core.type.kind.ScopeKind; -import org.scribble.core.type.name.Name; - -// Move to types? uniform with Named -public interface ScopedNode -{ - boolean isEmptyScope(); // false for interruptible (can be implicit but not empty) - - //Scope getScope(); - //String getScopeElement(); - - // SimpleName for Scope "elements" (Scope is a compound name with prefix) - //SimpleName getScopeElement(); // Distinguish simple and compound scope names? (as name kinds) - Name getScopeElement(); // Distinguish simple and compound scope names? (as name kinds) -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java index bef71e1b6..d74255270 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java @@ -28,33 +28,27 @@ */ public interface ScribNode extends Tree { + CommonTree getSource(); + // Previously: for parsed entities, null if not parsed + // Now: for the original parsed entity for error blaming; should not be null unless a "purely generated" entity + @Override ScribNode getParent(); //@Override -- super return isn't generic List getChildren(); - //void setChildren(List children); // protected - - // Returns a deep clone but with fresh dels (i.e. dels not copied) -- use the af to build with fresh dels -- XXX - // i.e. recursively using AstFactory to rebuild the whole subtree - // Cf. node specific reconstructs, retain (i.e. share) the existing del -- so dels must be immutable (except for Envs) - //ScribNode clone(AstFactory af); - ScribNode clone(); ScribDel del(); ScribNode del(ScribDel del); + + ScribNode accept(AstVisitor nv) throws ScribException; // The "top-level" method, e.g., module.accept(v) (cf. Job::runVisitorOnModule) + ScribNode visitChildren(AstVisitor nv) throws ScribException; + // "Simpler" version than above default T visitWith(SimpleAstVisitor v) throws ScribException // "Top-level" visitor entry method { return v.visit(this); // N.B. ScribNode has getParent } - - CommonTree getSource(); - // Previously: for parsed entities, null if not parsed - // Now: for the original parsed entity for error blaming; should not be null unless a "purely generated" entity - - ScribNode accept(AstVisitor nv) throws ScribException; // The "top-level" method, e.g., module.accept(v) (cf. Job::runVisitorOnModule) - ScribNode visitChildren(AstVisitor nv) throws ScribException; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java index e4f29d640..69ab8f506 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -145,7 +145,7 @@ public final ScribNodeBase del(ScribDel del) } // Non-defensive - //protected // FIXME: make protected again after refactoring ast to parser + //protected // CHECKME: make protected again after refactoring ast to parser ? public final void setDel(ScribDel del) { this.del = del; diff --git a/scribble-ast/src/main/java/org/scribble/ast/SimpleSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/SimpleSessionNode.java index 5fef17e63..26d78f687 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/SimpleSessionNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SimpleSessionNode.java @@ -14,7 +14,6 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; // Name should be read (Simple ( SessionNode )) @@ -32,18 +31,4 @@ public SimpleSessionNode(SimpleSessionNode node) { super(node); } - - - - - - - - - - - protected SimpleSessionNode(CommonTree source) - { - super(source); - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java index 33bbfc454..ad7f6b904 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java @@ -14,7 +14,6 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.PayloadElemNameNode; import org.scribble.core.type.kind.PayloadTypeKind; import org.scribble.core.type.name.PayloadElemType; @@ -25,6 +24,7 @@ // TODO: make abstract, and make a DataTypeElem subclass with DataTypeKind parameter instance (alongside LDelegationElem) +// FIXME: refactor: generic typing issues, no concrete name field any more // Cf. DoArg, wrapper for a (unary) name node of potentially unknown kind (needs disamb) // PayloadTypeKind is DataType or Local, but Local has its own special subclass (and protocol params not allowed), so this should implicitly be for DataType only // AST hierarchy requires unary and delegation (binary pair) payloads to be structurally distinguished @@ -32,24 +32,25 @@ public class UnaryPayloadElem extends ScribNodeBase implements PayloadElem// extends PayloadElem { + // cf. Scribble.g + public static final int NAME_CHILD_INDEX = 0; + // ScribTreeAdaptor#create constructor public UnaryPayloadElem(Token t) { super(t); - this.name = null; } // Tree#dupNode constructor public UnaryPayloadElem(UnaryPayloadElem node) { super(node); - this.name = null; } public PayloadElemNameNode getNameChild() { @SuppressWarnings("unchecked") - PayloadElemNameNode name = (PayloadElemNameNode) getChild(0); + PayloadElemNameNode name = (PayloadElemNameNode) getChild(NAME_CHILD_INDEX); // CHECKME: probably need to record an explicit kind token, for "cast checking" // Cannot use ScribNodeBase.visitChildWithCastCheck because this is not a ProtocolKindNode return name; @@ -93,55 +94,5 @@ public String toString() { return getNameChild().toString(); } - - - - - - - - - - - - - - private final PayloadElemNameNode name; // (Ambig.) DataTypeNode or parameter - - //public DataTypeElem(PayloadElemNameNode name) - //public UnaryPayloadlem(DataTypeNode data) - //public UnaryPayloadElem(PayloadElemNameNode name) - public UnaryPayloadElem(CommonTree source, PayloadElemNameNode name) - { - //super(name); - //this.data = data; - super(source); - this.name = name; - } - - /*@Override - protected UnaryPayloadElem copy() - { - //return new UnaryPayloadElem(this.data); - return new UnaryPayloadElem<>(this.source, this.name); - } - - @Override - public UnaryPayloadElem clone(AstFactory af) - { - //PayloadElemNameNode name = (PayloadElemNameNode) this.data.clone(); // FIXME: make a DataTypeNameNode - //PayloadElemNameNode name = (PayloadElemNameNode) this.name.clone(); - PayloadElemNameNode name = ScribUtil.checkNodeClassEquality(this.name, this.name.clone(af)); - return af.UnaryPayloadElem(this.source, name); - } - - //public DataTypeElem reconstruct(PayloadElemNameNode name) - //public UnaryPayloadElem reconstruct(DataTypeNode name) - public UnaryPayloadElem reconstruct(PayloadElemNameNode name) - { - ScribDel del = del(); - UnaryPayloadElem elem = new UnaryPayloadElem<>(this.source, name); - elem = ScribNodeBase.del(elem, del); - return elem; - }*/ } + diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GConnect.java b/scribble-ast/src/main/java/org/scribble/ast/global/GConnect.java index 4249bc85e..fa76c6918 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GConnect.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GConnect.java @@ -14,10 +14,7 @@ package org.scribble.ast.global; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.ConnectAction; -import org.scribble.ast.MessageNode; -import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Global; import org.scribble.util.Constants; @@ -50,53 +47,4 @@ public String toString() + Constants.CONNECT_KW + " " + getSourceChild() + " " + Constants.TO_KW + " " + getDestinationChild() + ";"; } - - - - - - - - - - - - - - - - public GConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) - //public GConnect(RoleNode src, RoleNode dest) - { - super(source, src, msg, dest); - //super(src, dest); - } - - /*@Override - protected GConnect copy() - { - return new GConnect(this.source, this.src, this.msg, this.dest); - //return new GConnect(this.src, this.dest); - } - - @Override - public GConnect clone(AstFactory af) - { - RoleNode src = this.src.clone(af); - MessageNode msg = this.msg.clone(af); - RoleNode dest = this.dest.clone(af); - return af.GConnect(this.source, src, msg, dest); - //return AstFactoryImpl.FACTORY.GConnect(src, dest); - }*/ - - /*@Override - public GConnect reconstruct(MessageNode msg, RoleNode src, RoleNode dest) - //public GConnect reconstruct(RoleNode src, RoleNode dest) - { - ScribDel del = del(); - GConnect gc = new GConnect(this.source, src, msg, dest); - //GConnect gc = new GConnect(src, dest); - gc = (GConnect) gc.del(del); - return gc; - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GContinue.java b/scribble-ast/src/main/java/org/scribble/ast/global/GContinue.java index 3cd5fefa3..bd8dde9da 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GContinue.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GContinue.java @@ -14,9 +14,7 @@ package org.scribble.ast.global; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.Continue; -import org.scribble.ast.name.simple.RecVarNode; import org.scribble.core.type.kind.Global; public class GContinue extends Continue implements GSimpleSessionNode @@ -38,40 +36,4 @@ public GContinue dupNode() { return new GContinue(this); } - - - - - - - - - - - public GContinue(CommonTree source, RecVarNode recvar) - { - super(source, recvar); - } - - /*@Override - protected GContinue copy() - { - return new GContinue(this.source, this.recvar); - } - - @Override - public GContinue clone(AstFactory af) - { - RecVarNode rv = this.recvar.clone(af); - return af.GContinue(this.source, rv); - } - - @Override - public GContinue reconstruct(RecVarNode recvar) - { - ScribDel del = del(); - GContinue gc = new GContinue(this.source, recvar); - gc = (GContinue) gc.del(del); - return gc; - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java index a757663a0..42bef78c0 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java @@ -14,9 +14,7 @@ package org.scribble.ast.global; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.DisconnectAction; -import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Global; import org.scribble.util.Constants; @@ -47,48 +45,4 @@ public String toString() return Constants.DISCONNECT_KW + " " + getLeftChild() + " " + Constants.TO_KW + " " + getRightChild() + ";"; } - - - - - - - - - - - - - - - - //public GDisconnect(CommonTree source, RoleNode src, RoleNode dest) - public GDisconnect(CommonTree source, RoleNode left, RoleNode right) - { - super(source, left, right); - } - - /*@Override - protected GDisconnect copy() - { - return new GDisconnect(this.source, (MessageSigNode) this.msg, this.src, this.dest); - } - - @Override - public GDisconnect clone(AstFactory af) - { - RoleNode src = this.src.clone(af); - RoleNode dest = this.dest.clone(af); - return af.GDisconnect(this.source, src, dest); - } - - @Override - public GDisconnect reconstruct(RoleNode src, MessageNode msg, RoleNode dest) - //public GDisconnect reconstruct(RoleNode src, RoleNode dest) - { - ScribDel del = del(); - GDisconnect gd = new GDisconnect(this.source, (MessageSigNode) this.msg, src, dest); - gd = (GDisconnect) gd.del(del); - return gd; - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java index f49c1dc3f..2ef060dfb 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java @@ -14,10 +14,7 @@ package org.scribble.ast.global; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.Do; -import org.scribble.ast.NonRoleArgList; -import org.scribble.ast.RoleArgList; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.Global; @@ -41,7 +38,7 @@ public GDo(GDo node) @Override public GProtocolNameNode getProtocolNameNode() { - return (GProtocolNameNode) getChild(0); + return (GProtocolNameNode) getChild(Do.NAME_CHILD_INDEX); } @Override @@ -62,49 +59,4 @@ public GProtocolDecl getTargetProtocolDecl(LangContext jcontext, { return (GProtocolDecl) super.getTargetProtocolDecl(jcontext, mcontext); } - - - - - - - - - - - - - - - - - - public GDo(CommonTree source, RoleArgList roles, NonRoleArgList args, GProtocolNameNode proto) - { - super(source, roles, args, proto); - } - - /*@Override - protected ScribNodeBase copy() - { - return new GDo(this.source, this.roles, this.args, getProtocolNameNode()); - } - - @Override - public GDo clone(AstFactory af) - { - RoleArgList roles = this.roles.clone(af); - NonRoleArgList args = this.args.clone(af); - GProtocolNameNode proto = this.getProtocolNameNode().clone(af); - return af.GDo(this.source, roles, args, proto); - } - - @Override - public GDo reconstruct(RoleArgList roles, NonRoleArgList args, ProtocolNameNode proto) - { - ScribDel del = del(); - GDo gd = new GDo(this.source, roles, args, (GProtocolNameNode) proto); - gd = (GDo) gd.del(del); - return gd; - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GMessageTransfer.java b/scribble-ast/src/main/java/org/scribble/ast/global/GMessageTransfer.java index 96db89565..f4b3bfb9a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GMessageTransfer.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GMessageTransfer.java @@ -13,14 +13,10 @@ */ package org.scribble.ast.global; -import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.MessageNode; import org.scribble.ast.MessageTransfer; -import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Global; import org.scribble.util.Constants; @@ -55,48 +51,4 @@ public String toString() .collect(Collectors.joining(", ")) + ";"; } - - - - - - - - - - - - - - - - public GMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List dests) - { - super(source, src, msg, dests); - } - - /*@Override - protected GMessageTransfer copy() - { - return new GMessageTransfer(this.source, this.src, this.msg, getDestinationChildren()); - } - - @Override - public GMessageTransfer clone(AstFactory af) - { - RoleNode src = this.src.clone(af); - MessageNode msg = this.msg.clone(af); - List dests = ScribUtil.cloneList(af, getDestinationChildren()); - return af.GMessageTransfer(this.source, src, msg, dests); - }*/ - - /*@Override - public GMessageTransfer reconstruct(RoleNode src, MessageNode msg, - List dests) - { - ScribDel del = del(); - GMessageTransfer gmt = new GMessageTransfer(this.source, src, msg, dests); - gmt = (GMessageTransfer) gmt.del(del); - return gmt; - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java index e5699a4ac..7c74d7a6c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java @@ -13,13 +13,9 @@ */ package org.scribble.ast.global; -import java.util.List; - import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ProtocolMod; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtocolName; @@ -37,91 +33,30 @@ protected GProtocolDecl(GProtocolDecl node) super(node); } - // Cf. CommonTree#dupNode @Override - public GProtocolDecl dupNode() + public GProtocolHeader getHeaderChild() { - return new GProtocolDecl(this); + return (GProtocolHeader) getChild(ProtocolDecl.HEADER_CHILD); } @Override - public GProtocolHeader getHeaderChild() + public GProtocolDef getDefChild() { - return (GProtocolHeader) getChild(1); + return (GProtocolDef) getChild(ProtocolDecl.DEF_CHILD); } + // Cf. CommonTree#dupNode @Override - public GProtocolDef getDefChild() + public GProtocolDecl dupNode() { - return (GProtocolDef) getChild(2); + return new GProtocolDecl(this); } @Override public GProtocolName getFullMemberName(Module mod) // TODO: remove mod from meth sig { - /*ModuleName fullmodname = mod.getFullModuleName(); - return new GProtocolName(fullmodname, getHeaderChild().getDeclName());*/ Module m = (Module) getParent(); return new GProtocolName(m.getFullModuleName(), getHeaderChild().getDeclName()); } - - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public boolean isGlobal() - { - return GNode.super.isGlobal(); - } - - // FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public Global getKind() - { - return GNode.super.getKind(); - }*/ - - - - - - - - - - - - - - - - - public GProtocolDecl(CommonTree source, List modifiers, GProtocolHeader header, GProtocolDef def) - { - super(source, modifiers, header, def); - } - - /*@Override - protected GProtocolDecl copy() - { - return new GProtocolDecl(this.source, this.modifiers, getHeaderChild(), getDefChild()); - } - - @Override - public GProtocolDecl clone(AstFactory af) - { - GProtocolHeader header = getHeaderChild().clone(af); - GProtocolDef def = getDefChild().clone(af); - return af.GProtocolDecl(this.source, this.modifiers, header, def); - }*/ - - /*@Override - public GProtocolDecl reconstruct(ProtocolHeader header, - ProtocolDef def) - { - - ScribDel del = del(); - GProtocolDecl gpd = new GProtocolDecl(this.source, this.modifiers, (GProtocolHeader) header, (GProtocolDef) def); - gpd = (GProtocolDecl) gpd.del(del); // FIXME: does another shallow copy - return gpd; - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java index 6275f8d1c..7a487e56f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java @@ -14,10 +14,7 @@ package org.scribble.ast.global; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.NonRoleParamDeclList; import org.scribble.ast.ProtocolHeader; -import org.scribble.ast.RoleDeclList; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtocolName; @@ -37,6 +34,7 @@ protected GProtocolHeader(GProtocolHeader node) super(node); } + @Override public GProtocolHeader dupNode() { return new GProtocolHeader(this); @@ -51,7 +49,7 @@ public GProtocolNameNode getNameNodeChild() @Override public GProtocolName getDeclName() { - return getNameNodeChild().toName(); + return (GProtocolName) super.getDeclName(); } @Override @@ -59,51 +57,4 @@ public String toString() { return Constants.GLOBAL_KW + " " + super.toString(); } - - - - - - - - - - - - - - - - - - - public GProtocolHeader(CommonTree source, GProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) - { - super(source, name, roledecls, paramdecls); - } - - /*@Override - protected ScribNodeBase copy() - { - return new GProtocolHeader(this.source, getNameNodeChild(), this.roledecls, this.paramdecls); - } - - @Override - public GProtocolHeader clone(AstFactory af) - { - GProtocolNameNode name = getNameNodeChild().clone(af); - RoleDeclList roledecls = this.roledecls.clone(af); - NonRoleParamDeclList paramdecls = this.paramdecls.clone(af); - return af.GProtocolHeader(this.source, name, roledecls, paramdecls); - }*/ - - /*@Override - public GProtocolHeader reconstruct(ProtocolNameNode name, - RoleDeclList rdl, NonRoleParamDeclList pdl) - { - ScribDel del = del(); - GProtocolHeader gph = new GProtocolHeader(this.source, (GProtocolNameNode) name, rdl, pdl); - gph = (GProtocolHeader) gph.del(del); - return gph; - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java b/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java index db68c38b1..f643b38bf 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java @@ -14,9 +14,7 @@ package org.scribble.ast.global; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.Recursion; -import org.scribble.ast.name.simple.RecVarNode; import org.scribble.core.type.kind.Global; @@ -34,44 +32,16 @@ protected GRecursion(GRecursion node) { super(node); } - - @Override - public GRecursion dupNode() - { - return new GRecursion(this); - } @Override public GProtocolBlock getBlockChild() { - return (GProtocolBlock) getChild(1); - } - - public GRecursion(CommonTree source, RecVarNode recvar, GProtocolBlock block) - { - super(source, recvar, block); - } - - /*@Override - protected GRecursion copy() - { - return new GRecursion(this.source, this.recvar, getBlockChild()); + return (GProtocolBlock) getChild(Recursion.BODY_CHILD_INDEX); } @Override - public GRecursion clone(AstFactory af) + public GRecursion dupNode() { - RecVarNode recvar = this.recvar.clone(af); - GProtocolBlock block = getBlockChild().clone(af); - return af.GRecursion(this.source, recvar, block); + return new GRecursion(this); } - - @Override - public GRecursion reconstruct(RecVarNode recvar, ProtocolBlock block) - { - ScribDel del = del(); - GRecursion gr = new GRecursion(this.source, recvar, (GProtocolBlock) block); - gr = (GRecursion) gr.del(del); - return gr; - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java index 5d1da1e10..34718ba85 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java @@ -14,10 +14,7 @@ package org.scribble.ast.global; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.ConnectAction; -import org.scribble.ast.MessageSigNode; -import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Global; import org.scribble.util.Constants; @@ -47,46 +44,4 @@ public String toString() return Constants.WRAP_KW + " " + getSourceChild() + " " + Constants.TO_KW + " " + getDestinationChild() + ";"; } - - - - - - - - - - - - - - //public GWrap(CommonTree source, RoleNode src, RoleNode dest) - public GWrap(CommonTree source, MessageSigNode unit, RoleNode src, RoleNode dest) - { - super(source, src, unit, dest); - } - - /*@Override - protected GWrap copy() - { - return new GWrap(this.source, (MessageSigNode) this.msg, this.src, this.dest); - } - - @Override - public GWrap clone(AstFactory af) - { - RoleNode src = this.src.clone(af); - RoleNode dest = this.dest.clone(af); - return af.GWrap(this.source, src, dest); - } - - @Override - public GWrap reconstruct(RoleNode src, MessageNode msg, RoleNode dest) - //public GWrap reconstruct(RoleNode src, RoleNode dest) - { - ScribDel del = del(); - GWrap gc = new GWrap(this.source, (MessageSigNode) this.msg, src, dest); //this.msg); - gc = (GWrap) gc.del(del); - return gc; - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java index ee3984c08..ad09be569 100644 --- a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java @@ -53,7 +53,7 @@ public NonRoleArgList leaveDisambiguation(ScribNode child, { NonRoleParamKind kind = param.kind; NonRoleArg arg = args.next(); - NonRoleArgNode val = arg.getValChild(); + NonRoleArgNode val = arg.getArgNodeChild(); if (val.isTypeParamNode() || val.isSigParamNode()) { if (!((NonRoleParamNode) val).kind.equals(kind)) diff --git a/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java index 0d66d6e98..7460185c5 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java @@ -25,6 +25,7 @@ protected ProtocolDeclDel() { } + @Override public ScribNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException diff --git a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java index b89a09c09..cf5f5f0fd 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java +++ b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java @@ -79,7 +79,6 @@ public ModuleContext build( return new ModuleContext(root.getFullModuleName(), deps, visible); } - // Register mod under name modname, modname could be the full module name or an import alias // Adds member names qualified by mod diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 6b467190a..fc8430fa1 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -69,12 +69,14 @@ module tmp.Test; // move lang types to type.sess, and move new visit // try modulecontextvisitor by "static lookup" // try move antlrwrapper to parser again +//for isSingleConts (and project, buildGraph), make T visitWith(STypeReducer v) ? -- roleenabling and extchoicecons are more like reducers? + +// refactor scribble.g, simplify ast/del/etc class names and deprecated class code + // CHECKME: duplicte proto mods // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) // refactor additional disamb syntactic checks into core? e.g., do-calls, distinct roledecls, protodecls, etc. -// refactor scribble.g, simplify ast/del/etc class names and deprecated class code //make a visitor factory - //for isSingleConts (and project, buildGraph), make T visitWith(STypeReducer v) ? -- roleenabling and extchoicecons are more like reducers? // add exp conn checks to model validation // use stypefactory in core -- also make a visitorfactory From 0abd3a365b98935c72b0ebefdb8656a99766e4b6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 11 Apr 2019 10:29:41 +0100 Subject: [PATCH 250/539] Continued: WIP cleaning up ast classes. --- .../java/org/scribble/ast/AstFactory.java | 19 ++-- .../java/org/scribble/ast/AstFactoryImpl.java | 65 ++++++----- .../java/org/scribble/ast/DataTypeDecl.java | 49 ++------- .../org/scribble/ast/HeaderParamDecl.java | 32 +----- .../org/scribble/ast/MessageSigNameDecl.java | 51 ++------- .../java/org/scribble/ast/ModuleDecl.java | 66 +++-------- .../java/org/scribble/ast/NameDeclNode.java | 25 +---- .../org/scribble/ast/NonProtocolDecl.java | 103 ++++++++---------- .../java/org/scribble/ast/NonRoleArgNode.java | 4 +- .../org/scribble/ast/NonRoleParamDecl.java | 94 +--------------- .../java/org/scribble/ast/PayloadElem.java | 53 +-------- .../org/scribble/ast/PayloadElemList.java | 81 ++++---------- .../java/org/scribble/ast/ProtocolBlock.java | 35 +----- .../java/org/scribble/ast/ProtocolDef.java | 29 +---- .../java/org/scribble/ast/ScribNodeBase.java | 1 + .../scribble/ast/global/GProtocolBlock.java | 48 +------- .../org/scribble/ast/global/GProtocolDef.java | 42 +------ .../callbackapi/CBEndpointApiGenerator.java | 15 +-- .../callbackapi/CBEndpointApiGenerator3.java | 26 ++--- .../java/statechanapi/BranchSockGen.java | 8 +- .../java/statechanapi/CaseSockGen.java | 6 +- .../java/statechanapi/InputFutureGen.java | 4 +- .../java/statechanapi/OutputSockGen.java | 4 +- .../java/statechanapi/ReceiveSockGen.java | 8 +- .../java/statechanapi/ScribSockGen.java | 4 +- 25 files changed, 210 insertions(+), 662 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 162ede416..f37226041 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -40,6 +40,7 @@ import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.qualified.QualifiedNameNode; import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.NonRoleParamNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; @@ -62,24 +63,22 @@ MessageSigNode MessageSigNode(CommonTree source, OpNode op, GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode name, RoleNode role); - // PayloadElemList PayloadElemList(List> payloadelems); - PayloadElemList PayloadElemList(CommonTree source, - List> payloadelems); + PayloadElemList PayloadElemList(Token t, List> payloadelems); // PayloadElem PayloadElem(PayloadElemNameNode name); UnaryPayloadElem UnaryPayloadElem(Token t, PayloadElemNameNode name); - ModuleDecl ModuleDecl(CommonTree source, ModuleNameNode fullmodname); + ModuleDecl ModuleDecl(Token t, ModuleNameNode fullmodname); ImportModule ImportModule(CommonTree source, ModuleNameNode modname, ModuleNameNode alias); - MessageSigNameDecl MessageSigNameDecl(CommonTree source, String schema, - String extName, String extSource, MessageSigNameNode name); + MessageSigNameDecl MessageSigNameDecl(Token t, IdNode schema, IdNode extName, + IdNode extSource, MessageSigNameNode name); - DataTypeDecl DataTypeDecl(CommonTree source, String schema, String extName, - String extSource, DataTypeNode name); + DataTypeDecl DataTypeDecl(Token t, IdNode schema, IdNode extName, + IdNode extSource, DataTypeNode name); GProtocolDecl GProtocolDecl(Token t, ProtocolModList modifiers, GProtocolHeader header, GProtocolDef def); @@ -99,9 +98,9 @@ NonRoleParamDeclList NonRoleParamDeclList(Token t, NonRoleParamDecl NonRoleParamDecl( CommonTree source, K kind, NonRoleParamNode name); - GProtocolDef GProtocolDef(CommonTree source, GProtocolBlock block); + GProtocolDef GProtocolDef(Token t, GProtocolBlock block); - GProtocolBlock GProtocolBlock(CommonTree source, GInteractionSeq gis); + GProtocolBlock GProtocolBlock(Token t, GInteractionSeq gis); GInteractionSeq GInteractionSeq(CommonTree source, List gis); diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java index 763da7ffb..744c5f816 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -43,6 +43,7 @@ import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.qualified.QualifiedNameNode; import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.NonRoleParamNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; @@ -107,7 +108,7 @@ protected ScribDel createDefaultDelegate() return new DefaultDel(); } - // FIXME: factor out + // FIXME: factor out -- change return to void (ScribNodeBase.del is a mutating setter) //@SuppressWarnings("unchecked") protected static T del(T n, ScribDel del) { @@ -147,10 +148,11 @@ public MessageSigNode MessageSigNode(CommonTree source, OpNode op, @Override //public PayloadElemList PayloadElemList(List payloadelems) - public PayloadElemList PayloadElemList(CommonTree source, + public PayloadElemList PayloadElemList(Token t, List> payloadelems) { - PayloadElemList p = new PayloadElemList(source, payloadelems); + PayloadElemList p = new PayloadElemList(t); + p.addChildren(payloadelems); p = del(p, createDefaultDelegate()); return p; } @@ -196,11 +198,12 @@ public Module Module(CommonTree source, ModuleDecl moddecl, } @Override - public ModuleDecl ModuleDecl(CommonTree source, ModuleNameNode fullmodname) + public ModuleDecl ModuleDecl(Token t, ModuleNameNode fullmodname) { - ModuleDecl md = new ModuleDecl(source, fullmodname); - md = del(md, createDefaultDelegate()); - return md; + ModuleDecl n = new ModuleDecl(t); + n.addChild(fullmodname); + n = del(n, createDefaultDelegate()); + return n; } @Override @@ -213,23 +216,29 @@ public ImportModule ImportModule(CommonTree source, ModuleNameNode modname, } @Override - public MessageSigNameDecl MessageSigNameDecl(CommonTree source, String schema, - String extName, String extSource, MessageSigNameNode alias) + public MessageSigNameDecl MessageSigNameDecl(Token t, IdNode schema, + IdNode extName, IdNode extSource, MessageSigNameNode alias) { - MessageSigNameDecl msd = new MessageSigNameDecl(source, schema, extName, - extSource, alias); - msd = del(msd, createDefaultDelegate()); - return msd; + MessageSigNameDecl n = new MessageSigNameDecl(t); + n.addChild(schema); + n.addChild(extName); + n.addChild(extSource); + n.addChild(alias); + n = del(n, createDefaultDelegate()); + return n; } @Override - public DataTypeDecl DataTypeDecl(CommonTree source, String schema, - String extName, String extSource, DataTypeNode alias) + public DataTypeDecl DataTypeDecl(Token t, IdNode schema, + IdNode extName, IdNode extSource, DataTypeNode alias) { - DataTypeDecl dtd = new DataTypeDecl(source, schema, extName, extSource, - alias); - dtd = del(dtd, createDefaultDelegate()); - return dtd; + DataTypeDecl n = new DataTypeDecl(t); + n.addChild(schema); + n.addChild(extName); + n.addChild(extSource); + n.addChild(alias); + n = del(n, createDefaultDelegate()); + return n; } @Override @@ -306,19 +315,21 @@ public NonRoleParamDecl NonRoleParamDecl( } @Override - public GProtocolDef GProtocolDef(CommonTree source, GProtocolBlock block) + public GProtocolDef GProtocolDef(Token t, GProtocolBlock block) { - GProtocolDef gpd = new GProtocolDef(source, block); - gpd = del(gpd, new GProtocolDefDel()); - return gpd; + GProtocolDef n = new GProtocolDef(t); + n.addChild(block); + n = del(n, new GProtocolDefDel()); + return n; } @Override - public GProtocolBlock GProtocolBlock(CommonTree source, GInteractionSeq seq) + public GProtocolBlock GProtocolBlock(Token t, GInteractionSeq seq) { - GProtocolBlock gpb = new GProtocolBlock(source, seq); - gpb = del(gpb, new GProtocolBlockDel()); - return gpb; + GProtocolBlock n = new GProtocolBlock(t); + n.addChild(seq); + n = del(n, new GProtocolBlockDel()); + return n; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/DataTypeDecl.java b/scribble-ast/src/main/java/org/scribble/ast/DataTypeDecl.java index 6d70ea225..cb6a5f9e5 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DataTypeDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DataTypeDecl.java @@ -14,7 +14,6 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.core.type.kind.DataTypeKind; import org.scribble.core.type.name.DataType; @@ -35,17 +34,17 @@ protected DataTypeDecl(DataTypeDecl node) super(node); } - // Cf. CommonTree#dupNode @Override - public DataTypeDecl dupNode() + public DataTypeNode getNameNodeChild() { - return new DataTypeDecl(this); + return (DataTypeNode) getRawNameNodeChild(); } + // Cf. CommonTree#dupNode @Override - public DataTypeNode getNameNodeChild() + public DataTypeDecl dupNode() { - return (DataTypeNode) getRawNameNodeChild(); + return new DataTypeDecl(this); } @Override @@ -71,42 +70,10 @@ public DataType getFullMemberName(Module mod) @Override public String toString() { - return Constants.TYPE_KW + " <" + getSchemaNodeChild() + "> " - + getExtNameNodeChild() + " " - + Constants.FROM_KW + " " + getExtSourceNodeChild() + " " + return Constants.TYPE_KW + " <" + getSchemaChild() + "> " + + getExtNameChild() + " " + + Constants.FROM_KW + " " + getExtSourceChild() + " " + Constants.AS_KW + " " + getDeclName() + ";"; } - - - - - - - - - - - - - - - - public DataTypeDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name) - { - super(source, schema, extName, extSource, name); - } - - /*@Override - protected ScribNodeBase copy() - { - return new DataTypeDecl(this.source, this.schema, this.extName, this.extSource, getNameNode()); - } - - @Override - public DataTypeDecl clone(AstFactory af) - { - DataTypeNode name = (DataTypeNode) this.name.clone(af); - return af.DataTypeDecl(this.source, this.schema, this.extName, this.extSource, name); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java index a17eb3872..859b6b1f2 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java @@ -14,11 +14,8 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; -import org.scribble.ast.name.simple.SimpleNameNode; import org.scribble.core.type.kind.ParamKind; -import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -42,15 +39,16 @@ public HeaderParamDecl(HeaderParamDecl node) @Override public abstract NameNode getNameNodeChild(); // Always a "simple" name (e.g., like Role), but Type/Sig names are not SimpleNames + public abstract String getKeyword(); + public abstract HeaderParamDecl dupNode(); public HeaderParamDecl reconstruct(NameNode name) // Always a "simple" name (e.g., like Role), but Type/Sig names are not SimpleNames { - HeaderParamDecl pd = dupNode(); - ScribDel del = del(); - pd.addChild(name); - pd.setDel(del); // No copy - return pd; + HeaderParamDecl dup = dupNode(); + dup.addChild(name); + dup.setDel(del()); // No copy + return dup; } @Override @@ -61,28 +59,10 @@ public HeaderParamDecl visitChildren(AstVisitor nv) visitChildWithClassEqualityCheck(this, getNameNodeChild(), nv); return reconstruct(name); } - - public abstract String getKeyword(); @Override public String toString() { return getKeyword() + " " + getDeclName().toString(); } - - - - - - - - - - - - - protected HeaderParamDecl(CommonTree source, SimpleNameNode name) - { - super(source, name); - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/MessageSigNameDecl.java b/scribble-ast/src/main/java/org/scribble/ast/MessageSigNameDecl.java index 135dc2663..4113cf7f2 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/MessageSigNameDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/MessageSigNameDecl.java @@ -14,7 +14,6 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.MessageSigName; @@ -34,6 +33,12 @@ protected MessageSigNameDecl(MessageSigNameDecl node) { super(node); } + + @Override + public MessageSigNameNode getNameNodeChild() + { + return (MessageSigNameNode) getRawNameNodeChild(); + } // Cf. CommonTree#dupNode @Override @@ -42,12 +47,6 @@ public MessageSigNameDecl dupNode() return new MessageSigNameDecl(this); } - @Override - public MessageSigNameNode getNameNodeChild() - { - return (MessageSigNameNode) getRawNameNodeChild(); - } - @Override public boolean isMessageSigNameDecl() { @@ -70,42 +69,10 @@ public MessageSigName getFullMemberName(Module mod) @Override public String toString() { - return Constants.SIG_KW + " <" + getSchemaNodeChild() + "> " - + getExtNameNodeChild() + " " - + Constants.FROM_KW + " " + getExtSourceNodeChild() + " " + return Constants.SIG_KW + " <" + getSchemaChild() + "> " + + getExtNameChild() + " " + + Constants.FROM_KW + " " + getExtSourceChild() + " " + Constants.AS_KW + " " + getDeclName() + ";"; } - - - - - - - - - - - - - - - - public MessageSigNameDecl(CommonTree source, String schema, String extName, String extSource, MessageSigNameNode name) - { - super(source, schema, extName, extSource, name); - } - - /*@Override - protected MessageSigNameDecl copy() - { - return new MessageSigNameDecl(this.source, this.schema, this.extName, this.extSource, getNameNode()); - } - - @Override - public MessageSigNameDecl clone(AstFactory af) - { - MessageSigNameNode name = (MessageSigNameNode) this.name.clone(af); - return af.MessageSigNameDecl(this.source, this.schema, this.extName, this.extSource, name); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java index 63c25d7e0..36297f41e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java @@ -13,15 +13,10 @@ */ package org.scribble.ast; -import java.util.LinkedList; -import java.util.List; - import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.core.type.kind.ModuleKind; import org.scribble.core.type.name.ModuleName; -import org.scribble.del.ScribDel; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -45,43 +40,37 @@ public ModuleName getFullModuleName() return (ModuleName) getNameNodeChild().toName(); } - // Cf. CommonTree#dupNode + protected ModuleDecl reconstruct(ModuleNameNode name) + { + ModuleDecl dup = dupNode(); + dup.addChild(name); + dup.setDel(del()); // No copy + return dup; + } + @Override - public ModuleDecl dupNode() + public ModuleNameNode getNameNodeChild() { - return new ModuleDecl(this); + return (ModuleNameNode) getRawNameNodeChild(); } - protected ModuleDecl reconstruct(ModuleNameNode name) + // Cf. CommonTree#dupNode + @Override + public ModuleDecl dupNode() { - ModuleDecl md = dupNode(); - ScribDel del = del(); - List children = new LinkedList<>(); - children.add(name); - md.setChildren(children); - md.setDel(del); // No copy - return md; + return new ModuleDecl(this); } @Override public ModuleDecl visitChildren(AstVisitor nv) throws ScribException { ModuleNameNode name = (ModuleNameNode) visitChild(getNameNodeChild(), nv); - //return nv.job.af.ModuleDecl(this.source, fullmodname); // cf., reconstruct return reconstruct(name); } - - @Override - public ModuleNameNode getNameNodeChild() - { - return (ModuleNameNode) getRawNameNodeChild(); - } @Override public ModuleName getDeclName() { - //return (ModuleName) super.getDeclName(); // Would return full name - //return ((ModuleName) super.getDeclName()).getSimpleName(); // Uniform with other NameDeclNodes wrt. returning simple name return getNameNodeChild().toName().getSimpleName(); // Uniform with other NameDeclNodes wrt. returning simple name } @@ -90,31 +79,4 @@ public String toString() { return Constants.MODULE_KW + " " + getFullModuleName() + ";"; } - - - - - - - - - // Deprecate - - public ModuleDecl(CommonTree source, ModuleNameNode fullmodname) - { - super(source, fullmodname); - } - - /*@Override - protected ModuleDecl copy() - { - return new ModuleDecl(this.source, (ModuleNameNode) this.name); - }*/ - - /*@Override - public ModuleDecl clone(AstFactory af) - { - ModuleNameNode modname = (ModuleNameNode) this.name.clone(af); - return af.ModuleDecl(this.source, modname); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/NameDeclNode.java b/scribble-ast/src/main/java/org/scribble/ast/NameDeclNode.java index bac96e08f..5492874bb 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NameDeclNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NameDeclNode.java @@ -14,34 +14,34 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; import org.scribble.core.type.kind.Kind; import org.scribble.core.type.name.Name; public abstract class NameDeclNode extends ScribNodeBase { + public static final int NAMENODE_CHILD_INDEX = 0; + // ScribTreeAdaptor#create constructor public NameDeclNode(Token t) { super(t); - this.name = null; } // Tree#dupNode constructor public NameDeclNode(NameDeclNode node) { super(node); - this.name = null; } + // CHECKME: always AmbigNameNode? protected final NameNode getRawNameNodeChild() { if (getChildCount() < 1) // E.g., ProtocolHeader three children { throw new RuntimeException("Shouldn't get in here: " + getClass()); } - NameNode name = (NameNode) getChild(0); // CHECKME: currently always AmbigNameNode? + NameNode name = (NameNode) getChild(NAMENODE_CHILD_INDEX); return name; } @@ -54,21 +54,4 @@ protected final NameNode getRawNameNodeChild() // Concrete subclasses should use getNameNode, toName (simple name) and cast // (Gets overridden anyway for return type) public abstract Name getDeclName(); - - // reconstruct left to subclass-specific, extra fields - //protected abstract NameDeclNode reconstruct(NameNode name); - - - - - - - - private final NameNode name; - - protected NameDeclNode(CommonTree source, NameNode name) - { - super(source); - this.name = name; - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java b/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java index f37cc6d62..505259ac7 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java @@ -14,11 +14,9 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.core.type.kind.NonProtocolKind; -import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -26,39 +24,54 @@ public abstract class NonProtocolDecl extends NameDeclNode implements ModuleMember { + public static final int SCHEMA_NODE_CHILD_INDEX = 1; + public static final int EXTNAME_NODE_CHILD_INDEX = 2; + public static final int EXTSOURCE_NODE_CHILD_INDEX = 3; + // ScribTreeAdaptor#create constructor public NonProtocolDecl(Token payload) { super(payload); - this.schema = null; - this.extName = null; - this.extSource = null; } // Tree#dupNode constructor protected NonProtocolDecl(NonProtocolDecl node) { super(node); - this.schema = null; - this.extName = null; - this.extSource = null; } - - public abstract NonProtocolDecl dupNode(); - public IdNode getSchemaNodeChild() + // Redundant override, just for documentation + @Override + public abstract NameNode getNameNodeChild(); + + public IdNode getSchemaChild() + { + return (IdNode) getChild(SCHEMA_NODE_CHILD_INDEX); + } + + public IdNode getExtNameChild() + { + return (IdNode) getChild(EXTSOURCE_NODE_CHILD_INDEX); + } + + public IdNode getExtSourceChild() + { + return (IdNode) getChild(EXTSOURCE_NODE_CHILD_INDEX); + } + + public String getSchema() { - return (IdNode) getChild(1); + return getSchemaChild().getText(); } - public IdNode getExtNameNodeChild() + public String getExtName() { - return (IdNode) getChild(2); + return getExtNameChild().getText(); } - public IdNode getExtSourceNodeChild() + public String getExtSource() { - return (IdNode) getChild(3); + return getExtSourceChild().getText(); } // CHECKME: maybe move to ModuleMember @@ -72,19 +85,19 @@ public boolean isMessageSigNameDecl() return false; } - public NonProtocolDecl reconstruct( - NameNode name, - //String schema, String extName, String source, - IdNode schema, IdNode extName, IdNode extSource) // FIXME: + @Override + public abstract NonProtocolDecl dupNode(); + + public NonProtocolDecl reconstruct(NameNode name, IdNode schema, + IdNode extName, IdNode extSource) { - NonProtocolDecl npd = dupNode(); - ScribDel del = del(); - npd.addChild(name); - npd.addChild(schema); - npd.addChild(extName); - npd.addChild(extSource); - npd.setDel(del); // No copy - return npd; + NonProtocolDecl n = dupNode(); + n.addChild(name); + n.addChild(schema); + n.addChild(extName); + n.addChild(extSource); + n.setDel(del()); // No copy + return n; } @Override @@ -94,39 +107,11 @@ public NonProtocolDecl visitChildren(AstVisitor nv) NameNode name = (NameNode) visitChildWithClassEqualityCheck(this, getNameNodeChild(), nv); IdNode schema = //(AmbigNameNode) visitChildWithClassEqualityCheck(this, getSchemaNodeChild(), nv); - getSchemaNodeChild(); // AmbigNameNode currently have no del, so not visited + getSchemaChild(); // AmbigNameNode currently have no del, so not visited -- CHECKME: now IdNode? IdNode extName = //(AmbigNameNode) visitChildWithClassEqualityCheck(this, getExtNameNodeChild(), nv); - getExtNameNodeChild(); + getExtNameChild(); IdNode extSource = //(AmbigNameNode) visitChildWithClassEqualityCheck(this, getExtSourceNodeChild(), nv); - getExtNameNodeChild(); + getExtNameChild(); return reconstruct(name, schema, extName, extSource); } - - - - - - - - - - - - - - - public final String schema; - public final String extName; - public final String extSource; - - public NonProtocolDecl(CommonTree source, String schema, String extName, - String extSource, // MemberNameNode name); - NameNode name) // Directly parsed decl names are simple names, but decl constructors take general name nodes which are member names, so base NameNode here -- cf. ProtocolHeader and G/LProtocolHeader - { - super(source, name); - this.schema = schema; - this.extName = extName; - this.extSource = extSource; - } - } diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgNode.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgNode.java index 7c153b3ad..6221227e4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgNode.java @@ -21,6 +21,8 @@ // N.B. not the actual argument node itself (that is NonRoleArg, element of NonRoleArgList, which wraps these nodes) public interface NonRoleArgNode extends DoArgNode { + Arg toArg(); + // Not kinded: point of this interface is don't know which kind the node is -- so use the "is" methods -- cf. AmbigNameNode inherits both sig and data kind // And not all values are names, e.g. message sigs default boolean isMessageSigNode() @@ -47,6 +49,4 @@ default boolean isTypeParamNode() { return false; } - - Arg toArg(); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDecl.java index 79aa3d678..0852f7802 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDecl.java @@ -14,18 +14,14 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.name.simple.NonRoleParamNode; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.MemberName; -// CHECKME: can drop generic parameter and kind? +// CHECKME: drop generic parameter and kind? public abstract class NonRoleParamDecl extends HeaderParamDecl { public final K kind; // CHECKME: factor up to super? - - //..HERE make this abstract with concrete type/sig subclasses -- and fix parser accordingly // ScribTreeAdaptor#create constructor public NonRoleParamDecl(Token t, K kind) @@ -40,95 +36,7 @@ public NonRoleParamDecl(NonRoleParamDecl node) super(node); this.kind = node.kind; } - - /*@Override - public NonRoleParamDecl dupNode() - { - return new NonRoleParamDecl<>(this, this.kind); - }*/ - - /*@Override - public NonRoleParamNode getNameNodeChild() - { - NameNode raw = getRawNameNodeChild(); - if (this.kind.equals(SigKind.KIND) || this.kind.equals(DataTypeKind.KIND) - || this.kind.equals(Local.KIND)) - { - // Unchecked cast because this class not further subclassed for kind, nor the NameNodes -- unlike the Kind objects themselves - @SuppressWarnings("unchecked") - NonRoleParamNode cast = (NonRoleParamNode) raw; - return cast; - } - throw new RuntimeException("Shouldn't get in here: " + this.kind); - }*/ - - /*@Override - public NonRoleParamDecl project(AstFactory af, Role self) - { - NonRoleParamNode child = getNameNodeChild(); - NonRoleParamNode pn = af.NonRoleParamNode(child.source, this.kind, - child.toString()); - return af.NonRoleParamDecl(this.source, this.kind, pn); - }*/ @Override public abstract MemberName getDeclName(); // DataType/MessageSigName are MemberNames - /*{ - return getNameNodeChild().toName(); - }*/ - - /*@Override - public String getKeyword() - { - if (this.kind.equals(SigKind.KIND)) - { - return Constants.SIG_KW; - } - else if (this.kind.equals(DataTypeKind.KIND)) - { - return Constants.TYPE_KW; - } - else // CHECKME: Local? - { - throw new RuntimeException("Shouldn't get in here: " + this.kind); - } - }*/ - - - - - - - - - - - public NonRoleParamDecl(CommonTree source, K kind, NonRoleParamNode name) - { - super(source, name); - this.kind = kind; - } - - /*@Override - public NonRoleParamDecl clone(AstFactory af) - { - NonRoleParamNode param = (NonRoleParamNode) this.name.clone(af); - return af.NonRoleParamDecl(this.source, this.kind, param); - } - - @Override - public NonRoleParamDecl reconstruct(SimpleNameNode name) - { - ScribDel del = del(); - NonRoleParamDecl pd = new NonRoleParamDecl<>(this.source, this.kind, (NonRoleParamNode) name); - @SuppressWarnings("unchecked") - NonRoleParamDecl tmp = (NonRoleParamDecl) pd.del(del); - return tmp; - } - - @Override - protected NonRoleParamDecl copy() - { - return new NonRoleParamDecl<>(this.source, this.kind, (NonRoleParamNode) this.name); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/PayloadElem.java b/scribble-ast/src/main/java/org/scribble/ast/PayloadElem.java index 7460c92f8..6ee34ea3a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/PayloadElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/PayloadElem.java @@ -17,12 +17,10 @@ import org.scribble.core.type.name.PayloadElemType; // Not in grammar file -- but cf. DoArg (and PayloadElemList cf. DoArgList) -- i.e. need a wrapper for mixed and initially ambiguous name kinds -//public abstract class PayloadElem extends ScribNodeBase -//public abstract class PayloadElem> extends ScribNodeBase -- problem is GProtocolNameNode child isn't a payload kind, and anyway there's also a role node child -//public abstract class PayloadElem extends ScribNodeBase -//public interface PayloadElem extends ScribNode public interface PayloadElem extends ScribNode { + PayloadElemType toPayloadType(); // Mainly a wrapper method for the wrapped NameNode + default boolean isGlobalDelegationElem() { return false; @@ -32,51 +30,4 @@ default boolean isLocalDelegationElem() { return false; } - - /*public final PayloadElemNameNode name; // Doesn't work for DelegationElem (Global@Role), name is global but payloadelem is local -- similar reason why not a NameNode, delegation doesn't fit -- would work for direct LProtocolNameNode elems though - - public PayloadElem(PayloadElemNameNode name) - { - this.name = name; - }*/ - - /*@Override - protected PayloadElem copy() - { - return new PayloadElem(this.name); - } - - @Override - public PayloadElem clone() - { - PayloadElemNameNode name = (PayloadElemNameNode) this.name.clone(); - return AstFactoryImpl.FACTORY.PayloadElem(name); - }*/ - - /*public PayloadElem reconstruct(PayloadElemNameNode name) - { - ScribDel del = del(); - PayloadElem elem = new PayloadElem(name); - elem = (PayloadElem) elem.del(del); - return elem; - } - - @Override - public PayloadElem visitChildren(AstVisitor nv) throws ScribbleException - { - PayloadElemNameNode name = (PayloadElemNameNode) visitChild(this.name, nv); - return reconstruct(name); - }*/ - - //public abstract PayloadType toPayloadType(); - public PayloadElemType toPayloadType(); // Mainly a wrapper method for the wrapped NameNode - - /*public abstract Name toName(); // Not deriving from Named/NameNode, delegation doesn't fit -- would need to make a special (Global@Role) name of Local kind - - @Override - public String toString() - { - //return this.name.toString(); - return toName().toString(); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java b/scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java index 07e8cf76a..b4bd65f5d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java @@ -13,15 +13,12 @@ */ package org.scribble.ast; -import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.name.PayloadElemType; import org.scribble.core.type.session.Payload; -import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -32,44 +29,20 @@ public class PayloadElemList extends ScribNodeBase public PayloadElemList(Token t) { super(t); - this.elems = null; } // Tree#dupNode constructor public PayloadElemList(PayloadElemList node) { super(node); - this.elems = null; } - public PayloadElemList dupNode() - { - return new PayloadElemList(this); - } - - public List> getElementChildren() + List> getElementChildren() { return getChildren().stream().map(x -> (PayloadElem) x) .collect(Collectors.toList()); } - protected PayloadElemList reconstruct(List> elems) - { - PayloadElemList pay = dupNode(); - pay.addChildren(elems); - ScribDel del = del(); - pay.setDel(del); // No copy - return pay; - } - - @Override - public PayloadElemList visitChildren(AstVisitor nv) throws ScribException - { - List> elems = - visitChildListWithClassEqualityCheck(this, getElementChildren(), nv); - return reconstruct(elems); - } - public Payload toPayload() { List> pts = getElementChildren().stream() @@ -81,49 +54,33 @@ public boolean isEmpty() { return getChildCount() == 0; } - + @Override - public String toString() + public PayloadElemList dupNode() { - return "(" + getElementChildren().stream().map(pe -> pe.toString()) - .collect(Collectors.joining(", ")) + ")"; + return new PayloadElemList(this); } - - - - - - - - - - - - - - - - //private final List elems; // FIXME: parameterise on Kind (cf. sesstypes) - private final List> elems; - //public PayloadElemList(List elems) - public PayloadElemList(CommonTree source, List> elems) + protected PayloadElemList reconstruct(List> elems) { - super(source); - this.elems = new LinkedList<>(elems); + PayloadElemList pay = dupNode(); + pay.addChildren(elems); + pay.setDel(del()); // No copy + return pay; } - /*@Override - protected PayloadElemList copy() + @Override + public PayloadElemList visitChildren(AstVisitor nv) throws ScribException { - return new PayloadElemList(this.source, this.elems); + List> elems = + visitChildListWithClassEqualityCheck(this, getElementChildren(), nv); + return reconstruct(elems); } - + @Override - public PayloadElemList clone(AstFactory af) + public String toString() { - //List elems = ScribUtil.cloneList(this.elems); - List> elems = ScribUtil.cloneList(af, this.elems); - return af.PayloadElemList(this.source, elems); - }*/ + return "(" + getElementChildren().stream().map(pe -> pe.toString()) + .collect(Collectors.joining(", ")) + ")"; + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java index 0b74f46b9..bb51bb665 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java @@ -14,31 +14,26 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; public abstract class ProtocolBlock extends ScribNodeBase { + public static final int SEQ_CHILD_INDEX = 0; + // ScribTreeAdaptor#create constructor public ProtocolBlock(Token t) { super(t); - this.seq = null; } // Tree#dupNode constructor protected ProtocolBlock(ProtocolBlock node) { super(node); - this.seq = null; } - - @Override - public abstract ProtocolBlock dupNode(); public abstract InteractionSeq getInteractSeqChild(); @@ -46,13 +41,15 @@ public boolean isEmpty() { return getInteractSeqChild().isEmpty(); } + + @Override + public abstract ProtocolBlock dupNode(); public ProtocolBlock reconstruct(InteractionSeq seq) { ProtocolBlock pd = dupNode(); - ScribDel del = del(); pd.addChild(seq); - pd.setDel(del); // No copy + pd.setDel(del()); // No copy return pd; } @@ -69,24 +66,4 @@ public String toString() { return "{\n" + getInteractSeqChild() + "\n}"; // Empty block will contain an blank line } - - - - - - - - - - - private final InteractionSeq seq; - - public ProtocolBlock(CommonTree source, InteractionSeq seq) - { - super(source); - this.seq = seq; - } - - /*@Override - public abstract ProtocolBlock clone(AstFactory af);*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolDef.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolDef.java index 677070f28..616f46789 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolDef.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolDef.java @@ -14,39 +14,35 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; public abstract class ProtocolDef extends ScribNodeBase implements ProtocolKindNode { + public static final int BLOCK_CHILD_INDEX = 0; + // ScribTreeAdaptor#create constructor public ProtocolDef(Token t) { super(t); - this.block = null; } // Tree#dupNode constructor protected ProtocolDef(ProtocolDef node) { super(node); - this.block = null; } + public abstract ProtocolBlock getBlockChild(); public abstract ProtocolDef dupNode(); - - public abstract ProtocolBlock getBlockChild(); public ProtocolDef reconstruct(ProtocolBlock block) { ProtocolDef pd = dupNode(); - ScribDel del = del(); pd.addChild(block); - pd.setDel(del); // No copy + pd.setDel(del()); // No copy return pd; } @@ -63,21 +59,4 @@ public String toString() { return getBlockChild().toString(); } - - - - - - - - - - - private final ProtocolBlock block; - - protected ProtocolDef(CommonTree source, ProtocolBlock block) - { - super(source); - this.block = block; - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java index 69ab8f506..c9f9a1133 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -90,6 +90,7 @@ public List getChildren() .collect(Collectors.toList()); } + // CHECKME: redundant? given this.addChildren // Non-defenseive // CHECKME: "generic" visitChildren and reconstruct via get/setChildren? -- maybe too implicit, cannot easily see child visiting order protected void setChildren(List children) diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java index f9b1fdc20..e02f09e7d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java @@ -14,7 +14,6 @@ package org.scribble.ast.global; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.ProtocolBlock; import org.scribble.core.type.kind.Global; @@ -32,54 +31,15 @@ protected GProtocolBlock(GProtocolBlock node) super(node); } - @Override - public GProtocolBlock dupNode() - { - return new GProtocolBlock(this); - } - @Override public GInteractionSeq getInteractSeqChild() { - return (GInteractionSeq) getChild(0); - } - - - - - - - - - - - - - - public GProtocolBlock(CommonTree source, GInteractionSeq seq) - { - super(source, seq); + return (GInteractionSeq) getChild(ProtocolBlock.SEQ_CHILD_INDEX); } - /*@Override - protected GProtocolBlock copy() - { - return new GProtocolBlock(this.source, getInteractSeqChild()); - } - @Override - public GProtocolBlock clone(AstFactory af) - { - GInteractionSeq gis = getInteractSeqChild().clone(af); - return af.GProtocolBlock(this.source, gis); - }*/ - - /*@Override - public GProtocolBlock reconstruct(InteractionSeq seq) + public GProtocolBlock dupNode() { - ScribDel del = del(); - GProtocolBlock gpb = new GProtocolBlock(this.source, (GInteractionSeq) seq); - gpb = (GProtocolBlock) gpb.del(del); - return gpb; - }*/ + return new GProtocolBlock(this); + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDef.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDef.java index 716f8a639..032ae0188 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDef.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDef.java @@ -14,7 +14,6 @@ package org.scribble.ast.global; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.ProtocolDef; import org.scribble.core.type.kind.Global; @@ -35,7 +34,7 @@ protected GProtocolDef(GProtocolDef node) @Override public GProtocolBlock getBlockChild() { - return (GProtocolBlock) getChild(0); + return (GProtocolBlock) getChild(ProtocolDef.BLOCK_CHILD_INDEX); } @Override @@ -43,43 +42,4 @@ public GProtocolDef dupNode() { return new GProtocolDef(this); } - - - - - - - - - - - - - - public GProtocolDef(CommonTree source, GProtocolBlock block) - { - super(source, block); - } - - /*@Override - protected GProtocolDef copy() - { - return new GProtocolDef(this.source, getBlock()); - } - - @Override - public GProtocolDef clone(AstFactory af) - { - GProtocolBlock block = getBlock().clone(af); - return af.GProtocolDef(this.source, block); - } - - @Override - public GProtocolDef reconstruct(ProtocolBlock block) - { - ScribDel del = del(); - GProtocolDef gpd = new GProtocolDef(this.source, (GProtocolBlock) block); - gpd = (GProtocolDef) gpd.del(del); - return gpd; - }*/ } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index cbff5a84b..594a0100c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -287,13 +287,13 @@ public Map buildEndpointClass() throws ScribException messageClass += "private static final long serialVersionUID = 1L;\n"; if (isSig) { - messageClass += "private final " + msnd.extName + " m;\n"; + messageClass += "private final " + msnd.getExtName() + " m;\n"; } messageClass += "\n"; messageClass += "public " + messageName + "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer"; if (isSig) { - messageClass += ", " + msnd.extName + " m"; + messageClass += ", " + msnd.getExtName() + " m"; } else { @@ -301,7 +301,7 @@ public Map buildEndpointClass() throws ScribException for (PayloadElemType pet : a.payload.elems) { DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pet); - messageClass += ", " + dtd.extName + " arg" + i++; + messageClass += ", " + dtd.getExtName() + " arg" + i++; } } messageClass += ") {\n"; @@ -434,7 +434,7 @@ public Map buildEndpointClass() throws ScribException + ".roles." + a.peer + " peer, "; if (isSig) { - receiveInterface += msnd.extName + " m"; + receiveInterface += msnd.getExtName() + " m"; } else { @@ -445,7 +445,8 @@ public Map buildEndpointClass() throws ScribException for (PayloadElemType pet : a.payload.elems) { DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pet); - receiveInterface += ", " + dtd.extName + " arg" + i++; + receiveInterface += ", " + dtd.getExtName() + + " arg" + i++; } } receiveInterface += ");\n"; @@ -468,7 +469,7 @@ public Map buildEndpointClass() throws ScribException + ".roles." + a.peer + "." + a.peer + ", "; if (isSig) { - branchAbstract += "(" + msnd.extName + ") m"; + branchAbstract += "(" + msnd.getExtName() + ") m"; } else { @@ -481,7 +482,7 @@ public Map buildEndpointClass() throws ScribException for (PayloadElemType pet : a.payload.elems) { DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pet); - branchAbstract += ", (" + dtd.extName + ") m.payload[" + i++ + "]"; + branchAbstract += ", (" + dtd.getExtName() + ") m.payload[" + i++ + "]"; } branchAbstract += "); break;\n"; } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 9cfbb9479..bf6f3a329 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -598,19 +598,19 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); FieldBuilder m = opClass.newField("m"); m.addModifiers("private", "final"); - m.setType(msnd.extName); + m.setType(msnd.getExtName()); } ConstructorBuilder opCons; if (isSig) { - opCons = opClass.newConstructor(msnd.extName + " m"); + opCons = opClass.newConstructor(msnd.getExtName() + " m"); opClass.addInterfaces("org.scribble.runtime.handlers.ScribSigMessage"); } else { opCons = opClass.newConstructor(a.payload.elems.stream().map(e -> - main.getDataTypeDeclChild((DataType) e).extName + " arg" + i[0]++ + main.getDataTypeDeclChild((DataType) e).getExtName() + " arg" + i[0]++ ).collect(Collectors.joining(", "))); } opCons.addModifiers("public"); @@ -709,7 +709,7 @@ protected String generateBranch(String bprefix, LangContext jc, EState s, String branchAbstract += "case \"" + SessionApiGenerator.getOpClassName(a.mid) + "\": receive(data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ", "; if (isSig) { - branchAbstract += "(" + msnd.extName + ") m"; + branchAbstract += "(" + msnd.getExtName() + ") m"; } else { @@ -719,7 +719,7 @@ protected String generateBranch(String bprefix, LangContext jc, EState s, String for (PayloadElemType pet : a.payload.elems) { DataTypeDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); - branchAbstract += ", (" + dtd.extName + ") m.payload[" + i++ + "]"; + branchAbstract += ", (" + dtd.getExtName() + ") m.payload[" + i++ + "]"; } branchAbstract += "); break;\n"; } @@ -746,7 +746,7 @@ protected String generateReceiveInterface(boolean isSig, + ".roles." + a.peer + " peer, "; if (isSig) { - receiveInterface += msnd.extName + " m"; + receiveInterface += msnd.getExtName() + " m"; } else { @@ -757,7 +757,7 @@ protected String generateReceiveInterface(boolean isSig, for (PayloadElemType pet : a.payload.elems) { DataTypeDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); - receiveInterface += ", " + dtd.extName + " arg" + i++; + receiveInterface += ", " + dtd.getExtName() + " arg" + i++; } } receiveInterface += ");\n"; @@ -822,7 +822,7 @@ Map generateMessageClasses(String endpointName, EState s, String[] args = new String[a.payload.elems.size() + 2]; args[0] = getRolesPackage() + "." + a.peer + " peer"; args[1] = getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + " op"; - a.payload.elems.forEach(e -> args[i[0]++] = main.getDataTypeDecl((DataType) e).extName + " arg" + (i[0]-3)); + a.payload.elems.forEach(e -> args[i[0]++] = main.getDataTypeDecl((DataType) e).getExtName() + " arg" + (i[0]-3)); ConstructorBuilder ob = messageClass.newConstructor(args); ob.addModifiers("public"); ob.addBodyLine("super(op" + IntStream.range(0, a.payload.elems.size()).mapToObj(j -> ", arg" + j).collect(Collectors.joining()) + ");"); @@ -854,7 +854,7 @@ ClassBuilder generateMessageClass(//boolean isSig, String messageName, ? "Unit" : a.payload.elems.stream().map(e -> { - String extName = main.getDataTypeDecl((DataType) e).extName; + String extName = main.getDataTypeDecl((DataType) e).getExtName(); return (extName.indexOf(".") != -1) ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) : extName; @@ -907,13 +907,13 @@ ClassBuilder generateMessageClass(//boolean isSig, String messageName, messageClass += "private static final long serialVersionUID = 1L;\n"; if (isSig) { - messageClass += "private final " + msnd.extName + " m;\n"; + messageClass += "private final " + msnd.getExtName() + " m;\n"; } messageClass += "\n"; messageClass += "public " + messageName + "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + " peer"; if (isSig) { - messageClass += ", " + msnd.extName + " m"; + messageClass += ", " + msnd.getExtName() + " m"; } else { @@ -922,7 +922,7 @@ ClassBuilder generateMessageClass(//boolean isSig, String messageName, for (PayloadElemType pet : a.payload.elems) { DataTypeDecl dtd = main.getDataTypeDecl((DataType) pet); - messageClass += ", " + dtd.extName + " arg" + i++; + messageClass += ", " + dtd.getExtName() + " arg" + i++; } } messageClass += ") {\n"; @@ -1009,7 +1009,7 @@ protected MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) //protected final Function, String> getExtName = e -> protected String getExtName(PayloadElemType e) { - String extName = this.lang.getContext().getMainModule().getDataTypeDeclChild((DataType) e).extName; + String extName = this.lang.getContext().getMainModule().getDataTypeDeclChild((DataType) e).getExtName(); return (extName.indexOf(".") != -1) ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) : extName; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java index 02e077a6d..854f001de 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java @@ -294,14 +294,14 @@ private void addHandleMethod(final String ROLE_PARAM, final String MESSAGE_VAR, for (PayloadElemType pt : a.payload.elems) { DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType - ln += ", " + buffSuper + "(" + dtd.extName + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + i++ + "])"; + ln += ", " + buffSuper + "(" + dtd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + i++ + "])"; } } } else { MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module - ln += ", " + JavaBuilder.NEW + " " + BUF_CLASS + "<>((" + msd.extName + ") " + RECEIVE_MESSAGE_PARAM + ln += ", " + JavaBuilder.NEW + " " + BUF_CLASS + "<>((" + msd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM //+ "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[0]" // CHECKME: betty16.lec2.smtp.SmtpC4 + ")"; } @@ -381,14 +381,14 @@ private void addCallbackCases(MethodBuilder mb2, final String ROLE_PARAM, for (PayloadElemType pt : a.payload.elems) { DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType - ln += ", " + buffSuper + "(" + dtd.extName + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + i++ + "])"; + ln += ", " + buffSuper + "(" + dtd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + i++ + "])"; } } } else { MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module - ln += ", " + JavaBuilder.NEW + " " + BUF_CLASS + "<>((" + msd.extName + ") " + RECEIVE_MESSAGE_PARAM + ln += ", " + JavaBuilder.NEW + " " + BUF_CLASS + "<>((" + msd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM //+ "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[0]" // CHECKME: betty16.lec2.smtp.SmtpC4 + ")"; } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java index d580baea8..b02cc895a 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java @@ -141,7 +141,7 @@ private void addReceiveMethod(ClassBuilder cb, EAction a, EState succ) throws Sc MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module mb.addBodyLine(JavaBuilder.SUPER + ".use();"); addBranchCheck(getSessionApiOpConstant(a.mid), mb, CASE_MESSAGE_FIELD); - mb.addBodyLine(CASE_ARG_PREFIX + "." + BUFF_VAL_FIELD + " = (" + msd.extName + ") " + CASE_MESSAGE_FIELD + ";"); + mb.addBodyLine(CASE_ARG_PREFIX + "." + BUFF_VAL_FIELD + " = (" + msd.getExtName() + ") " + CASE_MESSAGE_FIELD + ";"); } addReturnNextSocket(mb, succ); } @@ -193,12 +193,12 @@ private void addCaseReceiveDiscardMethod(ClassBuilder cb, EAction a, EState succ if (a.mid.isOp()) { ln += a.payload.elems.stream() - .map((pt) -> getGarbageBuf(main.getDataTypeDeclChild(((DataType) pt)).extName)).collect(Collectors.joining(", ")) + ");"; + .map((pt) -> getGarbageBuf(main.getDataTypeDeclChild(((DataType) pt)).getExtName())).collect(Collectors.joining(", ")) + ");"; } else { MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // Factor out? (send/receive/branchreceive/...) - ln += getGarbageBuf(msd.extName) + ");"; + ln += getGarbageBuf(msd.getExtName()) + ");"; } mb.addBodyLine(ln); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java index 7432db14e..aed9f8c77 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java @@ -82,7 +82,7 @@ public ClassBuilder generateType() throws ScribException } DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); ScribSockGen.checkJavaDataTypeDecl(dtd); - String type = dtd.extName; + String type = dtd.getExtName(); types.add(type); FieldBuilder f = future.newField("pay" + i++); f.setType(type); @@ -94,7 +94,7 @@ public ClassBuilder generateType() throws ScribException { MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); ScribSockGen.checkMessageSigNameDecl(msd); - String type = msd.extName; + String type = msd.getExtName(); types.add(type); FieldBuilder f = future.newField("msg"); f.setType(type); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java index 0229f31f8..9dbb09b5a 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java @@ -224,7 +224,7 @@ protected static void addSendOpParams(StateChannelApiGenerator apigen, MethodBui } DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); // FIXME: might not belong to main module // TODO: if not DataType ScribSockGen.checkJavaDataTypeDecl(dtd); - mb.addParameters(dtd.extName + " " + as.next()); + mb.addParameters(dtd.getExtName() + " " + as.next()); } } } @@ -234,6 +234,6 @@ protected static void addSendMessageSigNameParams(MethodBuilder mb, MessageSigNa final String MESSAGE_PARAM = "m"; ScribSockGen.checkMessageSigNameDecl(msd); - mb.addParameters(msd.extName + " " + MESSAGE_PARAM); + mb.addParameters(msd.getExtName() + " " + MESSAGE_PARAM); } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java index 0c585199d..210d819f6 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java @@ -88,7 +88,7 @@ private void makeReceiveMethod(EAction a, EState succ) throws ScribException //addReceiveMessageSigNameParams(mb, a, msd);*/ mb.addBodyLine(StateChannelApiGenerator.SCRIBMESSAGE_CLASS + " " + RECEIVE_MESSAGE_PARAM + " = " + JavaBuilder.SUPER + ".readScribMessage(" + getSessionApiRoleConstant(a.obj) + ");"); - mb.addBodyLine(RECEIVE_ARG_PREFIX + "." + BUFF_VAL_FIELD + " = (" + msd.extName + ") " + RECEIVE_MESSAGE_PARAM + ";"); + mb.addBodyLine(RECEIVE_ARG_PREFIX + "." + BUFF_VAL_FIELD + " = (" + msd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM + ";"); } addReturnNextSocket(mb, succ); } @@ -188,7 +188,7 @@ protected static void addReceiveOpParams(MethodBuilder mb, Module main, EAction } DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType ScribSockGen.checkJavaDataTypeDecl(dtd); - mb.addParameters(buffSuper + dtd.extName + "> " + RECEIVE_ARG_PREFIX + i++); + mb.addParameters(buffSuper + dtd.getExtName() + "> " + RECEIVE_ARG_PREFIX + i++); } } } @@ -201,7 +201,7 @@ protected static void addPayloadBuffSetters(Module main, EAction a, MethodBuilde for (PayloadElemType pt : a.payload.elems) // Could factor out this loop (arg names) with addReceiveOpParams (as for send) { DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType - mb.addBodyLine(RECEIVE_ARG_PREFIX + i + "." + BUFF_VAL_FIELD + " = (" + dtd.extName + ") " + mb.addBodyLine(RECEIVE_ARG_PREFIX + i + "." + BUFF_VAL_FIELD + " = (" + dtd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + (i++ - 1) +"];"); } } @@ -210,7 +210,7 @@ protected static void addPayloadBuffSetters(Module main, EAction a, MethodBuilde protected static void addReceiveMessageSigNameParams(MethodBuilder mb, MessageSigNameDecl msd, boolean superr) throws ScribException { ScribSockGen.checkMessageSigNameDecl(msd); - mb.addParameters(BUF_CLASS + "<" + ((superr) ? "? " + JavaBuilder.SUPER + " " : "") + msd.extName + "> " + RECEIVE_ARG_PREFIX); + mb.addParameters(BUF_CLASS + "<" + ((superr) ? "? " + JavaBuilder.SUPER + " " : "") + msd.getExtName() + "> " + RECEIVE_ARG_PREFIX); } // Similar to setReceiveHeader diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java index 91437ceec..84873c9ce 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java @@ -271,9 +271,9 @@ protected static void checkMessageSigNameDecl(MessageSigNameDecl msd) throws Scr protected static void checkJavaSchema(NonProtocolDecl npd) throws ScribException { - if (!npd.schema.equals(ScribSockGen.JAVA_SCHEMA)) // FIXME: factor out + if (!npd.getSchema().equals(ScribSockGen.JAVA_SCHEMA)) // FIXME: factor out { - throw new ScribException(npd.getSource(), "Unsupported data type schema: " + npd.schema); + throw new ScribException(npd.getSource(), "Unsupported data type schema: " + npd.getSchema()); } } From 5dbde0ea16a6beb0972e85a78b495b81a9381876 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 11 Apr 2019 11:27:10 +0100 Subject: [PATCH 251/539] Continued: WIP cleaning up ast classes. --- .../java/org/scribble/ast/AstFactory.java | 2 +- .../java/org/scribble/ast/AstFactoryImpl.java | 12 +- .../main/java/org/scribble/ast/Module.java | 269 ++++++++---------- .../java/org/scribble/ast/ModuleMember.java | 3 +- .../del/global/GDelegationElemDel.java | 2 +- .../java/org/scribble/cli/CommandLine.java | 10 +- .../java/sessionapi/SessionApiGenerator.java | 2 +- .../java/statechanapi/ScribSockGen.java | 10 +- 8 files changed, 139 insertions(+), 171 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index f37226041..8cdb96b7c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -53,7 +53,7 @@ // Currently, used only in relatively niche places (since ANTLR now constructs all parsed nodes "directly") public interface AstFactory { - Module Module(CommonTree source, ModuleDecl moddecl, + Module Module(Token t, ModuleDecl moddecl, List> imports, List> data, List> protos); diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java index 744c5f816..3d8956b8a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -188,13 +188,17 @@ public GDelegationElem GDelegationElem(CommonTree source, } @Override - public Module Module(CommonTree source, ModuleDecl moddecl, + public Module Module(Token t, ModuleDecl moddecl, List> imports, List> data, List> protos) { - Module module = new Module(source, moddecl, imports, data, protos); - module = del(module, new ModuleDel()); - return module; + Module n = new Module(t); + n.addChild(moddecl); + n.addChildren(imports); + n.addChildren(data); + n.addChildren(protos); + n = del(n, new ModuleDel()); + return n; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/Module.java b/scribble-ast/src/main/java/org/scribble/ast/Module.java index 5edbd4aa8..ea86de6be 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Module.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Module.java @@ -15,49 +15,86 @@ import java.util.LinkedList; import java.util.List; +import java.util.Optional; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.global.GProtocolDecl; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Kind; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.ProtocolName; -import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; public class Module extends ScribNodeBase { + public static final int MODDECL_CHILD_INDEX = 0; + // ScribTreeAdaptor#create constructor public Module(Token payload) { super(payload); - this.moddecl = null; - this.imports = null; - this.data = null; - this.protos = null; } // Tree#dupNode constructor protected Module(Module node) { super(node); - this.moddecl = null; - this.imports = null; - this.data = null; - this.protos = null; + } + + public ModuleDecl getModuleDeclChild() + { + return (ModuleDecl) getChild(0); + } + + public List> getImportDeclChildren() + { + return getMemberChildren(x -> x instanceof ImportDecl, + x -> (ImportDecl) x); + } + + public List> getNonProtoDeclChildren() + { + return getMemberChildren(x -> x instanceof NonProtocolDecl, + x -> (NonProtocolDecl) x); + } + + public List> getProtoDeclChildren() + { + return getMemberChildren(x -> x instanceof ProtocolDecl, + x -> (ProtocolDecl) x); + } + + /*public List> getProtoDeclChildren(Kind k) + { + return getMemberChildren(x -> x instanceof ProtocolDecl, + x -> (ProtocolDecl) x); + }*/ + + // Not requiring T extends ModuleMember, ImportDecl is not a ModuleMember + private List getMemberChildren( + Predicate instanceOf, Function cast) + { + List res = new LinkedList<>(); + boolean b = false; + for (ScribNode c : getChildren()) + { + if (!b && instanceOf.test(c)) b = true; + else if (b && !instanceOf.test(c)) break; + if (b) res.add(cast.apply(c)); + } + return res; } public ModuleName getFullModuleName() { - //return this.moddecl.getFullModuleName(); return getModuleDeclChild().getFullModuleName(); } @@ -72,17 +109,13 @@ public Module dupNode() protected Module reconstruct(ModuleDecl moddecl, List> imports, List> data, List> protos) { - //Module m = new Module(this.source, moddecl, imports, data, protos); - Module m = dupNode(); - ScribDel del = del(); - List children = new LinkedList<>(); - children.add(moddecl); - children.addAll(imports); - children.addAll(data); - children.addAll(protos); - m.setChildren(children); - m.setDel(del); // No copy - return m; + Module dup = dupNode(); + dup.addChild(moddecl); + dup.addChildren(imports); + dup.addChildren(data); + dup.addChildren(protos); + dup.setDel(del()); // No copy + return dup; } @Override @@ -99,114 +132,72 @@ public Module visitChildren(AstVisitor nv) throws ScribException return reconstruct(moddecl, imports, data, protos); } - public ModuleDecl getModuleDeclChild() - { - List tmp = getChildren().stream() - .filter(x -> x instanceof ModuleDecl).map(x -> (ModuleDecl) x) - .collect(Collectors.toList()); - if (tmp.size() != 1) - { - throw new RuntimeException("Shouldn't get in here: " + tmp); - } - return tmp.get(0); - } - - public List> getImportDeclChildren() - { - return getChildren().stream().filter(x -> x instanceof ImportDecl) - .map(x -> (ImportDecl) x).collect(Collectors.toList()); - } - - public List> getNonProtoDeclChildren() - { - return getChildren().stream().filter(x -> x instanceof NonProtocolDecl) - .map(x -> (NonProtocolDecl) x).collect(Collectors.toList()); - } - - // Arg is alias simple name public DataTypeDecl getDataTypeDeclChild(DataType simpname) // Simple name (as for getProtocolDecl) { - List> filt = getNonProtoDeclChildren().stream() - .filter(x -> ((NonProtocolDecl) x).isDataTypeDecl() + Optional res = getNonProtoDeclChildren().stream() + .filter(x -> (x instanceof DataTypeDecl) && x.getDeclName().equals(simpname)) - .collect(Collectors.toList()); - if (filt.size() != 1) + .map(x -> (DataTypeDecl) x).findFirst(); // No duplication check, rely on WF + if (res.isPresent()) { - throw new RuntimeException( - "Data type decl not found (or duplicate name): " + simpname); + throw new RuntimeException("Type decl not found: " + simpname); } - return (DataTypeDecl) filt.get(0); + return res.get(); } - // Arg is alias simple name + // CHECKME: allow sig and type decls with same decl name in same module? public MessageSigNameDecl getMessageSigDeclChild(MessageSigName simpname) { - List> filt = getNonProtoDeclChildren().stream() - .filter(x -> ((NonProtocolDecl) x).isMessageSigNameDecl() + Optional res = getNonProtoDeclChildren().stream() + .filter(x -> (x instanceof MessageSigNameDecl) && x.getDeclName().equals(simpname)) - .collect(Collectors.toList()); - if (filt.size() != 1) + .map(x -> (MessageSigNameDecl) x).findFirst(); // No duplication check, rely on WF + if (res.isPresent()) { - throw new RuntimeException( - "Message sig name not found (or duplicate name): " + simpname); + throw new RuntimeException("Sig decl not found: " + simpname); } - return (MessageSigNameDecl) filt.get(0); + return res.get(); } - public List> getProtoDeclChildren() + public List getGProtoDeclChildren() { - //return Collections.unmodifiableList(this.protos); - return getChildren().stream().filter(x -> x instanceof ProtocolDecl) - .map(x -> (ProtocolDecl) x).collect(Collectors.toList()); + /*return getChildren().stream().filter(IS_GPROTOCOLDECL).map(TO_GPROTOCOLDECL) + .collect(Collectors.toList());*/ + return getProtoDeclChildren().stream().filter(x -> x.isGlobal()) + .map(x -> (GProtocolDecl) x).collect(Collectors.toList()); + // Less efficient, but less code } - public boolean hasProtocolDecl( - ProtocolName simpname) + // CHECKME: allow global and local protocols with same simpname in same module? -- currently, no? + public boolean hasGProtocolDecl(GProtocolName simpname) { - List> pds = - simpname.getKind().equals(Global.KIND) - ? getGProtoDeclChildren() - : null; // FIXME - return pds.stream().anyMatch(x -> x.getHeaderChild().getDeclName().equals(simpname)); + return getGProtoDeclChildren().stream() + .anyMatch(x -> x.getHeaderChild().getDeclName().equals(simpname)); } - // pn is simple name // Pre: hasProtocolDecl(simpname) - // CHECKME: separate global/local? - public ProtocolDecl getProtocolDeclChild( - ProtocolName simpname) + public GProtocolDecl getGProtocolDeclChild( + GProtocolName simpname) { - List> pds = - simpname.getKind().equals(Global.KIND) - ? getGProtoDeclChildren() - : null; // FIXME - List> filt = pds.stream() + Optional res = getGProtoDeclChildren().stream() .filter(x -> x.getHeaderChild().getDeclName().equals(simpname)) - .collect(Collectors.toList()); - if (filt.size() != 1) + .findFirst(); // No duplication check, rely on WF + if (res.isPresent()) { - throw new RuntimeException("Protocol not found (or duplicate name): " + simpname); + throw new RuntimeException("Proto decl not found: " + simpname); } - @SuppressWarnings("unchecked") - ProtocolDecl res = (ProtocolDecl) filt.get(0); - return res; + return res.get(); } - public List getGProtoDeclChildren() + // Useful for, e.g., Do + public ProtocolDecl getProtocolDeclChild( + ProtocolName simpname) { - return getChildren().stream().filter(IS_GPROTOCOLDECL).map(TO_GPROTOCOLDECL) - .collect(Collectors.toList()); + return (simpname.getKind().equals(Global.KIND)) + ? (ProtocolDecl) getGProtocolDeclChild((GProtocolName) simpname) // FIXME -- make Kind take itself as param + : null; // TODO } - private static final Predicate IS_GPROTOCOLDECL = - pd -> (pd instanceof ProtocolDecl) && ((ProtocolDecl) pd).isGlobal(); - - private static final Predicate IS_LPROTOCOLDECL = - pd -> (pd instanceof ProtocolDecl) && ((ProtocolDecl) pd).isLocal(); - - private static final Function TO_GPROTOCOLDECL = - pd -> (GProtocolDecl) pd; - @Override public String toString() { @@ -225,60 +216,28 @@ public String toString() } return s; } - - - - - - - - - - - - - // Deprecate - - private final ModuleDecl moddecl; - - // Using (implicitly bounded) nested wildcards for mixed element lists (better practice to use separate lists?) - private final List> imports; - private final List> data; - private final List> protos; - - public Module(CommonTree source, ModuleDecl moddecl, - List> imports, List> data, - List> protos) - { - super(source); - this.moddecl = moddecl; - this.imports = new LinkedList<>(imports); - this.data = new LinkedList<>(data); - this.protos = new LinkedList<>(protos); - } +} - /*@Override - protected Module copy() - { - //return new Module(this.source, this.moddecl, this.imports, this.data, this.protos); - /*ModuleDecl md = getModuleDecl(); - List> ids = getImportDecls(); - List> npds = getNonProtocolDecls(); - List> pds = getProtocolDecls();* / - //return new Module(this.source, md, ids, npds, pds); - Module copy = dupNode(); - copy.setChildren(getChildren()); - return copy; - } - @Override - public Module clone(AstFactory af) - { - ModuleDecl moddecl = (ModuleDecl) this.moddecl.clone(af); - List> imports = ScribUtil.cloneList(af, this.imports); - List> data = ScribUtil.cloneList(af, this.data); - List> protos = ScribUtil.cloneList(af, this.protos); - return af.Module(this.source, moddecl, imports, data, protos); - throw new RuntimeException("Deprecated"); - }*/ -} + + + + + + + + + + + + + + + + + + /*private static final Predicate IS_GPROTOCOLDECL = + x -> (x instanceof ProtocolDecl) && ((ProtocolDecl) x).isGlobal(); + + private static final Function TO_GPROTOCOLDECL = + x -> (GProtocolDecl) x;*/ diff --git a/scribble-ast/src/main/java/org/scribble/ast/ModuleMember.java b/scribble-ast/src/main/java/org/scribble/ast/ModuleMember.java index 21e63f0c1..c0ce26cab 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ModuleMember.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ModuleMember.java @@ -19,5 +19,6 @@ // Not an abstract class, NonProtocolDecl extends NameDeclNode (whereas ProtocolDecl uses ProtocolHeader for that) public interface ModuleMember { - MemberName getFullMemberName(Module mod); // Should not use ModuleContext -- i.e. works before ModuleContext is built (indeed, context building uses this) + MemberName getFullMemberName(Module mod); + // Should not use ModuleContext -- i.e. works before ModuleContext is built (indeed, context building uses this) } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java index dc11db323..935ac683a 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -62,7 +62,7 @@ public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, // Role rn = r.toName(); ProtocolDecl gpd = disamb.lang.getContext() .getModule(fullname.getPrefix()) - .getProtocolDeclChild(fullname.getSimpleName()); + .getGProtocolDeclChild(fullname.getSimpleName()); if (!gpd.getHeaderChild().getRoleDeclListChild().getRoles().contains(rn)) { throw new ScribException(r.getSource(), "Invalid delegation role: " + de); diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 56ece6154..cc6b5998a 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -400,8 +400,8 @@ private EGraph getEGraph(Lang lang, GProtocolName fullname, Role role, { LangContext langc = lang.getContext(); JobContext jobc = lang.getJob().getContext(); - GProtocolDecl gpd = (GProtocolDecl) langc.getMainModule() - .getProtocolDeclChild(fullname.getSimpleName()); + GProtocolDecl gpd = langc.getMainModule() + .getGProtocolDeclChild(fullname.getSimpleName()); if (gpd == null || !gpd.getHeaderChild().getRoleDeclListChild().getRoles() .contains(role)) { @@ -513,11 +513,11 @@ protected static GProtocolName checkGlobalProtocolArg(LangContext langc, { GProtocolName simpgpn = new GProtocolName(simpname); Module main = langc.getMainModule(); - if (!main.hasProtocolDecl(simpgpn)) + if (!main.hasGProtocolDecl(simpgpn)) { throw new CommandLineException("Global protocol not found: " + simpname); } - ProtocolDecl pd = main.getProtocolDeclChild(simpgpn); + ProtocolDecl pd = main.getGProtocolDeclChild(simpgpn); if (pd == null || !pd.isGlobal()) { throw new CommandLineException("Global protocol not found: " + simpname); @@ -534,7 +534,7 @@ protected static Role checkRoleArg(LangContext langc, GProtocolName fullname, String rolename) throws CommandLineException { ProtocolDecl pd = langc.getMainModule() - .getProtocolDeclChild(fullname.getSimpleName()); + .getGProtocolDeclChild(fullname.getSimpleName()); Role role = new Role(rolename); if (!pd.getHeaderChild().getRoleDeclListChild().getRoles().contains(role)) { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index 5715c9ff0..2d6c395a9 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -205,7 +205,7 @@ private void constructRoleClasses() throws ScribException { Module mod = this.lang.getContext().getModule(this.gpn.getPrefix()); GProtocolName simpname = this.gpn.getSimpleName(); - GProtocolDecl gpd = (GProtocolDecl) mod.getProtocolDeclChild(simpname); + GProtocolDecl gpd = (GProtocolDecl) mod.getGProtocolDeclChild(simpname); for (Role r : gpd.getRoles()) { //constructRoleClass(this.cb.newClass(), r); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java index 84873c9ce..7e66d2f54 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java @@ -153,9 +153,13 @@ protected void addInitialStateConstructor() mb.addBodyLine(SESSIONENDPOINT_PARAM + ".init();"); mb.addBodyLine(ClassBuilder.RETURN + " " + ClassBuilder.NEW + " " + this.root + "(" + SESSIONENDPOINT_PARAM + ");");*/ - GProtocolDecl gpd = (GProtocolDecl) this.apigen.getJob().getContext().getModule(this.apigen.gpn.getPrefix()).getProtocolDeclChild(this.apigen.gpn.getSimpleName()); - String epClass = gpd.isExplicit() ? EXPLICITENDPOINT_CLASS : MPSTENDPOINT_CLASS; - ConstructorBuilder ctor2 = cb.newConstructor(epClass + "<" + sess + ", " + role + "> " + SESSIONENDPOINT_PARAM); + GProtocolDecl gpd = (GProtocolDecl) this.apigen.getJob().getContext() + .getModule(this.apigen.gpn.getPrefix()) + .getGProtocolDeclChild(this.apigen.gpn.getSimpleName()); + String epClass = gpd.isExplicit() ? EXPLICITENDPOINT_CLASS + : MPSTENDPOINT_CLASS; + ConstructorBuilder ctor2 = cb.newConstructor( + epClass + "<" + sess + ", " + role + "> " + SESSIONENDPOINT_PARAM); ctor2.addExceptions(StateChannelApiGenerator.SCRIBBLERUNTIMEEXCEPTION_CLASS); ctor2.addModifiers(JavaBuilder.PUBLIC); From 1c7f24d7ae9e94cccc79aa116c955b325465e1e9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 11 Apr 2019 11:45:12 +0100 Subject: [PATCH 252/539] Continued: WIP cleaning up ast classes. --- .../src/main/java/org/scribble/ast/Do.java | 11 +++----- .../main/java/org/scribble/ast/Module.java | 26 ++++--------------- .../java/org/scribble/ast/global/GDo.java | 16 +++++++----- 3 files changed, 17 insertions(+), 36 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/Do.java b/scribble-ast/src/main/java/org/scribble/ast/Do.java index 6e9366b88..65e2ea441 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Do.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Do.java @@ -90,14 +90,9 @@ public ProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) return getProtocolNameNode().toName(); // Pre: use after name disambiguation (maybe drop FullName suffix) } - // mcontext redundant because redundant for getTargetProtocolDeclFullName - public ProtocolDecl getTargetProtocolDecl(LangContext jcontext, - ModuleContext mcontext) - { - ProtocolName fullname = getTargetProtocolDeclFullName(mcontext); - return jcontext.getModule(fullname.getPrefix()) - .getProtocolDeclChild(fullname.getSimpleName()); - } + // CHECKME: mcontext redundant, because redundant for getTargetProtocolDeclFullName + public abstract ProtocolDecl getTargetProtocolDecl(LangContext jcontext, + ModuleContext mcontext); public Role getTargetRoleParameter(LangContext jcontext, ModuleContext mcontext, Role role) diff --git a/scribble-ast/src/main/java/org/scribble/ast/Module.java b/scribble-ast/src/main/java/org/scribble/ast/Module.java index ea86de6be..6a6d8c5cd 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Module.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Module.java @@ -22,14 +22,12 @@ import org.antlr.runtime.Token; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Kind; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.ModuleName; -import org.scribble.core.type.name.ProtocolName; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -72,18 +70,13 @@ public List> getProtoDeclChildren() x -> (ProtocolDecl) x); } - /*public List> getProtoDeclChildren(Kind k) - { - return getMemberChildren(x -> x instanceof ProtocolDecl, - x -> (ProtocolDecl) x); - }*/ - // Not requiring T extends ModuleMember, ImportDecl is not a ModuleMember private List getMemberChildren( Predicate instanceOf, Function cast) { List res = new LinkedList<>(); boolean b = false; + // Start collecting from first instance, and stop on first non-instance or end for (ScribNode c : getChildren()) { if (!b && instanceOf.test(c)) b = true; @@ -138,7 +131,7 @@ public DataTypeDecl getDataTypeDeclChild(DataType simpname) // Simple name (as .filter(x -> (x instanceof DataTypeDecl) && x.getDeclName().equals(simpname)) .map(x -> (DataTypeDecl) x).findFirst(); // No duplication check, rely on WF - if (res.isPresent()) + if (!res.isPresent()) { throw new RuntimeException("Type decl not found: " + simpname); } @@ -152,7 +145,7 @@ public MessageSigNameDecl getMessageSigDeclChild(MessageSigName simpname) .filter(x -> (x instanceof MessageSigNameDecl) && x.getDeclName().equals(simpname)) .map(x -> (MessageSigNameDecl) x).findFirst(); // No duplication check, rely on WF - if (res.isPresent()) + if (!res.isPresent()) { throw new RuntimeException("Sig decl not found: " + simpname); } @@ -165,7 +158,7 @@ public List getGProtoDeclChildren() .collect(Collectors.toList());*/ return getProtoDeclChildren().stream().filter(x -> x.isGlobal()) .map(x -> (GProtocolDecl) x).collect(Collectors.toList()); - // Less efficient, but less code + // Less efficient, but smaller code } // CHECKME: allow global and local protocols with same simpname in same module? -- currently, no? @@ -182,21 +175,12 @@ public GProtocolDecl getGProtocolDeclChild( Optional res = getGProtoDeclChildren().stream() .filter(x -> x.getHeaderChild().getDeclName().equals(simpname)) .findFirst(); // No duplication check, rely on WF - if (res.isPresent()) + if (!res.isPresent()) { throw new RuntimeException("Proto decl not found: " + simpname); } return res.get(); } - - // Useful for, e.g., Do - public ProtocolDecl getProtocolDeclChild( - ProtocolName simpname) - { - return (simpname.getKind().equals(Global.KIND)) - ? (ProtocolDecl) getGProtocolDeclChild((GProtocolName) simpname) // FIXME -- make Kind take itself as param - : null; // TODO - } @Override public String toString() diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java index 2ef060dfb..a416ed46e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java @@ -40,6 +40,15 @@ public GProtocolNameNode getProtocolNameNode() { return (GProtocolNameNode) getChild(Do.NAME_CHILD_INDEX); } + + @Override + public GProtocolDecl getTargetProtocolDecl(LangContext jcontext, + ModuleContext mcontext) + { + GProtocolName fullname = getTargetProtocolDeclFullName(mcontext); + return jcontext.getModule(fullname.getPrefix()) + .getGProtocolDeclChild(fullname.getSimpleName()); + } @Override public GDo dupNode() @@ -52,11 +61,4 @@ public GProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) { return (GProtocolName) super.getTargetProtocolDeclFullName(mcontext); } - - @Override - public GProtocolDecl getTargetProtocolDecl(LangContext jcontext, - ModuleContext mcontext) - { - return (GProtocolDecl) super.getTargetProtocolDecl(jcontext, mcontext); - } } From 996e4be117d37283e60100faabd26eb5bc4f3825 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 11 Apr 2019 13:04:07 +0100 Subject: [PATCH 253/539] Minor. --- .../java/org/scribble/ast/AstFactory.java | 18 ++--- .../java/org/scribble/ast/AstFactoryImpl.java | 54 +++++++------- .../main/java/org/scribble/ast/Choice.java | 59 +++++---------- .../org/scribble/ast/CompoundInteraction.java | 16 ----- .../org/scribble/ast/CompoundSessionNode.java | 14 ---- .../org/scribble/ast/DirectedInteraction.java | 3 - .../java/org/scribble/ast/ExplicitMod.java | 14 ---- .../java/org/scribble/ast/ImportModule.java | 71 +++---------------- .../java/org/scribble/ast/InteractionSeq.java | 42 ++--------- .../java/org/scribble/ast/MessageNode.java | 2 - .../java/org/scribble/ast/MessageSigNode.java | 52 ++------------ .../main/java/org/scribble/ast/Module.java | 2 +- .../org/scribble/ast/ProtocolKindNode.java | 4 +- .../java/org/scribble/ast/global/GChoice.java | 51 ++----------- .../scribble/ast/global/GInteractionSeq.java | 46 ++---------- 15 files changed, 85 insertions(+), 363 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 8cdb96b7c..bbeca44a8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -57,8 +57,7 @@ Module Module(Token t, ModuleDecl moddecl, List> imports, List> data, List> protos); - MessageSigNode MessageSigNode(CommonTree source, OpNode op, - PayloadElemList payload); + MessageSigNode MessageSigNode(Token t, OpNode op, PayloadElemList pay); GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode name, RoleNode role); @@ -71,7 +70,7 @@ UnaryPayloadElem UnaryPayloadElem(Token t, ModuleDecl ModuleDecl(Token t, ModuleNameNode fullmodname); - ImportModule ImportModule(CommonTree source, ModuleNameNode modname, + ImportModule ImportModule(Token t, ModuleNameNode modname, ModuleNameNode alias); MessageSigNameDecl MessageSigNameDecl(Token t, IdNode schema, IdNode extName, @@ -102,21 +101,18 @@ NonRoleParamDecl NonRoleParamDecl( GProtocolBlock GProtocolBlock(Token t, GInteractionSeq gis); - GInteractionSeq GInteractionSeq(CommonTree source, - List gis); + GInteractionSeq GInteractionSeq(Token t, List elems); - GMessageTransfer GMessageTransfer(Token t, RoleNode src, - MessageNode msg, List dsts); + GMessageTransfer GMessageTransfer(Token t, RoleNode src, MessageNode msg, + List dsts); - GConnect GConnect(Token t, RoleNode src, MessageNode msg, - RoleNode dest); + GConnect GConnect(Token t, RoleNode src, MessageNode msg, RoleNode dest); GDisconnect GDisconnect(Token t, RoleNode src, RoleNode dst); GWrap GWrap(Token t, RoleNode src, RoleNode dst); - GChoice GChoice(CommonTree source, RoleNode subj, - List blocks); + GChoice GChoice(Token t, RoleNode subj, List blocks); GRecursion GRecursion(Token t, RecVarNode recvar, GProtocolBlock block); diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java index 3d8956b8a..ceaa006ca 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -138,33 +138,24 @@ protected MessageSigNode UnitMessageSigNode() } @Override - public MessageSigNode MessageSigNode(CommonTree source, OpNode op, - PayloadElemList payload) + public MessageSigNode MessageSigNode(Token t, OpNode op, PayloadElemList pay) { - MessageSigNode msn = new MessageSigNode(source, op, payload); + MessageSigNode msn = new MessageSigNode(t); + msn.addChild(op); + msn.addChild(pay); msn = del(msn, createDefaultDelegate()); return msn; } @Override - //public PayloadElemList PayloadElemList(List payloadelems) - public PayloadElemList PayloadElemList(Token t, - List> payloadelems) + public PayloadElemList PayloadElemList(Token t, List> elems) { PayloadElemList p = new PayloadElemList(t); - p.addChildren(payloadelems); + p.addChildren(elems); p = del(p, createDefaultDelegate()); return p; } - /*@Override - public PayloadElem PayloadElem(PayloadElemNameNode name) - { - PayloadElem pe = new PayloadElem(name); - pe = del(pe, createDefaultDelegate()); - return pe; - }*/ - @Override public UnaryPayloadElem UnaryPayloadElem( Token t, PayloadElemNameNode name) @@ -174,7 +165,8 @@ public UnaryPayloadElem UnaryPayloadElem( de.addChild(name); de = del(de, createDefaultDelegate()); return de; - //throw new RuntimeException("[TODO] : " + name); // Currently parsed "directly" by ANTLR -- do we still need to construct manually? + //throw new RuntimeException("[TODO] : " + name); + // Currently parsed "directly" by ANTLR -- do we still need to construct manually? } @Override @@ -211,10 +203,15 @@ public ModuleDecl ModuleDecl(Token t, ModuleNameNode fullmodname) } @Override - public ImportModule ImportModule(CommonTree source, ModuleNameNode modname, + public ImportModule ImportModule(Token t, ModuleNameNode modname, ModuleNameNode alias) { - ImportModule im = new ImportModule(source, modname, alias); + ImportModule im = new ImportModule(t); + im.addChild(modname); + if (alias != null) + { + im.addChild(alias); + } im = del(im, new ImportModuleDel()); return im; } @@ -337,12 +334,12 @@ public GProtocolBlock GProtocolBlock(Token t, GInteractionSeq seq) } @Override - public GInteractionSeq GInteractionSeq(CommonTree source, - List actions) + public GInteractionSeq GInteractionSeq(Token t, List elems) { - GInteractionSeq gis = new GInteractionSeq(source, actions); - gis = del(gis, new GInteractionSeqDel()); - return gis; + GInteractionSeq n = new GInteractionSeq(t); + n.addChildren(elems); + n = del(n, new GInteractionSeqDel()); + return n; } @Override @@ -389,12 +386,13 @@ public GWrap GWrap(Token t, RoleNode src, RoleNode dst) } @Override - public GChoice GChoice(CommonTree source, RoleNode subj, - List blocks) + public GChoice GChoice(Token t, RoleNode subj, List blocks) { - GChoice gc = new GChoice(source, subj, blocks); - gc = del(gc, new GChoiceDel()); - return gc; + GChoice n = new GChoice(t); + n.addChild(subj); + n.addChildren(blocks); + n = del(n, new GChoiceDel()); + return n; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/Choice.java b/scribble-ast/src/main/java/org/scribble/ast/Choice.java index 183a04163..7ba9eeeaf 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Choice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Choice.java @@ -13,55 +13,53 @@ */ package org.scribble.ast; -import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.del.ScribDel; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -public abstract class Choice extends CompoundInteraction +public abstract class Choice + extends CompoundInteraction { + public static final int SUBJ_CHILD_INDEX = 0; + public static final int BLOCK_CHILDREN_START_INDEX = 1; + // ScribTreeAdaptor#create constructor public Choice(Token t) { super(t); - this.subj = null; - this.blocks = null; } // Tree#dupNode constructor protected Choice(Choice node) { super(node); - this.subj = null; - this.blocks = null; } - public abstract Choice dupNode(); - public RoleNode getSubjectChild() { - return (RoleNode) getChild(0); + return (RoleNode) getChild(SUBJ_CHILD_INDEX); } // Override in concrete sub for cast public abstract List> getBlockChildren(); - public Choice reconstruct(RoleNode subj, List> blocks) + @Override + public abstract Choice dupNode(); + + public Choice reconstruct(RoleNode subj, + List> blocks) { - Choice c = dupNode(); - ScribDel del = del(); - c.addChild(subj); - c.addChildren(blocks); - c.setDel(del); // No copy - return c; + Choice dup = dupNode(); + dup.addChild(subj); + dup.addChildren(blocks); + dup.setDel(del()); // No copy + return dup; } @Override @@ -82,29 +80,4 @@ public String toString() + getBlockChildren().stream().map(b -> b.toString()) .collect(Collectors.joining(sep)); } - - - - - - - - - - - - - - - - private final RoleNode subj; - private final List> blocks; - // Factor up? And specialise to singleton for Recursion/Interruptible? Maybe too artificial -- could separate unaryblocked and multiblocked compound ops? - - protected Choice(CommonTree source, RoleNode subj, List> blocks) - { - super(source); - this.subj = subj; - this.blocks = new LinkedList<>(blocks); - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java index 10d5d872d..d8304bd8f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java @@ -14,7 +14,6 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; public abstract class CompoundInteraction @@ -31,19 +30,4 @@ protected CompoundInteraction(CompoundInteraction node) { super(node); } - - - - - - - - - - - - protected CompoundInteraction(CommonTree source) - { - super(source); - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java index d7fda6b60..ab7a5e7a5 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java @@ -14,7 +14,6 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; // Redundant? Is always a CompoundInteraction -- cf. SimpleSessionNode @@ -32,17 +31,4 @@ protected CompoundSessionNode(CompoundSessionNode node) { super(node); } - - - - - - - - - - public CompoundSessionNode(CommonTree source) - { - super(source); - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java index 61791b0af..4ee1008ff 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java @@ -13,16 +13,13 @@ */ package org.scribble.ast; -import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.Role; -import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; diff --git a/scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java b/scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java index 36ef1208f..ff1093866 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java @@ -46,18 +46,4 @@ public String toString() { return "explicit"; } - - - - - - - - - - - - - - public static final ExplicitMod EXPLICIT = new ExplicitMod((Token) null); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java b/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java index 8b5ed1f22..32cdd6a08 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java @@ -14,45 +14,42 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.core.type.kind.ModuleKind; import org.scribble.core.type.name.ModuleName; -import org.scribble.del.ScribDel; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; public class ImportModule extends ImportDecl { + public static final int MODULENAME_CHILD = 0; + public static final int ALIAS_CHILD = 1; + // ScribTreeAdaptor#create constructor public ImportModule(Token payload) { super(payload); - this.modname = null; - this.alias = null; } // Tree#dupNode constructor protected ImportModule(ImportModule node) { super(node); - this.modname = null; - this.alias = null; } // Full name ("import x.y.Z") public ModuleNameNode getModuleNameNodeChild() { - return (ModuleNameNode) getChild(0); + return (ModuleNameNode) getChild(MODULENAME_CHILD); } - // Pre: hasAlias + // Pre: hasAlias -- no alias means no child // Simple name // No child (null) if no alias public ModuleNameNode getAliasNameNodeChild() { - return (ModuleNameNode) getChild(1); + return (ModuleNameNode) getChild(ALIAS_CHILD); } // Cf. CommonTree#dupNode @@ -65,15 +62,14 @@ public ImportModule dupNode() // alias == null if no alias public ImportModule reconstruct(ModuleNameNode modname, ModuleNameNode alias) { - ImportModule im = dupNode(); - ScribDel del = del(); - im.addChild(modname); + ImportModule dup = dupNode(); + dup.addChild(modname); if (alias != null) { - im.addChild(alias); + dup.addChild(alias); } - im.setDel(del); // No copy - return im; + dup.setDel(del()); // No copy + return dup; } @Override @@ -96,7 +92,6 @@ public boolean isImportModule() @Override public boolean hasAlias() { - //return this.alias != null; return getChildCount() > 1; } @@ -106,12 +101,6 @@ public ModuleName getAlias() return getAliasNameNodeChild().toName(); } - /*@Override - public ModuleName getVisibleName() - { - return isAliased() ? getAlias() : this.modname.toName(); - }*/ - @Override public String toString() { @@ -122,42 +111,4 @@ public String toString() } return s + ";"; } - - - - - - - - - - - - - - - - private final ModuleNameNode modname; - private final ModuleNameNode alias; // Factor up to ImportDecl - - public ImportModule(CommonTree source, ModuleNameNode modname, ModuleNameNode alias) - { - super(source); - this.modname = modname; - this.alias = alias; - } - - /*@Override - protected ImportModule copy() - { - return new ImportModule(this.source, this.modname, this.alias); - } - - @Override - public ImportModule clone(AstFactory af) - { - ModuleNameNode name = (ModuleNameNode) this.modname.clone(af); - ModuleNameNode alias = (ModuleNameNode) this.alias.clone(af); - return af.ImportModule(this.source, name, alias); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java b/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java index a8f84f840..c99e04694 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java +++ b/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java @@ -18,9 +18,7 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -31,33 +29,30 @@ public abstract class InteractionSeq public InteractionSeq(Token t) { super(t); - this.inters = null; } // Tree#dupNode constructor public InteractionSeq(InteractionSeq node) { super(node); - this.inters = null; } - @Override - public abstract InteractionSeq dupNode(); - public abstract List> getInteractionChildren(); public boolean isEmpty() { return getChildCount() == 0; //this.inters.isEmpty(); } + + @Override + public abstract InteractionSeq dupNode(); public InteractionSeq reconstruct(List> ins) { - InteractionSeq pd = dupNode(); - ScribDel del = del(); - ins.forEach(x -> pd.addChild(x)); - pd.setDel(del); // No copy - return pd; + InteractionSeq dup = dupNode(); + ins.forEach(x -> dup.addChild(x)); + dup.setDel(del()); // No copy + return dup; } @Override @@ -92,27 +87,4 @@ public String toString() return getInteractionChildren().stream().map(i -> i.toString()) .collect(Collectors.joining("\n")); } - - - - - - - - - - - - - - - - private final List> inters; - - protected InteractionSeq(CommonTree source, List> inters) - { - super(source); - this.inters = inters; - } - } diff --git a/scribble-ast/src/main/java/org/scribble/ast/MessageNode.java b/scribble-ast/src/main/java/org/scribble/ast/MessageNode.java index 6f00d8033..a0f8d56e6 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/MessageNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/MessageNode.java @@ -19,8 +19,6 @@ public interface MessageNode extends NonRoleArgNode { Message toMessage(); - - //MessageNode clone(AstFactory af); //Arg toArg(); // Not possible due to "diamond" with PayloadElemNameNode at AmbigNameNode } diff --git a/scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java b/scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java index a9ae7ec9c..a2c29c8e5 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java @@ -14,39 +14,36 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.OpNode; import org.scribble.core.type.session.MessageSig; -import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; public class MessageSigNode extends ScribNodeBase implements MessageNode { + public static final int OP_CHILD_INDEX = 0; + public static final int PAYLOAD_CHILD_INDEX = 1; + // ScribTreeAdaptor#create constructor public MessageSigNode(Token t) { super(t); - this.op = null; - this.payloads = null; } // Tree#dupNode constructor public MessageSigNode(MessageSigNode node) { super(node); - this.op = null; - this.payloads = null; } public OpNode getOpChild() { - return (OpNode) getChild(0); + return (OpNode) getChild(OP_CHILD_INDEX); } public PayloadElemList getPayloadListChild() { - return (PayloadElemList) getChild(1); + return (PayloadElemList) getChild(PAYLOAD_CHILD_INDEX); } @Override @@ -60,8 +57,7 @@ public MessageSigNode reconstruct(OpNode op, PayloadElemList payload) MessageSigNode sig = dupNode(); sig.addChild(op); sig.addChild(payload); - ScribDel del = del(); - sig.setDel(del); // No copy + sig.setDel(del()); // No copy return sig; } @@ -99,40 +95,4 @@ public String toString() { return getOpChild().toString() + getPayloadListChild().toString(); } - - - - - - - - - - - - private final OpNode op; - private final PayloadElemList payloads; - - public MessageSigNode(CommonTree source, OpNode op, PayloadElemList payload) - { - super(source); - this.op = op; - this.payloads = payload; - } - - /*@Override - protected MessageSigNode copy() - { - return new MessageSigNode(this.source, this.op, this.payloads); - } - - @Override - public MessageSigNode clone(AstFactory af) - { - OpNode op = this.op.clone(af); - PayloadElemList payload = this.payloads.clone(af); - return af.MessageSigNode(this.source, op, payload); - }*/ - - } diff --git a/scribble-ast/src/main/java/org/scribble/ast/Module.java b/scribble-ast/src/main/java/org/scribble/ast/Module.java index 6a6d8c5cd..b8a3f17d0 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Module.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Module.java @@ -49,7 +49,7 @@ protected Module(Module node) public ModuleDecl getModuleDeclChild() { - return (ModuleDecl) getChild(0); + return (ModuleDecl) getChild(MODDECL_CHILD_INDEX); } public List> getImportDeclChildren() diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolKindNode.java b/scribble-ast/src/main/java/org/scribble/ast/ProtocolKindNode.java index 7bd686a06..b99755be9 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolKindNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtocolKindNode.java @@ -17,6 +17,8 @@ public interface ProtocolKindNode extends ScribNode { + K getKind(); + default boolean isGlobal() { return false; @@ -26,6 +28,4 @@ default boolean isLocal() { return false; } - - K getKind(); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java index 86c2a1344..54633f4bd 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java @@ -17,10 +17,8 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.Choice; import org.scribble.ast.ScribNode; -import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Global; public class GChoice extends Choice implements GCompoundSessionNode @@ -37,56 +35,17 @@ protected GChoice(GChoice node) super(node); } - @Override - public GChoice dupNode() - { - return new GChoice(this); - } - @Override public List getBlockChildren() { List cs = getChildren(); - return cs.subList(1, cs.size()).stream().map(x -> (GProtocolBlock) x) - .collect(Collectors.toList()); - } - - - - - - - - - - - - - public GChoice(CommonTree source, RoleNode subj, List blocks) - { - super(source, subj, blocks); - } - - /*@Override - protected ScribNodeBase copy() - { - return new GChoice(this.source, this.subj, getBlocks()); + return cs.subList(GChoice.BLOCK_CHILDREN_START_INDEX, cs.size()).stream() + .map(x -> (GProtocolBlock) x).collect(Collectors.toList()); } @Override - public GChoice clone(AstFactory af) - { - RoleNode subj = this.subj.clone(af); - List blocks = ScribUtil.cloneList(af, getBlocks()); - return af.GChoice(this.source, subj, blocks); - }*/ - - /*@Override - public GChoice reconstruct(RoleNode subj, List> blocks) + public GChoice dupNode() { - ScribDel del = del(); - GChoice gc = new GChoice(this.source, subj, castBlocks(blocks)); - gc = (GChoice) gc.del(del); - return gc; - }*/ + return new GChoice(this); + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GInteractionSeq.java b/scribble-ast/src/main/java/org/scribble/ast/global/GInteractionSeq.java index c8d6530c3..cd04e6a7b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GInteractionSeq.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GInteractionSeq.java @@ -17,11 +17,11 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.InteractionSeq; import org.scribble.core.type.kind.Global; -public class GInteractionSeq extends InteractionSeq implements GScribNode +public class GInteractionSeq extends InteractionSeq + implements GScribNode { // ScribTreeAdaptor#create constructor public GInteractionSeq(Token t) @@ -35,12 +35,6 @@ public GInteractionSeq(GInteractionSeq node) super(node); } - @Override - public GInteractionSeq dupNode() - { - return new GInteractionSeq(this); - } - @Override public List getInteractionChildren() { @@ -48,41 +42,9 @@ public List getInteractionChildren() .collect(Collectors.toList()); } - - - - - - - - - - - - public GInteractionSeq(CommonTree source, List actions) - { - super(source, actions); - } - - /*@Override - protected GInteractionSeq copy() - { - return new GInteractionSeq(this.source, getInteractNodeChildren()); - } - @Override - public GInteractionSeq clone(AstFactory af) + public GInteractionSeq dupNode() { - List gis = ScribUtil.cloneList(af, getInteractNodeChildren()); - return af.GInteractionSeq(this.source, gis); + return new GInteractionSeq(this); } - - @Override - public GInteractionSeq reconstruct(List> ins) - { - ScribDel del = del(); - GInteractionSeq gis = new GInteractionSeq(this.source, castNodes(ins)); - gis = (GInteractionSeq) gis.del(del); - return gis; - }*/ } From 9504a80f38b6bb2130b7a6f8751f187869f0ede4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 11 Apr 2019 13:16:51 +0100 Subject: [PATCH 254/539] Continued: WIP refactoring ast classes. --- .../java/org/scribble/ast/AstFactory.java | 47 ++++++------ .../java/org/scribble/ast/AstFactoryImpl.java | 54 ++++++------- .../scribble/ast/global/GDelegationElem.java | 75 ++++--------------- .../java/org/scribble/ast/name/NameNode.java | 3 +- .../ast/name/qualified/DataTypeNode.java | 38 ++-------- .../ast/name/qualified/GProtocolNameNode.java | 30 +------- .../ast/name/qualified/MemberNameNode.java | 19 +---- .../name/qualified/MessageSigNameNode.java | 31 +------- .../ast/name/qualified/ModuleNameNode.java | 32 +------- .../ast/name/qualified/QualifiedNameNode.java | 16 +--- 10 files changed, 83 insertions(+), 262 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index bbeca44a8..d9165fbd4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -16,7 +16,6 @@ import java.util.List; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; import org.scribble.ast.global.GContinue; @@ -53,16 +52,16 @@ // Currently, used only in relatively niche places (since ANTLR now constructs all parsed nodes "directly") public interface AstFactory { - Module Module(Token t, ModuleDecl moddecl, + Module Module(Token t, ModuleDecl mdecl, List> imports, List> data, List> protos); MessageSigNode MessageSigNode(Token t, OpNode op, PayloadElemList pay); - GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode name, - RoleNode role); + GDelegationElem GDelegationElem(Token t, GProtocolNameNode name, + RoleNode r); - PayloadElemList PayloadElemList(Token t, List> payloadelems); + PayloadElemList PayloadElemList(Token t, List> elems); // PayloadElem PayloadElem(PayloadElemNameNode name); UnaryPayloadElem UnaryPayloadElem(Token t, @@ -83,30 +82,31 @@ GProtocolDecl GProtocolDecl(Token t, ProtocolModList modifiers, GProtocolHeader header, GProtocolDef def); GProtocolHeader GProtocolHeader(Token t, GProtocolNameNode name, - RoleDeclList roledecls, NonRoleParamDeclList paramdecls); + RoleDeclList rdecls, NonRoleParamDeclList paramdecls); - RoleDeclList RoleDeclList(Token t, List rds); + RoleDeclList RoleDeclList(Token t, List ds); - RoleDecl RoleDecl(Token t, RoleNode role); + RoleDecl RoleDecl(Token t, RoleNode r); - // ConnectDecl ConnectDecl(CommonTree source, RoleNode src, RoleNode role); + // ConnectDecl ConnectDecl(Token t, RoleNode src, RoleNode r); NonRoleParamDeclList NonRoleParamDeclList(Token t, - List> pds); + List> ds); + @Deprecated NonRoleParamDecl NonRoleParamDecl( - CommonTree source, K kind, NonRoleParamNode name); + Token t, K kind, NonRoleParamNode name); GProtocolDef GProtocolDef(Token t, GProtocolBlock block); - GProtocolBlock GProtocolBlock(Token t, GInteractionSeq gis); + GProtocolBlock GProtocolBlock(Token t, GInteractionSeq seq); GInteractionSeq GInteractionSeq(Token t, List elems); GMessageTransfer GMessageTransfer(Token t, RoleNode src, MessageNode msg, List dsts); - GConnect GConnect(Token t, RoleNode src, MessageNode msg, RoleNode dest); + GConnect GConnect(Token t, RoleNode src, MessageNode msg, RoleNode dst); GDisconnect GDisconnect(Token t, RoleNode src, RoleNode dst); @@ -114,31 +114,30 @@ GMessageTransfer GMessageTransfer(Token t, RoleNode src, MessageNode msg, GChoice GChoice(Token t, RoleNode subj, List blocks); - GRecursion GRecursion(Token t, RecVarNode recvar, GProtocolBlock block); + GRecursion GRecursion(Token t, RecVarNode rv, GProtocolBlock block); - GContinue GContinue(Token t, RecVarNode recvar); + GContinue GContinue(Token t, RecVarNode rv); - GDo GDo(Token t, RoleArgList roles, NonRoleArgList args, + GDo GDo(Token t, RoleArgList rs, NonRoleArgList args, GProtocolNameNode proto); - RoleArgList RoleArgList(Token t, List roles); + RoleArgList RoleArgList(Token t, List rs); - RoleArg RoleArg(Token t, RoleNode role); + RoleArg RoleArg(Token t, RoleNode r); NonRoleArgList NonRoleArgList(Token t, List args); NonRoleArg NonRoleArg(Token t, NonRoleArgNode arg); - NameNode SimpleNameNode(CommonTree source, K kind, - String identifier); + NameNode SimpleNameNode(Token t, K kind, IdNode id); - QualifiedNameNode QualifiedNameNode(CommonTree source, - K kind, String... elems); + QualifiedNameNode QualifiedNameNode(Token t, K kind, + IdNode... elems); - AmbigNameNode AmbiguousNameNode(CommonTree source, String identifier); + AmbigNameNode AmbiguousNameNode(Token t, IdNode id); NonRoleParamNode NonRoleParamNode( - CommonTree source, K kind, String identifier); + Token t, K kind, String id); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java index ceaa006ca..e194eb4bf 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -94,8 +94,6 @@ public class AstFactoryImpl implements AstFactory { - //public static final AstFactory FACTORY = new AstFactoryImpl(); - private static MessageSigNode UNIT_MESSAGE_SIG_NODE; // A "constant" public AstFactoryImpl() @@ -121,6 +119,7 @@ protected static T del(T n, ScribDel del) return ScribNodeBase.del(n, del); } + // CHECKME: deprecated ? // FIXME: inconsistent wrt. this.source -- it is essentially parsed (in the sense of *omitted* syntax), but not recorded // FIXME: this pattern is not ideal ("exposed" public constructor arg in GWrap/GDisconnect) // An alternative would be to make subclasses, e.g., UnitMessageSigNode, UnitOp, EmptyPayloadElemList -- but a lot of extra classes @@ -170,10 +169,12 @@ public UnaryPayloadElem UnaryPayloadElem( } @Override - public GDelegationElem GDelegationElem(CommonTree source, + public GDelegationElem GDelegationElem(Token t, GProtocolNameNode proto, RoleNode role) { - GDelegationElem de = new GDelegationElem(source, proto, role); + GDelegationElem de = new GDelegationElem(t); + de.addChild(proto); + de.addChild(role); //de = del(de, createDefaultDelegate()); de = del(de, new GDelegationElemDel()); // FIXME: GDelegationElemDel return de; @@ -305,9 +306,10 @@ public NonRoleParamDeclList NonRoleParamDeclList(Token t, return pdl; } + @Deprecated @Override public NonRoleParamDecl NonRoleParamDecl( - CommonTree source, K kind, NonRoleParamNode namenode) + Token t, K kind, NonRoleParamNode namenode) { /*NonRoleParamDecl pd = new NonRoleParamDecl(source, kind, namenode); pd = del(pd, new NonRoleParamDeclDel()); @@ -464,20 +466,20 @@ public NonRoleArg NonRoleArg(Token t, NonRoleArgNode arg) } @Override - public NameNode SimpleNameNode(CommonTree source, K kind, - String identifier) + public NameNode SimpleNameNode(Token t, K kind, + IdNode id) { NameNode snn = null; // "Custom" del's if (kind.equals(RecVarKind.KIND)) { - snn = new RecVarNode(source, identifier); + snn = new RecVarNode(t, id); snn = del(snn, new RecVarNodeDel()); } else if (kind.equals(RoleKind.KIND)) { - snn = new RoleNode(source, identifier); + snn = new RoleNode(t, id); snn = del(snn, new RoleNodeDel()); } if (snn != null) @@ -488,7 +490,7 @@ else if (kind.equals(RoleKind.KIND)) // Default del's if (kind.equals(OpKind.KIND)) { - snn = new OpNode(source, identifier); + snn = new OpNode(t, id); } else { @@ -499,17 +501,17 @@ else if (kind.equals(RoleKind.KIND)) @Override public QualifiedNameNode QualifiedNameNode( - CommonTree source, K kind, String... elems) + Token t, K kind, IdNode... elems) { QualifiedNameNode qnn = null; if (kind.equals(SigKind.KIND)) { - qnn = new MessageSigNameNode(source, elems); + qnn = new MessageSigNameNode(t, elems); qnn = del(qnn, new MessageSigNameNodeDel()); } else if (kind.equals(DataTypeKind.KIND)) { - qnn = new DataTypeNode(source, elems); + qnn = new DataTypeNode(t, elems); qnn = del(qnn, new DataTypeNodeDel()); } if (qnn != null) @@ -519,15 +521,15 @@ else if (kind.equals(DataTypeKind.KIND)) if (kind.equals(ModuleKind.KIND)) { - qnn = new ModuleNameNode(source, elems); + qnn = new ModuleNameNode(t, elems); } else if (kind.equals(Global.KIND)) { - qnn = new GProtocolNameNode(source, elems); + qnn = new GProtocolNameNode(t, elems); } else if (kind.equals(Local.KIND)) { - qnn = new LProtocolNameNode(source, elems); + qnn = new LProtocolNameNode(t, elems); } else { @@ -549,27 +551,29 @@ protected static , K extends Kind> T castNameNode( return tmp; } + // Deprecate? Never need to make ambigname via af? @Override - public AmbigNameNode AmbiguousNameNode(CommonTree source, String identifier) + public AmbigNameNode AmbiguousNameNode(Token t, IdNode id) { - AmbigNameNode ann = new AmbigNameNode(source, identifier); - ann = (AmbigNameNode) ann.del(new AmbigNameNodeDel()); - return ann; + AmbigNameNode n = new AmbigNameNode(t); + n.addChild(id); + n = (AmbigNameNode) n.del(new AmbigNameNodeDel()); + return n; } - @SuppressWarnings("unchecked") + @SuppressWarnings("unchecked") // FIXME @Override public NonRoleParamNode NonRoleParamNode( - CommonTree source, K kind, String identifier) + Token t, K kind, String identifier) { - NonRoleParamNode pn; //= new NonRoleParamNode(source, kind, identifier); + NonRoleParamNode pn; if (kind.equals(SigKind.KIND)) { - pn = (NonRoleParamNode) new SigParamNode(source.getToken()); + pn = (NonRoleParamNode) new SigParamNode(t); } else { - pn = (NonRoleParamNode) new TypeParamNode(source.getToken()); + pn = (NonRoleParamNode) new TypeParamNode(t); } pn = del(pn, new NonRoleParamNodeDel()); return pn; diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java index a34ca7d12..0c5106b2d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java @@ -14,7 +14,6 @@ package org.scribble.ast.global; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.PayloadElem; import org.scribble.ast.ScribNodeBase; import org.scribble.ast.name.qualified.GProtocolNameNode; @@ -22,7 +21,6 @@ import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.GDelegationType; import org.scribble.core.type.name.PayloadElemType; -import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -31,31 +29,30 @@ //public class DelegationElem extends PayloadElem public class GDelegationElem extends ScribNodeBase implements PayloadElem { + public static final int PROTO_CHILD_INDEX = 0; + public static final int ROLE_CHILD_INDEX = 1; + // ScribTreeAdaptor#create constructor public GDelegationElem(Token t) { super(t); - this.proto = null; - this.role = null; } // Tree#dupNode constructor public GDelegationElem(GDelegationElem node) { super(node); - this.proto = null; - this.role = null; } // Becomes full name after disambiguation public GProtocolNameNode getProtocolChild() { - return (GProtocolNameNode) getChild(0); + return (GProtocolNameNode) getChild(PROTO_CHILD_INDEX); } public RoleNode getRoleChild() { - return (RoleNode) getChild(1); + return (RoleNode) getChild(ROLE_CHILD_INDEX); } @Override @@ -64,18 +61,13 @@ public GDelegationElem dupNode() return new GDelegationElem(this); } - @Override - public boolean isGlobalDelegationElem() - { - return true; - } - public GDelegationElem reconstruct(GProtocolNameNode proto, RoleNode role) { - ScribDel del = del(); - GDelegationElem elem = new GDelegationElem(this.source, proto, role); - elem = (GDelegationElem) elem.del(del); - return elem; + GDelegationElem dup = dupNode(); + dup.addChild(proto); + dup.addChild(role); + dup = (GDelegationElem) dup.del(del()); + return dup; } @Override @@ -87,6 +79,12 @@ public GDelegationElem visitChildren(AstVisitor nv) throws ScribException return reconstruct(name, role); } + @Override + public boolean isGlobalDelegationElem() + { + return true; + } + @Override public PayloadElemType toPayloadType() { @@ -99,45 +97,4 @@ public String toString() { return getProtocolChild() + "@" + getRoleChild(); } - - - - - - - - - - - - - - - - - // Currently no potential for ambiguity, cf. UnaryPayloadElem (DataTypeNameNode or ParameterNode) - private final GProtocolNameNode proto; // Becomes full name after disambiguation - private final RoleNode role; - - public GDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role) - { - //super(proto); - super(source); - this.proto = proto; - this.role = role; - } - - /*@Override - protected GDelegationElem copy() - { - return new GDelegationElem(this.source, this.proto, this.role); - } - - @Override - public GDelegationElem clone(AstFactory af) - { - GProtocolNameNode name = (GProtocolNameNode) this.proto.clone(af); - RoleNode role = (RoleNode) this.role.clone(af); - return af.GDelegationElem(this.source, name, role); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java index 1eee988d9..35740f35a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java @@ -91,9 +91,10 @@ protected String getLastElement() return names.get(names.size() - 1); } + // CHECKME: is equals/hashCode actually needed for these ScribNodes? (cf. Name) + // CHECKME: should NameNodes ever be used in an equality checking context? (cf. other AST nodes) -- this work should be done using sesstype.Name instead? @Override public boolean equals(Object o) - // CHECKME: should NameNodes ever be used in an equality checking context? (cf. other AST nodes) -- this work should be done using sesstype.Name instead? { if (this == o) { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java index a8bdb6446..1ddb42ff7 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java @@ -14,7 +14,6 @@ package org.scribble.ast.name.qualified; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.PayloadElemNameNode; import org.scribble.core.type.kind.DataTypeKind; import org.scribble.core.type.name.DataType; @@ -31,7 +30,7 @@ public DataTypeNode(Token t) } // Tree#dupNode constructor - protected DataTypeNode(DataTypeNode node)//, String... ns) + protected DataTypeNode(DataTypeNode node) { super(node); } @@ -39,7 +38,7 @@ protected DataTypeNode(DataTypeNode node)//, String... ns) @Override public DataTypeNode dupNode() { - return new DataTypeNode(this);//, getElements()); + return new DataTypeNode(this); } @Override @@ -68,9 +67,10 @@ public DataType toPayloadType() { return toName(); } - + + // CHECKME: is equals/hashCode actually needed for these ScribNodes? (cf. Name) @Override - public boolean equals(Object o) // FIXME: is equals/hashCode needed for these Nodes? + public boolean equals(Object o) { if (this == o) { @@ -96,32 +96,4 @@ public int hashCode() hash = 31 * hash + super.hashCode(); return hash; } - - - - - - - - - - - - - public DataTypeNode(CommonTree source, String... elems) - { - super(source, elems); - } - - /*@Override - protected DataTypeNode copy() - { - return new DataTypeNode(this.source, this.elems); - } - - @Override - public DataTypeNode clone(AstFactory af) - { - return (DataTypeNode) af.QualifiedNameNode(this.source, DataTypeKind.KIND, this.elems); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java index 47697cd95..76b8108b2 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java @@ -14,7 +14,6 @@ package org.scribble.ast.name.qualified; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtocolName; @@ -27,7 +26,7 @@ public GProtocolNameNode(Token t) } // Tree#dupNode constructor - public GProtocolNameNode(GProtocolNameNode node)//, String...elems) + public GProtocolNameNode(GProtocolNameNode node) { super(node); } @@ -35,7 +34,7 @@ public GProtocolNameNode(GProtocolNameNode node)//, String...elems) @Override public GProtocolNameNode dupNode() { - return new GProtocolNameNode(this);//, getElements()); + return new GProtocolNameNode(this); } @Override @@ -74,29 +73,4 @@ public int hashCode() hash = 31 * hash + super.hashCode(); return hash; } - - - - - - - - - @Deprecated - public GProtocolNameNode(CommonTree source, String... ns) - { - super(source, ns); - } - - /*@Override - protected GProtocolNameNode copy() - { - return new GProtocolNameNode(this.source, this.elems); - } - - @Override - public GProtocolNameNode clone(AstFactory af) - { - return (GProtocolNameNode) af.QualifiedNameNode(this.source, Global.KIND, this.elems); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java index 544ad1bbf..6419a63c8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java @@ -16,7 +16,6 @@ import java.util.Arrays; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Kind; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.PackageName; @@ -31,7 +30,7 @@ public MemberNameNode(Token t) } // Tree#dupNode constructor - protected MemberNameNode(MemberNameNode node)//, String...elems) + protected MemberNameNode(MemberNameNode node) { super(node); } @@ -47,20 +46,4 @@ protected ModuleName getModuleNamePrefix() return new ModuleName( new PackageName(Arrays.copyOf(prefix, prefix.length - 1)), mn); } - - - - - - - - - - - - - public MemberNameNode(CommonTree source, String... ns) - { - super(source, ns); - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java index 8f3336b63..b1d83d299 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java @@ -14,7 +14,6 @@ package org.scribble.ast.name.qualified; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.MessageNode; import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.MessageSigName; @@ -29,7 +28,7 @@ public MessageSigNameNode(Token t) } // Tree#dupNode constructor - protected MessageSigNameNode(MessageSigNameNode node)//, String...elems) + protected MessageSigNameNode(MessageSigNameNode node) { super(node); } @@ -37,7 +36,7 @@ protected MessageSigNameNode(MessageSigNameNode node)//, String...elems) @Override public MessageSigNameNode dupNode() { - return new MessageSigNameNode(this);//, getElements()); + return new MessageSigNameNode(this); } @Override @@ -94,30 +93,4 @@ public int hashCode() hash = 31 * hash + super.hashCode(); return hash; } - - - - - - - - - - public MessageSigNameNode(CommonTree source, String... elems) - { - super(source, elems); - } - - /*@Override - protected MessageSigNameNode copy() - { - return new MessageSigNameNode(this.source, this.elems); - } - - @Override - public MessageSigNameNode clone(AstFactory af) - { - return (MessageSigNameNode) af.QualifiedNameNode(this.source, SigKind.KIND, - this.elems); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java index 0c6c00f7e..a2e9ff440 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java @@ -14,7 +14,6 @@ package org.scribble.ast.name.qualified; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ModuleKind; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.PackageName; @@ -28,7 +27,7 @@ public ModuleNameNode(Token t) } // Tree#dupNode constructor - protected ModuleNameNode(ModuleNameNode node)//, String...elems) + protected ModuleNameNode(ModuleNameNode node) { super(node); } @@ -36,7 +35,7 @@ protected ModuleNameNode(ModuleNameNode node)//, String...elems) @Override public ModuleNameNode dupNode() { - return new ModuleNameNode(this);//, getElements()); + return new ModuleNameNode(this); } @Override @@ -75,31 +74,4 @@ public int hashCode() hash = 31 * hash + super.hashCode(); return hash; } - - - - - - - - - - - - public ModuleNameNode(CommonTree source, String... ns) - { - super(source, ns); - } - - /*@Override - protected ModuleNameNode copy() - { - return new ModuleNameNode(this.source, this.elems); - } - - @Override - public ModuleNameNode clone(AstFactory af) - { - return (ModuleNameNode) af.QualifiedNameNode(this.source, ModuleKind.KIND, this.elems); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java index 3796f098c..c3110a0fc 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java @@ -14,7 +14,6 @@ package org.scribble.ast.name.qualified; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; import org.scribble.core.type.kind.Kind; @@ -28,21 +27,8 @@ public QualifiedNameNode(Token t) } // Tree#dupNode constructor - protected QualifiedNameNode(QualifiedNameNode node)//, String...elems) + protected QualifiedNameNode(QualifiedNameNode node) { super(node); } - - - - - - - - - - public QualifiedNameNode(CommonTree source, String... ns) - { - super(source, ns); - } } From bfa3ee22b319a5210f470f110b8c56483295cec9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 12 Apr 2019 11:19:02 +0100 Subject: [PATCH 255/539] Continued: WIP cleaning up ast classes. --- .../java/org/scribble/ast/AstFactory.java | 76 ++--- .../java/org/scribble/ast/name/NameNode.java | 85 ++---- .../ast/name/qualified/LProtocolNameNode.java | 34 +-- .../ast/name/qualified/ProtocolNameNode.java | 20 +- .../ast/name/simple/AmbigNameNode.java | 25 -- .../name/simple/DummyProjectionRoleNode.java | 116 -------- .../org/scribble/ast/name/simple/IdNode.java | 29 +- .../ast/name/simple/NonRoleParamNode.java | 35 +-- .../org/scribble/ast/name/simple/OpNode.java | 32 +-- .../scribble/ast/name/simple/RecVarNode.java | 47 +--- .../scribble/ast/name/simple/RoleNode.java | 36 +-- .../ast/name/simple/SimpleNameNode.java | 16 -- .../java/org/scribble/del/DelDecorator.java | 3 +- .../src/main/java/org/scribble/del/DoDel.java | 44 ++- .../del/global/GDelegationElemDel.java | 11 +- .../java/org/scribble/del/global/GDoDel.java | 2 +- .../src/main/java/org/scribble/lang/Lang.java | 8 +- .../lang/context/ModuleContextCollector.java | 23 +- .../src/main/java/org/scribble/main/Main.java | 5 +- .../org/scribble/parser/antlr/Scribble.g | 11 +- .../parser/scribble}/AstFactoryImpl.java | 260 ++++++++++++------ .../parser/scribble}/DelDecoratorImpl.java | 3 +- .../parser/scribble/ScribAntlrWrapper.java | 1 - .../parser/scribble/ScribTreeAdaptor.java | 8 +- scribble-test/src/test/scrib/tmp/Test.scr | 4 +- 25 files changed, 340 insertions(+), 594 deletions(-) delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java rename {scribble-ast/src/main/java/org/scribble/ast => scribble-parser/src/main/java/org/scribble/parser/scribble}/AstFactoryImpl.java (68%) rename {scribble-ast/src/main/java/org/scribble/del => scribble-parser/src/main/java/org/scribble/parser/scribble}/DelDecoratorImpl.java (99%) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index d9165fbd4..122272d75 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -15,7 +15,6 @@ import java.util.List; -import org.antlr.runtime.Token; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; import org.scribble.ast.global.GContinue; @@ -49,95 +48,98 @@ import org.scribble.core.type.kind.PayloadTypeKind; +// Implementations located in scribble-parser, use ScribbleParser for Token construction // Currently, used only in relatively niche places (since ANTLR now constructs all parsed nodes "directly") public interface AstFactory { - Module Module(Token t, ModuleDecl mdecl, + IdNode IdNode(String id); + + Module Module(ModuleDecl mdecl, List> imports, List> data, List> protos); - MessageSigNode MessageSigNode(Token t, OpNode op, PayloadElemList pay); + MessageSigNode MessageSigNode(OpNode op, PayloadElemList pay); - GDelegationElem GDelegationElem(Token t, GProtocolNameNode name, + GDelegationElem GDelegationElem(GProtocolNameNode name, RoleNode r); - PayloadElemList PayloadElemList(Token t, List> elems); + PayloadElemList PayloadElemList(List> elems); // PayloadElem PayloadElem(PayloadElemNameNode name); - UnaryPayloadElem UnaryPayloadElem(Token t, + UnaryPayloadElem UnaryPayloadElem( PayloadElemNameNode name); - ModuleDecl ModuleDecl(Token t, ModuleNameNode fullmodname); + ModuleDecl ModuleDecl(ModuleNameNode fullmodname); - ImportModule ImportModule(Token t, ModuleNameNode modname, + ImportModule ImportModule(ModuleNameNode modname, ModuleNameNode alias); - MessageSigNameDecl MessageSigNameDecl(Token t, IdNode schema, IdNode extName, + MessageSigNameDecl MessageSigNameDecl(IdNode schema, IdNode extName, IdNode extSource, MessageSigNameNode name); - DataTypeDecl DataTypeDecl(Token t, IdNode schema, IdNode extName, + DataTypeDecl DataTypeDecl(IdNode schema, IdNode extName, IdNode extSource, DataTypeNode name); - GProtocolDecl GProtocolDecl(Token t, ProtocolModList modifiers, + GProtocolDecl GProtocolDecl(ProtocolModList modifiers, GProtocolHeader header, GProtocolDef def); - GProtocolHeader GProtocolHeader(Token t, GProtocolNameNode name, + GProtocolHeader GProtocolHeader(GProtocolNameNode name, RoleDeclList rdecls, NonRoleParamDeclList paramdecls); - RoleDeclList RoleDeclList(Token t, List ds); + RoleDeclList RoleDeclList(List ds); - RoleDecl RoleDecl(Token t, RoleNode r); + RoleDecl RoleDecl(RoleNode r); - // ConnectDecl ConnectDecl(Token t, RoleNode src, RoleNode r); + // ConnectDecl ConnectDecl(RoleNode src, RoleNode r); - NonRoleParamDeclList NonRoleParamDeclList(Token t, + NonRoleParamDeclList NonRoleParamDeclList( List> ds); @Deprecated NonRoleParamDecl NonRoleParamDecl( - Token t, K kind, NonRoleParamNode name); + K kind, NonRoleParamNode name); - GProtocolDef GProtocolDef(Token t, GProtocolBlock block); + GProtocolDef GProtocolDef(GProtocolBlock block); - GProtocolBlock GProtocolBlock(Token t, GInteractionSeq seq); + GProtocolBlock GProtocolBlock(GInteractionSeq seq); - GInteractionSeq GInteractionSeq(Token t, List elems); + GInteractionSeq GInteractionSeq(List elems); - GMessageTransfer GMessageTransfer(Token t, RoleNode src, MessageNode msg, + GMessageTransfer GMessageTransfer(RoleNode src, MessageNode msg, List dsts); - GConnect GConnect(Token t, RoleNode src, MessageNode msg, RoleNode dst); + GConnect GConnect(RoleNode src, MessageNode msg, RoleNode dst); - GDisconnect GDisconnect(Token t, RoleNode src, RoleNode dst); + GDisconnect GDisconnect(RoleNode src, RoleNode dst); - GWrap GWrap(Token t, RoleNode src, RoleNode dst); + GWrap GWrap(RoleNode src, RoleNode dst); - GChoice GChoice(Token t, RoleNode subj, List blocks); + GChoice GChoice(RoleNode subj, List blocks); - GRecursion GRecursion(Token t, RecVarNode rv, GProtocolBlock block); + GRecursion GRecursion(RecVarNode rv, GProtocolBlock block); - GContinue GContinue(Token t, RecVarNode rv); + GContinue GContinue(RecVarNode rv); - GDo GDo(Token t, RoleArgList rs, NonRoleArgList args, + GDo GDo(RoleArgList rs, NonRoleArgList args, GProtocolNameNode proto); - RoleArgList RoleArgList(Token t, List rs); + RoleArgList RoleArgList(List rs); - RoleArg RoleArg(Token t, RoleNode r); + RoleArg RoleArg(RoleNode r); - NonRoleArgList NonRoleArgList(Token t, List args); + NonRoleArgList NonRoleArgList(List args); - NonRoleArg NonRoleArg(Token t, NonRoleArgNode arg); + NonRoleArg NonRoleArg(NonRoleArgNode arg); - NameNode SimpleNameNode(Token t, K kind, IdNode id); + NameNode SimpleNameNode(K kind, IdNode id); - QualifiedNameNode QualifiedNameNode(Token t, K kind, - IdNode... elems); + QualifiedNameNode QualifiedNameNode(K kind, + List elems); - AmbigNameNode AmbiguousNameNode(Token t, IdNode id); + AmbigNameNode AmbiguousNameNode(IdNode id); NonRoleParamNode NonRoleParamNode( - Token t, K kind, String id); + K kind, String id); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java index 35740f35a..974477888 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java @@ -13,7 +13,6 @@ */ package org.scribble.ast.name; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -31,22 +30,12 @@ public abstract class NameNode extends ScribNodeBase public NameNode(Token t) { super(t); - this.elems = null; } // Tree#dupNode constructor protected NameNode(NameNode node)//, String...elems) { super(node); - this.elems = null;//elems; - } - - public abstract NameNode dupNode(); - - public String[] getElements() - { - //return Arrays.copyOf(this.elems, this.elems.length); - return getSimpleNameList().toArray(new String[0]); } protected List getSimpleNameList() @@ -56,21 +45,13 @@ protected List getSimpleNameList() // CHECKME: currently AmbigNameNode(?) // CHECKME: factor out getText? } - - public int getElementCount() - { - //return this.elems.length; - return getChildCount(); - } - public boolean isEmpty() - { - return getElementCount() == 0; - } + public abstract NameNode dupNode(); - protected boolean isPrefixed() + public String[] getElements() { - return getElementCount() > 1; + //return Arrays.copyOf(this.elems, this.elems.length); + return getSimpleNameList().toArray(new String[0]); } protected String[] getPrefixElements() @@ -90,6 +71,28 @@ protected String getLastElement() List names = getSimpleNameList(); return names.get(names.size() - 1); } + + public int getElementCount() + { + //return this.elems.length; + return getChildCount(); + } + + public boolean isEmpty() + { + return getElementCount() == 0; + } + + protected boolean isPrefixed() + { + return getElementCount() > 1; + } + + @Override + public String toString() + { + return toName().toString(); + } // CHECKME: is equals/hashCode actually needed for these ScribNodes? (cf. Name) // CHECKME: should NameNodes ever be used in an equality checking context? (cf. other AST nodes) -- this work should be done using sesstype.Name instead? @@ -104,8 +107,9 @@ public boolean equals(Object o) { return false; } - NameNode nn = (NameNode) o; - return nn.canEqual(this) && Arrays.equals(this.elems, nn.elems); + NameNode them = (NameNode) o; + return them.canEqual(this) + && getSimpleNameList().equals(them.getSimpleNameList()); } public abstract boolean canEqual(Object o); @@ -114,37 +118,8 @@ public boolean equals(Object o) public int hashCode() { int hash = 317; - hash = 31 * hash + Arrays.hashCode(getElements()); + hash = 31 * hash + getSimpleNameList().hashCode(); // Hash the String values, not the actual Tree nodes return hash; } - - @Override - public String toString() - { - return toName().toString(); - } - - - - - - - - - - private final String[] elems; - - public NameNode(CommonTree source, String... elems) - { - super(source); - if (source == null) - { - throw new RuntimeException("CHECKME"); - } - this.elems = elems; - } - - /*@Override - public abstract NameNode clone(AstFactory af);*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java index a69f7e41a..e1b322e74 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java @@ -20,7 +20,8 @@ import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.session.Arg; -public class LProtocolNameNode extends ProtocolNameNode implements PayloadElemNameNode +public class LProtocolNameNode extends ProtocolNameNode + implements PayloadElemNameNode { // ScribTreeAdaptor#create constructor public LProtocolNameNode(Token t) @@ -29,7 +30,7 @@ public LProtocolNameNode(Token t) } // Tree#dupNode constructor - protected LProtocolNameNode(LProtocolNameNode node)//, String...elems) + protected LProtocolNameNode(LProtocolNameNode node) { super(node); } @@ -37,7 +38,7 @@ protected LProtocolNameNode(LProtocolNameNode node)//, String...elems) @Override public LProtocolNameNode dupNode() { - return new LProtocolNameNode(this);//, getElements()); + return new LProtocolNameNode(this); } @Override @@ -72,7 +73,7 @@ public boolean equals(Object o) { return false; } - return ((LProtocolNameNode) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEqual } @Override @@ -88,29 +89,4 @@ public int hashCode() hash = 31 * hash + super.hashCode(); return hash; } - - - - - - - - - - public LProtocolNameNode(CommonTree source, String... ns) - { - super(source, ns); - } - - /*@Override - protected LProtocolNameNode copy() - { - return new LProtocolNameNode(this.source, this.elems); - } - - @Override - public LProtocolNameNode clone(AstFactory af) - { - return (LProtocolNameNode) af.QualifiedNameNode(this.source, Local.KIND, this.elems); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java index 92415f165..ae62b77dd 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java @@ -14,11 +14,11 @@ package org.scribble.ast.name.qualified; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.ProtocolName; -public abstract class ProtocolNameNode extends MemberNameNode +public abstract class ProtocolNameNode + extends MemberNameNode { // ScribTreeAdaptor#create constructor public ProtocolNameNode(Token t) @@ -33,20 +33,4 @@ protected ProtocolNameNode(ProtocolNameNode node)//, String...elems) } public abstract ProtocolName toName(); - - - - - - - - - - - - public ProtocolNameNode(CommonTree source, String... ns) - { - super(source, ns); - } - } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index da5d19945..428bb7b28 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -14,7 +14,6 @@ package org.scribble.ast.name.simple; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.MessageNode; import org.scribble.ast.name.PayloadElemNameNode; import org.scribble.core.type.kind.AmbigKind; @@ -114,28 +113,4 @@ public int hashCode() hash = 31 * super.hashCode(); return hash; } - - - - - - - - - public AmbigNameNode(CommonTree source, String id) - { - super(source, id); - } - - /*@Override - protected AmbigNameNode copy() - { - return new AmbigNameNode(this.source, getIdentifier()); - } - - @Override - public AmbigNameNode clone(AstFactory af) - { - return (AmbigNameNode) af.AmbiguousNameNode(this.source, getIdentifier()); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java deleted file mode 100644 index 1b3505450..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.name.simple; - -import org.antlr.runtime.Token; -import org.scribble.core.type.name.Role; - -// For local choice subjects -public class DummyProjectionRoleNode extends RoleNode -{ - public static final String DUMMY_PROJECTION_ROLE = "__DUMMY_ROLE"; - - // ScribTreeAdaptor#create constructor - public DummyProjectionRoleNode(Token t) - { - super(t); - } - - // Tree#dupNode constructor - protected DummyProjectionRoleNode(DummyProjectionRoleNode node)//, String id) - { - super(node); - } - - @Override - public RoleNode dupNode() - { - return new RoleNode(this);//, getIdentifier()); - } - - @Override - protected DummyProjectionRoleNode reconstruct(String id) - { - return (DummyProjectionRoleNode) super.reconstruct(id); - } - - @Override - public Role toName() - { - return new Role(getText()); - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof DummyProjectionRoleNode)) - { - return false; - } - return ((DummyProjectionRoleNode) o).canEqual(this) && super.equals(o); - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof DummyProjectionRoleNode; - } - - @Override - public int hashCode() - { - int hash = 359; - hash = 31 * super.hashCode(); - return hash; - } - - - - - - - - - - - public DummyProjectionRoleNode() - { - super(null, DUMMY_PROJECTION_ROLE); - } - - /*@Override - protected DummyProjectionRoleNode copy() - { - return new DummyProjectionRoleNode(); - } - - @Override - public DummyProjectionRoleNode clone(AstFactory af) - { - return af.DummyProjectionRoleNode(); - }*/ - - /*@Override - protected DummyProjectionRoleNode reconstruct(String id) - { - ScribDel del = del(); - DummyProjectionRoleNode rn = new DummyProjectionRoleNode(); - rn = (DummyProjectionRoleNode) rn.del(del); - return rn; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java index ce2597d8f..e192ddc3d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java @@ -14,7 +14,6 @@ package org.scribble.ast.name.simple; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.IdKind; import org.scribble.core.type.name.Id; @@ -28,7 +27,7 @@ public IdNode(Token t) } // Tree#dupNode constructor - protected IdNode(IdNode node)//, String id) + protected IdNode(IdNode node) { super(node); } @@ -36,7 +35,7 @@ protected IdNode(IdNode node)//, String id) @Override public IdNode dupNode() { - return new IdNode(this);//, getIdentifier()); + return new IdNode(this); } @Override @@ -78,28 +77,4 @@ public int hashCode() hash = 31 * super.hashCode(); return hash; } - - - - - - - - - public IdNode(CommonTree source, String id) - { - super(source, id); - } - - /*@Override - protected AmbigNameNode copy() - { - return new AmbigNameNode(this.source, getIdentifier()); - } - - @Override - public AmbigNameNode clone(AstFactory af) - { - return (AmbigNameNode) af.AmbiguousNameNode(this.source, getIdentifier()); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java index 12c7e58e4..60e4cfc6a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java @@ -14,7 +14,6 @@ package org.scribble.ast.name.simple; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.NonRoleParamKind; // An unambiguous kinded parameter (ambiguous parameters handled by disambiguation) that isn't a role -- e.g. DataType/MessageSigName param @@ -161,8 +160,9 @@ public boolean equals(Object o) { return false; } - NonRoleParamNode n = (NonRoleParamNode) o; - return n.canEqual(this) && this.kind.equals(n.kind) && super.equals(o); + NonRoleParamNode them = (NonRoleParamNode) o; + return super.equals(o) // Does canEqual + && this.kind.equals(them.kind); } @Override @@ -170,33 +170,4 @@ public boolean canEqual(Object o) { return o instanceof NonRoleParamNode; } - - - - - - - - - - - - - public NonRoleParamNode(CommonTree source, K kind, String identifier) - { - super(source, identifier); - this.kind = kind; - } - - /*@Override - protected NonRoleParamNode copy() - { - return new NonRoleParamNode<>(this.source, this.kind, getIdentifier()); - } - - @Override - public NonRoleParamNode clone(AstFactory af) - { - return af.NonRoleParamNode(this.source, this.kind, getIdentifier()); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java index adc2f0c9b..ea8433bb5 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java @@ -14,7 +14,6 @@ package org.scribble.ast.name.simple; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.OpKind; import org.scribble.core.type.name.Op; @@ -30,7 +29,7 @@ public OpNode(Token t) } // Tree#dupNode constructor - protected OpNode(OpNode node)//, String id) + protected OpNode(OpNode node) { super(node); } @@ -38,7 +37,7 @@ protected OpNode(OpNode node)//, String id) @Override public OpNode dupNode() { - return new OpNode(this);//, getIdentifier()); + return new OpNode(this); } @Override @@ -63,7 +62,7 @@ public boolean equals(Object o) { return false; } - return ((OpNode) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEqual } @Override @@ -79,29 +78,4 @@ public int hashCode() hash = 31 * super.hashCode(); return hash; } - - - - - - - - - - public OpNode(CommonTree source, String identifier) - { - super(source, identifier); - } - - /*@Override - protected OpNode copy() - { - return new OpNode(this.source, getIdentifier()); - } - - @Override - public OpNode clone(AstFactory af) - { - return (OpNode) af.SimpleNameNode(this.source, OpKind.KIND, getIdentifier()); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java index 0254dd31d..e49fdbfe2 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java @@ -14,7 +14,6 @@ package org.scribble.ast.name.simple; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.RecVarKind; import org.scribble.core.type.name.RecVar; @@ -27,7 +26,7 @@ public RecVarNode(Token t) } // Tree#dupNode constructor - protected RecVarNode(RecVarNode node)//, String id) + protected RecVarNode(RecVarNode node) { super(node); } @@ -35,14 +34,14 @@ protected RecVarNode(RecVarNode node)//, String id) @Override public RecVarNode dupNode() { - return new RecVarNode(this);//, getIdentifier()); + return new RecVarNode(this); } - @Override + /*@Override public RecVarNode clone() { return (RecVarNode) super.clone(); - } + }*/ @Override public RecVar toName() @@ -61,7 +60,7 @@ public boolean equals(Object o) { return false; } - return ((RecVarNode) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEqual } @Override @@ -77,40 +76,4 @@ public int hashCode() hash = 31 * super.hashCode(); return hash; } - - - - - - - - - - - - public RecVarNode(CommonTree source, String identifier) - { - super(source, identifier); - } - - /*// Factor up to SimpleNameNode? - public RecVarNode reconstruct(String id) - { - ScribDel del = del(); - RecVarNode rv = new RecVarNode(this.source, id); - rv = (RecVarNode) rv.del(del); - return rv; - } - - @Override - protected RecVarNode copy() - { - return new RecVarNode(this.source, getIdentifier()); - } - - @Override - public RecVarNode clone(AstFactory af) - { - return (RecVarNode) af.SimpleNameNode(this.source, RecVarKind.KIND, getIdentifier()); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java index 39cf330b4..213e09a7d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java @@ -14,14 +14,14 @@ package org.scribble.ast.name.simple; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.DoArgNode; import org.scribble.ast.ScribNode; import org.scribble.core.type.kind.RoleKind; import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; -public class RoleNode extends SimpleNameNode implements DoArgNode //RoleDecl, RoleInstantiation +public class RoleNode extends SimpleNameNode implements DoArgNode + // RoleDecl, RoleInstantiation { // ScribTreeAdaptor#create constructor public RoleNode(Token t) @@ -41,11 +41,11 @@ public RoleNode dupNode() return new RoleNode(this);//, getIdentifier()); } - @Override + /*@Override public RoleNode clone() { return (RoleNode) super.clone(); - } + }*/ // RoleNode is the only NameNode with a reconstruct (so not factored up) protected RoleNode reconstruct(String id) @@ -91,32 +91,4 @@ public int hashCode() hash = 31 * super.hashCode(); return hash; } - - - - - - - - - - - - - public RoleNode(CommonTree source, String identifier) - { - super(source, identifier); - } - - /*@Override - protected RoleNode copy() - { - return new RoleNode(this.source, getIdentifier()); - } - - @Override - public RoleNode clone(AstFactory af) - { - return (RoleNode) af.SimpleNameNode(this.source, RoleKind.KIND, getIdentifier()); - }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java index 40f7679a1..d20522f86 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java @@ -14,7 +14,6 @@ package org.scribble.ast.name.simple; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.NameNode; import org.scribble.core.type.kind.Kind; @@ -38,19 +37,4 @@ public String getText() { return getLastElement(); // i.e., second child element, after node type } - - - - - - - - - - - - public SimpleNameNode(CommonTree source, String id) - { - super(source, new String[]{id}); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java b/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java index c2ff5efc6..e35970be9 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java +++ b/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java @@ -61,7 +61,8 @@ // A dec method for each AST class -// Wach method named after the class name -- currently dispatched by reflection +// Implementations in scribble-parser, can depend on parser implementation +// E.g., DelDecoratorImpl: each method named after the class name -- currently dispatched by reflection public interface DelDecorator { void decorate(ScribNode n); diff --git a/scribble-ast/src/main/java/org/scribble/del/DoDel.java b/scribble-ast/src/main/java/org/scribble/del/DoDel.java index 4bb6e1ebc..7d6093052 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoDel.java @@ -13,9 +13,14 @@ */ package org.scribble.del; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + import org.scribble.ast.Do; import org.scribble.ast.ScribNode; import org.scribble.ast.name.qualified.ProtocolNameNode; +import org.scribble.ast.name.simple.IdNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.ProtocolName; @@ -48,42 +53,29 @@ public void enterDisambiguation(ScribNode child, NameDisambiguator disamb) public ScribNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { - return leaveDisambiguationAux(child, disamb, visited); + return leaveDisambiguationAux((Do) visited, disamb); // To introduce type parameter } // Convert all visible names to full names for protocol inlining: otherwise could get clashes if directly inlining external visible names under the root modulecontext // Not done in G/LProtocolNameNodeDel because it's only for do-targets that this is needed (cf. ProtocolHeader) - // TODO: refactor into G/LDoDel to bypass generic cast issues private ScribNode leaveDisambiguationAux( - ScribNode child, NameDisambiguator disamb, - ScribNode visited) throws ScribException + Do visited, NameDisambiguator disamb) throws ScribException { - @SuppressWarnings("unchecked") // Doesn't matter what K is, just need to propagate it down - Do doo = (Do) visited; - ProtocolNameNode proto = doo.getProtocolNameNode(); - /*ModuleContext mc = disamb.lang.getMainModuleContext(); - ProtocolName fullname = mc - .getVisibleProtocolDeclFullName(proto.toName());*/ + ProtocolNameNode proto = visited.getProtocolNameNode(); + ModuleContext modc = disamb.getModuleContext(); + ProtocolName fullname = modc + .getVisibleProtocolDeclFullName(proto.toName()); - ProtocolNameNode pnn;/* = (ProtocolNameNode) disamb.job.config.af - .QualifiedNameNode(proto.getSource(), fullname.getKind(), - fullname.getElements());*/ - - // CHECKME: refactor, make an AST node and set its children -- rework AstFactory? - // CHECKME: issue is to make an AST node, need a Token (but those are mainly obtained by parsing only) - /*pnn = (ProtocolNameNode) new GProtocolNameNode(proto.token); - pnn.addChildren(proto.getChildren());*/ - /*pnn = (ProtocolNameNode) proto.dupNode(); // Token and start/stopIndex - pnn.addChildren(Arrays.asList(fullname.getElements()).stream().map(x -> new AmbigNameNode(new Token(arg0, arg1))));*/ - pnn = proto; - // CHECKME: do full name expansion in disamb? or leave to imed translation? - // either hack Token to make new AST node, or redo proto context building on intermed -- consideration is projection output a la parsed AST subprotos, or from (inlined?) intermed - // probably hack Token for now -- or just skip protocol context building (do inlning and WF/valid first) + // FIXME: sort out full name expansion between here and GDoDel.translate + List elems = Arrays.asList(fullname.getElements()).stream() + .map(x -> disamb.lang.config.af.IdNode(x)).collect(Collectors.toList()); + ProtocolNameNode n = (ProtocolNameNode) disamb.lang.config.af + .QualifiedNameNode(fullname.getKind(), elems); // Didn't keep original namenode del -- ? - return doo.reconstruct(doo.getRoleListChild(), doo.getNonRoleListChild(), - pnn); + return visited.reconstruct(visited.getRoleListChild(), + visited.getNonRoleListChild(), n); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java index 935ac683a..3a9526501 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -13,10 +13,15 @@ */ package org.scribble.del.global; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GDelegationElem; import org.scribble.ast.name.qualified.GProtocolNameNode; +import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.Global; @@ -67,10 +72,10 @@ public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, // { throw new ScribException(r.getSource(), "Invalid delegation role: " + de); } - + List elems = Arrays.asList(fullname.getElements()).stream() + .map(x -> disamb.lang.config.af.IdNode(x)).collect(Collectors.toList()); GProtocolNameNode pnn = (GProtocolNameNode) disamb.lang.config.af - .QualifiedNameNode(de.getProtocolChild().getSource(), - fullname.getKind(), fullname.getElements()); + .QualifiedNameNode(fullname.getKind(), elems); // Not keeping original namenode del return de.reconstruct(pnn, r); } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java index 23e161256..30ee060a9 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java @@ -42,7 +42,7 @@ public org.scribble.core.type.session.global.GDo translate(ScribNode n, throw new ScribException(source, "Protocol decl not visible: " + proto); } - GProtocolName fullname = (GProtocolName) modc + GProtocolName fullname = (GProtocolName) modc // FIXME: sort out full name expansion between here and DoDel.leaveDisambiguation .getVisibleProtocolDeclFullName(proto); List roles = source.getRoleListChild().getRoles(); List> params = source.getNonRoleListChild() diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index 99483df17..0e8d4a274 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -18,7 +18,6 @@ import java.util.Set; import org.scribble.ast.AstFactory; -import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; import org.scribble.core.job.Job; @@ -42,19 +41,18 @@ public class Lang // Just take MainContext as arg? -- would need to fix Maven dependencies //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) public Lang(ModuleName mainFullname, Map args, - Map parsed) throws ScribException + Map parsed, AstFactory af) throws ScribException { // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource // FIXME: wrap flags in Map and move Config construction to Lang - this.config = newLangConfig(mainFullname, args); + this.config = newLangConfig(mainFullname, args, af); this.context = newLangContext(this, parsed); // Single instance per Lang, should not be shared between Langs } // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate protected LangConfig newLangConfig(ModuleName mainFullname, - Map args) + Map args, AstFactory af) { - AstFactory af = new AstFactoryImpl(); return new LangConfig(mainFullname, args, af); } diff --git a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java index cf5f5f0fd..cbe53cc27 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java +++ b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java @@ -76,7 +76,7 @@ public ModuleContext build( } addVisible(parsed, root); // Adds imports and members by their "direct" names (unqualified, except for no-alias imports) - + return new ModuleContext(root.getFullModuleName(), deps, visible); } @@ -124,6 +124,13 @@ private void addImportDependencies(Map parsed, Module mod) Module imported = parsed.get(fullmodname); // TODO: Can get from MainContext instead of JobContext? addModule(this.deps, imported, fullmodname); // Unlike for visible, only doing full names here addImportDependencies(parsed, imported); + + // FIXME: also do for npds -- factor out with below + for (GProtocolDecl gpd : imported.getGProtoDeclChildren()) + { + GProtocolName fullname = gpd.getFullMemberName(root); + this.visible.globals.put(fullname, fullname); + } } } else @@ -154,6 +161,7 @@ private void addVisible(Map parsed, Module root) } Module imported = parsed.get(fullname); // TODO: Can get from MainContext instead of JobContext? addModule(this.visible, imported, visname); + } else { @@ -167,21 +175,28 @@ private void addVisible(Map parsed, Module root) { DataTypeDecl dtd = (DataTypeDecl) npd; DataType visname = new DataType(dtd.getDeclName().toString()); - this.visible.data.put(visname, dtd.getFullMemberName(root)); + DataType fullname = dtd.getFullMemberName(root); + this.visible.data.put(fullname, fullname); + this.visible.data.put(visname, fullname); } else // if (npd.isMessageSigNameDecl()) { MessageSigNameDecl msnd = (MessageSigNameDecl) npd; + MessageSigName fullname = msnd.getFullMemberName(root); MessageSigName visname = new MessageSigName( msnd.getDeclName().toString()); - this.visible.sigs.put(visname, msnd.getFullMemberName(root)); + this.visible.sigs.put(fullname, fullname); + this.visible.sigs.put(visname, fullname); } } + for (GProtocolDecl gpd : root.getGProtoDeclChildren()) { GProtocolName visname = new GProtocolName( gpd.getHeaderChild().getDeclName().toString()); - this.visible.globals.put(visname, gpd.getFullMemberName(root)); + GProtocolName fullname = gpd.getFullMemberName(root); + this.visible.globals.put(fullname, fullname); + this.visible.globals.put(visname, fullname); } } diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index f44fc75ba..58885cda4 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -29,6 +29,7 @@ import org.scribble.main.resource.Resource; import org.scribble.main.resource.loader.ScribModuleLoader; import org.scribble.main.resource.locator.ResourceLocator; +import org.scribble.parser.scribble.AstFactoryImpl; import org.scribble.parser.scribble.ScribAntlrWrapper; import org.scribble.util.Pair; import org.scribble.util.ScribException; @@ -118,7 +119,9 @@ protected ScribAntlrWrapper newAntlr() protected Lang newLang(Map parsed, Map args, ModuleName mainFullname) throws ScribException { - return new Lang(mainFullname, args, parsed); + AstFactoryImpl af = new AstFactoryImpl(); + // Was previously made inside Lang, but AstFactoryImpl now lives in scribble-parser, to access ScribbleParser constants + return new Lang(mainFullname, args, parsed, af); } // Pre: main Module loaded by this.loader diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 6c60cd1b4..317c8fc6a 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -3,10 +3,16 @@ * $ java -cp scribble-parser/lib/antlr-3.5.2-complete.jar org.antlr.Tool -o scribble-parser/target/generated-sources/antlr3 scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g * * Cygwin/Windows + * > scribble-java * $ java -cp scribble-parser/lib/antlr-3.5.2-complete.jar org.antlr.Tool -o scribble-parser/target/generated-sources/antlr3/org/scribble/parser/antlr scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g * $ mv scribble-parser/target/generated-sources/antlr3/org/scribble/parser/antlr/Scribble.tokens scribble-parser/target/generated-sources/antlr3/ */ +/** + * Pattern: each node type must give its "node type constant" as its text, e.g., module: ... -> ^(MODULE ...) -- all info in its children + * i.e. Each Token will be equivalent to, e.g., new CommonToken(ScribbleParser.MODULE, "MODULE") + * Except for IDENTIFIER/IdNode: text is the IDENTIFIER value, i.e., new CommonToken(ScribbleParser.IDENTIFIER, "...") + */ grammar Scribble; @@ -109,7 +115,8 @@ tokens DELEGATION = 'DELEGATION'; - // Parsed "directly" by AntlrToScribParser + // "Node type" constants -- parsed "directly" by AntlrToScribParser + // TODO: split naming of type int constant from String label PAYLOAD = 'PAYLOAD'; //PAYLOADELEMENT = 'payloadelement'; @@ -240,7 +247,7 @@ tokens System.exit(1); } - // qn = qualifiedname + // qn = qualifiedname -- CHECKME: do these bypass ScribTreeAdaptor? public static CommonTree parsePayloadElem(CommonTree qn) throws RecognitionException { //System.out.println("ggg1: " + qn + " ,, " + qn.token + " ,, " + qn.getChildren()); diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java similarity index 68% rename from scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java rename to scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java index e194eb4bf..bca20dc2f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java @@ -11,14 +11,36 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.ast; +package org.scribble.parser.scribble; -import java.util.Arrays; -import java.util.Collections; import java.util.List; -import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; +import org.antlr.runtime.CommonToken; +import org.scribble.ast.AstFactory; +import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.ImportDecl; +import org.scribble.ast.ImportModule; +import org.scribble.ast.MessageNode; +import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.MessageSigNode; +import org.scribble.ast.Module; +import org.scribble.ast.ModuleDecl; +import org.scribble.ast.NonProtocolDecl; +import org.scribble.ast.NonRoleArg; +import org.scribble.ast.NonRoleArgList; +import org.scribble.ast.NonRoleArgNode; +import org.scribble.ast.NonRoleParamDecl; +import org.scribble.ast.NonRoleParamDeclList; +import org.scribble.ast.PayloadElem; +import org.scribble.ast.PayloadElemList; +import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.ProtocolModList; +import org.scribble.ast.RoleArg; +import org.scribble.ast.RoleArgList; +import org.scribble.ast.RoleDecl; +import org.scribble.ast.RoleDeclList; +import org.scribble.ast.ScribNodeBase; +import org.scribble.ast.UnaryPayloadElem; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; import org.scribble.ast.global.GContinue; @@ -38,7 +60,6 @@ import org.scribble.ast.name.PayloadElemNameNode; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.qualified.GProtocolNameNode; -import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.qualified.QualifiedNameNode; @@ -53,7 +74,6 @@ import org.scribble.core.type.kind.DataTypeKind; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Kind; -import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.ModuleKind; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.OpKind; @@ -61,7 +81,6 @@ import org.scribble.core.type.kind.RecVarKind; import org.scribble.core.type.kind.RoleKind; import org.scribble.core.type.kind.SigKind; -import org.scribble.core.type.name.Op; import org.scribble.del.DefaultDel; import org.scribble.del.ImportModuleDel; import org.scribble.del.ModuleDel; @@ -90,6 +109,8 @@ import org.scribble.del.name.simple.NonRoleParamNodeDel; import org.scribble.del.name.simple.RecVarNodeDel; import org.scribble.del.name.simple.RoleNodeDel; +import org.scribble.parser.antlr.ScribbleParser; + public class AstFactoryImpl implements AstFactory @@ -119,26 +140,32 @@ protected static T del(T n, ScribDel del) return ScribNodeBase.del(n, del); } - // CHECKME: deprecated ? - // FIXME: inconsistent wrt. this.source -- it is essentially parsed (in the sense of *omitted* syntax), but not recorded - // FIXME: this pattern is not ideal ("exposed" public constructor arg in GWrap/GDisconnect) - // An alternative would be to make subclasses, e.g., UnitMessageSigNode, UnitOp, EmptyPayloadElemList -- but a lot of extra classes - protected MessageSigNode UnitMessageSigNode() + @Override + public IdNode IdNode(String id) { - if (UNIT_MESSAGE_SIG_NODE == null) - { - UNIT_MESSAGE_SIG_NODE = MessageSigNode(null, - (OpNode) SimpleNameNode(null, OpKind.KIND, - Op.EMPTY_OP.toString()), - PayloadElemList(null, Collections.emptyList())); - // Payload.EMPTY_PAYLOAD? - } - return UNIT_MESSAGE_SIG_NODE; + CommonToken t = new CommonToken(ScribbleParser.IDENTIFIER, id); + // IdNode is the only token with a "different" text to its node type -- info stored directly as its the text, no children + IdNode n = new IdNode(t); + return n; + } + + // type comes from the int constants in ScribbleParser, which come from the tokens in Scribble.g + // Pre: any type from ScribbleParser, except IDENTIFIER (IdNode) + private CommonToken newToken(int type) + { + String text = null; // CHECKEME: use reflection? + return new CommonToken(type, text); } + private CommonToken newToken(int type, String text) + { + return new CommonToken(type, text); + } + @Override - public MessageSigNode MessageSigNode(Token t, OpNode op, PayloadElemList pay) + public MessageSigNode MessageSigNode(OpNode op, PayloadElemList pay) { + CommonToken t = newToken(ScribbleParser.MESSAGESIGNATURE, "MESSAGESIGNATURE"); MessageSigNode msn = new MessageSigNode(t); msn.addChild(op); msn.addChild(pay); @@ -147,31 +174,32 @@ public MessageSigNode MessageSigNode(Token t, OpNode op, PayloadElemList pay) } @Override - public PayloadElemList PayloadElemList(Token t, List> elems) + public PayloadElemList PayloadElemList(List> elems) { + CommonToken t = newToken(ScribbleParser.PAYLOAD, "PAYLOAD"); PayloadElemList p = new PayloadElemList(t); p.addChildren(elems); p = del(p, createDefaultDelegate()); return p; } + // Not used by ScribbleParser -- parsed "directly" within Scribble.g @Override public UnaryPayloadElem UnaryPayloadElem( - Token t, PayloadElemNameNode name) + PayloadElemNameNode name) { + CommonToken t = newToken(ScribbleParser.UNARYPAYLOADELEM, "UNARYPAYLOADELEM"); UnaryPayloadElem de = new UnaryPayloadElem<>(t); // Cf. Scribble.g children order de.addChild(name); de = del(de, createDefaultDelegate()); return de; - //throw new RuntimeException("[TODO] : " + name); - // Currently parsed "directly" by ANTLR -- do we still need to construct manually? } @Override - public GDelegationElem GDelegationElem(Token t, - GProtocolNameNode proto, RoleNode role) + public GDelegationElem GDelegationElem(GProtocolNameNode proto, RoleNode role) { + CommonToken t = newToken(ScribbleParser.DELEGATION, "DELEGATION"); GDelegationElem de = new GDelegationElem(t); de.addChild(proto); de.addChild(role); @@ -181,10 +209,11 @@ public GDelegationElem GDelegationElem(Token t, } @Override - public Module Module(Token t, ModuleDecl moddecl, + public Module Module(ModuleDecl moddecl, List> imports, List> data, List> protos) { + CommonToken t = newToken(ScribbleParser.MODULE, "MODULE"); Module n = new Module(t); n.addChild(moddecl); n.addChildren(imports); @@ -195,8 +224,9 @@ public Module Module(Token t, ModuleDecl moddecl, } @Override - public ModuleDecl ModuleDecl(Token t, ModuleNameNode fullmodname) + public ModuleDecl ModuleDecl(ModuleNameNode fullmodname) { + CommonToken t = newToken(ScribbleParser.MODULEDECL, "MODULEDECL"); ModuleDecl n = new ModuleDecl(t); n.addChild(fullmodname); n = del(n, createDefaultDelegate()); @@ -204,9 +234,10 @@ public ModuleDecl ModuleDecl(Token t, ModuleNameNode fullmodname) } @Override - public ImportModule ImportModule(Token t, ModuleNameNode modname, + public ImportModule ImportModule(ModuleNameNode modname, ModuleNameNode alias) { + CommonToken t = newToken(ScribbleParser.IMPORTMODULE, "IMPORTMODULE"); ImportModule im = new ImportModule(t); im.addChild(modname); if (alias != null) @@ -218,9 +249,11 @@ public ImportModule ImportModule(Token t, ModuleNameNode modname, } @Override - public MessageSigNameDecl MessageSigNameDecl(Token t, IdNode schema, + public MessageSigNameDecl MessageSigNameDecl(IdNode schema, IdNode extName, IdNode extSource, MessageSigNameNode alias) { + CommonToken t = newToken(ScribbleParser.MESSAGESIGNATUREDECL, + "MESSAGESIGNATUREDECL"); MessageSigNameDecl n = new MessageSigNameDecl(t); n.addChild(schema); n.addChild(extName); @@ -231,9 +264,11 @@ public MessageSigNameDecl MessageSigNameDecl(Token t, IdNode schema, } @Override - public DataTypeDecl DataTypeDecl(Token t, IdNode schema, + public DataTypeDecl DataTypeDecl(IdNode schema, IdNode extName, IdNode extSource, DataTypeNode alias) { + CommonToken t = newToken(ScribbleParser.PAYLOADTYPEDECL, + "PAYLOADTYPEDECL"); DataTypeDecl n = new DataTypeDecl(t); n.addChild(schema); n.addChild(extName); @@ -244,9 +279,11 @@ public DataTypeDecl DataTypeDecl(Token t, IdNode schema, } @Override - public GProtocolDecl GProtocolDecl(Token t, ProtocolModList mods, + public GProtocolDecl GProtocolDecl(ProtocolModList mods, GProtocolHeader header, GProtocolDef def) { + CommonToken t = newToken(ScribbleParser.GLOBALPROTOCOLDECL, + "GLOBALPROTOCOLDECL"); GProtocolDecl gpd = new GProtocolDecl(t); gpd.addChild(mods); gpd.addChild(header); @@ -256,33 +293,38 @@ public GProtocolDecl GProtocolDecl(Token t, ProtocolModList mods, } @Override - public GProtocolHeader GProtocolHeader(Token t, - GProtocolNameNode name, RoleDeclList roledecls, - NonRoleParamDeclList paramdecls) + public GProtocolHeader GProtocolHeader(GProtocolNameNode name, + RoleDeclList rs, NonRoleParamDeclList ps) { + CommonToken t = newToken(ScribbleParser.GLOBALPROTOCOLHEADER, + "GLOBALPROTOCOLHEADER"); GProtocolHeader n = new GProtocolHeader(t); n.addChild(name); - n.addChild(paramdecls); - n.addChild(roledecls); + n.addChild(ps); + n.addChild(rs); n = del(n, createDefaultDelegate()); return n; } @Override - public RoleDeclList RoleDeclList(Token t, List rds) + public RoleDeclList RoleDeclList(List ds) { + CommonToken t = newToken(ScribbleParser.ROLEDECLLIST, + "ROLEDECLLIST"); RoleDeclList rdl = new RoleDeclList(t); // Cf. Scribble.g children order - rdl.addChildren(rds); + rdl.addChildren(ds); rdl = del(rdl, new RoleDeclListDel()); return rdl; } @Override - public RoleDecl RoleDecl(Token t, RoleNode namenode) + public RoleDecl RoleDecl(RoleNode r) { + CommonToken t = newToken(ScribbleParser.ROLEDECL, + "ROLEDECL"); RoleDecl n = new RoleDecl(t); - n.addChild(namenode); + n.addChild(r); n = del(n, new RoleDeclDel()); return n; } @@ -296,12 +338,14 @@ public ConnectDecl ConnectDecl(RoleNode src, RoleNode role) }*/ @Override - public NonRoleParamDeclList NonRoleParamDeclList(Token t, - List> pds) + public NonRoleParamDeclList NonRoleParamDeclList( + List> ds) { + CommonToken t = newToken(ScribbleParser.ROLEDECL, + "ROLEDECL"); NonRoleParamDeclList pdl = new NonRoleParamDeclList(t); // Cf. Scribble.g children order - pdl.addChildren(pds); + pdl.addChildren(ds); pdl = del(pdl, new NonRoleParamDeclListDel()); return pdl; } @@ -309,7 +353,7 @@ public NonRoleParamDeclList NonRoleParamDeclList(Token t, @Deprecated @Override public NonRoleParamDecl NonRoleParamDecl( - Token t, K kind, NonRoleParamNode namenode) + K kind, NonRoleParamNode namenode) { /*NonRoleParamDecl pd = new NonRoleParamDecl(source, kind, namenode); pd = del(pd, new NonRoleParamDeclDel()); @@ -318,8 +362,10 @@ public NonRoleParamDecl NonRoleParamDecl( } @Override - public GProtocolDef GProtocolDef(Token t, GProtocolBlock block) + public GProtocolDef GProtocolDef(GProtocolBlock block) { + CommonToken t = newToken(ScribbleParser.GLOBALPROTOCOLDEF, + "GLOBALPROTOCOLDEF"); GProtocolDef n = new GProtocolDef(t); n.addChild(block); n = del(n, new GProtocolDefDel()); @@ -327,8 +373,10 @@ public GProtocolDef GProtocolDef(Token t, GProtocolBlock block) } @Override - public GProtocolBlock GProtocolBlock(Token t, GInteractionSeq seq) + public GProtocolBlock GProtocolBlock(GInteractionSeq seq) { + CommonToken t = newToken(ScribbleParser.GLOBALPROTOCOLBLOCK, + "GLOBALPROTOCOLBLOCK"); GProtocolBlock n = new GProtocolBlock(t); n.addChild(seq); n = del(n, new GProtocolBlockDel()); @@ -336,8 +384,10 @@ public GProtocolBlock GProtocolBlock(Token t, GInteractionSeq seq) } @Override - public GInteractionSeq GInteractionSeq(Token t, List elems) + public GInteractionSeq GInteractionSeq(List elems) { + CommonToken t = newToken(ScribbleParser.GLOBALINTERACTIONSEQUENCE, + "GLOBALINTERACTIONSEQUENCE"); GInteractionSeq n = new GInteractionSeq(t); n.addChildren(elems); n = del(n, new GInteractionSeqDel()); @@ -345,9 +395,11 @@ public GInteractionSeq GInteractionSeq(Token t, List elems) } @Override - public GMessageTransfer GMessageTransfer(Token t, RoleNode src, + public GMessageTransfer GMessageTransfer(RoleNode src, MessageNode msg, List dsts) { + CommonToken t = newToken(ScribbleParser.GLOBALMESSAGETRANSFER, + "GLOBALMESSAGETRANSFER"); GMessageTransfer n = new GMessageTransfer(t); n.addChild(msg); n.addChild(src); @@ -357,8 +409,10 @@ public GMessageTransfer GMessageTransfer(Token t, RoleNode src, } @Override - public GConnect GConnect(Token t, RoleNode src, MessageNode msg, RoleNode dst) + public GConnect GConnect(RoleNode src, MessageNode msg, RoleNode dst) { + CommonToken t = newToken(ScribbleParser.GLOBALCONNECT, + "GLOBALCONNECT"); GConnect n = new GConnect(t); n.addChild(msg); n.addChild(src); @@ -368,8 +422,10 @@ public GConnect GConnect(Token t, RoleNode src, MessageNode msg, RoleNode dst) } @Override - public GDisconnect GDisconnect(Token t, RoleNode left, RoleNode right) + public GDisconnect GDisconnect(RoleNode left, RoleNode right) { + CommonToken t = newToken(ScribbleParser.GLOBALDISCONNECT, + "GLOBALDISCONNECT"); GDisconnect n = new GDisconnect(t); n.addChild(left); n.addChild(right); @@ -378,8 +434,10 @@ public GDisconnect GDisconnect(Token t, RoleNode left, RoleNode right) } @Override - public GWrap GWrap(Token t, RoleNode src, RoleNode dst) + public GWrap GWrap(RoleNode src, RoleNode dst) { + CommonToken t = newToken(ScribbleParser.GLOBALWRAP, + "GLOBALWRAP"); GWrap n = new GWrap(t); n.addChild(src); n.addChild(dst); @@ -388,8 +446,10 @@ public GWrap GWrap(Token t, RoleNode src, RoleNode dst) } @Override - public GChoice GChoice(Token t, RoleNode subj, List blocks) + public GChoice GChoice(RoleNode subj, List blocks) { + CommonToken t = newToken(ScribbleParser.GLOBALCHOICE, + "GLOBALCHOICE"); GChoice n = new GChoice(t); n.addChild(subj); n.addChildren(blocks); @@ -398,75 +458,90 @@ public GChoice GChoice(Token t, RoleNode subj, List blocks) } @Override - public GRecursion GRecursion(Token t, RecVarNode recvar, + public GRecursion GRecursion(RecVarNode rv, GProtocolBlock block) { + CommonToken t = newToken(ScribbleParser.GLOBALRECURSION, + "GLOBALRECURSION"); GRecursion n = new GRecursion(t); - n.addChild(recvar); + n.addChild(rv); n.addChild(block); n = del(n, new GRecursionDel()); return n; } @Override - public GContinue GContinue(Token t, RecVarNode recvar) + public GContinue GContinue(RecVarNode rv) { + CommonToken t = newToken(ScribbleParser.GLOBALCONTINUE, + "GLOBALCONTINUE"); GContinue n = new GContinue(t); - n.addChild(recvar); + n.addChild(rv); n = del(n, new GContinueDel()); return n; } @Override - public GDo GDo(Token t, RoleArgList roleinstans, - NonRoleArgList arginstans, GProtocolNameNode proto) + public GDo GDo(RoleArgList rs, NonRoleArgList as, GProtocolNameNode proto) { + CommonToken t = newToken(ScribbleParser.GLOBALDO, + "GLOBALDO"); GDo n = new GDo(t); n.addChild(proto); - n.addChild(roleinstans); - n.addChild(arginstans); + n.addChild(rs); + n.addChild(as); n = del(n, new GDoDel()); return n; } @Override - public RoleArgList RoleArgList(Token t, List ris) + public RoleArgList RoleArgList(List rs) { + CommonToken t = newToken(ScribbleParser.GLOBALDO, + "GLOBALDO"); RoleArgList n = new RoleArgList(t); - n.addChildren(ris); + n.addChildren(rs); n = del(n, new RoleArgListDel()); return n; } @Override - public RoleArg RoleArg(Token t, RoleNode role) + public RoleArg RoleArg(RoleNode r) { + CommonToken t = newToken(ScribbleParser.GLOBALDO, + "GLOBALDO"); RoleArg n = new RoleArg(t); - n.addChild(role); + n.addChild(r); n = del(n, createDefaultDelegate()); return n; } @Override - public NonRoleArgList NonRoleArgList(Token t, List ais) + public NonRoleArgList NonRoleArgList(List as) { + CommonToken t = newToken(ScribbleParser.ARGUMENTINSTANTIATIONLIST, + "ARGUMENTINSTANTIATIONLIST"); NonRoleArgList n = new NonRoleArgList(t); - n.addChildren(ais); + n.addChildren(as); n = del(n, new NonRoleArgListDel()); return n; } @Override - public NonRoleArg NonRoleArg(Token t, NonRoleArgNode arg) + public NonRoleArg NonRoleArg(NonRoleArgNode arg) { + CommonToken t = newToken(ScribbleParser.ARGUMENTINSTANTIATIONLIST, + "ARGUMENTINSTANTIATIONLIST"); NonRoleArg n = new NonRoleArg(t); n.addChild(arg); n = del(n, createDefaultDelegate()); return n; } + // FIXME: split up this method + // CHECKME: organise explicit Scribble Tokens @Override - public NameNode SimpleNameNode(Token t, K kind, + public NameNode SimpleNameNode(K kind, IdNode id) { NameNode snn = null; @@ -474,23 +549,28 @@ public NameNode SimpleNameNode(Token t, K kind, // "Custom" del's if (kind.equals(RecVarKind.KIND)) { - snn = new RecVarNode(t, id); + CommonToken t = newToken(ScribbleParser.RECURSIONVAR, "RECURSIONVAR"); + snn = new RecVarNode(t); snn = del(snn, new RecVarNodeDel()); } else if (kind.equals(RoleKind.KIND)) { - snn = new RoleNode(t, id); + CommonToken t = newToken(ScribbleParser.ROLENAME, "ROLENAME"); + snn = new RoleNode(t); snn = del(snn, new RoleNodeDel()); } if (snn != null) { + snn.addChild(id); return castNameNode(kind, snn); } // Default del's if (kind.equals(OpKind.KIND)) { - snn = new OpNode(t, id); + CommonToken t = newToken(ScribbleParser.OPNAME, "OPNAME"); + snn = new OpNode(t); + snn.addChild(id); } else { @@ -501,41 +581,42 @@ else if (kind.equals(RoleKind.KIND)) @Override public QualifiedNameNode QualifiedNameNode( - Token t, K kind, IdNode... elems) + K kind, List elems) { QualifiedNameNode qnn = null; if (kind.equals(SigKind.KIND)) { - qnn = new MessageSigNameNode(t, elems); + CommonToken t = newToken(ScribbleParser.SIGNAME, "SIGNAME"); + qnn = new MessageSigNameNode(t); qnn = del(qnn, new MessageSigNameNodeDel()); } else if (kind.equals(DataTypeKind.KIND)) { - qnn = new DataTypeNode(t, elems); + CommonToken t = newToken(ScribbleParser.TYPENAME, "TYPENAME"); + qnn = new DataTypeNode(t); qnn = del(qnn, new DataTypeNodeDel()); } if (qnn != null) { + qnn.addChildren(elems); return castNameNode(kind, qnn); } if (kind.equals(ModuleKind.KIND)) { - qnn = new ModuleNameNode(t, elems); + CommonToken t = newToken(ScribbleParser.MODULENAME, "MODULENAME"); + qnn = new ModuleNameNode(t); } else if (kind.equals(Global.KIND)) { - qnn = new GProtocolNameNode(t, elems); - } - else if (kind.equals(Local.KIND)) - { - qnn = new LProtocolNameNode(t, elems); + CommonToken t = newToken(ScribbleParser.GPROTOCOLNAME, "GPROTOCOLNAME"); + qnn = new GProtocolNameNode(t); } else { throw new RuntimeException("Shouldn't get in here: " + kind); } - System.out.println("rrrr: " + kind + " ,, " + Arrays.toString(elems)); + qnn.addChildren(elems); return castNameNode(kind, del(qnn, createDefaultDelegate())); } @@ -551,10 +632,11 @@ protected static , K extends Kind> T castNameNode( return tmp; } - // Deprecate? Never need to make ambigname via af? + // Deprecate? Never need to make ambigname "manually" via af? (only constructed by ScribbleParser) @Override - public AmbigNameNode AmbiguousNameNode(Token t, IdNode id) + public AmbigNameNode AmbiguousNameNode(IdNode id) { + CommonToken t = newToken(ScribbleParser.AMBIGUOUSNAME, "AMBIGUOUSNAME"); AmbigNameNode n = new AmbigNameNode(t); n.addChild(id); n = (AmbigNameNode) n.del(new AmbigNameNodeDel()); @@ -564,15 +646,17 @@ public AmbigNameNode AmbiguousNameNode(Token t, IdNode id) @SuppressWarnings("unchecked") // FIXME @Override public NonRoleParamNode NonRoleParamNode( - Token t, K kind, String identifier) + K kind, String identifier) { NonRoleParamNode pn; if (kind.equals(SigKind.KIND)) { + CommonToken t = newToken(ScribbleParser.SIGPARAMNAME, "SIGPARAMNAME"); // N.B. cf. ScribbleParser.SIGNAME pn = (NonRoleParamNode) new SigParamNode(t); } else { + CommonToken t = newToken(ScribbleParser.TYPEPARAMNAME, "TYPEPARAMNAME"); // N.B. cf. ScribbleParser.TYPENAME pn = (NonRoleParamNode) new TypeParamNode(t); } pn = del(pn, new NonRoleParamNodeDel()); diff --git a/scribble-ast/src/main/java/org/scribble/del/DelDecoratorImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java similarity index 99% rename from scribble-ast/src/main/java/org/scribble/del/DelDecoratorImpl.java rename to scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java index 2bfa79c75..5db5572d1 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DelDecoratorImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.del; +package org.scribble.parser.scribble; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -63,6 +63,7 @@ import org.scribble.ast.name.simple.SigParamNode; import org.scribble.ast.name.simple.TypeParamNode; import org.scribble.del.DefaultDel; +import org.scribble.del.DelDecorator; import org.scribble.del.ImportModuleDel; import org.scribble.del.ModuleDel; import org.scribble.del.NonRoleArgListDel; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribAntlrWrapper.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribAntlrWrapper.java index d9c162596..500afb8a4 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribAntlrWrapper.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribAntlrWrapper.java @@ -26,7 +26,6 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.Module; import org.scribble.del.DelDecorator; -import org.scribble.del.DelDecoratorImpl; import org.scribble.parser.antlr.ScribbleLexer; import org.scribble.parser.antlr.ScribbleParser; import org.scribble.util.ScribParserException; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 03159e384..d6bdb4a6f 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -36,6 +36,7 @@ import org.scribble.ast.RoleDecl; import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScribNil; +import org.scribble.ast.ScribNode; import org.scribble.ast.SigParamDecl; import org.scribble.ast.TypeParamDecl; import org.scribble.ast.global.GChoice; @@ -76,8 +77,9 @@ public Object nil() return new ScribNil(); } + // Create a Tree (ScribNode) from a Token @Override - public Object create(Token t) + public ScribNode create(Token t) { String tname = t.getText(); @@ -98,6 +100,7 @@ public Object create(Token t) throw new RuntimeException(e); }*/ + // CHECKME: switch on scribbleparser int type constants instead switch (tname) { case "MODULE": return new Module(t); @@ -144,7 +147,8 @@ public Object create(Token t) case "ROLEINSTANTIATION": return new RoleArg(t); case "ARGUMENTINSTANTIATIONLIST": return new NonRoleArgList(t); case "NONROLEARG": return new NonRoleArg(t); // Only for messagesignature -- qualifiedname (datatypenode or ambignamenode) done "manually" in scribble.g (cf. UnaryPayloadElem) - case "AMBIGUOUSNAME": return new AmbigNameNode(t); + case "AMBIGUOUSNAME": + return new AmbigNameNode(t); default: { diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index fc8430fa1..29040c677 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -75,6 +75,7 @@ module tmp.Test; // CHECKME: duplicte proto mods // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) + // sort out full name expansion between disamb and translation -- fix modulecontextcollector for imported module member fullnames // refactor additional disamb syntactic checks into core? e.g., do-calls, distinct roledecls, protodecls, etc. //make a visitor factory @@ -82,11 +83,12 @@ module tmp.Test; // use stypefactory in core -- also make a visitorfactory // refactor test to use main instead of cli +type "..." from "..." as T; global protocol Proto1(role A, role B) { //1() from A to B; - 1() from A to B; + 1(T) from A to B; //do Proto1(A, B); } From c27f39256dee2769166b67ccc52c2315180ca3cc Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 12 Apr 2019 11:40:43 +0100 Subject: [PATCH 256/539] Continued: WIP cleaning up ast classes. --- .../parser/scribble/ScribTreeAdaptor.java | 110 ++++++++++-------- 1 file changed, 63 insertions(+), 47 deletions(-) diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index d6bdb4a6f..ed0e87587 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -81,8 +81,6 @@ public Object nil() @Override public ScribNode create(Token t) { - String tname = t.getText(); - /* // CHECKME: use a naming convention between Token and AST class names for reflection? try { @@ -100,62 +98,79 @@ public ScribNode create(Token t) throw new RuntimeException(e); }*/ - // CHECKME: switch on scribbleparser int type constants instead - switch (tname) + // Switching on ScribbleParser int type constants -- generated from Scribble.g tokens + switch (t.getType()) { - case "MODULE": return new Module(t); - case "MODULEDECL": return new ModuleDecl(t); - case "MODULENAME": return new ModuleNameNode(t); - case "IMPORTMODULE": return new ImportModule(t); - case "PAYLOADTYPEDECL": return new DataTypeDecl(t); - case "MESSAGESIGNATUREDECL": return new MessageSigNameDecl(t); - case "TYPENAME": return new DataTypeNode(t); - case "SIGNAME": return new MessageSigNameNode(t); - case "GLOBALPROTOCOLDECL": return new GProtocolDecl(t); - case "GLOBALPROTOCOLDECLMODS": return new ProtocolModList(t); - case "aux": return new AuxMod(t); - case "explicit": return new ExplicitMod(t); + case ScribbleParser.MODULE: return new Module(t); + case ScribbleParser.MODULEDECL: return new ModuleDecl(t); + case ScribbleParser.MODULENAME: return new ModuleNameNode(t); + case ScribbleParser.IMPORTMODULE: return new ImportModule(t); + case ScribbleParser.PAYLOADTYPEDECL: return new DataTypeDecl(t); + case ScribbleParser.MESSAGESIGNATUREDECL: return new MessageSigNameDecl(t); + case ScribbleParser.TYPENAME: return new DataTypeNode(t); + case ScribbleParser.SIGNAME: return new MessageSigNameNode(t); + case ScribbleParser.GLOBALPROTOCOLDECL: return new GProtocolDecl(t); + case ScribbleParser.GLOBALPROTOCOLDECLMODS: return new ProtocolModList(t); + case ScribbleParser.AUX_KW: return new AuxMod(t); // FIXME: KW being used directly + case ScribbleParser.EXPLICIT_KW: return new ExplicitMod(t); - case "GLOBALPROTOCOLHEADER": return new GProtocolHeader(t); - case "GPROTOCOLNAME": return new GProtocolNameNode(t); - case "ROLEDECLLIST": return new RoleDeclList(t); - case "ROLEDECL": return new RoleDecl(t); - case "ROLENAME": return new RoleNode(t); - case "PARAMETERDECLLIST": return new NonRoleParamDeclList(t); - case "TYPEPARAMDECL": return new TypeParamDecl(t); - case "TYPEPARAMNAME": return new TypeParamNode(t); - case "SIGPARAMDECL": return new SigParamDecl(t); - case "SIGPARAMNAME": return new SigParamNode(t); - case "GLOBALPROTOCOLDEF": return new GProtocolDef(t); - case "GLOBALPROTOCOLBLOCK": return new GProtocolBlock(t); - case "GLOBALINTERACTIONSEQUENCE": return new GInteractionSeq(t); + case ScribbleParser.GLOBALPROTOCOLHEADER: return new GProtocolHeader(t); + case ScribbleParser.GPROTOCOLNAME: return new GProtocolNameNode(t); + case ScribbleParser.ROLEDECLLIST: return new RoleDeclList(t); + case ScribbleParser.ROLEDECL: return new RoleDecl(t); + case ScribbleParser.ROLENAME: return new RoleNode(t); + case ScribbleParser.PARAMETERDECLLIST: return new NonRoleParamDeclList(t); + case ScribbleParser.TYPEPARAMDECL: return new TypeParamDecl(t); + case ScribbleParser.TYPEPARAMNAME: return new TypeParamNode(t); + case ScribbleParser.SIGPARAMDECL: return new SigParamDecl(t); + case ScribbleParser.SIGPARAMNAME: return new SigParamNode(t); + case ScribbleParser.GLOBALPROTOCOLDEF: return new GProtocolDef(t); + case ScribbleParser.GLOBALPROTOCOLBLOCK: return new GProtocolBlock(t); + case ScribbleParser.GLOBALINTERACTIONSEQUENCE: return new GInteractionSeq(t); - case "GLOBALMESSAGETRANSFER": return new GMessageTransfer(t); - case "GLOBALCONNECT": return new GConnect(t); - case "GLOBALDISCONNECT": return new GDisconnect(t); - case "GLOBALCHOICE": return new GChoice(t); - case "GLOBALRECURSION": return new GRecursion(t); - case "GLOBALCONTINUE": return new GContinue(t); - case "GLOBALDO": return new GDo(t); - case "RECURSIONVAR": return new RecVarNode(t); + case ScribbleParser.GLOBALMESSAGETRANSFER: return new GMessageTransfer(t); + case ScribbleParser.GLOBALCONNECT: return new GConnect(t); + case ScribbleParser.GLOBALDISCONNECT: return new GDisconnect(t); + case ScribbleParser.GLOBALCHOICE: return new GChoice(t); + case ScribbleParser.GLOBALRECURSION: return new GRecursion(t); + case ScribbleParser.GLOBALCONTINUE: return new GContinue(t); + case ScribbleParser.GLOBALDO: return new GDo(t); + case ScribbleParser.RECURSIONVAR: return new RecVarNode(t); - case "MESSAGESIGNATURE": return new MessageSigNode(t); - case "OPNAME": return new OpNode(t); - case "PAYLOAD": return new PayloadElemList(t); // N.B. UnaryPayloadElem parsed "manually" in Scribble.g + case ScribbleParser.MESSAGESIGNATURE: return new MessageSigNode(t); + case ScribbleParser.OPNAME: return new OpNode(t); + case ScribbleParser.PAYLOAD: return new PayloadElemList(t); // N.B. UnaryPayloadElem parsed "manually" in Scribble.g - case "ROLEINSTANTIATIONLIST": return new RoleArgList(t); - case "ROLEINSTANTIATION": return new RoleArg(t); - case "ARGUMENTINSTANTIATIONLIST": return new NonRoleArgList(t); - case "NONROLEARG": return new NonRoleArg(t); // Only for messagesignature -- qualifiedname (datatypenode or ambignamenode) done "manually" in scribble.g (cf. UnaryPayloadElem) - case "AMBIGUOUSNAME": + case ScribbleParser.ROLEINSTANTIATIONLIST: return new RoleArgList(t); + case ScribbleParser.ROLEINSTANTIATION: return new RoleArg(t); + case ScribbleParser.ARGUMENTINSTANTIATIONLIST: return new NonRoleArgList(t); + case ScribbleParser.NONROLEARG: return new NonRoleArg(t); // Only for messagesignature -- qualifiedname (datatypenode or ambignamenode) done "manually" in scribble.g (cf. UnaryPayloadElem) + case ScribbleParser.AMBIGUOUSNAME: return new AmbigNameNode(t); + + case ScribbleParser.IDENTIFIER: return new IdNode(t); + case ScribbleParser.EXTIDENTIFIER: return new IdNode(t); // CHECKME: OK to + + // Special cases + case ScribbleParser.EMPTY_OPERATOR: return new IdNode(t); // OpNode.toName checks IdNode child text for OpNode.EMPTY_OP_ID + + // N.B. Temporary QUALIFIEDNAME created, then internally parsed by ScribbleParser.parsePayloadElem/parseNonRoleArg + case ScribbleParser.QUALIFIEDNAME: + return new IdNode(t); + // Using IdNode as a "shell", but "token type" determined by t + // This "QUALIFIEDNAME" IdNode is passed by $qualifiedname.tree to, e.g., parsePayloadElem(CommonTree ct) + // N.B. the parser method takes CommonTree, that can accept IdNode + + //HERE CHECKME: parsePayloadElem ct class type and token type default: { - //CHECKME: QUALIFIEDNAME (e.g., good.misc.globals.gdo.Do06b) + /*//CHECKME: QUALIFIEDNAME (e.g., good.misc.globals.gdo.Do06b) //CHECKME: UNARYPAYLOADELEM? + String tname = t.getText(); // By convention of Scribble.g putting type constant name into each node first, e.g., module: ... -> ^(MODULE ...) if (TOKEN_NAMES.contains(tname)) { + System.out.println("aaaa1: " + t); if (!(tname.equals(OpNode.EMPTY_OP_ID) // TODO: refactor empty op hack || tname.equals("QUALIFIEDNAME"))) // Temporary QUALIFIEDNAME created, then internally parsed by ScribbleParser.parsePayloadElem/parseNonRoleArg @@ -163,7 +178,8 @@ public ScribNode create(Token t) throw new RuntimeException("[TODO] Unhandled token type: " + tname); } } - return new IdNode(t); + return new IdNode(t);*/ + throw new RuntimeException("[TODO] Unhandled token type: " + t); } } } From e57177342f0707e1831ad4a45782d5bad94f17b2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 12 Apr 2019 12:36:20 +0100 Subject: [PATCH 257/539] Continued: WIP cleaning up ast classes. --- .../org/scribble/parser/antlr/Scribble.g | 11 +++++------ .../parser/scribble/ScribTreeAdaptor.java | 18 +++++++----------- scribble-test/src/test/scrib/tmp/Test.scr | 1 + 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 317c8fc6a..161f2b456 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -247,11 +247,11 @@ tokens System.exit(1); } - // qn = qualifiedname -- CHECKME: do these bypass ScribTreeAdaptor? + // qn is an IdNode "holder" for a qualifiedname + // CHECKME: do the returns of these "bypass" ScribTreeAdaptor? specifically AmbigNode public static CommonTree parsePayloadElem(CommonTree qn) throws RecognitionException { - //System.out.println("ggg1: " + qn + " ,, " + qn.token + " ,, " + qn.getChildren()); - if (qn.getChildCount() > 1) + if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname { DataTypeNode dt = new DataTypeNode(new CommonToken(TYPENAME, "TYPENAME")); ((List) qn.getChildren()).forEach(x -> @@ -272,16 +272,15 @@ tokens UnaryPayloadElem e = new UnaryPayloadElem( new CommonToken(UNARYPAYLOADELEM, "UNARYPAYLOADELEM")); e.addChild(an); - //System.out.println("ggg2: " + e + " ,, " + e.token + " ,, " + e.getChildren()); return e; } } // Only for QualifiedName (DataTypeNode or AmbigNameNode), not messagesignature literal - // qn = qualifiedname + // qn is an IdNode "holder" for a qualifiedname public static CommonTree parseNonRoleArg(CommonTree qn) throws RecognitionException { - if (qn.getChildCount() > 1) + if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname { DataTypeNode dt = new DataTypeNode(new CommonToken(TYPENAME, "TYPENAME")); ((List) qn.getChildren()).forEach(x -> diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index ed0e87587..5709b2d75 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -145,23 +145,19 @@ public ScribNode create(Token t) case ScribbleParser.ROLEINSTANTIATION: return new RoleArg(t); case ScribbleParser.ARGUMENTINSTANTIATIONLIST: return new NonRoleArgList(t); case ScribbleParser.NONROLEARG: return new NonRoleArg(t); // Only for messagesignature -- qualifiedname (datatypenode or ambignamenode) done "manually" in scribble.g (cf. UnaryPayloadElem) - case ScribbleParser.AMBIGUOUSNAME: - return new AmbigNameNode(t); + case ScribbleParser.AMBIGUOUSNAME: return new AmbigNameNode(t); case ScribbleParser.IDENTIFIER: return new IdNode(t); case ScribbleParser.EXTIDENTIFIER: return new IdNode(t); // CHECKME: OK to // Special cases case ScribbleParser.EMPTY_OPERATOR: return new IdNode(t); // OpNode.toName checks IdNode child text for OpNode.EMPTY_OP_ID - - // N.B. Temporary QUALIFIEDNAME created, then internally parsed by ScribbleParser.parsePayloadElem/parseNonRoleArg - case ScribbleParser.QUALIFIEDNAME: - return new IdNode(t); - // Using IdNode as a "shell", but "token type" determined by t - // This "QUALIFIEDNAME" IdNode is passed by $qualifiedname.tree to, e.g., parsePayloadElem(CommonTree ct) - // N.B. the parser method takes CommonTree, that can accept IdNode - - //HERE CHECKME: parsePayloadElem ct class type and token type + case ScribbleParser.QUALIFIEDNAME: return new IdNode(t); + // Returns an IdNode whose token is "QUALIFIEDNAME", and whose children are the IdNode elements of the qualified name + // (Using IdNode as a "shell", but "token type" determined by t -- a bit misleading, IdNode here not an actual IDENTIFIER -- CHECKME: make a proper QUALIFIEDNAME?) + // It is a "temporary" QUALIFIEDNAME, "internally" parsed by ScribbleParser.parsePayloadElem/parseNonRoleArg + // This temporary IdNode is passed by $qualifiedname.tree to, e.g., parsePayloadElem(CommonTree ct) + // The parser method takes CommonTree, that can accept IdNode default: { diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 29040c677..5888ab623 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -88,6 +88,7 @@ type "..." from "..." as T; global protocol Proto1(role A, role B) { //1() from A to B; + //1(Test.T) from A to B; 1(T) from A to B; //do Proto1(A, B); } From bd25f8598ec51dfd5388dbf440a19ecccaae3783 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 12 Apr 2019 12:39:32 +0100 Subject: [PATCH 258/539] Continued: WIP cleaning up ast classes. --- .../parser/scribble/AstFactoryImpl.java | 9 ----- .../parser/scribble/ScribTreeAdaptor.java | 39 +++---------------- 2 files changed, 5 insertions(+), 43 deletions(-) diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java index bca20dc2f..433f72e75 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java @@ -115,8 +115,6 @@ public class AstFactoryImpl implements AstFactory { - private static MessageSigNode UNIT_MESSAGE_SIG_NODE; // A "constant" - public AstFactoryImpl() { @@ -128,15 +126,8 @@ protected ScribDel createDefaultDelegate() } // FIXME: factor out -- change return to void (ScribNodeBase.del is a mutating setter) - //@SuppressWarnings("unchecked") protected static T del(T n, ScribDel del) { - /*ScribNodeBase ret = n.del(del); // FIXME: del makes another shallow copy of n - if (ret.getClass() != n.getClass()) - { - throw new RuntimeException("Shouldn't get in here: " + ret.getClass() + ", " + n.getClass()); - } - return (T) ret;*/ return ScribNodeBase.del(n, del); } diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 5709b2d75..dde5215fc 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -81,24 +81,8 @@ public Object nil() @Override public ScribNode create(Token t) { - /* // CHECKME: use a naming convention between Token and AST class names for reflection? - try - { - Constructor cons = c.get Constructor(Job.class); - for (ModuleName modname : modnames) - { - AstVisitor nv = cons.newInstance(this); - runVisitorOnModule(modname, nv); - } - } - catch (NoSuchMethodException | SecurityException | InstantiationException - | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - { - throw new RuntimeException(e); - }*/ - // Switching on ScribbleParser int type constants -- generated from Scribble.g tokens + // Previously: String tname = t.getText(); -- by convention of Scribble.g, type constant name given as node text, e.g., module: ... -> ^(MODULE ...) switch (t.getType()) { case ScribbleParser.MODULE: return new Module(t); @@ -148,34 +132,21 @@ public ScribNode create(Token t) case ScribbleParser.AMBIGUOUSNAME: return new AmbigNameNode(t); case ScribbleParser.IDENTIFIER: return new IdNode(t); - case ScribbleParser.EXTIDENTIFIER: return new IdNode(t); // CHECKME: OK to + case ScribbleParser.EXTIDENTIFIER: return new IdNode(t); // CHECKME: OK? // Special cases - case ScribbleParser.EMPTY_OPERATOR: return new IdNode(t); // OpNode.toName checks IdNode child text for OpNode.EMPTY_OP_ID + case ScribbleParser.EMPTY_OPERATOR: return new IdNode(t); // OpNode.toName checks IdNode child text for OpNode.EMPTY_OP_ID // CHECKME refactor? case ScribbleParser.QUALIFIEDNAME: return new IdNode(t); // Returns an IdNode whose token is "QUALIFIEDNAME", and whose children are the IdNode elements of the qualified name // (Using IdNode as a "shell", but "token type" determined by t -- a bit misleading, IdNode here not an actual IDENTIFIER -- CHECKME: make a proper QUALIFIEDNAME?) // It is a "temporary" QUALIFIEDNAME, "internally" parsed by ScribbleParser.parsePayloadElem/parseNonRoleArg // This temporary IdNode is passed by $qualifiedname.tree to, e.g., parsePayloadElem(CommonTree ct) // The parser method takes CommonTree, that can accept IdNode + // (E.g., good.misc.globals.gdo.Do06b) default: { - /*//CHECKME: QUALIFIEDNAME (e.g., good.misc.globals.gdo.Do06b) - //CHECKME: UNARYPAYLOADELEM? - String tname = t.getText(); // By convention of Scribble.g putting type constant name into each node first, e.g., module: ... -> ^(MODULE ...) - if (TOKEN_NAMES.contains(tname)) - { - System.out.println("aaaa1: " + t); - if (!(tname.equals(OpNode.EMPTY_OP_ID) // TODO: refactor empty op hack - || tname.equals("QUALIFIEDNAME"))) - // Temporary QUALIFIEDNAME created, then internally parsed by ScribbleParser.parsePayloadElem/parseNonRoleArg - { - throw new RuntimeException("[TODO] Unhandled token type: " + tname); - } - } - return new IdNode(t);*/ - throw new RuntimeException("[TODO] Unhandled token type: " + t); + throw new RuntimeException("[TODO] Unknown token type (cf. ScribbleParser): " + t); } } } From 478ebcd5adeccbe53e02f79bb11602255d450933 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Apr 2019 17:05:26 +0100 Subject: [PATCH 259/539] Continued: cleaning up Scribble.g. --- .../org/scribble/parser/antlr/Scribble.g | 241 ++++++------------ scribble-test/src/test/scrib/tmp/Test.scr | 3 +- 2 files changed, 83 insertions(+), 161 deletions(-) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 161f2b456..2c73d139c 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -21,156 +21,120 @@ options { language = Java; output = AST; - //ASTLabelType = MyCommonTree; ASTLabelType = ScribNodeBase; - //backtrack = true; // backtracking disabled by default? Is it bad to require this option? - //memoize = true; } -// CHECKME: match tokens to keywords? +// CHECKME: match tokens to keywords? // Use KW as token types? But many more types than keywords tokens { /* - * Parser input constants (lexer output; keywords, Section 2.4) + * Parser "input" constants (lexer output; keywords, Section 2.4) */ MODULE_KW = 'module'; IMPORT_KW = 'import'; + SIG_KW = 'sig'; TYPE_KW = 'type'; PROTOCOL_KW = 'protocol'; + AS_KW = 'as'; + GLOBAL_KW = 'global'; LOCAL_KW = 'local'; EXPLICIT_KW = 'explicit'; AUX_KW = 'aux'; + ROLE_KW = 'role'; - ACCEPT_KW = 'accept'; SELF_KW = 'self'; - SIG_KW = 'sig'; - //INSTANTIATES_KW = 'instantiates'; - AS_KW = 'as'; - CONNECT_KW = 'connect'; - DISCONNECT_KW = 'disconnect'; - WRAP_KW = 'wrap'; FROM_KW = 'from'; TO_KW = 'to'; + CONNECT_KW = 'connect'; + WRAP_KW = 'wrap'; + + DISCONNECT_KW = 'disconnect'; + AND_KW = 'and'; + CHOICE_KW = 'choice'; AT_KW = 'at'; OR_KW = 'or'; + REC_KW = 'rec'; CONTINUE_KW = 'continue'; - //PAR_KW = 'par'; - AND_KW = 'and'; // Needed for disconnect - /*INTERRUPTIBLE_KW = 'interruptible'; - WITH_KW = 'with'; - BY_KW = 'by'; /* from for interrupts is more expected, but from is - not good for multiple roles (generally, the comma - in interrupt message list and role list looks like - "and" rather than "or") * / - THROWS_KW = 'throws'; - CATCHES_KW = 'catches';*/ DO_KW = 'do'; - //SPAWN_KW = 'spawn'; /* - * Parser output "node types" (corresponding to the various syntactic - * categories) i.e. the labels used to distinguish resulting AST nodes. - * The value of these token variables doesn't matter, only the token - * (i.e. variable) names themselves are used (for AST node root text - * field) + * Parser "output" node types (corresponding to the various syntactic + * categories), i.e. the labels used to distinguish resulting AST nodes. The + * specific value of these tokens doesn't matter (because not parsed + * themselves). */ - // Purely util constants -- not parsed as node types -- N.B. but are still "tokens" (FIXME: match with keywords) - - KIND_MESSAGESIGNATURE = 'KIND_MESSAGESIGNATURE'; - KIND_PAYLOADTYPE = 'KIND_PAYLOADTYPE'; - - - // "Node type" constants -- but not parsed "directly" by AntlrToScribParser - - //EMPTY_ALIAS = 'EMTPY_ALIAS'; - ////EMPTY_PACKAGENAME = '__empty_packagebame'; + // Special cases EMPTY_OPERATOR = 'EMPTY_OPERATOR'; - - //EMPTY_PARAMETERDECLLIST = '__empty_parameterdecllist'; - //EMPTY_ARGUMENTINSTANTIATIONLIST = '__empty_argumentinstantiationlist'; - - //NAME = 'name'; - AMBIGUOUSNAME = 'AMBIGUOUSNAME'; QUALIFIEDNAME = 'QUALIFIEDNAME'; // N.B. an intermediate node type, not an actual ScribNode -- "re-parsed" internally by parsePayloadElem/NonRoleArg // No relation to abstract AST class, QualifiedName - MODULENAME = 'MODULENAME'; - //PACKAGENAME = 'package-name'; - //FULLMODULENAME = 'full-module-name'; - //SIMPLEMEMBERNAME = 'simple-member-name'; - //QUALIFIEDMEMBERNAME = 'qualified-member-name'; + // Names + AMBIGUOUSNAME = 'AMBIGUOUSNAME'; + MODULENAME = 'MODULENAME'; + GPROTOCOLNAME = 'GPROTOCOLNAME'; + OPNAME = 'OPNAME'; + RECURSIONVAR = 'RECURSIONVAR'; + ROLENAME = 'ROLENAME'; + SIGNAME = 'SIGNAME'; + SIGPARAMNAME = 'SIGPARAMNAME'; // N.B. distinct from SIGNAME + TYPENAME = 'TYPENAME'; + TYPEPARAMNAME = 'TYPEPARAMNAME'; // N.B. distinct from TYPENAME - MESSAGESIGNATURE = 'MESSAGESIGNATURE'; - DELEGATION = 'DELEGATION'; - // "Node type" constants -- parsed "directly" by AntlrToScribParser - // TODO: split naming of type int constant from String label - - PAYLOAD = 'PAYLOAD'; - //PAYLOADELEMENT = 'payloadelement'; + // TODO: split naming of type int constant from String label ? - //MODULE = 'module'; // Probably a keyword clash MODULE = 'MODULE'; - //PACKAGEDECL = 'package-decl'; MODULEDECL = 'MODULEDECL'; - //IMPORTDECL = 'import-decl'; - //FROMIMPORTDECL = 'from-import-decl'; IMPORTMODULE = 'IMPORTMODULE'; - IMPORTMEMBER = 'IMPORTMEMBER'; + PAYLOADTYPEDECL = 'PAYLOADTYPEDECL'; MESSAGESIGNATUREDECL = 'MESSAGESIGNATUREDECL'; + + GLOBALPROTOCOLDECL = 'GLOBALPROTOCOLDECL'; + GLOBALPROTOCOLDECLMODS = 'GLOBALPROTOCOLDECLMODS'; + GLOBALPROTOCOLHEADER = 'GLOBALPROTOCOLHEADER'; + ROLEDECLLIST = 'ROLEDECLLIST'; ROLEDECL = 'ROLEDECL'; PARAMETERDECLLIST = 'PARAMETERDECLLIST'; - //PARAMETERDECL = 'PARAMETERDECL'; TYPEPARAMDECL = 'TYPEPARAMDECL'; SIGPARAMDECL = 'SIGPARAMDECL'; - ROLEINSTANTIATIONLIST = 'ROLEINSTANTIATIONLIST'; - ROLEINSTANTIATION = 'ROLEINSTANTIATION'; // FIXME: not consistent with arginstas/payloadeles - ARGUMENTINSTANTIATIONLIST = 'ARGUMENTINSTANTIATIONLIST'; // FIXME: token name inconsistent with class name (NonRoleArgList) - //ARGUMENTINSTANTIATION = 'ARGUMENTINSTANTIATION'; - //CONNECTDECL = 'connect-decl'; - - GLOBALPROTOCOLDECL = 'GLOBALPROTOCOLDECL'; - GLOBALPROTOCOLDECLMODS = 'GLOBALPROTOCOLDECLMODS'; - GLOBALPROTOCOLHEADER = 'GLOBALPROTOCOLHEADER'; + GLOBALPROTOCOLDEF = 'GLOBALPROTOCOLDEF'; GLOBALPROTOCOLBLOCK = 'GLOBALPROTOCOLBLOCK'; GLOBALINTERACTIONSEQUENCE = 'GLOBALINTERACTIONSEQUENCE'; + + MESSAGESIGNATURE = 'MESSAGESIGNATURE'; + PAYLOAD = 'PAYLOAD'; + UNARYPAYLOADELEM = 'UNARYPAYLOADELEM'; + DELEGATION = 'DELEGATION'; + GLOBALMESSAGETRANSFER = 'GLOBALMESSAGETRANSFER'; GLOBALCONNECT = 'GLOBALCONNECT'; - GLOBALDISCONNECT = 'GLOBALDISCONNECT'; GLOBALWRAP = 'GLOBALWRAP'; - GLOBALCHOICE = 'GLOBALCHOICE'; - GLOBALRECURSION = 'GLOBALRECURSION'; + GLOBALDISCONNECT = 'GLOBALDISCONNECT'; GLOBALCONTINUE = 'GLOBALCONTINUE'; GLOBALDO = 'GLOBALDO'; - - GPROTOCOLNAME = 'GPROTOCOLNAME'; - ROLENAME = 'ROLENAME'; - TYPEPARAMNAME = 'TYPEPARAMNAME'; - SIGPARAMNAME = 'SIGPARAMNAME'; - //ID = 'ID'; - OPNAME = 'OPNAME'; - RECURSIONVAR = 'RECURSIONVAR'; - TYPENAME = 'TYPENAME'; - SIGNAME = 'SIGNAME'; - - UNARYPAYLOADELEM = 'UNARYPAYLOADELEM'; + ROLEINSTANTIATIONLIST = 'ROLEINSTANTIATIONLIST'; + ROLEINSTANTIATION = 'ROLEINSTANTIATION'; // FIXME: not consistent with arginstas/payloadeles + ARGUMENTINSTANTIATIONLIST = 'ARGUMENTINSTANTIATIONLIST'; // FIXME: token name inconsistent with class name (NonRoleArgList) NONROLEARG = 'NONROLEARG'; + + GLOBALCHOICE = 'GLOBALCHOICE'; + GLOBALRECURSION = 'GLOBALRECURSION'; } @@ -366,12 +330,11 @@ LINE_COMMENT: */ IDENTIFIER: (LETTER | DIGIT | UNDERSCORE)* - /* Underscore currently can cause ambiguities in the API generation naming scheme - * But maybe only consecutive underscores are the problem - * -- cannot completely disallow underscores as needed for projection naming scheme + /* Underscore currently can cause ambiguities in the API generation naming + * scheme But maybe only consecutive underscores are the problem -- cannot + * completely disallow underscores as needed for projection naming scheme * Or disallow underscores only for role/op/messagesig names */ -// (LETTER | DIGIT)* ; fragment SYMBOL: @@ -409,39 +372,43 @@ fragment UNDERSCORE: * Section 3.1 Primitive Names */ -simplename: - IDENTIFIER -/*-> - ^(SIMPLENAME IDENTIFIER)*/ -; -//annotationname: simplename; + +simplename: IDENTIFIER; + parametername: simplename; recursionvarname: simplename; rolename: simplename; scopename: simplename; -ambiguousname: - simplename +simpleprotocolname: simplename; +simplemembername: simplename; // Only for member declarations + +ambiguousname: simplename -> ^(AMBIGUOUSNAME simplename); + +simplemodulename: IDENTIFIER -> ^(MODULENAME IDENTIFIER) ; + +simplepayloadtypename: IDENTIFIER -> ^(TYPENAME IDENTIFIER) ; // TODO factor out with typedecl? NO: params distinct from "literals" +simplemessagesignaturename: IDENTIFIER -> ^(SIGNAME IDENTIFIER) ; + // TODO factor out with sigparamdecl? NO: params distinct from "literals" + +rolenamenode: rolename -> ^(ROLENAME rolename) ; +recursionvarnamenode: recursionvarname -> ^(RECURSIONVAR recursionvarname) ; + +typeparamname: + parametername -> - ^(AMBIGUOUSNAME simplename) -; + ^(TYPEPARAMNAME parametername) ; +sigparamname: + parametername +-> + ^(SIGPARAMNAME parametername) ; /** * Section 3.2.1 Package, Module and Module Member Names */ -//simplemodulename: simplename; -//simplepayloadtypename: simplename; -//simplemessagesignaturename: simplename; -simpleprotocolname: simplename; -simplemembername: simplename; // Only for member declarations - -// FIXME TODO: do for all other relevant names -//gprotocolname: simplename; - - qualifiedname: IDENTIFIER ('.' IDENTIFIER)* -> @@ -449,7 +416,6 @@ qualifiedname: ; packagename: qualifiedname; -//modulename: qualifiedname; membername: qualifiedname; modulename: @@ -457,12 +423,9 @@ modulename: -> ^(MODULENAME IDENTIFIER+) ; -// ^(MODULENAME ^(ID IDENTIFIER)+) - protocolname: membername; payloadtypename: membername; -//messagesignaturename: membername; messagesignaturename: IDENTIFIER ('.' IDENTIFIER)* @@ -484,8 +447,6 @@ module: /** * Section 3.2.3 Module Declarations */ -// MODULE_KW IDENTIFIER ('.' IDENTIFIER)* ';' -// ^(MODULEDECL IDENTIFIER+) moduledecl: MODULE_KW modulename ';' -> @@ -498,8 +459,6 @@ moduledecl: */ importdecl: importmodule -/*| - importmember*/ ; importmodule: @@ -512,22 +471,6 @@ importmodule: ^(IMPORTMODULE modulename simplemodulename) ; -simplemodulename: - IDENTIFIER --> - ^(MODULENAME IDENTIFIER) -; - -/*importmember: - FROM_KW modulename IMPORT_KW simplemembername ';' --> - ^(IMPORTMEMBER modulename simplemembername EMPTY_ALIAS) -| - FROM_KW modulename IMPORT_KW simplemembername AS_KW simplemembername ';' --> - ^(IMPORTMEMBER modulename simplemembername simplemembername) -;*/ - /** * //Section 3.4 Payload Type Declarations @@ -546,12 +489,6 @@ payloadtypedecl: ; // alias first to be uniform with other NameDeclNode (getRawNameNodeChild) -simplepayloadtypename: - IDENTIFIER --> - ^(TYPENAME IDENTIFIER) // TODO factor out with typedecl? NO: params distinct from "literals" -; - messagesignaturedecl: SIG_KW '<' IDENTIFIER '>' EXTIDENTIFIER FROM_KW EXTIDENTIFIER AS_KW simplemessagesignaturename ';' -> @@ -559,11 +496,6 @@ messagesignaturedecl: ; // alias first to be uniform with other NameDeclNode (getRawNameNodeChild) -simplemessagesignaturename: - IDENTIFIER --> - ^(SIGNAME IDENTIFIER) // TODO factor out with sigparamdecl? NO: params distinct from "literals" -; /** @@ -695,17 +627,17 @@ parameterdecl: // cf. roledecl typedecl: - TYPE_KW parametername + TYPE_KW typeparamname -> - ^(TYPEPARAMDECL ^(TYPEPARAMNAME parametername)) + ^(TYPEPARAMDECL typeparamname) ; // FIXME: should be a nonroleparamnode // cf. roledecl sigdecl: - SIG_KW parametername + SIG_KW sigparamname -> - ^(SIGPARAMDECL ^(SIGPARAMNAME parametername)) + ^(SIGPARAMDECL sigparamname) ; @@ -771,12 +703,6 @@ globalmessagetransfer: ; // TODO: multisend -rolenamenode: - rolename --> - ^(ROLENAME rolename) -; - message: messagesignature | @@ -845,11 +771,6 @@ globalrecursion: ^(GLOBALRECURSION recursionvarnamenode globalprotocolblock) ; -recursionvarnamenode: - recursionvarname --> - ^(RECURSIONVAR recursionvarname) -; globalcontinue: CONTINUE_KW recursionvarnamenode ';' diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 5888ab623..2239612d6 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -85,11 +85,12 @@ module tmp.Test; type "..." from "..." as T; -global protocol Proto1(role A, role B) +global protocol Proto1(role A, role B) { //1() from A to B; //1(Test.T) from A to B; 1(T) from A to B; + M from B to A; //do Proto1(A, B); } From 26067d19bd89379d71c1d74aeaf3b74eb90f7bf2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Apr 2019 18:55:41 +0100 Subject: [PATCH 260/539] Continued: WIP refactoring simple name node parsing. --- .../ast/name/simple/AmbigNameNode.java | 9 +- .../org/scribble/ast/name/simple/OpNode.java | 7 + .../scribble/ast/name/simple/RecVarNode.java | 13 +- .../scribble/ast/name/simple/RoleNode.java | 19 ++- .../ast/name/simple/SigParamNode.java | 7 + .../ast/name/simple/SimpleNameNode.java | 29 +++++ .../ast/name/simple/TypeParamNode.java | 7 + .../scribble/del/HeaderParamDeclListDel.java | 2 +- .../del/name/simple/AmbigNameNodeDel.java | 28 +++- .../org/scribble/parser/antlr/Scribble.g | 122 ++++++++++-------- .../parser/scribble/ScribTreeAdaptor.java | 27 ++-- scribble-test/src/test/scrib/tmp/Test.scr | 14 ++ 12 files changed, 194 insertions(+), 90 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index 428bb7b28..1277d4d50 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -38,6 +38,13 @@ public AmbigNameNode(Token t) super(t); } + // Scribble.g, IDENTIFIER[$IDENTIFIER] + public AmbigNameNode(int ttype, Token t) + { + this(t); + System.out.println("AAAAAA: " + ttype + " ,, "+ t + " ,, " + t.getType() + " ,, " + toName()); + } + // Tree#dupNode constructor protected AmbigNameNode(AmbigNameNode node)//, String id) { @@ -47,7 +54,7 @@ protected AmbigNameNode(AmbigNameNode node)//, String id) @Override public AmbigNameNode dupNode() { - return new AmbigNameNode(this);//, getIdentifier()); + return new AmbigNameNode(this); } /*@Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java index ea8433bb5..2bd0771d7 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java @@ -28,6 +28,13 @@ public OpNode(Token t) super(t); } + // Scribble.g, IDENTIFIER[$IDENTIFIER] + public OpNode(int ttype, Token t) + { + this(t); + System.out.println("OOOOO: " + ttype + " ,, "+ t + " ,, " + t.getType() + " ,, " + toName()); + } + // Tree#dupNode constructor protected OpNode(OpNode node) { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java index e49fdbfe2..ea71888a5 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java @@ -25,6 +25,13 @@ public RecVarNode(Token t) super(t); } + // Scribble.g, IDENTIFIER[$IDENTIFIER] + public RecVarNode(int ttype, Token t) + { + this(t); + System.out.println("VVVV: " + ttype + " ,, "+ t + " ,, " + t.getType()); + } + // Tree#dupNode constructor protected RecVarNode(RecVarNode node) { @@ -37,12 +44,6 @@ public RecVarNode dupNode() return new RecVarNode(this); } - /*@Override - public RecVarNode clone() - { - return (RecVarNode) super.clone(); - }*/ - @Override public RecVar toName() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java index 213e09a7d..254637ab4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java @@ -18,7 +18,6 @@ import org.scribble.ast.ScribNode; import org.scribble.core.type.kind.RoleKind; import org.scribble.core.type.name.Role; -import org.scribble.del.ScribDel; public class RoleNode extends SimpleNameNode implements DoArgNode // RoleDecl, RoleInstantiation @@ -29,6 +28,13 @@ public RoleNode(Token t) super(t); } + // Scribble.g, IDENTIFIER[$IDENTIFIER] + public RoleNode(int ttype, Token t) + { + this(t); + System.out.println("RRRRR: " + ttype + " ,, "+ t + " ,, " + t.getType() + " ,, " + toName()); + } + // Tree#dupNode constructor protected RoleNode(RoleNode node)//, String id) { @@ -38,14 +44,8 @@ protected RoleNode(RoleNode node)//, String id) @Override public RoleNode dupNode() { - return new RoleNode(this);//, getIdentifier()); + return new RoleNode(this); } - - /*@Override - public RoleNode clone() - { - return (RoleNode) super.clone(); - }*/ // RoleNode is the only NameNode with a reconstruct (so not factored up) protected RoleNode reconstruct(String id) @@ -53,8 +53,7 @@ protected RoleNode reconstruct(String id) ScribNode n = getChild(0); // TODO: factor out (ID -- currently ambignamenode?) RoleNode r = dupNode(); r.addChild(n); - ScribDel del = del(); // Default delegate assigned in ModelFactoryImpl for all simple names - r.setDel(del); // No copy + r.setDel(del()); // No copy // Default delegate assigned in ModelFactoryImpl for all simple names return r; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java index ef00a158d..8b1316f04 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java @@ -27,6 +27,13 @@ public SigParamNode(Token t) super(t, SigKind.KIND); } + // Scribble.g, IDENTIFIER[$IDENTIFIER] + public SigParamNode(int ttype, Token t) + { + this(t); + System.out.println("SSSS: " + ttype + " ,, "+ t + " ,, " + t.getType() + " ,, " + toName()); + } + // Tree#dupNode constructor protected SigParamNode(SigParamNode node)//, String id) { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java index d20522f86..b7136661a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java @@ -13,6 +13,10 @@ */ package org.scribble.ast.name.simple; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import org.antlr.runtime.Token; import org.scribble.ast.name.NameNode; import org.scribble.core.type.kind.Kind; @@ -33,8 +37,33 @@ protected SimpleNameNode(SimpleNameNode node)//, String id) super(node); } + @Override + protected String getLastElement() + { + return this.token.getText(); + } + + @Override public String getText() { return getLastElement(); // i.e., second child element, after node type } + + @Override + protected List getSimpleNameList() + { + return Stream.of(getText()).collect(Collectors.toList()); + } + + @Override + public String[] getElements() + { + return getSimpleNameList().toArray(new String[0]); + } + + @Override + protected String[] getPrefixElements() + { + return new String[0]; + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java index 9f88591c9..df5f08aa0 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java @@ -28,6 +28,13 @@ public TypeParamNode(Token t) super(t, DataTypeKind.KIND); } + // Scribble.g, IDENTIFIER[$IDENTIFIER] + public TypeParamNode(int ttype, Token t) + { + this(t); + System.out.println("TTTT: " + ttype + " ,, "+ t + " ,, " + t.getType() + " ,, " + toName()); + } + // Tree#dupNode constructor protected TypeParamNode(TypeParamNode node)//, String id) { diff --git a/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java b/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java index b2ed5c24d..406579179 100644 --- a/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java @@ -36,7 +36,7 @@ public HeaderParamDeclList leaveDisambiguation(ScribNode child, HeaderParamDeclList pdl = (HeaderParamDeclList) visited; List> decls = pdl.getParamDeclChildren(); // grammar enforces RoleDeclList size > 0 - if (decls.size() != decls.stream().map((d) -> d.getDeclName()).distinct() + if (decls.size() != decls.stream().map(d -> d.getDeclName()).distinct() .count()) { throw new ScribException(pdl.getSource(), diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java index 1b6feedb8..6e7e96a6b 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java @@ -13,12 +13,14 @@ */ package org.scribble.del.name.simple; +import org.antlr.runtime.CommonToken; import org.scribble.ast.MessageTransfer; import org.scribble.ast.PayloadElem; import org.scribble.ast.ScribNode; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.SigParamNode; import org.scribble.ast.name.simple.TypeParamNode; import org.scribble.core.lang.context.ModuleContext; @@ -57,8 +59,13 @@ public ScribNode leaveDisambiguation(ScribNode child, } /*return disamb.job.config.af.QualifiedNameNode(ann.getSource(), DataTypeKind.KIND, name.getElements());*/ - DataTypeNode res = new DataTypeNode(ann.token); // CHECKME: what should the Token be? - res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? + + //DataTypeNode res = new DataTypeNode(ann.token); // CHECKME: what should the Token be? + DataTypeNode res = new DataTypeNode(new CommonToken(73, "TYPENAME")); // FIXME: use af + + //res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? + res.addChild(new IdNode(ann.token)); + return res; } else if (mcontext.isMessageSigNameVisible(name.toMessageSigName())) @@ -70,8 +77,13 @@ else if (mcontext.isMessageSigNameVisible(name.toMessageSigName())) } /*return disamb.job.config.af.QualifiedNameNode(ann.getSource(), SigKind.KIND, name.getElements());*/ - MessageSigNameNode res = new MessageSigNameNode(ann.token); // CHECME: what should the Token be? - res.addChildren(ann.getChildren()); + + //MessageSigNameNode res = new MessageSigNameNode(ann.token); // CHECME: what should the Token be? + MessageSigNameNode res = new MessageSigNameNode(new CommonToken(67, "SIGNAME")); // FIXME: use af + + //res.addChildren(ann.getChildren()); + res.addChild(new IdNode(ann.token)); + return res; } else if (disamb.isBoundParameter(name)) @@ -82,13 +94,17 @@ else if (disamb.isBoundParameter(name)) if (kind.equals(DataTypeKind.KIND)) { TypeParamNode res = new TypeParamNode(ann.token); // CHECKME: what should the Token be? - res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? + + //res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? + return res; } else if (kind.equals(SigKind.KIND)) { SigParamNode res = new SigParamNode(ann.token); // CHECKME: what should the Token be? - res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? + + //res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? + return res; } } diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 2c73d139c..3b6bbef0e 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -94,6 +94,7 @@ tokens // "Node type" constants -- parsed "directly" by AntlrToScribParser // TODO: split naming of type int constant from String label ? + // TODO: split imaginary node types MODULE = 'MODULE'; MODULEDECL = 'MODULEDECL'; @@ -151,6 +152,9 @@ tokens import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.AmbigNameNode; + import org.scribble.ast.name.simple.RecVarNode; + import org.scribble.ast.name.simple.*; + import org.scribble.ast.*; } @lexer::header @@ -230,9 +234,11 @@ tokens // Similarly to NonRoleArg: cannot syntactically distinguish right now between SimplePayloadTypeNode and ParameterNode String text = qn.getChild(0).getText(); IdNode id = new IdNode(new CommonToken(IDENTIFIER, text)); - AmbigNameNode an = + /*AmbigNameNode an = new AmbigNameNode(new CommonToken(AMBIGUOUSNAME, "AMBIGUOUSNAME")); - an.addChild(id); + an.addChild(id);*/ + AmbigNameNode an = + new AmbigNameNode(AMBIGUOUSNAME, new CommonToken(IDENTIFIER, text)); UnaryPayloadElem e = new UnaryPayloadElem( new CommonToken(UNARYPAYLOADELEM, "UNARYPAYLOADELEM")); e.addChild(an); @@ -258,9 +264,11 @@ tokens { String text = qn.getChild(0).getText(); IdNode id = new IdNode(new CommonToken(IDENTIFIER, text)); - AmbigNameNode an = + /*AmbigNameNode an = new AmbigNameNode(new CommonToken(AMBIGUOUSNAME, "AMBIGUOUSNAME")); - an.addChild(id); + an.addChild(id);*/ + AmbigNameNode an = + new AmbigNameNode(AMBIGUOUSNAME, new CommonToken(IDENTIFIER, text)); NonRoleArg a = new NonRoleArg(new CommonToken(NONROLEARG, "NONROLEARG")); a.addChild(an); return a; @@ -377,32 +385,47 @@ fragment UNDERSCORE: simplename: IDENTIFIER; parametername: simplename; -recursionvarname: simplename; + +//simplename; +recursionvarname: + IDENTIFIER +; +// IDENTIFIER^ + + rolename: simplename; scopename: simplename; - simpleprotocolname: simplename; simplemembername: simplename; // Only for member declarations -ambiguousname: simplename -> ^(AMBIGUOUSNAME simplename); +//rolenamenode: rolename -> ^(ROLENAME rolename) ; +//recursionvarnamenode: recursionvarname -> ^(RECURSIONVAR recursionvarname) ; +//ambiguousnamenode: simplename -> ^(AMBIGUOUSNAME simplename); +//opnamenode: IDENTIFIER -> ^(OPNAME IDENTIFIER) ; +//typeparamname: parametername -> ^(TYPEPARAMNAME parametername) ; +//sigparamname: parametername -> ^(SIGPARAMNAME parametername) ; + +//emptyopnamenode: ^(OPNAME EMPTY_OPERATOR); // FIXME: can't seem to use this "out of nowhere" in rewrite rules + +// "The TreeAdaptor is not called; instead for constructors are invoked directly." +// "Note that parameters are not allowed on token references to the left of ->:" +// "Use imaginary nodes as you normally would, but with the addition of the node type:" // Pointless? token itself unchanged and ttype int ends up unused +rolenamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER] ; +recursionvarnamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; +ambiguousnamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; +opnamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; +//emptyopnamenode: IDENTIFIER[EMPTY_OPERATOR]; // empty "left" of rewrite not allowed +typeparamname: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; +sigparamname: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; -simplemodulename: IDENTIFIER -> ^(MODULENAME IDENTIFIER) ; -simplepayloadtypename: IDENTIFIER -> ^(TYPENAME IDENTIFIER) ; // TODO factor out with typedecl? NO: params distinct from "literals" +// Using qualified to rep simple +simplemodulename: IDENTIFIER -> ^(MODULENAME IDENTIFIER) ; +simplepayloadtypename: IDENTIFIER -> ^(TYPENAME IDENTIFIER) ; + // TODO factor out with typedecl? NO: params distinct from "literals" simplemessagesignaturename: IDENTIFIER -> ^(SIGNAME IDENTIFIER) ; // TODO factor out with sigparamdecl? NO: params distinct from "literals" -rolenamenode: rolename -> ^(ROLENAME rolename) ; -recursionvarnamenode: recursionvarname -> ^(RECURSIONVAR recursionvarname) ; - -typeparamname: - parametername --> - ^(TYPEPARAMNAME parametername) ; -sigparamname: - parametername --> - ^(SIGPARAMNAME parametername) ; /** @@ -433,10 +456,17 @@ messagesignaturename: ^(SIGNAME IDENTIFIER+) ; +gprotocolnamenode: + IDENTIFIER ('.' IDENTIFIER)* + -> + ^(GPROTOCOLNAME IDENTIFIER+) +; + /** * Section 3.2.2 Top-level Module Structure */ +// "References to tokens with rewrite not found on left of -> are imaginary tokens." module: moduledecl importdecl* datatypedecl* protocoldecl* EOF -> @@ -447,11 +477,18 @@ module: /** * Section 3.2.3 Module Declarations */ +moduledecl: + t=MODULE_KW modulename ';' +-> + ^(MODULEDECL[$t] modulename) // TODO: add token arg to other imag nodes +; +/* moduledecl: MODULE_KW modulename ';' -> - ^(MODULEDECL modulename) + MODULE_KW^ modulename // FIXME CHECKME: why not working? ; +*/ /** @@ -511,17 +548,17 @@ messagesignature: ^(MESSAGESIGNATURE ^(OPNAME EMPTY_OPERATOR) payload) | //messageoperator '(' payload ')' // Doesn't work (conflict with IDENTIFIER?) - IDENTIFIER '(' payload ')' + opnamenode '(' payload ')' -> - ^(MESSAGESIGNATURE ^(OPNAME IDENTIFIER) payload) + ^(MESSAGESIGNATURE opnamenode payload) | '(' ')' -> ^(MESSAGESIGNATURE ^(OPNAME EMPTY_OPERATOR) ^(PAYLOAD)) | - IDENTIFIER '(' ')' + opnamenode '(' ')' -> - ^(MESSAGESIGNATURE ^(OPNAME IDENTIFIER) ^(PAYLOAD)) + ^(MESSAGESIGNATURE opnamenode ^(PAYLOAD)) ; payload: @@ -532,9 +569,7 @@ payload: // Payload type names need disambiguation pass (also do args) payloadelement: -/* ambiguousname // Parser doesn't distinguish simple from qualified properly, even with backtrack -|*/ - qualifiedname // This case subsumes simple names // FIXME: make ambiguousqualifiedname (or ambiguousname should just be qualified) + qualifiedname // This case subsumes simple names // FIXME: make ambiguousqualifiedname (or ambiguousnamenode should just be qualified) -> { parsePayloadElem($qualifiedname.tree) } // Use ".text" instead of ".tree" for token String | @@ -592,11 +627,6 @@ globalprotocolheader: ; // GLOBAL_KW PROTOCOL_KW simpleprotocolname parameterdecllist roledecllist -gprotocolnamenode: - IDENTIFIER ('.' IDENTIFIER)* - -> - ^(GPROTOCOLNAME IDENTIFIER+) -; /* gprotocolname -> ^(GPROTOCOLNAME gprotocolname)*/ @@ -608,10 +638,11 @@ roledecllist: ; roledecl: - ROLE_KW rolename + ROLE_KW rolenamenode -> - ^(ROLEDECL ^(ROLENAME rolename)) + ^(ROLEDECL rolenamenode) ; +// ^(ROLEDECL ^(ROLENAME rolename)) parameterdecllist: '<' parameterdecl (',' parameterdecl)* '>' @@ -706,13 +737,9 @@ globalmessagetransfer: message: messagesignature | - ambiguousname + ambiguousnamenode ; -/*// FIXME TODO: qualified (messagesig) names -| - messagesignaturename // qualified messagesignaturename subsumes parametername case -| - parametername*/ +// FIXME TODO: qualified (messagesig) names // although qualified messagesignaturename subsumes parametername case globalconnect: //message CONNECT_KW rolename TO_KW rolename @@ -725,18 +752,7 @@ globalconnect: -> ^(GLOBALCONNECT message rolenamenode rolenamenode) ; -/* '(' connectdecl (',' connectdecl)* ')' --> - ^(CONNECTDECLLIST connectdecl+) -;* / - '(' connectdecl ')' -*/ -/*connectdecl: - CONNECT_KW rolename '->>' rolename --> - ^(CONNECTDECL rolename rolename) -;*/ globaldisconnect: DISCONNECT_KW rolenamenode AND_KW rolenamenode ';' @@ -817,8 +833,6 @@ argumentinstantiation: messagesignature -> ^(NONROLEARG messagesignature) -/*| - ambiguousname // As for payloadelement: parser doesn't distinguish simple from qualified properly, even with backtrack*/ | qualifiedname -> diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index dde5215fc..2b3bd5049 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -85,29 +85,37 @@ public ScribNode create(Token t) // Previously: String tname = t.getText(); -- by convention of Scribble.g, type constant name given as node text, e.g., module: ... -> ^(MODULE ...) switch (t.getType()) { + case ScribbleParser.IDENTIFIER: return new IdNode(t); + case ScribbleParser.EXTIDENTIFIER: return new IdNode(t); // CHECKME: OK? + + /*case ScribbleParser.ROLENAME: return new RoleNode(t); + case ScribbleParser.TYPEPARAMNAME: return new TypeParamNode(t); + case ScribbleParser.SIGPARAMNAME: return new SigParamNode(t); + case ScribbleParser.AMBIGUOUSNAME: return new AmbigNameNode(t);*/ + + case ScribbleParser.OPNAME: return new OpNode(t); // FIXME: empty special case + + case ScribbleParser.TYPENAME: return new DataTypeNode(t); + case ScribbleParser.SIGNAME: return new MessageSigNameNode(t); + case ScribbleParser.MODULENAME: return new ModuleNameNode(t); + case ScribbleParser.GPROTOCOLNAME: return new GProtocolNameNode(t); + case ScribbleParser.MODULE: return new Module(t); case ScribbleParser.MODULEDECL: return new ModuleDecl(t); - case ScribbleParser.MODULENAME: return new ModuleNameNode(t); case ScribbleParser.IMPORTMODULE: return new ImportModule(t); case ScribbleParser.PAYLOADTYPEDECL: return new DataTypeDecl(t); case ScribbleParser.MESSAGESIGNATUREDECL: return new MessageSigNameDecl(t); - case ScribbleParser.TYPENAME: return new DataTypeNode(t); - case ScribbleParser.SIGNAME: return new MessageSigNameNode(t); case ScribbleParser.GLOBALPROTOCOLDECL: return new GProtocolDecl(t); case ScribbleParser.GLOBALPROTOCOLDECLMODS: return new ProtocolModList(t); case ScribbleParser.AUX_KW: return new AuxMod(t); // FIXME: KW being used directly case ScribbleParser.EXPLICIT_KW: return new ExplicitMod(t); case ScribbleParser.GLOBALPROTOCOLHEADER: return new GProtocolHeader(t); - case ScribbleParser.GPROTOCOLNAME: return new GProtocolNameNode(t); case ScribbleParser.ROLEDECLLIST: return new RoleDeclList(t); case ScribbleParser.ROLEDECL: return new RoleDecl(t); - case ScribbleParser.ROLENAME: return new RoleNode(t); case ScribbleParser.PARAMETERDECLLIST: return new NonRoleParamDeclList(t); case ScribbleParser.TYPEPARAMDECL: return new TypeParamDecl(t); - case ScribbleParser.TYPEPARAMNAME: return new TypeParamNode(t); case ScribbleParser.SIGPARAMDECL: return new SigParamDecl(t); - case ScribbleParser.SIGPARAMNAME: return new SigParamNode(t); case ScribbleParser.GLOBALPROTOCOLDEF: return new GProtocolDef(t); case ScribbleParser.GLOBALPROTOCOLBLOCK: return new GProtocolBlock(t); case ScribbleParser.GLOBALINTERACTIONSEQUENCE: return new GInteractionSeq(t); @@ -122,17 +130,12 @@ public ScribNode create(Token t) case ScribbleParser.RECURSIONVAR: return new RecVarNode(t); case ScribbleParser.MESSAGESIGNATURE: return new MessageSigNode(t); - case ScribbleParser.OPNAME: return new OpNode(t); case ScribbleParser.PAYLOAD: return new PayloadElemList(t); // N.B. UnaryPayloadElem parsed "manually" in Scribble.g case ScribbleParser.ROLEINSTANTIATIONLIST: return new RoleArgList(t); case ScribbleParser.ROLEINSTANTIATION: return new RoleArg(t); case ScribbleParser.ARGUMENTINSTANTIATIONLIST: return new NonRoleArgList(t); case ScribbleParser.NONROLEARG: return new NonRoleArg(t); // Only for messagesignature -- qualifiedname (datatypenode or ambignamenode) done "manually" in scribble.g (cf. UnaryPayloadElem) - case ScribbleParser.AMBIGUOUSNAME: return new AmbigNameNode(t); - - case ScribbleParser.IDENTIFIER: return new IdNode(t); - case ScribbleParser.EXTIDENTIFIER: return new IdNode(t); // CHECKME: OK? // Special cases case ScribbleParser.EMPTY_OPERATOR: return new IdNode(t); // OpNode.toName checks IdNode child text for OpNode.EMPTY_OP_ID // CHECKME refactor? diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 2239612d6..ab2607e1b 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -85,14 +85,28 @@ module tmp.Test; type "..." from "..." as T; + +global protocol Proto1(role A, role B) +{ + rec X + { + 1(T) from A to B; + continue X; + } +} +/* global protocol Proto1(role A, role B) { + rec X { //1() from A to B; //1(Test.T) from A to B; 1(T) from A to B; M from B to A; //do Proto1(A, B); + continue X; + } } +//*/ /* From 3bb9ed344aac6388528d2fe4263c9be289b483c3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Apr 2019 19:01:01 +0100 Subject: [PATCH 261/539] Continued: WIP refactoring simple name node parsing. --- .../java/org/scribble/ast/name/simple/SimpleNameNode.java | 4 ++-- .../src/main/antlr3/org/scribble/parser/antlr/Scribble.g | 8 ++++---- .../org/scribble/parser/scribble/ScribTreeAdaptor.java | 8 +++++--- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java index b7136661a..da08b16ea 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java @@ -32,7 +32,7 @@ public SimpleNameNode(Token t) } // Tree#dupNode constructor - protected SimpleNameNode(SimpleNameNode node)//, String id) + protected SimpleNameNode(SimpleNameNode node) { super(node); } @@ -46,7 +46,7 @@ protected String getLastElement() @Override public String getText() { - return getLastElement(); // i.e., second child element, after node type + return getLastElement(); } @Override diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 3b6bbef0e..ca81997fa 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -405,7 +405,7 @@ simplemembername: simplename; // Only for member declarations //typeparamname: parametername -> ^(TYPEPARAMNAME parametername) ; //sigparamname: parametername -> ^(SIGPARAMNAME parametername) ; -//emptyopnamenode: ^(OPNAME EMPTY_OPERATOR); // FIXME: can't seem to use this "out of nowhere" in rewrite rules +//emptyopnamenode: ^(EMPTY_OPERATOR); // simp name nodes use token text for id value // FIXME: can't seem to use this "out of nowhere" in rewrite rules // "The TreeAdaptor is not called; instead for constructors are invoked directly." // "Note that parameters are not allowed on token references to the left of ->:" @@ -545,7 +545,7 @@ messagesignaturedecl: messagesignature: '(' payload ')' -> - ^(MESSAGESIGNATURE ^(OPNAME EMPTY_OPERATOR) payload) + ^(MESSAGESIGNATURE ^(EMPTY_OPERATOR) payload) | //messageoperator '(' payload ')' // Doesn't work (conflict with IDENTIFIER?) opnamenode '(' payload ')' @@ -554,7 +554,7 @@ messagesignature: | '(' ')' -> - ^(MESSAGESIGNATURE ^(OPNAME EMPTY_OPERATOR) ^(PAYLOAD)) + ^(MESSAGESIGNATURE ^(EMPTY_OPERATOR) ^(PAYLOAD)) | opnamenode '(' ')' -> @@ -745,7 +745,7 @@ globalconnect: //message CONNECT_KW rolename TO_KW rolename CONNECT_KW rolenamenode TO_KW rolenamenode ';' -> - ^(GLOBALCONNECT ^(MESSAGESIGNATURE ^(OPNAME EMPTY_OPERATOR) ^(PAYLOAD)) rolenamenode rolenamenode) // cf. messagesignature "()" case + ^(GLOBALCONNECT ^(MESSAGESIGNATURE ^(EMPTY_OPERATOR) ^(PAYLOAD)) rolenamenode rolenamenode) // cf. messagesignature "()" case // CHECKME: require "()" as for message transfers? i.e., simply delete this rule? | message CONNECT_KW rolenamenode TO_KW rolenamenode ';' diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 2b3bd5049..323a18674 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -92,8 +92,7 @@ public ScribNode create(Token t) case ScribbleParser.TYPEPARAMNAME: return new TypeParamNode(t); case ScribbleParser.SIGPARAMNAME: return new SigParamNode(t); case ScribbleParser.AMBIGUOUSNAME: return new AmbigNameNode(t);*/ - - case ScribbleParser.OPNAME: return new OpNode(t); // FIXME: empty special case + //case ScribbleParser.OPNAME: return new OpNode(t); // FIXME: empty special case case ScribbleParser.TYPENAME: return new DataTypeNode(t); case ScribbleParser.SIGNAME: return new MessageSigNameNode(t); @@ -138,7 +137,10 @@ public ScribNode create(Token t) case ScribbleParser.NONROLEARG: return new NonRoleArg(t); // Only for messagesignature -- qualifiedname (datatypenode or ambignamenode) done "manually" in scribble.g (cf. UnaryPayloadElem) // Special cases - case ScribbleParser.EMPTY_OPERATOR: return new IdNode(t); // OpNode.toName checks IdNode child text for OpNode.EMPTY_OP_ID // CHECKME refactor? + case ScribbleParser.EMPTY_OPERATOR: + //return new IdNode(t); // OpNode.toName checks IdNode child text for OpNode.EMPTY_OP_ID // CHECKME refactor? + return new OpNode(t); + case ScribbleParser.QUALIFIEDNAME: return new IdNode(t); // Returns an IdNode whose token is "QUALIFIEDNAME", and whose children are the IdNode elements of the qualified name // (Using IdNode as a "shell", but "token type" determined by t -- a bit misleading, IdNode here not an actual IDENTIFIER -- CHECKME: make a proper QUALIFIEDNAME?) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index ab2607e1b..0c39579d8 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -90,7 +90,7 @@ global protocol Proto1(role A, role B) { rec X { - 1(T) from A to B; + () from A to B; continue X; } } From 789e38af41c6e470228fdfb5dfb08c25a1380c62 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Apr 2019 23:00:34 +0100 Subject: [PATCH 262/539] Continued: WIP refactoring name node parsing. --- .../java/org/scribble/ast/AstFactory.java | 25 +- .../org/scribble/ast/DirectedInteraction.java | 2 +- .../main/java/org/scribble/ast/DoArgList.java | 6 +- .../java/org/scribble/ast/ImportDecl.java | 16 +- .../java/org/scribble/ast/NonRoleArgList.java | 4 +- .../main/java/org/scribble/ast/ScribNil.java | 6 +- .../main/java/org/scribble/ast/ScribNode.java | 8 +- .../java/org/scribble/ast/ScribNodeBase.java | 14 +- .../java/org/scribble/ast/global/GChoice.java | 2 +- .../java/org/scribble/ast/name/NameNode.java | 42 ++- .../ast/name/qualified/MemberNameNode.java | 11 +- .../ast/name/qualified/ModuleNameNode.java | 4 +- .../ast/name/qualified/ProtocolNameNode.java | 2 +- .../ast/name/simple/AmbigNameNode.java | 29 +- .../org/scribble/ast/name/simple/IdNode.java | 2 +- .../ast/name/simple/NonRoleParamNode.java | 113 +------- .../org/scribble/ast/name/simple/OpNode.java | 10 +- .../scribble/ast/name/simple/RecVarNode.java | 12 +- .../scribble/ast/name/simple/RoleNode.java | 26 +- .../ast/name/simple/SigParamNode.java | 22 +- .../ast/name/simple/SimpleNameNode.java | 27 +- .../ast/name/simple/TypeParamNode.java | 19 +- .../org/scribble/del/NonRoleArgListDel.java | 16 +- .../del/name/simple/AmbigNameNodeDel.java | 24 +- .../scribble/util/AntlrSourceException.java | 2 +- .../org/scribble/parser/antlr/Scribble.g | 21 +- .../parser/scribble/AstFactoryImpl.java | 255 ++++++++---------- .../parser/scribble/ScribTreeAdaptor.java | 35 +-- scribble-test/src/test/scrib/tmp/Test.scr | 3 + 29 files changed, 274 insertions(+), 484 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 122272d75..636542a38 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -30,7 +30,6 @@ import org.scribble.ast.global.GRecursion; import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GWrap; -import org.scribble.ast.name.NameNode; import org.scribble.ast.name.PayloadElemNameNode; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.qualified.GProtocolNameNode; @@ -43,16 +42,30 @@ import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ast.name.simple.SigParamNode; +import org.scribble.ast.name.simple.TypeParamNode; import org.scribble.core.type.kind.Kind; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.PayloadTypeKind; +// AstFactory is for making "fresh" nodes ("fresh" Tokens) -- cf. reconstruct (for Token preservation) // Implementations located in scribble-parser, use ScribbleParser for Token construction // Currently, used only in relatively niche places (since ANTLR now constructs all parsed nodes "directly") public interface AstFactory { IdNode IdNode(String id); + + // Deprecate? Never need to make ambigname "manually" via af? (only constructed by ScribbleParser) + AmbigNameNode AmbiguousNameNode(String text); + OpNode OpNode(String text); + RecVarNode RecVarNode(String text); + RoleNode RoleNode(String text); + SigParamNode SigParamNode(String text); + TypeParamNode TypeParamNode(String text); + + QualifiedNameNode QualifiedNameNode(K kind, + List elems); Module Module(ModuleDecl mdecl, List> imports, List> data, @@ -130,16 +143,6 @@ GDo GDo(RoleArgList rs, NonRoleArgList args, NonRoleArgList NonRoleArgList(List args); NonRoleArg NonRoleArg(NonRoleArgNode arg); - - NameNode SimpleNameNode(K kind, IdNode id); - - QualifiedNameNode QualifiedNameNode(K kind, - List elems); - - AmbigNameNode AmbiguousNameNode(IdNode id); - - NonRoleParamNode NonRoleParamNode( - K kind, String id); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java index 4ee1008ff..95c6d130b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java @@ -55,7 +55,7 @@ public RoleNode getSourceChild() public List getDestinationChildren() { - List cs = getChildren(); + List cs = getChildren(); return cs.subList(DST_CHILDREN_START_INDEX, cs.size()).stream() .map(x -> (RoleNode) x).collect(Collectors.toList()); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java b/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java index 038cd5c40..89d0ffc33 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java @@ -17,7 +17,6 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -38,7 +37,7 @@ public DoArgList(DoArgList node) super(node); } - protected List getRawArgChildren() + protected List getRawArgChildren() { return getChildren(); } @@ -57,8 +56,7 @@ public DoArgList reconstruct(List args) { DoArgList argList = dupNode(); argList.addChildren(args); - ScribDel del = del(); - argList.setDel(del); // No copy + argList.setDel(del()); // No copy return argList; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ImportDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ImportDecl.java index c9ca9f637..331a3155a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ImportDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ImportDecl.java @@ -14,12 +14,11 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.ImportKind; import org.scribble.core.type.name.Name; // CHECKME: factor out more stuff from ImportModule and ImportMember into here? e.g. alias/name, reconstruct (or else no need for common super?) -public abstract class ImportDecl extends ScribNodeBase//, ModuleMember //implements NameDeclaration +public abstract class ImportDecl extends ScribNodeBase { // ScribTreeAdaptor#create constructor public ImportDecl(Token payload) @@ -43,17 +42,4 @@ public boolean isImportModule() public abstract boolean hasAlias(); public abstract Name getAlias(); - //public abstract Name getVisibleName(); - - - - - - - - - protected ImportDecl(CommonTree source) - { - super(source); - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java index 2d8cce9a5..c24b9cf8f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java @@ -49,7 +49,7 @@ public List getArgChildren() public List getArgNodes() { - return getArgChildren().stream().map(ai -> ai.getArgNodeChild()) + return getArgChildren().stream().map(x -> x.getArgNodeChild()) .collect(Collectors.toList()); } @@ -62,7 +62,7 @@ public boolean isEmpty() public List> getArguments() { return getArgChildren().stream() - .map(ai -> (Arg) ai.getArgNodeChild().toArg()) + .map(x -> (Arg) x.getArgNodeChild().toArg()) .collect(Collectors.toList()); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNil.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNil.java index 9ac462094..4ce98c566 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNil.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNil.java @@ -21,18 +21,18 @@ public class ScribNil extends ScribNodeBase // Used by (Scrib)TreeAdapator public ScribNil() { - super((Token) null); + super((Token) null); // CHECKME: null Token } // Copy constructor protected ScribNil(CommonTree node) { - super(node); + super((ScribNodeBase) node); } @Override public ScribNodeBase dupNode() { - return new ScribNil(this); // nil can have children(?), so may need to actually copy + return new ScribNil(this); // CHECKME: nil can have children(?), so may need to actually copy } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java index d74255270..68260a184 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java @@ -28,15 +28,13 @@ */ public interface ScribNode extends Tree { - CommonTree getSource(); - // Previously: for parsed entities, null if not parsed - // Now: for the original parsed entity for error blaming; should not be null unless a "purely generated" entity + CommonTree getSource(); // TODO: deprecate @Override ScribNode getParent(); - //@Override -- super return isn't generic - List getChildren(); + //@Override -- no: super return not generic + List getChildren(); ScribNode clone(); diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java index c9f9a1133..c384ba9c1 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -38,10 +38,7 @@ */ public abstract class ScribNodeBase extends CommonTree implements ScribNode { - protected final CommonTree source; // Consequently, core depends on Antlr - // Used to be for parsed entities; null if not parsed - // Now: for the original parsed entity for error blaming; should not be null unless a purely generated entity - // CHECKME: not needed any more? + private final CommonTree source; // Track "original" source where applicable protected ScribDel del; @@ -49,14 +46,15 @@ public abstract class ScribNodeBase extends CommonTree implements ScribNode public ScribNodeBase(Token payload) { super(payload); - this.source = this; // TODO: redundant + this.source = this; // Record parser construction as source } // Copy constructor - protected ScribNodeBase(CommonTree node) + protected ScribNodeBase(ScribNodeBase node) { super(node); - this.source = node; // TODO: redundant + this.source = node.getSource(); // Keep ref to original as source (cf., this) + // A (partially) reconstructed/generated node may have no parent (i.e., null) if a AntlrSourceExcetpion occurs during construction? e.g., bad.syntax.disamb.doarglist.DoArgList06 } @Override @@ -80,7 +78,7 @@ public ScribNode getChild(int i) // N.B. "overriding" base ANTLR behaviour of (sometimes?) returning null when // getChildCount() == 0 by returning an empty list instead @Override - public List getChildren() + public List getChildren() { if (getChildCount() == 0) { diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java index 54633f4bd..77fe2e003 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java @@ -38,7 +38,7 @@ protected GChoice(GChoice node) @Override public List getBlockChildren() { - List cs = getChildren(); + List cs = getChildren(); return cs.subList(GChoice.BLOCK_CHILDREN_START_INDEX, cs.size()).stream() .map(x -> (GProtocolBlock) x).collect(Collectors.toList()); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java index 974477888..5b69dd2ff 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java @@ -17,11 +17,12 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.ScribNodeBase; +import org.scribble.ast.name.simple.IdNode; import org.scribble.core.type.kind.Kind; import org.scribble.core.type.name.Named; +// Children are IdNode elements (each IdNode records a String text element) // Kind parameter used for typing help, but NameNodes don't record kind as state (not part of the syntax) -- so kind doesn't affect e.g. equals (i.e. name nodes of different kinds are still only compared syntactically) public abstract class NameNode extends ScribNodeBase implements Named @@ -33,48 +34,41 @@ public NameNode(Token t) } // Tree#dupNode constructor - protected NameNode(NameNode node)//, String...elems) + protected NameNode(NameNode node) { super(node); } - protected List getSimpleNameList() + @Override + public List getChildren() { - return getChildren().stream() - .map(x -> ((CommonTree) x).getText()).collect(Collectors.toList()); - // CHECKME: currently AmbigNameNode(?) - // CHECKME: factor out getText? + return super.getChildren().stream().map(x -> (IdNode) x) + .collect(Collectors.toList()); } public abstract NameNode dupNode(); - public String[] getElements() + // Factored abstractly from getChildren, for SimpleNameNode to override (SimpleNameNode has no children) + public List getElements() { - //return Arrays.copyOf(this.elems, this.elems.length); - return getSimpleNameList().toArray(new String[0]); + return getChildren().stream() + .map(x -> x.getText()).collect(Collectors.toList()); } - protected String[] getPrefixElements() + protected final List getPrefixElements() { - //return Arrays.copyOfRange(this.elems, 0, this.elems.length - 1); - if (getElementCount() <= 1) - { - return new String[0]; - } - List names = getSimpleNameList(); - return names.subList(0, names.size()-1).toArray(new String[0]); + List elems = getElements(); + return elems.subList(0, elems.size()-1); } - protected String getLastElement() + protected final String getLastElement() { - //return getElements()[getElementCount() - 1]; - List names = getSimpleNameList(); + List names = getElements(); return names.get(names.size() - 1); } public int getElementCount() { - //return this.elems.length; return getChildCount(); } @@ -109,7 +103,7 @@ public boolean equals(Object o) } NameNode them = (NameNode) o; return them.canEqual(this) - && getSimpleNameList().equals(them.getSimpleNameList()); + && getElements().equals(them.getElements()); } public abstract boolean canEqual(Object o); @@ -118,7 +112,7 @@ public boolean equals(Object o) public int hashCode() { int hash = 317; - hash = 31 * hash + getSimpleNameList().hashCode(); + hash = 31 * hash + getElements().hashCode(); // Hash the String values, not the actual Tree nodes return hash; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java index 6419a63c8..84489b3da 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java @@ -14,6 +14,7 @@ package org.scribble.ast.name.qualified; import java.util.Arrays; +import java.util.List; import org.antlr.runtime.Token; import org.scribble.core.type.kind.Kind; @@ -37,13 +38,15 @@ protected MemberNameNode(MemberNameNode node) protected ModuleName getModuleNamePrefix() { - String[] prefix = getPrefixElements(); - ModuleName mn = new ModuleName(prefix[prefix.length - 1]); - if (prefix.length == 1) + List prefix = getPrefixElements(); + ModuleName mn = new ModuleName(prefix.get(prefix.size()-1)); + if (prefix.size() == 1) { return mn; } return new ModuleName( - new PackageName(Arrays.copyOf(prefix, prefix.length - 1)), mn); + new PackageName( + Arrays.copyOf(prefix.toArray(new String[0]), prefix.size() - 1)), + mn); } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java index a2e9ff440..e237074d5 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java @@ -43,7 +43,9 @@ public ModuleName toName() { ModuleName modname = new ModuleName(getLastElement()); return isPrefixed() - ? new ModuleName(new PackageName(getPrefixElements()), modname) + ? new ModuleName( + new PackageName(getPrefixElements().toArray(new String[0])), + modname) : modname; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java index ae62b77dd..d07419c26 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java @@ -27,7 +27,7 @@ public ProtocolNameNode(Token t) } // Tree#dupNode constructor - protected ProtocolNameNode(ProtocolNameNode node)//, String...elems) + protected ProtocolNameNode(ProtocolNameNode node) { super(node); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index 1277d4d50..287a20fc3 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -25,28 +25,18 @@ import org.scribble.core.type.session.Message; // Primitive payload type, MessageSigName or parameter names only: if name is parsed as a CompoundNameNodes, it must be a payload type (not ambiguous in this case) -// No counterpart needed for MessageNode because MessageSignature values can be syntactically distinguished from sig parameters -//public class AmbigNameNode extends SimpleNameNode implements MessageNode, PayloadElemNameNode -//public class AmbigNameNode extends SimpleNameNode implements MessageNode, PayloadElemNameNode public class AmbigNameNode extends SimpleNameNode - implements MessageNode, PayloadElemNameNode - // Currently hardcoded to DataTypeKind for payload elems + implements MessageNode, PayloadElemNameNode // FIXME: currently hardcoded to DataTypeKind for payload elems ? { - // ScribTreeAdaptor#create constructor - public AmbigNameNode(Token t) - { - super(t); - } - - // Scribble.g, IDENTIFIER[$IDENTIFIER] + // Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + // N.B. ttype (an "imaginary node" type) is discarded, t is a ScribbleParser.ID token type public AmbigNameNode(int ttype, Token t) { - this(t); - System.out.println("AAAAAA: " + ttype + " ,, "+ t + " ,, " + t.getType() + " ,, " + toName()); + super(t); } // Tree#dupNode constructor - protected AmbigNameNode(AmbigNameNode node)//, String id) + protected AmbigNameNode(AmbigNameNode node) { super(node); } @@ -57,13 +47,6 @@ public AmbigNameNode dupNode() return new AmbigNameNode(this); } - /*@Override - public String getText() - { - //return getToken().getText(); // CHECKME: ambig nodes are now leafs -- NO: now separated from ID - return super.getText(); - }*/ - @Override public Arg toArg() { @@ -79,9 +62,7 @@ public Message toMessage() } @Override - //public PayloadType toPayloadType() public PayloadElemType toPayloadType() // As a payload elem, currently hardcoded to expect only DataTypeKind (protocol payloads not supported) - //public PayloadType toPayloadType() { throw new RuntimeException( "Ambiguous name node not disambiguated: " + this); diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java index e192ddc3d..9c60191f4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java @@ -41,7 +41,7 @@ public IdNode dupNode() @Override public String getText() { - return getToken().getText(); // CHECKME: ambig nodes are now leafs + return getToken().getText(); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java index 60e4cfc6a..7c90e4325 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java @@ -17,19 +17,15 @@ import org.scribble.core.type.kind.NonRoleParamKind; // An unambiguous kinded parameter (ambiguous parameters handled by disambiguation) that isn't a role -- e.g. DataType/MessageSigName param -//public class NonRoleParamNode extends SimpleNameNode implements MessageNode, PayloadElemNameNode -//public class NonRoleParamNode extends SimpleNameNode implements MessageNode, PayloadElemNameNode public abstract class NonRoleParamNode extends - SimpleNameNode// implements MessageNode, PayloadElemNameNode - // As a payload, can only be a DataType (so hardcode) + SimpleNameNode // As a payload, can only be a DataType (so hardcode) { - public final K kind; + public final K kind; // CHECKME: still useful, now there are concrete subclasses? - // ScribTreeAdaptor#create constructor public NonRoleParamNode(Token t, K kind) { super(t); - this.kind = kind; // FIXME: how to set? (disamb?) -- probably do concrete data/sig subclasses? + this.kind = kind; } // Tree#dupNode constructor @@ -39,113 +35,12 @@ protected NonRoleParamNode(NonRoleParamNode node)//, String id) this.kind = node.kind; } - @Override - public abstract NonRoleParamNode dupNode(); - /*{ - return new NonRoleParamNode<>(this, this.kind);//, getIdentifier()); - }*/ - - /*@Override - public MessageNode project(AstFactory af) // MessageSigName params - { - return this; - } - - @Override - public NonRoleArgNode substituteNames(Substitutor subs) - { - Arg arg = toArg(); - NonRoleArgNode an; - if (this.kind.equals(SigKind.KIND) || this.kind.equals(DataTypeKind.KIND)) - //if (this.kind instanceof NonRoleParamKind) // Would additionally include other payloadtype kinds - { - an = subs.getArgumentSubstitution(arg); // getArgumentSubstitution returns a clone - } - else - { - throw new RuntimeException("TODO: " + this); - } - // Effectively a reconstruct: use the dels/envs made by the subprotocolvisitor cloning, cf. RoleNode - an = (NonRoleArgNode) an.del(del()); - return an; - } - - @Override - public Name toName() - { - String id = getText(); - if (this.kind.equals(SigKind.KIND)) - { - return Kind.castName(this.kind, new MessageSigName(id)); - } - else if (this.kind.equals(DataTypeKind.KIND)) - { - return Kind.castName(this.kind, new DataType(id)); - } - else - { - throw new RuntimeException("Shouldn't get in here: " + this.kind); - } - } - - @Override - public boolean isParamNode() - { - return true; - } - - @Override - public Arg toArg() - { - Arg arg; - if (this.kind.equals(DataTypeKind.KIND)) // FIXME: as a payload kind, currently hardcorded to data type kinds (protocol payloads not supported) - { - arg = toPayloadType(); - } - else if (this.kind.equals(SigKind.KIND)) - { - arg = toMessage(); - } - else - { - throw new RuntimeException("Shouldn't get here: " + this); - } - @SuppressWarnings("unchecked") - Arg tmp = (Arg) arg; - return tmp; - } - - @Override - public Message toMessage() - { - if (!this.kind.equals(SigKind.KIND)) - { - throw new RuntimeException("Not a sig kind parameter: " + this); - } - return (Message) toName(); - } - - @Override - //public PayloadType toPayloadType() - public PayloadElemType toPayloadType() // Currently can assume the only possible kind for NonRoleParamNode is DataTypeKind - //public PayloadType toPayloadType() - { - if (this.kind.equals(DataTypeKind.KIND)) // As a payload, NonRoleParamNode can only be a DataType - { - return (DataType) toName(); - } - /*else if (this.kind.equals(Local.KIND)) // Protocol params not supported - { - return (Local) toName(); - }* / - throw new RuntimeException("Not a payload kind parameter: " + this); - }*/ - @Override public int hashCode() { int hash = 317; hash = 31 * super.hashCode(); + hash = 31 * this.kind.hashCode(); return hash; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java index 2bd0771d7..eb927e5c9 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java @@ -20,19 +20,19 @@ public class OpNode extends SimpleNameNode { - public static final String EMPTY_OP_ID = "EMPTY_OPERATOR"; + // Determine by token text -- cannot use token type int in core, value is a ScribbleParser constant + public static final String EMPTY_OP_TOKEN_TEXT = "EMPTY_OPERATOR"; - // ScribTreeAdaptor#create constructor public OpNode(Token t) { super(t); } - // Scribble.g, IDENTIFIER[$IDENTIFIER] + // Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + // N.B. ttype (an "imaginary node" type) is discarded, t is a ScribbleParser.ID token type public OpNode(int ttype, Token t) { this(t); - System.out.println("OOOOO: " + ttype + " ,, "+ t + " ,, " + t.getType() + " ,, " + toName()); } // Tree#dupNode constructor @@ -51,7 +51,7 @@ public OpNode dupNode() public Op toName() { String id = getText(); - if (id.equals(EMPTY_OP_ID)) + if (id.equals(EMPTY_OP_TOKEN_TEXT)) { return Op.EMPTY_OP; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java index ea71888a5..5579c9f4e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java @@ -19,17 +19,11 @@ public class RecVarNode extends SimpleNameNode { - // ScribTreeAdaptor#create constructor - public RecVarNode(Token t) - { - super(t); - } - - // Scribble.g, IDENTIFIER[$IDENTIFIER] + // Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + // N.B. ttype (an "imaginary node" type) is discarded, t is a ScribbleParser.ID token type public RecVarNode(int ttype, Token t) { - this(t); - System.out.println("VVVV: " + ttype + " ,, "+ t + " ,, " + t.getType()); + super(t); } // Tree#dupNode constructor diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java index 254637ab4..f0d611895 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java @@ -15,28 +15,20 @@ import org.antlr.runtime.Token; import org.scribble.ast.DoArgNode; -import org.scribble.ast.ScribNode; import org.scribble.core.type.kind.RoleKind; import org.scribble.core.type.name.Role; public class RoleNode extends SimpleNameNode implements DoArgNode - // RoleDecl, RoleInstantiation { - // ScribTreeAdaptor#create constructor - public RoleNode(Token t) - { - super(t); - } - - // Scribble.g, IDENTIFIER[$IDENTIFIER] + // Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + // N.B. ttype (an "imaginary node" type) is discarded, t is a ScribbleParser.ID token type public RoleNode(int ttype, Token t) { - this(t); - System.out.println("RRRRR: " + ttype + " ,, "+ t + " ,, " + t.getType() + " ,, " + toName()); + super(t); } // Tree#dupNode constructor - protected RoleNode(RoleNode node)//, String id) + protected RoleNode(RoleNode node) { super(node); } @@ -46,16 +38,6 @@ public RoleNode dupNode() { return new RoleNode(this); } - - // RoleNode is the only NameNode with a reconstruct (so not factored up) - protected RoleNode reconstruct(String id) - { - ScribNode n = getChild(0); // TODO: factor out (ID -- currently ambignamenode?) - RoleNode r = dupNode(); - r.addChild(n); - r.setDel(del()); // No copy // Default delegate assigned in ModelFactoryImpl for all simple names - return r; - } @Override public Role toName() diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java index 8b1316f04..0d0831b06 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java @@ -21,21 +21,15 @@ public class SigParamNode extends NonRoleParamNode implements MessageNode { - // ScribTreeAdaptor#create constructor - public SigParamNode(Token t) - { - super(t, SigKind.KIND); - } - - // Scribble.g, IDENTIFIER[$IDENTIFIER] + // Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + // N.B. ttype (an "imaginary node" type) is discarded, t is a ScribbleParser.ID token type public SigParamNode(int ttype, Token t) { - this(t); - System.out.println("SSSS: " + ttype + " ,, "+ t + " ,, " + t.getType() + " ,, " + toName()); + super(t, SigKind.KIND); } // Tree#dupNode constructor - protected SigParamNode(SigParamNode node)//, String id) + protected SigParamNode(SigParamNode node) { super(node); } @@ -43,11 +37,7 @@ protected SigParamNode(SigParamNode node)//, String id) @Override public SigParamNode dupNode() { - if (getChildren().isEmpty()) - { - throw new RuntimeException(); - } - return new SigParamNode(this);//, getIdentifier()); + return new SigParamNode(this); } @Override @@ -69,7 +59,7 @@ public MessageSigName toMessage() } @Override - public boolean isTypeParamNode() + public boolean isSigParamNode() { return true; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java index da08b16ea..82a9b6759 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java @@ -21,11 +21,12 @@ import org.scribble.ast.name.NameNode; import org.scribble.core.type.kind.Kind; +// "ID" in Scribble.g, token type is ScribbleParser.ID, token text is the string value // Names that are necessarily "simple", i.e., never compound qualified (cf. qualified, that may be simple or compound) -// "Identifier" in parser grammar +// CHECKME: refactor NameNode elem structure down the QualifiedNameNode side? -- e.g., NameNode.getChildren is misleading for SimpleNameNode (should use getElements instead) public abstract class SimpleNameNode extends NameNode { - // ScribTreeAdaptor#create constructor + // token type is ScribbleParser.ID, token text is the string value public SimpleNameNode(Token t) { super(t); @@ -37,33 +38,15 @@ protected SimpleNameNode(SimpleNameNode node) super(node); } - @Override - protected String getLastElement() - { - return this.token.getText(); - } - @Override public String getText() { - return getLastElement(); + return this.token.getText(); } @Override - protected List getSimpleNameList() + public List getElements() { return Stream.of(getText()).collect(Collectors.toList()); } - - @Override - public String[] getElements() - { - return getSimpleNameList().toArray(new String[0]); - } - - @Override - protected String[] getPrefixElements() - { - return new String[0]; - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java index df5f08aa0..38b1772e6 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java @@ -19,24 +19,17 @@ import org.scribble.core.type.name.DataType; public class TypeParamNode extends NonRoleParamNode - implements PayloadElemNameNode - // As a payload, can only be a DataType (so hardcode) + implements PayloadElemNameNode // As a payload, can only be a DataType (so hardcode) { - // ScribTreeAdaptor#create constructor - public TypeParamNode(Token t) - { - super(t, DataTypeKind.KIND); - } - - // Scribble.g, IDENTIFIER[$IDENTIFIER] + // Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + // N.B. ttype (an "imaginary node" type) is discarded, t is a ScribbleParser.ID token type public TypeParamNode(int ttype, Token t) { - this(t); - System.out.println("TTTT: " + ttype + " ,, "+ t + " ,, " + t.getType() + " ,, " + toName()); + super(t, DataTypeKind.KIND); } // Tree#dupNode constructor - protected TypeParamNode(TypeParamNode node)//, String id) + protected TypeParamNode(TypeParamNode node) { super(node); } @@ -56,7 +49,7 @@ public DataType toName() @Override public DataType toArg() { - // FIXME: as a payload kind, currently hardcorded to data type kinds (protocol payloads not supported) + // As a payload kind, currently hardcorded to data type kinds (protocol payloads not supported) return toPayloadType(); } diff --git a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java index ad09be569..68a88cc6d 100644 --- a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java @@ -51,36 +51,36 @@ public NonRoleArgList leaveDisambiguation(ScribNode child, for (NonRoleParamDecl param : pd.getHeaderChild().getParamDeclListChild() .getParamDeclChildren()) { - NonRoleParamKind kind = param.kind; + NonRoleParamKind pkind = param.kind; NonRoleArg arg = args.next(); NonRoleArgNode val = arg.getArgNodeChild(); if (val.isTypeParamNode() || val.isSigParamNode()) { - if (!((NonRoleParamNode) val).kind.equals(kind)) + if (!((NonRoleParamNode) val).kind.equals(pkind)) { throw new ScribException(arg.getSource(), - "Invalid arg " + arg + " for param kind: " + kind); + "Invalid arg " + arg + " for param kind: " + pkind); } } - else if (kind.equals(SigKind.KIND)) + else if (pkind.equals(SigKind.KIND)) { if (!val.isMessageSigNode() && !val.isMessageSigNameNode()) { throw new ScribException(arg.getSource(), - "Invalid arg " + arg + " for param kind: " + kind); + "Invalid arg " + arg + " for param kind: " + pkind); } } - else if (kind.equals(DataTypeKind.KIND)) + else if (pkind.equals(DataTypeKind.KIND)) { if (!val.isDataTypeNameNode()) { throw new ScribException(arg.getSource(), - "Invalid arg " + arg + " for param kind: " + kind); + "Invalid arg " + arg + " for param kind: " + pkind); } } else { - throw new RuntimeException("Shouldn't get in here: " + kind); + throw new RuntimeException("Shouldn't get in here: " + pkind); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java index 6e7e96a6b..bfe8c9d83 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java @@ -13,7 +13,8 @@ */ package org.scribble.del.name.simple; -import org.antlr.runtime.CommonToken; +import java.util.stream.Collectors; + import org.scribble.ast.MessageTransfer; import org.scribble.ast.PayloadElem; import org.scribble.ast.ScribNode; @@ -61,7 +62,12 @@ public ScribNode leaveDisambiguation(ScribNode child, DataTypeKind.KIND, name.getElements());*/ //DataTypeNode res = new DataTypeNode(ann.token); // CHECKME: what should the Token be? - DataTypeNode res = new DataTypeNode(new CommonToken(73, "TYPENAME")); // FIXME: use af + //DataTypeNode res = new DataTypeNode(new CommonToken(73, "TYPENAME")); // FIXME: use af + DataTypeNode res = (DataTypeNode) disamb.lang.config.af + .QualifiedNameNode(DataTypeKind.KIND, + ann.getElements().stream() + .map(x -> disamb.lang.config.af.IdNode(x)) + .collect(Collectors.toList())); //res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? res.addChild(new IdNode(ann.token)); @@ -79,7 +85,12 @@ else if (mcontext.isMessageSigNameVisible(name.toMessageSigName())) SigKind.KIND, name.getElements());*/ //MessageSigNameNode res = new MessageSigNameNode(ann.token); // CHECME: what should the Token be? - MessageSigNameNode res = new MessageSigNameNode(new CommonToken(67, "SIGNAME")); // FIXME: use af + //MessageSigNameNode res = new MessageSigNameNode(new CommonToken(67, "SIGNAME")); // FIXME: use af + MessageSigNameNode res = (MessageSigNameNode) disamb.lang.config.af + .QualifiedNameNode(SigKind.KIND, + ann.getElements().stream() + .map(x -> disamb.lang.config.af.IdNode(x)) + .collect(Collectors.toList())); //res.addChildren(ann.getChildren()); res.addChild(new IdNode(ann.token)); @@ -93,7 +104,9 @@ else if (disamb.isBoundParameter(name)) NonRoleParamKind kind = disamb.getParameterKind(name); if (kind.equals(DataTypeKind.KIND)) { - TypeParamNode res = new TypeParamNode(ann.token); // CHECKME: what should the Token be? + //TypeParamNode res = new TypeParamNode(ann.token); // CHECKME: what should the Token be? + //TypeParamNode res = new TypeParamNode(75, ann.token); // CHECKME: what should the Token be? + TypeParamNode res = disamb.lang.config.af.TypeParamNode(ann.getText()); // CHECKME: what should the Token be? //res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? @@ -101,7 +114,8 @@ else if (disamb.isBoundParameter(name)) } else if (kind.equals(SigKind.KIND)) { - SigParamNode res = new SigParamNode(ann.token); // CHECKME: what should the Token be? + //SigParamNode res = new SigParamNode(69, ann.token); // CHECKME: what should the Token be? + SigParamNode res = disamb.lang.config.af.SigParamNode(ann.getText()); // CHECKME: what should the Token be? //res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? diff --git a/scribble-core/src/main/java/org/scribble/util/AntlrSourceException.java b/scribble-core/src/main/java/org/scribble/util/AntlrSourceException.java index fb0d7a165..fa5b092d8 100644 --- a/scribble-core/src/main/java/org/scribble/util/AntlrSourceException.java +++ b/scribble-core/src/main/java/org/scribble/util/AntlrSourceException.java @@ -48,7 +48,7 @@ private static String getRootModuleName(CommonTree blame) // Means root of this } CommonTree moddecl = (CommonTree) root.getChild(0).getChild(0); int count = moddecl.getChildCount(); - return IntStream.range(0, count).mapToObj((i) -> moddecl.getChild(i).getText()).collect(Collectors.joining(".")); + return IntStream.range(0, count).mapToObj(i -> moddecl.getChild(i).getText()).collect(Collectors.joining(".")); } public AntlrSourceException(String arg0) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index ca81997fa..59cbb161a 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -384,17 +384,14 @@ fragment UNDERSCORE: simplename: IDENTIFIER; -parametername: simplename; +//parametername: simplename; //simplename; -recursionvarname: - IDENTIFIER -; +recursionvarname: IDENTIFIER ; // IDENTIFIER^ rolename: simplename; -scopename: simplename; simpleprotocolname: simplename; simplemembername: simplename; // Only for member declarations @@ -419,6 +416,11 @@ typeparamname: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; sigparamname: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; + +/** + * Section 3.2.1 Package, Module and Module Member Names + */ + // Using qualified to rep simple simplemodulename: IDENTIFIER -> ^(MODULENAME IDENTIFIER) ; simplepayloadtypename: IDENTIFIER -> ^(TYPENAME IDENTIFIER) ; @@ -427,11 +429,6 @@ simplemessagesignaturename: IDENTIFIER -> ^(SIGNAME IDENTIFIER) ; // TODO factor out with sigparamdecl? NO: params distinct from "literals" - -/** - * Section 3.2.1 Package, Module and Module Member Names - */ - qualifiedname: IDENTIFIER ('.' IDENTIFIER)* -> @@ -689,10 +686,6 @@ globalprotocolblock: '{' globalinteractionsequence '}' -> ^(GLOBALPROTOCOLBLOCK globalinteractionsequence) -/*| - '(' connectdecl ')' '{' globalinteractionsequence '}' --> - ^(GLOBALPROTOCOLBLOCK globalinteractionsequence connectdecl)*/ ; globalinteractionsequence: diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java index 433f72e75..b613b5e3c 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java @@ -76,10 +76,7 @@ import org.scribble.core.type.kind.Kind; import org.scribble.core.type.kind.ModuleKind; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.kind.OpKind; import org.scribble.core.type.kind.PayloadTypeKind; -import org.scribble.core.type.kind.RecVarKind; -import org.scribble.core.type.kind.RoleKind; import org.scribble.core.type.kind.SigKind; import org.scribble.del.DefaultDel; import org.scribble.del.ImportModuleDel; @@ -126,20 +123,135 @@ protected ScribDel createDefaultDelegate() } // FIXME: factor out -- change return to void (ScribNodeBase.del is a mutating setter) +// protected static T del(T n, ScribDel del) protected static T del(T n, ScribDel del) { return ScribNodeBase.del(n, del); } @Override - public IdNode IdNode(String id) + public IdNode IdNode(String text) { - CommonToken t = new CommonToken(ScribbleParser.IDENTIFIER, id); + CommonToken t = new CommonToken(ScribbleParser.IDENTIFIER, text); // IdNode is the only token with a "different" text to its node type -- info stored directly as its the text, no children IdNode n = new IdNode(t); return n; } + // Deprecate? Never need to make ambigname "manually" via af? (only constructed by ScribbleParser) + @Override + public AmbigNameNode AmbiguousNameNode(String text) + { + int ttype = ScribbleParser.AMBIGUOUSNAME; + CommonToken t = newToken(ttype, text); + AmbigNameNode n = new AmbigNameNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + n.del(new AmbigNameNodeDel()); + return n; + } + + @Override + public OpNode OpNode(String text) + { + int ttype = ScribbleParser.OPNAME; + CommonToken t = newToken(ttype, "OPNAME"); + OpNode n = new OpNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + del(n, createDefaultDelegate()); + return n; + } + + @Override + public RecVarNode RecVarNode(String text) + { + int ttype = ScribbleParser.RECURSIONVAR; + CommonToken t = newToken(ScribbleParser.RECURSIONVAR, "RECURSIONVAR"); + RecVarNode n = new RecVarNode(ScribbleParser.RECURSIONVAR, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + del(n, new RecVarNodeDel()); + return n; + } + + @Override + public RoleNode RoleNode(String text) + { + int ttype = ScribbleParser.ROLENAME; + CommonToken t = newToken(ttype, "ROLENAME"); + RoleNode n = new RoleNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + del(n, new RoleNodeDel()); + return n; + } + + @Override + public SigParamNode SigParamNode(String text) + { + int ttype = ScribbleParser.SIGPARAMNAME; // N.B. cf. ScribbleParser.SIGNAME + CommonToken t = newToken(ttype, text); + SigParamNode n = new SigParamNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + n.del(new NonRoleParamNodeDel()); + return n; + } + + @Override + public TypeParamNode TypeParamNode(String text) + { + int ttype = ScribbleParser.TYPEPARAMNAME; // N.B. cf. ScribbleParser.TYPENAME + CommonToken t = newToken(ttype, text); + TypeParamNode n = new TypeParamNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + n.del(new NonRoleParamNodeDel()); + return n; + } + + @Override + public QualifiedNameNode QualifiedNameNode( + K kind, List elems) + { + QualifiedNameNode qnn = null; + if (kind.equals(SigKind.KIND)) + { + CommonToken t = newToken(ScribbleParser.SIGNAME, "SIGNAME"); + qnn = new MessageSigNameNode(t); + qnn = del(qnn, new MessageSigNameNodeDel()); + } + else if (kind.equals(DataTypeKind.KIND)) + { + CommonToken t = newToken(ScribbleParser.TYPENAME, "TYPENAME"); + qnn = new DataTypeNode(t); + qnn = del(qnn, new DataTypeNodeDel()); + } + if (qnn != null) + { + qnn.addChildren(elems); + return castNameNode(kind, qnn); + } + + if (kind.equals(ModuleKind.KIND)) + { + CommonToken t = newToken(ScribbleParser.MODULENAME, "MODULENAME"); + qnn = new ModuleNameNode(t); + } + else if (kind.equals(Global.KIND)) + { + CommonToken t = newToken(ScribbleParser.GPROTOCOLNAME, "GPROTOCOLNAME"); + qnn = new GProtocolNameNode(t); + } + else + { + throw new RuntimeException("Shouldn't get in here: " + kind); + } + qnn.addChildren(elems); + return castNameNode(kind, del(qnn, createDefaultDelegate())); + } + + protected static , K extends Kind> T castNameNode( + K kind, NameNode n) + { + if (!n.toName().getKind().equals(kind)) + { + throw new RuntimeException("Shouldn't get in here: " + kind + ", " + n); + } + @SuppressWarnings("unchecked") + T tmp = (T) n; + return tmp; + } + // type comes from the int constants in ScribbleParser, which come from the tokens in Scribble.g // Pre: any type from ScribbleParser, except IDENTIFIER (IdNode) private CommonToken newToken(int type) @@ -320,14 +432,6 @@ public RoleDecl RoleDecl(RoleNode r) return n; } - /*@Override - public ConnectDecl ConnectDecl(RoleNode src, RoleNode role) - { - ConnectDecl cd = new ConnectDecl(src, role); - cd = del(cd, new ConnectDeclDel()); - return cd; - }*/ - @Override public NonRoleParamDeclList NonRoleParamDeclList( List> ds) @@ -528,131 +632,6 @@ public NonRoleArg NonRoleArg(NonRoleArgNode arg) n = del(n, createDefaultDelegate()); return n; } - - // FIXME: split up this method - // CHECKME: organise explicit Scribble Tokens - @Override - public NameNode SimpleNameNode(K kind, - IdNode id) - { - NameNode snn = null; - - // "Custom" del's - if (kind.equals(RecVarKind.KIND)) - { - CommonToken t = newToken(ScribbleParser.RECURSIONVAR, "RECURSIONVAR"); - snn = new RecVarNode(t); - snn = del(snn, new RecVarNodeDel()); - } - else if (kind.equals(RoleKind.KIND)) - { - CommonToken t = newToken(ScribbleParser.ROLENAME, "ROLENAME"); - snn = new RoleNode(t); - snn = del(snn, new RoleNodeDel()); - } - if (snn != null) - { - snn.addChild(id); - return castNameNode(kind, snn); - } - - // Default del's - if (kind.equals(OpKind.KIND)) - { - CommonToken t = newToken(ScribbleParser.OPNAME, "OPNAME"); - snn = new OpNode(t); - snn.addChild(id); - } - else - { - throw new RuntimeException("Shouldn't get in here: " + kind); - } - return castNameNode(kind, del(snn, createDefaultDelegate())); - } - - @Override - public QualifiedNameNode QualifiedNameNode( - K kind, List elems) - { - QualifiedNameNode qnn = null; - if (kind.equals(SigKind.KIND)) - { - CommonToken t = newToken(ScribbleParser.SIGNAME, "SIGNAME"); - qnn = new MessageSigNameNode(t); - qnn = del(qnn, new MessageSigNameNodeDel()); - } - else if (kind.equals(DataTypeKind.KIND)) - { - CommonToken t = newToken(ScribbleParser.TYPENAME, "TYPENAME"); - qnn = new DataTypeNode(t); - qnn = del(qnn, new DataTypeNodeDel()); - } - if (qnn != null) - { - qnn.addChildren(elems); - return castNameNode(kind, qnn); - } - - if (kind.equals(ModuleKind.KIND)) - { - CommonToken t = newToken(ScribbleParser.MODULENAME, "MODULENAME"); - qnn = new ModuleNameNode(t); - } - else if (kind.equals(Global.KIND)) - { - CommonToken t = newToken(ScribbleParser.GPROTOCOLNAME, "GPROTOCOLNAME"); - qnn = new GProtocolNameNode(t); - } - else - { - throw new RuntimeException("Shouldn't get in here: " + kind); - } - qnn.addChildren(elems); - return castNameNode(kind, del(qnn, createDefaultDelegate())); - } - - protected static , K extends Kind> T castNameNode( - K kind, NameNode n) - { - if (!n.toName().getKind().equals(kind)) - { - throw new RuntimeException("Shouldn't get in here: " + kind + ", " + n); - } - @SuppressWarnings("unchecked") - T tmp = (T) n; - return tmp; - } - - // Deprecate? Never need to make ambigname "manually" via af? (only constructed by ScribbleParser) - @Override - public AmbigNameNode AmbiguousNameNode(IdNode id) - { - CommonToken t = newToken(ScribbleParser.AMBIGUOUSNAME, "AMBIGUOUSNAME"); - AmbigNameNode n = new AmbigNameNode(t); - n.addChild(id); - n = (AmbigNameNode) n.del(new AmbigNameNodeDel()); - return n; - } - - @SuppressWarnings("unchecked") // FIXME - @Override - public NonRoleParamNode NonRoleParamNode( - K kind, String identifier) - { - NonRoleParamNode pn; - if (kind.equals(SigKind.KIND)) - { - CommonToken t = newToken(ScribbleParser.SIGPARAMNAME, "SIGPARAMNAME"); // N.B. cf. ScribbleParser.SIGNAME - pn = (NonRoleParamNode) new SigParamNode(t); - } - else - { - CommonToken t = newToken(ScribbleParser.TYPEPARAMNAME, "TYPEPARAMNAME"); // N.B. cf. ScribbleParser.TYPENAME - pn = (NonRoleParamNode) new TypeParamNode(t); - } - pn = del(pn, new NonRoleParamNodeDel()); - return pn; - } } diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 323a18674..cd1851651 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -55,13 +55,8 @@ import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.OpNode; -import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.ast.name.simple.SigParamNode; -import org.scribble.ast.name.simple.TypeParamNode; import org.scribble.parser.antlr.ScribbleParser; // get/setType don't seem to be really used @@ -86,13 +81,16 @@ public ScribNode create(Token t) switch (t.getType()) { case ScribbleParser.IDENTIFIER: return new IdNode(t); - case ScribbleParser.EXTIDENTIFIER: return new IdNode(t); // CHECKME: OK? + case ScribbleParser.EXTIDENTIFIER: return new IdNode(t); // CHECKME: Reuse IdNode OK? - /*case ScribbleParser.ROLENAME: return new RoleNode(t); - case ScribbleParser.TYPEPARAMNAME: return new TypeParamNode(t); + /* + case ScribbleParser.AMBIGUOUSNAME: return new AmbigNameNode(t); + case ScribbleParser.OPNAME: return new OpNode(t); + case ScribbleParser.RECURSIONVAR: return new RecVarNode(t); + case ScribbleParser.ROLENAME: return new RoleNode(t); case ScribbleParser.SIGPARAMNAME: return new SigParamNode(t); - case ScribbleParser.AMBIGUOUSNAME: return new AmbigNameNode(t);*/ - //case ScribbleParser.OPNAME: return new OpNode(t); // FIXME: empty special case + case ScribbleParser.TYPEPARAMNAME: return new TypeParamNode(t); + */ case ScribbleParser.TYPENAME: return new DataTypeNode(t); case ScribbleParser.SIGNAME: return new MessageSigNameNode(t); @@ -105,6 +103,8 @@ public ScribNode create(Token t) case ScribbleParser.PAYLOADTYPEDECL: return new DataTypeDecl(t); case ScribbleParser.MESSAGESIGNATUREDECL: return new MessageSigNameDecl(t); case ScribbleParser.GLOBALPROTOCOLDECL: return new GProtocolDecl(t); + + // CHECKME: refactor into header? case ScribbleParser.GLOBALPROTOCOLDECLMODS: return new ProtocolModList(t); case ScribbleParser.AUX_KW: return new AuxMod(t); // FIXME: KW being used directly case ScribbleParser.EXPLICIT_KW: return new ExplicitMod(t); @@ -115,27 +115,28 @@ public ScribNode create(Token t) case ScribbleParser.PARAMETERDECLLIST: return new NonRoleParamDeclList(t); case ScribbleParser.TYPEPARAMDECL: return new TypeParamDecl(t); case ScribbleParser.SIGPARAMDECL: return new SigParamDecl(t); + case ScribbleParser.GLOBALPROTOCOLDEF: return new GProtocolDef(t); case ScribbleParser.GLOBALPROTOCOLBLOCK: return new GProtocolBlock(t); case ScribbleParser.GLOBALINTERACTIONSEQUENCE: return new GInteractionSeq(t); + case ScribbleParser.MESSAGESIGNATURE: return new MessageSigNode(t); + case ScribbleParser.PAYLOAD: return new PayloadElemList(t); // N.B. UnaryPayloadElem parsed "manually" in Scribble.g + case ScribbleParser.GLOBALMESSAGETRANSFER: return new GMessageTransfer(t); case ScribbleParser.GLOBALCONNECT: return new GConnect(t); - case ScribbleParser.GLOBALDISCONNECT: return new GDisconnect(t); - case ScribbleParser.GLOBALCHOICE: return new GChoice(t); - case ScribbleParser.GLOBALRECURSION: return new GRecursion(t); case ScribbleParser.GLOBALCONTINUE: return new GContinue(t); + case ScribbleParser.GLOBALDISCONNECT: return new GDisconnect(t); case ScribbleParser.GLOBALDO: return new GDo(t); - case ScribbleParser.RECURSIONVAR: return new RecVarNode(t); - - case ScribbleParser.MESSAGESIGNATURE: return new MessageSigNode(t); - case ScribbleParser.PAYLOAD: return new PayloadElemList(t); // N.B. UnaryPayloadElem parsed "manually" in Scribble.g case ScribbleParser.ROLEINSTANTIATIONLIST: return new RoleArgList(t); case ScribbleParser.ROLEINSTANTIATION: return new RoleArg(t); case ScribbleParser.ARGUMENTINSTANTIATIONLIST: return new NonRoleArgList(t); case ScribbleParser.NONROLEARG: return new NonRoleArg(t); // Only for messagesignature -- qualifiedname (datatypenode or ambignamenode) done "manually" in scribble.g (cf. UnaryPayloadElem) + case ScribbleParser.GLOBALCHOICE: return new GChoice(t); + case ScribbleParser.GLOBALRECURSION: return new GRecursion(t); + // Special cases case ScribbleParser.EMPTY_OPERATOR: //return new IdNode(t); // OpNode.toName checks IdNode child text for OpNode.EMPTY_OP_ID // CHECKME refactor? diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 0c39579d8..4d3fa279b 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -74,6 +74,9 @@ module tmp.Test; // refactor scribble.g, simplify ast/del/etc class names and deprecated class code // CHECKME: duplicte proto mods + //...HERE fix simp node constructors and af (no IdNode child) --- fix ambignodel to use af -- fix ambignodel to use af -- fix ambignodel to use af -- fix ambignodel to use af - separate af methods + //...remove Token args from af constructors -- refactor reconstructs to use af? + // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) // sort out full name expansion between disamb and translation -- fix modulecontextcollector for imported module member fullnames // refactor additional disamb syntactic checks into core? e.g., do-calls, distinct roledecls, protodecls, etc. From cc908aa91715df803bfb23c79227e448d4b0d616 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Apr 2019 23:20:25 +0100 Subject: [PATCH 263/539] Continued: WIP refactoring name node parsing. --- .../java/org/scribble/ast/AstFactory.java | 3 +- .../java/org/scribble/ast/ScribNodeBase.java | 3 +- .../org/scribble/ast/name/simple/OpNode.java | 2 +- .../java/org/scribble/del/DoArgListDel.java | 6 +- .../org/scribble/del/NonRoleArgListDel.java | 5 +- .../java/org/scribble/del/RoleArgListDel.java | 4 +- .../org/scribble/parser/antlr/Scribble.g | 2 +- .../parser/scribble/AstFactoryImpl.java | 146 +++++++++--------- .../parser/scribble/ScribTreeAdaptor.java | 10 +- 9 files changed, 91 insertions(+), 90 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 636542a38..35f052954 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -49,12 +49,13 @@ import org.scribble.core.type.kind.PayloadTypeKind; +// CHECKME: add Token params back (for better transformation, cf. ScribNodeBase.source), and use null for "fresh"? // AstFactory is for making "fresh" nodes ("fresh" Tokens) -- cf. reconstruct (for Token preservation) // Implementations located in scribble-parser, use ScribbleParser for Token construction // Currently, used only in relatively niche places (since ANTLR now constructs all parsed nodes "directly") public interface AstFactory { - IdNode IdNode(String id); + IdNode IdNode(String text); // Deprecate? Never need to make ambigname "manually" via af? (only constructed by ScribbleParser) AmbigNameNode AmbiguousNameNode(String text); diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java index c384ba9c1..661b99a38 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -54,7 +54,8 @@ protected ScribNodeBase(ScribNodeBase node) { super(node); this.source = node.getSource(); // Keep ref to original as source (cf., this) - // A (partially) reconstructed/generated node may have no parent (i.e., null) if a AntlrSourceExcetpion occurs during construction? e.g., bad.syntax.disamb.doarglist.DoArgList06 + // A (partially) reconstructed/generated node may still have no parent (i.e., null) at the moment an error is raised during visit pass + // Can always use AntlrSourceException to blame the "child" (the original node) during visit rather than "visited", E.g., bad.syntax.disamb.doarglist.DoArgList06 } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java index eb927e5c9..b3940390e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java @@ -21,7 +21,7 @@ public class OpNode extends SimpleNameNode { // Determine by token text -- cannot use token type int in core, value is a ScribbleParser constant - public static final String EMPTY_OP_TOKEN_TEXT = "EMPTY_OPERATOR"; + public static final String EMPTY_OP_TOKEN_TEXT = "__EMPTY_OPERATOR"; // Cf. Scribble.g public OpNode(Token t) { diff --git a/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java index 7f49f96a3..3903c2ab4 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java @@ -44,9 +44,9 @@ public DoArgList leaveDisambiguation(ScribNode child, DoArgList dal = (DoArgList) visited; List args = dal.getArgChildren(); ProtocolDecl pd = getTargetProtocolDecl((Do) parent, disamb); - if (args.size() != getParamDeclList(pd).getParamDeclChildren().size()) + if (args.size() != getDeclList(pd).getParamDeclChildren().size()) { - throw new ScribException(visited.getSource(), + throw new ScribException(child.getSource(), "Do arity mismatch for " + pd.getHeaderChild() + ": " + args); } @@ -79,6 +79,6 @@ protected ProtocolDecl getTargetProtocolDecl(Do parent, return pd.get(0); } - protected abstract HeaderParamDeclList getParamDeclList( + protected abstract HeaderParamDeclList getDeclList( ProtocolDecl pd); } diff --git a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java index 68a88cc6d..b0b0e83e4 100644 --- a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java @@ -42,7 +42,8 @@ public NonRoleArgListDel() public NonRoleArgList leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { - NonRoleArgList nral = (NonRoleArgList) super.leaveDisambiguation(child, disamb, visited); + NonRoleArgList nral = (NonRoleArgList) super.leaveDisambiguation(child, + disamb, visited); // Checks matching arity Do parent = (Do) child.getParent(); @@ -88,7 +89,7 @@ else if (pkind.equals(DataTypeKind.KIND)) } @Override - protected NonRoleParamDeclList getParamDeclList(ProtocolDecl pd) + protected NonRoleParamDeclList getDeclList(ProtocolDecl pd) { return pd.getHeaderChild().getParamDeclListChild(); } diff --git a/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java index 4cba64f9e..b4a76ed3f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java @@ -34,7 +34,7 @@ public RoleArgListDel() public RoleArgList leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { - visited = super.leaveDisambiguation(child, disamb, visited); + visited = super.leaveDisambiguation(child, disamb, visited); // Checks matching arity // Duplicate check not needed for NonRoleArgList RoleArgList ral = (RoleArgList) visited; @@ -48,7 +48,7 @@ public RoleArgList leaveDisambiguation(ScribNode child, } @Override - protected RoleDeclList getParamDeclList(ProtocolDecl pd) + protected RoleDeclList getDeclList(ProtocolDecl pd) { return pd.getHeaderChild().getRoleDeclListChild(); } diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 59cbb161a..def6a9621 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -73,7 +73,7 @@ tokens */ // Special cases - EMPTY_OPERATOR = 'EMPTY_OPERATOR'; + EMPTY_OPERATOR = '__EMPTY_OPERATOR'; QUALIFIEDNAME = 'QUALIFIEDNAME'; // N.B. an intermediate node type, not an actual ScribNode -- "re-parsed" internally by parsePayloadElem/NonRoleArg // No relation to abstract AST class, QualifiedName diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java index b613b5e3c..db974ef01 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java @@ -163,7 +163,7 @@ public OpNode OpNode(String text) public RecVarNode RecVarNode(String text) { int ttype = ScribbleParser.RECURSIONVAR; - CommonToken t = newToken(ScribbleParser.RECURSIONVAR, "RECURSIONVAR"); + CommonToken t = newToken(ttype, "RECURSIONVAR"); RecVarNode n = new RecVarNode(ScribbleParser.RECURSIONVAR, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] del(n, new RecVarNodeDel()); return n; @@ -203,41 +203,41 @@ public TypeParamNode TypeParamNode(String text) public QualifiedNameNode QualifiedNameNode( K kind, List elems) { - QualifiedNameNode qnn = null; + QualifiedNameNode n = null; if (kind.equals(SigKind.KIND)) { CommonToken t = newToken(ScribbleParser.SIGNAME, "SIGNAME"); - qnn = new MessageSigNameNode(t); - qnn = del(qnn, new MessageSigNameNodeDel()); + n = new MessageSigNameNode(t); + del(n, new MessageSigNameNodeDel()); } else if (kind.equals(DataTypeKind.KIND)) { CommonToken t = newToken(ScribbleParser.TYPENAME, "TYPENAME"); - qnn = new DataTypeNode(t); - qnn = del(qnn, new DataTypeNodeDel()); + n = new DataTypeNode(t); + del(n, new DataTypeNodeDel()); } - if (qnn != null) + if (n != null) { - qnn.addChildren(elems); - return castNameNode(kind, qnn); + n.addChildren(elems); + return castNameNode(kind, n); } if (kind.equals(ModuleKind.KIND)) { CommonToken t = newToken(ScribbleParser.MODULENAME, "MODULENAME"); - qnn = new ModuleNameNode(t); + n = new ModuleNameNode(t); } else if (kind.equals(Global.KIND)) { CommonToken t = newToken(ScribbleParser.GPROTOCOLNAME, "GPROTOCOLNAME"); - qnn = new GProtocolNameNode(t); + n = new GProtocolNameNode(t); } else { throw new RuntimeException("Shouldn't get in here: " + kind); } - qnn.addChildren(elems); - return castNameNode(kind, del(qnn, createDefaultDelegate())); + n.addChildren(elems); + return castNameNode(kind, del(n, createDefaultDelegate())); } protected static , K extends Kind> T castNameNode( @@ -269,21 +269,21 @@ private CommonToken newToken(int type, String text) public MessageSigNode MessageSigNode(OpNode op, PayloadElemList pay) { CommonToken t = newToken(ScribbleParser.MESSAGESIGNATURE, "MESSAGESIGNATURE"); - MessageSigNode msn = new MessageSigNode(t); - msn.addChild(op); - msn.addChild(pay); - msn = del(msn, createDefaultDelegate()); - return msn; + MessageSigNode n = new MessageSigNode(t); + n.addChild(op); + n.addChild(pay); + del(n, createDefaultDelegate()); + return n; } @Override public PayloadElemList PayloadElemList(List> elems) { CommonToken t = newToken(ScribbleParser.PAYLOAD, "PAYLOAD"); - PayloadElemList p = new PayloadElemList(t); - p.addChildren(elems); - p = del(p, createDefaultDelegate()); - return p; + PayloadElemList n = new PayloadElemList(t); + n.addChildren(elems); + del(n, createDefaultDelegate()); + return n; } // Not used by ScribbleParser -- parsed "directly" within Scribble.g @@ -292,23 +292,23 @@ public UnaryPayloadElem UnaryPayloadElem( PayloadElemNameNode name) { CommonToken t = newToken(ScribbleParser.UNARYPAYLOADELEM, "UNARYPAYLOADELEM"); - UnaryPayloadElem de = new UnaryPayloadElem<>(t); + UnaryPayloadElem n = new UnaryPayloadElem<>(t); // Cf. Scribble.g children order - de.addChild(name); - de = del(de, createDefaultDelegate()); - return de; + n.addChild(name); + del(n, createDefaultDelegate()); + return n; } @Override public GDelegationElem GDelegationElem(GProtocolNameNode proto, RoleNode role) { CommonToken t = newToken(ScribbleParser.DELEGATION, "DELEGATION"); - GDelegationElem de = new GDelegationElem(t); - de.addChild(proto); - de.addChild(role); - //de = del(de, createDefaultDelegate()); - de = del(de, new GDelegationElemDel()); // FIXME: GDelegationElemDel - return de; + GDelegationElem n = new GDelegationElem(t); + n.addChild(proto); + n.addChild(role); + //del(n, createDefaultDelegate()); + del(n, new GDelegationElemDel()); // FIXME: GDelegationElemDel + return n; } @Override @@ -322,7 +322,7 @@ public Module Module(ModuleDecl moddecl, n.addChildren(imports); n.addChildren(data); n.addChildren(protos); - n = del(n, new ModuleDel()); + del(n, new ModuleDel()); return n; } @@ -332,7 +332,7 @@ public ModuleDecl ModuleDecl(ModuleNameNode fullmodname) CommonToken t = newToken(ScribbleParser.MODULEDECL, "MODULEDECL"); ModuleDecl n = new ModuleDecl(t); n.addChild(fullmodname); - n = del(n, createDefaultDelegate()); + del(n, createDefaultDelegate()); return n; } @@ -341,14 +341,14 @@ public ImportModule ImportModule(ModuleNameNode modname, ModuleNameNode alias) { CommonToken t = newToken(ScribbleParser.IMPORTMODULE, "IMPORTMODULE"); - ImportModule im = new ImportModule(t); - im.addChild(modname); + ImportModule n = new ImportModule(t); + n.addChild(modname); if (alias != null) { - im.addChild(alias); + n.addChild(alias); } - im = del(im, new ImportModuleDel()); - return im; + del(n, new ImportModuleDel()); + return n; } @Override @@ -362,7 +362,7 @@ public MessageSigNameDecl MessageSigNameDecl(IdNode schema, n.addChild(extName); n.addChild(extSource); n.addChild(alias); - n = del(n, createDefaultDelegate()); + del(n, createDefaultDelegate()); return n; } @@ -377,7 +377,7 @@ public DataTypeDecl DataTypeDecl(IdNode schema, n.addChild(extName); n.addChild(extSource); n.addChild(alias); - n = del(n, createDefaultDelegate()); + del(n, createDefaultDelegate()); return n; } @@ -387,12 +387,12 @@ public GProtocolDecl GProtocolDecl(ProtocolModList mods, { CommonToken t = newToken(ScribbleParser.GLOBALPROTOCOLDECL, "GLOBALPROTOCOLDECL"); - GProtocolDecl gpd = new GProtocolDecl(t); - gpd.addChild(mods); - gpd.addChild(header); - gpd.addChild(def); - gpd = del(gpd, new GProtocolDeclDel()); - return gpd; + GProtocolDecl n = new GProtocolDecl(t); + n.addChild(mods); + n.addChild(header); + n.addChild(def); + del(n, new GProtocolDeclDel()); + return n; } @Override @@ -405,7 +405,7 @@ public GProtocolHeader GProtocolHeader(GProtocolNameNode name, n.addChild(name); n.addChild(ps); n.addChild(rs); - n = del(n, createDefaultDelegate()); + del(n, createDefaultDelegate()); return n; } @@ -414,11 +414,11 @@ public RoleDeclList RoleDeclList(List ds) { CommonToken t = newToken(ScribbleParser.ROLEDECLLIST, "ROLEDECLLIST"); - RoleDeclList rdl = new RoleDeclList(t); + RoleDeclList n = new RoleDeclList(t); // Cf. Scribble.g children order - rdl.addChildren(ds); - rdl = del(rdl, new RoleDeclListDel()); - return rdl; + n.addChildren(ds); + del(n, new RoleDeclListDel()); + return n; } @Override @@ -428,7 +428,7 @@ public RoleDecl RoleDecl(RoleNode r) "ROLEDECL"); RoleDecl n = new RoleDecl(t); n.addChild(r); - n = del(n, new RoleDeclDel()); + del(n, new RoleDeclDel()); return n; } @@ -438,11 +438,11 @@ public NonRoleParamDeclList NonRoleParamDeclList( { CommonToken t = newToken(ScribbleParser.ROLEDECL, "ROLEDECL"); - NonRoleParamDeclList pdl = new NonRoleParamDeclList(t); + NonRoleParamDeclList n = new NonRoleParamDeclList(t); // Cf. Scribble.g children order - pdl.addChildren(ds); - pdl = del(pdl, new NonRoleParamDeclListDel()); - return pdl; + n.addChildren(ds); + del(n, new NonRoleParamDeclListDel()); + return n; } @Deprecated @@ -451,7 +451,7 @@ public NonRoleParamDecl NonRoleParamDecl( K kind, NonRoleParamNode namenode) { /*NonRoleParamDecl pd = new NonRoleParamDecl(source, kind, namenode); - pd = del(pd, new NonRoleParamDeclDel()); + del(pd, new NonRoleParamDeclDel()); return pd;*/ throw new RuntimeException("Deprecated"); } @@ -463,7 +463,7 @@ public GProtocolDef GProtocolDef(GProtocolBlock block) "GLOBALPROTOCOLDEF"); GProtocolDef n = new GProtocolDef(t); n.addChild(block); - n = del(n, new GProtocolDefDel()); + del(n, new GProtocolDefDel()); return n; } @@ -474,7 +474,7 @@ public GProtocolBlock GProtocolBlock(GInteractionSeq seq) "GLOBALPROTOCOLBLOCK"); GProtocolBlock n = new GProtocolBlock(t); n.addChild(seq); - n = del(n, new GProtocolBlockDel()); + del(n, new GProtocolBlockDel()); return n; } @@ -485,7 +485,7 @@ public GInteractionSeq GInteractionSeq(List elems) "GLOBALINTERACTIONSEQUENCE"); GInteractionSeq n = new GInteractionSeq(t); n.addChildren(elems); - n = del(n, new GInteractionSeqDel()); + del(n, new GInteractionSeqDel()); return n; } @@ -499,7 +499,7 @@ public GMessageTransfer GMessageTransfer(RoleNode src, n.addChild(msg); n.addChild(src); n.addChildren(dsts); - n = del(n, new GMessageTransferDel()); + del(n, new GMessageTransferDel()); return n; } @@ -512,7 +512,7 @@ public GConnect GConnect(RoleNode src, MessageNode msg, RoleNode dst) n.addChild(msg); n.addChild(src); n.addChild(dst); - n = del(n, new GConnectDel()); + del(n, new GConnectDel()); return n; } @@ -524,7 +524,7 @@ public GDisconnect GDisconnect(RoleNode left, RoleNode right) GDisconnect n = new GDisconnect(t); n.addChild(left); n.addChild(right); - n = del(n, new GDisconnectDel()); + del(n, new GDisconnectDel()); return n; } @@ -536,7 +536,7 @@ public GWrap GWrap(RoleNode src, RoleNode dst) GWrap n = new GWrap(t); n.addChild(src); n.addChild(dst); - n = del(n, new GWrapDel()); + del(n, new GWrapDel()); return n; } @@ -548,7 +548,7 @@ public GChoice GChoice(RoleNode subj, List blocks) GChoice n = new GChoice(t); n.addChild(subj); n.addChildren(blocks); - n = del(n, new GChoiceDel()); + del(n, new GChoiceDel()); return n; } @@ -561,7 +561,7 @@ public GRecursion GRecursion(RecVarNode rv, GRecursion n = new GRecursion(t); n.addChild(rv); n.addChild(block); - n = del(n, new GRecursionDel()); + del(n, new GRecursionDel()); return n; } @@ -572,7 +572,7 @@ public GContinue GContinue(RecVarNode rv) "GLOBALCONTINUE"); GContinue n = new GContinue(t); n.addChild(rv); - n = del(n, new GContinueDel()); + del(n, new GContinueDel()); return n; } @@ -585,7 +585,7 @@ public GDo GDo(RoleArgList rs, NonRoleArgList as, GProtocolNameNode proto) n.addChild(proto); n.addChild(rs); n.addChild(as); - n = del(n, new GDoDel()); + del(n, new GDoDel()); return n; } @@ -596,7 +596,7 @@ public RoleArgList RoleArgList(List rs) "GLOBALDO"); RoleArgList n = new RoleArgList(t); n.addChildren(rs); - n = del(n, new RoleArgListDel()); + del(n, new RoleArgListDel()); return n; } @@ -607,7 +607,7 @@ public RoleArg RoleArg(RoleNode r) "GLOBALDO"); RoleArg n = new RoleArg(t); n.addChild(r); - n = del(n, createDefaultDelegate()); + del(n, createDefaultDelegate()); return n; } @@ -618,7 +618,7 @@ public NonRoleArgList NonRoleArgList(List as) "ARGUMENTINSTANTIATIONLIST"); NonRoleArgList n = new NonRoleArgList(t); n.addChildren(as); - n = del(n, new NonRoleArgListDel()); + del(n, new NonRoleArgListDel()); return n; } @@ -629,7 +629,7 @@ public NonRoleArg NonRoleArg(NonRoleArgNode arg) "ARGUMENTINSTANTIATIONLIST"); NonRoleArg n = new NonRoleArg(t); n.addChild(arg); - n = del(n, createDefaultDelegate()); + del(n, createDefaultDelegate()); return n; } } diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index cd1851651..e4b075aee 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -92,10 +92,10 @@ public ScribNode create(Token t) case ScribbleParser.TYPEPARAMNAME: return new TypeParamNode(t); */ - case ScribbleParser.TYPENAME: return new DataTypeNode(t); - case ScribbleParser.SIGNAME: return new MessageSigNameNode(t); - case ScribbleParser.MODULENAME: return new ModuleNameNode(t); case ScribbleParser.GPROTOCOLNAME: return new GProtocolNameNode(t); + case ScribbleParser.MODULENAME: return new ModuleNameNode(t); + case ScribbleParser.SIGNAME: return new MessageSigNameNode(t); + case ScribbleParser.TYPENAME: return new DataTypeNode(t); case ScribbleParser.MODULE: return new Module(t); case ScribbleParser.MODULEDECL: return new ModuleDecl(t); @@ -138,9 +138,7 @@ public ScribNode create(Token t) case ScribbleParser.GLOBALRECURSION: return new GRecursion(t); // Special cases - case ScribbleParser.EMPTY_OPERATOR: - //return new IdNode(t); // OpNode.toName checks IdNode child text for OpNode.EMPTY_OP_ID // CHECKME refactor? - return new OpNode(t); + case ScribbleParser.EMPTY_OPERATOR: return new OpNode(t); case ScribbleParser.QUALIFIEDNAME: return new IdNode(t); // Returns an IdNode whose token is "QUALIFIEDNAME", and whose children are the IdNode elements of the qualified name From 0acd160d9db4aa209a832cbdb20db66c9bfe543e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 00:45:48 +0100 Subject: [PATCH 264/539] Continued: tidying Scribble.g. --- .../org/scribble/ast/NonProtocolDecl.java | 1 + .../org/scribble/parser/antlr/Scribble.g | 884 ++++++++---------- .../parser/scribble/ScribTreeAdaptor.java | 4 +- scribble-test/src/test/scrib/tmp/Test.scr | 4 +- 4 files changed, 386 insertions(+), 507 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java b/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java index 505259ac7..269f2ab61 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java @@ -24,6 +24,7 @@ public abstract class NonProtocolDecl extends NameDeclNode implements ModuleMember { + // NameDeclNode.NAMENODE_CHILD_INDEX = 0; public static final int SCHEMA_NODE_CHILD_INDEX = 1; public static final int EXTNAME_NODE_CHILD_INDEX = 2; public static final int EXTSOURCE_NODE_CHILD_INDEX = 3; diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index def6a9621..fc8a4e5a2 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -19,9 +19,9 @@ grammar Scribble; options { - language = Java; - output = AST; - ASTLabelType = ScribNodeBase; + language = Java; + output = AST; + ASTLabelType = ScribNodeBase; } @@ -29,251 +29,251 @@ options tokens { - /* - * Parser "input" constants (lexer output; keywords, Section 2.4) - */ - - MODULE_KW = 'module'; - IMPORT_KW = 'import'; - SIG_KW = 'sig'; - TYPE_KW = 'type'; - PROTOCOL_KW = 'protocol'; - AS_KW = 'as'; - - GLOBAL_KW = 'global'; - LOCAL_KW = 'local'; - EXPLICIT_KW = 'explicit'; - AUX_KW = 'aux'; - - ROLE_KW = 'role'; - SELF_KW = 'self'; - - FROM_KW = 'from'; - TO_KW = 'to'; - CONNECT_KW = 'connect'; - WRAP_KW = 'wrap'; - - DISCONNECT_KW = 'disconnect'; - AND_KW = 'and'; - - CHOICE_KW = 'choice'; - AT_KW = 'at'; - OR_KW = 'or'; - - REC_KW = 'rec'; - CONTINUE_KW = 'continue'; - DO_KW = 'do'; - - - /* - * Parser "output" node types (corresponding to the various syntactic - * categories), i.e. the labels used to distinguish resulting AST nodes. The - * specific value of these tokens doesn't matter (because not parsed - * themselves). - */ - - // Special cases - EMPTY_OPERATOR = '__EMPTY_OPERATOR'; - QUALIFIEDNAME = 'QUALIFIEDNAME'; - // N.B. an intermediate node type, not an actual ScribNode -- "re-parsed" internally by parsePayloadElem/NonRoleArg - // No relation to abstract AST class, QualifiedName - - - // Names - AMBIGUOUSNAME = 'AMBIGUOUSNAME'; - MODULENAME = 'MODULENAME'; - GPROTOCOLNAME = 'GPROTOCOLNAME'; - OPNAME = 'OPNAME'; - RECURSIONVAR = 'RECURSIONVAR'; - ROLENAME = 'ROLENAME'; - SIGNAME = 'SIGNAME'; - SIGPARAMNAME = 'SIGPARAMNAME'; // N.B. distinct from SIGNAME - TYPENAME = 'TYPENAME'; - TYPEPARAMNAME = 'TYPEPARAMNAME'; // N.B. distinct from TYPENAME - - - // "Node type" constants -- parsed "directly" by AntlrToScribParser - // TODO: split naming of type int constant from String label ? - // TODO: split imaginary node types - - MODULE = 'MODULE'; - MODULEDECL = 'MODULEDECL'; - IMPORTMODULE = 'IMPORTMODULE'; - - PAYLOADTYPEDECL = 'PAYLOADTYPEDECL'; - MESSAGESIGNATUREDECL = 'MESSAGESIGNATUREDECL'; - - GLOBALPROTOCOLDECL = 'GLOBALPROTOCOLDECL'; - GLOBALPROTOCOLDECLMODS = 'GLOBALPROTOCOLDECLMODS'; - GLOBALPROTOCOLHEADER = 'GLOBALPROTOCOLHEADER'; - - ROLEDECLLIST = 'ROLEDECLLIST'; - ROLEDECL = 'ROLEDECL'; - PARAMETERDECLLIST = 'PARAMETERDECLLIST'; - TYPEPARAMDECL = 'TYPEPARAMDECL'; - SIGPARAMDECL = 'SIGPARAMDECL'; - - GLOBALPROTOCOLDEF = 'GLOBALPROTOCOLDEF'; - GLOBALPROTOCOLBLOCK = 'GLOBALPROTOCOLBLOCK'; - GLOBALINTERACTIONSEQUENCE = 'GLOBALINTERACTIONSEQUENCE'; - - MESSAGESIGNATURE = 'MESSAGESIGNATURE'; - PAYLOAD = 'PAYLOAD'; - UNARYPAYLOADELEM = 'UNARYPAYLOADELEM'; - DELEGATION = 'DELEGATION'; - - GLOBALMESSAGETRANSFER = 'GLOBALMESSAGETRANSFER'; - GLOBALCONNECT = 'GLOBALCONNECT'; - GLOBALWRAP = 'GLOBALWRAP'; - GLOBALDISCONNECT = 'GLOBALDISCONNECT'; - GLOBALCONTINUE = 'GLOBALCONTINUE'; - GLOBALDO = 'GLOBALDO'; - - ROLEINSTANTIATIONLIST = 'ROLEINSTANTIATIONLIST'; - ROLEINSTANTIATION = 'ROLEINSTANTIATION'; // FIXME: not consistent with arginstas/payloadeles - ARGUMENTINSTANTIATIONLIST = 'ARGUMENTINSTANTIATIONLIST'; // FIXME: token name inconsistent with class name (NonRoleArgList) - NONROLEARG = 'NONROLEARG'; - - GLOBALCHOICE = 'GLOBALCHOICE'; - GLOBALRECURSION = 'GLOBALRECURSION'; + /* + * Parser "input" constants (lexer output; keywords, Section 2.4) + */ + + MODULE_KW = 'module'; + IMPORT_KW = 'import'; + SIG_KW = 'sig'; + TYPE_KW = 'type'; + PROTOCOL_KW = 'protocol'; + AS_KW = 'as'; + + GLOBAL_KW = 'global'; + LOCAL_KW = 'local'; + EXPLICIT_KW = 'explicit'; + AUX_KW = 'aux'; + + ROLE_KW = 'role'; + SELF_KW = 'self'; + + FROM_KW = 'from'; + TO_KW = 'to'; + CONNECT_KW = 'connect'; + WRAP_KW = 'wrap'; + + DISCONNECT_KW = 'disconnect'; + AND_KW = 'and'; + + CHOICE_KW = 'choice'; + AT_KW = 'at'; + OR_KW = 'or'; + + REC_KW = 'rec'; + CONTINUE_KW = 'continue'; + DO_KW = 'do'; + + + /* + * Parser "output" node types (corresponding to the various syntactic + * categories), i.e. the labels used to distinguish resulting AST nodes. The + * specific value of these tokens doesn't matter (because not parsed + * themselves). + */ + + // Special cases + EMPTY_OPERATOR = '__EMPTY_OPERATOR'; + QUALIFIEDNAME = '__QUALIFIEDNAME'; + // N.B. an intermediate node type, not an actual ScribNode -- "re-parsed" internally by parsePayloadElem/NonRoleArg + // No relation to abstract AST class, QualifiedName + + + // Names + AMBIGUOUSNAME = 'AMBIGUOUSNAME'; + MODULENAME = 'MODULENAME'; + GPROTOCOLNAME = 'GPROTOCOLNAME'; + OPNAME = 'OPNAME'; + RECURSIONVAR = 'RECURSIONVAR'; + ROLENAME = 'ROLENAME'; + SIGNAME = 'SIGNAME'; + SIGPARAMNAME = 'sigparamnamenode'; // N.B. distinct from SIGNAME + TYPENAME = 'TYPENAME'; + TYPEPARAMNAME = 'typeparamnamenode'; // N.B. distinct from TYPENAME + + + // "Node type" constants -- parsed "directly" by AntlrToScribParser + // TODO: split naming of type int constant from String label ? + // TODO: split imaginary node types + + MODULE = 'MODULE'; + MODULEDECL = 'MODULEDECL'; + IMPORTMODULE = 'IMPORTMODULE'; + + PAYLOADTYPEDECL = 'PAYLOADTYPEDECL'; + MESSAGESIGNATUREDECL = 'MESSAGESIGNATUREDECL'; + + GLOBALPROTOCOLDECL = 'GLOBALPROTOCOLDECL'; + GLOBALPROTOCOLDECLMODS = 'GLOBALPROTOCOLDECLMODS'; + GLOBALPROTOCOLHEADER = 'GLOBALPROTOCOLHEADER'; + + ROLEDECLLIST = 'ROLEDECLLIST'; + ROLEDECL = 'ROLEDECL'; + PARAMETERDECLLIST = 'PARAMETERDECLLIST'; + TYPEPARAMDECL = 'TYPEPARAMDECL'; + SIGPARAMDECL = 'SIGPARAMDECL'; + + GLOBALPROTOCOLDEF = 'GLOBALPROTOCOLDEF'; + GLOBALPROTOCOLBLOCK = 'GLOBALPROTOCOLBLOCK'; + GLOBALINTERACTIONSEQUENCE = 'GLOBALINTERACTIONSEQUENCE'; + + MESSAGESIGNATURE = 'MESSAGESIGNATURE'; + PAYLOAD = 'PAYLOAD'; + UNARYPAYLOADELEM = 'UNARYPAYLOADELEM'; + DELEGATION = 'DELEGATION'; + + GLOBALMESSAGETRANSFER = 'GLOBALMESSAGETRANSFER'; + GLOBALCONNECT = 'GLOBALCONNECT'; + GLOBALWRAP = 'GLOBALWRAP'; + GLOBALDISCONNECT = 'GLOBALDISCONNECT'; + GLOBALCONTINUE = 'GLOBALCONTINUE'; + GLOBALDO = 'GLOBALDO'; + + ROLEINSTANTIATIONLIST = 'ROLEINSTANTIATIONLIST'; + ROLEINSTANTIATION = 'ROLEINSTANTIATION'; // FIXME: not consistent with arginstas/payloadeles + ARGUMENTINSTANTIATIONLIST = 'ARGUMENTINSTANTIATIONLIST'; // FIXME: token name inconsistent with class name (NonRoleArgList) + NONROLEARG = 'NONROLEARG'; + + GLOBALCHOICE = 'GLOBALCHOICE'; + GLOBALRECURSION = 'GLOBALRECURSION'; } -// Has to come after tokens? +// Must come after tokens? @parser::header { - package org.scribble.parser.antlr; - - //import org.scribble.main.RuntimeScribbleException; - //import org.scribble.parser.scribble.ast.tree.MyCommonTree; - import org.scribble.ast.ScribNodeBase; - import org.scribble.ast.UnaryPayloadElem; - import org.scribble.ast.NonRoleArg; - import org.scribble.ast.name.qualified.DataTypeNode; - import org.scribble.ast.name.simple.IdNode; - import org.scribble.ast.name.simple.AmbigNameNode; - import org.scribble.ast.name.simple.RecVarNode; - import org.scribble.ast.name.simple.*; - import org.scribble.ast.*; + package org.scribble.parser.antlr; + + //import org.scribble.main.RuntimeScribbleException; + //import org.scribble.parser.scribble.ast.tree.MyCommonTree; + import org.scribble.ast.ScribNodeBase; + import org.scribble.ast.UnaryPayloadElem; + import org.scribble.ast.NonRoleArg; + import org.scribble.ast.name.qualified.DataTypeNode; + import org.scribble.ast.name.simple.IdNode; + import org.scribble.ast.name.simple.AmbigNameNode; + import org.scribble.ast.name.simple.RecVarNode; + import org.scribble.ast.name.simple.*; + import org.scribble.ast.*; } @lexer::header { - package org.scribble.parser.antlr; - - //import org.scribble.main.RuntimeScribbleException; + package org.scribble.parser.antlr; + + //import org.scribble.main.RuntimeScribbleException; } /*// Was swallowing parser error messages @members { - //private org.scribble.logging.IssueLogger _logger=null; - private String _document=null; - private boolean _errorOccurred=false; - + //private org.scribble.logging.IssueLogger _logger=null; + private String _document=null; + private boolean _errorOccurred=false; + /*public void setLogger(org.scribble.logging.IssueLogger logger) { - _logger = logger; + _logger = logger; }* / public void setDocument(String doc) { - _document = doc; + _document = doc; } public void emitErrorMessage(String mesg) { - /*if (_logger == null) { - super.emitErrorMessage(mesg); - } else { - _logger.error(org.scribble.parser.antlr.ANTLRMessageUtil.getMessageText(mesg), - org.scribble.parser.antlr.ANTLRMessageUtil.getProperties(mesg, _document)); - }* / - _errorOccurred = true; + /*if (_logger == null) { + super.emitErrorMessage(mesg); + } else { + _logger.error(org.scribble.parser.antlr.ANTLRMessageUtil.getMessageText(mesg), + org.scribble.parser.antlr.ANTLRMessageUtil.getProperties(mesg, _document)); + }* / + _errorOccurred = true; } public boolean isErrorOccurred() { - return(_errorOccurred); + return(_errorOccurred); } }*/ @parser::members { - /*@Override - public void reportError(RecognitionException e) - { - super.reportError(e); - //throw new RuntimeScribbleException(e.getMessage()); - //System.exit(1); - }*/ - - // Abort tool run on parsing errors (and display user-friendly message) -- obsoletes CommonErrorNode check? - @Override - public void displayRecognitionError(String[] tokenNames, RecognitionException e) - { - /*String hdr = getErrorHeader(e); - String msg = getErrorMessage(e, tokenNames); - //throw new RuntimeException(hdr + ":" + msg); - System.err.println(hdr + ":" + msg);*/ - super.displayRecognitionError(tokenNames, e); - System.exit(1); - } - - // qn is an IdNode "holder" for a qualifiedname - // CHECKME: do the returns of these "bypass" ScribTreeAdaptor? specifically AmbigNode - public static CommonTree parsePayloadElem(CommonTree qn) throws RecognitionException - { - if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname - { - DataTypeNode dt = new DataTypeNode(new CommonToken(TYPENAME, "TYPENAME")); - ((List) qn.getChildren()).forEach(x -> - dt.addChild(new IdNode(new CommonToken(IDENTIFIER, ((CommonTree) x).getText())))); - UnaryPayloadElem pe = - new UnaryPayloadElem(new CommonToken(UNARYPAYLOADELEM, "UNARYPAYLOADELEM")); - pe.addChild(dt); - return pe; // N.B. "re-parsed" by ScribTreeAdaptor? Could return CommonTree here? - } - else - { - // Similarly to NonRoleArg: cannot syntactically distinguish right now between SimplePayloadTypeNode and ParameterNode - String text = qn.getChild(0).getText(); - IdNode id = new IdNode(new CommonToken(IDENTIFIER, text)); - /*AmbigNameNode an = - new AmbigNameNode(new CommonToken(AMBIGUOUSNAME, "AMBIGUOUSNAME")); - an.addChild(id);*/ - AmbigNameNode an = - new AmbigNameNode(AMBIGUOUSNAME, new CommonToken(IDENTIFIER, text)); - UnaryPayloadElem e = new UnaryPayloadElem( - new CommonToken(UNARYPAYLOADELEM, "UNARYPAYLOADELEM")); - e.addChild(an); - return e; - } - } - - // Only for QualifiedName (DataTypeNode or AmbigNameNode), not messagesignature literal - // qn is an IdNode "holder" for a qualifiedname - public static CommonTree parseNonRoleArg(CommonTree qn) throws RecognitionException - { - if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname - { - DataTypeNode dt = new DataTypeNode(new CommonToken(TYPENAME, "TYPENAME")); - ((List) qn.getChildren()).forEach(x -> - dt.addChild(new IdNode(new CommonToken(IDENTIFIER, ((CommonTree) x).getText())))); - NonRoleArg a = - new NonRoleArg(new CommonToken(NONROLEARG, "NONROLEARG")); - a.addChild(dt); - return a; - } - else - { - String text = qn.getChild(0).getText(); - IdNode id = new IdNode(new CommonToken(IDENTIFIER, text)); - /*AmbigNameNode an = - new AmbigNameNode(new CommonToken(AMBIGUOUSNAME, "AMBIGUOUSNAME")); - an.addChild(id);*/ - AmbigNameNode an = - new AmbigNameNode(AMBIGUOUSNAME, new CommonToken(IDENTIFIER, text)); - NonRoleArg a = new NonRoleArg(new CommonToken(NONROLEARG, "NONROLEARG")); - a.addChild(an); - return a; - } - } + /*@Override + public void reportError(RecognitionException e) + { + super.reportError(e); + //throw new RuntimeScribbleException(e.getMessage()); + //System.exit(1); + }*/ + + // Abort tool run on parsing errors (and display user-friendly message) -- obsoletes CommonErrorNode check? + @Override + public void displayRecognitionError(String[] tokenNames, RecognitionException e) + { + /*String hdr = getErrorHeader(e); + String msg = getErrorMessage(e, tokenNames); + //throw new RuntimeException(hdr + ":" + msg); + System.err.println(hdr + ":" + msg);*/ + super.displayRecognitionError(tokenNames, e); + System.exit(1); + } + + // qn is an IdNode "holder" for a qualifiedname + // CHECKME: do the returns of these "bypass" ScribTreeAdaptor? specifically AmbigNode + public static CommonTree parsePayloadElem(CommonTree qn) throws RecognitionException + { + if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname + { + DataTypeNode dt = new DataTypeNode(new CommonToken(TYPENAME, "TYPENAME")); + ((List) qn.getChildren()).forEach(x -> + dt.addChild(new IdNode(new CommonToken(IDENTIFIER, ((CommonTree) x).getText())))); + UnaryPayloadElem pe = + new UnaryPayloadElem(new CommonToken(UNARYPAYLOADELEM, "UNARYPAYLOADELEM")); + pe.addChild(dt); + return pe; // N.B. "re-parsed" by ScribTreeAdaptor? Could return CommonTree here? + } + else + { + // Similarly to NonRoleArg: cannot syntactically distinguish right now between SimplePayloadTypeNode and ParameterNode + String text = qn.getChild(0).getText(); + IdNode id = new IdNode(new CommonToken(IDENTIFIER, text)); + /*AmbigNameNode an = + new AmbigNameNode(new CommonToken(AMBIGUOUSNAME, "AMBIGUOUSNAME")); + an.addChild(id);*/ + AmbigNameNode an = + new AmbigNameNode(AMBIGUOUSNAME, new CommonToken(IDENTIFIER, text)); + UnaryPayloadElem e = new UnaryPayloadElem( + new CommonToken(UNARYPAYLOADELEM, "UNARYPAYLOADELEM")); + e.addChild(an); + return e; + } + } + + // Only for QualifiedName (DataTypeNode or AmbigNameNode), not messagesignature literal + // qn is an IdNode "holder" for a qualifiedname + public static CommonTree parseNonRoleArg(CommonTree qn) throws RecognitionException + { + if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname + { + DataTypeNode dt = new DataTypeNode(new CommonToken(TYPENAME, "TYPENAME")); + ((List) qn.getChildren()).forEach(x -> + dt.addChild(new IdNode(new CommonToken(IDENTIFIER, ((CommonTree) x).getText())))); + NonRoleArg a = + new NonRoleArg(new CommonToken(NONROLEARG, "NONROLEARG")); + a.addChild(dt); + return a; + } + else + { + String text = qn.getChild(0).getText(); + IdNode id = new IdNode(new CommonToken(IDENTIFIER, text)); + /*AmbigNameNode an = + new AmbigNameNode(new CommonToken(AMBIGUOUSNAME, "AMBIGUOUSNAME")); + an.addChild(id);*/ + AmbigNameNode an = + new AmbigNameNode(AMBIGUOUSNAME, new CommonToken(IDENTIFIER, text)); + NonRoleArg a = new NonRoleArg(new CommonToken(NONROLEARG, "NONROLEARG")); + a.addChild(an); + return a; + } + } } @lexer::members @@ -281,21 +281,21 @@ tokens /*@Override public void reportError(RecognitionException e) { - super.reportError(e); + super.reportError(e); //throw new RuntimeScribbleException(e.getMessage()); - //System.exit(1); + //System.exit(1); }*/ - @Override - public void displayRecognitionError(String[] tokenNames, RecognitionException e) - { - /*String hdr = getErrorHeader(e); - String msg = getErrorMessage(e, tokenNames); - //throw new RuntimeException(hdr + ":" + msg); - System.err.println(hdr + ":" + msg);*/ - super.displayRecognitionError(tokenNames, e); - System.exit(1); - } + @Override + public void displayRecognitionError(String[] tokenNames, RecognitionException e) + { + /*String hdr = getErrorHeader(e); + String msg = getErrorMessage(e, tokenNames); + //throw new RuntimeException(hdr + ":" + msg); + System.err.println(hdr + ":" + msg);*/ + super.displayRecognitionError(tokenNames, e); + System.exit(1); + } } @@ -309,10 +309,10 @@ tokens // Not referred to explicitly, deals with whitespace implicitly (don't delete this) WHITESPACE: - ('\t' | ' ' | '\r' | '\n'| '\u000C')+ - { - $channel = HIDDEN; - } + ('\t' | ' ' | '\r' | '\n'| '\u000C')+ + { + $channel = HIDDEN; + } ; @@ -320,35 +320,35 @@ WHITESPACE: * Section 2.2 Comments */ COMMENT: - '/*' .* '*/' - { - $channel=HIDDEN; - } + '/*' .* '*/' + { + $channel=HIDDEN; + } ; LINE_COMMENT: - '//' ~('\n'|'\r')* '\r'? '\n' - { - $channel=HIDDEN; - } + '//' ~('\n'|'\r')* '\r'? '\n' + { + $channel=HIDDEN; + } ; /** * Section 2.3 Identifiers */ IDENTIFIER: - (LETTER | DIGIT | UNDERSCORE)* - /* Underscore currently can cause ambiguities in the API generation naming - * scheme But maybe only consecutive underscores are the problem -- cannot - * completely disallow underscores as needed for projection naming scheme - * Or disallow underscores only for role/op/messagesig names - */ + (LETTER | DIGIT | UNDERSCORE)* + /* Underscore currently can cause ambiguities in the API generation naming + * scheme But maybe only consecutive underscores are the problem -- cannot + * completely disallow underscores as needed for projection naming scheme + * Or disallow underscores only for role/op/messagesig names + */ ; fragment SYMBOL: - '{' | '}' | '(' | ')' | '[' | ']' | ':' | '/' | '\\' | '.' | '\#' + '{' | '}' | '(' | ')' | '[' | ']' | ':' | '/' | '\\' | '.' | '\#' | - '&' | '?' | '!' | UNDERSCORE + '&' | '?' | '!' | UNDERSCORE ; // Comes after SYMBOL due to an ANTLR syntax highlighting issue involving @@ -356,19 +356,19 @@ fragment SYMBOL: // Parser doesn't work without quotes here (e.g. if inlined into parser rules) EXTIDENTIFIER: '\"' (LETTER | DIGIT | SYMBOL)* '\"' - //(LETTER | DIGIT | SYMBOL)* + //(LETTER | DIGIT | SYMBOL)* ; fragment LETTER: - 'a'..'z' | 'A'..'Z' + 'a'..'z' | 'A'..'Z' ; fragment DIGIT: - '0'..'9' + '0'..'9' ; fragment UNDERSCORE: - '_' + '_' ; @@ -388,7 +388,7 @@ simplename: IDENTIFIER; //simplename; recursionvarname: IDENTIFIER ; -// IDENTIFIER^ +// IDENTIFIER^ rolename: simplename; @@ -399,8 +399,8 @@ simplemembername: simplename; // Only for member declarations //recursionvarnamenode: recursionvarname -> ^(RECURSIONVAR recursionvarname) ; //ambiguousnamenode: simplename -> ^(AMBIGUOUSNAME simplename); //opnamenode: IDENTIFIER -> ^(OPNAME IDENTIFIER) ; -//typeparamname: parametername -> ^(TYPEPARAMNAME parametername) ; -//sigparamname: parametername -> ^(SIGPARAMNAME parametername) ; +//typeparamnamenode: parametername -> ^(typeparamnamenode parametername) ; +//sigparamnamenode: parametername -> ^(sigparamnamenode parametername) ; //emptyopnamenode: ^(EMPTY_OPERATOR); // simp name nodes use token text for id value // FIXME: can't seem to use this "out of nowhere" in rewrite rules @@ -410,10 +410,12 @@ simplemembername: simplename; // Only for member declarations rolenamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER] ; recursionvarnamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; ambiguousnamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; -opnamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; +opnamenode: +IDENTIFIER -> IDENTIFIER[$IDENTIFIER] +| -> ^(EMPTY_OPERATOR); //emptyopnamenode: IDENTIFIER[EMPTY_OPERATOR]; // empty "left" of rewrite not allowed -typeparamname: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; -sigparamname: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; +typeparamnamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; +sigparamnamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; @@ -424,155 +426,114 @@ sigparamname: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; // Using qualified to rep simple simplemodulename: IDENTIFIER -> ^(MODULENAME IDENTIFIER) ; simplepayloadtypename: IDENTIFIER -> ^(TYPENAME IDENTIFIER) ; - // TODO factor out with typedecl? NO: params distinct from "literals" + // TODO factor out with typedecl? NO: params distinct from "literals" simplemessagesignaturename: IDENTIFIER -> ^(SIGNAME IDENTIFIER) ; - // TODO factor out with sigparamdecl? NO: params distinct from "literals" + // TODO factor out with sigparamdecl? NO: params distinct from "literals" qualifiedname: - IDENTIFIER ('.' IDENTIFIER)* + IDENTIFIER ('.' IDENTIFIER)* -> - ^(QUALIFIEDNAME IDENTIFIER+) + ^(QUALIFIEDNAME IDENTIFIER+) ; packagename: qualifiedname; membername: qualifiedname; modulename: - IDENTIFIER ('.' IDENTIFIER)* + IDENTIFIER ('.' IDENTIFIER)* -> - ^(MODULENAME IDENTIFIER+) + ^(MODULENAME IDENTIFIER+) ; protocolname: membername; payloadtypename: membername; messagesignaturename: - IDENTIFIER ('.' IDENTIFIER)* + IDENTIFIER ('.' IDENTIFIER)* -> - ^(SIGNAME IDENTIFIER+) + ^(SIGNAME IDENTIFIER+) ; gprotocolnamenode: - IDENTIFIER ('.' IDENTIFIER)* - -> - ^(GPROTOCOLNAME IDENTIFIER+) + IDENTIFIER ('.' IDENTIFIER)* + -> + ^(GPROTOCOLNAME IDENTIFIER+) ; /** * Section 3.2.2 Top-level Module Structure + * Section 3.2.3 Module Declarations */ // "References to tokens with rewrite not found on left of -> are imaginary tokens." +// Inlined moduledecl to make token info ref work module: - moduledecl importdecl* datatypedecl* protocoldecl* EOF + t=MODULE_KW modulename ';' importmodule* datatypedecl* protocoldecl* EOF -> - ^(MODULE moduledecl importdecl* datatypedecl* protocoldecl*) + ^(MODULE[$t] ^(MODULEDECL[$t] modulename) importmodule* datatypedecl* + protocoldecl*) ; - - -/** - * Section 3.2.3 Module Declarations - */ -moduledecl: - t=MODULE_KW modulename ';' --> - ^(MODULEDECL[$t] modulename) // TODO: add token arg to other imag nodes -; -/* -moduledecl: - MODULE_KW modulename ';' --> - MODULE_KW^ modulename // FIXME CHECKME: why not working? -; -*/ +// TODO: add token arg to other imag nodes +// moduledecl: MODULE_KW^ modulename ';' // "Become root" ^ cannot be on rhs? /** * Section 3.3 Import Declarations */ -importdecl: - importmodule -; - importmodule: - IMPORT_KW modulename ';' --> - ^(IMPORTMODULE modulename) -| - IMPORT_KW modulename AS_KW simplemodulename ';' --> - ^(IMPORTMODULE modulename simplemodulename) + t=IMPORT_KW modulename (AS_KW alias=simplemodulename)? ';' +-> ^(IMPORTMODULE[$t] modulename $alias?) ; /** - * //Section 3.4 Payload Type Declarations - * Data Declarations + * Section 3.4 Payload Type Declarations + * // TODO: rename type as data */ -datatypedecl: - payloadtypedecl -| - messagesignaturedecl -; +datatypedecl: payloadtypedecl | messagesignaturedecl ; payloadtypedecl: - TYPE_KW '<' IDENTIFIER '>' EXTIDENTIFIER FROM_KW EXTIDENTIFIER AS_KW simplepayloadtypename ';' + t=TYPE_KW '<' schema=IDENTIFIER '>' extName=EXTIDENTIFIER FROM_KW + extSource=EXTIDENTIFIER AS_KW alias=simplepayloadtypename ';' -> - ^(PAYLOADTYPEDECL simplepayloadtypename IDENTIFIER EXTIDENTIFIER EXTIDENTIFIER) + // alias first to be uniform with other NameDeclNode (getRawNameNodeChild) + ^(PAYLOADTYPEDECL[$t] $alias $schema $extName $extSource) ; -// alias first to be uniform with other NameDeclNode (getRawNameNodeChild) messagesignaturedecl: - SIG_KW '<' IDENTIFIER '>' EXTIDENTIFIER FROM_KW EXTIDENTIFIER AS_KW simplemessagesignaturename ';' + t=SIG_KW '<' schema=IDENTIFIER '>' extName=EXTIDENTIFIER FROM_KW + extSource=EXTIDENTIFIER AS_KW alias=simplemessagesignaturename ';' -> - ^(MESSAGESIGNATUREDECL simplemessagesignaturename IDENTIFIER EXTIDENTIFIER EXTIDENTIFIER) + // alias first to be uniform with other NameDeclNode (getRawNameNodeChild) + ^(MESSAGESIGNATUREDECL[$t] $alias $schema $extName $extSource) ; -// alias first to be uniform with other NameDeclNode (getRawNameNodeChild) /** * Section 3.5 Message Signatures */ -/*messageoperator: - IDENTIFIER -;*/ - messagesignature: - '(' payload ')' --> - ^(MESSAGESIGNATURE ^(EMPTY_OPERATOR) payload) -| - //messageoperator '(' payload ')' // Doesn't work (conflict with IDENTIFIER?) - opnamenode '(' payload ')' --> - ^(MESSAGESIGNATURE opnamenode payload) -| - '(' ')' --> - ^(MESSAGESIGNATURE ^(EMPTY_OPERATOR) ^(PAYLOAD)) -| - opnamenode '(' ')' --> - ^(MESSAGESIGNATURE opnamenode ^(PAYLOAD)) + opnamenode '(' payload ')' +-> ^(MESSAGESIGNATURE opnamenode payload) ; +// CHECKME: how to apply [$t] in these situations? payload: - payloadelement (',' payloadelement)* --> - ^(PAYLOAD payloadelement+) +-> ^(PAYLOAD) + | payloadelement (',' payloadelement)* +-> ^(PAYLOAD payloadelement+) ; -// Payload type names need disambiguation pass (also do args) payloadelement: - qualifiedname // This case subsumes simple names // FIXME: make ambiguousqualifiedname (or ambiguousnamenode should just be qualified) --> - { parsePayloadElem($qualifiedname.tree) } // Use ".text" instead of ".tree" for token String -| - protocolname '@' rolename --> - ^(DELEGATION rolename protocolname) + // Payload element must be a data kind, cannot be a sig name + // Qualified name must be a data type name + // Also subsumes simple names, could be a data *param* + qualifiedname +-> { parsePayloadElem($qualifiedname.tree) } // Use ".text" instead of ".tree" for token String + | protocolname '@' rolename +-> ^(DELEGATION rolename protocolname) ; @@ -580,184 +541,116 @@ payloadelement: /** * Section 3.6 Protocol Declarations */ -protocoldecl: - globalprotocoldecl -; +protocoldecl: globalprotocoldecl ; /** * Section 3.7 Global Protocol Declarations */ globalprotocoldecl: - globalprotocolheader globalprotocoldefinition --> - ^(GLOBALPROTOCOLDECL ^(GLOBALPROTOCOLDECLMODS) globalprotocolheader globalprotocoldefinition) -| - globalprotocoldeclmodifiers globalprotocolheader globalprotocoldefinition + globalprotocoldeclmodifiers globalprotocolheader globalprotocoldefinition -> - ^(GLOBALPROTOCOLDECL globalprotocoldeclmodifiers globalprotocolheader globalprotocoldefinition) + ^(GLOBALPROTOCOLDECL globalprotocoldeclmodifiers globalprotocolheader globalprotocoldefinition) ; - + +// "aux" must come before "explicit" globalprotocoldeclmodifiers: - AUX_KW EXPLICIT_KW --> - ^(GLOBALPROTOCOLDECLMODS AUX_KW EXPLICIT_KW) -| - EXPLICIT_KW --> - ^(GLOBALPROTOCOLDECLMODS EXPLICIT_KW) -| - AUX_KW --> - ^(GLOBALPROTOCOLDECLMODS AUX_KW) + -> ^(GLOBALPROTOCOLDECLMODS) + | t=AUX_KW -> ^(GLOBALPROTOCOLDECLMODS[$t] AUX_KW) + | t=AUX_KW EXPLICIT_KW -> ^(GLOBALPROTOCOLDECLMODS[$t] AUX_KW EXPLICIT_KW) + | t=EXPLICIT_KW -> ^(GLOBALPROTOCOLDECLMODS[$t] EXPLICIT_KW) ; -// GLOBAL_KW PROTOCOL_KW simpleprotocolname roledecllist globalprotocolheader: - GLOBAL_KW PROTOCOL_KW gprotocolnamenode roledecllist + GLOBAL_KW PROTOCOL_KW gprotocolnamenode parameterdecllist roledecllist -> - ^(GLOBALPROTOCOLHEADER gprotocolnamenode ^(PARAMETERDECLLIST) roledecllist) -| - GLOBAL_KW PROTOCOL_KW gprotocolnamenode parameterdecllist roledecllist --> - ^(GLOBALPROTOCOLHEADER gprotocolnamenode parameterdecllist roledecllist) + ^(GLOBALPROTOCOLHEADER gprotocolnamenode parameterdecllist roledecllist) ; -// GLOBAL_KW PROTOCOL_KW simpleprotocolname parameterdecllist roledecllist -/* gprotocolname --> - ^(GPROTOCOLNAME gprotocolname)*/ - -roledecllist: - '(' roledecl (',' roledecl)* ')' --> - ^(ROLEDECLLIST roledecl+) -; - -roledecl: - ROLE_KW rolenamenode --> - ^(ROLEDECL rolenamenode) -; -// ^(ROLEDECL ^(ROLENAME rolename)) +roledecllist: + t='(' roledecl (',' roledecl)* ')' -> ^(ROLEDECLLIST[$t] roledecl+) ; +roledecl: t=ROLE_KW rolenamenode -> ^(ROLEDECL[$t] rolenamenode) ; parameterdecllist: - '<' parameterdecl (',' parameterdecl)* '>' --> - ^(PARAMETERDECLLIST parameterdecl+) +-> ^(PARAMETERDECLLIST) + | t='<' parameterdecl (',' parameterdecl)* '>' +-> ^(PARAMETERDECLLIST[$t] parameterdecl+) ; -parameterdecl: - typedecl -| - sigdecl -; - -// cf. roledecl -typedecl: - TYPE_KW typeparamname --> - ^(TYPEPARAMDECL typeparamname) -; -// FIXME: should be a nonroleparamnode - -// cf. roledecl -sigdecl: - SIG_KW sigparamname --> - ^(SIGPARAMDECL sigparamname) -; +parameterdecl: typedecl | sigdecl ; +typedecl: + t=TYPE_KW typeparamnamenode -> ^(TYPEPARAMDECL[$t] typeparamnamenode) ; +sigdecl: + t=SIG_KW sigparamnamenode -> ^(SIGPARAMDECL[$t] sigparamnamenode) ; /** * Section 3.7.1 Global Protocol Definitions */ globalprotocoldefinition: - globalprotocolblock --> - ^(GLOBALPROTOCOLDEF globalprotocolblock) -; + globalprotocolblock -> ^(GLOBALPROTOCOLDEF globalprotocolblock) ; /** * Section 3.7.3 Global Interaction Sequences and Blocks */ globalprotocolblock: - '{' globalinteractionsequence '}' + t='{' globalinteractionsequence '}' -> - ^(GLOBALPROTOCOLBLOCK globalinteractionsequence) + ^(GLOBALPROTOCOLBLOCK[$t] globalinteractionsequence) ; globalinteractionsequence: - globalinteraction* + globalinteraction* -> - ^(GLOBALINTERACTIONSEQUENCE globalinteraction*) + ^(GLOBALINTERACTIONSEQUENCE globalinteraction*) ; globalinteraction: - globalmessagetransfer -| - globalchoice -| - globalrecursion -| - globalcontinue -| - globaldo -| - globalconnect -| - globaldisconnect -| - globalwrap + globalmessagetransfer +| globalchoice +| globalrecursion +| globalcontinue +| globaldo +| globalconnect +| globaldisconnect +| globalwrap ; -/*| - globalparallel -| - globalinterruptible*/ /** * Section 3.7.4 Global Message Transfer */ globalmessagetransfer: - message FROM_KW rolenamenode TO_KW rolenamenode (',' rolenamenode )* ';' --> - ^(GLOBALMESSAGETRANSFER message rolenamenode+) + message FROM_KW rolenamenode TO_KW rolenamenode (',' rolenamenode )* ';' +-> ^(GLOBALMESSAGETRANSFER message rolenamenode+) ; // TODO: multisend message: - messagesignature -| - ambiguousnamenode -; -// FIXME TODO: qualified (messagesig) names // although qualified messagesignaturename subsumes parametername case + messagesignature // Sig literal +| ambiguousnamenode // Sig name or sig param name +; +// TODO: qualified (messagesig) names // Although qualified messagesignaturename subsumes parametername case globalconnect: - //message CONNECT_KW rolename TO_KW rolename - CONNECT_KW rolenamenode TO_KW rolenamenode ';' --> - ^(GLOBALCONNECT ^(MESSAGESIGNATURE ^(EMPTY_OPERATOR) ^(PAYLOAD)) rolenamenode rolenamenode) // cf. messagesignature "()" case - // CHECKME: require "()" as for message transfers? i.e., simply delete this rule? -| - message CONNECT_KW rolenamenode TO_KW rolenamenode ';' --> - ^(GLOBALCONNECT message rolenamenode rolenamenode) + message CONNECT_KW rolenamenode TO_KW rolenamenode ';' +-> ^(GLOBALCONNECT message rolenamenode rolenamenode) + | t=CONNECT_KW rolenamenode TO_KW rolenamenode ';' +-> ^(GLOBALCONNECT[$t] ^(MESSAGESIGNATURE ^(EMPTY_OPERATOR) ^(PAYLOAD)) + rolenamenode rolenamenode) + // CHECKME: deprecate? i.e., require "()" as for message transfers? i.e., simply delete this rule? ; globaldisconnect: - DISCONNECT_KW rolenamenode AND_KW rolenamenode ';' --> - ^(GLOBALDISCONNECT rolenamenode rolenamenode) + t=DISCONNECT_KW rolenamenode AND_KW rolenamenode ';' +-> ^(GLOBALDISCONNECT[$t] rolenamenode rolenamenode) ; globalwrap: - //message CONNECT_KW rolename TO_KW rolename - WRAP_KW rolenamenode TO_KW rolenamenode ';' --> - ^(GLOBALWRAP rolenamenode rolenamenode) + t=WRAP_KW rolenamenode TO_KW rolenamenode ';' +-> ^(GLOBALWRAP[$t] rolenamenode rolenamenode) ; @@ -765,9 +658,9 @@ globalwrap: * Section 3.7.5 Global Choice */ globalchoice: - CHOICE_KW AT_KW rolenamenode globalprotocolblock (OR_KW globalprotocolblock)* --> - ^(GLOBALCHOICE rolenamenode globalprotocolblock+) + t=CHOICE_KW AT_KW rolenamenode globalprotocolblock (OR_KW + globalprotocolblock)* +-> ^(GLOBALCHOICE[$t] rolenamenode globalprotocolblock+) ; @@ -775,16 +668,14 @@ globalchoice: * Section 3.7.6 Global Recursion */ globalrecursion: - REC_KW recursionvarnamenode globalprotocolblock --> - ^(GLOBALRECURSION recursionvarnamenode globalprotocolblock) + t=REC_KW recursionvarnamenode globalprotocolblock +-> ^(GLOBALRECURSION[$t] recursionvarnamenode globalprotocolblock) ; globalcontinue: - CONTINUE_KW recursionvarnamenode ';' --> - ^(GLOBALCONTINUE recursionvarnamenode) + t=CONTINUE_KW recursionvarnamenode ';' +-> ^(GLOBALCONTINUE recursionvarnamenode) ; @@ -792,43 +683,28 @@ globalcontinue: * Section 3.7.9 Global Do */ globaldo: - DO_KW gprotocolnamenode roleinstantiationlist ';' --> - ^(GLOBALDO gprotocolnamenode ^(ARGUMENTINSTANTIATIONLIST) roleinstantiationlist) -| - DO_KW gprotocolnamenode argumentinstantiationlist roleinstantiationlist ';' --> - ^(GLOBALDO gprotocolnamenode argumentinstantiationlist roleinstantiationlist) + DO_KW gprotocolnamenode argumentinstantiationlist roleinstantiationlist ';' +-> ^(GLOBALDO gprotocolnamenode argumentinstantiationlist roleinstantiationlist) ; roleinstantiationlist: - '(' roleinstantiation (',' roleinstantiation)* ')' --> - ^(ROLEINSTANTIATIONLIST roleinstantiation+) -; - -roleinstantiation: - rolenamenode --> - ^(ROLEINSTANTIATION rolenamenode) // TODO: inconsistent with arginstas/payloadeles + t='(' roleinstantiation (',' roleinstantiation)* ')' +-> ^(ROLEINSTANTIATIONLIST[$t] roleinstantiation+) ; +roleinstantiation: rolenamenode -> ^(ROLEINSTANTIATION rolenamenode) ; + // CHECKME: inconsistent with arginstas/payloadeles argumentinstantiationlist: - '<' argumentinstantiation (',' argumentinstantiation)* '>' --> - ^(ARGUMENTINSTANTIATIONLIST argumentinstantiation+) +-> ^(ARGUMENTINSTANTIATIONLIST) +| t='<' argumentinstantiation (',' argumentinstantiation)* '>' +-> ^(ARGUMENTINSTANTIATIONLIST[$t] argumentinstantiation+) ; -// Like PayloadElement, simple names need disambiguation +// Grammatically same as message, but qualifiedname case may also be a payload type argumentinstantiation: - //message - // Grammatically same as message, but argument case can also be a payload type - messagesignature --> - ^(NONROLEARG messagesignature) -| - qualifiedname --> - { parseNonRoleArg($qualifiedname.tree) } // Cf. parsePayloadElem + messagesignature +-> ^(NONROLEARG messagesignature) +| qualifiedname +-> { parseNonRoleArg($qualifiedname.tree) } // Like PayloadElement, simple names need disambiguation ; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index e4b075aee..363763032 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -138,10 +138,10 @@ public ScribNode create(Token t) case ScribbleParser.GLOBALRECURSION: return new GRecursion(t); // Special cases - case ScribbleParser.EMPTY_OPERATOR: return new OpNode(t); + case ScribbleParser.EMPTY_OPERATOR: return new OpNode(t); // From Scribble.g, token (t) text is OpNode.EMPTY_OP_TOKEN_TEXT case ScribbleParser.QUALIFIEDNAME: return new IdNode(t); - // Returns an IdNode whose token is "QUALIFIEDNAME", and whose children are the IdNode elements of the qualified name + // Hacky? Repurposing IdNode as a "temporary QUALIFIEDNAME" -- token is QUALIFIEDNAME (not ID), and children are the IdNode elements of the qualified name // (Using IdNode as a "shell", but "token type" determined by t -- a bit misleading, IdNode here not an actual IDENTIFIER -- CHECKME: make a proper QUALIFIEDNAME?) // It is a "temporary" QUALIFIEDNAME, "internally" parsed by ScribbleParser.parsePayloadElem/parseNonRoleArg // This temporary IdNode is passed by $qualifiedname.tree to, e.g., parsePayloadElem(CommonTree ct) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 4d3fa279b..8cfc64a5d 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -80,6 +80,7 @@ module tmp.Test; // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) // sort out full name expansion between disamb and translation -- fix modulecontextcollector for imported module member fullnames // refactor additional disamb syntactic checks into core? e.g., do-calls, distinct roledecls, protodecls, etc. + // -- otoh, ast errors give source feedback -- maybe implement both //make a visitor factory // add exp conn checks to model validation @@ -89,8 +90,9 @@ module tmp.Test; type "..." from "..." as T; -global protocol Proto1(role A, role B) +explicit global protocol Proto1(role A, role B) { + () connect A to B; rec X { () from A to B; From 75ea273b3b89a41c9980d05f8bf4e5bc084e9492 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 00:53:42 +0100 Subject: [PATCH 265/539] Continued: tidying Scribble.g. --- .../org/scribble/parser/antlr/Scribble.g | 36 ++++++------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index fc8a4e5a2..0d5545b7a 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -384,26 +384,10 @@ fragment UNDERSCORE: simplename: IDENTIFIER; -//parametername: simplename; - -//simplename; -recursionvarname: IDENTIFIER ; -// IDENTIFIER^ - - +recursionvarname: simplename ; rolename: simplename; -simpleprotocolname: simplename; simplemembername: simplename; // Only for member declarations -//rolenamenode: rolename -> ^(ROLENAME rolename) ; -//recursionvarnamenode: recursionvarname -> ^(RECURSIONVAR recursionvarname) ; -//ambiguousnamenode: simplename -> ^(AMBIGUOUSNAME simplename); -//opnamenode: IDENTIFIER -> ^(OPNAME IDENTIFIER) ; -//typeparamnamenode: parametername -> ^(typeparamnamenode parametername) ; -//sigparamnamenode: parametername -> ^(sigparamnamenode parametername) ; - -//emptyopnamenode: ^(EMPTY_OPERATOR); // simp name nodes use token text for id value // FIXME: can't seem to use this "out of nowhere" in rewrite rules - // "The TreeAdaptor is not called; instead for constructors are invoked directly." // "Note that parameters are not allowed on token references to the left of ->:" // "Use imaginary nodes as you normally would, but with the addition of the node type:" // Pointless? token itself unchanged and ttype int ends up unused @@ -429,7 +413,7 @@ simplepayloadtypename: IDENTIFIER -> ^(TYPENAME IDENTIFIER) ; // TODO factor out with typedecl? NO: params distinct from "literals" simplemessagesignaturename: IDENTIFIER -> ^(SIGNAME IDENTIFIER) ; // TODO factor out with sigparamdecl? NO: params distinct from "literals" - +simpleprotocolname: IDENTIFIER -> ^(GPROTOCOLNAME IDENTIFIER) ; qualifiedname: IDENTIFIER ('.' IDENTIFIER)* @@ -467,7 +451,7 @@ gprotocolnamenode: * Section 3.2.3 Module Declarations */ // "References to tokens with rewrite not found on left of -> are imaginary tokens." -// Inlined moduledecl to make token info ref work +// Inlined moduledecl to make token label work module: t=MODULE_KW modulename ';' importmodule* datatypedecl* protocoldecl* EOF -> @@ -532,8 +516,8 @@ payloadelement: // Also subsumes simple names, could be a data *param* qualifiedname -> { parsePayloadElem($qualifiedname.tree) } // Use ".text" instead of ".tree" for token String - | protocolname '@' rolename --> ^(DELEGATION rolename protocolname) + | gprotocolnamenode '@' rolenamenode +-> ^(DELEGATION rolenamenode gprotocolnamenode) ; @@ -550,7 +534,8 @@ protocoldecl: globalprotocoldecl ; globalprotocoldecl: globalprotocoldeclmodifiers globalprotocolheader globalprotocoldefinition -> - ^(GLOBALPROTOCOLDECL globalprotocoldeclmodifiers globalprotocolheader globalprotocoldefinition) + ^(GLOBALPROTOCOLDECL globalprotocoldeclmodifiers globalprotocolheader + globalprotocoldefinition) ; // "aux" must come before "explicit" @@ -562,13 +547,14 @@ globalprotocoldeclmodifiers: ; globalprotocolheader: - GLOBAL_KW PROTOCOL_KW gprotocolnamenode parameterdecllist roledecllist + t=GLOBAL_KW PROTOCOL_KW simpleprotocolname parameterdecllist roledecllist -> - ^(GLOBALPROTOCOLHEADER gprotocolnamenode parameterdecllist roledecllist) + ^(GLOBALPROTOCOLHEADER[$t] simpleprotocolname parameterdecllist roledecllist) ; roledecllist: t='(' roledecl (',' roledecl)* ')' -> ^(ROLEDECLLIST[$t] roledecl+) ; + roledecl: t=ROLE_KW rolenamenode -> ^(ROLEDECL[$t] rolenamenode) ; parameterdecllist: @@ -672,7 +658,6 @@ globalrecursion: -> ^(GLOBALRECURSION[$t] recursionvarnamenode globalprotocolblock) ; - globalcontinue: t=CONTINUE_KW recursionvarnamenode ';' -> ^(GLOBALCONTINUE recursionvarnamenode) @@ -691,6 +676,7 @@ roleinstantiationlist: t='(' roleinstantiation (',' roleinstantiation)* ')' -> ^(ROLEINSTANTIATIONLIST[$t] roleinstantiation+) ; + roleinstantiation: rolenamenode -> ^(ROLEINSTANTIATION rolenamenode) ; // CHECKME: inconsistent with arginstas/payloadeles From 595078f88413a43da3231f1c1ac1926e815202e9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 01:16:48 +0100 Subject: [PATCH 266/539] Minor. --- .../org/scribble/parser/antlr/Scribble.g | 21 +++++++++++++++---- scribble-test/src/test/scrib/tmp/Test.scr | 3 ++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 0d5545b7a..ec359075c 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -274,6 +274,16 @@ tokens return a; } } + + public static CommonTree checkId(CommonTree id) + { + if (id.getText().contains("__")) + { + System.err.println("Double underscores are reserved: " + id); + System.exit(1); + } + return id; + } } @lexer::members @@ -382,16 +392,19 @@ fragment UNDERSCORE: -simplename: IDENTIFIER; +/*simplename: id=IDENTIFIER +-> +{ checkId($id.tree) } +; recursionvarname: simplename ; rolename: simplename; -simplemembername: simplename; // Only for member declarations +simplemembername: simplename; // Only for member declarations*/ -// "The TreeAdaptor is not called; instead for constructors are invoked directly." +// "The TreeAdaptor is not called; instead [the] constructors are invoked directly." // "Note that parameters are not allowed on token references to the left of ->:" // "Use imaginary nodes as you normally would, but with the addition of the node type:" // Pointless? token itself unchanged and ttype int ends up unused -rolenamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER] ; +rolenamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; recursionvarnamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; ambiguousnamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; opnamenode: diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 8cfc64a5d..64cb21e80 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -76,6 +76,7 @@ module tmp.Test; //...HERE fix simp node constructors and af (no IdNode child) --- fix ambignodel to use af -- fix ambignodel to use af -- fix ambignodel to use af -- fix ambignodel to use af - separate af methods //...remove Token args from af constructors -- refactor reconstructs to use af? + //...disallow/check for reserved __ // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) // sort out full name expansion between disamb and translation -- fix modulecontextcollector for imported module member fullnames @@ -92,7 +93,7 @@ type "..." from "..." as T; explicit global protocol Proto1(role A, role B) { - () connect A to B; + () connect A__ to B; rec X { () from A to B; From e7273621084401043bee06d5f3534565ff3748a7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 01:19:08 +0100 Subject: [PATCH 267/539] Minor. --- scribble-test/src/test/scrib/tmp/Test.scr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 64cb21e80..442910447 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -91,12 +91,12 @@ module tmp.Test; type "..." from "..." as T; -explicit global protocol Proto1(role A, role B) +explicit global protocol Proto1(role A__, role B) { () connect A__ to B; rec X { - () from A to B; + () from A__ to B; continue X; } } From e3bcb2180d8523e666de110dae3cbad4bdcb3572 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 01:34:00 +0100 Subject: [PATCH 268/539] Minor. --- .../org/scribble/parser/antlr/Scribble.g | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index ec359075c..54e9916c2 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -404,15 +404,14 @@ simplemembername: simplename; // Only for member declarations*/ // "The TreeAdaptor is not called; instead [the] constructors are invoked directly." // "Note that parameters are not allowed on token references to the left of ->:" // "Use imaginary nodes as you normally would, but with the addition of the node type:" // Pointless? token itself unchanged and ttype int ends up unused -rolenamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; -recursionvarnamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; -ambiguousnamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; +rolenamenode: t=IDENTIFIER -> IDENTIFIER[$t]; +recursionvarnamenode: t=IDENTIFIER -> IDENTIFIER[$t]; +ambiguousnamenode: t=IDENTIFIER -> IDENTIFIER[$t]; opnamenode: -IDENTIFIER -> IDENTIFIER[$IDENTIFIER] +t=IDENTIFIER -> IDENTIFIER[$t] | -> ^(EMPTY_OPERATOR); -//emptyopnamenode: IDENTIFIER[EMPTY_OPERATOR]; // empty "left" of rewrite not allowed -typeparamnamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; -sigparamnamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; +typeparamnamenode: t=IDENTIFIER -> IDENTIFIER[$t]; +sigparamnamenode: t=IDENTIFIER -> IDENTIFIER[$t]; @@ -421,41 +420,41 @@ sigparamnamenode: IDENTIFIER -> IDENTIFIER[$IDENTIFIER]; */ // Using qualified to rep simple -simplemodulename: IDENTIFIER -> ^(MODULENAME IDENTIFIER) ; -simplepayloadtypename: IDENTIFIER -> ^(TYPENAME IDENTIFIER) ; +simplemodulename: t=IDENTIFIER -> ^(MODULENAME[$t] IDENTIFIER) ; +simplepayloadtypename: t=IDENTIFIER -> ^(TYPENAME[$t] IDENTIFIER) ; // TODO factor out with typedecl? NO: params distinct from "literals" -simplemessagesignaturename: IDENTIFIER -> ^(SIGNAME IDENTIFIER) ; +simplemessagesignaturename: t=IDENTIFIER -> ^(SIGNAME[$t] IDENTIFIER) ; // TODO factor out with sigparamdecl? NO: params distinct from "literals" -simpleprotocolname: IDENTIFIER -> ^(GPROTOCOLNAME IDENTIFIER) ; +simpleprotocolname: t=IDENTIFIER -> ^(GPROTOCOLNAME[$t] IDENTIFIER) ; qualifiedname: - IDENTIFIER ('.' IDENTIFIER)* + t=IDENTIFIER ('.' IDENTIFIER)* -> - ^(QUALIFIEDNAME IDENTIFIER+) + ^(QUALIFIEDNAME[$t] IDENTIFIER+) ; packagename: qualifiedname; membername: qualifiedname; modulename: - IDENTIFIER ('.' IDENTIFIER)* + t=IDENTIFIER ('.' IDENTIFIER)* -> - ^(MODULENAME IDENTIFIER+) + ^(MODULENAME[$t] IDENTIFIER+) ; protocolname: membername; payloadtypename: membername; messagesignaturename: - IDENTIFIER ('.' IDENTIFIER)* + t=IDENTIFIER ('.' IDENTIFIER)* -> - ^(SIGNAME IDENTIFIER+) + ^(SIGNAME[$t] IDENTIFIER+) ; gprotocolnamenode: - IDENTIFIER ('.' IDENTIFIER)* + t=IDENTIFIER ('.' IDENTIFIER)* -> - ^(GPROTOCOLNAME IDENTIFIER+) + ^(GPROTOCOLNAME[$t] IDENTIFIER+) ; From 63f6d4ca1a9808ff2938785ea89c753a73f118f7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 11:25:03 +0100 Subject: [PATCH 269/539] Continued: tidying Scribble.g. --- .../org/scribble/ast/name/simple/OpNode.java | 2 +- .../org/scribble/parser/antlr/Scribble.g | 259 ++++++++---------- .../parser/scribble/AstFactoryImpl.java | 116 ++++---- .../parser/scribble/ScribTreeAdaptor.java | 69 +++-- 4 files changed, 209 insertions(+), 237 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java index b3940390e..1c5952d4b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java @@ -21,7 +21,7 @@ public class OpNode extends SimpleNameNode { // Determine by token text -- cannot use token type int in core, value is a ScribbleParser constant - public static final String EMPTY_OP_TOKEN_TEXT = "__EMPTY_OPERATOR"; // Cf. Scribble.g + public static final String EMPTY_OP_TOKEN_TEXT = "__EMPTY_OP"; // Cf. Scribble.g public OpNode(Token t) { diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 54e9916c2..e3e7ecab2 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -25,28 +25,25 @@ options } -// CHECKME: match tokens to keywords? // Use KW as token types? But many more types than keywords - tokens { - /* - * Parser "input" constants (lexer output; keywords, Section 2.4) + /* Parser "input" constants (lexer output; keywords, Section 2.4) */ - MODULE_KW = 'module'; IMPORT_KW = 'import'; + DATA_KW = 'data'; SIG_KW = 'sig'; TYPE_KW = 'type'; PROTOCOL_KW = 'protocol'; AS_KW = 'as'; GLOBAL_KW = 'global'; - LOCAL_KW = 'local'; + LOCAL_KW = 'local'; // Currently not parsed, but may be generated EXPLICIT_KW = 'explicit'; AUX_KW = 'aux'; ROLE_KW = 'role'; - SELF_KW = 'self'; + SELF_KW = 'self'; // Currently not parsed, but may be generated FROM_KW = 'from'; TO_KW = 'to'; @@ -65,77 +62,71 @@ tokens DO_KW = 'do'; - /* - * Parser "output" node types (corresponding to the various syntactic - * categories), i.e. the labels used to distinguish resulting AST nodes. The - * specific value of these tokens doesn't matter (because not parsed - * themselves). + /* Parser "output" Token types (corresponding to the Scribble BNF), i.e., the + * values used to distinguish resulting AST nodes. + * They are used by ScribTreeAdaptor to create the output using the org.scribble.ast classes. + * The specific value of these tokens aren't important (constants accessed via + * fields of ScribbleParser). + * These Token types denote ANTLR "imaginary nodes". */ - - // Special cases - EMPTY_OPERATOR = '__EMPTY_OPERATOR'; - QUALIFIEDNAME = '__QUALIFIEDNAME'; - // N.B. an intermediate node type, not an actual ScribNode -- "re-parsed" internally by parsePayloadElem/NonRoleArg - // No relation to abstract AST class, QualifiedName - - - // Names - AMBIGUOUSNAME = 'AMBIGUOUSNAME'; - MODULENAME = 'MODULENAME'; - GPROTOCOLNAME = 'GPROTOCOLNAME'; - OPNAME = 'OPNAME'; - RECURSIONVAR = 'RECURSIONVAR'; - ROLENAME = 'ROLENAME'; - SIGNAME = 'SIGNAME'; - SIGPARAMNAME = 'sigparamnamenode'; // N.B. distinct from SIGNAME - TYPENAME = 'TYPENAME'; - TYPEPARAMNAME = 'typeparamnamenode'; // N.B. distinct from TYPENAME - + // CHECKME: split naming of type int constant from String label ? + // CHECKME: split imaginary node types ? - // "Node type" constants -- parsed "directly" by AntlrToScribParser - // TODO: split naming of type int constant from String label ? - // TODO: split imaginary node types + // Special cases + EMPTY_OP = '__EMPTY_OP'; + COMPOUND_NAME = '__COMPOUND_NAME'; + // N.B. an intermediate node type, not a concrete ScribNode -- "re-parsed" internally by parsePayloadElem/NonRoleArg + + // Simple names + AMBIG_NAME = 'AMBIG_NAME'; + // Other simple names are + + // Compound names + GPROTO_NAME = 'GPROTO_NAME'; + MODULE_NAME = 'MODULE_NAME'; + SIG_NAME = 'SIG_NAME'; // N.B. distinct from SIGPARAM_NAME + TYPE_NAME = 'TYPE_NAME'; // N.B. distinct from TYPEPARAM_NAME + + // Sig literals + SIG_LIT = 'SIG_LIT'; + PAYELEM_LIST = 'PAYELEM_LIST'; + UNARY_PAYELEM = 'UNARY_PAYELEM'; + DELEG_PAYELEM = 'DELEG_PAYELEM'; MODULE = 'MODULE'; MODULEDECL = 'MODULEDECL'; IMPORTMODULE = 'IMPORTMODULE'; - PAYLOADTYPEDECL = 'PAYLOADTYPEDECL'; - MESSAGESIGNATUREDECL = 'MESSAGESIGNATUREDECL'; - - GLOBALPROTOCOLDECL = 'GLOBALPROTOCOLDECL'; - GLOBALPROTOCOLDECLMODS = 'GLOBALPROTOCOLDECLMODS'; - GLOBALPROTOCOLHEADER = 'GLOBALPROTOCOLHEADER'; + DATADECL = 'DATADECL'; + SIGDECL = 'SIGDECL'; + GPROTODECL = 'GPROTODECL'; + PROTOMOD_LIST = 'PROTOMOD_LIST'; - ROLEDECLLIST = 'ROLEDECLLIST'; + GPROTOHEADER = 'GPROTOHEADER'; + ROLEDECL_LIST = 'ROLEDECL_LIST'; ROLEDECL = 'ROLEDECL'; - PARAMETERDECLLIST = 'PARAMETERDECLLIST'; - TYPEPARAMDECL = 'TYPEPARAMDECL'; - SIGPARAMDECL = 'SIGPARAMDECL'; + PARAMDECL_LIST = 'PARAMDECL_LIST'; + TYPEPARAMDECL = 'TYPE_PARAMDECL'; + SIGPARAMDECL = 'SIG_PARAMDECL'; - GLOBALPROTOCOLDEF = 'GLOBALPROTOCOLDEF'; - GLOBALPROTOCOLBLOCK = 'GLOBALPROTOCOLBLOCK'; - GLOBALINTERACTIONSEQUENCE = 'GLOBALINTERACTIONSEQUENCE'; - - MESSAGESIGNATURE = 'MESSAGESIGNATURE'; - PAYLOAD = 'PAYLOAD'; - UNARYPAYLOADELEM = 'UNARYPAYLOADELEM'; - DELEGATION = 'DELEGATION'; - - GLOBALMESSAGETRANSFER = 'GLOBALMESSAGETRANSFER'; - GLOBALCONNECT = 'GLOBALCONNECT'; - GLOBALWRAP = 'GLOBALWRAP'; - GLOBALDISCONNECT = 'GLOBALDISCONNECT'; - GLOBALCONTINUE = 'GLOBALCONTINUE'; - GLOBALDO = 'GLOBALDO'; - - ROLEINSTANTIATIONLIST = 'ROLEINSTANTIATIONLIST'; - ROLEINSTANTIATION = 'ROLEINSTANTIATION'; // FIXME: not consistent with arginstas/payloadeles - ARGUMENTINSTANTIATIONLIST = 'ARGUMENTINSTANTIATIONLIST'; // FIXME: token name inconsistent with class name (NonRoleArgList) - NONROLEARG = 'NONROLEARG'; - - GLOBALCHOICE = 'GLOBALCHOICE'; - GLOBALRECURSION = 'GLOBALRECURSION'; + GPROTODEF = 'GPROTODEF'; + GPROTOBLOCK = 'GPROTOBLOCK'; + GACTIONSEQ = 'GACTIONSEQ'; + + GMSGTRANSFER = 'GMSGTRANSFER'; + GCONNECT = 'GCONNECT'; + GWRAP = 'GWRAP'; + GDCONN = 'GDCONN'; + GCONTINUE = 'GCONTINUE'; + GDO = 'GDO'; + + ROLEARG_LIST = 'ROLEARG_LIST'; + ROLEARG = 'ROLEARG_LIST'; + ARG_LIST = 'ARG_LIST'; + ARG = 'ARG'; + + GCHOICE = 'GCHOICE'; + GRECURSION = 'GRECURSION'; } @@ -144,8 +135,6 @@ tokens { package org.scribble.parser.antlr; - //import org.scribble.main.RuntimeScribbleException; - //import org.scribble.parser.scribble.ast.tree.MyCommonTree; import org.scribble.ast.ScribNodeBase; import org.scribble.ast.UnaryPayloadElem; import org.scribble.ast.NonRoleArg; @@ -221,11 +210,11 @@ tokens { if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname { - DataTypeNode dt = new DataTypeNode(new CommonToken(TYPENAME, "TYPENAME")); + DataTypeNode dt = new DataTypeNode(new CommonToken(TYPE_NAME, "TYPE_NAME")); ((List) qn.getChildren()).forEach(x -> dt.addChild(new IdNode(new CommonToken(IDENTIFIER, ((CommonTree) x).getText())))); UnaryPayloadElem pe = - new UnaryPayloadElem(new CommonToken(UNARYPAYLOADELEM, "UNARYPAYLOADELEM")); + new UnaryPayloadElem(new CommonToken(UNARY_PAYELEM, "UNARYPAYLOADELEM")); pe.addChild(dt); return pe; // N.B. "re-parsed" by ScribTreeAdaptor? Could return CommonTree here? } @@ -235,12 +224,12 @@ tokens String text = qn.getChild(0).getText(); IdNode id = new IdNode(new CommonToken(IDENTIFIER, text)); /*AmbigNameNode an = - new AmbigNameNode(new CommonToken(AMBIGUOUSNAME, "AMBIGUOUSNAME")); + new AmbigNameNode(new CommonToken(AMBIG_NAME, "AMBIG_NAME")); an.addChild(id);*/ AmbigNameNode an = - new AmbigNameNode(AMBIGUOUSNAME, new CommonToken(IDENTIFIER, text)); + new AmbigNameNode(AMBIG_NAME, new CommonToken(IDENTIFIER, text)); UnaryPayloadElem e = new UnaryPayloadElem( - new CommonToken(UNARYPAYLOADELEM, "UNARYPAYLOADELEM")); + new CommonToken(UNARY_PAYELEM, "UNARYPAYLOADELEM")); e.addChild(an); return e; } @@ -252,11 +241,11 @@ tokens { if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname { - DataTypeNode dt = new DataTypeNode(new CommonToken(TYPENAME, "TYPENAME")); + DataTypeNode dt = new DataTypeNode(new CommonToken(TYPE_NAME, "TYPE_NAME")); ((List) qn.getChildren()).forEach(x -> dt.addChild(new IdNode(new CommonToken(IDENTIFIER, ((CommonTree) x).getText())))); NonRoleArg a = - new NonRoleArg(new CommonToken(NONROLEARG, "NONROLEARG")); + new NonRoleArg(new CommonToken(ARG, "ARG")); a.addChild(dt); return a; } @@ -265,11 +254,11 @@ tokens String text = qn.getChild(0).getText(); IdNode id = new IdNode(new CommonToken(IDENTIFIER, text)); /*AmbigNameNode an = - new AmbigNameNode(new CommonToken(AMBIGUOUSNAME, "AMBIGUOUSNAME")); + new AmbigNameNode(new CommonToken(AMBIG_NAME, "AMBIG_NAME")); an.addChild(id);*/ AmbigNameNode an = - new AmbigNameNode(AMBIGUOUSNAME, new CommonToken(IDENTIFIER, text)); - NonRoleArg a = new NonRoleArg(new CommonToken(NONROLEARG, "NONROLEARG")); + new AmbigNameNode(AMBIG_NAME, new CommonToken(IDENTIFIER, text)); + NonRoleArg a = new NonRoleArg(new CommonToken(ARG, "ARG")); a.addChild(an); return a; } @@ -389,48 +378,38 @@ fragment UNDERSCORE: /* * Section 3.1 Primitive Names */ - - - -/*simplename: id=IDENTIFIER --> -{ checkId($id.tree) } -; - -recursionvarname: simplename ; -rolename: simplename; -simplemembername: simplename; // Only for member declarations*/ +//simplename: id=IDENTIFIER -> { checkId($id.tree) } ; // How to integrate with IDENTIFIER[$t] ? // "The TreeAdaptor is not called; instead [the] constructors are invoked directly." // "Note that parameters are not allowed on token references to the left of ->:" -// "Use imaginary nodes as you normally would, but with the addition of the node type:" // Pointless? token itself unchanged and ttype int ends up unused -rolenamenode: t=IDENTIFIER -> IDENTIFIER[$t]; -recursionvarnamenode: t=IDENTIFIER -> IDENTIFIER[$t]; +// "Use imaginary nodes as you normally would, but with the addition of the node type:" // But currently, ID token itself unchanged and ttype int ends up discarded ambiguousnamenode: t=IDENTIFIER -> IDENTIFIER[$t]; -opnamenode: -t=IDENTIFIER -> IDENTIFIER[$t] -| -> ^(EMPTY_OPERATOR); -typeparamnamenode: t=IDENTIFIER -> IDENTIFIER[$t]; +recursionvarnamenode: t=IDENTIFIER -> IDENTIFIER[$t]; +rolenamenode: t=IDENTIFIER -> IDENTIFIER[$t]; sigparamnamenode: t=IDENTIFIER -> IDENTIFIER[$t]; - - +typeparamnamenode: t=IDENTIFIER -> IDENTIFIER[$t]; +opnamenode: + -> ^(EMPTY_OP) +| + t=IDENTIFIER -> IDENTIFIER[$t] +; /** * Section 3.2.1 Package, Module and Module Member Names */ // Using qualified to rep simple -simplemodulename: t=IDENTIFIER -> ^(MODULENAME[$t] IDENTIFIER) ; -simplepayloadtypename: t=IDENTIFIER -> ^(TYPENAME[$t] IDENTIFIER) ; +simplemodulename: t=IDENTIFIER -> ^(MODULE_NAME[$t] IDENTIFIER) ; +simplepayloadtypename: t=IDENTIFIER -> ^(TYPE_NAME[$t] IDENTIFIER) ; // TODO factor out with typedecl? NO: params distinct from "literals" -simplemessagesignaturename: t=IDENTIFIER -> ^(SIGNAME[$t] IDENTIFIER) ; +simplemessagesignaturename: t=IDENTIFIER -> ^(SIG_NAME[$t] IDENTIFIER) ; // TODO factor out with sigparamdecl? NO: params distinct from "literals" -simpleprotocolname: t=IDENTIFIER -> ^(GPROTOCOLNAME[$t] IDENTIFIER) ; +simpleprotocolname: t=IDENTIFIER -> ^(GPROTO_NAME[$t] IDENTIFIER) ; qualifiedname: t=IDENTIFIER ('.' IDENTIFIER)* -> - ^(QUALIFIEDNAME[$t] IDENTIFIER+) + ^(COMPOUND_NAME[$t] IDENTIFIER+) ; packagename: qualifiedname; @@ -439,7 +418,7 @@ membername: qualifiedname; modulename: t=IDENTIFIER ('.' IDENTIFIER)* -> - ^(MODULENAME[$t] IDENTIFIER+) + ^(MODULE_NAME[$t] IDENTIFIER+) ; protocolname: membername; @@ -448,13 +427,13 @@ payloadtypename: membername; messagesignaturename: t=IDENTIFIER ('.' IDENTIFIER)* -> - ^(SIGNAME[$t] IDENTIFIER+) + ^(SIG_NAME[$t] IDENTIFIER+) ; gprotocolnamenode: t=IDENTIFIER ('.' IDENTIFIER)* -> - ^(GPROTOCOLNAME[$t] IDENTIFIER+) + ^(GPROTO_NAME[$t] IDENTIFIER+) ; @@ -494,7 +473,7 @@ payloadtypedecl: extSource=EXTIDENTIFIER AS_KW alias=simplepayloadtypename ';' -> // alias first to be uniform with other NameDeclNode (getRawNameNodeChild) - ^(PAYLOADTYPEDECL[$t] $alias $schema $extName $extSource) + ^(DATADECL[$t] $alias $schema $extName $extSource) ; messagesignaturedecl: @@ -502,7 +481,7 @@ messagesignaturedecl: extSource=EXTIDENTIFIER AS_KW alias=simplemessagesignaturename ';' -> // alias first to be uniform with other NameDeclNode (getRawNameNodeChild) - ^(MESSAGESIGNATUREDECL[$t] $alias $schema $extName $extSource) + ^(SIGDECL[$t] $alias $schema $extName $extSource) ; @@ -512,14 +491,14 @@ messagesignaturedecl: */ messagesignature: opnamenode '(' payload ')' --> ^(MESSAGESIGNATURE opnamenode payload) +-> ^(SIG_LIT opnamenode payload) ; // CHECKME: how to apply [$t] in these situations? payload: --> ^(PAYLOAD) +-> ^(PAYELEM_LIST) | payloadelement (',' payloadelement)* --> ^(PAYLOAD payloadelement+) +-> ^(PAYELEM_LIST payloadelement+) ; payloadelement: @@ -529,7 +508,7 @@ payloadelement: qualifiedname -> { parsePayloadElem($qualifiedname.tree) } // Use ".text" instead of ".tree" for token String | gprotocolnamenode '@' rolenamenode --> ^(DELEGATION rolenamenode gprotocolnamenode) +-> ^(DELEG_PAYELEM rolenamenode gprotocolnamenode) ; @@ -546,33 +525,33 @@ protocoldecl: globalprotocoldecl ; globalprotocoldecl: globalprotocoldeclmodifiers globalprotocolheader globalprotocoldefinition -> - ^(GLOBALPROTOCOLDECL globalprotocoldeclmodifiers globalprotocolheader + ^(GPROTODECL globalprotocoldeclmodifiers globalprotocolheader globalprotocoldefinition) ; // "aux" must come before "explicit" globalprotocoldeclmodifiers: - -> ^(GLOBALPROTOCOLDECLMODS) - | t=AUX_KW -> ^(GLOBALPROTOCOLDECLMODS[$t] AUX_KW) - | t=AUX_KW EXPLICIT_KW -> ^(GLOBALPROTOCOLDECLMODS[$t] AUX_KW EXPLICIT_KW) - | t=EXPLICIT_KW -> ^(GLOBALPROTOCOLDECLMODS[$t] EXPLICIT_KW) + -> ^(PROTOMOD_LIST) + | t=AUX_KW -> ^(PROTOMOD_LIST[$t] AUX_KW) + | t=AUX_KW EXPLICIT_KW -> ^(PROTOMOD_LIST[$t] AUX_KW EXPLICIT_KW) + | t=EXPLICIT_KW -> ^(PROTOMOD_LIST[$t] EXPLICIT_KW) ; globalprotocolheader: t=GLOBAL_KW PROTOCOL_KW simpleprotocolname parameterdecllist roledecllist -> - ^(GLOBALPROTOCOLHEADER[$t] simpleprotocolname parameterdecllist roledecllist) + ^(GPROTOHEADER[$t] simpleprotocolname parameterdecllist roledecllist) ; roledecllist: - t='(' roledecl (',' roledecl)* ')' -> ^(ROLEDECLLIST[$t] roledecl+) ; + t='(' roledecl (',' roledecl)* ')' -> ^(ROLEDECL_LIST[$t] roledecl+) ; roledecl: t=ROLE_KW rolenamenode -> ^(ROLEDECL[$t] rolenamenode) ; parameterdecllist: --> ^(PARAMETERDECLLIST) +-> ^(PARAMDECL_LIST) | t='<' parameterdecl (',' parameterdecl)* '>' --> ^(PARAMETERDECLLIST[$t] parameterdecl+) +-> ^(PARAMDECL_LIST[$t] parameterdecl+) ; parameterdecl: typedecl | sigdecl ; @@ -586,7 +565,7 @@ sigdecl: * Section 3.7.1 Global Protocol Definitions */ globalprotocoldefinition: - globalprotocolblock -> ^(GLOBALPROTOCOLDEF globalprotocolblock) ; + globalprotocolblock -> ^(GPROTODEF globalprotocolblock) ; /** @@ -595,13 +574,13 @@ globalprotocoldefinition: globalprotocolblock: t='{' globalinteractionsequence '}' -> - ^(GLOBALPROTOCOLBLOCK[$t] globalinteractionsequence) + ^(GPROTOBLOCK[$t] globalinteractionsequence) ; globalinteractionsequence: globalinteraction* -> - ^(GLOBALINTERACTIONSEQUENCE globalinteraction*) + ^(GACTIONSEQ globalinteraction*) ; globalinteraction: @@ -621,7 +600,7 @@ globalinteraction: */ globalmessagetransfer: message FROM_KW rolenamenode TO_KW rolenamenode (',' rolenamenode )* ';' --> ^(GLOBALMESSAGETRANSFER message rolenamenode+) +-> ^(GMSGTRANSFER message rolenamenode+) ; // TODO: multisend @@ -633,9 +612,9 @@ message: globalconnect: message CONNECT_KW rolenamenode TO_KW rolenamenode ';' --> ^(GLOBALCONNECT message rolenamenode rolenamenode) +-> ^(GCONNECT message rolenamenode rolenamenode) | t=CONNECT_KW rolenamenode TO_KW rolenamenode ';' --> ^(GLOBALCONNECT[$t] ^(MESSAGESIGNATURE ^(EMPTY_OPERATOR) ^(PAYLOAD)) +-> ^(GCONNECT[$t] ^(SIG_LIT ^(EMPTY_OP) ^(PAYELEM_LIST)) rolenamenode rolenamenode) // CHECKME: deprecate? i.e., require "()" as for message transfers? i.e., simply delete this rule? ; @@ -643,12 +622,12 @@ globalconnect: globaldisconnect: t=DISCONNECT_KW rolenamenode AND_KW rolenamenode ';' --> ^(GLOBALDISCONNECT[$t] rolenamenode rolenamenode) +-> ^(GDCONN[$t] rolenamenode rolenamenode) ; globalwrap: t=WRAP_KW rolenamenode TO_KW rolenamenode ';' --> ^(GLOBALWRAP[$t] rolenamenode rolenamenode) +-> ^(GWRAP[$t] rolenamenode rolenamenode) ; @@ -658,7 +637,7 @@ globalwrap: globalchoice: t=CHOICE_KW AT_KW rolenamenode globalprotocolblock (OR_KW globalprotocolblock)* --> ^(GLOBALCHOICE[$t] rolenamenode globalprotocolblock+) +-> ^(GCHOICE[$t] rolenamenode globalprotocolblock+) ; @@ -667,12 +646,12 @@ globalchoice: */ globalrecursion: t=REC_KW recursionvarnamenode globalprotocolblock --> ^(GLOBALRECURSION[$t] recursionvarnamenode globalprotocolblock) +-> ^(GRECURSION[$t] recursionvarnamenode globalprotocolblock) ; globalcontinue: t=CONTINUE_KW recursionvarnamenode ';' --> ^(GLOBALCONTINUE recursionvarnamenode) +-> ^(GCONTINUE recursionvarnamenode) ; @@ -681,27 +660,27 @@ globalcontinue: */ globaldo: DO_KW gprotocolnamenode argumentinstantiationlist roleinstantiationlist ';' --> ^(GLOBALDO gprotocolnamenode argumentinstantiationlist roleinstantiationlist) +-> ^(GDO gprotocolnamenode argumentinstantiationlist roleinstantiationlist) ; roleinstantiationlist: t='(' roleinstantiation (',' roleinstantiation)* ')' --> ^(ROLEINSTANTIATIONLIST[$t] roleinstantiation+) +-> ^(ROLEARG_LIST[$t] roleinstantiation+) ; -roleinstantiation: rolenamenode -> ^(ROLEINSTANTIATION rolenamenode) ; +roleinstantiation: rolenamenode -> ^(ROLEARG rolenamenode) ; // CHECKME: inconsistent with arginstas/payloadeles argumentinstantiationlist: --> ^(ARGUMENTINSTANTIATIONLIST) +-> ^(ARG_LIST) | t='<' argumentinstantiation (',' argumentinstantiation)* '>' --> ^(ARGUMENTINSTANTIATIONLIST[$t] argumentinstantiation+) +-> ^(ARG_LIST[$t] argumentinstantiation+) ; // Grammatically same as message, but qualifiedname case may also be a payload type argumentinstantiation: messagesignature --> ^(NONROLEARG messagesignature) +-> ^(ARG messagesignature) | qualifiedname -> { parseNonRoleArg($qualifiedname.tree) } // Like PayloadElement, simple names need disambiguation ; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java index db974ef01..4564aeafb 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java @@ -142,7 +142,7 @@ public IdNode IdNode(String text) @Override public AmbigNameNode AmbiguousNameNode(String text) { - int ttype = ScribbleParser.AMBIGUOUSNAME; + int ttype = ScribbleParser.AMBIG_NAME; CommonToken t = newToken(ttype, text); AmbigNameNode n = new AmbigNameNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] n.del(new AmbigNameNodeDel()); @@ -152,7 +152,7 @@ public AmbigNameNode AmbiguousNameNode(String text) @Override public OpNode OpNode(String text) { - int ttype = ScribbleParser.OPNAME; + int ttype = ScribbleParser.IDENTIFIER; CommonToken t = newToken(ttype, "OPNAME"); OpNode n = new OpNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] del(n, createDefaultDelegate()); @@ -162,9 +162,9 @@ public OpNode OpNode(String text) @Override public RecVarNode RecVarNode(String text) { - int ttype = ScribbleParser.RECURSIONVAR; + int ttype = ScribbleParser.IDENTIFIER; CommonToken t = newToken(ttype, "RECURSIONVAR"); - RecVarNode n = new RecVarNode(ScribbleParser.RECURSIONVAR, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + RecVarNode n = new RecVarNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] del(n, new RecVarNodeDel()); return n; } @@ -172,7 +172,7 @@ public RecVarNode RecVarNode(String text) @Override public RoleNode RoleNode(String text) { - int ttype = ScribbleParser.ROLENAME; + int ttype = ScribbleParser.IDENTIFIER; CommonToken t = newToken(ttype, "ROLENAME"); RoleNode n = new RoleNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] del(n, new RoleNodeDel()); @@ -182,7 +182,7 @@ public RoleNode RoleNode(String text) @Override public SigParamNode SigParamNode(String text) { - int ttype = ScribbleParser.SIGPARAMNAME; // N.B. cf. ScribbleParser.SIGNAME + int ttype = ScribbleParser.IDENTIFIER; // N.B. cf. ScribbleParser.SIGNAME CommonToken t = newToken(ttype, text); SigParamNode n = new SigParamNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] n.del(new NonRoleParamNodeDel()); @@ -192,7 +192,7 @@ public SigParamNode SigParamNode(String text) @Override public TypeParamNode TypeParamNode(String text) { - int ttype = ScribbleParser.TYPEPARAMNAME; // N.B. cf. ScribbleParser.TYPENAME + int ttype = ScribbleParser.IDENTIFIER; // N.B. cf. ScribbleParser.TYPENAME CommonToken t = newToken(ttype, text); TypeParamNode n = new TypeParamNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] n.del(new NonRoleParamNodeDel()); @@ -206,13 +206,13 @@ public QualifiedNameNode QualifiedNameNode( QualifiedNameNode n = null; if (kind.equals(SigKind.KIND)) { - CommonToken t = newToken(ScribbleParser.SIGNAME, "SIGNAME"); + CommonToken t = newToken(ScribbleParser.SIG_NAME, "SIG_NAME"); n = new MessageSigNameNode(t); del(n, new MessageSigNameNodeDel()); } else if (kind.equals(DataTypeKind.KIND)) { - CommonToken t = newToken(ScribbleParser.TYPENAME, "TYPENAME"); + CommonToken t = newToken(ScribbleParser.TYPE_NAME, "TYPE_NAME"); n = new DataTypeNode(t); del(n, new DataTypeNodeDel()); } @@ -224,12 +224,12 @@ else if (kind.equals(DataTypeKind.KIND)) if (kind.equals(ModuleKind.KIND)) { - CommonToken t = newToken(ScribbleParser.MODULENAME, "MODULENAME"); + CommonToken t = newToken(ScribbleParser.MODULE_NAME, "MODULE_NAME"); n = new ModuleNameNode(t); } else if (kind.equals(Global.KIND)) { - CommonToken t = newToken(ScribbleParser.GPROTOCOLNAME, "GPROTOCOLNAME"); + CommonToken t = newToken(ScribbleParser.GPROTO_NAME, "GPROTO_NAME"); n = new GProtocolNameNode(t); } else @@ -256,7 +256,7 @@ protected static , K extends Kind> T castNameNode( // Pre: any type from ScribbleParser, except IDENTIFIER (IdNode) private CommonToken newToken(int type) { - String text = null; // CHECKEME: use reflection? + String text = null; // CHECKEME: use reflection to get token int field name? return new CommonToken(type, text); } @@ -268,7 +268,7 @@ private CommonToken newToken(int type, String text) @Override public MessageSigNode MessageSigNode(OpNode op, PayloadElemList pay) { - CommonToken t = newToken(ScribbleParser.MESSAGESIGNATURE, "MESSAGESIGNATURE"); + CommonToken t = newToken(ScribbleParser.SIG_LIT, "SIG_LIT"); MessageSigNode n = new MessageSigNode(t); n.addChild(op); n.addChild(pay); @@ -279,7 +279,7 @@ public MessageSigNode MessageSigNode(OpNode op, PayloadElemList pay) @Override public PayloadElemList PayloadElemList(List> elems) { - CommonToken t = newToken(ScribbleParser.PAYLOAD, "PAYLOAD"); + CommonToken t = newToken(ScribbleParser.PAYELEM_LIST, "PAYELEM_LIST"); PayloadElemList n = new PayloadElemList(t); n.addChildren(elems); del(n, createDefaultDelegate()); @@ -291,7 +291,7 @@ public PayloadElemList PayloadElemList(List> elems) public UnaryPayloadElem UnaryPayloadElem( PayloadElemNameNode name) { - CommonToken t = newToken(ScribbleParser.UNARYPAYLOADELEM, "UNARYPAYLOADELEM"); + CommonToken t = newToken(ScribbleParser.UNARY_PAYELEM, "UNARY_PAYELEM"); UnaryPayloadElem n = new UnaryPayloadElem<>(t); // Cf. Scribble.g children order n.addChild(name); @@ -302,7 +302,7 @@ public UnaryPayloadElem UnaryPayloadElem( @Override public GDelegationElem GDelegationElem(GProtocolNameNode proto, RoleNode role) { - CommonToken t = newToken(ScribbleParser.DELEGATION, "DELEGATION"); + CommonToken t = newToken(ScribbleParser.DELEG_PAYELEM, "DELEG_PAYELEM"); GDelegationElem n = new GDelegationElem(t); n.addChild(proto); n.addChild(role); @@ -355,8 +355,8 @@ public ImportModule ImportModule(ModuleNameNode modname, public MessageSigNameDecl MessageSigNameDecl(IdNode schema, IdNode extName, IdNode extSource, MessageSigNameNode alias) { - CommonToken t = newToken(ScribbleParser.MESSAGESIGNATUREDECL, - "MESSAGESIGNATUREDECL"); + CommonToken t = newToken(ScribbleParser.SIGDECL, + "SIGDECL"); MessageSigNameDecl n = new MessageSigNameDecl(t); n.addChild(schema); n.addChild(extName); @@ -370,8 +370,8 @@ public MessageSigNameDecl MessageSigNameDecl(IdNode schema, public DataTypeDecl DataTypeDecl(IdNode schema, IdNode extName, IdNode extSource, DataTypeNode alias) { - CommonToken t = newToken(ScribbleParser.PAYLOADTYPEDECL, - "PAYLOADTYPEDECL"); + CommonToken t = newToken(ScribbleParser.DATADECL, + "DATADECL"); DataTypeDecl n = new DataTypeDecl(t); n.addChild(schema); n.addChild(extName); @@ -385,8 +385,8 @@ public DataTypeDecl DataTypeDecl(IdNode schema, public GProtocolDecl GProtocolDecl(ProtocolModList mods, GProtocolHeader header, GProtocolDef def) { - CommonToken t = newToken(ScribbleParser.GLOBALPROTOCOLDECL, - "GLOBALPROTOCOLDECL"); + CommonToken t = newToken(ScribbleParser.GPROTODECL, + "GPROTODECL"); GProtocolDecl n = new GProtocolDecl(t); n.addChild(mods); n.addChild(header); @@ -399,8 +399,8 @@ public GProtocolDecl GProtocolDecl(ProtocolModList mods, public GProtocolHeader GProtocolHeader(GProtocolNameNode name, RoleDeclList rs, NonRoleParamDeclList ps) { - CommonToken t = newToken(ScribbleParser.GLOBALPROTOCOLHEADER, - "GLOBALPROTOCOLHEADER"); + CommonToken t = newToken(ScribbleParser.GPROTOHEADER, + "GPROTOHEADER"); GProtocolHeader n = new GProtocolHeader(t); n.addChild(name); n.addChild(ps); @@ -412,8 +412,8 @@ public GProtocolHeader GProtocolHeader(GProtocolNameNode name, @Override public RoleDeclList RoleDeclList(List ds) { - CommonToken t = newToken(ScribbleParser.ROLEDECLLIST, - "ROLEDECLLIST"); + CommonToken t = newToken(ScribbleParser.ROLEDECL_LIST, + "ROLEDECL_LIST"); RoleDeclList n = new RoleDeclList(t); // Cf. Scribble.g children order n.addChildren(ds); @@ -436,8 +436,8 @@ public RoleDecl RoleDecl(RoleNode r) public NonRoleParamDeclList NonRoleParamDeclList( List> ds) { - CommonToken t = newToken(ScribbleParser.ROLEDECL, - "ROLEDECL"); + CommonToken t = newToken(ScribbleParser.PARAMDECL_LIST, + "PARAMDECL_LIST"); NonRoleParamDeclList n = new NonRoleParamDeclList(t); // Cf. Scribble.g children order n.addChildren(ds); @@ -459,8 +459,8 @@ public NonRoleParamDecl NonRoleParamDecl( @Override public GProtocolDef GProtocolDef(GProtocolBlock block) { - CommonToken t = newToken(ScribbleParser.GLOBALPROTOCOLDEF, - "GLOBALPROTOCOLDEF"); + CommonToken t = newToken(ScribbleParser.GPROTODEF, + "GPROTODEF"); GProtocolDef n = new GProtocolDef(t); n.addChild(block); del(n, new GProtocolDefDel()); @@ -470,8 +470,8 @@ public GProtocolDef GProtocolDef(GProtocolBlock block) @Override public GProtocolBlock GProtocolBlock(GInteractionSeq seq) { - CommonToken t = newToken(ScribbleParser.GLOBALPROTOCOLBLOCK, - "GLOBALPROTOCOLBLOCK"); + CommonToken t = newToken(ScribbleParser.GPROTOBLOCK, + "GPROTOBLOCK"); GProtocolBlock n = new GProtocolBlock(t); n.addChild(seq); del(n, new GProtocolBlockDel()); @@ -481,8 +481,8 @@ public GProtocolBlock GProtocolBlock(GInteractionSeq seq) @Override public GInteractionSeq GInteractionSeq(List elems) { - CommonToken t = newToken(ScribbleParser.GLOBALINTERACTIONSEQUENCE, - "GLOBALINTERACTIONSEQUENCE"); + CommonToken t = newToken(ScribbleParser.GACTIONSEQ, + "GACTIONSEQ"); GInteractionSeq n = new GInteractionSeq(t); n.addChildren(elems); del(n, new GInteractionSeqDel()); @@ -493,8 +493,8 @@ public GInteractionSeq GInteractionSeq(List elems) public GMessageTransfer GMessageTransfer(RoleNode src, MessageNode msg, List dsts) { - CommonToken t = newToken(ScribbleParser.GLOBALMESSAGETRANSFER, - "GLOBALMESSAGETRANSFER"); + CommonToken t = newToken(ScribbleParser.GMSGTRANSFER, + "GMSGTRANSFER"); GMessageTransfer n = new GMessageTransfer(t); n.addChild(msg); n.addChild(src); @@ -506,8 +506,8 @@ public GMessageTransfer GMessageTransfer(RoleNode src, @Override public GConnect GConnect(RoleNode src, MessageNode msg, RoleNode dst) { - CommonToken t = newToken(ScribbleParser.GLOBALCONNECT, - "GLOBALCONNECT"); + CommonToken t = newToken(ScribbleParser.GCONNECT, + "GCONNECT"); GConnect n = new GConnect(t); n.addChild(msg); n.addChild(src); @@ -519,8 +519,8 @@ public GConnect GConnect(RoleNode src, MessageNode msg, RoleNode dst) @Override public GDisconnect GDisconnect(RoleNode left, RoleNode right) { - CommonToken t = newToken(ScribbleParser.GLOBALDISCONNECT, - "GLOBALDISCONNECT"); + CommonToken t = newToken(ScribbleParser.GDCONN, + "GDCONN"); GDisconnect n = new GDisconnect(t); n.addChild(left); n.addChild(right); @@ -531,8 +531,8 @@ public GDisconnect GDisconnect(RoleNode left, RoleNode right) @Override public GWrap GWrap(RoleNode src, RoleNode dst) { - CommonToken t = newToken(ScribbleParser.GLOBALWRAP, - "GLOBALWRAP"); + CommonToken t = newToken(ScribbleParser.GWRAP, + "GWRAP"); GWrap n = new GWrap(t); n.addChild(src); n.addChild(dst); @@ -543,8 +543,8 @@ public GWrap GWrap(RoleNode src, RoleNode dst) @Override public GChoice GChoice(RoleNode subj, List blocks) { - CommonToken t = newToken(ScribbleParser.GLOBALCHOICE, - "GLOBALCHOICE"); + CommonToken t = newToken(ScribbleParser.GCHOICE, + "GCHOICE"); GChoice n = new GChoice(t); n.addChild(subj); n.addChildren(blocks); @@ -556,8 +556,8 @@ public GChoice GChoice(RoleNode subj, List blocks) public GRecursion GRecursion(RecVarNode rv, GProtocolBlock block) { - CommonToken t = newToken(ScribbleParser.GLOBALRECURSION, - "GLOBALRECURSION"); + CommonToken t = newToken(ScribbleParser.GRECURSION, + "GRECURSION"); GRecursion n = new GRecursion(t); n.addChild(rv); n.addChild(block); @@ -568,8 +568,8 @@ public GRecursion GRecursion(RecVarNode rv, @Override public GContinue GContinue(RecVarNode rv) { - CommonToken t = newToken(ScribbleParser.GLOBALCONTINUE, - "GLOBALCONTINUE"); + CommonToken t = newToken(ScribbleParser.GCONTINUE, + "GCONTINUE"); GContinue n = new GContinue(t); n.addChild(rv); del(n, new GContinueDel()); @@ -579,8 +579,8 @@ public GContinue GContinue(RecVarNode rv) @Override public GDo GDo(RoleArgList rs, NonRoleArgList as, GProtocolNameNode proto) { - CommonToken t = newToken(ScribbleParser.GLOBALDO, - "GLOBALDO"); + CommonToken t = newToken(ScribbleParser.GDO, + "GDO"); GDo n = new GDo(t); n.addChild(proto); n.addChild(rs); @@ -592,8 +592,8 @@ public GDo GDo(RoleArgList rs, NonRoleArgList as, GProtocolNameNode proto) @Override public RoleArgList RoleArgList(List rs) { - CommonToken t = newToken(ScribbleParser.GLOBALDO, - "GLOBALDO"); + CommonToken t = newToken(ScribbleParser.ROLEARG_LIST, + "ROLEARG_LIST"); RoleArgList n = new RoleArgList(t); n.addChildren(rs); del(n, new RoleArgListDel()); @@ -603,8 +603,8 @@ public RoleArgList RoleArgList(List rs) @Override public RoleArg RoleArg(RoleNode r) { - CommonToken t = newToken(ScribbleParser.GLOBALDO, - "GLOBALDO"); + CommonToken t = newToken(ScribbleParser.ROLEARG, + "ROLEARG"); RoleArg n = new RoleArg(t); n.addChild(r); del(n, createDefaultDelegate()); @@ -614,8 +614,8 @@ public RoleArg RoleArg(RoleNode r) @Override public NonRoleArgList NonRoleArgList(List as) { - CommonToken t = newToken(ScribbleParser.ARGUMENTINSTANTIATIONLIST, - "ARGUMENTINSTANTIATIONLIST"); + CommonToken t = newToken(ScribbleParser.ARG_LIST, + "ARG_LIST"); NonRoleArgList n = new NonRoleArgList(t); n.addChildren(as); del(n, new NonRoleArgListDel()); @@ -625,8 +625,8 @@ public NonRoleArgList NonRoleArgList(List as) @Override public NonRoleArg NonRoleArg(NonRoleArgNode arg) { - CommonToken t = newToken(ScribbleParser.ARGUMENTINSTANTIATIONLIST, - "ARGUMENTINSTANTIATIONLIST"); + CommonToken t = newToken(ScribbleParser.ARG, + "ARG"); NonRoleArg n = new NonRoleArg(t); n.addChild(arg); del(n, createDefaultDelegate()); diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 363763032..4ddce57bd 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -82,65 +82,58 @@ public ScribNode create(Token t) { case ScribbleParser.IDENTIFIER: return new IdNode(t); case ScribbleParser.EXTIDENTIFIER: return new IdNode(t); // CHECKME: Reuse IdNode OK? + + // Simple names "constructed directly" by parser, e.g., t=IDENTIFIER -> IDENTIFIER<...Node>[$t] - /* - case ScribbleParser.AMBIGUOUSNAME: return new AmbigNameNode(t); - case ScribbleParser.OPNAME: return new OpNode(t); - case ScribbleParser.RECURSIONVAR: return new RecVarNode(t); - case ScribbleParser.ROLENAME: return new RoleNode(t); - case ScribbleParser.SIGPARAMNAME: return new SigParamNode(t); - case ScribbleParser.TYPEPARAMNAME: return new TypeParamNode(t); - */ - - case ScribbleParser.GPROTOCOLNAME: return new GProtocolNameNode(t); - case ScribbleParser.MODULENAME: return new ModuleNameNode(t); - case ScribbleParser.SIGNAME: return new MessageSigNameNode(t); - case ScribbleParser.TYPENAME: return new DataTypeNode(t); + case ScribbleParser.GPROTO_NAME: return new GProtocolNameNode(t); + case ScribbleParser.MODULE_NAME: return new ModuleNameNode(t); + case ScribbleParser.SIG_NAME: return new MessageSigNameNode(t); + case ScribbleParser.TYPE_NAME: return new DataTypeNode(t); case ScribbleParser.MODULE: return new Module(t); case ScribbleParser.MODULEDECL: return new ModuleDecl(t); case ScribbleParser.IMPORTMODULE: return new ImportModule(t); - case ScribbleParser.PAYLOADTYPEDECL: return new DataTypeDecl(t); - case ScribbleParser.MESSAGESIGNATUREDECL: return new MessageSigNameDecl(t); - case ScribbleParser.GLOBALPROTOCOLDECL: return new GProtocolDecl(t); + case ScribbleParser.DATADECL: return new DataTypeDecl(t); + case ScribbleParser.SIGDECL: return new MessageSigNameDecl(t); + case ScribbleParser.GPROTODECL: return new GProtocolDecl(t); // CHECKME: refactor into header? - case ScribbleParser.GLOBALPROTOCOLDECLMODS: return new ProtocolModList(t); + case ScribbleParser.PROTOMOD_LIST: return new ProtocolModList(t); case ScribbleParser.AUX_KW: return new AuxMod(t); // FIXME: KW being used directly case ScribbleParser.EXPLICIT_KW: return new ExplicitMod(t); - case ScribbleParser.GLOBALPROTOCOLHEADER: return new GProtocolHeader(t); - case ScribbleParser.ROLEDECLLIST: return new RoleDeclList(t); + case ScribbleParser.GPROTOHEADER: return new GProtocolHeader(t); + case ScribbleParser.ROLEDECL_LIST: return new RoleDeclList(t); case ScribbleParser.ROLEDECL: return new RoleDecl(t); - case ScribbleParser.PARAMETERDECLLIST: return new NonRoleParamDeclList(t); + case ScribbleParser.PARAMDECL_LIST: return new NonRoleParamDeclList(t); case ScribbleParser.TYPEPARAMDECL: return new TypeParamDecl(t); case ScribbleParser.SIGPARAMDECL: return new SigParamDecl(t); - case ScribbleParser.GLOBALPROTOCOLDEF: return new GProtocolDef(t); - case ScribbleParser.GLOBALPROTOCOLBLOCK: return new GProtocolBlock(t); - case ScribbleParser.GLOBALINTERACTIONSEQUENCE: return new GInteractionSeq(t); + case ScribbleParser.GPROTODEF: return new GProtocolDef(t); + case ScribbleParser.GPROTOBLOCK: return new GProtocolBlock(t); + case ScribbleParser.GACTIONSEQ: return new GInteractionSeq(t); - case ScribbleParser.MESSAGESIGNATURE: return new MessageSigNode(t); - case ScribbleParser.PAYLOAD: return new PayloadElemList(t); // N.B. UnaryPayloadElem parsed "manually" in Scribble.g + case ScribbleParser.SIG_LIT: return new MessageSigNode(t); + case ScribbleParser.PAYELEM_LIST: return new PayloadElemList(t); // N.B. UnaryPayloadElem parsed "manually" in Scribble.g - case ScribbleParser.GLOBALMESSAGETRANSFER: return new GMessageTransfer(t); - case ScribbleParser.GLOBALCONNECT: return new GConnect(t); - case ScribbleParser.GLOBALCONTINUE: return new GContinue(t); - case ScribbleParser.GLOBALDISCONNECT: return new GDisconnect(t); - case ScribbleParser.GLOBALDO: return new GDo(t); + case ScribbleParser.GMSGTRANSFER: return new GMessageTransfer(t); + case ScribbleParser.GCONNECT: return new GConnect(t); + case ScribbleParser.GCONTINUE: return new GContinue(t); + case ScribbleParser.GDCONN: return new GDisconnect(t); + case ScribbleParser.GDO: return new GDo(t); - case ScribbleParser.ROLEINSTANTIATIONLIST: return new RoleArgList(t); - case ScribbleParser.ROLEINSTANTIATION: return new RoleArg(t); - case ScribbleParser.ARGUMENTINSTANTIATIONLIST: return new NonRoleArgList(t); - case ScribbleParser.NONROLEARG: return new NonRoleArg(t); // Only for messagesignature -- qualifiedname (datatypenode or ambignamenode) done "manually" in scribble.g (cf. UnaryPayloadElem) + case ScribbleParser.ROLEARG_LIST: return new RoleArgList(t); + case ScribbleParser.ROLEARG: return new RoleArg(t); + case ScribbleParser.ARG_LIST: return new NonRoleArgList(t); + case ScribbleParser.ARG: return new NonRoleArg(t); // Only for messagesignature -- qualifiedname (datatypenode or ambignamenode) done "manually" in scribble.g (cf. UnaryPayloadElem) - case ScribbleParser.GLOBALCHOICE: return new GChoice(t); - case ScribbleParser.GLOBALRECURSION: return new GRecursion(t); + case ScribbleParser.GCHOICE: return new GChoice(t); + case ScribbleParser.GRECURSION: return new GRecursion(t); // Special cases - case ScribbleParser.EMPTY_OPERATOR: return new OpNode(t); // From Scribble.g, token (t) text is OpNode.EMPTY_OP_TOKEN_TEXT + case ScribbleParser.EMPTY_OP: return new OpNode(t); // From Scribble.g, token (t) text is OpNode.EMPTY_OP_TOKEN_TEXT - case ScribbleParser.QUALIFIEDNAME: return new IdNode(t); + case ScribbleParser.COMPOUND_NAME: return new IdNode(t); // Hacky? Repurposing IdNode as a "temporary QUALIFIEDNAME" -- token is QUALIFIEDNAME (not ID), and children are the IdNode elements of the qualified name // (Using IdNode as a "shell", but "token type" determined by t -- a bit misleading, IdNode here not an actual IDENTIFIER -- CHECKME: make a proper QUALIFIEDNAME?) // It is a "temporary" QUALIFIEDNAME, "internally" parsed by ScribbleParser.parsePayloadElem/parseNonRoleArg From 38075b62dc3cdb6c009058c62b7321865718ca1e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 12:50:20 +0100 Subject: [PATCH 270/539] Continued: tidying Scribble.g. --- .../org/scribble/ast/name/simple/OpNode.java | 2 +- .../src/main/java/org/scribble/main/Main.java | 9 +- .../org/scribble/parser/antlr/Scribble.g | 33 ++-- .../parser/scribble/AstFactoryImpl.java | 162 +++++++++--------- .../parser/scribble/ScribTreeAdaptor.java | 8 +- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 6 files changed, 116 insertions(+), 100 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java index 1c5952d4b..d93310ff6 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java @@ -29,7 +29,7 @@ public OpNode(Token t) } // Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] - // N.B. ttype (an "imaginary node" type) is discarded, t is a ScribbleParser.ID token type + // ttype is just ScribblParser.IDENTIFIER, t is the IDENTIFIER token public OpNode(int ttype, Token t) { this(t); diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index 58885cda4..d726c8275 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -53,6 +53,7 @@ public class Main public final ModuleName main; public final Map args; + private final ScribAntlrWrapper antlr; //private final ResourceLocator locator; // Path -> Resource private final ScribModuleLoader loader; // ModuleName -> Pair @@ -82,18 +83,20 @@ public Main(String inline, Map args) private Main(Pair hack, Path mainpath, Map args) throws ScribException, ScribParserException { + this.antlr = new ScribAntlrWrapper(); + // Set this.loader and load main Pair main; if (hack.right == null) { //this.locator = hack.left; - this.loader = new ScribModuleLoader(hack.left, newAntlr()); + this.loader = new ScribModuleLoader(hack.left, this.antlr); main = this.loader.loadMainModule(mainpath); } else { //this.locator = null; - this.loader = new ScribModuleLoader(null, newAntlr()); // CHECKME: null locator OK? + this.loader = new ScribModuleLoader(null, this.antlr); // CHECKME: null locator OK? main = this.loader.loadMainModule(hack.right); if (main.right.getImportDeclChildren().stream() .anyMatch(x -> x.isImportModule())) @@ -119,7 +122,7 @@ protected ScribAntlrWrapper newAntlr() protected Lang newLang(Map parsed, Map args, ModuleName mainFullname) throws ScribException { - AstFactoryImpl af = new AstFactoryImpl(); + AstFactoryImpl af = new AstFactoryImpl(this.antlr); // Was previously made inside Lang, but AstFactoryImpl now lives in scribble-parser, to access ScribbleParser constants return new Lang(mainFullname, args, parsed, af); } diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index e3e7ecab2..fc548ae74 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -10,7 +10,7 @@ /** * Pattern: each node type must give its "node type constant" as its text, e.g., module: ... -> ^(MODULE ...) -- all info in its children - * i.e. Each Token will be equivalent to, e.g., new CommonToken(ScribbleParser.MODULE, "MODULE") + * i.e. Each token will be equivalent to, e.g., new CommonToken(ScribbleParser.MODULE, "MODULE") * Except for IDENTIFIER/IdNode: text is the IDENTIFIER value, i.e., new CommonToken(ScribbleParser.IDENTIFIER, "...") */ @@ -62,12 +62,17 @@ tokens DO_KW = 'do'; - /* Parser "output" Token types (corresponding to the Scribble BNF), i.e., the - * values used to distinguish resulting AST nodes. - * They are used by ScribTreeAdaptor to create the output using the org.scribble.ast classes. - * The specific value of these tokens aren't important (constants accessed via - * fields of ScribbleParser). - * These Token types denote ANTLR "imaginary nodes". + /* Scribble AST token types (corresponding to the Scribble BNF). + * These token types are used by ScribTreeAdaptor to create the output nodes + * using the org.scribble.ast classes. + * (Trying to construct those classes directly from here doesn't seem to work + * well for most cases.) + * These tokens are ANTLR "imaginary tokens": they are derived by the ANTLR + * "rewrite rules" on the actual source tokens. + * The specific value of these tokens aren't important (the constants are + * accessed via fields of ScribbleParser). + * As a naming convention, we use a few "_" suffixes: _KW, _NAME, _LIT and + * _LIST. */ // CHECKME: split naming of type int constant from String label ? // CHECKME: split imaginary node types ? @@ -113,16 +118,16 @@ tokens GPROTOBLOCK = 'GPROTOBLOCK'; GACTIONSEQ = 'GACTIONSEQ'; - GMSGTRANSFER = 'GMSGTRANSFER'; GCONNECT = 'GCONNECT'; - GWRAP = 'GWRAP'; - GDCONN = 'GDCONN'; GCONTINUE = 'GCONTINUE'; + GDCONN = 'GDCONN'; GDO = 'GDO'; + GMSGTRANSFER = 'GMSGTRANSFER'; + GWRAP = 'GWRAP'; - ROLEARG_LIST = 'ROLEARG_LIST'; + ROLEARG_LIST = 'ROLEARG_LIST'; // Cf. ROLEDECL ROLEARG = 'ROLEARG_LIST'; - ARG_LIST = 'ARG_LIST'; + ARG_LIST = 'ARG_LIST'; // Cf. PARAM_DECL ARG = 'ARG'; GCHOICE = 'GCHOICE'; @@ -449,8 +454,8 @@ module: ^(MODULE[$t] ^(MODULEDECL[$t] modulename) importmodule* datatypedecl* protocoldecl*) ; -// TODO: add token arg to other imag nodes -// moduledecl: MODULE_KW^ modulename ';' // "Become root" ^ cannot be on rhs? +// moduledecl: MODULE_KW^ modulename ';' + // "Become root" ^ cannot be on rhs? -- so "manually" rewrite to Scribble AST token types /** diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java index 4564aeafb..efec14d50 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java @@ -13,7 +13,10 @@ */ package org.scribble.parser.scribble; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.antlr.runtime.CommonToken; import org.scribble.ast.AstFactory; @@ -112,9 +115,47 @@ public class AstFactoryImpl implements AstFactory { - public AstFactoryImpl() + // Purely for the convenience of newToken(type) + protected final ScribbleParser parser; + protected final Map tokens; + + public AstFactoryImpl(ScribAntlrWrapper antlr) + { + try + { + Class parserC = + org.scribble.parser.antlr.ScribbleParser.class; + this.parser = antlr.newScribbleParser(null); + Map tokens = new HashMap<>(); + for (String t : ScribbleParser.tokenNames) + { + char c = t.charAt(0); + if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) + { + tokens.put(parserC.getField(t).getInt(this.parser), t); + } + } + this.tokens = Collections.unmodifiableMap(tokens); + } + catch (IllegalArgumentException | IllegalAccessException + | NoSuchFieldException | SecurityException e) + { + throw new RuntimeException(e); + } + } + + // type comes from the int constants in ScribbleParser, which come from the tokens in Scribble.g + // Pre: type is an "imaginary token" type from ScribbleParser -- (not IDENTIFIER) + protected CommonToken newToken(int type) { - + // As a default, token text is set to the textual name of the token type int field (also the Scribble.g default) + String text = this.tokens.get(type); + return new CommonToken(type, text); + } + + protected CommonToken newIdToken(String text) + { + return new CommonToken(ScribbleParser.IDENTIFIER, text); } protected ScribDel createDefaultDelegate() @@ -132,7 +173,7 @@ protected static T del(T n, ScribDel del) @Override public IdNode IdNode(String text) { - CommonToken t = new CommonToken(ScribbleParser.IDENTIFIER, text); + CommonToken t = newIdToken(text); // IdNode is the only token with a "different" text to its node type -- info stored directly as its the text, no children IdNode n = new IdNode(t); return n; @@ -142,8 +183,8 @@ public IdNode IdNode(String text) @Override public AmbigNameNode AmbiguousNameNode(String text) { - int ttype = ScribbleParser.AMBIG_NAME; - CommonToken t = newToken(ttype, text); + int ttype = ScribbleParser.IDENTIFIER; + CommonToken t = newIdToken(text); AmbigNameNode n = new AmbigNameNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] n.del(new AmbigNameNodeDel()); return n; @@ -153,7 +194,7 @@ public AmbigNameNode AmbiguousNameNode(String text) public OpNode OpNode(String text) { int ttype = ScribbleParser.IDENTIFIER; - CommonToken t = newToken(ttype, "OPNAME"); + CommonToken t = newIdToken(text); OpNode n = new OpNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] del(n, createDefaultDelegate()); return n; @@ -163,7 +204,7 @@ public OpNode OpNode(String text) public RecVarNode RecVarNode(String text) { int ttype = ScribbleParser.IDENTIFIER; - CommonToken t = newToken(ttype, "RECURSIONVAR"); + CommonToken t = newIdToken(text); RecVarNode n = new RecVarNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] del(n, new RecVarNodeDel()); return n; @@ -173,7 +214,7 @@ public RecVarNode RecVarNode(String text) public RoleNode RoleNode(String text) { int ttype = ScribbleParser.IDENTIFIER; - CommonToken t = newToken(ttype, "ROLENAME"); + CommonToken t = newIdToken(text); RoleNode n = new RoleNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] del(n, new RoleNodeDel()); return n; @@ -183,7 +224,7 @@ public RoleNode RoleNode(String text) public SigParamNode SigParamNode(String text) { int ttype = ScribbleParser.IDENTIFIER; // N.B. cf. ScribbleParser.SIGNAME - CommonToken t = newToken(ttype, text); + CommonToken t = newIdToken(text); SigParamNode n = new SigParamNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] n.del(new NonRoleParamNodeDel()); return n; @@ -193,7 +234,7 @@ public SigParamNode SigParamNode(String text) public TypeParamNode TypeParamNode(String text) { int ttype = ScribbleParser.IDENTIFIER; // N.B. cf. ScribbleParser.TYPENAME - CommonToken t = newToken(ttype, text); + CommonToken t = newIdToken(text); TypeParamNode n = new TypeParamNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] n.del(new NonRoleParamNodeDel()); return n; @@ -206,13 +247,13 @@ public QualifiedNameNode QualifiedNameNode( QualifiedNameNode n = null; if (kind.equals(SigKind.KIND)) { - CommonToken t = newToken(ScribbleParser.SIG_NAME, "SIG_NAME"); + CommonToken t = newToken(ScribbleParser.SIG_NAME); n = new MessageSigNameNode(t); del(n, new MessageSigNameNodeDel()); } else if (kind.equals(DataTypeKind.KIND)) { - CommonToken t = newToken(ScribbleParser.TYPE_NAME, "TYPE_NAME"); + CommonToken t = newToken(ScribbleParser.TYPE_NAME); n = new DataTypeNode(t); del(n, new DataTypeNodeDel()); } @@ -224,12 +265,12 @@ else if (kind.equals(DataTypeKind.KIND)) if (kind.equals(ModuleKind.KIND)) { - CommonToken t = newToken(ScribbleParser.MODULE_NAME, "MODULE_NAME"); + CommonToken t = newToken(ScribbleParser.MODULE_NAME); n = new ModuleNameNode(t); } else if (kind.equals(Global.KIND)) { - CommonToken t = newToken(ScribbleParser.GPROTO_NAME, "GPROTO_NAME"); + CommonToken t = newToken(ScribbleParser.GPROTO_NAME); n = new GProtocolNameNode(t); } else @@ -251,24 +292,11 @@ protected static , K extends Kind> T castNameNode( T tmp = (T) n; return tmp; } - - // type comes from the int constants in ScribbleParser, which come from the tokens in Scribble.g - // Pre: any type from ScribbleParser, except IDENTIFIER (IdNode) - private CommonToken newToken(int type) - { - String text = null; // CHECKEME: use reflection to get token int field name? - return new CommonToken(type, text); - } - - private CommonToken newToken(int type, String text) - { - return new CommonToken(type, text); - } @Override public MessageSigNode MessageSigNode(OpNode op, PayloadElemList pay) { - CommonToken t = newToken(ScribbleParser.SIG_LIT, "SIG_LIT"); + CommonToken t = newToken(ScribbleParser.SIG_LIT); MessageSigNode n = new MessageSigNode(t); n.addChild(op); n.addChild(pay); @@ -279,7 +307,7 @@ public MessageSigNode MessageSigNode(OpNode op, PayloadElemList pay) @Override public PayloadElemList PayloadElemList(List> elems) { - CommonToken t = newToken(ScribbleParser.PAYELEM_LIST, "PAYELEM_LIST"); + CommonToken t = newToken(ScribbleParser.PAYELEM_LIST); PayloadElemList n = new PayloadElemList(t); n.addChildren(elems); del(n, createDefaultDelegate()); @@ -291,7 +319,7 @@ public PayloadElemList PayloadElemList(List> elems) public UnaryPayloadElem UnaryPayloadElem( PayloadElemNameNode name) { - CommonToken t = newToken(ScribbleParser.UNARY_PAYELEM, "UNARY_PAYELEM"); + CommonToken t = newToken(ScribbleParser.UNARY_PAYELEM); UnaryPayloadElem n = new UnaryPayloadElem<>(t); // Cf. Scribble.g children order n.addChild(name); @@ -302,7 +330,7 @@ public UnaryPayloadElem UnaryPayloadElem( @Override public GDelegationElem GDelegationElem(GProtocolNameNode proto, RoleNode role) { - CommonToken t = newToken(ScribbleParser.DELEG_PAYELEM, "DELEG_PAYELEM"); + CommonToken t = newToken(ScribbleParser.DELEG_PAYELEM); GDelegationElem n = new GDelegationElem(t); n.addChild(proto); n.addChild(role); @@ -316,7 +344,7 @@ public Module Module(ModuleDecl moddecl, List> imports, List> data, List> protos) { - CommonToken t = newToken(ScribbleParser.MODULE, "MODULE"); + CommonToken t = newToken(ScribbleParser.MODULE); Module n = new Module(t); n.addChild(moddecl); n.addChildren(imports); @@ -329,7 +357,7 @@ public Module Module(ModuleDecl moddecl, @Override public ModuleDecl ModuleDecl(ModuleNameNode fullmodname) { - CommonToken t = newToken(ScribbleParser.MODULEDECL, "MODULEDECL"); + CommonToken t = newToken(ScribbleParser.MODULEDECL); ModuleDecl n = new ModuleDecl(t); n.addChild(fullmodname); del(n, createDefaultDelegate()); @@ -340,7 +368,7 @@ public ModuleDecl ModuleDecl(ModuleNameNode fullmodname) public ImportModule ImportModule(ModuleNameNode modname, ModuleNameNode alias) { - CommonToken t = newToken(ScribbleParser.IMPORTMODULE, "IMPORTMODULE"); + CommonToken t = newToken(ScribbleParser.IMPORTMODULE); ImportModule n = new ImportModule(t); n.addChild(modname); if (alias != null) @@ -355,8 +383,7 @@ public ImportModule ImportModule(ModuleNameNode modname, public MessageSigNameDecl MessageSigNameDecl(IdNode schema, IdNode extName, IdNode extSource, MessageSigNameNode alias) { - CommonToken t = newToken(ScribbleParser.SIGDECL, - "SIGDECL"); + CommonToken t = newToken(ScribbleParser.SIGDECL); MessageSigNameDecl n = new MessageSigNameDecl(t); n.addChild(schema); n.addChild(extName); @@ -370,8 +397,7 @@ public MessageSigNameDecl MessageSigNameDecl(IdNode schema, public DataTypeDecl DataTypeDecl(IdNode schema, IdNode extName, IdNode extSource, DataTypeNode alias) { - CommonToken t = newToken(ScribbleParser.DATADECL, - "DATADECL"); + CommonToken t = newToken(ScribbleParser.DATADECL); DataTypeDecl n = new DataTypeDecl(t); n.addChild(schema); n.addChild(extName); @@ -385,8 +411,7 @@ public DataTypeDecl DataTypeDecl(IdNode schema, public GProtocolDecl GProtocolDecl(ProtocolModList mods, GProtocolHeader header, GProtocolDef def) { - CommonToken t = newToken(ScribbleParser.GPROTODECL, - "GPROTODECL"); + CommonToken t = newToken(ScribbleParser.GPROTODECL); GProtocolDecl n = new GProtocolDecl(t); n.addChild(mods); n.addChild(header); @@ -399,8 +424,7 @@ public GProtocolDecl GProtocolDecl(ProtocolModList mods, public GProtocolHeader GProtocolHeader(GProtocolNameNode name, RoleDeclList rs, NonRoleParamDeclList ps) { - CommonToken t = newToken(ScribbleParser.GPROTOHEADER, - "GPROTOHEADER"); + CommonToken t = newToken(ScribbleParser.GPROTOHEADER); GProtocolHeader n = new GProtocolHeader(t); n.addChild(name); n.addChild(ps); @@ -412,8 +436,7 @@ public GProtocolHeader GProtocolHeader(GProtocolNameNode name, @Override public RoleDeclList RoleDeclList(List ds) { - CommonToken t = newToken(ScribbleParser.ROLEDECL_LIST, - "ROLEDECL_LIST"); + CommonToken t = newToken(ScribbleParser.ROLEDECL_LIST); RoleDeclList n = new RoleDeclList(t); // Cf. Scribble.g children order n.addChildren(ds); @@ -424,8 +447,7 @@ public RoleDeclList RoleDeclList(List ds) @Override public RoleDecl RoleDecl(RoleNode r) { - CommonToken t = newToken(ScribbleParser.ROLEDECL, - "ROLEDECL"); + CommonToken t = newToken(ScribbleParser.ROLEDECL); RoleDecl n = new RoleDecl(t); n.addChild(r); del(n, new RoleDeclDel()); @@ -436,8 +458,7 @@ public RoleDecl RoleDecl(RoleNode r) public NonRoleParamDeclList NonRoleParamDeclList( List> ds) { - CommonToken t = newToken(ScribbleParser.PARAMDECL_LIST, - "PARAMDECL_LIST"); + CommonToken t = newToken(ScribbleParser.PARAMDECL_LIST); NonRoleParamDeclList n = new NonRoleParamDeclList(t); // Cf. Scribble.g children order n.addChildren(ds); @@ -459,8 +480,7 @@ public NonRoleParamDecl NonRoleParamDecl( @Override public GProtocolDef GProtocolDef(GProtocolBlock block) { - CommonToken t = newToken(ScribbleParser.GPROTODEF, - "GPROTODEF"); + CommonToken t = newToken(ScribbleParser.GPROTODEF); GProtocolDef n = new GProtocolDef(t); n.addChild(block); del(n, new GProtocolDefDel()); @@ -470,8 +490,7 @@ public GProtocolDef GProtocolDef(GProtocolBlock block) @Override public GProtocolBlock GProtocolBlock(GInteractionSeq seq) { - CommonToken t = newToken(ScribbleParser.GPROTOBLOCK, - "GPROTOBLOCK"); + CommonToken t = newToken(ScribbleParser.GPROTOBLOCK); GProtocolBlock n = new GProtocolBlock(t); n.addChild(seq); del(n, new GProtocolBlockDel()); @@ -481,8 +500,7 @@ public GProtocolBlock GProtocolBlock(GInteractionSeq seq) @Override public GInteractionSeq GInteractionSeq(List elems) { - CommonToken t = newToken(ScribbleParser.GACTIONSEQ, - "GACTIONSEQ"); + CommonToken t = newToken(ScribbleParser.GACTIONSEQ); GInteractionSeq n = new GInteractionSeq(t); n.addChildren(elems); del(n, new GInteractionSeqDel()); @@ -493,8 +511,7 @@ public GInteractionSeq GInteractionSeq(List elems) public GMessageTransfer GMessageTransfer(RoleNode src, MessageNode msg, List dsts) { - CommonToken t = newToken(ScribbleParser.GMSGTRANSFER, - "GMSGTRANSFER"); + CommonToken t = newToken(ScribbleParser.GMSGTRANSFER); GMessageTransfer n = new GMessageTransfer(t); n.addChild(msg); n.addChild(src); @@ -506,8 +523,7 @@ public GMessageTransfer GMessageTransfer(RoleNode src, @Override public GConnect GConnect(RoleNode src, MessageNode msg, RoleNode dst) { - CommonToken t = newToken(ScribbleParser.GCONNECT, - "GCONNECT"); + CommonToken t = newToken(ScribbleParser.GCONNECT); GConnect n = new GConnect(t); n.addChild(msg); n.addChild(src); @@ -519,8 +535,7 @@ public GConnect GConnect(RoleNode src, MessageNode msg, RoleNode dst) @Override public GDisconnect GDisconnect(RoleNode left, RoleNode right) { - CommonToken t = newToken(ScribbleParser.GDCONN, - "GDCONN"); + CommonToken t = newToken(ScribbleParser.GDCONN); GDisconnect n = new GDisconnect(t); n.addChild(left); n.addChild(right); @@ -531,8 +546,7 @@ public GDisconnect GDisconnect(RoleNode left, RoleNode right) @Override public GWrap GWrap(RoleNode src, RoleNode dst) { - CommonToken t = newToken(ScribbleParser.GWRAP, - "GWRAP"); + CommonToken t = newToken(ScribbleParser.GWRAP); GWrap n = new GWrap(t); n.addChild(src); n.addChild(dst); @@ -543,8 +557,7 @@ public GWrap GWrap(RoleNode src, RoleNode dst) @Override public GChoice GChoice(RoleNode subj, List blocks) { - CommonToken t = newToken(ScribbleParser.GCHOICE, - "GCHOICE"); + CommonToken t = newToken(ScribbleParser.GCHOICE); GChoice n = new GChoice(t); n.addChild(subj); n.addChildren(blocks); @@ -556,8 +569,7 @@ public GChoice GChoice(RoleNode subj, List blocks) public GRecursion GRecursion(RecVarNode rv, GProtocolBlock block) { - CommonToken t = newToken(ScribbleParser.GRECURSION, - "GRECURSION"); + CommonToken t = newToken(ScribbleParser.GRECURSION); GRecursion n = new GRecursion(t); n.addChild(rv); n.addChild(block); @@ -568,8 +580,7 @@ public GRecursion GRecursion(RecVarNode rv, @Override public GContinue GContinue(RecVarNode rv) { - CommonToken t = newToken(ScribbleParser.GCONTINUE, - "GCONTINUE"); + CommonToken t = newToken(ScribbleParser.GCONTINUE); GContinue n = new GContinue(t); n.addChild(rv); del(n, new GContinueDel()); @@ -579,8 +590,7 @@ public GContinue GContinue(RecVarNode rv) @Override public GDo GDo(RoleArgList rs, NonRoleArgList as, GProtocolNameNode proto) { - CommonToken t = newToken(ScribbleParser.GDO, - "GDO"); + CommonToken t = newToken(ScribbleParser.GDO); GDo n = new GDo(t); n.addChild(proto); n.addChild(rs); @@ -592,8 +602,7 @@ public GDo GDo(RoleArgList rs, NonRoleArgList as, GProtocolNameNode proto) @Override public RoleArgList RoleArgList(List rs) { - CommonToken t = newToken(ScribbleParser.ROLEARG_LIST, - "ROLEARG_LIST"); + CommonToken t = newToken(ScribbleParser.ROLEARG_LIST); RoleArgList n = new RoleArgList(t); n.addChildren(rs); del(n, new RoleArgListDel()); @@ -603,8 +612,7 @@ public RoleArgList RoleArgList(List rs) @Override public RoleArg RoleArg(RoleNode r) { - CommonToken t = newToken(ScribbleParser.ROLEARG, - "ROLEARG"); + CommonToken t = newToken(ScribbleParser.ROLEARG); RoleArg n = new RoleArg(t); n.addChild(r); del(n, createDefaultDelegate()); @@ -614,8 +622,7 @@ public RoleArg RoleArg(RoleNode r) @Override public NonRoleArgList NonRoleArgList(List as) { - CommonToken t = newToken(ScribbleParser.ARG_LIST, - "ARG_LIST"); + CommonToken t = newToken(ScribbleParser.ARG_LIST); NonRoleArgList n = new NonRoleArgList(t); n.addChildren(as); del(n, new NonRoleArgListDel()); @@ -625,8 +632,7 @@ public NonRoleArgList NonRoleArgList(List as) @Override public NonRoleArg NonRoleArg(NonRoleArgNode arg) { - CommonToken t = newToken(ScribbleParser.ARG, - "ARG"); + CommonToken t = newToken(ScribbleParser.ARG); NonRoleArg n = new NonRoleArg(t); n.addChild(arg); del(n, createDefaultDelegate()); diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 4ddce57bd..785b8866c 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -93,21 +93,22 @@ public ScribNode create(Token t) case ScribbleParser.MODULE: return new Module(t); case ScribbleParser.MODULEDECL: return new ModuleDecl(t); case ScribbleParser.IMPORTMODULE: return new ImportModule(t); + case ScribbleParser.DATADECL: return new DataTypeDecl(t); case ScribbleParser.SIGDECL: return new MessageSigNameDecl(t); case ScribbleParser.GPROTODECL: return new GProtocolDecl(t); // CHECKME: refactor into header? case ScribbleParser.PROTOMOD_LIST: return new ProtocolModList(t); - case ScribbleParser.AUX_KW: return new AuxMod(t); // FIXME: KW being used directly + case ScribbleParser.AUX_KW: return new AuxMod(t); // FIXME: KW return by parser directly (cf. other tokens are imaginary) case ScribbleParser.EXPLICIT_KW: return new ExplicitMod(t); case ScribbleParser.GPROTOHEADER: return new GProtocolHeader(t); case ScribbleParser.ROLEDECL_LIST: return new RoleDeclList(t); case ScribbleParser.ROLEDECL: return new RoleDecl(t); case ScribbleParser.PARAMDECL_LIST: return new NonRoleParamDeclList(t); - case ScribbleParser.TYPEPARAMDECL: return new TypeParamDecl(t); case ScribbleParser.SIGPARAMDECL: return new SigParamDecl(t); + case ScribbleParser.TYPEPARAMDECL: return new TypeParamDecl(t); case ScribbleParser.GPROTODEF: return new GProtocolDef(t); case ScribbleParser.GPROTOBLOCK: return new GProtocolBlock(t); @@ -116,11 +117,12 @@ public ScribNode create(Token t) case ScribbleParser.SIG_LIT: return new MessageSigNode(t); case ScribbleParser.PAYELEM_LIST: return new PayloadElemList(t); // N.B. UnaryPayloadElem parsed "manually" in Scribble.g - case ScribbleParser.GMSGTRANSFER: return new GMessageTransfer(t); case ScribbleParser.GCONNECT: return new GConnect(t); case ScribbleParser.GCONTINUE: return new GContinue(t); case ScribbleParser.GDCONN: return new GDisconnect(t); case ScribbleParser.GDO: return new GDo(t); + case ScribbleParser.GMSGTRANSFER: return new GMessageTransfer(t); + case ScribbleParser.GWRAP: throw new RuntimeException("[TODO] GWrap: " + t); case ScribbleParser.ROLEARG_LIST: return new RoleArgList(t); case ScribbleParser.ROLEARG: return new RoleArg(t); diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 442910447..2efdf9c82 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -76,7 +76,7 @@ module tmp.Test; //...HERE fix simp node constructors and af (no IdNode child) --- fix ambignodel to use af -- fix ambignodel to use af -- fix ambignodel to use af -- fix ambignodel to use af - separate af methods //...remove Token args from af constructors -- refactor reconstructs to use af? - //...disallow/check for reserved __ + //...disallow/check for reserved __ -- do in gtype translation? // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) // sort out full name expansion between disamb and translation -- fix modulecontextcollector for imported module member fullnames From 99d9b9883e448947c9a4ed847363597d7e50ce25 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 14:18:08 +0100 Subject: [PATCH 271/539] Continued: tidying Scribble.g. --- .../java/org/scribble/ast/AstFactory.java | 1 + .../org/scribble/ast/DisconnectAction.java | 18 +- .../org/scribble/ast/global/GDisconnect.java | 8 - .../java/org/scribble/ast/global/GWrap.java | 43 +- .../java/org/scribble/del/DelDecorator.java | 1 + .../java/org/scribble/cli/CLArgParser.java | 2 +- .../main/java/org/scribble/cli/CLFlag.java | 13 + .../core/visit/MessageIdGatherer.java | 13 + .../core/visit/NonProtoDepsGatherer.java | 13 + .../core/visit/ProtoDepsCollector.java | 13 + .../org/scribble/core/visit/RecPruner.java | 13 + .../scribble/core/visit/RecVarGatherer.java | 13 + .../org/scribble/core/visit/RoleGatherer.java | 13 + .../org/scribble/core/visit/STypeAgg.java | 13 + .../scribble/core/visit/STypeAggNoThrow.java | 13 + .../scribble/core/visit/STypeGatherer.java | 13 + .../org/scribble/core/visit/STypeInliner.java | 13 + .../scribble/core/visit/STypeUnfolder.java | 13 + .../org/scribble/core/visit/STypeVisitor.java | 13 + .../core/visit/STypeVisitorNoThrow.java | 13 + .../org/scribble/core/visit/Substitutor.java | 13 + .../global/ExtChoiceConsistencyChecker.java | 13 + .../core/visit/global/GTypeInliner.java | 13 + .../core/visit/global/GTypeUnfolder.java | 13 + .../core/visit/global/InlinedProjector.java | 13 + .../scribble/core/visit/global/Projector.java | 13 + .../visit/global/RoleEnablingChecker.java | 13 + .../core/visit/local/EGraphBuilder.java | 13 + .../core/visit/local/LTypeInliner.java | 13 + .../core/visit/local/LTypeUnfolder.java | 13 + .../core/visit/local/ReachabilityChecker.java | 13 + .../visit/local/SingleContinueChecker.java | 13 + .../org/scribble/parser/antlr/Scribble.g | 380 +++++++++--------- .../parser/scribble/AstFactoryImpl.java | 55 +-- .../parser/scribble/DelDecoratorImpl.java | 158 ++++---- .../parser/scribble/ScribTreeAdaptor.java | 14 +- 36 files changed, 697 insertions(+), 321 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 35f052954..578c08676 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -56,6 +56,7 @@ public interface AstFactory { IdNode IdNode(String text); + //ExtIdNode ExtIdNode(String text); // Deprecate? Never need to make ambigname "manually" via af? (only constructed by ScribbleParser) AmbigNameNode AmbiguousNameNode(String text); diff --git a/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java b/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java index 5d8b34dea..b7c1ae590 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java @@ -16,6 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -53,11 +54,11 @@ public RoleNode getRightChild() public DisconnectAction reconstruct(RoleNode left, RoleNode right) { - DisconnectAction da = dupNode(); - da.addChild(left); - da.addChild(right); - da.setDel(del()); // No copy - return da; + DisconnectAction n = dupNode(); + n.addChild(left); + n.addChild(right); + n.setDel(del()); // No copy + return n; } @Override @@ -68,4 +69,11 @@ public DisconnectAction visitChildren(AstVisitor nv) RoleNode dest = (RoleNode) visitChild(getRightChild(), nv); return reconstruct(src, dest); } + + @Override + public String toString() + { + return Constants.DISCONNECT_KW + " " + getLeftChild() + + " " + Constants.TO_KW + " " + getRightChild() + ";"; + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java index 42bef78c0..0a3f5595c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java @@ -16,7 +16,6 @@ import org.antlr.runtime.Token; import org.scribble.ast.DisconnectAction; import org.scribble.core.type.kind.Global; -import org.scribble.util.Constants; public class GDisconnect extends DisconnectAction implements GSimpleSessionNode @@ -38,11 +37,4 @@ public GDisconnect dupNode() { return new GDisconnect(this); } - - @Override - public String toString() - { - return Constants.DISCONNECT_KW + " " + getLeftChild() - + " " + Constants.TO_KW + " " + getRightChild() + ";"; - } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java index 34718ba85..45e68428e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java @@ -14,12 +14,20 @@ package org.scribble.ast.global; import org.antlr.runtime.Token; -import org.scribble.ast.ConnectAction; +import org.scribble.ast.BasicInteraction; +import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Global; import org.scribble.util.Constants; +import org.scribble.util.ScribException; +import org.scribble.visit.AstVisitor; -public class GWrap extends ConnectAction implements GSimpleSessionNode +// TODO: factor out base Wrap (cf. Disconnect) +public class GWrap extends BasicInteraction + implements GSimpleSessionNode { + public static final int CLIENT_CHILD_INDEX = 0; + public static final int SERVER_CHILD_INDEX = 1; + // ScribTreeAdaptor#create constructor public GWrap(Token t) { @@ -32,16 +40,43 @@ public GWrap(GWrap node) super(node); } + public RoleNode getClientChild() + { + return (RoleNode) getChild(CLIENT_CHILD_INDEX); + } + + public RoleNode getServerChild() + { + return (RoleNode) getChild(SERVER_CHILD_INDEX); + } + @Override public GWrap dupNode() { return new GWrap(this); } + public GWrap reconstruct(RoleNode client, RoleNode server) + { + GWrap n = dupNode(); + n.addChild(client); + n.addChild(server); + n.setDel(del()); // No copy + return n; + } + + @Override + public GWrap visitChildren(AstVisitor nv) throws ScribException + { + RoleNode src = (RoleNode) visitChild(getClientChild(), nv); + RoleNode dest = (RoleNode) visitChild(getServerChild(), nv); + return reconstruct(src, dest); + } + @Override public String toString() { - return Constants.WRAP_KW + " " + getSourceChild() + " " + Constants.TO_KW - + " " + getDestinationChild() + ";"; + return Constants.WRAP_KW + " " + getClientChild() + + " " + Constants.TO_KW + " " + getServerChild() + ";"; } } diff --git a/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java b/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java index e35970be9..4d04daf82 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java +++ b/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java @@ -126,6 +126,7 @@ public interface DelDecorator void AmbigNameNode(AmbigNameNode n); void IdNode(IdNode n); + //void ExtIdNode(ExtIdNode n); // NonRoleParamNode NonRoleParamNode(CommonTree source, K kind, String identifier); void SigParamNode(SigParamNode n); diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java index 8dd25fa22..fc77b1158 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java @@ -1,4 +1,4 @@ -/**f +/** * Copyright 2008 The Scribble Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLFlag.java b/scribble-cli/src/main/java/org/scribble/cli/CLFlag.java index fcc47e368..c2e21db1b 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLFlag.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLFlag.java @@ -4,6 +4,19 @@ import java.util.List; +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ public class CLFlag { final String lab; // ID field: CLFlags String constant -- N.B. includes "-" prefix diff --git a/scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java index fd6b357fb..5491ac1ab 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit; import java.util.stream.Stream; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java index 74a49f558..f99c81b3c 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit; import java.util.LinkedList; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java index beb22b4f3..13a5169fd 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit; import java.util.stream.Stream; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java index 6c57a0c74..fa35d3da6 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit; import java.util.LinkedList; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java index b9e433f77..637d2ec1c 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit; import java.util.stream.Stream; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java index b21ae2bd6..675607a3e 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit; import java.util.stream.Stream; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java index 26f6071ce..b534ebb3f 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit; import java.util.LinkedList; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java index ef594df56..ae52110ce 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit; import java.util.stream.Stream; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java index 9868c1750..895de659f 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit; import java.util.Optional; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java index 4e62de055..39b9e0724 100755 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit; import java.util.Deque; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java index 8f1e3348d..40c066648 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit; import java.util.HashMap; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java index d62a5102f..7e6ce5682 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit; import java.util.LinkedList; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java index 25f5ce3c7..b5c143538 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit; import java.util.List; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java index 94ae7045f..7b86a0938 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit; import java.util.LinkedList; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java index ec5959163..bda574cc4 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit.global; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java index 11247bafe..ec354abfe 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit.global; import org.scribble.core.job.Job; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeUnfolder.java index 97b46e872..40fa83a1b 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeUnfolder.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit.global; import org.scribble.core.type.kind.Global; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index 317eec62f..6d240edb2 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit.global; import java.util.HashSet; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java index 84436a0e3..a5e51f872 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit.global; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java index fca7a23af..54975dfb0 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit.global; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 6e54d03c2..33ffa2f01 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit.local; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java index 58a4ee24b..8941f5c40 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit.local; import org.scribble.core.job.Job; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java index 068955146..b39c1a966 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit.local; import org.scribble.core.type.kind.Local; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java index 7729ceb2e..fbe310bfc 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit.local; import java.util.Collections; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java index b9015f14d..d55ed1aa4 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit.local; import java.util.Collections; diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index fc548ae74..da962e212 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -11,7 +11,7 @@ /** * Pattern: each node type must give its "node type constant" as its text, e.g., module: ... -> ^(MODULE ...) -- all info in its children * i.e. Each token will be equivalent to, e.g., new CommonToken(ScribbleParser.MODULE, "MODULE") - * Except for IDENTIFIER/IdNode: text is the IDENTIFIER value, i.e., new CommonToken(ScribbleParser.IDENTIFIER, "...") + * Except for ID/IdNode: text is the ID value, i.e., new CommonToken(ScribbleParser.ID, "...") */ grammar Scribble; @@ -74,8 +74,6 @@ tokens * As a naming convention, we use a few "_" suffixes: _KW, _NAME, _LIT and * _LIST. */ - // CHECKME: split naming of type int constant from String label ? - // CHECKME: split imaginary node types ? // Special cases EMPTY_OP = '__EMPTY_OP'; @@ -87,10 +85,10 @@ tokens // Other simple names are // Compound names - GPROTO_NAME = 'GPROTO_NAME'; + GPROTO_NAME = 'GPROTO_NAME'; // Parse specifically as GProto, for ScribTreeAdaptor.create MODULE_NAME = 'MODULE_NAME'; + DATA_NAME = 'DATA_NAME'; // N.B. distinct from DATAPARAM_NAME SIG_NAME = 'SIG_NAME'; // N.B. distinct from SIGPARAM_NAME - TYPE_NAME = 'TYPE_NAME'; // N.B. distinct from TYPEPARAM_NAME // Sig literals SIG_LIT = 'SIG_LIT'; @@ -98,6 +96,7 @@ tokens UNARY_PAYELEM = 'UNARY_PAYELEM'; DELEG_PAYELEM = 'DELEG_PAYELEM'; + // Scribble "language" nodes, i.e., the nodes that are not "session nodes" (see below) MODULE = 'MODULE'; MODULEDECL = 'MODULEDECL'; IMPORTMODULE = 'IMPORTMODULE'; @@ -111,12 +110,14 @@ tokens ROLEDECL_LIST = 'ROLEDECL_LIST'; ROLEDECL = 'ROLEDECL'; PARAMDECL_LIST = 'PARAMDECL_LIST'; - TYPEPARAMDECL = 'TYPE_PARAMDECL'; - SIGPARAMDECL = 'SIG_PARAMDECL'; + DATAPARAMDECL = 'DATAPARAMDECL'; + SIGPARAMDECL = 'SIGPARAMDECL'; GPROTODEF = 'GPROTODEF'; GPROTOBLOCK = 'GPROTOBLOCK'; - GACTIONSEQ = 'GACTIONSEQ'; + + // Scribble "session nodes" -- cf. org.scribble.core.type.session vs. org.scribble.core.lang + GINTERSEQ = 'GINTERSEQ'; GCONNECT = 'GCONNECT'; GCONTINUE = 'GCONTINUE'; @@ -126,7 +127,7 @@ tokens GWRAP = 'GWRAP'; ROLEARG_LIST = 'ROLEARG_LIST'; // Cf. ROLEDECL - ROLEARG = 'ROLEARG_LIST'; + ROLEARG = 'ROLEARG'; ARG_LIST = 'ARG_LIST'; // Cf. PARAM_DECL ARG = 'ARG'; @@ -215,9 +216,9 @@ tokens { if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname { - DataTypeNode dt = new DataTypeNode(new CommonToken(TYPE_NAME, "TYPE_NAME")); + DataTypeNode dt = new DataTypeNode(new CommonToken(DATA_NAME, "DATA_NAME")); ((List) qn.getChildren()).forEach(x -> - dt.addChild(new IdNode(new CommonToken(IDENTIFIER, ((CommonTree) x).getText())))); + dt.addChild(new IdNode(new CommonToken(ID, ((CommonTree) x).getText())))); UnaryPayloadElem pe = new UnaryPayloadElem(new CommonToken(UNARY_PAYELEM, "UNARYPAYLOADELEM")); pe.addChild(dt); @@ -227,12 +228,12 @@ tokens { // Similarly to NonRoleArg: cannot syntactically distinguish right now between SimplePayloadTypeNode and ParameterNode String text = qn.getChild(0).getText(); - IdNode id = new IdNode(new CommonToken(IDENTIFIER, text)); + IdNode id = new IdNode(new CommonToken(ID, text)); /*AmbigNameNode an = new AmbigNameNode(new CommonToken(AMBIG_NAME, "AMBIG_NAME")); an.addChild(id);*/ AmbigNameNode an = - new AmbigNameNode(AMBIG_NAME, new CommonToken(IDENTIFIER, text)); + new AmbigNameNode(AMBIG_NAME, new CommonToken(ID, text)); UnaryPayloadElem e = new UnaryPayloadElem( new CommonToken(UNARY_PAYELEM, "UNARYPAYLOADELEM")); e.addChild(an); @@ -240,15 +241,15 @@ tokens } } - // Only for QualifiedName (DataTypeNode or AmbigNameNode), not messagesignature literal + // Only for QualifiedName (DataTypeNode or AmbigNameNode), not siglit literal // qn is an IdNode "holder" for a qualifiedname public static CommonTree parseNonRoleArg(CommonTree qn) throws RecognitionException { if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname { - DataTypeNode dt = new DataTypeNode(new CommonToken(TYPE_NAME, "TYPE_NAME")); + DataTypeNode dt = new DataTypeNode(new CommonToken(DATA_NAME, "DATA_NAME")); ((List) qn.getChildren()).forEach(x -> - dt.addChild(new IdNode(new CommonToken(IDENTIFIER, ((CommonTree) x).getText())))); + dt.addChild(new IdNode(new CommonToken(ID, ((CommonTree) x).getText())))); NonRoleArg a = new NonRoleArg(new CommonToken(ARG, "ARG")); a.addChild(dt); @@ -257,12 +258,12 @@ tokens else { String text = qn.getChild(0).getText(); - IdNode id = new IdNode(new CommonToken(IDENTIFIER, text)); + IdNode id = new IdNode(new CommonToken(ID, text)); /*AmbigNameNode an = new AmbigNameNode(new CommonToken(AMBIG_NAME, "AMBIG_NAME")); an.addChild(id);*/ AmbigNameNode an = - new AmbigNameNode(AMBIG_NAME, new CommonToken(IDENTIFIER, text)); + new AmbigNameNode(AMBIG_NAME, new CommonToken(ID, text)); NonRoleArg a = new NonRoleArg(new CommonToken(ARG, "ARG")); a.addChild(an); return a; @@ -317,7 +318,6 @@ WHITESPACE: { $channel = HIDDEN; } - ; /** @@ -340,7 +340,7 @@ LINE_COMMENT: /** * Section 2.3 Identifiers */ -IDENTIFIER: +ID: (LETTER | DIGIT | UNDERSCORE)* /* Underscore currently can cause ambiguities in the API generation naming * scheme But maybe only consecutive underscores are the problem -- cannot @@ -358,10 +358,10 @@ fragment SYMBOL: // Comes after SYMBOL due to an ANTLR syntax highlighting issue involving // quotes. // Parser doesn't work without quotes here (e.g. if inlined into parser rules) -EXTIDENTIFIER: +EXTID: '\"' (LETTER | DIGIT | SYMBOL)* '\"' - //(LETTER | DIGIT | SYMBOL)* ; + //(LETTER | DIGIT | SYMBOL)* // Not working fragment LETTER: 'a'..'z' | 'A'..'Z' @@ -383,63 +383,38 @@ fragment UNDERSCORE: /* * Section 3.1 Primitive Names */ -//simplename: id=IDENTIFIER -> { checkId($id.tree) } ; // How to integrate with IDENTIFIER[$t] ? +//simplename: id=ID -> { checkId($id.tree) } ; // How to integrate with ID[$t] ? // "The TreeAdaptor is not called; instead [the] constructors are invoked directly." // "Note that parameters are not allowed on token references to the left of ->:" // "Use imaginary nodes as you normally would, but with the addition of the node type:" // But currently, ID token itself unchanged and ttype int ends up discarded -ambiguousnamenode: t=IDENTIFIER -> IDENTIFIER[$t]; -recursionvarnamenode: t=IDENTIFIER -> IDENTIFIER[$t]; -rolenamenode: t=IDENTIFIER -> IDENTIFIER[$t]; -sigparamnamenode: t=IDENTIFIER -> IDENTIFIER[$t]; -typeparamnamenode: t=IDENTIFIER -> IDENTIFIER[$t]; -opnamenode: - -> ^(EMPTY_OP) -| - t=IDENTIFIER -> IDENTIFIER[$t] -; +ambigname: t=ID -> ID[$t]; +dataparamname: t=ID -> ID[$t]; +opname: -> ^(EMPTY_OP) | t=ID -> ID[$t] ; +recvarname: t=ID -> ID[$t]; +rolename: t=ID -> ID[$t]; +sigparamname: t=ID -> ID[$t]; + /** * Section 3.2.1 Package, Module and Module Member Names */ +gprotoname: t=ID ('.' ID)* -> ^(GPROTO_NAME[$t] ID+) ; +modulename: t=ID ('.' ID)* -> ^(MODULE_NAME[$t] ID+) ; +qualifiedname: t=ID ('.' ID)* -> ^(COMPOUND_NAME[$t] ID+) ; +signame: t=ID ('.' ID)* -> ^(SIG_NAME[$t] ID+) ; -// Using qualified to rep simple -simplemodulename: t=IDENTIFIER -> ^(MODULE_NAME[$t] IDENTIFIER) ; -simplepayloadtypename: t=IDENTIFIER -> ^(TYPE_NAME[$t] IDENTIFIER) ; - // TODO factor out with typedecl? NO: params distinct from "literals" -simplemessagesignaturename: t=IDENTIFIER -> ^(SIG_NAME[$t] IDENTIFIER) ; - // TODO factor out with sigparamdecl? NO: params distinct from "literals" -simpleprotocolname: t=IDENTIFIER -> ^(GPROTO_NAME[$t] IDENTIFIER) ; - -qualifiedname: - t=IDENTIFIER ('.' IDENTIFIER)* --> - ^(COMPOUND_NAME[$t] IDENTIFIER+) -; - -packagename: qualifiedname; -membername: qualifiedname; - -modulename: - t=IDENTIFIER ('.' IDENTIFIER)* --> - ^(MODULE_NAME[$t] IDENTIFIER+) -; - -protocolname: membername; -payloadtypename: membername; +/*// Not parsed as direct categories +packagename: qualifiedname; +membername: qualifiedname; +protocolname: membername; +payloadtypename: membername; // data? or also, e.g., deleg? */ -messagesignaturename: - t=IDENTIFIER ('.' IDENTIFIER)* --> - ^(SIG_NAME[$t] IDENTIFIER+) -; - -gprotocolnamenode: - t=IDENTIFIER ('.' IDENTIFIER)* - -> - ^(GPROTO_NAME[$t] IDENTIFIER+) -; +// Cf. primitive names, above +simplegprotoname: t=ID -> ^(GPROTO_NAME[$t] ID) ; +simplemodulename: t=ID -> ^(MODULE_NAME[$t] ID) ; +simpledataname: t=ID -> ^(DATA_NAME[$t] ID) ; +simplesigname: t=ID -> ^(SIG_NAME[$t] ID) ; /** @@ -449,10 +424,10 @@ gprotocolnamenode: // "References to tokens with rewrite not found on left of -> are imaginary tokens." // Inlined moduledecl to make token label work module: - t=MODULE_KW modulename ';' importmodule* datatypedecl* protocoldecl* EOF + t=MODULE_KW modulename ';' importmodule* nonprotodecl* protodecl* EOF -> - ^(MODULE[$t] ^(MODULEDECL[$t] modulename) importmodule* datatypedecl* - protocoldecl*) + ^(MODULE[$t] ^(MODULEDECL[$t] modulename) importmodule* nonprotodecl* + protodecl*) ; // moduledecl: MODULE_KW^ modulename ';' // "Become root" ^ cannot be on rhs? -- so "manually" rewrite to Scribble AST token types @@ -462,58 +437,67 @@ module: * Section 3.3 Import Declarations */ importmodule: - t=IMPORT_KW modulename (AS_KW alias=simplemodulename)? ';' --> ^(IMPORTMODULE[$t] modulename $alias?) + t=IMPORT_KW modulename (AS_KW alias=simplemodulename)? ';' +-> + ^(IMPORTMODULE[$t] modulename $alias?) ; /** - * Section 3.4 Payload Type Declarations - * // TODO: rename type as data + * Section 3.4 "Non Protocol" Declarations */ -datatypedecl: payloadtypedecl | messagesignaturedecl ; +nonprotodecl: + datadecl | sigdecl ; -payloadtypedecl: - t=TYPE_KW '<' schema=IDENTIFIER '>' extName=EXTIDENTIFIER FROM_KW - extSource=EXTIDENTIFIER AS_KW alias=simplepayloadtypename ';' + // Deprecate TYPE_KW ? +datadecl: + t=(TYPE_KW | DATA_KW) '<' schema=ID '>' extName=EXTID FROM_KW + extSource=EXTID AS_KW alias=simpledataname ';' -> - // alias first to be uniform with other NameDeclNode (getRawNameNodeChild) - ^(DATADECL[$t] $alias $schema $extName $extSource) + ^(DATADECL[$t] $alias $schema $extName $extSource) ; + // alias first to be uniform with other NameDeclNode (getRawNameNodeChild) -messagesignaturedecl: - t=SIG_KW '<' schema=IDENTIFIER '>' extName=EXTIDENTIFIER FROM_KW - extSource=EXTIDENTIFIER AS_KW alias=simplemessagesignaturename ';' +sigdecl: + t=SIG_KW '<' schema=ID '>' extName=EXTID FROM_KW extSource=EXTID AS_KW + alias=simplesigname ';' -> - // alias first to be uniform with other NameDeclNode (getRawNameNodeChild) - ^(SIGDECL[$t] $alias $schema $extName $extSource) + ^(SIGDECL[$t] $alias $schema $extName $extSource) ; + // alias first to be uniform with other NameDeclNode (getRawNameNodeChild) /** * Section 3.5 Message Signatures */ -messagesignature: - opnamenode '(' payload ')' --> ^(SIG_LIT opnamenode payload) +siglit: + opname '(' payelems ')' +-> + ^(SIG_LIT opname payelems) ; -// CHECKME: how to apply [$t] in these situations? +// CHECKME: how to apply [$t] in such situations? -payload: --> ^(PAYELEM_LIST) - | payloadelement (',' payloadelement)* --> ^(PAYELEM_LIST payloadelement+) +payelems: +-> + ^(PAYELEM_LIST) +| + payelem (',' payelem)* +-> + ^(PAYELEM_LIST payelem+) ; -payloadelement: - // Payload element must be a data kind, cannot be a sig name - // Qualified name must be a data type name - // Also subsumes simple names, could be a data *param* - qualifiedname --> { parsePayloadElem($qualifiedname.tree) } // Use ".text" instead of ".tree" for token String - | gprotocolnamenode '@' rolenamenode --> ^(DELEG_PAYELEM rolenamenode gprotocolnamenode) +payelem: + // Payload element must be a data kind, cannot be a sig name + // Qualified name must be a data type name + // Also subsumes simple names, could be a data *param* + qualifiedname +-> + { parsePayloadElem($qualifiedname.tree) } // Use ".text" instead of ".tree" for token String +| + gprotoname '@' rolename +-> + ^(DELEG_PAYELEM rolename gprotoname) ; @@ -521,172 +505,174 @@ payloadelement: /** * Section 3.6 Protocol Declarations */ -protocoldecl: globalprotocoldecl ; +protodecl: + gprotodecl ; /** * Section 3.7 Global Protocol Declarations */ -globalprotocoldecl: - globalprotocoldeclmodifiers globalprotocolheader globalprotocoldefinition +gprotodecl: + protomods gprotoheader gprotodef -> - ^(GPROTODECL globalprotocoldeclmodifiers globalprotocolheader - globalprotocoldefinition) + ^(GPROTODECL protomods gprotoheader gprotodef) ; // "aux" must come before "explicit" -globalprotocoldeclmodifiers: - -> ^(PROTOMOD_LIST) - | t=AUX_KW -> ^(PROTOMOD_LIST[$t] AUX_KW) - | t=AUX_KW EXPLICIT_KW -> ^(PROTOMOD_LIST[$t] AUX_KW EXPLICIT_KW) - | t=EXPLICIT_KW -> ^(PROTOMOD_LIST[$t] EXPLICIT_KW) +protomods: + -> ^(PROTOMOD_LIST) +| t=AUX_KW -> ^(PROTOMOD_LIST[$t] AUX_KW) +| t=AUX_KW EXPLICIT_KW -> ^(PROTOMOD_LIST[$t] AUX_KW EXPLICIT_KW) +| t=EXPLICIT_KW -> ^(PROTOMOD_LIST[$t] EXPLICIT_KW) ; -globalprotocolheader: - t=GLOBAL_KW PROTOCOL_KW simpleprotocolname parameterdecllist roledecllist +gprotoheader: + t=GLOBAL_KW PROTOCOL_KW simplegprotoname paramdecls roledecls -> - ^(GPROTOHEADER[$t] simpleprotocolname parameterdecllist roledecllist) + ^(GPROTOHEADER[$t] simplegprotoname paramdecls roledecls) ; -roledecllist: - t='(' roledecl (',' roledecl)* ')' -> ^(ROLEDECL_LIST[$t] roledecl+) ; +roledecls: + t='(' roledecl (',' roledecl)* ')' -> ^(ROLEDECL_LIST[$t] roledecl+) ; -roledecl: t=ROLE_KW rolenamenode -> ^(ROLEDECL[$t] rolenamenode) ; +roledecl: + t=ROLE_KW rolename -> ^(ROLEDECL[$t] rolename) ; -parameterdecllist: --> ^(PARAMDECL_LIST) - | t='<' parameterdecl (',' parameterdecl)* '>' --> ^(PARAMDECL_LIST[$t] parameterdecl+) +paramdecls: +-> + ^(PARAMDECL_LIST) +| + t='<' paramdecl (',' paramdecl)* '>' +-> + ^(PARAMDECL_LIST[$t] paramdecl+) ; -parameterdecl: typedecl | sigdecl ; -typedecl: - t=TYPE_KW typeparamnamenode -> ^(TYPEPARAMDECL[$t] typeparamnamenode) ; -sigdecl: - t=SIG_KW sigparamnamenode -> ^(SIGPARAMDECL[$t] sigparamnamenode) ; +paramdecl: dataparamdecl | sigparamdecl ; + +dataparamdecl: + t=TYPE_KW dataparamname -> ^(DATAPARAMDECL[$t] dataparamname) ; + +sigparamdecl: + t=SIG_KW sigparamname -> ^(SIGPARAMDECL[$t] sigparamname) ; /** * Section 3.7.1 Global Protocol Definitions */ -globalprotocoldefinition: - globalprotocolblock -> ^(GPROTODEF globalprotocolblock) ; +gprotodef: + gprotoblock -> ^(GPROTODEF gprotoblock) ; /** * Section 3.7.3 Global Interaction Sequences and Blocks */ -globalprotocolblock: - t='{' globalinteractionsequence '}' --> - ^(GPROTOBLOCK[$t] globalinteractionsequence) +gprotoblock: + t='{' gseq '}' -> ^(GPROTOBLOCK[$t] gseq) ; -globalinteractionsequence: - globalinteraction* --> - ^(GACTIONSEQ globalinteraction*) +gseq: + ginteraction* -> ^(GINTERSEQ ginteraction*) ; -globalinteraction: - globalmessagetransfer -| globalchoice -| globalrecursion -| globalcontinue -| globaldo -| globalconnect -| globaldisconnect -| globalwrap -; +ginteraction: + gconnect | gmsgtransfer | gwrap | gdisconnect | gcontinue | gdo | gchoice | grecursion ; + // Simple session node: directed interaction + // Simple session node: basic interaction + // Simple session node (other) + // Compound session node /** * Section 3.7.4 Global Message Transfer */ -globalmessagetransfer: - message FROM_KW rolenamenode TO_KW rolenamenode (',' rolenamenode )* ';' --> ^(GMSGTRANSFER message rolenamenode+) +message: + siglit | ambigname // ambigname = sig name or sig param name +; + +// TODO: qualified (messagesig) names -- although qualified signame subsumes parametername case +gmsgtransfer: + message FROM_KW rolename TO_KW rolename (',' rolename )* ';' +-> + ^(GMSGTRANSFER message rolename+) ; // TODO: multisend -message: - messagesignature // Sig literal -| ambiguousnamenode // Sig name or sig param name -; -// TODO: qualified (messagesig) names // Although qualified messagesignaturename subsumes parametername case - -globalconnect: - message CONNECT_KW rolenamenode TO_KW rolenamenode ';' --> ^(GCONNECT message rolenamenode rolenamenode) - | t=CONNECT_KW rolenamenode TO_KW rolenamenode ';' --> ^(GCONNECT[$t] ^(SIG_LIT ^(EMPTY_OP) ^(PAYELEM_LIST)) - rolenamenode rolenamenode) +gconnect: + message CONNECT_KW rolename TO_KW rolename ';' +-> + ^(GCONNECT message rolename rolename) +| + t=CONNECT_KW rolename TO_KW rolename ';' +-> + ^(GCONNECT[$t] ^(SIG_LIT ^(EMPTY_OP) ^(PAYELEM_LIST)) rolename rolename) // CHECKME: deprecate? i.e., require "()" as for message transfers? i.e., simply delete this rule? ; - -globaldisconnect: - t=DISCONNECT_KW rolenamenode AND_KW rolenamenode ';' --> ^(GDCONN[$t] rolenamenode rolenamenode) +gdisconnect: + t=DISCONNECT_KW rolename AND_KW rolename ';' +-> + ^(GDCONN[$t] rolename rolename) ; -globalwrap: - t=WRAP_KW rolenamenode TO_KW rolenamenode ';' --> ^(GWRAP[$t] rolenamenode rolenamenode) +gwrap: + t=WRAP_KW rolename TO_KW rolename ';' +-> ^(GWRAP[$t] rolename rolename) ; /** * Section 3.7.5 Global Choice */ -globalchoice: - t=CHOICE_KW AT_KW rolenamenode globalprotocolblock (OR_KW - globalprotocolblock)* --> ^(GCHOICE[$t] rolenamenode globalprotocolblock+) +gchoice: + t=CHOICE_KW AT_KW rolename gprotoblock (OR_KW gprotoblock)* +-> + ^(GCHOICE[$t] rolename gprotoblock+) ; /** * Section 3.7.6 Global Recursion */ -globalrecursion: - t=REC_KW recursionvarnamenode globalprotocolblock --> ^(GRECURSION[$t] recursionvarnamenode globalprotocolblock) +grecursion: + t=REC_KW recvarname gprotoblock +-> + ^(GRECURSION[$t] recvarname gprotoblock) ; -globalcontinue: - t=CONTINUE_KW recursionvarnamenode ';' --> ^(GCONTINUE recursionvarnamenode) +gcontinue: + t=CONTINUE_KW recvarname ';' +-> + ^(GCONTINUE[$t] recvarname) ; /** * Section 3.7.9 Global Do */ -globaldo: - DO_KW gprotocolnamenode argumentinstantiationlist roleinstantiationlist ';' --> ^(GDO gprotocolnamenode argumentinstantiationlist roleinstantiationlist) +gdo: + DO_KW gprotoname nonroleargs roleargs ';' +-> + ^(GDO gprotoname nonroleargs roleargs) ; -roleinstantiationlist: - t='(' roleinstantiation (',' roleinstantiation)* ')' --> ^(ROLEARG_LIST[$t] roleinstantiation+) +roleargs: + t='(' rolearg (',' rolearg)* ')' -> ^(ROLEARG_LIST[$t] rolearg+) ; -roleinstantiation: rolenamenode -> ^(ROLEARG rolenamenode) ; - // CHECKME: inconsistent with arginstas/payloadeles +rolearg: + rolename -> ^(ROLEARG rolename) ; -argumentinstantiationlist: --> ^(ARG_LIST) -| t='<' argumentinstantiation (',' argumentinstantiation)* '>' --> ^(ARG_LIST[$t] argumentinstantiation+) +nonroleargs: + -> ^(ARG_LIST) +| + t='<' nonrolearg (',' nonrolearg)* '>' -> ^(ARG_LIST[$t] nonrolearg+) ; // Grammatically same as message, but qualifiedname case may also be a payload type -argumentinstantiation: - messagesignature --> ^(ARG messagesignature) -| qualifiedname --> { parseNonRoleArg($qualifiedname.tree) } // Like PayloadElement, simple names need disambiguation +nonrolearg: + siglit -> ^(ARG siglit) +| + qualifiedname -> { parseNonRoleArg($qualifiedname.tree) } // Like payelem, simple names need disambiguation ; + diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java index efec14d50..0b9112522 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java @@ -145,7 +145,7 @@ public AstFactoryImpl(ScribAntlrWrapper antlr) } // type comes from the int constants in ScribbleParser, which come from the tokens in Scribble.g - // Pre: type is an "imaginary token" type from ScribbleParser -- (not IDENTIFIER) + // Pre: type is an "imaginary token" type from ScribbleParser -- (not ID) protected CommonToken newToken(int type) { // As a default, token text is set to the textual name of the token type int field (also the Scribble.g default) @@ -155,7 +155,7 @@ protected CommonToken newToken(int type) protected CommonToken newIdToken(String text) { - return new CommonToken(ScribbleParser.IDENTIFIER, text); + return new CommonToken(ScribbleParser.ID, text); } protected ScribDel createDefaultDelegate() @@ -174,18 +174,27 @@ protected static T del(T n, ScribDel del) public IdNode IdNode(String text) { CommonToken t = newIdToken(text); - // IdNode is the only token with a "different" text to its node type -- info stored directly as its the text, no children + // (Ext)IdNode is the only token with a "different" text to its node type -- info stored directly as its the text, no children IdNode n = new IdNode(t); return n; } + + /*@Override + public ExtIdNode ExtIdNode(String text) + { + CommonToken t = newIdToken(text); + // (Ext)IdNode is the only token with a "different" text to its node type -- info stored directly as its the text, no children + ExtIdNode n = new ExtIdNode(t); + return n; + }*/ // Deprecate? Never need to make ambigname "manually" via af? (only constructed by ScribbleParser) @Override public AmbigNameNode AmbiguousNameNode(String text) { - int ttype = ScribbleParser.IDENTIFIER; + int ttype = ScribbleParser.ID; CommonToken t = newIdToken(text); - AmbigNameNode n = new AmbigNameNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + AmbigNameNode n = new AmbigNameNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] n.del(new AmbigNameNodeDel()); return n; } @@ -193,9 +202,9 @@ public AmbigNameNode AmbiguousNameNode(String text) @Override public OpNode OpNode(String text) { - int ttype = ScribbleParser.IDENTIFIER; + int ttype = ScribbleParser.ID; CommonToken t = newIdToken(text); - OpNode n = new OpNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + OpNode n = new OpNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] del(n, createDefaultDelegate()); return n; } @@ -203,9 +212,9 @@ public OpNode OpNode(String text) @Override public RecVarNode RecVarNode(String text) { - int ttype = ScribbleParser.IDENTIFIER; + int ttype = ScribbleParser.ID; CommonToken t = newIdToken(text); - RecVarNode n = new RecVarNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + RecVarNode n = new RecVarNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] del(n, new RecVarNodeDel()); return n; } @@ -213,9 +222,9 @@ public RecVarNode RecVarNode(String text) @Override public RoleNode RoleNode(String text) { - int ttype = ScribbleParser.IDENTIFIER; + int ttype = ScribbleParser.ID; CommonToken t = newIdToken(text); - RoleNode n = new RoleNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + RoleNode n = new RoleNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] del(n, new RoleNodeDel()); return n; } @@ -223,9 +232,9 @@ public RoleNode RoleNode(String text) @Override public SigParamNode SigParamNode(String text) { - int ttype = ScribbleParser.IDENTIFIER; // N.B. cf. ScribbleParser.SIGNAME + int ttype = ScribbleParser.ID; // N.B. cf. ScribbleParser.SIGNAME CommonToken t = newIdToken(text); - SigParamNode n = new SigParamNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + SigParamNode n = new SigParamNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] n.del(new NonRoleParamNodeDel()); return n; } @@ -233,9 +242,9 @@ public SigParamNode SigParamNode(String text) @Override public TypeParamNode TypeParamNode(String text) { - int ttype = ScribbleParser.IDENTIFIER; // N.B. cf. ScribbleParser.TYPENAME + int ttype = ScribbleParser.ID; // N.B. cf. ScribbleParser.TYPENAME CommonToken t = newIdToken(text); - TypeParamNode n = new TypeParamNode(ttype, t); // Cf. Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] + TypeParamNode n = new TypeParamNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] n.del(new NonRoleParamNodeDel()); return n; } @@ -245,18 +254,18 @@ public QualifiedNameNode QualifiedNameNode( K kind, List elems) { QualifiedNameNode n = null; - if (kind.equals(SigKind.KIND)) + if (kind.equals(DataTypeKind.KIND)) + { + CommonToken t = newToken(ScribbleParser.DATA_NAME); + n = new DataTypeNode(t); + del(n, new DataTypeNodeDel()); + } + else if (kind.equals(SigKind.KIND)) { CommonToken t = newToken(ScribbleParser.SIG_NAME); n = new MessageSigNameNode(t); del(n, new MessageSigNameNodeDel()); } - else if (kind.equals(DataTypeKind.KIND)) - { - CommonToken t = newToken(ScribbleParser.TYPE_NAME); - n = new DataTypeNode(t); - del(n, new DataTypeNodeDel()); - } if (n != null) { n.addChildren(elems); @@ -500,7 +509,7 @@ public GProtocolBlock GProtocolBlock(GInteractionSeq seq) @Override public GInteractionSeq GInteractionSeq(List elems) { - CommonToken t = newToken(ScribbleParser.GACTIONSEQ); + CommonToken t = newToken(ScribbleParser.GINTERSEQ); GInteractionSeq n = new GInteractionSeq(t); n.addChildren(elems); del(n, new GInteractionSeqDel()); diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java index 5db5572d1..673ce796e 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java @@ -151,45 +151,45 @@ protected static void setDel(ScribNodeBase n, ScribDel del) } @Override - public void Module(Module m) + public void Module(Module n) { - setDel(m, new ModuleDel()); + setDel(n, new ModuleDel()); } @Override - public void ModuleDecl(ModuleDecl md) + public void ModuleDecl(ModuleDecl n) { - setDel(md, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); } @Override - public void ImportModule(ImportModule im) + public void ImportModule(ImportModule n) { - setDel(im, new ImportModuleDel()); + setDel(n, new ImportModuleDel()); } @Override - public void MessageSigNameDecl(MessageSigNameDecl sd) + public void MessageSigNameDecl(MessageSigNameDecl n) { - setDel(sd, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); } @Override - public void DataTypeDecl(DataTypeDecl td) + public void DataTypeDecl(DataTypeDecl n) { - setDel(td, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); } @Override - public void GProtocolDecl(GProtocolDecl gpd) + public void GProtocolDecl(GProtocolDecl n) { - setDel(gpd, new GProtocolDeclDel()); + setDel(n, new GProtocolDeclDel()); } @Override - public void ProtocolModList(ProtocolModList mods) + public void ProtocolModList(ProtocolModList n) { - setDel(mods, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); } @Override @@ -205,27 +205,27 @@ public void ExplicitMod(ExplicitMod n) } @Override - public void GProtocolHeader(GProtocolHeader gph) + public void GProtocolHeader(GProtocolHeader n) { - setDel(gph, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); } @Override - public void RoleDeclList(RoleDeclList rds) + public void RoleDeclList(RoleDeclList n) { - setDel(rds, new RoleDeclListDel()); + setDel(n, new RoleDeclListDel()); } @Override - public void RoleDecl(RoleDecl rd) + public void RoleDecl(RoleDecl n) { - setDel(rd, new RoleDeclDel()); + setDel(n, new RoleDeclDel()); } @Override - public void NonRoleParamDeclList(NonRoleParamDeclList pds) + public void NonRoleParamDeclList(NonRoleParamDeclList n) { - setDel(pds, new NonRoleParamDeclListDel()); + setDel(n, new NonRoleParamDeclListDel()); } /*@Override @@ -237,9 +237,9 @@ public NonRoleParamDecl NonRoleParamDecl(CommonT }*/ @Override - public void TypeParamDecl(TypeParamDecl td) + public void TypeParamDecl(TypeParamDecl n) { - setDel(td, new NonRoleParamDeclDel()); + setDel(n, new NonRoleParamDeclDel()); } @Override @@ -249,27 +249,27 @@ public void SigParamDecl(SigParamDecl sd) } @Override - public void GProtocolDef(GProtocolDef gpd) + public void GProtocolDef(GProtocolDef n) { - setDel(gpd, new GProtocolDefDel()); + setDel(n, new GProtocolDefDel()); } @Override - public void GProtocolBlock(GProtocolBlock gpb) + public void GProtocolBlock(GProtocolBlock n) { - setDel(gpb, new GProtocolBlockDel()); + setDel(n, new GProtocolBlockDel()); } @Override - public void GInteractionSeq(GInteractionSeq gis) + public void GInteractionSeq(GInteractionSeq n) { - setDel(gis, new GInteractionSeqDel()); + setDel(n, new GInteractionSeqDel()); } @Override - public void GMessageTransfer(GMessageTransfer gmt) + public void GMessageTransfer(GMessageTransfer n) { - setDel(gmt, new GMessageTransferDel()); + setDel(n, new GMessageTransferDel()); } @Override @@ -293,46 +293,46 @@ public GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest) }*/ @Override - public void GChoice(GChoice gc) + public void GChoice(GChoice n) { - setDel(gc, new GChoiceDel()); + setDel(n, new GChoiceDel()); } @Override - public void GRecursion(GRecursion gr) + public void GRecursion(GRecursion n) { - setDel(gr, new GRecursionDel()); + setDel(n, new GRecursionDel()); } @Override - public void GContinue(GContinue gc) + public void GContinue(GContinue n) { - setDel(gc, new GContinueDel()); + setDel(n, new GContinueDel()); } @Override - public void GDo(GDo gd) + public void GDo(GDo n) { - setDel(gd, new GDoDel()); + setDel(n, new GDoDel()); } @Override - public void MessageSigNode(MessageSigNode mn) + public void MessageSigNode(MessageSigNode n) { - setDel(mn, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); } @Override - public void PayloadElemList(PayloadElemList pay) + public void PayloadElemList(PayloadElemList n) { - setDel(pay, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); //setDel(pay, new PayloadElemListDel()); } @Override - public void UnaryPayloadElem(UnaryPayloadElem e) + public void UnaryPayloadElem(UnaryPayloadElem n) { - setDel(e, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); } /*@Override @@ -353,27 +353,27 @@ public LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode prot }*/ @Override - public void RoleArgList(RoleArgList rs) + public void RoleArgList(RoleArgList n) { - setDel(rs, new RoleArgListDel()); + setDel(n, new RoleArgListDel()); } @Override - public void RoleArg(RoleArg r) + public void RoleArg(RoleArg n) { - setDel(r, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); } @Override - public void NonRoleArgList(NonRoleArgList as) + public void NonRoleArgList(NonRoleArgList n) { - setDel(as, new NonRoleArgListDel()); + setDel(n, new NonRoleArgListDel()); } @Override - public void NonRoleArg(NonRoleArg a) + public void NonRoleArg(NonRoleArg n) { - setDel(a, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); } /*@Override @@ -416,45 +416,45 @@ public void RoleNode(RoleNode r) } @Override - public void RecVarNode(RecVarNode rv) + public void RecVarNode(RecVarNode n) { - setDel(rv, new RecVarNodeDel()); + setDel(n, new RecVarNodeDel()); } @Override - public void OpNode(OpNode op) + public void OpNode(OpNode n) { - setDel(op, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); } @Override - public void MessageSigNameNode(MessageSigNameNode mn) + public void MessageSigNameNode(MessageSigNameNode n) { - setDel(mn, new MessageSigNameNodeDel()); + setDel(n, new MessageSigNameNodeDel()); } @Override - public void DataTypeNode(DataTypeNode dn) + public void DataTypeNode(DataTypeNode n) { - setDel(dn, new DataTypeNodeDel()); + setDel(n, new DataTypeNodeDel()); } @Override - public void ModuleNameNode(ModuleNameNode mn) + public void ModuleNameNode(ModuleNameNode n) { - setDel(mn, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); } @Override - public void GProtocolNameNode(GProtocolNameNode gpn) + public void GProtocolNameNode(GProtocolNameNode n) { - setDel(gpn, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); } @Override - public void LProtocolNameNode(LProtocolNameNode lpn) + public void LProtocolNameNode(LProtocolNameNode n) { - setDel(lpn, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); } /*@Override @@ -507,17 +507,23 @@ protected static , K extends Kind> T castNameNode(K kind, }*/ @Override - public void AmbigNameNode(AmbigNameNode an) + public void AmbigNameNode(AmbigNameNode n) { - setDel(an, new AmbigNameNodeDel()); + setDel(n, new AmbigNameNodeDel()); } @Override - public void IdNode(IdNode an) + public void IdNode(IdNode n) { - setDel(an, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); } + /*@Override + public void ExtIdNode(ExtIdNode n) + { + setDel(n, createDefaultDelegate()); + }*/ + /*@Override public NonRoleParamNode NonRoleParamNode(CommonTree source, K kind, String identifier) { @@ -527,15 +533,15 @@ public NonRoleParamNode NonRoleParamNode(CommonT }*/ @Override - public void SigParamNode(SigParamNode sp) + public void SigParamNode(SigParamNode n) { - setDel(sp, new NonRoleParamNodeDel()); + setDel(n, new NonRoleParamNodeDel()); } @Override - public void TypeParamNode(TypeParamNode tp) + public void TypeParamNode(TypeParamNode n) { - setDel(tp, new NonRoleParamNodeDel()); + setDel(n, new NonRoleParamNodeDel()); } diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 785b8866c..b99b40242 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -80,15 +80,15 @@ public ScribNode create(Token t) // Previously: String tname = t.getText(); -- by convention of Scribble.g, type constant name given as node text, e.g., module: ... -> ^(MODULE ...) switch (t.getType()) { - case ScribbleParser.IDENTIFIER: return new IdNode(t); - case ScribbleParser.EXTIDENTIFIER: return new IdNode(t); // CHECKME: Reuse IdNode OK? + case ScribbleParser.ID: return new IdNode(t); + case ScribbleParser.EXTID: return new IdNode(t); - // Simple names "constructed directly" by parser, e.g., t=IDENTIFIER -> IDENTIFIER<...Node>[$t] + // Simple names "constructed directly" by parser, e.g., t=ID -> ID<...Node>[$t] case ScribbleParser.GPROTO_NAME: return new GProtocolNameNode(t); case ScribbleParser.MODULE_NAME: return new ModuleNameNode(t); + case ScribbleParser.DATA_NAME: return new DataTypeNode(t); case ScribbleParser.SIG_NAME: return new MessageSigNameNode(t); - case ScribbleParser.TYPE_NAME: return new DataTypeNode(t); case ScribbleParser.MODULE: return new Module(t); case ScribbleParser.MODULEDECL: return new ModuleDecl(t); @@ -107,12 +107,12 @@ public ScribNode create(Token t) case ScribbleParser.ROLEDECL_LIST: return new RoleDeclList(t); case ScribbleParser.ROLEDECL: return new RoleDecl(t); case ScribbleParser.PARAMDECL_LIST: return new NonRoleParamDeclList(t); + case ScribbleParser.DATAPARAMDECL: return new TypeParamDecl(t); case ScribbleParser.SIGPARAMDECL: return new SigParamDecl(t); - case ScribbleParser.TYPEPARAMDECL: return new TypeParamDecl(t); case ScribbleParser.GPROTODEF: return new GProtocolDef(t); case ScribbleParser.GPROTOBLOCK: return new GProtocolBlock(t); - case ScribbleParser.GACTIONSEQ: return new GInteractionSeq(t); + case ScribbleParser.GINTERSEQ: return new GInteractionSeq(t); case ScribbleParser.SIG_LIT: return new MessageSigNode(t); case ScribbleParser.PAYELEM_LIST: return new PayloadElemList(t); // N.B. UnaryPayloadElem parsed "manually" in Scribble.g @@ -137,7 +137,7 @@ public ScribNode create(Token t) case ScribbleParser.COMPOUND_NAME: return new IdNode(t); // Hacky? Repurposing IdNode as a "temporary QUALIFIEDNAME" -- token is QUALIFIEDNAME (not ID), and children are the IdNode elements of the qualified name - // (Using IdNode as a "shell", but "token type" determined by t -- a bit misleading, IdNode here not an actual IDENTIFIER -- CHECKME: make a proper QUALIFIEDNAME?) + // (Using IdNode as a "shell", but "token type" determined by t -- a bit misleading, IdNode here not an actual ID -- CHECKME: make a proper QUALIFIEDNAME?) // It is a "temporary" QUALIFIEDNAME, "internally" parsed by ScribbleParser.parsePayloadElem/parseNonRoleArg // This temporary IdNode is passed by $qualifiedname.tree to, e.g., parsePayloadElem(CommonTree ct) // The parser method takes CommonTree, that can accept IdNode From 0ecc24faee59604f8eac3f93c358afde7ad54acc Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 14:21:53 +0100 Subject: [PATCH 272/539] Continued: tidying Scribble.g. --- .../java/org/scribble/ast/AstFactory.java | 3 +- .../org/scribble/ast/NonProtocolDecl.java | 9 +-- .../scribble/ast/name/simple/ExtIdNode.java | 66 +++++++++++++++++++ .../java/org/scribble/del/DelDecorator.java | 3 +- .../parser/scribble/AstFactoryImpl.java | 5 +- .../parser/scribble/DelDecoratorImpl.java | 5 +- .../parser/scribble/ScribTreeAdaptor.java | 3 +- 7 files changed, 83 insertions(+), 11 deletions(-) create mode 100644 scribble-ast/src/main/java/org/scribble/ast/name/simple/ExtIdNode.java diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 578c08676..9f2bbaef4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -37,6 +37,7 @@ import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.qualified.QualifiedNameNode; import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.ExtIdNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.NonRoleParamNode; import org.scribble.ast.name.simple.OpNode; @@ -56,7 +57,7 @@ public interface AstFactory { IdNode IdNode(String text); - //ExtIdNode ExtIdNode(String text); + ExtIdNode ExtIdNode(String text); // Deprecate? Never need to make ambigname "manually" via af? (only constructed by ScribbleParser) AmbigNameNode AmbiguousNameNode(String text); diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java b/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java index 269f2ab61..0ab3f91a4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java @@ -15,6 +15,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.NameNode; +import org.scribble.ast.name.simple.ExtIdNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.core.type.kind.NonProtocolKind; import org.scribble.util.ScribException; @@ -50,14 +51,14 @@ public IdNode getSchemaChild() return (IdNode) getChild(SCHEMA_NODE_CHILD_INDEX); } - public IdNode getExtNameChild() + public ExtIdNode getExtNameChild() { - return (IdNode) getChild(EXTSOURCE_NODE_CHILD_INDEX); + return (ExtIdNode) getChild(EXTSOURCE_NODE_CHILD_INDEX); } - public IdNode getExtSourceChild() + public ExtIdNode getExtSourceChild() { - return (IdNode) getChild(EXTSOURCE_NODE_CHILD_INDEX); + return (ExtIdNode) getChild(EXTSOURCE_NODE_CHILD_INDEX); } public String getSchema() diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/ExtIdNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/ExtIdNode.java new file mode 100644 index 000000000..dc0a85ac4 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/ExtIdNode.java @@ -0,0 +1,66 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.name.simple; + +import org.antlr.runtime.Token; + +// N.B. no del attached, so not currently visited +public class ExtIdNode extends IdNode // CHECKME: e.g., toName gives Id +{ + // ScribTreeAdaptor#create constructor + public ExtIdNode(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected ExtIdNode(ExtIdNode node) + { + super(node); + } + + @Override + public ExtIdNode dupNode() + { + return new ExtIdNode(this); + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof ExtIdNode)) + { + return false; + } + return ((ExtIdNode) o).canEqual(this) && super.equals(o); + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof ExtIdNode; + } + + @Override + public int hashCode() + { + int hash = 13007; + hash = 31 * super.hashCode(); + return hash; + } +} diff --git a/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java b/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java index 4d04daf82..8bf3a2d4d 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java +++ b/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java @@ -52,6 +52,7 @@ import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.ExtIdNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; @@ -126,7 +127,7 @@ public interface DelDecorator void AmbigNameNode(AmbigNameNode n); void IdNode(IdNode n); - //void ExtIdNode(ExtIdNode n); + void ExtIdNode(ExtIdNode n); // NonRoleParamNode NonRoleParamNode(CommonTree source, K kind, String identifier); void SigParamNode(SigParamNode n); diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java index 0b9112522..ecef96514 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java @@ -67,6 +67,7 @@ import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.qualified.QualifiedNameNode; import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.ExtIdNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.NonRoleParamNode; import org.scribble.ast.name.simple.OpNode; @@ -179,14 +180,14 @@ public IdNode IdNode(String text) return n; } - /*@Override + @Override public ExtIdNode ExtIdNode(String text) { CommonToken t = newIdToken(text); // (Ext)IdNode is the only token with a "different" text to its node type -- info stored directly as its the text, no children ExtIdNode n = new ExtIdNode(t); return n; - }*/ + } // Deprecate? Never need to make ambigname "manually" via af? (only constructed by ScribbleParser) @Override diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java index 673ce796e..f489db92c 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java @@ -56,6 +56,7 @@ import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.ExtIdNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; @@ -518,11 +519,11 @@ public void IdNode(IdNode n) setDel(n, createDefaultDelegate()); } - /*@Override + @Override public void ExtIdNode(ExtIdNode n) { setDel(n, createDefaultDelegate()); - }*/ + } /*@Override public NonRoleParamNode NonRoleParamNode(CommonTree source, K kind, String identifier) diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index b99b40242..61c7372ce 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -55,6 +55,7 @@ import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.ast.name.simple.ExtIdNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.parser.antlr.ScribbleParser; @@ -81,7 +82,7 @@ public ScribNode create(Token t) switch (t.getType()) { case ScribbleParser.ID: return new IdNode(t); - case ScribbleParser.EXTID: return new IdNode(t); + case ScribbleParser.EXTID: return new ExtIdNode(t); // Simple names "constructed directly" by parser, e.g., t=ID -> ID<...Node>[$t] From ded4fd8de02b2e7a0d811938bf35a650eefe4887 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 14:36:05 +0100 Subject: [PATCH 273/539] Worked around ANTLR bug re.\ t=(TYPE_KW|DATA_LW). --- .../org/scribble/parser/antlr/Scribble.g | 87 +++++++------------ scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 2 files changed, 32 insertions(+), 57 deletions(-) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index da962e212..cfb69c7ed 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -141,71 +141,32 @@ tokens { package org.scribble.parser.antlr; + import org.scribble.ast.NonRoleArg; import org.scribble.ast.ScribNodeBase; import org.scribble.ast.UnaryPayloadElem; - import org.scribble.ast.NonRoleArg; - import org.scribble.ast.name.qualified.DataTypeNode; - import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.AmbigNameNode; + import org.scribble.ast.name.simple.IdNode; + import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; - import org.scribble.ast.name.simple.*; - import org.scribble.ast.*; + import org.scribble.ast.name.simple.RoleNode; + import org.scribble.ast.name.simple.SigParamNode; + import org.scribble.ast.name.simple.TypeParamNode; + import org.scribble.ast.name.qualified.DataTypeNode; } + @lexer::header { package org.scribble.parser.antlr; - - //import org.scribble.main.RuntimeScribbleException; } -/*// Was swallowing parser error messages -@members { - //private org.scribble.logging.IssueLogger _logger=null; - private String _document=null; - private boolean _errorOccurred=false; - - /*public void setLogger(org.scribble.logging.IssueLogger logger) { - _logger = logger; - }* / - - public void setDocument(String doc) { - _document = doc; - } - - public void emitErrorMessage(String mesg) { - /*if (_logger == null) { - super.emitErrorMessage(mesg); - } else { - _logger.error(org.scribble.parser.antlr.ANTLRMessageUtil.getMessageText(mesg), - org.scribble.parser.antlr.ANTLRMessageUtil.getProperties(mesg, _document)); - }* / - _errorOccurred = true; - } - - public boolean isErrorOccurred() { - return(_errorOccurred); - } -}*/ @parser::members { - /*@Override - public void reportError(RecognitionException e) - { - super.reportError(e); - //throw new RuntimeScribbleException(e.getMessage()); - //System.exit(1); - }*/ - // Abort tool run on parsing errors (and display user-friendly message) -- obsoletes CommonErrorNode check? @Override public void displayRecognitionError(String[] tokenNames, RecognitionException e) { - /*String hdr = getErrorHeader(e); - String msg = getErrorMessage(e, tokenNames); - //throw new RuntimeException(hdr + ":" + msg); - System.err.println(hdr + ":" + msg);*/ super.displayRecognitionError(tokenNames, e); System.exit(1); } @@ -449,22 +410,29 @@ importmodule: nonprotodecl: datadecl | sigdecl ; - // Deprecate TYPE_KW ? datadecl: - t=(TYPE_KW | DATA_KW) '<' schema=ID '>' extName=EXTID FROM_KW + // Deprecate TYPE_KW ? + t=TYPE_KW '<' schema=ID '>' extName=EXTID FROM_KW extSource=EXTID AS_KW alias=simpledataname ';' -> + // alias first to be uniform with other NameDeclNode (getRawNameNodeChild) ^(DATADECL[$t] $alias $schema $extName $extSource) -; +| + // CHECKME: duplicated above, because t=(TYPE_KW | DATA_KW) *sometimes* causes null token NPEs... + t=DATA_KW '<' schema=ID '>' extName=EXTID FROM_KW + extSource=EXTID AS_KW alias=simpledataname ';' +-> // alias first to be uniform with other NameDeclNode (getRawNameNodeChild) + ^(DATADECL[$t] $alias $schema $extName $extSource) +; sigdecl: t=SIG_KW '<' schema=ID '>' extName=EXTID FROM_KW extSource=EXTID AS_KW alias=simplesigname ';' -> + // alias first to be uniform with other NameDeclNode (getRawNameNodeChild) ^(SIGDECL[$t] $alias $schema $extName $extSource) ; - // alias first to be uniform with other NameDeclNode (getRawNameNodeChild) @@ -575,11 +543,18 @@ gseq: ; ginteraction: - gconnect | gmsgtransfer | gwrap | gdisconnect | gcontinue | gdo | gchoice | grecursion ; - // Simple session node: directed interaction - // Simple session node: basic interaction - // Simple session node (other) - // Compound session node +// Simple session node: directed interaction + gconnect | gmsgtransfer + +// Simple session node: basic interaction +| gwrap | gdisconnect + +// Simple session node (other) +| gcontinue | gdo + +// Compound session node +| gchoice | grecursion +; /** diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 2efdf9c82..a1f4ec602 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -88,7 +88,7 @@ module tmp.Test; // use stypefactory in core -- also make a visitorfactory // refactor test to use main instead of cli -type "..." from "..." as T; +data "..." from "..." as T; explicit global protocol Proto1(role A__, role B) From 9fbf6dadd9076fbdc69df253b37bc15749d8b4ff Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 14:54:14 +0100 Subject: [PATCH 274/539] Continued: tidying Scribble.g. --- .../org/scribble/parser/antlr/Scribble.g | 87 ++++++++----------- 1 file changed, 38 insertions(+), 49 deletions(-) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index cfb69c7ed..3d8571e19 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -1,5 +1,4 @@ -/* - * > scribble-java +/* > scribble-java * $ java -cp scribble-parser/lib/antlr-3.5.2-complete.jar org.antlr.Tool -o scribble-parser/target/generated-sources/antlr3 scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g * * Cygwin/Windows @@ -9,9 +8,11 @@ */ /** - * Pattern: each node type must give its "node type constant" as its text, e.g., module: ... -> ^(MODULE ...) -- all info in its children - * i.e. Each token will be equivalent to, e.g., new CommonToken(ScribbleParser.MODULE, "MODULE") - * Except for ID/IdNode: text is the ID value, i.e., new CommonToken(ScribbleParser.ID, "...") + * Pattern: most nodes have "imaginary token types". + * Where token attributes are not "inherited" from a concrete token, the default is to use textual name of the token type field as its text + * e.g., gprotodecl: ... -> ^(GPROTODECL ...). I.e., each token will be equivalent to, e.g., new CommonToken(ScribbleParser.GPROTODECL, "GPROTODECL"). + * The actual info of every imaginary node is in its children (i.e., its token text can be disregarded). + * The exceptions are for ID/EXTID, where the text is the ID value, i.e., new CommonToken(ScribbleParser.ID, "..."). */ grammar Scribble; @@ -136,6 +137,24 @@ tokens } +@lexer::header +{ + package org.scribble.parser.antlr; +} + + +@lexer::members +{ + @Override + public void displayRecognitionError(String[] tokenNames, + RecognitionException e) + { + super.displayRecognitionError(tokenNames, e); + System.exit(1); + } +} + + // Must come after tokens? @parser::header { @@ -155,12 +174,6 @@ tokens } -@lexer::header -{ - package org.scribble.parser.antlr; -} - - @parser::members { // Abort tool run on parsing errors (and display user-friendly message) -- obsoletes CommonErrorNode check? @@ -171,28 +184,26 @@ tokens System.exit(1); } - // qn is an IdNode "holder" for a qualifiedname + // qn is an IdNode "holder" for a "qualifiedname" COMPOUND_NAME -- see ScribTreeAdaptor // CHECKME: do the returns of these "bypass" ScribTreeAdaptor? specifically AmbigNode public static CommonTree parsePayloadElem(CommonTree qn) throws RecognitionException { if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname { + // Cf. AstFactoryImpl, token creation DataTypeNode dt = new DataTypeNode(new CommonToken(DATA_NAME, "DATA_NAME")); ((List) qn.getChildren()).forEach(x -> dt.addChild(new IdNode(new CommonToken(ID, ((CommonTree) x).getText())))); UnaryPayloadElem pe = new UnaryPayloadElem(new CommonToken(UNARY_PAYELEM, "UNARYPAYLOADELEM")); pe.addChild(dt); - return pe; // N.B. "re-parsed" by ScribTreeAdaptor? Could return CommonTree here? + return pe; } - else + else //if (qn.getChildCount() == 1) { - // Similarly to NonRoleArg: cannot syntactically distinguish right now between SimplePayloadTypeNode and ParameterNode + // Similar to NonRoleArg: cannot syntactically distinguish right now between a simple data name and a param name + // Cf. AstFactoryImpl, token creation String text = qn.getChild(0).getText(); - IdNode id = new IdNode(new CommonToken(ID, text)); - /*AmbigNameNode an = - new AmbigNameNode(new CommonToken(AMBIG_NAME, "AMBIG_NAME")); - an.addChild(id);*/ AmbigNameNode an = new AmbigNameNode(AMBIG_NAME, new CommonToken(ID, text)); UnaryPayloadElem e = new UnaryPayloadElem( @@ -202,13 +213,15 @@ tokens } } - // Only for QualifiedName (DataTypeNode or AmbigNameNode), not siglit literal - // qn is an IdNode "holder" for a qualifiedname + // qn is an IdNode "holder" for a "qualifiedname" COMPOUND_NAME -- see ScribTreeAdaptor + // Only for "qualifiedName" (DataTypeNode or AmbigNameNode), not sig literals public static CommonTree parseNonRoleArg(CommonTree qn) throws RecognitionException { if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname { - DataTypeNode dt = new DataTypeNode(new CommonToken(DATA_NAME, "DATA_NAME")); + // Cf. AstFactoryImpl, token creation + DataTypeNode dt = + new DataTypeNode(new CommonToken(DATA_NAME, "DATA_NAME")); ((List) qn.getChildren()).forEach(x -> dt.addChild(new IdNode(new CommonToken(ID, ((CommonTree) x).getText())))); NonRoleArg a = @@ -216,13 +229,10 @@ tokens a.addChild(dt); return a; } - else + else //if (qn.getChildCount() == 1) { + // Cf. AstFactoryImpl, token creation String text = qn.getChild(0).getText(); - IdNode id = new IdNode(new CommonToken(ID, text)); - /*AmbigNameNode an = - new AmbigNameNode(new CommonToken(AMBIG_NAME, "AMBIG_NAME")); - an.addChild(id);*/ AmbigNameNode an = new AmbigNameNode(AMBIG_NAME, new CommonToken(ID, text)); NonRoleArg a = new NonRoleArg(new CommonToken(ARG, "ARG")); @@ -231,6 +241,7 @@ tokens } } + // Currently unused -- checking later in intermed translation instead of parsing public static CommonTree checkId(CommonTree id) { if (id.getText().contains("__")) @@ -242,28 +253,6 @@ tokens } } -@lexer::members -{ - /*@Override - public void reportError(RecognitionException e) - { - super.reportError(e); - //throw new RuntimeScribbleException(e.getMessage()); - //System.exit(1); - }*/ - - @Override - public void displayRecognitionError(String[] tokenNames, RecognitionException e) - { - /*String hdr = getErrorHeader(e); - String msg = getErrorMessage(e, tokenNames); - //throw new RuntimeException(hdr + ":" + msg); - System.err.println(hdr + ":" + msg);*/ - super.displayRecognitionError(tokenNames, e); - System.exit(1); - } -} - /**************************************************************************** * Chapter 2 Lexical Structure (Lexer rules) From cdd0a7d71a5edf0275b053a40f1fc24606491ec5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 15:00:48 +0100 Subject: [PATCH 275/539] Continued: minor. --- .../java/org/scribble/ast/AstFactory.java | 10 +++++++++ .../java/org/scribble/del/DelDecorator.java | 5 +++++ .../org/scribble/parser/antlr/Scribble.g | 22 ++++++++++--------- .../parser/scribble/AstFactoryImpl.java | 18 +++++++++++++++ .../parser/scribble/DelDecoratorImpl.java | 2 ++ .../parser/scribble/ScribTreeAdaptor.java | 3 ++- 6 files changed, 49 insertions(+), 11 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 9f2bbaef4..93202eb71 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -157,6 +157,16 @@ GDo GDo(RoleArgList rs, NonRoleArgList args, + + + + + + + + + + diff --git a/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java b/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java index 8bf3a2d4d..7fc1f1503 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java +++ b/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java @@ -147,6 +147,11 @@ public interface DelDecorator + + + + + diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 3d8571e19..73f3e49e1 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -178,7 +178,8 @@ tokens { // Abort tool run on parsing errors (and display user-friendly message) -- obsoletes CommonErrorNode check? @Override - public void displayRecognitionError(String[] tokenNames, RecognitionException e) + public void displayRecognitionError(String[] tokenNames, + RecognitionException e) { super.displayRecognitionError(tokenNames, e); System.exit(1); @@ -532,17 +533,17 @@ gseq: ; ginteraction: -// Simple session node: directed interaction + // Simple session node: directed interaction gconnect | gmsgtransfer -// Simple session node: basic interaction -| gwrap | gdisconnect + // Simple session node: basic interaction + | gwrap | gdisconnect -// Simple session node (other) -| gcontinue | gdo + // Simple session node (other) + | gcontinue | gdo -// Compound session node -| gchoice | grecursion + // Compound session node + | gchoice | grecursion ; @@ -579,8 +580,9 @@ gdisconnect: ; gwrap: - t=WRAP_KW rolename TO_KW rolename ';' --> ^(GWRAP[$t] rolename rolename) + t=WRAP_KW rolename TO_KW rolename ';' +-> + ^(GWRAP[$t] rolename rolename) ; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java index ecef96514..62448b0d8 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java @@ -655,6 +655,24 @@ public NonRoleArg NonRoleArg(NonRoleArgNode arg) + + + + + + + + + + + + + + + + + + diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java index f489db92c..18a4556e5 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java @@ -582,6 +582,8 @@ public void TypeParamNode(TypeParamNode n) + + diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 61c7372ce..2827248c9 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -51,6 +51,7 @@ import org.scribble.ast.global.GProtocolDef; import org.scribble.ast.global.GProtocolHeader; import org.scribble.ast.global.GRecursion; +import org.scribble.ast.global.GWrap; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.qualified.MessageSigNameNode; @@ -123,7 +124,7 @@ public ScribNode create(Token t) case ScribbleParser.GDCONN: return new GDisconnect(t); case ScribbleParser.GDO: return new GDo(t); case ScribbleParser.GMSGTRANSFER: return new GMessageTransfer(t); - case ScribbleParser.GWRAP: throw new RuntimeException("[TODO] GWrap: " + t); + case ScribbleParser.GWRAP: return new GWrap(t); case ScribbleParser.ROLEARG_LIST: return new RoleArgList(t); case ScribbleParser.ROLEARG: return new RoleArg(t); From eb23423fa1dd479187b30efe62af50925934a496 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 16:36:25 +0100 Subject: [PATCH 276/539] Continued: tidying Scribble.g. --- .../java/org/scribble/del/DelDecorator.java | 37 ++-- .../core/type/name/QualifiedName.java | 1 - .../org/scribble/parser/antlr/Scribble.g | 193 ++++++++++-------- .../parser/scribble/ScribTreeAdaptor.java | 14 +- scribble-test/src/test/scrib/tmp/Test.scr | 11 +- 5 files changed, 138 insertions(+), 118 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java b/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java index 7fc1f1503..133ea4902 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java +++ b/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java @@ -61,12 +61,28 @@ import org.scribble.ast.name.simple.TypeParamNode; -// A dec method for each AST class -// Implementations in scribble-parser, can depend on parser implementation +// A dec method for each AST class -- method name must be the same as target class name +// Implementations (DelDecoratorImpl) in scribble-parser, can depend on parser implementation // E.g., DelDecoratorImpl: each method named after the class name -- currently dispatched by reflection public interface DelDecorator { void decorate(ScribNode n); + + void AmbigNameNode(AmbigNameNode n); + void TypeParamNode(TypeParamNode n); + void ExtIdNode(ExtIdNode n); + void IdNode(IdNode n); + void SigParamNode(SigParamNode n); + + void OpNode(OpNode n); + void RecVarNode(RecVarNode n); + void RoleNode(RoleNode n); + + void MessageSigNameNode(MessageSigNameNode n); + void DataTypeNode(DataTypeNode n); + void ModuleNameNode(ModuleNameNode n); + void GProtocolNameNode(GProtocolNameNode n); + void LProtocolNameNode(LProtocolNameNode n); void Module(Module m); @@ -116,23 +132,6 @@ public interface DelDecorator /* NameNode SimpleNameNode(CommonTree source, K kind, String identifier); QualifiedNameNode QualifiedNameNode(CommonTree source, K kind, String... elems);*/ - void RecVarNode(RecVarNode n); - void RoleNode(RoleNode n); - void OpNode(OpNode n); - void MessageSigNameNode(MessageSigNameNode n); - void DataTypeNode(DataTypeNode n); - void ModuleNameNode(ModuleNameNode n); - void GProtocolNameNode(GProtocolNameNode n); - void LProtocolNameNode(LProtocolNameNode n); - - void AmbigNameNode(AmbigNameNode n); - void IdNode(IdNode n); - void ExtIdNode(ExtIdNode n); - - // NonRoleParamNode NonRoleParamNode(CommonTree source, K kind, String identifier); - void SigParamNode(SigParamNode n); - void TypeParamNode(TypeParamNode n); - diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/QualifiedName.java b/scribble-core/src/main/java/org/scribble/core/type/name/QualifiedName.java index ac819fbe8..3841d15a6 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/QualifiedName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/QualifiedName.java @@ -16,7 +16,6 @@ import org.scribble.core.type.kind.Kind; - public abstract class QualifiedName extends AbstractName { private static final long serialVersionUID = 1L; diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 73f3e49e1..140296969 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -78,8 +78,6 @@ tokens // Special cases EMPTY_OP = '__EMPTY_OP'; - COMPOUND_NAME = '__COMPOUND_NAME'; - // N.B. an intermediate node type, not a concrete ScribNode -- "re-parsed" internally by parsePayloadElem/NonRoleArg // Simple names AMBIG_NAME = 'AMBIG_NAME'; @@ -185,63 +183,6 @@ tokens System.exit(1); } - // qn is an IdNode "holder" for a "qualifiedname" COMPOUND_NAME -- see ScribTreeAdaptor - // CHECKME: do the returns of these "bypass" ScribTreeAdaptor? specifically AmbigNode - public static CommonTree parsePayloadElem(CommonTree qn) throws RecognitionException - { - if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname - { - // Cf. AstFactoryImpl, token creation - DataTypeNode dt = new DataTypeNode(new CommonToken(DATA_NAME, "DATA_NAME")); - ((List) qn.getChildren()).forEach(x -> - dt.addChild(new IdNode(new CommonToken(ID, ((CommonTree) x).getText())))); - UnaryPayloadElem pe = - new UnaryPayloadElem(new CommonToken(UNARY_PAYELEM, "UNARYPAYLOADELEM")); - pe.addChild(dt); - return pe; - } - else //if (qn.getChildCount() == 1) - { - // Similar to NonRoleArg: cannot syntactically distinguish right now between a simple data name and a param name - // Cf. AstFactoryImpl, token creation - String text = qn.getChild(0).getText(); - AmbigNameNode an = - new AmbigNameNode(AMBIG_NAME, new CommonToken(ID, text)); - UnaryPayloadElem e = new UnaryPayloadElem( - new CommonToken(UNARY_PAYELEM, "UNARYPAYLOADELEM")); - e.addChild(an); - return e; - } - } - - // qn is an IdNode "holder" for a "qualifiedname" COMPOUND_NAME -- see ScribTreeAdaptor - // Only for "qualifiedName" (DataTypeNode or AmbigNameNode), not sig literals - public static CommonTree parseNonRoleArg(CommonTree qn) throws RecognitionException - { - if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname - { - // Cf. AstFactoryImpl, token creation - DataTypeNode dt = - new DataTypeNode(new CommonToken(DATA_NAME, "DATA_NAME")); - ((List) qn.getChildren()).forEach(x -> - dt.addChild(new IdNode(new CommonToken(ID, ((CommonTree) x).getText())))); - NonRoleArg a = - new NonRoleArg(new CommonToken(ARG, "ARG")); - a.addChild(dt); - return a; - } - else //if (qn.getChildCount() == 1) - { - // Cf. AstFactoryImpl, token creation - String text = qn.getChild(0).getText(); - AmbigNameNode an = - new AmbigNameNode(AMBIG_NAME, new CommonToken(ID, text)); - NonRoleArg a = new NonRoleArg(new CommonToken(ARG, "ARG")); - a.addChild(an); - return a; - } - } - // Currently unused -- checking later in intermed translation instead of parsing public static CommonTree checkId(CommonTree id) { @@ -350,21 +291,18 @@ sigparamname: t=ID -> ID[$t]; /** * Section 3.2.1 Package, Module and Module Member Names */ +// May be compound or simple gprotoname: t=ID ('.' ID)* -> ^(GPROTO_NAME[$t] ID+) ; modulename: t=ID ('.' ID)* -> ^(MODULE_NAME[$t] ID+) ; -qualifiedname: t=ID ('.' ID)* -> ^(COMPOUND_NAME[$t] ID+) ; -signame: t=ID ('.' ID)* -> ^(SIG_NAME[$t] ID+) ; -/*// Not parsed as direct categories -packagename: qualifiedname; -membername: qualifiedname; -protocolname: membername; -payloadtypename: membername; // data? or also, e.g., deleg? */ +// Compound only +qualifieddataname: t=ID '.' ID ('.' ID)* -> ^(DATA_NAME[$t] ID+) ; + // Cf. primitive names, above +simpledataname: t=ID -> ^(DATA_NAME[$t] ID) ; simplegprotoname: t=ID -> ^(GPROTO_NAME[$t] ID) ; simplemodulename: t=ID -> ^(MODULE_NAME[$t] ID) ; -simpledataname: t=ID -> ^(DATA_NAME[$t] ID) ; simplesigname: t=ID -> ^(SIG_NAME[$t] ID) ; @@ -430,33 +368,29 @@ sigdecl: * Section 3.5 Message Signatures */ siglit: - opname '(' payelems ')' --> - ^(SIG_LIT opname payelems) + opname '(' payelems ')' -> ^(SIG_LIT opname payelems) ; // CHECKME: how to apply [$t] in such situations? payelems: --> - ^(PAYELEM_LIST) + -> ^(PAYELEM_LIST) | - payelem (',' payelem)* --> - ^(PAYELEM_LIST payelem+) + payelem (',' payelem)* -> ^(PAYELEM_LIST payelem+) ; + payelem: // Payload element must be a data kind, cannot be a sig name // Qualified name must be a data type name // Also subsumes simple names, could be a data *param* - qualifiedname --> - { parsePayloadElem($qualifiedname.tree) } // Use ".text" instead of ".tree" for token String + gprotoname '@' rolename -> ^(DELEG_PAYELEM rolename gprotoname) | - gprotoname '@' rolename --> - ^(DELEG_PAYELEM rolename gprotoname) + ambigname -> ^(UNARY_PAYELEM ambigname) +| + qualifieddataname -> ^(UNARY_PAYELEM qualifieddataname) ; +// { parsePayloadElem($qualifiedname.tree) } // Use ".text" instead of ".tree" for token String + @@ -489,6 +423,7 @@ gprotoheader: -> ^(GPROTOHEADER[$t] simplegprotoname paramdecls roledecls) ; +// N.B. intermed translation uses full proto name roledecls: t='(' roledecl (',' roledecl)* ')' -> ^(ROLEDECL_LIST[$t] roledecl+) ; @@ -497,12 +432,9 @@ roledecl: t=ROLE_KW rolename -> ^(ROLEDECL[$t] rolename) ; paramdecls: --> - ^(PARAMDECL_LIST) + -> ^(PARAMDECL_LIST) | - t='<' paramdecl (',' paramdecl)* '>' --> - ^(PARAMDECL_LIST[$t] paramdecl+) + t='<' paramdecl (',' paramdecl)* '>' -> ^(PARAMDECL_LIST[$t] paramdecl+) ; paramdecl: dataparamdecl | sigparamdecl ; @@ -638,7 +570,94 @@ nonroleargs: nonrolearg: siglit -> ^(ARG siglit) | - qualifiedname -> { parseNonRoleArg($qualifiedname.tree) } // Like payelem, simple names need disambiguation + ambigname -> ^(ARG ambigname) +| + qualifieddataname -> ^(ARG qualifieddataname) // FIXME: sig name -- need an ambig qualified name ; +// { parseNonRoleArg($qualifiedname.tree) } // Like payelem, simple names need disambiguation + + + + + + + + + + + + + + + + + + + + + +/* +@parser::members +{ + // qn is an IdNode "holder" for a "qualifiedname" COMPOUND_NAME -- see ScribTreeAdaptor + // CHECKME: do the returns of these "bypass" ScribTreeAdaptor? specifically AmbigNode + // { parsePayloadElem($qualifiedname.tree) } // Use ".text" instead of ".tree" for token String + public static CommonTree parsePayloadElem(CommonTree qn) throws RecognitionException + { + if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname + { + // Cf. AstFactoryImpl, token creation + DataTypeNode dt = new DataTypeNode(new CommonToken(DATA_NAME, "DATA_NAME")); + ((List) qn.getChildren()).forEach(x -> + dt.addChild(new IdNode(new CommonToken(ID, ((CommonTree) x).getText())))); + UnaryPayloadElem pe = + new UnaryPayloadElem(new CommonToken(UNARY_PAYELEM, "UNARYPAYLOADELEM")); + pe.addChild(dt); + return pe; + } + else //if (qn.getChildCount() == 1) + { + // Similar to NonRoleArg: cannot syntactically distinguish right now between a simple data name and a param name + // Cf. AstFactoryImpl, token creation + String text = qn.getChild(0).getText(); + AmbigNameNode an = + new AmbigNameNode(AMBIG_NAME, new CommonToken(ID, text)); + UnaryPayloadElem e = new UnaryPayloadElem( + new CommonToken(UNARY_PAYELEM, "UNARYPAYLOADELEM")); + e.addChild(an); + return e; + } + } + + // qn is an IdNode "holder" for a "qualifiedname" COMPOUND_NAME -- see ScribTreeAdaptor + // Only for "qualifiedName" (DataTypeNode or AmbigNameNode), not sig literals + // Use by: { parseNonRoleArg($qualifiedname.tree) } + public static CommonTree parseNonRoleArg(CommonTree qn) throws RecognitionException + { + if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname + { + // Cf. AstFactoryImpl, token creation + DataTypeNode dt = + new DataTypeNode(new CommonToken(DATA_NAME, "DATA_NAME")); // FIXME: could be a sig name arg... + ((List) qn.getChildren()).forEach(x -> + dt.addChild(new IdNode(new CommonToken(ID, ((CommonTree) x).getText())))); + NonRoleArg a = + new NonRoleArg(new CommonToken(ARG, "ARG")); + a.addChild(dt); + return a; + } + else //if (qn.getChildCount() == 1) + { + // Cf. AstFactoryImpl, token creation + String text = qn.getChild(0).getText(); + AmbigNameNode an = + new AmbigNameNode(AMBIG_NAME, new CommonToken(ID, text)); + NonRoleArg a = new NonRoleArg(new CommonToken(ARG, "ARG")); + a.addChild(an); + return a; + } + } +} +//*/ \ No newline at end of file diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 2827248c9..2a8275564 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -39,6 +39,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.SigParamDecl; import org.scribble.ast.TypeParamDecl; +import org.scribble.ast.UnaryPayloadElem; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; import org.scribble.ast.global.GContinue; @@ -117,7 +118,8 @@ public ScribNode create(Token t) case ScribbleParser.GINTERSEQ: return new GInteractionSeq(t); case ScribbleParser.SIG_LIT: return new MessageSigNode(t); - case ScribbleParser.PAYELEM_LIST: return new PayloadElemList(t); // N.B. UnaryPayloadElem parsed "manually" in Scribble.g + case ScribbleParser.PAYELEM_LIST: return new PayloadElemList(t); + case ScribbleParser.UNARY_PAYELEM: return new UnaryPayloadElem<>(t); case ScribbleParser.GCONNECT: return new GConnect(t); case ScribbleParser.GCONTINUE: return new GContinue(t); @@ -129,7 +131,7 @@ public ScribNode create(Token t) case ScribbleParser.ROLEARG_LIST: return new RoleArgList(t); case ScribbleParser.ROLEARG: return new RoleArg(t); case ScribbleParser.ARG_LIST: return new NonRoleArgList(t); - case ScribbleParser.ARG: return new NonRoleArg(t); // Only for messagesignature -- qualifiedname (datatypenode or ambignamenode) done "manually" in scribble.g (cf. UnaryPayloadElem) + case ScribbleParser.ARG: return new NonRoleArg(t); case ScribbleParser.GCHOICE: return new GChoice(t); case ScribbleParser.GRECURSION: return new GRecursion(t); @@ -137,14 +139,6 @@ public ScribNode create(Token t) // Special cases case ScribbleParser.EMPTY_OP: return new OpNode(t); // From Scribble.g, token (t) text is OpNode.EMPTY_OP_TOKEN_TEXT - case ScribbleParser.COMPOUND_NAME: return new IdNode(t); - // Hacky? Repurposing IdNode as a "temporary QUALIFIEDNAME" -- token is QUALIFIEDNAME (not ID), and children are the IdNode elements of the qualified name - // (Using IdNode as a "shell", but "token type" determined by t -- a bit misleading, IdNode here not an actual ID -- CHECKME: make a proper QUALIFIEDNAME?) - // It is a "temporary" QUALIFIEDNAME, "internally" parsed by ScribbleParser.parsePayloadElem/parseNonRoleArg - // This temporary IdNode is passed by $qualifiedname.tree to, e.g., parsePayloadElem(CommonTree ct) - // The parser method takes CommonTree, that can accept IdNode - // (E.g., good.misc.globals.gdo.Do06b) - default: { throw new RuntimeException("[TODO] Unknown token type (cf. ScribbleParser): " + t); diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index a1f4ec602..aafae0fd3 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -77,6 +77,7 @@ module tmp.Test; //...HERE fix simp node constructors and af (no IdNode child) --- fix ambignodel to use af -- fix ambignodel to use af -- fix ambignodel to use af -- fix ambignodel to use af - separate af methods //...remove Token args from af constructors -- refactor reconstructs to use af? //...disallow/check for reserved __ -- do in gtype translation? + // FIXME: qualifed sig name as non role arg // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) // sort out full name expansion between disamb and translation -- fix modulecontextcollector for imported module member fullnames @@ -88,9 +89,16 @@ module tmp.Test; // use stypefactory in core -- also make a visitorfactory // refactor test to use main instead of cli -data "..." from "..." as T; +sig "..." from "..." as T; +global protocol Proto1(role A, role B) +{ + M from A to B; + do Proto1(A, B); // TODO: add unit test, testing qualified sig name as nonrole arg +} + +/* explicit global protocol Proto1(role A__, role B) { () connect A__ to B; @@ -100,6 +108,7 @@ explicit global protocol Proto1(role A__, role B) continue X; } } +//*/ /* global protocol Proto1(role A, role B) { From 8d7b17952e62c3b3e84a490c44e9c6eebbe8f95b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 16:55:22 +0100 Subject: [PATCH 277/539] Continued: cleaning up ast class names. --- .../java/org/scribble/ast/AstFactory.java | 11 ++- .../org/scribble/ast/UnaryPayloadElem.java | 2 +- .../src/main/java/org/scribble/del/DoDel.java | 25 ++++-- .../del/global/GDelegationElemDel.java | 2 +- .../del/name/simple/AmbigNameNodeDel.java | 14 ++-- .../org/scribble/parser/antlr/Scribble.g | 1 - .../parser/scribble/AstFactoryImpl.java | 84 +++++++------------ 7 files changed, 64 insertions(+), 75 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 93202eb71..c944483dd 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -35,7 +35,6 @@ import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.ast.name.qualified.QualifiedNameNode; import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.ast.name.simple.ExtIdNode; import org.scribble.ast.name.simple.IdNode; @@ -45,7 +44,6 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; import org.scribble.ast.name.simple.TypeParamNode; -import org.scribble.core.type.kind.Kind; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.PayloadTypeKind; @@ -59,16 +57,17 @@ public interface AstFactory IdNode IdNode(String text); ExtIdNode ExtIdNode(String text); - // Deprecate? Never need to make ambigname "manually" via af? (only constructed by ScribbleParser) - AmbigNameNode AmbiguousNameNode(String text); + AmbigNameNode AmbigNameNode(String text); // Deprecate? Never need to make ambigname "manually" via af? (constructed only by ScribbleParser) OpNode OpNode(String text); RecVarNode RecVarNode(String text); RoleNode RoleNode(String text); SigParamNode SigParamNode(String text); TypeParamNode TypeParamNode(String text); - QualifiedNameNode QualifiedNameNode(K kind, - List elems); + DataTypeNode DataTypeNode(List elems); + GProtocolNameNode GProtocolNameNode(List elems); + ModuleNameNode ModuleNameNode(List elems); + MessageSigNameNode MessageSigNameNode(List elems); Module Module(ModuleDecl mdecl, List> imports, List> data, diff --git a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java index ad7f6b904..1c287c920 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java @@ -49,7 +49,7 @@ public UnaryPayloadElem(UnaryPayloadElem node) public PayloadElemNameNode getNameChild() { - @SuppressWarnings("unchecked") + // FIXME PayloadElemNameNode name = (PayloadElemNameNode) getChild(NAME_CHILD_INDEX); // CHECKME: probably need to record an explicit kind token, for "cast checking" // Cannot use ScribNodeBase.visitChildWithCastCheck because this is not a ProtocolKindNode diff --git a/scribble-ast/src/main/java/org/scribble/del/DoDel.java b/scribble-ast/src/main/java/org/scribble/del/DoDel.java index 7d6093052..e006066f0 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoDel.java @@ -23,7 +23,9 @@ import org.scribble.ast.name.simple.IdNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.ProtocolName; +import org.scribble.lang.Lang; import org.scribble.util.ScribException; import org.scribble.visit.NameDisambiguator; @@ -67,15 +69,26 @@ private ScribNode leaveDisambiguationAux( ProtocolName fullname = modc .getVisibleProtocolDeclFullName(proto.toName()); - // CHECKME: do full name expansion in disamb? or leave to imed translation? - // FIXME: sort out full name expansion between here and GDoDel.translate - List elems = Arrays.asList(fullname.getElements()).stream() - .map(x -> disamb.lang.config.af.IdNode(x)).collect(Collectors.toList()); - ProtocolNameNode n = (ProtocolNameNode) disamb.lang.config.af - .QualifiedNameNode(fullname.getKind(), elems); + // CHECKME: do full name expansion in disamb? or leave to imed translation? -- FIXME: sort out full name expansion between here and GDoDel.translate + ProtocolNameNode n = foo(disamb.lang, fullname); // Didn't keep original namenode del -- ? return visited.reconstruct(visited.getRoleListChild(), visited.getNonRoleListChild(), n); } + + private ProtocolNameNode foo(Lang lang, + ProtocolName fullname) + { + if (fullname instanceof GProtocolName) + { + List elems = Arrays.asList(fullname.getElements()).stream() + .map(x -> lang.config.af.IdNode(x)).collect(Collectors.toList()); + @SuppressWarnings("unchecked") // FIXME + ProtocolNameNode cast = (ProtocolNameNode) lang.config.af + .GProtocolNameNode(elems); + return cast; + } + throw new RuntimeException("[TODO] " + fullname.getKind() + ": " + fullname); + } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java index 3a9526501..477091d72 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -75,7 +75,7 @@ public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, // List elems = Arrays.asList(fullname.getElements()).stream() .map(x -> disamb.lang.config.af.IdNode(x)).collect(Collectors.toList()); GProtocolNameNode pnn = (GProtocolNameNode) disamb.lang.config.af - .QualifiedNameNode(fullname.getKind(), elems); + .GProtocolNameNode(elems); // Not keeping original namenode del return de.reconstruct(pnn, r); } diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java index bfe8c9d83..953194dd9 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java @@ -64,10 +64,9 @@ public ScribNode leaveDisambiguation(ScribNode child, //DataTypeNode res = new DataTypeNode(ann.token); // CHECKME: what should the Token be? //DataTypeNode res = new DataTypeNode(new CommonToken(73, "TYPENAME")); // FIXME: use af DataTypeNode res = (DataTypeNode) disamb.lang.config.af - .QualifiedNameNode(DataTypeKind.KIND, - ann.getElements().stream() - .map(x -> disamb.lang.config.af.IdNode(x)) - .collect(Collectors.toList())); + .DataTypeNode(ann.getElements().stream() + .map(x -> disamb.lang.config.af.IdNode(x)) + .collect(Collectors.toList())); //res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? res.addChild(new IdNode(ann.token)); @@ -87,10 +86,9 @@ else if (mcontext.isMessageSigNameVisible(name.toMessageSigName())) //MessageSigNameNode res = new MessageSigNameNode(ann.token); // CHECME: what should the Token be? //MessageSigNameNode res = new MessageSigNameNode(new CommonToken(67, "SIGNAME")); // FIXME: use af MessageSigNameNode res = (MessageSigNameNode) disamb.lang.config.af - .QualifiedNameNode(SigKind.KIND, - ann.getElements().stream() - .map(x -> disamb.lang.config.af.IdNode(x)) - .collect(Collectors.toList())); + .MessageSigNameNode(ann.getElements().stream() + .map(x -> disamb.lang.config.af.IdNode(x)) + .collect(Collectors.toList())); //res.addChildren(ann.getChildren()); res.addChild(new IdNode(ann.token)); diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 140296969..17ccc4f13 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -363,7 +363,6 @@ sigdecl: ; - /** * Section 3.5 Message Signatures */ diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java index 62448b0d8..f9d1de47e 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java @@ -59,13 +59,11 @@ import org.scribble.ast.global.GRecursion; import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GWrap; -import org.scribble.ast.name.NameNode; import org.scribble.ast.name.PayloadElemNameNode; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.qualified.MessageSigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; -import org.scribble.ast.name.qualified.QualifiedNameNode; import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.ast.name.simple.ExtIdNode; import org.scribble.ast.name.simple.IdNode; @@ -75,13 +73,8 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; import org.scribble.ast.name.simple.TypeParamNode; -import org.scribble.core.type.kind.DataTypeKind; -import org.scribble.core.type.kind.Global; -import org.scribble.core.type.kind.Kind; -import org.scribble.core.type.kind.ModuleKind; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.PayloadTypeKind; -import org.scribble.core.type.kind.SigKind; import org.scribble.del.DefaultDel; import org.scribble.del.ImportModuleDel; import org.scribble.del.ModuleDel; @@ -191,7 +184,7 @@ public ExtIdNode ExtIdNode(String text) // Deprecate? Never need to make ambigname "manually" via af? (only constructed by ScribbleParser) @Override - public AmbigNameNode AmbiguousNameNode(String text) + public AmbigNameNode AmbigNameNode(String text) { int ttype = ScribbleParser.ID; CommonToken t = newIdToken(text); @@ -251,56 +244,43 @@ public TypeParamNode TypeParamNode(String text) } @Override - public QualifiedNameNode QualifiedNameNode( - K kind, List elems) + public DataTypeNode DataTypeNode(List elems) { - QualifiedNameNode n = null; - if (kind.equals(DataTypeKind.KIND)) - { - CommonToken t = newToken(ScribbleParser.DATA_NAME); - n = new DataTypeNode(t); - del(n, new DataTypeNodeDel()); - } - else if (kind.equals(SigKind.KIND)) - { - CommonToken t = newToken(ScribbleParser.SIG_NAME); - n = new MessageSigNameNode(t); - del(n, new MessageSigNameNodeDel()); - } - if (n != null) - { - n.addChildren(elems); - return castNameNode(kind, n); - } + CommonToken t = newToken(ScribbleParser.DATA_NAME); + DataTypeNode n = new DataTypeNode(t); + n.addChildren(elems); + del(n, new DataTypeNodeDel()); + return n; + } - if (kind.equals(ModuleKind.KIND)) - { - CommonToken t = newToken(ScribbleParser.MODULE_NAME); - n = new ModuleNameNode(t); - } - else if (kind.equals(Global.KIND)) - { - CommonToken t = newToken(ScribbleParser.GPROTO_NAME); - n = new GProtocolNameNode(t); - } - else - { - throw new RuntimeException("Shouldn't get in here: " + kind); - } + @Override + public GProtocolNameNode GProtocolNameNode(List elems) + { + CommonToken t = newToken(ScribbleParser.GPROTO_NAME); + GProtocolNameNode n = new GProtocolNameNode(t); n.addChildren(elems); - return castNameNode(kind, del(n, createDefaultDelegate())); + del(n, createDefaultDelegate()); + return n; } - protected static , K extends Kind> T castNameNode( - K kind, NameNode n) + @Override + public ModuleNameNode ModuleNameNode(List elems) { - if (!n.toName().getKind().equals(kind)) - { - throw new RuntimeException("Shouldn't get in here: " + kind + ", " + n); - } - @SuppressWarnings("unchecked") - T tmp = (T) n; - return tmp; + CommonToken t = newToken(ScribbleParser.MODULE_NAME); + ModuleNameNode n = new ModuleNameNode(t); + n.addChildren(elems); + del(n, createDefaultDelegate()); + return n; + } + + @Override + public MessageSigNameNode MessageSigNameNode(List elems) + { + CommonToken t = newToken(ScribbleParser.SIG_NAME); + MessageSigNameNode n = new MessageSigNameNode(t); + n.addChildren(elems); + del(n, new MessageSigNameNodeDel()); + return n; } @Override From f203145566af3f6f27952ea9c2c1d45e595aa892 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 16:58:20 +0100 Subject: [PATCH 278/539] Continued: cleaning up ast class names. --- .../java/org/scribble/ast/AstFactory.java | 26 +++++++------- .../java/org/scribble/ast/DataTypeDecl.java | 6 ++-- .../org/scribble/ast/MessageSigNameDecl.java | 6 ++-- .../java/org/scribble/ast/TypeParamDecl.java | 6 ++-- .../scribble/ast/global/GDelegationElem.java | 10 +++--- .../java/org/scribble/ast/global/GDo.java | 6 ++-- .../scribble/ast/global/GProtocolHeader.java | 6 ++-- .../{DataTypeNode.java => DataNameNode.java} | 16 ++++----- ...tocolNameNode.java => GProtoNameNode.java} | 16 ++++----- ...tocolNameNode.java => LProtoNameNode.java} | 14 ++++---- ...ssageSigNameNode.java => SigNameNode.java} | 16 ++++----- ...{TypeParamNode.java => DataParamNode.java} | 14 ++++---- .../java/org/scribble/del/DelDecorator.java | 26 +++++++------- .../src/main/java/org/scribble/del/DoDel.java | 2 +- .../del/global/GDelegationElemDel.java | 8 ++--- .../del/name/qualified/DataTypeNodeDel.java | 6 ++-- .../name/qualified/MessageSigNameNodeDel.java | 6 ++-- .../del/name/simple/AmbigNameNodeDel.java | 16 ++++----- .../parser/scribble/AstFactoryImpl.java | 34 +++++++++---------- .../parser/scribble/DelDecoratorImpl.java | 20 +++++------ .../parser/scribble/ScribTreeAdaptor.java | 12 +++---- 21 files changed, 136 insertions(+), 136 deletions(-) rename scribble-ast/src/main/java/org/scribble/ast/name/qualified/{DataTypeNode.java => DataNameNode.java} (85%) rename scribble-ast/src/main/java/org/scribble/ast/name/qualified/{GProtocolNameNode.java => GProtoNameNode.java} (78%) rename scribble-ast/src/main/java/org/scribble/ast/name/qualified/{LProtocolNameNode.java => LProtoNameNode.java} (85%) rename scribble-ast/src/main/java/org/scribble/ast/name/qualified/{MessageSigNameNode.java => SigNameNode.java} (81%) rename scribble-ast/src/main/java/org/scribble/ast/name/simple/{TypeParamNode.java => DataParamNode.java} (86%) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index c944483dd..22242283a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -31,9 +31,9 @@ import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GWrap; import org.scribble.ast.name.PayloadElemNameNode; -import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.ast.name.qualified.GProtocolNameNode; -import org.scribble.ast.name.qualified.MessageSigNameNode; +import org.scribble.ast.name.qualified.DataNameNode; +import org.scribble.ast.name.qualified.GProtoNameNode; +import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.ast.name.simple.ExtIdNode; @@ -43,7 +43,7 @@ import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; -import org.scribble.ast.name.simple.TypeParamNode; +import org.scribble.ast.name.simple.DataParamNode; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.PayloadTypeKind; @@ -58,16 +58,16 @@ public interface AstFactory ExtIdNode ExtIdNode(String text); AmbigNameNode AmbigNameNode(String text); // Deprecate? Never need to make ambigname "manually" via af? (constructed only by ScribbleParser) + DataParamNode DataParamNode(String text); OpNode OpNode(String text); RecVarNode RecVarNode(String text); RoleNode RoleNode(String text); SigParamNode SigParamNode(String text); - TypeParamNode TypeParamNode(String text); - DataTypeNode DataTypeNode(List elems); - GProtocolNameNode GProtocolNameNode(List elems); + DataNameNode DataNameNode(List elems); + GProtoNameNode GProtoNameNode(List elems); ModuleNameNode ModuleNameNode(List elems); - MessageSigNameNode MessageSigNameNode(List elems); + SigNameNode SigNameNode(List elems); Module Module(ModuleDecl mdecl, List> imports, List> data, @@ -75,7 +75,7 @@ Module Module(ModuleDecl mdecl, MessageSigNode MessageSigNode(OpNode op, PayloadElemList pay); - GDelegationElem GDelegationElem(GProtocolNameNode name, + GDelegationElem GDelegationElem(GProtoNameNode name, RoleNode r); PayloadElemList PayloadElemList(List> elems); @@ -90,15 +90,15 @@ ImportModule ImportModule(ModuleNameNode modname, ModuleNameNode alias); MessageSigNameDecl MessageSigNameDecl(IdNode schema, IdNode extName, - IdNode extSource, MessageSigNameNode name); + IdNode extSource, SigNameNode name); DataTypeDecl DataTypeDecl(IdNode schema, IdNode extName, - IdNode extSource, DataTypeNode name); + IdNode extSource, DataNameNode name); GProtocolDecl GProtocolDecl(ProtocolModList modifiers, GProtocolHeader header, GProtocolDef def); - GProtocolHeader GProtocolHeader(GProtocolNameNode name, + GProtocolHeader GProtocolHeader(GProtoNameNode name, RoleDeclList rdecls, NonRoleParamDeclList paramdecls); RoleDeclList RoleDeclList(List ds); @@ -136,7 +136,7 @@ GMessageTransfer GMessageTransfer(RoleNode src, MessageNode msg, GContinue GContinue(RecVarNode rv); GDo GDo(RoleArgList rs, NonRoleArgList args, - GProtocolNameNode proto); + GProtoNameNode proto); RoleArgList RoleArgList(List rs); diff --git a/scribble-ast/src/main/java/org/scribble/ast/DataTypeDecl.java b/scribble-ast/src/main/java/org/scribble/ast/DataTypeDecl.java index cb6a5f9e5..9994f9fb8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DataTypeDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DataTypeDecl.java @@ -14,7 +14,7 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.ast.name.qualified.DataTypeNode; +import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.core.type.kind.DataTypeKind; import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.ModuleName; @@ -35,9 +35,9 @@ protected DataTypeDecl(DataTypeDecl node) } @Override - public DataTypeNode getNameNodeChild() + public DataNameNode getNameNodeChild() { - return (DataTypeNode) getRawNameNodeChild(); + return (DataNameNode) getRawNameNodeChild(); } // Cf. CommonTree#dupNode diff --git a/scribble-ast/src/main/java/org/scribble/ast/MessageSigNameDecl.java b/scribble-ast/src/main/java/org/scribble/ast/MessageSigNameDecl.java index 4113cf7f2..f5b329c2b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/MessageSigNameDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/MessageSigNameDecl.java @@ -14,7 +14,7 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.ast.name.qualified.MessageSigNameNode; +import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.MessageSigName; import org.scribble.core.type.name.ModuleName; @@ -35,9 +35,9 @@ protected MessageSigNameDecl(MessageSigNameDecl node) } @Override - public MessageSigNameNode getNameNodeChild() + public SigNameNode getNameNodeChild() { - return (MessageSigNameNode) getRawNameNodeChild(); + return (SigNameNode) getRawNameNodeChild(); } // Cf. CommonTree#dupNode diff --git a/scribble-ast/src/main/java/org/scribble/ast/TypeParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/TypeParamDecl.java index e740e11cb..3d1a5a1c1 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/TypeParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/TypeParamDecl.java @@ -14,7 +14,7 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.ast.name.simple.TypeParamNode; +import org.scribble.ast.name.simple.DataParamNode; import org.scribble.core.type.kind.DataTypeKind; import org.scribble.core.type.name.DataType; import org.scribble.util.Constants; @@ -34,9 +34,9 @@ public TypeParamDecl(TypeParamDecl node) } @Override - public TypeParamNode getNameNodeChild() + public DataParamNode getNameNodeChild() { - return (TypeParamNode) getRawNameNodeChild(); // CHECKME: make Type/SigParamNode? + return (DataParamNode) getRawNameNodeChild(); // CHECKME: make Type/SigParamNode? } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java index 0c5106b2d..888cc4752 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.PayloadElem; import org.scribble.ast.ScribNodeBase; -import org.scribble.ast.name.qualified.GProtocolNameNode; +import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.GDelegationType; @@ -45,9 +45,9 @@ public GDelegationElem(GDelegationElem node) } // Becomes full name after disambiguation - public GProtocolNameNode getProtocolChild() + public GProtoNameNode getProtocolChild() { - return (GProtocolNameNode) getChild(PROTO_CHILD_INDEX); + return (GProtoNameNode) getChild(PROTO_CHILD_INDEX); } public RoleNode getRoleChild() @@ -61,7 +61,7 @@ public GDelegationElem dupNode() return new GDelegationElem(this); } - public GDelegationElem reconstruct(GProtocolNameNode proto, RoleNode role) + public GDelegationElem reconstruct(GProtoNameNode proto, RoleNode role) { GDelegationElem dup = dupNode(); dup.addChild(proto); @@ -73,7 +73,7 @@ public GDelegationElem reconstruct(GProtocolNameNode proto, RoleNode role) @Override public GDelegationElem visitChildren(AstVisitor nv) throws ScribException { - GProtocolNameNode name = (GProtocolNameNode) + GProtoNameNode name = (GProtoNameNode) visitChild(getProtocolChild(), nv); RoleNode role = (RoleNode) visitChild(getRoleChild(), nv); return reconstruct(name, role); diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java index a416ed46e..2d034bf1e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java @@ -15,7 +15,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.Do; -import org.scribble.ast.name.qualified.GProtocolNameNode; +import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtocolName; @@ -36,9 +36,9 @@ public GDo(GDo node) } @Override - public GProtocolNameNode getProtocolNameNode() + public GProtoNameNode getProtocolNameNode() { - return (GProtocolNameNode) getChild(Do.NAME_CHILD_INDEX); + return (GProtoNameNode) getChild(Do.NAME_CHILD_INDEX); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java index 7a487e56f..9ed138e05 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java @@ -15,7 +15,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.ProtocolHeader; -import org.scribble.ast.name.qualified.GProtocolNameNode; +import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtocolName; import org.scribble.util.Constants; @@ -41,9 +41,9 @@ public GProtocolHeader dupNode() } @Override - public GProtocolNameNode getNameNodeChild() + public GProtoNameNode getNameNodeChild() { - return (GProtocolNameNode) getRawNameNodeChild(); + return (GProtoNameNode) getRawNameNodeChild(); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java similarity index 85% rename from scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java index 1ddb42ff7..7d1167114 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataTypeNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java @@ -20,25 +20,25 @@ import org.scribble.core.type.session.Arg; //public class DataTypeNode extends MemberNameNode implements PayloadElemNameNode -public class DataTypeNode extends MemberNameNode +public class DataNameNode extends MemberNameNode implements PayloadElemNameNode { // ScribTreeAdaptor#create constructor - public DataTypeNode(Token t) + public DataNameNode(Token t) { super(t); } // Tree#dupNode constructor - protected DataTypeNode(DataTypeNode node) + protected DataNameNode(DataNameNode node) { super(node); } @Override - public DataTypeNode dupNode() + public DataNameNode dupNode() { - return new DataTypeNode(this); + return new DataNameNode(this); } @Override @@ -76,17 +76,17 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof DataTypeNode)) + if (!(o instanceof DataNameNode)) { return false; } - return ((DataTypeNode) o).canEqual(this) && super.equals(o); + return ((DataNameNode) o).canEqual(this) && super.equals(o); } @Override public boolean canEqual(Object o) { - return o instanceof DataTypeNode; + return o instanceof DataNameNode; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtoNameNode.java similarity index 78% rename from scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtoNameNode.java index 76b8108b2..4e70cfd89 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtocolNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtoNameNode.java @@ -17,24 +17,24 @@ import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtocolName; -public class GProtocolNameNode extends ProtocolNameNode +public class GProtoNameNode extends ProtocolNameNode { // ScribTreeAdaptor#create constructor - public GProtocolNameNode(Token t) + public GProtoNameNode(Token t) { super(t); } // Tree#dupNode constructor - public GProtocolNameNode(GProtocolNameNode node) + public GProtoNameNode(GProtoNameNode node) { super(node); } @Override - public GProtocolNameNode dupNode() + public GProtoNameNode dupNode() { - return new GProtocolNameNode(this); + return new GProtoNameNode(this); } @Override @@ -53,17 +53,17 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof GProtocolNameNode)) + if (!(o instanceof GProtoNameNode)) { return false; } - return ((GProtocolNameNode) o).canEqual(this) && super.equals(o); + return ((GProtoNameNode) o).canEqual(this) && super.equals(o); } @Override public boolean canEqual(Object o) { - return o instanceof GProtocolNameNode; + return o instanceof GProtoNameNode; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java similarity index 85% rename from scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java index e1b322e74..fe4819948 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtocolNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java @@ -20,25 +20,25 @@ import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.session.Arg; -public class LProtocolNameNode extends ProtocolNameNode +public class LProtoNameNode extends ProtocolNameNode implements PayloadElemNameNode { // ScribTreeAdaptor#create constructor - public LProtocolNameNode(Token t) + public LProtoNameNode(Token t) { super(t); } // Tree#dupNode constructor - protected LProtocolNameNode(LProtocolNameNode node) + protected LProtoNameNode(LProtoNameNode node) { super(node); } @Override - public LProtocolNameNode dupNode() + public LProtoNameNode dupNode() { - return new LProtocolNameNode(this); + return new LProtoNameNode(this); } @Override @@ -69,7 +69,7 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof LProtocolNameNode)) + if (!(o instanceof LProtoNameNode)) { return false; } @@ -79,7 +79,7 @@ public boolean equals(Object o) @Override public boolean canEqual(Object o) { - return o instanceof LProtocolNameNode; + return o instanceof LProtoNameNode; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java similarity index 81% rename from scribble-ast/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java index b1d83d299..fba791797 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MessageSigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java @@ -18,25 +18,25 @@ import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.MessageSigName; -public class MessageSigNameNode extends MemberNameNode +public class SigNameNode extends MemberNameNode implements MessageNode { // ScribTreeAdaptor#create constructor - public MessageSigNameNode(Token t) + public SigNameNode(Token t) { super(t); } // Tree#dupNode constructor - protected MessageSigNameNode(MessageSigNameNode node) + protected SigNameNode(SigNameNode node) { super(node); } @Override - public MessageSigNameNode dupNode() + public SigNameNode dupNode() { - return new MessageSigNameNode(this); + return new SigNameNode(this); } @Override @@ -73,17 +73,17 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof MessageSigNameNode)) + if (!(o instanceof SigNameNode)) { return false; } - return ((MessageSigNameNode) o).canEqual(this) && super.equals(o); + return ((SigNameNode) o).canEqual(this) && super.equals(o); } @Override public boolean canEqual(Object o) { - return o instanceof MessageSigNameNode; + return o instanceof SigNameNode; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java similarity index 86% rename from scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java index 38b1772e6..1b3a9c7e2 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/TypeParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java @@ -18,26 +18,26 @@ import org.scribble.core.type.kind.DataTypeKind; import org.scribble.core.type.name.DataType; -public class TypeParamNode extends NonRoleParamNode +public class DataParamNode extends NonRoleParamNode implements PayloadElemNameNode // As a payload, can only be a DataType (so hardcode) { // Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] // N.B. ttype (an "imaginary node" type) is discarded, t is a ScribbleParser.ID token type - public TypeParamNode(int ttype, Token t) + public DataParamNode(int ttype, Token t) { super(t, DataTypeKind.KIND); } // Tree#dupNode constructor - protected TypeParamNode(TypeParamNode node) + protected DataParamNode(DataParamNode node) { super(node); } @Override - public TypeParamNode dupNode() + public DataParamNode dupNode() { - return new TypeParamNode(this); + return new DataParamNode(this); } @Override @@ -80,7 +80,7 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof TypeParamNode)) + if (!(o instanceof DataParamNode)) { return false; } @@ -90,6 +90,6 @@ public boolean equals(Object o) @Override public boolean canEqual(Object o) { - return o instanceof TypeParamNode; + return o instanceof DataParamNode; } } diff --git a/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java b/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java index 133ea4902..4d71f32e7 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java +++ b/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java @@ -46,10 +46,10 @@ import org.scribble.ast.global.GProtocolDef; import org.scribble.ast.global.GProtocolHeader; import org.scribble.ast.global.GRecursion; -import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.ast.name.qualified.GProtocolNameNode; -import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.ast.name.qualified.MessageSigNameNode; +import org.scribble.ast.name.qualified.DataNameNode; +import org.scribble.ast.name.qualified.GProtoNameNode; +import org.scribble.ast.name.qualified.LProtoNameNode; +import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.ast.name.simple.ExtIdNode; @@ -58,7 +58,7 @@ import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; -import org.scribble.ast.name.simple.TypeParamNode; +import org.scribble.ast.name.simple.DataParamNode; // A dec method for each AST class -- method name must be the same as target class name @@ -68,21 +68,21 @@ public interface DelDecorator { void decorate(ScribNode n); - void AmbigNameNode(AmbigNameNode n); - void TypeParamNode(TypeParamNode n); - void ExtIdNode(ExtIdNode n); void IdNode(IdNode n); - void SigParamNode(SigParamNode n); + void ExtIdNode(ExtIdNode n); + void AmbigNameNode(AmbigNameNode n); + void DataParamNode(DataParamNode n); void OpNode(OpNode n); void RecVarNode(RecVarNode n); void RoleNode(RoleNode n); + void SigParamNode(SigParamNode n); - void MessageSigNameNode(MessageSigNameNode n); - void DataTypeNode(DataTypeNode n); + void DataNameNode(DataNameNode n); void ModuleNameNode(ModuleNameNode n); - void GProtocolNameNode(GProtocolNameNode n); - void LProtocolNameNode(LProtocolNameNode n); + void GProtoNameNode(GProtoNameNode n); + void LProtoNameNode(LProtoNameNode n); + void SigNameNode(SigNameNode n); void Module(Module m); diff --git a/scribble-ast/src/main/java/org/scribble/del/DoDel.java b/scribble-ast/src/main/java/org/scribble/del/DoDel.java index e006066f0..9dd9f5418 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoDel.java @@ -86,7 +86,7 @@ private ProtocolNameNode foo(Lang lang, .map(x -> lang.config.af.IdNode(x)).collect(Collectors.toList()); @SuppressWarnings("unchecked") // FIXME ProtocolNameNode cast = (ProtocolNameNode) lang.config.af - .GProtocolNameNode(elems); + .GProtoNameNode(elems); return cast; } throw new RuntimeException("[TODO] " + fullname.getKind() + ": " + fullname); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java index 477091d72..984c38eed 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -20,7 +20,7 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GDelegationElem; -import org.scribble.ast.name.qualified.GProtocolNameNode; +import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.lang.context.ModuleContext; @@ -45,7 +45,7 @@ public void enterDisambiguation(ScribNode child, { ModuleContext mc = disamb.getModuleContext(); GDelegationElem de = (GDelegationElem) child; - GProtocolNameNode proto = de.getProtocolChild(); + GProtoNameNode proto = de.getProtocolChild(); GProtocolName gpn = proto.toName(); if (!mc.isVisibleProtocolDeclName(gpn)) { @@ -74,8 +74,8 @@ public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, // } List elems = Arrays.asList(fullname.getElements()).stream() .map(x -> disamb.lang.config.af.IdNode(x)).collect(Collectors.toList()); - GProtocolNameNode pnn = (GProtocolNameNode) disamb.lang.config.af - .GProtocolNameNode(elems); + GProtoNameNode pnn = (GProtoNameNode) disamb.lang.config.af + .GProtoNameNode(elems); // Not keeping original namenode del return de.reconstruct(pnn, r); } diff --git a/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java index b1e0a4073..67772a6a7 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java @@ -16,7 +16,7 @@ import org.antlr.runtime.CommonToken; import org.scribble.ast.DataTypeDecl; import org.scribble.ast.ScribNode; -import org.scribble.ast.name.qualified.DataTypeNode; +import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.name.DataType; @@ -42,7 +42,7 @@ public ScribNode leaveDisambiguation(ScribNode child, return visited; } ModuleContext mc = disamb.getModuleContext(); - DataTypeNode dtn = (DataTypeNode) visited; + DataNameNode dtn = (DataNameNode) visited; DataType dt = dtn.toName(); if (!mc.isVisibleDataType(dt)) { @@ -52,7 +52,7 @@ public ScribNode leaveDisambiguation(ScribNode child, DataType fullname = mc.getVisibleDataTypeFullName(dt); /*return (DataTypeNode) disamb.job.config.af.QualifiedNameNode( dtn.getSource(), DataTypeKind.KIND, fullname.getElements());*/ - DataTypeNode res = new DataTypeNode(dtn.token); + DataNameNode res = new DataNameNode(dtn.token); for (String e : fullname.getElements()) { IdNode n = new IdNode(new CommonToken(23, e)); // FIXME TODO: refactor ast into parser module to access token type constants diff --git a/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java index 09b43bb27..39fe3aef0 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java @@ -16,7 +16,7 @@ import org.antlr.runtime.CommonToken; import org.scribble.ast.MessageSigNameDecl; import org.scribble.ast.ScribNode; -import org.scribble.ast.name.qualified.MessageSigNameNode; +import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.name.MessageSigName; @@ -42,12 +42,12 @@ public ScribNode leaveDisambiguation(ScribNode child, return visited; } ModuleContext mc = disamb.getModuleContext(); - MessageSigNameNode msnn = (MessageSigNameNode) visited; + SigNameNode msnn = (SigNameNode) visited; MessageSigName fullname = mc.getVisibleMessageSigNameFullName(msnn.toName()); /*return (MessageSigNameNode) disamb.job.config.af.QualifiedNameNode( msnn.getSource(), SigKind.KIND, fullname.getElements());*/ - MessageSigNameNode res = new MessageSigNameNode(msnn.token); + SigNameNode res = new SigNameNode(msnn.token); for (String e : fullname.getElements()) { IdNode n = new IdNode(new CommonToken(23, e)); // FIXME TODO: refactor ast into parser module to access token type constants diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java index 953194dd9..f67b411e1 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java @@ -18,12 +18,12 @@ import org.scribble.ast.MessageTransfer; import org.scribble.ast.PayloadElem; import org.scribble.ast.ScribNode; -import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.ast.name.qualified.MessageSigNameNode; +import org.scribble.ast.name.qualified.DataNameNode; +import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.SigParamNode; -import org.scribble.ast.name.simple.TypeParamNode; +import org.scribble.ast.name.simple.DataParamNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.DataTypeKind; import org.scribble.core.type.kind.NonRoleParamKind; @@ -63,8 +63,8 @@ public ScribNode leaveDisambiguation(ScribNode child, //DataTypeNode res = new DataTypeNode(ann.token); // CHECKME: what should the Token be? //DataTypeNode res = new DataTypeNode(new CommonToken(73, "TYPENAME")); // FIXME: use af - DataTypeNode res = (DataTypeNode) disamb.lang.config.af - .DataTypeNode(ann.getElements().stream() + DataNameNode res = (DataNameNode) disamb.lang.config.af + .DataNameNode(ann.getElements().stream() .map(x -> disamb.lang.config.af.IdNode(x)) .collect(Collectors.toList())); @@ -85,8 +85,8 @@ else if (mcontext.isMessageSigNameVisible(name.toMessageSigName())) //MessageSigNameNode res = new MessageSigNameNode(ann.token); // CHECME: what should the Token be? //MessageSigNameNode res = new MessageSigNameNode(new CommonToken(67, "SIGNAME")); // FIXME: use af - MessageSigNameNode res = (MessageSigNameNode) disamb.lang.config.af - .MessageSigNameNode(ann.getElements().stream() + SigNameNode res = (SigNameNode) disamb.lang.config.af + .SigNameNode(ann.getElements().stream() .map(x -> disamb.lang.config.af.IdNode(x)) .collect(Collectors.toList())); @@ -104,7 +104,7 @@ else if (disamb.isBoundParameter(name)) { //TypeParamNode res = new TypeParamNode(ann.token); // CHECKME: what should the Token be? //TypeParamNode res = new TypeParamNode(75, ann.token); // CHECKME: what should the Token be? - TypeParamNode res = disamb.lang.config.af.TypeParamNode(ann.getText()); // CHECKME: what should the Token be? + DataParamNode res = disamb.lang.config.af.DataParamNode(ann.getText()); // CHECKME: what should the Token be? //res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java index f9d1de47e..f0c43eb24 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java @@ -60,9 +60,9 @@ import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GWrap; import org.scribble.ast.name.PayloadElemNameNode; -import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.ast.name.qualified.GProtocolNameNode; -import org.scribble.ast.name.qualified.MessageSigNameNode; +import org.scribble.ast.name.qualified.DataNameNode; +import org.scribble.ast.name.qualified.GProtoNameNode; +import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.ast.name.simple.ExtIdNode; @@ -72,7 +72,7 @@ import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; -import org.scribble.ast.name.simple.TypeParamNode; +import org.scribble.ast.name.simple.DataParamNode; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.PayloadTypeKind; import org.scribble.del.DefaultDel; @@ -234,30 +234,30 @@ public SigParamNode SigParamNode(String text) } @Override - public TypeParamNode TypeParamNode(String text) + public DataParamNode DataParamNode(String text) { int ttype = ScribbleParser.ID; // N.B. cf. ScribbleParser.TYPENAME CommonToken t = newIdToken(text); - TypeParamNode n = new TypeParamNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] + DataParamNode n = new DataParamNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] n.del(new NonRoleParamNodeDel()); return n; } @Override - public DataTypeNode DataTypeNode(List elems) + public DataNameNode DataNameNode(List elems) { CommonToken t = newToken(ScribbleParser.DATA_NAME); - DataTypeNode n = new DataTypeNode(t); + DataNameNode n = new DataNameNode(t); n.addChildren(elems); del(n, new DataTypeNodeDel()); return n; } @Override - public GProtocolNameNode GProtocolNameNode(List elems) + public GProtoNameNode GProtoNameNode(List elems) { CommonToken t = newToken(ScribbleParser.GPROTO_NAME); - GProtocolNameNode n = new GProtocolNameNode(t); + GProtoNameNode n = new GProtoNameNode(t); n.addChildren(elems); del(n, createDefaultDelegate()); return n; @@ -274,10 +274,10 @@ public ModuleNameNode ModuleNameNode(List elems) } @Override - public MessageSigNameNode MessageSigNameNode(List elems) + public SigNameNode SigNameNode(List elems) { CommonToken t = newToken(ScribbleParser.SIG_NAME); - MessageSigNameNode n = new MessageSigNameNode(t); + SigNameNode n = new SigNameNode(t); n.addChildren(elems); del(n, new MessageSigNameNodeDel()); return n; @@ -318,7 +318,7 @@ public UnaryPayloadElem UnaryPayloadElem( } @Override - public GDelegationElem GDelegationElem(GProtocolNameNode proto, RoleNode role) + public GDelegationElem GDelegationElem(GProtoNameNode proto, RoleNode role) { CommonToken t = newToken(ScribbleParser.DELEG_PAYELEM); GDelegationElem n = new GDelegationElem(t); @@ -371,7 +371,7 @@ public ImportModule ImportModule(ModuleNameNode modname, @Override public MessageSigNameDecl MessageSigNameDecl(IdNode schema, - IdNode extName, IdNode extSource, MessageSigNameNode alias) + IdNode extName, IdNode extSource, SigNameNode alias) { CommonToken t = newToken(ScribbleParser.SIGDECL); MessageSigNameDecl n = new MessageSigNameDecl(t); @@ -385,7 +385,7 @@ public MessageSigNameDecl MessageSigNameDecl(IdNode schema, @Override public DataTypeDecl DataTypeDecl(IdNode schema, - IdNode extName, IdNode extSource, DataTypeNode alias) + IdNode extName, IdNode extSource, DataNameNode alias) { CommonToken t = newToken(ScribbleParser.DATADECL); DataTypeDecl n = new DataTypeDecl(t); @@ -411,7 +411,7 @@ public GProtocolDecl GProtocolDecl(ProtocolModList mods, } @Override - public GProtocolHeader GProtocolHeader(GProtocolNameNode name, + public GProtocolHeader GProtocolHeader(GProtoNameNode name, RoleDeclList rs, NonRoleParamDeclList ps) { CommonToken t = newToken(ScribbleParser.GPROTOHEADER); @@ -578,7 +578,7 @@ public GContinue GContinue(RecVarNode rv) } @Override - public GDo GDo(RoleArgList rs, NonRoleArgList as, GProtocolNameNode proto) + public GDo GDo(RoleArgList rs, NonRoleArgList as, GProtoNameNode proto) { CommonToken t = newToken(ScribbleParser.GDO); GDo n = new GDo(t); diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java index 18a4556e5..91834ab91 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java @@ -50,10 +50,10 @@ import org.scribble.ast.global.GProtocolDef; import org.scribble.ast.global.GProtocolHeader; import org.scribble.ast.global.GRecursion; -import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.ast.name.qualified.GProtocolNameNode; -import org.scribble.ast.name.qualified.LProtocolNameNode; -import org.scribble.ast.name.qualified.MessageSigNameNode; +import org.scribble.ast.name.qualified.DataNameNode; +import org.scribble.ast.name.qualified.GProtoNameNode; +import org.scribble.ast.name.qualified.LProtoNameNode; +import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.ast.name.simple.ExtIdNode; @@ -62,7 +62,7 @@ import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; -import org.scribble.ast.name.simple.TypeParamNode; +import org.scribble.ast.name.simple.DataParamNode; import org.scribble.del.DefaultDel; import org.scribble.del.DelDecorator; import org.scribble.del.ImportModuleDel; @@ -429,13 +429,13 @@ public void OpNode(OpNode n) } @Override - public void MessageSigNameNode(MessageSigNameNode n) + public void SigNameNode(SigNameNode n) { setDel(n, new MessageSigNameNodeDel()); } @Override - public void DataTypeNode(DataTypeNode n) + public void DataNameNode(DataNameNode n) { setDel(n, new DataTypeNodeDel()); } @@ -447,13 +447,13 @@ public void ModuleNameNode(ModuleNameNode n) } @Override - public void GProtocolNameNode(GProtocolNameNode n) + public void GProtoNameNode(GProtoNameNode n) { setDel(n, createDefaultDelegate()); } @Override - public void LProtocolNameNode(LProtocolNameNode n) + public void LProtoNameNode(LProtoNameNode n) { setDel(n, createDefaultDelegate()); } @@ -540,7 +540,7 @@ public void SigParamNode(SigParamNode n) } @Override - public void TypeParamNode(TypeParamNode n) + public void DataParamNode(DataParamNode n) { setDel(n, new NonRoleParamNodeDel()); } diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 2a8275564..fc4dfcc0e 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -53,9 +53,9 @@ import org.scribble.ast.global.GProtocolHeader; import org.scribble.ast.global.GRecursion; import org.scribble.ast.global.GWrap; -import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.ast.name.qualified.GProtocolNameNode; -import org.scribble.ast.name.qualified.MessageSigNameNode; +import org.scribble.ast.name.qualified.DataNameNode; +import org.scribble.ast.name.qualified.GProtoNameNode; +import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.simple.ExtIdNode; import org.scribble.ast.name.simple.IdNode; @@ -88,10 +88,10 @@ public ScribNode create(Token t) // Simple names "constructed directly" by parser, e.g., t=ID -> ID<...Node>[$t] - case ScribbleParser.GPROTO_NAME: return new GProtocolNameNode(t); + case ScribbleParser.GPROTO_NAME: return new GProtoNameNode(t); case ScribbleParser.MODULE_NAME: return new ModuleNameNode(t); - case ScribbleParser.DATA_NAME: return new DataTypeNode(t); - case ScribbleParser.SIG_NAME: return new MessageSigNameNode(t); + case ScribbleParser.DATA_NAME: return new DataNameNode(t); + case ScribbleParser.SIG_NAME: return new SigNameNode(t); case ScribbleParser.MODULE: return new Module(t); case ScribbleParser.MODULEDECL: return new ModuleDecl(t); From 3b58767a20890c5410ef1c5fc471f415dbd4fe89 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 17:37:33 +0100 Subject: [PATCH 279/539] Continued: cleaning up ast class names. --- .../java/org/scribble/ast/AstFactory.java | 108 +++--- .../java/org/scribble/ast/ConnectAction.java | 4 +- .../ast/{DataTypeDecl.java => DataDecl.java} | 10 +- ...{TypeParamDecl.java => DataParamDecl.java} | 12 +- .../org/scribble/ast/DirectedInteraction.java | 8 +- .../src/main/java/org/scribble/ast/Do.java | 2 +- .../main/java/org/scribble/ast/DoArgList.java | 8 +- .../main/java/org/scribble/ast/Module.java | 48 +-- .../ast/{MessageNode.java => MsgNode.java} | 2 +- ...NonProtocolDecl.java => NonProtoDecl.java} | 14 +- .../org/scribble/ast/NonRoleParamDecl.java | 2 +- .../scribble/ast/NonRoleParamDeclList.java | 8 +- .../{HeaderParamDecl.java => ParamDecl.java} | 14 +- ...rParamDeclList.java => ParamDeclList.java} | 32 +- .../ast/{PayloadElem.java => PayElem.java} | 2 +- ...{PayloadElemList.java => PayElemList.java} | 22 +- .../ast/{ProtocolDecl.java => ProtoDecl.java} | 22 +- ...ProtocolModList.java => ProtoModList.java} | 12 +- .../main/java/org/scribble/ast/RoleDecl.java | 2 +- .../java/org/scribble/ast/RoleDeclList.java | 6 +- .../{MessageSigNameDecl.java => SigDecl.java} | 10 +- .../{MessageSigNode.java => SigLitNode.java} | 22 +- ...naryPayloadElem.java => UnaryPayElem.java} | 26 +- .../java/org/scribble/ast/global/GChoice.java | 4 +- ...DelegationElem.java => GDelegPayElem.java} | 20 +- .../java/org/scribble/ast/global/GDo.java | 2 +- ...MessageTransfer.java => GMsgTransfer.java} | 10 +- .../{GProtocolBlock.java => GProtoBlock.java} | 10 +- .../{GProtocolDecl.java => GProtoDecl.java} | 20 +- .../{GProtocolDef.java => GProtoDef.java} | 14 +- ...GProtocolHeader.java => GProtoHeader.java} | 10 +- .../org/scribble/ast/global/GRecursion.java | 4 +- ...ElemNameNode.java => PayElemNameNode.java} | 2 +- .../ast/name/qualified/DataNameNode.java | 4 +- .../ast/name/qualified/LProtoNameNode.java | 4 +- .../ast/name/qualified/SigNameNode.java | 4 +- .../ast/name/simple/AmbigNameNode.java | 6 +- .../ast/name/simple/DataParamNode.java | 4 +- .../ast/name/simple/SigParamNode.java | 4 +- .../java/org/scribble/del/DelDecorator.java | 70 ++-- .../java/org/scribble/del/DoArgListDel.java | 16 +- .../scribble/del/HeaderParamDeclListDel.java | 10 +- .../main/java/org/scribble/del/ModuleDel.java | 12 +- .../org/scribble/del/NonRoleArgListDel.java | 8 +- .../java/org/scribble/del/RoleArgListDel.java | 4 +- .../org/scribble/del/global/GChoiceDel.java | 4 +- .../del/global/GDelegationElemDel.java | 12 +- .../del/global/GMessageTransferDel.java | 6 +- .../del/global/GProtocolBlockDel.java | 4 +- .../scribble/del/global/GProtocolDeclDel.java | 4 +- .../del/name/qualified/DataTypeNodeDel.java | 4 +- .../name/qualified/MessageSigNameNodeDel.java | 4 +- .../del/name/simple/AmbigNameNodeDel.java | 4 +- .../src/main/java/org/scribble/lang/Lang.java | 4 +- .../java/org/scribble/lang/LangContext.java | 4 +- .../lang/context/ModuleContextCollector.java | 26 +- .../org/scribble/visit/NameDisambiguator.java | 6 +- .../java/org/scribble/cli/CommandLine.java | 10 +- .../callbackapi/CBEndpointApiGenerator.java | 34 +- .../callbackapi/CBEndpointApiGenerator3.java | 44 +-- .../java/sessionapi/SessionApiGenerator.java | 4 +- .../java/statechanapi/BranchSockGen.java | 12 +- .../java/statechanapi/CaseSockGen.java | 8 +- .../java/statechanapi/HandlerIfaceGen.java | 4 +- .../java/statechanapi/InputFutureGen.java | 8 +- .../java/statechanapi/OutputSockGen.java | 10 +- .../java/statechanapi/ReceiveSockGen.java | 14 +- .../java/statechanapi/ScribSockGen.java | 16 +- .../org/scribble/parser/antlr/Scribble.g | 27 +- .../parser/scribble/AstFactoryImpl.java | 264 +++++++------- .../parser/scribble/DelDecoratorImpl.java | 337 +++++++----------- .../parser/scribble/ScribTreeAdaptor.java | 53 +-- 72 files changed, 725 insertions(+), 840 deletions(-) rename scribble-ast/src/main/java/org/scribble/ast/{DataTypeDecl.java => DataDecl.java} (89%) rename scribble-ast/src/main/java/org/scribble/ast/{TypeParamDecl.java => DataParamDecl.java} (81%) rename scribble-ast/src/main/java/org/scribble/ast/{MessageNode.java => MsgNode.java} (94%) rename scribble-ast/src/main/java/org/scribble/ast/{NonProtocolDecl.java => NonProtoDecl.java} (88%) rename scribble-ast/src/main/java/org/scribble/ast/{HeaderParamDecl.java => ParamDecl.java} (79%) rename scribble-ast/src/main/java/org/scribble/ast/{HeaderParamDeclList.java => ParamDeclList.java} (63%) rename scribble-ast/src/main/java/org/scribble/ast/{PayloadElem.java => PayElem.java} (93%) rename scribble-ast/src/main/java/org/scribble/ast/{PayloadElemList.java => PayElemList.java} (77%) rename scribble-ast/src/main/java/org/scribble/ast/{ProtocolDecl.java => ProtoDecl.java} (79%) rename scribble-ast/src/main/java/org/scribble/ast/{ProtocolModList.java => ProtoModList.java} (85%) rename scribble-ast/src/main/java/org/scribble/ast/{MessageSigNameDecl.java => SigDecl.java} (88%) rename scribble-ast/src/main/java/org/scribble/ast/{MessageSigNode.java => SigLitNode.java} (77%) rename scribble-ast/src/main/java/org/scribble/ast/{UnaryPayloadElem.java => UnaryPayElem.java} (77%) rename scribble-ast/src/main/java/org/scribble/ast/global/{GDelegationElem.java => GDelegPayElem.java} (82%) rename scribble-ast/src/main/java/org/scribble/ast/global/{GMessageTransfer.java => GMsgTransfer.java} (85%) rename scribble-ast/src/main/java/org/scribble/ast/global/{GProtocolBlock.java => GProtoBlock.java} (81%) rename scribble-ast/src/main/java/org/scribble/ast/global/{GProtocolDecl.java => GProtoDecl.java} (72%) rename scribble-ast/src/main/java/org/scribble/ast/global/{GProtocolDef.java => GProtoDef.java} (73%) rename scribble-ast/src/main/java/org/scribble/ast/global/{GProtocolHeader.java => GProtoHeader.java} (85%) rename scribble-ast/src/main/java/org/scribble/ast/name/{PayloadElemNameNode.java => PayElemNameNode.java} (94%) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 22242283a..28e99c989 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -18,38 +18,37 @@ import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; import org.scribble.ast.global.GContinue; -import org.scribble.ast.global.GDelegationElem; +import org.scribble.ast.global.GDelegPayElem; import org.scribble.ast.global.GDisconnect; import org.scribble.ast.global.GDo; import org.scribble.ast.global.GInteractionSeq; -import org.scribble.ast.global.GMessageTransfer; -import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ast.global.GProtocolDef; -import org.scribble.ast.global.GProtocolHeader; +import org.scribble.ast.global.GMsgTransfer; +import org.scribble.ast.global.GProtoDecl; +import org.scribble.ast.global.GProtoHeader; +import org.scribble.ast.global.GProtoBlock; +import org.scribble.ast.global.GProtoDef; import org.scribble.ast.global.GRecursion; import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GWrap; -import org.scribble.ast.name.PayloadElemNameNode; +import org.scribble.ast.name.PayElemNameNode; import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.qualified.GProtoNameNode; -import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.DataParamNode; import org.scribble.ast.name.simple.ExtIdNode; import org.scribble.ast.name.simple.IdNode; -import org.scribble.ast.name.simple.NonRoleParamNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; -import org.scribble.ast.name.simple.DataParamNode; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.PayloadTypeKind; // CHECKME: add Token params back (for better transformation, cf. ScribNodeBase.source), and use null for "fresh"? -// AstFactory is for making "fresh" nodes ("fresh" Tokens) -- cf. reconstruct (for Token preservation) +// AstFactory is for making "fresh" nodes ("fresh" Tokens) with new dels -- cf. ScribNode reconstruct pattern (for Token and del preservation) // Implementations located in scribble-parser, use ScribbleParser for Token construction // Currently, used only in relatively niche places (since ANTLR now constructs all parsed nodes "directly") public interface AstFactory @@ -69,81 +68,54 @@ public interface AstFactory ModuleNameNode ModuleNameNode(List elems); SigNameNode SigNameNode(List elems); - Module Module(ModuleDecl mdecl, - List> imports, List> data, - List> protos); - - MessageSigNode MessageSigNode(OpNode op, PayloadElemList pay); - - GDelegationElem GDelegationElem(GProtoNameNode name, - RoleNode r); - - PayloadElemList PayloadElemList(List> elems); - - // PayloadElem PayloadElem(PayloadElemNameNode name); - UnaryPayloadElem UnaryPayloadElem( - PayloadElemNameNode name); - - ModuleDecl ModuleDecl(ModuleNameNode fullmodname); - - ImportModule ImportModule(ModuleNameNode modname, - ModuleNameNode alias); - - MessageSigNameDecl MessageSigNameDecl(IdNode schema, IdNode extName, - IdNode extSource, SigNameNode name); - - DataTypeDecl DataTypeDecl(IdNode schema, IdNode extName, - IdNode extSource, DataNameNode name); - - GProtocolDecl GProtocolDecl(ProtocolModList modifiers, - GProtocolHeader header, GProtocolDef def); - - GProtocolHeader GProtocolHeader(GProtoNameNode name, - RoleDeclList rdecls, NonRoleParamDeclList paramdecls); - + Module Module(ModuleDecl mdecl, List> imports, + List> data, List> protos); + ModuleDecl ModuleDecl(ModuleNameNode fullname); + ImportModule ImportModule(ModuleNameNode modname, ModuleNameNode alias); + + DataDecl DataDecl(IdNode schema, IdNode extName, IdNode extSource, + DataNameNode name); + SigDecl SigDecl(IdNode schema, IdNode extName, IdNode extSource, + SigNameNode name); + GProtoDecl GProtoDecl(ProtoModList mods, GProtoHeader header, + GProtoDef def); + + // TODO: add ProtoModList, etc. + + GProtoHeader GProtocolHeader(GProtoNameNode name, RoleDeclList rs, + NonRoleParamDeclList ps); RoleDeclList RoleDeclList(List ds); - RoleDecl RoleDecl(RoleNode r); - - // ConnectDecl ConnectDecl(RoleNode src, RoleNode r); - NonRoleParamDeclList NonRoleParamDeclList( List> ds); + DataParamDecl DataParamDecl(DataParamNode p); + SigParamDecl SigParamDecl(SigParamNode p); - @Deprecated - NonRoleParamDecl NonRoleParamDecl( - K kind, NonRoleParamNode name); - - GProtocolDef GProtocolDef(GProtocolBlock block); - - GProtocolBlock GProtocolBlock(GInteractionSeq seq); - + GProtoDef GProtoDef(GProtoBlock block); + GProtoBlock GProtoBlock(GInteractionSeq seq); GInteractionSeq GInteractionSeq(List elems); - GMessageTransfer GMessageTransfer(RoleNode src, MessageNode msg, - List dsts); - - GConnect GConnect(RoleNode src, MessageNode msg, RoleNode dst); + SigLitNode SigLitNode(OpNode op, PayElemList pay); + PayElemList PayElemList(List> elems); + UnaryPayElem UnaryPayElem( + PayElemNameNode name); + GDelegPayElem GDelegPayElem(GProtoNameNode name, RoleNode r); + GConnect GConnect(RoleNode src, MsgNode msg, RoleNode dst); GDisconnect GDisconnect(RoleNode src, RoleNode dst); - + GMsgTransfer GMsgTransfer(RoleNode src, MsgNode msg, List dsts); GWrap GWrap(RoleNode src, RoleNode dst); - GChoice GChoice(RoleNode subj, List blocks); - - GRecursion GRecursion(RecVarNode rv, GProtocolBlock block); - GContinue GContinue(RecVarNode rv); - GDo GDo(RoleArgList rs, NonRoleArgList args, GProtoNameNode proto); - RoleArgList RoleArgList(List rs); + GChoice GChoice(RoleNode subj, List blocks); + GRecursion GRecursion(RecVarNode rv, GProtoBlock block); + RoleArgList RoleArgList(List rs); RoleArg RoleArg(RoleNode r); - NonRoleArgList NonRoleArgList(List args); - NonRoleArg NonRoleArg(NonRoleArgNode arg); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java b/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java index 883e70a79..ff73feb4d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java @@ -49,12 +49,12 @@ public RoleNode getDestinationChild() // CHECKME: currently only used for toString, because current syntax allows "connect" with no explicit message ? protected boolean isUnitMessage() { - MessageNode n = getMessageNodeChild(); + MsgNode n = getMessageNodeChild(); if (!n.isMessageSigNode()) { return false; } - MessageSigNode msn = (MessageSigNode) n; + SigLitNode msn = (SigLitNode) n; return msn.getOpChild().isEmpty() && msn.getPayloadListChild().isEmpty(); } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/DataTypeDecl.java b/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java similarity index 89% rename from scribble-ast/src/main/java/org/scribble/ast/DataTypeDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/DataDecl.java index 9994f9fb8..830790e21 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DataTypeDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java @@ -20,16 +20,16 @@ import org.scribble.core.type.name.ModuleName; import org.scribble.util.Constants; -public class DataTypeDecl extends NonProtocolDecl +public class DataDecl extends NonProtoDecl { // ScribTreeAdaptor#create constructor - public DataTypeDecl(Token payload) + public DataDecl(Token payload) { super(payload); } // Tree#dupNode constructor - protected DataTypeDecl(DataTypeDecl node) + protected DataDecl(DataDecl node) { super(node); } @@ -42,9 +42,9 @@ public DataNameNode getNameNodeChild() // Cf. CommonTree#dupNode @Override - public DataTypeDecl dupNode() + public DataDecl dupNode() { - return new DataTypeDecl(this); + return new DataDecl(this); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/TypeParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java similarity index 81% rename from scribble-ast/src/main/java/org/scribble/ast/TypeParamDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java index 3d1a5a1c1..b8041184f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/TypeParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java @@ -19,16 +19,16 @@ import org.scribble.core.type.name.DataType; import org.scribble.util.Constants; -public class TypeParamDecl extends NonRoleParamDecl +public class DataParamDecl extends NonRoleParamDecl { // ScribTreeAdaptor#create constructor - public TypeParamDecl(Token t) + public DataParamDecl(Token t) { super(t, DataTypeKind.KIND); } // Tree#dupNode constructor - public TypeParamDecl(TypeParamDecl node) + public DataParamDecl(DataParamDecl node) { super(node); } @@ -36,13 +36,13 @@ public TypeParamDecl(TypeParamDecl node) @Override public DataParamNode getNameNodeChild() { - return (DataParamNode) getRawNameNodeChild(); // CHECKME: make Type/SigParamNode? + return (DataParamNode) getRawNameNodeChild(); } @Override - public TypeParamDecl dupNode() + public DataParamDecl dupNode() { - return new TypeParamDecl(this); + return new DataParamDecl(this); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java index 95c6d130b..1522dcc51 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java @@ -43,9 +43,9 @@ public DirectedInteraction(DirectedInteraction node) super(node); } - public MessageNode getMessageNodeChild() + public MsgNode getMessageNodeChild() { - return (MessageNode) getChild(MSG_CHILD_INDEX); + return (MsgNode) getChild(MSG_CHILD_INDEX); } public RoleNode getSourceChild() @@ -68,7 +68,7 @@ public final List getDestinationRoles() public abstract DirectedInteraction dupNode(); - public DirectedInteraction reconstruct(MessageNode msg, RoleNode src, + public DirectedInteraction reconstruct(MsgNode msg, RoleNode src, List dests) { DirectedInteraction mt = dupNode(); @@ -84,7 +84,7 @@ public DirectedInteraction reconstruct(MessageNode msg, RoleNode src, public DirectedInteraction visitChildren(AstVisitor nv) throws ScribException { - MessageNode msg = (MessageNode) visitChild(getMessageNodeChild(), nv); + MsgNode msg = (MsgNode) visitChild(getMessageNodeChild(), nv); RoleNode src = (RoleNode) visitChild(getSourceChild(), nv); List dests = visitChildListWithClassEqualityCheck(this, getDestinationChildren(), nv); diff --git a/scribble-ast/src/main/java/org/scribble/ast/Do.java b/scribble-ast/src/main/java/org/scribble/ast/Do.java index 65e2ea441..b1356754c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Do.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Do.java @@ -91,7 +91,7 @@ public ProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) } // CHECKME: mcontext redundant, because redundant for getTargetProtocolDeclFullName - public abstract ProtocolDecl getTargetProtocolDecl(LangContext jcontext, + public abstract ProtoDecl getTargetProtocolDecl(LangContext jcontext, ModuleContext mcontext); public Role getTargetRoleParameter(LangContext jcontext, diff --git a/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java b/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java index 89d0ffc33..3284d7103 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java @@ -54,10 +54,10 @@ public int length() public DoArgList reconstruct(List args) { - DoArgList argList = dupNode(); - argList.addChildren(args); - argList.setDel(del()); // No copy - return argList; + DoArgList n = dupNode(); + n.addChildren(args); + n.setDel(del()); // No copy + return n; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/Module.java b/scribble-ast/src/main/java/org/scribble/ast/Module.java index b8a3f17d0..b00111c8b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Module.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Module.java @@ -21,7 +21,7 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ast.global.GProtoDecl; import org.scribble.core.type.kind.Kind; import org.scribble.core.type.kind.ProtocolKind; import org.scribble.core.type.name.DataType; @@ -58,16 +58,16 @@ public List> getImportDeclChildren() x -> (ImportDecl) x); } - public List> getNonProtoDeclChildren() + public List> getNonProtoDeclChildren() { - return getMemberChildren(x -> x instanceof NonProtocolDecl, - x -> (NonProtocolDecl) x); + return getMemberChildren(x -> x instanceof NonProtoDecl, + x -> (NonProtoDecl) x); } - public List> getProtoDeclChildren() + public List> getProtoDeclChildren() { - return getMemberChildren(x -> x instanceof ProtocolDecl, - x -> (ProtocolDecl) x); + return getMemberChildren(x -> x instanceof ProtoDecl, + x -> (ProtoDecl) x); } // Not requiring T extends ModuleMember, ImportDecl is not a ModuleMember @@ -100,7 +100,7 @@ public Module dupNode() // Set args as children on a dup of this -- children *not* cloned protected Module reconstruct(ModuleDecl moddecl, List> imports, - List> data, List> protos) + List> data, List> protos) { Module dup = dupNode(); dup.addChild(moddecl); @@ -118,19 +118,19 @@ public Module visitChildren(AstVisitor nv) throws ScribException // class equality check probably too restrictive -- FIXME: remove class checks List> imports = ScribNodeBase .visitChildListWithClassEqualityCheck(this, getImportDeclChildren(), nv); - List> data = ScribNodeBase + List> data = ScribNodeBase .visitChildListWithClassEqualityCheck(this, getNonProtoDeclChildren(), nv); - List> protos = ScribNodeBase + List> protos = ScribNodeBase .visitChildListWithClassEqualityCheck(this, getProtoDeclChildren(), nv); return reconstruct(moddecl, imports, data, protos); } - public DataTypeDecl getDataTypeDeclChild(DataType simpname) // Simple name (as for getProtocolDecl) + public DataDecl getDataTypeDeclChild(DataType simpname) // Simple name (as for getProtocolDecl) { - Optional res = getNonProtoDeclChildren().stream() - .filter(x -> (x instanceof DataTypeDecl) + Optional res = getNonProtoDeclChildren().stream() + .filter(x -> (x instanceof DataDecl) && x.getDeclName().equals(simpname)) - .map(x -> (DataTypeDecl) x).findFirst(); // No duplication check, rely on WF + .map(x -> (DataDecl) x).findFirst(); // No duplication check, rely on WF if (!res.isPresent()) { throw new RuntimeException("Type decl not found: " + simpname); @@ -139,12 +139,12 @@ public DataTypeDecl getDataTypeDeclChild(DataType simpname) // Simple name (as } // CHECKME: allow sig and type decls with same decl name in same module? - public MessageSigNameDecl getMessageSigDeclChild(MessageSigName simpname) + public SigDecl getMessageSigDeclChild(MessageSigName simpname) { - Optional res = getNonProtoDeclChildren().stream() - .filter(x -> (x instanceof MessageSigNameDecl) + Optional res = getNonProtoDeclChildren().stream() + .filter(x -> (x instanceof SigDecl) && x.getDeclName().equals(simpname)) - .map(x -> (MessageSigNameDecl) x).findFirst(); // No duplication check, rely on WF + .map(x -> (SigDecl) x).findFirst(); // No duplication check, rely on WF if (!res.isPresent()) { throw new RuntimeException("Sig decl not found: " + simpname); @@ -152,12 +152,12 @@ public MessageSigNameDecl getMessageSigDeclChild(MessageSigName simpname) return res.get(); } - public List getGProtoDeclChildren() + public List getGProtoDeclChildren() { /*return getChildren().stream().filter(IS_GPROTOCOLDECL).map(TO_GPROTOCOLDECL) .collect(Collectors.toList());*/ return getProtoDeclChildren().stream().filter(x -> x.isGlobal()) - .map(x -> (GProtocolDecl) x).collect(Collectors.toList()); + .map(x -> (GProtoDecl) x).collect(Collectors.toList()); // Less efficient, but smaller code } @@ -169,10 +169,10 @@ public boolean hasGProtocolDecl(GProtocolName simpname) } // Pre: hasProtocolDecl(simpname) - public GProtocolDecl getGProtocolDeclChild( + public GProtoDecl getGProtocolDeclChild( GProtocolName simpname) { - Optional res = getGProtoDeclChildren().stream() + Optional res = getGProtoDeclChildren().stream() .filter(x -> x.getHeaderChild().getDeclName().equals(simpname)) .findFirst(); // No duplication check, rely on WF if (!res.isPresent()) @@ -190,11 +190,11 @@ public String toString() { s += "\n" + id; } - for (NonProtocolDecl dtd : getNonProtoDeclChildren()) + for (NonProtoDecl dtd : getNonProtoDeclChildren()) { s += "\n" + dtd; } - for (ProtocolDecl pd : getProtoDeclChildren()) + for (ProtoDecl pd : getProtoDeclChildren()) { s += "\n" + pd; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/MessageNode.java b/scribble-ast/src/main/java/org/scribble/ast/MsgNode.java similarity index 94% rename from scribble-ast/src/main/java/org/scribble/ast/MessageNode.java rename to scribble-ast/src/main/java/org/scribble/ast/MsgNode.java index a0f8d56e6..5279f0398 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/MessageNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/MsgNode.java @@ -16,7 +16,7 @@ import org.scribble.core.type.session.Message; // A sig kind node: MessageSignatureNode, MessageSignatureNameNode or NonRoleParamNode -public interface MessageNode extends NonRoleArgNode +public interface MsgNode extends NonRoleArgNode { Message toMessage(); diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java b/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java similarity index 88% rename from scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java index 0ab3f91a4..3674f2743 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonProtocolDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java @@ -22,7 +22,7 @@ import org.scribble.visit.AstVisitor; // Rename to something better -public abstract class NonProtocolDecl +public abstract class NonProtoDecl extends NameDeclNode implements ModuleMember { // NameDeclNode.NAMENODE_CHILD_INDEX = 0; @@ -31,13 +31,13 @@ public abstract class NonProtocolDecl public static final int EXTSOURCE_NODE_CHILD_INDEX = 3; // ScribTreeAdaptor#create constructor - public NonProtocolDecl(Token payload) + public NonProtoDecl(Token payload) { super(payload); } // Tree#dupNode constructor - protected NonProtocolDecl(NonProtocolDecl node) + protected NonProtoDecl(NonProtoDecl node) { super(node); } @@ -88,12 +88,12 @@ public boolean isMessageSigNameDecl() } @Override - public abstract NonProtocolDecl dupNode(); + public abstract NonProtoDecl dupNode(); - public NonProtocolDecl reconstruct(NameNode name, IdNode schema, + public NonProtoDecl reconstruct(NameNode name, IdNode schema, IdNode extName, IdNode extSource) { - NonProtocolDecl n = dupNode(); + NonProtoDecl n = dupNode(); n.addChild(name); n.addChild(schema); n.addChild(extName); @@ -103,7 +103,7 @@ public NonProtocolDecl reconstruct(NameNode name, IdNode schema, } @Override - public NonProtocolDecl visitChildren(AstVisitor nv) + public NonProtoDecl visitChildren(AstVisitor nv) throws ScribException { NameNode name = (NameNode) visitChildWithClassEqualityCheck(this, diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDecl.java index 0852f7802..680964d38 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDecl.java @@ -19,7 +19,7 @@ // CHECKME: drop generic parameter and kind? public abstract class NonRoleParamDecl - extends HeaderParamDecl + extends ParamDecl { public final K kind; // CHECKME: factor up to super? diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java index c62c72d99..d1caf604a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java @@ -24,7 +24,7 @@ // Can contain "mixed" type/sig kinds // Typing a bit awkward that this list has to use NonRoleParamKind as the "concrete" kind, while the NonRoleParamDecl elements use the actual concrete kind // But OK because the NonRoleParamDecl nodes are immutable (the generic kind value is never rewritten after instantiation, only read) -public class NonRoleParamDeclList extends HeaderParamDeclList +public class NonRoleParamDeclList extends ParamDeclList { // ScribTreeAdaptor#create constructor public NonRoleParamDeclList(Token t) @@ -39,7 +39,7 @@ public NonRoleParamDeclList(NonRoleParamDeclList node) } @Override - public List> getParamDeclChildren() + public List> getDeclChildren() { @SuppressWarnings("unchecked") List> cast = @@ -51,7 +51,7 @@ public List> getParamDeclChildren() public List> getParameters() { - return getParamDeclChildren().stream().map(decl -> decl.getDeclName()) + return getDeclChildren().stream().map(decl -> decl.getDeclName()) .collect(Collectors.toList()); } @@ -63,7 +63,7 @@ public NonRoleParamDeclList dupNode() @Override public NonRoleParamDeclList reconstruct( - List> decls) + List> decls) { NonRoleParamDeclList sig = dupNode(); sig.addChildren(decls); diff --git a/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ParamDecl.java similarity index 79% rename from scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/ParamDecl.java index 859b6b1f2..98f84fd6c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ParamDecl.java @@ -21,17 +21,17 @@ // Names that are declared in a protocol header (roles and parameters -- not the protocol name though) // RoleKind or (NonRole)ParamKind -public abstract class HeaderParamDecl +public abstract class ParamDecl extends NameDeclNode { // ScribTreeAdaptor#create constructor - public HeaderParamDecl(Token t) + public ParamDecl(Token t) { super(t); } // Tree#dupNode constructor - public HeaderParamDecl(HeaderParamDecl node) + public ParamDecl(ParamDecl node) { super(node); } @@ -41,18 +41,18 @@ public HeaderParamDecl(HeaderParamDecl node) public abstract String getKeyword(); - public abstract HeaderParamDecl dupNode(); + public abstract ParamDecl dupNode(); - public HeaderParamDecl reconstruct(NameNode name) // Always a "simple" name (e.g., like Role), but Type/Sig names are not SimpleNames + public ParamDecl reconstruct(NameNode name) // Always a "simple" name (e.g., like Role), but Type/Sig names are not SimpleNames { - HeaderParamDecl dup = dupNode(); + ParamDecl dup = dupNode(); dup.addChild(name); dup.setDel(del()); // No copy return dup; } @Override - public HeaderParamDecl visitChildren(AstVisitor nv) + public ParamDecl visitChildren(AstVisitor nv) throws ScribException { NameNode name = diff --git a/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/ParamDeclList.java similarity index 63% rename from scribble-ast/src/main/java/org/scribble/ast/HeaderParamDeclList.java rename to scribble-ast/src/main/java/org/scribble/ast/ParamDeclList.java index 8d83ef5f7..8da45390c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/HeaderParamDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ParamDeclList.java @@ -24,25 +24,25 @@ // RoleKind or (NonRole)ParamKind -public abstract class HeaderParamDeclList extends ScribNodeBase +public abstract class ParamDeclList extends ScribNodeBase { // ScribTreeAdaptor#create constructor - public HeaderParamDeclList(Token t) + public ParamDeclList(Token t) { super(t); } // Tree#dupNode constructor - public HeaderParamDeclList(HeaderParamDeclList node) + public ParamDeclList(ParamDeclList node) { super(node); } - public abstract List> getParamDeclChildren(); + public abstract List> getDeclChildren(); public final int length() { - return getParamDeclChildren().size(); + return getDeclChildren().size(); } public final boolean isEmpty() @@ -51,24 +51,24 @@ public final boolean isEmpty() } @Override - public abstract HeaderParamDeclList dupNode(); + public abstract ParamDeclList dupNode(); - public HeaderParamDeclList reconstruct( - List> decls) + public ParamDeclList reconstruct( + List> decls) { - HeaderParamDeclList sig = dupNode(); - sig.addChildren(decls); + ParamDeclList n = dupNode(); + n.addChildren(decls); ScribDel del = del(); - sig.setDel(del); // No copy - return sig; + n.setDel(del); // No copy + return n; } @Override - public HeaderParamDeclList visitChildren(AstVisitor v) + public ParamDeclList visitChildren(AstVisitor v) throws ScribException { - List> ps = - visitChildListWithClassEqualityCheck(this, getParamDeclChildren(), v); + List> ps = + visitChildListWithClassEqualityCheck(this, getDeclChildren(), v); return reconstruct(ps); } @@ -76,7 +76,7 @@ public HeaderParamDeclList visitChildren(AstVisitor v) @Override public String toString() { - return getParamDeclChildren().stream().map(x -> x.toString()) + return getDeclChildren().stream().map(x -> x.toString()) .collect(Collectors.joining(", ")); } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/PayloadElem.java b/scribble-ast/src/main/java/org/scribble/ast/PayElem.java similarity index 93% rename from scribble-ast/src/main/java/org/scribble/ast/PayloadElem.java rename to scribble-ast/src/main/java/org/scribble/ast/PayElem.java index 6ee34ea3a..b51985f14 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/PayloadElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/PayElem.java @@ -17,7 +17,7 @@ import org.scribble.core.type.name.PayloadElemType; // Not in grammar file -- but cf. DoArg (and PayloadElemList cf. DoArgList) -- i.e. need a wrapper for mixed and initially ambiguous name kinds -public interface PayloadElem extends ScribNode +public interface PayElem extends ScribNode { PayloadElemType toPayloadType(); // Mainly a wrapper method for the wrapped NameNode diff --git a/scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java b/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java similarity index 77% rename from scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java rename to scribble-ast/src/main/java/org/scribble/ast/PayElemList.java index b4bd65f5d..3cf1032d1 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/PayloadElemList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java @@ -23,23 +23,23 @@ import org.scribble.visit.AstVisitor; // Cf. DoArgList, but here we don't need as much abstraction (cf. RoleArgList, NonRoleArgList) -public class PayloadElemList extends ScribNodeBase +public class PayElemList extends ScribNodeBase { // ScribTreeAdaptor#create constructor - public PayloadElemList(Token t) + public PayElemList(Token t) { super(t); } // Tree#dupNode constructor - public PayloadElemList(PayloadElemList node) + public PayElemList(PayElemList node) { super(node); } - List> getElementChildren() + List> getElementChildren() { - return getChildren().stream().map(x -> (PayloadElem) x) + return getChildren().stream().map(x -> (PayElem) x) .collect(Collectors.toList()); } @@ -56,23 +56,23 @@ public boolean isEmpty() } @Override - public PayloadElemList dupNode() + public PayElemList dupNode() { - return new PayloadElemList(this); + return new PayElemList(this); } - protected PayloadElemList reconstruct(List> elems) + protected PayElemList reconstruct(List> elems) { - PayloadElemList pay = dupNode(); + PayElemList pay = dupNode(); pay.addChildren(elems); pay.setDel(del()); // No copy return pay; } @Override - public PayloadElemList visitChildren(AstVisitor nv) throws ScribException + public PayElemList visitChildren(AstVisitor nv) throws ScribException { - List> elems = + List> elems = visitChildListWithClassEqualityCheck(this, getElementChildren(), nv); return reconstruct(elems); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java similarity index 79% rename from scribble-ast/src/main/java/org/scribble/ast/ProtocolDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java index f57f674d9..9c25d3083 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java @@ -23,7 +23,7 @@ import org.scribble.visit.AstVisitor; // CHECKME: visitChildren for modifiers -public abstract class ProtocolDecl extends ScribNodeBase +public abstract class ProtoDecl extends ScribNodeBase implements ModuleMember, ProtocolKindNode { public static final int MODLIST_CHILD = 0; @@ -31,18 +31,18 @@ public abstract class ProtocolDecl extends ScribNodeBase public static final int DEF_CHILD = 2; // ScribTreeAdaptor#create constructor - protected ProtocolDecl(Token t) + protected ProtoDecl(Token t) { super(t); } // Tree#dupNode constructor - protected ProtocolDecl(ProtocolDecl node) + protected ProtoDecl(ProtoDecl node) { super(node); } - public abstract ProtocolDecl dupNode(); + public abstract ProtoDecl dupNode(); public boolean isAux() { @@ -54,9 +54,9 @@ public boolean isExplicit() return getModifierListChild().hasExplicit(); } - public ProtocolModList getModifierListChild() + public ProtoModList getModifierListChild() { - return (ProtocolModList) getChild(MODLIST_CHILD); + return (ProtoModList) getChild(MODLIST_CHILD); } // Implement in subclasses to avoid generic cast @@ -69,11 +69,11 @@ public List getRoles() return getHeaderChild().getRoleDeclListChild().getRoles(); } - public ProtocolDecl reconstruct(ProtocolModList mods, + public ProtoDecl reconstruct(ProtoModList mods, ProtocolHeader header, ProtocolDef def) //, ProtocolDeclContext pdcontext, Env env); { - ProtocolDecl pd = dupNode(); + ProtoDecl pd = dupNode(); ScribDel del = del(); pd.addChild(mods); pd.addChild(header); @@ -83,9 +83,9 @@ public ProtocolDecl reconstruct(ProtocolModList mods, } @Override - public ProtocolDecl visitChildren(AstVisitor nv) throws ScribException + public ProtoDecl visitChildren(AstVisitor nv) throws ScribException { - ProtocolModList mods = visitChildWithClassEqualityCheck(this, + ProtoModList mods = visitChildWithClassEqualityCheck(this, getModifierListChild(), nv); ProtocolHeader header = visitChildWithClassEqualityCheck(this, getHeaderChild(), nv); @@ -96,7 +96,7 @@ public ProtocolDecl visitChildren(AstVisitor nv) throws ScribException @Override public String toString() { - ProtocolModList mods = getModifierListChild(); + ProtoModList mods = getModifierListChild(); return (mods.isEmpty() ? "" : mods + " ") + getHeaderChild() + " " + getDefChild(); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolModList.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java similarity index 85% rename from scribble-ast/src/main/java/org/scribble/ast/ProtocolModList.java rename to scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java index cd488fa59..160a7d060 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolModList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java @@ -21,16 +21,16 @@ import org.scribble.visit.AstVisitor; // (Currently) a list of mod leaf nodes as AmbigNameNodes (cf., NameNode "elements") -public class ProtocolModList extends ScribNodeBase +public class ProtoModList extends ScribNodeBase { // ScribTreeAdaptor#create constructor - public ProtocolModList(Token t) + public ProtoModList(Token t) { super(t); } // Tree#dupNode constructor - protected ProtocolModList(ProtocolModList node) + protected ProtoModList(ProtoModList node) { super(node); } @@ -58,13 +58,13 @@ public boolean isEmpty() } @Override - public ProtocolModList dupNode() + public ProtoModList dupNode() { - return new ProtocolModList(this); + return new ProtoModList(this); } @Override - public ProtocolModList visitChildren(AstVisitor nv) throws ScribException + public ProtoModList visitChildren(AstVisitor nv) throws ScribException { // CHECKME: no child visiting, no reconstruct? return this; diff --git a/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java b/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java index e4c1a4dbc..b1b2e7f74 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java @@ -19,7 +19,7 @@ import org.scribble.core.type.name.Role; import org.scribble.util.Constants; -public class RoleDecl extends HeaderParamDecl +public class RoleDecl extends ParamDecl { // ScribTreeAdaptor#create constructor public RoleDecl(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/RoleDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/RoleDeclList.java index f6a490fad..aada289fe 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/RoleDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/RoleDeclList.java @@ -20,7 +20,7 @@ import org.scribble.core.type.kind.RoleKind; import org.scribble.core.type.name.Role; -public class RoleDeclList extends HeaderParamDeclList +public class RoleDeclList extends ParamDeclList { // ScribTreeAdaptor#create constructor public RoleDeclList(Token t) @@ -35,7 +35,7 @@ public RoleDeclList(RoleDeclList node) } @Override - public List getParamDeclChildren() + public List getDeclChildren() { return ((List) getChildren()).stream().map(x -> (RoleDecl) x) .collect(Collectors.toList()); @@ -43,7 +43,7 @@ public List getParamDeclChildren() public List getRoles() { - return getParamDeclChildren().stream().map(decl -> decl.getDeclName()) + return getDeclChildren().stream().map(decl -> decl.getDeclName()) .collect(Collectors.toList()); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/MessageSigNameDecl.java b/scribble-ast/src/main/java/org/scribble/ast/SigDecl.java similarity index 88% rename from scribble-ast/src/main/java/org/scribble/ast/MessageSigNameDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/SigDecl.java index f5b329c2b..40179575e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/MessageSigNameDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SigDecl.java @@ -20,16 +20,16 @@ import org.scribble.core.type.name.ModuleName; import org.scribble.util.Constants; -public class MessageSigNameDecl extends NonProtocolDecl +public class SigDecl extends NonProtoDecl { // ScribTreeAdaptor#create constructor - public MessageSigNameDecl(Token payload) + public SigDecl(Token payload) { super(payload); } // Tree#dupNode constructor - protected MessageSigNameDecl(MessageSigNameDecl node) + protected SigDecl(SigDecl node) { super(node); } @@ -42,9 +42,9 @@ public SigNameNode getNameNodeChild() // Cf. CommonTree#dupNode @Override - public MessageSigNameDecl dupNode() + public SigDecl dupNode() { - return new MessageSigNameDecl(this); + return new SigDecl(this); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java b/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java similarity index 77% rename from scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java rename to scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java index a2c29c8e5..dc05ca79e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/MessageSigNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java @@ -19,19 +19,19 @@ import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -public class MessageSigNode extends ScribNodeBase implements MessageNode +public class SigLitNode extends ScribNodeBase implements MsgNode { public static final int OP_CHILD_INDEX = 0; public static final int PAYLOAD_CHILD_INDEX = 1; // ScribTreeAdaptor#create constructor - public MessageSigNode(Token t) + public SigLitNode(Token t) { super(t); } // Tree#dupNode constructor - public MessageSigNode(MessageSigNode node) + public SigLitNode(SigLitNode node) { super(node); } @@ -41,20 +41,20 @@ public OpNode getOpChild() return (OpNode) getChild(OP_CHILD_INDEX); } - public PayloadElemList getPayloadListChild() + public PayElemList getPayloadListChild() { - return (PayloadElemList) getChild(PAYLOAD_CHILD_INDEX); + return (PayElemList) getChild(PAYLOAD_CHILD_INDEX); } @Override - public MessageSigNode dupNode() + public SigLitNode dupNode() { - return new MessageSigNode(this); + return new SigLitNode(this); } - public MessageSigNode reconstruct(OpNode op, PayloadElemList payload) + public SigLitNode reconstruct(OpNode op, PayElemList payload) { - MessageSigNode sig = dupNode(); + SigLitNode sig = dupNode(); sig.addChild(op); sig.addChild(payload); sig.setDel(del()); // No copy @@ -62,10 +62,10 @@ public MessageSigNode reconstruct(OpNode op, PayloadElemList payload) } @Override - public MessageSigNode visitChildren(AstVisitor nv) throws ScribException + public SigLitNode visitChildren(AstVisitor nv) throws ScribException { OpNode op = (OpNode) visitChild(getOpChild(), nv); - PayloadElemList pay = (PayloadElemList) + PayElemList pay = (PayElemList) visitChild(getPayloadListChild(), nv); return reconstruct(op, pay); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java similarity index 77% rename from scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java rename to scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java index 1c287c920..c7ceecf6b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayloadElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java @@ -14,7 +14,7 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.ast.name.PayloadElemNameNode; +import org.scribble.ast.name.PayElemNameNode; import org.scribble.core.type.kind.PayloadTypeKind; import org.scribble.core.type.name.PayloadElemType; import org.scribble.del.ScribDel; @@ -29,42 +29,42 @@ // PayloadTypeKind is DataType or Local, but Local has its own special subclass (and protocol params not allowed), so this should implicitly be for DataType only // AST hierarchy requires unary and delegation (binary pair) payloads to be structurally distinguished //public class DataTypeElem extends PayloadElem -public class UnaryPayloadElem extends ScribNodeBase - implements PayloadElem// extends PayloadElem +public class UnaryPayElem extends ScribNodeBase + implements PayElem// extends PayloadElem { // cf. Scribble.g public static final int NAME_CHILD_INDEX = 0; // ScribTreeAdaptor#create constructor - public UnaryPayloadElem(Token t) + public UnaryPayElem(Token t) { super(t); } // Tree#dupNode constructor - public UnaryPayloadElem(UnaryPayloadElem node) + public UnaryPayElem(UnaryPayElem node) { super(node); } - public PayloadElemNameNode getNameChild() + public PayElemNameNode getNameChild() { // FIXME - PayloadElemNameNode name = (PayloadElemNameNode) getChild(NAME_CHILD_INDEX); + PayElemNameNode name = (PayElemNameNode) getChild(NAME_CHILD_INDEX); // CHECKME: probably need to record an explicit kind token, for "cast checking" // Cannot use ScribNodeBase.visitChildWithCastCheck because this is not a ProtocolKindNode return name; } @Override - public UnaryPayloadElem dupNode() + public UnaryPayElem dupNode() { - return new UnaryPayloadElem<>(this); + return new UnaryPayElem<>(this); } - public UnaryPayloadElem reconstruct(PayloadElemNameNode name) + public UnaryPayElem reconstruct(PayElemNameNode name) { - UnaryPayloadElem elem = dupNode(); + UnaryPayElem elem = dupNode(); elem.addChild(name); ScribDel del = del(); elem.setDel(del); // No copy @@ -72,11 +72,11 @@ public UnaryPayloadElem reconstruct(PayloadElemNameNode name) } @Override - public UnaryPayloadElem visitChildren(AstVisitor nv) + public UnaryPayElem visitChildren(AstVisitor nv) throws ScribException { @SuppressWarnings("unchecked") - PayloadElemNameNode name = (PayloadElemNameNode) visitChild( + PayElemNameNode name = (PayElemNameNode) visitChild( getNameChild(), nv); // CHECKME: probably need to record an explicit kind token, for "cast checking" // Cannot use ScribNodeBase.visitChildWithCastCheck because this is not a ProtocolKindNode diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java index 77fe2e003..972635525 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java @@ -36,11 +36,11 @@ protected GChoice(GChoice node) } @Override - public List getBlockChildren() + public List getBlockChildren() { List cs = getChildren(); return cs.subList(GChoice.BLOCK_CHILDREN_START_INDEX, cs.size()).stream() - .map(x -> (GProtocolBlock) x).collect(Collectors.toList()); + .map(x -> (GProtoBlock) x).collect(Collectors.toList()); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java similarity index 82% rename from scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java index 888cc4752..81f2965d5 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegationElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java @@ -14,7 +14,7 @@ package org.scribble.ast.global; import org.antlr.runtime.Token; -import org.scribble.ast.PayloadElem; +import org.scribble.ast.PayElem; import org.scribble.ast.ScribNodeBase; import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.ast.name.simple.RoleNode; @@ -27,19 +27,19 @@ // A "name pair" payload elem (current AST hierarchy induces this pattern), cf. UnaryPayloadElem (also differs in no parsing ambig against parameters) // The this.name will be global kind, but overall this node is local kind //public class DelegationElem extends PayloadElem -public class GDelegationElem extends ScribNodeBase implements PayloadElem +public class GDelegPayElem extends ScribNodeBase implements PayElem { public static final int PROTO_CHILD_INDEX = 0; public static final int ROLE_CHILD_INDEX = 1; // ScribTreeAdaptor#create constructor - public GDelegationElem(Token t) + public GDelegPayElem(Token t) { super(t); } // Tree#dupNode constructor - public GDelegationElem(GDelegationElem node) + public GDelegPayElem(GDelegPayElem node) { super(node); } @@ -56,22 +56,22 @@ public RoleNode getRoleChild() } @Override - public GDelegationElem dupNode() + public GDelegPayElem dupNode() { - return new GDelegationElem(this); + return new GDelegPayElem(this); } - public GDelegationElem reconstruct(GProtoNameNode proto, RoleNode role) + public GDelegPayElem reconstruct(GProtoNameNode proto, RoleNode role) { - GDelegationElem dup = dupNode(); + GDelegPayElem dup = dupNode(); dup.addChild(proto); dup.addChild(role); - dup = (GDelegationElem) dup.del(del()); + dup = (GDelegPayElem) dup.del(del()); return dup; } @Override - public GDelegationElem visitChildren(AstVisitor nv) throws ScribException + public GDelegPayElem visitChildren(AstVisitor nv) throws ScribException { GProtoNameNode name = (GProtoNameNode) visitChild(getProtocolChild(), nv); diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java index 2d034bf1e..b49ef82ce 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java @@ -42,7 +42,7 @@ public GProtoNameNode getProtocolNameNode() } @Override - public GProtocolDecl getTargetProtocolDecl(LangContext jcontext, + public GProtoDecl getTargetProtocolDecl(LangContext jcontext, ModuleContext mcontext) { GProtocolName fullname = getTargetProtocolDeclFullName(mcontext); diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GMessageTransfer.java b/scribble-ast/src/main/java/org/scribble/ast/global/GMsgTransfer.java similarity index 85% rename from scribble-ast/src/main/java/org/scribble/ast/global/GMessageTransfer.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GMsgTransfer.java index f4b3bfb9a..727ea9eee 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GMessageTransfer.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GMsgTransfer.java @@ -20,25 +20,25 @@ import org.scribble.core.type.kind.Global; import org.scribble.util.Constants; -public class GMessageTransfer extends MessageTransfer +public class GMsgTransfer extends MessageTransfer implements GSimpleSessionNode { // ScribTreeAdaptor#create constructor - public GMessageTransfer(Token t) + public GMsgTransfer(Token t) { super(t); } // Tree#dupNode constructor - public GMessageTransfer(GMessageTransfer node) + public GMsgTransfer(GMsgTransfer node) { super(node); } @Override - public GMessageTransfer dupNode() + public GMsgTransfer dupNode() { - return new GMessageTransfer(this); + return new GMsgTransfer(this); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoBlock.java similarity index 81% rename from scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GProtoBlock.java index e02f09e7d..0d4601ece 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoBlock.java @@ -17,16 +17,16 @@ import org.scribble.ast.ProtocolBlock; import org.scribble.core.type.kind.Global; -public class GProtocolBlock extends ProtocolBlock implements GScribNode +public class GProtoBlock extends ProtocolBlock implements GScribNode { // ScribTreeAdaptor#create constructor - public GProtocolBlock(Token t) + public GProtoBlock(Token t) { super(t); } // Tree#dupNode constructor - protected GProtocolBlock(GProtocolBlock node) + protected GProtoBlock(GProtoBlock node) { super(node); } @@ -38,8 +38,8 @@ public GInteractionSeq getInteractSeqChild() } @Override - public GProtocolBlock dupNode() + public GProtoBlock dupNode() { - return new GProtocolBlock(this); + return new GProtoBlock(this); } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDecl.java similarity index 72% rename from scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GProtoDecl.java index 7c74d7a6c..767e16d4b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDecl.java @@ -15,41 +15,41 @@ import org.antlr.runtime.Token; import org.scribble.ast.Module; -import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.ProtoDecl; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtocolName; -public class GProtocolDecl extends ProtocolDecl implements GScribNode +public class GProtoDecl extends ProtoDecl implements GScribNode { // ScribTreeAdaptor#create constructor - public GProtocolDecl(Token t) + public GProtoDecl(Token t) { super(t); } // Tree#dupNode constructor - protected GProtocolDecl(GProtocolDecl node) + protected GProtoDecl(GProtoDecl node) { super(node); } @Override - public GProtocolHeader getHeaderChild() + public GProtoHeader getHeaderChild() { - return (GProtocolHeader) getChild(ProtocolDecl.HEADER_CHILD); + return (GProtoHeader) getChild(ProtoDecl.HEADER_CHILD); } @Override - public GProtocolDef getDefChild() + public GProtoDef getDefChild() { - return (GProtocolDef) getChild(ProtocolDecl.DEF_CHILD); + return (GProtoDef) getChild(ProtoDecl.DEF_CHILD); } // Cf. CommonTree#dupNode @Override - public GProtocolDecl dupNode() + public GProtoDecl dupNode() { - return new GProtocolDecl(this); + return new GProtoDecl(this); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDef.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDef.java similarity index 73% rename from scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDef.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GProtoDef.java index 032ae0188..22578f08b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolDef.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDef.java @@ -17,29 +17,29 @@ import org.scribble.ast.ProtocolDef; import org.scribble.core.type.kind.Global; -public class GProtocolDef extends ProtocolDef implements GScribNode +public class GProtoDef extends ProtocolDef implements GScribNode { // ScribTreeAdaptor#create constructor - public GProtocolDef(Token t) + public GProtoDef(Token t) { super(t); } // Tree#dupNode constructor - protected GProtocolDef(GProtocolDef node) + protected GProtoDef(GProtoDef node) { super(node); } @Override - public GProtocolBlock getBlockChild() + public GProtoBlock getBlockChild() { - return (GProtocolBlock) getChild(ProtocolDef.BLOCK_CHILD_INDEX); + return (GProtoBlock) getChild(ProtocolDef.BLOCK_CHILD_INDEX); } @Override - public GProtocolDef dupNode() + public GProtoDef dupNode() { - return new GProtocolDef(this); + return new GProtoDef(this); } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoHeader.java similarity index 85% rename from scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java rename to scribble-ast/src/main/java/org/scribble/ast/global/GProtoHeader.java index 9ed138e05..4342aad87 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtocolHeader.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoHeader.java @@ -20,24 +20,24 @@ import org.scribble.core.type.name.GProtocolName; import org.scribble.util.Constants; -public class GProtocolHeader extends ProtocolHeader implements GScribNode +public class GProtoHeader extends ProtocolHeader implements GScribNode { // ScribTreeAdaptor#create constructor - public GProtocolHeader(Token t) + public GProtoHeader(Token t) { super(t); } // Tree#dupNode constructor - protected GProtocolHeader(GProtocolHeader node) + protected GProtoHeader(GProtoHeader node) { super(node); } @Override - public GProtocolHeader dupNode() + public GProtoHeader dupNode() { - return new GProtocolHeader(this); + return new GProtoHeader(this); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java b/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java index f643b38bf..3298a2f15 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java @@ -34,9 +34,9 @@ protected GRecursion(GRecursion node) } @Override - public GProtocolBlock getBlockChild() + public GProtoBlock getBlockChild() { - return (GProtocolBlock) getChild(Recursion.BODY_CHILD_INDEX); + return (GProtoBlock) getChild(Recursion.BODY_CHILD_INDEX); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/PayloadElemNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/PayElemNameNode.java similarity index 94% rename from scribble-ast/src/main/java/org/scribble/ast/name/PayloadElemNameNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/PayElemNameNode.java index b7dcd8716..c266c0a4a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/PayloadElemNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/PayElemNameNode.java @@ -21,7 +21,7 @@ // A datatype kind node: DataTypeNode or NonRoleParameterNode -- not necessarily simple nor qualified // Actually, datatype or global protocol kind, if delegation supported -- for "structural delegation" this would not directly be a name node any more (like MessageNode) //public interface PayloadElemNameNode extends NonRoleArgNode -public interface PayloadElemNameNode extends NonRoleArgNode +public interface PayElemNameNode extends NonRoleArgNode { //PayloadType toPayloadType(); //PayloadType toPayloadType(); // Currently can assume the only possible kind is DataTypeKind (delegation is by (non-ambig) delegationelem) diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java index 7d1167114..064c8f66d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java @@ -14,14 +14,14 @@ package org.scribble.ast.name.qualified; import org.antlr.runtime.Token; -import org.scribble.ast.name.PayloadElemNameNode; +import org.scribble.ast.name.PayElemNameNode; import org.scribble.core.type.kind.DataTypeKind; import org.scribble.core.type.name.DataType; import org.scribble.core.type.session.Arg; //public class DataTypeNode extends MemberNameNode implements PayloadElemNameNode public class DataNameNode extends MemberNameNode - implements PayloadElemNameNode + implements PayElemNameNode { // ScribTreeAdaptor#create constructor public DataNameNode(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java index fe4819948..a0b6813f6 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java @@ -15,13 +15,13 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.name.PayloadElemNameNode; +import org.scribble.ast.name.PayElemNameNode; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.LProtocolName; import org.scribble.core.type.session.Arg; public class LProtoNameNode extends ProtocolNameNode - implements PayloadElemNameNode + implements PayElemNameNode { // ScribTreeAdaptor#create constructor public LProtoNameNode(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java index fba791797..8353d3f7a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java @@ -14,12 +14,12 @@ package org.scribble.ast.name.qualified; import org.antlr.runtime.Token; -import org.scribble.ast.MessageNode; +import org.scribble.ast.MsgNode; import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.MessageSigName; public class SigNameNode extends MemberNameNode - implements MessageNode + implements MsgNode { // ScribTreeAdaptor#create constructor public SigNameNode(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index 287a20fc3..a02f0f322 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -14,8 +14,8 @@ package org.scribble.ast.name.simple; import org.antlr.runtime.Token; -import org.scribble.ast.MessageNode; -import org.scribble.ast.name.PayloadElemNameNode; +import org.scribble.ast.MsgNode; +import org.scribble.ast.name.PayElemNameNode; import org.scribble.core.type.kind.AmbigKind; import org.scribble.core.type.kind.DataTypeKind; import org.scribble.core.type.kind.NonRoleArgKind; @@ -26,7 +26,7 @@ // Primitive payload type, MessageSigName or parameter names only: if name is parsed as a CompoundNameNodes, it must be a payload type (not ambiguous in this case) public class AmbigNameNode extends SimpleNameNode - implements MessageNode, PayloadElemNameNode // FIXME: currently hardcoded to DataTypeKind for payload elems ? + implements MsgNode, PayElemNameNode // FIXME: currently hardcoded to DataTypeKind for payload elems ? { // Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] // N.B. ttype (an "imaginary node" type) is discarded, t is a ScribbleParser.ID token type diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java index 1b3a9c7e2..19bd1ca37 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java @@ -14,12 +14,12 @@ package org.scribble.ast.name.simple; import org.antlr.runtime.Token; -import org.scribble.ast.name.PayloadElemNameNode; +import org.scribble.ast.name.PayElemNameNode; import org.scribble.core.type.kind.DataTypeKind; import org.scribble.core.type.name.DataType; public class DataParamNode extends NonRoleParamNode - implements PayloadElemNameNode // As a payload, can only be a DataType (so hardcode) + implements PayElemNameNode // As a payload, can only be a DataType (so hardcode) { // Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] // N.B. ttype (an "imaginary node" type) is discarded, t is a ScribbleParser.ID token type diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java index 0d0831b06..226850b02 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java @@ -14,12 +14,12 @@ package org.scribble.ast.name.simple; import org.antlr.runtime.Token; -import org.scribble.ast.MessageNode; +import org.scribble.ast.MsgNode; import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.MessageSigName; public class SigParamNode extends NonRoleParamNode - implements MessageNode + implements MsgNode { // Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] // N.B. ttype (an "imaginary node" type) is discarded, t is a ScribbleParser.ID token type diff --git a/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java b/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java index 4d71f32e7..27f35f2fe 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java +++ b/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java @@ -14,37 +14,37 @@ package org.scribble.del; import org.scribble.ast.AuxMod; -import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.DataDecl; import org.scribble.ast.ExplicitMod; import org.scribble.ast.ImportModule; -import org.scribble.ast.MessageSigNameDecl; -import org.scribble.ast.MessageSigNode; +import org.scribble.ast.SigDecl; +import org.scribble.ast.SigLitNode; import org.scribble.ast.Module; import org.scribble.ast.ModuleDecl; import org.scribble.ast.NonRoleArg; import org.scribble.ast.NonRoleArgList; import org.scribble.ast.NonRoleParamDeclList; -import org.scribble.ast.PayloadElemList; -import org.scribble.ast.ProtocolModList; +import org.scribble.ast.PayElemList; +import org.scribble.ast.ProtoModList; import org.scribble.ast.RoleArg; import org.scribble.ast.RoleArgList; import org.scribble.ast.RoleDecl; import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScribNode; import org.scribble.ast.SigParamDecl; -import org.scribble.ast.TypeParamDecl; -import org.scribble.ast.UnaryPayloadElem; +import org.scribble.ast.DataParamDecl; +import org.scribble.ast.UnaryPayElem; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; import org.scribble.ast.global.GContinue; import org.scribble.ast.global.GDisconnect; import org.scribble.ast.global.GDo; import org.scribble.ast.global.GInteractionSeq; -import org.scribble.ast.global.GMessageTransfer; -import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ast.global.GProtocolDef; -import org.scribble.ast.global.GProtocolHeader; +import org.scribble.ast.global.GMsgTransfer; +import org.scribble.ast.global.GProtoBlock; +import org.scribble.ast.global.GProtoDecl; +import org.scribble.ast.global.GProtoDef; +import org.scribble.ast.global.GProtoHeader; import org.scribble.ast.global.GRecursion; import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.qualified.GProtoNameNode; @@ -61,6 +61,8 @@ import org.scribble.ast.name.simple.DataParamNode; +// Use after ANTLR parsing (specifically, ScribTreeAdaptor) -- not needed for AstFactory constructions +// (Perhaps could integrate with ScribTreeAdaptor, but easier to do after -- AST construction technically may further create/dup nodes during the ongoing pass) // A dec method for each AST class -- method name must be the same as target class name // Implementations (DelDecoratorImpl) in scribble-parser, can depend on parser implementation // E.g., DelDecoratorImpl: each method named after the class name -- currently dispatched by reflection @@ -79,59 +81,56 @@ public interface DelDecorator void SigParamNode(SigParamNode n); void DataNameNode(DataNameNode n); - void ModuleNameNode(ModuleNameNode n); void GProtoNameNode(GProtoNameNode n); void LProtoNameNode(LProtoNameNode n); + void ModuleNameNode(ModuleNameNode n); void SigNameNode(SigNameNode n); void Module(Module m); - void ModuleDecl(ModuleDecl n); void ImportModule(ImportModule n); - void MessageSigNameDecl(MessageSigNameDecl n); - void DataTypeDecl(DataTypeDecl n); + void DataDecl(DataDecl n); + void SigDecl(SigDecl n); + void GProtoDecl(GProtoDecl n); - void GProtocolDecl(GProtocolDecl n); - void ProtocolModList(ProtocolModList n); + void ProtoModList(ProtoModList n); void AuxMod(AuxMod n); void ExplicitMod(ExplicitMod n); - void GProtocolHeader(GProtocolHeader n); + void GProtoHeader(GProtoHeader n); void RoleDeclList(RoleDeclList n); void RoleDecl(RoleDecl n); void NonRoleParamDeclList(NonRoleParamDeclList n); - // NonRoleParamDecl NonRoleParamDecl(CommonTree source, K kind, NonRoleParamNode name); - void TypeParamDecl(TypeParamDecl n); + void DataParamDecl(DataParamDecl n); void SigParamDecl(SigParamDecl n); - void GProtocolDef(GProtocolDef n); - void GProtocolBlock(GProtocolBlock n); + void GProtoDef(GProtoDef n); + void GProtoBlock(GProtoBlock n); void GInteractionSeq(GInteractionSeq n); + + void SigLitNode(SigLitNode n); + void PayElemList(PayElemList n); + void UnaryPayElem(UnaryPayElem n); + /*GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode name, RoleNode role); + LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode name);*/ - void GMessageTransfer(GMessageTransfer n); void GConnect(GConnect n); void GDisconnect(GDisconnect n); + void GMsgTransfer(GMsgTransfer n); /*GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest);*/ - void GChoice(GChoice n); - void GRecursion(GRecursion n); + void GContinue(GContinue n); void GDo(GDo n); - void MessageSigNode(MessageSigNode n); - void PayloadElemList(PayloadElemList n); - void UnaryPayloadElem(UnaryPayloadElem n); - /*GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode name, RoleNode role); - LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode name);*/ - void RoleArgList(RoleArgList n); void RoleArg(RoleArg r); void NonRoleArgList(NonRoleArgList n); void NonRoleArg(NonRoleArg n); - /* NameNode SimpleNameNode(CommonTree source, K kind, String identifier); - QualifiedNameNode QualifiedNameNode(CommonTree source, K kind, String... elems);*/ - + void GChoice(GChoice n); + void GRecursion(GRecursion n); +} @@ -176,4 +175,3 @@ public interface DelDecorator LRecursion LRecursion(CommonTree source, RecVarNode recvar, LProtocolBlock block); LContinue LContinue(CommonTree source, RecVarNode recvar); LDo LDo(CommonTree source, RoleArgList roles, NonRoleArgList args, LProtocolNameNode proto);*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java index 3903c2ab4..dce07930b 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java @@ -18,9 +18,9 @@ import org.scribble.ast.Do; import org.scribble.ast.DoArgList; -import org.scribble.ast.HeaderParamDeclList; +import org.scribble.ast.ParamDeclList; import org.scribble.ast.Module; -import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.ProtoDecl; import org.scribble.ast.ScribNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.name.ProtocolName; @@ -43,8 +43,8 @@ public DoArgList leaveDisambiguation(ScribNode child, ScribNode parent = child.getParent(); DoArgList dal = (DoArgList) visited; List args = dal.getArgChildren(); - ProtocolDecl pd = getTargetProtocolDecl((Do) parent, disamb); - if (args.size() != getDeclList(pd).getParamDeclChildren().size()) + ProtoDecl pd = getTargetProtocolDecl((Do) parent, disamb); + if (args.size() != getDeclList(pd).getDeclChildren().size()) { throw new ScribException(child.getSource(), "Do arity mismatch for " + pd.getHeaderChild() + ": " + args); @@ -54,7 +54,7 @@ public DoArgList leaveDisambiguation(ScribNode child, } // Not using Do#getTargetProtocolDecl, because that currently relies on namedisamb pass to convert targets to fullnames (because it just gets the full name dependency, it doesn't do visible name resolution) - protected ProtocolDecl getTargetProtocolDecl(Do parent, + protected ProtoDecl getTargetProtocolDecl(Do parent, NameDisambiguator disamb) throws ScribException { ModuleContext mc = disamb.getModuleContext(); @@ -68,7 +68,7 @@ protected ProtocolDecl getTargetProtocolDecl(Do parent, ProtocolName fullname = mc.getVisibleProtocolDeclFullName(pn); // Lookup in visible names -- not deps, because do target name not disambiguated yet (will be done later this pass) Module mod = jc.getModule(fullname.getPrefix()); //return mod.getProtocolDeclChild(pn.getSimpleName()); - List> pd = mod.getProtoDeclChildren().stream() + List> pd = mod.getProtoDeclChildren().stream() .filter( // cf. Module::hasProtocolDecl x -> x.getHeaderChild().getDeclName().equals(pn.getSimpleName())) .collect(Collectors.toList()); @@ -79,6 +79,6 @@ protected ProtocolDecl getTargetProtocolDecl(Do parent, return pd.get(0); } - protected abstract HeaderParamDeclList getDeclList( - ProtocolDecl pd); + protected abstract ParamDeclList getDeclList( + ProtoDecl pd); } diff --git a/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java b/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java index 406579179..d679f2e42 100644 --- a/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/HeaderParamDeclListDel.java @@ -15,8 +15,8 @@ import java.util.List; -import org.scribble.ast.HeaderParamDecl; -import org.scribble.ast.HeaderParamDeclList; +import org.scribble.ast.ParamDecl; +import org.scribble.ast.ParamDeclList; import org.scribble.ast.ScribNode; import org.scribble.util.ScribException; import org.scribble.visit.NameDisambiguator; @@ -30,11 +30,11 @@ public HeaderParamDeclListDel() // Doing in leave allows the arguments to be individually checked first @Override - public HeaderParamDeclList leaveDisambiguation(ScribNode child, + public ParamDeclList leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { - HeaderParamDeclList pdl = (HeaderParamDeclList) visited; - List> decls = pdl.getParamDeclChildren(); + ParamDeclList pdl = (ParamDeclList) visited; + List> decls = pdl.getDeclChildren(); // grammar enforces RoleDeclList size > 0 if (decls.size() != decls.stream().map(d -> d.getDeclName()).distinct() .count()) diff --git a/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java b/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java index 8dab67fbb..28e26125a 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ModuleDel.java @@ -20,8 +20,8 @@ import java.util.stream.Collectors; import org.scribble.ast.Module; -import org.scribble.ast.NonProtocolDecl; -import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.NonProtoDecl; +import org.scribble.ast.ProtoDecl; import org.scribble.ast.ScribNode; import org.scribble.util.ScribException; import org.scribble.visit.NameDisambiguator; @@ -39,7 +39,7 @@ public Module leaveDisambiguation(ScribNode child, NameDisambiguator disamb, { Module mod = (Module) visited; // Imports checked in ModuleContext -- that is built before disamb is run - List> npds = mod.getNonProtoDeclChildren(); + List> npds = mod.getNonProtoDeclChildren(); List npdnames = npds.stream() .map(x -> x.getDeclName().toString()) .collect(Collectors.toList()); @@ -47,14 +47,14 @@ public Module leaveDisambiguation(ScribNode child, NameDisambiguator disamb, final Set dups1 = getDuplicates(npdnames); if (!dups1.isEmpty()) { - NonProtocolDecl first = + NonProtoDecl first = npds.stream() .filter(x -> dups1.contains(x.getDeclName().toString())) .collect(Collectors.toList()).get(0); throw new ScribException(first.getSource(), "Duplicate non-protocol decls: " + first.getDeclName()); } - List> pds = mod.getProtoDeclChildren(); + List> pds = mod.getProtoDeclChildren(); List pdnames = pds.stream() .map(pd -> pd.getHeaderChild().getDeclName().toString()) .collect(Collectors.toList()); @@ -63,7 +63,7 @@ public Module leaveDisambiguation(ScribNode child, NameDisambiguator disamb, if (pds.size() != pdnames.stream().distinct().count()) if (!dups2.isEmpty()) { - ProtocolDecl first = + ProtoDecl first = pds.stream() .filter(x -> dups2 .contains(x.getHeaderChild().getDeclName().toString())) diff --git a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java index b0b0e83e4..6bb950cec 100644 --- a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java @@ -21,7 +21,7 @@ import org.scribble.ast.NonRoleArgNode; import org.scribble.ast.NonRoleParamDecl; import org.scribble.ast.NonRoleParamDeclList; -import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.ProtoDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.NonRoleParamNode; import org.scribble.core.type.kind.DataTypeKind; @@ -47,10 +47,10 @@ public NonRoleArgList leaveDisambiguation(ScribNode child, // Checks matching arity Do parent = (Do) child.getParent(); - ProtocolDecl pd = getTargetProtocolDecl((Do) parent, disamb); + ProtoDecl pd = getTargetProtocolDecl((Do) parent, disamb); Iterator args = nral.getArgChildren().iterator(); for (NonRoleParamDecl param : pd.getHeaderChild().getParamDeclListChild() - .getParamDeclChildren()) + .getDeclChildren()) { NonRoleParamKind pkind = param.kind; NonRoleArg arg = args.next(); @@ -89,7 +89,7 @@ else if (pkind.equals(DataTypeKind.KIND)) } @Override - protected NonRoleParamDeclList getDeclList(ProtocolDecl pd) + protected NonRoleParamDeclList getDeclList(ProtoDecl pd) { return pd.getHeaderChild().getParamDeclListChild(); } diff --git a/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java index b4a76ed3f..aa2513fec 100644 --- a/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/RoleArgListDel.java @@ -15,7 +15,7 @@ import java.util.List; -import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.ProtoDecl; import org.scribble.ast.RoleArgList; import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScribNode; @@ -48,7 +48,7 @@ public RoleArgList leaveDisambiguation(ScribNode child, } @Override - protected RoleDeclList getDeclList(ProtocolDecl pd) + protected RoleDeclList getDeclList(ProtoDecl pd) { return pd.getHeaderChild().getRoleDeclListChild(); } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java index 329bdac14..6e0b124ca 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -18,7 +18,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GChoice; -import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.global.GProtoBlock; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.global.GSeq; import org.scribble.del.ChoiceDel; @@ -35,7 +35,7 @@ public org.scribble.core.type.session.global.GChoice translate(ScribNode n, GChoice source = (GChoice) n; Role subj = source.getSubjectChild().toName(); List blocks = new LinkedList<>(); - for (GProtocolBlock b : source.getBlockChildren()) + for (GProtoBlock b : source.getBlockChildren()) { blocks.add((GSeq) b.visitWith(t)); } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java index 984c38eed..9d1e2688f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -17,9 +17,9 @@ import java.util.List; import java.util.stream.Collectors; -import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.ProtoDecl; import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GDelegationElem; +import org.scribble.ast.global.GDelegPayElem; import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.RoleNode; @@ -44,7 +44,7 @@ public void enterDisambiguation(ScribNode child, NameDisambiguator disamb) throws ScribException { ModuleContext mc = disamb.getModuleContext(); - GDelegationElem de = (GDelegationElem) child; + GDelegPayElem de = (GDelegPayElem) child; GProtoNameNode proto = de.getProtocolChild(); GProtocolName gpn = proto.toName(); if (!mc.isVisibleProtocolDeclName(gpn)) @@ -56,8 +56,8 @@ public void enterDisambiguation(ScribNode child, // Duplicated from DoDel //@Override - public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, // CHECKME: why "visitFor" pattern? - GDelegationElem de) throws ScribException + public GDelegPayElem visitForNameDisambiguation(NameDisambiguator disamb, // CHECKME: why "visitFor" pattern? + GDelegPayElem de) throws ScribException { ModuleContext mc = disamb.getModuleContext(); GProtocolName fullname = (GProtocolName) mc @@ -65,7 +65,7 @@ public GDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, // RoleNode r = de.getRoleChild(); Role rn = r.toName(); - ProtocolDecl gpd = disamb.lang.getContext() + ProtoDecl gpd = disamb.lang.getContext() .getModule(fullname.getPrefix()) .getGProtocolDeclChild(fullname.getSimpleName()); if (!gpd.getHeaderChild().getRoleDeclListChild().getRoles().contains(rn)) diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java index dc8230ca3..63f140ae6 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -16,7 +16,7 @@ import java.util.List; import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GMessageTransfer; +import org.scribble.ast.global.GMsgTransfer; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; @@ -37,7 +37,7 @@ public GMessageTransferDel() public ScribNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { - GMessageTransfer gmt = (GMessageTransfer) visited; + GMsgTransfer gmt = (GMsgTransfer) visited; Role src = gmt.getSourceChild().toName(); List dests = gmt.getDestinationRoles(); if (dests.contains(src)) @@ -53,7 +53,7 @@ public ScribNode leaveDisambiguation(ScribNode child, public org.scribble.core.type.session.global.GMessageTransfer translate(ScribNode n, GTypeTranslator t) throws ScribException { - GMessageTransfer source = (GMessageTransfer) n; + GMsgTransfer source = (GMsgTransfer) n; Role src = source.getSourceChild().toName(); List ds = source.getDestinationChildren(); if (ds.size() > 1) diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java index 53621fb4b..fa252f565 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java @@ -14,7 +14,7 @@ package org.scribble.del.global; import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.global.GProtoBlock; import org.scribble.core.type.session.global.GSeq; import org.scribble.del.ProtocolBlockDel; import org.scribble.util.ScribException; @@ -26,6 +26,6 @@ public class GProtocolBlockDel extends ProtocolBlockDel implements GDel public GSeq translate(ScribNode n, GTypeTranslator t) throws ScribException { - return (GSeq) ((GProtocolBlock) n).getInteractSeqChild().visitWith(t); + return (GSeq) ((GProtoBlock) n).getInteractSeqChild().visitWith(t); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 5b762e823..014b3053b 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -18,7 +18,7 @@ import org.scribble.ast.Module; import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ast.global.GProtoDecl; import org.scribble.core.lang.ProtocolMod; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.kind.Global; @@ -42,7 +42,7 @@ public GProtocolDeclDel() public GProtocol translate(ScribNode n, GTypeTranslator t) throws ScribException { - GProtocolDecl source = (GProtocolDecl) n; + GProtoDecl source = (GProtoDecl) n; Module m = (Module) n.getParent(); List mods = source.getModifierListChild().getModList().stream() .map(x -> ProtocolMod.fromAst(x)).collect(Collectors.toList()); diff --git a/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java index 67772a6a7..43e85c5d3 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java @@ -14,7 +14,7 @@ package org.scribble.del.name.qualified; import org.antlr.runtime.CommonToken; -import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.DataDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.simple.IdNode; @@ -37,7 +37,7 @@ public ScribNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { ScribNode parent = child.getParent(); - if (parent instanceof DataTypeDecl) // Hacky? don't want to do for decl simplenames (generally, don't do if parent is namedeclnode) + if (parent instanceof DataDecl) // Hacky? don't want to do for decl simplenames (generally, don't do if parent is namedeclnode) { return visited; } diff --git a/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java index 39fe3aef0..d9333b1af 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java @@ -14,7 +14,7 @@ package org.scribble.del.name.qualified; import org.antlr.runtime.CommonToken; -import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.SigDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.simple.IdNode; @@ -37,7 +37,7 @@ public ScribNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { ScribNode parent = child.getParent(); - if (parent instanceof MessageSigNameDecl) // Hacky? don't want to do for decl simplenames (generally, don't do if parent is namedeclnode) + if (parent instanceof SigDecl) // Hacky? don't want to do for decl simplenames (generally, don't do if parent is namedeclnode) { return visited; } diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java index f67b411e1..dac0dae6a 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java @@ -16,7 +16,7 @@ import java.util.stream.Collectors; import org.scribble.ast.MessageTransfer; -import org.scribble.ast.PayloadElem; +import org.scribble.ast.PayElem; import org.scribble.ast.ScribNode; import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.qualified.SigNameNode; @@ -75,7 +75,7 @@ public ScribNode leaveDisambiguation(ScribNode child, } else if (mcontext.isMessageSigNameVisible(name.toMessageSigName())) { - if (parent instanceof PayloadElem) // FIXME HACK + if (parent instanceof PayElem) // FIXME HACK { throw new ScribException(ann.getSource(), "Invalid occurrence of message signature name: " + parent); diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/lang/Lang.java index 0e8d4a274..154c90857 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/lang/Lang.java @@ -19,7 +19,7 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Module; -import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ast.global.GProtoDecl; import org.scribble.core.job.Job; import org.scribble.core.job.JobArgs; import org.scribble.core.lang.global.GProtocol; @@ -101,7 +101,7 @@ public final Job getJob() throws ScribException for (ModuleName fullname : parsed.keySet()) { GTypeTranslator t = newTranslator(fullname); - for (GProtocolDecl gpd : parsed.get(fullname).getGProtoDeclChildren()) + for (GProtoDecl gpd : parsed.get(fullname).getGProtoDeclChildren()) { GProtocol g = (GProtocol) gpd.visitWith(t); imeds.add(g); diff --git a/scribble-ast/src/main/java/org/scribble/lang/LangContext.java b/scribble-ast/src/main/java/org/scribble/lang/LangContext.java index f2006cedd..4f010c4fd 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/LangContext.java +++ b/scribble-ast/src/main/java/org/scribble/lang/LangContext.java @@ -20,7 +20,7 @@ import java.util.Set; import org.scribble.ast.Module; -import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ast.global.GProtoDecl; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.name.GProtocolName; import org.scribble.core.type.name.ModuleName; @@ -83,7 +83,7 @@ public Map getParsed() return Collections.unmodifiableMap(this.parsed); } - public GProtocolDecl getParsed(GProtocolName fullname) + public GProtoDecl getParsed(GProtocolName fullname) { return this.parsed.get(fullname.getPrefix()) .getGProtoDeclChildren().stream().filter(x -> x.getHeaderChild() diff --git a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java index cbe53cc27..bed9ad1dc 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java +++ b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java @@ -15,13 +15,13 @@ import java.util.Map; -import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.DataDecl; import org.scribble.ast.ImportDecl; import org.scribble.ast.ImportModule; -import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.SigDecl; import org.scribble.ast.Module; -import org.scribble.ast.NonProtocolDecl; -import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ast.NonProtoDecl; +import org.scribble.ast.global.GProtoDecl; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.lang.context.ScribNames; import org.scribble.core.type.name.DataType; @@ -86,22 +86,22 @@ private static void addModule(ScribNames names, Module mod, ModuleName modname) throws ScribException { names.modules.put(modname, mod.getFullModuleName()); - for (NonProtocolDecl npd : mod.getNonProtoDeclChildren()) + for (NonProtoDecl npd : mod.getNonProtoDeclChildren()) { if (npd.isDataTypeDecl()) { - DataTypeDecl dtd = (DataTypeDecl) npd; + DataDecl dtd = (DataDecl) npd; DataType qualif = new DataType(modname, dtd.getDeclName()); names.data.put(qualif, dtd.getFullMemberName(mod)); } else //if (npd.isMessageSigNameDecl()) { - MessageSigNameDecl msnd = (MessageSigNameDecl) npd; + SigDecl msnd = (SigDecl) npd; MessageSigName qualif = new MessageSigName(modname, msnd.getDeclName()); names.sigs.put(qualif, msnd.getFullMemberName(mod)); } } - for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) + for (GProtoDecl gpd : mod.getGProtoDeclChildren()) { GProtocolName qualif = new GProtocolName(modname, gpd.getHeaderChild().getDeclName()); @@ -126,7 +126,7 @@ private void addImportDependencies(Map parsed, Module mod) addImportDependencies(parsed, imported); // FIXME: also do for npds -- factor out with below - for (GProtocolDecl gpd : imported.getGProtoDeclChildren()) + for (GProtoDecl gpd : imported.getGProtoDeclChildren()) { GProtocolName fullname = gpd.getFullMemberName(root); this.visible.globals.put(fullname, fullname); @@ -169,11 +169,11 @@ private void addVisible(Map parsed, Module root) } } - for (NonProtocolDecl npd : root.getNonProtoDeclChildren()) + for (NonProtoDecl npd : root.getNonProtoDeclChildren()) { if (npd.isDataTypeDecl()) { - DataTypeDecl dtd = (DataTypeDecl) npd; + DataDecl dtd = (DataDecl) npd; DataType visname = new DataType(dtd.getDeclName().toString()); DataType fullname = dtd.getFullMemberName(root); this.visible.data.put(fullname, fullname); @@ -181,7 +181,7 @@ private void addVisible(Map parsed, Module root) } else // if (npd.isMessageSigNameDecl()) { - MessageSigNameDecl msnd = (MessageSigNameDecl) npd; + SigDecl msnd = (SigDecl) npd; MessageSigName fullname = msnd.getFullMemberName(root); MessageSigName visname = new MessageSigName( msnd.getDeclName().toString()); @@ -190,7 +190,7 @@ private void addVisible(Map parsed, Module root) } } - for (GProtocolDecl gpd : root.getGProtoDeclChildren()) + for (GProtoDecl gpd : root.getGProtoDeclChildren()) { GProtocolName visname = new GProtocolName( gpd.getHeaderChild().getDeclName().toString()); diff --git a/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java b/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java index 20b7853a7..8b4ff22f5 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java @@ -19,7 +19,7 @@ import java.util.Set; import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GDelegationElem; +import org.scribble.ast.global.GDelegPayElem; import org.scribble.core.type.kind.NonRoleArgKind; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.Name; @@ -70,10 +70,10 @@ public ScribNode visit(ScribNode child) throws ScribException // CHECKME: why "visitFor" pattern? protected ScribNode visitForDisamb(ScribNode child) throws ScribException { - if (child instanceof GDelegationElem) + if (child instanceof GDelegPayElem) { return ((GDelegationElemDel) child.del()).visitForNameDisambiguation(this, - (GDelegationElem) child); + (GDelegPayElem) child); } else { diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index cc6b5998a..4ea451f33 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -26,8 +26,8 @@ import java.util.stream.Collectors; import org.scribble.ast.Module; -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ast.ProtoDecl; +import org.scribble.ast.global.GProtoDecl; import org.scribble.codegen.java.JEndpointApiGenerator; import org.scribble.codegen.java.callbackapi.CBEndpointApiGenerator3; import org.scribble.core.job.Job; @@ -400,7 +400,7 @@ private EGraph getEGraph(Lang lang, GProtocolName fullname, Role role, { LangContext langc = lang.getContext(); JobContext jobc = lang.getJob().getContext(); - GProtocolDecl gpd = langc.getMainModule() + GProtoDecl gpd = langc.getMainModule() .getGProtocolDeclChild(fullname.getSimpleName()); if (gpd == null || !gpd.getHeaderChild().getRoleDeclListChild().getRoles() .contains(role)) @@ -517,7 +517,7 @@ protected static GProtocolName checkGlobalProtocolArg(LangContext langc, { throw new CommandLineException("Global protocol not found: " + simpname); } - ProtocolDecl pd = main.getGProtocolDeclChild(simpgpn); + ProtoDecl pd = main.getGProtocolDeclChild(simpgpn); if (pd == null || !pd.isGlobal()) { throw new CommandLineException("Global protocol not found: " + simpname); @@ -533,7 +533,7 @@ protected static GProtocolName checkGlobalProtocolArg(LangContext langc, protected static Role checkRoleArg(LangContext langc, GProtocolName fullname, String rolename) throws CommandLineException { - ProtocolDecl pd = langc.getMainModule() + ProtoDecl pd = langc.getMainModule() .getGProtocolDeclChild(fullname.getSimpleName()); Role role = new Role(rolename); if (!pd.getHeaderChild().getRoleDeclListChild().getRoles().contains(role)) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 594a0100c..b5b314924 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -22,8 +22,8 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import org.scribble.ast.DataTypeDecl; -import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.DataDecl; +import org.scribble.ast.SigDecl; import org.scribble.ast.Module; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.core.job.Job; @@ -251,15 +251,15 @@ public Map buildEndpointClass() throws ScribException res.put(mprefix + "interfaces/" + messageIfName + ".java", messageInterface);*/ boolean isSig = main.getNonProtoDeclChildren().stream() - .anyMatch(npd -> (npd instanceof MessageSigNameDecl) - && ((MessageSigNameDecl) npd).getDeclName().toString() + .anyMatch(npd -> (npd instanceof SigDecl) + && ((SigDecl) npd).getDeclName().toString() .equals(a.mid.toString())); - MessageSigNameDecl msnd = null; + SigDecl msnd = null; if (isSig) { - msnd = (MessageSigNameDecl) main.getNonProtoDeclChildren().stream() - .filter(npd -> (npd instanceof MessageSigNameDecl) - && ((MessageSigNameDecl) npd).getDeclName().toString() + msnd = (SigDecl) main.getNonProtoDeclChildren().stream() + .filter(npd -> (npd instanceof SigDecl) + && ((SigDecl) npd).getDeclName().toString() .equals(a.mid.toString())) .iterator().next(); } @@ -300,7 +300,7 @@ public Map buildEndpointClass() throws ScribException int i = 1; for (PayloadElemType pet : a.payload.elems) { - DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pet); + DataDecl dtd = main.getDataTypeDeclChild((DataType) pet); messageClass += ", " + dtd.getExtName() + " arg" + i++; } } @@ -416,15 +416,15 @@ public Map buildEndpointClass() throws ScribException receiveInterface += "public interface " + receiveIfName + " {\n"; // FIXME: factor out boolean isSig = main.getNonProtoDeclChildren().stream() - .anyMatch(npd -> (npd instanceof MessageSigNameDecl) - && ((MessageSigNameDecl) npd).getDeclName().toString() + .anyMatch(npd -> (npd instanceof SigDecl) + && ((SigDecl) npd).getDeclName().toString() .equals(a.mid.toString())); - MessageSigNameDecl msnd = null; + SigDecl msnd = null; if (isSig) { - msnd = (MessageSigNameDecl) main.getNonProtoDeclChildren().stream() - .filter(npd -> (npd instanceof MessageSigNameDecl) - && ((MessageSigNameDecl) npd).getDeclName().toString() + msnd = (SigDecl) main.getNonProtoDeclChildren().stream() + .filter(npd -> (npd instanceof SigDecl) + && ((SigDecl) npd).getDeclName().toString() .equals(a.mid.toString())) .iterator().next(); } @@ -444,7 +444,7 @@ public Map buildEndpointClass() throws ScribException int i = 1; for (PayloadElemType pet : a.payload.elems) { - DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pet); + DataDecl dtd = main.getDataTypeDeclChild((DataType) pet); receiveInterface += ", " + dtd.getExtName() + " arg" + i++; } @@ -481,7 +481,7 @@ public Map buildEndpointClass() throws ScribException int i = 0; for (PayloadElemType pet : a.payload.elems) { - DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pet); + DataDecl dtd = main.getDataTypeDeclChild((DataType) pet); branchAbstract += ", (" + dtd.getExtName() + ") m.payload[" + i++ + "]"; } branchAbstract += "); break;\n"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index bf6f3a329..4612cf8d6 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -23,8 +23,8 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.scribble.ast.DataTypeDecl; -import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.DataDecl; +import org.scribble.ast.SigDecl; import org.scribble.ast.Module; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.ClassBuilder; @@ -235,15 +235,15 @@ public Map buildEndpointClass() throws ScribException { // FIXME: factor out boolean isSig = main.getNonProtoDeclChildren().stream() - .anyMatch(npd -> (npd instanceof MessageSigNameDecl) - && ((MessageSigNameDecl) npd).getDeclName().toString() + .anyMatch(npd -> (npd instanceof SigDecl) + && ((SigDecl) npd).getDeclName().toString() .equals(a.mid.toString())); - MessageSigNameDecl msnd = null; + SigDecl msnd = null; if (isSig) { - msnd = (MessageSigNameDecl) main.getNonProtoDeclChildren().stream() - .filter(npd -> (npd instanceof MessageSigNameDecl) - && ((MessageSigNameDecl) npd).getDeclName().toString() + msnd = (SigDecl) main.getNonProtoDeclChildren().stream() + .filter(npd -> (npd instanceof SigDecl) + && ((SigDecl) npd).getDeclName().toString() .equals(a.mid.toString())) .iterator().next(); } @@ -590,12 +590,12 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, // FIXME: factor out boolean isSig = main.getNonProtoDeclChildren().stream() - .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); - MessageSigNameDecl msnd = null; + .anyMatch(npd -> (npd instanceof SigDecl) && ((SigDecl) npd).getDeclName().toString().equals(a.mid.toString())); + SigDecl msnd = null; if (isSig) { - msnd = (MessageSigNameDecl) main.getNonProtoDeclChildren().stream() - .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); + msnd = (SigDecl) main.getNonProtoDeclChildren().stream() + .filter(npd -> (npd instanceof SigDecl) && ((SigDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); FieldBuilder m = opClass.newField("m"); m.addModifiers("private", "final"); m.setType(msnd.getExtName()); @@ -698,12 +698,12 @@ protected String generateBranch(String bprefix, LangContext jc, EState s, String { // FIXME: factor out boolean isSig = jc.getMainModule().getNonProtoDeclChildren().stream() - .anyMatch(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())); - MessageSigNameDecl msnd = null; + .anyMatch(npd -> (npd instanceof SigDecl) && ((SigDecl) npd).getDeclName().toString().equals(a.mid.toString())); + SigDecl msnd = null; if (isSig) { - msnd = (MessageSigNameDecl) jc.getMainModule().getNonProtoDeclChildren().stream() - .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); + msnd = (SigDecl) jc.getMainModule().getNonProtoDeclChildren().stream() + .filter(npd -> (npd instanceof SigDecl) && ((SigDecl) npd).getDeclName().toString().equals(a.mid.toString())).iterator().next(); } branchAbstract += "case \"" + SessionApiGenerator.getOpClassName(a.mid) + "\": receive(data, " + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + a.peer + "." + a.peer + ", "; @@ -718,7 +718,7 @@ protected String generateBranch(String bprefix, LangContext jc, EState s, String int i = 0; for (PayloadElemType pet : a.payload.elems) { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); + DataDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); branchAbstract += ", (" + dtd.getExtName() + ") m.payload[" + i++ + "]"; } branchAbstract += "); break;\n"; @@ -732,7 +732,7 @@ protected String generateBranch(String bprefix, LangContext jc, EState s, String } protected String generateReceiveInterface(boolean isSig, - MessageSigNameDecl msnd, LangContext jc, EAction a, String rootPack, + SigDecl msnd, LangContext jc, EAction a, String rootPack, String receiveIfName) { String receiveInterface = ""; @@ -756,7 +756,7 @@ protected String generateReceiveInterface(boolean isSig, int i = 1; for (PayloadElemType pet : a.payload.elems) { - DataTypeDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); + DataDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); receiveInterface += ", " + dtd.getExtName() + " arg" + i++; } } @@ -998,11 +998,11 @@ protected String getMessagesPackage(String rootPack) return rootPack + ".handlers." + this.self + ".states.messages"; } - protected MessageSigNameDecl getMessageSigNameDecl(MessageSigName mid) + protected SigDecl getMessageSigNameDecl(MessageSigName mid) { - return (MessageSigNameDecl) + return (SigDecl) this.lang.getContext().getMainModule().getNonProtoDeclChildren().stream() // FIXME: main module? - .filter(npd -> (npd instanceof MessageSigNameDecl) && ((MessageSigNameDecl) npd).getDeclName().toString().equals(mid.toString())) + .filter(npd -> (npd instanceof SigDecl) && ((SigDecl) npd).getDeclName().toString().equals(mid.toString())) .iterator().next(); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index 2d6c395a9..e22ac2714 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -20,7 +20,7 @@ import java.util.stream.Collectors; import org.scribble.ast.Module; -import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ast.global.GProtoDecl; import org.scribble.codegen.java.ApiGen; import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.ConstructorBuilder; @@ -205,7 +205,7 @@ private void constructRoleClasses() throws ScribException { Module mod = this.lang.getContext().getModule(this.gpn.getPrefix()); GProtocolName simpname = this.gpn.getSimpleName(); - GProtocolDecl gpd = (GProtocolDecl) mod.getGProtocolDeclChild(simpname); + GProtoDecl gpd = (GProtoDecl) mod.getGProtocolDeclChild(simpname); for (Role r : gpd.getRoles()) { //constructRoleClass(this.cb.newClass(), r); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java index 854f001de..bef1f913c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java @@ -15,8 +15,8 @@ import java.util.stream.Collectors; -import org.scribble.ast.DataTypeDecl; -import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.DataDecl; +import org.scribble.ast.SigDecl; import org.scribble.ast.Module; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.statechanapi.ioifaces.BranchIfaceGen; @@ -293,14 +293,14 @@ private void addHandleMethod(final String ROLE_PARAM, final String MESSAGE_VAR, int i = 0; for (PayloadElemType pt : a.payload.elems) { - DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType + DataDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType ln += ", " + buffSuper + "(" + dtd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + i++ + "])"; } } } else { - MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module ln += ", " + JavaBuilder.NEW + " " + BUF_CLASS + "<>((" + msd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM //+ "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[0]" // CHECKME: betty16.lec2.smtp.SmtpC4 + ")"; @@ -380,14 +380,14 @@ private void addCallbackCases(MethodBuilder mb2, final String ROLE_PARAM, int i = 0; for (PayloadElemType pt : a.payload.elems) { - DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType + DataDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType ln += ", " + buffSuper + "(" + dtd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + i++ + "])"; } } } else { - MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module ln += ", " + JavaBuilder.NEW + " " + BUF_CLASS + "<>((" + msd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM //+ "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[0]" // CHECKME: betty16.lec2.smtp.SmtpC4 + ")"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java index b02cc895a..43baf8a90 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java @@ -15,7 +15,7 @@ import java.util.stream.Collectors; -import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.SigDecl; import org.scribble.ast.Module; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.statechanapi.ioifaces.BranchIfaceGen; @@ -138,7 +138,7 @@ private void addReceiveMethod(ClassBuilder cb, EAction a, EState succ) throws Sc } else //if (a.mid.isMessageSigName()) { - MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module mb.addBodyLine(JavaBuilder.SUPER + ".use();"); addBranchCheck(getSessionApiOpConstant(a.mid), mb, CASE_MESSAGE_FIELD); mb.addBodyLine(CASE_ARG_PREFIX + "." + BUFF_VAL_FIELD + " = (" + msd.getExtName() + ") " + CASE_MESSAGE_FIELD + ";"); @@ -197,7 +197,7 @@ private void addCaseReceiveDiscardMethod(ClassBuilder cb, EAction a, EState succ } else { - MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // Factor out? (send/receive/branchreceive/...) + SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // Factor out? (send/receive/branchreceive/...) ln += getGarbageBuf(msd.getExtName()) + ");"; } mb.addBodyLine(ln); @@ -228,7 +228,7 @@ public static void setCaseReceiveHeaderWithoutReturnType(StateChannelApiGenerato } else //if (a.mid.isMessageSigName()) { - MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module ReceiveSockGen.addReceiveMessageSigNameParams(mb, msd, true); } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java index 2e8acdf35..bfba5a6bd 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java @@ -13,7 +13,7 @@ */ package org.scribble.codegen.java.statechanapi; -import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.SigDecl; import org.scribble.ast.Module; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.AbstractMethodBuilder; @@ -106,7 +106,7 @@ public static void addHandleMethodOpAndPayloadParams(StateChannelApiGenerator ap } else //if (a.mid.isMessageSigName()) { - MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module ReceiveSockGen.addReceiveMessageSigNameParams(mb, msd, false); } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java index aed9f8c77..c93e279a9 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java @@ -16,8 +16,8 @@ import java.util.LinkedList; import java.util.List; -import org.scribble.ast.DataTypeDecl; -import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.DataDecl; +import org.scribble.ast.SigDecl; import org.scribble.ast.Module; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.ClassBuilder; @@ -80,7 +80,7 @@ public ClassBuilder generateType() throws ScribException { throw new ScribException("[TODO] API generation not supported for non- data type payloads: " + pt); } - DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); + DataDecl dtd = main.getDataTypeDeclChild((DataType) pt); ScribSockGen.checkJavaDataTypeDecl(dtd); String type = dtd.getExtName(); types.add(type); @@ -92,7 +92,7 @@ public ClassBuilder generateType() throws ScribException } else { - MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); + SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); ScribSockGen.checkMessageSigNameDecl(msd); String type = msd.getExtName(); types.add(type); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java index 9dbb09b5a..4f4474b04 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java @@ -18,8 +18,8 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.scribble.ast.DataTypeDecl; -import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.DataDecl; +import org.scribble.ast.SigDecl; import org.scribble.ast.Module; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.JavaBuilder; @@ -170,7 +170,7 @@ public static void setSendHeaderWithoutReturnType(StateChannelApiGenerator apige } else //if (a.mid.isMessageSigName()) { - MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module addSendMessageSigNameParams(mb, msd); } } @@ -222,14 +222,14 @@ protected static void addSendOpParams(StateChannelApiGenerator apigen, MethodBui { throw new ScribException("[TODO] API generation not supported for non- data type payloads: " + pt); } - DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); // FIXME: might not belong to main module // TODO: if not DataType + DataDecl dtd = main.getDataTypeDeclChild((DataType) pt); // FIXME: might not belong to main module // TODO: if not DataType ScribSockGen.checkJavaDataTypeDecl(dtd); mb.addParameters(dtd.getExtName() + " " + as.next()); } } } - protected static void addSendMessageSigNameParams(MethodBuilder mb, MessageSigNameDecl msd) throws ScribException + protected static void addSendMessageSigNameParams(MethodBuilder mb, SigDecl msd) throws ScribException { final String MESSAGE_PARAM = "m"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java index 210d819f6..7075fbfe4 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java @@ -13,8 +13,8 @@ */ package org.scribble.codegen.java.statechanapi; -import org.scribble.ast.DataTypeDecl; -import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.DataDecl; +import org.scribble.ast.SigDecl; import org.scribble.ast.Module; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.ClassBuilder; @@ -84,7 +84,7 @@ private void makeReceiveMethod(EAction a, EState succ) throws ScribException } else //if (a.mid.isMessageSigName()) { - MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module //addReceiveMessageSigNameParams(mb, a, msd);*/ mb.addBodyLine(StateChannelApiGenerator.SCRIBMESSAGE_CLASS + " " + RECEIVE_MESSAGE_PARAM + " = " + JavaBuilder.SUPER + ".readScribMessage(" + getSessionApiRoleConstant(a.obj) + ");"); @@ -168,7 +168,7 @@ public static void setReceiveHeaderWithoutReturnType(StateChannelApiGenerator ap } else //if (a.mid.isMessageSigName()) { - MessageSigNameDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module addReceiveMessageSigNameParams(mb, msd, true); } } @@ -186,7 +186,7 @@ protected static void addReceiveOpParams(MethodBuilder mb, Module main, EAction { throw new ScribException("[TODO] API generation not supported for non- data type payloads: " + pt); } - DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType + DataDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType ScribSockGen.checkJavaDataTypeDecl(dtd); mb.addParameters(buffSuper + dtd.getExtName() + "> " + RECEIVE_ARG_PREFIX + i++); } @@ -200,14 +200,14 @@ protected static void addPayloadBuffSetters(Module main, EAction a, MethodBuilde int i = 1; for (PayloadElemType pt : a.payload.elems) // Could factor out this loop (arg names) with addReceiveOpParams (as for send) { - DataTypeDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType + DataDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType mb.addBodyLine(RECEIVE_ARG_PREFIX + i + "." + BUFF_VAL_FIELD + " = (" + dtd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + (i++ - 1) +"];"); } } } - protected static void addReceiveMessageSigNameParams(MethodBuilder mb, MessageSigNameDecl msd, boolean superr) throws ScribException + protected static void addReceiveMessageSigNameParams(MethodBuilder mb, SigDecl msd, boolean superr) throws ScribException { ScribSockGen.checkMessageSigNameDecl(msd); mb.addParameters(BUF_CLASS + "<" + ((superr) ? "? " + JavaBuilder.SUPER + " " : "") + msd.getExtName() + "> " + RECEIVE_ARG_PREFIX); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java index 7e66d2f54..c7aecca0b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java @@ -13,10 +13,10 @@ */ package org.scribble.codegen.java.statechanapi; -import org.scribble.ast.DataTypeDecl; -import org.scribble.ast.MessageSigNameDecl; -import org.scribble.ast.NonProtocolDecl; -import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ast.DataDecl; +import org.scribble.ast.SigDecl; +import org.scribble.ast.NonProtoDecl; +import org.scribble.ast.global.GProtoDecl; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.ConstructorBuilder; @@ -153,7 +153,7 @@ protected void addInitialStateConstructor() mb.addBodyLine(SESSIONENDPOINT_PARAM + ".init();"); mb.addBodyLine(ClassBuilder.RETURN + " " + ClassBuilder.NEW + " " + this.root + "(" + SESSIONENDPOINT_PARAM + ");");*/ - GProtocolDecl gpd = (GProtocolDecl) this.apigen.getJob().getContext() + GProtoDecl gpd = (GProtoDecl) this.apigen.getJob().getContext() .getModule(this.apigen.gpn.getPrefix()) .getGProtocolDeclChild(this.apigen.gpn.getSimpleName()); String epClass = gpd.isExplicit() ? EXPLICITENDPOINT_CLASS @@ -263,17 +263,17 @@ public static void setNextSocketReturnType(StateChannelApiGenerator apigen, Meth mb.setReturn(ret); } - protected static void checkJavaDataTypeDecl(DataTypeDecl dtd) throws ScribException + protected static void checkJavaDataTypeDecl(DataDecl dtd) throws ScribException { checkJavaSchema(dtd); } - protected static void checkMessageSigNameDecl(MessageSigNameDecl msd) throws ScribException + protected static void checkMessageSigNameDecl(SigDecl msd) throws ScribException { checkJavaSchema(msd); } - protected static void checkJavaSchema(NonProtocolDecl npd) throws ScribException + protected static void checkJavaSchema(NonProtoDecl npd) throws ScribException { if (!npd.getSchema().equals(ScribSockGen.JAVA_SCHEMA)) // FIXME: factor out { diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 17ccc4f13..20b810c53 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -119,12 +119,13 @@ tokens GINTERSEQ = 'GINTERSEQ'; GCONNECT = 'GCONNECT'; - GCONTINUE = 'GCONTINUE'; GDCONN = 'GDCONN'; - GDO = 'GDO'; GMSGTRANSFER = 'GMSGTRANSFER'; GWRAP = 'GWRAP'; + GCONTINUE = 'GCONTINUE'; + GDO = 'GDO'; + ROLEARG_LIST = 'ROLEARG_LIST'; // Cf. ROLEDECL ROLEARG = 'ROLEARG'; ARG_LIST = 'ARG_LIST'; // Cf. PARAM_DECL @@ -160,15 +161,15 @@ tokens import org.scribble.ast.NonRoleArg; import org.scribble.ast.ScribNodeBase; - import org.scribble.ast.UnaryPayloadElem; + import org.scribble.ast.UnaryPayElem; import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; - import org.scribble.ast.name.simple.TypeParamNode; - import org.scribble.ast.name.qualified.DataTypeNode; + import org.scribble.ast.name.simple.DataParamNode; + import org.scribble.ast.name.qualified.DataNameNode; } @@ -281,7 +282,7 @@ fragment UNDERSCORE: // "Note that parameters are not allowed on token references to the left of ->:" // "Use imaginary nodes as you normally would, but with the addition of the node type:" // But currently, ID token itself unchanged and ttype int ends up discarded ambigname: t=ID -> ID[$t]; -dataparamname: t=ID -> ID[$t]; +dataparamname: t=ID -> ID[$t]; opname: -> ^(EMPTY_OP) | t=ID -> ID[$t] ; recvarname: t=ID -> ID[$t]; rolename: t=ID -> ID[$t]; @@ -608,11 +609,11 @@ nonrolearg: if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname { // Cf. AstFactoryImpl, token creation - DataTypeNode dt = new DataTypeNode(new CommonToken(DATA_NAME, "DATA_NAME")); + DataNameNode dt = new DataNameNode(new CommonToken(DATA_NAME, "DATA_NAME")); ((List) qn.getChildren()).forEach(x -> dt.addChild(new IdNode(new CommonToken(ID, ((CommonTree) x).getText())))); - UnaryPayloadElem pe = - new UnaryPayloadElem(new CommonToken(UNARY_PAYELEM, "UNARYPAYLOADELEM")); + UnaryPayElem pe = + new UnaryPayElem(new CommonToken(UNARY_PAYELEM, "UNARYPAYLOADELEM")); pe.addChild(dt); return pe; } @@ -623,7 +624,7 @@ nonrolearg: String text = qn.getChild(0).getText(); AmbigNameNode an = new AmbigNameNode(AMBIG_NAME, new CommonToken(ID, text)); - UnaryPayloadElem e = new UnaryPayloadElem( + UnaryPayElem e = new UnaryPayElem( new CommonToken(UNARY_PAYELEM, "UNARYPAYLOADELEM")); e.addChild(an); return e; @@ -631,15 +632,15 @@ nonrolearg: } // qn is an IdNode "holder" for a "qualifiedname" COMPOUND_NAME -- see ScribTreeAdaptor - // Only for "qualifiedName" (DataTypeNode or AmbigNameNode), not sig literals + // Only for "qualifiedName" (DataNameNode or AmbigNameNode), not sig literals // Use by: { parseNonRoleArg($qualifiedname.tree) } public static CommonTree parseNonRoleArg(CommonTree qn) throws RecognitionException { if (qn.getChildCount() > 1) // qn has IdNode children, elements of the qualifiedname { // Cf. AstFactoryImpl, token creation - DataTypeNode dt = - new DataTypeNode(new CommonToken(DATA_NAME, "DATA_NAME")); // FIXME: could be a sig name arg... + DataNameNode dt = + new DataNameNode(new CommonToken(DATA_NAME, "DATA_NAME")); // FIXME: could be a sig name arg... ((List) qn.getChildren()).forEach(x -> dt.addChild(new IdNode(new CommonToken(ID, ((CommonTree) x).getText())))); NonRoleArg a = diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java index f0c43eb24..2cec0fec2 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java @@ -20,65 +20,67 @@ import org.antlr.runtime.CommonToken; import org.scribble.ast.AstFactory; -import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.DataDecl; +import org.scribble.ast.DataParamDecl; import org.scribble.ast.ImportDecl; import org.scribble.ast.ImportModule; -import org.scribble.ast.MessageNode; -import org.scribble.ast.MessageSigNameDecl; -import org.scribble.ast.MessageSigNode; +import org.scribble.ast.MsgNode; import org.scribble.ast.Module; import org.scribble.ast.ModuleDecl; -import org.scribble.ast.NonProtocolDecl; +import org.scribble.ast.NonProtoDecl; import org.scribble.ast.NonRoleArg; import org.scribble.ast.NonRoleArgList; import org.scribble.ast.NonRoleArgNode; import org.scribble.ast.NonRoleParamDecl; import org.scribble.ast.NonRoleParamDeclList; -import org.scribble.ast.PayloadElem; -import org.scribble.ast.PayloadElemList; -import org.scribble.ast.ProtocolDecl; -import org.scribble.ast.ProtocolModList; +import org.scribble.ast.PayElem; +import org.scribble.ast.PayElemList; +import org.scribble.ast.ProtoDecl; +import org.scribble.ast.ProtoModList; import org.scribble.ast.RoleArg; import org.scribble.ast.RoleArgList; import org.scribble.ast.RoleDecl; import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScribNodeBase; -import org.scribble.ast.UnaryPayloadElem; +import org.scribble.ast.SigDecl; +import org.scribble.ast.SigLitNode; +import org.scribble.ast.SigParamDecl; +import org.scribble.ast.UnaryPayElem; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; import org.scribble.ast.global.GContinue; -import org.scribble.ast.global.GDelegationElem; +import org.scribble.ast.global.GDelegPayElem; import org.scribble.ast.global.GDisconnect; import org.scribble.ast.global.GDo; import org.scribble.ast.global.GInteractionSeq; -import org.scribble.ast.global.GMessageTransfer; -import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ast.global.GProtocolDef; -import org.scribble.ast.global.GProtocolHeader; +import org.scribble.ast.global.GMsgTransfer; +import org.scribble.ast.global.GProtoDecl; +import org.scribble.ast.global.GProtoHeader; +import org.scribble.ast.global.GProtoBlock; +import org.scribble.ast.global.GProtoDef; import org.scribble.ast.global.GRecursion; import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GWrap; -import org.scribble.ast.name.PayloadElemNameNode; +import org.scribble.ast.name.PayElemNameNode; import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.qualified.GProtoNameNode; -import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.DataParamNode; import org.scribble.ast.name.simple.ExtIdNode; import org.scribble.ast.name.simple.IdNode; -import org.scribble.ast.name.simple.NonRoleParamNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; -import org.scribble.ast.name.simple.DataParamNode; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.PayloadTypeKind; import org.scribble.del.DefaultDel; import org.scribble.del.ImportModuleDel; import org.scribble.del.ModuleDel; import org.scribble.del.NonRoleArgListDel; +import org.scribble.del.NonRoleParamDeclDel; import org.scribble.del.NonRoleParamDeclListDel; import org.scribble.del.RoleArgListDel; import org.scribble.del.RoleDeclDel; @@ -282,57 +284,10 @@ public SigNameNode SigNameNode(List elems) del(n, new MessageSigNameNodeDel()); return n; } - - @Override - public MessageSigNode MessageSigNode(OpNode op, PayloadElemList pay) - { - CommonToken t = newToken(ScribbleParser.SIG_LIT); - MessageSigNode n = new MessageSigNode(t); - n.addChild(op); - n.addChild(pay); - del(n, createDefaultDelegate()); - return n; - } - - @Override - public PayloadElemList PayloadElemList(List> elems) - { - CommonToken t = newToken(ScribbleParser.PAYELEM_LIST); - PayloadElemList n = new PayloadElemList(t); - n.addChildren(elems); - del(n, createDefaultDelegate()); - return n; - } - - // Not used by ScribbleParser -- parsed "directly" within Scribble.g - @Override - public UnaryPayloadElem UnaryPayloadElem( - PayloadElemNameNode name) - { - CommonToken t = newToken(ScribbleParser.UNARY_PAYELEM); - UnaryPayloadElem n = new UnaryPayloadElem<>(t); - // Cf. Scribble.g children order - n.addChild(name); - del(n, createDefaultDelegate()); - return n; - } - - @Override - public GDelegationElem GDelegationElem(GProtoNameNode proto, RoleNode role) - { - CommonToken t = newToken(ScribbleParser.DELEG_PAYELEM); - GDelegationElem n = new GDelegationElem(t); - n.addChild(proto); - n.addChild(role); - //del(n, createDefaultDelegate()); - del(n, new GDelegationElemDel()); // FIXME: GDelegationElemDel - return n; - } @Override - public Module Module(ModuleDecl moddecl, - List> imports, List> data, - List> protos) + public Module Module(ModuleDecl moddecl, List> imports, + List> data, List> protos) { CommonToken t = newToken(ScribbleParser.MODULE); Module n = new Module(t); @@ -355,8 +310,7 @@ public ModuleDecl ModuleDecl(ModuleNameNode fullmodname) } @Override - public ImportModule ImportModule(ModuleNameNode modname, - ModuleNameNode alias) + public ImportModule ImportModule(ModuleNameNode modname, ModuleNameNode alias) { CommonToken t = newToken(ScribbleParser.IMPORTMODULE); ImportModule n = new ImportModule(t); @@ -370,11 +324,11 @@ public ImportModule ImportModule(ModuleNameNode modname, } @Override - public MessageSigNameDecl MessageSigNameDecl(IdNode schema, - IdNode extName, IdNode extSource, SigNameNode alias) + public DataDecl DataDecl(IdNode schema, IdNode extName, IdNode extSource, + DataNameNode alias) { - CommonToken t = newToken(ScribbleParser.SIGDECL); - MessageSigNameDecl n = new MessageSigNameDecl(t); + CommonToken t = newToken(ScribbleParser.DATADECL); + DataDecl n = new DataDecl(t); n.addChild(schema); n.addChild(extName); n.addChild(extSource); @@ -384,11 +338,11 @@ public MessageSigNameDecl MessageSigNameDecl(IdNode schema, } @Override - public DataTypeDecl DataTypeDecl(IdNode schema, - IdNode extName, IdNode extSource, DataNameNode alias) + public SigDecl SigDecl(IdNode schema, IdNode extName, IdNode extSource, + SigNameNode alias) { - CommonToken t = newToken(ScribbleParser.DATADECL); - DataTypeDecl n = new DataTypeDecl(t); + CommonToken t = newToken(ScribbleParser.SIGDECL); + SigDecl n = new SigDecl(t); n.addChild(schema); n.addChild(extName); n.addChild(extSource); @@ -398,11 +352,11 @@ public DataTypeDecl DataTypeDecl(IdNode schema, } @Override - public GProtocolDecl GProtocolDecl(ProtocolModList mods, - GProtocolHeader header, GProtocolDef def) + public GProtoDecl GProtoDecl(ProtoModList mods, GProtoHeader header, + GProtoDef def) { CommonToken t = newToken(ScribbleParser.GPROTODECL); - GProtocolDecl n = new GProtocolDecl(t); + GProtoDecl n = new GProtoDecl(t); n.addChild(mods); n.addChild(header); n.addChild(def); @@ -411,11 +365,11 @@ public GProtocolDecl GProtocolDecl(ProtocolModList mods, } @Override - public GProtocolHeader GProtocolHeader(GProtoNameNode name, + public GProtoHeader GProtocolHeader(GProtoNameNode name, RoleDeclList rs, NonRoleParamDeclList ps) { CommonToken t = newToken(ScribbleParser.GPROTOHEADER); - GProtocolHeader n = new GProtocolHeader(t); + GProtoHeader n = new GProtoHeader(t); n.addChild(name); n.addChild(ps); n.addChild(rs); @@ -456,32 +410,43 @@ public NonRoleParamDeclList NonRoleParamDeclList( return n; } - @Deprecated @Override - public NonRoleParamDecl NonRoleParamDecl( - K kind, NonRoleParamNode namenode) + public DataParamDecl DataParamDecl(DataParamNode p) { - /*NonRoleParamDecl pd = new NonRoleParamDecl(source, kind, namenode); - del(pd, new NonRoleParamDeclDel()); - return pd;*/ - throw new RuntimeException("Deprecated"); + CommonToken t = newToken(ScribbleParser.DATAPARAMDECL); + DataParamDecl n = new DataParamDecl(t); + // Cf. Scribble.g children order + n.addChild(p); + del(n, new NonRoleParamDeclDel()); + return n; } @Override - public GProtocolDef GProtocolDef(GProtocolBlock block) + public SigParamDecl SigParamDecl(SigParamNode p) + { + CommonToken t = newToken(ScribbleParser.SIGPARAMDECL); + SigParamDecl n = new SigParamDecl(t); + // Cf. Scribble.g children order + n.addChild(p); + del(n, new NonRoleParamDeclDel()); + return n; + } + + @Override + public GProtoDef GProtoDef(GProtoBlock block) { CommonToken t = newToken(ScribbleParser.GPROTODEF); - GProtocolDef n = new GProtocolDef(t); + GProtoDef n = new GProtoDef(t); n.addChild(block); del(n, new GProtocolDefDel()); return n; } @Override - public GProtocolBlock GProtocolBlock(GInteractionSeq seq) + public GProtoBlock GProtoBlock(GInteractionSeq seq) { CommonToken t = newToken(ScribbleParser.GPROTOBLOCK); - GProtocolBlock n = new GProtocolBlock(t); + GProtoBlock n = new GProtoBlock(t); n.addChild(seq); del(n, new GProtocolBlockDel()); return n; @@ -498,20 +463,52 @@ public GInteractionSeq GInteractionSeq(List elems) } @Override - public GMessageTransfer GMessageTransfer(RoleNode src, - MessageNode msg, List dsts) + public SigLitNode SigLitNode(OpNode op, PayElemList pay) { - CommonToken t = newToken(ScribbleParser.GMSGTRANSFER); - GMessageTransfer n = new GMessageTransfer(t); - n.addChild(msg); - n.addChild(src); - n.addChildren(dsts); - del(n, new GMessageTransferDel()); + CommonToken t = newToken(ScribbleParser.SIG_LIT); + SigLitNode n = new SigLitNode(t); + n.addChild(op); + n.addChild(pay); + del(n, createDefaultDelegate()); + return n; + } + + @Override + public PayElemList PayElemList(List> elems) + { + CommonToken t = newToken(ScribbleParser.PAYELEM_LIST); + PayElemList n = new PayElemList(t); + n.addChildren(elems); + del(n, createDefaultDelegate()); + return n; + } + + @Override + public UnaryPayElem UnaryPayElem( + PayElemNameNode name) + { + CommonToken t = newToken(ScribbleParser.UNARY_PAYELEM); + UnaryPayElem n = new UnaryPayElem<>(t); + // Cf. Scribble.g children order + n.addChild(name); + del(n, createDefaultDelegate()); + return n; + } + + @Override + public GDelegPayElem GDelegPayElem(GProtoNameNode proto, RoleNode role) + { + CommonToken t = newToken(ScribbleParser.DELEG_PAYELEM); + GDelegPayElem n = new GDelegPayElem(t); + n.addChild(proto); + n.addChild(role); + //del(n, createDefaultDelegate()); + del(n, new GDelegationElemDel()); // FIXME: GDelegationElemDel return n; } @Override - public GConnect GConnect(RoleNode src, MessageNode msg, RoleNode dst) + public GConnect GConnect(RoleNode src, MsgNode msg, RoleNode dst) { CommonToken t = newToken(ScribbleParser.GCONNECT); GConnect n = new GConnect(t); @@ -534,36 +531,26 @@ public GDisconnect GDisconnect(RoleNode left, RoleNode right) } @Override - public GWrap GWrap(RoleNode src, RoleNode dst) + public GMsgTransfer GMsgTransfer(RoleNode src, + MsgNode msg, List dsts) { - CommonToken t = newToken(ScribbleParser.GWRAP); - GWrap n = new GWrap(t); + CommonToken t = newToken(ScribbleParser.GMSGTRANSFER); + GMsgTransfer n = new GMsgTransfer(t); + n.addChild(msg); n.addChild(src); - n.addChild(dst); - del(n, new GWrapDel()); - return n; - } - - @Override - public GChoice GChoice(RoleNode subj, List blocks) - { - CommonToken t = newToken(ScribbleParser.GCHOICE); - GChoice n = new GChoice(t); - n.addChild(subj); - n.addChildren(blocks); - del(n, new GChoiceDel()); + n.addChildren(dsts); + del(n, new GMessageTransferDel()); return n; } @Override - public GRecursion GRecursion(RecVarNode rv, - GProtocolBlock block) + public GWrap GWrap(RoleNode src, RoleNode dst) { - CommonToken t = newToken(ScribbleParser.GRECURSION); - GRecursion n = new GRecursion(t); - n.addChild(rv); - n.addChild(block); - del(n, new GRecursionDel()); + CommonToken t = newToken(ScribbleParser.GWRAP); + GWrap n = new GWrap(t); + n.addChild(src); + n.addChild(dst); + del(n, new GWrapDel()); return n; } @@ -628,6 +615,29 @@ public NonRoleArg NonRoleArg(NonRoleArgNode arg) del(n, createDefaultDelegate()); return n; } + + @Override + public GChoice GChoice(RoleNode subj, List blocks) + { + CommonToken t = newToken(ScribbleParser.GCHOICE); + GChoice n = new GChoice(t); + n.addChild(subj); + n.addChildren(blocks); + del(n, new GChoiceDel()); + return n; + } + + @Override + public GRecursion GRecursion(RecVarNode rv, + GProtoBlock block) + { + CommonToken t = newToken(ScribbleParser.GRECURSION); + GRecursion n = new GRecursion(t); + n.addChild(rv); + n.addChild(block); + del(n, new GRecursionDel()); + return n; + } } diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java index 91834ab91..98fc7a138 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java @@ -17,18 +17,18 @@ import java.lang.reflect.Method; import org.scribble.ast.AuxMod; -import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.DataDecl; import org.scribble.ast.ExplicitMod; import org.scribble.ast.ImportModule; -import org.scribble.ast.MessageSigNameDecl; -import org.scribble.ast.MessageSigNode; +import org.scribble.ast.SigDecl; +import org.scribble.ast.SigLitNode; import org.scribble.ast.Module; import org.scribble.ast.ModuleDecl; import org.scribble.ast.NonRoleArg; import org.scribble.ast.NonRoleArgList; import org.scribble.ast.NonRoleParamDeclList; -import org.scribble.ast.PayloadElemList; -import org.scribble.ast.ProtocolModList; +import org.scribble.ast.PayElemList; +import org.scribble.ast.ProtoModList; import org.scribble.ast.RoleArg; import org.scribble.ast.RoleArgList; import org.scribble.ast.RoleDecl; @@ -36,19 +36,19 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.ScribNodeBase; import org.scribble.ast.SigParamDecl; -import org.scribble.ast.TypeParamDecl; -import org.scribble.ast.UnaryPayloadElem; +import org.scribble.ast.DataParamDecl; +import org.scribble.ast.UnaryPayElem; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; import org.scribble.ast.global.GContinue; import org.scribble.ast.global.GDisconnect; import org.scribble.ast.global.GDo; import org.scribble.ast.global.GInteractionSeq; -import org.scribble.ast.global.GMessageTransfer; -import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ast.global.GProtocolDef; -import org.scribble.ast.global.GProtocolHeader; +import org.scribble.ast.global.GMsgTransfer; +import org.scribble.ast.global.GProtoBlock; +import org.scribble.ast.global.GProtoDecl; +import org.scribble.ast.global.GProtoDef; +import org.scribble.ast.global.GProtoHeader; import org.scribble.ast.global.GRecursion; import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.qualified.GProtoNameNode; @@ -150,188 +150,208 @@ protected static void setDel(ScribNodeBase n, ScribDel del) copy.setDel(del); return ScribUtil.castNodeByClass(n, copy);*/ } - + @Override - public void Module(Module n) + public void IdNode(IdNode n) { - setDel(n, new ModuleDel()); + setDel(n, createDefaultDelegate()); } @Override - public void ModuleDecl(ModuleDecl n) + public void ExtIdNode(ExtIdNode n) { setDel(n, createDefaultDelegate()); } @Override - public void ImportModule(ImportModule n) + public void AmbigNameNode(AmbigNameNode n) { - setDel(n, new ImportModuleDel()); + setDel(n, new AmbigNameNodeDel()); } - + @Override - public void MessageSigNameDecl(MessageSigNameDecl n) + public void DataParamNode(DataParamNode n) { - setDel(n, createDefaultDelegate()); + setDel(n, new NonRoleParamNodeDel()); } @Override - public void DataTypeDecl(DataTypeDecl n) + public void OpNode(OpNode n) { setDel(n, createDefaultDelegate()); } @Override - public void GProtocolDecl(GProtocolDecl n) + public void RecVarNode(RecVarNode n) { - setDel(n, new GProtocolDeclDel()); + setDel(n, new RecVarNodeDel()); } @Override - public void ProtocolModList(ProtocolModList n) + public void RoleNode(RoleNode r) { - setDel(n, createDefaultDelegate()); + setDel(r, new RoleNodeDel()); } @Override - public void AuxMod(AuxMod n) + public void SigParamNode(SigParamNode n) + { + setDel(n, new NonRoleParamNodeDel()); + } + + @Override + public void DataNameNode(DataNameNode n) + { + setDel(n, new DataTypeNodeDel()); + } + + @Override + public void GProtoNameNode(GProtoNameNode n) { setDel(n, createDefaultDelegate()); } @Override - public void ExplicitMod(ExplicitMod n) + public void LProtoNameNode(LProtoNameNode n) { setDel(n, createDefaultDelegate()); } @Override - public void GProtocolHeader(GProtocolHeader n) + public void ModuleNameNode(ModuleNameNode n) { setDel(n, createDefaultDelegate()); } @Override - public void RoleDeclList(RoleDeclList n) + public void SigNameNode(SigNameNode n) { - setDel(n, new RoleDeclListDel()); + setDel(n, new MessageSigNameNodeDel()); + } + + @Override + public void Module(Module n) + { + setDel(n, new ModuleDel()); } @Override - public void RoleDecl(RoleDecl n) + public void ModuleDecl(ModuleDecl n) { - setDel(n, new RoleDeclDel()); + setDel(n, createDefaultDelegate()); } @Override - public void NonRoleParamDeclList(NonRoleParamDeclList n) + public void ImportModule(ImportModule n) { - setDel(n, new NonRoleParamDeclListDel()); + setDel(n, new ImportModuleDel()); } - /*@Override - public NonRoleParamDecl NonRoleParamDecl(CommonTree source, K kind, NonRoleParamNode namenode) + @Override + public void DataDecl(DataDecl n) { - NonRoleParamDecl pd = new NonRoleParamDecl(source, kind, namenode); - pd = setDel(pd, new NonRoleParamDeclDel()); - return pd; - }*/ + setDel(n, createDefaultDelegate()); + } + + @Override + public void SigDecl(SigDecl n) + { + setDel(n, createDefaultDelegate()); + } @Override - public void TypeParamDecl(TypeParamDecl n) + public void GProtoDecl(GProtoDecl n) { - setDel(n, new NonRoleParamDeclDel()); + setDel(n, new GProtocolDeclDel()); } @Override - public void SigParamDecl(SigParamDecl sd) + public void ProtoModList(ProtoModList n) { - setDel(sd, new NonRoleParamDeclDel()); + setDel(n, createDefaultDelegate()); } @Override - public void GProtocolDef(GProtocolDef n) + public void AuxMod(AuxMod n) { - setDel(n, new GProtocolDefDel()); + setDel(n, createDefaultDelegate()); } @Override - public void GProtocolBlock(GProtocolBlock n) + public void ExplicitMod(ExplicitMod n) { - setDel(n, new GProtocolBlockDel()); + setDel(n, createDefaultDelegate()); } @Override - public void GInteractionSeq(GInteractionSeq n) + public void GProtoHeader(GProtoHeader n) { - setDel(n, new GInteractionSeqDel()); + setDel(n, createDefaultDelegate()); } @Override - public void GMessageTransfer(GMessageTransfer n) + public void RoleDeclList(RoleDeclList n) { - setDel(n, new GMessageTransferDel()); + setDel(n, new RoleDeclListDel()); } @Override - public void GConnect(GConnect n) + public void RoleDecl(RoleDecl n) { - setDel(n, new GConnectDel()); + setDel(n, new RoleDeclDel()); } @Override - public void GDisconnect(GDisconnect n) + public void NonRoleParamDeclList(NonRoleParamDeclList n) { - setDel(n, new GDisconnectDel()); + setDel(n, new NonRoleParamDeclListDel()); } - /*@Override - public GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest) + @Override + public void DataParamDecl(DataParamDecl n) { - GWrap gw = new GWrap(source, UnitMessageSigNode(), src, dest); - gw = setDel(gw, new GWrapDel()); - return gw; - }*/ + setDel(n, new NonRoleParamDeclDel()); + } @Override - public void GChoice(GChoice n) + public void SigParamDecl(SigParamDecl sd) { - setDel(n, new GChoiceDel()); + setDel(sd, new NonRoleParamDeclDel()); } @Override - public void GRecursion(GRecursion n) + public void GProtoDef(GProtoDef n) { - setDel(n, new GRecursionDel()); + setDel(n, new GProtocolDefDel()); } @Override - public void GContinue(GContinue n) + public void GProtoBlock(GProtoBlock n) { - setDel(n, new GContinueDel()); + setDel(n, new GProtocolBlockDel()); } @Override - public void GDo(GDo n) + public void GInteractionSeq(GInteractionSeq n) { - setDel(n, new GDoDel()); + setDel(n, new GInteractionSeqDel()); } @Override - public void MessageSigNode(MessageSigNode n) + public void SigLitNode(SigLitNode n) { setDel(n, createDefaultDelegate()); } @Override - public void PayloadElemList(PayloadElemList n) + public void PayElemList(PayElemList n) { setDel(n, createDefaultDelegate()); //setDel(pay, new PayloadElemListDel()); } @Override - public void UnaryPayloadElem(UnaryPayloadElem n) + public void UnaryPayElem(UnaryPayElem n) { setDel(n, createDefaultDelegate()); } @@ -354,196 +374,80 @@ public LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode prot }*/ @Override - public void RoleArgList(RoleArgList n) + public void GConnect(GConnect n) { - setDel(n, new RoleArgListDel()); + setDel(n, new GConnectDel()); } @Override - public void RoleArg(RoleArg n) + public void GDisconnect(GDisconnect n) { - setDel(n, createDefaultDelegate()); + setDel(n, new GDisconnectDel()); } @Override - public void NonRoleArgList(NonRoleArgList n) + public void GMsgTransfer(GMsgTransfer n) { - setDel(n, new NonRoleArgListDel()); + setDel(n, new GMessageTransferDel()); } - @Override - public void NonRoleArg(NonRoleArg n) - { - setDel(n, createDefaultDelegate()); - } - /*@Override - public NameNode SimpleNameNode(CommonTree source, K kind, String identifier) + public GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest) { - NameNode snn = null; - - // "Custom" del's - if (kind.equals(RecVarKind.KIND)) - { - snn = new RecVarNode(source, identifier); - snn = setDel(snn, new RecVarNodeDel()); - } - else if (kind.equals(RoleKind.KIND)) - { - snn = new RoleNode(source, identifier); - snn = setDel(snn, new RoleNodeDel()); - } - if (snn != null) - { - return castNameNode(kind, snn); - } - - // Default del's - if (kind.equals(OpKind.KIND)) - { - snn = new OpNode(source, identifier); - } - else - { - throw new RuntimeException("Shouldn't get in here: " + kind); - } - return castNameNode(kind, setDel(snn, createDefaultDelegate())); + GWrap gw = new GWrap(source, UnitMessageSigNode(), src, dest); + gw = setDel(gw, new GWrapDel()); + return gw; }*/ @Override - public void RoleNode(RoleNode r) - { - setDel(r, new RoleNodeDel()); - } - - @Override - public void RecVarNode(RecVarNode n) - { - setDel(n, new RecVarNodeDel()); - } - - @Override - public void OpNode(OpNode n) - { - setDel(n, createDefaultDelegate()); - } - - @Override - public void SigNameNode(SigNameNode n) - { - setDel(n, new MessageSigNameNodeDel()); - } - - @Override - public void DataNameNode(DataNameNode n) + public void GContinue(GContinue n) { - setDel(n, new DataTypeNodeDel()); + setDel(n, new GContinueDel()); } @Override - public void ModuleNameNode(ModuleNameNode n) + public void GDo(GDo n) { - setDel(n, createDefaultDelegate()); + setDel(n, new GDoDel()); } @Override - public void GProtoNameNode(GProtoNameNode n) + public void RoleArgList(RoleArgList n) { - setDel(n, createDefaultDelegate()); + setDel(n, new RoleArgListDel()); } @Override - public void LProtoNameNode(LProtoNameNode n) + public void RoleArg(RoleArg n) { setDel(n, createDefaultDelegate()); } - /*@Override - public QualifiedNameNode QualifiedNameNode(CommonTree source, K kind, String... elems) - { - QualifiedNameNode qnn = null; - if (kind.equals(SigKind.KIND)) - { - qnn = new MessageSigNameNode(source, elems); - qnn = setDel(qnn, new MessageSigNameNodeDel()); - } - else if (kind.equals(DataTypeKind.KIND)) - { - qnn = new DataTypeNode(source, elems); - qnn = setDel(qnn, new DataTypeNodeDel()); - } - if (qnn != null) - { - return castNameNode(kind, qnn); - } - - if (kind.equals(ModuleKind.KIND)) - { - qnn = new ModuleNameNode(source, elems); - } - else if (kind.equals(Global.KIND)) - { - qnn = new GProtocolNameNode(source, elems); - } - else if (kind.equals(Local.KIND)) - { - qnn = new LProtocolNameNode(source,elems); - } - else - { - throw new RuntimeException("Shouldn't get in here: " + kind); - } - return castNameNode(kind, setDel(qnn, createDefaultDelegate())); - } - - protected static , K extends Kind> T castNameNode(K kind, NameNode n) - { - if (!n.toName().getKind().equals(kind)) - { - throw new RuntimeException("Shouldn't get in here: " + kind + ", " + n); - } - @SuppressWarnings("unchecked") - T tmp = (T) n; - return tmp; - }*/ - @Override - public void AmbigNameNode(AmbigNameNode n) + public void NonRoleArgList(NonRoleArgList n) { - setDel(n, new AmbigNameNodeDel()); + setDel(n, new NonRoleArgListDel()); } @Override - public void IdNode(IdNode n) + public void NonRoleArg(NonRoleArg n) { setDel(n, createDefaultDelegate()); } @Override - public void ExtIdNode(ExtIdNode n) - { - setDel(n, createDefaultDelegate()); - } - - /*@Override - public NonRoleParamNode NonRoleParamNode(CommonTree source, K kind, String identifier) - { - NonRoleParamNode pn = new NonRoleParamNode(source, kind, identifier); - pn = setDel(pn, new ParamNodeDel()); - return pn; - }*/ - - @Override - public void SigParamNode(SigParamNode n) + public void GChoice(GChoice n) { - setDel(n, new NonRoleParamNodeDel()); + setDel(n, new GChoiceDel()); } @Override - public void DataParamNode(DataParamNode n) + public void GRecursion(GRecursion n) { - setDel(n, new NonRoleParamNodeDel()); + setDel(n, new GRecursionDel()); } + +} @@ -742,4 +646,3 @@ public LDo LDo(CommonTree source, RoleArgList roleinstans, NonRoleArgList argins ld = setDel(ld, new LDoDel()); return ld; }*/ -} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index fc4dfcc0e..704e5eb5c 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -19,18 +19,18 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTreeAdaptor; import org.scribble.ast.AuxMod; -import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.DataDecl; import org.scribble.ast.ExplicitMod; import org.scribble.ast.ImportModule; -import org.scribble.ast.MessageSigNameDecl; -import org.scribble.ast.MessageSigNode; +import org.scribble.ast.SigDecl; +import org.scribble.ast.SigLitNode; import org.scribble.ast.Module; import org.scribble.ast.ModuleDecl; import org.scribble.ast.NonRoleArg; import org.scribble.ast.NonRoleArgList; import org.scribble.ast.NonRoleParamDeclList; -import org.scribble.ast.PayloadElemList; -import org.scribble.ast.ProtocolModList; +import org.scribble.ast.PayElemList; +import org.scribble.ast.ProtoModList; import org.scribble.ast.RoleArg; import org.scribble.ast.RoleArgList; import org.scribble.ast.RoleDecl; @@ -38,19 +38,19 @@ import org.scribble.ast.ScribNil; import org.scribble.ast.ScribNode; import org.scribble.ast.SigParamDecl; -import org.scribble.ast.TypeParamDecl; -import org.scribble.ast.UnaryPayloadElem; +import org.scribble.ast.DataParamDecl; +import org.scribble.ast.UnaryPayElem; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; import org.scribble.ast.global.GContinue; import org.scribble.ast.global.GDisconnect; import org.scribble.ast.global.GDo; import org.scribble.ast.global.GInteractionSeq; -import org.scribble.ast.global.GMessageTransfer; -import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ast.global.GProtocolDef; -import org.scribble.ast.global.GProtocolHeader; +import org.scribble.ast.global.GMsgTransfer; +import org.scribble.ast.global.GProtoBlock; +import org.scribble.ast.global.GProtoDecl; +import org.scribble.ast.global.GProtoDef; +import org.scribble.ast.global.GProtoHeader; import org.scribble.ast.global.GRecursion; import org.scribble.ast.global.GWrap; import org.scribble.ast.name.qualified.DataNameNode; @@ -97,36 +97,37 @@ public ScribNode create(Token t) case ScribbleParser.MODULEDECL: return new ModuleDecl(t); case ScribbleParser.IMPORTMODULE: return new ImportModule(t); - case ScribbleParser.DATADECL: return new DataTypeDecl(t); - case ScribbleParser.SIGDECL: return new MessageSigNameDecl(t); - case ScribbleParser.GPROTODECL: return new GProtocolDecl(t); + case ScribbleParser.DATADECL: return new DataDecl(t); + case ScribbleParser.SIGDECL: return new SigDecl(t); + case ScribbleParser.GPROTODECL: return new GProtoDecl(t); // CHECKME: refactor into header? - case ScribbleParser.PROTOMOD_LIST: return new ProtocolModList(t); + case ScribbleParser.PROTOMOD_LIST: return new ProtoModList(t); case ScribbleParser.AUX_KW: return new AuxMod(t); // FIXME: KW return by parser directly (cf. other tokens are imaginary) case ScribbleParser.EXPLICIT_KW: return new ExplicitMod(t); - case ScribbleParser.GPROTOHEADER: return new GProtocolHeader(t); + case ScribbleParser.GPROTOHEADER: return new GProtoHeader(t); case ScribbleParser.ROLEDECL_LIST: return new RoleDeclList(t); case ScribbleParser.ROLEDECL: return new RoleDecl(t); case ScribbleParser.PARAMDECL_LIST: return new NonRoleParamDeclList(t); - case ScribbleParser.DATAPARAMDECL: return new TypeParamDecl(t); + case ScribbleParser.DATAPARAMDECL: return new DataParamDecl(t); case ScribbleParser.SIGPARAMDECL: return new SigParamDecl(t); - case ScribbleParser.GPROTODEF: return new GProtocolDef(t); - case ScribbleParser.GPROTOBLOCK: return new GProtocolBlock(t); + case ScribbleParser.GPROTODEF: return new GProtoDef(t); + case ScribbleParser.GPROTOBLOCK: return new GProtoBlock(t); case ScribbleParser.GINTERSEQ: return new GInteractionSeq(t); - case ScribbleParser.SIG_LIT: return new MessageSigNode(t); - case ScribbleParser.PAYELEM_LIST: return new PayloadElemList(t); - case ScribbleParser.UNARY_PAYELEM: return new UnaryPayloadElem<>(t); + case ScribbleParser.SIG_LIT: return new SigLitNode(t); + case ScribbleParser.PAYELEM_LIST: return new PayElemList(t); + case ScribbleParser.UNARY_PAYELEM: return new UnaryPayElem<>(t); case ScribbleParser.GCONNECT: return new GConnect(t); - case ScribbleParser.GCONTINUE: return new GContinue(t); case ScribbleParser.GDCONN: return new GDisconnect(t); - case ScribbleParser.GDO: return new GDo(t); - case ScribbleParser.GMSGTRANSFER: return new GMessageTransfer(t); + case ScribbleParser.GMSGTRANSFER: return new GMsgTransfer(t); case ScribbleParser.GWRAP: return new GWrap(t); + + case ScribbleParser.GCONTINUE: return new GContinue(t); + case ScribbleParser.GDO: return new GDo(t); case ScribbleParser.ROLEARG_LIST: return new RoleArgList(t); case ScribbleParser.ROLEARG: return new RoleArg(t); From 3f30072b3d96174fc34c9e880d341f05d8d37540 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 17:40:00 +0100 Subject: [PATCH 280/539] Continued: cleaning up ast class names. --- .../antlr3/org/scribble/parser/antlr/Scribble.g | 14 +++++++------- .../scribble/parser/scribble/AstFactoryImpl.java | 4 ++-- .../scribble/parser/scribble/ScribTreeAdaptor.java | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 20b810c53..1767b9614 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -128,8 +128,8 @@ tokens ROLEARG_LIST = 'ROLEARG_LIST'; // Cf. ROLEDECL ROLEARG = 'ROLEARG'; - ARG_LIST = 'ARG_LIST'; // Cf. PARAM_DECL - ARG = 'ARG'; + NONROLEARG_LIST = 'NONROLEARG_LIST'; // Cf. ...PARAMDECL + NONROLEARG = 'NONROLEARG'; GCHOICE = 'GCHOICE'; GRECURSION = 'GRECURSION'; @@ -561,18 +561,18 @@ rolearg: rolename -> ^(ROLEARG rolename) ; nonroleargs: - -> ^(ARG_LIST) + -> ^(NONROLEARG_LIST) | - t='<' nonrolearg (',' nonrolearg)* '>' -> ^(ARG_LIST[$t] nonrolearg+) + t='<' nonrolearg (',' nonrolearg)* '>' -> ^(NONROLEARG_LIST[$t] nonrolearg+) ; // Grammatically same as message, but qualifiedname case may also be a payload type nonrolearg: - siglit -> ^(ARG siglit) + siglit -> ^(NONROLEARG siglit) | - ambigname -> ^(ARG ambigname) + ambigname -> ^(NONROLEARG ambigname) | - qualifieddataname -> ^(ARG qualifieddataname) // FIXME: sig name -- need an ambig qualified name + qualifieddataname -> ^(NONROLEARG qualifieddataname) // FIXME: sig name -- need an ambig qualified name ; // { parseNonRoleArg($qualifiedname.tree) } // Like payelem, simple names need disambiguation diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java index 2cec0fec2..3fe6c3e69 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java @@ -599,7 +599,7 @@ public RoleArg RoleArg(RoleNode r) @Override public NonRoleArgList NonRoleArgList(List as) { - CommonToken t = newToken(ScribbleParser.ARG_LIST); + CommonToken t = newToken(ScribbleParser.NONROLEARG_LIST); NonRoleArgList n = new NonRoleArgList(t); n.addChildren(as); del(n, new NonRoleArgListDel()); @@ -609,7 +609,7 @@ public NonRoleArgList NonRoleArgList(List as) @Override public NonRoleArg NonRoleArg(NonRoleArgNode arg) { - CommonToken t = newToken(ScribbleParser.ARG); + CommonToken t = newToken(ScribbleParser.NONROLEARG); NonRoleArg n = new NonRoleArg(t); n.addChild(arg); del(n, createDefaultDelegate()); diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java index 704e5eb5c..6bf68b7ad 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java @@ -131,8 +131,8 @@ public ScribNode create(Token t) case ScribbleParser.ROLEARG_LIST: return new RoleArgList(t); case ScribbleParser.ROLEARG: return new RoleArg(t); - case ScribbleParser.ARG_LIST: return new NonRoleArgList(t); - case ScribbleParser.ARG: return new NonRoleArg(t); + case ScribbleParser.NONROLEARG_LIST: return new NonRoleArgList(t); + case ScribbleParser.NONROLEARG: return new NonRoleArg(t); case ScribbleParser.GCHOICE: return new GChoice(t); case ScribbleParser.GRECURSION: return new GRecursion(t); From fd5e5e0f9524b3bd8c6dea5167ed18c52bea7d98 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 17:52:10 +0100 Subject: [PATCH 281/539] Continued: cleaning up ast class names. --- .../java/org/scribble/ast/AstFactory.java | 4 +- .../main/java/org/scribble/ast/AuxMod.java | 2 +- .../org/scribble/ast/BasicInteraction.java | 4 +- .../main/java/org/scribble/ast/Choice.java | 10 +-- .../org/scribble/ast/CompoundInteraction.java | 4 +- .../org/scribble/ast/CompoundSessionNode.java | 4 +- .../java/org/scribble/ast/ConnectAction.java | 4 +- .../main/java/org/scribble/ast/Continue.java | 4 +- .../main/java/org/scribble/ast/DataDecl.java | 4 +- .../java/org/scribble/ast/DataParamDecl.java | 6 +- .../org/scribble/ast/DirectedInteraction.java | 4 +- .../org/scribble/ast/DisconnectAction.java | 4 +- .../src/main/java/org/scribble/ast/Do.java | 16 ++-- .../java/org/scribble/ast/ExplicitMod.java | 2 +- .../java/org/scribble/ast/InteractionSeq.java | 6 +- .../org/scribble/ast/MessageTransfer.java | 4 +- .../main/java/org/scribble/ast/Module.java | 14 +-- .../java/org/scribble/ast/NonProtoDecl.java | 4 +- .../java/org/scribble/ast/NonRoleArgList.java | 12 +-- .../main/java/org/scribble/ast/PayElem.java | 8 +- .../java/org/scribble/ast/PayElemList.java | 4 +- .../{ProtocolBlock.java => ProtoBlock.java} | 16 ++-- .../main/java/org/scribble/ast/ProtoDecl.java | 16 ++-- .../ast/{ProtocolDef.java => ProtoDef.java} | 22 ++--- .../{ProtocolHeader.java => ProtoHeader.java} | 26 +++--- ...otocolKindNode.java => ProtoKindNode.java} | 4 +- .../ast/{ProtocolMod.java => ProtoMod.java} | 8 +- .../java/org/scribble/ast/ProtoModList.java | 4 +- .../main/java/org/scribble/ast/Recursion.java | 10 +-- .../java/org/scribble/ast/ScribNodeBase.java | 12 +-- .../java/org/scribble/ast/SessionNode.java | 4 +- .../main/java/org/scribble/ast/SigDecl.java | 8 +- .../java/org/scribble/ast/SigLitNode.java | 8 +- .../java/org/scribble/ast/SigParamDecl.java | 6 +- .../org/scribble/ast/SimpleSessionNode.java | 4 +- .../java/org/scribble/ast/UnaryPayElem.java | 8 +- .../scribble/ast/context/DependencyMap.java | 77 ---------------- .../ast/context/ProtocolDeclContext.java | 70 --------------- .../ast/context/global/GDependencyMap.java | 36 -------- .../context/global/GProtocolDeclContext.java | 46 ---------- .../ast/context/local/LDependencyMap.java | 36 -------- .../context/local/LProjectionDeclContext.java | 50 ----------- .../context/local/LProtocolDeclContext.java | 46 ---------- .../scribble/ast/global/GDelegPayElem.java | 8 +- .../java/org/scribble/ast/global/GDo.java | 8 +- .../org/scribble/ast/global/GProtoBlock.java | 6 +- .../org/scribble/ast/global/GProtoDecl.java | 6 +- .../org/scribble/ast/global/GProtoDef.java | 6 +- .../org/scribble/ast/global/GProtoHeader.java | 10 +-- .../org/scribble/ast/global/GScribNode.java | 4 +- .../scribble/ast/name/PayElemNameNode.java | 8 +- .../ast/name/qualified/DataNameNode.java | 8 +- .../ast/name/qualified/GProtoNameNode.java | 10 +-- .../ast/name/qualified/LProtoNameNode.java | 13 ++- .../ast/name/qualified/MemberNameNode.java | 2 +- .../ast/name/qualified/ModuleNameNode.java | 2 +- ...otocolNameNode.java => ProtoNameNode.java} | 12 +-- ...alifiedNameNode.java => QualNameNode.java} | 6 +- .../ast/name/qualified/SigNameNode.java | 12 +-- .../ast/name/simple/AmbigNameNode.java | 8 +- .../ast/name/simple/DataParamNode.java | 8 +- .../ast/name/simple/SigParamNode.java | 10 +-- .../java/org/scribble/del/DoArgListDel.java | 6 +- .../src/main/java/org/scribble/del/DoDel.java | 28 +++--- .../org/scribble/del/NonRoleArgListDel.java | 4 +- .../org/scribble/del/ProtocolDeclDel.java | 4 +- .../del/global/GDelegationElemDel.java | 6 +- .../java/org/scribble/del/global/GDoDel.java | 6 +- .../scribble/del/global/GProtocolDeclDel.java | 4 +- .../name/qualified/MessageSigNameNodeDel.java | 4 +- .../del/name/simple/AmbigNameNodeDel.java | 4 +- .../java/org/scribble/lang/LangContext.java | 4 +- .../lang/context/ModuleContextCollector.java | 18 ++-- .../java/org/scribble/cli/CommandLine.java | 26 +++--- .../org/scribble/codegen/java/ApiGen.java | 6 +- .../codegen/java/JEndpointApiGenerator.java | 6 +- .../callbackapi/CBEndpointApiGenerator.java | 16 ++-- .../callbackapi/CBEndpointApiGenerator3.java | 18 ++-- .../java/sessionapi/SessionApiGenerator.java | 30 +++---- .../java/statechanapi/BranchSockGen.java | 12 +-- .../java/statechanapi/CaseSockGen.java | 8 +- .../java/statechanapi/HandlerIfaceGen.java | 8 +- .../java/statechanapi/InputFutureGen.java | 12 +-- .../java/statechanapi/OutputSockGen.java | 8 +- .../java/statechanapi/ReceiveSockGen.java | 12 +-- .../java/statechanapi/ScribSockGen.java | 8 +- .../StateChannelApiGenerator.java | 10 +-- .../statechanapi/ioifaces/ActionIfaceGen.java | 8 +- .../statechanapi/ioifaces/CaseIfaceGen.java | 6 +- .../statechanapi/ioifaces/HandleIfaceGen.java | 6 +- .../ioifaces/IOInterfacesGenerator.java | 6 +- .../ioifaces/IOStateIfaceGen.java | 4 +- .../ioifaces/ReceiveIfaceGen.java | 4 +- .../statetype/STStateChanAPIBuilder.java | 6 +- .../main/java/org/scribble/core/job/Job.java | 20 ++--- .../org/scribble/core/job/JobContext.java | 70 +++++++-------- .../java/org/scribble/core/lang/Protocol.java | 10 +-- .../org/scribble/core/lang/SubprotoSig.java | 6 +- .../core/lang/context/ModuleContext.java | 36 ++++---- .../core/lang/context/ScribNames.java | 16 ++-- .../scribble/core/lang/global/GProtocol.java | 26 +++--- .../scribble/core/lang/local/LProjection.java | 12 +-- .../scribble/core/lang/local/LProtocol.java | 14 +-- .../scribble/core/model/GraphBuilderUtil.java | 4 +- .../java/org/scribble/core/model/MAction.java | 10 +-- .../org/scribble/core/model/MPrettyState.java | 4 +- .../java/org/scribble/core/model/MState.java | 10 +-- .../org/scribble/core/model/ModelFactory.java | 22 ++--- .../scribble/core/model/ModelFactoryImpl.java | 22 ++--- .../core/model/endpoint/AutGraphParser.java | 8 +- .../core/model/endpoint/actions/EAccept.java | 4 +- .../core/model/endpoint/actions/EAction.java | 4 +- .../core/model/endpoint/actions/EReceive.java | 4 +- .../core/model/endpoint/actions/ERequest.java | 4 +- .../core/model/endpoint/actions/ESend.java | 4 +- .../scribble/core/model/global/SGraph.java | 6 +- .../core/model/global/SGraphBuilderUtil.java | 4 +- .../core/model/global/actions/SAccept.java | 4 +- .../core/model/global/actions/SAction.java | 4 +- .../core/model/global/actions/SConnect.java | 4 +- .../core/model/global/actions/SReceive.java | 4 +- .../core/model/global/actions/SRequest.java | 4 +- .../core/model/global/actions/SSend.java | 4 +- .../kind/{ScopeKind.java => DataKind.java} | 14 +-- .../scribble/core/type/kind/DataTypeKind.java | 44 --------- .../org/scribble/core/type/kind/Global.java | 2 +- .../org/scribble/core/type/kind/Local.java | 2 +- .../{MessageIdKind.java => MsgIdKind.java} | 2 +- ...NonProtocolKind.java => NonProtoKind.java} | 2 +- .../core/type/kind/NonRoleArgKind.java | 4 +- .../org/scribble/core/type/kind/OpKind.java | 2 +- ...{PayloadTypeKind.java => PayElemKind.java} | 2 +- .../{ProtocolKind.java => ProtoKind.java} | 2 +- .../org/scribble/core/type/kind/SigKind.java | 2 +- .../scribble/core/type/name/AmbigName.java | 4 +- .../org/scribble/core/type/name/DataType.java | 14 +-- .../{GDelegationType.java => GDelegType.java} | 16 ++-- .../{GProtocolName.java => GProtoName.java} | 16 ++-- .../{LProtocolName.java => LProtoName.java} | 18 ++-- .../scribble/core/type/name/MemberName.java | 2 +- .../scribble/core/type/name/ModuleName.java | 2 +- .../type/name/{MessageId.java => MsgId.java} | 4 +- .../java/org/scribble/core/type/name/Op.java | 2 +- .../scribble/core/type/name/PackageName.java | 2 +- ...{PayloadElemType.java => PayElemType.java} | 4 +- .../{ProtocolName.java => ProtoName.java} | 10 +-- .../{QualifiedName.java => QualName.java} | 4 +- .../org/scribble/core/type/name/Scope.java | 90 ------------------- .../{MessageSigName.java => SigName.java} | 18 ++-- .../core/type/session/BasicInteraction.java | 4 +- .../scribble/core/type/session/Choice.java | 4 +- .../core/type/session/ConnectAction.java | 4 +- .../scribble/core/type/session/Continue.java | 4 +- .../type/session/DirectedInteraction.java | 4 +- .../core/type/session/DisconnectAction.java | 4 +- .../org/scribble/core/type/session/Do.java | 6 +- .../scribble/core/type/session/Message.java | 6 +- ...{MessageTransfer.java => MsgTransfer.java} | 6 +- .../scribble/core/type/session/Payload.java | 8 +- .../scribble/core/type/session/Recursion.java | 4 +- .../org/scribble/core/type/session/SType.java | 4 +- .../scribble/core/type/session/STypeBase.java | 4 +- .../core/type/session/STypeFactory.java | 8 +- .../org/scribble/core/type/session/Seq.java | 4 +- .../session/{MessageSig.java => SigLit.java} | 12 +-- .../core/type/session/global/GDo.java | 8 +- .../type/session/global/GMessageTransfer.java | 4 +- .../scribble/core/type/session/local/LDo.java | 8 +- .../core/type/session/local/LRcv.java | 4 +- .../core/type/session/local/LSend.java | 4 +- .../core/visit/MessageIdGatherer.java | 10 +-- .../core/visit/NonProtoDepsGatherer.java | 26 +++--- .../core/visit/ProtoDepsCollector.java | 14 +-- .../org/scribble/core/visit/RecPruner.java | 4 +- .../scribble/core/visit/RecVarGatherer.java | 4 +- .../org/scribble/core/visit/RoleGatherer.java | 4 +- .../org/scribble/core/visit/STypeAgg.java | 8 +- .../scribble/core/visit/STypeAggNoThrow.java | 8 +- .../scribble/core/visit/STypeGatherer.java | 8 +- .../org/scribble/core/visit/STypeInliner.java | 4 +- .../scribble/core/visit/STypeUnfolder.java | 8 +- .../org/scribble/core/visit/STypeVisitor.java | 4 +- .../core/visit/STypeVisitorNoThrow.java | 4 +- .../org/scribble/core/visit/Substitutor.java | 14 +-- .../global/ExtChoiceConsistencyChecker.java | 4 +- .../core/visit/global/GTypeInliner.java | 8 +- .../core/visit/global/InlinedProjector.java | 20 ++--- .../scribble/core/visit/global/Projector.java | 12 +-- .../visit/global/RoleEnablingChecker.java | 4 +- .../core/visit/local/EGraphBuilder.java | 12 +-- .../core/visit/local/LTypeInliner.java | 8 +- .../core/visit/local/ReachabilityChecker.java | 4 +- .../visit/local/SingleContinueChecker.java | 4 +- .../java/org/scribble/util/MessageIdMap.java | 16 ++-- .../parser/scribble/AstFactoryImpl.java | 4 +- .../org/scribble/runtime/session/Session.java | 8 +- 196 files changed, 783 insertions(+), 1279 deletions(-) rename scribble-ast/src/main/java/org/scribble/ast/{ProtocolBlock.java => ProtoBlock.java} (77%) rename scribble-ast/src/main/java/org/scribble/ast/{ProtocolDef.java => ProtoDef.java} (69%) rename scribble-ast/src/main/java/org/scribble/ast/{ProtocolHeader.java => ProtoHeader.java} (78%) rename scribble-ast/src/main/java/org/scribble/ast/{ProtocolKindNode.java => ProtoKindNode.java} (85%) rename scribble-ast/src/main/java/org/scribble/ast/{ProtocolMod.java => ProtoMod.java} (83%) delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/context/DependencyMap.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/context/ProtocolDeclContext.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/context/global/GDependencyMap.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/context/global/GProtocolDeclContext.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/context/local/LDependencyMap.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/context/local/LProjectionDeclContext.java delete mode 100644 scribble-ast/src/main/java/org/scribble/ast/context/local/LProtocolDeclContext.java rename scribble-ast/src/main/java/org/scribble/ast/name/qualified/{ProtocolNameNode.java => ProtoNameNode.java} (73%) rename scribble-ast/src/main/java/org/scribble/ast/name/qualified/{QualifiedNameNode.java => QualNameNode.java} (84%) rename scribble-core/src/main/java/org/scribble/core/type/kind/{ScopeKind.java => DataKind.java} (73%) delete mode 100644 scribble-core/src/main/java/org/scribble/core/type/kind/DataTypeKind.java rename scribble-core/src/main/java/org/scribble/core/type/kind/{MessageIdKind.java => MsgIdKind.java} (93%) rename scribble-core/src/main/java/org/scribble/core/type/kind/{NonProtocolKind.java => NonProtoKind.java} (93%) rename scribble-core/src/main/java/org/scribble/core/type/kind/{PayloadTypeKind.java => PayElemKind.java} (90%) rename scribble-core/src/main/java/org/scribble/core/type/kind/{ProtocolKind.java => ProtoKind.java} (92%) rename scribble-core/src/main/java/org/scribble/core/type/name/{GDelegationType.java => GDelegType.java} (81%) rename scribble-core/src/main/java/org/scribble/core/type/name/{GProtocolName.java => GProtoName.java} (75%) rename scribble-core/src/main/java/org/scribble/core/type/name/{LProtocolName.java => LProtoName.java} (72%) rename scribble-core/src/main/java/org/scribble/core/type/name/{MessageId.java => MsgId.java} (86%) rename scribble-core/src/main/java/org/scribble/core/type/name/{PayloadElemType.java => PayElemType.java} (87%) rename scribble-core/src/main/java/org/scribble/core/type/name/{ProtocolName.java => ProtoName.java} (74%) rename scribble-core/src/main/java/org/scribble/core/type/name/{QualifiedName.java => QualName.java} (89%) delete mode 100644 scribble-core/src/main/java/org/scribble/core/type/name/Scope.java rename scribble-core/src/main/java/org/scribble/core/type/name/{MessageSigName.java => SigName.java} (77%) rename scribble-core/src/main/java/org/scribble/core/type/session/{MessageTransfer.java => MsgTransfer.java} (89%) rename scribble-core/src/main/java/org/scribble/core/type/session/{MessageSig.java => SigLit.java} (86%) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 28e99c989..a39b7b67f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -44,7 +44,7 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.kind.PayloadTypeKind; +import org.scribble.core.type.kind.PayElemKind; // CHECKME: add Token params back (for better transformation, cf. ScribNodeBase.source), and use null for "fresh"? @@ -97,7 +97,7 @@ NonRoleParamDeclList NonRoleParamDeclList( SigLitNode SigLitNode(OpNode op, PayElemList pay); PayElemList PayElemList(List> elems); - UnaryPayElem UnaryPayElem( + UnaryPayElem UnaryPayElem( PayElemNameNode name); GDelegPayElem GDelegPayElem(GProtoNameNode name, RoleNode r); diff --git a/scribble-ast/src/main/java/org/scribble/ast/AuxMod.java b/scribble-ast/src/main/java/org/scribble/ast/AuxMod.java index 5839f03cf..f3218a197 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AuxMod.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AuxMod.java @@ -15,7 +15,7 @@ import org.antlr.runtime.Token; -public class AuxMod extends ProtocolMod +public class AuxMod extends ProtoMod { // ScribTreeAdaptor#create constructor public AuxMod(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/BasicInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/BasicInteraction.java index 29505a63f..a205e8f77 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/BasicInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/BasicInteraction.java @@ -14,9 +14,9 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; -public abstract class BasicInteraction +public abstract class BasicInteraction extends SimpleSessionNode { // ScribTreeAdaptor#create constructor diff --git a/scribble-ast/src/main/java/org/scribble/ast/Choice.java b/scribble-ast/src/main/java/org/scribble/ast/Choice.java index 7ba9eeeaf..8824fa305 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Choice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Choice.java @@ -18,12 +18,12 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -public abstract class Choice +public abstract class Choice extends CompoundInteraction { public static final int SUBJ_CHILD_INDEX = 0; @@ -47,13 +47,13 @@ public RoleNode getSubjectChild() } // Override in concrete sub for cast - public abstract List> getBlockChildren(); + public abstract List> getBlockChildren(); @Override public abstract Choice dupNode(); public Choice reconstruct(RoleNode subj, - List> blocks) + List> blocks) { Choice dup = dupNode(); dup.addChild(subj); @@ -66,7 +66,7 @@ public Choice reconstruct(RoleNode subj, public Choice visitChildren(AstVisitor nv) throws ScribException { RoleNode subj = (RoleNode) visitChild(getSubjectChild(), nv); - List> blocks = + List> blocks = visitChildListWithClassEqualityCheck(this, getBlockChildren(), nv); return reconstruct(subj, blocks); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java index d8304bd8f..716948b1b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/CompoundInteraction.java @@ -14,9 +14,9 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; -public abstract class CompoundInteraction +public abstract class CompoundInteraction extends CompoundSessionNode { // ScribTreeAdaptor#create constructor diff --git a/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java index ab7a5e7a5..f320a43da 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/CompoundSessionNode.java @@ -14,10 +14,10 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; // Redundant? Is always a CompoundInteraction -- cf. SimpleSessionNode -public abstract class CompoundSessionNode +public abstract class CompoundSessionNode extends ScribNodeBase implements SessionNode { // ScribTreeAdaptor#create constructor diff --git a/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java b/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java index ff73feb4d..da85ea9f2 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java @@ -17,10 +17,10 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; // TODO CHECKME: factor with MessageTransfer? -public abstract class ConnectAction +public abstract class ConnectAction extends DirectedInteraction { // ScribTreeAdaptor#create constructor diff --git a/scribble-ast/src/main/java/org/scribble/ast/Continue.java b/scribble-ast/src/main/java/org/scribble/ast/Continue.java index 001eb71a3..80cd87efd 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Continue.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Continue.java @@ -15,12 +15,12 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -public abstract class Continue +public abstract class Continue extends SimpleSessionNode { public static final int RECVAR_CHILD_INDEX = 0; diff --git a/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java b/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java index 830790e21..0503cf6df 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java @@ -15,12 +15,12 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.qualified.DataNameNode; -import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.kind.DataKind; import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.ModuleName; import org.scribble.util.Constants; -public class DataDecl extends NonProtoDecl +public class DataDecl extends NonProtoDecl { // ScribTreeAdaptor#create constructor public DataDecl(Token payload) diff --git a/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java index b8041184f..c2db0dba8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java @@ -15,16 +15,16 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.simple.DataParamNode; -import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.kind.DataKind; import org.scribble.core.type.name.DataType; import org.scribble.util.Constants; -public class DataParamDecl extends NonRoleParamDecl +public class DataParamDecl extends NonRoleParamDecl { // ScribTreeAdaptor#create constructor public DataParamDecl(Token t) { - super(t, DataTypeKind.KIND); + super(t, DataKind.KIND); } // Tree#dupNode constructor diff --git a/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java index 1522dcc51..5f2a56231 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java @@ -18,13 +18,13 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.Role; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // FIXME: rename (Simple)Interaction, after existing SimpleInteraction renamed -public abstract class DirectedInteraction +public abstract class DirectedInteraction extends BasicInteraction { public static final int MSG_CHILD_INDEX = 0; diff --git a/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java b/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java index b7c1ae590..b351c640b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java @@ -15,14 +15,14 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // (G)Disconnect is symmetric (send/receive asymmetric/async; request/accept asymmetric/sync; (g)disconnect symmetric/async) // However, LDisconnect is "symmetric" but self-oriented -- "left" used for self -public abstract class DisconnectAction +public abstract class DisconnectAction extends BasicInteraction { public static final int LEFT_CHILD_INDEX = 0; diff --git a/scribble-ast/src/main/java/org/scribble/ast/Do.java b/scribble-ast/src/main/java/org/scribble/ast/Do.java index b1356754c..e832ae2bd 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Do.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Do.java @@ -16,17 +16,17 @@ import java.util.Iterator; import org.antlr.runtime.Token; -import org.scribble.ast.name.qualified.ProtocolNameNode; +import org.scribble.ast.name.qualified.ProtoNameNode; import org.scribble.core.lang.context.ModuleContext; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.kind.ProtoKind; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.lang.LangContext; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -public abstract class Do +public abstract class Do extends SimpleSessionNode // implements ScopedNode { public static final int NAME_CHILD_INDEX = 0; @@ -45,7 +45,7 @@ public Do(Do node) super(node); } - public abstract ProtocolNameNode getProtocolNameNode(); + public abstract ProtoNameNode getProtocolNameNode(); public NonRoleArgList getNonRoleListChild() { @@ -61,7 +61,7 @@ public RoleArgList getRoleListChild() public abstract Do dupNode(); public Do reconstruct(RoleArgList roles, NonRoleArgList args, - ProtocolNameNode proto) + ProtoNameNode proto) { Do sig = dupNode(); sig.addChild(proto); // Order re. getter indices @@ -76,7 +76,7 @@ public Do visitChildren(AstVisitor nv) throws ScribException { RoleArgList ril = (RoleArgList) visitChild(getRoleListChild(), nv); NonRoleArgList al = (NonRoleArgList) visitChild(getNonRoleListChild(), nv); - ProtocolNameNode proto = visitChildWithClassEqualityCheck(this, + ProtoNameNode proto = visitChildWithClassEqualityCheck(this, getProtocolNameNode(), nv); return reconstruct(ril, al, proto); } @@ -84,7 +84,7 @@ public Do visitChildren(AstVisitor nv) throws ScribException // FIXME: mcontext now redundant because NameDisambiguator converts all targets to full names -- NO: currently disamb doesn't // To get full name from original target name, use mcontext visible names (e.g. in or before name disambiguation pass) // This is still useful for subclass casting to G/LProtocolName - public ProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) + public ProtoName getTargetProtocolDeclFullName(ModuleContext mcontext) { //return mcontext.checkProtocolDeclDependencyFullName(this.proto.toName()); return getProtocolNameNode().toName(); // Pre: use after name disambiguation (maybe drop FullName suffix) diff --git a/scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java b/scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java index ff1093866..eb7011285 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java @@ -15,7 +15,7 @@ import org.antlr.runtime.Token; -public class ExplicitMod extends ProtocolMod +public class ExplicitMod extends ProtoMod { // ScribTreeAdaptor#create constructor public ExplicitMod(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java b/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java index c99e04694..ca6524088 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java +++ b/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java @@ -18,12 +18,12 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -public abstract class InteractionSeq - extends ScribNodeBase implements ProtocolKindNode +public abstract class InteractionSeq + extends ScribNodeBase implements ProtoKindNode { // ScribTreeAdaptor#create constructor public InteractionSeq(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/MessageTransfer.java b/scribble-ast/src/main/java/org/scribble/ast/MessageTransfer.java index da6fe1399..ebfe3ce56 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/MessageTransfer.java +++ b/scribble-ast/src/main/java/org/scribble/ast/MessageTransfer.java @@ -14,9 +14,9 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; -public abstract class MessageTransfer +public abstract class MessageTransfer extends DirectedInteraction { // ScribTreeAdaptor#create constructor diff --git a/scribble-ast/src/main/java/org/scribble/ast/Module.java b/scribble-ast/src/main/java/org/scribble/ast/Module.java index b00111c8b..3e1d50315 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Module.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Module.java @@ -23,10 +23,10 @@ import org.antlr.runtime.Token; import org.scribble.ast.global.GProtoDecl; import org.scribble.core.type.kind.Kind; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.ModuleName; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -139,7 +139,7 @@ public DataDecl getDataTypeDeclChild(DataType simpname) // Simple name (as for } // CHECKME: allow sig and type decls with same decl name in same module? - public SigDecl getMessageSigDeclChild(MessageSigName simpname) + public SigDecl getMessageSigDeclChild(SigName simpname) { Optional res = getNonProtoDeclChildren().stream() .filter(x -> (x instanceof SigDecl) @@ -162,7 +162,7 @@ public List getGProtoDeclChildren() } // CHECKME: allow global and local protocols with same simpname in same module? -- currently, no? - public boolean hasGProtocolDecl(GProtocolName simpname) + public boolean hasGProtocolDecl(GProtoName simpname) { return getGProtoDeclChildren().stream() .anyMatch(x -> x.getHeaderChild().getDeclName().equals(simpname)); @@ -170,7 +170,7 @@ public boolean hasGProtocolDecl(GProtocolName simpname) // Pre: hasProtocolDecl(simpname) public GProtoDecl getGProtocolDeclChild( - GProtocolName simpname) + GProtoName simpname) { Optional res = getGProtoDeclChildren().stream() .filter(x -> x.getHeaderChild().getDeclName().equals(simpname)) @@ -194,7 +194,7 @@ public String toString() { s += "\n" + dtd; } - for (ProtoDecl pd : getProtoDeclChildren()) + for (ProtoDecl pd : getProtoDeclChildren()) { s += "\n" + pd; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java b/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java index 3674f2743..8ea244e93 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java @@ -17,12 +17,12 @@ import org.scribble.ast.name.NameNode; import org.scribble.ast.name.simple.ExtIdNode; import org.scribble.ast.name.simple.IdNode; -import org.scribble.core.type.kind.NonProtocolKind; +import org.scribble.core.type.kind.NonProtoKind; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // Rename to something better -public abstract class NonProtoDecl +public abstract class NonProtoDecl extends NameDeclNode implements ModuleMember { // NameDeclNode.NAMENODE_CHILD_INDEX = 0; diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java index c24b9cf8f..69d663eda 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java @@ -21,9 +21,9 @@ import org.scribble.core.type.kind.NonRoleArgKind; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.SigName; import org.scribble.core.type.session.Arg; -import org.scribble.core.type.session.MessageSig; +import org.scribble.core.type.session.SigLit; // Cf. NonRoleParamDeclList public class NonRoleArgList extends DoArgList @@ -72,17 +72,17 @@ public List> getParamKindArgs() List> cast = new LinkedList<>(); for (Arg a : getArguments()) { - if (a instanceof MessageSig) + if (a instanceof SigLit) { - cast.add((MessageSig) a); + cast.add((SigLit) a); } else if (a instanceof DataType) { cast.add((DataType) a); } - else if (a instanceof MessageSigName) + else if (a instanceof SigName) { - cast.add((MessageSigName) a); + cast.add((SigName) a); } else { diff --git a/scribble-ast/src/main/java/org/scribble/ast/PayElem.java b/scribble-ast/src/main/java/org/scribble/ast/PayElem.java index b51985f14..6ee4c8711 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/PayElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/PayElem.java @@ -13,13 +13,13 @@ */ package org.scribble.ast; -import org.scribble.core.type.kind.PayloadTypeKind; -import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.kind.PayElemKind; +import org.scribble.core.type.name.PayElemType; // Not in grammar file -- but cf. DoArg (and PayloadElemList cf. DoArgList) -- i.e. need a wrapper for mixed and initially ambiguous name kinds -public interface PayElem extends ScribNode +public interface PayElem extends ScribNode { - PayloadElemType toPayloadType(); // Mainly a wrapper method for the wrapped NameNode + PayElemType toPayloadType(); // Mainly a wrapper method for the wrapped NameNode default boolean isGlobalDelegationElem() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java b/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java index 3cf1032d1..aed65fa8b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java @@ -17,7 +17,7 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.name.PayElemType; import org.scribble.core.type.session.Payload; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -45,7 +45,7 @@ List> getElementChildren() public Payload toPayload() { - List> pts = getElementChildren().stream() + List> pts = getElementChildren().stream() .map(pe -> pe.toPayloadType()).collect(Collectors.toList()); return new Payload(pts); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoBlock.java similarity index 77% rename from scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java rename to scribble-ast/src/main/java/org/scribble/ast/ProtoBlock.java index bb51bb665..e15bc449c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoBlock.java @@ -14,23 +14,23 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -public abstract class ProtocolBlock +public abstract class ProtoBlock extends ScribNodeBase { public static final int SEQ_CHILD_INDEX = 0; // ScribTreeAdaptor#create constructor - public ProtocolBlock(Token t) + public ProtoBlock(Token t) { super(t); } // Tree#dupNode constructor - protected ProtocolBlock(ProtocolBlock node) + protected ProtoBlock(ProtoBlock node) { super(node); } @@ -43,18 +43,18 @@ public boolean isEmpty() } @Override - public abstract ProtocolBlock dupNode(); + public abstract ProtoBlock dupNode(); - public ProtocolBlock reconstruct(InteractionSeq seq) + public ProtoBlock reconstruct(InteractionSeq seq) { - ProtocolBlock pd = dupNode(); + ProtoBlock pd = dupNode(); pd.addChild(seq); pd.setDel(del()); // No copy return pd; } @Override - public ProtocolBlock visitChildren(AstVisitor nv) throws ScribException + public ProtoBlock visitChildren(AstVisitor nv) throws ScribException { InteractionSeq seq = visitChildWithClassEqualityCheck(this, getInteractSeqChild(), nv); diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java index 9c25d3083..2ee900eb9 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java @@ -16,15 +16,15 @@ import java.util.List; import org.antlr.runtime.Token; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.Role; import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // CHECKME: visitChildren for modifiers -public abstract class ProtoDecl extends ScribNodeBase - implements ModuleMember, ProtocolKindNode +public abstract class ProtoDecl extends ScribNodeBase + implements ModuleMember, ProtoKindNode { public static final int MODLIST_CHILD = 0; public static final int HEADER_CHILD = 1; @@ -60,8 +60,8 @@ public ProtoModList getModifierListChild() } // Implement in subclasses to avoid generic cast - public abstract ProtocolHeader getHeaderChild(); - public abstract ProtocolDef getDefChild(); + public abstract ProtoHeader getHeaderChild(); + public abstract ProtoDef getDefChild(); public List getRoles() { @@ -70,7 +70,7 @@ public List getRoles() } public ProtoDecl reconstruct(ProtoModList mods, - ProtocolHeader header, ProtocolDef def) + ProtoHeader header, ProtoDef def) //, ProtocolDeclContext pdcontext, Env env); { ProtoDecl pd = dupNode(); @@ -87,9 +87,9 @@ public ProtoDecl visitChildren(AstVisitor nv) throws ScribException { ProtoModList mods = visitChildWithClassEqualityCheck(this, getModifierListChild(), nv); - ProtocolHeader header = + ProtoHeader header = visitChildWithClassEqualityCheck(this, getHeaderChild(), nv); - ProtocolDef def = visitChildWithClassEqualityCheck(this, getDefChild(), nv); + ProtoDef def = visitChildWithClassEqualityCheck(this, getDefChild(), nv); return reconstruct(mods, header, def); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolDef.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoDef.java similarity index 69% rename from scribble-ast/src/main/java/org/scribble/ast/ProtocolDef.java rename to scribble-ast/src/main/java/org/scribble/ast/ProtoDef.java index 616f46789..02af32f46 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolDef.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoDef.java @@ -14,42 +14,42 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -public abstract class ProtocolDef extends ScribNodeBase - implements ProtocolKindNode +public abstract class ProtoDef extends ScribNodeBase + implements ProtoKindNode { public static final int BLOCK_CHILD_INDEX = 0; // ScribTreeAdaptor#create constructor - public ProtocolDef(Token t) + public ProtoDef(Token t) { super(t); } // Tree#dupNode constructor - protected ProtocolDef(ProtocolDef node) + protected ProtoDef(ProtoDef node) { super(node); } - public abstract ProtocolBlock getBlockChild(); + public abstract ProtoBlock getBlockChild(); - public abstract ProtocolDef dupNode(); + public abstract ProtoDef dupNode(); - public ProtocolDef reconstruct(ProtocolBlock block) + public ProtoDef reconstruct(ProtoBlock block) { - ProtocolDef pd = dupNode(); + ProtoDef pd = dupNode(); pd.addChild(block); pd.setDel(del()); // No copy return pd; } @Override - public ProtocolDef visitChildren(AstVisitor nv) throws ScribException + public ProtoDef visitChildren(AstVisitor nv) throws ScribException { - ProtocolBlock block = + ProtoBlock block = visitChildWithClassEqualityCheck(this, getBlockChild(), nv); return reconstruct(block); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolHeader.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoHeader.java similarity index 78% rename from scribble-ast/src/main/java/org/scribble/ast/ProtocolHeader.java rename to scribble-ast/src/main/java/org/scribble/ast/ProtoHeader.java index 8fed3f878..d7f44ce1e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolHeader.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoHeader.java @@ -14,37 +14,37 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.ast.name.qualified.ProtocolNameNode; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.ast.name.qualified.ProtoNameNode; +import org.scribble.core.type.kind.ProtoKind; +import org.scribble.core.type.name.ProtoName; import org.scribble.del.ScribDel; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // TODO: parameterize on global/local name node and role decl list (i.e. self roles) -public abstract class ProtocolHeader - extends NameDeclNode implements ProtocolKindNode +public abstract class ProtoHeader + extends NameDeclNode implements ProtoKindNode { public static final int NAMENODE_CHILD = 0; public static final int PARAMDECLLIST_CHILD = 1; public static final int ROLEDECLLIST_CHILD = 2; // ScribTreeAdaptor#create constructor - public ProtocolHeader(Token t) + public ProtoHeader(Token t) { super(t); } // Tree#dupNode constructor - protected ProtocolHeader(ProtocolHeader node) + protected ProtoHeader(ProtoHeader node) { super(node); } // Simple name @Override - public abstract ProtocolNameNode getNameNodeChild(); + public abstract ProtoNameNode getNameNodeChild(); public NonRoleParamDeclList getParamDeclListChild() { @@ -61,12 +61,12 @@ public boolean isParamDeclListEmpty() return getParamDeclListChild().isEmpty(); } - public abstract ProtocolHeader dupNode(); + public abstract ProtoHeader dupNode(); - public ProtocolHeader reconstruct(ProtocolNameNode name, + public ProtoHeader reconstruct(ProtoNameNode name, RoleDeclList rdl, NonRoleParamDeclList pdl) { - ProtocolHeader pd = dupNode(); + ProtoHeader pd = dupNode(); ScribDel del = del(); pd.addChild(name); pd.addChild(pdl); // Cf. above TODO (rdl/pdl child order) @@ -76,7 +76,7 @@ public ProtocolHeader reconstruct(ProtocolNameNode name, } @Override - public ProtocolHeader visitChildren(AstVisitor nv) throws ScribException + public ProtoHeader visitChildren(AstVisitor nv) throws ScribException { /*ProtocolNameNode nameNodeChild = (ProtocolNameNode) visitChild( getNameNodeChild(), nv);*/ // Don't really need to visit, and can avoid generic cast @@ -87,7 +87,7 @@ public ProtocolHeader visitChildren(AstVisitor nv) throws ScribException } @Override - public ProtocolName getDeclName() + public ProtoName getDeclName() { return getNameNodeChild().toName(); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolKindNode.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoKindNode.java similarity index 85% rename from scribble-ast/src/main/java/org/scribble/ast/ProtocolKindNode.java rename to scribble-ast/src/main/java/org/scribble/ast/ProtoKindNode.java index b99755be9..dfa28f83c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolKindNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoKindNode.java @@ -13,9 +13,9 @@ */ package org.scribble.ast; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; -public interface ProtocolKindNode extends ScribNode +public interface ProtoKindNode extends ScribNode { K getKind(); diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtocolMod.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoMod.java similarity index 83% rename from scribble-ast/src/main/java/org/scribble/ast/ProtocolMod.java rename to scribble-ast/src/main/java/org/scribble/ast/ProtoMod.java index ba8388e2a..2a9971e1f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtocolMod.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoMod.java @@ -17,16 +17,16 @@ import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -public abstract class ProtocolMod extends ScribNodeBase +public abstract class ProtoMod extends ScribNodeBase { // ScribTreeAdaptor#create constructor - public ProtocolMod(Token t) + public ProtoMod(Token t) { super(t); } // Tree#dupNode constructor - protected ProtocolMod(ProtocolMod node) + protected ProtoMod(ProtoMod node) { super(node); } @@ -42,7 +42,7 @@ public boolean isExplicit() } @Override - public ProtocolMod visitChildren(AstVisitor nv) throws ScribException + public ProtoMod visitChildren(AstVisitor nv) throws ScribException { return this; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java index 160a7d060..37b36d628 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java @@ -36,9 +36,9 @@ protected ProtoModList(ProtoModList node) } // Cf., NameNode::getSimpleNameList - public List getModList() + public List getModList() { - return ((List) getChildren()).stream().map(x -> (ProtocolMod) x) + return ((List) getChildren()).stream().map(x -> (ProtoMod) x) .collect(Collectors.toList()); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/Recursion.java b/scribble-ast/src/main/java/org/scribble/ast/Recursion.java index 268021da3..f5d4c9cf5 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Recursion.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Recursion.java @@ -15,12 +15,12 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.simple.RecVarNode; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -public abstract class Recursion +public abstract class Recursion extends CompoundInteraction { public static final int RECVAR_CHILD_INDEX = 0; @@ -45,9 +45,9 @@ public RecVarNode getRecVarChild() return (RecVarNode) getChild(RECVAR_CHILD_INDEX); } - public abstract ProtocolBlock getBlockChild(); + public abstract ProtoBlock getBlockChild(); - public Recursion reconstruct(RecVarNode recvar, ProtocolBlock block) + public Recursion reconstruct(RecVarNode recvar, ProtoBlock block) { Recursion r = dupNode(); r.addChild(recvar); @@ -60,7 +60,7 @@ public Recursion reconstruct(RecVarNode recvar, ProtocolBlock block) public Recursion visitChildren(AstVisitor nv) throws ScribException { RecVarNode recvar = (RecVarNode) visitChild(getRecVarChild(), nv); - ProtocolBlock block = visitChildWithClassEqualityCheck(this, + ProtoBlock block = visitChildWithClassEqualityCheck(this, getBlockChild(), nv); return reconstruct(recvar, block); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java index 661b99a38..bdb1cf59b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -22,7 +22,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.del.ScribDel; import org.scribble.util.RuntimeScribException; import org.scribble.util.ScribException; @@ -232,8 +232,8 @@ private final static List visitChi // Takes clazz+kind to handle generic ProtocolKindNodes -- cf. ScribUtil.castNodeByClass, for casting to ground class types // R is expected to be N, i.e. the generic (ProtocolKindNode) class N parameterised by K - protected final static , K extends ProtocolKind, - R extends ProtocolKindNode> + protected final static , K extends ProtoKind, + R extends ProtoKindNode> R visitProtocolKindChildWithCastCheck( ScribNode parent, ScribNode child, AstVisitor nv, Class clazz, K kind, Function cast) throws ScribException @@ -244,7 +244,7 @@ R visitProtocolKindChildWithCastCheck( throw new RuntimeException(nv.getClass() + " generic visit error: " + clazz + ", " + visited.getClass()); } - ProtocolKindNode pkn = (ProtocolKindNode) visited; + ProtoKindNode pkn = (ProtoKindNode) visited; if ((pkn.isGlobal() && !kind.equals(Global.KIND)) || (pkn.isLocal() && !kind.equals(Local.KIND))) { @@ -254,8 +254,8 @@ R visitProtocolKindChildWithCastCheck( return cast.apply(pkn); } - protected final static , - K extends ProtocolKind, R extends ProtocolKindNode> + protected final static , + K extends ProtoKind, R extends ProtoKindNode> List visitProtocolKindChildListWithCastCheck( ScribNode parent, List children, AstVisitor nv, Class c, K k, Function f) throws ScribException diff --git a/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java index 088220a84..38c2ab63e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SessionNode.java @@ -13,11 +13,11 @@ */ package org.scribble.ast; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; // A SessionNode is an AST node that corresponds to a session type constructor -- elements of InteractionSeq nodes // The SessionNodeDel hierarchy corresponds to this SessionNode hierarchy -public interface SessionNode extends ProtocolKindNode +public interface SessionNode extends ProtoKindNode { } diff --git a/scribble-ast/src/main/java/org/scribble/ast/SigDecl.java b/scribble-ast/src/main/java/org/scribble/ast/SigDecl.java index 40179575e..103cc4c37 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/SigDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SigDecl.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.core.type.kind.SigKind; -import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.ModuleName; import org.scribble.util.Constants; @@ -54,16 +54,16 @@ public boolean isMessageSigNameDecl() } @Override - public MessageSigName getDeclName() + public SigName getDeclName() { return getNameNodeChild().toName(); } @Override - public MessageSigName getFullMemberName(Module mod) + public SigName getFullMemberName(Module mod) { ModuleName fullmodname = mod.getFullModuleName(); - return new MessageSigName(fullmodname, getDeclName()); + return new SigName(fullmodname, getDeclName()); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java b/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java index dc05ca79e..61ad795c4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java @@ -15,7 +15,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.simple.OpNode; -import org.scribble.core.type.session.MessageSig; +import org.scribble.core.type.session.SigLit; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -78,14 +78,14 @@ public boolean isMessageSigNode() // Make a direct scoped version? (taking scope as argument) @Override - public MessageSig toArg() + public SigLit toArg() { - return new MessageSig(getOpChild().toName(), + return new SigLit(getOpChild().toName(), getPayloadListChild().toPayload()); } @Override - public MessageSig toMessage() + public SigLit toMessage() { return toArg(); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/SigParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/SigParamDecl.java index 8387db57a..a8d7169d4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/SigParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SigParamDecl.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.simple.SigParamNode; import org.scribble.core.type.kind.SigKind; -import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.SigName; import org.scribble.util.Constants; public class SigParamDecl extends NonRoleParamDecl @@ -47,9 +47,9 @@ public SigParamDecl dupNode() @Override //public MemberName getDeclName() - public MessageSigName getDeclName() + public SigName getDeclName() { - return (MessageSigName) getNameNodeChild().toName(); + return (SigName) getNameNodeChild().toName(); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/SimpleSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/SimpleSessionNode.java index 26d78f687..e64bc5692 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/SimpleSessionNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SimpleSessionNode.java @@ -14,10 +14,10 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; // Name should be read (Simple ( SessionNode )) -public abstract class SimpleSessionNode +public abstract class SimpleSessionNode extends ScribNodeBase implements SessionNode { // ScribTreeAdaptor#create constructor diff --git a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java index c7ceecf6b..4345f7faf 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java @@ -15,8 +15,8 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.PayElemNameNode; -import org.scribble.core.type.kind.PayloadTypeKind; -import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.kind.PayElemKind; +import org.scribble.core.type.name.PayElemType; import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -29,7 +29,7 @@ // PayloadTypeKind is DataType or Local, but Local has its own special subclass (and protocol params not allowed), so this should implicitly be for DataType only // AST hierarchy requires unary and delegation (binary pair) payloads to be structurally distinguished //public class DataTypeElem extends PayloadElem -public class UnaryPayElem extends ScribNodeBase +public class UnaryPayElem extends ScribNodeBase implements PayElem// extends PayloadElem { // cf. Scribble.g @@ -84,7 +84,7 @@ public UnaryPayElem visitChildren(AstVisitor nv) } @Override - public PayloadElemType toPayloadType() + public PayElemType toPayloadType() { return getNameChild().toPayloadType(); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/context/DependencyMap.java b/scribble-ast/src/main/java/org/scribble/ast/context/DependencyMap.java deleted file mode 100644 index 87c891efb..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/context/DependencyMap.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.context; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; - -import org.scribble.core.type.name.ProtocolName; -import org.scribble.core.type.name.Role; - -import java.util.Set; - -// Mutable -// Used for two purposes: one to encapsulate Map structure and add method for ContextBuilder; second to allow overriding the generic types in ProtocolDeclContext (cf. nested Map generics) -public abstract class DependencyMap> // Maybe better to parameterise on Kind only? -{ - // self -> (proto -> target) -- the self role in this proto, depends on the proto, for the role param target - private final Map>> deps = new HashMap<>(); // All the potential dependencies from this protocol decl as the root - - public DependencyMap() - { - - } - - protected DependencyMap(DependencyMap deps) - { - for (Role r : deps.deps.keySet()) // FIXME: optimise - { - Map> tmp = deps.deps.get(r); - for (Entry> e : tmp.entrySet()) - { - for (Role rr : e.getValue()) - { - addProtocolDependency(r, e.getKey(), rr); - } - } - } - } - - public abstract DependencyMap clone(); - - public void addProtocolDependency(Role self, N pn, Role target) - { - Map> tmp1 = this.deps.get(self); - if (tmp1 == null) - { - tmp1 = new HashMap<>(); - this.deps.put(self, tmp1); - } - - Set tmp2 = tmp1.get(pn); - if (tmp2 == null) - { - tmp2 = new HashSet<>(); - tmp1.put(pn, tmp2); - } - tmp2.add(target); - } - - public Map>> getDependencies() - { - return this.deps; - } -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/context/ProtocolDeclContext.java b/scribble-ast/src/main/java/org/scribble/ast/context/ProtocolDeclContext.java deleted file mode 100644 index cf81f8b6b..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/context/ProtocolDeclContext.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.context; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; -import org.scribble.core.type.name.Role; - -public abstract class ProtocolDeclContext -{ - private Set roles; - - // cache of dependencies, cleared on entering each root global protocol - // protocol name is full name of global/local protocol dependencies - private DependencyMap> deps; - // All the potential protocol dependencies from this *protocoldecl* as the root -- cf. ModuleContext deps from Module root - - protected ProtocolDeclContext(Set roles, DependencyMap> deps) - { - this.roles = new HashSet<>(roles); - this.deps = deps.clone(); - } - - // Subclass constructor should use the above copy constructor - protected abstract ProtocolDeclContext copy(); - - public Set getRoleOccurrences() - { - return Collections.unmodifiableSet(this.roles); - } - - public ProtocolDeclContext setRoleOccurrences(Collection roles) - { - ProtocolDeclContext copy = copy(); - copy.roles = new HashSet<>(roles); - copy.deps = this.deps.clone(); - return copy; - } - - public DependencyMap> getDependencyMap() - { - // FIXME: returned deps view is mutable -- context should be immutable for del to be immutable - return this.deps; - } - - /*// Not needed: protocoldeclcontext always has dependencymap on first creation, by context building - public ProtocolDeclContext setDependencyMap(DependencyMap> deps) - { - ProtocolDeclContext copy = copy(); - copy.roles = new HashSet<>(this.roles); - copy.deps = new DependencyMap<>(deps); - return copy; - }*/ -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/context/global/GDependencyMap.java b/scribble-ast/src/main/java/org/scribble/ast/context/global/GDependencyMap.java deleted file mode 100644 index ea0dbfba9..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/context/global/GDependencyMap.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.context.global; - -import org.scribble.ast.context.DependencyMap; -import org.scribble.core.type.name.GProtocolName; - -public class GDependencyMap extends DependencyMap -{ - protected GDependencyMap(GDependencyMap deps) - { - super(deps); - } - - public GDependencyMap() - { - super(); - } - - @Override - public GDependencyMap clone() - { - return new GDependencyMap(this); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/context/global/GProtocolDeclContext.java b/scribble-ast/src/main/java/org/scribble/ast/context/global/GProtocolDeclContext.java deleted file mode 100644 index b2c3c33a7..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/context/global/GProtocolDeclContext.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.context.global; - -import java.util.Collections; -import java.util.Set; - -import org.scribble.ast.context.ProtocolDeclContext; -import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.Role; - -public class GProtocolDeclContext extends ProtocolDeclContext -{ - protected GProtocolDeclContext(Set roles, GDependencyMap deps) - { - super(roles, deps); - } - - public GProtocolDeclContext(GDependencyMap deps) - { - this(Collections.emptySet(), deps); - } - - @Override - protected GProtocolDeclContext copy() - { - return new GProtocolDeclContext(getRoleOccurrences(), getDependencyMap()); - } - - @Override - public GDependencyMap getDependencyMap() - { - return (GDependencyMap) super.getDependencyMap(); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/context/local/LDependencyMap.java b/scribble-ast/src/main/java/org/scribble/ast/context/local/LDependencyMap.java deleted file mode 100644 index ddbb4db07..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/context/local/LDependencyMap.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.context.local; - -import org.scribble.ast.context.DependencyMap; -import org.scribble.core.type.name.LProtocolName; - -public class LDependencyMap extends DependencyMap -{ - protected LDependencyMap(LDependencyMap deps) - { - super(deps); - } - - public LDependencyMap() - { - super(); - } - - @Override - public LDependencyMap clone() - { - return new LDependencyMap(this); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/context/local/LProjectionDeclContext.java b/scribble-ast/src/main/java/org/scribble/ast/context/local/LProjectionDeclContext.java deleted file mode 100644 index 03c534414..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/context/local/LProjectionDeclContext.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.context.local; - -import java.util.Set; - -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.Role; - - -@Deprecated -public class LProjectionDeclContext extends LProtocolDeclContext -{ - private GProtocolName fullname; - private Role self; - - protected LProjectionDeclContext(Set roles, LDependencyMap deps, GProtocolName gpn, Role self) - { - super(roles, deps); - } - - @Override - public LProjectionDeclContext copy() - { - return new LProjectionDeclContext(getRoleOccurrences(), getDependencyMap(), getSourceProtocol(), getSelfRole()); - } - - public GProtocolName getSourceProtocol() - { - return this.fullname; - } - - // Redundant with SelfRoleDecl in header - public Role getSelfRole() - { - return this.self; - } -} - diff --git a/scribble-ast/src/main/java/org/scribble/ast/context/local/LProtocolDeclContext.java b/scribble-ast/src/main/java/org/scribble/ast/context/local/LProtocolDeclContext.java deleted file mode 100644 index e3c765aca..000000000 --- a/scribble-ast/src/main/java/org/scribble/ast/context/local/LProtocolDeclContext.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ast.context.local; - -import java.util.Collections; -import java.util.Set; - -import org.scribble.ast.context.ProtocolDeclContext; -import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.Role; - -public class LProtocolDeclContext extends ProtocolDeclContext -{ - protected LProtocolDeclContext(Set roles, LDependencyMap deps) - { - super(roles, deps); - } - - public LProtocolDeclContext(LDependencyMap deps) - { - this(Collections.emptySet(), deps); - } - - @Override - protected LProtocolDeclContext copy() - { - return new LProtocolDeclContext(getRoleOccurrences(), getDependencyMap()); - } - - @Override - public LDependencyMap getDependencyMap() - { - return (LDependencyMap) super.getDependencyMap(); - } -} diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java index 81f2965d5..ab5fcb655 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java @@ -19,8 +19,8 @@ import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.GDelegationType; -import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.name.GDelegType; +import org.scribble.core.type.name.PayElemType; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -86,9 +86,9 @@ public boolean isGlobalDelegationElem() } @Override - public PayloadElemType toPayloadType() + public PayElemType toPayloadType() { - return new GDelegationType(getProtocolChild().toName(), + return new GDelegType(getProtocolChild().toName(), getRoleChild().toName()); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java index b49ef82ce..b99e6eb98 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java @@ -18,7 +18,7 @@ import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.lang.LangContext; public class GDo extends Do implements GSimpleSessionNode @@ -45,7 +45,7 @@ public GProtoNameNode getProtocolNameNode() public GProtoDecl getTargetProtocolDecl(LangContext jcontext, ModuleContext mcontext) { - GProtocolName fullname = getTargetProtocolDeclFullName(mcontext); + GProtoName fullname = getTargetProtocolDeclFullName(mcontext); return jcontext.getModule(fullname.getPrefix()) .getGProtocolDeclChild(fullname.getSimpleName()); } @@ -57,8 +57,8 @@ public GDo dupNode() } @Override - public GProtocolName getTargetProtocolDeclFullName(ModuleContext mcontext) + public GProtoName getTargetProtocolDeclFullName(ModuleContext mcontext) { - return (GProtocolName) super.getTargetProtocolDeclFullName(mcontext); + return (GProtoName) super.getTargetProtocolDeclFullName(mcontext); } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtoBlock.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoBlock.java index 0d4601ece..67519d920 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtoBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoBlock.java @@ -14,10 +14,10 @@ package org.scribble.ast.global; import org.antlr.runtime.Token; -import org.scribble.ast.ProtocolBlock; +import org.scribble.ast.ProtoBlock; import org.scribble.core.type.kind.Global; -public class GProtoBlock extends ProtocolBlock implements GScribNode +public class GProtoBlock extends ProtoBlock implements GScribNode { // ScribTreeAdaptor#create constructor public GProtoBlock(Token t) @@ -34,7 +34,7 @@ protected GProtoBlock(GProtoBlock node) @Override public GInteractionSeq getInteractSeqChild() { - return (GInteractionSeq) getChild(ProtocolBlock.SEQ_CHILD_INDEX); + return (GInteractionSeq) getChild(ProtoBlock.SEQ_CHILD_INDEX); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDecl.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDecl.java index 767e16d4b..c63ac5a31 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDecl.java @@ -17,7 +17,7 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtoDecl; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; public class GProtoDecl extends ProtoDecl implements GScribNode { @@ -53,10 +53,10 @@ public GProtoDecl dupNode() } @Override - public GProtocolName getFullMemberName(Module mod) // TODO: remove mod from meth sig + public GProtoName getFullMemberName(Module mod) // TODO: remove mod from meth sig { Module m = (Module) getParent(); - return new GProtocolName(m.getFullModuleName(), + return new GProtoName(m.getFullModuleName(), getHeaderChild().getDeclName()); } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDef.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDef.java index 22578f08b..ee7e134f0 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDef.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDef.java @@ -14,10 +14,10 @@ package org.scribble.ast.global; import org.antlr.runtime.Token; -import org.scribble.ast.ProtocolDef; +import org.scribble.ast.ProtoDef; import org.scribble.core.type.kind.Global; -public class GProtoDef extends ProtocolDef implements GScribNode +public class GProtoDef extends ProtoDef implements GScribNode { // ScribTreeAdaptor#create constructor public GProtoDef(Token t) @@ -34,7 +34,7 @@ protected GProtoDef(GProtoDef node) @Override public GProtoBlock getBlockChild() { - return (GProtoBlock) getChild(ProtocolDef.BLOCK_CHILD_INDEX); + return (GProtoBlock) getChild(ProtoDef.BLOCK_CHILD_INDEX); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtoHeader.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoHeader.java index 4342aad87..9061275ba 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtoHeader.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoHeader.java @@ -14,13 +14,13 @@ package org.scribble.ast.global; import org.antlr.runtime.Token; -import org.scribble.ast.ProtocolHeader; +import org.scribble.ast.ProtoHeader; import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.util.Constants; -public class GProtoHeader extends ProtocolHeader implements GScribNode +public class GProtoHeader extends ProtoHeader implements GScribNode { // ScribTreeAdaptor#create constructor public GProtoHeader(Token t) @@ -47,9 +47,9 @@ public GProtoNameNode getNameNodeChild() } @Override - public GProtocolName getDeclName() + public GProtoName getDeclName() { - return (GProtocolName) super.getDeclName(); + return (GProtoName) super.getDeclName(); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GScribNode.java b/scribble-ast/src/main/java/org/scribble/ast/global/GScribNode.java index fb0330ab3..74d175207 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GScribNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GScribNode.java @@ -13,10 +13,10 @@ */ package org.scribble.ast.global; -import org.scribble.ast.ProtocolKindNode; +import org.scribble.ast.ProtoKindNode; import org.scribble.core.type.kind.Global; -public interface GScribNode extends ProtocolKindNode +public interface GScribNode extends ProtoKindNode { @Override default boolean isGlobal() diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/PayElemNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/PayElemNameNode.java index c266c0a4a..3a5017168 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/PayElemNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/PayElemNameNode.java @@ -14,17 +14,17 @@ package org.scribble.ast.name; import org.scribble.ast.NonRoleArgNode; -import org.scribble.core.type.kind.PayloadTypeKind; -import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.kind.PayElemKind; +import org.scribble.core.type.name.PayElemType; // A datatype kind node: DataTypeNode or NonRoleParameterNode -- not necessarily simple nor qualified // Actually, datatype or global protocol kind, if delegation supported -- for "structural delegation" this would not directly be a name node any more (like MessageNode) //public interface PayloadElemNameNode extends NonRoleArgNode -public interface PayElemNameNode extends NonRoleArgNode +public interface PayElemNameNode extends NonRoleArgNode { //PayloadType toPayloadType(); //PayloadType toPayloadType(); // Currently can assume the only possible kind is DataTypeKind (delegation is by (non-ambig) delegationelem) //PayloadType toPayloadType(); // FIXME: generic parameter for kind (data/local) - PayloadElemType toPayloadType(); + PayElemType toPayloadType(); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java index 064c8f66d..71f666cd8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java @@ -15,13 +15,13 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.PayElemNameNode; -import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.kind.DataKind; import org.scribble.core.type.name.DataType; import org.scribble.core.type.session.Arg; //public class DataTypeNode extends MemberNameNode implements PayloadElemNameNode -public class DataNameNode extends MemberNameNode - implements PayElemNameNode +public class DataNameNode extends MemberNameNode + implements PayElemNameNode { // ScribTreeAdaptor#create constructor public DataNameNode(Token t) @@ -57,7 +57,7 @@ public boolean isDataTypeNameNode() } @Override - public Arg toArg() + public Arg toArg() { return toPayloadType(); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtoNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtoNameNode.java index 4e70cfd89..4ad485198 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtoNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtoNameNode.java @@ -15,9 +15,9 @@ import org.antlr.runtime.Token; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; -public class GProtoNameNode extends ProtocolNameNode +public class GProtoNameNode extends ProtoNameNode { // ScribTreeAdaptor#create constructor public GProtoNameNode(Token t) @@ -38,11 +38,11 @@ public GProtoNameNode dupNode() } @Override - public GProtocolName toName() + public GProtoName toName() { - GProtocolName membname = new GProtocolName(getLastElement()); + GProtoName membname = new GProtoName(getLastElement()); return isPrefixed() - ? new GProtocolName(getModuleNamePrefix(), membname) + ? new GProtoName(getModuleNamePrefix(), membname) : membname; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java index a0b6813f6..4733e2f74 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java @@ -14,13 +14,12 @@ package org.scribble.ast.name.qualified; import org.antlr.runtime.Token; -import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.PayElemNameNode; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.session.Arg; -public class LProtoNameNode extends ProtocolNameNode +public class LProtoNameNode extends ProtoNameNode implements PayElemNameNode { // ScribTreeAdaptor#create constructor @@ -42,16 +41,16 @@ public LProtoNameNode dupNode() } @Override - public LProtocolName toName() + public LProtoName toName() { - LProtocolName membname = new LProtocolName(getLastElement()); + LProtoName membname = new LProtoName(getLastElement()); return isPrefixed() - ? new LProtocolName(getModuleNamePrefix(), membname) + ? new LProtoName(getModuleNamePrefix(), membname) : membname; } @Override - public LProtocolName toPayloadType() + public LProtoName toPayloadType() { return toName(); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java index 84489b3da..fcd7e8391 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/MemberNameNode.java @@ -22,7 +22,7 @@ import org.scribble.core.type.name.PackageName; public abstract class MemberNameNode - extends QualifiedNameNode + extends QualNameNode { // ScribTreeAdaptor#create constructor public MemberNameNode(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java index e237074d5..929c9c3ad 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java @@ -18,7 +18,7 @@ import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.PackageName; -public class ModuleNameNode extends QualifiedNameNode +public class ModuleNameNode extends QualNameNode { // ScribTreeAdaptor#create constructor public ModuleNameNode(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ProtoNameNode.java similarity index 73% rename from scribble-ast/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/qualified/ProtoNameNode.java index d07419c26..0b7722e0a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ProtocolNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ProtoNameNode.java @@ -14,23 +14,23 @@ package org.scribble.ast.name.qualified; import org.antlr.runtime.Token; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.kind.ProtoKind; +import org.scribble.core.type.name.ProtoName; -public abstract class ProtocolNameNode +public abstract class ProtoNameNode extends MemberNameNode { // ScribTreeAdaptor#create constructor - public ProtocolNameNode(Token t) + public ProtoNameNode(Token t) { super(t); } // Tree#dupNode constructor - protected ProtocolNameNode(ProtocolNameNode node) + protected ProtoNameNode(ProtoNameNode node) { super(node); } - public abstract ProtocolName toName(); + public abstract ProtoName toName(); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/QualNameNode.java similarity index 84% rename from scribble-ast/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java rename to scribble-ast/src/main/java/org/scribble/ast/name/qualified/QualNameNode.java index c3110a0fc..7e0f92573 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/QualifiedNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/QualNameNode.java @@ -18,16 +18,16 @@ import org.scribble.core.type.kind.Kind; // Any name that could be compound/qualified (but could also be a singleton) -public abstract class QualifiedNameNode extends NameNode +public abstract class QualNameNode extends NameNode { // ScribTreeAdaptor#create constructor - public QualifiedNameNode(Token t) + public QualNameNode(Token t) { super(t); } // Tree#dupNode constructor - protected QualifiedNameNode(QualifiedNameNode node) + protected QualNameNode(QualNameNode node) { super(node); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java index 8353d3f7a..62ca5cd59 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.MsgNode; import org.scribble.core.type.kind.SigKind; -import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.SigName; public class SigNameNode extends MemberNameNode implements MsgNode @@ -40,10 +40,10 @@ public SigNameNode dupNode() } @Override - public MessageSigName toName() + public SigName toName() { - MessageSigName membname = new MessageSigName(getLastElement()); - return isPrefixed() ? new MessageSigName(getModuleNamePrefix(), membname) + SigName membname = new SigName(getLastElement()); + return isPrefixed() ? new SigName(getModuleNamePrefix(), membname) : membname; } @@ -55,13 +55,13 @@ public boolean isMessageSigNameNode() // Difference between toName and toMessage is scope? does that make sense? @Override - public MessageSigName toMessage() + public SigName toMessage() { return toName(); } @Override - public MessageSigName toArg() + public SigName toArg() { return toMessage(); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index a02f0f322..a81c2105d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -17,16 +17,16 @@ import org.scribble.ast.MsgNode; import org.scribble.ast.name.PayElemNameNode; import org.scribble.core.type.kind.AmbigKind; -import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.kind.DataKind; import org.scribble.core.type.kind.NonRoleArgKind; import org.scribble.core.type.name.AmbigName; -import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.name.PayElemType; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Message; // Primitive payload type, MessageSigName or parameter names only: if name is parsed as a CompoundNameNodes, it must be a payload type (not ambiguous in this case) public class AmbigNameNode extends SimpleNameNode - implements MsgNode, PayElemNameNode // FIXME: currently hardcoded to DataTypeKind for payload elems ? + implements MsgNode, PayElemNameNode // FIXME: currently hardcoded to DataTypeKind for payload elems ? { // Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] // N.B. ttype (an "imaginary node" type) is discarded, t is a ScribbleParser.ID token type @@ -62,7 +62,7 @@ public Message toMessage() } @Override - public PayloadElemType toPayloadType() // As a payload elem, currently hardcoded to expect only DataTypeKind (protocol payloads not supported) + public PayElemType toPayloadType() // As a payload elem, currently hardcoded to expect only DataTypeKind (protocol payloads not supported) { throw new RuntimeException( "Ambiguous name node not disambiguated: " + this); diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java index 19bd1ca37..061e8249c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java @@ -15,17 +15,17 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.PayElemNameNode; -import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.kind.DataKind; import org.scribble.core.type.name.DataType; -public class DataParamNode extends NonRoleParamNode - implements PayElemNameNode // As a payload, can only be a DataType (so hardcode) +public class DataParamNode extends NonRoleParamNode + implements PayElemNameNode // As a payload, can only be a DataType (so hardcode) { // Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] // N.B. ttype (an "imaginary node" type) is discarded, t is a ScribbleParser.ID token type public DataParamNode(int ttype, Token t) { - super(t, DataTypeKind.KIND); + super(t, DataKind.KIND); } // Tree#dupNode constructor diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java index 226850b02..238360828 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.MsgNode; import org.scribble.core.type.kind.SigKind; -import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.SigName; public class SigParamNode extends NonRoleParamNode implements MsgNode @@ -41,19 +41,19 @@ public SigParamNode dupNode() } @Override - public MessageSigName toName() + public SigName toName() { - return new MessageSigName(getText()); + return new SigName(getText()); } @Override - public MessageSigName toArg() + public SigName toArg() { return toMessage(); } @Override - public MessageSigName toMessage() + public SigName toMessage() { return toName(); } diff --git a/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java index dce07930b..004847c2f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java @@ -23,7 +23,7 @@ import org.scribble.ast.ProtoDecl; import org.scribble.ast.ScribNode; import org.scribble.core.lang.context.ModuleContext; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.ProtoName; import org.scribble.lang.LangContext; import org.scribble.util.ScribException; import org.scribble.visit.NameDisambiguator; @@ -60,12 +60,12 @@ protected ProtoDecl getTargetProtocolDecl(Do parent, ModuleContext mc = disamb.getModuleContext(); LangContext jc = disamb.lang.getContext(); Do doo = (Do) parent; - ProtocolName pn = doo.getProtocolNameNode().toName(); + ProtoName pn = doo.getProtocolNameNode().toName(); /*if (!mc.isVisibleProtocolDeclName(simpname)) // FIXME: should be checked somewhere else? earlier (do-entry?) -- done { throw new ScribbleException("Protocol decl not visible: " + simpname); }*/ - ProtocolName fullname = mc.getVisibleProtocolDeclFullName(pn); // Lookup in visible names -- not deps, because do target name not disambiguated yet (will be done later this pass) + ProtoName fullname = mc.getVisibleProtocolDeclFullName(pn); // Lookup in visible names -- not deps, because do target name not disambiguated yet (will be done later this pass) Module mod = jc.getModule(fullname.getPrefix()); //return mod.getProtocolDeclChild(pn.getSimpleName()); List> pd = mod.getProtoDeclChildren().stream() diff --git a/scribble-ast/src/main/java/org/scribble/del/DoDel.java b/scribble-ast/src/main/java/org/scribble/del/DoDel.java index 9dd9f5418..993cb5e18 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoDel.java @@ -19,12 +19,12 @@ import org.scribble.ast.Do; import org.scribble.ast.ScribNode; -import org.scribble.ast.name.qualified.ProtocolNameNode; +import org.scribble.ast.name.qualified.ProtoNameNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.core.lang.context.ModuleContext; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.kind.ProtoKind; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.ProtoName; import org.scribble.lang.Lang; import org.scribble.util.ScribException; import org.scribble.visit.NameDisambiguator; @@ -42,8 +42,8 @@ public void enterDisambiguation(ScribNode child, NameDisambiguator disamb) { ModuleContext mc = disamb.getModuleContext(); Do doo = (Do) child; - ProtocolNameNode proto = doo.getProtocolNameNode(); - ProtocolName simpname = proto.toName(); + ProtoNameNode proto = doo.getProtocolNameNode(); + ProtoName simpname = proto.toName(); if (!mc.isVisibleProtocolDeclName(simpname)) // CHECKME: do on entry here, before visiting DoArgListDel { throw new ScribException(proto.getSource(), @@ -61,31 +61,31 @@ public ScribNode leaveDisambiguation(ScribNode child, // Convert all visible names to full names for protocol inlining: otherwise could get clashes if directly inlining external visible names under the root modulecontext // Not done in G/LProtocolNameNodeDel because it's only for do-targets that this is needed (cf. ProtocolHeader) - private ScribNode leaveDisambiguationAux( + private ScribNode leaveDisambiguationAux( Do visited, NameDisambiguator disamb) throws ScribException { - ProtocolNameNode proto = visited.getProtocolNameNode(); + ProtoNameNode proto = visited.getProtocolNameNode(); ModuleContext modc = disamb.getModuleContext(); - ProtocolName fullname = modc + ProtoName fullname = modc .getVisibleProtocolDeclFullName(proto.toName()); // CHECKME: do full name expansion in disamb? or leave to imed translation? -- FIXME: sort out full name expansion between here and GDoDel.translate - ProtocolNameNode n = foo(disamb.lang, fullname); + ProtoNameNode n = foo(disamb.lang, fullname); // Didn't keep original namenode del -- ? return visited.reconstruct(visited.getRoleListChild(), visited.getNonRoleListChild(), n); } - private ProtocolNameNode foo(Lang lang, - ProtocolName fullname) + private ProtoNameNode foo(Lang lang, + ProtoName fullname) { - if (fullname instanceof GProtocolName) + if (fullname instanceof GProtoName) { List elems = Arrays.asList(fullname.getElements()).stream() .map(x -> lang.config.af.IdNode(x)).collect(Collectors.toList()); @SuppressWarnings("unchecked") // FIXME - ProtocolNameNode cast = (ProtocolNameNode) lang.config.af + ProtoNameNode cast = (ProtoNameNode) lang.config.af .GProtoNameNode(elems); return cast; } diff --git a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java index 6bb950cec..11e337729 100644 --- a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java @@ -24,7 +24,7 @@ import org.scribble.ast.ProtoDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.NonRoleParamNode; -import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.kind.DataKind; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.SigKind; import org.scribble.util.ScribException; @@ -71,7 +71,7 @@ else if (pkind.equals(SigKind.KIND)) "Invalid arg " + arg + " for param kind: " + pkind); } } - else if (pkind.equals(DataTypeKind.KIND)) + else if (pkind.equals(DataKind.KIND)) { if (!val.isDataTypeNameNode()) { diff --git a/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java index 7460185c5..5733fdb80 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java @@ -14,11 +14,11 @@ package org.scribble.del; import org.scribble.ast.ScribNode; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.util.ScribException; import org.scribble.visit.NameDisambiguator; -public abstract class ProtocolDeclDel +public abstract class ProtocolDeclDel extends ScribDelBase { protected ProtocolDeclDel() diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java index 9d1e2688f..a41c97038 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -25,7 +25,7 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.Role; import org.scribble.del.ScribDelBase; import org.scribble.util.ScribException; @@ -46,7 +46,7 @@ public void enterDisambiguation(ScribNode child, ModuleContext mc = disamb.getModuleContext(); GDelegPayElem de = (GDelegPayElem) child; GProtoNameNode proto = de.getProtocolChild(); - GProtocolName gpn = proto.toName(); + GProtoName gpn = proto.toName(); if (!mc.isVisibleProtocolDeclName(gpn)) { throw new ScribException(proto.getSource(), @@ -60,7 +60,7 @@ public GDelegPayElem visitForNameDisambiguation(NameDisambiguator disamb, // CH GDelegPayElem de) throws ScribException { ModuleContext mc = disamb.getModuleContext(); - GProtocolName fullname = (GProtocolName) mc + GProtoName fullname = (GProtoName) mc .getVisibleProtocolDeclFullName(de.getProtocolChild().toName()); RoleNode r = de.getRoleChild(); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java index 30ee060a9..57abc193f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java @@ -19,7 +19,7 @@ import org.scribble.ast.global.GDo; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.del.DoDel; @@ -35,14 +35,14 @@ public org.scribble.core.type.session.global.GDo translate(ScribNode n, GDo source = (GDo) n; // Resolve full name -- CHECKME: factor out? cf., NameDisambiguator, DoDel::enter/leaveDisambiguation - GProtocolName proto = source.getProtocolNameNode().toName(); + GProtoName proto = source.getProtocolNameNode().toName(); ModuleContext modc = t.getModuleContext(); if (!modc.isVisibleProtocolDeclName(proto)) { throw new ScribException(source, "Protocol decl not visible: " + proto); } - GProtocolName fullname = (GProtocolName) modc // FIXME: sort out full name expansion between here and DoDel.leaveDisambiguation + GProtoName fullname = (GProtoName) modc // FIXME: sort out full name expansion between here and DoDel.leaveDisambiguation .getVisibleProtocolDeclFullName(proto); List roles = source.getRoleListChild().getRoles(); List> params = source.getNonRoleListChild() diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 014b3053b..530a5be24 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -23,7 +23,7 @@ import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.global.GSeq; @@ -46,7 +46,7 @@ public GProtocol translate(ScribNode n, GTypeTranslator t) Module m = (Module) n.getParent(); List mods = source.getModifierListChild().getModList().stream() .map(x -> ProtocolMod.fromAst(x)).collect(Collectors.toList()); - GProtocolName fullname = new GProtocolName(m.getFullModuleName(), + GProtoName fullname = new GProtoName(m.getFullModuleName(), source.getHeaderChild().getDeclName()); List rs = source.getRoles(); List> ps = source.getHeaderChild() diff --git a/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java index d9333b1af..c28cc7528 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java @@ -19,7 +19,7 @@ import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.core.lang.context.ModuleContext; -import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.SigName; import org.scribble.del.ScribDelBase; import org.scribble.util.ScribException; import org.scribble.visit.NameDisambiguator; @@ -43,7 +43,7 @@ public ScribNode leaveDisambiguation(ScribNode child, } ModuleContext mc = disamb.getModuleContext(); SigNameNode msnn = (SigNameNode) visited; - MessageSigName fullname = + SigName fullname = mc.getVisibleMessageSigNameFullName(msnn.toName()); /*return (MessageSigNameNode) disamb.job.config.af.QualifiedNameNode( msnn.getSource(), SigKind.KIND, fullname.getElements());*/ diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java index dac0dae6a..4a1c08d21 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java @@ -25,7 +25,7 @@ import org.scribble.ast.name.simple.SigParamNode; import org.scribble.ast.name.simple.DataParamNode; import org.scribble.core.lang.context.ModuleContext; -import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.kind.DataKind; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.AmbigName; @@ -100,7 +100,7 @@ else if (disamb.isBoundParameter(name)) /*return disamb.job.config.af.NonRoleParamNode(ann.getSource(), disamb.getParameterKind(name), name.toString());*/ NonRoleParamKind kind = disamb.getParameterKind(name); - if (kind.equals(DataTypeKind.KIND)) + if (kind.equals(DataKind.KIND)) { //TypeParamNode res = new TypeParamNode(ann.token); // CHECKME: what should the Token be? //TypeParamNode res = new TypeParamNode(75, ann.token); // CHECKME: what should the Token be? diff --git a/scribble-ast/src/main/java/org/scribble/lang/LangContext.java b/scribble-ast/src/main/java/org/scribble/lang/LangContext.java index 4f010c4fd..bcc85d735 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/LangContext.java +++ b/scribble-ast/src/main/java/org/scribble/lang/LangContext.java @@ -22,7 +22,7 @@ import org.scribble.ast.Module; import org.scribble.ast.global.GProtoDecl; import org.scribble.core.lang.context.ModuleContext; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.ModuleName; import org.scribble.lang.context.ModuleContextCollector; import org.scribble.util.ScribException; @@ -83,7 +83,7 @@ public Map getParsed() return Collections.unmodifiableMap(this.parsed); } - public GProtoDecl getParsed(GProtocolName fullname) + public GProtoDecl getParsed(GProtoName fullname) { return this.parsed.get(fullname.getPrefix()) .getGProtoDeclChildren().stream().filter(x -> x.getHeaderChild() diff --git a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java index bed9ad1dc..8efcd0bb5 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java +++ b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java @@ -25,8 +25,8 @@ import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.lang.context.ScribNames; import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.ModuleName; import org.scribble.util.ScribException; @@ -97,13 +97,13 @@ private static void addModule(ScribNames names, Module mod, else //if (npd.isMessageSigNameDecl()) { SigDecl msnd = (SigDecl) npd; - MessageSigName qualif = new MessageSigName(modname, msnd.getDeclName()); + SigName qualif = new SigName(modname, msnd.getDeclName()); names.sigs.put(qualif, msnd.getFullMemberName(mod)); } } for (GProtoDecl gpd : mod.getGProtoDeclChildren()) { - GProtocolName qualif = new GProtocolName(modname, + GProtoName qualif = new GProtoName(modname, gpd.getHeaderChild().getDeclName()); names.globals.put(qualif, gpd.getFullMemberName(mod)); } @@ -128,7 +128,7 @@ private void addImportDependencies(Map parsed, Module mod) // FIXME: also do for npds -- factor out with below for (GProtoDecl gpd : imported.getGProtoDeclChildren()) { - GProtocolName fullname = gpd.getFullMemberName(root); + GProtoName fullname = gpd.getFullMemberName(root); this.visible.globals.put(fullname, fullname); } } @@ -182,8 +182,8 @@ private void addVisible(Map parsed, Module root) else // if (npd.isMessageSigNameDecl()) { SigDecl msnd = (SigDecl) npd; - MessageSigName fullname = msnd.getFullMemberName(root); - MessageSigName visname = new MessageSigName( + SigName fullname = msnd.getFullMemberName(root); + SigName visname = new SigName( msnd.getDeclName().toString()); this.visible.sigs.put(fullname, fullname); this.visible.sigs.put(visname, fullname); @@ -192,9 +192,9 @@ private void addVisible(Map parsed, Module root) for (GProtoDecl gpd : root.getGProtoDeclChildren()) { - GProtocolName visname = new GProtocolName( + GProtoName visname = new GProtoName( gpd.getHeaderChild().getDeclName().toString()); - GProtocolName fullname = gpd.getFullMemberName(root); + GProtoName fullname = gpd.getFullMemberName(root); this.visible.globals.put(fullname, fullname); this.visible.globals.put(visname, fullname); } diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 4ea451f33..1959adc0c 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -36,8 +36,8 @@ import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.global.SGraph; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.Role; import org.scribble.lang.Lang; import org.scribble.lang.LangContext; @@ -305,9 +305,9 @@ private void printProjection(Lang lang, String[] args) Job job = lang.getJob(); for (int i = 0; i < args.length; i += 2) { - GProtocolName fullname = checkGlobalProtocolArg(langc, args[i]); + GProtoName fullname = checkGlobalProtocolArg(langc, args[i]); Role role = checkRoleArg(langc, fullname, args[i+1]); - Map projections = job.getProjections(fullname, + Map projections = job.getProjections(fullname, role); // FIXME: generate and output Module container -- should be done via Lang? System.out.println("\n" + projections.values().stream() .map(p -> p.toString()).collect(Collectors.joining("\n\n"))); @@ -322,7 +322,7 @@ private void outputEGraph(Lang lang, String[] args, boolean forUser, { LangContext langc = lang.getContext(); - GProtocolName fullname = checkGlobalProtocolArg(langc, args[0]); + GProtoName fullname = checkGlobalProtocolArg(langc, args[0]); Role role = checkRoleArg(langc, fullname, args[1]); EGraph fsm = getEGraph(lang, fullname, role, forUser, fair); if (draw) @@ -344,7 +344,7 @@ private void outputSGraph(Lang lang, String[] args, boolean fair, { LangContext jobc = lang.getContext(); { - GProtocolName fullname = checkGlobalProtocolArg(jobc, args[0]); + GProtoName fullname = checkGlobalProtocolArg(jobc, args[0]); SGraph model = getSGraph(lang, fullname, fair); if (draw) { @@ -367,7 +367,7 @@ private void outputEndpointApi(Lang lang, String[] args, boolean sess, LangContext langc = lang.getContext(); JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // FIXME: refactor (generalise -- use new API) { - GProtocolName fullname = checkGlobalProtocolArg(langc, args[0]); + GProtoName fullname = checkGlobalProtocolArg(langc, args[0]); if (sess) { Map out = jgen.generateSessionApi(fullname); @@ -394,7 +394,7 @@ private void outputEndpointApi(Lang lang, String[] args, boolean sess, } // Endpoint graphs are "inlined", so only a single graph is built (cf. projection output) - private EGraph getEGraph(Lang lang, GProtocolName fullname, Role role, + private EGraph getEGraph(Lang lang, GProtoName fullname, Role role, boolean forUser, boolean fair) throws ScribException, CommandLineException { @@ -430,7 +430,7 @@ private EGraph getEGraph(Lang lang, GProtocolName fullname, Role role, return graph; } - private SGraph getSGraph(Lang lang, GProtocolName fullname, boolean fair) + private SGraph getSGraph(Lang lang, GProtoName fullname, boolean fair) throws ScribException { JobContext jobc2 = lang.getJob().getContext(); @@ -508,10 +508,10 @@ protected static List parseImportPaths(String paths) .collect(Collectors.toList()); } - protected static GProtocolName checkGlobalProtocolArg(LangContext langc, + protected static GProtoName checkGlobalProtocolArg(LangContext langc, String simpname) throws CommandLineException { - GProtocolName simpgpn = new GProtocolName(simpname); + GProtoName simpgpn = new GProtoName(simpname); Module main = langc.getMainModule(); if (!main.hasGProtocolDecl(simpgpn)) { @@ -527,11 +527,11 @@ protected static GProtocolName checkGlobalProtocolArg(LangContext langc, throw new CommandLineException( "Invalid aux protocol specified as root: " + simpname); } - return new GProtocolName(langc.lang.config.main, simpgpn); // TODO: take Job param instead of Jobcontext + return new GProtoName(langc.lang.config.main, simpgpn); // TODO: take Job param instead of Jobcontext } protected static Role checkRoleArg(LangContext langc, - GProtocolName fullname, String rolename) throws CommandLineException + GProtoName fullname, String rolename) throws CommandLineException { ProtoDecl pd = langc.getMainModule() .getGProtocolDeclChild(fullname.getSimpleName()); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java index e1e63601d..f78ca2b4e 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java @@ -16,7 +16,7 @@ import java.util.Map; import org.scribble.core.job.Job; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.lang.Lang; import org.scribble.util.ScribException; @@ -25,9 +25,9 @@ public abstract class ApiGen { public final Lang lang; public final Job job; - public final GProtocolName gpn; // full name + public final GProtoName gpn; // full name - public ApiGen(Lang job, GProtocolName fullname) + public ApiGen(Lang job, GProtoName fullname) { this.lang = job; try diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java index f956bcd60..4b99bce09 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java @@ -19,7 +19,7 @@ import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.statechanapi.StateChannelApiGenerator; import org.scribble.codegen.java.statechanapi.ioifaces.IOInterfacesGenerator; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.Role; import org.scribble.lang.Lang; import org.scribble.util.RuntimeScribException; @@ -34,7 +34,7 @@ public JEndpointApiGenerator(Lang lang) this.lang = lang; } - public Map generateSessionApi(GProtocolName fullname) + public Map generateSessionApi(GProtoName fullname) throws ScribException { this.lang.verbosePrintln("\n[Java API gen] Running " @@ -45,7 +45,7 @@ public Map generateSessionApi(GProtocolName fullname) } // CHECKME: refactor an EndpointApiGenerator -- ? - public Map generateStateChannelApi(GProtocolName fullname, + public Map generateStateChannelApi(GProtoName fullname, Role self, boolean subtypes) throws ScribException { /*JobContext jc = this.job.getContext(); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index b5b314924..297e6918a 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -34,8 +34,8 @@ import org.scribble.core.model.endpoint.EStateKind; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.PayElemType; import org.scribble.core.type.name.Role; import org.scribble.lang.Lang; import org.scribble.util.ScribException; @@ -47,12 +47,12 @@ public class CBEndpointApiGenerator { public final Lang lang; public final Job job; - public final GProtocolName proto; + public final GProtoName proto; public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral private final boolean subtypes; - public CBEndpointApiGenerator(Lang job, GProtocolName fullname, Role self, boolean subtypes) + public CBEndpointApiGenerator(Lang job, GProtoName fullname, Role self, boolean subtypes) { this.lang = job; try @@ -298,7 +298,7 @@ public Map buildEndpointClass() throws ScribException else { int i = 1; - for (PayloadElemType pet : a.payload.elems) + for (PayElemType pet : a.payload.elems) { DataDecl dtd = main.getDataTypeDeclChild((DataType) pet); messageClass += ", " + dtd.getExtName() + " arg" + i++; @@ -442,7 +442,7 @@ public Map buildEndpointClass() throws ScribException .getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + " op"; int i = 1; - for (PayloadElemType pet : a.payload.elems) + for (PayElemType pet : a.payload.elems) { DataDecl dtd = main.getDataTypeDeclChild((DataType) pet); receiveInterface += ", " + dtd.getExtName() @@ -479,7 +479,7 @@ public Map buildEndpointClass() throws ScribException + ") m.op"; } int i = 0; - for (PayloadElemType pet : a.payload.elems) + for (PayElemType pet : a.payload.elems) { DataDecl dtd = main.getDataTypeDeclChild((DataType) pet); branchAbstract += ", (" + dtd.getExtName() + ") m.payload[" + i++ + "]"; @@ -523,7 +523,7 @@ public static String getEDStateEnum(GProtocolName gpn, Role self, EState s) return gpn.getSimpleName() + "_" + self + "_" + s.id; }*/ - private String generateRegister(GProtocolName gpn, Role self, EState s) + private String generateRegister(GProtoName gpn, Role self, EState s) { String prefix = SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers.states." + this.self + "." ; String res = ""; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 4612cf8d6..6015bd129 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -40,9 +40,9 @@ import org.scribble.core.model.endpoint.EStateKind; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.MessageSigName; -import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.SigName; +import org.scribble.core.type.name.PayElemType; import org.scribble.core.type.name.Role; import org.scribble.lang.Lang; import org.scribble.lang.LangContext; @@ -56,14 +56,14 @@ public class CBEndpointApiGenerator3 { public final Lang lang; public final Job job; - public final GProtocolName proto; + public final GProtoName proto; public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral protected final Map stateNames = new HashMap<>(); //private final boolean subtypes; // Generate full hierarchy (states -> states, not just indivdual state -> cases) -- cf. ioifaces - public CBEndpointApiGenerator3(Lang lang, GProtocolName fullname, Role self, + public CBEndpointApiGenerator3(Lang lang, GProtoName fullname, Role self, boolean subtypes) { this.lang = lang; @@ -716,7 +716,7 @@ protected String generateBranch(String bprefix, LangContext jc, EState s, String branchAbstract += "(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + ") m.op"; } int i = 0; - for (PayloadElemType pet : a.payload.elems) + for (PayElemType pet : a.payload.elems) { DataDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); branchAbstract += ", (" + dtd.getExtName() + ") m.payload[" + i++ + "]"; @@ -754,7 +754,7 @@ protected String generateReceiveInterface(boolean isSig, .getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + " op"; int i = 1; - for (PayloadElemType pet : a.payload.elems) + for (PayElemType pet : a.payload.elems) { DataDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); receiveInterface += ", " + dtd.getExtName() + " arg" + i++; @@ -998,7 +998,7 @@ protected String getMessagesPackage(String rootPack) return rootPack + ".handlers." + this.self + ".states.messages"; } - protected SigDecl getMessageSigNameDecl(MessageSigName mid) + protected SigDecl getMessageSigNameDecl(SigName mid) { return (SigDecl) this.lang.getContext().getMainModule().getNonProtoDeclChildren().stream() // FIXME: main module? @@ -1007,7 +1007,7 @@ protected SigDecl getMessageSigNameDecl(MessageSigName mid) } //protected final Function, String> getExtName = e -> - protected String getExtName(PayloadElemType e) + protected String getExtName(PayElemType e) { String extName = this.lang.getContext().getMainModule().getDataTypeDeclChild((DataType) e).getExtName(); return (extName.indexOf(".") != -1) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index e22ac2714..ab171d1eb 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -29,8 +29,8 @@ import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.visit.MessageIdGatherer; @@ -50,12 +50,12 @@ public class SessionApiGenerator extends ApiGen private static final String PROTO_FIELD = "PROTO"; private final Set roles = new HashSet<>(); - private final Set> mids = new HashSet<>(); + private final Set> mids = new HashSet<>(); private final ClassBuilder cb = new ClassBuilder(); private final Map classes = new HashMap<>(); // All classes in same package, for protected constructor access - public SessionApiGenerator(Lang lang, GProtocolName fullname) throws ScribException + public SessionApiGenerator(Lang lang, GProtoName fullname) throws ScribException { super(lang, fullname); constructRoleClasses(); @@ -80,7 +80,7 @@ public Map generateApi() return map; } - private static String makePath(GProtocolName gpn, String simpname) + private static String makePath(GProtoName gpn, String simpname) { return getEndpointApiRootPackageName(gpn).replace('.', '/') + "/" + simpname + ".java"; } @@ -167,7 +167,7 @@ private void addRoleField(ClassBuilder cb, Role role) addSingletonConstant(cb, "roles", getRoleClassName(role)); // FIXME: factor out } - private void addOpField(ClassBuilder cb, MessageId mid) + private void addOpField(ClassBuilder cb, MsgId mid) { addSingletonConstant(cb, "ops", getOpClassName(mid)); // FIXME: factor out } @@ -190,7 +190,7 @@ private void constructOpClasses() throws ScribException gpd.accept(coll); for (MessageId mid : coll.getNames())*/ GProtocol inlined = this.job.getContext().getInlined(this.gpn); - for (MessageId mid : inlined.def + for (MsgId mid : inlined.def .gather(new MessageIdGatherer()::visit) .collect(Collectors.toList())) { @@ -204,7 +204,7 @@ private void constructOpClasses() throws ScribException private void constructRoleClasses() throws ScribException { Module mod = this.lang.getContext().getModule(this.gpn.getPrefix()); - GProtocolName simpname = this.gpn.getSimpleName(); + GProtoName simpname = this.gpn.getSimpleName(); GProtoDecl gpd = (GProtoDecl) mod.getGProtocolDeclChild(simpname); for (Role r : gpd.getRoles()) { @@ -220,7 +220,7 @@ private ClassBuilder constructRoleClass(ClassBuilder cb, String pack, Role r) return constructSingletonClass(cb, pack, SessionApiGenerator.ROLE_CLASS, getRoleClassName(r)); } - private ClassBuilder constructOpClass(ClassBuilder cb, String pack, MessageId mid) + private ClassBuilder constructOpClass(ClassBuilder cb, String pack, MsgId mid) { return constructSingletonClass(cb, pack, SessionApiGenerator.OP_CLASS, getOpClassName(mid)); } @@ -251,13 +251,13 @@ private ClassBuilder constructSingletonClass(ClassBuilder cb, String pack, Strin } // Returns the simple Session Class name - public static String getSessionClassName(GProtocolName gpn) + public static String getSessionClassName(GProtoName gpn) { return gpn.getSimpleName().toString(); } // Returns the Java output package: currently the Scribble package excluding the Module - public static String getEndpointApiRootPackageName(GProtocolName gpn) + public static String getEndpointApiRootPackageName(GProtoName gpn) { //return gpn.getPrefix().getPrefix().toString(); // Java output package name (not Scribble package) // FIXME: factor out with StateChannelApiGenerator.generateClasses @@ -265,17 +265,17 @@ public static String getEndpointApiRootPackageName(GProtocolName gpn) return gpn.toString(); } - public static String getRolesPackageName(GProtocolName gpn) + public static String getRolesPackageName(GProtoName gpn) { return getEndpointApiRootPackageName(gpn) + ".roles"; } - public static String getOpsPackageName(GProtocolName gpn) + public static String getOpsPackageName(GProtoName gpn) { return getEndpointApiRootPackageName(gpn) + ".ops"; } - public static String getStateChannelPackageName(GProtocolName gpn, Role self) + public static String getStateChannelPackageName(GProtoName gpn, Role self) { return getEndpointApiRootPackageName(gpn) + ".statechans." + self; } @@ -287,7 +287,7 @@ public static String getRoleClassName(Role r) } // Returns the simple Op Class name: names starting with a digit are prefixed by '_' - public static String getOpClassName(MessageId mid) + public static String getOpClassName(MsgId mid) { String s = mid.toString(); return (s.isEmpty() || s.charAt(0) < 65) ? "_" + s : s; // Hacky? diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java index bef1f913c..4df2aea12 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java @@ -30,8 +30,8 @@ import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.MessageSigName; -import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.name.SigName; +import org.scribble.core.type.name.PayElemType; import org.scribble.core.type.name.Role; import org.scribble.util.ScribException; @@ -291,7 +291,7 @@ private void addHandleMethod(final String ROLE_PARAM, final String MESSAGE_VAR, { String buffSuper = JavaBuilder.NEW + " " + BUF_CLASS + "<>("; int i = 0; - for (PayloadElemType pt : a.payload.elems) + for (PayElemType pt : a.payload.elems) { DataDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType ln += ", " + buffSuper + "(" + dtd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + i++ + "])"; @@ -300,7 +300,7 @@ private void addHandleMethod(final String ROLE_PARAM, final String MESSAGE_VAR, } else { - SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module ln += ", " + JavaBuilder.NEW + " " + BUF_CLASS + "<>((" + msd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM //+ "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[0]" // CHECKME: betty16.lec2.smtp.SmtpC4 + ")"; @@ -378,7 +378,7 @@ private void addCallbackCases(MethodBuilder mb2, final String ROLE_PARAM, { String buffSuper = JavaBuilder.NEW + " " + BUF_CLASS + "<>("; int i = 0; - for (PayloadElemType pt : a.payload.elems) + for (PayElemType pt : a.payload.elems) { DataDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType ln += ", " + buffSuper + "(" + dtd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + i++ + "])"; @@ -387,7 +387,7 @@ private void addCallbackCases(MethodBuilder mb2, final String ROLE_PARAM, } else { - SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module ln += ", " + JavaBuilder.NEW + " " + BUF_CLASS + "<>((" + msd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM //+ "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[0]" // CHECKME: betty16.lec2.smtp.SmtpC4 + ")"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java index 43baf8a90..21bded80a 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java @@ -27,7 +27,7 @@ import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.Role; import org.scribble.util.ScribException; @@ -138,7 +138,7 @@ private void addReceiveMethod(ClassBuilder cb, EAction a, EState succ) throws Sc } else //if (a.mid.isMessageSigName()) { - SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module mb.addBodyLine(JavaBuilder.SUPER + ".use();"); addBranchCheck(getSessionApiOpConstant(a.mid), mb, CASE_MESSAGE_FIELD); mb.addBodyLine(CASE_ARG_PREFIX + "." + BUFF_VAL_FIELD + " = (" + msd.getExtName() + ") " + CASE_MESSAGE_FIELD + ";"); @@ -197,7 +197,7 @@ private void addCaseReceiveDiscardMethod(ClassBuilder cb, EAction a, EState succ } else { - SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // Factor out? (send/receive/branchreceive/...) + SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // Factor out? (send/receive/branchreceive/...) ln += getGarbageBuf(msd.getExtName()) + ");"; } mb.addBodyLine(ln); @@ -228,7 +228,7 @@ public static void setCaseReceiveHeaderWithoutReturnType(StateChannelApiGenerato } else //if (a.mid.isMessageSigName()) { - SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module ReceiveSockGen.addReceiveMessageSigNameParams(mb, msd, true); } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java index bfba5a6bd..8293f6efe 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java @@ -23,8 +23,8 @@ import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.SigName; import org.scribble.util.ScribException; // Factor out @@ -42,7 +42,7 @@ public HandlerIfaceGen(StateChannelApiGenerator apigen, ClassBuilder parent, ESt @Override public InterfaceBuilder generateType() throws ScribException { - GProtocolName gpn = this.apigen.getGProtocolName(); + GProtoName gpn = this.apigen.getGProtocolName(); // Handler interface InterfaceBuilder ib = new InterfaceBuilder(); @@ -106,7 +106,7 @@ public static void addHandleMethodOpAndPayloadParams(StateChannelApiGenerator ap } else //if (a.mid.isMessageSigName()) { - SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module ReceiveSockGen.addReceiveMessageSigNameParams(mb, msd, false); } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java index c93e279a9..2aabbcdca 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java @@ -28,9 +28,9 @@ import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.MessageSigName; -import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.SigName; +import org.scribble.core.type.name.PayElemType; import org.scribble.util.ScribException; public class InputFutureGen extends AuxStateChanTypeGen @@ -51,7 +51,7 @@ public ClassBuilder generateType() throws ScribException { final String FUTURE_PARAM = "fut"; Module main = this.apigen.getMainModule(); - GProtocolName gpn = this.apigen.getGProtocolName(); + GProtoName gpn = this.apigen.getGProtocolName(); String futureClass = getInputFutureName(this.parent.getName()); // Fresh enough? need only one future class per receive (unary receive) @@ -74,7 +74,7 @@ public ClassBuilder generateType() throws ScribException if (!a.payload.isEmpty()) { int i = 1; - for (PayloadElemType pt : a.payload.elems) + for (PayElemType pt : a.payload.elems) { if (!pt.isDataType()) { @@ -92,7 +92,7 @@ public ClassBuilder generateType() throws ScribException } else { - SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); + SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); ScribSockGen.checkMessageSigNameDecl(msd); String type = msd.getExtName(); types.add(type); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java index 4f4474b04..d14d3184c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java @@ -27,8 +27,8 @@ import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.MessageSigName; -import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.name.SigName; +import org.scribble.core.type.name.PayElemType; import org.scribble.util.ScribException; public class OutputSockGen extends ScribSockGen @@ -170,7 +170,7 @@ public static void setSendHeaderWithoutReturnType(StateChannelApiGenerator apige } else //if (a.mid.isMessageSigName()) { - SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module addSendMessageSigNameParams(mb, msd); } } @@ -216,7 +216,7 @@ protected static void addSendOpParams(StateChannelApiGenerator apigen, MethodBui if (!a.payload.isEmpty()) { Iterator as = args.iterator(); - for (PayloadElemType pt : a.payload.elems) + for (PayElemType pt : a.payload.elems) { if (!pt.isDataType()) { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java index 7075fbfe4..5409a1a79 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java @@ -23,8 +23,8 @@ import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.MessageSigName; -import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.name.SigName; +import org.scribble.core.type.name.PayElemType; import org.scribble.util.ScribException; public class ReceiveSockGen extends ScribSockGen @@ -84,7 +84,7 @@ private void makeReceiveMethod(EAction a, EState succ) throws ScribException } else //if (a.mid.isMessageSigName()) { - SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module //addReceiveMessageSigNameParams(mb, a, msd);*/ mb.addBodyLine(StateChannelApiGenerator.SCRIBMESSAGE_CLASS + " " + RECEIVE_MESSAGE_PARAM + " = " + JavaBuilder.SUPER + ".readScribMessage(" + getSessionApiRoleConstant(a.obj) + ");"); @@ -168,7 +168,7 @@ public static void setReceiveHeaderWithoutReturnType(StateChannelApiGenerator ap } else //if (a.mid.isMessageSigName()) { - SigDecl msd = main.getMessageSigDeclChild(((MessageSigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module addReceiveMessageSigNameParams(mb, msd, true); } } @@ -180,7 +180,7 @@ protected static void addReceiveOpParams(MethodBuilder mb, Module main, EAction { String buffSuper = BUF_CLASS + "<" + ((superr) ? "? " + JavaBuilder.SUPER + " " : ""); int i = 1; - for (PayloadElemType pt : a.payload.elems) + for (PayElemType pt : a.payload.elems) { if (!pt.isDataType()) { @@ -198,7 +198,7 @@ protected static void addPayloadBuffSetters(Module main, EAction a, MethodBuilde if (!a.payload.isEmpty()) { int i = 1; - for (PayloadElemType pt : a.payload.elems) // Could factor out this loop (arg names) with addReceiveOpParams (as for send) + for (PayElemType pt : a.payload.elems) // Could factor out this loop (arg names) with addReceiveOpParams (as for send) { DataDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType mb.addBodyLine(RECEIVE_ARG_PREFIX + i + "." + BUFF_VAL_FIELD + " = (" + dtd.getExtName() + ") " diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java index c7aecca0b..1321f20fd 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ScribSockGen.java @@ -24,8 +24,8 @@ import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.core.model.endpoint.EState; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; import org.scribble.util.ScribException; @@ -207,7 +207,7 @@ protected String getSessionApiRoleConstant(Role role) // Not fully qualified, just Session API class prefix // The constant singleton value of this type in the Session API (which is the same "name" as the class) - protected String getSessionApiOpConstant(MessageId mid) + protected String getSessionApiOpConstant(MsgId mid) { return SessionApiGenerator.getSessionClassName(this.apigen.getGProtocolName()) + "." + SessionApiGenerator.getOpClassName(mid); } @@ -251,7 +251,7 @@ public static void setNextSocketReturnType(StateChannelApiGenerator apigen, Meth String ret; if (succ.isTerminal()) { - GProtocolName gpn = apigen.getGProtocolName(); + GProtoName gpn = apigen.getGProtocolName(); Role self = apigen.getSelf(); ret = SessionApiGenerator.getStateChannelPackageName(gpn, self) + "." + GENERATED_ENDSOCKET_NAME; //+ "<" + SessionApiGenerator.getSessionClassName(gpn) + ", " + SessionApiGenerator.getRoleClassName(self) + ">"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 0e5e342a8..0a81c2f5e 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -26,8 +26,8 @@ import org.scribble.core.job.JobContext; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.visit.global.InlinedProjector; import org.scribble.lang.Lang; @@ -46,7 +46,7 @@ public class StateChannelApiGenerator extends ApiGen public static final String SCRIBMESSAGE_OP_FIELD = "op"; private final Role self; - private final LProtocolName lpn; + private final LProtoName lpn; private final EState init; //private final String root; @@ -57,7 +57,7 @@ public class StateChannelApiGenerator extends ApiGen private Map types = new HashMap<>(); // class/iface name key - public StateChannelApiGenerator(Lang lang, GProtocolName fullname, Role self) + public StateChannelApiGenerator(Lang lang, GProtoName fullname, Role self) throws ScribException // CHECKME: APIGenerationException? { super(lang, fullname); @@ -193,7 +193,7 @@ private ClassBuilder constructClass(EState curr) throws ScribException // FIXME } } - public GProtocolName getGProtocolName() + public GProtoName getGProtocolName() { return this.gpn; } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java index b245b60d5..ad45193a9 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java @@ -23,8 +23,8 @@ import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.model.endpoint.actions.EReceive; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.PayElemType; import org.scribble.util.ScribException; public class ActionIfaceGen extends IOIfaceGen @@ -41,7 +41,7 @@ public ActionIfaceGen(StateChannelApiGenerator apigen, EState curr, EAction a) @Override public InterfaceBuilder generateType() throws ScribException { - GProtocolName gpn = this.apigen.getGProtocolName(); + GProtoName gpn = this.apigen.getGProtocolName(); this.ib.setName(getActionInterfaceName(this.a)); this.ib.setPackage(IOInterfacesGenerator.getIOInterfacePackageName(this.apigen.getGProtocolName(), this.apigen.getSelf())); @@ -130,7 +130,7 @@ public static String getActionString(EAction a) // FIXME: peer not needed for i { //String name = a.peer + "$" + a.mid; String name = a.obj + "_" + a.mid; - for (PayloadElemType pay : a.payload.elems) + for (PayElemType pay : a.payload.elems) { //name += "$" + pay; name += "_" + pay; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java index 4413b3c15..d758c0a44 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java @@ -27,7 +27,7 @@ import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.Role; import org.scribble.util.ScribException; @@ -49,7 +49,7 @@ protected void constructInterface() throws ScribException @Override protected void addHeader() { - GProtocolName gpn = this.apigen.getGProtocolName(); + GProtoName gpn = this.apigen.getGProtocolName(); Role self = this.apigen.getSelf(); String packname = IOInterfacesGenerator.getIOInterfacePackageName(gpn, self); String ifname = getCasesInterfaceName(self, this.curr); @@ -76,7 +76,7 @@ protected void addBranchEnumField() protected void addCaseReceiveDiscardMethods() { - GProtocolName gpn = this.apigen.getGProtocolName(); + GProtoName gpn = this.apigen.getGProtocolName(); //Set as = this.curr.getActions(); List as = this.curr.getActions(); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java index d463fb976..90fda540f 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java @@ -25,7 +25,7 @@ import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.Role; import org.scribble.util.ScribException; @@ -54,7 +54,7 @@ protected void constructInterface() throws ScribException @Override protected void addHeader() { - GProtocolName gpn = this.apigen.getGProtocolName(); + GProtoName gpn = this.apigen.getGProtocolName(); Role self = this.apigen.getSelf(); String packname = IOInterfacesGenerator.getIOInterfacePackageName(gpn, self); String ifname = getHandleInterfaceName(self, this.curr); @@ -116,7 +116,7 @@ private static List getHandleInterfaceIOActionParams(EndpointState cur protected void addHandleMethods() throws ScribException { - GProtocolName gpn = this.apigen.getGProtocolName(); + GProtoName gpn = this.apigen.getGProtocolName(); //Role self = this.apigen.getSelf(); //Set as = this.curr.getActions(); List as = this.curr.getActions(); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index 3c19d4d94..d5ad1e952 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -42,7 +42,7 @@ import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.EStateKind; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.Role; import org.scribble.util.RuntimeScribException; import org.scribble.util.ScribException; @@ -77,7 +77,7 @@ public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) this.apigen = apigen; this.SUBTYPES = subtypes; - GProtocolName fullname = apigen.getGProtocolName(); + GProtoName fullname = apigen.getGProtocolName(); Role self = getSelf(); //EndpointState init = this.job.getContext().getEndpointGraph(fullname, self).init; JobContext jobc2 = this.job.getContext(); @@ -1041,7 +1041,7 @@ protected Role getSelf() return this.apigen.getSelf(); } - protected static String getIOInterfacePackageName(GProtocolName gpn, Role self) + protected static String getIOInterfacePackageName(GProtoName gpn, Role self) { return SessionApiGenerator.getStateChannelPackageName(gpn, self) + ".ioifaces"; } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java index 5b1c98e79..e7600d1d1 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java @@ -28,7 +28,7 @@ import org.scribble.codegen.java.util.TypeBuilder; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.Role; import org.scribble.util.RuntimeScribException; import org.scribble.util.ScribException; @@ -74,7 +74,7 @@ protected void constructInterface() throws ScribException protected void addHeader() { - GProtocolName gpn = this.apigen.getGProtocolName(); + GProtoName gpn = this.apigen.getGProtocolName(); Role self = this.apigen.getSelf(); String packname = IOInterfacesGenerator.getIOInterfacePackageName(gpn, self); String ifname = getIOStateInterfaceName(self, this.curr); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java index 6646141b3..e3961aa2b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java @@ -24,7 +24,7 @@ import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.util.ScribException; public class ReceiveIfaceGen extends IOStateIfaceGen @@ -54,7 +54,7 @@ protected void constructInterface() throws ScribException protected void addAsyncDiscardMethod() { - GProtocolName gpn = this.apigen.getGProtocolName(); + GProtoName gpn = this.apigen.getGProtocolName(); EAction first = this.curr.getActions().iterator().next(); MethodBuilder mb = this.ib.newAbstractMethod(); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index a05886760..6bdfca4a7 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -22,7 +22,7 @@ import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.Role; import org.scribble.lang.Lang; @@ -30,7 +30,7 @@ public abstract class STStateChanAPIBuilder { public final Lang lang; - public final GProtocolName gpn; + public final GProtoName gpn; public final Role role; public final EGraph graph; @@ -42,7 +42,7 @@ public abstract class STStateChanAPIBuilder private Map names = new HashMap<>(); - protected STStateChanAPIBuilder(Lang lang, GProtocolName gpn, Role role, EGraph graph, + protected STStateChanAPIBuilder(Lang lang, GProtoName gpn, Role role, EGraph graph, STOutputStateBuilder ob, STReceiveStateBuilder rb, STBranchStateBuilder bb, STCaseBuilder cb, STEndStateBuilder eb) { this.lang = lang; diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Job.java index db36b5499..1f3351e67 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Job.java @@ -30,11 +30,11 @@ import org.scribble.core.model.global.SGraphBuilderUtil; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.ModuleName; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.local.LSeq; @@ -95,7 +95,7 @@ public EGraphBuilderUtil newEGraphBuilderUtil() } //public SGraphBuilderUtil newSGraphBuilderUtil() // FIXME TODO global builder util - public SGraph buildSGraph(GProtocolName fullname, Map egraphs, + public SGraph buildSGraph(GProtoName fullname, Map egraphs, boolean explicit) throws ScribException { verbosePrintln("(" + fullname + ") Building global model using:"); @@ -156,7 +156,7 @@ public void runContextBuildingPasses() throws ScribException runProjectionPasses(); - for (Entry e : + for (Entry e : this.context.getInlinedProjections().entrySet()) { //LProtocolName lname = e.getKey(); @@ -217,7 +217,7 @@ public void runValidationPasses() throws ScribException continue; } - GProtocolName fullname = gpd.fullname;//.getFullMemberName(mod); + GProtoName fullname = gpd.fullname;//.getFullMemberName(mod); verbosePrintln("\nValidating " + fullname + ":"); @@ -283,19 +283,19 @@ protected void runProjectionPasses() throws ScribException // Pre: checkWellFormedness // Returns: fullname -> Module -- CHECKME TODO: refactor local Module creation to Lang? // CHECKME: generate projection Modules for an inline main? - public Map getProjections(GProtocolName fullname, + public Map getProjections(GProtoName fullname, Role role) throws ScribException { //Module root = LProtocol proj = this.context.getProjection(fullname, role); - List> ps = proj.def + List> ps = proj.def .gather(new ProtoDepsCollector()::visit) .collect(Collectors.toList()); - for (ProtocolName p : ps) + for (ProtoName p : ps) { - System.out.println("\n" + this.context.getProjection((LProtocolName) p)); + System.out.println("\n" + this.context.getProjection((LProtoName) p)); } if (!ps.contains(proj.fullname)) { diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java index afe80e5a9..f224587ac 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/JobContext.java @@ -27,8 +27,8 @@ import org.scribble.core.model.endpoint.AutGraphParser; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.global.SGraph; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.Role; import org.scribble.core.visit.global.InlinedProjector; @@ -48,29 +48,29 @@ public class JobContext // "Directly" translated global protos, i.e., separate proto decls without any inlining/unfolding/etc // Protos retain original decl role list (and args) // Keys are full names (though GProtocol already includes full name) - private final Map imeds; + private final Map imeds; // Protos have pruned role decls -- CHECKME: prune args? // Keys are full names (though GProtocol already includes full name) - private final Map inlined = new HashMap<>(); + private final Map inlined = new HashMap<>(); // Projected from inlined; keys are full names - private final Map iprojs = new HashMap<>(); + private final Map iprojs = new HashMap<>(); // Projected from intermediates // LProtocolName is the full local protocol name (module name is the prefix) // LProtocolName key is LProtocol value fullname (i.e., redundant) - private final Map projs = new HashMap<>(); + private final Map projs = new HashMap<>(); // Built from inlined - private final Map fEGraphs = new HashMap<>(); - private final Map uEGraphs = new HashMap<>(); - private final Map mEGraphs = new HashMap<>(); + private final Map fEGraphs = new HashMap<>(); + private final Map uEGraphs = new HashMap<>(); + private final Map mEGraphs = new HashMap<>(); // Toolchain currently depends on single instance of each graph (state id equality), e.g. cannot re-build or re-minimise, would not be the same graph instance // FIXME: currently only minimising "fair" graph, need to consider minimisation orthogonally to fairness -- NO: minimising (of fair) is for API gen only, unfair-transform does not use minimisation (regardless of user flag) for WF - private final Map fSGraphs = new HashMap<>(); - private final Map uSGraphs = new HashMap<>(); + private final Map fSGraphs = new HashMap<>(); + private final Map uSGraphs = new HashMap<>(); protected JobContext(Job job, //Map modcs, Set imeds) @@ -104,7 +104,7 @@ public Set getProjectedFullModuleNames() .collect(Collectors.toSet()); } - public GProtocol getIntermediate(GProtocolName fullname) + public GProtocol getIntermediate(GProtoName fullname) { return this.imeds.get(fullname); } @@ -114,12 +114,12 @@ public Collection getIntermediates() return this.imeds.values().stream().collect(Collectors.toSet()); } - public void addInlined(GProtocolName fullname, GProtocol g) + public void addInlined(GProtoName fullname, GProtocol g) { this.inlined.put(fullname, g); } - public GProtocol getInlined(GProtocolName fullname) + public GProtocol getInlined(GProtoName fullname) { return this.inlined.get(fullname); } @@ -129,24 +129,24 @@ public Set getInlined() return this.inlined.values().stream().collect(Collectors.toSet()); } - public void addInlinedProjection(LProtocolName fullname, LProtocol l) + public void addInlinedProjection(LProtoName fullname, LProtocol l) { this.iprojs.put(fullname, l); } // Projected from inlined - public LProtocol getInlinedProjection(GProtocolName fullname, Role self) + public LProtocol getInlinedProjection(GProtoName fullname, Role self) { - LProtocolName p = InlinedProjector.getFullProjectionName(fullname, self); + LProtoName p = InlinedProjector.getFullProjectionName(fullname, self); return getInlinedProjection(p); } - public LProtocol getInlinedProjection(LProtocolName fullname) + public LProtocol getInlinedProjection(LProtoName fullname) { return this.iprojs.get(fullname); } - public Map getInlinedProjections() + public Map getInlinedProjections() { return Collections.unmodifiableMap(this.iprojs); } @@ -161,14 +161,14 @@ public void addProjection(LProtocol p) } public //Module - LProtocol getProjection(GProtocolName fullname, Role role) + LProtocol getProjection(GProtoName fullname, Role role) throws ScribException { return getProjection(InlinedProjector.getFullProjectionName(fullname, role)); } public //Module - LProtocol getProjection(LProtocolName fullname) + LProtocol getProjection(LProtoName fullname) //throws ScribbleException { /*Module proj = this.projected.get(fullname); @@ -183,16 +183,16 @@ LProtocol getProjection(LProtocolName fullname) return this.projs.get(fullname); } - protected void addEGraph(LProtocolName fullname, EGraph graph) + protected void addEGraph(LProtoName fullname, EGraph graph) { this.fEGraphs.put(fullname, graph); } // N.B. graphs built from inlined (not unfolded) - public EGraph getEGraph(GProtocolName fullname, Role role) + public EGraph getEGraph(GProtoName fullname, Role role) throws ScribException { - LProtocolName fulllpn = InlinedProjector.getFullProjectionName(fullname, + LProtoName fulllpn = InlinedProjector.getFullProjectionName(fullname, role); // Moved form LProtocolDecl EGraph graph = this.fEGraphs.get(fulllpn); @@ -208,15 +208,15 @@ public EGraph getEGraph(GProtocolName fullname, Role role) return graph; } - protected void addUnfairEGraph(LProtocolName fullname, EGraph graph) + protected void addUnfairEGraph(LProtoName fullname, EGraph graph) { this.uEGraphs.put(fullname, graph); } - public EGraph getUnfairEGraph(GProtocolName fullname, Role role) + public EGraph getUnfairEGraph(GProtoName fullname, Role role) throws ScribException { - LProtocolName fulllpn = InlinedProjector.getFullProjectionName(fullname, + LProtoName fulllpn = InlinedProjector.getFullProjectionName(fullname, role); EGraph unfair = this.uEGraphs.get(fulllpn); @@ -229,12 +229,12 @@ public EGraph getUnfairEGraph(GProtocolName fullname, Role role) return unfair; } - protected void addSGraph(GProtocolName fullname, SGraph graph) + protected void addSGraph(GProtoName fullname, SGraph graph) { this.fSGraphs.put(fullname, graph); } - public SGraph getSGraph(GProtocolName fullname) throws ScribException + public SGraph getSGraph(GProtoName fullname) throws ScribException { SGraph graph = this.fSGraphs.get(fullname); if (graph == null) @@ -253,7 +253,7 @@ public SGraph getSGraph(GProtocolName fullname) throws ScribException return graph; } - private Map getEGraphsForSGraphBuilding(GProtocolName fullname, + private Map getEGraphsForSGraphBuilding(GProtoName fullname, //GProtocolDecl gpd, boolean fair) throws ScribException { @@ -268,12 +268,12 @@ private Map getEGraphsForSGraphBuilding(GProtocolName fullname, return egraphs; } - protected void addUnfairSGraph(GProtocolName fullname, SGraph graph) + protected void addUnfairSGraph(GProtoName fullname, SGraph graph) { this.uSGraphs.put(fullname, graph); } - public SGraph getUnfairSGraph(GProtocolName fullname) throws ScribException + public SGraph getUnfairSGraph(GProtoName fullname) throws ScribException { SGraph graph = this.uSGraphs.get(fullname); if (graph == null) @@ -291,15 +291,15 @@ public SGraph getUnfairSGraph(GProtocolName fullname) throws ScribException return graph; } - protected void addMinimisedEGraph(LProtocolName fullname, EGraph graph) + protected void addMinimisedEGraph(LProtoName fullname, EGraph graph) { this.mEGraphs.put(fullname, graph); } - public EGraph getMinimisedEGraph(GProtocolName fullname, Role role) + public EGraph getMinimisedEGraph(GProtoName fullname, Role role) throws ScribException { - LProtocolName fulllpn = InlinedProjector.getFullProjectionName(fullname, + LProtoName fulllpn = InlinedProjector.getFullProjectionName(fullname, role); EGraph minimised = this.mEGraphs.get(fulllpn); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java index fb0edb7ef..d092e511f 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java @@ -19,18 +19,18 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageSigName; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.SigName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Seq; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; import org.scribble.util.Constants; -public abstract class Protocol, B extends Seq> +public abstract class Protocol, B extends Seq> implements SNode { private final CommonTree source; // CHECKME: factor out with SType(Base) ? @@ -111,7 +111,7 @@ protected String paramsToString() { k = Constants.TYPE_KW; } - else if (x instanceof MessageSigName) + else if (x instanceof SigName) { k = Constants.SIG_KW; } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java index 3cbd575ad..51091457e 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java @@ -18,7 +18,7 @@ import java.util.stream.Collectors; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; @@ -26,7 +26,7 @@ // Immutable public class SubprotoSig { - public final ProtocolName fullname; + public final ProtoName fullname; // public Scope scope; public final List roles; // i.e., roles (and args) are ordered public final List> args; @@ -35,7 +35,7 @@ public class SubprotoSig // public SubprotocolSignature(ProtocolName fmn, Scope scope, List // roles, List> args) - public SubprotoSig(ProtocolName fullname, + public SubprotoSig(ProtoName fullname, List roles, List> args) { this.fullname = fullname; diff --git a/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java b/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java index 4424aa8f4..879806bb7 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java @@ -17,15 +17,15 @@ import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Kind; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.LProtocolName; -import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.LProtoName; +import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.Name; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.ProtoName; import org.scribble.util.ScribException; // Context information specific to each module as a root (wrt. to visitor passes) @@ -66,8 +66,8 @@ public boolean isMessageSigNameDependency(Name signame) // TODO: deprecate -- now redundant: proto should already be full name by namedisamb (and this.deps only stores full names) // Refactored as a "check" for now (although still redundant, not actually checking anything) - public ProtocolName checkProtocolDeclDependencyFullName( - ProtocolName proto) + public ProtoName checkProtocolDeclDependencyFullName( + ProtoName proto) { return getProtocolDeclFullName(this.deps, proto); } @@ -92,32 +92,32 @@ public boolean isVisibleDataType(DataType visname) return this.visible.isVisibleDataType(visname); } - public MessageSigName getVisibleMessageSigNameFullName(MessageSigName visname) + public SigName getVisibleMessageSigNameFullName(SigName visname) { return getFullName(this.visible.sigs, visname); } - public ProtocolName getVisibleProtocolDeclFullName( - ProtocolName visname) + public ProtoName getVisibleProtocolDeclFullName( + ProtoName visname) { return getProtocolDeclFullName(this.visible, visname); } - public boolean isVisibleProtocolDeclName( - ProtocolName visname) + public boolean isVisibleProtocolDeclName( + ProtoName visname) { return this.visible.isVisibleProtocolDeclName(visname); } - public static ProtocolName getProtocolDeclFullName( - ScribNames names, ProtocolName proto) + public static ProtoName getProtocolDeclFullName( + ScribNames names, ProtoName proto) { - ProtocolName pn = (proto.getKind() + ProtoName pn = (proto.getKind() .equals(Global.KIND)) - ? getFullName(names.globals, (GProtocolName) proto) - : getFullName(names.locals, (LProtocolName) proto); + ? getFullName(names.globals, (GProtoName) proto) + : getFullName(names.locals, (LProtoName) proto); @SuppressWarnings("unchecked") - ProtocolName tmp = (ProtocolName) pn; + ProtoName tmp = (ProtoName) pn; return tmp; } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/context/ScribNames.java b/scribble-core/src/main/java/org/scribble/core/lang/context/ScribNames.java index fb493e4c9..b3793c9f5 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/context/ScribNames.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/context/ScribNames.java @@ -17,11 +17,11 @@ import java.util.Map; import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.LProtocolName; -import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.LProtoName; +import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.ModuleName; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.ProtoName; // TODO: fix mutable public collection fields -- currently hacked for ModuleContext(Collector) internal use // TODO: rename better @@ -30,9 +30,9 @@ public class ScribNames // names -> fully qualified names public final Map modules = new HashMap<>(); public final Map data = new HashMap<>(); - public final Map sigs = new HashMap<>(); - public final Map globals = new HashMap<>(); - public final Map locals = new HashMap<>(); + public final Map sigs = new HashMap<>(); + public final Map globals = new HashMap<>(); + public final Map locals = new HashMap<>(); @Override public String toString() @@ -43,7 +43,7 @@ public String toString() + ")"; } - public boolean isVisibleProtocolDeclName(ProtocolName visname) + public boolean isVisibleProtocolDeclName(ProtoName visname) { return this.globals.containsKey(visname) || this.locals.containsKey(visname); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 9d57da828..77985e45f 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -40,11 +40,11 @@ import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.MsgId; +import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; @@ -64,18 +64,18 @@ import org.scribble.util.ScribException; import org.scribble.util.ScribUtil; -public class GProtocol extends Protocol +public class GProtocol extends Protocol implements GNode // Mainly for GDel.translate return (to include GProtocol) { public GProtocol(CommonTree source, List mods, - GProtocolName fullname, List roles, + GProtoName fullname, List roles, List> params, GSeq def) { super(source, mods, fullname, roles, params, def); } public GProtocol reconstruct(CommonTree source, - List mods, GProtocolName fullname, List roles, + List mods, GProtoName fullname, List roles, List> params, GSeq def) { return new GProtocol(source, mods, fullname, roles, params, def); @@ -115,7 +115,7 @@ public LProjection project(Job job, Role self) private LProjection projectAux(Role self, List decls, LSeq body) { - LProtocolName fullname = InlinedProjector + LProtoName fullname = InlinedProjector .getFullProjectionName(this.fullname, self); Set tmp = body.gather(new RoleGatherer()::visit) .collect(Collectors.toSet()); @@ -143,9 +143,9 @@ public GProtocol getInlined(STypeInliner v) { params.add((DataType) n); } - else if (n instanceof MessageSigName) + else if (n instanceof SigName) { - params.add((MessageSigName) n); + params.add((SigName) n); } else { @@ -220,7 +220,7 @@ public boolean canEquals(Object o) // TODO FIXME: refactor following methods (e.g., make non-static?) - public static void validateByScribble(Job job, GProtocolName fullname, + public static void validateByScribble(Job job, GProtoName fullname, boolean fair) throws ScribException { JobContext jc = job.getContext(); @@ -231,7 +231,7 @@ public static void validateByScribble(Job job, GProtocolName fullname, job.config.mf.newSModel(graph).validate(job); } - public static void validateBySpin(Job job, GProtocolName fullname) + public static void validateBySpin(Job job, GProtoName fullname) throws ScribException { JobContext jobc = job.getContext(); @@ -249,7 +249,7 @@ public static void validateBySpin(Job job, GProtocolName fullname) ((ModuleDel) mod.del()).getModuleContext()); // TODO: get ModuleContext from Job(Context) gpd.accept(coll); Set> mids = coll.getNames();*/ - Set> mids = gpd.def.//getMessageIds(); + Set> mids = gpd.def.//getMessageIds(); gather(new MessageIdGatherer()::visit) .collect(Collectors.toSet()); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java index fd3527e13..f8e8e0e21 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java @@ -20,8 +20,8 @@ import org.scribble.core.lang.ProtocolMod; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.local.LSeq; @@ -29,11 +29,11 @@ public class LProjection extends LProtocol { - public final GProtocolName parent; + public final GProtoName parent; - public LProjection(List mods, LProtocolName fullname, + public LProjection(List mods, LProtoName fullname, List roles, Role self, - List> params, GProtocolName parent, + List> params, GProtoName parent, LSeq body) { super(null, mods, fullname, roles, self, params, body); @@ -42,7 +42,7 @@ public LProjection(List mods, LProtocolName fullname, @Override public LProjection reconstruct(CommonTree source, - List mods, LProtocolName fullname, List roles, + List mods, LProtoName fullname, List roles, Role self, List> params, LSeq body) { return new LProjection(mods, fullname, roles, this.self, params, diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 96c5712e0..76e07f401 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -29,9 +29,9 @@ import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; @@ -46,13 +46,13 @@ import org.scribble.util.Constants; import org.scribble.util.ScribException; -public class LProtocol extends Protocol +public class LProtocol extends Protocol implements LNode { public final Role self; public LProtocol(CommonTree source, List mods, - LProtocolName fullname, List roles, Role self, + LProtoName fullname, List roles, Role self, List> params, LSeq def) { super(source, mods, fullname, roles, params, def); @@ -60,7 +60,7 @@ public LProtocol(CommonTree source, List mods, } public LProtocol reconstruct(CommonTree source, - List mods, LProtocolName fullname, List roles, + List mods, LProtoName fullname, List roles, Role self, List> params, LSeq def) { return new LProtocol(source, mods, fullname, roles, self, params, def); @@ -86,9 +86,9 @@ public LProtocol getInlined(STypeInliner v) { params.add((DataType) n); } - else if (n instanceof MessageSigName) + else if (n instanceof SigName) { - params.add((MessageSigName) n); + params.add((SigName) n); } else { diff --git a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java index 3339edee7..069c7ffaa 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java @@ -13,7 +13,7 @@ */ package org.scribble.core.model; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.util.ScribException; // Helper class for EndpointGraphBuilder -- can access the protected setters of S @@ -22,7 +22,7 @@ public abstract class GraphBuilderUtil , // Action type: labels on edges S extends MState, // State type - K extends ProtocolKind> // Global/local actions/states -- Need to quantify K explicitly + K extends ProtoKind> // Global/local actions/states -- Need to quantify K explicitly { protected S entry; protected S exit; // Tracking exit is convenient for merges (otherwise have to generate dummy merge nodes) diff --git a/scribble-core/src/main/java/org/scribble/core/model/MAction.java b/scribble-core/src/main/java/org/scribble/core/model/MAction.java index 2ab0b2e0e..e09b7f85d 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MAction.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MAction.java @@ -13,22 +13,22 @@ */ package org.scribble.core.model; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.kind.ProtoKind; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; -public abstract class MAction +public abstract class MAction { /*private static int count = 0; public final int id; // Was using for trace enumeration, but breaks isAcceptable -- but need for non-det models*/ public final Role obj; - public final MessageId mid; + public final MsgId mid; public final Payload payload; // EMPTY_PAYLOAD for MessageSigNames - protected MAction(Role obj, MessageId mid, Payload payload) + protected MAction(Role obj, MsgId mid, Payload payload) { //this.id = ModelAction.count++; diff --git a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java index 5b2138632..6e630835e 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java @@ -18,10 +18,10 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; public abstract class MPrettyState - , S extends MPrettyState, K extends ProtocolKind> + , S extends MPrettyState, K extends ProtoKind> extends MState implements MPrettyPrint { diff --git a/scribble-core/src/main/java/org/scribble/core/model/MState.java b/scribble-core/src/main/java/org/scribble/core/model/MState.java index cb77022b7..e592393d1 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MState.java @@ -25,7 +25,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.util.RuntimeScribException; import org.scribble.util.ScribException; @@ -33,7 +33,7 @@ public abstract class MState< L, // Node label type (cosmetic) A extends MAction, // Edge type S extends MState, // State type - K extends ProtocolKind // Global/Local + K extends ProtoKind // Global/Local > { private static int count = 0; // FIXME: factor out with ModelAction @@ -214,7 +214,7 @@ public boolean equals(Object o) public abstract Set getReachableActions(); // TODO: make protected - public static , S extends MState, K extends ProtocolKind> + public static , S extends MState, K extends ProtoKind> S getTerminal(S start) { if (start.isTerminal()) @@ -236,7 +236,7 @@ Set getAllReachable(S start)*/ // TODO: make protected // CHECKME: cache results? @SuppressWarnings("unchecked") - public static , S extends MState, K extends ProtocolKind> + public static , S extends MState, K extends ProtoKind> Set getReachableStates(MState start) { Map all = new HashMap<>(); @@ -274,7 +274,7 @@ Set getReachableStates(MState start) @SuppressWarnings("unchecked") // TODO: make protected // CHECKME: cache results? - public static , S extends MState, K extends ProtocolKind> + public static , S extends MState, K extends ProtoKind> //Set getAllReachableActions(S start) Set getReachableActions(MState start) { diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java index 9ba4c73df..1484d7bd8 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java @@ -38,18 +38,18 @@ import org.scribble.core.model.global.actions.SSend; import org.scribble.core.model.global.actions.SWrapClient; import org.scribble.core.model.global.actions.SWrapServer; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; public interface ModelFactory { - ESend newESend(Role peer, MessageId mid, Payload payload); - EReceive newEReceive(Role peer, MessageId mid, Payload payload); - ERequest newERequest(Role peer, MessageId mid, Payload payload); - EAccept newEAccept(Role peer, MessageId mid, Payload payload); + ESend newESend(Role peer, MsgId mid, Payload payload); + EReceive newEReceive(Role peer, MsgId mid, Payload payload); + ERequest newERequest(Role peer, MsgId mid, Payload payload); + EAccept newEAccept(Role peer, MsgId mid, Payload payload); EDisconnect newEDisconnect(Role peer); EWrapClient newEWrapClient(Role peer); EWrapServer newEWrapServer(Role peer); @@ -58,16 +58,16 @@ public interface ModelFactory SGraphBuilderUtil newSGraphBuilderUtil(); // Directly created and used by Job.buildSGraph -- cf. EGraphBuilderUtil, encapsulated by EGraphBuilder AST visitor - SSend newSSend(Role subj, Role obj, MessageId mid, Payload payload); - SReceive newSReceive(Role subj, Role obj, MessageId mid, Payload payload); - SRequest newSConnect(Role subj, Role obj, MessageId mid, Payload payload); - SAccept newSAccept(Role subj, Role obj, MessageId mid, Payload payload); + SSend newSSend(Role subj, Role obj, MsgId mid, Payload payload); + SReceive newSReceive(Role subj, Role obj, MsgId mid, Payload payload); + SRequest newSConnect(Role subj, Role obj, MsgId mid, Payload payload); + SAccept newSAccept(Role subj, Role obj, MsgId mid, Payload payload); SDisconnect newSDisconnect(Role subj, Role obj); SWrapClient newSWrapClient(Role subj, Role obj); SWrapServer newSWrapServer(Role subj, Role obj); SState newSState(SConfig config); - SGraph newSGraph(GProtocolName proto, Map states, SState init); + SGraph newSGraph(GProtoName proto, Map states, SState init); SConfig newSConfig(Map state, SBuffers buffs); SModel newSModel(SGraph g); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java index bbe7ff482..c34f71570 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java @@ -38,8 +38,8 @@ import org.scribble.core.model.global.actions.SSend; import org.scribble.core.model.global.actions.SWrapClient; import org.scribble.core.model.global.actions.SWrapServer; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; @@ -49,25 +49,25 @@ public class ModelFactoryImpl implements ModelFactory { @Override - public ESend newESend(Role peer, MessageId mid, Payload payload) + public ESend newESend(Role peer, MsgId mid, Payload payload) { return new ESend(this, peer, mid, payload); } @Override - public EReceive newEReceive(Role peer, MessageId mid, Payload payload) + public EReceive newEReceive(Role peer, MsgId mid, Payload payload) { return new EReceive(this, peer, mid, payload); } @Override - public ERequest newERequest(Role peer, MessageId mid, Payload payload) + public ERequest newERequest(Role peer, MsgId mid, Payload payload) { return new ERequest(this, peer, mid, payload); } @Override - public EAccept newEAccept(Role peer, MessageId mid, Payload payload) + public EAccept newEAccept(Role peer, MsgId mid, Payload payload) { return new EAccept(this, peer, mid, payload); } @@ -103,25 +103,25 @@ public SGraphBuilderUtil newSGraphBuilderUtil() } @Override - public SSend newSSend(Role subj, Role obj, MessageId mid, Payload payload) + public SSend newSSend(Role subj, Role obj, MsgId mid, Payload payload) { return new SSend(subj, obj, mid, payload); } @Override - public SReceive newSReceive(Role subj, Role obj, MessageId mid, Payload payload) + public SReceive newSReceive(Role subj, Role obj, MsgId mid, Payload payload) { return new SReceive(subj, obj, mid, payload); } @Override - public SRequest newSConnect(Role subj, Role obj, MessageId mid, Payload payload) + public SRequest newSConnect(Role subj, Role obj, MsgId mid, Payload payload) { return new SRequest(subj, obj, mid, payload); } @Override - public SAccept newSAccept(Role subj, Role obj, MessageId mid, Payload payload) + public SAccept newSAccept(Role subj, Role obj, MsgId mid, Payload payload) { return new SAccept(subj, obj, mid, payload); } @@ -151,7 +151,7 @@ public SState newSState(SConfig config) } @Override - public SGraph newSGraph(GProtocolName proto, Map states, SState init) + public SGraph newSGraph(GProtoName proto, Map states, SState init) { return new SGraph(proto, states, init); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java index 40e910247..4092584ff 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java @@ -30,8 +30,8 @@ import org.scribble.core.model.ModelFactory; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.MessageSigName; +import org.scribble.core.type.name.MsgId; +import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.Op; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; @@ -285,8 +285,8 @@ else if ((i = a.indexOf('/')) != -1) } // Cf. ModelState.toAut, ModelAction.toStringWithMessageIdHack - private static MessageId getMessageIdHack(String msg) + private static MsgId getMessageIdHack(String msg) { - return (msg.startsWith("^")) ? new MessageSigName(msg.substring(1)) : new Op(msg); + return (msg.startsWith("^")) ? new SigName(msg.substring(1)) : new Op(msg); } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAccept.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAccept.java index 63442e2b5..fe5be1ddd 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAccept.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAccept.java @@ -15,13 +15,13 @@ import org.scribble.core.model.ModelFactory; import org.scribble.core.model.global.actions.SAccept; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; public class EAccept extends EAction { - public EAccept(ModelFactory ef, Role peer, MessageId mid, Payload payload) + public EAccept(ModelFactory ef, Role peer, MsgId mid, Payload payload) //public Accept(Role peer) { super(ef, peer, mid, payload); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java index 2f3ee4c70..ea065bb74 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java @@ -17,7 +17,7 @@ import org.scribble.core.model.ModelFactory; import org.scribble.core.model.global.actions.SAction; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; @@ -29,7 +29,7 @@ public abstract class EAction extends MAction protected ModelFactory ef; - protected EAction(ModelFactory ef, Role peer, MessageId mid, Payload payload) + protected EAction(ModelFactory ef, Role peer, MsgId mid, Payload payload) { /*this.mid = mid; this.payload = payload;*/ diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReceive.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReceive.java index e000af883..89f901918 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReceive.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReceive.java @@ -15,7 +15,7 @@ import org.scribble.core.model.ModelFactory; import org.scribble.core.model.global.actions.SReceive; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; @@ -42,7 +42,7 @@ private Receive(Role peer, MessageId mid, Payload payload, boolean hack) super(peer, mid, payload); }*/ - public EReceive(ModelFactory ef, Role peer, MessageId mid, Payload payload) + public EReceive(ModelFactory ef, Role peer, MsgId mid, Payload payload) { super(ef, peer, mid, payload); //Receive.RECEIVES.add(this); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERequest.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERequest.java index 16904ab3a..b54bc43b6 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERequest.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERequest.java @@ -15,13 +15,13 @@ import org.scribble.core.model.ModelFactory; import org.scribble.core.model.global.actions.SRequest; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; public class ERequest extends EAction { - public ERequest(ModelFactory ef, Role peer, MessageId mid, Payload payload) + public ERequest(ModelFactory ef, Role peer, MsgId mid, Payload payload) //public Connect(Role peer) { super(ef, peer, mid, payload); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java index d1a831a15..13efc4813 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java @@ -15,7 +15,7 @@ import org.scribble.core.model.ModelFactory; import org.scribble.core.model.global.actions.SSend; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; @@ -42,7 +42,7 @@ public Send(Role peer, MessageId mid, Payload payload, boolean hack) super(peer, mid, payload); }*/ - public ESend(ModelFactory ef, Role peer, MessageId mid, Payload payload) + public ESend(ModelFactory ef, Role peer, MsgId mid, Payload payload) { super(ef, peer, mid, payload); //Send.SENDS.add(this); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java index e1286a84c..944247e71 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java @@ -26,11 +26,11 @@ import org.scribble.core.model.MPrettyPrint; import org.scribble.core.model.global.actions.SAction; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; public class SGraph implements MPrettyPrint { - public final GProtocolName proto; + public final GProtoName proto; //private final Map efsms; //private final boolean fair; @@ -41,7 +41,7 @@ public class SGraph implements MPrettyPrint private Set> termSets; // Unlike EState, SGraph is not just a "simple wrapper" for an existing graph of nodes -- it is a "semantic structure" that needs to be fully built properly (so no arbitrary "toGraph" method; cf., EState) - public SGraph(GProtocolName proto, Map states, SState init) + public SGraph(GProtoName proto, Map states, SState init) { this.proto = proto; this.init = init; diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index c5e06028b..4d92dcbc4 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -31,7 +31,7 @@ import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.model.global.actions.SAction; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.Role; import org.scribble.util.ScribException; @@ -68,7 +68,7 @@ protected SConfig createInitialSConfig(ModelFactory ef, Map egraph // Also checks for non-deterministic payloads // Maybe refactor into an SGraph builder util; cf., EGraphBuilderUtil -- but not Visitor-based building (cf. EndpointGraphBuilder), this isn't an AST algorithm //public SGraph buildSGraph(Job job, GProtocolName fullname, SConfig c0) throws ScribbleException - public SGraph buildSGraph(Job job, GProtocolName fullname, Map egraphs, boolean explicit) throws ScribException + public SGraph buildSGraph(Job job, GProtoName fullname, Map egraphs, boolean explicit) throws ScribException { /*Map efsms = egraphs.entrySet().stream().collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().toFsm())); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAccept.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAccept.java index e674454d6..842356ec7 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAccept.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAccept.java @@ -13,13 +13,13 @@ */ package org.scribble.core.model.global.actions; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; public class SAccept extends SAction { - public SAccept(Role subj, Role obj, MessageId mid, Payload payload) + public SAccept(Role subj, Role obj, MsgId mid, Payload payload) //public GAccept(Role subj, Role obj) { super(subj, obj, mid, payload); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java index ce0c1b475..62e66d064 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java @@ -19,7 +19,7 @@ import org.scribble.core.model.MAction; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; @@ -27,7 +27,7 @@ public abstract class SAction extends MAction { public final Role subj; - public SAction(Role subj, Role obj, MessageId mid, Payload payload) + public SAction(Role subj, Role obj, MsgId mid, Payload payload) { super(obj, mid, payload); this.subj = subj; diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SConnect.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SConnect.java index 68d412a21..b1661e73a 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SConnect.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SConnect.java @@ -13,13 +13,13 @@ */ package org.scribble.core.model.global.actions; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; public class SConnect extends SAction { - public SConnect(Role subj, Role obj, MessageId mid, Payload payload) + public SConnect(Role subj, Role obj, MsgId mid, Payload payload) //public GConnect(Role subj, Role obj) { super(subj, obj, mid, payload); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SReceive.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SReceive.java index bc86048d0..20080a350 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SReceive.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SReceive.java @@ -13,13 +13,13 @@ */ package org.scribble.core.model.global.actions; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; public class SReceive extends SAction { - public SReceive(Role subj, Role obj, MessageId mid, Payload payload) + public SReceive(Role subj, Role obj, MsgId mid, Payload payload) { super(subj, obj, mid, payload); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SRequest.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SRequest.java index 35e224a46..9291a7e69 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SRequest.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SRequest.java @@ -13,13 +13,13 @@ */ package org.scribble.core.model.global.actions; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; public class SRequest extends SAction { - public SRequest(Role subj, Role obj, MessageId mid, Payload payload) + public SRequest(Role subj, Role obj, MsgId mid, Payload payload) //public GConnect(Role subj, Role obj) { super(subj, obj, mid, payload); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SSend.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SSend.java index 6b27e17dc..0db29b36e 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SSend.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SSend.java @@ -13,13 +13,13 @@ */ package org.scribble.core.model.global.actions; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; public class SSend extends SAction { - public SSend(Role subj, Role obj, MessageId mid, Payload payload) + public SSend(Role subj, Role obj, MsgId mid, Payload payload) { super(subj, obj, mid, payload); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/kind/ScopeKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/DataKind.java similarity index 73% rename from scribble-core/src/main/java/org/scribble/core/type/kind/ScopeKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/DataKind.java index 9b6bcad7c..ef9d60230 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/kind/ScopeKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/DataKind.java @@ -13,13 +13,13 @@ */ package org.scribble.core.type.kind; -public class ScopeKind extends AbstractKind +public class DataKind extends AbstractKind implements PayElemKind, ImportKind, ModuleMemberKind { - public static final ScopeKind KIND = new ScopeKind(); + public static final DataKind KIND = new DataKind(); - protected ScopeKind() + protected DataKind() { - super("Scope"); + super("DataType"); } @Override @@ -29,16 +29,16 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof ScopeKind)) + if (!(o instanceof DataKind)) { return false; } - return ((ScopeKind) o).canEqual(this); + return ((DataKind) o).canEqual(this); } @Override public boolean canEqual(Object o) { - return o instanceof ScopeKind; + return o instanceof DataKind; } } diff --git a/scribble-core/src/main/java/org/scribble/core/type/kind/DataTypeKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/DataTypeKind.java deleted file mode 100644 index 6a56b7aac..000000000 --- a/scribble-core/src/main/java/org/scribble/core/type/kind/DataTypeKind.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.core.type.kind; - -public class DataTypeKind extends AbstractKind implements PayloadTypeKind, ImportKind, ModuleMemberKind -{ - public static final DataTypeKind KIND = new DataTypeKind(); - - protected DataTypeKind() - { - super("DataType"); - } - - @Override - public boolean equals(Object o) - { - if (o == this) - { - return true; - } - if (!(o instanceof DataTypeKind)) - { - return false; - } - return ((DataTypeKind) o).canEqual(this); - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof DataTypeKind; - } -} diff --git a/scribble-core/src/main/java/org/scribble/core/type/kind/Global.java b/scribble-core/src/main/java/org/scribble/core/type/kind/Global.java index 28199f6d3..c7c6a1d8b 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/kind/Global.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/Global.java @@ -13,7 +13,7 @@ */ package org.scribble.core.type.kind; -public class Global extends AbstractKind implements ProtocolKind +public class Global extends AbstractKind implements ProtoKind { public static final Global KIND = new Global(); diff --git a/scribble-core/src/main/java/org/scribble/core/type/kind/Local.java b/scribble-core/src/main/java/org/scribble/core/type/kind/Local.java index 4b83b783c..790c09ca6 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/kind/Local.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/Local.java @@ -13,7 +13,7 @@ */ package org.scribble.core.type.kind; -public class Local extends AbstractKind implements ProtocolKind, PayloadTypeKind +public class Local extends AbstractKind implements ProtoKind, PayElemKind { public static final Local KIND = new Local(); diff --git a/scribble-core/src/main/java/org/scribble/core/type/kind/MessageIdKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/MsgIdKind.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/core/type/kind/MessageIdKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/MsgIdKind.java index 85e65d561..9ecbff345 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/kind/MessageIdKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/MsgIdKind.java @@ -14,7 +14,7 @@ package org.scribble.core.type.kind; -public interface MessageIdKind extends Kind +public interface MsgIdKind extends Kind { } diff --git a/scribble-core/src/main/java/org/scribble/core/type/kind/NonProtocolKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/NonProtoKind.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/core/type/kind/NonProtocolKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/NonProtoKind.java index 21ad4a1ac..c40231b48 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/kind/NonProtocolKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/NonProtoKind.java @@ -14,7 +14,7 @@ package org.scribble.core.type.kind; -public interface NonProtocolKind extends Kind +public interface NonProtoKind extends Kind { } diff --git a/scribble-core/src/main/java/org/scribble/core/type/kind/NonRoleArgKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/NonRoleArgKind.java index 6219dfc66..fc9d53735 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/kind/NonRoleArgKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/NonRoleArgKind.java @@ -15,8 +15,8 @@ // Following sesstype.Arg hierarchy -// Non-role args -- includes AmbigKind (cf. AntlrNonRoleArgList) -public interface NonRoleArgKind extends NonProtocolKind +// Non-role args -- includes NonRoleParamKind, and AmbigKind +public interface NonRoleArgKind extends NonProtoKind { } diff --git a/scribble-core/src/main/java/org/scribble/core/type/kind/OpKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/OpKind.java index 222a379eb..16d8527d1 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/kind/OpKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/OpKind.java @@ -16,7 +16,7 @@ import java.io.IOException; import java.io.Serializable; -public class OpKind extends AbstractKind implements MessageIdKind, Serializable +public class OpKind extends AbstractKind implements MsgIdKind, Serializable { private static final long serialVersionUID = 1L; diff --git a/scribble-core/src/main/java/org/scribble/core/type/kind/PayloadTypeKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/PayElemKind.java similarity index 90% rename from scribble-core/src/main/java/org/scribble/core/type/kind/PayloadTypeKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/PayElemKind.java index 2a08db257..288253725 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/kind/PayloadTypeKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/PayElemKind.java @@ -15,7 +15,7 @@ // Following sesstype.Arg hierarchy -public interface PayloadTypeKind extends NonRoleParamKind //ArgKind +public interface PayElemKind extends NonRoleParamKind //ArgKind { } diff --git a/scribble-core/src/main/java/org/scribble/core/type/kind/ProtocolKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/ProtoKind.java similarity index 92% rename from scribble-core/src/main/java/org/scribble/core/type/kind/ProtocolKind.java rename to scribble-core/src/main/java/org/scribble/core/type/kind/ProtoKind.java index 0578c7d82..dded85fd5 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/kind/ProtocolKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/ProtoKind.java @@ -13,7 +13,7 @@ */ package org.scribble.core.type.kind; -public interface ProtocolKind extends ModuleMemberKind +public interface ProtoKind extends ModuleMemberKind { } diff --git a/scribble-core/src/main/java/org/scribble/core/type/kind/SigKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/SigKind.java index 2d234a986..02545144e 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/kind/SigKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/SigKind.java @@ -15,7 +15,7 @@ // Following sesstype.Arg hierarchy -public class SigKind extends AbstractKind implements NonRoleParamKind, MessageIdKind, //ArgKind +public class SigKind extends AbstractKind implements NonRoleParamKind, MsgIdKind, //ArgKind ModuleMemberKind { public static final SigKind KIND = new SigKind(); diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/AmbigName.java b/scribble-core/src/main/java/org/scribble/core/type/name/AmbigName.java index 5bc37ead3..0e41c1bda 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/AmbigName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/AmbigName.java @@ -24,9 +24,9 @@ public AmbigName(String text) super(AmbigKind.KIND, text); } - public MessageSigName toMessageSigName() + public SigName toMessageSigName() { - return new MessageSigName(getLastElement()); + return new SigName(getLastElement()); } public DataType toDataType() diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/DataType.java b/scribble-core/src/main/java/org/scribble/core/type/name/DataType.java index 8fa41c5cd..fd606b94a 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/DataType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/DataType.java @@ -13,24 +13,24 @@ */ package org.scribble.core.type.name; -import org.scribble.core.type.kind.DataTypeKind; +import org.scribble.core.type.kind.DataKind; // Potentially qualified/canonical payload type name; not the AST primitive identifier // FIXME: record "external type name" from DataTypeDecl (for API gen)? cf. OutputSockGen#addSendOpParams -public class DataType extends MemberName - implements PayloadElemType +public class DataType extends MemberName + implements PayElemType { private static final long serialVersionUID = 1L; public DataType(ModuleName modname, DataType membname) { - super(DataTypeKind.KIND, modname, membname); + super(DataKind.KIND, modname, membname); } public DataType(String simplename) { - super(DataTypeKind.KIND, simplename); + super(DataKind.KIND, simplename); } public boolean isDataType() @@ -39,9 +39,9 @@ public boolean isDataType() } @Override - public DataTypeKind getKind() + public DataKind getKind() { - return DataTypeKind.KIND; + return DataKind.KIND; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/GDelegationType.java b/scribble-core/src/main/java/org/scribble/core/type/name/GDelegType.java similarity index 81% rename from scribble-core/src/main/java/org/scribble/core/type/name/GDelegationType.java rename to scribble-core/src/main/java/org/scribble/core/type/name/GDelegType.java index 01588c41e..f63a165ba 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/GDelegationType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/GDelegType.java @@ -19,14 +19,14 @@ import org.scribble.core.type.kind.Local; // CHECKME: factor out of name package? (and then PayloadType also needs to be moved out of name?) -public class GDelegationType implements PayloadElemType, Serializable +public class GDelegType implements PayElemType, Serializable { private static final long serialVersionUID = 1L; - private GProtocolName proto; // Cannot be final, for Serializable + private GProtoName proto; // Cannot be final, for Serializable private Role role; - public GDelegationType(GProtocolName proto, Role role) + public GDelegType(GProtoName proto, Role role) { this.proto = proto; this.role = role; @@ -38,7 +38,7 @@ public boolean isGDelegationType() return true; } - public GProtocolName getGlobalProtocol() + public GProtoName getGlobalProtocol() { return this.proto; } @@ -61,17 +61,17 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof GDelegationType)) + if (!(o instanceof GDelegType)) { return false; } - GDelegationType them = (GDelegationType) o; + GDelegType them = (GDelegType) o; return them.canEqual(this) && this.proto.equals(them.proto) && this.role.equals(them.role); } public boolean canEqual(Object o) { - return o instanceof GDelegationType; + return o instanceof GDelegType; } @Override @@ -91,7 +91,7 @@ private void writeObject(java.io.ObjectOutputStream out) throws IOException private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { - this.proto = (GProtocolName) in.readObject(); + this.proto = (GProtoName) in.readObject(); this.role = (Role) in.readObject(); } } diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/GProtocolName.java b/scribble-core/src/main/java/org/scribble/core/type/name/GProtoName.java similarity index 75% rename from scribble-core/src/main/java/org/scribble/core/type/name/GProtocolName.java rename to scribble-core/src/main/java/org/scribble/core/type/name/GProtoName.java index 4c0818fb8..b34c0cf67 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/GProtocolName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/GProtoName.java @@ -16,24 +16,24 @@ import org.scribble.core.type.kind.Global; -public class GProtocolName extends ProtocolName +public class GProtoName extends ProtoName { private static final long serialVersionUID = 1L; - public GProtocolName(ModuleName modname, ProtocolName membname) + public GProtoName(ModuleName modname, ProtoName membname) { super(Global.KIND, modname, membname); } - public GProtocolName(String simpname) + public GProtoName(String simpname) { super(Global.KIND, simpname); } @Override - public GProtocolName getSimpleName() + public GProtoName getSimpleName() { - return new GProtocolName(getLastElement()); + return new GProtoName(getLastElement()); } @Override @@ -43,17 +43,17 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof GProtocolName)) + if (!(o instanceof GProtoName)) { return false; } - GProtocolName n = (GProtocolName) o; + GProtoName n = (GProtoName) o; return n.canEqual(this) && super.equals(o); } public boolean canEqual(Object o) { - return o instanceof GProtocolName; + return o instanceof GProtoName; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/LProtocolName.java b/scribble-core/src/main/java/org/scribble/core/type/name/LProtoName.java similarity index 72% rename from scribble-core/src/main/java/org/scribble/core/type/name/LProtocolName.java rename to scribble-core/src/main/java/org/scribble/core/type/name/LProtoName.java index 119da6cc2..458d50fc5 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/LProtocolName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/LProtoName.java @@ -16,17 +16,17 @@ import org.scribble.core.type.kind.Local; -public class LProtocolName extends ProtocolName - implements PayloadElemType // @Deprecated -- not used, deleg elems currently have to be (Global@Role) +public class LProtoName extends ProtoName + implements PayElemType // @Deprecated -- not used, deleg elems currently have to be (Global@Role) { private static final long serialVersionUID = 1L; - public LProtocolName(ModuleName modname, ProtocolName membname) + public LProtoName(ModuleName modname, ProtoName membname) { super(Local.KIND, modname, membname); } - public LProtocolName(String simpname) + public LProtoName(String simpname) { super(Local.KIND, simpname); } @@ -38,9 +38,9 @@ public boolean isLDelegationType() }*/ @Override - public LProtocolName getSimpleName() + public LProtoName getSimpleName() { - return new LProtocolName(getLastElement()); + return new LProtoName(getLastElement()); } @Override @@ -50,17 +50,17 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof LProtocolName)) + if (!(o instanceof LProtoName)) { return false; } - LProtocolName n = (LProtocolName) o; + LProtoName n = (LProtoName) o; return n.canEqual(this) && super.equals(o); } public boolean canEqual(Object o) { - return o instanceof LProtocolName; + return o instanceof LProtoName; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/MemberName.java b/scribble-core/src/main/java/org/scribble/core/type/name/MemberName.java index 1f6d88a23..89a19da6f 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/MemberName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/MemberName.java @@ -17,7 +17,7 @@ // Simple name or qualified name -public abstract class MemberName extends QualifiedName +public abstract class MemberName extends QualName { private static final long serialVersionUID = 1L; diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/ModuleName.java b/scribble-core/src/main/java/org/scribble/core/type/name/ModuleName.java index 61ad4f683..59f2bd487 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/ModuleName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/ModuleName.java @@ -20,7 +20,7 @@ import org.scribble.util.Constants; // General name: simple or full (a central class for value comparison) -public class ModuleName extends QualifiedName +public class ModuleName extends QualName { private static final long serialVersionUID = 1L; diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/MessageId.java b/scribble-core/src/main/java/org/scribble/core/type/name/MsgId.java similarity index 86% rename from scribble-core/src/main/java/org/scribble/core/type/name/MessageId.java rename to scribble-core/src/main/java/org/scribble/core/type/name/MsgId.java index 4bea5c45e..26944cd86 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/MessageId.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/MsgId.java @@ -13,10 +13,10 @@ */ package org.scribble.core.type.name; -import org.scribble.core.type.kind.MessageIdKind; +import org.scribble.core.type.kind.MsgIdKind; -public interface MessageId extends Name +public interface MsgId extends Name { default boolean isOp() { diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/Op.java b/scribble-core/src/main/java/org/scribble/core/type/name/Op.java index aaeb527a6..059972220 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/Op.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/Op.java @@ -15,7 +15,7 @@ import org.scribble.core.type.kind.OpKind; -public class Op extends AbstractName implements MessageId +public class Op extends AbstractName implements MsgId { private static final long serialVersionUID = 1L; diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/PackageName.java b/scribble-core/src/main/java/org/scribble/core/type/name/PackageName.java index 798b2a5bb..833f59e67 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/PackageName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/PackageName.java @@ -15,7 +15,7 @@ import org.scribble.core.type.kind.PackageKind; -public class PackageName extends QualifiedName +public class PackageName extends QualName { private static final long serialVersionUID = 1L; diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/PayloadElemType.java b/scribble-core/src/main/java/org/scribble/core/type/name/PayElemType.java similarity index 87% rename from scribble-core/src/main/java/org/scribble/core/type/name/PayloadElemType.java rename to scribble-core/src/main/java/org/scribble/core/type/name/PayElemType.java index 62d0843a7..a81073cb2 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/PayloadElemType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/PayElemType.java @@ -13,11 +13,11 @@ */ package org.scribble.core.type.name; -import org.scribble.core.type.kind.PayloadTypeKind; +import org.scribble.core.type.kind.PayElemKind; import org.scribble.core.type.session.Arg; -public interface PayloadElemType extends Arg +public interface PayElemType extends Arg { default boolean isDataType() { diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/ProtocolName.java b/scribble-core/src/main/java/org/scribble/core/type/name/ProtoName.java similarity index 74% rename from scribble-core/src/main/java/org/scribble/core/type/name/ProtocolName.java rename to scribble-core/src/main/java/org/scribble/core/type/name/ProtoName.java index 333c57a70..bab4a8151 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/ProtocolName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/ProtoName.java @@ -13,24 +13,24 @@ */ package org.scribble.core.type.name; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; // Potentially qualified/canonical protocol name; not the AST primitive identifier -public abstract class ProtocolName extends MemberName +public abstract class ProtoName extends MemberName { private static final long serialVersionUID = 1L; - public ProtocolName(K kind, ModuleName modname, ProtocolName membname) + public ProtoName(K kind, ModuleName modname, ProtoName membname) { super(kind, modname, membname); } - public ProtocolName(K kind, String simpname) + public ProtoName(K kind, String simpname) { super(kind, simpname); } @Override - public abstract ProtocolName getSimpleName(); + public abstract ProtoName getSimpleName(); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/QualifiedName.java b/scribble-core/src/main/java/org/scribble/core/type/name/QualName.java similarity index 89% rename from scribble-core/src/main/java/org/scribble/core/type/name/QualifiedName.java rename to scribble-core/src/main/java/org/scribble/core/type/name/QualName.java index 3841d15a6..e71e3fb5b 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/QualifiedName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/QualName.java @@ -16,11 +16,11 @@ import org.scribble.core.type.kind.Kind; -public abstract class QualifiedName extends AbstractName +public abstract class QualName extends AbstractName { private static final long serialVersionUID = 1L; - public QualifiedName(K kind, String... elems) + public QualName(K kind, String... elems) { super(kind, elems); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/Scope.java b/scribble-core/src/main/java/org/scribble/core/type/name/Scope.java deleted file mode 100644 index 3f7b97c7d..000000000 --- a/scribble-core/src/main/java/org/scribble/core/type/name/Scope.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.core.type.name; - -import org.scribble.core.type.kind.ScopeKind; - -// CHECKME: should be a compound name? -@Deprecated // Not currently used -public class Scope extends AbstractName -{ - private static final long serialVersionUID = 1L; - - public static final String IMPLICIT_SCOPE_PREFIX = "__scope"; - public static final Scope EMPTY_SCOPE = new Scope(); - public static final Scope ROOT_SCOPE = new Scope("__root"); - - protected Scope(String... elems) - { - super(ScopeKind.KIND, elems); - } - - public Scope(String name) - { - this(new String[] { name }); - } - - public Scope(Scope prefix, Name name) - { - this(compileScope(prefix, name)); - } - - // Also done by QualifiedName - public Scope getPrefix() - { - return new Scope(getPrefixElements()); - } - - public Scope getSimpleName() - { - return new Scope(getLastElement()); - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof Scope)) - { - return false; - } - Scope n = (Scope) o; - return n.canEqual(this) && super.equals(o); - } - - public boolean canEqual(Object o) - { - return o instanceof Scope; - } - - @Override - public int hashCode() - { - int hash = 2833; - hash = 31 * super.hashCode(); - return hash; - } - - private static String[] compileScope(Scope prefix, Name name) - { - String[] tmp = prefix.getElements(); - String[] elems = new String[tmp.length + 1]; - System.arraycopy(tmp, 0, elems, 0, tmp.length); - elems[elems.length - 1] = name.toString(); - return elems; - } -} diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/MessageSigName.java b/scribble-core/src/main/java/org/scribble/core/type/name/SigName.java similarity index 77% rename from scribble-core/src/main/java/org/scribble/core/type/name/MessageSigName.java rename to scribble-core/src/main/java/org/scribble/core/type/name/SigName.java index d7ba39ccf..3ff220de2 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/MessageSigName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/SigName.java @@ -18,16 +18,16 @@ // The name of a declared (imported) message signature member -public class MessageSigName extends MemberName implements Message, MessageId +public class SigName extends MemberName implements Message, MsgId { private static final long serialVersionUID = 1L; - public MessageSigName(ModuleName modname, MessageSigName simplename) + public SigName(ModuleName modname, SigName simplename) { super(SigKind.KIND, modname, simplename); } - public MessageSigName(String simplename) + public SigName(String simplename) { super(SigKind.KIND, simplename); } @@ -39,13 +39,13 @@ public SigKind getKind() } @Override - public MessageSigName getSimpleName() + public SigName getSimpleName() { - return new MessageSigName(getLastElement()); + return new SigName(getLastElement()); } @Override - public MessageId getId() + public MsgId getId() { return this; // FIXME: should be resolved to a canonical name } @@ -63,17 +63,17 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof MessageSigName)) + if (!(o instanceof SigName)) { return false; } - MessageSigName n = (MessageSigName) o; + SigName n = (SigName) o; return n.canEqual(this) && super.equals(o); } public boolean canEqual(Object o) { - return o instanceof MessageSigName; + return o instanceof SigName; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java index 3534e5dae..2006b9edd 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/BasicInteraction.java @@ -14,9 +14,9 @@ package org.scribble.core.type.session; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; -public abstract class BasicInteraction> +public abstract class BasicInteraction> extends STypeBase implements SType { public BasicInteraction(CommonTree source) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java index 5e16527b5..6e8956e09 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Choice.java @@ -20,13 +20,13 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.Role; import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.util.ScribException; -public abstract class Choice> +public abstract class Choice> extends STypeBase implements SType { public final Role subj; diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java index b1ebbff87..66191475a 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java @@ -14,10 +14,10 @@ package org.scribble.core.type.session; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.Role; -public abstract class ConnectAction> +public abstract class ConnectAction> extends DirectedInteraction { public ConnectAction(CommonTree source, // BaseInteractionNode not ideal diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java index 5f82d06da..ebfc1aec3 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Continue.java @@ -17,13 +17,13 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.RecVar; import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.util.ScribException; -public abstract class Continue> +public abstract class Continue> extends STypeBase { public final RecVar recvar; diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java index 0a8a2796c..ba3279f8a 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java @@ -17,14 +17,14 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.Role; import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.util.ScribException; // Besides directed-ness, also features a Message -public abstract class DirectedInteraction> +public abstract class DirectedInteraction> extends BasicInteraction { // Following ast children order diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java index 4bc2ce996..d7d44e78d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DisconnectAction.java @@ -17,14 +17,14 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.Role; import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.util.ScribException; // Base class would be "SymmetricInteraction" (cf., DirectedInteraction) -public abstract class DisconnectAction> +public abstract class DisconnectAction> extends BasicInteraction { public final Role left; diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java index 09ac91128..a8828bb29 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java @@ -21,15 +21,15 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.kind.ProtoKind; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.util.ScribException; public abstract class Do - , N extends ProtocolName> + , N extends ProtoName> extends STypeBase { public final N proto; // Currently disamb'd to fullname by GTypeTranslator (see GDoDel::translate) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Message.java b/scribble-core/src/main/java/org/scribble/core/type/session/Message.java index 8521d6b38..671bb3930 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Message.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Message.java @@ -13,16 +13,16 @@ */ package org.scribble.core.type.session; -import org.scribble.core.type.kind.MessageIdKind; +import org.scribble.core.type.kind.MsgIdKind; import org.scribble.core.type.kind.SigKind; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.MsgId; // A sig kind name: MessageSignature value (or parameter) public interface Message extends Arg { - MessageId getId(); + MsgId getId(); default boolean isMessageSig() { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/MessageTransfer.java b/scribble-core/src/main/java/org/scribble/core/type/session/MsgTransfer.java similarity index 89% rename from scribble-core/src/main/java/org/scribble/core/type/session/MessageTransfer.java rename to scribble-core/src/main/java/org/scribble/core/type/session/MsgTransfer.java index a54e8517b..a97ce6af7 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/MessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/MsgTransfer.java @@ -14,13 +14,13 @@ package org.scribble.core.type.session; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.Role; -public abstract class MessageTransfer> +public abstract class MsgTransfer> extends DirectedInteraction { - public MessageTransfer(CommonTree source, + public MsgTransfer(CommonTree source, Message msg, Role src, Role dst) { super(source, msg, src, dst); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Payload.java b/scribble-core/src/main/java/org/scribble/core/type/session/Payload.java index 48fd7aeef..95a64d84c 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Payload.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Payload.java @@ -17,17 +17,17 @@ import java.util.List; import java.util.stream.Collectors; -import org.scribble.core.type.kind.PayloadTypeKind; -import org.scribble.core.type.name.PayloadElemType; +import org.scribble.core.type.kind.PayElemKind; +import org.scribble.core.type.name.PayElemType; public class Payload { public static final Payload EMPTY_PAYLOAD = new Payload( Collections.emptyList()); - public final List> elems; + public final List> elems; - public Payload(List> elems) + public Payload(List> elems) { this.elems = Collections.unmodifiableList(elems); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java index bf6091e39..33b362ee5 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Recursion.java @@ -17,13 +17,13 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.RecVar; import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.util.ScribException; -public abstract class Recursion> +public abstract class Recursion> extends STypeBase { public final RecVar recvar; diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index 149818f66..dfc75444d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -17,7 +17,7 @@ import java.util.stream.Stream; import org.scribble.core.lang.SNode; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.visit.STypeAgg; import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.util.ScribException; @@ -28,7 +28,7 @@ // N.B. Taking G/LSeq as the B param "limits" the "cast-freeness" of this hierarchy at this point -- i.e., potential G/LSeq subclasses would be beyond that point // However, the framework is mainly intended to be extended "horizontally" w.r.t. node types (additional types), and "vertically" (subclasses) for behaviour only via Visitors // In case of "vertical" extension of node types (e.g., additional node fields), still considering extension of Seq necessary less often -public interface SType> +public interface SType> extends SNode { // N.B. visitWith should be considered a "top-level" entry point only diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java b/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java index 5248e56ba..9e2da1ef1 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/STypeBase.java @@ -14,10 +14,10 @@ package org.scribble.core.type.session; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; // SessTypeBase is to SessType as ScribNodeBase is to ScribNode -public abstract class STypeBase> +public abstract class STypeBase> implements SType { private final CommonTree source; // Currently null for "generated" terms (cf. hasSource) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java b/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java index 01a214ea6..0e4180dff 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java @@ -15,7 +15,7 @@ import java.util.Arrays; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.PackageName; @@ -34,7 +34,7 @@ public STypeFactory() // Currently used by generated Session API // From fullname - public static GProtocolName parseGlobalProtocolName(String name) + public static GProtoName parseGlobalProtocolName(String name) { String[] elems = name.split("\\."); if (elems.length < 2) @@ -48,8 +48,8 @@ public static GProtocolName parseGlobalProtocolName(String name) PackageName packname = new PackageName(Arrays.copyOfRange(elems, 0, elems.length - 2)); modname = new ModuleName(packname, modname); } - GProtocolName gpn = new GProtocolName(membname); - return new GProtocolName(modname, gpn); + GProtoName gpn = new GProtoName(membname); + return new GProtoName(modname, gpn); } /*public static Scope parseScope(String name) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java index 959743d41..2ac92bedf 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java @@ -20,9 +20,9 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; -public abstract class Seq> +public abstract class Seq> extends STypeBase { // GType or LType -- could make SType subclasses take themself as another param, but not worth it diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/MessageSig.java b/scribble-core/src/main/java/org/scribble/core/type/session/SigLit.java similarity index 86% rename from scribble-core/src/main/java/org/scribble/core/type/session/MessageSig.java rename to scribble-core/src/main/java/org/scribble/core/type/session/SigLit.java index 40abfd8f6..f3df3d404 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/MessageSig.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SigLit.java @@ -15,15 +15,15 @@ import org.scribble.core.type.kind.OpKind; import org.scribble.core.type.kind.SigKind; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Op; -public class MessageSig implements Message +public class SigLit implements Message { public final Op op; public final Payload payload; - public MessageSig(Op op, Payload payload) + public SigLit(Op op, Payload payload) { this.op = op; this.payload = payload; @@ -42,7 +42,7 @@ public SigKind getKind() } @Override - public MessageId getId() + public MsgId getId() { return this.op; } @@ -54,11 +54,11 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof MessageSig)) + if (!(o instanceof SigLit)) { return false; } - MessageSig sig = (MessageSig) o; + SigLit sig = (SigLit) o; return this.op.equals(sig.op) && this.payload.equals(sig.payload); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java index 7eea2005a..518164099 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java @@ -18,14 +18,14 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Do; -public class GDo extends Do implements GType +public class GDo extends Do implements GType { - public GDo(CommonTree source, GProtocolName proto, + public GDo(CommonTree source, GProtoName proto, List roles, List> args) { super(source, proto, roles, args); @@ -33,7 +33,7 @@ public GDo(CommonTree source, GProtocolName proto, @Override public GDo reconstruct(CommonTree source, - GProtocolName proto, List roles, + GProtoName proto, List roles, List> args) { return new GDo(source, proto, roles, args); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java index 8aa5e7758..1a7f6d07f 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java @@ -17,9 +17,9 @@ import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; -import org.scribble.core.type.session.MessageTransfer; +import org.scribble.core.type.session.MsgTransfer; -public class GMessageTransfer extends MessageTransfer +public class GMessageTransfer extends MsgTransfer implements GType { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java index d8955a596..11660d41f 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java @@ -18,14 +18,14 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Do; -public class LDo extends Do implements LType +public class LDo extends Do implements LType { - public LDo(CommonTree source, LProtocolName proto, + public LDo(CommonTree source, LProtoName proto, List roles, List> args) { super(source, proto, roles, args); @@ -33,7 +33,7 @@ public LDo(CommonTree source, LProtocolName proto, @Override public LDo reconstruct(CommonTree source, - LProtocolName proto, List roles, + LProtoName proto, List roles, List> args) { return new LDo(source, proto, roles, args); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java index e31836192..081442f59 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java @@ -17,9 +17,9 @@ import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; -import org.scribble.core.type.session.MessageTransfer; +import org.scribble.core.type.session.MsgTransfer; -public class LRcv extends MessageTransfer +public class LRcv extends MsgTransfer implements LType { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java index a51bba186..d7c8e9bcb 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java @@ -17,9 +17,9 @@ import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Message; -import org.scribble.core.type.session.MessageTransfer; +import org.scribble.core.type.session.MsgTransfer; -public class LSend extends MessageTransfer +public class LSend extends MsgTransfer implements LType { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java index 5491ac1ab..f58ea3cd9 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java @@ -15,17 +15,17 @@ import java.util.stream.Stream; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.kind.ProtoKind; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.session.DirectedInteraction; import org.scribble.core.type.session.Seq; -public class MessageIdGatherer> - extends STypeGatherer> +public class MessageIdGatherer> + extends STypeGatherer> { @Override - public Stream> visitDirectedInteraction( + public Stream> visitDirectedInteraction( DirectedInteraction n) { return Stream.of(n.msg.getId()); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java index f99c81b3c..fd817c03e 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java @@ -17,18 +17,18 @@ import java.util.List; import java.util.stream.Stream; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.DataType; -import org.scribble.core.type.name.GDelegationType; +import org.scribble.core.type.name.GDelegType; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageSigName; -import org.scribble.core.type.name.PayloadElemType; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.SigName; +import org.scribble.core.type.name.PayElemType; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.ConnectAction; import org.scribble.core.type.session.DirectedInteraction; import org.scribble.core.type.session.Do; -import org.scribble.core.type.session.MessageSig; +import org.scribble.core.type.session.SigLit; import org.scribble.core.type.session.Payload; import org.scribble.core.type.session.Seq; @@ -36,7 +36,7 @@ // Result should not contain duplicates (i.e., due to Choice/Seq) // Result does not necessarily contain root proto (protodecl is not an SType), but may do so via dependencies // N.B. delegation payloads currently gathered here, not by getProtoDependencies -- CHECKME: refactor? -public class NonProtoDepsGatherer> +public class NonProtoDepsGatherer> extends STypeGatherer> { @Override @@ -58,12 +58,12 @@ public Stream> visitDirectedInteraction(DirectedInteraction List> res = new LinkedList<>(); if (n.msg.isMessageSigName()) { - res.add((MessageSigName) n.msg); + res.add((SigName) n.msg); } else //if (this.msg.isMessageSig) { - Payload pay = ((MessageSig) n.msg).payload; - for (PayloadElemType p : pay.elems) + Payload pay = ((SigLit) n.msg).payload; + for (PayElemType p : pay.elems) { if (p.isDataType()) { @@ -75,7 +75,7 @@ else if (p.isGDelegationType()) // TODO FIXME: should be projected to local nam { throw new RuntimeException("Shouldn't get in here: " + n); } - res.add(((GDelegationType) p).getGlobalProtocol()); + res.add(((GDelegType) p).getGlobalProtocol()); } else { @@ -88,11 +88,11 @@ else if (p.isGDelegationType()) // TODO FIXME: should be projected to local nam } @Override - public > Stream> visitDo( + public > Stream> visitDo( Do n) { return n.args.stream() - .filter(x -> (x instanceof MessageSig) || (x instanceof DataType)) // CHECKME: refactor? + .filter(x -> (x instanceof SigLit) || (x instanceof DataType)) // CHECKME: refactor? .map(x -> (MemberName) x); } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java index 13a5169fd..e297794fc 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java @@ -15,32 +15,32 @@ import java.util.stream.Stream; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.kind.ProtoKind; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Do; import org.scribble.core.type.session.Seq; // Result should not contain duplicates (i.e., due to Choice/Seq) // Result does not necessarily contain root proto (protodecl is not an SType), but may do so via dependencies -public class ProtoDepsCollector> - extends STypeGatherer> +public class ProtoDepsCollector> + extends STypeGatherer> { @Override - public Stream> visitChoice(Choice n) + public Stream> visitChoice(Choice n) { return super.visitChoice(n).distinct(); } @Override - public Stream> visitSeq(Seq n) + public Stream> visitSeq(Seq n) { return super.visitSeq(n).distinct(); } @Override - public > Stream> visitDo( + public > Stream> visitDo( Do n) { return Stream.of(n.proto); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java index fa35d3da6..afeb23ffb 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java @@ -18,14 +18,14 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; // Assumes no shadowing (e.g., use after inlining recvar disamb) -public class RecPruner> +public class RecPruner> extends STypeVisitorNoThrow { @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java index 637d2ec1c..7a8fda6bf 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java @@ -15,12 +15,12 @@ import java.util.stream.Stream; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.Seq; -public class RecVarGatherer> +public class RecVarGatherer> extends STypeGatherer { @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java index 675607a3e..ebdf79c56 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java @@ -15,14 +15,14 @@ import java.util.stream.Stream; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.DirectedInteraction; import org.scribble.core.type.session.DisconnectAction; import org.scribble.core.type.session.Seq; -public class RoleGatherer> +public class RoleGatherer> extends STypeGatherer { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java index b534ebb3f..368a10657 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java @@ -17,8 +17,8 @@ import java.util.List; import java.util.stream.Stream; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.kind.ProtoKind; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.DirectedInteraction; @@ -29,7 +29,7 @@ import org.scribble.core.type.session.Seq; import org.scribble.util.ScribException; -public abstract class STypeAgg, T> +public abstract class STypeAgg, T> { // Internal use // Pre: agg(Stream.of(unit())) = unit() @@ -66,7 +66,7 @@ public T visitDisconnect(DisconnectAction n) throws ScribException return unit(n); } - public > T visitDo(Do n) + public > T visitDo(Do n) throws ScribException { return unit(n); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java index ae52110ce..214bc0420 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java @@ -15,8 +15,8 @@ import java.util.stream.Stream; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.kind.ProtoKind; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.DirectedInteraction; @@ -27,7 +27,7 @@ import org.scribble.core.type.session.Seq; // Worth it to maintain alongside STypeAgg? -- does touch a lot of places -public abstract class STypeAggNoThrow, T> +public abstract class STypeAggNoThrow, T> //extends STypeAgg // Not worth it, ex/no-ex method variants easily confused { // Internal use @@ -59,7 +59,7 @@ public T visitDisconnect(DisconnectAction n) return unit(n); } - public > T visitDo(Do n) + public > T visitDo(Do n) { return unit(n); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java index 895de659f..917d5ab6e 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java @@ -16,8 +16,8 @@ import java.util.Optional; import java.util.stream.Stream; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.kind.ProtoKind; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.DirectedInteraction; @@ -28,7 +28,7 @@ import org.scribble.core.type.session.Seq; // Refactor as special case of Agg? -public abstract class STypeGatherer, T> +public abstract class STypeGatherer, T> { // Pass this to SType.gather, e.g., n.gather(new RoleGatherer()::visit) public Stream visit(SType n) @@ -79,7 +79,7 @@ public Stream visitDisconnect(DisconnectAction n) return Stream.of(); } - public > Stream visitDo(Do n) + public > Stream visitDo(Do n) { return Stream.of(); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java index 39b9e0724..ac5cde88e 100755 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java @@ -23,14 +23,14 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.job.Job; import org.scribble.core.lang.SubprotoSig; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; -public abstract class STypeInliner> +public abstract class STypeInliner> extends STypeVisitorNoThrow { public final Job job; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java index 40c066648..42e459ebf 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java @@ -18,8 +18,8 @@ import java.util.List; import java.util.Map; -import org.scribble.core.type.kind.ProtocolKind; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.kind.ProtoKind; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Do; import org.scribble.core.type.session.Recursion; @@ -27,13 +27,13 @@ import org.scribble.core.type.session.Seq; // Not supported for Do -public abstract class STypeUnfolder> +public abstract class STypeUnfolder> extends STypeVisitorNoThrow { private final Map> recs = new HashMap<>(); @Override - public final > SType visitDo(Do n) + public final > SType visitDo(Do n) { throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java index 7e6ce5682..467177d44 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java @@ -17,7 +17,7 @@ import java.util.List; import java.util.stream.Stream; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; @@ -29,7 +29,7 @@ // T = SType, unit = empty, agg = reconstruct, ns = "structural" (i.e, B) children -- issues with generic cast to B inside agg // T = SType, unit = n.getChildren(), agg = reconstruct, ns = all children -- all children require dynamic casts // T = B ... ? Considering Stream like a Seq, and elems as singleton Seqs -- cf. Stream, for Choice/etc reconstruct -public abstract class STypeVisitor> +public abstract class STypeVisitor> extends STypeAgg> // T = SType gives reconstruction flexibility/extensibility { @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java index b5c143538..b7ec0c034 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java @@ -17,14 +17,14 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; // For comments, see STypeVisitor -public abstract class STypeVisitorNoThrow> +public abstract class STypeVisitorNoThrow> extends STypeAggNoThrow> { @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java index 7b86a0938..7086b1efa 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java @@ -18,11 +18,11 @@ import java.util.stream.Collectors; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.kind.ProtocolKind; +import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.DataType; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MessageSigName; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.SigName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; import org.scribble.core.type.session.Arg; @@ -34,7 +34,7 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; -public class Substitutor> +public class Substitutor> extends STypeVisitorNoThrow { private Substitutions subs; @@ -78,7 +78,7 @@ public SType visitDisconnect(DisconnectAction n) } @Override - public > SType visitDo(Do n) + public > SType visitDo(Do n) { List roles = n.roles.stream().map(x -> this.subs.subsRole(x)) .collect(Collectors.toList()); @@ -91,9 +91,9 @@ public > SType visitDo(Do n) { a = this.subs.subsArg((DataType) a); } - else if (a instanceof MessageSigName) + else if (a instanceof SigName) { - a = this.subs.subsArg((MessageSigName) a); + a = this.subs.subsArg((SigName) a); } } args.add(a); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java index bda574cc4..8a7ba136f 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java @@ -24,7 +24,7 @@ import java.util.stream.Stream; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.DirectedInteraction; @@ -99,7 +99,7 @@ public SType visitDirectedInteraction( } @Override - public final > SType visitDo( + public final > SType visitDo( Do n) throws ScribException { throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java index ec354abfe..4d247926d 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java @@ -17,8 +17,8 @@ import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Do; import org.scribble.core.type.session.global.GContinue; @@ -36,9 +36,9 @@ public GTypeInliner(Job job) } @Override - public > GType visitDo(Do n) + public > GType visitDo(Do n) { - GProtocolName fullname = (GProtocolName) n.proto; + GProtoName fullname = (GProtoName) n.proto; SubprotoSig sig = new SubprotoSig(fullname, n.roles, n.args); RecVar rv = getInlinedRecVar(sig); if (hasSig(sig)) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index 6d240edb2..bc39e88bf 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -21,10 +21,10 @@ import org.scribble.core.job.Job; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.LProtocolName; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.ModuleName; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; @@ -128,7 +128,7 @@ public LType visitDisconnect(DisconnectAction n) } @Override - public > LType visitDo(Do n) + public > LType visitDo(Do n) { throw new RuntimeException("Unsupported for Do: " + n); } @@ -162,25 +162,25 @@ public LSeq visitSeq(GSeq n) // So a projection never contains an empty LSeq -- i.e., "empty choice/rec" pruning unnecessary } - public static LProtocolName getSimpledProjectionName(GProtocolName simpname, + public static LProtoName getSimpledProjectionName(GProtoName simpname, Role role) { - return new LProtocolName(simpname.toString() + "_" + role.toString()); + return new LProtoName(simpname.toString() + "_" + role.toString()); } // Role is the target subprotocol parameter (not the current projector self -- actually the self just popped) -- ? - public static LProtocolName getFullProjectionName(GProtocolName fullname, + public static LProtoName getFullProjectionName(GProtoName fullname, Role role) { - LProtocolName simplename = InlinedProjector.getSimpledProjectionName( + LProtoName simplename = InlinedProjector.getSimpledProjectionName( fullname.getSimpleName(), role); ModuleName modname = getProjectionModuleName(fullname.getPrefix(), simplename); - return new LProtocolName(modname, simplename); + return new LProtoName(modname, simplename); } // fullname is the un-projected name; localname is the already projected simple name public static ModuleName getProjectionModuleName(ModuleName fullname, - LProtocolName localname) + LProtoName localname) { ModuleName simpname = new ModuleName( fullname.getSimpleName().toString() + "_" + localname.toString()); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java index a5e51f872..f02c0e480 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java @@ -21,9 +21,9 @@ import org.scribble.core.job.JobContext; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.GProtocolName; -import org.scribble.core.type.name.LProtocolName; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.LProtoName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.Substitutions; import org.scribble.core.type.session.Do; @@ -41,7 +41,7 @@ public Projector(Job job, Role self) } @Override - public > LType visitDo(Do n) + public > LType visitDo(Do n) { if (!n.roles.contains(this.self)) { @@ -49,7 +49,7 @@ public > LType visitDo(Do n) } JobContext jobc = this.job.getContext(); - GProtocolName proto = (GProtocolName) n.proto; + GProtoName proto = (GProtoName) n.proto; GProtocol gpd = jobc.getIntermediate(proto); Role targSelf = gpd.roles.get(n.roles.indexOf(this.self)); @@ -59,7 +59,7 @@ public > LType visitDo(Do n) return LSkip.SKIP; } - LProtocolName fullname = InlinedProjector.getFullProjectionName(proto, + LProtoName fullname = InlinedProjector.getFullProjectionName(proto, targSelf); Substitutions subs = new Substitutions(imed.roles, n.roles, Collections.emptyList(), Collections.emptyList()); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java index 54975dfb0..0083a6ac9 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java @@ -22,7 +22,7 @@ import java.util.stream.Stream; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.DirectedInteraction; @@ -90,7 +90,7 @@ public SType visitDirectedInteraction( } @Override - public final > SType visitDo( + public final > SType visitDo( Do n) throws ScribException { throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 33ffa2f01..3fa62400f 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -24,15 +24,15 @@ import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.MessageId; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.MsgId; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.DirectedInteraction; import org.scribble.core.type.session.DisconnectAction; import org.scribble.core.type.session.Do; -import org.scribble.core.type.session.MessageSig; +import org.scribble.core.type.session.SigLit; import org.scribble.core.type.session.Payload; import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; @@ -176,9 +176,9 @@ public SType visitDirectedInteraction(DirectedInteraction mid = n.msg.getId(); + MsgId mid = n.msg.getId(); Payload payload = n.msg.isMessageSig() // CHECKME: generalise? (e.g., hasPayload) - ? ((MessageSig) n.msg).payload + ? ((SigLit) n.msg).payload : Payload.EMPTY_PAYLOAD; // TODO: add toAction method to base Interaction EAction a = (n instanceof LSend) ? this.util.ef.newESend(peer, mid, payload) @@ -200,7 +200,7 @@ public SType visitDisconnect(DisconnectAction n) } @Override - public final > SType visitDo(Do n) + public final > SType visitDo(Do n) { throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java index 8941f5c40..d5bbca53f 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java @@ -17,8 +17,8 @@ import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.local.LProtocol; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.LProtocolName; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.LProtoName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Do; import org.scribble.core.type.session.local.LContinue; @@ -36,9 +36,9 @@ public LTypeInliner(Job job) } @Override - public > LType visitDo(Do n) + public > LType visitDo(Do n) { - LProtocolName fullname = (LProtocolName) n.proto; + LProtoName fullname = (LProtoName) n.proto; SubprotoSig sig = new SubprotoSig(fullname, n.roles, n.args); RecVar rv = getInlinedRecVar(sig); if (hasSig(sig)) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java index fbe310bfc..143f6a749 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java @@ -22,7 +22,7 @@ import java.util.stream.Collectors; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Continue; @@ -74,7 +74,7 @@ public SType visitContinue(Continue n) throws ScribExc } @Override - public final > SType visitDo( + public final > SType visitDo( Do n) throws ScribException { throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java index d55ed1aa4..3714c4ba9 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java @@ -19,7 +19,7 @@ import java.util.stream.Stream; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.ProtocolName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.Do; @@ -59,7 +59,7 @@ public Boolean visitContinue(Continue n) } @Override - public > Boolean visitDo(Do n) + public > Boolean visitDo(Do n) { //return (Boolean) InlinedVisitor1.super.visitDo(n); //return (Boolean) super.visitDo(n); // CHECKME: resolves to the extends super, even with a default i/f implementation ? diff --git a/scribble-core/src/main/java/org/scribble/util/MessageIdMap.java b/scribble-core/src/main/java/org/scribble/util/MessageIdMap.java index 58775ad3f..6f8e95dc6 100644 --- a/scribble-core/src/main/java/org/scribble/util/MessageIdMap.java +++ b/scribble-core/src/main/java/org/scribble/util/MessageIdMap.java @@ -19,14 +19,14 @@ import java.util.Map; import java.util.Set; -import org.scribble.core.type.name.MessageId; +import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; // Mutable public class MessageIdMap { // dest -> (src -> mids) - private Map>>> map = new HashMap<>(); + private Map>>> map = new HashMap<>(); public MessageIdMap() { @@ -55,7 +55,7 @@ public MessageIdMap(MessageIdMap map) } }*/ - public void putMessage(Role dest, Role src, MessageId msg) + public void putMessage(Role dest, Role src, MsgId msg) { addRolePair(dest, src); this.map.get(dest).get(src).add(msg); @@ -75,7 +75,7 @@ public void putMessage(Role dest, Role src, MessageId msg) } }*/ - public void putMessages(Role dest, Role src, Set> msgs) + public void putMessages(Role dest, Role src, Set> msgs) { addRolePair(dest, src); this.map.get(dest).get(src).addAll(msgs); @@ -108,14 +108,14 @@ public Set getSources(Role dest) return srcs; }*/ - public Set> getMessages(Role dest, Role src) + public Set> getMessages(Role dest, Role src) { return this.map.get(dest).get(src); } - public Set> getMessages(Role dest) + public Set> getMessages(Role dest) { - Set> tmp = new HashSet<>(); + Set> tmp = new HashSet<>(); getSources(dest).forEach((src) -> tmp.addAll(getMessages(dest, src))); return tmp; } @@ -139,7 +139,7 @@ private void addRolePair(Role dest, Role src) { if (!this.map.containsKey(dest)) { - Map>> map = new HashMap<>(); + Map>> map = new HashMap<>(); this.map.put(dest, map); map.put(src, new HashSet<>()); } diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java index 3fe6c3e69..27b395cd6 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java @@ -75,7 +75,7 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.kind.PayloadTypeKind; +import org.scribble.core.type.kind.PayElemKind; import org.scribble.del.DefaultDel; import org.scribble.del.ImportModuleDel; import org.scribble.del.ModuleDel; @@ -484,7 +484,7 @@ public PayElemList PayElemList(List> elems) } @Override - public UnaryPayElem UnaryPayElem( + public UnaryPayElem UnaryPayElem( PayElemNameNode name) { CommonToken t = newToken(ScribbleParser.UNARY_PAYELEM); diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java index 260f359cc..d1c655e71 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java @@ -19,7 +19,7 @@ import java.util.Map; import java.util.Random; -import org.scribble.core.type.name.GProtocolName; +import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.Role; import org.scribble.main.ScribbleRuntimeException; import org.scribble.util.ScribException; @@ -32,12 +32,12 @@ public abstract class Session public final List impath; public final String modpath; - public final GProtocolName proto; + public final GProtoName proto; //private final Map> endpoints = new HashMap<>(); // Only for local endpoints private final Map> endpoints = new HashMap<>(); // Only for local endpoints - public Session(int id, List impath, String modpath, GProtocolName proto) + public Session(int id, List impath, String modpath, GProtoName proto) { this.id = id; this.impath = impath; @@ -47,7 +47,7 @@ public Session(int id, List impath, String modpath, GProtocolName proto) Session.sessions.put(id, this); } - public Session(List importPath, String source, GProtocolName proto) + public Session(List importPath, String source, GProtoName proto) { this(getFreshId(), importPath, source, proto); } From ef06e1cc6b3179b6d3cab91d08ed205f0cb18177 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 18:01:07 +0100 Subject: [PATCH 282/539] Continued: cleaning up ast class names. --- .../main/java/org/scribble/ast/DataDecl.java | 8 ++++---- .../java/org/scribble/ast/DataParamDecl.java | 6 +++--- .../src/main/java/org/scribble/ast/Module.java | 4 ++-- .../main/java/org/scribble/ast/MsgNode.java | 4 ++-- .../java/org/scribble/ast/NonRoleArgList.java | 6 +++--- .../ast/name/qualified/DataNameNode.java | 10 +++++----- .../ast/name/simple/AmbigNameNode.java | 4 ++-- .../ast/name/simple/DataParamNode.java | 10 +++++----- .../org/scribble/ast/name/simple/IdNode.java | 2 +- .../org/scribble/del/global/GConnectDel.java | 4 ++-- .../del/global/GMessageTransferDel.java | 4 ++-- .../del/name/qualified/DataTypeNodeDel.java | 6 +++--- .../del/name/simple/AmbigNameNodeDel.java | 4 ++-- .../lang/context/ModuleContextCollector.java | 8 ++++---- .../callbackapi/CBEndpointApiGenerator.java | 8 ++++---- .../callbackapi/CBEndpointApiGenerator3.java | 10 +++++----- .../java/statechanapi/BranchSockGen.java | 6 +++--- .../codegen/java/statechanapi/CaseSockGen.java | 6 +++--- .../java/statechanapi/InputFutureGen.java | 6 +++--- .../java/statechanapi/OutputSockGen.java | 6 +++--- .../java/statechanapi/ReceiveSockGen.java | 8 ++++---- .../java/org/scribble/core/lang/Protocol.java | 4 ++-- .../core/lang/context/ModuleContext.java | 8 ++++---- .../scribble/core/lang/context/ScribNames.java | 6 +++--- .../scribble/core/lang/global/GProtocol.java | 6 +++--- .../scribble/core/lang/local/LProtocol.java | 6 +++--- .../java/org/scribble/core/model/MAction.java | 2 +- .../core/model/endpoint/AutGraphParser.java | 10 +++++----- .../org/scribble/core/type/kind/IdKind.java | 3 ++- .../org/scribble/core/type/name/AmbigName.java | 6 +++--- .../type/name/{DataType.java => DataName.java} | 18 +++++++++--------- .../org/scribble/core/type/name/MsgId.java | 2 +- .../scribble/core/type/name/PayElemType.java | 2 +- .../org/scribble/core/type/name/QualName.java | 1 + .../org/scribble/core/type/name/SigName.java | 6 +++--- .../core/type/session/ConnectAction.java | 2 +- .../core/type/session/DirectedInteraction.java | 6 +++--- .../type/session/{Message.java => Msg.java} | 6 +++--- .../core/type/session/MsgTransfer.java | 2 +- .../org/scribble/core/type/session/SigLit.java | 4 ++-- .../core/type/session/global/GConnect.java | 6 +++--- .../type/session/global/GMessageTransfer.java | 6 +++--- .../scribble/core/type/session/local/LAcc.java | 6 +++--- .../scribble/core/type/session/local/LRcv.java | 6 +++--- .../scribble/core/type/session/local/LReq.java | 6 +++--- .../core/type/session/local/LSend.java | 6 +++--- .../core/visit/NonProtoDepsGatherer.java | 10 +++++----- .../org/scribble/core/visit/Substitutor.java | 12 ++++++------ .../core/visit/local/EGraphBuilder.java | 2 +- 49 files changed, 146 insertions(+), 144 deletions(-) rename scribble-core/src/main/java/org/scribble/core/type/name/{DataType.java => DataName.java} (81%) rename scribble-core/src/main/java/org/scribble/core/type/session/{Message.java => Msg.java} (88%) diff --git a/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java b/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java index 0503cf6df..1408bcaaf 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.core.type.kind.DataKind; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.ModuleName; import org.scribble.util.Constants; @@ -55,16 +55,16 @@ public boolean isDataTypeDecl() // Simple name (ModuleDecl is the only NameDeclNode that uses qualified names) @Override - public DataType getDeclName() + public DataName getDeclName() { return getNameNodeChild().toName(); } @Override - public DataType getFullMemberName(Module mod) + public DataName getFullMemberName(Module mod) { ModuleName fullmodname = mod.getFullModuleName(); - return new DataType(fullmodname, getDeclName()); + return new DataName(fullmodname, getDeclName()); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java index c2db0dba8..48298bc40 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.simple.DataParamNode; import org.scribble.core.type.kind.DataKind; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.util.Constants; public class DataParamDecl extends NonRoleParamDecl @@ -47,9 +47,9 @@ public DataParamDecl dupNode() @Override //public Name getDeclName() - public DataType getDeclName() + public DataName getDeclName() { - return (DataType) getNameNodeChild().toName(); + return (DataName) getNameNodeChild().toName(); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/Module.java b/scribble-ast/src/main/java/org/scribble/ast/Module.java index 3e1d50315..fd7e174f8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Module.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Module.java @@ -24,7 +24,7 @@ import org.scribble.ast.global.GProtoDecl; import org.scribble.core.type.kind.Kind; import org.scribble.core.type.kind.ProtoKind; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.ModuleName; @@ -125,7 +125,7 @@ public Module visitChildren(AstVisitor nv) throws ScribException return reconstruct(moddecl, imports, data, protos); } - public DataDecl getDataTypeDeclChild(DataType simpname) // Simple name (as for getProtocolDecl) + public DataDecl getDataTypeDeclChild(DataName simpname) // Simple name (as for getProtocolDecl) { Optional res = getNonProtoDeclChildren().stream() .filter(x -> (x instanceof DataDecl) diff --git a/scribble-ast/src/main/java/org/scribble/ast/MsgNode.java b/scribble-ast/src/main/java/org/scribble/ast/MsgNode.java index 5279f0398..d900ff7a7 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/MsgNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/MsgNode.java @@ -13,12 +13,12 @@ */ package org.scribble.ast; -import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.Msg; // A sig kind node: MessageSignatureNode, MessageSignatureNameNode or NonRoleParamNode public interface MsgNode extends NonRoleArgNode { - Message toMessage(); + Msg toMessage(); //Arg toArg(); // Not possible due to "diamond" with PayloadElemNameNode at AmbigNameNode } diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java index 69d663eda..d80614e21 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java @@ -20,7 +20,7 @@ import org.antlr.runtime.Token; import org.scribble.core.type.kind.NonRoleArgKind; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.SigName; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.SigLit; @@ -76,9 +76,9 @@ public List> getParamKindArgs() { cast.add((SigLit) a); } - else if (a instanceof DataType) + else if (a instanceof DataName) { - cast.add((DataType) a); + cast.add((DataName) a); } else if (a instanceof SigName) { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java index 71f666cd8..553fa2e60 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.PayElemNameNode; import org.scribble.core.type.kind.DataKind; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.session.Arg; //public class DataTypeNode extends MemberNameNode implements PayloadElemNameNode @@ -42,11 +42,11 @@ public DataNameNode dupNode() } @Override - public DataType toName() + public DataName toName() { - DataType membname = new DataType(getLastElement()); + DataName membname = new DataName(getLastElement()); return isPrefixed() - ? new DataType(getModuleNamePrefix(), membname) + ? new DataName(getModuleNamePrefix(), membname) : membname; } @@ -63,7 +63,7 @@ public Arg toArg() } @Override - public DataType toPayloadType() + public DataName toPayloadType() { return toName(); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index a81c2105d..e7f1099c0 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -22,7 +22,7 @@ import org.scribble.core.type.name.AmbigName; import org.scribble.core.type.name.PayElemType; import org.scribble.core.type.session.Arg; -import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.Msg; // Primitive payload type, MessageSigName or parameter names only: if name is parsed as a CompoundNameNodes, it must be a payload type (not ambiguous in this case) public class AmbigNameNode extends SimpleNameNode @@ -55,7 +55,7 @@ public Arg toArg() } @Override - public Message toMessage() + public Msg toMessage() { throw new RuntimeException( "Ambiguous name node not disambiguated: " + this); diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java index 061e8249c..b02d98266 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.PayElemNameNode; import org.scribble.core.type.kind.DataKind; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; public class DataParamNode extends NonRoleParamNode implements PayElemNameNode // As a payload, can only be a DataType (so hardcode) @@ -41,20 +41,20 @@ public DataParamNode dupNode() } @Override - public DataType toName() + public DataName toName() { - return new DataType(getText()); + return new DataName(getText()); } @Override - public DataType toArg() + public DataName toArg() { // As a payload kind, currently hardcorded to data type kinds (protocol payloads not supported) return toPayloadType(); } @Override - public DataType toPayloadType() // Currently can assume the only possible kind for NonRoleParamNode is DataTypeKind + public DataName toPayloadType() // Currently can assume the only possible kind for NonRoleParamNode is DataTypeKind { return toName(); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java index 9c60191f4..cf59a1b8d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java @@ -17,7 +17,7 @@ import org.scribble.core.type.kind.IdKind; import org.scribble.core.type.name.Id; -// N.B. no del attached, so not currently visited +// Kind can be disregarded, the "true" kind (for qualified names) recorded by the parent public class IdNode extends SimpleNameNode { // ScribTreeAdaptor#create constructor diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java index e8a983db5..716e86a00 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java @@ -19,7 +19,7 @@ import org.scribble.ast.global.GConnect; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.Msg; import org.scribble.del.ConnectionActionDel; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; @@ -53,7 +53,7 @@ public org.scribble.core.type.session.global.GConnect translate(ScribNode n, throw new RuntimeException("TODO: multiple destination roles: " + source); } Role dst = ds.get(0).toName(); - Message msg = source.getMessageNodeChild().toMessage(); + Msg msg = source.getMessageNodeChild().toMessage(); return new org.scribble.core.type.session.global.GConnect(source, src, msg, dst); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java index 63f140ae6..46445def2 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -19,7 +19,7 @@ import org.scribble.ast.global.GMsgTransfer; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.Msg; import org.scribble.del.MessageTransferDel; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; @@ -61,7 +61,7 @@ public org.scribble.core.type.session.global.GMessageTransfer translate(ScribNod throw new RuntimeException("[TODO] multiple destination roles: " + source); } Role dst = ds.get(0).toName(); - Message msg = source.getMessageNodeChild().toMessage(); + Msg msg = source.getMessageNodeChild().toMessage(); return new org.scribble.core.type.session.global.GMessageTransfer(source, src, msg, dst); } diff --git a/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java index 43e85c5d3..70935aae9 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java @@ -19,7 +19,7 @@ import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.core.lang.context.ModuleContext; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.del.ScribDelBase; import org.scribble.util.ScribException; import org.scribble.visit.NameDisambiguator; @@ -43,13 +43,13 @@ public ScribNode leaveDisambiguation(ScribNode child, } ModuleContext mc = disamb.getModuleContext(); DataNameNode dtn = (DataNameNode) visited; - DataType dt = dtn.toName(); + DataName dt = dtn.toName(); if (!mc.isVisibleDataType(dt)) { throw new ScribException(dtn.getSource(), "Data type not visible: " + dt); } - DataType fullname = mc.getVisibleDataTypeFullName(dt); + DataName fullname = mc.getVisibleDataTypeFullName(dt); /*return (DataTypeNode) disamb.job.config.af.QualifiedNameNode( dtn.getSource(), DataTypeKind.KIND, fullname.getElements());*/ DataNameNode res = new DataNameNode(dtn.token); diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java index 4a1c08d21..41dcfcfb8 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java @@ -51,7 +51,7 @@ public ScribNode leaveDisambiguation(ScribNode child, AmbigName name = ann.toName(); // By well-formedness (checked later), payload type and parameter names are distinct // FIXME: are conflicts checked elsewhere? - if (mcontext.isDataTypeVisible(name.toDataType())) + if (mcontext.isDataTypeVisible(name.toDataName())) { if (parent instanceof MessageTransfer) // FIXME HACK: MessageTransfer assumes MessageNode (cast in visitChildren), so this needs to be caught here // FIXME: other similar cases? { @@ -73,7 +73,7 @@ public ScribNode leaveDisambiguation(ScribNode child, return res; } - else if (mcontext.isMessageSigNameVisible(name.toMessageSigName())) + else if (mcontext.isMessageSigNameVisible(name.toSigName())) { if (parent instanceof PayElem) // FIXME HACK { diff --git a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java index 8efcd0bb5..5276517dd 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java +++ b/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java @@ -24,7 +24,7 @@ import org.scribble.ast.global.GProtoDecl; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.lang.context.ScribNames; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.ModuleName; @@ -91,7 +91,7 @@ private static void addModule(ScribNames names, Module mod, if (npd.isDataTypeDecl()) { DataDecl dtd = (DataDecl) npd; - DataType qualif = new DataType(modname, dtd.getDeclName()); + DataName qualif = new DataName(modname, dtd.getDeclName()); names.data.put(qualif, dtd.getFullMemberName(mod)); } else //if (npd.isMessageSigNameDecl()) @@ -174,8 +174,8 @@ private void addVisible(Map parsed, Module root) if (npd.isDataTypeDecl()) { DataDecl dtd = (DataDecl) npd; - DataType visname = new DataType(dtd.getDeclName().toString()); - DataType fullname = dtd.getFullMemberName(root); + DataName visname = new DataName(dtd.getDeclName().toString()); + DataName fullname = dtd.getFullMemberName(root); this.visible.data.put(fullname, fullname); this.visible.data.put(visname, fullname); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 297e6918a..010174907 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -33,7 +33,7 @@ import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.EStateKind; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.PayElemType; import org.scribble.core.type.name.Role; @@ -300,7 +300,7 @@ public Map buildEndpointClass() throws ScribException int i = 1; for (PayElemType pet : a.payload.elems) { - DataDecl dtd = main.getDataTypeDeclChild((DataType) pet); + DataDecl dtd = main.getDataTypeDeclChild((DataName) pet); messageClass += ", " + dtd.getExtName() + " arg" + i++; } } @@ -444,7 +444,7 @@ public Map buildEndpointClass() throws ScribException int i = 1; for (PayElemType pet : a.payload.elems) { - DataDecl dtd = main.getDataTypeDeclChild((DataType) pet); + DataDecl dtd = main.getDataTypeDeclChild((DataName) pet); receiveInterface += ", " + dtd.getExtName() + " arg" + i++; } @@ -481,7 +481,7 @@ public Map buildEndpointClass() throws ScribException int i = 0; for (PayElemType pet : a.payload.elems) { - DataDecl dtd = main.getDataTypeDeclChild((DataType) pet); + DataDecl dtd = main.getDataTypeDeclChild((DataName) pet); branchAbstract += ", (" + dtd.getExtName() + ") m.payload[" + i++ + "]"; } branchAbstract += "); break;\n"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 6015bd129..27041f65b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -39,7 +39,7 @@ import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.EStateKind; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.PayElemType; @@ -610,7 +610,7 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, else { opCons = opClass.newConstructor(a.payload.elems.stream().map(e -> - main.getDataTypeDeclChild((DataType) e).getExtName() + " arg" + i[0]++ + main.getDataTypeDeclChild((DataName) e).getExtName() + " arg" + i[0]++ ).collect(Collectors.joining(", "))); } opCons.addModifiers("public"); @@ -718,7 +718,7 @@ protected String generateBranch(String bprefix, LangContext jc, EState s, String int i = 0; for (PayElemType pet : a.payload.elems) { - DataDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); + DataDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataName) pet); branchAbstract += ", (" + dtd.getExtName() + ") m.payload[" + i++ + "]"; } branchAbstract += "); break;\n"; @@ -756,7 +756,7 @@ protected String generateReceiveInterface(boolean isSig, int i = 1; for (PayElemType pet : a.payload.elems) { - DataDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataType) pet); + DataDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataName) pet); receiveInterface += ", " + dtd.getExtName() + " arg" + i++; } } @@ -1009,7 +1009,7 @@ protected SigDecl getMessageSigNameDecl(SigName mid) //protected final Function, String> getExtName = e -> protected String getExtName(PayElemType e) { - String extName = this.lang.getContext().getMainModule().getDataTypeDeclChild((DataType) e).getExtName(); + String extName = this.lang.getContext().getMainModule().getDataTypeDeclChild((DataName) e).getExtName(); return (extName.indexOf(".") != -1) ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) : extName; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java index 4df2aea12..66a1f732a 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java @@ -29,7 +29,7 @@ import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.PayElemType; import org.scribble.core.type.name.Role; @@ -293,7 +293,7 @@ private void addHandleMethod(final String ROLE_PARAM, final String MESSAGE_VAR, int i = 0; for (PayElemType pt : a.payload.elems) { - DataDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType + DataDecl dtd = main.getDataTypeDeclChild((DataName) pt); // TODO: if not DataType ln += ", " + buffSuper + "(" + dtd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + i++ + "])"; } } @@ -380,7 +380,7 @@ private void addCallbackCases(MethodBuilder mb2, final String ROLE_PARAM, int i = 0; for (PayElemType pt : a.payload.elems) { - DataDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType + DataDecl dtd = main.getDataTypeDeclChild((DataName) pt); // TODO: if not DataType ln += ", " + buffSuper + "(" + dtd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + i++ + "])"; } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java index 21bded80a..6a087264d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java @@ -26,7 +26,7 @@ import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.Role; import org.scribble.util.ScribException; @@ -97,7 +97,7 @@ protected void addMethods() throws ScribException EState succ = this.curr.getSuccessor(a); addReceiveMethod(this.cb, a, succ); addCaseReceiveMethod(this.cb, a, succ); - if (!a.payload.isEmpty() || a.mid.isMessageSigName()) + if (!a.payload.isEmpty() || a.mid.isSigName()) { addCaseReceiveDiscardMethod(this.cb, a, succ); } @@ -193,7 +193,7 @@ private void addCaseReceiveDiscardMethod(ClassBuilder cb, EAction a, EState succ if (a.mid.isOp()) { ln += a.payload.elems.stream() - .map((pt) -> getGarbageBuf(main.getDataTypeDeclChild(((DataType) pt)).getExtName())).collect(Collectors.joining(", ")) + ");"; + .map((pt) -> getGarbageBuf(main.getDataTypeDeclChild(((DataName) pt)).getExtName())).collect(Collectors.joining(", ")) + ");"; } else { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java index 2aabbcdca..27f56937c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java @@ -27,7 +27,7 @@ import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.PayElemType; @@ -76,11 +76,11 @@ public ClassBuilder generateType() throws ScribException int i = 1; for (PayElemType pt : a.payload.elems) { - if (!pt.isDataType()) + if (!pt.isDataName()) { throw new ScribException("[TODO] API generation not supported for non- data type payloads: " + pt); } - DataDecl dtd = main.getDataTypeDeclChild((DataType) pt); + DataDecl dtd = main.getDataTypeDeclChild((DataName) pt); ScribSockGen.checkJavaDataTypeDecl(dtd); String type = dtd.getExtName(); types.add(type); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java index d14d3184c..f7854d9a5 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java @@ -26,7 +26,7 @@ import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.PayElemType; import org.scribble.util.ScribException; @@ -218,11 +218,11 @@ protected static void addSendOpParams(StateChannelApiGenerator apigen, MethodBui Iterator as = args.iterator(); for (PayElemType pt : a.payload.elems) { - if (!pt.isDataType()) + if (!pt.isDataName()) { throw new ScribException("[TODO] API generation not supported for non- data type payloads: " + pt); } - DataDecl dtd = main.getDataTypeDeclChild((DataType) pt); // FIXME: might not belong to main module // TODO: if not DataType + DataDecl dtd = main.getDataTypeDeclChild((DataName) pt); // FIXME: might not belong to main module // TODO: if not DataType ScribSockGen.checkJavaDataTypeDecl(dtd); mb.addParameters(dtd.getExtName() + " " + as.next()); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java index 5409a1a79..0018bcf86 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java @@ -22,7 +22,7 @@ import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.PayElemType; import org.scribble.util.ScribException; @@ -182,11 +182,11 @@ protected static void addReceiveOpParams(MethodBuilder mb, Module main, EAction int i = 1; for (PayElemType pt : a.payload.elems) { - if (!pt.isDataType()) + if (!pt.isDataName()) { throw new ScribException("[TODO] API generation not supported for non- data type payloads: " + pt); } - DataDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType + DataDecl dtd = main.getDataTypeDeclChild((DataName) pt); // TODO: if not DataType ScribSockGen.checkJavaDataTypeDecl(dtd); mb.addParameters(buffSuper + dtd.getExtName() + "> " + RECEIVE_ARG_PREFIX + i++); } @@ -200,7 +200,7 @@ protected static void addPayloadBuffSetters(Module main, EAction a, MethodBuilde int i = 1; for (PayElemType pt : a.payload.elems) // Could factor out this loop (arg names) with addReceiveOpParams (as for send) { - DataDecl dtd = main.getDataTypeDeclChild((DataType) pt); // TODO: if not DataType + DataDecl dtd = main.getDataTypeDeclChild((DataName) pt); // TODO: if not DataType mb.addBodyLine(RECEIVE_ARG_PREFIX + i + "." + BUFF_VAL_FIELD + " = (" + dtd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + (i++ - 1) +"];"); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java index d092e511f..a53bc8521 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java @@ -20,7 +20,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.ProtoKind; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.ProtoName; @@ -107,7 +107,7 @@ protected String paramsToString() .map(x -> { String k; - if (x instanceof DataType) // CHECKME: refactor? + if (x instanceof DataName) // CHECKME: refactor? { k = Constants.TYPE_KW; } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java b/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java index 879806bb7..7aa3db298 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/context/ModuleContext.java @@ -19,7 +19,7 @@ import org.scribble.core.type.kind.Kind; import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.kind.SigKind; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.SigName; @@ -72,7 +72,7 @@ public ProtoName checkProtocolDeclDependencyFullName( return getProtocolDeclFullName(this.deps, proto); } - public boolean isDataTypeVisible(DataType typename) + public boolean isDataTypeVisible(DataName typename) { return this.visible.data.keySet().contains(typename); } @@ -82,12 +82,12 @@ public boolean isMessageSigNameVisible(Name signame) return this.visible.sigs.containsKey(signame); } - public DataType getVisibleDataTypeFullName(DataType visname) + public DataName getVisibleDataTypeFullName(DataName visname) { return getFullName(this.visible.data, visname); } - public boolean isVisibleDataType(DataType visname) + public boolean isVisibleDataType(DataName visname) { return this.visible.isVisibleDataType(visname); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/context/ScribNames.java b/scribble-core/src/main/java/org/scribble/core/lang/context/ScribNames.java index b3793c9f5..247cacfd2 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/context/ScribNames.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/context/ScribNames.java @@ -16,7 +16,7 @@ import java.util.HashMap; import java.util.Map; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.SigName; @@ -29,7 +29,7 @@ public class ScribNames { // names -> fully qualified names public final Map modules = new HashMap<>(); - public final Map data = new HashMap<>(); + public final Map data = new HashMap<>(); public final Map sigs = new HashMap<>(); public final Map globals = new HashMap<>(); public final Map locals = new HashMap<>(); @@ -49,7 +49,7 @@ public boolean isVisibleProtocolDeclName(ProtoName visname) || this.locals.containsKey(visname); } - public boolean isVisibleDataType(DataType visname) + public boolean isVisibleDataType(DataName visname) { return this.data.containsKey(visname); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 77985e45f..d80cd75e7 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -39,7 +39,7 @@ import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.MemberName; @@ -139,9 +139,9 @@ public GProtocol getInlined(STypeInliner v) // Convert MemberName params to Args -- cf. NonRoleArgList::getParamKindArgs for (MemberName n : this.params) { - if (n instanceof DataType) + if (n instanceof DataName) { - params.add((DataType) n); + params.add((DataName) n); } else if (n instanceof SigName) { diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 76e07f401..27e7c555e 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -28,7 +28,7 @@ import org.scribble.core.model.endpoint.EState; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.SigName; @@ -82,9 +82,9 @@ public LProtocol getInlined(STypeInliner v) // Convert MemberName params to Args -- cf. NonRoleArgList::getParamKindArgs for (MemberName n : this.params) { - if (n instanceof DataType) + if (n instanceof DataName) { - params.add((DataType) n); + params.add((DataName) n); } else if (n instanceof SigName) { diff --git a/scribble-core/src/main/java/org/scribble/core/model/MAction.java b/scribble-core/src/main/java/org/scribble/core/model/MAction.java index e09b7f85d..249cf97c9 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MAction.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MAction.java @@ -45,7 +45,7 @@ public String toString() public String toStringWithMessageIdHack() { - String m = this.mid.isMessageSigName() ? "^" + this.mid : this.mid.toString(); // HACK + String m = this.mid.isSigName() ? "^" + this.mid : this.mid.toString(); // HACK return this.obj + getCommSymbol() + m + this.payload; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java index 4092584ff..f3fdb31ed 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java @@ -29,7 +29,7 @@ import org.scribble.core.job.Job; import org.scribble.core.model.ModelFactory; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.Op; @@ -245,24 +245,24 @@ else if ((i = a.indexOf('/')) != -1) { case "!": { - Payload payload = (pay != null) ? new Payload(Arrays.asList(pay).stream().map((pe) -> new DataType(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; + Payload payload = (pay != null) ? new Payload(Arrays.asList(pay).stream().map((pe) -> new DataName(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; return ef.newESend(new Role(peer), getMessageIdHack(msg), payload); // FIXME: how about MessageSigNames? -- currently OK, treated as empty payload (cf. ModelAction) } case "?": { - Payload payload = (pay != null) ? new Payload(Arrays.asList(pay).stream().map((pe) -> new DataType(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; + Payload payload = (pay != null) ? new Payload(Arrays.asList(pay).stream().map((pe) -> new DataName(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; return ef.newEReceive(new Role(peer), getMessageIdHack(msg), payload); // FIXME: how about MessageSigNames?) } case "!!": { //return new Connect(new Role(peer)); - Payload payload = (pay != null) ? new Payload(Arrays.asList(pay).stream().map((pe) -> new DataType(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; + Payload payload = (pay != null) ? new Payload(Arrays.asList(pay).stream().map((pe) -> new DataName(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; return ef.newERequest(new Role(peer), getMessageIdHack(msg), payload); } case "??": { //return new Accept(new Role(peer)); - Payload payload = (pay != null) ? new Payload(Arrays.asList(pay).stream().map((pe) -> new DataType(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; + Payload payload = (pay != null) ? new Payload(Arrays.asList(pay).stream().map((pe) -> new DataName(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; return ef.newEAccept(new Role(peer), getMessageIdHack(msg), payload); } case "(!!)": diff --git a/scribble-core/src/main/java/org/scribble/core/type/kind/IdKind.java b/scribble-core/src/main/java/org/scribble/core/type/kind/IdKind.java index 778d274fc..2f91d9211 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/kind/IdKind.java +++ b/scribble-core/src/main/java/org/scribble/core/type/kind/IdKind.java @@ -13,7 +13,8 @@ */ package org.scribble.core.type.kind; - + +// IdKind can be disregarded, the "true" kind (for qualified names) recorded by the IdNode parent public class IdKind extends AbstractKind { public static final IdKind KIND = new IdKind(); diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/AmbigName.java b/scribble-core/src/main/java/org/scribble/core/type/name/AmbigName.java index 0e41c1bda..52ea282a3 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/AmbigName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/AmbigName.java @@ -24,14 +24,14 @@ public AmbigName(String text) super(AmbigKind.KIND, text); } - public SigName toMessageSigName() + public SigName toSigName() { return new SigName(getLastElement()); } - public DataType toDataType() + public DataName toDataName() { - return new DataType(getLastElement()); + return new DataName(getLastElement()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/DataType.java b/scribble-core/src/main/java/org/scribble/core/type/name/DataName.java similarity index 81% rename from scribble-core/src/main/java/org/scribble/core/type/name/DataType.java rename to scribble-core/src/main/java/org/scribble/core/type/name/DataName.java index fd606b94a..4a1233bbd 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/DataType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/DataName.java @@ -18,22 +18,22 @@ // Potentially qualified/canonical payload type name; not the AST primitive identifier // FIXME: record "external type name" from DataTypeDecl (for API gen)? cf. OutputSockGen#addSendOpParams -public class DataType extends MemberName +public class DataName extends MemberName implements PayElemType { private static final long serialVersionUID = 1L; - public DataType(ModuleName modname, DataType membname) + public DataName(ModuleName modname, DataName membname) { super(DataKind.KIND, modname, membname); } - public DataType(String simplename) + public DataName(String simplename) { super(DataKind.KIND, simplename); } - public boolean isDataType() + public boolean isDataName() { return true; } @@ -45,9 +45,9 @@ public DataKind getKind() } @Override - public DataType getSimpleName() + public DataName getSimpleName() { - return new DataType(getLastElement()); + return new DataName(getLastElement()); } @Override @@ -57,17 +57,17 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof DataType)) + if (!(o instanceof DataName)) { return false; } - DataType n = (DataType) o; + DataName n = (DataName) o; return n.canEqual(this) && super.equals(o); } public boolean canEqual(Object o) { - return o instanceof DataType; + return o instanceof DataName; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/MsgId.java b/scribble-core/src/main/java/org/scribble/core/type/name/MsgId.java index 26944cd86..f95ad2b30 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/MsgId.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/MsgId.java @@ -23,7 +23,7 @@ default boolean isOp() return false; } - default boolean isMessageSigName() + default boolean isSigName() { return false; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/PayElemType.java b/scribble-core/src/main/java/org/scribble/core/type/name/PayElemType.java index a81073cb2..dbd0987ad 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/PayElemType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/PayElemType.java @@ -19,7 +19,7 @@ public interface PayElemType extends Arg { - default boolean isDataType() + default boolean isDataName() { return false; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/QualName.java b/scribble-core/src/main/java/org/scribble/core/type/name/QualName.java index e71e3fb5b..f60c6d56a 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/QualName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/QualName.java @@ -16,6 +16,7 @@ import org.scribble.core.type.kind.Kind; +// A (potenitally" qualified name -- a compound name public abstract class QualName extends AbstractName { private static final long serialVersionUID = 1L; diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/SigName.java b/scribble-core/src/main/java/org/scribble/core/type/name/SigName.java index 3ff220de2..84d71bdd5 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/SigName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/SigName.java @@ -14,11 +14,11 @@ package org.scribble.core.type.name; import org.scribble.core.type.kind.SigKind; -import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.Msg; // The name of a declared (imported) message signature member -public class SigName extends MemberName implements Message, MsgId +public class SigName extends MemberName implements Msg, MsgId { private static final long serialVersionUID = 1L; @@ -51,7 +51,7 @@ public MsgId getId() } @Override - public boolean isMessageSigName() + public boolean isSigName() { return true; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java b/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java index 66191475a..b7bdfa26b 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/ConnectAction.java @@ -21,7 +21,7 @@ public abstract class ConnectAction> extends DirectedInteraction { public ConnectAction(CommonTree source, // BaseInteractionNode not ideal - Message msg, Role src, Role dst) + Msg msg, Role src, Role dst) { super(source, msg, src, dst); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java index ba3279f8a..c7c805bd5 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/DirectedInteraction.java @@ -28,12 +28,12 @@ public abstract class DirectedInteraction { // Following ast children order - public final Message msg; + public final Msg msg; public final Role src; public final Role dst; public DirectedInteraction(CommonTree source, - Message msg, Role src, Role dst) + Msg msg, Role src, Role dst) { super(source); this.msg = msg; @@ -42,7 +42,7 @@ public DirectedInteraction(CommonTree source, } public abstract DirectedInteraction reconstruct( - CommonTree source, Message msg, Role src, + CommonTree source, Msg msg, Role src, Role dst); @Override diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Message.java b/scribble-core/src/main/java/org/scribble/core/type/session/Msg.java similarity index 88% rename from scribble-core/src/main/java/org/scribble/core/type/session/Message.java rename to scribble-core/src/main/java/org/scribble/core/type/session/Msg.java index 671bb3930..f5a852ef5 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Message.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Msg.java @@ -20,16 +20,16 @@ // A sig kind name: MessageSignature value (or parameter) -public interface Message extends Arg +public interface Msg extends Arg { MsgId getId(); - default boolean isMessageSig() + default boolean isSigLit() { return false; } - default boolean isMessageSigName() + default boolean isSigName() { return false; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/MsgTransfer.java b/scribble-core/src/main/java/org/scribble/core/type/session/MsgTransfer.java index a97ce6af7..664095387 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/MsgTransfer.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/MsgTransfer.java @@ -21,7 +21,7 @@ public abstract class MsgTransfer> extends DirectedInteraction { public MsgTransfer(CommonTree source, - Message msg, Role src, Role dst) + Msg msg, Role src, Role dst) { super(source, msg, src, dst); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SigLit.java b/scribble-core/src/main/java/org/scribble/core/type/session/SigLit.java index f3df3d404..4e833089a 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SigLit.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SigLit.java @@ -18,7 +18,7 @@ import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Op; -public class SigLit implements Message +public class SigLit implements Msg { public final Op op; public final Payload payload; @@ -30,7 +30,7 @@ public SigLit(Op op, Payload payload) } @Override - public boolean isMessageSig() + public boolean isSigLit() { return true; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java index a3589194c..cd706cb5a 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java @@ -17,21 +17,21 @@ import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.ConnectAction; -import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.Msg; public class GConnect extends ConnectAction implements GType { public GConnect(CommonTree source, // DirectedInteraction not ideal (imprecise) - Role src, Message msg, Role dst) + Role src, Msg msg, Role dst) { super(source, msg, src, dst); } @Override public GConnect reconstruct( - CommonTree source, Message msg, Role src, + CommonTree source, Msg msg, Role src, Role dst) { return new GConnect(source, src, msg, dst); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java index 1a7f6d07f..6353a4857 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java @@ -16,7 +16,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.Msg; import org.scribble.core.type.session.MsgTransfer; public class GMessageTransfer extends MsgTransfer @@ -24,14 +24,14 @@ public class GMessageTransfer extends MsgTransfer { public GMessageTransfer(CommonTree source, - Role src, Message msg, Role dst) + Role src, Msg msg, Role dst) { super(source, msg, src, dst); } @Override public GMessageTransfer reconstruct( - CommonTree source, Message msg, Role src, + CommonTree source, Msg msg, Role src, Role dst) { return new GMessageTransfer(source, src, msg, dst); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java index a8d60c759..4e702c33e 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java @@ -17,14 +17,14 @@ import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.ConnectAction; -import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.Msg; public class LAcc extends ConnectAction implements LType { // this.dst == Role.SELF public LAcc(CommonTree source, - Role src, Message msg) + Role src, Msg msg) { super(source, msg, src, Role.SELF); } @@ -32,7 +32,7 @@ public LAcc(CommonTree source, // FIXME: unnecessary dst @Override public LAcc reconstruct( - CommonTree source, Message msg, Role src, + CommonTree source, Msg msg, Role src, Role dst) { return new LAcc(source, src, msg); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java index 081442f59..bb6ffc127 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java @@ -16,7 +16,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.Msg; import org.scribble.core.type.session.MsgTransfer; public class LRcv extends MsgTransfer @@ -25,7 +25,7 @@ public class LRcv extends MsgTransfer // this.dst == Role.SELF public LRcv(CommonTree source, - Role src, Message msg) + Role src, Msg msg) { super(source, msg, src, Role.SELF); } @@ -33,7 +33,7 @@ public LRcv(CommonTree source, // FIXME: unnecessary dst @Override public LRcv reconstruct( - CommonTree source, Message msg, Role src, + CommonTree source, Msg msg, Role src, Role dst) { return new LRcv(source, src, msg); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java index 516626049..116a7056e 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java @@ -17,7 +17,7 @@ import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.ConnectAction; -import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.Msg; public class LReq extends ConnectAction implements LType @@ -25,7 +25,7 @@ public class LReq extends ConnectAction // this.src == Role.SELF public LReq(CommonTree source, - Message msg, Role dst) + Msg msg, Role dst) { super(source, msg, Role.SELF, dst); } @@ -33,7 +33,7 @@ public LReq(CommonTree source, // CHECKME: remove unnecessary src ? @Override public LReq reconstruct( - CommonTree source, Message msg, Role src, + CommonTree source, Msg msg, Role src, Role dst) { return new LReq(source, msg, dst); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java index d7c8e9bcb..7c7b9e688 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java @@ -16,7 +16,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.Msg; import org.scribble.core.type.session.MsgTransfer; public class LSend extends MsgTransfer @@ -25,7 +25,7 @@ public class LSend extends MsgTransfer // this.src == Role.SELF public LSend(CommonTree source, - Message msg, Role dst) + Msg msg, Role dst) { super(source, msg, Role.SELF, dst); } @@ -33,7 +33,7 @@ public LSend(CommonTree source, // CHECKME: remove unnecessary src ? @Override public LSend reconstruct( - CommonTree source, Message msg, Role src, + CommonTree source, Msg msg, Role src, Role dst) { return new LSend(source, msg, dst); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java index fd817c03e..6160e8d37 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java @@ -18,7 +18,7 @@ import java.util.stream.Stream; import org.scribble.core.type.kind.ProtoKind; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GDelegType; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.SigName; @@ -56,7 +56,7 @@ public Stream> visitDirectedInteraction(DirectedInteraction { { List> res = new LinkedList<>(); - if (n.msg.isMessageSigName()) + if (n.msg.isSigName()) { res.add((SigName) n.msg); } @@ -65,9 +65,9 @@ public Stream> visitDirectedInteraction(DirectedInteraction Payload pay = ((SigLit) n.msg).payload; for (PayElemType p : pay.elems) { - if (p.isDataType()) + if (p.isDataName()) { - res.add((DataType) p); + res.add((DataName) p); } else if (p.isGDelegationType()) // TODO FIXME: should be projected to local name { @@ -92,7 +92,7 @@ public > Stream> visitDo( Do n) { return n.args.stream() - .filter(x -> (x instanceof SigLit) || (x instanceof DataType)) // CHECKME: refactor? + .filter(x -> (x instanceof SigLit) || (x instanceof DataName)) // CHECKME: refactor? .map(x -> (MemberName) x); } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java index 7086b1efa..68ef47e12 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java @@ -19,7 +19,7 @@ import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.ProtoKind; -import org.scribble.core.type.name.DataType; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.ProtoName; @@ -30,7 +30,7 @@ import org.scribble.core.type.session.DirectedInteraction; import org.scribble.core.type.session.DisconnectAction; import org.scribble.core.type.session.Do; -import org.scribble.core.type.session.Message; +import org.scribble.core.type.session.Msg; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; @@ -57,13 +57,13 @@ public SType visitChoice(Choice n) @Override public SType visitDirectedInteraction(DirectedInteraction n) { - Message msg = n.msg; + Msg msg = n.msg; if (msg instanceof MemberName) { MemberName name = (MemberName) msg; if (this.subs.hasArg(name)) { - msg = (Message) this.subs.subsArg(name); + msg = (Msg) this.subs.subsArg(name); } } return n.reconstruct(n.getSource(), msg, this.subs.subsRole(n.src), @@ -87,9 +87,9 @@ public > SType visitDo(Do n) { if (a instanceof MemberName && this.subs.hasArg((MemberName) a)) { - if (a instanceof DataType) + if (a instanceof DataName) { - a = this.subs.subsArg((DataType) a); + a = this.subs.subsArg((DataName) a); } else if (a instanceof SigName) { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 3fa62400f..bdcd205de 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -177,7 +177,7 @@ public SType visitDirectedInteraction(DirectedInteraction mid = n.msg.getId(); - Payload payload = n.msg.isMessageSig() // CHECKME: generalise? (e.g., hasPayload) + Payload payload = n.msg.isSigLit() // CHECKME: generalise? (e.g., hasPayload) ? ((SigLit) n.msg).payload : Payload.EMPTY_PAYLOAD; // TODO: add toAction method to base Interaction From dc2fb4db26a80f3c1677344dc3c721b83dd7eece Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 18:50:27 +0100 Subject: [PATCH 283/539] Continued: cleaning up ast class names. --- .../java/org/scribble/ast/AstFactory.java | 99 ++++---- .../src/main/java/org/scribble/del/DoDel.java | 20 +- .../del/global/GDelegationElemDel.java | 15 +- .../del/name/simple/AmbigNameNodeDel.java | 14 +- .../parser/scribble/AstFactoryImpl.java | 211 ++++++++++-------- 5 files changed, 191 insertions(+), 168 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index a39b7b67f..b1be4383e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -15,6 +15,7 @@ import java.util.List; +import org.antlr.runtime.Token; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; import org.scribble.ast.global.GContinue; @@ -23,10 +24,10 @@ import org.scribble.ast.global.GDo; import org.scribble.ast.global.GInteractionSeq; import org.scribble.ast.global.GMsgTransfer; -import org.scribble.ast.global.GProtoDecl; -import org.scribble.ast.global.GProtoHeader; import org.scribble.ast.global.GProtoBlock; +import org.scribble.ast.global.GProtoDecl; import org.scribble.ast.global.GProtoDef; +import org.scribble.ast.global.GProtoHeader; import org.scribble.ast.global.GRecursion; import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GWrap; @@ -47,76 +48,78 @@ import org.scribble.core.type.kind.PayElemKind; -// CHECKME: add Token params back (for better transformation, cf. ScribNodeBase.source), and use null for "fresh"? +// Pass null as Token t to create a fresh Token // AstFactory is for making "fresh" nodes ("fresh" Tokens) with new dels -- cf. ScribNode reconstruct pattern (for Token and del preservation) // Implementations located in scribble-parser, use ScribbleParser for Token construction // Currently, used only in relatively niche places (since ANTLR now constructs all parsed nodes "directly") public interface AstFactory { - IdNode IdNode(String text); - ExtIdNode ExtIdNode(String text); - - AmbigNameNode AmbigNameNode(String text); // Deprecate? Never need to make ambigname "manually" via af? (constructed only by ScribbleParser) - DataParamNode DataParamNode(String text); - OpNode OpNode(String text); - RecVarNode RecVarNode(String text); - RoleNode RoleNode(String text); - SigParamNode SigParamNode(String text); - - DataNameNode DataNameNode(List elems); - GProtoNameNode GProtoNameNode(List elems); - ModuleNameNode ModuleNameNode(List elems); - SigNameNode SigNameNode(List elems); + IdNode IdNode(Token t, String text); + ExtIdNode ExtIdNode(Token t, String text); + + AmbigNameNode AmbigNameNode(Token t, String text); // Deprecate? Never need to make ambigname "manually" via af? (constructed only by ScribbleParser) + DataParamNode DataParamNode(Token t, String text); + OpNode OpNode(Token t, String text); + RecVarNode RecVarNode(Token t, String text); + RoleNode RoleNode(Token t, String text); + SigParamNode SigParamNode(Token t, String text); + + DataNameNode DataNameNode(Token t, List elems); + GProtoNameNode GProtoNameNode(Token t, List elems); + ModuleNameNode ModuleNameNode(Token t, List elems); + SigNameNode SigNameNode(Token t, List elems); - Module Module(ModuleDecl mdecl, List> imports, + Module Module(Token t, ModuleDecl mdecl, List> imports, List> data, List> protos); - ModuleDecl ModuleDecl(ModuleNameNode fullname); - ImportModule ImportModule(ModuleNameNode modname, ModuleNameNode alias); + ModuleDecl ModuleDecl(Token t, ModuleNameNode fullname); + ImportModule ImportModule(Token t, ModuleNameNode modname, + ModuleNameNode alias); - DataDecl DataDecl(IdNode schema, IdNode extName, IdNode extSource, + DataDecl DataDecl(Token t, IdNode schema, IdNode extName, IdNode extSource, DataNameNode name); - SigDecl SigDecl(IdNode schema, IdNode extName, IdNode extSource, + SigDecl SigDecl(Token t, IdNode schema, IdNode extName, IdNode extSource, SigNameNode name); - GProtoDecl GProtoDecl(ProtoModList mods, GProtoHeader header, + GProtoDecl GProtoDecl(Token t, ProtoModList mods, GProtoHeader header, GProtoDef def); // TODO: add ProtoModList, etc. - GProtoHeader GProtocolHeader(GProtoNameNode name, RoleDeclList rs, + GProtoHeader GProtocolHeader(Token t, GProtoNameNode name, RoleDeclList rs, NonRoleParamDeclList ps); - RoleDeclList RoleDeclList(List ds); - RoleDecl RoleDecl(RoleNode r); - NonRoleParamDeclList NonRoleParamDeclList( + RoleDeclList RoleDeclList(Token t, List ds); + RoleDecl RoleDecl(Token t, RoleNode r); + NonRoleParamDeclList NonRoleParamDeclList(Token t, List> ds); - DataParamDecl DataParamDecl(DataParamNode p); - SigParamDecl SigParamDecl(SigParamNode p); + DataParamDecl DataParamDecl(Token t, DataParamNode p); + SigParamDecl SigParamDecl(Token t, SigParamNode p); - GProtoDef GProtoDef(GProtoBlock block); - GProtoBlock GProtoBlock(GInteractionSeq seq); - GInteractionSeq GInteractionSeq(List elems); + GProtoDef GProtoDef(Token t, GProtoBlock block); + GProtoBlock GProtoBlock(Token t, GInteractionSeq seq); + GInteractionSeq GInteractionSeq(Token t, List elems); - SigLitNode SigLitNode(OpNode op, PayElemList pay); - PayElemList PayElemList(List> elems); - UnaryPayElem UnaryPayElem( + SigLitNode SigLitNode(Token t, OpNode op, PayElemList pay); + PayElemList PayElemList(Token t, List> elems); + UnaryPayElem UnaryPayElem(Token t, PayElemNameNode name); - GDelegPayElem GDelegPayElem(GProtoNameNode name, RoleNode r); + GDelegPayElem GDelegPayElem(Token t, GProtoNameNode name, RoleNode r); - GConnect GConnect(RoleNode src, MsgNode msg, RoleNode dst); - GDisconnect GDisconnect(RoleNode src, RoleNode dst); - GMsgTransfer GMsgTransfer(RoleNode src, MsgNode msg, List dsts); - GWrap GWrap(RoleNode src, RoleNode dst); + GConnect GConnect(Token t, RoleNode src, MsgNode msg, RoleNode dst); + GDisconnect GDisconnect(Token t, RoleNode src, RoleNode dst); + GMsgTransfer GMsgTransfer(Token t, RoleNode src, MsgNode msg, + List dsts); + GWrap GWrap(Token t, RoleNode src, RoleNode dst); - GContinue GContinue(RecVarNode rv); - GDo GDo(RoleArgList rs, NonRoleArgList args, + GContinue GContinue(Token t, RecVarNode rv); + GDo GDo(Token t, RoleArgList rs, NonRoleArgList args, GProtoNameNode proto); - GChoice GChoice(RoleNode subj, List blocks); - GRecursion GRecursion(RecVarNode rv, GProtoBlock block); + GChoice GChoice(Token t, RoleNode subj, List blocks); + GRecursion GRecursion(Token t, RecVarNode rv, GProtoBlock block); - RoleArgList RoleArgList(List rs); - RoleArg RoleArg(RoleNode r); - NonRoleArgList NonRoleArgList(List args); - NonRoleArg NonRoleArg(NonRoleArgNode arg); + RoleArgList RoleArgList(Token t, List rs); + RoleArg RoleArg(Token t, RoleNode r); + NonRoleArgList NonRoleArgList(Token t, List args); + NonRoleArg NonRoleArg(Token t, NonRoleArgNode arg); } diff --git a/scribble-ast/src/main/java/org/scribble/del/DoDel.java b/scribble-ast/src/main/java/org/scribble/del/DoDel.java index 993cb5e18..ecba4341c 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoDel.java @@ -25,7 +25,6 @@ import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.ProtoName; -import org.scribble.lang.Lang; import org.scribble.util.ScribException; import org.scribble.visit.NameDisambiguator; @@ -65,28 +64,29 @@ private ScribNode leaveDisambiguationAux( Do visited, NameDisambiguator disamb) throws ScribException { ProtoNameNode proto = visited.getProtocolNameNode(); - ModuleContext modc = disamb.getModuleContext(); - ProtoName fullname = modc - .getVisibleProtocolDeclFullName(proto.toName()); // CHECKME: do full name expansion in disamb? or leave to imed translation? -- FIXME: sort out full name expansion between here and GDoDel.translate - ProtoNameNode n = foo(disamb.lang, fullname); + ProtoNameNode n = makeProtoNameNode(disamb, proto); // Didn't keep original namenode del -- ? return visited.reconstruct(visited.getRoleListChild(), visited.getNonRoleListChild(), n); } - private ProtoNameNode foo(Lang lang, - ProtoName fullname) + private ProtoNameNode makeProtoNameNode( + NameDisambiguator disamb, ProtoNameNode proto) { + ModuleContext modc = disamb.getModuleContext(); + ProtoName fullname = modc + .getVisibleProtocolDeclFullName(proto.toName()); if (fullname instanceof GProtoName) { List elems = Arrays.asList(fullname.getElements()).stream() - .map(x -> lang.config.af.IdNode(x)).collect(Collectors.toList()); + .map(x -> disamb.lang.config.af.IdNode(null, x)) + .collect(Collectors.toList()); @SuppressWarnings("unchecked") // FIXME - ProtoNameNode cast = (ProtoNameNode) lang.config.af - .GProtoNameNode(elems); + ProtoNameNode cast = (ProtoNameNode) disamb.lang.config.af + .GProtoNameNode(proto.token, elems); return cast; } throw new RuntimeException("[TODO] " + fullname.getKind() + ": " + fullname); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java index a41c97038..2a77fcd75 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -57,12 +57,13 @@ public void enterDisambiguation(ScribNode child, // Duplicated from DoDel //@Override public GDelegPayElem visitForNameDisambiguation(NameDisambiguator disamb, // CHECKME: why "visitFor" pattern? - GDelegPayElem de) throws ScribException + GDelegPayElem deleg) throws ScribException { ModuleContext mc = disamb.getModuleContext(); + GProtoNameNode proto = deleg.getProtocolChild(); GProtoName fullname = (GProtoName) mc - .getVisibleProtocolDeclFullName(de.getProtocolChild().toName()); - RoleNode r = de.getRoleChild(); + .getVisibleProtocolDeclFullName(proto.toName()); + RoleNode r = deleg.getRoleChild(); Role rn = r.toName(); ProtoDecl gpd = disamb.lang.getContext() @@ -70,13 +71,13 @@ public GDelegPayElem visitForNameDisambiguation(NameDisambiguator disamb, // CH .getGProtocolDeclChild(fullname.getSimpleName()); if (!gpd.getHeaderChild().getRoleDeclListChild().getRoles().contains(rn)) { - throw new ScribException(r.getSource(), "Invalid delegation role: " + de); + throw new ScribException(r.getSource(), "Invalid delegation role: " + deleg); } List elems = Arrays.asList(fullname.getElements()).stream() - .map(x -> disamb.lang.config.af.IdNode(x)).collect(Collectors.toList()); + .map(x -> disamb.lang.config.af.IdNode(null, x)).collect(Collectors.toList()); GProtoNameNode pnn = (GProtoNameNode) disamb.lang.config.af - .GProtoNameNode(elems); + .GProtoNameNode(proto.token, elems); // Not keeping original namenode del - return de.reconstruct(pnn, r); + return deleg.reconstruct(pnn, r); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java index 41dcfcfb8..02f1b0163 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java @@ -64,8 +64,8 @@ public ScribNode leaveDisambiguation(ScribNode child, //DataTypeNode res = new DataTypeNode(ann.token); // CHECKME: what should the Token be? //DataTypeNode res = new DataTypeNode(new CommonToken(73, "TYPENAME")); // FIXME: use af DataNameNode res = (DataNameNode) disamb.lang.config.af - .DataNameNode(ann.getElements().stream() - .map(x -> disamb.lang.config.af.IdNode(x)) + .DataNameNode(ann.token, ann.getElements().stream() + .map(x -> disamb.lang.config.af.IdNode(null, x)) .collect(Collectors.toList())); //res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? @@ -86,8 +86,8 @@ else if (mcontext.isMessageSigNameVisible(name.toSigName())) //MessageSigNameNode res = new MessageSigNameNode(ann.token); // CHECME: what should the Token be? //MessageSigNameNode res = new MessageSigNameNode(new CommonToken(67, "SIGNAME")); // FIXME: use af SigNameNode res = (SigNameNode) disamb.lang.config.af - .SigNameNode(ann.getElements().stream() - .map(x -> disamb.lang.config.af.IdNode(x)) + .SigNameNode(ann.token, ann.getElements().stream() + .map(x -> disamb.lang.config.af.IdNode(null, x)) .collect(Collectors.toList())); //res.addChildren(ann.getChildren()); @@ -104,7 +104,8 @@ else if (disamb.isBoundParameter(name)) { //TypeParamNode res = new TypeParamNode(ann.token); // CHECKME: what should the Token be? //TypeParamNode res = new TypeParamNode(75, ann.token); // CHECKME: what should the Token be? - DataParamNode res = disamb.lang.config.af.DataParamNode(ann.getText()); // CHECKME: what should the Token be? + DataParamNode res = disamb.lang.config.af.DataParamNode(ann.token, + ann.getText()); //res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? @@ -113,7 +114,8 @@ else if (disamb.isBoundParameter(name)) else if (kind.equals(SigKind.KIND)) { //SigParamNode res = new SigParamNode(69, ann.token); // CHECKME: what should the Token be? - SigParamNode res = disamb.lang.config.af.SigParamNode(ann.getText()); // CHECKME: what should the Token be? + SigParamNode res = disamb.lang.config.af.SigParamNode(ann.token, + ann.getText()); //res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java index 27b395cd6..e923cd9f0 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java @@ -19,14 +19,15 @@ import java.util.Map; import org.antlr.runtime.CommonToken; +import org.antlr.runtime.Token; import org.scribble.ast.AstFactory; import org.scribble.ast.DataDecl; import org.scribble.ast.DataParamDecl; import org.scribble.ast.ImportDecl; import org.scribble.ast.ImportModule; -import org.scribble.ast.MsgNode; import org.scribble.ast.Module; import org.scribble.ast.ModuleDecl; +import org.scribble.ast.MsgNode; import org.scribble.ast.NonProtoDecl; import org.scribble.ast.NonRoleArg; import org.scribble.ast.NonRoleArgList; @@ -54,10 +55,10 @@ import org.scribble.ast.global.GDo; import org.scribble.ast.global.GInteractionSeq; import org.scribble.ast.global.GMsgTransfer; -import org.scribble.ast.global.GProtoDecl; -import org.scribble.ast.global.GProtoHeader; import org.scribble.ast.global.GProtoBlock; +import org.scribble.ast.global.GProtoDecl; import org.scribble.ast.global.GProtoDef; +import org.scribble.ast.global.GProtoHeader; import org.scribble.ast.global.GRecursion; import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GWrap; @@ -142,16 +143,30 @@ public AstFactoryImpl(ScribAntlrWrapper antlr) // type comes from the int constants in ScribbleParser, which come from the tokens in Scribble.g // Pre: type is an "imaginary token" type from ScribbleParser -- (not ID) - protected CommonToken newToken(int type) + protected CommonToken newToken(Token old, int type) { // As a default, token text is set to the textual name of the token type int field (also the Scribble.g default) String text = this.tokens.get(type); - return new CommonToken(type, text); + if (old == null) + { + return new CommonToken(type, text); + } + CommonToken t = new CommonToken(old); + t.setType(type); + t.setText(text); + return t; } - protected CommonToken newIdToken(String text) + protected CommonToken newIdToken(Token old, String text) { - return new CommonToken(ScribbleParser.ID, text); + if (old == null) + { + return new CommonToken(ScribbleParser.ID, text); + } + CommonToken t = new CommonToken(old); + t.setType(ScribbleParser.ID); + t.setText(text); + return t; } protected ScribDel createDefaultDelegate() @@ -167,18 +182,18 @@ protected static T del(T n, ScribDel del) } @Override - public IdNode IdNode(String text) + public IdNode IdNode(Token t, String text) { - CommonToken t = newIdToken(text); + t = newIdToken(t, text); // (Ext)IdNode is the only token with a "different" text to its node type -- info stored directly as its the text, no children IdNode n = new IdNode(t); return n; } @Override - public ExtIdNode ExtIdNode(String text) + public ExtIdNode ExtIdNode(Token t, String text) { - CommonToken t = newIdToken(text); + t = newIdToken(t, text); // (Ext)IdNode is the only token with a "different" text to its node type -- info stored directly as its the text, no children ExtIdNode n = new ExtIdNode(t); return n; @@ -186,69 +201,69 @@ public ExtIdNode ExtIdNode(String text) // Deprecate? Never need to make ambigname "manually" via af? (only constructed by ScribbleParser) @Override - public AmbigNameNode AmbigNameNode(String text) + public AmbigNameNode AmbigNameNode(Token t, String text) { int ttype = ScribbleParser.ID; - CommonToken t = newIdToken(text); + t = newIdToken(t, text); AmbigNameNode n = new AmbigNameNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] n.del(new AmbigNameNodeDel()); return n; } @Override - public OpNode OpNode(String text) + public OpNode OpNode(Token t, String text) { int ttype = ScribbleParser.ID; - CommonToken t = newIdToken(text); + t = newIdToken(t, text); OpNode n = new OpNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] del(n, createDefaultDelegate()); return n; } @Override - public RecVarNode RecVarNode(String text) + public RecVarNode RecVarNode(Token t, String text) { int ttype = ScribbleParser.ID; - CommonToken t = newIdToken(text); + t = newIdToken(t, text); RecVarNode n = new RecVarNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] del(n, new RecVarNodeDel()); return n; } @Override - public RoleNode RoleNode(String text) + public RoleNode RoleNode(Token t, String text) { int ttype = ScribbleParser.ID; - CommonToken t = newIdToken(text); + t = newIdToken(t, text); RoleNode n = new RoleNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] del(n, new RoleNodeDel()); return n; } @Override - public SigParamNode SigParamNode(String text) + public SigParamNode SigParamNode(Token t, String text) { - int ttype = ScribbleParser.ID; // N.B. cf. ScribbleParser.SIGNAME - CommonToken t = newIdToken(text); + int ttype = ScribbleParser.ID; // N.B. cf. ScribbleParser.SIG_NAME + t = newIdToken(t, text); SigParamNode n = new SigParamNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] n.del(new NonRoleParamNodeDel()); return n; } @Override - public DataParamNode DataParamNode(String text) + public DataParamNode DataParamNode(Token t, String text) { - int ttype = ScribbleParser.ID; // N.B. cf. ScribbleParser.TYPENAME - CommonToken t = newIdToken(text); + int ttype = ScribbleParser.ID; // N.B. cf. ScribbleParser.DATA_NAME + t = newIdToken(t, text); DataParamNode n = new DataParamNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] n.del(new NonRoleParamNodeDel()); return n; } @Override - public DataNameNode DataNameNode(List elems) + public DataNameNode DataNameNode(Token t, List elems) { - CommonToken t = newToken(ScribbleParser.DATA_NAME); + t = newToken(t, ScribbleParser.DATA_NAME); DataNameNode n = new DataNameNode(t); n.addChildren(elems); del(n, new DataTypeNodeDel()); @@ -256,9 +271,9 @@ public DataNameNode DataNameNode(List elems) } @Override - public GProtoNameNode GProtoNameNode(List elems) + public GProtoNameNode GProtoNameNode(Token t, List elems) { - CommonToken t = newToken(ScribbleParser.GPROTO_NAME); + t = newToken(t, ScribbleParser.GPROTO_NAME); GProtoNameNode n = new GProtoNameNode(t); n.addChildren(elems); del(n, createDefaultDelegate()); @@ -266,9 +281,9 @@ public GProtoNameNode GProtoNameNode(List elems) } @Override - public ModuleNameNode ModuleNameNode(List elems) + public ModuleNameNode ModuleNameNode(Token t, List elems) { - CommonToken t = newToken(ScribbleParser.MODULE_NAME); + t = newToken(t, ScribbleParser.MODULE_NAME); ModuleNameNode n = new ModuleNameNode(t); n.addChildren(elems); del(n, createDefaultDelegate()); @@ -276,9 +291,9 @@ public ModuleNameNode ModuleNameNode(List elems) } @Override - public SigNameNode SigNameNode(List elems) + public SigNameNode SigNameNode(Token t, List elems) { - CommonToken t = newToken(ScribbleParser.SIG_NAME); + t = newToken(t, ScribbleParser.SIG_NAME); SigNameNode n = new SigNameNode(t); n.addChildren(elems); del(n, new MessageSigNameNodeDel()); @@ -286,10 +301,10 @@ public SigNameNode SigNameNode(List elems) } @Override - public Module Module(ModuleDecl moddecl, List> imports, + public Module Module(Token t, ModuleDecl moddecl, List> imports, List> data, List> protos) { - CommonToken t = newToken(ScribbleParser.MODULE); + t = newToken(t, ScribbleParser.MODULE); Module n = new Module(t); n.addChild(moddecl); n.addChildren(imports); @@ -300,9 +315,9 @@ public Module Module(ModuleDecl moddecl, List> imports, } @Override - public ModuleDecl ModuleDecl(ModuleNameNode fullmodname) + public ModuleDecl ModuleDecl(Token t, ModuleNameNode fullmodname) { - CommonToken t = newToken(ScribbleParser.MODULEDECL); + t = newToken(t, ScribbleParser.MODULEDECL); ModuleDecl n = new ModuleDecl(t); n.addChild(fullmodname); del(n, createDefaultDelegate()); @@ -310,9 +325,10 @@ public ModuleDecl ModuleDecl(ModuleNameNode fullmodname) } @Override - public ImportModule ImportModule(ModuleNameNode modname, ModuleNameNode alias) + public ImportModule ImportModule(Token t, ModuleNameNode modname, + ModuleNameNode alias) { - CommonToken t = newToken(ScribbleParser.IMPORTMODULE); + t = newToken(t, ScribbleParser.IMPORTMODULE); ImportModule n = new ImportModule(t); n.addChild(modname); if (alias != null) @@ -324,10 +340,10 @@ public ImportModule ImportModule(ModuleNameNode modname, ModuleNameNode alias) } @Override - public DataDecl DataDecl(IdNode schema, IdNode extName, IdNode extSource, + public DataDecl DataDecl(Token t, IdNode schema, IdNode extName, IdNode extSource, DataNameNode alias) { - CommonToken t = newToken(ScribbleParser.DATADECL); + t = newToken(t, ScribbleParser.DATADECL); DataDecl n = new DataDecl(t); n.addChild(schema); n.addChild(extName); @@ -338,10 +354,10 @@ public DataDecl DataDecl(IdNode schema, IdNode extName, IdNode extSource, } @Override - public SigDecl SigDecl(IdNode schema, IdNode extName, IdNode extSource, - SigNameNode alias) + public SigDecl SigDecl(Token t, IdNode schema, IdNode extName, + IdNode extSource, SigNameNode alias) { - CommonToken t = newToken(ScribbleParser.SIGDECL); + t = newToken(t, ScribbleParser.SIGDECL); SigDecl n = new SigDecl(t); n.addChild(schema); n.addChild(extName); @@ -352,10 +368,10 @@ public SigDecl SigDecl(IdNode schema, IdNode extName, IdNode extSource, } @Override - public GProtoDecl GProtoDecl(ProtoModList mods, GProtoHeader header, + public GProtoDecl GProtoDecl(Token t, ProtoModList mods, GProtoHeader header, GProtoDef def) { - CommonToken t = newToken(ScribbleParser.GPROTODECL); + t = newToken(t, ScribbleParser.GPROTODECL); GProtoDecl n = new GProtoDecl(t); n.addChild(mods); n.addChild(header); @@ -365,10 +381,10 @@ public GProtoDecl GProtoDecl(ProtoModList mods, GProtoHeader header, } @Override - public GProtoHeader GProtocolHeader(GProtoNameNode name, + public GProtoHeader GProtocolHeader(Token t, GProtoNameNode name, RoleDeclList rs, NonRoleParamDeclList ps) { - CommonToken t = newToken(ScribbleParser.GPROTOHEADER); + t = newToken(t, ScribbleParser.GPROTOHEADER); GProtoHeader n = new GProtoHeader(t); n.addChild(name); n.addChild(ps); @@ -378,9 +394,9 @@ public GProtoHeader GProtocolHeader(GProtoNameNode name, } @Override - public RoleDeclList RoleDeclList(List ds) + public RoleDeclList RoleDeclList(Token t, List ds) { - CommonToken t = newToken(ScribbleParser.ROLEDECL_LIST); + t = newToken(t, ScribbleParser.ROLEDECL_LIST); RoleDeclList n = new RoleDeclList(t); // Cf. Scribble.g children order n.addChildren(ds); @@ -389,9 +405,9 @@ public RoleDeclList RoleDeclList(List ds) } @Override - public RoleDecl RoleDecl(RoleNode r) + public RoleDecl RoleDecl(Token t, RoleNode r) { - CommonToken t = newToken(ScribbleParser.ROLEDECL); + t = newToken(t, ScribbleParser.ROLEDECL); RoleDecl n = new RoleDecl(t); n.addChild(r); del(n, new RoleDeclDel()); @@ -399,10 +415,10 @@ public RoleDecl RoleDecl(RoleNode r) } @Override - public NonRoleParamDeclList NonRoleParamDeclList( + public NonRoleParamDeclList NonRoleParamDeclList(Token t, List> ds) { - CommonToken t = newToken(ScribbleParser.PARAMDECL_LIST); + t =newToken(t, ScribbleParser.PARAMDECL_LIST); NonRoleParamDeclList n = new NonRoleParamDeclList(t); // Cf. Scribble.g children order n.addChildren(ds); @@ -411,9 +427,9 @@ public NonRoleParamDeclList NonRoleParamDeclList( } @Override - public DataParamDecl DataParamDecl(DataParamNode p) + public DataParamDecl DataParamDecl(Token t, DataParamNode p) { - CommonToken t = newToken(ScribbleParser.DATAPARAMDECL); + t = newToken(t, ScribbleParser.DATAPARAMDECL); DataParamDecl n = new DataParamDecl(t); // Cf. Scribble.g children order n.addChild(p); @@ -422,9 +438,9 @@ public DataParamDecl DataParamDecl(DataParamNode p) } @Override - public SigParamDecl SigParamDecl(SigParamNode p) + public SigParamDecl SigParamDecl(Token t, SigParamNode p) { - CommonToken t = newToken(ScribbleParser.SIGPARAMDECL); + t = newToken(t, ScribbleParser.SIGPARAMDECL); SigParamDecl n = new SigParamDecl(t); // Cf. Scribble.g children order n.addChild(p); @@ -433,9 +449,9 @@ public SigParamDecl SigParamDecl(SigParamNode p) } @Override - public GProtoDef GProtoDef(GProtoBlock block) + public GProtoDef GProtoDef(Token t, GProtoBlock block) { - CommonToken t = newToken(ScribbleParser.GPROTODEF); + t = newToken(t, ScribbleParser.GPROTODEF); GProtoDef n = new GProtoDef(t); n.addChild(block); del(n, new GProtocolDefDel()); @@ -443,9 +459,9 @@ public GProtoDef GProtoDef(GProtoBlock block) } @Override - public GProtoBlock GProtoBlock(GInteractionSeq seq) + public GProtoBlock GProtoBlock(Token t, GInteractionSeq seq) { - CommonToken t = newToken(ScribbleParser.GPROTOBLOCK); + t = newToken(t, ScribbleParser.GPROTOBLOCK); GProtoBlock n = new GProtoBlock(t); n.addChild(seq); del(n, new GProtocolBlockDel()); @@ -453,9 +469,9 @@ public GProtoBlock GProtoBlock(GInteractionSeq seq) } @Override - public GInteractionSeq GInteractionSeq(List elems) + public GInteractionSeq GInteractionSeq(Token t, List elems) { - CommonToken t = newToken(ScribbleParser.GINTERSEQ); + t = newToken(t, ScribbleParser.GINTERSEQ); GInteractionSeq n = new GInteractionSeq(t); n.addChildren(elems); del(n, new GInteractionSeqDel()); @@ -463,9 +479,9 @@ public GInteractionSeq GInteractionSeq(List elems) } @Override - public SigLitNode SigLitNode(OpNode op, PayElemList pay) + public SigLitNode SigLitNode(Token t, OpNode op, PayElemList pay) { - CommonToken t = newToken(ScribbleParser.SIG_LIT); + t = newToken(t, ScribbleParser.SIG_LIT); SigLitNode n = new SigLitNode(t); n.addChild(op); n.addChild(pay); @@ -474,9 +490,9 @@ public SigLitNode SigLitNode(OpNode op, PayElemList pay) } @Override - public PayElemList PayElemList(List> elems) + public PayElemList PayElemList(Token t, List> elems) { - CommonToken t = newToken(ScribbleParser.PAYELEM_LIST); + t = newToken(t, ScribbleParser.PAYELEM_LIST); PayElemList n = new PayElemList(t); n.addChildren(elems); del(n, createDefaultDelegate()); @@ -484,10 +500,10 @@ public PayElemList PayElemList(List> elems) } @Override - public UnaryPayElem UnaryPayElem( + public UnaryPayElem UnaryPayElem(Token t, PayElemNameNode name) { - CommonToken t = newToken(ScribbleParser.UNARY_PAYELEM); + t = newToken(t, ScribbleParser.UNARY_PAYELEM); UnaryPayElem n = new UnaryPayElem<>(t); // Cf. Scribble.g children order n.addChild(name); @@ -496,9 +512,10 @@ public UnaryPayElem UnaryPayElem( } @Override - public GDelegPayElem GDelegPayElem(GProtoNameNode proto, RoleNode role) + public GDelegPayElem GDelegPayElem(Token t, GProtoNameNode proto, + RoleNode role) { - CommonToken t = newToken(ScribbleParser.DELEG_PAYELEM); + t = newToken(t, ScribbleParser.DELEG_PAYELEM); GDelegPayElem n = new GDelegPayElem(t); n.addChild(proto); n.addChild(role); @@ -508,9 +525,9 @@ public GDelegPayElem GDelegPayElem(GProtoNameNode proto, RoleNode role) } @Override - public GConnect GConnect(RoleNode src, MsgNode msg, RoleNode dst) + public GConnect GConnect(Token t, RoleNode src, MsgNode msg, RoleNode dst) { - CommonToken t = newToken(ScribbleParser.GCONNECT); + t = newToken(t, ScribbleParser.GCONNECT); GConnect n = new GConnect(t); n.addChild(msg); n.addChild(src); @@ -520,9 +537,9 @@ public GConnect GConnect(RoleNode src, MsgNode msg, RoleNode dst) } @Override - public GDisconnect GDisconnect(RoleNode left, RoleNode right) + public GDisconnect GDisconnect(Token t, RoleNode left, RoleNode right) { - CommonToken t = newToken(ScribbleParser.GDCONN); + t = newToken(t, ScribbleParser.GDCONN); GDisconnect n = new GDisconnect(t); n.addChild(left); n.addChild(right); @@ -531,10 +548,10 @@ public GDisconnect GDisconnect(RoleNode left, RoleNode right) } @Override - public GMsgTransfer GMsgTransfer(RoleNode src, + public GMsgTransfer GMsgTransfer(Token t, RoleNode src, MsgNode msg, List dsts) { - CommonToken t = newToken(ScribbleParser.GMSGTRANSFER); + t = newToken(t, ScribbleParser.GMSGTRANSFER); GMsgTransfer n = new GMsgTransfer(t); n.addChild(msg); n.addChild(src); @@ -544,9 +561,9 @@ public GMsgTransfer GMsgTransfer(RoleNode src, } @Override - public GWrap GWrap(RoleNode src, RoleNode dst) + public GWrap GWrap(Token t, RoleNode src, RoleNode dst) { - CommonToken t = newToken(ScribbleParser.GWRAP); + t = newToken(t, ScribbleParser.GWRAP); GWrap n = new GWrap(t); n.addChild(src); n.addChild(dst); @@ -555,9 +572,9 @@ public GWrap GWrap(RoleNode src, RoleNode dst) } @Override - public GContinue GContinue(RecVarNode rv) + public GContinue GContinue(Token t, RecVarNode rv) { - CommonToken t = newToken(ScribbleParser.GCONTINUE); + t = newToken(t, ScribbleParser.GCONTINUE); GContinue n = new GContinue(t); n.addChild(rv); del(n, new GContinueDel()); @@ -565,9 +582,10 @@ public GContinue GContinue(RecVarNode rv) } @Override - public GDo GDo(RoleArgList rs, NonRoleArgList as, GProtoNameNode proto) + public GDo GDo(Token t, RoleArgList rs, NonRoleArgList as, + GProtoNameNode proto) { - CommonToken t = newToken(ScribbleParser.GDO); + t = newToken(t, ScribbleParser.GDO); GDo n = new GDo(t); n.addChild(proto); n.addChild(rs); @@ -577,9 +595,9 @@ public GDo GDo(RoleArgList rs, NonRoleArgList as, GProtoNameNode proto) } @Override - public RoleArgList RoleArgList(List rs) + public RoleArgList RoleArgList(Token t, List rs) { - CommonToken t = newToken(ScribbleParser.ROLEARG_LIST); + t = newToken(t, ScribbleParser.ROLEARG_LIST); RoleArgList n = new RoleArgList(t); n.addChildren(rs); del(n, new RoleArgListDel()); @@ -587,9 +605,9 @@ public RoleArgList RoleArgList(List rs) } @Override - public RoleArg RoleArg(RoleNode r) + public RoleArg RoleArg(Token t, RoleNode r) { - CommonToken t = newToken(ScribbleParser.ROLEARG); + t = newToken(t, ScribbleParser.ROLEARG); RoleArg n = new RoleArg(t); n.addChild(r); del(n, createDefaultDelegate()); @@ -597,9 +615,9 @@ public RoleArg RoleArg(RoleNode r) } @Override - public NonRoleArgList NonRoleArgList(List as) + public NonRoleArgList NonRoleArgList(Token t, List as) { - CommonToken t = newToken(ScribbleParser.NONROLEARG_LIST); + t = newToken(t, ScribbleParser.NONROLEARG_LIST); NonRoleArgList n = new NonRoleArgList(t); n.addChildren(as); del(n, new NonRoleArgListDel()); @@ -607,9 +625,9 @@ public NonRoleArgList NonRoleArgList(List as) } @Override - public NonRoleArg NonRoleArg(NonRoleArgNode arg) + public NonRoleArg NonRoleArg(Token t, NonRoleArgNode arg) { - CommonToken t = newToken(ScribbleParser.NONROLEARG); + t = newToken(t, ScribbleParser.NONROLEARG); NonRoleArg n = new NonRoleArg(t); n.addChild(arg); del(n, createDefaultDelegate()); @@ -617,9 +635,9 @@ public NonRoleArg NonRoleArg(NonRoleArgNode arg) } @Override - public GChoice GChoice(RoleNode subj, List blocks) + public GChoice GChoice(Token t, RoleNode subj, List blocks) { - CommonToken t = newToken(ScribbleParser.GCHOICE); + t = newToken(t, ScribbleParser.GCHOICE); GChoice n = new GChoice(t); n.addChild(subj); n.addChildren(blocks); @@ -628,10 +646,9 @@ public GChoice GChoice(RoleNode subj, List blocks) } @Override - public GRecursion GRecursion(RecVarNode rv, - GProtoBlock block) + public GRecursion GRecursion(Token t, RecVarNode rv, GProtoBlock block) { - CommonToken t = newToken(ScribbleParser.GRECURSION); + t = newToken(t, ScribbleParser.GRECURSION); GRecursion n = new GRecursion(t); n.addChild(rv); n.addChild(block); From 85724b31dcd8ee3d9e8beb97e1526328ab731c71 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 20:46:31 +0100 Subject: [PATCH 284/539] Continued: cleaning up ast class names. --- .../java/org/scribble/ast/AstFactory.java | 8 +- .../main/java/org/scribble/ast/Choice.java | 11 +- .../java/org/scribble/ast/ConnectAction.java | 2 +- .../main/java/org/scribble/ast/Continue.java | 17 +- .../java/org/scribble/ast/DataParamDecl.java | 3 +- .../org/scribble/ast/DirectedInteraction.java | 21 +- .../org/scribble/ast/DisconnectAction.java | 17 +- .../src/main/java/org/scribble/ast/Do.java | 32 ++- .../src/main/java/org/scribble/ast/DoArg.java | 17 +- .../main/java/org/scribble/ast/DoArgList.java | 19 +- .../java/org/scribble/ast/ImportModule.java | 17 +- .../java/org/scribble/ast/InteractionSeq.java | 17 +- .../main/java/org/scribble/ast/Module.java | 20 +- .../java/org/scribble/ast/ModuleDecl.java | 33 ++- .../main/java/org/scribble/ast/MsgNode.java | 2 +- ...{MessageTransfer.java => MsgTransfer.java} | 6 +- .../java/org/scribble/ast/NonProtoDecl.java | 63 ++--- .../java/org/scribble/ast/NonRoleArgNode.java | 8 +- .../scribble/ast/NonRoleParamDeclList.java | 25 +- .../main/java/org/scribble/ast/ParamDecl.java | 9 +- .../java/org/scribble/ast/ParamDeclList.java | 33 +-- .../java/org/scribble/ast/PayElemList.java | 35 +-- .../java/org/scribble/ast/ProtoBlock.java | 15 +- .../main/java/org/scribble/ast/ProtoDecl.java | 61 ++--- .../main/java/org/scribble/ast/ProtoDef.java | 15 +- .../java/org/scribble/ast/ProtoHeader.java | 32 ++- .../main/java/org/scribble/ast/Recursion.java | 17 +- .../java/org/scribble/ast/RoleArgList.java | 6 - .../java/org/scribble/ast/ScribNodeBase.java | 28 +-- .../java/org/scribble/ast/SigLitNode.java | 22 +- .../java/org/scribble/ast/UnaryPayElem.java | 17 +- .../scribble/ast/global/GDelegPayElem.java | 11 +- .../java/org/scribble/ast/global/GDo.java | 4 +- .../org/scribble/ast/global/GMsgTransfer.java | 4 +- .../java/org/scribble/ast/global/GWrap.java | 11 +- .../ast/name/qualified/DataNameNode.java | 2 +- .../ast/name/qualified/SigNameNode.java | 6 +- .../ast/name/simple/AmbigNameNode.java | 2 +- .../ast/name/simple/DataParamNode.java | 2 +- .../ast/name/simple/SigParamNode.java | 4 +- .../java/org/scribble/del/DoArgListDel.java | 4 +- .../src/main/java/org/scribble/del/DoDel.java | 8 +- .../org/scribble/del/NonRoleArgListDel.java | 6 +- .../org/scribble/del/global/GConnectDel.java | 2 +- .../del/global/GDelegationElemDel.java | 6 +- .../del/global/GMessageTransferDel.java | 2 +- .../scribble/del/global/GProtocolDeclDel.java | 2 +- .../del/name/simple/AmbigNameNodeDel.java | 16 +- .../scribble/{lang/Lang.java => job/Job.java} | 63 +++-- .../LangConfig.java => job/JobConfig.java} | 10 +- .../LangContext.java => job/JobContext.java} | 15 +- .../ModuleContextBuilder.java} | 9 +- .../java/org/scribble/visit/AstVisitor.java | 8 +- .../org/scribble/visit/GTypeTranslator.java | 6 +- .../scribble/visit/ModuleContextVisitor.java | 8 +- .../org/scribble/visit/NameDisambiguator.java | 4 +- .../org/scribble/visit/SimpleAstVisitor.java | 10 +- .../java/org/scribble/cli/CommandLine.java | 152 ++++++------ .../org/scribble/codegen/java/ApiGen.java | 16 +- .../codegen/java/JEndpointApiGenerator.java | 18 +- .../callbackapi/CBEndpointApiGenerator.java | 26 +- .../callbackapi/CBEndpointApiGenerator3.java | 40 ++-- .../java/sessionapi/SessionApiGenerator.java | 10 +- .../StateChannelApiGenerator.java | 20 +- .../ioifaces/IOInterfacesGenerator.java | 12 +- .../statetype/STStateChanAPIBuilder.java | 11 +- .../scribble/core/job/{Job.java => Core.java} | 34 +-- .../core/job/{JobArgs.java => CoreArgs.java} | 2 +- .../job/{JobConfig.java => CoreConfig.java} | 6 +- .../job/{JobContext.java => CoreContext.java} | 16 +- .../{LangConstants.java => Constants.java} | 4 +- .../scribble/core/lang/global/GProtocol.java | 40 ++-- .../scribble/core/lang/local/LProtocol.java | 8 +- .../core/model/endpoint/AutGraphParser.java | 12 +- .../core/model/global/SGraphBuilderUtil.java | 34 +-- .../scribble/core/model/global/SModel.java | 26 +- .../org/scribble/core/visit/STypeInliner.java | 8 +- .../core/visit/global/GTypeInliner.java | 8 +- .../core/visit/global/InlinedProjector.java | 8 +- .../scribble/core/visit/global/Projector.java | 16 +- .../core/visit/local/EGraphBuilder.java | 10 +- .../core/visit/local/LTypeInliner.java | 8 +- .../src/main/java/org/scribble/main/Main.java | 36 +-- .../resource/loader/ScribModuleLoader.java | 2 +- .../scribble => ast}/AstFactoryImpl.java | 223 +++++++----------- .../scribble => ast}/DelDecoratorImpl.java | 2 +- .../{scribble => }/ScribAntlrWrapper.java | 7 +- .../{scribble => }/ScribTreeAdaptor.java | 15 +- scribble-test/src/test/scrib/tmp/Test.scr | 7 +- 89 files changed, 893 insertions(+), 797 deletions(-) rename scribble-ast/src/main/java/org/scribble/ast/{MessageTransfer.java => MsgTransfer.java} (85%) rename scribble-ast/src/main/java/org/scribble/{lang/Lang.java => job/Job.java} (77%) rename scribble-ast/src/main/java/org/scribble/{lang/LangConfig.java => job/JobConfig.java} (85%) rename scribble-ast/src/main/java/org/scribble/{lang/LangContext.java => job/JobContext.java} (93%) rename scribble-ast/src/main/java/org/scribble/{lang/context/ModuleContextCollector.java => job/ModuleContextBuilder.java} (97%) rename scribble-core/src/main/java/org/scribble/core/job/{Job.java => Core.java} (93%) rename scribble-core/src/main/java/org/scribble/core/job/{JobArgs.java => CoreArgs.java} (98%) rename scribble-core/src/main/java/org/scribble/core/job/{JobConfig.java => CoreConfig.java} (86%) rename scribble-core/src/main/java/org/scribble/core/job/{JobContext.java => CoreContext.java} (96%) rename scribble-core/src/main/java/org/scribble/core/lang/{LangConstants.java => Constants.java} (93%) rename scribble-parser/src/main/java/org/scribble/{parser/scribble => ast}/AstFactoryImpl.java (81%) rename scribble-parser/src/main/java/org/scribble/{parser/scribble => ast}/DelDecoratorImpl.java (99%) rename scribble-parser/src/main/java/org/scribble/parser/{scribble => }/ScribAntlrWrapper.java (95%) rename scribble-parser/src/main/java/org/scribble/parser/{scribble => }/ScribTreeAdaptor.java (97%) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index b1be4383e..01915b149 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -75,10 +75,10 @@ Module Module(Token t, ModuleDecl mdecl, List> imports, ImportModule ImportModule(Token t, ModuleNameNode modname, ModuleNameNode alias); - DataDecl DataDecl(Token t, IdNode schema, IdNode extName, IdNode extSource, - DataNameNode name); - SigDecl SigDecl(Token t, IdNode schema, IdNode extName, IdNode extSource, - SigNameNode name); + DataDecl DataDecl(Token t, IdNode schema, ExtIdNode extName, + ExtIdNode extSource, DataNameNode name); + SigDecl SigDecl(Token t, IdNode schema, ExtIdNode extName, + ExtIdNode extSource, SigNameNode name); GProtoDecl GProtoDecl(Token t, ProtoModList mods, GProtoHeader header, GProtoDef def); diff --git a/scribble-ast/src/main/java/org/scribble/ast/Choice.java b/scribble-ast/src/main/java/org/scribble/ast/Choice.java index 8824fa305..cb9ace0c8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Choice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Choice.java @@ -49,6 +49,14 @@ public RoleNode getSubjectChild() // Override in concrete sub for cast public abstract List> getBlockChildren(); + // "add", not "set" + public void addChildren1(RoleNode subj, List> blocks) + { + // Cf. above getters and Scribble.g children order + addChild(subj); + addChildren(blocks); + } + @Override public abstract Choice dupNode(); @@ -56,8 +64,7 @@ public Choice reconstruct(RoleNode subj, List> blocks) { Choice dup = dupNode(); - dup.addChild(subj); - dup.addChildren(blocks); + dup.addChildren1(subj, blocks); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java b/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java index da85ea9f2..429648825 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java @@ -50,7 +50,7 @@ public RoleNode getDestinationChild() protected boolean isUnitMessage() { MsgNode n = getMessageNodeChild(); - if (!n.isMessageSigNode()) + if (!n.isSigLitNode()) { return false; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/Continue.java b/scribble-ast/src/main/java/org/scribble/ast/Continue.java index 80cd87efd..424e91101 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Continue.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Continue.java @@ -37,6 +37,13 @@ protected Continue(Continue node) super(node); } + // "add", not "set" + public void addChildren1(RecVarNode rv) + { + // Cf. above getters and Scribble.g children order + addChild(rv); + } + public abstract Continue dupNode(); public RecVarNode getRecVarChild() @@ -44,12 +51,12 @@ public RecVarNode getRecVarChild() return (RecVarNode) getChild(RECVAR_CHILD_INDEX); } - public Continue reconstruct(RecVarNode recvar) + public Continue reconstruct(RecVarNode rv) { - Continue r = dupNode(); - r.addChild(recvar); - r.setDel(del()); // No copy - return r; + Continue dup = dupNode(); + dup.addChildren1(rv); + dup.setDel(del()); // No copy + return dup; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java index 48298bc40..50f7add79 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java @@ -38,7 +38,7 @@ public DataParamNode getNameNodeChild() { return (DataParamNode) getRawNameNodeChild(); } - + @Override public DataParamDecl dupNode() { @@ -46,7 +46,6 @@ public DataParamDecl dupNode() } @Override - //public Name getDeclName() public DataName getDeclName() { return (DataName) getNameNodeChild().toName(); diff --git a/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java index 5f2a56231..b1c0896a3 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java @@ -65,19 +65,26 @@ public final List getDestinationRoles() return getDestinationChildren().stream().map(rn -> rn.toName()) .collect(Collectors.toList()); } + + // "add", not "set" + public void addChildren1(MsgNode msg, RoleNode src, List dsts) + { + // Cf. above getters and Scribble.g children order + addChild(msg); + addChild(src); + addChildren(dsts); + } public abstract DirectedInteraction dupNode(); public DirectedInteraction reconstruct(MsgNode msg, RoleNode src, - List dests) + List dsts) { - DirectedInteraction mt = dupNode(); + DirectedInteraction dup = dupNode(); // Same order as getter indices - mt.addChild(msg); - mt.addChild(src); - mt.addChildren(dests); - mt.setDel(del()); // No copy - return mt; + dup.addChildren1(msg, src, dsts); + dup.setDel(del()); // No copy + return dup; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java b/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java index b351c640b..14459bcf8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java @@ -49,16 +49,23 @@ public RoleNode getRightChild() { return (RoleNode) getChild(RIGHT_CHILD_INDEX); } + + // "add", not "set" + public void addChildren1(RoleNode left, RoleNode right) + { + // Cf. above getters and Scribble.g children order + addChild(left); + addChild(right); + } public abstract DisconnectAction dupNode(); public DisconnectAction reconstruct(RoleNode left, RoleNode right) { - DisconnectAction n = dupNode(); - n.addChild(left); - n.addChild(right); - n.setDel(del()); // No copy - return n; + DisconnectAction dup = dupNode(); + dup.addChildren1(left, right); + dup.setDel(del()); // No copy + return dup; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/Do.java b/scribble-ast/src/main/java/org/scribble/ast/Do.java index e832ae2bd..f84bbeea0 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Do.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Do.java @@ -21,7 +21,7 @@ import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; -import org.scribble.lang.LangContext; +import org.scribble.job.JobContext; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -57,18 +57,26 @@ public RoleArgList getRoleListChild() { return (RoleArgList) getChild(ROLE_LIST_CHILD_INDEX); } + + // "add", not "set" + public void addChildren1(ProtoNameNode proto, NonRoleArgList as, + RoleArgList rs) + { + // Cf. above getters and Scribble.g children order + addChild(proto); // Order re. getter indices + addChild(as); + addChild(rs); + } public abstract Do dupNode(); - public Do reconstruct(RoleArgList roles, NonRoleArgList args, - ProtoNameNode proto) + public Do reconstruct(ProtoNameNode proto, NonRoleArgList as, + RoleArgList rs) { - Do sig = dupNode(); - sig.addChild(proto); // Order re. getter indices - sig.addChild(args); - sig.addChild(roles); - sig.setDel(del()); // No copy - return sig; + Do dup = dupNode(); + dup.addChildren1(proto, as, rs); + dup.setDel(del()); // No copy + return dup; } @Override @@ -78,7 +86,7 @@ public Do visitChildren(AstVisitor nv) throws ScribException NonRoleArgList al = (NonRoleArgList) visitChild(getNonRoleListChild(), nv); ProtoNameNode proto = visitChildWithClassEqualityCheck(this, getProtocolNameNode(), nv); - return reconstruct(ril, al, proto); + return reconstruct(proto, al, ril); } // FIXME: mcontext now redundant because NameDisambiguator converts all targets to full names -- NO: currently disamb doesn't @@ -91,10 +99,10 @@ public ProtoName getTargetProtocolDeclFullName(ModuleContext mcontext) } // CHECKME: mcontext redundant, because redundant for getTargetProtocolDeclFullName - public abstract ProtoDecl getTargetProtocolDecl(LangContext jcontext, + public abstract ProtoDecl getTargetProtocolDecl(JobContext jcontext, ModuleContext mcontext); - public Role getTargetRoleParameter(LangContext jcontext, + public Role getTargetRoleParameter(JobContext jcontext, ModuleContext mcontext, Role role) { Iterator args = getRoleListChild().getRoles().iterator(); diff --git a/scribble-ast/src/main/java/org/scribble/ast/DoArg.java b/scribble-ast/src/main/java/org/scribble/ast/DoArg.java index 30bd03113..5af2052d3 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DoArg.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DoArg.java @@ -14,7 +14,6 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -37,16 +36,22 @@ public DoArg(DoArg node) } public abstract T getArgNodeChild(); + + // "add", not "set" + public void addChildren1(T arg) + { + // Cf. above getters and Scribble.g children order + addChild(arg); + } public abstract DoArg dupNode(); public DoArg reconstruct(T arg) { - DoArg sig = dupNode(); - sig.addChild(arg); - ScribDel del = del(); - sig.setDel(del); // No copy - return sig; + DoArg dup = dupNode(); + dup.addChildren1(arg); + dup.setDel(del()); // No copy + return dup; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java b/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java index 3284d7103..bdb951324 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java @@ -44,9 +44,11 @@ protected List getRawArgChildren() public abstract List getArgChildren(); - public int length() + // "add", not "set" + public void addChildren1(List args) { - return getChildCount(); + // Cf. above getters and Scribble.g children order + addChildren(args); } @Override @@ -54,10 +56,10 @@ public int length() public DoArgList reconstruct(List args) { - DoArgList n = dupNode(); - n.addChildren(args); - n.setDel(del()); // No copy - return n; + DoArgList dup = dupNode(); + dup.addChildren1(args); + dup.setDel(del()); // No copy + return dup; } @Override @@ -67,6 +69,11 @@ public DoArgList visitChildren(AstVisitor nv) throws ScribException visitChildListWithClassEqualityCheck(this, getArgChildren(), nv); return reconstruct(nds); } + + public int length() + { + return getChildCount(); + } // Like HeaderParamDeclList, without enclosing braces -- added by subclasses @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java b/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java index 32cdd6a08..589e366c9 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java @@ -52,6 +52,17 @@ public ModuleNameNode getAliasNameNodeChild() return (ModuleNameNode) getChild(ALIAS_CHILD); } + // "add", not "set" + public void addChildren1(ModuleNameNode modname, ModuleNameNode alias) + { + // Cf. above getters and Scribble.g children order + addChild(modname); + if (alias != null) + { + addChild(alias); + } + } + // Cf. CommonTree#dupNode @Override public ImportModule dupNode() @@ -63,11 +74,7 @@ public ImportModule dupNode() public ImportModule reconstruct(ModuleNameNode modname, ModuleNameNode alias) { ImportModule dup = dupNode(); - dup.addChild(modname); - if (alias != null) - { - dup.addChild(alias); - } + dup.addChildren1(modname, alias); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java b/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java index ca6524088..feb1a4baa 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java +++ b/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java @@ -38,19 +38,21 @@ public InteractionSeq(InteractionSeq node) } public abstract List> getInteractionChildren(); - - public boolean isEmpty() + + // "add", not "set" + public void addChildren1(List> elems) { - return getChildCount() == 0; //this.inters.isEmpty(); + // Cf. above getters and Scribble.g children order + addChildren(elems); } @Override public abstract InteractionSeq dupNode(); - public InteractionSeq reconstruct(List> ins) + public InteractionSeq reconstruct(List> elems) { InteractionSeq dup = dupNode(); - ins.forEach(x -> dup.addChild(x)); + dup.addChildren1(elems); dup.setDel(del()); // No copy return dup; } @@ -81,6 +83,11 @@ public ScribNode visitChildren(AstVisitor nv) throws ScribException return reconstruct(actions); } + public boolean isEmpty() + { + return getChildCount() == 0; //this.inters.isEmpty(); + } + @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/Module.java b/scribble-ast/src/main/java/org/scribble/ast/Module.java index fd7e174f8..691e98599 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Module.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Module.java @@ -86,9 +86,15 @@ private List getMemberChildren( return res; } - public ModuleName getFullModuleName() + // "add", not "set" + public void addChildren1(ModuleDecl moddecl, List> imports, + List> data, List> protos) { - return getModuleDeclChild().getFullModuleName(); + // Cf. above getters and Scribble.g children order + addChild(moddecl); + addChildren(imports); + addChildren(data); + addChildren(protos); } // Cf. CommonTree#dupNode @@ -103,10 +109,7 @@ protected Module reconstruct(ModuleDecl moddecl, List> imports, List> data, List> protos) { Module dup = dupNode(); - dup.addChild(moddecl); - dup.addChildren(imports); - dup.addChildren(data); - dup.addChildren(protos); + dup.addChildren1(moddecl, imports, data, protos); dup.setDel(del()); // No copy return dup; } @@ -182,6 +185,11 @@ public GProtoDecl getGProtocolDeclChild( return res.get(); } + public ModuleName getFullModuleName() + { + return getModuleDeclChild().getFullModuleName(); + } + @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java index 36297f41e..6681f6223 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java @@ -34,19 +34,6 @@ protected ModuleDecl(ModuleDecl node) { super(node); } - - public ModuleName getFullModuleName() - { - return (ModuleName) getNameNodeChild().toName(); - } - - protected ModuleDecl reconstruct(ModuleNameNode name) - { - ModuleDecl dup = dupNode(); - dup.addChild(name); - dup.setDel(del()); // No copy - return dup; - } @Override public ModuleNameNode getNameNodeChild() @@ -54,6 +41,13 @@ public ModuleNameNode getNameNodeChild() return (ModuleNameNode) getRawNameNodeChild(); } + // "add", not "set" + public void addChildren1(ModuleNameNode name) + { + // Cf. above getters and Scribble.g children order + addChild(name); + } + // Cf. CommonTree#dupNode @Override public ModuleDecl dupNode() @@ -61,6 +55,14 @@ public ModuleDecl dupNode() return new ModuleDecl(this); } + protected ModuleDecl reconstruct(ModuleNameNode name) + { + ModuleDecl dup = dupNode(); + dup.addChildren1(name); + dup.setDel(del()); // No copy + return dup; + } + @Override public ModuleDecl visitChildren(AstVisitor nv) throws ScribException { @@ -68,6 +70,11 @@ public ModuleDecl visitChildren(AstVisitor nv) throws ScribException return reconstruct(name); } + public ModuleName getFullModuleName() + { + return (ModuleName) getNameNodeChild().toName(); + } + @Override public ModuleName getDeclName() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/MsgNode.java b/scribble-ast/src/main/java/org/scribble/ast/MsgNode.java index d900ff7a7..26c4eaf5f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/MsgNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/MsgNode.java @@ -18,7 +18,7 @@ // A sig kind node: MessageSignatureNode, MessageSignatureNameNode or NonRoleParamNode public interface MsgNode extends NonRoleArgNode { - Msg toMessage(); + Msg toMsg(); //Arg toArg(); // Not possible due to "diamond" with PayloadElemNameNode at AmbigNameNode } diff --git a/scribble-ast/src/main/java/org/scribble/ast/MessageTransfer.java b/scribble-ast/src/main/java/org/scribble/ast/MsgTransfer.java similarity index 85% rename from scribble-ast/src/main/java/org/scribble/ast/MessageTransfer.java rename to scribble-ast/src/main/java/org/scribble/ast/MsgTransfer.java index ebfe3ce56..b73eb146d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/MessageTransfer.java +++ b/scribble-ast/src/main/java/org/scribble/ast/MsgTransfer.java @@ -16,17 +16,17 @@ import org.antlr.runtime.Token; import org.scribble.core.type.kind.ProtoKind; -public abstract class MessageTransfer +public abstract class MsgTransfer extends DirectedInteraction { // ScribTreeAdaptor#create constructor - public MessageTransfer(Token t) + public MsgTransfer(Token t) { super(t); } // Tree#dupNode constructor - public MessageTransfer(MessageTransfer node) + public MsgTransfer(MsgTransfer node) { super(node); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java b/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java index 8ea244e93..2b0264af5 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java @@ -60,21 +60,6 @@ public ExtIdNode getExtSourceChild() { return (ExtIdNode) getChild(EXTSOURCE_NODE_CHILD_INDEX); } - - public String getSchema() - { - return getSchemaChild().getText(); - } - - public String getExtName() - { - return getExtNameChild().getText(); - } - - public String getExtSource() - { - return getExtSourceChild().getText(); - } // CHECKME: maybe move to ModuleMember public boolean isDataTypeDecl() @@ -86,20 +71,28 @@ public boolean isMessageSigNameDecl() { return false; } + + // "add", not "set" + public void addChildren1(NameNode name, IdNode schema, + ExtIdNode extName, ExtIdNode extSource) + { + // Cf. above getters and Scribble.g children order + addChild(name); + addChild(schema); + addChild(extName); + addChild(extSource); + } @Override public abstract NonProtoDecl dupNode(); public NonProtoDecl reconstruct(NameNode name, IdNode schema, - IdNode extName, IdNode extSource) + ExtIdNode extName, ExtIdNode extSource) { - NonProtoDecl n = dupNode(); - n.addChild(name); - n.addChild(schema); - n.addChild(extName); - n.addChild(extSource); - n.setDel(del()); // No copy - return n; + NonProtoDecl dup = dupNode(); + dup.addChildren1(name, schema, extName, extSource); + dup.setDel(del()); // No copy + return dup; } @Override @@ -108,12 +101,24 @@ public NonProtoDecl visitChildren(AstVisitor nv) { NameNode name = (NameNode) visitChildWithClassEqualityCheck(this, getNameNodeChild(), nv); - IdNode schema = //(AmbigNameNode) visitChildWithClassEqualityCheck(this, getSchemaNodeChild(), nv); - getSchemaChild(); // AmbigNameNode currently have no del, so not visited -- CHECKME: now IdNode? - IdNode extName = //(AmbigNameNode) visitChildWithClassEqualityCheck(this, getExtNameNodeChild(), nv); - getExtNameChild(); - IdNode extSource = //(AmbigNameNode) visitChildWithClassEqualityCheck(this, getExtSourceNodeChild(), nv); - getExtNameChild(); + IdNode schema = getSchemaChild(); + ExtIdNode extName = getExtNameChild(); + ExtIdNode extSource = getExtNameChild(); return reconstruct(name, schema, extName, extSource); } + + public String getSchema() + { + return getSchemaChild().getText(); + } + + public String getExtName() + { + return getExtNameChild().getText(); + } + + public String getExtSource() + { + return getExtSourceChild().getText(); + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgNode.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgNode.java index 6221227e4..8a1f0ff4e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgNode.java @@ -25,17 +25,17 @@ public interface NonRoleArgNode extends DoArgNode // Not kinded: point of this interface is don't know which kind the node is -- so use the "is" methods -- cf. AmbigNameNode inherits both sig and data kind // And not all values are names, e.g. message sigs - default boolean isMessageSigNode() + default boolean isSigLitNode() { return false; } - default boolean isMessageSigNameNode() + default boolean isSigNameNode() { return false; } - default boolean isDataTypeNameNode() + default boolean isDataNameNode() { return false; } @@ -45,7 +45,7 @@ default boolean isSigParamNode() return false; } - default boolean isTypeParamNode() + default boolean isDataParamNode() { return false; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java index d1caf604a..4fa7c0996 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java @@ -19,7 +19,6 @@ import org.antlr.runtime.Token; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.MemberName; -import org.scribble.del.ScribDel; // Can contain "mixed" type/sig kinds // Typing a bit awkward that this list has to use NonRoleParamKind as the "concrete" kind, while the NonRoleParamDecl elements use the actual concrete kind @@ -49,10 +48,11 @@ public List> getDeclChildren() return cast; } - public List> getParameters() + // "add", not "set" + public void addChildren1(List> ds) { - return getDeclChildren().stream().map(decl -> decl.getDeclName()) - .collect(Collectors.toList()); + // Cf. above getters and Scribble.g children order + super.addChildren(ds); } @Override @@ -63,13 +63,18 @@ public NonRoleParamDeclList dupNode() @Override public NonRoleParamDeclList reconstruct( - List> decls) + List> ds) { - NonRoleParamDeclList sig = dupNode(); - sig.addChildren(decls); - ScribDel del = del(); - sig.setDel(del); // No copy - return sig; + NonRoleParamDeclList dup = dupNode(); + dup.addChildren1(ds); + dup.setDel(del()); // No copy + return dup; + } + + public List> getParams() + { + return getDeclChildren().stream().map(decl -> decl.getDeclName()) + .collect(Collectors.toList()); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/ParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ParamDecl.java index 98f84fd6c..a0e06220b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ParamDecl.java @@ -41,12 +41,19 @@ public ParamDecl(ParamDecl node) public abstract String getKeyword(); + // "add", not "set" + public void addChildren1(NameNode name) + { + // Cf. above getters and Scribble.g children order + addChild(name); + } + public abstract ParamDecl dupNode(); public ParamDecl reconstruct(NameNode name) // Always a "simple" name (e.g., like Role), but Type/Sig names are not SimpleNames { ParamDecl dup = dupNode(); - dup.addChild(name); + dup.addChildren1(name); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ParamDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/ParamDeclList.java index 8da45390c..a21a16ab6 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ParamDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ParamDeclList.java @@ -18,7 +18,6 @@ import org.antlr.runtime.Token; import org.scribble.core.type.kind.ParamKind; -import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -39,28 +38,24 @@ public ParamDeclList(ParamDeclList node) } public abstract List> getDeclChildren(); - - public final int length() - { - return getDeclChildren().size(); - } - public final boolean isEmpty() + // "add", not "set" + public void addChildren1(List> ds) { - return length() == 0; + // Cf. above getters and Scribble.g children order + super.addChildren(ds); } @Override public abstract ParamDeclList dupNode(); public ParamDeclList reconstruct( - List> decls) + List> ds) { - ParamDeclList n = dupNode(); - n.addChildren(decls); - ScribDel del = del(); - n.setDel(del); // No copy - return n; + ParamDeclList dup = dupNode(); + dup.addChildren1(ds); + dup.setDel(del()); // No copy + return dup; } @Override @@ -71,6 +66,16 @@ public ParamDeclList visitChildren(AstVisitor v) visitChildListWithClassEqualityCheck(this, getDeclChildren(), v); return reconstruct(ps); } + + public final int length() + { + return getDeclChildren().size(); + } + + public final boolean isEmpty() + { + return length() == 0; + } // Without enclosing braces -- added by subclasses @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java b/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java index aed65fa8b..d2bdbcca4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java @@ -43,16 +43,11 @@ List> getElementChildren() .collect(Collectors.toList()); } - public Payload toPayload() - { - List> pts = getElementChildren().stream() - .map(pe -> pe.toPayloadType()).collect(Collectors.toList()); - return new Payload(pts); - } - - public boolean isEmpty() + // "add", not "set" + public void addChildren1(List> elems) { - return getChildCount() == 0; + // Cf. above getters and Scribble.g children order + super.addChildren(elems); } @Override @@ -63,10 +58,10 @@ public PayElemList dupNode() protected PayElemList reconstruct(List> elems) { - PayElemList pay = dupNode(); - pay.addChildren(elems); - pay.setDel(del()); // No copy - return pay; + PayElemList dup = dupNode(); + dup.addChildren1(elems); + dup.setDel(del()); // No copy + return dup; } @Override @@ -77,10 +72,22 @@ public PayElemList visitChildren(AstVisitor nv) throws ScribException return reconstruct(elems); } + public Payload toPayload() + { + List> elems = getElementChildren().stream() + .map(x -> x.toPayloadType()).collect(Collectors.toList()); + return new Payload(elems); + } + + public boolean isEmpty() + { + return getChildCount() == 0; + } + @Override public String toString() { - return "(" + getElementChildren().stream().map(pe -> pe.toString()) + return "(" + getElementChildren().stream().map(x -> x.toString()) .collect(Collectors.joining(", ")) + ")"; } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtoBlock.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoBlock.java index e15bc449c..bc8ce63be 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtoBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoBlock.java @@ -41,16 +41,23 @@ public boolean isEmpty() { return getInteractSeqChild().isEmpty(); } + + // "add", not "set" + public void addChildren1(InteractionSeq seq) + { + // Cf. above getters and Scribble.g children order + addChild(seq); + } @Override public abstract ProtoBlock dupNode(); public ProtoBlock reconstruct(InteractionSeq seq) { - ProtoBlock pd = dupNode(); - pd.addChild(seq); - pd.setDel(del()); // No copy - return pd; + ProtoBlock dup = dupNode(); + dup.addChildren1(seq); + dup.setDel(del()); // No copy + return dup; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java index 2ee900eb9..a9bee391d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java @@ -18,7 +18,6 @@ import org.antlr.runtime.Token; import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.Role; -import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -42,7 +41,14 @@ protected ProtoDecl(ProtoDecl node) super(node); } - public abstract ProtoDecl dupNode(); + public ProtoModList getModifierListChild() + { + return (ProtoModList) getChild(MODLIST_CHILD); + } + + // Implement in subclasses to avoid generic cast + public abstract ProtoHeader getHeaderChild(); + public abstract ProtoDef getDefChild(); public boolean isAux() { @@ -53,46 +59,45 @@ public boolean isExplicit() { return getModifierListChild().hasExplicit(); } - - public ProtoModList getModifierListChild() - { - return (ProtoModList) getChild(MODLIST_CHILD); - } - // Implement in subclasses to avoid generic cast - public abstract ProtoHeader getHeaderChild(); - public abstract ProtoDef getDefChild(); - - public List getRoles() + // "add", not "set" + public void addChildren1(ProtoModList mods, ProtoHeader header, + ProtoDef def) { - // WF disallows unused role declarations - return getHeaderChild().getRoleDeclListChild().getRoles(); + // Cf. above getters and Scribble.g children order + addChild(mods); + addChild(header); + addChild(def); } + + public abstract ProtoDecl dupNode(); - public ProtoDecl reconstruct(ProtoModList mods, - ProtoHeader header, ProtoDef def) - //, ProtocolDeclContext pdcontext, Env env); + public ProtoDecl reconstruct(ProtoModList mods, ProtoHeader header, + ProtoDef def) { - ProtoDecl pd = dupNode(); - ScribDel del = del(); - pd.addChild(mods); - pd.addChild(header); - pd.addChild(def); - pd.setDel(del); // No copy - return pd; + ProtoDecl dup = dupNode(); + dup.addChildren1(mods, header, def); + dup.setDel(del()); // No copy + return dup; } @Override - public ProtoDecl visitChildren(AstVisitor nv) throws ScribException + public ProtoDecl visitChildren(AstVisitor v) throws ScribException { ProtoModList mods = visitChildWithClassEqualityCheck(this, - getModifierListChild(), nv); + getModifierListChild(), v); ProtoHeader header = - visitChildWithClassEqualityCheck(this, getHeaderChild(), nv); - ProtoDef def = visitChildWithClassEqualityCheck(this, getDefChild(), nv); + visitChildWithClassEqualityCheck(this, getHeaderChild(), v); + ProtoDef def = visitChildWithClassEqualityCheck(this, getDefChild(), v); return reconstruct(mods, header, def); } + public List getRoles() + { + // WF disallows unused role declarations + return getHeaderChild().getRoleDeclListChild().getRoles(); + } + @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtoDef.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoDef.java index 02af32f46..1266498bf 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtoDef.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoDef.java @@ -35,15 +35,22 @@ protected ProtoDef(ProtoDef node) super(node); } public abstract ProtoBlock getBlockChild(); + + // "add", not "set" + public void addChildren1(ProtoBlock block) + { + // Cf. above getters and Scribble.g children order + addChild(block); + } public abstract ProtoDef dupNode(); public ProtoDef reconstruct(ProtoBlock block) { - ProtoDef pd = dupNode(); - pd.addChild(block); - pd.setDel(del()); // No copy - return pd; + ProtoDef dup = dupNode(); + dup.addChildren1(block); + dup.setDel(del()); // No copy + return dup; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtoHeader.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoHeader.java index d7f44ce1e..3751d5e68 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtoHeader.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoHeader.java @@ -17,7 +17,6 @@ import org.scribble.ast.name.qualified.ProtoNameNode; import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.ProtoName; -import org.scribble.del.ScribDel; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -56,23 +55,25 @@ public RoleDeclList getRoleDeclListChild() return (RoleDeclList) getChild(ROLEDECLLIST_CHILD); // TODO: swap order with paramdecllist (in grammar) } - public boolean isParamDeclListEmpty() + // "add", not "set" + public void addChildren1(ProtoNameNode name, NonRoleParamDeclList ps, + RoleDeclList rs) { - return getParamDeclListChild().isEmpty(); + // Cf. above getters and Scribble.g children order + addChild(name); + addChild(ps); + addChild(rs); } public abstract ProtoHeader dupNode(); - public ProtoHeader reconstruct(ProtoNameNode name, - RoleDeclList rdl, NonRoleParamDeclList pdl) + public ProtoHeader reconstruct(ProtoNameNode name, NonRoleParamDeclList ps, + RoleDeclList rs) { - ProtoHeader pd = dupNode(); - ScribDel del = del(); - pd.addChild(name); - pd.addChild(pdl); // Cf. above TODO (rdl/pdl child order) - pd.addChild(rdl); - pd.setDel(del); // No copy - return pd; + ProtoHeader dup = dupNode(); + dup.addChildren1(name, ps, rs); + dup.setDel(del()); // No copy + return dup; } @Override @@ -83,7 +84,12 @@ public ProtoHeader visitChildren(AstVisitor nv) throws ScribException RoleDeclList rdl = (RoleDeclList) visitChild(getRoleDeclListChild(), nv); NonRoleParamDeclList pdl = (NonRoleParamDeclList) visitChild(getParamDeclListChild(), nv); - return reconstruct(getNameNodeChild(), rdl, pdl); + return reconstruct(getNameNodeChild(), pdl, rdl); + } + + public boolean isParamDeclListEmpty() + { + return getParamDeclListChild().isEmpty(); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/Recursion.java b/scribble-ast/src/main/java/org/scribble/ast/Recursion.java index f5d4c9cf5..a15b46d68 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Recursion.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Recursion.java @@ -44,16 +44,23 @@ public RecVarNode getRecVarChild() { return (RecVarNode) getChild(RECVAR_CHILD_INDEX); } + + // "add", not "set" + public void addChildren1(RecVarNode recvar, ProtoBlock block) + { + // Cf. above getters and Scribble.g children order + addChild(recvar); + addChild(block); + } public abstract ProtoBlock getBlockChild(); public Recursion reconstruct(RecVarNode recvar, ProtoBlock block) { - Recursion r = dupNode(); - r.addChild(recvar); - r.addChild(block); - r.setDel(del()); // No copy - return r; + Recursion dup = dupNode(); + dup.addChildren1(recvar, block); + dup.setDel(del()); // No copy + return dup; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/RoleArgList.java b/scribble-ast/src/main/java/org/scribble/ast/RoleArgList.java index 011a15c7e..4c3e85fcd 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/RoleArgList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/RoleArgList.java @@ -53,12 +53,6 @@ public RoleArgList dupNode() return new RoleArgList(this); } - @Override - public RoleArgList reconstruct(List args) - { - return (RoleArgList) super.reconstruct(args); - } - @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java index bdb1cf59b..cc3e5e540 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -146,12 +146,12 @@ public final ScribNodeBase del(ScribDel del) // Non-defensive //protected // CHECKME: make protected again after refactoring ast to parser ? - public final void setDel(ScribDel del) + protected final void setDel(ScribDel del) { this.del = del; } - // Defensive helper with cast check + // Defensive helper with cast check -- currently unused public static final T del(T n, ScribDel del) { ScribNodeBase copy = ((ScribNodeBase) n).clone(); // Need deep clone, since children have parent field @@ -160,43 +160,43 @@ public static final T del(T n, ScribDel del) } @Override - public ScribNode accept(AstVisitor nv) throws ScribException + public ScribNode accept(AstVisitor v) throws ScribException { - return nv.visit(this); + return v.visit(this); } @Override - public ScribNode visitChildren(AstVisitor nv) throws ScribException + public ScribNode visitChildren(AstVisitor v) throws ScribException { return this; } // Used to be more relevant, previously there was an explicit parent parameter - protected ScribNode visitChild(ScribNode child, AstVisitor nv) throws ScribException + protected ScribNode visitChild(ScribNode child, AstVisitor v) throws ScribException { - return nv.visit(child); // cf. child.accept(nv) ? + return v.visit(child); // cf. child.accept(v) ? } // FIXME: remove parent parameter, to make uniform with visitChild // Used when a generic cast would otherwise be needed (non-generic children casts don't need this) -- doesn't check any generic parameters, relies on concrete values being instances of non-parameterised types // Subtype constraint on visited could still be too restrictive, e.g. AmbigNameNodeDel (although it doesn't matter there), e.g. unfolding continue's into recursion's protected final static T visitChildWithClassEqualityCheck( - ScribNode parent, T child, AstVisitor nv) throws ScribException + ScribNode parent, T child, AstVisitor v) throws ScribException { - ScribNode visited = ((ScribNodeBase) parent).visitChild(child, nv); + ScribNode visited = ((ScribNodeBase) parent).visitChild(child, v); // Same subtyping flexibility as standard cast return ScribNodeUtil.checkNodeClassEquality(child, visited); } protected final static List visitChildListWithClassEqualityCheck( - ScribNode parent, List children, AstVisitor nv) + ScribNode parent, List children, AstVisitor v) throws ScribException { - return visitChildListWith(parent, children, nv, + return visitChildListWith(parent, children, v, (T t) -> ScribUtil.handleLambdaScribbleException( () -> ScribNodeBase - .visitChildWithClassEqualityCheck(parent, t, nv))); // -> T + .visitChildWithClassEqualityCheck(parent, t, v))); // -> T } // Just a list-map with handling for promoted exceptions (via handleLambdaScribbleException) -- could move to Util (where handleLambdaScribbleException is) @@ -210,10 +210,10 @@ private final static List visitChi visited.add(c.call()); } return visited;*/ - // Maybe this exception hack is not worth it? Better to throw directly as ScribbleException + // Maybe the below exception hack is not worth it? Simpler to throw directly as ScribbleException, as above try { - return children.stream().map(n -> c.apply(n)) + return children.stream().map(x -> c.apply(x)) .collect(Collectors.toList()); } catch (RuntimeScribException rse) diff --git a/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java b/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java index 61ad795c4..f3e8b4cbe 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java @@ -45,6 +45,13 @@ public PayElemList getPayloadListChild() { return (PayElemList) getChild(PAYLOAD_CHILD_INDEX); } + + // "add", not "set" + public void addChildren1(OpNode op, PayElemList pay) + { + addChild(op); + addChild(pay); + } @Override public SigLitNode dupNode() @@ -52,13 +59,12 @@ public SigLitNode dupNode() return new SigLitNode(this); } - public SigLitNode reconstruct(OpNode op, PayElemList payload) + public SigLitNode reconstruct(OpNode op, PayElemList pay) { - SigLitNode sig = dupNode(); - sig.addChild(op); - sig.addChild(payload); - sig.setDel(del()); // No copy - return sig; + SigLitNode dup = dupNode(); + dup.addChildren1(op, pay); + dup.setDel(del()); // No copy + return dup; } @Override @@ -71,7 +77,7 @@ public SigLitNode visitChildren(AstVisitor nv) throws ScribException } @Override - public boolean isMessageSigNode() + public boolean isSigLitNode() { return true; } @@ -85,7 +91,7 @@ public SigLit toArg() } @Override - public SigLit toMessage() + public SigLit toMsg() { return toArg(); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java index 4345f7faf..0b77745f5 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java @@ -17,7 +17,6 @@ import org.scribble.ast.name.PayElemNameNode; import org.scribble.core.type.kind.PayElemKind; import org.scribble.core.type.name.PayElemType; -import org.scribble.del.ScribDel; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -55,6 +54,13 @@ public PayElemNameNode getNameChild() // Cannot use ScribNodeBase.visitChildWithCastCheck because this is not a ProtocolKindNode return name; } + + // "add", not "set" + public void addChildren1(PayElemNameNode name) + { + // Cf. above getters and Scribble.g children order + addChild(name); + } @Override public UnaryPayElem dupNode() @@ -64,11 +70,10 @@ public UnaryPayElem dupNode() public UnaryPayElem reconstruct(PayElemNameNode name) { - UnaryPayElem elem = dupNode(); - elem.addChild(name); - ScribDel del = del(); - elem.setDel(del); // No copy - return elem; + UnaryPayElem dup = dupNode(); + dup.addChildren1(name); + dup.setDel(del()); // No copy + return dup; } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java index ab5fcb655..233ef26b7 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java @@ -54,6 +54,14 @@ public RoleNode getRoleChild() { return (RoleNode) getChild(ROLE_CHILD_INDEX); } + + // "add", not "set" + public void addChildren1(GProtoNameNode proto, RoleNode role) + { + // Cf. above getters and Scribble.g children order + addChild(proto); + addChild(role); + } @Override public GDelegPayElem dupNode() @@ -64,8 +72,7 @@ public GDelegPayElem dupNode() public GDelegPayElem reconstruct(GProtoNameNode proto, RoleNode role) { GDelegPayElem dup = dupNode(); - dup.addChild(proto); - dup.addChild(role); + addChildren1(proto, role); dup = (GDelegPayElem) dup.del(del()); return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java index b99e6eb98..e3ccc8101 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java @@ -19,7 +19,7 @@ import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtoName; -import org.scribble.lang.LangContext; +import org.scribble.job.JobContext; public class GDo extends Do implements GSimpleSessionNode { @@ -42,7 +42,7 @@ public GProtoNameNode getProtocolNameNode() } @Override - public GProtoDecl getTargetProtocolDecl(LangContext jcontext, + public GProtoDecl getTargetProtocolDecl(JobContext jcontext, ModuleContext mcontext) { GProtoName fullname = getTargetProtocolDeclFullName(mcontext); diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GMsgTransfer.java b/scribble-ast/src/main/java/org/scribble/ast/global/GMsgTransfer.java index 727ea9eee..a51928b4a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GMsgTransfer.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GMsgTransfer.java @@ -16,11 +16,11 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; -import org.scribble.ast.MessageTransfer; +import org.scribble.ast.MsgTransfer; import org.scribble.core.type.kind.Global; import org.scribble.util.Constants; -public class GMsgTransfer extends MessageTransfer +public class GMsgTransfer extends MsgTransfer implements GSimpleSessionNode { // ScribTreeAdaptor#create constructor diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java index 45e68428e..45dd32728 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java @@ -49,6 +49,14 @@ public RoleNode getServerChild() { return (RoleNode) getChild(SERVER_CHILD_INDEX); } + + // "add", not "set" + public void addChildren1(RoleNode client, RoleNode server) + { + // Cf. above getters and Scribble.g children order + addChild(client); + addChild(server); + } @Override public GWrap dupNode() @@ -59,8 +67,7 @@ public GWrap dupNode() public GWrap reconstruct(RoleNode client, RoleNode server) { GWrap n = dupNode(); - n.addChild(client); - n.addChild(server); + n.addChildren1(client, server); n.setDel(del()); // No copy return n; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java index 553fa2e60..4b902a8f2 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java @@ -51,7 +51,7 @@ public DataName toName() } @Override - public boolean isDataTypeNameNode() + public boolean isDataNameNode() { return true; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java index 62ca5cd59..b2d9bf7b5 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java @@ -48,14 +48,14 @@ public SigName toName() } @Override - public boolean isMessageSigNameNode() + public boolean isSigNameNode() { return true; } // Difference between toName and toMessage is scope? does that make sense? @Override - public SigName toMessage() + public SigName toMsg() { return toName(); } @@ -63,7 +63,7 @@ public SigName toMessage() @Override public SigName toArg() { - return toMessage(); + return toMsg(); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index e7f1099c0..c8f169dc9 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -55,7 +55,7 @@ public Arg toArg() } @Override - public Msg toMessage() + public Msg toMsg() { throw new RuntimeException( "Ambiguous name node not disambiguated: " + this); diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java index b02d98266..c95a30568 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java @@ -60,7 +60,7 @@ public DataName toPayloadType() // Currently can assume the only possible kind } @Override - public boolean isTypeParamNode() + public boolean isDataParamNode() { return true; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java index 238360828..383df0cc6 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java @@ -49,11 +49,11 @@ public SigName toName() @Override public SigName toArg() { - return toMessage(); + return toMsg(); } @Override - public SigName toMessage() + public SigName toMsg() { return toName(); } diff --git a/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java index 004847c2f..08d172767 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoArgListDel.java @@ -24,7 +24,7 @@ import org.scribble.ast.ScribNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.name.ProtoName; -import org.scribble.lang.LangContext; +import org.scribble.job.JobContext; import org.scribble.util.ScribException; import org.scribble.visit.NameDisambiguator; @@ -58,7 +58,7 @@ protected ProtoDecl getTargetProtocolDecl(Do parent, NameDisambiguator disamb) throws ScribException { ModuleContext mc = disamb.getModuleContext(); - LangContext jc = disamb.lang.getContext(); + JobContext jc = disamb.job.getContext(); Do doo = (Do) parent; ProtoName pn = doo.getProtocolNameNode().toName(); /*if (!mc.isVisibleProtocolDeclName(simpname)) // FIXME: should be checked somewhere else? earlier (do-entry?) -- done diff --git a/scribble-ast/src/main/java/org/scribble/del/DoDel.java b/scribble-ast/src/main/java/org/scribble/del/DoDel.java index ecba4341c..ff23cc22f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/DoDel.java @@ -69,8 +69,8 @@ private ScribNode leaveDisambiguationAux( ProtoNameNode n = makeProtoNameNode(disamb, proto); // Didn't keep original namenode del -- ? - return visited.reconstruct(visited.getRoleListChild(), - visited.getNonRoleListChild(), n); + return visited.reconstruct(n, + visited.getNonRoleListChild(), visited.getRoleListChild()); } private ProtoNameNode makeProtoNameNode( @@ -82,10 +82,10 @@ private ProtoNameNode makeProtoNameNode( if (fullname instanceof GProtoName) { List elems = Arrays.asList(fullname.getElements()).stream() - .map(x -> disamb.lang.config.af.IdNode(null, x)) + .map(x -> disamb.job.config.af.IdNode(null, x)) .collect(Collectors.toList()); @SuppressWarnings("unchecked") // FIXME - ProtoNameNode cast = (ProtoNameNode) disamb.lang.config.af + ProtoNameNode cast = (ProtoNameNode) disamb.job.config.af .GProtoNameNode(proto.token, elems); return cast; } diff --git a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java index 11e337729..3e92d4647 100644 --- a/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/NonRoleArgListDel.java @@ -55,7 +55,7 @@ public NonRoleArgList leaveDisambiguation(ScribNode child, NonRoleParamKind pkind = param.kind; NonRoleArg arg = args.next(); NonRoleArgNode val = arg.getArgNodeChild(); - if (val.isTypeParamNode() || val.isSigParamNode()) + if (val.isDataParamNode() || val.isSigParamNode()) { if (!((NonRoleParamNode) val).kind.equals(pkind)) { @@ -65,7 +65,7 @@ public NonRoleArgList leaveDisambiguation(ScribNode child, } else if (pkind.equals(SigKind.KIND)) { - if (!val.isMessageSigNode() && !val.isMessageSigNameNode()) + if (!val.isSigLitNode() && !val.isSigNameNode()) { throw new ScribException(arg.getSource(), "Invalid arg " + arg + " for param kind: " + pkind); @@ -73,7 +73,7 @@ else if (pkind.equals(SigKind.KIND)) } else if (pkind.equals(DataKind.KIND)) { - if (!val.isDataTypeNameNode()) + if (!val.isDataNameNode()) { throw new ScribException(arg.getSource(), "Invalid arg " + arg + " for param kind: " + pkind); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java index 716e86a00..ef53ccc76 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java @@ -53,7 +53,7 @@ public org.scribble.core.type.session.global.GConnect translate(ScribNode n, throw new RuntimeException("TODO: multiple destination roles: " + source); } Role dst = ds.get(0).toName(); - Msg msg = source.getMessageNodeChild().toMessage(); + Msg msg = source.getMessageNodeChild().toMsg(); return new org.scribble.core.type.session.global.GConnect(source, src, msg, dst); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java index 2a77fcd75..e9a36b49b 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -66,7 +66,7 @@ public GDelegPayElem visitForNameDisambiguation(NameDisambiguator disamb, // CH RoleNode r = deleg.getRoleChild(); Role rn = r.toName(); - ProtoDecl gpd = disamb.lang.getContext() + ProtoDecl gpd = disamb.job.getContext() .getModule(fullname.getPrefix()) .getGProtocolDeclChild(fullname.getSimpleName()); if (!gpd.getHeaderChild().getRoleDeclListChild().getRoles().contains(rn)) @@ -74,8 +74,8 @@ public GDelegPayElem visitForNameDisambiguation(NameDisambiguator disamb, // CH throw new ScribException(r.getSource(), "Invalid delegation role: " + deleg); } List elems = Arrays.asList(fullname.getElements()).stream() - .map(x -> disamb.lang.config.af.IdNode(null, x)).collect(Collectors.toList()); - GProtoNameNode pnn = (GProtoNameNode) disamb.lang.config.af + .map(x -> disamb.job.config.af.IdNode(null, x)).collect(Collectors.toList()); + GProtoNameNode pnn = (GProtoNameNode) disamb.job.config.af .GProtoNameNode(proto.token, elems); // Not keeping original namenode del return deleg.reconstruct(pnn, r); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java index 46445def2..bc9cba3e6 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -61,7 +61,7 @@ public org.scribble.core.type.session.global.GMessageTransfer translate(ScribNod throw new RuntimeException("[TODO] multiple destination roles: " + source); } Role dst = ds.get(0).toName(); - Msg msg = source.getMessageNodeChild().toMessage(); + Msg msg = source.getMessageNodeChild().toMsg(); return new org.scribble.core.type.session.global.GMessageTransfer(source, src, msg, dst); } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java index 530a5be24..25f9836d3 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java @@ -50,7 +50,7 @@ public GProtocol translate(ScribNode n, GTypeTranslator t) source.getHeaderChild().getDeclName()); List rs = source.getRoles(); List> ps = source.getHeaderChild() - .getParamDeclListChild().getParameters(); // CHECKME: make more uniform with source::getRoles ? + .getParamDeclListChild().getParams(); // CHECKME: make more uniform with source::getRoles ? GSeq body = (GSeq) source.getDefChild().getBlockChild().visitWith(t); return new GProtocol(source, mods, fullname, rs, ps, body); } diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java index 02f1b0163..ed08cab7e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java @@ -15,7 +15,7 @@ import java.util.stream.Collectors; -import org.scribble.ast.MessageTransfer; +import org.scribble.ast.MsgTransfer; import org.scribble.ast.PayElem; import org.scribble.ast.ScribNode; import org.scribble.ast.name.qualified.DataNameNode; @@ -53,7 +53,7 @@ public ScribNode leaveDisambiguation(ScribNode child, // FIXME: are conflicts checked elsewhere? if (mcontext.isDataTypeVisible(name.toDataName())) { - if (parent instanceof MessageTransfer) // FIXME HACK: MessageTransfer assumes MessageNode (cast in visitChildren), so this needs to be caught here // FIXME: other similar cases? + if (parent instanceof MsgTransfer) // FIXME HACK: MessageTransfer assumes MessageNode (cast in visitChildren), so this needs to be caught here // FIXME: other similar cases? { throw new ScribException(ann.getSource(), "Invalid occurrence of data type: " + parent); @@ -63,9 +63,9 @@ public ScribNode leaveDisambiguation(ScribNode child, //DataTypeNode res = new DataTypeNode(ann.token); // CHECKME: what should the Token be? //DataTypeNode res = new DataTypeNode(new CommonToken(73, "TYPENAME")); // FIXME: use af - DataNameNode res = (DataNameNode) disamb.lang.config.af + DataNameNode res = (DataNameNode) disamb.job.config.af .DataNameNode(ann.token, ann.getElements().stream() - .map(x -> disamb.lang.config.af.IdNode(null, x)) + .map(x -> disamb.job.config.af.IdNode(null, x)) .collect(Collectors.toList())); //res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? @@ -85,9 +85,9 @@ else if (mcontext.isMessageSigNameVisible(name.toSigName())) //MessageSigNameNode res = new MessageSigNameNode(ann.token); // CHECME: what should the Token be? //MessageSigNameNode res = new MessageSigNameNode(new CommonToken(67, "SIGNAME")); // FIXME: use af - SigNameNode res = (SigNameNode) disamb.lang.config.af + SigNameNode res = (SigNameNode) disamb.job.config.af .SigNameNode(ann.token, ann.getElements().stream() - .map(x -> disamb.lang.config.af.IdNode(null, x)) + .map(x -> disamb.job.config.af.IdNode(null, x)) .collect(Collectors.toList())); //res.addChildren(ann.getChildren()); @@ -104,7 +104,7 @@ else if (disamb.isBoundParameter(name)) { //TypeParamNode res = new TypeParamNode(ann.token); // CHECKME: what should the Token be? //TypeParamNode res = new TypeParamNode(75, ann.token); // CHECKME: what should the Token be? - DataParamNode res = disamb.lang.config.af.DataParamNode(ann.token, + DataParamNode res = disamb.job.config.af.DataParamNode(ann.token, ann.getText()); //res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? @@ -114,7 +114,7 @@ else if (disamb.isBoundParameter(name)) else if (kind.equals(SigKind.KIND)) { //SigParamNode res = new SigParamNode(69, ann.token); // CHECKME: what should the Token be? - SigParamNode res = disamb.lang.config.af.SigParamNode(ann.token, + SigParamNode res = disamb.job.config.af.SigParamNode(ann.token, ann.getText()); //res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? diff --git a/scribble-ast/src/main/java/org/scribble/lang/Lang.java b/scribble-ast/src/main/java/org/scribble/job/Job.java similarity index 77% rename from scribble-ast/src/main/java/org/scribble/lang/Lang.java rename to scribble-ast/src/main/java/org/scribble/job/Job.java index 154c90857..7b6ca3ea2 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/Lang.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.job; import java.util.HashSet; import java.util.Map; @@ -20,8 +20,8 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.Module; import org.scribble.ast.global.GProtoDecl; -import org.scribble.core.job.Job; -import org.scribble.core.job.JobArgs; +import org.scribble.core.job.Core; +import org.scribble.core.job.CoreArgs; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.name.ModuleName; import org.scribble.util.ScribException; @@ -30,37 +30,37 @@ import org.scribble.visit.NameDisambiguator; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models -public class Lang +public class Job { - public final LangConfig config; // Immutable + public final JobConfig config; // Immutable - private final LangContext context; // Mutable: Visitor passes update modules + private final JobContext context; // Mutable: Visitor passes update modules - private Job job; + private Core core; // Just take MainContext as arg? -- would need to fix Maven dependencies //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) - public Lang(ModuleName mainFullname, Map args, + public Job(ModuleName mainFullname, Map args, Map parsed, AstFactory af) throws ScribException { // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource // FIXME: wrap flags in Map and move Config construction to Lang - this.config = newLangConfig(mainFullname, args, af); - this.context = newLangContext(this, parsed); // Single instance per Lang, should not be shared between Langs + this.config = newJobConfig(mainFullname, args, af); + this.context = newJobContext(this, parsed); // Single instance per Lang, should not be shared between Langs } // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate - protected LangConfig newLangConfig(ModuleName mainFullname, - Map args, AstFactory af) + protected JobConfig newJobConfig(ModuleName mainFullname, + Map args, AstFactory af) { - return new LangConfig(mainFullname, args, af); + return new JobConfig(mainFullname, args, af); } // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate - protected LangContext newLangContext(Lang lang, + protected JobContext newJobContext(Job job, Map parsed) throws ScribException { - return new LangContext(this, parsed); + return new JobContext(this, parsed); } // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate @@ -70,11 +70,11 @@ protected GTypeTranslator newTranslator(ModuleName rootFullname) } // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate - protected Job newJob(ModuleName mainFullname, Map args, + protected Core newJob(ModuleName mainFullname, Map args, //Map modcs, Set imeds) { - return new Job(mainFullname, args, //modcs, + return new Core(mainFullname, args, //modcs, imeds); } @@ -92,9 +92,9 @@ public void runPasses() throws ScribException // So, typically, Lang passes should be finished before calling this // Job passes may subsequently mutate Job(Context) though // CHECKME: revise this pattern? -- maybe fork Job for a snapshot of current Lang(Context) -- and, possibly, convert Job back to Lang - public final Job getJob() throws ScribException + public final Core getCore() throws ScribException { - if (this.job == null) + if (this.core == null) { Map parsed = this.context.getParsed(); Set imeds = new HashSet<>(); @@ -109,27 +109,21 @@ public final Job getJob() throws ScribException "\nParsed:\n" + gpd + "\n\nScribble intermediate:\n" + g); } } - this.job = newJob(this.config.main, this.config.args, + this.core = newJob(this.config.main, this.config.args, //this.context.getModuleContexts(), imeds); } - return this.job; + return this.core; } - public LangContext getContext() + public JobContext getContext() { return this.context; } - - // For convenience - /*public ModuleContext getMainModuleContext() - { - return this.context.getModuleContext(this.config.main); - }*/ public void runVisitorPassOnAllModules(AstVisitor v) throws ScribException { - debugPrintPass("Running " + v.getClass() + " on all modules:"); + verbosePrintPass("Running " + v.getClass() + " on all modules:"); runVisitorPass(v, this.context.getFullModuleNames()); } @@ -142,14 +136,15 @@ private void runVisitorPass(AstVisitor v, } } - private void runVisitorOnModule(ModuleName modname, AstVisitor nv) + private void runVisitorOnModule(ModuleName modname, AstVisitor v) throws ScribException { - if (this.job != null) + if (this.core != null) { throw new RuntimeException("toJob already finalised: "); } - Module visited = (Module) this.context.getModule(modname).accept(nv); + verbosePrintPass("- Running " + v.getClass() + " on:\n" + modname); + Module visited = (Module) this.context.getModule(modname).accept(v); this.context.replaceModule(visited); } @@ -160,13 +155,13 @@ public void warningPrintln(String s) public void verbosePrintln(String s) { - if (this.config.args.get(JobArgs.VERBOSE)) + if (this.config.args.get(CoreArgs.VERBOSE)) { System.out.println(s); } } - private void debugPrintPass(String s) + private void verbosePrintPass(String s) { verbosePrintln("\n[Lang] " + s); } diff --git a/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java b/scribble-ast/src/main/java/org/scribble/job/JobConfig.java similarity index 85% rename from scribble-ast/src/main/java/org/scribble/lang/LangConfig.java rename to scribble-ast/src/main/java/org/scribble/job/JobConfig.java index 968c9fd4f..a7ec3d9e4 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/LangConfig.java +++ b/scribble-ast/src/main/java/org/scribble/job/JobConfig.java @@ -11,27 +11,27 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.job; import java.util.Collections; import java.util.Map; import org.scribble.ast.AstFactory; -import org.scribble.core.job.JobArgs; +import org.scribble.core.job.CoreArgs; import org.scribble.core.type.name.ModuleName; // The "static" (constant) info for Lang -- cf. LangContext "dynamic" state -public class LangConfig +public class JobConfig { public final ModuleName main; // Full name - public final Map args; + public final Map args; // CHECKME: verbose/debug printing parameter? public final AstFactory af; // N.B. MainContext is in a different non-visible (by Maven) package - public LangConfig(ModuleName mainFullname, Map args, + public JobConfig(ModuleName mainFullname, Map args, AstFactory af) { this.main = mainFullname; diff --git a/scribble-ast/src/main/java/org/scribble/lang/LangContext.java b/scribble-ast/src/main/java/org/scribble/job/JobContext.java similarity index 93% rename from scribble-ast/src/main/java/org/scribble/lang/LangContext.java rename to scribble-ast/src/main/java/org/scribble/job/JobContext.java index bcc85d735..6f3553d45 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/LangContext.java +++ b/scribble-ast/src/main/java/org/scribble/job/JobContext.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang; +package org.scribble.job; import java.util.Collections; import java.util.HashMap; @@ -24,14 +24,13 @@ import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.ModuleName; -import org.scribble.lang.context.ModuleContextCollector; import org.scribble.util.ScribException; // Global "static" context information for a Job -- single instance per Job, should not be shared between Jobs // Mutable: projections, graphs, etc are added mutably later -- replaceModule also mutable setter -- "users" get this from the Job and expect to setter mutate "in place" -public class LangContext +public class JobContext { - public final Lang lang; + public final Job job; //public final ModuleName main; // The "main" root module from MainContext @@ -46,10 +45,10 @@ public class LangContext private final Map modcs; // CHECKME: constant? depends on adding projections? - protected LangContext(Lang lang, Map parsed) + protected JobContext(Job job, Map parsed) throws ScribException { - this.lang = lang; + this.job = job; this.parsed = new HashMap(parsed); this.modcs = Collections.unmodifiableMap(buildModuleContexts(parsed)); } @@ -62,7 +61,7 @@ protected Map buildModuleContexts( // Job.modcs seems unused? Lang.modcs is used though, by old AST visitors -- basically old ModuleContextVisitor is redundant? // Job.modcs could be used, but disamb already done by Lang // Lang/Job modcs should be moved to config/context though - ModuleContextCollector b = new ModuleContextCollector(); // FIXME: rename Builder + ModuleContextBuilder b = new ModuleContextBuilder(); // TODO: factor out newModuleContextBuilder Map modcs = new HashMap<>(); for (ModuleName fullname : parsed.keySet()) { @@ -74,7 +73,7 @@ protected Map buildModuleContexts( public Module getMainModule() { - return getModule(this.lang.config.main); + return getModule(this.job.config.main); } // HACK -- CHECKME: separate original parsed from "working set"? diff --git a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java b/scribble-ast/src/main/java/org/scribble/job/ModuleContextBuilder.java similarity index 97% rename from scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java rename to scribble-ast/src/main/java/org/scribble/job/ModuleContextBuilder.java index 5276517dd..2df32997b 100644 --- a/scribble-ast/src/main/java/org/scribble/lang/context/ModuleContextCollector.java +++ b/scribble-ast/src/main/java/org/scribble/job/ModuleContextBuilder.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.lang.context; +package org.scribble.job; import java.util.Map; @@ -29,9 +29,8 @@ import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.ModuleName; import org.scribble.util.ScribException; - -// TODO: rename and refactor -public class ModuleContextCollector +// TODO: rename and refactor -- also factor out newModuleContextBuilder in Lang +public class ModuleContextBuilder { private Module root; // full name // The root Module for this ModuleContext (cf. the "main" root module from CLI) @@ -47,7 +46,7 @@ public class ModuleContextCollector // Made by ModuleContextBuilder // ModuleContext is the root context - public ModuleContextCollector() //JobContext jcontext, + public ModuleContextBuilder() //JobContext jcontext, { } diff --git a/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java index b5c52fe1d..74b8d9a0f 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/AstVisitor.java @@ -14,18 +14,18 @@ package org.scribble.visit; import org.scribble.ast.ScribNode; -import org.scribble.lang.Lang; +import org.scribble.job.Job; import org.scribble.util.ScribException; // Pattern: node accepts visitor and calls visitor back (standard visitor pattern -- adding a new operation doesn't affect the Ast classes), but then visitor delegates back to node delegate (so routines for handling each node type not centralised in visitor, but decentralised to delegates) // More general than SimpleAstVisitor, retrieves ModuleContext on entry and offers enter/leave around visitChildren public abstract class AstVisitor { - public final Lang lang; // Immutable except for JobContext internals + public final Job job; // Immutable except for JobContext internals - protected AstVisitor(Lang lang) + protected AstVisitor(Job job) { - this.lang = lang; + this.job = job; } // Used by ScribNodeBase::accept diff --git a/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java index 760a51500..c5559111a 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java @@ -17,15 +17,15 @@ import org.scribble.core.lang.global.GNode; import org.scribble.core.type.name.ModuleName; import org.scribble.del.global.GDel; -import org.scribble.lang.Lang; +import org.scribble.job.Job; import org.scribble.util.ScribException; // CHECKME: move to visit package? public class GTypeTranslator extends SimpleAstVisitor { - public GTypeTranslator(Lang lang, ModuleName rootFullname) + public GTypeTranslator(Job job, ModuleName rootFullname) { - super(lang, rootFullname); + super(job, rootFullname); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/visit/ModuleContextVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/ModuleContextVisitor.java index 522c8fe75..3bee8f1f0 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/ModuleContextVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/ModuleContextVisitor.java @@ -17,7 +17,7 @@ import org.scribble.ast.ScribNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.name.ModuleName; -import org.scribble.lang.Lang; +import org.scribble.job.Job; import org.scribble.util.ScribException; // A visitor that caches the ModuleContext from the *entered* Module, for later access @@ -27,9 +27,9 @@ public abstract class ModuleContextVisitor extends AstVisitor { private ModuleContext mcon; // The "current" module context, gathered on entry -- different than the front-end "main" module - public ModuleContextVisitor(Lang lang) + public ModuleContextVisitor(Job job) { - super(lang); + super(job); } @Override @@ -42,7 +42,7 @@ protected void enter(ScribNode child) /*ModuleDel del = (ModuleDel) ((Module) child).del(); setModuleContext(del.getModuleContext());*/ ModuleName fullname = ((Module) child).getFullModuleName(); - setModuleContext(this.lang.getContext().getModuleContext(fullname)); + setModuleContext(this.job.getContext().getModuleContext(fullname)); } } diff --git a/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java b/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java index 8b4ff22f5..c8e0b494e 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java @@ -26,7 +26,7 @@ import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.del.global.GDelegationElemDel; -import org.scribble.lang.Lang; +import org.scribble.job.Job; import org.scribble.util.ScribException; // Disambiguates ambiguous PayloadTypeOrParameter names and inserts implicit Scope names @@ -44,7 +44,7 @@ public class NameDisambiguator extends ModuleContextVisitor //private ProtocolDecl root; // FIXME: factor out // Now unused (recvar renaming refactored to inlining -- don't want to mangle source AST) - public NameDisambiguator(Lang job) + public NameDisambiguator(Job job) { super(job); } diff --git a/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java index feb41038f..e2602b8ba 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitor.java @@ -16,7 +16,7 @@ import org.scribble.ast.ScribNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.name.ModuleName; -import org.scribble.lang.Lang; +import org.scribble.job.Job; import org.scribble.util.ScribException; // A SimpleVisitor visits a Module (or some part of one) for a given Job @@ -25,12 +25,12 @@ // TODO CHECKME: refactor AstVisitor as a SimpleVisitor? i.e., T=ScribNode ? public abstract class SimpleAstVisitor { - public final Lang lang; + public final Job job; public final ModuleName root; // Root module, full name -- used to get ModuleContext - public SimpleAstVisitor(Lang lang, ModuleName rootFullname) + public SimpleAstVisitor(Job job, ModuleName rootFullname) { - this.lang = lang; + this.job = job; this.root = rootFullname; } @@ -40,6 +40,6 @@ public SimpleAstVisitor(Lang lang, ModuleName rootFullname) public ModuleContext getModuleContext() { - return this.lang.getContext().getModuleContext(this.root); + return this.job.getContext().getModuleContext(this.root); } } diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 1959adc0c..f631082fc 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -30,17 +30,17 @@ import org.scribble.ast.global.GProtoDecl; import org.scribble.codegen.java.JEndpointApiGenerator; import org.scribble.codegen.java.callbackapi.CBEndpointApiGenerator3; -import org.scribble.core.job.Job; -import org.scribble.core.job.JobArgs; -import org.scribble.core.job.JobContext; +import org.scribble.core.job.Core; +import org.scribble.core.job.CoreArgs; +import org.scribble.core.job.CoreContext; import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.global.SGraph; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.Role; -import org.scribble.lang.Lang; -import org.scribble.lang.LangContext; +import org.scribble.job.Job; +import org.scribble.job.JobContext; import org.scribble.main.Main; import org.scribble.main.resource.locator.DirectoryResourceLocator; import org.scribble.main.resource.locator.ResourceLocator; @@ -104,7 +104,7 @@ protected CLArgParser newCLArgParser(CLFlags flags, String[] args) // A Scribble extension should override as appropriate protected Main newMain() throws ScribParserException, ScribException { - Map args = Collections.unmodifiableMap(parseJobArgs()); + Map args = Collections.unmodifiableMap(parseJobArgs()); if (hasFlag(CLFlags.INLINE_MAIN_MOD_FLAG)) { String inline = getUniqueFlagArgs(CLFlags.INLINE_MAIN_MOD_FLAG)[0]; @@ -124,72 +124,72 @@ protected Main newMain() throws ScribParserException, ScribException } // A Scribble extension should override as appropriate - protected Map parseJobArgs() + protected Map parseJobArgs() { - Map args = new HashMap<>(); - args.put(JobArgs.VERBOSE, hasFlag(CLFlags.VERBOSE_FLAG)); - args.put(JobArgs.OLD_WF, hasFlag(CLFlags.OLD_WF_FLAG)); - args.put(JobArgs.NO_PROGRESS, hasFlag(CLFlags.NO_PROGRESS_FLAG)); - args.put(JobArgs.MIN_EFSM, hasFlag(CLFlags.LTSCONVERT_MIN_FLAG)); - args.put(JobArgs.FAIR, hasFlag(CLFlags.FAIR_FLAG)); - args.put(JobArgs.NO_LCHOICE_SUBJ_CHECK, + Map args = new HashMap<>(); + args.put(CoreArgs.VERBOSE, hasFlag(CLFlags.VERBOSE_FLAG)); + args.put(CoreArgs.OLD_WF, hasFlag(CLFlags.OLD_WF_FLAG)); + args.put(CoreArgs.NO_PROGRESS, hasFlag(CLFlags.NO_PROGRESS_FLAG)); + args.put(CoreArgs.MIN_EFSM, hasFlag(CLFlags.LTSCONVERT_MIN_FLAG)); + args.put(CoreArgs.FAIR, hasFlag(CLFlags.FAIR_FLAG)); + args.put(CoreArgs.NO_LCHOICE_SUBJ_CHECK, hasFlag(CLFlags.NO_LOCAL_CHOICE_SUBJECT_CHECK_FLAG)); - args.put(JobArgs.NO_ACC_CORRELATION_CHECK, + args.put(CoreArgs.NO_ACC_CORRELATION_CHECK, hasFlag(CLFlags.NO_ACCEPT_CORRELATION_CHECK_FLAG)); - args.put(JobArgs.NO_VALIDATION, hasFlag(CLFlags.NO_VALIDATION_FLAG)); - args.put(JobArgs.SPIN, hasFlag(CLFlags.SPIN_FLAG)); + args.put(CoreArgs.NO_VALIDATION, hasFlag(CLFlags.NO_VALIDATION_FLAG)); + args.put(CoreArgs.SPIN, hasFlag(CLFlags.SPIN_FLAG)); return args; } // AntlrSourceException super of ScribbleException -- needed for, e.g., AssrtCoreSyntaxException // A Scribble extension should override as appropriate - protected void doValidationTasks(Lang lang) + protected void doValidationTasks(Job job) throws AntlrSourceException, ScribParserException, // Latter in case needed by subclasses CommandLineException { - lang.runPasses(); - lang.getJob().runPasses(); + job.runPasses(); + job.getCore().runPasses(); } // A Scribble extension should override as appropriate // TODO: rename, barrier misleading (sounds like a sync) - protected void tryNonBarrierTask(Lang lang, Pair task) + protected void tryNonBarrierTask(Job job, Pair task) throws CommandLineException, ScribException { switch (task.left) // Flag lab (CLFlags String constants) { case CLFlags.PROJECT_FLAG: - printProjection(lang, task.right); + printProjection(job, task.right); break; case CLFlags.EFSM_FLAG: - outputEGraph(lang, task.right, true, true, false); + outputEGraph(job, task.right, true, true, false); break; case CLFlags.VALIDATION_EFSM_FLAG: - outputEGraph(lang, task.right, false, true, false); + outputEGraph(job, task.right, false, true, false); break; case CLFlags.UNFAIR_EFSM_FLAG: - outputEGraph(lang, task.right, false, false, false); + outputEGraph(job, task.right, false, false, false); break; case CLFlags.EFSM_PNG_FLAG: - outputEGraph(lang, task.right, true, true, true); + outputEGraph(job, task.right, true, true, true); break; case CLFlags.VALIDATION_EFSM_PNG_FLAG: - outputEGraph(lang, task.right, false, true, true); + outputEGraph(job, task.right, false, true, true); break; case CLFlags.UNFAIR_EFSM_PNG_FLAG: - outputEGraph(lang, task.right, false, false, true); + outputEGraph(job, task.right, false, false, true); break; case CLFlags.SGRAPH_FLAG: - outputSGraph(lang, task.right, true, false); + outputSGraph(job, task.right, true, false); break; case CLFlags.UNFAIR_SGRAPH_FLAG: - outputSGraph(lang, task.right, false, false); + outputSGraph(job, task.right, false, false); break; case CLFlags.SGRAPH_PNG_FLAG: - outputSGraph(lang, task.right, true, true); + outputSGraph(job, task.right, true, true); break; case CLFlags.UNFAIR_SGRAPH_PNG_FLAG: - outputSGraph(lang, task.right, false, true); + outputSGraph(job, task.right, false, true); break; default: throw new RuntimeException("Shouldn't get here: " + task.left); @@ -199,22 +199,22 @@ protected void tryNonBarrierTask(Lang lang, Pair task) // A Scribble extension should override as appropriate // TODO: rename, barrier misleading (sounds like a sync) - protected void tryBarrierTask(Lang lang, + protected void tryBarrierTask(Job job, Pair task) throws ScribException, CommandLineException { switch (task.left) { case CLFlags.SESSION_API_GEN_FLAG: - outputEndpointApi(lang, task.right, true, false, false); + outputEndpointApi(job, task.right, true, false, false); break; case CLFlags.STATECHAN_API_GEN_FLAG: - outputEndpointApi(lang, task.right, false, true, false); + outputEndpointApi(job, task.right, false, true, false); break; case CLFlags.API_GEN_FLAG: - outputEndpointApi(lang, task.right, true, true, false); + outputEndpointApi(job, task.right, true, true, false); break; case CLFlags.EVENTDRIVEN_API_GEN_FLAG: - outputEndpointApi(lang, task.right, false, true, true); // FIXME: currently need to gen sess API separately? + outputEndpointApi(job, task.right, false, true, true); // FIXME: currently need to gen sess API separately? break; default: throw new RuntimeException("Shouldn't get here: " + task.left); @@ -267,9 +267,9 @@ protected void runTasks() throws AntlrSourceException, ScribParserException, CommandLineException { Main mc = newMain(); // Represents current instance of tooling for given CL args - Lang lang = mc.newLang(); // A Job is some series of passes performed on each Module in the MainContext (e.g., cf. Job::runVisitorPass) + Job job = mc.newJob(); // A Job is some series of passes performed on each Module in the MainContext (e.g., cf. Job::runVisitorPass) ScribException err = null; - try { doValidationTasks(lang); } catch (ScribException x) { err = x; } + try { doValidationTasks(job); } catch (ScribException x) { err = x; } for (Pair a : this.args) { CLFlag flag = this.flags.explicit.get(a.left); // null for CLFlags.MAIN_MOD_FLAG @@ -279,14 +279,14 @@ protected void runTasks() } if (!flag.barrier) { - try { tryNonBarrierTask(lang, a); } + try { tryNonBarrierTask(job, a); } catch (ScribException x) { if (err == null) { err = x; } } } else { if (err == null) { - try { tryBarrierTask(lang, a); } + try { tryBarrierTask(job, a); } catch (ScribException x) { err = x; } } } @@ -298,16 +298,16 @@ protected void runTasks() } // TODO: option to write to file, like API classes - private void printProjection(Lang lang, String[] args) + private void printProjection(Job job, String[] args) throws CommandLineException, ScribException { - LangContext langc = lang.getContext(); - Job job = lang.getJob(); + JobContext jobc = job.getContext(); + Core core = job.getCore(); for (int i = 0; i < args.length; i += 2) { - GProtoName fullname = checkGlobalProtocolArg(langc, args[i]); - Role role = checkRoleArg(langc, fullname, args[i+1]); - Map projections = job.getProjections(fullname, + GProtoName fullname = checkGlobalProtocolArg(jobc, args[i]); + Role role = checkRoleArg(jobc, fullname, args[i+1]); + Map projections = core.getProjections(fullname, role); // FIXME: generate and output Module container -- should be done via Lang? System.out.println("\n" + projections.values().stream() .map(p -> p.toString()).collect(Collectors.joining("\n\n"))); @@ -317,14 +317,14 @@ private void printProjection(Lang lang, String[] args) // dot/aut text output // forUser: true means for API gen and general user info (may be minimised), false means for validation (non-minimised, fair or unfair) // (forUser && !fair) should not hold, i.e. unfair doesn't make sense if forUser - private void outputEGraph(Lang lang, String[] args, boolean forUser, + private void outputEGraph(Job job, String[] args, boolean forUser, boolean fair, boolean draw) throws ScribException, CommandLineException { - LangContext langc = lang.getContext(); + JobContext jobc = job.getContext(); - GProtoName fullname = checkGlobalProtocolArg(langc, args[0]); - Role role = checkRoleArg(langc, fullname, args[1]); - EGraph fsm = getEGraph(lang, fullname, role, forUser, fair); + GProtoName fullname = checkGlobalProtocolArg(jobc, args[0]); + Role role = checkRoleArg(jobc, fullname, args[1]); + EGraph fsm = getEGraph(job, fullname, role, forUser, fair); if (draw) { String png = args[2]; @@ -339,13 +339,13 @@ private void outputEGraph(Lang lang, String[] args, boolean forUser, } } - private void outputSGraph(Lang lang, String[] args, boolean fair, + private void outputSGraph(Job job, String[] args, boolean fair, boolean draw) throws ScribException, CommandLineException { - LangContext jobc = lang.getContext(); + JobContext jobc = job.getContext(); { GProtoName fullname = checkGlobalProtocolArg(jobc, args[0]); - SGraph model = getSGraph(lang, fullname, fair); + SGraph model = getSGraph(job, fullname, fair); if (draw) { String png = args[1]; @@ -361,13 +361,13 @@ private void outputSGraph(Lang lang, String[] args, boolean fair, } } - private void outputEndpointApi(Lang lang, String[] args, boolean sess, + private void outputEndpointApi(Job job, String[] args, boolean sess, boolean schan, boolean cb) throws ScribException, CommandLineException { - LangContext langc = lang.getContext(); - JEndpointApiGenerator jgen = new JEndpointApiGenerator(lang); // FIXME: refactor (generalise -- use new API) + JobContext jobc = job.getContext(); + JEndpointApiGenerator jgen = new JEndpointApiGenerator(job); // FIXME: refactor (generalise -- use new API) { - GProtoName fullname = checkGlobalProtocolArg(langc, args[0]); + GProtoName fullname = checkGlobalProtocolArg(jobc, args[0]); if (sess) { Map out = jgen.generateSessionApi(fullname); @@ -375,10 +375,10 @@ private void outputEndpointApi(Lang lang, String[] args, boolean sess, } if (schan) // CHECKME: does not implicitly generate sess API? { - Role self = checkRoleArg(langc, fullname, args[1]); + Role self = checkRoleArg(jobc, fullname, args[1]); if (cb) { - CBEndpointApiGenerator3 cbgen = new CBEndpointApiGenerator3(lang, + CBEndpointApiGenerator3 cbgen = new CBEndpointApiGenerator3(job, fullname, self, hasFlag(CLFlags.STATECHAN_SUBTYPES_FLAG)); Map out = cbgen.build(); outputClasses(out); @@ -394,13 +394,13 @@ private void outputEndpointApi(Lang lang, String[] args, boolean sess, } // Endpoint graphs are "inlined", so only a single graph is built (cf. projection output) - private EGraph getEGraph(Lang lang, GProtoName fullname, Role role, + private EGraph getEGraph(Job job, GProtoName fullname, Role role, boolean forUser, boolean fair) throws ScribException, CommandLineException { - LangContext langc = lang.getContext(); - JobContext jobc = lang.getJob().getContext(); - GProtoDecl gpd = langc.getMainModule() + JobContext jobc = job.getContext(); + CoreContext corec = job.getCore().getContext(); + GProtoDecl gpd = jobc.getMainModule() .getGProtocolDeclChild(fullname.getSimpleName()); if (gpd == null || !gpd.getHeaderChild().getRoleDeclListChild().getRoles() .contains(role)) @@ -412,15 +412,15 @@ private EGraph getEGraph(Lang lang, GProtoName fullname, Role role, if (forUser) // The (possibly minimised) user-output EFSM for API gen { graph = hasFlag(CLFlags.LTSCONVERT_MIN_FLAG) - ? jobc.getMinimisedEGraph(fullname, role) - : jobc.getEGraph(fullname, role); + ? corec.getMinimisedEGraph(fullname, role) + : corec.getEGraph(fullname, role); } else // The (possibly unfair-transformed) internal EFSM for validation { graph = //(!this.args.containsKey(ArgFlag.FAIR) && !this.args.containsKey(ArgFlag.NO_LIVENESS)) // Cf. GlobalModelChecker.getEndpointFSMs !fair - ? jobc.getUnfairEGraph(fullname, role) - : jobc.getEGraph(fullname, role); + ? corec.getUnfairEGraph(fullname, role) + : corec.getEGraph(fullname, role); } if (graph == null) { @@ -430,10 +430,10 @@ private EGraph getEGraph(Lang lang, GProtoName fullname, Role role, return graph; } - private SGraph getSGraph(Lang lang, GProtoName fullname, boolean fair) + private SGraph getSGraph(Job job, GProtoName fullname, boolean fair) throws ScribException { - JobContext jobc2 = lang.getJob().getContext(); + CoreContext jobc2 = job.getCore().getContext(); SGraph model = fair ? jobc2.getSGraph(fullname) : jobc2.getUnfairSGraph(fullname); @@ -508,11 +508,11 @@ protected static List parseImportPaths(String paths) .collect(Collectors.toList()); } - protected static GProtoName checkGlobalProtocolArg(LangContext langc, + protected static GProtoName checkGlobalProtocolArg(JobContext jobc, String simpname) throws CommandLineException { GProtoName simpgpn = new GProtoName(simpname); - Module main = langc.getMainModule(); + Module main = jobc.getMainModule(); if (!main.hasGProtocolDecl(simpgpn)) { throw new CommandLineException("Global protocol not found: " + simpname); @@ -527,13 +527,13 @@ protected static GProtoName checkGlobalProtocolArg(LangContext langc, throw new CommandLineException( "Invalid aux protocol specified as root: " + simpname); } - return new GProtoName(langc.lang.config.main, simpgpn); // TODO: take Job param instead of Jobcontext + return new GProtoName(jobc.job.config.main, simpgpn); // TODO: take Job param instead of Jobcontext } - protected static Role checkRoleArg(LangContext langc, + protected static Role checkRoleArg(JobContext jobc, GProtoName fullname, String rolename) throws CommandLineException { - ProtoDecl pd = langc.getMainModule() + ProtoDecl pd = jobc.getMainModule() .getGProtocolDeclChild(fullname.getSimpleName()); Role role = new Role(rolename); if (!pd.getHeaderChild().getRoleDeclListChild().getRoles().contains(role)) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java index f78ca2b4e..76cbd3cc0 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java @@ -15,24 +15,24 @@ import java.util.Map; -import org.scribble.core.job.Job; +import org.scribble.core.job.Core; import org.scribble.core.type.name.GProtoName; -import org.scribble.lang.Lang; +import org.scribble.job.Job; import org.scribble.util.ScribException; // Basic pattern: use TypeGenerators to create all necessary TypeBuilders and cache them, and generateApi should call build on all as a final step public abstract class ApiGen { - public final Lang lang; public final Job job; + public final Core core; public final GProtoName gpn; // full name - public ApiGen(Lang job, GProtoName fullname) + public ApiGen(Job job, GProtoName fullname) { - this.lang = job; + this.job = job; try { - this.job = job.getJob(); + this.core = job.getCore(); } catch (ScribException e) // TODO: refactor { @@ -45,8 +45,8 @@ public ApiGen(Lang job, GProtoName fullname) // FIXME: Path instead of String key? public abstract Map generateApi(); - public Lang getJob() + public Job getJob() { - return this.lang; + return this.job; } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java index 4b99bce09..c30ad3c7f 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/JEndpointApiGenerator.java @@ -21,25 +21,25 @@ import org.scribble.codegen.java.statechanapi.ioifaces.IOInterfacesGenerator; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.Role; -import org.scribble.lang.Lang; +import org.scribble.job.Job; import org.scribble.util.RuntimeScribException; import org.scribble.util.ScribException; public class JEndpointApiGenerator { - public final Lang lang; + public final Job job; - public JEndpointApiGenerator(Lang lang) + public JEndpointApiGenerator(Job job) { - this.lang = lang; + this.job = job; } public Map generateSessionApi(GProtoName fullname) throws ScribException { - this.lang.verbosePrintln("\n[Java API gen] Running " + this.job.verbosePrintln("\n[Java API gen] Running " + SessionApiGenerator.class + " for " + fullname); - SessionApiGenerator sg = new SessionApiGenerator(this.lang, fullname); // FIXME: reuse? + SessionApiGenerator sg = new SessionApiGenerator(this.job, fullname); // FIXME: reuse? Map map = sg.generateApi(); // filepath -> class source return map; } @@ -53,9 +53,9 @@ public Map generateStateChannelApi(GProtoName fullname, { buildGraph(fullname, self); }*/ - lang.verbosePrintln("\n[Java API gen] Running " + job.verbosePrintln("\n[Java API gen] Running " + StateChannelApiGenerator.class + " for " + fullname + "@" + self); - StateChannelApiGenerator apigen = new StateChannelApiGenerator(this.lang, + StateChannelApiGenerator apigen = new StateChannelApiGenerator(this.job, fullname, self); IOInterfacesGenerator iogen = null; try @@ -65,7 +65,7 @@ public Map generateStateChannelApi(GProtoName fullname, catch (RuntimeScribException e) // FIXME: use IOInterfacesGenerator.skipIOInterfacesGeneration { //System.err.println("[Warning] Skipping I/O Interface generation for protocol featuring: " + fullname); - this.lang.warningPrintln("Skipping I/O Interface generation for: " + this.job.warningPrintln("Skipping I/O Interface generation for: " + fullname + "\n Cause: " + e.getMessage()); } // Construct the Generators first, to build all the types -- then call generate to "compile" all Builders to text (further building changes will not be output) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 010174907..f65033e6c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -26,9 +26,9 @@ import org.scribble.ast.SigDecl; import org.scribble.ast.Module; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; -import org.scribble.core.job.Job; -import org.scribble.core.job.JobArgs; -import org.scribble.core.job.JobContext; +import org.scribble.core.job.Core; +import org.scribble.core.job.CoreArgs; +import org.scribble.core.job.CoreContext; import org.scribble.core.model.MState; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.EStateKind; @@ -37,7 +37,7 @@ import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.PayElemType; import org.scribble.core.type.name.Role; -import org.scribble.lang.Lang; +import org.scribble.job.Job; import org.scribble.util.ScribException; // FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) @@ -45,19 +45,19 @@ @Deprecated public class CBEndpointApiGenerator { - public final Lang lang; public final Job job; + public final Core core; public final GProtoName proto; public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral private final boolean subtypes; - public CBEndpointApiGenerator(Lang job, GProtoName fullname, Role self, boolean subtypes) + public CBEndpointApiGenerator(Job job, GProtoName fullname, Role self, boolean subtypes) { - this.lang = job; + this.job = job; try { - this.job = job.getJob(); + this.core = job.getCore(); } catch (ScribException e) // TODO: refactor { @@ -82,19 +82,19 @@ public Map build() throws ScribException public Map buildSessionApi() throws ScribException // FIXME: factor out -- integrate with JEndpointApiGenerator { - this.lang.verbosePrintln("\n[param-core] Running " + CBEndpointApiGenerator.class + " for " + this.proto + "@" + this.self); + this.job.verbosePrintln("\n[param-core] Running " + CBEndpointApiGenerator.class + " for " + this.proto + "@" + this.self); Map res = new HashMap<>(); - res.putAll(new SessionApiGenerator(this.lang, this.proto).generateApi()); + res.putAll(new SessionApiGenerator(this.job, this.proto).generateApi()); res.putAll(buildEndpointClass()); return res; } public Map buildEndpointClass() throws ScribException { - Module main = this.lang.getContext().getMainModule(); - JobContext jobc2 = this.job.getContext(); - EState init = (this.job.config.args.get(JobArgs.MIN_EFSM) + Module main = this.job.getContext().getMainModule(); + CoreContext jobc2 = this.core.getContext(); + EState init = (this.core.config.args.get(CoreArgs.MIN_EFSM) ? jobc2.getMinimisedEGraph(this.proto, this.self) : jobc2.getEGraph(this.proto, this.self) ).init; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 27041f65b..d670eea3b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -32,9 +32,9 @@ import org.scribble.codegen.java.util.FieldBuilder; import org.scribble.codegen.java.util.InterfaceBuilder; import org.scribble.codegen.java.util.MethodBuilder; -import org.scribble.core.job.Job; -import org.scribble.core.job.JobArgs; -import org.scribble.core.job.JobContext; +import org.scribble.core.job.Core; +import org.scribble.core.job.CoreArgs; +import org.scribble.core.job.CoreContext; import org.scribble.core.model.MState; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.EStateKind; @@ -42,10 +42,10 @@ import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.SigName; +import org.scribble.job.Job; +import org.scribble.job.JobContext; import org.scribble.core.type.name.PayElemType; import org.scribble.core.type.name.Role; -import org.scribble.lang.Lang; -import org.scribble.lang.LangContext; import org.scribble.util.ScribException; // FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) @@ -54,8 +54,8 @@ // FIXME: consider also "expanding" nested message constructors by op first? -- and consider "partial constructors" along expansions, can they be parameterised typed? public class CBEndpointApiGenerator3 { - public final Lang lang; public final Job job; + public final Core core; public final GProtoName proto; public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral @@ -63,13 +63,13 @@ public class CBEndpointApiGenerator3 //private final boolean subtypes; // Generate full hierarchy (states -> states, not just indivdual state -> cases) -- cf. ioifaces - public CBEndpointApiGenerator3(Lang lang, GProtoName fullname, Role self, + public CBEndpointApiGenerator3(Job job, GProtoName fullname, Role self, boolean subtypes) { - this.lang = lang; + this.job = job; try { - this.job = lang.getJob(); + this.core = job.getCore(); } catch (ScribException e) // TODO: refactor { @@ -96,21 +96,21 @@ public Map build() throws ScribException // FIXME: factor out -- integrate with JEndpointApiGenerator public Map buildSessionApi() throws ScribException { - this.lang.verbosePrintln("\n[param-core] Running " + CBEndpointApiGenerator3.class + " for " + this.proto + "@" + this.self); + this.job.verbosePrintln("\n[param-core] Running " + CBEndpointApiGenerator3.class + " for " + this.proto + "@" + this.self); Map res = new HashMap<>(); - res.putAll(new SessionApiGenerator(this.lang, this.proto).generateApi()); + res.putAll(new SessionApiGenerator(this.job, this.proto).generateApi()); res.putAll(buildEndpointClass()); return res; } public Map buildEndpointClass() throws ScribException { - Module main = this.lang.getContext().getMainModule(); + Module main = this.job.getContext().getMainModule(); Map res = new HashMap<>(); - JobContext jobc2 = this.job.getContext(); - EState init = (this.job.config.args.get(JobArgs.MIN_EFSM) + CoreContext jobc2 = this.core.getContext(); + EState init = (this.core.config.args.get(CoreArgs.MIN_EFSM) ? jobc2.getMinimisedEGraph(this.proto, this.self) : jobc2.getEGraph(this.proto, this.self) ).init; @@ -223,7 +223,7 @@ public Map buildEndpointClass() throws ScribException }*/ // branches - LangContext jobc = this.lang.getContext(); + JobContext jobc = this.job.getContext(); for (EState s : states) { if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) @@ -504,7 +504,7 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, protected String generateStateClass(EState s, String rootPack, EStateKind kind, String stateName, String endpointName) { - Module main = this.lang.getContext().getMainModule(); + Module main = this.job.getContext().getMainModule(); String stateKind; switch (kind) @@ -675,7 +675,7 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, } // FIXME: refactor using TypeBuilder API - protected String generateBranch(String bprefix, LangContext jc, EState s, String endpointName, String rootPack, String branchName) + protected String generateBranch(String bprefix, JobContext jc, EState s, String endpointName, String rootPack, String branchName) { String branchAbstract = ""; branchAbstract += "package " + getHandlersSelfPackage() + ";\n"; @@ -732,7 +732,7 @@ protected String generateBranch(String bprefix, LangContext jc, EState s, String } protected String generateReceiveInterface(boolean isSig, - SigDecl msnd, LangContext jc, EAction a, String rootPack, + SigDecl msnd, JobContext jc, EAction a, String rootPack, String receiveIfName) { String receiveInterface = ""; @@ -1001,7 +1001,7 @@ protected String getMessagesPackage(String rootPack) protected SigDecl getMessageSigNameDecl(SigName mid) { return (SigDecl) - this.lang.getContext().getMainModule().getNonProtoDeclChildren().stream() // FIXME: main module? + this.job.getContext().getMainModule().getNonProtoDeclChildren().stream() // FIXME: main module? .filter(npd -> (npd instanceof SigDecl) && ((SigDecl) npd).getDeclName().toString().equals(mid.toString())) .iterator().next(); } @@ -1009,7 +1009,7 @@ protected SigDecl getMessageSigNameDecl(SigName mid) //protected final Function, String> getExtName = e -> protected String getExtName(PayElemType e) { - String extName = this.lang.getContext().getMainModule().getDataTypeDeclChild((DataName) e).getExtName(); + String extName = this.job.getContext().getMainModule().getDataTypeDeclChild((DataName) e).getExtName(); return (extName.indexOf(".") != -1) ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) : extName; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index ab171d1eb..77be6d366 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -34,7 +34,7 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.visit.MessageIdGatherer; -import org.scribble.lang.Lang; +import org.scribble.job.Job; import org.scribble.util.ScribException; public class SessionApiGenerator extends ApiGen @@ -55,9 +55,9 @@ public class SessionApiGenerator extends ApiGen private final ClassBuilder cb = new ClassBuilder(); private final Map classes = new HashMap<>(); // All classes in same package, for protected constructor access - public SessionApiGenerator(Lang lang, GProtoName fullname) throws ScribException + public SessionApiGenerator(Job job, GProtoName fullname) throws ScribException { - super(lang, fullname); + super(job, fullname); constructRoleClasses(); constructOpClasses(); constructSessionClass(); // Depends on the above two being done first @@ -189,7 +189,7 @@ private void constructOpClasses() throws ScribException MessageIdCollector coll = new MessageIdCollector(this.lang, ((ModuleDel) mod.del()).getModuleContext()); gpd.accept(coll); for (MessageId mid : coll.getNames())*/ - GProtocol inlined = this.job.getContext().getInlined(this.gpn); + GProtocol inlined = this.core.getContext().getInlined(this.gpn); for (MsgId mid : inlined.def .gather(new MessageIdGatherer()::visit) .collect(Collectors.toList())) @@ -203,7 +203,7 @@ private void constructOpClasses() throws ScribException private void constructRoleClasses() throws ScribException { - Module mod = this.lang.getContext().getModule(this.gpn.getPrefix()); + Module mod = this.job.getContext().getModule(this.gpn.getPrefix()); GProtoName simpname = this.gpn.getSimpleName(); GProtoDecl gpd = (GProtoDecl) mod.getGProtocolDeclChild(simpname); for (Role r : gpd.getRoles()) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 0a81c2f5e..a435bfc36 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -22,15 +22,15 @@ import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.TypeBuilder; -import org.scribble.core.job.JobArgs; -import org.scribble.core.job.JobContext; +import org.scribble.core.job.CoreArgs; +import org.scribble.core.job.CoreContext; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.visit.global.InlinedProjector; -import org.scribble.lang.Lang; +import org.scribble.job.Job; import org.scribble.util.ScribException; // TODO: "wildcard" unary async: op doesn't matter -- for branch-receive op "still needed" to cast to correct branch state @@ -57,18 +57,18 @@ public class StateChannelApiGenerator extends ApiGen private Map types = new HashMap<>(); // class/iface name key - public StateChannelApiGenerator(Lang lang, GProtoName fullname, Role self) + public StateChannelApiGenerator(Job job, GProtoName fullname, Role self) throws ScribException // CHECKME: APIGenerationException? { - super(lang, fullname); + super(job, fullname); this.self = self; this.lpn = InlinedProjector.getFullProjectionName(fullname, self); //this.init = job.getContext().getEndpointGraph(fullname, self).init; - JobContext jobc2 = this.job.getContext(); - this.init = this.job.config.args.get(JobArgs.MIN_EFSM) - ? jobc2.getMinimisedEGraph(fullname, self).init - : jobc2.getEGraph(fullname, self).init; + CoreContext corec = this.core.getContext(); + this.init = this.job.config.args.get(CoreArgs.MIN_EFSM) + ? corec.getMinimisedEGraph(fullname, self).init + : corec.getEGraph(fullname, self).init; this.skipIOInterfacesGeneration = skipIOInterfacesGeneration(this.init); @@ -210,7 +210,7 @@ protected EState getInitialState() protected Module getMainModule() { - return this.lang.getContext().getMainModule(); + return this.job.getContext().getMainModule(); } protected void addTypeDecl(TypeBuilder tb) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index d5ad1e952..99964ddf5 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -37,8 +37,8 @@ import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.codegen.java.util.MethodBuilder; import org.scribble.codegen.java.util.TypeBuilder; -import org.scribble.core.job.JobArgs; -import org.scribble.core.job.JobContext; +import org.scribble.core.job.CoreArgs; +import org.scribble.core.job.CoreContext; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.EStateKind; import org.scribble.core.model.endpoint.actions.EAction; @@ -80,10 +80,10 @@ public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) GProtoName fullname = apigen.getGProtocolName(); Role self = getSelf(); //EndpointState init = this.job.getContext().getEndpointGraph(fullname, self).init; - JobContext jobc2 = this.job.getContext(); - EState init = this.job.config.args.get(JobArgs.MIN_EFSM) - ? jobc2.getMinimisedEGraph(fullname, self).init - : jobc2.getEGraph(fullname, self).init; + CoreContext corec = this.core.getContext(); + EState init = this.job.config.args.get(CoreArgs.MIN_EFSM) + ? corec.getMinimisedEGraph(fullname, self).init + : corec.getEGraph(fullname, self).init; //if (IOInterfacesGenerator.skipIOInterfacesGeneration(init)) { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index 6bdfca4a7..f10bc5583 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -24,11 +24,11 @@ import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.Role; -import org.scribble.lang.Lang; +import org.scribble.job.Job; public abstract class STStateChanAPIBuilder { - public final Lang lang; + public final Job job; public final GProtoName gpn; public final Role role; @@ -42,10 +42,11 @@ public abstract class STStateChanAPIBuilder private Map names = new HashMap<>(); - protected STStateChanAPIBuilder(Lang lang, GProtoName gpn, Role role, EGraph graph, - STOutputStateBuilder ob, STReceiveStateBuilder rb, STBranchStateBuilder bb, STCaseBuilder cb, STEndStateBuilder eb) + protected STStateChanAPIBuilder(Job job, GProtoName gpn, Role role, + EGraph graph, STOutputStateBuilder ob, STReceiveStateBuilder rb, + STBranchStateBuilder bb, STCaseBuilder cb, STEndStateBuilder eb) { - this.lang = lang; + this.job = job; this.gpn = gpn; this.role = role; diff --git a/scribble-core/src/main/java/org/scribble/core/job/Job.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/core/job/Job.java rename to scribble-core/src/main/java/org/scribble/core/job/Core.java index 1f3351e67..a30112288 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Job.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -46,37 +46,37 @@ import org.scribble.util.ScribException; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models -public class Job +public class Core { - public final JobConfig config; // Immutable + public final CoreConfig config; // Immutable - private final JobContext context; // Mutable (Visitor passes replace modules) + private final CoreContext context; // Mutable (Visitor passes replace modules) private final SGraphBuilderUtil sgraphb; - public Job(ModuleName mainFullname, Map args, + public Core(ModuleName mainFullname, Map args, //Map modcs, Set imeds) { - this.config = newJobConfig(mainFullname, args); - this.context = newJobContext(//modcs, + this.config = newCoreConfig(mainFullname, args); + this.context = newCoreContext(//modcs, imeds); // Single instance per Job and should never be shared this.sgraphb = newSGraphBuilderUtil(); } // A Scribble extension should override newJobConfig/Context/etc as appropriate - protected JobConfig newJobConfig(ModuleName mainFullname, - Map args) + protected CoreConfig newCoreConfig(ModuleName mainFullname, + Map args) { ModelFactory mf = new ModelFactoryImpl(); - return new JobConfig(mainFullname, args, mf); + return new CoreConfig(mainFullname, args, mf); // CHECKME: combine E/SModelFactory? } // A Scribble extension should override newJobConfig/Context/etc as appropriate - protected JobContext newJobContext(//Map modcs, + protected CoreContext newCoreContext(//Map modcs, Set imeds) { - return new JobContext(this, //modcs, + return new CoreContext(this, //modcs, imeds); } @@ -221,9 +221,9 @@ public void runValidationPasses() throws ScribException verbosePrintln("\nValidating " + fullname + ":"); - if (this.config.args.get(JobArgs.SPIN)) + if (this.config.args.get(CoreArgs.SPIN)) { - if (this.config.args.get(JobArgs.FAIR)) + if (this.config.args.get(CoreArgs.FAIR)) { throw new RuntimeException( "[TODO]: -spin currently does not support fair ouput choices."); @@ -233,7 +233,7 @@ public void runValidationPasses() throws ScribException else { GProtocol.validateByScribble(this, fullname, true); - if (!this.config.args.get(JobArgs.FAIR)) + if (!this.config.args.get(CoreArgs.FAIR)) { verbosePrintln( "(" + fullname + ") Validating with \"unfair\" output choices.. "); @@ -352,14 +352,14 @@ public Map generateStateChannelApi(GProtocolName fullname, Role return api; }*/ - public JobContext getContext() + public CoreContext getContext() { return this.context; } public boolean isVerbose() { - return this.config.args.get(JobArgs.VERBOSE); + return this.config.args.get(CoreArgs.VERBOSE); } public void warningPrintln(String s) @@ -369,7 +369,7 @@ public void warningPrintln(String s) public void verbosePrintln(String s) { - if (this.config.args.get(JobArgs.VERBOSE)) + if (this.config.args.get(CoreArgs.VERBOSE)) { System.out.println(s); } diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobArgs.java b/scribble-core/src/main/java/org/scribble/core/job/CoreArgs.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/core/job/JobArgs.java rename to scribble-core/src/main/java/org/scribble/core/job/CoreArgs.java index c0ba5e890..1028573cf 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobArgs.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreArgs.java @@ -13,7 +13,7 @@ */ package org.scribble.core.job; -public enum JobArgs +public enum CoreArgs { VERBOSE, FAIR, diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java b/scribble-core/src/main/java/org/scribble/core/job/CoreConfig.java similarity index 86% rename from scribble-core/src/main/java/org/scribble/core/job/JobConfig.java rename to scribble-core/src/main/java/org/scribble/core/job/CoreConfig.java index e7fc73707..105560ba3 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreConfig.java @@ -20,14 +20,14 @@ import org.scribble.core.type.name.ModuleName; // The "static" (constant) info for Jobs -- cf. JobContext "dynamic" state -public class JobConfig +public class CoreConfig { public final ModuleName main; // Full name - public final Map args; // CHECKME: verbose/debug printing parameter ? + public final Map args; // CHECKME: verbose/debug printing parameter ? public final ModelFactory mf; // N.B. MainContext is in a different non-visible (by Maven) package - public JobConfig(ModuleName main, Map args, + public CoreConfig(ModuleName main, Map args, ModelFactory ef) { this.main = main; diff --git a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/core/job/JobContext.java rename to scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index f224587ac..98f69210d 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/JobContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -37,9 +37,9 @@ // Global "static" context information for a Job -- single instance per Job, should not be shared between Jobs // Mutable: projections, graphs, etc are added mutably later -- replaceModule also mutable setter -- "users" get this from the Job and expect to setter mutate "in place" -public class JobContext +public class CoreContext { - public final Job job; + public final Core core; // Keys are full names // CHECKME: not currently used by core? -- core fully independent of modules, etc., because full disamb already done? (by imed translation) @@ -72,10 +72,10 @@ public class JobContext private final Map fSGraphs = new HashMap<>(); private final Map uSGraphs = new HashMap<>(); - protected JobContext(Job job, //Map modcs, + protected CoreContext(Core core, //Map modcs, Set imeds) { - this.job = job; + this.core = core; //this.modcs = Collections.unmodifiableMap(modcs); this.imeds = imeds.stream() .collect(Collectors.toMap(x -> x.fullname, x -> x)); @@ -223,7 +223,7 @@ public EGraph getUnfairEGraph(GProtoName fullname, Role role) if (unfair == null) { unfair = getEGraph(fullname, role).init - .unfairTransform(this.job.config.mf).toGraph(); + .unfairTransform(this.core.config.mf).toGraph(); addUnfairEGraph(fulllpn, unfair); } return unfair; @@ -247,7 +247,7 @@ public SGraph getSGraph(GProtoName fullname) throws ScribException boolean explicit = //gpd.isExplicit(); this.imeds.get(fullname).isExplicit(); //graph = SGraph.buildSGraph(egraphs, explicit, this.job, fullname); - graph = this.job.buildSGraph(fullname, egraphs, explicit); + graph = this.core.buildSGraph(fullname, egraphs, explicit); addSGraph(fullname, graph); } return graph; @@ -285,7 +285,7 @@ public SGraph getUnfairSGraph(GProtoName fullname) throws ScribException boolean explicit = //gpd.isExplicit(); this.imeds.get(fullname).isExplicit(); //graph = SGraph.buildSGraph(this.job, fullname, this.job.createInitialSConfig(job, egraphs, explicit)); - graph = this.job.buildSGraph(fullname, egraphs, explicit); + graph = this.core.buildSGraph(fullname, egraphs, explicit); addUnfairSGraph(fullname, graph); } return graph; @@ -307,7 +307,7 @@ public EGraph getMinimisedEGraph(GProtoName fullname, Role role) { String aut = runAut(getEGraph(fullname, role).init.toAut(), fulllpn + ".aut"); - minimised = new AutGraphParser(this.job).parse(aut); + minimised = new AutGraphParser(this.core).parse(aut); addMinimisedEGraph(fulllpn, minimised); } return minimised; diff --git a/scribble-core/src/main/java/org/scribble/core/lang/LangConstants.java b/scribble-core/src/main/java/org/scribble/core/lang/Constants.java similarity index 93% rename from scribble-core/src/main/java/org/scribble/core/lang/LangConstants.java rename to scribble-core/src/main/java/org/scribble/core/lang/Constants.java index 9e3eed9cf..59494288f 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/LangConstants.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/Constants.java @@ -14,10 +14,10 @@ package org.scribble.core.lang; @Deprecated -public class LangConstants +public class Constants { - public LangConstants() + public Constants() { // TODO Auto-generated constructor stub } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index d80cd75e7..6d0df7b78 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -25,9 +25,9 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.Job; -import org.scribble.core.job.JobArgs; -import org.scribble.core.job.JobContext; +import org.scribble.core.job.Core; +import org.scribble.core.job.CoreArgs; +import org.scribble.core.job.CoreContext; import org.scribble.core.lang.Protocol; import org.scribble.core.lang.ProtocolMod; import org.scribble.core.lang.SubprotoSig; @@ -97,19 +97,19 @@ public void checkExtChoiceConsistency() throws ScribException } // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) - public LProjection projectInlined(Job job, Role self) + public LProjection projectInlined(Core core, Role self) { LSeq body = (LSeq) this.def - .visitWithNoThrow(new InlinedProjector(job, self)); + .visitWithNoThrow(new InlinedProjector(core, self)); return projectAux(self, this.roles, body); } - public LProjection project(Job job, Role self) + public LProjection project(Core core, Role self) { - LSeq body = (LSeq) this.def.visitWithNoThrow(new Projector(job, self)) + LSeq body = (LSeq) this.def.visitWithNoThrow(new Projector(core, self)) .visitWithNoThrow(new RecPruner<>()); return projectAux(self, - job.getContext().getInlined(this.fullname).roles, // Used inlined decls, already pruned + core.getContext().getInlined(this.fullname).roles, // Used inlined decls, already pruned body); } @@ -220,25 +220,25 @@ public boolean canEquals(Object o) // TODO FIXME: refactor following methods (e.g., make non-static?) - public static void validateByScribble(Job job, GProtoName fullname, + public static void validateByScribble(Core core, GProtoName fullname, boolean fair) throws ScribException { - JobContext jc = job.getContext(); + CoreContext corec = core.getContext(); SGraph graph = (fair) - ? jc.getSGraph(fullname) - : jc.getUnfairSGraph(fullname); + ? corec.getSGraph(fullname) + : corec.getUnfairSGraph(fullname); //graph.toModel().validate(job); - job.config.mf.newSModel(graph).validate(job); + core.config.mf.newSModel(graph).validate(core); } - public static void validateBySpin(Job job, GProtoName fullname) + public static void validateBySpin(Core core, GProtoName fullname) throws ScribException { - JobContext jobc = job.getContext(); + CoreContext corec = core.getContext(); /*Module mod = jc.getModule(fullname.getPrefix()); GProtocolDecl gpd = (GProtocolDecl) mod .getProtocolDeclChild(fullname.getSimpleName());*/ - GProtocol gpd = jobc.getInlined(fullname); + GProtocol gpd = corec.getInlined(fullname); List rs = //gpd.getHeaderChild().getRoleDeclListChild().getRoles() gpd.roles @@ -294,9 +294,9 @@ public static void validateBySpin(Job job, GProtoName fullname) for (Role r : rs) { - pml += "\n\n" + jobc.getEGraph(fullname, r).toPml(r); + pml += "\n\n" + corec.getEGraph(fullname, r).toPml(r); } - if (job.config.args.get(JobArgs.VERBOSE)) + if (core.config.args.get(CoreArgs.VERBOSE)) { System.out.println("[-spin]: Promela processes\n" + pml + "\n"); } @@ -305,7 +305,7 @@ public static void validateBySpin(Job job, GProtoName fullname) for (Role r : rs) { Set tmp = new HashSet<>(); - EGraph g = jobc.getEGraph(fullname, r); + EGraph g = corec.getEGraph(fullname, r); tmp.add(g.init); tmp.addAll(MState.getReachableStates(g.init)); if (g.term != null) @@ -354,7 +354,7 @@ public static void validateBySpin(Job job, GProtoName fullname) int j = (i+batchSize < clauses.size()) ? i+batchSize : clauses.size(); String batch = clauses.subList(i, j).stream().collect(Collectors.joining(" && ")); String ltl = "ltl {\n" + batch + "\n" + "}"; - if (job.config.args.get(JobArgs.VERBOSE)) + if (core.config.args.get(CoreArgs.VERBOSE)) { System.out.println("[-spin] Batched ltl:\n" + ltl + "\n"); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 27e7c555e..50277758d 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -20,7 +20,7 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.Job; +import org.scribble.core.job.Core; import org.scribble.core.lang.Protocol; import org.scribble.core.lang.ProtocolMod; import org.scribble.core.lang.SubprotoSig; @@ -120,17 +120,17 @@ public LProtocol unfoldAllOnce(STypeUnfolder v) this.self, this.params, unf); } - public EGraph toEGraph(Job job) + public EGraph toEGraph(Core core) { //EGraphBuilderUtil2 b = job.newEGraphBuilderUtil(); ////b.init(null); // FIXME: init param not used if (this.def.isEmpty()) // Empty Seq special case for top-level -- in general, Seq must be non-empty, cf. LSeq::buildGraph entry/exit { //EState s = b.getEntry(); - EState s = job.config.mf.newEState(Collections.emptySet()); + EState s = core.config.mf.newEState(Collections.emptySet()); return new EGraph(s, s); } - EGraphBuilder b = new EGraphBuilder(job); + EGraphBuilder b = new EGraphBuilder(core); this.def.visitWithNoThrow(b); return b.finalise(); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java index f3fdb31ed..f1412cfa0 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java @@ -26,7 +26,7 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.core.job.Job; +import org.scribble.core.job.Core; import org.scribble.core.model.ModelFactory; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.DataName; @@ -38,16 +38,16 @@ public class AutGraphParser { - private final Job job; + private final Core core; - public AutGraphParser(Job job) + public AutGraphParser(Core core) { - this.job = job; + this.core = core; } public EGraph parse(String aut) { - ModelFactory ef = this.job.config.mf; + ModelFactory ef = this.core.config.mf; //Map> edges = new HashMap<>(); Map> as = new HashMap<>(); @@ -116,7 +116,7 @@ public EGraph parse(String aut) } //EGraphBuilderUtil util = new EGraphBuilderUtil(ef); //EGraphBuilderUtil util = this.job2.newEGraphBuilderUtil2(); - EGraphBuilderUtil util = this.job.newEGraphBuilderUtil(); + EGraphBuilderUtil util = this.core.newEGraphBuilderUtil(); //util.init(null); // FIXME: arg is deprecated Map map = new HashMap<>(); map.put(init, util.getEntry()); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index 4d92dcbc4..1abef4901 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -21,8 +21,8 @@ import java.util.Map.Entry; import java.util.stream.Collectors; -import org.scribble.core.job.Job; -import org.scribble.core.job.JobArgs; +import org.scribble.core.job.Core; +import org.scribble.core.job.CoreArgs; import org.scribble.core.model.GraphBuilderUtil; import org.scribble.core.model.ModelFactory; import org.scribble.core.model.endpoint.EFSM; @@ -68,16 +68,16 @@ protected SConfig createInitialSConfig(ModelFactory ef, Map egraph // Also checks for non-deterministic payloads // Maybe refactor into an SGraph builder util; cf., EGraphBuilderUtil -- but not Visitor-based building (cf. EndpointGraphBuilder), this isn't an AST algorithm //public SGraph buildSGraph(Job job, GProtocolName fullname, SConfig c0) throws ScribbleException - public SGraph buildSGraph(Job job, GProtoName fullname, Map egraphs, boolean explicit) throws ScribException + public SGraph buildSGraph(Core core, GProtoName fullname, Map egraphs, boolean explicit) throws ScribException { /*Map efsms = egraphs.entrySet().stream().collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().toFsm())); SBuffers b0 = new SBuffers(job.ef, efsms.keySet(), !explicit);*/ //SConfig c0 = job.sf.newSConfig(efsms, b0); - SConfig c0 = createInitialSConfig(job.config.mf, egraphs, explicit); + SConfig c0 = createInitialSConfig(core.config.mf, egraphs, explicit); - SState init = job.config.mf.newSState(c0); + SState init = core.config.mf.newSState(c0); Map seen = new HashMap<>(); LinkedHashSet todo = new LinkedHashSet<>(); @@ -92,12 +92,12 @@ public SGraph buildSGraph(Job job, GProtoName fullname, Map egraph i.remove(); seen.put(curr.id, curr); - if (job.config.args.get(JobArgs.VERBOSE)) + if (core.config.args.get(CoreArgs.VERBOSE)) { count++; if (count % 50 == 0) { - job.verbosePrintln("(" + fullname + ") Building global states: " + count); + core.verbosePrintln("(" + fullname + ") Building global states: " + count); } } @@ -145,8 +145,8 @@ else if (k == EStateKind.UNARY_INPUT || k == EStateKind.POLY_INPUT || k == EStat { if (a.isSend() || a.isReceive() || a.isDisconnect()) { - getNextStates(job.config.mf, todo, seen, curr, - a.toGlobal(job.config.mf, r), curr.fire(r, a)); + getNextStates(core.config.mf, todo, seen, curr, + a.toGlobal(core.config.mf, r), curr.fire(r, a)); } else if (a.isAccept() || a.isRequest()) { @@ -157,10 +157,10 @@ else if (a.isAccept() || a.isRequest()) as.remove(d); // Removes one occurrence //getNextStates(seen, todo, curr.sync(r, a, a.peer, d)); SAction g = (a.isRequest()) - ? a.toGlobal(job.config.mf, r) - : d.toGlobal(job.config.mf, a.peer); + ? a.toGlobal(core.config.mf, r) + : d.toGlobal(core.config.mf, a.peer); // Edge will be drawn as the connect, but should be read as the sync. of both -- something like "r1, r2: sync" may be more consistent (or take a set of actions as the edge label) - getNextStates(job.config.mf, todo, seen, curr, g, + getNextStates(core.config.mf, todo, seen, curr, g, curr.sync(r, a, a.peer, d)); } } @@ -172,9 +172,9 @@ else if (a.isWrapClient() || a.isWrapServer()) { as.remove(w); // Removes one occurrence SAction g = (a.isRequest()) - ? a.toGlobal(job.config.mf, r) - : w.toGlobal(job.config.mf, a.peer); - getNextStates(job.config.mf, todo, seen, curr, g, curr.sync(r, a, a.peer, w)); + ? a.toGlobal(core.config.mf, r) + : w.toGlobal(core.config.mf, a.peer); + getNextStates(core.config.mf, todo, seen, curr, g, curr.sync(r, a, a.peer, w)); } } else @@ -185,9 +185,9 @@ else if (a.isWrapClient() || a.isWrapServer()) } } - SGraph graph = job.config.mf.newSGraph(fullname, seen, init); + SGraph graph = core.config.mf.newSGraph(fullname, seen, init); - job.verbosePrintln( + core.verbosePrintln( "(" + fullname + ") Built global model..\n" + graph.init.toDot() + "\n(" + fullname + ") .." + graph.states.size() + " states"); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index 141a4abb7..9e32554f1 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -21,8 +21,8 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.core.job.Job; -import org.scribble.core.job.JobArgs; +import org.scribble.core.job.Core; +import org.scribble.core.job.CoreArgs; import org.scribble.core.model.endpoint.EFSM; import org.scribble.core.model.endpoint.actions.ESend; import org.scribble.core.model.global.actions.SAction; @@ -38,7 +38,7 @@ public SModel(SGraph graph) this.graph = graph; } - public void validate(Job job) throws ScribException + public void validate(Core core) throws ScribException { SState init = this.graph.init; Map states = this.graph.states; @@ -48,13 +48,13 @@ public void validate(Job job) throws ScribException int count = 0; for (SState s : states.values()) { - if (job.config.args.get(JobArgs.VERBOSE)) + if (core.config.args.get(CoreArgs.VERBOSE)) { count++; if (count % 50 == 0) { //job.debugPrintln("(" + this.graph.proto + ") Checking safety: " + count + " states"); - job.verbosePrintln( + core.verbosePrintln( "(" + this.graph.proto + ") Checking states: " + count); } } @@ -69,10 +69,10 @@ public void validate(Job job) throws ScribException } errorMsg = appendSafetyErrorMessages(errorMsg, errors); } - job.verbosePrintln("(" + this.graph.proto + ") Checked all states: " + count); // May include unsafe states + core.verbosePrintln("(" + this.graph.proto + ") Checked all states: " + count); // May include unsafe states //*/ - if (!job.config.args.get(JobArgs.NO_PROGRESS)) + if (!core.config.args.get(CoreArgs.NO_PROGRESS)) { //job.debugPrintln("(" + this.graph.proto + ") Checking progress: "); // Incompatible with current errorMsg approach*/ @@ -85,7 +85,7 @@ public void validate(Job job) throws ScribException Set starved = checkRoleProgress(states, init, termset); Map> ignored = checkEventualReception(states, init, termset); - errorMsg = appendProgressErrorMessages(errorMsg, starved, ignored, job, + errorMsg = appendProgressErrorMessages(errorMsg, starved, ignored, core, states, termset); } } @@ -121,28 +121,28 @@ protected String appendSafetyErrorMessages(String errorMsg, } protected String appendProgressErrorMessages(String errorMsg, - Set starved, Map> ignored, Job job, + Set starved, Map> ignored, Core core, Map states, Set termset) { if (!starved.isEmpty()) { errorMsg += "\nRole progress violation for " + starved + " in session state terminal set:\n " - + termSetToString(job, termset, states); + + termSetToString(core, termset, states); } if (!ignored.isEmpty()) { errorMsg += "\nEventual reception violation for " + ignored + " in session state terminal set:\n " - + termSetToString(job, termset, states); + + termSetToString(core, termset, states); } return errorMsg; } - protected String termSetToString(Job job, Set termset, + protected String termSetToString(Core core, Set termset, Map all) { - return job.config.args.get(JobArgs.VERBOSE) + return core.config.args.get(CoreArgs.VERBOSE) ? termset.stream().map((i) -> all.get(i).toString()) .collect(Collectors.joining(",")) : termset.stream().map((i) -> new Integer(all.get(i).id).toString()) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java index ac5cde88e..fdc034485 100755 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java @@ -21,7 +21,7 @@ import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.job.Job; +import org.scribble.core.job.Core; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.RecVar; @@ -33,7 +33,7 @@ public abstract class STypeInliner> extends STypeVisitorNoThrow { - public final Job job; + public final Core core; // Basically, "SubprotocolVisitor" -- factor out? private final Deque stack = new LinkedList<>(); @@ -44,9 +44,9 @@ public abstract class STypeInliner> private final Map> recs = new HashMap<>(); - public STypeInliner(Job job) + public STypeInliner(Core core) { - this.job = job; + this.core = core; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java index 4d247926d..4b8cfeb29 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java @@ -13,7 +13,7 @@ */ package org.scribble.core.visit.global; -import org.scribble.core.job.Job; +import org.scribble.core.job.Core; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.kind.Global; @@ -30,9 +30,9 @@ public class GTypeInliner extends STypeInliner { - public GTypeInliner(Job job) + public GTypeInliner(Core core) { - super(job); + super(core); } @Override @@ -46,7 +46,7 @@ public > GType visitDo(Do n) return new GContinue(n.getSource(), rv); } pushSig(sig); - GProtocol g = this.job.getContext().getIntermediate(fullname); + GProtocol g = this.core.getContext().getIntermediate(fullname); Substitutor subs = new Substitutor<>(g.roles, n.roles, g.params, n.args); //GSeq inlined = (GSeq) g.def.visitWithNoEx(subs).visitWithNoEx(this); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index bc39e88bf..ed695f9a3 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -19,7 +19,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.core.job.Job; +import org.scribble.core.job.Core; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; @@ -53,12 +53,12 @@ // Pre: use on inlined (i.e., Do inlined, roles pruned) public class InlinedProjector extends STypeAggNoThrow { - public final Job job; + public final Core core; public final Role self; - public InlinedProjector(Job job, Role self) + public InlinedProjector(Core core, Role self) { - this.job = job; + this.core = core; this.self = self; } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java index f02c0e480..8ff868c19 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java @@ -17,8 +17,8 @@ import java.util.List; import java.util.stream.Collectors; -import org.scribble.core.job.Job; -import org.scribble.core.job.JobContext; +import org.scribble.core.job.Core; +import org.scribble.core.job.CoreContext; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtoName; @@ -35,9 +35,9 @@ // Supports Do -- can use on parsed (intermed) public class Projector extends InlinedProjector // This way or the other way round? { - public Projector(Job job, Role self) + public Projector(Core core, Role self) { - super(job, self); + super(core, self); } @Override @@ -48,12 +48,12 @@ public > LType visitDo(Do n) return LSkip.SKIP; } - JobContext jobc = this.job.getContext(); + CoreContext corec = this.core.getContext(); GProtoName proto = (GProtoName) n.proto; - GProtocol gpd = jobc.getIntermediate(proto); + GProtocol gpd = corec.getIntermediate(proto); Role targSelf = gpd.roles.get(n.roles.indexOf(this.self)); - GProtocol imed = jobc.getIntermediate(proto); + GProtocol imed = corec.getIntermediate(proto); if (!imed.roles.contains(targSelf)) // CHECKME: because roles already pruned for intermed decl? { return LSkip.SKIP; @@ -63,7 +63,7 @@ public > LType visitDo(Do n) targSelf); Substitutions subs = new Substitutions(imed.roles, n.roles, Collections.emptyList(), Collections.emptyList()); - List used = jobc.getInlined(proto).roles.stream() + List used = corec.getInlined(proto).roles.stream() .map(x -> subs.subsRole(x)).collect(Collectors.toList()); List rs = n.roles.stream().filter(x -> used.contains(x)) .map(x -> x.equals(this.self) ? Role.SELF : x) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index bdcd205de..d31069f7c 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -18,7 +18,7 @@ import java.util.LinkedList; import java.util.List; -import org.scribble.core.job.Job; +import org.scribble.core.job.Core; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.endpoint.EGraphBuilderUtil; import org.scribble.core.model.endpoint.EState; @@ -53,14 +53,14 @@ // Must use build as top-level call (does EGraphBuilderUtil2.finalise -- "resets" the util) public class EGraphBuilder extends STypeVisitorNoThrow { - public final Job job; + public final Core core; private EGraphBuilderUtil util; - public EGraphBuilder(Job job) + public EGraphBuilder(Core core) { - this.job = job; - this.util = job.newEGraphBuilderUtil(); + this.core = core; + this.util = core.newEGraphBuilderUtil(); this.util.init(null); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java index d5bbca53f..ee5ca99f5 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java @@ -13,7 +13,7 @@ */ package org.scribble.core.visit.local; -import org.scribble.core.job.Job; +import org.scribble.core.job.Core; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.local.LProtocol; import org.scribble.core.type.kind.Local; @@ -30,9 +30,9 @@ public class LTypeInliner extends STypeInliner { - public LTypeInliner(Job job) + public LTypeInliner(Core core) { - super(job); + super(core); } @Override @@ -46,7 +46,7 @@ public > LType visitDo(Do n) return new LContinue(n.getSource(), rv); } pushSig(sig); - LProtocol p = this.job.getContext().getProjection(fullname); // This line differs from GDo version + LProtocol p = this.core.getContext().getProjection(fullname); // This line differs from GDo version Substitutor subs = new Substitutor<>(p.roles, n.roles, p.params, n.args); //LSeq inlined = (LSeq) p.def.visitWithNoEx(subs).visitWithNoEx(this); diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index d726c8275..f74d535a0 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -20,24 +20,24 @@ import java.util.Map.Entry; import java.util.stream.Collectors; +import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.ImportDecl; import org.scribble.ast.ImportModule; import org.scribble.ast.Module; -import org.scribble.core.job.JobArgs; +import org.scribble.core.job.CoreArgs; import org.scribble.core.type.name.ModuleName; -import org.scribble.lang.Lang; +import org.scribble.job.Job; import org.scribble.main.resource.Resource; import org.scribble.main.resource.loader.ScribModuleLoader; import org.scribble.main.resource.locator.ResourceLocator; -import org.scribble.parser.scribble.AstFactoryImpl; -import org.scribble.parser.scribble.ScribAntlrWrapper; +import org.scribble.parser.ScribAntlrWrapper; import org.scribble.util.Pair; import org.scribble.util.ScribException; import org.scribble.util.ScribParserException; /** * Main loads the main module, and then all other (transitively) imported - * modules. Its main purpose is to offer the newLang factory method. + * modules. Its main purpose is to offer the newJob factory method. * * Main takes an abstract ResourceLocator, e.g. DirectoryResourceLocator -- (for * non-inline main modules)... @@ -51,7 +51,7 @@ public class Main { public final ModuleName main; - public final Map args; + public final Map args; private final ScribAntlrWrapper antlr; //private final ResourceLocator locator; // Path -> Resource @@ -66,13 +66,13 @@ public class Main // Load other modules via locator -- CHECKME: a bit inconsistent w.r.t. main? // TODO: make Path abstract as e.g. URI -- locator is abstract but Path is coupled to concrete DirectoryResourceLocator public Main(ResourceLocator locator, Path mainpath, - Map args) throws ScribException, ScribParserException + Map args) throws ScribException, ScribParserException { this(new Pair<>(locator, null), mainpath, args); } // Load an inline module arg -- module imports not allowed (currently no ResourceLocator) - public Main(String inline, Map args) + public Main(String inline, Map args) throws ScribException, ScribParserException { this(new Pair<>(null, inline), null, args); @@ -81,7 +81,7 @@ public Main(String inline, Map args) // Pre: hack.left == null xor hack.right == null // Hack to "unify" the constructors (to satisfy final field init more conveniently) private Main(Pair hack, Path mainpath, - Map args) throws ScribException, ScribParserException + Map args) throws ScribException, ScribParserException { this.antlr = new ScribAntlrWrapper(); @@ -112,19 +112,19 @@ private Main(Pair hack, Path mainpath, loadAllModuleImports(main); } - // A Scribble extension should override newAntlr/Lang as appropriate + // A Scribble extension should override newAntlr/Job as appropriate protected ScribAntlrWrapper newAntlr() { return new ScribAntlrWrapper(); } - // A Scribble extension should override newAntlr/Lang as appropriate - protected Lang newLang(Map parsed, - Map args, ModuleName mainFullname) throws ScribException + // A Scribble extension should override newAntlr/Job as appropriate + protected Job newJob(Map parsed, + Map args, ModuleName mainFullname) throws ScribException { AstFactoryImpl af = new AstFactoryImpl(this.antlr); - // Was previously made inside Lang, but AstFactoryImpl now lives in scribble-parser, to access ScribbleParser constants - return new Lang(mainFullname, args, parsed, af); + // Was previously made inside Job, but AstFactoryImpl now lives in scribble-parser, to access ScribbleParser constants + return new Job(mainFullname, args, parsed, af); } // Pre: main Module loaded by this.loader @@ -155,10 +155,10 @@ private void loadAllAux(Pair m) } } - // For a Scribble extension, override newLang(parsed, args, mainFullname) - public final Lang newLang() throws ScribException + // For a Scribble extension, override newJob(parsed, args, mainFullname) + public final Job newJob() throws ScribException { - return newLang(getParsedModules(), this.args, this.main); + return newJob(getParsedModules(), this.args, this.main); } public Map getParsedModules() diff --git a/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java b/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java index 35294f3e3..50499f6fa 100644 --- a/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java +++ b/scribble-main/src/main/java/org/scribble/main/resource/loader/ScribModuleLoader.java @@ -23,7 +23,7 @@ import org.scribble.main.resource.Resource; import org.scribble.main.resource.locator.DirectoryResourceLocator; import org.scribble.main.resource.locator.ResourceLocator; -import org.scribble.parser.scribble.ScribAntlrWrapper; +import org.scribble.parser.ScribAntlrWrapper; import org.scribble.util.Pair; import org.scribble.util.ScribException; import org.scribble.util.ScribParserException; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java similarity index 81% rename from scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java rename to scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index e923cd9f0..1fe6ed94e 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -11,42 +11,17 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.parser.scribble; +package org.scribble.ast; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.antlr.runtime.CommonToken; import org.antlr.runtime.Token; -import org.scribble.ast.AstFactory; -import org.scribble.ast.DataDecl; -import org.scribble.ast.DataParamDecl; -import org.scribble.ast.ImportDecl; -import org.scribble.ast.ImportModule; -import org.scribble.ast.Module; -import org.scribble.ast.ModuleDecl; -import org.scribble.ast.MsgNode; -import org.scribble.ast.NonProtoDecl; -import org.scribble.ast.NonRoleArg; -import org.scribble.ast.NonRoleArgList; -import org.scribble.ast.NonRoleArgNode; -import org.scribble.ast.NonRoleParamDecl; -import org.scribble.ast.NonRoleParamDeclList; -import org.scribble.ast.PayElem; -import org.scribble.ast.PayElemList; -import org.scribble.ast.ProtoDecl; -import org.scribble.ast.ProtoModList; -import org.scribble.ast.RoleArg; -import org.scribble.ast.RoleArgList; -import org.scribble.ast.RoleDecl; -import org.scribble.ast.RoleDeclList; -import org.scribble.ast.ScribNodeBase; -import org.scribble.ast.SigDecl; -import org.scribble.ast.SigLitNode; -import org.scribble.ast.SigParamDecl; -import org.scribble.ast.UnaryPayElem; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; import org.scribble.ast.global.GContinue; @@ -106,13 +81,14 @@ import org.scribble.del.name.simple.NonRoleParamNodeDel; import org.scribble.del.name.simple.RecVarNodeDel; import org.scribble.del.name.simple.RoleNodeDel; +import org.scribble.parser.ScribAntlrWrapper; import org.scribble.parser.antlr.ScribbleParser; public class AstFactoryImpl implements AstFactory { - // Purely for the convenience of newToken(type) + // Purely for the convenience of newToken(Token, type) protected final ScribbleParser parser; protected final Map tokens; @@ -174,11 +150,10 @@ protected ScribDel createDefaultDelegate() return new DefaultDel(); } - // FIXME: factor out -- change return to void (ScribNodeBase.del is a mutating setter) -// protected static T del(T n, ScribDel del) - protected static T del(T n, ScribDel del) + protected static void setDel(ScribNodeBase n, ScribDel del) { - return ScribNodeBase.del(n, del); + //ScribNodeBase.del(n, del); // Defensive setter -- unnecessary ? + n.setDel(del); // Mutating setter } @Override @@ -216,7 +191,7 @@ public OpNode OpNode(Token t, String text) int ttype = ScribbleParser.ID; t = newIdToken(t, text); OpNode n = new OpNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] - del(n, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); return n; } @@ -226,7 +201,7 @@ public RecVarNode RecVarNode(Token t, String text) int ttype = ScribbleParser.ID; t = newIdToken(t, text); RecVarNode n = new RecVarNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] - del(n, new RecVarNodeDel()); + setDel(n, new RecVarNodeDel()); return n; } @@ -236,7 +211,7 @@ public RoleNode RoleNode(Token t, String text) int ttype = ScribbleParser.ID; t = newIdToken(t, text); RoleNode n = new RoleNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] - del(n, new RoleNodeDel()); + setDel(n, new RoleNodeDel()); return n; } @@ -266,7 +241,7 @@ public DataNameNode DataNameNode(Token t, List elems) t = newToken(t, ScribbleParser.DATA_NAME); DataNameNode n = new DataNameNode(t); n.addChildren(elems); - del(n, new DataTypeNodeDel()); + setDel(n, new DataTypeNodeDel()); return n; } @@ -276,7 +251,7 @@ public GProtoNameNode GProtoNameNode(Token t, List elems) t = newToken(t, ScribbleParser.GPROTO_NAME); GProtoNameNode n = new GProtoNameNode(t); n.addChildren(elems); - del(n, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); return n; } @@ -286,7 +261,7 @@ public ModuleNameNode ModuleNameNode(Token t, List elems) t = newToken(t, ScribbleParser.MODULE_NAME); ModuleNameNode n = new ModuleNameNode(t); n.addChildren(elems); - del(n, createDefaultDelegate()); + setDel(n, createDefaultDelegate()); return n; } @@ -296,7 +271,7 @@ public SigNameNode SigNameNode(Token t, List elems) t = newToken(t, ScribbleParser.SIG_NAME); SigNameNode n = new SigNameNode(t); n.addChildren(elems); - del(n, new MessageSigNameNodeDel()); + setDel(n, new MessageSigNameNodeDel()); return n; } @@ -306,21 +281,18 @@ public Module Module(Token t, ModuleDecl moddecl, List> imports, { t = newToken(t, ScribbleParser.MODULE); Module n = new Module(t); - n.addChild(moddecl); - n.addChildren(imports); - n.addChildren(data); - n.addChildren(protos); - del(n, new ModuleDel()); + n.addChildren1(moddecl, imports, data, protos); + setDel(n, new ModuleDel()); return n; } @Override - public ModuleDecl ModuleDecl(Token t, ModuleNameNode fullmodname) + public ModuleDecl ModuleDecl(Token t, ModuleNameNode fullname) { t = newToken(t, ScribbleParser.MODULEDECL); ModuleDecl n = new ModuleDecl(t); - n.addChild(fullmodname); - del(n, createDefaultDelegate()); + n.addChildren1(fullname); + setDel(n, createDefaultDelegate()); return n; } @@ -330,40 +302,30 @@ public ImportModule ImportModule(Token t, ModuleNameNode modname, { t = newToken(t, ScribbleParser.IMPORTMODULE); ImportModule n = new ImportModule(t); - n.addChild(modname); - if (alias != null) - { - n.addChild(alias); - } - del(n, new ImportModuleDel()); + n.addChildren1(modname, alias); + setDel(n, new ImportModuleDel()); return n; } @Override - public DataDecl DataDecl(Token t, IdNode schema, IdNode extName, IdNode extSource, - DataNameNode alias) + public DataDecl DataDecl(Token t, IdNode schema, ExtIdNode extName, + ExtIdNode extSource, DataNameNode alias) { t = newToken(t, ScribbleParser.DATADECL); DataDecl n = new DataDecl(t); - n.addChild(schema); - n.addChild(extName); - n.addChild(extSource); - n.addChild(alias); - del(n, createDefaultDelegate()); + n.addChildren1(alias, schema, extName, extSource); + setDel(n, createDefaultDelegate()); return n; } @Override - public SigDecl SigDecl(Token t, IdNode schema, IdNode extName, - IdNode extSource, SigNameNode alias) + public SigDecl SigDecl(Token t, IdNode schema, ExtIdNode extName, + ExtIdNode extSource, SigNameNode alias) { t = newToken(t, ScribbleParser.SIGDECL); SigDecl n = new SigDecl(t); - n.addChild(schema); - n.addChild(extName); - n.addChild(extSource); - n.addChild(alias); - del(n, createDefaultDelegate()); + n.addChildren1(alias, schema, extName, extSource); + setDel(n, createDefaultDelegate()); return n; } @@ -373,10 +335,8 @@ public GProtoDecl GProtoDecl(Token t, ProtoModList mods, GProtoHeader header, { t = newToken(t, ScribbleParser.GPROTODECL); GProtoDecl n = new GProtoDecl(t); - n.addChild(mods); - n.addChild(header); - n.addChild(def); - del(n, new GProtocolDeclDel()); + n.addChildren1(mods, header, def); + setDel(n, new GProtocolDeclDel()); return n; } @@ -386,10 +346,8 @@ public GProtoHeader GProtocolHeader(Token t, GProtoNameNode name, { t = newToken(t, ScribbleParser.GPROTOHEADER); GProtoHeader n = new GProtoHeader(t); - n.addChild(name); - n.addChild(ps); - n.addChild(rs); - del(n, createDefaultDelegate()); + n.addChildren1(name, ps, rs); + setDel(n, createDefaultDelegate()); return n; } @@ -399,8 +357,8 @@ public RoleDeclList RoleDeclList(Token t, List ds) t = newToken(t, ScribbleParser.ROLEDECL_LIST); RoleDeclList n = new RoleDeclList(t); // Cf. Scribble.g children order - n.addChildren(ds); - del(n, new RoleDeclListDel()); + n.addChildren1(ds); + setDel(n, new RoleDeclListDel()); return n; } @@ -409,8 +367,8 @@ public RoleDecl RoleDecl(Token t, RoleNode r) { t = newToken(t, ScribbleParser.ROLEDECL); RoleDecl n = new RoleDecl(t); - n.addChild(r); - del(n, new RoleDeclDel()); + n.addChildren1(r); + setDel(n, new RoleDeclDel()); return n; } @@ -421,8 +379,8 @@ public NonRoleParamDeclList NonRoleParamDeclList(Token t, t =newToken(t, ScribbleParser.PARAMDECL_LIST); NonRoleParamDeclList n = new NonRoleParamDeclList(t); // Cf. Scribble.g children order - n.addChildren(ds); - del(n, new NonRoleParamDeclListDel()); + n.addChildren1(ds); + setDel(n, new NonRoleParamDeclListDel()); return n; } @@ -432,8 +390,8 @@ public DataParamDecl DataParamDecl(Token t, DataParamNode p) t = newToken(t, ScribbleParser.DATAPARAMDECL); DataParamDecl n = new DataParamDecl(t); // Cf. Scribble.g children order - n.addChild(p); - del(n, new NonRoleParamDeclDel()); + n.addChildren1(p); + setDel(n, new NonRoleParamDeclDel()); return n; } @@ -443,8 +401,8 @@ public SigParamDecl SigParamDecl(Token t, SigParamNode p) t = newToken(t, ScribbleParser.SIGPARAMDECL); SigParamDecl n = new SigParamDecl(t); // Cf. Scribble.g children order - n.addChild(p); - del(n, new NonRoleParamDeclDel()); + n.addChildren1(p); + setDel(n, new NonRoleParamDeclDel()); return n; } @@ -453,8 +411,8 @@ public GProtoDef GProtoDef(Token t, GProtoBlock block) { t = newToken(t, ScribbleParser.GPROTODEF); GProtoDef n = new GProtoDef(t); - n.addChild(block); - del(n, new GProtocolDefDel()); + n.addChildren1(block); + setDel(n, new GProtocolDefDel()); return n; } @@ -463,8 +421,8 @@ public GProtoBlock GProtoBlock(Token t, GInteractionSeq seq) { t = newToken(t, ScribbleParser.GPROTOBLOCK); GProtoBlock n = new GProtoBlock(t); - n.addChild(seq); - del(n, new GProtocolBlockDel()); + n.addChildren1(seq); + setDel(n, new GProtocolBlockDel()); return n; } @@ -473,8 +431,8 @@ public GInteractionSeq GInteractionSeq(Token t, List elems) { t = newToken(t, ScribbleParser.GINTERSEQ); GInteractionSeq n = new GInteractionSeq(t); - n.addChildren(elems); - del(n, new GInteractionSeqDel()); + n.addChildren1(elems); + setDel(n, new GInteractionSeqDel()); return n; } @@ -483,9 +441,8 @@ public SigLitNode SigLitNode(Token t, OpNode op, PayElemList pay) { t = newToken(t, ScribbleParser.SIG_LIT); SigLitNode n = new SigLitNode(t); - n.addChild(op); - n.addChild(pay); - del(n, createDefaultDelegate()); + n.addChildren1(op, pay); + setDel(n, createDefaultDelegate()); return n; } @@ -494,8 +451,8 @@ public PayElemList PayElemList(Token t, List> elems) { t = newToken(t, ScribbleParser.PAYELEM_LIST); PayElemList n = new PayElemList(t); - n.addChildren(elems); - del(n, createDefaultDelegate()); + n.addChildren1(elems); + setDel(n, createDefaultDelegate()); return n; } @@ -505,9 +462,8 @@ public UnaryPayElem UnaryPayElem(Token t, { t = newToken(t, ScribbleParser.UNARY_PAYELEM); UnaryPayElem n = new UnaryPayElem<>(t); - // Cf. Scribble.g children order - n.addChild(name); - del(n, createDefaultDelegate()); + n.addChildren1(name); + setDel(n, createDefaultDelegate()); return n; } @@ -517,10 +473,9 @@ public GDelegPayElem GDelegPayElem(Token t, GProtoNameNode proto, { t = newToken(t, ScribbleParser.DELEG_PAYELEM); GDelegPayElem n = new GDelegPayElem(t); - n.addChild(proto); - n.addChild(role); + n.addChildren1(proto, role); //del(n, createDefaultDelegate()); - del(n, new GDelegationElemDel()); // FIXME: GDelegationElemDel + setDel(n, new GDelegationElemDel()); // FIXME: GDelegationElemDel return n; } @@ -529,10 +484,8 @@ public GConnect GConnect(Token t, RoleNode src, MsgNode msg, RoleNode dst) { t = newToken(t, ScribbleParser.GCONNECT); GConnect n = new GConnect(t); - n.addChild(msg); - n.addChild(src); - n.addChild(dst); - del(n, new GConnectDel()); + n.addChildren1(msg, src, Stream.of(dst).collect(Collectors.toList())); + setDel(n, new GConnectDel()); return n; } @@ -541,22 +494,19 @@ public GDisconnect GDisconnect(Token t, RoleNode left, RoleNode right) { t = newToken(t, ScribbleParser.GDCONN); GDisconnect n = new GDisconnect(t); - n.addChild(left); - n.addChild(right); - del(n, new GDisconnectDel()); + n.addChildren1(left, right); + setDel(n, new GDisconnectDel()); return n; } @Override - public GMsgTransfer GMsgTransfer(Token t, RoleNode src, - MsgNode msg, List dsts) + public GMsgTransfer GMsgTransfer(Token t, RoleNode src, MsgNode msg, + List dsts) { t = newToken(t, ScribbleParser.GMSGTRANSFER); GMsgTransfer n = new GMsgTransfer(t); - n.addChild(msg); - n.addChild(src); - n.addChildren(dsts); - del(n, new GMessageTransferDel()); + n.addChildren1(msg, src, dsts); + setDel(n, new GMessageTransferDel()); return n; } @@ -565,9 +515,8 @@ public GWrap GWrap(Token t, RoleNode src, RoleNode dst) { t = newToken(t, ScribbleParser.GWRAP); GWrap n = new GWrap(t); - n.addChild(src); - n.addChild(dst); - del(n, new GWrapDel()); + n.addChildren1(src, dst); + setDel(n, new GWrapDel()); return n; } @@ -576,8 +525,8 @@ public GContinue GContinue(Token t, RecVarNode rv) { t = newToken(t, ScribbleParser.GCONTINUE); GContinue n = new GContinue(t); - n.addChild(rv); - del(n, new GContinueDel()); + n.addChildren1(rv); + setDel(n, new GContinueDel()); return n; } @@ -587,10 +536,8 @@ public GDo GDo(Token t, RoleArgList rs, NonRoleArgList as, { t = newToken(t, ScribbleParser.GDO); GDo n = new GDo(t); - n.addChild(proto); - n.addChild(rs); - n.addChild(as); - del(n, new GDoDel()); + n.addChildren1(proto, as, rs); + setDel(n, new GDoDel()); return n; } @@ -599,8 +546,8 @@ public RoleArgList RoleArgList(Token t, List rs) { t = newToken(t, ScribbleParser.ROLEARG_LIST); RoleArgList n = new RoleArgList(t); - n.addChildren(rs); - del(n, new RoleArgListDel()); + n.addChildren1(rs); + setDel(n, new RoleArgListDel()); return n; } @@ -609,8 +556,8 @@ public RoleArg RoleArg(Token t, RoleNode r) { t = newToken(t, ScribbleParser.ROLEARG); RoleArg n = new RoleArg(t); - n.addChild(r); - del(n, createDefaultDelegate()); + n.addChildren1(r); + setDel(n, createDefaultDelegate()); return n; } @@ -619,8 +566,8 @@ public NonRoleArgList NonRoleArgList(Token t, List as) { t = newToken(t, ScribbleParser.NONROLEARG_LIST); NonRoleArgList n = new NonRoleArgList(t); - n.addChildren(as); - del(n, new NonRoleArgListDel()); + n.addChildren1(as); + setDel(n, new NonRoleArgListDel()); return n; } @@ -629,8 +576,8 @@ public NonRoleArg NonRoleArg(Token t, NonRoleArgNode arg) { t = newToken(t, ScribbleParser.NONROLEARG); NonRoleArg n = new NonRoleArg(t); - n.addChild(arg); - del(n, createDefaultDelegate()); + n.addChildren1(arg); + setDel(n, createDefaultDelegate()); return n; } @@ -639,9 +586,8 @@ public GChoice GChoice(Token t, RoleNode subj, List blocks) { t = newToken(t, ScribbleParser.GCHOICE); GChoice n = new GChoice(t); - n.addChild(subj); - n.addChildren(blocks); - del(n, new GChoiceDel()); + n.addChildren1(subj, blocks); + setDel(n, new GChoiceDel()); return n; } @@ -650,9 +596,8 @@ public GRecursion GRecursion(Token t, RecVarNode rv, GProtoBlock block) { t = newToken(t, ScribbleParser.GRECURSION); GRecursion n = new GRecursion(t); - n.addChild(rv); - n.addChild(block); - del(n, new GRecursionDel()); + n.addChildren1(rv, block); + setDel(n, new GRecursionDel()); return n; } } diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java b/scribble-parser/src/main/java/org/scribble/ast/DelDecoratorImpl.java similarity index 99% rename from scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java rename to scribble-parser/src/main/java/org/scribble/ast/DelDecoratorImpl.java index 98fc7a138..b9a4a553c 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/DelDecoratorImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/DelDecoratorImpl.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.parser.scribble; +package org.scribble.ast; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribAntlrWrapper.java b/scribble-parser/src/main/java/org/scribble/parser/ScribAntlrWrapper.java similarity index 95% rename from scribble-parser/src/main/java/org/scribble/parser/scribble/ScribAntlrWrapper.java rename to scribble-parser/src/main/java/org/scribble/parser/ScribAntlrWrapper.java index 500afb8a4..55cc71c58 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribAntlrWrapper.java +++ b/scribble-parser/src/main/java/org/scribble/parser/ScribAntlrWrapper.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.parser.scribble; +package org.scribble.parser; import java.io.IOException; import java.io.InputStream; @@ -24,6 +24,7 @@ import org.antlr.runtime.RecognitionException; import org.antlr.runtime.tree.CommonErrorNode; import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.DelDecoratorImpl; import org.scribble.ast.Module; import org.scribble.del.DelDecorator; import org.scribble.parser.antlr.ScribbleLexer; @@ -43,7 +44,7 @@ public ScribAntlrWrapper() // Scribble extensions should override newScribbleLexer/Parser as appropriate // A fresh Lexer/Parser is needed by each call to parse - protected Lexer newScribbleLexer(ANTLRStringStream ss) + public Lexer newScribbleLexer(ANTLRStringStream ss) { return new ScribbleLexer(ss); } @@ -51,7 +52,7 @@ protected Lexer newScribbleLexer(ANTLRStringStream ss) // Scribble extensions should override newScribbleLexer/Parser as appropriate // ScribbleParser: a Parser that has a top-level "module" method // (And has "setTreeAdaptor") - protected ScribbleParser newScribbleParser(CommonTokenStream ts) + public ScribbleParser newScribbleParser(CommonTokenStream ts) { return new ScribbleParser(ts); } diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java similarity index 97% rename from scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java rename to scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java index 6bf68b7ad..52d0dc5fe 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java @@ -11,19 +11,15 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.parser.scribble; - -import java.util.Arrays; -import java.util.List; +package org.scribble.parser; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTreeAdaptor; import org.scribble.ast.AuxMod; import org.scribble.ast.DataDecl; +import org.scribble.ast.DataParamDecl; import org.scribble.ast.ExplicitMod; import org.scribble.ast.ImportModule; -import org.scribble.ast.SigDecl; -import org.scribble.ast.SigLitNode; import org.scribble.ast.Module; import org.scribble.ast.ModuleDecl; import org.scribble.ast.NonRoleArg; @@ -37,8 +33,9 @@ import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScribNil; import org.scribble.ast.ScribNode; +import org.scribble.ast.SigDecl; +import org.scribble.ast.SigLitNode; import org.scribble.ast.SigParamDecl; -import org.scribble.ast.DataParamDecl; import org.scribble.ast.UnaryPayElem; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; @@ -55,8 +52,8 @@ import org.scribble.ast.global.GWrap; import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.qualified.GProtoNameNode; -import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.simple.ExtIdNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.OpNode; @@ -65,8 +62,6 @@ // get/setType don't seem to be really used public class ScribTreeAdaptor extends CommonTreeAdaptor { - public static final List TOKEN_NAMES = - Arrays.asList(ScribbleParser.tokenNames); // Generated parser seems to use nil to create "blank" nodes and then "fill them in" @Override diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index aafae0fd3..840cade08 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -78,6 +78,8 @@ module tmp.Test; //...remove Token args from af constructors -- refactor reconstructs to use af? //...disallow/check for reserved __ -- do in gtype translation? // FIXME: qualifed sig name as non role arg + + // TODO: rename addChildren1 // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) // sort out full name expansion between disamb and translation -- fix modulecontextcollector for imported module member fullnames @@ -89,16 +91,19 @@ module tmp.Test; // use stypefactory in core -- also make a visitorfactory // refactor test to use main instead of cli + sig "..." from "..." as T; +/* global protocol Proto1(role A, role B) { M from A to B; do Proto1(A, B); // TODO: add unit test, testing qualified sig name as nonrole arg } +//*/ -/* +//* explicit global protocol Proto1(role A__, role B) { () connect A__ to B; From 02ae33a18dd98ff2e981017256a03dfb1348bbbd Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 20:53:02 +0100 Subject: [PATCH 285/539] Minor. --- scribble-test/src/test/scrib/tmp/Test.scr | 63 ++++++++++++----------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 840cade08..486252dab 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -61,35 +61,40 @@ module tmp.Test; // could also test once-unfold-all against model -//... -// change parsed to in jobcontext to record original roledecls (for GDo::project) -- and change getInlined on proto to prune (via getRoles on def) -// separate Job into core and lang parts (mainly parsed Module) -// move ast/del, old visit and new frontend to lang -// integrate new frontend with MainContext? -// move lang types to type.sess, and move new visit -// try modulecontextvisitor by "static lookup" -// try move antlrwrapper to parser again -//for isSingleConts (and project, buildGraph), make T visitWith(STypeReducer v) ? -- roleenabling and extchoicecons are more like reducers? - -// refactor scribble.g, simplify ast/del/etc class names and deprecated class code - // CHECKME: duplicte proto mods - - //...HERE fix simp node constructors and af (no IdNode child) --- fix ambignodel to use af -- fix ambignodel to use af -- fix ambignodel to use af -- fix ambignodel to use af - separate af methods - //...remove Token args from af constructors -- refactor reconstructs to use af? - //...disallow/check for reserved __ -- do in gtype translation? - // FIXME: qualifed sig name as non role arg - - // TODO: rename addChildren1 - -// re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) - // sort out full name expansion between disamb and translation -- fix modulecontextcollector for imported module member fullnames -// refactor additional disamb syntactic checks into core? e.g., do-calls, distinct roledecls, protodecls, etc. - // -- otoh, ast errors give source feedback -- maybe implement both - //make a visitor factory - -// add exp conn checks to model validation -// use stypefactory in core -- also make a visitorfactory -// refactor test to use main instead of cli +// Done: -- parser/ast refactoring + // change parsed to in jobcontext to record original roledecls (for GDo::project) -- and change getInlined on proto to prune (via getRoles on def) + // separate Job into core and lang parts (mainly parsed Module) + // move ast/del, old visit and new frontend to lang + // integrate new frontend with MainContext? + // move lang types to type.sess, and move new visit + // try modulecontextvisitor by "static lookup" + // try move antlrwrapper to parser again + //for isSingleConts (and project, buildGraph), make T visitWith(STypeReducer v) ? -- roleenabling and extchoicecons are more like reducers? + // refactor scribble.g, simplify ast/del/etc class names and deprecated class code + //...remove Token args from af constructors -- removed, and re-added + //refactor reconstructs to use af? -- refactored af and reconstruct to use addChildren1 -- FIXME + //...fix simp node constructors and af (no IdNode child) --- fix ambignodel to use af -- separate af methods + + +// Outstanding: + //...disallow/check for reserved __ -- do in gtype translation? + // FIXME: qualifed sig name as non-role do-arg + // TODO: rename addChildren1 + // CHECKME: duplicate proto mods + + +// For model build/check refactoring: + // add exp conn checks to model validation + // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) + // sort out full name expansion between disamb and translation -- fix modulecontextcollector for imported module member fullnames + // refactor additional disamb syntactic checks into core? e.g., do-calls, distinct roledecls, protodecls, etc. + // -- otoh, ast errors give source feedback -- maybe implement both + // use stypefactory in core -- also make a visitorfactory (core and ast) + +// codegen refactoring: + +// Test refactoring: + // refactor test to use main instead of cli sig "..." from "..." as T; From ecfce4a14848aeaadbc5f4c8a5be33d9e9bebd35 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 21:04:24 +0100 Subject: [PATCH 286/539] Fixed data KW for data param decls. --- .../main/java/org/scribble/ast/DataDecl.java | 2 +- .../java/org/scribble/ast/DataParamDecl.java | 2 +- .../java/org/scribble/util/Constants.java | 3 ++- .../org/scribble/parser/antlr/Scribble.g | 6 ++++- scribble-test/src/test/scrib/tmp/Test.scr | 23 ++++++++++++++----- 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java b/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java index 1408bcaaf..a207df9bf 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java @@ -70,7 +70,7 @@ public DataName getFullMemberName(Module mod) @Override public String toString() { - return Constants.TYPE_KW + " <" + getSchemaChild() + "> " + return Constants.DATA_KW + " <" + getSchemaChild() + "> " + getExtNameChild() + " " + Constants.FROM_KW + " " + getExtSourceChild() + " " + Constants.AS_KW + " " + getDeclName() diff --git a/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java index 50f7add79..f3c68be81 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java @@ -54,6 +54,6 @@ public DataName getDeclName() @Override public String getKeyword() { - return Constants.TYPE_KW; + return Constants.DATA_KW; } } diff --git a/scribble-core/src/main/java/org/scribble/util/Constants.java b/scribble-core/src/main/java/org/scribble/util/Constants.java index d908f2104..a36275e3d 100644 --- a/scribble-core/src/main/java/org/scribble/util/Constants.java +++ b/scribble-core/src/main/java/org/scribble/util/Constants.java @@ -22,7 +22,8 @@ public class Constants // Duplicated from AntlrConstants due to Maven dependency restrictions public static final String MODULE_KW = "module"; public static final String IMPORT_KW = "import"; - public static final String TYPE_KW = "type"; + public static final String DATA_KW = "data"; + public static final String TYPE_KW = "type"; // CHECKME: deprecate ? public static final String PROTOCOL_KW = "protocol"; public static final String GLOBAL_KW = "global"; public static final String LOCAL_KW = "local"; diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 1767b9614..204592ec3 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -440,7 +440,11 @@ paramdecls: paramdecl: dataparamdecl | sigparamdecl ; dataparamdecl: - t=TYPE_KW dataparamname -> ^(DATAPARAMDECL[$t] dataparamname) ; + t=TYPE_KW dataparamname -> ^(DATAPARAMDECL[$t] dataparamname) +| + t=DATA_KW dataparamname -> ^(DATAPARAMDECL[$t] dataparamname) + // TODO: refactor -- cf. datadecl +; sigparamdecl: t=SIG_KW sigparamname -> ^(SIGPARAMDECL[$t] sigparamname) ; diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 486252dab..476ffd3d3 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -97,28 +97,39 @@ module tmp.Test; // refactor test to use main instead of cli -sig "..." from "..." as T; +data "..." from "..." as T; + + +global protocol Proto1(role A, role B) +{ + (T) from A to B; +} /* -global protocol Proto1(role A, role B) +sig "..." from "..." as M; + +global protocol Proto1(role A, role B) { - M from A to B; - do Proto1(A, B); // TODO: add unit test, testing qualified sig name as nonrole arg + MM from A to B; + do Proto1(A, B); // TODO: add unit test, testing qualified sig name as nonrole arg } //*/ -//* + +/* explicit global protocol Proto1(role A__, role B) { () connect A__ to B; rec X { - () from A__ to B; + () from A__ to B; // TODO: add double underscore check (e.g., translation) continue X; } } //*/ + + /* global protocol Proto1(role A, role B) { From 2df5c410b9a572df4f2ec341999b71a90d947005 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 21:32:32 +0100 Subject: [PATCH 287/539] Minor Scribble.g edits. --- .../org/scribble/parser/antlr/Scribble.g | 49 +++++++++---------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 204592ec3..75864e8fc 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -79,9 +79,7 @@ tokens // Special cases EMPTY_OP = '__EMPTY_OP'; - // Simple names - AMBIG_NAME = 'AMBIG_NAME'; - // Other simple names are + // Simple names "constructed directly", e.g., t=ID -> ID<...Node>[$t] // Compound names GPROTO_NAME = 'GPROTO_NAME'; // Parse specifically as GProto, for ScribTreeAdaptor.create @@ -184,7 +182,7 @@ tokens System.exit(1); } - // Currently unused -- checking later in intermed translation instead of parsing + // Currently unused -- TODO: check later in intermed translation, instead of parsing public static CommonTree checkId(CommonTree id) { if (id.getText().contains("__")) @@ -201,40 +199,40 @@ tokens * Chapter 2 Lexical Structure (Lexer rules) ***************************************************************************/ -/* +/* * // Double star here not accepted by ANTLR... * Section 2.1 White space (Section 2.1) */ - // Not referred to explicitly, deals with whitespace implicitly (don't delete this) WHITESPACE: - ('\t' | ' ' | '\r' | '\n'| '\u000C')+ - { - $channel = HIDDEN; - } + ('\t' | ' ' | '\r' | '\n'| '\u000C')+ + { + $channel = HIDDEN; + } ; /** * Section 2.2 Comments */ COMMENT: - '/*' .* '*/' - { - $channel=HIDDEN; - } + '/*' .* '*/' + { + $channel=HIDDEN; + } ; LINE_COMMENT: - '//' ~('\n'|'\r')* '\r'? '\n' + '//' ~('\n'|'\r')* '\r'? '\n' { - $channel=HIDDEN; - } + $channel=HIDDEN; + } ; + /** * Section 2.3 Identifiers */ ID: - (LETTER | DIGIT | UNDERSCORE)* + (LETTER | DIGIT | UNDERSCORE)* /* Underscore currently can cause ambiguities in the API generation naming * scheme But maybe only consecutive underscores are the problem -- cannot * completely disallow underscores as needed for projection naming scheme @@ -243,29 +241,29 @@ ID: ; fragment SYMBOL: - '{' | '}' | '(' | ')' | '[' | ']' | ':' | '/' | '\\' | '.' | '\#' + '{' | '}' | '(' | ')' | '[' | ']' | ':' | '/' | '\\' | '.' | '\#' | - '&' | '?' | '!' | UNDERSCORE + '&' | '?' | '!' | UNDERSCORE ; // Comes after SYMBOL due to an ANTLR syntax highlighting issue involving // quotes. // Parser doesn't work without quotes here (e.g. if inlined into parser rules) EXTID: - '\"' (LETTER | DIGIT | SYMBOL)* '\"' + '\"' (LETTER | DIGIT | SYMBOL)* '\"' ; //(LETTER | DIGIT | SYMBOL)* // Not working fragment LETTER: - 'a'..'z' | 'A'..'Z' + 'a'..'z' | 'A'..'Z' ; fragment DIGIT: - '0'..'9' + '0'..'9' ; fragment UNDERSCORE: - '_' + '_' ; @@ -273,7 +271,7 @@ fragment UNDERSCORE: * Chapter 3 Syntax (Parser rules) ***************************************************************************/ -/* +/* // Double star here not accepted by ANTLR... * Section 3.1 Primitive Names */ //simplename: id=ID -> { checkId($id.tree) } ; // How to integrate with ID[$t] ? @@ -378,7 +376,6 @@ payelems: payelem (',' payelem)* -> ^(PAYELEM_LIST payelem+) ; - payelem: // Payload element must be a data kind, cannot be a sig name // Qualified name must be a data type name From 51256c2cc622bd86d8750c5471e5cfacae877484 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 23:14:46 +0100 Subject: [PATCH 288/539] Allowed empty brackets for paramdecllist and nonrolearglist. --- .../org/scribble/del/NonRoleParamDeclDel.java | 2 +- .../del/name/simple/AmbigNameNodeDel.java | 96 ++++--------- .../src/main/java/org/scribble/job/Job.java | 49 ++++--- .../org/scribble/visit/NameDisambiguator.java | 18 ++- .../main/java/org/scribble/core/job/Core.java | 132 +++++++----------- .../org/scribble/core/job/CoreContext.java | 3 +- .../org/scribble/parser/antlr/Scribble.g | 4 +- 7 files changed, 127 insertions(+), 177 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java index f0d544534..6ff5c68a1 100644 --- a/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/NonRoleParamDeclDel.java @@ -25,6 +25,6 @@ public void enterDisambiguation(ScribNode child, NameDisambiguator disamb) throws ScribException { NonRoleParamDecl pd = (NonRoleParamDecl) child; - disamb.addParameter(pd.getDeclName(), pd.kind); + disamb.addParam(pd.getDeclName(), pd.kind); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java index ed08cab7e..796c4b41c 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java @@ -13,21 +13,17 @@ */ package org.scribble.del.name.simple; +import java.util.List; import java.util.stream.Collectors; import org.scribble.ast.MsgTransfer; import org.scribble.ast.PayElem; import org.scribble.ast.ScribNode; -import org.scribble.ast.name.qualified.DataNameNode; -import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.ast.name.simple.IdNode; -import org.scribble.ast.name.simple.SigParamNode; -import org.scribble.ast.name.simple.DataParamNode; import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.DataKind; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.AmbigName; import org.scribble.del.ScribDelBase; import org.scribble.util.ScribException; @@ -40,89 +36,51 @@ public AmbigNameNodeDel() } - // Currently only in "message positions (see Scribble.g, ambiguousname) @Override public ScribNode leaveDisambiguation(ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribException { ScribNode parent = child.getParent(); - ModuleContext mcontext = disamb.getModuleContext(); - AmbigNameNode ann = (AmbigNameNode) visited; - AmbigName name = ann.toName(); + ModuleContext modc = disamb.getModuleContext(); + AmbigNameNode a = (AmbigNameNode) visited; + AmbigName name = a.toName(); // By well-formedness (checked later), payload type and parameter names are distinct - // FIXME: are conflicts checked elsewhere? - if (mcontext.isDataTypeVisible(name.toDataName())) + // CHECKME: are conflicts checked elsewhere? -- ? + if (modc.isDataTypeVisible(name.toDataName())) { - if (parent instanceof MsgTransfer) // FIXME HACK: MessageTransfer assumes MessageNode (cast in visitChildren), so this needs to be caught here // FIXME: other similar cases? + // CHECKME HACK: MsgTransfer assumes MessageNode (cast in visitChildren), so this needs to be caught here + // CHECKME: any other similar cases? + if (parent instanceof MsgTransfer) { - throw new ScribException(ann.getSource(), + throw new ScribException(a.getSource(), "Invalid occurrence of data type: " + parent); } - /*return disamb.job.config.af.QualifiedNameNode(ann.getSource(), - DataTypeKind.KIND, name.getElements());*/ - - //DataTypeNode res = new DataTypeNode(ann.token); // CHECKME: what should the Token be? - //DataTypeNode res = new DataTypeNode(new CommonToken(73, "TYPENAME")); // FIXME: use af - DataNameNode res = (DataNameNode) disamb.job.config.af - .DataNameNode(ann.token, ann.getElements().stream() - .map(x -> disamb.job.config.af.IdNode(null, x)) - .collect(Collectors.toList())); - - //res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? - res.addChild(new IdNode(ann.token)); - - return res; + List elems = a.getElements().stream() + .map(x -> disamb.job.config.af.IdNode(null, x)) + .collect(Collectors.toList()); + return disamb.job.config.af.DataNameNode(a.token, elems); } - else if (mcontext.isMessageSigNameVisible(name.toSigName())) + else if (modc.isMessageSigNameVisible(name.toSigName())) { if (parent instanceof PayElem) // FIXME HACK { - throw new ScribException(ann.getSource(), + throw new ScribException(a.getSource(), "Invalid occurrence of message signature name: " + parent); } - /*return disamb.job.config.af.QualifiedNameNode(ann.getSource(), - SigKind.KIND, name.getElements());*/ - - //MessageSigNameNode res = new MessageSigNameNode(ann.token); // CHECME: what should the Token be? - //MessageSigNameNode res = new MessageSigNameNode(new CommonToken(67, "SIGNAME")); // FIXME: use af - SigNameNode res = (SigNameNode) disamb.job.config.af - .SigNameNode(ann.token, ann.getElements().stream() - .map(x -> disamb.job.config.af.IdNode(null, x)) - .collect(Collectors.toList())); - - //res.addChildren(ann.getChildren()); - res.addChild(new IdNode(ann.token)); - - return res; + List elems = a.getElements().stream() + .map(x -> disamb.job.config.af.IdNode(null, x)) + .collect(Collectors.toList()); + return disamb.job.config.af.SigNameNode(a.token, elems); } - else if (disamb.isBoundParameter(name)) + else if (disamb.isBoundParam(name)) { - /*return disamb.job.config.af.NonRoleParamNode(ann.getSource(), - disamb.getParameterKind(name), name.toString());*/ - NonRoleParamKind kind = disamb.getParameterKind(name); - if (kind.equals(DataKind.KIND)) - { - //TypeParamNode res = new TypeParamNode(ann.token); // CHECKME: what should the Token be? - //TypeParamNode res = new TypeParamNode(75, ann.token); // CHECKME: what should the Token be? - DataParamNode res = disamb.job.config.af.DataParamNode(ann.token, - ann.getText()); - - //res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? - - return res; - } - else if (kind.equals(SigKind.KIND)) - { - //SigParamNode res = new SigParamNode(69, ann.token); // CHECKME: what should the Token be? - SigParamNode res = disamb.job.config.af.SigParamNode(ann.token, - ann.getText()); - - //res.addChildren(ann.getChildren()); // CHECKME: refactor factory for new ast, and do inside there? - - return res; - } + NonRoleParamKind kind = disamb.getParamKind(name); + return kind.equals(DataKind.KIND) + ? disamb.job.config.af.DataParamNode(a.token, a.getText()) + // else if(kind.equals(SigKind.KIND)) + : disamb.job.config.af.SigParamNode(a.token, a.getText()); } - throw new ScribException(ann.getSource(), + throw new ScribException(a.getSource(), "Cannot disambiguate name: " + name); } } diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 7b6ca3ea2..423ff0777 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -44,32 +44,31 @@ public Job(ModuleName mainFullname, Map args, Map parsed, AstFactory af) throws ScribException { // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource - // FIXME: wrap flags in Map and move Config construction to Lang this.config = newJobConfig(mainFullname, args, af); - this.context = newJobContext(this, parsed); // Single instance per Lang, should not be shared between Langs + this.context = newJobContext(this, parsed); // Single instance per Job, should not be shared between Jobs } - // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate + // A Scribble extension should override newJobConfig/Context/Translator and toJob as appropriate protected JobConfig newJobConfig(ModuleName mainFullname, Map args, AstFactory af) { return new JobConfig(mainFullname, args, af); } - // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate + // A Scribble extension should override newJobConfig/Context/Translator and toJob as appropriate protected JobContext newJobContext(Job job, Map parsed) throws ScribException { return new JobContext(this, parsed); } - // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate + // A Scribble extension should override newJobConfig/Context/Translator and toJob as appropriate protected GTypeTranslator newTranslator(ModuleName rootFullname) { return new GTypeTranslator(this, rootFullname); } - // A Scribble extension should override newLangConfig/Context/Translator and toJob as appropriate + // A Scribble extension should override newJobConfig/Context/Translator and toJob as appropriate protected Core newJob(ModuleName mainFullname, Map args, //Map modcs, Set imeds) @@ -82,16 +81,22 @@ protected Core newJob(ModuleName mainFullname, Map args, // Base implementation: ambigname disamb pass only public void runPasses() throws ScribException { + verbosePrintPass("Starting Job passes on:"); + for (ModuleName fullname : this.context.getFullModuleNames()) + { + verbosePrintln(this.context.getModule(fullname).toString()); + } + // Disamb is a "leftover" aspect of parsing -- so not in core // N.B. disamb is mainly w.r.t. ambignames -- e.g., doesn't fully qualify names (currently mainly done by imed translation) // CHECKME: disamb also currently does checks like do-arg kind and arity -- refactor into core? -- also does, e.g., distinct roledecls, protodecls, etc. runVisitorPassOnAllModules(new NameDisambiguator(this)); // Includes validating names used in subprotocol calls.. } - // "Finalises" this Lang -- initialises the Job at this point, and cannot run futher Visitor passes on Lang - // So, typically, Lang passes should be finished before calling this - // Job passes may subsequently mutate Job(Context) though - // CHECKME: revise this pattern? -- maybe fork Job for a snapshot of current Lang(Context) -- and, possibly, convert Job back to Lang + // "Finalises" this Job -- initialises the Job at this point, and cannot run futher Visitor passes on Job + // So, typically, Job passes should be finished before calling this + // Core passes may subsequently mutate Core(Context) though + // CHECKME: revise this pattern? -- maybe fork Core for a snapshot of current Job(Context) -- and, possibly, convert Core back to Job public final Core getCore() throws ScribException { if (this.core == null) @@ -101,12 +106,15 @@ public final Core getCore() throws ScribException for (ModuleName fullname : parsed.keySet()) { GTypeTranslator t = newTranslator(fullname); - for (GProtoDecl gpd : parsed.get(fullname).getGProtoDeclChildren()) + Module m = parsed.get(fullname); + for (GProtoDecl ast : m.getGProtoDeclChildren()) { - GProtocol g = (GProtocol) gpd.visitWith(t); - imeds.add(g); - verbosePrintln( - "\nParsed:\n" + gpd + "\n\nScribble intermediate:\n" + g); + GProtocol imed = (GProtocol) ast.visitWith(t); + imeds.add(imed); + verbosePrintPass( + //"\nParsed:\n" + gpd + + "Translated Scribble intermediate: " + ast.getFullMemberName(m) + + "\n" + imed); } } this.core = newJob(this.config.main, this.config.args, @@ -123,12 +131,12 @@ public JobContext getContext() public void runVisitorPassOnAllModules(AstVisitor v) throws ScribException { - verbosePrintPass("Running " + v.getClass() + " on all modules:"); + verbosePrintPass("Running " + v.getClass() + " on all modules..."); runVisitorPass(v, this.context.getFullModuleNames()); } - private void runVisitorPass(AstVisitor v, - Set fullnames) throws ScribException + private void runVisitorPass(AstVisitor v, Set fullnames) + throws ScribException { for (ModuleName fullname : fullnames) { @@ -143,8 +151,9 @@ private void runVisitorOnModule(ModuleName modname, AstVisitor v) { throw new RuntimeException("toJob already finalised: "); } - verbosePrintPass("- Running " + v.getClass() + " on:\n" + modname); + verbosePrintPass("Running " + v.getClass() + " on: " + modname); Module visited = (Module) this.context.getModule(modname).accept(v); + verbosePrintln(visited.toString()); this.context.replaceModule(visited); } @@ -163,6 +172,6 @@ public void verbosePrintln(String s) private void verbosePrintPass(String s) { - verbosePrintln("\n[Lang] " + s); + verbosePrintln("\n[Job] " + s); } } diff --git a/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java b/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java index c8e0b494e..edbcbd544 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java @@ -30,7 +30,7 @@ import org.scribble.util.ScribException; // Disambiguates ambiguous PayloadTypeOrParameter names and inserts implicit Scope names -// Also canonicalises recvars +// Also canonicalises recvars -- CHECKME ? public class NameDisambiguator extends ModuleContextVisitor { // For implicit scope generation: reset per ProtocolDecl @@ -117,19 +117,19 @@ public boolean isBoundRole(Role role) return this.roles.contains(role); } - public void addParameter(Name param, + public void addParam(Name param, NonRoleParamKind kind) { this.params.put(param.toString(), kind); } // name is a simple name (compound names are not ambiguous) - public boolean isBoundParameter(Name name) // ArgKind allows AmbigNames + public boolean isBoundParam(Name name) // ArgKind allows AmbigNames { return this.params.containsKey(name.toString()); } - public NonRoleParamKind getParameterKind(Name name) // ArgKind allows AmbigNames + public NonRoleParamKind getParamKind(Name name) // ArgKind allows AmbigNames { return this.params.get(name.toString()); } @@ -181,9 +181,18 @@ public void popRecVar(RecVar rv) this.recvars.put(rv, i - 1); } } +} + + + + + + + + /*public String getCanonicalRecVarName(RecVar rv) { return getCanonicalRecVarName(this.getModuleContext().root, this.root.header.getDeclName(), rv.toString() + "_" + this.recvars.get(rv)); @@ -195,4 +204,3 @@ public static String getCanonicalRecVarName(ModuleName fullmodname, ProtocolName //return rv.toString(); return ("__" + fullmodname + "_" + simpprotoname + "_" + rv).replace('.', '_'); }*/ -} diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index a30112288..97ec9b2ae 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -59,11 +59,11 @@ public Core(ModuleName mainFullname, Map args, { this.config = newCoreConfig(mainFullname, args); this.context = newCoreContext(//modcs, - imeds); // Single instance per Job and should never be shared + imeds); // Single instance per Core and should never be shared this.sgraphb = newSGraphBuilderUtil(); } - // A Scribble extension should override newJobConfig/Context/etc as appropriate + // A Scribble extension should override newCoreConfig/Context/etc as appropriate protected CoreConfig newCoreConfig(ModuleName mainFullname, Map args) { @@ -72,7 +72,7 @@ protected CoreConfig newCoreConfig(ModuleName mainFullname, // CHECKME: combine E/SModelFactory? } - // A Scribble extension should override newJobConfig/Context/etc as appropriate + // A Scribble extension should override newCoreConfig/Context/etc as appropriate protected CoreContext newCoreContext(//Map modcs, Set imeds) { @@ -81,14 +81,14 @@ protected CoreContext newCoreContext(//Map modcs, } // TODO: deprecate, caller should go through config - // A Scribble extension should override newJobConfig/Context/etc as appropriate + // A Scribble extension should override newCoreConfig/Context/etc as appropriate public SGraphBuilderUtil newSGraphBuilderUtil() { return this.config.mf.newSGraphBuilderUtil(); } // TODO: deprecate, caller should go through config - // A Scribble extension should override newJobConfig/Context/etc as appropriate + // A Scribble extension should override newCoreConfig/Context/etc as appropriate public EGraphBuilderUtil newEGraphBuilderUtil() { return new EGraphBuilderUtil(this.config.mf); @@ -112,58 +112,70 @@ public SGraph buildSGraph(GProtoName fullname, Map egraphs, public void runPasses() throws ScribException { runContextBuildingPasses(); - //runUnfoldingPass(); runValidationPasses(); } - public void runContextBuildingPasses() throws ScribException + public void runContextBuildingPasses() // No ScribException, no errors expected { - /*// FIXME TODO: refactor into a runVisitorPassOnAllModules for SimpleVisitor (and add operation to ModuleDel) - Set fullmodnames = this.context.getFullModuleNames(); - for (ModuleName fullmodname : fullmodnames) + verbosePrintPass("Inlining subprotocols for all globals..."); + for (GProtocol imed : this.context.getIntermediates()) { - Module mod = this.context.getModule(fullmodname); - GTypeTranslator t = new GTypeTranslator(this, fullmodname); - for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) - { - GProtocol g = (GProtocol) gpd.visitWith(t); - this.context.addIntermediate(g.fullname, g); - debugPrintln("\nParsed:\n" + gpd + "\n\nScribble intermediate:\n" + g); - } - }*/ - - for (GProtocol g : this.context.getIntermediates()) - { - /*SubprotoSig sig = new SubprotoSig(g.fullname, g.roles, params); - //Deque stack = new LinkedList<>(); - STypeInliner i = new STypeInliner(this); - i.pushSig(sig); // TODO: factor into constructor*/ GTypeInliner v = new GTypeInliner(this); - GProtocol inlined = g.getInlined(v); // Protocol.getInlined does pruneRecs - verbosePrintln("\nSubprotocols inlined:\n" + inlined); - this.context.addInlined(g.fullname, inlined); + GProtocol inlined = imed.getInlined(v); // Protocol.getInlined does pruneRecs + verbosePrintPass( + "Inlined subprotocols: " + imed.fullname + "\n" + inlined); + this.context.addInlined(imed.fullname, inlined); } - //runUnfoldingPass(); + verbosePrintPass("Unfolding all recursions once for all inlined globals..."); for (GProtocol inlined : this.context.getInlined()) { - //STypeUnfolder unf1 = new STypeUnfolder<>(); - ////GTypeUnfolder unf2 = new GTypeUnfolder(); - GTypeUnfolder v = new GTypeUnfolder(); - GProtocol unf = (GProtocol) inlined.unfoldAllOnce(v);//.unfoldAllOnce(unf2); CHECKME: twice unfolding? instead of "unguarded"-unfolding? - verbosePrintln("\nAll recursions unfolded once:\n" + unf); + GTypeUnfolder v = new GTypeUnfolder(); + GProtocol unf = (GProtocol) inlined.unfoldAllOnce(v);//.unfoldAllOnce(unf2); // CHECKME: twice unfolding? instead of "unguarded"-unfolding? + verbosePrintPass( + "Unfolded all recursions once: " + inlined.fullname + "\n" + unf); } runProjectionPasses(); - for (Entry e : - this.context.getInlinedProjections().entrySet()) + for (Entry e : this.context.getInlinedProjections() + .entrySet()) { - //LProtocolName lname = e.getKey(); LProtocol proj = e.getValue(); EGraph graph = proj.toEGraph(this); this.context.addEGraph(proj.fullname, graph); - verbosePrintln("\nEFSM for " + proj.fullname + ":\n" + graph.toDot()); + verbosePrintPass("Built EFSM: " + proj.fullname + ":\n" + graph.toDot()); + } + } + + // Due to Projector not being a subprotocol visitor, so "external" subprotocols may not be visible in ModuleContext building for the projections of the current root Module + // SubprotocolVisitor it doesn't visit the target Module/ProtocolDecls -- that's why the old Projector maintained its own dependencies and created the projection modules after leaving a Do separately from SubprotocolVisiting + // So Projection should not be an "inlining" SubprotocolVisitor, it would need to be more a "DependencyVisitor" + protected void runProjectionPasses() // No ScribException, no errors expected + { + verbosePrintPass("Projecting all inlined globals..."); + for (GProtocol inlined : this.context.getInlined()) + { + for (Role self : inlined.roles) + { + // pruneRecs already done (see runContextBuildingPasses) + LProtocol iproj = inlined.projectInlined(this, self); // CHECKME: projection and inling commutative? + this.context.addInlinedProjection(iproj.fullname, iproj); + verbosePrintPass("Projected inlined onto " + self + ": " + + inlined.fullname + "\n" + iproj); + } + } + + // Pre: inlined already projected -- used for Do projection + verbosePrintPass("Projecting all intermediate globals..."); + for (GProtocol imed : this.context.getIntermediates()) + { + for (Role self : imed.roles) + { + LProtocol proj = imed.project(this, self); // Does pruneRecs + this.context.addProjection(proj); + verbosePrintPass("Projected intermediate onto " + self + ":" + imed.fullname + "\n" + proj); + } } } @@ -244,42 +256,6 @@ public void runValidationPasses() throws ScribException } } - // Due to Projector not being a subprotocol visitor, so "external" subprotocols may not be visible in ModuleContext building for the projections of the current root Module - // SubprotocolVisitor it doesn't visit the target Module/ProtocolDecls -- that's why the old Projector maintained its own dependencies and created the projection modules after leaving a Do separately from SubprotocolVisiting - // So Projection should not be an "inlining" SubprotocolVisitor, it would need to be more a "DependencyVisitor" - protected void runProjectionPasses() throws ScribException - { - /*runVisitorPassOnAllModules(Projector.class); - runProjectionContextBuildingPasses(); - runProjectionUnfoldingPass(); - if (!this.config.noAcceptCorrelationCheck) - { - runVisitorPassOnParsedModules(ExplicitCorrelationChecker.class); - }*/ - - for (GProtocol g : this.context.getInlined()) - { - for (Role self : g.roles) - { - GProtocol inlined = this.context.getInlined(g.fullname); // pruneRecs already done for pruneRecs (cf. runContextBuildingPasses) - LProtocol iproj = inlined.projectInlined(this, self); // CHECKME: projection and inling commutative? - this.context.addInlinedProjection(iproj.fullname, iproj); - verbosePrintln("\nProjected inlined onto " + self + ":\n" + iproj); - } - } - - // Pre: inlined already projected -- used for Do projection - for (GProtocol g : this.context.getIntermediates()) - { - for (Role self : g.roles) - { - LProtocol proj = g.project(this, self); // Does pruneRecs - this.context.addProjection(proj); - verbosePrintln("\nProjected onto " + self + ":\n" + proj); - } - } - } - // Pre: checkWellFormedness // Returns: fullname -> Module -- CHECKME TODO: refactor local Module creation to Lang? // CHECKME: generate projection Modules for an inline main? @@ -375,8 +351,8 @@ public void verbosePrintln(String s) } } - /*private void debugPrintPass(String s) + private void verbosePrintPass(String s) { - debugPrintln("\n[Job] " + s); - }*/ + verbosePrintln("\n[Core] " + s); + } } diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index 98f69210d..fd7101b5e 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -14,7 +14,6 @@ package org.scribble.core.job; import java.io.File; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -109,7 +108,7 @@ public GProtocol getIntermediate(GProtoName fullname) return this.imeds.get(fullname); } - public Collection getIntermediates() + public Set getIntermediates() { return this.imeds.values().stream().collect(Collectors.toSet()); } diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 75864e8fc..adfd8e229 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -431,7 +431,7 @@ roledecl: paramdecls: -> ^(PARAMDECL_LIST) | - t='<' paramdecl (',' paramdecl)* '>' -> ^(PARAMDECL_LIST[$t] paramdecl+) + t='<' (paramdecl (',' paramdecl)*)? '>' -> ^(PARAMDECL_LIST[$t] paramdecl*) ; paramdecl: dataparamdecl | sigparamdecl ; @@ -564,7 +564,7 @@ rolearg: nonroleargs: -> ^(NONROLEARG_LIST) | - t='<' nonrolearg (',' nonrolearg)* '>' -> ^(NONROLEARG_LIST[$t] nonrolearg+) + t='<' (nonrolearg (',' nonrolearg)*)? '>' -> ^(NONROLEARG_LIST[$t] nonrolearg*) ; // Grammatically same as message, but qualifiedname case may also be a payload type From ace7eabf58abaa4c0d623fe5ef860f255c0b9ead Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 23:36:33 +0100 Subject: [PATCH 289/539] [WIP] refactoring Core pass running. --- .../src/main/java/org/scribble/job/Job.java | 11 ++-- .../main/java/org/scribble/core/job/Core.java | 50 +++++++++++-------- .../org/scribble/core/job/CoreContext.java | 10 ++-- scribble-test/src/test/scrib/tmp/Test.scr | 10 +++- 4 files changed, 51 insertions(+), 30 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 423ff0777..eb968d342 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -157,14 +157,14 @@ private void runVisitorOnModule(ModuleName modname, AstVisitor v) this.context.replaceModule(visited); } - public void warningPrintln(String s) + public boolean isVerbose() { - System.err.println("[Warning] " + s); + return this.config.args.get(CoreArgs.VERBOSE); } public void verbosePrintln(String s) { - if (this.config.args.get(CoreArgs.VERBOSE)) + if (isVerbose()) { System.out.println(s); } @@ -174,4 +174,9 @@ private void verbosePrintPass(String s) { verbosePrintln("\n[Job] " + s); } + + public void warningPrintln(String s) + { + System.err.println("[Warning] " + s); + } } diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 97ec9b2ae..246035131 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -136,9 +136,9 @@ public void runContextBuildingPasses() // No ScribException, no errors expected "Unfolded all recursions once: " + inlined.fullname + "\n" + unf); } - runProjectionPasses(); + runProjectionPasses(); // Do before any validation (i.e., including global WF), to promote greater tool feedback - for (Entry e : this.context.getInlinedProjections() + for (Entry e : this.context.getProjectedInlineds() .entrySet()) { LProtocol proj = e.getValue(); @@ -160,7 +160,7 @@ protected void runProjectionPasses() // No ScribException, no errors expected { // pruneRecs already done (see runContextBuildingPasses) LProtocol iproj = inlined.projectInlined(this, self); // CHECKME: projection and inling commutative? - this.context.addInlinedProjection(iproj.fullname, iproj); + this.context.addProjectedInlined(iproj.fullname, iproj); verbosePrintPass("Projected inlined onto " + self + ": " + inlined.fullname + "\n" + iproj); } @@ -174,17 +174,19 @@ protected void runProjectionPasses() // No ScribException, no errors expected { LProtocol proj = imed.project(this, self); // Does pruneRecs this.context.addProjection(proj); - verbosePrintPass("Projected intermediate onto " + self + ":" + imed.fullname + "\n" + proj); + verbosePrintPass("Projected intermediate onto " + self + ": " + + imed.fullname + "\n" + proj); } } } public void runValidationPasses() throws ScribException { + verbosePrintPass("Checking for unused role decls on all inlined globals..."); for (GProtocol inlined : this.context.getInlined()) { // CHECKME: relegate to "warning" ? -- some downsteam operations may depend on this though (e.g., graph building?) - // Check unused roles + // TODO: refactor as Visitor Set used = inlined.def .gather(new RoleGatherer()::visit) .collect(Collectors.toSet()); @@ -196,27 +198,33 @@ public void runValidationPasses() throws ScribException throw new ScribException( "Unused roles in " + inlined.fullname + ": " + unused); } + } - if (inlined.isAux()) - { - continue; - } - //STypeUnfolder u = new STypeUnfolder<>(); + verbosePrintPass("Checking role enabling on all inlined globals..."); + for (GProtocol inlined : (Iterable) this.context.getInlined() + .stream().filter(x -> !x.isAux())::iterator) + { GTypeUnfolder v = new GTypeUnfolder(); //e.g., C->D captured under an A->B choice after unfolding, cf. bad.wfchoice.enabling.twoparty.Test01b; inlined.unfoldAllOnce(v).checkRoleEnabling(); + } + + verbosePrintPass("Checking consistent external choice subjects on all inlined globals..."); + for (GProtocol inlined : (Iterable) this.context.getInlined() + .stream().filter(x -> !x.isAux())::iterator) + { inlined.checkExtChoiceConsistency(); } - for (LProtocol proj : this.context.getInlinedProjections().values()) + verbosePrintPass("Checking reachability on all projected inlineds..."); + for (LProtocol proj : (Iterable) this.context + .getProjectedInlineds().values().stream() + .filter(x -> !x.isAux())::iterator) // CHECKME? e.g., bad.reach.globals.gdo.Test01b { - if (proj.isAux()) // CHECKME? e.g., bad.reach.globals.gdo.Test01b - { - continue; - } proj.checkReachability(); } + verbosePrintPass("Building and checking models from projected inlineds..."); //runVisitorPassOnAllModules(GProtocolValidator.class); //for (Module mod : this.context.getParsed().values()) { @@ -338,14 +346,9 @@ public boolean isVerbose() return this.config.args.get(CoreArgs.VERBOSE); } - public void warningPrintln(String s) - { - System.err.println("[Warning] " + s); - } - public void verbosePrintln(String s) { - if (this.config.args.get(CoreArgs.VERBOSE)) + if (isVerbose()) { System.out.println(s); } @@ -355,4 +358,9 @@ private void verbosePrintPass(String s) { verbosePrintln("\n[Core] " + s); } + + public void warningPrintln(String s) + { + System.err.println("[Warning] " + s); + } } diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index fd7101b5e..eba277efc 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -128,24 +128,24 @@ public Set getInlined() return this.inlined.values().stream().collect(Collectors.toSet()); } - public void addInlinedProjection(LProtoName fullname, LProtocol l) + public void addProjectedInlined(LProtoName fullname, LProtocol l) { this.iprojs.put(fullname, l); } // Projected from inlined - public LProtocol getInlinedProjection(GProtoName fullname, Role self) + public LProtocol getProjectedInlined(GProtoName fullname, Role self) { LProtoName p = InlinedProjector.getFullProjectionName(fullname, self); - return getInlinedProjection(p); + return getProjectedInlined(p); } - public LProtocol getInlinedProjection(LProtoName fullname) + public LProtocol getProjectedInlined(LProtoName fullname) { return this.iprojs.get(fullname); } - public Map getInlinedProjections() + public Map getProjectedInlineds() { return Collections.unmodifiableMap(this.iprojs); } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 476ffd3d3..3f8cd6b54 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -100,12 +100,20 @@ module tmp.Test; data "..." from "..." as T; -global protocol Proto1(role A, role B) +global protocol Proto1<>(role A, role B) { (T) from A to B; } +/* +global protocol Proto1<>(role A, role B) // TODO: add unit test, testing empty paramdecls +{ + () from A to B; + do Proto1<>(A, B); // TODO: add unit test, testing empty nonroleargs +} +//*/ + /* sig "..." from "..." as M; From 00b612ff4386b3b54f595d02f1ce4a1e2f4c378e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Apr 2019 23:53:15 +0100 Subject: [PATCH 290/539] [WIP] Continued: refactoring Core pass running. --- .../src/main/java/org/scribble/job/Job.java | 8 +- .../main/java/org/scribble/core/job/Core.java | 80 ++++++++----------- .../core/model/global/SGraphBuilderUtil.java | 4 +- 3 files changed, 40 insertions(+), 52 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index eb968d342..5deb6bae9 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -138,10 +138,10 @@ public void runVisitorPassOnAllModules(AstVisitor v) throws ScribException private void runVisitorPass(AstVisitor v, Set fullnames) throws ScribException { - for (ModuleName fullname : fullnames) - { - runVisitorOnModule(fullname, v); - } + for (ModuleName fullname : fullnames) + { + runVisitorOnModule(fullname, v); + } } private void runVisitorOnModule(ModuleName modname, AstVisitor v) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 246035131..efd384735 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -93,21 +93,6 @@ public EGraphBuilderUtil newEGraphBuilderUtil() { return new EGraphBuilderUtil(this.config.mf); } - - //public SGraphBuilderUtil newSGraphBuilderUtil() // FIXME TODO global builder util - public SGraph buildSGraph(GProtoName fullname, Map egraphs, - boolean explicit) throws ScribException - { - verbosePrintln("(" + fullname + ") Building global model using:"); - for (Role r : egraphs.keySet()) - { - // FIXME: refactor - verbosePrintln("-- EFSM for " - + r + ":\n" + egraphs.get(r).init.toDot()); - } - //return SGraph.buildSGraph(this, fullname, createInitialSConfig(this, egraphs, explicit)); - return this.sgraphb.buildSGraph(this, fullname, egraphs, explicit); // FIXME: factor out util - } public void runPasses() throws ScribException { @@ -138,6 +123,7 @@ public void runContextBuildingPasses() // No ScribException, no errors expected runProjectionPasses(); // Do before any validation (i.e., including global WF), to promote greater tool feedback + verbosePrintPass("Building EFSMs for all projected inlineds..."); for (Entry e : this.context.getProjectedInlineds() .entrySet()) { @@ -182,7 +168,8 @@ protected void runProjectionPasses() // No ScribException, no errors expected public void runValidationPasses() throws ScribException { - verbosePrintPass("Checking for unused role decls on all inlined globals..."); + verbosePrintPass( + "Checking for unused role decls on all inlined globals..."); for (GProtocol inlined : this.context.getInlined()) { // CHECKME: relegate to "warning" ? -- some downsteam operations may depend on this though (e.g., graph building?) @@ -209,7 +196,8 @@ public void runValidationPasses() throws ScribException inlined.unfoldAllOnce(v).checkRoleEnabling(); } - verbosePrintPass("Checking consistent external choice subjects on all inlined globals..."); + verbosePrintPass( + "Checking consistent external choice subjects on all inlined globals..."); for (GProtocol inlined : (Iterable) this.context.getInlined() .stream().filter(x -> !x.isAux())::iterator) { @@ -225,44 +213,44 @@ public void runValidationPasses() throws ScribException } verbosePrintPass("Building and checking models from projected inlineds..."); - //runVisitorPassOnAllModules(GProtocolValidator.class); - //for (Module mod : this.context.getParsed().values()) + // CHECKME: refactor whole validation into lang.GProtocol ? + for (GProtocol iproj : (Iterable) this.context.getInlined() + .stream().filter(x -> !x.isAux())::iterator) { - // FIXME: refactor validation into lang.GProtocol - //for (GProtocolDecl gpd : mod.getGProtoDeclChildren()) - for (GProtocol gpd : this.context.getInlined()) //mod.getGProtoDeclChildren()) + verbosePrintPass("Validating: " + iproj.fullname); + if (this.config.args.get(CoreArgs.SPIN)) { - if (gpd.isAux()) + if (this.config.args.get(CoreArgs.FAIR)) { - continue; + throw new RuntimeException( + "[TODO]: -spin currently does not support fair ouput choices."); } - - GProtoName fullname = gpd.fullname;//.getFullMemberName(mod); - - verbosePrintln("\nValidating " + fullname + ":"); - - if (this.config.args.get(CoreArgs.SPIN)) - { - if (this.config.args.get(CoreArgs.FAIR)) - { - throw new RuntimeException( - "[TODO]: -spin currently does not support fair ouput choices."); - } - GProtocol.validateBySpin(this, fullname); - } - else + GProtocol.validateBySpin(this, iproj.fullname); + } + else + { + GProtocol.validateByScribble(this, iproj.fullname, true); + if (!this.config.args.get(CoreArgs.FAIR)) { - GProtocol.validateByScribble(this, fullname, true); - if (!this.config.args.get(CoreArgs.FAIR)) - { - verbosePrintln( - "(" + fullname + ") Validating with \"unfair\" output choices.. "); - GProtocol.validateByScribble(this, fullname, false); // TODO: only need to check progress, not full validation - } + verbosePrintPass( + "Validating with \"unfair\" output choices: " + iproj.fullname); + GProtocol.validateByScribble(this, iproj.fullname, false); // TODO: only need to check progress, not full validation } } } } + + public SGraph buildSGraph(GProtoName fullname, Map egraphs, + boolean explicit) throws ScribException + { + /*verbosePrintln("(" + fullname + ") Building global model using:"); + for (Role r : egraphs.keySet()) + { + verbosePrintln("-- EFSM for " + + r + ":\n" + egraphs.get(r).init.toDot()); + }*/ + return this.sgraphb.buildSGraph(this, fullname, egraphs, explicit); // CHECKME: factor out util ? + } // Pre: checkWellFormedness // Returns: fullname -> Module -- CHECKME TODO: refactor local Module creation to Lang? diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index 1abef4901..7e4fb0158 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -188,8 +188,8 @@ else if (a.isWrapClient() || a.isWrapServer()) SGraph graph = core.config.mf.newSGraph(fullname, seen, init); core.verbosePrintln( - "(" + fullname + ") Built global model..\n" + graph.init.toDot() + "\n(" - + fullname + ") .." + graph.states.size() + " states"); + "(" + fullname + ") Built global model...\n" + graph.init.toDot() + "\n(" + + fullname + ") ..." + graph.states.size() + " states"); return graph; } From 46395ddefb01ac1b416ccc4f37997b8f4847a4a4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 00:12:04 +0100 Subject: [PATCH 291/539] [WIP] Continued: refactoring Core pass running. --- .../main/java/org/scribble/core/job/Core.java | 126 ++++++++++-------- .../org/scribble/core/job/CoreContext.java | 10 +- .../org/scribble/core/model/ModelFactory.java | 3 + .../scribble/core/model/ModelFactoryImpl.java | 7 + .../core/model/endpoint/AutGraphParser.java | 2 +- .../core/visit/local/EGraphBuilder.java | 2 +- 6 files changed, 88 insertions(+), 62 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index efd384735..df5f2a006 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -25,7 +25,6 @@ import org.scribble.core.model.ModelFactory; import org.scribble.core.model.ModelFactoryImpl; import org.scribble.core.model.endpoint.EGraph; -import org.scribble.core.model.endpoint.EGraphBuilderUtil; import org.scribble.core.model.global.SGraph; import org.scribble.core.model.global.SGraphBuilderUtil; import org.scribble.core.type.kind.Global; @@ -60,7 +59,7 @@ public Core(ModuleName mainFullname, Map args, this.config = newCoreConfig(mainFullname, args); this.context = newCoreContext(//modcs, imeds); // Single instance per Core and should never be shared - this.sgraphb = newSGraphBuilderUtil(); + this.sgraphb = this.config.mf.newSGraphBuilderUtil(); } // A Scribble extension should override newCoreConfig/Context/etc as appropriate @@ -79,24 +78,10 @@ protected CoreContext newCoreContext(//Map modcs, return new CoreContext(this, //modcs, imeds); } - - // TODO: deprecate, caller should go through config - // A Scribble extension should override newCoreConfig/Context/etc as appropriate - public SGraphBuilderUtil newSGraphBuilderUtil() - { - return this.config.mf.newSGraphBuilderUtil(); - } - - // TODO: deprecate, caller should go through config - // A Scribble extension should override newCoreConfig/Context/etc as appropriate - public EGraphBuilderUtil newEGraphBuilderUtil() - { - return new EGraphBuilderUtil(this.config.mf); - } public void runPasses() throws ScribException { - runContextBuildingPasses(); + runContextBuildingPasses(); // Includes runProjectionPasses runValidationPasses(); } @@ -113,7 +98,7 @@ public void runContextBuildingPasses() // No ScribException, no errors expected } verbosePrintPass("Unfolding all recursions once for all inlined globals..."); - for (GProtocol inlined : this.context.getInlined()) + for (GProtocol inlined : this.context.getInlineds()) { GTypeUnfolder v = new GTypeUnfolder(); GProtocol unf = (GProtocol) inlined.unfoldAllOnce(v);//.unfoldAllOnce(unf2); // CHECKME: twice unfolding? instead of "unguarded"-unfolding? @@ -140,7 +125,7 @@ public void runContextBuildingPasses() // No ScribException, no errors expected protected void runProjectionPasses() // No ScribException, no errors expected { verbosePrintPass("Projecting all inlined globals..."); - for (GProtocol inlined : this.context.getInlined()) + for (GProtocol inlined : this.context.getInlineds()) { for (Role self : inlined.roles) { @@ -170,7 +155,7 @@ public void runValidationPasses() throws ScribException { verbosePrintPass( "Checking for unused role decls on all inlined globals..."); - for (GProtocol inlined : this.context.getInlined()) + for (GProtocol inlined : this.context.getInlineds()) { // CHECKME: relegate to "warning" ? -- some downsteam operations may depend on this though (e.g., graph building?) // TODO: refactor as Visitor @@ -188,7 +173,7 @@ public void runValidationPasses() throws ScribException } verbosePrintPass("Checking role enabling on all inlined globals..."); - for (GProtocol inlined : (Iterable) this.context.getInlined() + for (GProtocol inlined : (Iterable) this.context.getInlineds() .stream().filter(x -> !x.isAux())::iterator) { GTypeUnfolder v = new GTypeUnfolder(); @@ -198,7 +183,7 @@ public void runValidationPasses() throws ScribException verbosePrintPass( "Checking consistent external choice subjects on all inlined globals..."); - for (GProtocol inlined : (Iterable) this.context.getInlined() + for (GProtocol inlined : (Iterable) this.context.getInlineds() .stream().filter(x -> !x.isAux())::iterator) { inlined.checkExtChoiceConsistency(); @@ -213,8 +198,8 @@ public void runValidationPasses() throws ScribException } verbosePrintPass("Building and checking models from projected inlineds..."); - // CHECKME: refactor whole validation into lang.GProtocol ? - for (GProtocol iproj : (Iterable) this.context.getInlined() + // CHECKME: refactor more/whole validation into lang.GProtocol ? + for (GProtocol iproj : (Iterable) this.context.getInlineds() .stream().filter(x -> !x.isAux())::iterator) { verbosePrintPass("Validating: " + iproj.fullname); @@ -249,7 +234,7 @@ public SGraph buildSGraph(GProtoName fullname, Map egraphs, verbosePrintln("-- EFSM for " + r + ":\n" + egraphs.get(r).init.toDot()); }*/ - return this.sgraphb.buildSGraph(this, fullname, egraphs, explicit); // CHECKME: factor out util ? + return this.sgraphb.buildSGraph(this, fullname, egraphs, explicit); // CHECKME: factor out util -- ? } // Pre: checkWellFormedness @@ -286,6 +271,66 @@ public Map getProjections(GProtoName fullname, //FIXME: build output Modules //FIXME: (interleaved) ordering between proto and nonproto (Module) imports -- order by original Global import order? } + + public CoreContext getContext() + { + return this.context; + } + + public boolean isVerbose() + { + return this.config.args.get(CoreArgs.VERBOSE); + } + + public void verbosePrintln(String s) + { + if (isVerbose()) + { + System.out.println(s); + } + } + + private void verbosePrintPass(String s) + { + verbosePrintln("\n[Core] " + s); + } + + public void warningPrintln(String s) + { + System.err.println("[Warning] " + s); + } +} + + + + + + + + + + + + + + + + + + + /*// TODO: deprecate, caller should go through config + // A Scribble extension should override newCoreConfig/Context/etc as appropriate + public SGraphBuilderUtil newSGraphBuilderUtil() + { + return this.config.mf.newSGraphBuilderUtil(); + }*/ + + /*// TODO: deprecate, caller should go through config // CHECKME: refactor more uniformly with mf.newSGraphBuilderUtil ? + // A Scribble extension should override newCoreConfig/Context/etc as appropriate + public EGraphBuilderUtil newEGraphBuilderUtil() + { + return new EGraphBuilderUtil(this.config.mf); + }*/ /*public Map generateSessionApi(GProtocolName fullname) throws ScribbleException { @@ -322,33 +367,4 @@ public Map generateStateChannelApi(GProtocolName fullname, Role api.putAll(iogen.generateApi()); } return api; - }*/ - - public CoreContext getContext() - { - return this.context; - } - - public boolean isVerbose() - { - return this.config.args.get(CoreArgs.VERBOSE); - } - - public void verbosePrintln(String s) - { - if (isVerbose()) - { - System.out.println(s); - } - } - - private void verbosePrintPass(String s) - { - verbosePrintln("\n[Core] " + s); - } - - public void warningPrintln(String s) - { - System.err.println("[Warning] " + s); - } -} + }*/ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index eba277efc..dfdace0a4 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -38,7 +38,7 @@ // Mutable: projections, graphs, etc are added mutably later -- replaceModule also mutable setter -- "users" get this from the Job and expect to setter mutate "in place" public class CoreContext { - public final Core core; + private final Core core; // Keys are full names // CHECKME: not currently used by core? -- core fully independent of modules, etc., because full disamb already done? (by imed translation) @@ -54,14 +54,14 @@ public class CoreContext private final Map inlined = new HashMap<>(); // Projected from inlined; keys are full names - private final Map iprojs = new HashMap<>(); + private final Map iprojs = new HashMap<>(); // CHECKME: rename projis? // Projected from intermediates // LProtocolName is the full local protocol name (module name is the prefix) // LProtocolName key is LProtocol value fullname (i.e., redundant) private final Map projs = new HashMap<>(); - // Built from inlined + // Built from projected inlined private final Map fEGraphs = new HashMap<>(); private final Map uEGraphs = new HashMap<>(); private final Map mEGraphs = new HashMap<>(); @@ -123,17 +123,17 @@ public GProtocol getInlined(GProtoName fullname) return this.inlined.get(fullname); } - public Set getInlined() + public Set getInlineds() { return this.inlined.values().stream().collect(Collectors.toSet()); } + // Projected from inlined public void addProjectedInlined(LProtoName fullname, LProtocol l) { this.iprojs.put(fullname, l); } - // Projected from inlined public LProtocol getProjectedInlined(GProtoName fullname, Role self) { LProtoName p = InlinedProjector.getFullProjectionName(fullname, self); diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java index 1484d7bd8..f941d6d10 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java @@ -17,6 +17,7 @@ import java.util.Set; import org.scribble.core.model.endpoint.EFSM; +import org.scribble.core.model.endpoint.EGraphBuilderUtil; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAccept; import org.scribble.core.model.endpoint.actions.EDisconnect; @@ -46,6 +47,8 @@ public interface ModelFactory { + EGraphBuilderUtil newEGraphBuilderUtil(); + ESend newESend(Role peer, MsgId mid, Payload payload); EReceive newEReceive(Role peer, MsgId mid, Payload payload); ERequest newERequest(Role peer, MsgId mid, Payload payload); diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java index c34f71570..c7f70d532 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java @@ -17,6 +17,7 @@ import java.util.Set; import org.scribble.core.model.endpoint.EFSM; +import org.scribble.core.model.endpoint.EGraphBuilderUtil; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAccept; import org.scribble.core.model.endpoint.actions.EDisconnect; @@ -48,6 +49,12 @@ public class ModelFactoryImpl implements ModelFactory { + @Override + public EGraphBuilderUtil newEGraphBuilderUtil() + { + return new EGraphBuilderUtil(this); + } + @Override public ESend newESend(Role peer, MsgId mid, Payload payload) { diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java index f1412cfa0..8d70dbdaf 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java @@ -116,7 +116,7 @@ public EGraph parse(String aut) } //EGraphBuilderUtil util = new EGraphBuilderUtil(ef); //EGraphBuilderUtil util = this.job2.newEGraphBuilderUtil2(); - EGraphBuilderUtil util = this.core.newEGraphBuilderUtil(); + EGraphBuilderUtil util = this.core.config.mf.newEGraphBuilderUtil(); //util.init(null); // FIXME: arg is deprecated Map map = new HashMap<>(); map.put(init, util.getEntry()); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index d31069f7c..c6f766468 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -60,7 +60,7 @@ public class EGraphBuilder extends STypeVisitorNoThrow public EGraphBuilder(Core core) { this.core = core; - this.util = core.newEGraphBuilderUtil(); + this.util = core.config.mf.newEGraphBuilderUtil(); this.util.init(null); } From 2a661a09e7c28af08a5f8684f68c08ca5dd9a8f7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 00:16:45 +0100 Subject: [PATCH 292/539] [WIP] Minor. --- .../src/main/java/org/scribble/core/job/Core.java | 1 - scribble-test/src/test/scrib/tmp/Test.scr | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index df5f2a006..2e2f0c5fa 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -158,7 +158,6 @@ public void runValidationPasses() throws ScribException for (GProtocol inlined : this.context.getInlineds()) { // CHECKME: relegate to "warning" ? -- some downsteam operations may depend on this though (e.g., graph building?) - // TODO: refactor as Visitor Set used = inlined.def .gather(new RoleGatherer()::visit) .collect(Collectors.toSet()); diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 3f8cd6b54..942166a1b 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -100,9 +100,19 @@ module tmp.Test; data "..." from "..." as T; -global protocol Proto1<>(role A, role B) +global protocol Proto1(role A, role B) +{ + do Proto1Aux(A, B); +} + +aux global protocol Proto1Aux(role A, role B) +{ + do Proto2(A, B); +} + +aux global protocol Proto2(role A, role B) { - (T) from A to B; + () from B to A; } From a6a5d67c6daf71f24d3cb34f769092505d74cc92 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 00:41:20 +0100 Subject: [PATCH 293/539] [ALLTEST] Minor. --- .../main/java/org/scribble/core/job/Core.java | 4 +- .../org/scribble/core/visit/STypeAgg.java | 2 +- .../scribble/core/visit/STypeAggNoThrow.java | 2 +- .../org/scribble/core/visit/STypeVisitor.java | 74 +++++++++++-------- .../core/visit/STypeVisitorNoThrow.java | 8 +- .../scribble/core/visit/global/Projector.java | 2 +- .../visit/local/SingleContinueChecker.java | 5 +- 7 files changed, 54 insertions(+), 43 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 2e2f0c5fa..e99dd45ac 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -237,8 +237,8 @@ public SGraph buildSGraph(GProtoName fullname, Map egraphs, } // Pre: checkWellFormedness - // Returns: fullname -> Module -- CHECKME TODO: refactor local Module creation to Lang? - // CHECKME: generate projection Modules for an inline main? + // Returns: fullname -> Module -- CHECKME TODO: refactor local Module creation to Job? + // CHECKME: generate projection Modules for an inline main? -- no: TODO refactor to Job public Map getProjections(GProtoName fullname, Role role) throws ScribException { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java index 368a10657..e344a670d 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java @@ -35,7 +35,7 @@ public abstract class STypeAgg, T> // Pre: agg(Stream.of(unit())) = unit() protected abstract T unit(SType n) throws ScribException; - // Internal use -- by default, agg applied to all cases (including unit) + // Internal use -- by default, agg is applied to the "compound" cases (choice, recursion, seq) // Pre: agg(Stream.of(unit())) = unit() protected abstract T agg(SType n, Stream ts) throws ScribException; // Cf. generic varargs, heap pollution issue diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java index 214bc0420..fb0f49480 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java @@ -34,7 +34,7 @@ public abstract class STypeAggNoThrow, // Pre: agg(Stream.of(unit())) = unit() protected abstract T unit(SType n); - // Internal use + // Internal use -- by default, agg is applied to the "compound" cases (choice, recursion, seq) // Pre: agg(Stream.of(unit())) = unit() protected abstract T agg(SType n, Stream ts); // Cf. generic varargs, heap pollution issue diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java index 467177d44..df6862237 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitor.java @@ -24,13 +24,16 @@ import org.scribble.core.type.session.Seq; import org.scribble.util.ScribException; -// "Instantiates" Agg by implicitly treating Stream as always a singleton Stream of the *reconstructed* node +// "Instantiates" STypeAgg by implicitly treating Stream as always a singleton Stream of the *reconstructed* node. +// The main benefit is to reuse the SType.visitWith(STypeAgg) methods for STypeVisitors. +// // Alternative characterisations of STypeVisitor as STypeAgg? // T = SType, unit = empty, agg = reconstruct, ns = "structural" (i.e, B) children -- issues with generic cast to B inside agg // T = SType, unit = n.getChildren(), agg = reconstruct, ns = all children -- all children require dynamic casts // T = B ... ? Considering Stream like a Seq, and elems as singleton Seqs -- cf. Stream, for Choice/etc reconstruct +// The sticking issue is that the "compound" nodes are not quite uniform w.r.t. agg: Choice/Recursion have Seq children, Seq has SType (but not Seq) children public abstract class STypeVisitor> - extends STypeAgg> // T = SType gives reconstruction flexibility/extensibility + extends STypeAgg> // T = SType gives more flexibile/extensibile reconstruction patterns { @Override protected final SType unit(SType n) throws ScribException @@ -38,36 +41,12 @@ protected final SType unit(SType n) throws ScribException return n; } - // Should generally disregard agg for STypeVisitors -- pattern is now to manually do reconstruct within visit dispatches + // Should disregard agg for STypeVisitors -- the STypeVisitor pattern is instead to manually reconstruct within each visit[Node] @Override protected final SType agg(SType n, Stream> ns) throws ScribException { - //return ns.iterator().next(); throw new RuntimeException("Disregarded for STypeVisitor: " + n + " ,, " + ns); - - /*// agg = reconstruct, ns = "structural" (i.e, B) children -- problem with generic casts - if (n instanceof Continue || n instanceof DirectedInteraction - || n instanceof DisconnectAction || n instanceof Do) - { - return ns.iterator().next(); - } - else if (n instanceof Choice) - { - Choice c = (Choice) n; - return c.reconstruct(c.getSource(), c.subj, - ns.map(x -> (B) x).collect(Collectors.toList())); - } - else if (n instanceof Recursion) - { - Recursion r = (Recursion) n; - return r.reconstruct(r.getSource(), r.recvar, (B) ns.iterator().next()); - } - else - { - throw new RuntimeException("Shouldn't get in here: " + n + " ,, " + ns); - // agg should only be called from internal visit dispatch methods, so n's type has already been cased - }*/ } @Override @@ -79,20 +58,20 @@ public SType visitChoice(Choice n) throws ScribException blocks.add(visitSeq(b)); } - return n.reconstruct(n.getSource(), n.subj, blocks); // Skipping agg (reconstruction done here) + return n.reconstruct(n.getSource(), n.subj, blocks); // Disregarding agg (reconstruction done here) } @Override public SType visitRecursion(Recursion n) throws ScribException { B body = visitSeq(n.body); - return n.reconstruct(n.getSource(), n.recvar, body); // Skipping agg (reconstruction done here) + return n.reconstruct(n.getSource(), n.recvar, body); // Disregarding agg (reconstruction done here) } // "Hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction // This means a Visitor that needs to restructure a Seq should handle this within visitSeq - // E.g., Seq "injection" by inlining and unfolding - // For this purpose, visited children passed "directly" instead of via a reconstruction (cf. above methods) + // E.g., Seq "injection" by inlining and unfolding (i.e., when a visited elem is a Seq) + // For this purpose, visited children passed "directly" instead of via a reconstruction (cf. above methods) -- ? @Override public B visitSeq(B n) throws ScribException { @@ -101,7 +80,7 @@ public B visitSeq(B n) throws ScribException { elems.add(e.visitWith(this)); } - return n.reconstruct(n.getSource(), elems); // N.B. skipping agg (reconstruction done here) + return n.reconstruct(n.getSource(), elems); // Disregarding agg (reconstruction done here) } } @@ -125,6 +104,37 @@ public B visitSeq(B n) throws ScribException + + /*// Should generally disregard agg for STypeVisitors -- pattern is now to manually do reconstruct within visit dispatches + @Override + protected final SType agg(SType n, Stream> ns) + throws ScribException + { + return ns.iterator().next(); + + // agg = reconstruct, ns = "structural" (i.e, B) children -- problem with generic casts + if (n instanceof Continue || n instanceof DirectedInteraction + || n instanceof DisconnectAction || n instanceof Do) + { + return ns.iterator().next(); + } + else if (n instanceof Choice) + { + Choice c = (Choice) n; + return c.reconstruct(c.getSource(), c.subj, + ns.map(x -> (B) x).collect(Collectors.toList())); + } + else if (n instanceof Recursion) + { + Recursion r = (Recursion) n; + return r.reconstruct(r.getSource(), r.recvar, (B) ns.iterator().next()); + } + else + { + throw new RuntimeException("Shouldn't get in here: " + n + " ,, " + ns); + // agg should only be called from internal visit dispatch methods, so n's type has already been cased + } + }*/ /* diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java index b7ec0c034..fadce814c 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorNoThrow.java @@ -33,7 +33,7 @@ protected final SType unit(SType n) return n; } - // Should generally disregard agg for STypeVisitors -- pattern is now to manually do reconstruct within visit dispatches + // Should disregard agg for STypeVisitors -- the STypeVisitor pattern is instead to manually reconstruct within each visit[Node] @Override protected final SType agg(SType n, Stream> ns) { @@ -45,14 +45,14 @@ public SType visitChoice(Choice n) { List blocks = n.blocks.stream().map(x -> visitSeq(x)) .collect(Collectors.toList()); - return n.reconstruct(n.getSource(), n.subj, blocks); // Skipping agg (reconstruction done here) + return n.reconstruct(n.getSource(), n.subj, blocks); // Disregarding agg (reconstruction done here) } @Override public SType visitRecursion(Recursion n) { B body = visitSeq(n.body); - return n.reconstruct(n.getSource(), n.recvar, body); // Skipping agg (reconstruction done here) + return n.reconstruct(n.getSource(), n.recvar, body); // Disregarding agg (reconstruction done here) } @Override @@ -60,7 +60,7 @@ public B visitSeq(B n) { List> elems = n.elems.stream().map(x -> x.visitWithNoThrow(this)) .collect(Collectors.toList()); - return n.reconstruct(n.getSource(), elems); // N.B. skipping agg (reconstruction done here) + return n.reconstruct(n.getSource(), elems); // Disregarding agg (reconstruction done here) } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java index 8ff868c19..e549847fb 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java @@ -33,7 +33,7 @@ import org.scribble.core.type.session.local.LType; // Supports Do -- can use on parsed (intermed) -public class Projector extends InlinedProjector // This way or the other way round? +public class Projector extends InlinedProjector // CHECKME: this way, or the other way round? { public Projector(Core core, Role self) { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java index 3714c4ba9..3eed48feb 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java @@ -71,13 +71,14 @@ public Boolean visitRecursion(Recursion n) { Set tmp = new HashSet<>(this.rvs); tmp.add(n.recvar); - //return n.body.aggregateNoEx(new SingleContinueChecker(tmp)); + //return n.body.visitWithNoThrow(new SingleContinueChecker(tmp)); return new SingleContinueChecker(tmp).visitSeq(n.body); } @Override public Boolean visitSeq(LSeq n) { - return n.elems.size() == 1 && ((LType) n.elems.get(0)).visitWithNoThrow(this); + return n.elems.size() == 1 + && ((LType) n.elems.get(0)).visitWithNoThrow(this); } } From 599e378b2d673d338a007e84ffd79d5e590e3fb8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 01:10:18 +0100 Subject: [PATCH 294/539] [AllTest] Refactoring model action classes. --- .../java/org/scribble/ast/name/NameNode.java | 4 +- .../ast/name/qualified/DataNameNode.java | 4 +- .../ast/name/qualified/GProtoNameNode.java | 4 +- .../ast/name/qualified/LProtoNameNode.java | 2 +- .../ast/name/qualified/ModuleNameNode.java | 4 +- .../ast/name/qualified/SigNameNode.java | 4 +- .../ast/name/simple/AmbigNameNode.java | 4 +- .../ast/name/simple/DataParamNode.java | 2 +- .../scribble/ast/name/simple/ExtIdNode.java | 4 +- .../org/scribble/ast/name/simple/IdNode.java | 4 +- .../ast/name/simple/NonRoleParamNode.java | 2 +- .../org/scribble/ast/name/simple/OpNode.java | 2 +- .../scribble/ast/name/simple/RecVarNode.java | 2 +- .../scribble/ast/name/simple/RoleNode.java | 4 +- .../ast/name/simple/SigParamNode.java | 2 +- .../statechanapi/ioifaces/ActionIfaceGen.java | 6 +- .../codegen/statetype/STCaseBuilder.java | 4 +- .../statetype/STOutputStateBuilder.java | 4 +- .../java/org/scribble/core/model/MAction.java | 41 ++----- .../org/scribble/core/model/MPrettyState.java | 2 +- .../org/scribble/core/model/ModelFactory.java | 55 +++++---- .../scribble/core/model/ModelFactoryImpl.java | 60 +++++----- .../core/model/endpoint/AutGraphParser.java | 10 +- .../endpoint/IntermediateContinueEdge.java | 6 +- .../model/endpoint/IntermediateRecEdge.java | 6 +- .../actions/{EAccept.java => EAcc.java} | 28 ++--- .../core/model/endpoint/actions/EAction.java | 36 +++--- .../{EWrapClient.java => EClientWrap.java} | 23 ++-- .../model/endpoint/actions/EDisconnect.java | 10 +- .../core/model/endpoint/actions/EReceive.java | 106 ------------------ .../core/model/endpoint/actions/ERecv.java | 82 ++++++++++++++ .../actions/{ERequest.java => EReq.java} | 28 ++--- .../core/model/endpoint/actions/ESend.java | 41 ++----- .../{EWrapServer.java => EServerWrap.java} | 24 ++-- .../scribble/core/model/global/SBuffers.java | 24 ++-- .../scribble/core/model/global/SConfig.java | 26 ++--- .../core/model/global/SGraphBuilderUtil.java | 10 +- .../scribble/core/model/global/SState.java | 4 +- .../core/model/global/SStateErrors.java | 6 +- .../actions/{SAccept.java => SAcc.java} | 16 ++- .../core/model/global/actions/SAction.java | 83 ++++++++------ .../{SWrapClient.java => SClientWrap.java} | 13 ++- .../core/model/global/actions/SConnect.java | 10 +- .../model/global/actions/SDisconnect.java | 4 +- .../actions/{SReceive.java => SRecv.java} | 14 +-- .../actions/{SRequest.java => SReq.java} | 17 ++- .../core/model/global/actions/SSend.java | 8 +- .../{SWrapServer.java => SServerWrap.java} | 14 ++- .../scribble/core/type/name/AbstractName.java | 7 +- .../scribble/core/type/name/AmbigName.java | 4 +- .../org/scribble/core/type/name/DataName.java | 4 +- .../scribble/core/type/name/GProtoName.java | 4 +- .../java/org/scribble/core/type/name/Id.java | 4 +- .../scribble/core/type/name/LProtoName.java | 4 +- .../scribble/core/type/name/ModuleName.java | 4 +- .../java/org/scribble/core/type/name/Op.java | 4 +- .../scribble/core/type/name/PackageName.java | 4 +- .../org/scribble/core/type/name/RecVar.java | 4 +- .../org/scribble/core/type/name/Role.java | 4 +- .../org/scribble/core/type/name/SigName.java | 4 +- .../session/local/{LRcv.java => LRecv.java} | 12 +- .../core/visit/global/InlinedProjector.java | 4 +- .../core/visit/local/EGraphBuilder.java | 14 +-- 63 files changed, 443 insertions(+), 507 deletions(-) rename scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/{EAccept.java => EAcc.java} (62%) rename scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/{EWrapClient.java => EClientWrap.java} (73%) delete mode 100644 scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReceive.java create mode 100644 scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERecv.java rename scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/{ERequest.java => EReq.java} (62%) rename scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/{EWrapServer.java => EServerWrap.java} (73%) rename scribble-core/src/main/java/org/scribble/core/model/global/actions/{SAccept.java => SAcc.java} (74%) rename scribble-core/src/main/java/org/scribble/core/model/global/actions/{SWrapClient.java => SClientWrap.java} (82%) rename scribble-core/src/main/java/org/scribble/core/model/global/actions/{SReceive.java => SRecv.java} (79%) rename scribble-core/src/main/java/org/scribble/core/model/global/actions/{SRequest.java => SReq.java} (73%) rename scribble-core/src/main/java/org/scribble/core/model/global/actions/{SWrapServer.java => SServerWrap.java} (81%) rename scribble-core/src/main/java/org/scribble/core/type/session/local/{LRcv.java => LRecv.java} (90%) diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java index 5b69dd2ff..70c4a2689 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/NameNode.java @@ -102,11 +102,11 @@ public boolean equals(Object o) return false; } NameNode them = (NameNode) o; - return them.canEqual(this) + return them.canEquals(this) && getElements().equals(them.getElements()); } - public abstract boolean canEqual(Object o); + public abstract boolean canEquals(Object o); @Override public int hashCode() diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java index 4b902a8f2..6ed1cf102 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java @@ -80,11 +80,11 @@ public boolean equals(Object o) { return false; } - return ((DataNameNode) o).canEqual(this) && super.equals(o); + return ((DataNameNode) o).canEquals(this) && super.equals(o); } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof DataNameNode; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtoNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtoNameNode.java index 4ad485198..1f85e6215 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtoNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtoNameNode.java @@ -57,11 +57,11 @@ public boolean equals(Object o) { return false; } - return ((GProtoNameNode) o).canEqual(this) && super.equals(o); + return ((GProtoNameNode) o).canEquals(this) && super.equals(o); } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof GProtoNameNode; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java index 4733e2f74..b99c81156 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java @@ -76,7 +76,7 @@ public boolean equals(Object o) } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof LProtoNameNode; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java index 929c9c3ad..df37bcbf3 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java @@ -60,11 +60,11 @@ public boolean equals(Object o) { return false; } - return ((ModuleNameNode) o).canEqual(this) && super.equals(o); + return ((ModuleNameNode) o).canEquals(this) && super.equals(o); } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof ModuleNameNode; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java index b2d9bf7b5..069280467 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java @@ -77,11 +77,11 @@ public boolean equals(Object o) { return false; } - return ((SigNameNode) o).canEqual(this) && super.equals(o); + return ((SigNameNode) o).canEquals(this) && super.equals(o); } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof SigNameNode; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index c8f169dc9..37bd17387 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -85,11 +85,11 @@ public boolean equals(Object o) { return false; } - return ((AmbigNameNode) o).canEqual(this) && super.equals(o); + return ((AmbigNameNode) o).canEquals(this) && super.equals(o); } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof AmbigNameNode; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java index c95a30568..4052c9824 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java @@ -88,7 +88,7 @@ public boolean equals(Object o) } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof DataParamNode; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/ExtIdNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/ExtIdNode.java index dc0a85ac4..cd5b5013a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/ExtIdNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/ExtIdNode.java @@ -47,11 +47,11 @@ public boolean equals(Object o) { return false; } - return ((ExtIdNode) o).canEqual(this) && super.equals(o); + return ((ExtIdNode) o).canEquals(this) && super.equals(o); } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof ExtIdNode; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java index cf59a1b8d..b1a40267b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java @@ -61,11 +61,11 @@ public boolean equals(Object o) { return false; } - return ((IdNode) o).canEqual(this) && super.equals(o); + return ((IdNode) o).canEquals(this) && super.equals(o); } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof IdNode; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java index 7c90e4325..dae52b068 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/NonRoleParamNode.java @@ -61,7 +61,7 @@ public boolean equals(Object o) } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof NonRoleParamNode; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java index d93310ff6..86eb0efb4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java @@ -73,7 +73,7 @@ public boolean equals(Object o) } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof OpNode; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java index 5579c9f4e..95263407f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java @@ -59,7 +59,7 @@ public boolean equals(Object o) } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof RecVarNode; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java index f0d611895..b46d79734 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java @@ -56,11 +56,11 @@ public boolean equals(Object o) { return false; } - return ((RoleNode) o).canEqual(this) && super.equals(o); + return ((RoleNode) o).canEquals(this) && super.equals(o); } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof RoleNode; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java index 383df0cc6..e1d097de1 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java @@ -87,7 +87,7 @@ public boolean equals(Object o) } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof SigParamNode; } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java index ad45193a9..c256808a8 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ActionIfaceGen.java @@ -22,7 +22,7 @@ import org.scribble.codegen.java.util.JavaBuilder; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.model.endpoint.actions.EReceive; +import org.scribble.core.model.endpoint.actions.ERecv; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.PayElemType; import org.scribble.util.ScribException; @@ -53,7 +53,7 @@ public InterfaceBuilder generateType() throws ScribException this.ib.addParameters("__Succ extends " + SuccessorIfaceGen.getSuccessorInterfaceName(this.a)); AbstractMethodBuilder mb = this.ib.newAbstractMethod(); // FIXME: factor out with ReceiveSocketBuilder //AbstractMethodBuilder mb2 = null; - if (this.a instanceof EReceive) + if (this.a instanceof ERecv) { /*if (this.curr.getAcceptable().size() > 1) { @@ -107,7 +107,7 @@ public static String getActionInterfaceName(EAction a) : "Out";*/ String name; //if (curr.getAcceptable().iterator().next() instanceof Receive) - if (a instanceof EReceive) + if (a instanceof ERecv) { /*if (curr.getAcceptable().size() > 1) { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java index 76c15b396..d42906ee7 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java @@ -15,7 +15,7 @@ import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.model.endpoint.actions.EReceive; +import org.scribble.core.model.endpoint.actions.ERecv; public abstract class STCaseBuilder extends STStateChanBuilder // Is a distinct type but not a state -- OK for now { @@ -34,7 +34,7 @@ public String build(STStateChanAPIBuilder api, EState s) for (EAction a : s.getActions()) { out += "\n\n"; - if (a instanceof EReceive) // FIXME: factor out action kind + if (a instanceof ERecv) // FIXME: factor out action kind { out += this.cb.build(api, s, a); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java index 71b66f990..b340ac7fe 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java @@ -16,7 +16,7 @@ import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.model.endpoint.actions.EDisconnect; -import org.scribble.core.model.endpoint.actions.ERequest; +import org.scribble.core.model.endpoint.actions.EReq; import org.scribble.core.model.endpoint.actions.ESend; public abstract class STOutputStateBuilder extends STStateChanBuilder @@ -43,7 +43,7 @@ public String build(STStateChanAPIBuilder api, EState s) { out += this.sb.build(api, s, a); } - else if (a instanceof ERequest) + else if (a instanceof EReq) { throw new RuntimeException("TODO: " + a); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/MAction.java b/scribble-core/src/main/java/org/scribble/core/model/MAction.java index 249cf97c9..333829144 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MAction.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MAction.java @@ -22,11 +22,11 @@ public abstract class MAction { /*private static int count = 0; - public final int id; // Was using for trace enumeration, but breaks isAcceptable -- but need for non-det models*/ + public final int id; // Was using for trace enumeration, but breaks isAcceptable -- but would be better for non-det models?*/ public final Role obj; public final MsgId mid; - public final Payload payload; // EMPTY_PAYLOAD for MessageSigNames + public final Payload payload; // Payload.EMPTY_PAYLOAD for SigName mid protected MAction(Role obj, MsgId mid, Payload payload) { @@ -43,7 +43,8 @@ public String toString() return this.obj + getCommSymbol() + this.mid + this.payload; } - public String toStringWithMessageIdHack() + // Used by toAut + public String toStringWithMsgIdHack() { String m = this.mid.isSigName() ? "^" + this.mid : this.mid.toString(); // HACK return this.obj + getCommSymbol() + m + this.payload; @@ -61,31 +62,8 @@ public int hashCode() return hash; } - /*@Override - public final int hashCode() - { - int hash = 79; - hash = 31 * hash + this.id; - return hash; - }*/ - - /*public boolean equiv(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof ModelAction)) - { - return false; - } - ModelAction a = (ModelAction) o; // Refactor as "compatible" - return a.canEqual(this) && - this.obj.equals(a.obj) && this.mid.equals(a.mid) && this.payload.equals(a.payload); - }*/ - @Override - public boolean equals(Object o) // FIXME: kind + public boolean equals(Object o) { if (this == o) { @@ -95,11 +73,10 @@ public boolean equals(Object o) // FIXME: kind { return false; } - MAction a = (MAction) o; // Refactor as "compatible" - return a.canEqual(this) && - this.obj.equals(a.obj) && this.mid.equals(a.mid) && this.payload.equals(a.payload); - //return this.id == ((ModelAction) o).id; + MAction them = (MAction) o; // Refactor as "compatible" + return them.canEquals(this) && this.obj.equals(them.obj) + && this.mid.equals(them.mid) && this.payload.equals(them.payload); } - public abstract boolean canEqual(Object o); + public abstract boolean canEquals(Object o); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java index 6e630835e..cc30e9bc2 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java @@ -129,7 +129,7 @@ public final String toAut() { A a = as.next(); S succ = ss.next(); - String msg = a.toStringWithMessageIdHack(); // HACK + String msg = a.toStringWithMsgIdHack(); // HACK aut += "\n(" + s.id + ",\"" + msg + "\"," + succ.id + ")"; } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java index f941d6d10..53838abb9 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java @@ -19,26 +19,26 @@ import org.scribble.core.model.endpoint.EFSM; import org.scribble.core.model.endpoint.EGraphBuilderUtil; import org.scribble.core.model.endpoint.EState; -import org.scribble.core.model.endpoint.actions.EAccept; +import org.scribble.core.model.endpoint.actions.EAcc; import org.scribble.core.model.endpoint.actions.EDisconnect; -import org.scribble.core.model.endpoint.actions.EReceive; -import org.scribble.core.model.endpoint.actions.ERequest; +import org.scribble.core.model.endpoint.actions.ERecv; +import org.scribble.core.model.endpoint.actions.EReq; import org.scribble.core.model.endpoint.actions.ESend; -import org.scribble.core.model.endpoint.actions.EWrapClient; -import org.scribble.core.model.endpoint.actions.EWrapServer; +import org.scribble.core.model.endpoint.actions.EClientWrap; +import org.scribble.core.model.endpoint.actions.EServerWrap; import org.scribble.core.model.global.SBuffers; import org.scribble.core.model.global.SConfig; import org.scribble.core.model.global.SGraph; import org.scribble.core.model.global.SGraphBuilderUtil; import org.scribble.core.model.global.SModel; import org.scribble.core.model.global.SState; -import org.scribble.core.model.global.actions.SAccept; +import org.scribble.core.model.global.actions.SAcc; import org.scribble.core.model.global.actions.SDisconnect; -import org.scribble.core.model.global.actions.SReceive; -import org.scribble.core.model.global.actions.SRequest; +import org.scribble.core.model.global.actions.SRecv; +import org.scribble.core.model.global.actions.SReq; import org.scribble.core.model.global.actions.SSend; -import org.scribble.core.model.global.actions.SWrapClient; -import org.scribble.core.model.global.actions.SWrapServer; +import org.scribble.core.model.global.actions.SClientWrap; +import org.scribble.core.model.global.actions.SServerWrap; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.RecVar; @@ -48,29 +48,28 @@ public interface ModelFactory { EGraphBuilderUtil newEGraphBuilderUtil(); - - ESend newESend(Role peer, MsgId mid, Payload payload); - EReceive newEReceive(Role peer, MsgId mid, Payload payload); - ERequest newERequest(Role peer, MsgId mid, Payload payload); - EAccept newEAccept(Role peer, MsgId mid, Payload payload); - EDisconnect newEDisconnect(Role peer); - EWrapClient newEWrapClient(Role peer); - EWrapServer newEWrapServer(Role peer); + SGraphBuilderUtil newSGraphBuilderUtil(); EState newEState(Set labs); - SGraphBuilderUtil newSGraphBuilderUtil(); // Directly created and used by Job.buildSGraph -- cf. EGraphBuilderUtil, encapsulated by EGraphBuilder AST visitor - - SSend newSSend(Role subj, Role obj, MsgId mid, Payload payload); - SReceive newSReceive(Role subj, Role obj, MsgId mid, Payload payload); - SRequest newSConnect(Role subj, Role obj, MsgId mid, Payload payload); - SAccept newSAccept(Role subj, Role obj, MsgId mid, Payload payload); - SDisconnect newSDisconnect(Role subj, Role obj); - SWrapClient newSWrapClient(Role subj, Role obj); - SWrapServer newSWrapServer(Role subj, Role obj); - SState newSState(SConfig config); SGraph newSGraph(GProtoName proto, Map states, SState init); SConfig newSConfig(Map state, SBuffers buffs); SModel newSModel(SGraph g); + + ESend newESend(Role peer, MsgId mid, Payload pay); + ERecv newERecv(Role peer, MsgId mid, Payload pay); + EReq newEReq(Role peer, MsgId mid, Payload pay); + EAcc newEAcc(Role peer, MsgId mid, Payload pay); + EDisconnect newEDisconnect(Role peer); + EClientWrap newEClientWrap(Role peer); + EServerWrap newEServerWrap(Role peer); + + SSend newSSend(Role subj, Role obj, MsgId mid, Payload pay); + SRecv newSRecv(Role subj, Role obj, MsgId mid, Payload pay); + SReq newSReq(Role subj, Role obj, MsgId mid, Payload pay); + SAcc newSAcc(Role subj, Role obj, MsgId mid, Payload pay); + SDisconnect newSDisconnect(Role subj, Role obj); + SClientWrap newSClientWrap(Role subj, Role obj); + SServerWrap newSServerWrap(Role subj, Role obj); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java index c7f70d532..76c0e8a43 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java @@ -19,26 +19,26 @@ import org.scribble.core.model.endpoint.EFSM; import org.scribble.core.model.endpoint.EGraphBuilderUtil; import org.scribble.core.model.endpoint.EState; -import org.scribble.core.model.endpoint.actions.EAccept; +import org.scribble.core.model.endpoint.actions.EAcc; import org.scribble.core.model.endpoint.actions.EDisconnect; -import org.scribble.core.model.endpoint.actions.EReceive; -import org.scribble.core.model.endpoint.actions.ERequest; +import org.scribble.core.model.endpoint.actions.ERecv; +import org.scribble.core.model.endpoint.actions.EReq; import org.scribble.core.model.endpoint.actions.ESend; -import org.scribble.core.model.endpoint.actions.EWrapClient; -import org.scribble.core.model.endpoint.actions.EWrapServer; +import org.scribble.core.model.endpoint.actions.EClientWrap; +import org.scribble.core.model.endpoint.actions.EServerWrap; import org.scribble.core.model.global.SBuffers; import org.scribble.core.model.global.SConfig; import org.scribble.core.model.global.SGraph; import org.scribble.core.model.global.SGraphBuilderUtil; import org.scribble.core.model.global.SModel; import org.scribble.core.model.global.SState; -import org.scribble.core.model.global.actions.SAccept; +import org.scribble.core.model.global.actions.SAcc; import org.scribble.core.model.global.actions.SDisconnect; -import org.scribble.core.model.global.actions.SReceive; -import org.scribble.core.model.global.actions.SRequest; +import org.scribble.core.model.global.actions.SRecv; +import org.scribble.core.model.global.actions.SReq; import org.scribble.core.model.global.actions.SSend; -import org.scribble.core.model.global.actions.SWrapClient; -import org.scribble.core.model.global.actions.SWrapServer; +import org.scribble.core.model.global.actions.SClientWrap; +import org.scribble.core.model.global.actions.SServerWrap; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.RecVar; @@ -62,21 +62,21 @@ public ESend newESend(Role peer, MsgId mid, Payload payload) } @Override - public EReceive newEReceive(Role peer, MsgId mid, Payload payload) + public ERecv newERecv(Role peer, MsgId mid, Payload payload) { - return new EReceive(this, peer, mid, payload); + return new ERecv(this, peer, mid, payload); } @Override - public ERequest newERequest(Role peer, MsgId mid, Payload payload) + public EReq newEReq(Role peer, MsgId mid, Payload payload) { - return new ERequest(this, peer, mid, payload); + return new EReq(this, peer, mid, payload); } @Override - public EAccept newEAccept(Role peer, MsgId mid, Payload payload) + public EAcc newEAcc(Role peer, MsgId mid, Payload payload) { - return new EAccept(this, peer, mid, payload); + return new EAcc(this, peer, mid, payload); } @Override @@ -86,15 +86,15 @@ public EDisconnect newEDisconnect(Role peer) } @Override - public EWrapClient newEWrapClient(Role peer) + public EClientWrap newEClientWrap(Role peer) { - return new EWrapClient(this, peer); + return new EClientWrap(this, peer); } @Override - public EWrapServer newEWrapServer(Role peer) + public EServerWrap newEServerWrap(Role peer) { - return new EWrapServer(this, peer); + return new EServerWrap(this, peer); } @Override @@ -116,21 +116,21 @@ public SSend newSSend(Role subj, Role obj, MsgId mid, Payload payload) } @Override - public SReceive newSReceive(Role subj, Role obj, MsgId mid, Payload payload) + public SRecv newSRecv(Role subj, Role obj, MsgId mid, Payload payload) { - return new SReceive(subj, obj, mid, payload); + return new SRecv(subj, obj, mid, payload); } @Override - public SRequest newSConnect(Role subj, Role obj, MsgId mid, Payload payload) + public SReq newSReq(Role subj, Role obj, MsgId mid, Payload payload) { - return new SRequest(subj, obj, mid, payload); + return new SReq(subj, obj, mid, payload); } @Override - public SAccept newSAccept(Role subj, Role obj, MsgId mid, Payload payload) + public SAcc newSAcc(Role subj, Role obj, MsgId mid, Payload payload) { - return new SAccept(subj, obj, mid, payload); + return new SAcc(subj, obj, mid, payload); } @Override @@ -140,15 +140,15 @@ public SDisconnect newSDisconnect(Role subj, Role obj) } @Override - public SWrapClient newSWrapClient(Role subj, Role obj) + public SClientWrap newSClientWrap(Role subj, Role obj) { - return new SWrapClient(subj, obj); + return new SClientWrap(subj, obj); } @Override - public SWrapServer newSWrapServer(Role subj, Role obj) + public SServerWrap newSServerWrap(Role subj, Role obj) { - return new SWrapServer(subj, obj); + return new SServerWrap(subj, obj); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java index 8d70dbdaf..abff6e6c8 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java @@ -251,27 +251,27 @@ else if ((i = a.indexOf('/')) != -1) case "?": { Payload payload = (pay != null) ? new Payload(Arrays.asList(pay).stream().map((pe) -> new DataName(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; - return ef.newEReceive(new Role(peer), getMessageIdHack(msg), payload); // FIXME: how about MessageSigNames?) + return ef.newERecv(new Role(peer), getMessageIdHack(msg), payload); // FIXME: how about MessageSigNames?) } case "!!": { //return new Connect(new Role(peer)); Payload payload = (pay != null) ? new Payload(Arrays.asList(pay).stream().map((pe) -> new DataName(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; - return ef.newERequest(new Role(peer), getMessageIdHack(msg), payload); + return ef.newEReq(new Role(peer), getMessageIdHack(msg), payload); } case "??": { //return new Accept(new Role(peer)); Payload payload = (pay != null) ? new Payload(Arrays.asList(pay).stream().map((pe) -> new DataName(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; - return ef.newEAccept(new Role(peer), getMessageIdHack(msg), payload); + return ef.newEAcc(new Role(peer), getMessageIdHack(msg), payload); } case "(!!)": { - return ef.newEWrapClient(new Role(peer)); + return ef.newEClientWrap(new Role(peer)); } case "(??)": { - return ef.newEWrapServer(new Role(peer)); + return ef.newEServerWrap(new Role(peer)); } case "-/-": { diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java index 7c13ec328..3387e582a 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java @@ -35,7 +35,7 @@ public EAction toDual(Role self) } @Override - public SAction toGlobal(ModelFactory sf, Role self) + public SAction toGlobal(Role self) { throw new RuntimeException("Shouldn't get in here: " + this); } @@ -65,11 +65,11 @@ public boolean equals(Object o) { return false; } - return ((IntermediateContinueEdge) o).canEqual(this) && super.equals(o); + return ((IntermediateContinueEdge) o).canEquals(this) && super.equals(o); } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof IntermediateContinueEdge; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateRecEdge.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateRecEdge.java index 0ca30158b..dcbd6132d 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateRecEdge.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateRecEdge.java @@ -40,7 +40,7 @@ public EAction toDual(Role self) } @Override - public SAction toGlobal(ModelFactory sf, Role self) + public SAction toGlobal(Role self) { throw new RuntimeException("Shouldn't get in here: " + this); } @@ -70,11 +70,11 @@ public boolean equals(Object o) { return false; } - return ((IntermediateRecEdge) o).canEqual(this) && super.equals(o); + return ((IntermediateRecEdge) o).canEquals(this) && super.equals(o); } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof IntermediateRecEdge; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAccept.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAcc.java similarity index 62% rename from scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAccept.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAcc.java index fe5be1ddd..6cab40115 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAccept.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAcc.java @@ -14,32 +14,28 @@ package org.scribble.core.model.endpoint.actions; import org.scribble.core.model.ModelFactory; -import org.scribble.core.model.global.actions.SAccept; +import org.scribble.core.model.global.actions.SAcc; import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; -public class EAccept extends EAction +public class EAcc extends EAction { - public EAccept(ModelFactory ef, Role peer, MsgId mid, Payload payload) - //public Accept(Role peer) + public EAcc(ModelFactory mf, Role peer, MsgId mid, Payload pay) { - super(ef, peer, mid, payload); - //super(peer, Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD); + super(mf, peer, mid, pay); } @Override - public ERequest toDual(Role self) + public EReq toDual(Role self) { - //return new Connect(self); - return this.ef.newERequest(self, this.mid, this.payload); + return this.mf.newEReq(self, this.mid, this.payload); } @Override - public SAccept toGlobal(ModelFactory sf, Role self) + public SAcc toGlobal(Role self) { - return sf.newSAccept(self, this.peer, this.mid, this.payload); - //return new GAccept(self, this.peer); + return this.mf.newSAcc(self, this.peer, this.mid, this.payload); } @Override @@ -63,16 +59,16 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof EAccept)) + if (!(o instanceof EAcc)) { return false; } - return ((EAccept) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEquals } - public boolean canEqual(Object o) + public boolean canEquals(Object o) { - return o instanceof EAccept; + return o instanceof EAcc; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java index ea065bb74..d7eecb1ab 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java @@ -24,30 +24,18 @@ public abstract class EAction extends MAction { public final Role peer; - /*public final MessageId mid; - public final Payload payload; // Empty for MessageSigNames*/ - protected ModelFactory ef; + protected final ModelFactory mf; - protected EAction(ModelFactory ef, Role peer, MsgId mid, Payload payload) + protected EAction(ModelFactory mf, Role peer, MsgId mid, Payload pay) { - /*this.mid = mid; - this.payload = payload;*/ - super(peer, mid, payload); + super(peer, mid, pay); this.peer = peer; - - this.ef = ef; - } - - public ModelFactory getEModelFactory() - { - return this.ef; + this.mf = mf; } public abstract EAction toDual(Role self); - - //public abstract GModelAction toGlobal(Role self); - public abstract SAction toGlobal(ModelFactory sf, Role self); + public abstract SAction toGlobal(Role self); public boolean isSend() { @@ -83,6 +71,19 @@ public boolean isWrapServer() { return false; } +} + + + + + + + + + + + + /*@Override public String toString() @@ -118,4 +119,3 @@ public boolean equals(Object o) } public abstract boolean canEqual(Object o);*/ -} diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapClient.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EClientWrap.java similarity index 73% rename from scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapClient.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EClientWrap.java index f75435112..778bde013 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapClient.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EClientWrap.java @@ -14,29 +14,30 @@ package org.scribble.core.model.endpoint.actions; import org.scribble.core.model.ModelFactory; -import org.scribble.core.model.global.actions.SWrapClient; +import org.scribble.core.model.global.actions.SClientWrap; import org.scribble.core.type.name.Op; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; +// Wrap at the client side // Duplicated from Disconnect -public class EWrapClient extends EAction +public class EClientWrap extends EAction { - public EWrapClient(ModelFactory ef, Role peer) + public EClientWrap(ModelFactory ef, Role peer) { super(ef, peer, Op.EMPTY_OP, Payload.EMPTY_PAYLOAD); // Must correspond with GWrap.UNIT_MESSAGE_SIG_NODE } @Override - public EWrapServer toDual(Role self) + public EServerWrap toDual(Role self) { - return this.ef.newEWrapServer(self); + return this.mf.newEServerWrap(self); } @Override - public SWrapClient toGlobal(ModelFactory sf, Role self) + public SClientWrap toGlobal(Role self) { - return sf.newSWrapClient(self, this.peer); + return this.mf.newSClientWrap(self, this.peer); } @Override @@ -60,17 +61,17 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof EWrapClient)) + if (!(o instanceof EClientWrap)) { return false; } - return ((EWrapClient) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEquals } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { - return o instanceof EWrapClient; + return o instanceof EClientWrap; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java index 7cfd3f7a2..82c412e1b 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java @@ -29,13 +29,13 @@ public EDisconnect(ModelFactory ef, Role peer) @Override public EDisconnect toDual(Role self) { - return this.ef.newEDisconnect(self); // return this? + return this; } @Override - public SDisconnect toGlobal(ModelFactory sf, Role self) + public SDisconnect toGlobal(Role self) { - return sf.newSDisconnect(self, this.peer); + return this.mf.newSDisconnect(self, this.peer); } @Override @@ -63,11 +63,11 @@ public boolean equals(Object o) { return false; } - return ((EDisconnect) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEquals } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof EDisconnect; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReceive.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReceive.java deleted file mode 100644 index 89f901918..000000000 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReceive.java +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.core.model.endpoint.actions; - -import org.scribble.core.model.ModelFactory; -import org.scribble.core.model.global.actions.SReceive; -import org.scribble.core.type.name.MsgId; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Payload; - -public class EReceive extends EAction -{ - /*protected static final Set RECEIVES = new HashSet<>(); - - public static Receive get(Role peer, MessageId mid, Payload payload) - { - Receive receive = new Receive(peer, mid, payload, true); - for (Receive r : Receive.RECEIVES) // FIXME: hashmap - { - if (r.equiv(receive)) - { - return r; - } - } - Receive.RECEIVES.add(receive); - return receive; - } - - private Receive(Role peer, MessageId mid, Payload payload, boolean hack) - { - super(peer, mid, payload); - }*/ - - public EReceive(ModelFactory ef, Role peer, MsgId mid, Payload payload) - { - super(ef, peer, mid, payload); - //Receive.RECEIVES.add(this); - } - - @Override - public ESend toDual(Role self) - { - return this.ef.newESend(self, this.mid, this.payload); - //return Send.get(self, this.mid, this.payload); - } - - @Override - //public GModelAction toGlobal(Role self) - public SReceive toGlobal(ModelFactory sf, Role self) - { - //return new GModelAction(this.peer, self, this.mid, this.payload); - ////return GModelAction.get(this.peer, self, this.mid, this.payload); - return sf.newSReceive(self, this.peer, this.mid, this.payload); - - } - - @Override - public int hashCode() - { - int hash = 947; - hash = 31 * hash + super.hashCode(); - return hash; - } - - @Override - public boolean isReceive() - { - return true; - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof EReceive)) - { - return false; - } - return ((EReceive) o).canEqual(this) && super.equals(o); - } - - public boolean canEqual(Object o) - { - return o instanceof EReceive; - } - - @Override - protected String getCommSymbol() - { - return "?"; - } -} diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERecv.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERecv.java new file mode 100644 index 000000000..8f6bc9a45 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERecv.java @@ -0,0 +1,82 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.model.endpoint.actions; + +import org.scribble.core.model.ModelFactory; +import org.scribble.core.model.global.actions.SRecv; +import org.scribble.core.type.name.MsgId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; + +public class ERecv extends EAction +{ + + public ERecv(ModelFactory ef, Role peer, MsgId mid, Payload pay) + { + super(ef, peer, mid, pay); + } + + @Override + public ESend toDual(Role self) + { + return this.mf.newESend(self, this.mid, this.payload); + } + + @Override + public SRecv toGlobal(Role self) + { + return this.mf.newSRecv(self, this.peer, this.mid, this.payload); + + } + + @Override + public int hashCode() + { + int hash = 947; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean isReceive() + { + return true; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof ERecv)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof ERecv; + } + + @Override + protected String getCommSymbol() + { + return "?"; + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERequest.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReq.java similarity index 62% rename from scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERequest.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReq.java index b54bc43b6..7c6d582d9 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERequest.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReq.java @@ -14,32 +14,28 @@ package org.scribble.core.model.endpoint.actions; import org.scribble.core.model.ModelFactory; -import org.scribble.core.model.global.actions.SRequest; +import org.scribble.core.model.global.actions.SReq; import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; -public class ERequest extends EAction +public class EReq extends EAction { - public ERequest(ModelFactory ef, Role peer, MsgId mid, Payload payload) - //public Connect(Role peer) + public EReq(ModelFactory ef, Role peer, MsgId mid, Payload pay) { - super(ef, peer, mid, payload); - //super(peer, Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD); + super(ef, peer, mid, pay); } @Override - public EAccept toDual(Role self) + public EAcc toDual(Role self) { - //return new Accept(self); - return this.ef.newEAccept(self, this.mid, this.payload); + return this.mf.newEAcc(self, this.mid, this.payload); } @Override - public SRequest toGlobal(ModelFactory sf, Role self) + public SReq toGlobal(Role self) { - //return new GConnect(self, this.peer); - return sf.newSConnect(self, this.peer, this.mid, this.payload); + return this.mf.newSReq(self, this.peer, this.mid, this.payload); } @Override @@ -63,17 +59,17 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof ERequest)) + if (!(o instanceof EReq)) { return false; } - return ((ERequest) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEquals } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { - return o instanceof ERequest; + return o instanceof EReq; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java index 13efc4813..c76509a43 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java @@ -21,47 +21,22 @@ public class ESend extends EAction { - /*protected static final Set SENDS = new HashSet<>(); - - public static Send get(Role peer, MessageId mid, Payload payload) - { - Send send = new Send(peer, mid, payload, true); - for (Send s : Send.SENDS) // FIXME: hashmap - { - if (s.equiv(send)) - { - return s; - } - } - Send.SENDS.add(send); - return send; - } - - public Send(Role peer, MessageId mid, Payload payload, boolean hack) - { - super(peer, mid, payload); - }*/ - public ESend(ModelFactory ef, Role peer, MsgId mid, Payload payload) + public ESend(ModelFactory ef, Role peer, MsgId mid, Payload pay) { - super(ef, peer, mid, payload); - //Send.SENDS.add(this); + super(ef, peer, mid, pay); } @Override - public EReceive toDual(Role self) + public ERecv toDual(Role self) { - return this.ef.newEReceive(self, this.mid, this.payload); - //return Receive.get(self, this.mid, this.payload); + return this.mf.newERecv(self, this.mid, this.payload); } @Override - //public GModelAction toGlobal(Role self) - public SSend toGlobal(ModelFactory sf, Role self) + public SSend toGlobal(Role self) { - //return new GModelAction(self, this.peer, this.mid, this.payload); - ////return GModelAction.get(self, this.peer, this.mid, this.payload); - return sf.newSSend(self, this.peer, this.mid, this.payload); + return this.mf.newSSend(self, this.peer, this.mid, this.payload); } @Override @@ -89,11 +64,11 @@ public boolean equals(Object o) { return false; } - return ((ESend) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEquals } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof ESend; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapServer.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EServerWrap.java similarity index 73% rename from scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapServer.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EServerWrap.java index fe41c47e7..2c8830d85 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EWrapServer.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EServerWrap.java @@ -14,29 +14,30 @@ package org.scribble.core.model.endpoint.actions; import org.scribble.core.model.ModelFactory; -import org.scribble.core.model.global.actions.SWrapServer; +import org.scribble.core.model.global.actions.SServerWrap; import org.scribble.core.type.name.Op; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; +// Wrap at the server side // Duplicated from Disconnect -public class EWrapServer extends EAction +public class EServerWrap extends EAction { - public EWrapServer(ModelFactory ef, Role peer) + public EServerWrap(ModelFactory ef, Role peer) { super(ef, peer, Op.EMPTY_OP, Payload.EMPTY_PAYLOAD); // Must correspond with GWrap.UNIT_MESSAGE_SIG_NODE } @Override - public EWrapClient toDual(Role self) + public EClientWrap toDual(Role self) { - return this.ef.newEWrapClient(self); + return this.mf.newEClientWrap(self); } @Override - public SWrapServer toGlobal(ModelFactory sf, Role self) + public SServerWrap toGlobal(Role self) { - return sf.newSWrapServer(self, this.peer); + return this.mf.newSServerWrap(self, this.peer); } @Override @@ -60,16 +61,17 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof EWrapServer)) + if (!(o instanceof EServerWrap)) { return false; } - return ((EWrapServer) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEquals } - public boolean canEqual(Object o) + @Override + public boolean canEquals(Object o) { - return o instanceof EWrapServer; + return o instanceof EServerWrap; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java b/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java index aad27b7d3..fa5dc35bc 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java @@ -24,14 +24,14 @@ import org.scribble.core.model.ModelFactory; import org.scribble.core.model.endpoint.EState; -import org.scribble.core.model.endpoint.actions.EAccept; +import org.scribble.core.model.endpoint.actions.EAcc; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.model.endpoint.actions.EDisconnect; -import org.scribble.core.model.endpoint.actions.EReceive; -import org.scribble.core.model.endpoint.actions.ERequest; +import org.scribble.core.model.endpoint.actions.ERecv; +import org.scribble.core.model.endpoint.actions.EReq; import org.scribble.core.model.endpoint.actions.ESend; -import org.scribble.core.model.endpoint.actions.EWrapClient; -import org.scribble.core.model.endpoint.actions.EWrapServer; +import org.scribble.core.model.endpoint.actions.EClientWrap; +import org.scribble.core.model.endpoint.actions.EServerWrap; import org.scribble.core.type.name.Role; public class SBuffers @@ -132,14 +132,14 @@ public boolean isConnected(Role self, Role peer) return b != null && b; } - public boolean canAccept(Role self, EAccept a) + public boolean canAccept(Role self, EAcc a) //public boolean canAccept(Role r1, Role r2) { return !isConnected(self, a.peer); //return canConnect(r2, r1); } - public boolean canConnect(Role self, ERequest c) + public boolean canConnect(Role self, EReq c) //public boolean canConnect(Role r1, Role r2) { return !isConnected(self, c.peer); @@ -151,12 +151,12 @@ public boolean canDisconnect(Role self, EDisconnect d) return isConnected(self, d.peer); } - public boolean canWrapClient(Role self, EWrapClient wc) + public boolean canWrapClient(Role self, EClientWrap wc) { return isConnected(self, wc.peer); } - public boolean canWrapServer(Role self, EWrapServer ws) + public boolean canWrapServer(Role self, EServerWrap ws) { return isConnected(self, ws.peer); } @@ -261,7 +261,7 @@ public Set acceptable(Role r, EState curr) // Means connection accept List as = curr.getAllActions(); for (EAction a : as) { - res.add((EAccept) a); + res.add((EAcc) a); } return res; } @@ -274,7 +274,7 @@ public Set wrapable(Role r) { this.connected.keySet().stream() .filter(k -> tmp.containsKey(k) && tmp.get(k)) - .forEach(k -> res.add(this.ef.newEWrapServer(k))); + .forEach(k -> res.add(this.ef.newEServerWrap(k))); } return res; } @@ -295,7 +295,7 @@ public Map inputable() return tmp; }*/ - public SBuffers receive(Role self, EReceive a) + public SBuffers receive(Role self, ERecv a) { SBuffers copy = new SBuffers(this); copy.buffs.get(self).put(a.peer, null); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index 6b29f4ed6..fd38256c8 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -28,14 +28,14 @@ import org.scribble.core.model.endpoint.EFSM; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.EStateKind; -import org.scribble.core.model.endpoint.actions.EAccept; +import org.scribble.core.model.endpoint.actions.EAcc; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.model.endpoint.actions.EDisconnect; -import org.scribble.core.model.endpoint.actions.EReceive; -import org.scribble.core.model.endpoint.actions.ERequest; +import org.scribble.core.model.endpoint.actions.ERecv; +import org.scribble.core.model.endpoint.actions.EReq; import org.scribble.core.model.endpoint.actions.ESend; -import org.scribble.core.model.endpoint.actions.EWrapClient; -import org.scribble.core.model.endpoint.actions.EWrapServer; +import org.scribble.core.model.endpoint.actions.EClientWrap; +import org.scribble.core.model.endpoint.actions.EServerWrap; import org.scribble.core.type.name.Role; public class SConfig @@ -136,7 +136,7 @@ public List fire(Role r, EAction a) }*/ SBuffers tmp2 = a.isSend() ? this.buffs.send(r, (ESend) a) - : a.isReceive() ? this.buffs.receive(r, (EReceive) a) + : a.isReceive() ? this.buffs.receive(r, (ERecv) a) : a.isDisconnect() ? this.buffs.disconnect(r, (EDisconnect) a) : null; if (tmp2 == null) @@ -189,9 +189,9 @@ else if (((a1.isWrapClient() && a2.isWrapServer()) || (a1.isWrapServer() && a2.i } // Deadlock from non handle-able messages (reception errors) - public Map getStuckMessages() + public Map getStuckMessages() { - Map res = new HashMap<>(); + Map res = new HashMap<>(); for (Role r : this.efsms.keySet()) { //EndpointState s = this.states.get(r); @@ -211,7 +211,7 @@ public Map getStuckMessages() ESend send = this.buffs.get(r).get(peer); if (send != null) { - EReceive recv = send.toDual(peer); + ERecv recv = send.toDual(peer); if (!s.hasFireable(recv)) //res.put(r, new IOError(peer)); res.put(r, recv); @@ -547,7 +547,7 @@ public Map> getFireable() else if (a.isRequest()) { // FIXME: factor out - ERequest c = (ERequest) a; + EReq c = (EReq) a; //EndpointState speer = this.states.get(c.peer); EFSM speer = this.efsms.get(c.peer); //if (speer.getStateKind() == Kind.UNARY_INPUT) @@ -585,7 +585,7 @@ else if (a.isDisconnect()) else if (a.isWrapClient()) { // FIXME: factor out - EWrapClient wc = (EWrapClient) a; + EClientWrap wc = (EClientWrap) a; EFSM speer = this.efsms.get(wc.peer); List peeras = speer.getAllFireable(); for (EAction peera : peeras) @@ -704,7 +704,7 @@ else if (a.isWrapClient()) if (a.isAccept()) { // FIXME: factor out - EAccept c = (EAccept) a; + EAcc c = (EAcc) a; //EndpointState speer = this.states.get(c.peer); EFSM speer = this.efsms.get(c.peer); //if (speer.getStateKind() == Kind.OUTPUT) @@ -739,7 +739,7 @@ else if (a.isWrapClient()) { if (a.isWrapServer()) { - EWrapServer ws = (EWrapServer) a; + EServerWrap ws = (EServerWrap) a; EFSM speer = this.efsms.get(ws.peer); { List peeras = speer.getAllFireable(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index 7e4fb0158..1d0a06f42 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -146,7 +146,7 @@ else if (k == EStateKind.UNARY_INPUT || k == EStateKind.POLY_INPUT || k == EStat if (a.isSend() || a.isReceive() || a.isDisconnect()) { getNextStates(core.config.mf, todo, seen, curr, - a.toGlobal(core.config.mf, r), curr.fire(r, a)); + a.toGlobal(r), curr.fire(r, a)); } else if (a.isAccept() || a.isRequest()) { @@ -157,8 +157,8 @@ else if (a.isAccept() || a.isRequest()) as.remove(d); // Removes one occurrence //getNextStates(seen, todo, curr.sync(r, a, a.peer, d)); SAction g = (a.isRequest()) - ? a.toGlobal(core.config.mf, r) - : d.toGlobal(core.config.mf, a.peer); + ? a.toGlobal(r) + : d.toGlobal(a.peer); // Edge will be drawn as the connect, but should be read as the sync. of both -- something like "r1, r2: sync" may be more consistent (or take a set of actions as the edge label) getNextStates(core.config.mf, todo, seen, curr, g, curr.sync(r, a, a.peer, d)); @@ -172,8 +172,8 @@ else if (a.isWrapClient() || a.isWrapServer()) { as.remove(w); // Removes one occurrence SAction g = (a.isRequest()) - ? a.toGlobal(core.config.mf, r) - : w.toGlobal(core.config.mf, a.peer); + ? a.toGlobal(r) + : w.toGlobal(a.peer); getNextStates(core.config.mf, todo, seen, curr, g, curr.sync(r, a, a.peer, w)); } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java index fc192606a..9d0f1d59c 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java @@ -22,7 +22,7 @@ import org.scribble.core.model.MState; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.model.endpoint.actions.EReceive; +import org.scribble.core.model.endpoint.actions.ERecv; import org.scribble.core.model.endpoint.actions.ESend; import org.scribble.core.model.global.actions.SAction; import org.scribble.core.type.kind.Global; @@ -66,7 +66,7 @@ public List sync(Role r1, EAction a1, Role r2, EAction a2) public SStateErrors getErrors() { - Map stuck = this.config.getStuckMessages(); + Map stuck = this.config.getStuckMessages(); Set> waitfor = this.config.getWaitForErrors(); //Set> waitfor = Collections.emptySet(); Map> orphs = this.config.getOrphanMessages(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java b/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java index 3fd5ae06e..5ef2436e3 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java @@ -18,7 +18,7 @@ import java.util.Set; import org.scribble.core.model.endpoint.EState; -import org.scribble.core.model.endpoint.actions.EReceive; +import org.scribble.core.model.endpoint.actions.ERecv; import org.scribble.core.model.endpoint.actions.ESend; import org.scribble.core.type.name.Role; @@ -26,12 +26,12 @@ public class SStateErrors { // FIXME: factor out explicit error classes -- for error message formatting // FIXME: could also check for roles stuck on unconnected sends here (probably better, than current syntax check) - public final Map stuck; // Reception errors + public final Map stuck; // Reception errors public final Set> waitFor; // Deadlock cycles public final Map> orphans; // Orphan messages public Map unfinished; // Unfinished roles - public SStateErrors(Map receptionErrors, Set> deadlocks, Map> orphans, Map unfinished) + public SStateErrors(Map receptionErrors, Set> deadlocks, Map> orphans, Map unfinished) { this.stuck = Collections.unmodifiableMap(receptionErrors); this.waitFor = Collections.unmodifiableSet(deadlocks); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAccept.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAcc.java similarity index 74% rename from scribble-core/src/main/java/org/scribble/core/model/global/actions/SAccept.java rename to scribble-core/src/main/java/org/scribble/core/model/global/actions/SAcc.java index 842356ec7..e2049680e 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAccept.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAcc.java @@ -17,13 +17,11 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; -public class SAccept extends SAction +public class SAcc extends SAction { - public SAccept(Role subj, Role obj, MsgId mid, Payload payload) - //public GAccept(Role subj, Role obj) + public SAcc(Role subj, Role obj, MsgId mid, Payload pay) { - super(subj, obj, mid, payload); - //super(subj, obj, Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD); + super(subj, obj, mid, pay); } @Override @@ -47,16 +45,16 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof SAccept)) + if (!(o instanceof SAcc)) { return false; } - return ((SAccept) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEquals } - public boolean canEqual(Object o) + public boolean canEquals(Object o) { - return o instanceof SAccept; + return o instanceof SAcc; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java index 62e66d064..c9784d91b 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java @@ -27,9 +27,9 @@ public abstract class SAction extends MAction { public final Role subj; - public SAction(Role subj, Role obj, MsgId mid, Payload payload) + public SAction(Role subj, Role obj, MsgId mid, Payload pay) { - super(obj, mid, payload); + super(obj, mid, pay); this.subj = subj; } @@ -68,33 +68,6 @@ public boolean containsRole(Role role) return this.subj.equals(role) || this.obj.equals(role); } - /*public IOAction project(Role self) - { - if (this.subj.equals(self)) - { - if (this.obj.equals(self)) - { - throw new RuntimeException("TODO: " + this); - } - else - { - return new Send(this.obj, this.mid, this.payload); - } - } - else - { - if (this.obj.equals(self)) - { - return new Receive(this.subj, this.mid, this.payload); - //return Receive.get(this.subj, this.mid, this.payload); - } - else - { - return null; // FIXME? - } - } - }*/ - @Override public String toString() { @@ -111,7 +84,7 @@ public int hashCode() } @Override - public boolean equals(Object o) // FIXME: kind + public boolean equals(Object o) { if (this == o) { @@ -121,13 +94,57 @@ public boolean equals(Object o) // FIXME: kind { return false; } - SAction a = (SAction) o; - return super.equals(o) && this.subj.equals(a.subj); + SAction them = (SAction) o; + return super.equals(o) // Does canEquals + && this.subj.equals(them.subj); } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof SAction; } } + + + + + + + + + + + + + + + + + + /*public IOAction project(Role self) + { + if (this.subj.equals(self)) + { + if (this.obj.equals(self)) + { + throw new RuntimeException("TODO: " + this); + } + else + { + return new Send(this.obj, this.mid, this.payload); + } + } + else + { + if (this.obj.equals(self)) + { + return new Receive(this.subj, this.mid, this.payload); + //return Receive.get(this.subj, this.mid, this.payload); + } + else + { + return null; // FIXME? + } + } + }*/ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SWrapClient.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SClientWrap.java similarity index 82% rename from scribble-core/src/main/java/org/scribble/core/model/global/actions/SWrapClient.java rename to scribble-core/src/main/java/org/scribble/core/model/global/actions/SClientWrap.java index 685ed6903..34f0146dd 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SWrapClient.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SClientWrap.java @@ -17,9 +17,10 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; -public class SWrapClient extends SAction +// Wrap at the client side +public class SClientWrap extends SAction { - public SWrapClient(Role subj, Role obj) + public SClientWrap(Role subj, Role obj) { super(subj, obj, Op.EMPTY_OP, Payload.EMPTY_PAYLOAD); } @@ -45,17 +46,17 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof SWrapClient)) + if (!(o instanceof SClientWrap)) { return false; } - return ((SWrapClient) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEquals } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { - return o instanceof SWrapClient; + return o instanceof SClientWrap; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SConnect.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SConnect.java index b1661e73a..98fd210fb 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SConnect.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SConnect.java @@ -19,11 +19,9 @@ public class SConnect extends SAction { - public SConnect(Role subj, Role obj, MsgId mid, Payload payload) - //public GConnect(Role subj, Role obj) + public SConnect(Role subj, Role obj, MsgId mid, Payload pay) { - super(subj, obj, mid, payload); - //super(subj, obj, Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD); + super(subj, obj, mid, pay); } @Override @@ -51,11 +49,11 @@ public boolean equals(Object o) { return false; } - return ((SConnect) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEquals } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof SConnect; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SDisconnect.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SDisconnect.java index 97bdf6a51..ae5564bb5 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SDisconnect.java @@ -49,11 +49,11 @@ public boolean equals(Object o) { return false; } - return ((SDisconnect) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEquals } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof SDisconnect; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SReceive.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SRecv.java similarity index 79% rename from scribble-core/src/main/java/org/scribble/core/model/global/actions/SReceive.java rename to scribble-core/src/main/java/org/scribble/core/model/global/actions/SRecv.java index 20080a350..32f637624 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SReceive.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SRecv.java @@ -17,11 +17,11 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; -public class SReceive extends SAction +public class SRecv extends SAction { - public SReceive(Role subj, Role obj, MsgId mid, Payload payload) + public SRecv(Role subj, Role obj, MsgId mid, Payload pay) { - super(subj, obj, mid, payload); + super(subj, obj, mid, pay); } @Override @@ -45,16 +45,16 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof SReceive)) + if (!(o instanceof SRecv)) { return false; } - return ((SReceive) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEquals } - public boolean canEqual(Object o) + public boolean canEquals(Object o) { - return o instanceof SReceive; + return o instanceof SRecv; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SRequest.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SReq.java similarity index 73% rename from scribble-core/src/main/java/org/scribble/core/model/global/actions/SRequest.java rename to scribble-core/src/main/java/org/scribble/core/model/global/actions/SReq.java index 9291a7e69..4e74c0cc9 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SRequest.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SReq.java @@ -17,13 +17,11 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; -public class SRequest extends SAction +public class SReq extends SAction { - public SRequest(Role subj, Role obj, MsgId mid, Payload payload) - //public GConnect(Role subj, Role obj) + public SReq(Role subj, Role obj, MsgId mid, Payload pay) { - super(subj, obj, mid, payload); - //super(subj, obj, Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD); + super(subj, obj, mid, pay); } @Override @@ -47,23 +45,22 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof SRequest)) + if (!(o instanceof SReq)) { return false; } - return ((SRequest) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEquals } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { - return o instanceof SRequest; + return o instanceof SReq; } @Override protected String getCommSymbol() { - //return "!!"; return "->>"; } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SSend.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SSend.java index 0db29b36e..67117293f 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SSend.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SSend.java @@ -19,9 +19,9 @@ public class SSend extends SAction { - public SSend(Role subj, Role obj, MsgId mid, Payload payload) + public SSend(Role subj, Role obj, MsgId mid, Payload pay) { - super(subj, obj, mid, payload); + super(subj, obj, mid, pay); } @Override @@ -49,11 +49,11 @@ public boolean equals(Object o) { return false; } - return ((SSend) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEquals } @Override - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof SSend; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SWrapServer.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SServerWrap.java similarity index 81% rename from scribble-core/src/main/java/org/scribble/core/model/global/actions/SWrapServer.java rename to scribble-core/src/main/java/org/scribble/core/model/global/actions/SServerWrap.java index f8add98cb..b99faba85 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SWrapServer.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SServerWrap.java @@ -17,9 +17,10 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; -public class SWrapServer extends SAction +// Wrap at the server side +public class SServerWrap extends SAction { - public SWrapServer(Role subj, Role obj) + public SServerWrap(Role subj, Role obj) { super(subj, obj, Op.EMPTY_OP, Payload.EMPTY_PAYLOAD); } @@ -45,16 +46,17 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof SWrapServer)) + if (!(o instanceof SServerWrap)) { return false; } - return ((SWrapServer) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEquals } - public boolean canEqual(Object o) + @Override + public boolean canEquals(Object o) { - return o instanceof SWrapServer; + return o instanceof SServerWrap; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/AbstractName.java b/scribble-core/src/main/java/org/scribble/core/type/name/AbstractName.java index 481d56a71..ce446ad99 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/AbstractName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/AbstractName.java @@ -85,11 +85,12 @@ public boolean equals(Object o) { return false; } - AbstractName n = (AbstractName) o; - return n.canEqual(this) && this.kind.equals(n.kind) && Arrays.equals(this.elems, n.elems); + AbstractName them = (AbstractName) o; + return them.canEquals(this) && this.kind.equals(them.kind) + && Arrays.equals(this.elems, them.elems); } - public abstract boolean canEqual(Object o); + public abstract boolean canEquals(Object o); @Override public int hashCode() diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/AmbigName.java b/scribble-core/src/main/java/org/scribble/core/type/name/AmbigName.java index 52ea282a3..e8c0f8274 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/AmbigName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/AmbigName.java @@ -46,10 +46,10 @@ public boolean equals(Object o) return false; } AmbigName n = (AmbigName) o; - return n.canEqual(this) && super.equals(o); + return n.canEquals(this) && super.equals(o); } - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof AmbigName; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/DataName.java b/scribble-core/src/main/java/org/scribble/core/type/name/DataName.java index 4a1233bbd..b48cad2ea 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/DataName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/DataName.java @@ -62,10 +62,10 @@ public boolean equals(Object o) return false; } DataName n = (DataName) o; - return n.canEqual(this) && super.equals(o); + return n.canEquals(this) && super.equals(o); } - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof DataName; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/GProtoName.java b/scribble-core/src/main/java/org/scribble/core/type/name/GProtoName.java index b34c0cf67..231efc3f3 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/GProtoName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/GProtoName.java @@ -48,10 +48,10 @@ public boolean equals(Object o) return false; } GProtoName n = (GProtoName) o; - return n.canEqual(this) && super.equals(o); + return n.canEquals(this) && super.equals(o); } - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof GProtoName; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/Id.java b/scribble-core/src/main/java/org/scribble/core/type/name/Id.java index 3ed5bd685..8d33e64ab 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/Id.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/Id.java @@ -36,10 +36,10 @@ public boolean equals(Object o) return false; } Id n = (Id) o; - return n.canEqual(this) && super.equals(o); + return n.canEquals(this) && super.equals(o); } - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof Id; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/LProtoName.java b/scribble-core/src/main/java/org/scribble/core/type/name/LProtoName.java index 458d50fc5..c666b300a 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/LProtoName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/LProtoName.java @@ -55,10 +55,10 @@ public boolean equals(Object o) return false; } LProtoName n = (LProtoName) o; - return n.canEqual(this) && super.equals(o); + return n.canEquals(this) && super.equals(o); } - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof LProtoName; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/ModuleName.java b/scribble-core/src/main/java/org/scribble/core/type/name/ModuleName.java index 59f2bd487..4511bde8d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/ModuleName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/ModuleName.java @@ -90,10 +90,10 @@ public boolean equals(Object o) return false; } ModuleName n = (ModuleName) o; - return n.canEqual(this) && super.equals(o); + return n.canEquals(this) && super.equals(o); } - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof ModuleName; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/Op.java b/scribble-core/src/main/java/org/scribble/core/type/name/Op.java index 059972220..27bab91db 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/Op.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/Op.java @@ -49,10 +49,10 @@ public boolean equals(Object o) return false; } Op n = (Op) o; - return n.canEqual(this) && super.equals(o); + return n.canEquals(this) && super.equals(o); } - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof Op; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/PackageName.java b/scribble-core/src/main/java/org/scribble/core/type/name/PackageName.java index 833f59e67..96bc5a77d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/PackageName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/PackageName.java @@ -50,10 +50,10 @@ public boolean equals(Object o) return false; } PackageName n = (PackageName) o; - return n.canEqual(this) && super.equals(o); + return n.canEquals(this) && super.equals(o); } - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof PackageName; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/RecVar.java b/scribble-core/src/main/java/org/scribble/core/type/name/RecVar.java index 7fdaa7257..7cdbc56ce 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/RecVar.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/RecVar.java @@ -42,10 +42,10 @@ public boolean equals(Object o) return false; } RecVar n = (RecVar) o; - return n.canEqual(this) && super.equals(o); + return n.canEquals(this) && super.equals(o); } - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof RecVar; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/Role.java b/scribble-core/src/main/java/org/scribble/core/type/name/Role.java index 390cf7764..fb0e96349 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/Role.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/Role.java @@ -45,10 +45,10 @@ public boolean equals(Object o) return false; } Role n = (Role) o; - return n.canEqual(this) && super.equals(o); + return n.canEquals(this) && super.equals(o); } - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof Role; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/SigName.java b/scribble-core/src/main/java/org/scribble/core/type/name/SigName.java index 84d71bdd5..53b806993 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/SigName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/SigName.java @@ -68,10 +68,10 @@ public boolean equals(Object o) return false; } SigName n = (SigName) o; - return n.canEqual(this) && super.equals(o); + return n.canEquals(this) && super.equals(o); } - public boolean canEqual(Object o) + public boolean canEquals(Object o) { return o instanceof SigName; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecv.java similarity index 90% rename from scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java rename to scribble-core/src/main/java/org/scribble/core/type/session/local/LRecv.java index bb6ffc127..3dedb36ce 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRcv.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecv.java @@ -19,12 +19,12 @@ import org.scribble.core.type.session.Msg; import org.scribble.core.type.session.MsgTransfer; -public class LRcv extends MsgTransfer +public class LRecv extends MsgTransfer implements LType { // this.dst == Role.SELF - public LRcv(CommonTree source, + public LRecv(CommonTree source, Role src, Msg msg) { super(source, msg, src, Role.SELF); @@ -32,11 +32,11 @@ public LRcv(CommonTree source, // FIXME: unnecessary dst @Override - public LRcv reconstruct( + public LRecv reconstruct( CommonTree source, Msg msg, Role src, Role dst) { - return new LRcv(source, src, msg); + return new LRecv(source, src, msg); } @Override @@ -60,7 +60,7 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof LRcv)) + if (!(o instanceof LRecv)) { return false; } @@ -70,7 +70,7 @@ public boolean equals(Object o) @Override public boolean canEquals(Object o) { - return o instanceof LRcv; + return o instanceof LRecv; } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index ed695f9a3..ee326ec87 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -40,7 +40,7 @@ import org.scribble.core.type.session.local.LChoice; import org.scribble.core.type.session.local.LContinue; import org.scribble.core.type.session.local.LDisconnect; -import org.scribble.core.type.session.local.LRcv; +import org.scribble.core.type.session.local.LRecv; import org.scribble.core.type.session.local.LRecursion; import org.scribble.core.type.session.local.LReq; import org.scribble.core.type.session.local.LSend; @@ -110,7 +110,7 @@ public LType visitDirectedInteraction(DirectedInteraction n) else //if (n instanceof GMessageTransfer) { return n.src.equals(self) ? new LSend(null, n.msg, n.dst) - : n.dst.equals(self) ? new LRcv(null, n.src, n.msg) + : n.dst.equals(self) ? new LRecv(null, n.src, n.msg) : LSkip.SKIP; } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index c6f766468..30a46288d 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -39,7 +39,7 @@ import org.scribble.core.type.session.local.LAcc; import org.scribble.core.type.session.local.LContinue; import org.scribble.core.type.session.local.LDisconnect; -import org.scribble.core.type.session.local.LRcv; +import org.scribble.core.type.session.local.LRecv; import org.scribble.core.type.session.local.LRecursion; import org.scribble.core.type.session.local.LReq; import org.scribble.core.type.session.local.LSend; @@ -170,22 +170,22 @@ public SType visitContinue(Continue n) public SType visitDirectedInteraction(DirectedInteraction n) { Role peer = ((n instanceof LSend) || (n instanceof LReq)) ? n.dst - : ((n instanceof LRcv) || (n instanceof LAcc)) ? n.src + : ((n instanceof LRecv) || (n instanceof LAcc)) ? n.src : null; if (peer == null) { throw new RuntimeException("Unknown action type: " + n); } MsgId mid = n.msg.getId(); - Payload payload = n.msg.isSigLit() // CHECKME: generalise? (e.g., hasPayload) + Payload pay = n.msg.isSigLit() // CHECKME: generalise? (e.g., hasPayload) ? ((SigLit) n.msg).payload : Payload.EMPTY_PAYLOAD; // TODO: add toAction method to base Interaction - EAction a = (n instanceof LSend) ? this.util.ef.newESend(peer, mid, payload) - : (n instanceof LRcv) ? this.util.ef.newEReceive(peer, mid, payload) - : (n instanceof LReq) ? this.util.ef.newERequest(peer, mid, payload) + EAction a = (n instanceof LSend) ? this.util.ef.newESend(peer, mid, pay) + : (n instanceof LRecv) ? this.util.ef.newERecv(peer, mid, pay) + : (n instanceof LReq) ? this.util.ef.newEReq(peer, mid, pay) : //(n instanceof LAcc) ? - this.util.ef.newEAccept(peer, mid, payload); // Action type already checked above + this.util.ef.newEAcc(peer, mid, pay); // Action type already checked above this.util.addEdge(this.util.getEntry(), a, this.util.getExit()); return n; } From a36e3f4f7b3ca0e07493f213cd71d92908674e3b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 02:04:09 +0100 Subject: [PATCH 295/539] [AllTest] Continued: refactoring model action classes. --- .../callbackapi/CBEndpointApiGenerator.java | 5 +- .../callbackapi/CBEndpointApiGenerator3.java | 9 +- .../StateChannelApiGenerator.java | 4 +- .../ioifaces/IOInterfacesGenerator.java | 4 +- .../statetype/STStateChanAPIBuilder.java | 3 +- .../scribble/core/lang/global/GProtocol.java | 5 +- .../org/scribble/core/model/MPrettyState.java | 2 +- .../java/org/scribble/core/model/MState.java | 89 +++++++++++++++---- .../scribble/core/model/endpoint/EState.java | 23 ++--- .../scribble/core/model/global/SGraph.java | 13 +-- .../scribble/core/model/global/SState.java | 15 +--- .../src/main/java/org/scribble/util/Pair.java | 5 +- scribble-test/src/test/scrib/tmp/Test.scr | 20 +++-- 13 files changed, 111 insertions(+), 86 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index f65033e6c..521487294 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -23,13 +23,12 @@ import java.util.stream.Stream; import org.scribble.ast.DataDecl; -import org.scribble.ast.SigDecl; import org.scribble.ast.Module; +import org.scribble.ast.SigDecl; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.core.job.Core; import org.scribble.core.job.CoreArgs; import org.scribble.core.job.CoreContext; -import org.scribble.core.model.MState; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.EStateKind; import org.scribble.core.model.endpoint.actions.EAction; @@ -101,7 +100,7 @@ public Map buildEndpointClass() throws ScribException // TODO: factor out with StateChannelApiGenerator constructor Set states = new HashSet<>(); states.add(init); - states.addAll(MState.getReachableStates(init)); + states.addAll(init.getReachableStates()); // frontend handler class String pack = SessionApiGenerator.getEndpointApiRootPackageName(this.proto); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index d670eea3b..7194f51ef 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -24,8 +24,8 @@ import java.util.stream.IntStream; import org.scribble.ast.DataDecl; -import org.scribble.ast.SigDecl; import org.scribble.ast.Module; +import org.scribble.ast.SigDecl; import org.scribble.codegen.java.sessionapi.SessionApiGenerator; import org.scribble.codegen.java.util.ClassBuilder; import org.scribble.codegen.java.util.ConstructorBuilder; @@ -35,17 +35,16 @@ import org.scribble.core.job.Core; import org.scribble.core.job.CoreArgs; import org.scribble.core.job.CoreContext; -import org.scribble.core.model.MState; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.EStateKind; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.PayElemType; +import org.scribble.core.type.name.Role; import org.scribble.core.type.name.SigName; import org.scribble.job.Job; import org.scribble.job.JobContext; -import org.scribble.core.type.name.PayElemType; -import org.scribble.core.type.name.Role; import org.scribble.util.ScribException; // FIXME: integrate with JEndpointApiGenerator -- this class should correspond to StateChanApiGenerator (relying on the common SessionApiGenerator) @@ -117,7 +116,7 @@ public Map buildEndpointClass() throws ScribException // TODO: factor out with StateChannelApiGenerator constructor Set states = new HashSet<>(); states.add(init); - states.addAll(MState.getReachableStates(init)); + states.addAll(init.getReachableStates()); String endpointName = this.proto.getSimpleName() + "_" + this.self; int i = 1; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index a435bfc36..ad7d470b9 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -77,7 +77,7 @@ public StateChannelApiGenerator(Job job, GProtoName fullname, Role self) constructClasses(this.init); //EndpointState term = EndpointState.findTerminalState(new HashSet<>(), this.init); - EState term = EState.getTerminal(this.init); + EState term = this.init.getTerminal(); if (term != null) { ClassBuilder cb = new EndSockGen(this, term).generateType(); @@ -88,7 +88,7 @@ public StateChannelApiGenerator(Job job, GProtoName fullname, Role self) // Cf. IOInterfacesGenerator constructor private static boolean skipIOInterfacesGeneration(EState init) { - Set as = EState.getReachableActions(init); + Set as = init.getReachableActions(); if (as.stream().anyMatch(a -> !a.isSend() && !a.isReceive())) // HACK FIXME (connect/disconnect) { return true; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index 99964ddf5..89ac6328a 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -88,7 +88,7 @@ public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) //if (IOInterfacesGenerator.skipIOInterfacesGeneration(init)) { // FIXME: factor out with skipIOInterfacesGeneration - Set as = EState.getReachableActions(init); + Set as = init.getReachableActions(); if (as.stream().anyMatch((a) -> !a.isSend() && !a.isReceive())) // HACK FIXME (connect/disconnect) { throw new RuntimeScribException( @@ -103,7 +103,7 @@ public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) collectPreds(); //EndpointState term = EndpointState.findTerminalState(new HashSet<>(), init); - EState term = EState.getTerminal(init); + EState term = init.getTerminal(); ClassBuilder endsock = null; if (term != null) { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index f10bc5583..78d983a50 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -18,7 +18,6 @@ import java.util.Map; import java.util.Set; -import org.scribble.core.model.MState; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAction; @@ -66,7 +65,7 @@ public Map build() // filepath -> source Map api = new HashMap<>(); Set states = new LinkedHashSet<>(); states.add(this.graph.init); - states.addAll(MState.getReachableStates(this.graph.init)); + states.addAll(this.graph.init.getReachableStates()); for (EState s : states) { switch (s.getStateKind()) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 6d0df7b78..4ddc808b5 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -32,7 +32,6 @@ import org.scribble.core.lang.ProtocolMod; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.local.LProjection; -import org.scribble.core.model.MState; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.global.SGraph; @@ -44,9 +43,9 @@ import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.MsgId; -import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.SigName; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.global.GRecursion; import org.scribble.core.type.session.global.GSeq; @@ -307,7 +306,7 @@ public static void validateBySpin(Core core, GProtoName fullname) Set tmp = new HashSet<>(); EGraph g = corec.getEGraph(fullname, r); tmp.add(g.init); - tmp.addAll(MState.getReachableStates(g.init)); + tmp.addAll(g.init.getReachableStates()); if (g.term != null) { tmp.remove(g.term); diff --git a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java index cc30e9bc2..41c8ff25f 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java @@ -112,7 +112,7 @@ public final String toAut() { Set> all = new HashSet<>(); all.add(this); - all.addAll(getReachableStates(this)); + all.addAll(getReachableStates()); String aut = ""; int edges = 0; Set seen = new HashSet<>(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/MState.java b/scribble-core/src/main/java/org/scribble/core/model/MState.java index e592393d1..f25ddc64e 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MState.java @@ -17,10 +17,10 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -29,14 +29,15 @@ import org.scribble.util.RuntimeScribException; import org.scribble.util.ScribException; -public abstract class MState< +public abstract class MState +< L, // Node label type (cosmetic) A extends MAction, // Edge type S extends MState, // State type - K extends ProtoKind // Global/Local + K extends ProtoKind // Global/Local > { - private static int count = 0; // FIXME: factor out with ModelAction + private static int count = 1; public final int id; @@ -47,6 +48,8 @@ public abstract class MState< protected final List actions; protected final List succs; + //Pair ? + public MState(Set labs) // Immutable singleton node { this.id = MState.count++; @@ -67,7 +70,6 @@ public final Set getLabels() // Mutable (can also overwrite edges) protected void addEdge(A a, S s) - //public final void addEdge(A a, S s) // FIXME: currently public for SGraph building -- make a global version of EGraphBuilderUtil { //this.edges.put(a, s); Iterator as = this.actions.iterator(); // Needed?.. @@ -170,10 +172,56 @@ public final boolean isTerminal() { return this.actions.isEmpty(); } + + // CHECKME: add "caching" versions to, e.g., Graphs? + // N.B. doesn't implicitly include start (only if start is reachable from start by at least one transition) + // Concrete subclass implementation should call, e.g., getReachableStatesAux(this) -- for S param, putting "this" into Map + public abstract Set getReachableStates(); + + // N.B. doesn't implicitly include start (only if start is explicitly reachable from start by at least one transition) + protected Set getReachableStatesAux(S start) + { + Map all = new HashMap<>(); + Map todo = new HashMap<>(); //LinkedHashMap<>(); -- ? + todo.put(this.id, start); // Suppressed: assumes ModelState subclass correctly instantiates S parameter + while (!todo.isEmpty()) + { + Iterator> i = todo.entrySet().iterator(); + Entry next = i.next(); + i.remove(); + for (S s : next.getValue().getAllSuccessors()) + { + if (!all.containsKey(s.id)) + { + all.put(s.id, s); + todo.put(s.id, s); + } + } + } + return new HashSet<>(all.values()); + } + + public S getTerminal() + { + //getReachableStates().stream().filter(x -> x.isTerminal()).findFirst(); + Set terms = getReachableStates().stream() + .filter(s -> s.isTerminal()).collect(Collectors.toSet()); + if (terms.size() > 1) + { + throw new RuntimeException("Shouldn't get in here: " + terms); + } + return terms.isEmpty() //.isPresent() + ? null : terms.iterator().next(); // CHECKME: return empty Set instead of null? + } + public Set getReachableActions() + { + return getReachableStates().stream().flatMap(x -> x.getActions().stream()) + .collect(Collectors.toSet()); + } public boolean canReach(MState s) { - return MState.getReachableStates(this).contains(s); + return getReachableStates().contains(s); } @Override @@ -208,11 +256,21 @@ public boolean equals(Object o) } protected abstract boolean canEquals(MState s); +} + + + + - public abstract S getTerminal(); - public abstract Set getReachableStates(); - public abstract Set getReachableActions(); + + + + + + + + /* // TODO: make protected public static , S extends MState, K extends ProtoKind> S getTerminal(S start) @@ -221,7 +279,7 @@ S getTerminal(S start) { return start; } - Set terms = MState.getReachableStates(start).stream() + Set terms = start.getReachableStates().stream() .filter(s -> s.isTerminal()).collect(Collectors.toSet()); if (terms.size() > 1) { @@ -232,7 +290,7 @@ S getTerminal(S start) // Note: doesn't implicitly include start (only if start is explicitly reachable from start, of course) /*public static , S extends ModelState, K extends ProtocolKind> - Set getAllReachable(S start)*/ + Set getAllReachable(S start)* / // TODO: make protected // CHECKME: cache results? @SuppressWarnings("unchecked") @@ -251,13 +309,13 @@ Set getReachableStates(MState start) { continue; } - all.put(next.id, next);*/ + all.put(next.id, next);* / for (S s : next.getAllSuccessors()) { /*if (!all.containsKey(s.id) && !todo.containsKey(s.id)) { todo.put(s.id, s); - }*/ + }* / if (!all.containsKey(s.id)) { all.put(s.id, s); @@ -270,7 +328,7 @@ Set getReachableStates(MState start) } return new HashSet<>(all.values()); } - + @SuppressWarnings("unchecked") // TODO: make protected // CHECKME: cache results? @@ -287,5 +345,4 @@ Set getReachableActions(MState start) as.addAll(s.getAllActions()); } return as; - } -} + }*/ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index 14aa09eae..db250f4e3 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -132,7 +132,7 @@ protected EState cloneNode(ModelFactory ef, Set labs) // Helper factory method for deriving an EGraph from an arbitary EState (but not the primary way to construct EGraphs; cf., EGraphBuilderUtil) public EGraph toGraph() { - return new EGraph(this, getTerminal(this)); // Throws exception if >1 terminal; null if no terminal + return new EGraph(this, getTerminal()); // Throws exception if >1 terminal; null if no terminal } /*.. move back to endpointstate @@ -148,7 +148,7 @@ public EState unfairTransform(ModelFactory ef) { EState init = clone(ef); - EState term = MPrettyState.getTerminal(init); + EState term = init.getTerminal(); Set seen = new HashSet<>(); Set todo = new LinkedHashSet<>(); todo.add(init); @@ -265,7 +265,7 @@ protected EState clone(ModelFactory ef) { Set all = new HashSet<>(); all.add(this); - all.addAll(MPrettyState.getReachableStates(this)); + all.addAll(this.getReachableStates()); Map map = new HashMap<>(); // original s.id -> clones for (EState s : all) { @@ -295,7 +295,7 @@ protected EState unfairClone(ModelFactory ef, EState term, EAction a, EState suc //EndpointState succ = take(a); Set all = new HashSet<>(); all.add(succ); - all.addAll(MPrettyState.getReachableStates(succ)); + all.addAll(succ.getReachableStates()); Map map = new HashMap<>(); // original s.id -> clones for (EState s : all) { @@ -378,23 +378,10 @@ else if (as.size() == 1 && as.get(0).isWrapServer()) } } - @Override - public EState getTerminal() - { - return MState.getTerminal(this); - } - @Override public Set getReachableStates() { - - return MState.getReachableStates(this); - } - - @Override - public Set getReachableActions() - { - return MState.getReachableActions(this); + return getReachableStatesAux(this); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java index 944247e71..7e659efda 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java @@ -30,17 +30,15 @@ public class SGraph implements MPrettyPrint { - public final GProtoName proto; - //private final Map efsms; - //private final boolean fair; + public final GProtoName proto; // For debugging only? deprecate? public final SState init; - public Map states; // State ID -> GMState + public Map states; private Map> reach; // State ID -> reachable states (not reflexive) private Set> termSets; - // Unlike EState, SGraph is not just a "simple wrapper" for an existing graph of nodes -- it is a "semantic structure" that needs to be fully built properly (so no arbitrary "toGraph" method; cf., EState) + // Unlike EState, SGraph is not just a "simple wrapper" for an existing graph of nodes -- it is a computed structure, so no lightweight "toGraph" wrapper method; cf., EState public SGraph(GProtoName proto, Map states, SState init) { this.proto = proto; @@ -48,11 +46,6 @@ public SGraph(GProtoName proto, Map states, SState init) this.states = Collections.unmodifiableMap(states); this.reach = getReachabilityMap(); } - - /*public SModel toModel() - { - return new SModel(this); - }*/ public Set> getTerminalSets() { diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java index 9d0f1d59c..522f59989 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java @@ -81,23 +81,10 @@ protected String getNodeLabel() return "label=\"" + this.id + ":" + labs.substring(1, labs.length() - 1) + "\""; } - @Override - public SState getTerminal() - { - return MState.getTerminal(this); - } - @Override public Set getReachableStates() { - - return MState.getReachableStates(this); - } - - @Override - public Set getReachableActions() - { - return MState.getReachableActions(this); + return getReachableStatesAux(this); } // FIXME? doesn't use super.hashCode (cf., equals) diff --git a/scribble-core/src/main/java/org/scribble/util/Pair.java b/scribble-core/src/main/java/org/scribble/util/Pair.java index f6a3f2fc8..249590cb1 100644 --- a/scribble-core/src/main/java/org/scribble/util/Pair.java +++ b/scribble-core/src/main/java/org/scribble/util/Pair.java @@ -44,8 +44,7 @@ public boolean equals(Object o) { return false; } - @SuppressWarnings("rawtypes") - Pair p = (Pair) o; // Could store T1.class and T2.class as fields, but probably better to do "structurally" as here - return this.left.equals(p.left) && this.right.equals(p.right); + Pair them = (Pair) o; + return this.left.equals(them.left) && this.right.equals(them.right); } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 942166a1b..2ac320de3 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -76,20 +76,26 @@ module tmp.Test; //...fix simp node constructors and af (no IdNode child) --- fix ambignodel to use af -- separate af methods -// Outstanding: - //...disallow/check for reserved __ -- do in gtype translation? - // FIXME: qualifed sig name as non-role do-arg - // TODO: rename addChildren1 - // CHECKME: duplicate proto mods +// For model build/check refactoring: +HERE refactor model states, remove intermedrecedge -// For model build/check refactoring: + // Outstanding: + //...disallow/check for reserved __ -- do in gtype translation? + // FIXME: qualifed sig name as non-role do-arg + // TODO: rename addChildren1 + // CHECKME: duplicate proto mods + // ...check ad hoc ScribNode constructions go through af properly + + // add exp conn checks to model validation // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) // sort out full name expansion between disamb and translation -- fix modulecontextcollector for imported module member fullnames // refactor additional disamb syntactic checks into core? e.g., do-calls, distinct roledecls, protodecls, etc. // -- otoh, ast errors give source feedback -- maybe implement both - // use stypefactory in core -- also make a visitorfactory (core and ast) + // use stypefactory in core -- also make visitorfactorys (both core and ast) + + // codegen refactoring: From 58183022d5c032332132d220429e30f75e1e2b78 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 12:05:14 +0100 Subject: [PATCH 296/539] [AllTest] Refactored Main factory methods. --- .../src/main/java/org/scribble/job/Job.java | 9 ++++--- .../java/org/scribble/core/model/MState.java | 2 +- .../src/main/java/org/scribble/main/Main.java | 27 ++++++++++++++----- .../java/org/scribble/ast/AstFactoryImpl.java | 4 ++- .../{ast => del}/DelDecoratorImpl.java | 14 +++------- .../scribble/parser/ScribAntlrWrapper.java | 9 +++---- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 7 files changed, 38 insertions(+), 29 deletions(-) rename scribble-parser/src/main/java/org/scribble/{ast => del}/DelDecoratorImpl.java (97%) diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 5deb6bae9..86e5b3dbd 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -63,13 +63,14 @@ protected JobContext newJobContext(Job job, } // A Scribble extension should override newJobConfig/Context/Translator and toJob as appropriate - protected GTypeTranslator newTranslator(ModuleName rootFullname) + // CHECKME: STypeTranslator, for future locals + protected GTypeTranslator newGTypeTranslator(ModuleName rootFullname) { return new GTypeTranslator(this, rootFullname); } // A Scribble extension should override newJobConfig/Context/Translator and toJob as appropriate - protected Core newJob(ModuleName mainFullname, Map args, + protected Core newCore(ModuleName mainFullname, Map args, //Map modcs, Set imeds) { @@ -105,7 +106,7 @@ public final Core getCore() throws ScribException Set imeds = new HashSet<>(); for (ModuleName fullname : parsed.keySet()) { - GTypeTranslator t = newTranslator(fullname); + GTypeTranslator t = newGTypeTranslator(fullname); Module m = parsed.get(fullname); for (GProtoDecl ast : m.getGProtoDeclChildren()) { @@ -117,7 +118,7 @@ public final Core getCore() throws ScribException + "\n" + imed); } } - this.core = newJob(this.config.main, this.config.args, + this.core = newCore(this.config.main, this.config.args, //this.context.getModuleContexts(), imeds); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/MState.java b/scribble-core/src/main/java/org/scribble/core/model/MState.java index f25ddc64e..035dbe3c0 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MState.java @@ -48,7 +48,7 @@ public abstract class MState protected final List actions; protected final List succs; - //Pair ? + //Pair ? rename getAll... public MState(Set labs) // Immutable singleton node { diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index f74d535a0..f47a15f2b 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -20,12 +20,15 @@ import java.util.Map.Entry; import java.util.stream.Collectors; +import org.scribble.ast.AstFactory; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.ImportDecl; import org.scribble.ast.ImportModule; import org.scribble.ast.Module; import org.scribble.core.job.CoreArgs; import org.scribble.core.type.name.ModuleName; +import org.scribble.del.DelDecorator; +import org.scribble.del.DelDecoratorImpl; import org.scribble.job.Job; import org.scribble.main.resource.Resource; import org.scribble.main.resource.loader.ScribModuleLoader; @@ -83,7 +86,7 @@ public Main(String inline, Map args) private Main(Pair hack, Path mainpath, Map args) throws ScribException, ScribParserException { - this.antlr = new ScribAntlrWrapper(); + this.antlr = newAntlr(newDelDecorator()); // Set this.loader and load main Pair main; @@ -113,16 +116,25 @@ private Main(Pair hack, Path mainpath, } // A Scribble extension should override newAntlr/Job as appropriate - protected ScribAntlrWrapper newAntlr() + protected ScribAntlrWrapper newAntlr(DelDecorator df) { - return new ScribAntlrWrapper(); + return new ScribAntlrWrapper(df); + } + + protected AstFactory newAstFactory(ScribAntlrWrapper antlr) + { + return new AstFactoryImpl(antlr); + } + + protected DelDecorator newDelDecorator() + { + return new DelDecoratorImpl(); } // A Scribble extension should override newAntlr/Job as appropriate protected Job newJob(Map parsed, - Map args, ModuleName mainFullname) throws ScribException + Map args, ModuleName mainFullname, AstFactory af) throws ScribException { - AstFactoryImpl af = new AstFactoryImpl(this.antlr); // Was previously made inside Job, but AstFactoryImpl now lives in scribble-parser, to access ScribbleParser constants return new Job(mainFullname, args, parsed, af); } @@ -155,10 +167,11 @@ private void loadAllAux(Pair m) } } - // For a Scribble extension, override newJob(parsed, args, mainFullname) + // For a Scribble extension, override newJob(parsed, args, mainFullname, AstFactory) public final Job newJob() throws ScribException { - return newJob(getParsedModules(), this.args, this.main); + AstFactory af = newAstFactory(this.antlr); + return newJob(getParsedModules(), this.args, this.main, af); } public Map getParsedModules() diff --git a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index 1fe6ed94e..cd8a98de8 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -150,7 +150,9 @@ protected ScribDel createDefaultDelegate() return new DefaultDel(); } - protected static void setDel(ScribNodeBase n, ScribDel del) + // Mutating setter + // public for DelDecoratorImpl + public static void setDel(ScribNodeBase n, ScribDel del) { //ScribNodeBase.del(n, del); // Defensive setter -- unnecessary ? n.setDel(del); // Mutating setter diff --git a/scribble-parser/src/main/java/org/scribble/ast/DelDecoratorImpl.java b/scribble-parser/src/main/java/org/scribble/del/DelDecoratorImpl.java similarity index 97% rename from scribble-parser/src/main/java/org/scribble/ast/DelDecoratorImpl.java rename to scribble-parser/src/main/java/org/scribble/del/DelDecoratorImpl.java index b9a4a553c..6d5c6a4ce 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/DelDecoratorImpl.java +++ b/scribble-parser/src/main/java/org/scribble/del/DelDecoratorImpl.java @@ -11,11 +11,12 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.ast; +package org.scribble.del; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.AuxMod; import org.scribble.ast.DataDecl; import org.scribble.ast.ExplicitMod; @@ -138,17 +139,10 @@ protected ScribDel createDefaultDelegate() return new DefaultDel(); } - // Non-defensive - //protected static T setDel(T n, ScribDel del) + // Mutating setter protected static void setDel(ScribNodeBase n, ScribDel del) { - n.setDel(del); - //return n; - /*// Defensive helper with cast check - ScribNodeBase copy = ((ScribNodeBase) n).clone(); // Need deep clone, since children have parent field - //copy.del = del; - copy.setDel(del); - return ScribUtil.castNodeByClass(n, copy);*/ + AstFactoryImpl.setDel(n, del); } @Override diff --git a/scribble-parser/src/main/java/org/scribble/parser/ScribAntlrWrapper.java b/scribble-parser/src/main/java/org/scribble/parser/ScribAntlrWrapper.java index 55cc71c58..ac082ee75 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/ScribAntlrWrapper.java +++ b/scribble-parser/src/main/java/org/scribble/parser/ScribAntlrWrapper.java @@ -24,7 +24,6 @@ import org.antlr.runtime.RecognitionException; import org.antlr.runtime.tree.CommonErrorNode; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.DelDecoratorImpl; import org.scribble.ast.Module; import org.scribble.del.DelDecorator; import org.scribble.parser.antlr.ScribbleLexer; @@ -35,11 +34,11 @@ // Wraps the ScribbleLexer and ScribbleParser generated by ANTLR from Scribble.g public class ScribAntlrWrapper { - private final DelDecorator df = new DelDecoratorImpl(); + private final DelDecorator df; - public ScribAntlrWrapper() + public ScribAntlrWrapper(DelDecorator df) { - + this.df = df; } // Scribble extensions should override newScribbleLexer/Parser as appropriate @@ -65,7 +64,7 @@ public Module parse(InputStream is) throws ScribParserException String input = ScribAntlrWrapper.readInput(is); Lexer lex = newScribbleLexer(new ANTLRStringStream(input)); Module mod = runScribbleParser(new CommonTokenStream(lex)); - this.df.decorate(mod); + this.df.decorate(mod); // TODO: refactor as AstVisitor return mod; } catch (IOException e) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 2ac320de3..5645649e2 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -78,7 +78,7 @@ module tmp.Test; // For model build/check refactoring: -HERE refactor model states, remove intermedrecedge +//HERE refactor model states, remove intermedrecedge // Outstanding: //...disallow/check for reserved __ -- do in gtype translation? From 9edcc020d818c098aead6e56a6e273c551aad624 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 13:39:01 +0100 Subject: [PATCH 297/539] [AllTest] Refactored DelDecorator/Visitor. --- .../java/org/scribble/ast/ScribNodeBase.java | 4 +- .../{DelDecorator.java => DelFactory.java} | 16 +++-- .../src/main/java/org/scribble/job/Job.java | 12 ++-- .../main/java/org/scribble/job/JobConfig.java | 5 +- .../scribble/visit/ModuleContextVisitor.java | 4 +- .../src/main/java/org/scribble/main/Main.java | 22 ++++--- ...DecoratorImpl.java => DelFactoryImpl.java} | 61 +++---------------- .../scribble/parser/ScribAntlrWrapper.java | 10 +-- 8 files changed, 44 insertions(+), 90 deletions(-) rename scribble-ast/src/main/java/org/scribble/del/{DelDecorator.java => DelFactory.java} (98%) rename scribble-parser/src/main/java/org/scribble/del/{DelDecoratorImpl.java => DelFactoryImpl.java} (90%) diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java index cc3e5e540..f2f870c01 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -145,8 +145,8 @@ public final ScribNodeBase del(ScribDel del) } // Non-defensive - //protected // CHECKME: make protected again after refactoring ast to parser ? - protected final void setDel(ScribDel del) + // CHECKME: make protected again after refactoring ast to parser ? + public final void setDel(ScribDel del) { this.del = del; } diff --git a/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java similarity index 98% rename from scribble-ast/src/main/java/org/scribble/del/DelDecorator.java rename to scribble-ast/src/main/java/org/scribble/del/DelFactory.java index 27f35f2fe..a095e7b06 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DelDecorator.java +++ b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java @@ -15,10 +15,9 @@ import org.scribble.ast.AuxMod; import org.scribble.ast.DataDecl; +import org.scribble.ast.DataParamDecl; import org.scribble.ast.ExplicitMod; import org.scribble.ast.ImportModule; -import org.scribble.ast.SigDecl; -import org.scribble.ast.SigLitNode; import org.scribble.ast.Module; import org.scribble.ast.ModuleDecl; import org.scribble.ast.NonRoleArg; @@ -30,9 +29,9 @@ import org.scribble.ast.RoleArgList; import org.scribble.ast.RoleDecl; import org.scribble.ast.RoleDeclList; -import org.scribble.ast.ScribNode; +import org.scribble.ast.SigDecl; +import org.scribble.ast.SigLitNode; import org.scribble.ast.SigParamDecl; -import org.scribble.ast.DataParamDecl; import org.scribble.ast.UnaryPayElem; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; @@ -49,16 +48,16 @@ import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.ast.name.qualified.LProtoNameNode; -import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.DataParamNode; import org.scribble.ast.name.simple.ExtIdNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; -import org.scribble.ast.name.simple.DataParamNode; // Use after ANTLR parsing (specifically, ScribTreeAdaptor) -- not needed for AstFactory constructions @@ -66,10 +65,9 @@ // A dec method for each AST class -- method name must be the same as target class name // Implementations (DelDecoratorImpl) in scribble-parser, can depend on parser implementation // E.g., DelDecoratorImpl: each method named after the class name -- currently dispatched by reflection -public interface DelDecorator +public interface DelFactory { - void decorate(ScribNode n); - + // Currently a bit more than plain factory, calls setDel void IdNode(IdNode n); void ExtIdNode(ExtIdNode n); diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 86e5b3dbd..17a0dfa90 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -24,8 +24,10 @@ import org.scribble.core.job.CoreArgs; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.name.ModuleName; +import org.scribble.del.DelFactory; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; +import org.scribble.visit.DelDecorator; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.NameDisambiguator; @@ -41,18 +43,19 @@ public class Job // Just take MainContext as arg? -- would need to fix Maven dependencies //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) public Job(ModuleName mainFullname, Map args, - Map parsed, AstFactory af) throws ScribException + Map parsed, AstFactory af, DelFactory df) + throws ScribException { // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource - this.config = newJobConfig(mainFullname, args, af); + this.config = newJobConfig(mainFullname, args, af, df); this.context = newJobContext(this, parsed); // Single instance per Job, should not be shared between Jobs } // A Scribble extension should override newJobConfig/Context/Translator and toJob as appropriate protected JobConfig newJobConfig(ModuleName mainFullname, - Map args, AstFactory af) + Map args, AstFactory af, DelFactory df) { - return new JobConfig(mainFullname, args, af); + return new JobConfig(mainFullname, args, af, df); } // A Scribble extension should override newJobConfig/Context/Translator and toJob as appropriate @@ -91,6 +94,7 @@ public void runPasses() throws ScribException // Disamb is a "leftover" aspect of parsing -- so not in core // N.B. disamb is mainly w.r.t. ambignames -- e.g., doesn't fully qualify names (currently mainly done by imed translation) // CHECKME: disamb also currently does checks like do-arg kind and arity -- refactor into core? -- also does, e.g., distinct roledecls, protodecls, etc. + runVisitorPassOnAllModules(new DelDecorator(this, this.config.df)); // Includes validating names used in subprotocol calls.. runVisitorPassOnAllModules(new NameDisambiguator(this)); // Includes validating names used in subprotocol calls.. } diff --git a/scribble-ast/src/main/java/org/scribble/job/JobConfig.java b/scribble-ast/src/main/java/org/scribble/job/JobConfig.java index a7ec3d9e4..9f328d483 100644 --- a/scribble-ast/src/main/java/org/scribble/job/JobConfig.java +++ b/scribble-ast/src/main/java/org/scribble/job/JobConfig.java @@ -19,6 +19,7 @@ import org.scribble.ast.AstFactory; import org.scribble.core.job.CoreArgs; import org.scribble.core.type.name.ModuleName; +import org.scribble.del.DelFactory; // The "static" (constant) info for Lang -- cf. LangContext "dynamic" state public class JobConfig @@ -29,13 +30,15 @@ public class JobConfig // CHECKME: verbose/debug printing parameter? public final AstFactory af; + public final DelFactory df; // N.B. MainContext is in a different non-visible (by Maven) package public JobConfig(ModuleName mainFullname, Map args, - AstFactory af) + AstFactory af, DelFactory df) { this.main = mainFullname; this.args = Collections.unmodifiableMap(args); this.af = af; + this.df = df; } } diff --git a/scribble-ast/src/main/java/org/scribble/visit/ModuleContextVisitor.java b/scribble-ast/src/main/java/org/scribble/visit/ModuleContextVisitor.java index 3bee8f1f0..29e04b315 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/ModuleContextVisitor.java +++ b/scribble-ast/src/main/java/org/scribble/visit/ModuleContextVisitor.java @@ -37,10 +37,8 @@ protected void enter(ScribNode child) throws ScribException { super.enter(child); - if (child instanceof Module) // Factor out? + if (child instanceof Module) // Factor out? (e.g., Module?) { - /*ModuleDel del = (ModuleDel) ((Module) child).del(); - setModuleContext(del.getModuleContext());*/ ModuleName fullname = ((Module) child).getFullModuleName(); setModuleContext(this.job.getContext().getModuleContext(fullname)); } diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index f47a15f2b..c8bafed3a 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -27,8 +27,8 @@ import org.scribble.ast.Module; import org.scribble.core.job.CoreArgs; import org.scribble.core.type.name.ModuleName; -import org.scribble.del.DelDecorator; -import org.scribble.del.DelDecoratorImpl; +import org.scribble.del.DelFactory; +import org.scribble.del.DelFactoryImpl; import org.scribble.job.Job; import org.scribble.main.resource.Resource; import org.scribble.main.resource.loader.ScribModuleLoader; @@ -86,7 +86,7 @@ public Main(String inline, Map args) private Main(Pair hack, Path mainpath, Map args) throws ScribException, ScribParserException { - this.antlr = newAntlr(newDelDecorator()); + this.antlr = newAntlr(); // Set this.loader and load main Pair main; @@ -116,9 +116,9 @@ private Main(Pair hack, Path mainpath, } // A Scribble extension should override newAntlr/Job as appropriate - protected ScribAntlrWrapper newAntlr(DelDecorator df) + protected ScribAntlrWrapper newAntlr() { - return new ScribAntlrWrapper(df); + return new ScribAntlrWrapper(); } protected AstFactory newAstFactory(ScribAntlrWrapper antlr) @@ -126,17 +126,18 @@ protected AstFactory newAstFactory(ScribAntlrWrapper antlr) return new AstFactoryImpl(antlr); } - protected DelDecorator newDelDecorator() + protected DelFactory newDelFactory() { - return new DelDecoratorImpl(); + return new DelFactoryImpl(); } // A Scribble extension should override newAntlr/Job as appropriate protected Job newJob(Map parsed, - Map args, ModuleName mainFullname, AstFactory af) throws ScribException + Map args, ModuleName mainFullname, AstFactory af, + DelFactory df) throws ScribException { // Was previously made inside Job, but AstFactoryImpl now lives in scribble-parser, to access ScribbleParser constants - return new Job(mainFullname, args, parsed, af); + return new Job(mainFullname, args, parsed, af, df); } // Pre: main Module loaded by this.loader @@ -171,7 +172,8 @@ private void loadAllAux(Pair m) public final Job newJob() throws ScribException { AstFactory af = newAstFactory(this.antlr); - return newJob(getParsedModules(), this.args, this.main, af); + DelFactory df = newDelFactory(); + return newJob(getParsedModules(), this.args, this.main, af, df); } public Map getParsedModules() diff --git a/scribble-parser/src/main/java/org/scribble/del/DelDecoratorImpl.java b/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java similarity index 90% rename from scribble-parser/src/main/java/org/scribble/del/DelDecoratorImpl.java rename to scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java index 6d5c6a4ce..af25b071d 100644 --- a/scribble-parser/src/main/java/org/scribble/del/DelDecoratorImpl.java +++ b/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java @@ -13,16 +13,12 @@ */ package org.scribble.del; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.AuxMod; import org.scribble.ast.DataDecl; +import org.scribble.ast.DataParamDecl; import org.scribble.ast.ExplicitMod; import org.scribble.ast.ImportModule; -import org.scribble.ast.SigDecl; -import org.scribble.ast.SigLitNode; import org.scribble.ast.Module; import org.scribble.ast.ModuleDecl; import org.scribble.ast.NonRoleArg; @@ -34,10 +30,10 @@ import org.scribble.ast.RoleArgList; import org.scribble.ast.RoleDecl; import org.scribble.ast.RoleDeclList; -import org.scribble.ast.ScribNode; import org.scribble.ast.ScribNodeBase; +import org.scribble.ast.SigDecl; +import org.scribble.ast.SigLitNode; import org.scribble.ast.SigParamDecl; -import org.scribble.ast.DataParamDecl; import org.scribble.ast.UnaryPayElem; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; @@ -54,27 +50,16 @@ import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.ast.name.qualified.LProtoNameNode; -import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.simple.AmbigNameNode; +import org.scribble.ast.name.simple.DataParamNode; import org.scribble.ast.name.simple.ExtIdNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; -import org.scribble.ast.name.simple.DataParamNode; -import org.scribble.del.DefaultDel; -import org.scribble.del.DelDecorator; -import org.scribble.del.ImportModuleDel; -import org.scribble.del.ModuleDel; -import org.scribble.del.NonRoleArgListDel; -import org.scribble.del.NonRoleParamDeclDel; -import org.scribble.del.NonRoleParamDeclListDel; -import org.scribble.del.RoleArgListDel; -import org.scribble.del.RoleDeclDel; -import org.scribble.del.RoleDeclListDel; -import org.scribble.del.ScribDel; import org.scribble.del.global.GChoiceDel; import org.scribble.del.global.GConnectDel; import org.scribble.del.global.GContinueDel; @@ -96,43 +81,12 @@ //CHECKME: refactor decoration methods into AST interface, to ensure they are implemented and called? //CHECKME: to what extent are del's still needed? -public class DelDecoratorImpl implements DelDecorator +public class DelFactoryImpl implements DelFactory { - public DelDecoratorImpl() + public DelFactoryImpl() { } - - // Visitor enter/leave framework uses dels -- DelDecorator is a "protovisitor" (akin to parsing) - public void decorate(ScribNode n) - { - decorateNode(n); - decorateChildren(n); - } - - protected void decorateNode(ScribNode n) - { - Class ddec = DelDecorator.class; - try - { - String cname = n.getClass().getName(); - String mname = cname.substring(cname.lastIndexOf('.')+1, cname.length()); - Class param = Class.forName(cname); - Method m = ddec.getMethod(mname, param); - m.invoke(this, n); - } - catch (NoSuchMethodException | SecurityException | ClassNotFoundException - | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - { - throw new RuntimeException(e); - } - } - - protected void decorateChildren(ScribNode n) - { - n.getChildren().stream().forEach(x -> decorate(x)); - } protected ScribDel createDefaultDelegate() { @@ -440,7 +394,6 @@ public void GRecursion(GRecursion n) { setDel(n, new GRecursionDel()); } - } diff --git a/scribble-parser/src/main/java/org/scribble/parser/ScribAntlrWrapper.java b/scribble-parser/src/main/java/org/scribble/parser/ScribAntlrWrapper.java index ac082ee75..7e2a9450f 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/ScribAntlrWrapper.java +++ b/scribble-parser/src/main/java/org/scribble/parser/ScribAntlrWrapper.java @@ -25,7 +25,6 @@ import org.antlr.runtime.tree.CommonErrorNode; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.Module; -import org.scribble.del.DelDecorator; import org.scribble.parser.antlr.ScribbleLexer; import org.scribble.parser.antlr.ScribbleParser; import org.scribble.util.ScribParserException; @@ -34,11 +33,9 @@ // Wraps the ScribbleLexer and ScribbleParser generated by ANTLR from Scribble.g public class ScribAntlrWrapper { - private final DelDecorator df; - - public ScribAntlrWrapper(DelDecorator df) + public ScribAntlrWrapper() { - this.df = df; + } // Scribble extensions should override newScribbleLexer/Parser as appropriate @@ -56,7 +53,7 @@ public ScribbleParser newScribbleParser(CommonTokenStream ts) return new ScribbleParser(ts); } - // Parse InputStream (from a Resource) into a (del decorated) Module + // Parse InputStream (from a Resource) into a Module -- N.B. not del decorated (yet) public Module parse(InputStream is) throws ScribParserException { try @@ -64,7 +61,6 @@ public Module parse(InputStream is) throws ScribParserException String input = ScribAntlrWrapper.readInput(is); Lexer lex = newScribbleLexer(new ANTLRStringStream(input)); Module mod = runScribbleParser(new CommonTokenStream(lex)); - this.df.decorate(mod); // TODO: refactor as AstVisitor return mod; } catch (IOException e) From f33889468abc6e66017addb4657715a0010f1643 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 14:17:37 +0100 Subject: [PATCH 298/539] [AllTest] Refactored AstFactory to use DelFactory. --- .../java/org/scribble/del/DelFactory.java | 8 +- ...tocolBlockDel.java => GProtoBlockDel.java} | 2 +- ...rotocolDeclDel.java => GProtoDeclDel.java} | 4 +- ...GProtocolDefDel.java => GProtoDefDel.java} | 4 +- ...aTypeNodeDel.java => DataNameNodeDel.java} | 4 +- ...igNameNodeDel.java => SigNameNodeDel.java} | 4 +- .../java/org/scribble/visit/DelDecorator.java | 68 ++++++++ .../src/main/java/org/scribble/main/Main.java | 6 +- .../java/org/scribble/ast/AstFactoryImpl.java | 155 ++++++++---------- .../java/org/scribble/del/DelFactoryImpl.java | 84 +++++----- 10 files changed, 197 insertions(+), 142 deletions(-) rename scribble-ast/src/main/java/org/scribble/del/global/{GProtocolBlockDel.java => GProtoBlockDel.java} (93%) rename scribble-ast/src/main/java/org/scribble/del/global/{GProtocolDeclDel.java => GProtoDeclDel.java} (95%) rename scribble-ast/src/main/java/org/scribble/del/global/{GProtocolDefDel.java => GProtoDefDel.java} (89%) rename scribble-ast/src/main/java/org/scribble/del/name/qualified/{DataTypeNodeDel.java => DataNameNodeDel.java} (96%) rename scribble-ast/src/main/java/org/scribble/del/name/qualified/{MessageSigNameNodeDel.java => SigNameNodeDel.java} (96%) create mode 100644 scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java diff --git a/scribble-ast/src/main/java/org/scribble/del/DelFactory.java b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java index a095e7b06..eabefdc4f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DelFactory.java +++ b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java @@ -36,6 +36,7 @@ import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; import org.scribble.ast.global.GContinue; +import org.scribble.ast.global.GDelegPayElem; import org.scribble.ast.global.GDisconnect; import org.scribble.ast.global.GDo; import org.scribble.ast.global.GInteractionSeq; @@ -45,6 +46,7 @@ import org.scribble.ast.global.GProtoDef; import org.scribble.ast.global.GProtoHeader; import org.scribble.ast.global.GRecursion; +import org.scribble.ast.global.GWrap; import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.ast.name.qualified.LProtoNameNode; @@ -110,13 +112,13 @@ public interface DelFactory void SigLitNode(SigLitNode n); void PayElemList(PayElemList n); void UnaryPayElem(UnaryPayElem n); - /*GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode name, RoleNode role); - LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode name);*/ + void GDelegPayElem(GDelegPayElem n); + //void LDelegationElem(CommonTree source, LProtocolNameNode name); void GConnect(GConnect n); void GDisconnect(GDisconnect n); void GMsgTransfer(GMsgTransfer n); - /*GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest);*/ + void GWrap(GWrap n); void GContinue(GContinue n); void GDo(GDo n); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtoBlockDel.java similarity index 93% rename from scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GProtoBlockDel.java index fa252f565..0ccd7fd23 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtoBlockDel.java @@ -20,7 +20,7 @@ import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -public class GProtocolBlockDel extends ProtocolBlockDel implements GDel +public class GProtoBlockDel extends ProtocolBlockDel implements GDel { @Override public GSeq translate(ScribNode n, GTypeTranslator t) diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java similarity index 95% rename from scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java index 25f9836d3..89327f53f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java @@ -31,9 +31,9 @@ import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -public class GProtocolDeclDel extends ProtocolDeclDel implements GDel +public class GProtoDeclDel extends ProtocolDeclDel implements GDel { - public GProtocolDeclDel() + public GProtoDeclDel() { } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtoDefDel.java similarity index 89% rename from scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java rename to scribble-ast/src/main/java/org/scribble/del/global/GProtoDefDel.java index 7045f6eda..7e6520be6 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtocolDefDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtoDefDel.java @@ -15,9 +15,9 @@ import org.scribble.del.ProtocolDefDel; -public class GProtocolDefDel extends ProtocolDefDel +public class GProtoDefDel extends ProtocolDefDel { - public GProtocolDefDel() + public GProtoDefDel() { } diff --git a/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataNameNodeDel.java similarity index 96% rename from scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/name/qualified/DataNameNodeDel.java index 70935aae9..d70a3f467 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataTypeNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/qualified/DataNameNodeDel.java @@ -24,9 +24,9 @@ import org.scribble.util.ScribException; import org.scribble.visit.NameDisambiguator; -public class DataTypeNodeDel extends ScribDelBase +public class DataNameNodeDel extends ScribDelBase { - public DataTypeNodeDel() + public DataNameNodeDel() { } diff --git a/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/qualified/SigNameNodeDel.java similarity index 96% rename from scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java rename to scribble-ast/src/main/java/org/scribble/del/name/qualified/SigNameNodeDel.java index c28cc7528..a2d73456c 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/qualified/MessageSigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/qualified/SigNameNodeDel.java @@ -24,9 +24,9 @@ import org.scribble.util.ScribException; import org.scribble.visit.NameDisambiguator; -public class MessageSigNameNodeDel extends ScribDelBase +public class SigNameNodeDel extends ScribDelBase { - public MessageSigNameNodeDel() + public SigNameNodeDel() { } diff --git a/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java b/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java new file mode 100644 index 000000000..430828101 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java @@ -0,0 +1,68 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.visit; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import org.scribble.ast.ScribNode; +import org.scribble.del.DelFactory; +import org.scribble.job.Job; +import org.scribble.util.ScribException; + +// A visitor that caches the ModuleContext from the *entered* Module, for later access +// N.B. may be a different Module than the "root" Module of the job +// Looking up the "entered" Module context is otherwise inconvenient +public class DelDecorator extends AstVisitor +{ + protected final DelFactory df; + + public DelDecorator(Job job, DelFactory df) + { + super(job); + this.df = df; + } + + // AstVisitor enter/leave typically delegates to dels -- DelDecorator is a "proto-visitor", no del to delegate to (yet) + @Override + protected ScribNode leave(ScribNode child, ScribNode visited) + throws ScribException + { + decorate(visited); // Mutating setter + return visited; + } + + protected void decorate(ScribNode n) + { + try + { + String cname = n.getClass().getName(); + String mname = cname.substring(cname.lastIndexOf('.')+1, cname.length()); + Class param = Class.forName(cname); + Method m = DelFactory.class.getMethod(mname, param); + m.invoke(this.df, n); + } + catch (NoSuchMethodException | SecurityException | ClassNotFoundException + | IllegalAccessException | IllegalArgumentException + | InvocationTargetException e) + { + throw new RuntimeException(e); + } + } + + /*protected void decorateChildren(ScribNode n) + { + n.getChildren().stream().forEach(x -> decorate(x)); + }*/ +} diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index c8bafed3a..4a3c38a09 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -121,9 +121,9 @@ protected ScribAntlrWrapper newAntlr() return new ScribAntlrWrapper(); } - protected AstFactory newAstFactory(ScribAntlrWrapper antlr) + protected AstFactory newAstFactory(ScribAntlrWrapper antlr, DelFactory df) { - return new AstFactoryImpl(antlr); + return new AstFactoryImpl(antlr, df); } protected DelFactory newDelFactory() @@ -171,8 +171,8 @@ private void loadAllAux(Pair m) // For a Scribble extension, override newJob(parsed, args, mainFullname, AstFactory) public final Job newJob() throws ScribException { - AstFactory af = newAstFactory(this.antlr); DelFactory df = newDelFactory(); + AstFactory af = newAstFactory(this.antlr, df); return newJob(getParsedModules(), this.args, this.main, af, df); } diff --git a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index cd8a98de8..09e8d234e 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -53,46 +53,21 @@ import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.PayElemKind; import org.scribble.del.DefaultDel; -import org.scribble.del.ImportModuleDel; -import org.scribble.del.ModuleDel; -import org.scribble.del.NonRoleArgListDel; -import org.scribble.del.NonRoleParamDeclDel; -import org.scribble.del.NonRoleParamDeclListDel; -import org.scribble.del.RoleArgListDel; -import org.scribble.del.RoleDeclDel; -import org.scribble.del.RoleDeclListDel; +import org.scribble.del.DelFactory; import org.scribble.del.ScribDel; -import org.scribble.del.global.GChoiceDel; -import org.scribble.del.global.GConnectDel; -import org.scribble.del.global.GContinueDel; -import org.scribble.del.global.GDelegationElemDel; -import org.scribble.del.global.GDisconnectDel; -import org.scribble.del.global.GDoDel; -import org.scribble.del.global.GInteractionSeqDel; -import org.scribble.del.global.GMessageTransferDel; -import org.scribble.del.global.GProtocolBlockDel; -import org.scribble.del.global.GProtocolDeclDel; -import org.scribble.del.global.GProtocolDefDel; -import org.scribble.del.global.GRecursionDel; -import org.scribble.del.global.GWrapDel; -import org.scribble.del.name.qualified.DataTypeNodeDel; -import org.scribble.del.name.qualified.MessageSigNameNodeDel; -import org.scribble.del.name.simple.AmbigNameNodeDel; -import org.scribble.del.name.simple.NonRoleParamNodeDel; -import org.scribble.del.name.simple.RecVarNodeDel; -import org.scribble.del.name.simple.RoleNodeDel; import org.scribble.parser.ScribAntlrWrapper; import org.scribble.parser.antlr.ScribbleParser; - public class AstFactoryImpl implements AstFactory { // Purely for the convenience of newToken(Token, type) protected final ScribbleParser parser; protected final Map tokens; + + protected final DelFactory df; - public AstFactoryImpl(ScribAntlrWrapper antlr) + public AstFactoryImpl(ScribAntlrWrapper antlr, DelFactory df) { try { @@ -109,6 +84,7 @@ public AstFactoryImpl(ScribAntlrWrapper antlr) } } this.tokens = Collections.unmodifiableMap(tokens); + this.df = df; } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) @@ -150,20 +126,26 @@ protected ScribDel createDefaultDelegate() return new DefaultDel(); } - // Mutating setter // public for DelDecoratorImpl + // Mutating setter public static void setDel(ScribNodeBase n, ScribDel del) { //ScribNodeBase.del(n, del); // Defensive setter -- unnecessary ? n.setDel(del); // Mutating setter } + + /** + * NameNodes + */ + @Override public IdNode IdNode(Token t, String text) { t = newIdToken(t, text); // (Ext)IdNode is the only token with a "different" text to its node type -- info stored directly as its the text, no children IdNode n = new IdNode(t); + this.df.IdNode(n); return n; } @@ -173,6 +155,7 @@ public ExtIdNode ExtIdNode(Token t, String text) t = newIdToken(t, text); // (Ext)IdNode is the only token with a "different" text to its node type -- info stored directly as its the text, no children ExtIdNode n = new ExtIdNode(t); + this.df.ExtIdNode(n); return n; } @@ -183,7 +166,17 @@ public AmbigNameNode AmbigNameNode(Token t, String text) int ttype = ScribbleParser.ID; t = newIdToken(t, text); AmbigNameNode n = new AmbigNameNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] - n.del(new AmbigNameNodeDel()); + this.df.AmbigNameNode(n); + return n; + } + + @Override + public DataParamNode DataParamNode(Token t, String text) + { + int ttype = ScribbleParser.ID; // N.B. cf. ScribbleParser.DATA_NAME + t = newIdToken(t, text); + DataParamNode n = new DataParamNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] + this.df.DataParamNode(n); return n; } @@ -193,7 +186,7 @@ public OpNode OpNode(Token t, String text) int ttype = ScribbleParser.ID; t = newIdToken(t, text); OpNode n = new OpNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] - setDel(n, createDefaultDelegate()); + this.df.OpNode(n); return n; } @@ -203,7 +196,7 @@ public RecVarNode RecVarNode(Token t, String text) int ttype = ScribbleParser.ID; t = newIdToken(t, text); RecVarNode n = new RecVarNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] - setDel(n, new RecVarNodeDel()); + this.df.RecVarNode(n); return n; } @@ -213,7 +206,7 @@ public RoleNode RoleNode(Token t, String text) int ttype = ScribbleParser.ID; t = newIdToken(t, text); RoleNode n = new RoleNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] - setDel(n, new RoleNodeDel()); + this.df.RoleNode(n); return n; } @@ -223,17 +216,7 @@ public SigParamNode SigParamNode(Token t, String text) int ttype = ScribbleParser.ID; // N.B. cf. ScribbleParser.SIG_NAME t = newIdToken(t, text); SigParamNode n = new SigParamNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] - n.del(new NonRoleParamNodeDel()); - return n; - } - - @Override - public DataParamNode DataParamNode(Token t, String text) - { - int ttype = ScribbleParser.ID; // N.B. cf. ScribbleParser.DATA_NAME - t = newIdToken(t, text); - DataParamNode n = new DataParamNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] - n.del(new NonRoleParamNodeDel()); + this.df.SigParamNode(n); return n; } @@ -243,7 +226,7 @@ public DataNameNode DataNameNode(Token t, List elems) t = newToken(t, ScribbleParser.DATA_NAME); DataNameNode n = new DataNameNode(t); n.addChildren(elems); - setDel(n, new DataTypeNodeDel()); + this.df.DataNameNode(n); return n; } @@ -253,7 +236,7 @@ public GProtoNameNode GProtoNameNode(Token t, List elems) t = newToken(t, ScribbleParser.GPROTO_NAME); GProtoNameNode n = new GProtoNameNode(t); n.addChildren(elems); - setDel(n, createDefaultDelegate()); + this.df.GProtoNameNode(n); return n; } @@ -263,7 +246,7 @@ public ModuleNameNode ModuleNameNode(Token t, List elems) t = newToken(t, ScribbleParser.MODULE_NAME); ModuleNameNode n = new ModuleNameNode(t); n.addChildren(elems); - setDel(n, createDefaultDelegate()); + this.df.ModuleNameNode(n); return n; } @@ -273,10 +256,16 @@ public SigNameNode SigNameNode(Token t, List elems) t = newToken(t, ScribbleParser.SIG_NAME); SigNameNode n = new SigNameNode(t); n.addChildren(elems); - setDel(n, new MessageSigNameNodeDel()); + this.df.SigNameNode(n); return n; } + + + /** + * From here, remaining ScribNodes that are not NameNodes -- should use the node specific addChildren1 (TODO: rename) + */ + @Override public Module Module(Token t, ModuleDecl moddecl, List> imports, List> data, List> protos) @@ -284,7 +273,7 @@ public Module Module(Token t, ModuleDecl moddecl, List> imports, t = newToken(t, ScribbleParser.MODULE); Module n = new Module(t); n.addChildren1(moddecl, imports, data, protos); - setDel(n, new ModuleDel()); + this.df.Module(n); return n; } @@ -294,7 +283,7 @@ public ModuleDecl ModuleDecl(Token t, ModuleNameNode fullname) t = newToken(t, ScribbleParser.MODULEDECL); ModuleDecl n = new ModuleDecl(t); n.addChildren1(fullname); - setDel(n, createDefaultDelegate()); + this.df.ModuleDecl(n); return n; } @@ -305,7 +294,7 @@ public ImportModule ImportModule(Token t, ModuleNameNode modname, t = newToken(t, ScribbleParser.IMPORTMODULE); ImportModule n = new ImportModule(t); n.addChildren1(modname, alias); - setDel(n, new ImportModuleDel()); + this.df.ImportModule(n); return n; } @@ -316,7 +305,7 @@ public DataDecl DataDecl(Token t, IdNode schema, ExtIdNode extName, t = newToken(t, ScribbleParser.DATADECL); DataDecl n = new DataDecl(t); n.addChildren1(alias, schema, extName, extSource); - setDel(n, createDefaultDelegate()); + this.df.DataDecl(n); return n; } @@ -327,7 +316,7 @@ public SigDecl SigDecl(Token t, IdNode schema, ExtIdNode extName, t = newToken(t, ScribbleParser.SIGDECL); SigDecl n = new SigDecl(t); n.addChildren1(alias, schema, extName, extSource); - setDel(n, createDefaultDelegate()); + this.df.SigDecl(n); return n; } @@ -338,9 +327,11 @@ public GProtoDecl GProtoDecl(Token t, ProtoModList mods, GProtoHeader header, t = newToken(t, ScribbleParser.GPROTODECL); GProtoDecl n = new GProtoDecl(t); n.addChildren1(mods, header, def); - setDel(n, new GProtocolDeclDel()); + this.df.GProtoDecl(n); return n; } + + // TODO: ProtoModList, etc. @Override public GProtoHeader GProtocolHeader(Token t, GProtoNameNode name, @@ -349,7 +340,7 @@ public GProtoHeader GProtocolHeader(Token t, GProtoNameNode name, t = newToken(t, ScribbleParser.GPROTOHEADER); GProtoHeader n = new GProtoHeader(t); n.addChildren1(name, ps, rs); - setDel(n, createDefaultDelegate()); + this.df.GProtoHeader(n); return n; } @@ -358,9 +349,8 @@ public RoleDeclList RoleDeclList(Token t, List ds) { t = newToken(t, ScribbleParser.ROLEDECL_LIST); RoleDeclList n = new RoleDeclList(t); - // Cf. Scribble.g children order n.addChildren1(ds); - setDel(n, new RoleDeclListDel()); + this.df.RoleDeclList(n); return n; } @@ -370,7 +360,7 @@ public RoleDecl RoleDecl(Token t, RoleNode r) t = newToken(t, ScribbleParser.ROLEDECL); RoleDecl n = new RoleDecl(t); n.addChildren1(r); - setDel(n, new RoleDeclDel()); + this.df.RoleDecl(n); return n; } @@ -380,9 +370,8 @@ public NonRoleParamDeclList NonRoleParamDeclList(Token t, { t =newToken(t, ScribbleParser.PARAMDECL_LIST); NonRoleParamDeclList n = new NonRoleParamDeclList(t); - // Cf. Scribble.g children order n.addChildren1(ds); - setDel(n, new NonRoleParamDeclListDel()); + this.df.NonRoleParamDeclList(n); return n; } @@ -391,9 +380,8 @@ public DataParamDecl DataParamDecl(Token t, DataParamNode p) { t = newToken(t, ScribbleParser.DATAPARAMDECL); DataParamDecl n = new DataParamDecl(t); - // Cf. Scribble.g children order n.addChildren1(p); - setDel(n, new NonRoleParamDeclDel()); + this.df.DataParamDecl(n); return n; } @@ -402,9 +390,8 @@ public SigParamDecl SigParamDecl(Token t, SigParamNode p) { t = newToken(t, ScribbleParser.SIGPARAMDECL); SigParamDecl n = new SigParamDecl(t); - // Cf. Scribble.g children order n.addChildren1(p); - setDel(n, new NonRoleParamDeclDel()); + this.df.SigParamDecl(n); return n; } @@ -414,7 +401,6 @@ public GProtoDef GProtoDef(Token t, GProtoBlock block) t = newToken(t, ScribbleParser.GPROTODEF); GProtoDef n = new GProtoDef(t); n.addChildren1(block); - setDel(n, new GProtocolDefDel()); return n; } @@ -424,7 +410,7 @@ public GProtoBlock GProtoBlock(Token t, GInteractionSeq seq) t = newToken(t, ScribbleParser.GPROTOBLOCK); GProtoBlock n = new GProtoBlock(t); n.addChildren1(seq); - setDel(n, new GProtocolBlockDel()); + this.df.GProtoBlock(n); return n; } @@ -434,7 +420,7 @@ public GInteractionSeq GInteractionSeq(Token t, List elems) t = newToken(t, ScribbleParser.GINTERSEQ); GInteractionSeq n = new GInteractionSeq(t); n.addChildren1(elems); - setDel(n, new GInteractionSeqDel()); + this.df.GInteractionSeq(n); return n; } @@ -444,7 +430,7 @@ public SigLitNode SigLitNode(Token t, OpNode op, PayElemList pay) t = newToken(t, ScribbleParser.SIG_LIT); SigLitNode n = new SigLitNode(t); n.addChildren1(op, pay); - setDel(n, createDefaultDelegate()); + this.df.SigLitNode(n); return n; } @@ -454,7 +440,7 @@ public PayElemList PayElemList(Token t, List> elems) t = newToken(t, ScribbleParser.PAYELEM_LIST); PayElemList n = new PayElemList(t); n.addChildren1(elems); - setDel(n, createDefaultDelegate()); + this.df.PayElemList(n); return n; } @@ -465,7 +451,7 @@ public UnaryPayElem UnaryPayElem(Token t, t = newToken(t, ScribbleParser.UNARY_PAYELEM); UnaryPayElem n = new UnaryPayElem<>(t); n.addChildren1(name); - setDel(n, createDefaultDelegate()); + this.df.UnaryPayElem(n); return n; } @@ -476,8 +462,7 @@ public GDelegPayElem GDelegPayElem(Token t, GProtoNameNode proto, t = newToken(t, ScribbleParser.DELEG_PAYELEM); GDelegPayElem n = new GDelegPayElem(t); n.addChildren1(proto, role); - //del(n, createDefaultDelegate()); - setDel(n, new GDelegationElemDel()); // FIXME: GDelegationElemDel + this.df.GDelegPayElem(n); return n; } @@ -487,7 +472,7 @@ public GConnect GConnect(Token t, RoleNode src, MsgNode msg, RoleNode dst) t = newToken(t, ScribbleParser.GCONNECT); GConnect n = new GConnect(t); n.addChildren1(msg, src, Stream.of(dst).collect(Collectors.toList())); - setDel(n, new GConnectDel()); + this.df.GConnect(n); return n; } @@ -497,7 +482,7 @@ public GDisconnect GDisconnect(Token t, RoleNode left, RoleNode right) t = newToken(t, ScribbleParser.GDCONN); GDisconnect n = new GDisconnect(t); n.addChildren1(left, right); - setDel(n, new GDisconnectDel()); + this.df.GDisconnect(n); return n; } @@ -508,7 +493,7 @@ public GMsgTransfer GMsgTransfer(Token t, RoleNode src, MsgNode msg, t = newToken(t, ScribbleParser.GMSGTRANSFER); GMsgTransfer n = new GMsgTransfer(t); n.addChildren1(msg, src, dsts); - setDel(n, new GMessageTransferDel()); + this.df.GMsgTransfer(n); return n; } @@ -518,7 +503,7 @@ public GWrap GWrap(Token t, RoleNode src, RoleNode dst) t = newToken(t, ScribbleParser.GWRAP); GWrap n = new GWrap(t); n.addChildren1(src, dst); - setDel(n, new GWrapDel()); + this.df.GWrap(n); return n; } @@ -528,7 +513,7 @@ public GContinue GContinue(Token t, RecVarNode rv) t = newToken(t, ScribbleParser.GCONTINUE); GContinue n = new GContinue(t); n.addChildren1(rv); - setDel(n, new GContinueDel()); + this.df.GContinue(n); return n; } @@ -539,7 +524,7 @@ public GDo GDo(Token t, RoleArgList rs, NonRoleArgList as, t = newToken(t, ScribbleParser.GDO); GDo n = new GDo(t); n.addChildren1(proto, as, rs); - setDel(n, new GDoDel()); + this.df.GDo(n); return n; } @@ -549,7 +534,7 @@ public RoleArgList RoleArgList(Token t, List rs) t = newToken(t, ScribbleParser.ROLEARG_LIST); RoleArgList n = new RoleArgList(t); n.addChildren1(rs); - setDel(n, new RoleArgListDel()); + this.df.RoleArgList(n); return n; } @@ -559,7 +544,7 @@ public RoleArg RoleArg(Token t, RoleNode r) t = newToken(t, ScribbleParser.ROLEARG); RoleArg n = new RoleArg(t); n.addChildren1(r); - setDel(n, createDefaultDelegate()); + this.df.RoleArg(n); return n; } @@ -569,7 +554,7 @@ public NonRoleArgList NonRoleArgList(Token t, List as) t = newToken(t, ScribbleParser.NONROLEARG_LIST); NonRoleArgList n = new NonRoleArgList(t); n.addChildren1(as); - setDel(n, new NonRoleArgListDel()); + this.df.NonRoleArgList(n); return n; } @@ -579,7 +564,7 @@ public NonRoleArg NonRoleArg(Token t, NonRoleArgNode arg) t = newToken(t, ScribbleParser.NONROLEARG); NonRoleArg n = new NonRoleArg(t); n.addChildren1(arg); - setDel(n, createDefaultDelegate()); + this.df.NonRoleArg(n); return n; } @@ -589,7 +574,7 @@ public GChoice GChoice(Token t, RoleNode subj, List blocks) t = newToken(t, ScribbleParser.GCHOICE); GChoice n = new GChoice(t); n.addChildren1(subj, blocks); - setDel(n, new GChoiceDel()); + this.df.GChoice(n); return n; } @@ -599,7 +584,7 @@ public GRecursion GRecursion(Token t, RecVarNode rv, GProtoBlock block) t = newToken(t, ScribbleParser.GRECURSION); GRecursion n = new GRecursion(t); n.addChildren1(rv, block); - setDel(n, new GRecursionDel()); + this.df.GRecursion(n); return n; } } diff --git a/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java index af25b071d..8dd3381cf 100644 --- a/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java @@ -38,6 +38,7 @@ import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; import org.scribble.ast.global.GContinue; +import org.scribble.ast.global.GDelegPayElem; import org.scribble.ast.global.GDisconnect; import org.scribble.ast.global.GDo; import org.scribble.ast.global.GInteractionSeq; @@ -47,6 +48,7 @@ import org.scribble.ast.global.GProtoDef; import org.scribble.ast.global.GProtoHeader; import org.scribble.ast.global.GRecursion; +import org.scribble.ast.global.GWrap; import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.ast.name.qualified.LProtoNameNode; @@ -63,16 +65,18 @@ import org.scribble.del.global.GChoiceDel; import org.scribble.del.global.GConnectDel; import org.scribble.del.global.GContinueDel; +import org.scribble.del.global.GDelegationElemDel; import org.scribble.del.global.GDisconnectDel; import org.scribble.del.global.GDoDel; import org.scribble.del.global.GInteractionSeqDel; import org.scribble.del.global.GMessageTransferDel; -import org.scribble.del.global.GProtocolBlockDel; -import org.scribble.del.global.GProtocolDeclDel; -import org.scribble.del.global.GProtocolDefDel; +import org.scribble.del.global.GProtoBlockDel; +import org.scribble.del.global.GProtoDeclDel; +import org.scribble.del.global.GProtoDefDel; import org.scribble.del.global.GRecursionDel; -import org.scribble.del.name.qualified.DataTypeNodeDel; -import org.scribble.del.name.qualified.MessageSigNameNodeDel; +import org.scribble.del.global.GWrapDel; +import org.scribble.del.name.qualified.DataNameNodeDel; +import org.scribble.del.name.qualified.SigNameNodeDel; import org.scribble.del.name.simple.AmbigNameNodeDel; import org.scribble.del.name.simple.NonRoleParamNodeDel; import org.scribble.del.name.simple.RecVarNodeDel; @@ -88,7 +92,7 @@ public DelFactoryImpl() } - protected ScribDel createDefaultDelegate() + protected ScribDel createDefaultDel() { return new DefaultDel(); } @@ -102,13 +106,13 @@ protected static void setDel(ScribNodeBase n, ScribDel del) @Override public void IdNode(IdNode n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); // Necessary? } @Override public void ExtIdNode(ExtIdNode n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); // Necessary? } @Override @@ -126,7 +130,7 @@ public void DataParamNode(DataParamNode n) @Override public void OpNode(OpNode n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); } @Override @@ -150,31 +154,31 @@ public void SigParamNode(SigParamNode n) @Override public void DataNameNode(DataNameNode n) { - setDel(n, new DataTypeNodeDel()); + setDel(n, new DataNameNodeDel()); } @Override public void GProtoNameNode(GProtoNameNode n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); } @Override public void LProtoNameNode(LProtoNameNode n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); } @Override public void ModuleNameNode(ModuleNameNode n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); } @Override public void SigNameNode(SigNameNode n) { - setDel(n, new MessageSigNameNodeDel()); + setDel(n, new SigNameNodeDel()); } @Override @@ -186,7 +190,7 @@ public void Module(Module n) @Override public void ModuleDecl(ModuleDecl n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); } @Override @@ -198,43 +202,43 @@ public void ImportModule(ImportModule n) @Override public void DataDecl(DataDecl n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); } @Override public void SigDecl(SigDecl n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); } @Override public void GProtoDecl(GProtoDecl n) { - setDel(n, new GProtocolDeclDel()); + setDel(n, new GProtoDeclDel()); } @Override public void ProtoModList(ProtoModList n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); } @Override public void AuxMod(AuxMod n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); } @Override public void ExplicitMod(ExplicitMod n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); } @Override public void GProtoHeader(GProtoHeader n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); } @Override @@ -270,13 +274,13 @@ public void SigParamDecl(SigParamDecl sd) @Override public void GProtoDef(GProtoDef n) { - setDel(n, new GProtocolDefDel()); + setDel(n, new GProtoDefDel()); } @Override public void GProtoBlock(GProtoBlock n) { - setDel(n, new GProtocolBlockDel()); + setDel(n, new GProtoBlockDel()); } @Override @@ -288,32 +292,30 @@ public void GInteractionSeq(GInteractionSeq n) @Override public void SigLitNode(SigLitNode n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); } @Override public void PayElemList(PayElemList n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); //setDel(pay, new PayloadElemListDel()); } @Override public void UnaryPayElem(UnaryPayElem n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); } - /*@Override - public GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role) + @Override + public void GDelegPayElem(GDelegPayElem n) { - GDelegationElem de = new GDelegationElem(source, proto, role); - //de = del(de, createDefaultDelegate()); - de = setDel(de, new GDelegationElemDel()); // FIXME: GDelegationElemDel - return de; + //setDel(n, createDefaultDelegate()); + setDel(n, new GDelegationElemDel()); } - @Override + /*@Override public LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode proto) { LDelegationElem de = new LDelegationElem(source, proto); @@ -339,13 +341,11 @@ public void GMsgTransfer(GMsgTransfer n) setDel(n, new GMessageTransferDel()); } - /*@Override - public GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest) + @Override + public void GWrap(GWrap n) { - GWrap gw = new GWrap(source, UnitMessageSigNode(), src, dest); - gw = setDel(gw, new GWrapDel()); - return gw; - }*/ + setDel(n, new GWrapDel()); + } @Override public void GContinue(GContinue n) @@ -368,7 +368,7 @@ public void RoleArgList(RoleArgList n) @Override public void RoleArg(RoleArg n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); } @Override @@ -380,7 +380,7 @@ public void NonRoleArgList(NonRoleArgList n) @Override public void NonRoleArg(NonRoleArg n) { - setDel(n, createDefaultDelegate()); + setDel(n, createDefaultDel()); } @Override From 356230e4d7a740af460d1e6ee54abc5e43c918b9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 17:31:13 +0100 Subject: [PATCH 299/539] Refined special case check in MState.addEdge for recursive non-det paths of length one. --- .../src/main/java/org/scribble/job/Job.java | 38 +++++++++---------- .../java/org/scribble/core/model/MState.java | 28 +++++++------- .../scribble/core/model/endpoint/EState.java | 2 +- scribble-test/src/test/scrib/tmp/Test.scr | 22 +++++------ 4 files changed, 44 insertions(+), 46 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 17a0dfa90..8ea535efc 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -81,23 +81,6 @@ protected Core newCore(ModuleName mainFullname, Map args, imeds); } - // First run Visitor passes, then call toJob - // Base implementation: ambigname disamb pass only - public void runPasses() throws ScribException - { - verbosePrintPass("Starting Job passes on:"); - for (ModuleName fullname : this.context.getFullModuleNames()) - { - verbosePrintln(this.context.getModule(fullname).toString()); - } - - // Disamb is a "leftover" aspect of parsing -- so not in core - // N.B. disamb is mainly w.r.t. ambignames -- e.g., doesn't fully qualify names (currently mainly done by imed translation) - // CHECKME: disamb also currently does checks like do-arg kind and arity -- refactor into core? -- also does, e.g., distinct roledecls, protodecls, etc. - runVisitorPassOnAllModules(new DelDecorator(this, this.config.df)); // Includes validating names used in subprotocol calls.. - runVisitorPassOnAllModules(new NameDisambiguator(this)); // Includes validating names used in subprotocol calls.. - } - // "Finalises" this Job -- initialises the Job at this point, and cannot run futher Visitor passes on Job // So, typically, Job passes should be finished before calling this // Core passes may subsequently mutate Core(Context) though @@ -129,9 +112,21 @@ public final Core getCore() throws ScribException return this.core; } - public JobContext getContext() + // First run Visitor passes, then call toJob + // Base implementation: ambigname disamb pass only + public void runPasses() throws ScribException { - return this.context; + verbosePrintPass("Starting Job passes on:"); + for (ModuleName fullname : this.context.getFullModuleNames()) + { + verbosePrintln(this.context.getModule(fullname).toString()); + } + + // Disamb is a "leftover" aspect of parsing -- so not in core + // N.B. disamb is mainly w.r.t. ambignames -- e.g., doesn't fully qualify names (currently mainly done by imed translation) + // CHECKME: disamb also currently does checks like do-arg kind and arity -- refactor into core? -- also does, e.g., distinct roledecls, protodecls, etc. + runVisitorPassOnAllModules(new DelDecorator(this, this.config.df)); // Includes validating names used in subprotocol calls.. + runVisitorPassOnAllModules(new NameDisambiguator(this)); // Includes validating names used in subprotocol calls.. } public void runVisitorPassOnAllModules(AstVisitor v) throws ScribException @@ -184,4 +179,9 @@ public void warningPrintln(String s) { System.err.println("[Warning] " + s); } + + public JobContext getContext() + { + return this.context; + } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/MState.java b/scribble-core/src/main/java/org/scribble/core/model/MState.java index 035dbe3c0..78f152159 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MState.java @@ -37,19 +37,14 @@ public abstract class MState K extends ProtoKind // Global/Local > { - private static int count = 1; + private static int count = 1; // A shared index counter for every single MState (and subclass) instance public final int id; protected final Set labs; // Was RecVar and SubprotocolSigs, now using inlined protocol for FSM building so just RecVar - - // **: clients should use the pair of getAllAcceptable/getSuccessors for correctness -- getAcceptable/accept don't support non-det - //protected final LinkedHashMap edges; // Want predictable ordering of entries for e.g. API generation (state enumeration)*/ protected final List actions; protected final List succs; - //Pair ? rename getAll... - public MState(Set labs) // Immutable singleton node { this.id = MState.count++; @@ -71,18 +66,21 @@ public final Set getLabels() // Mutable (can also overwrite edges) protected void addEdge(A a, S s) { - //this.edges.put(a, s); - Iterator as = this.actions.iterator(); // Needed?.. - Iterator ss = this.succs.iterator(); - while (as.hasNext()) // Duplicate edges preemptively pruned here, but could leave to later minimisation + if (this.equals(s)) // CHECKME: refactor unfair transform to eliminate this special case { - A tmpa = as.next(); - S tmps = ss.next(); - if (tmpa.equals(a) && tmps.equals(s)) + // Needed? -- seems so, for the unfair transform (specifically for recursive non-det paths of length 1, see good.efsm.gchoice.Test09) + Iterator as = this.actions.iterator(); + Iterator ss = this.succs.iterator(); + while (as.hasNext()) // Duplicate edges preemptively pruned here, but could leave to later minimisation { - return; + A tmpa = as.next(); + S tmps = ss.next(); + if (tmpa.equals(a) && tmps.equals(s)) + { + return; + } } - } // ..needed? + } this.actions.add(a); this.succs.add(s); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index db250f4e3..b75e478ad 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -243,7 +243,7 @@ public EState unfairTransform(ModelFactory ef) todo.add(e.getValue()); seen.add(e.getValue());*/ curr.addEdge(a, s); - todo.add(s); // Doesn't work if non-det preserved by unfairClone aux (recursively edges>1) + todo.add(s); // Doesn't work if non-det preserved by the "unfairClone" aux (recursively edges>1) /*seen.add(s); // Idea is to bypass succ clone (for non-det, edges>1) but in general this will be cloned again before returning to it, so bypass doesn't work -- to solve this more generally probably need to keep a record of all clones to bypass future clones todo.addAll(s.getSuccessors());*/ } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 5645649e2..e12d3f582 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -108,17 +108,17 @@ data "..." from "..." as T; global protocol Proto1(role A, role B) { - do Proto1Aux(A, B); -} - -aux global protocol Proto1Aux(role A, role B) -{ - do Proto2(A, B); -} - -aux global protocol Proto2(role A, role B) -{ - () from B to A; + choice at A + { + 1() from A to B; + //2() from A to B; + } + or + { + 1() from A to B; + //3() from A to B; + } + do Proto1(A, B); } From f84934af1fa20fc0108281f2de1eeb944d3e30b4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 17:38:04 +0100 Subject: [PATCH 300/539] [AllTest] Minor bug fix to MState.getReachableActions. --- .../main/java/org/scribble/core/model/MState.java | 13 ++++++------- .../org/scribble/core/model/endpoint/EState.java | 4 ++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/MState.java b/scribble-core/src/main/java/org/scribble/core/model/MState.java index 78f152159..d4eee749c 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MState.java @@ -27,7 +27,6 @@ import org.scribble.core.type.kind.ProtoKind; import org.scribble.util.RuntimeScribException; -import org.scribble.util.ScribException; public abstract class MState < @@ -85,7 +84,9 @@ protected void addEdge(A a, S s) this.succs.add(s); } - protected final void removeEdge(A a, S s) throws ScribException + // Pre: (this, a, s) is a current edge + protected final void removeEdge(A a, S s) + //throws ScribException // CHECKME: used? -- cf., Hack? EFSM building on bad-reachability protocols now done before actual reachability check { Iterator ia = this.actions.iterator(); Iterator is = this.succs.iterator(); @@ -100,10 +101,7 @@ protected final void removeEdge(A a, S s) throws ScribException return; } } - //throw new RuntimeException("No such transition to remove: " + a + "->" + s); - throw new ScribException( - "No such transition to remove: " + a + "->" + s); - // Hack? EFSM building on bad-reachability protocols now done before actual reachability check + throw new RuntimeException("No such transition: " + a + "->" + s); } // The "deterministic" variant, cf., getAllActions @@ -211,9 +209,10 @@ public S getTerminal() return terms.isEmpty() //.isPresent() ? null : terms.iterator().next(); // CHECKME: return empty Set instead of null? } + public Set getReachableActions() { - return getReachableStates().stream().flatMap(x -> x.getActions().stream()) + return getReachableStates().stream().flatMap(x -> x.getAllActions().stream()) .collect(Collectors.toSet()); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index b75e478ad..74d0ea9f1 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -221,7 +221,7 @@ public EState unfairTransform(ModelFactory ef) }*/ for (EState s : toRemove.keySet()) { - try + //try { //curr.removeEdge(toRemove.get(s), s); for (EAction tmp : toRemove.get(s)) @@ -229,7 +229,7 @@ public EState unfairTransform(ModelFactory ef) curr.removeEdge(tmp, s); } } - catch (ScribException e) { throw new RuntimeException(e); } + //catch (ScribException e) { throw new RuntimeException(e); } } //for (Entry e : clones.entrySet()) Iterator icloneas = cloneas.iterator(); From b96f0d1f388debb424b7b77dcabc0ce14ac173a5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 17:43:06 +0100 Subject: [PATCH 301/539] [AllTest] Minor. --- .../callbackapi/CBEndpointApiGenerator.java | 16 +++---- .../callbackapi/CBEndpointApiGenerator3.java | 28 ++++++------ .../java/statechanapi/AcceptSockGen.java | 2 +- .../java/statechanapi/BranchSockGen.java | 16 +++---- .../java/statechanapi/CaseSockGen.java | 2 +- .../java/statechanapi/HandlerIfaceGen.java | 2 +- .../java/statechanapi/OutputSockGen.java | 2 +- .../java/statechanapi/ReceiveSockGen.java | 2 +- .../StateChannelApiGenerator.java | 4 +- .../statechanapi/ioifaces/BranchIfaceGen.java | 6 +-- .../statechanapi/ioifaces/CaseIfaceGen.java | 4 +- .../statechanapi/ioifaces/HandleIfaceGen.java | 8 ++-- .../ioifaces/IOInterfacesGenerator.java | 18 ++++---- .../ioifaces/IOStateIfaceGen.java | 6 +-- .../ioifaces/ReceiveIfaceGen.java | 4 +- .../statechanapi/ioifaces/SelectIfaceGen.java | 2 +- .../statetype/STBranchStateBuilder.java | 2 +- .../codegen/statetype/STCaseBuilder.java | 2 +- .../statetype/STOutputStateBuilder.java | 2 +- .../statetype/STReceiveStateBuilder.java | 2 +- .../org/scribble/core/model/MPrettyState.java | 4 +- .../java/org/scribble/core/model/MState.java | 43 +++++++++---------- .../scribble/core/model/endpoint/EFSM.java | 2 +- .../model/endpoint/EGraphBuilderUtil.java | 6 +-- .../scribble/core/model/endpoint/EState.java | 22 +++++----- .../scribble/core/model/global/SBuffers.java | 2 +- .../scribble/core/model/global/SGraph.java | 6 +-- .../scribble/core/model/global/SModel.java | 2 +- .../core/visit/local/EGraphBuilder.java | 4 +- 29 files changed, 110 insertions(+), 111 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 521487294..d53c699d5 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -189,13 +189,13 @@ public Map buildEndpointClass() throws ScribException stateClass += "\n"; stateClass += "public final class " + stateId + " extends " + stateKind + " {\n"; stateClass += "public static final " + stateId + " id = new " + stateId + "(" - + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + s.getActions().get(0).peer + "." + s.getActions().get(0).peer : "") + + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + s.getDetActions().get(0).peer + "." + s.getDetActions().get(0).peer : "") + ");\n"; stateClass += "private " + stateId + "(" + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? "org.scribble.type.name.Role peer" : "") + ") {\n"; stateClass += ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? "super(\"" + stateId + "\", peer);" : "super(\"" + stateId + "\");") + "\n"; - for (EAction a : s.getAllActions()) + for (EAction a : s.getActions()) { stateClass += "this.succs.put(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ", " @@ -218,7 +218,7 @@ public Map buildEndpointClass() throws ScribException // FIXME: generate lattice -- cf. original handler i/f's (with "subtyping") String messageIfName = name + //a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()); - s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); + s.getDetActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); String messageInterface = ""; messageInterface += "package " + pack + ".handlers.states." + this.self + ".messages.interfaces;\n"; messageInterface += "\n"; @@ -239,7 +239,7 @@ public Map buildEndpointClass() throws ScribException messageAbstract += "}\n"; res.put(mprefix + messageAbstractName + ".java", messageAbstract); - for (EAction a : s.getAllActions()) + for (EAction a : s.getActions()) { /*String messageIfName = name + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining()); String messageInterface = ""; @@ -361,7 +361,7 @@ public Map buildEndpointClass() throws ScribException branchAbstract += ""; branchAbstract += "public abstract class " + branchName + " implements org.scribble.runtime.handlers.ScribBranch"; - branchAbstract += s.getAllActions().stream() + branchAbstract += s.getActions().stream() .map(a -> ", " + pack + ".handlers." + this.self + ".interfaces." + name + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) @@ -404,7 +404,7 @@ public Map buildEndpointClass() throws ScribException branchAbstract += "@Override\n"; branchAbstract += "public void dispatch(D data, org.scribble.runtime.message.ScribMessage m) {\n"; branchAbstract += "switch (m.op.toString()) {\n"; - for (EAction a : s.getAllActions()) + for (EAction a : s.getActions()) { String receiveIfName = name + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems @@ -552,7 +552,7 @@ private String generateRegister(GProtoName gpn, Role self, EState s) res += "\n"; }*/ String messageIfName = name + - s.getActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); + s.getDetActions().stream().map(a -> "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining())).collect(Collectors.joining()); res += "public\n" + "\n" // FIXME: factor out + name + " icallback(" + prefix + name + "_" + s.id @@ -589,7 +589,7 @@ private String generateRegister(GProtoName gpn, Role self, EState s) res += "return icallback(sid, b);\n"; res += "}\n"; res += "\n"; - String T = s.getAllActions().stream().map(a -> SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + ".interfaces." + name + "__" + a.peer + "_" + String T = s.getActions().stream().map(a -> SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".handlers." + this.self + ".interfaces." + name + "__" + a.peer + "_" + SessionApiGenerator.getOpClassName(a.mid) + a.payload.elems.stream().map(e -> "_" + e).collect(Collectors.joining("")) + "").collect(Collectors.joining(" & ")) + " & org.scribble.runtime.handlers.ScribBranch"; res += "public " + "\n" diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 7194f51ef..c51769b10 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -141,7 +141,7 @@ public Map buildEndpointClass() throws ScribException Map>> reg = new HashMap<>(); // e.g., Proto1_A__B__1_Int -> { Proto1_A__B__1_Int__C__2_Int__C__4_Str, ... } for (EState s : (Iterable) states.stream().filter(x -> x.getStateKind() == EStateKind.OUTPUT)::iterator) { - List as = s.getAllActions(); + List as = s.getActions(); Set set = as.stream().map(this.getCallbackSuffix).collect(Collectors.toSet()); for (EAction a : as) { @@ -230,7 +230,7 @@ public Map buildEndpointClass() throws ScribException String bprefix = getHandlersSelfPackage().replace('.', '/') + "/"; String branchName = this.stateNames.get(s.id) + "_Branch"; - for (EAction a : s.getAllActions()) + for (EAction a : s.getActions()) { // FIXME: factor out boolean isSig = main.getNonProtoDeclChildren().stream() @@ -376,10 +376,10 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, icallback.addModifiers("public"); icallback.setReturn(endpointName + ""); String iface = getHandlersSelfPackage() - + ((s.getAllActions().size() > 1) ? ".outputs.choices.Select" : ".outputs.OCallback") // FIXME: factor out + + ((s.getActions().size() > 1) ? ".outputs.choices.Select" : ".outputs.OCallback") // FIXME: factor out //+ endpointName + "_" + this.self - + s.getAllActions().stream().sorted(Comparator.comparing(a -> a.toString())) + + s.getActions().stream().sorted(Comparator.comparing(a -> a.toString())) .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out icallback.addTypeParameters("T extends " + iface + " & org.scribble.runtime.handlers.ScribOutputEvent"); icallback.addParameters(getStatesSelfPackage() + "." + this.stateNames.get(s.id) + " sid", // FIXME: factor out @@ -408,7 +408,7 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, MethodBuilder icallback = endpointClass.newMethod("icallback"); icallback.addModifiers("public"); icallback.setReturn(endpointName + ""); - String typepar = s.getAllActions().stream().map(a -> + String typepar = s.getActions().stream().map(a -> getHandlersSelfPackage() + ".inputs." //+ this.proto.getSimpleName() + "_" + this.self // i.e, endpointName + "ICallback" // FIXME: factor out @@ -533,11 +533,11 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, ? new String[] { "org.scribble.type.name.Role peer" } : new String[0];*/ ConstructorBuilder stateCons = stateClass.newConstructor(); stateCons.addModifiers("private"); - Role peer = (kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? s.getActions().iterator().next().peer : null; + Role peer = (kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? s.getDetActions().iterator().next().peer : null; stateCons.addBodyLine("super(\"" + stateName + "\"" + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? ", " + getRolesPackage() + "." + peer + "." + peer : "") // FIXME: factor out + ");"); - for (EAction a : s.getAllActions()) + for (EAction a : s.getActions()) { EState succ = s.getSuccessor(a); stateCons.addBodyLine("this.succs.put(" + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) // FIXME: factor out @@ -551,26 +551,26 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, if (s.getStateKind() == EStateKind.OUTPUT) // FIXME: factor out { - if (s.getActions().size() > 0) + if (s.getDetActions().size() > 0) { InterfaceBuilder messageIf = stateClass.newMemberInterface("Message"); // FIXME: factor out messageIf.addModifiers("public", "static"); messageIf.addInterfaces("org.scribble.runtime.handlers.ScribOutputEvent"); String iface = getHandlersSelfPackage() // FIXME: factor out with generateRegister - + ((s.getAllActions().size() > 1) ? ".outputs.choices.Select" : ".outputs.OCallback") // FIXME: factor out + + ((s.getActions().size() > 1) ? ".outputs.choices.Select" : ".outputs.OCallback") // FIXME: factor out //+ endpointName + "_" + this.self - + s.getAllActions().stream().sorted(Comparator.comparing(a -> a.toString())) + + s.getActions().stream().sorted(Comparator.comparing(a -> a.toString())) .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out messageIf.addInterfaces(iface); } - s.getAllActions().stream().map(a -> a.peer).distinct().forEach(r -> + s.getActions().stream().map(a -> a.peer).distinct().forEach(r -> { ClassBuilder roleClass = stateClass.newMemberClass(r.toString()); roleClass.addModifiers("public", "static"); ConstructorBuilder roleCons = roleClass.newConstructor(); roleCons.addModifiers("private"); - s.getAllActions().stream().filter(a -> a.peer.equals(r)).forEach(a -> + s.getActions().stream().filter(a -> a.peer.equals(r)).forEach(a -> { String opName = SessionApiGenerator.getOpClassName(a.mid); ClassBuilder opClass = roleClass.newMemberClass(opName); @@ -680,7 +680,7 @@ protected String generateBranch(String bprefix, JobContext jc, EState s, String branchAbstract += "package " + getHandlersSelfPackage() + ";\n"; branchAbstract += ""; branchAbstract += "public abstract class " + branchName + " implements org.scribble.runtime.handlers.ScribBranch"; - branchAbstract += s.getAllActions().stream().map(a -> + branchAbstract += s.getActions().stream().map(a -> ", " + getHandlersSelfPackage() + ".inputs." //+ endpointName + "ICallback" // FIXME: factor out @@ -693,7 +693,7 @@ protected String generateBranch(String bprefix, JobContext jc, EState s, String branchAbstract += "@Override\n"; branchAbstract += "public void dispatch(D data, org.scribble.runtime.message.ScribMessage m) {\n"; branchAbstract += "switch (m.op.toString()) {\n"; - for (EAction a : s.getAllActions()) + for (EAction a : s.getActions()) { // FIXME: factor out boolean isSig = jc.getMainModule().getNonProtoDeclChildren().stream() diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AcceptSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AcceptSockGen.java index 37ecf88b1..1424adffc 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AcceptSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AcceptSockGen.java @@ -45,7 +45,7 @@ protected void addImports() protected void addMethods() { //Set as = curr.getActions(); - List as = curr.getActions(); + List as = curr.getDetActions(); if (as.size() > 1) { throw new RuntimeException("AcceptSocket generation not yet supported for accept-branches: " + as); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java index 66a1f732a..befe0decd 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java @@ -74,7 +74,7 @@ protected void addMethods() throws ScribException //cb.addImports("java.util.concurrent.ExecutionException"); //boolean first; - Role peer = this.curr.getActions().iterator().next().obj; + Role peer = this.curr.getDetActions().iterator().next().obj; // Branch method addBranchMethod(ROLE_PARAM, MESSAGE_VAR, OPENUM_VAR, OP, peer, next, enumClass); @@ -85,7 +85,7 @@ protected void addMethods() throws ScribException EnumBuilder eb = cb.newMemberEnum(enumClass); eb.addModifiers(JavaBuilder.PUBLIC); eb.addInterfaces(OPENUM_INTERFACE); - this.curr.getActions().stream().forEach((a) -> eb.addValues(SessionApiGenerator.getOpClassName(a.mid))); + this.curr.getDetActions().stream().forEach((a) -> eb.addValues(SessionApiGenerator.getOpClassName(a.mid))); addDirectBranchCallbackMethod(ROLE_PARAM, MESSAGE_VAR, OP, main, peer); // Hack: callback apigen while i/o i/f's not supported for connect/accept/etc } @@ -105,7 +105,7 @@ private void addBranchMethod(final String ROLE_PARAM, final String MESSAGE_VAR, { MethodBuilder mb = cb.newMethod("branch"); mb.setReturn(next); - mb.addParameters(SessionApiGenerator.getRoleClassName(curr.getActions().iterator().next().obj) + " " + ROLE_PARAM); + mb.addParameters(SessionApiGenerator.getRoleClassName(curr.getDetActions().iterator().next().obj) + " " + ROLE_PARAM); mb.addModifiers(JavaBuilder.PUBLIC); mb.addExceptions(StateChannelApiGenerator.SCRIBBLERUNTIMEEXCEPTION_CLASS, "IOException", "ClassNotFoundException");//, "ExecutionException", "InterruptedException"); if (!this.apigen.skipIOInterfacesGeneration) @@ -117,7 +117,7 @@ private void addBranchMethod(final String ROLE_PARAM, final String MESSAGE_VAR, + JavaBuilder.SUPER + ".readScribMessage(" + getSessionApiRoleConstant(peer) + ");"); mb.addBodyLine(enumClass + " " + OPENUM_VAR + ";"); boolean first = true; - for (EAction a : this.curr.getActions()) + for (EAction a : this.curr.getDetActions()) { mb.addBodyLine(((first) ? "" : "else ") + "if (" + OP + ".equals(" + getSessionApiOpConstant(a.mid) + ")) {"); mb.addBodyLine(1, OPENUM_VAR + " = " @@ -146,7 +146,7 @@ private String addBranchCallbackMethod(final String ROLE_PARAM, Role peer) mb2.addExceptions(StateChannelApiGenerator.SCRIBBLERUNTIMEEXCEPTION_CLASS, "IOException", "ClassNotFoundException");//, "ExecutionException", "InterruptedException"); first = true; handleif += "<"; - for (EAction a : this.curr.getActions().stream().sorted(IOStateIfaceGen.IOACTION_COMPARATOR).collect(Collectors.toList())) + for (EAction a : this.curr.getDetActions().stream().sorted(IOStateIfaceGen.IOACTION_COMPARATOR).collect(Collectors.toList())) { if (first) { @@ -250,7 +250,7 @@ private void addHandleMethod(final String ROLE_PARAM, final String MESSAGE_VAR, MethodBuilder mb4 = this.cb.newMethod("handle"); mb4.addParameters(SessionApiGenerator.getRoleClassName(peer) + " " + ROLE_PARAM); String tmp = HandleIfaceGen.getHandleInterfaceName(this.apigen.getSelf(), this.curr) + "<"; - tmp += this.curr.getActions().stream().sorted(IOStateIfaceGen.IOACTION_COMPARATOR) + tmp += this.curr.getDetActions().stream().sorted(IOStateIfaceGen.IOACTION_COMPARATOR) .map((a) -> SuccessorIfaceGen.getSuccessorInterfaceName(a)).collect(Collectors.joining(", ")) + ">"; mb4.addParameters(tmp + " handler"); mb4.setReturn(JavaBuilder.VOID); @@ -260,7 +260,7 @@ private void addHandleMethod(final String ROLE_PARAM, final String MESSAGE_VAR, mb4.addBodyLine(StateChannelApiGenerator.SCRIBMESSAGE_CLASS + " " + MESSAGE_VAR + " = " + JavaBuilder.SUPER + ".readScribMessage(" + getSessionApiRoleConstant(peer) + ");"); first = true; - for (EAction a : this.curr.getActions()) + for (EAction a : this.curr.getDetActions()) { EState succ = this.curr.getSuccessor(a); if (first) @@ -347,7 +347,7 @@ private void addCallbackCases(MethodBuilder mb2, final String ROLE_PARAM, mb2.addBodyLine(StateChannelApiGenerator.SCRIBMESSAGE_CLASS + " " + MESSAGE_VAR + " = " + JavaBuilder.SUPER + ".readScribMessage(" + getSessionApiRoleConstant(peer) + ");"); first = true; - for (EAction a : this.curr.getActions()) + for (EAction a : this.curr.getDetActions()) { EState succ = this.curr.getSuccessor(a); if (first) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java index 6a087264d..3ec234ab3 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java @@ -92,7 +92,7 @@ protected void addMethods() throws ScribException fb2.addModifiers(JavaBuilder.PRIVATE, JavaBuilder.FINAL); fb2.setType(StateChannelApiGenerator.SCRIBMESSAGE_CLASS); - for (EAction a : this.curr.getActions()) + for (EAction a : this.curr.getDetActions()) { EState succ = this.curr.getSuccessor(a); addReceiveMethod(this.cb, a, succ); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java index 8293f6efe..c1285a1bf 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java @@ -52,7 +52,7 @@ public InterfaceBuilder generateType() throws ScribException ib.setName(getHandlerInterfaceName(this.parent.getName())); ib.addModifiers(InterfaceBuilder.PUBLIC); - for (EAction a : this.curr.getActions()) // Doesn't need to be sorted + for (EAction a : this.curr.getDetActions()) // Doesn't need to be sorted { EState succ = this.curr.getSuccessor(a); String nextClass = this.apigen.getSocketClassName(succ); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java index f7854d9a5..221e98f18 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java @@ -61,7 +61,7 @@ protected void addMethods() throws ScribException // Mixed sends and connects boolean hasConnect = false; boolean hasWrap = false; - for (EAction a : curr.getActions()) // (Scribble ensures all "a" are input or all are output) + for (EAction a : curr.getDetActions()) // (Scribble ensures all "a" are input or all are output) { EState succ = curr.getSuccessor(a); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java index 0018bcf86..72e300476 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java @@ -54,7 +54,7 @@ protected void addImports() @Override protected void addMethods() throws ScribException { - EAction a = curr.getActions().iterator().next(); + EAction a = curr.getDetActions().iterator().next(); //String nextClass = this.apigen.getSocketClassName(curr.accept(a)); EState succ = curr.getSuccessor(a); ClassBuilder futureClass = new InputFutureGen(this.apigen, this.cb, a).generateType(); // Wraps all payload elements as fields (set by future completion) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index ad7d470b9..77d965ed9 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -124,7 +124,7 @@ private void generateClassNames(EState ps) return; } this.classNames.put(ps, newSocketClassName()); - for (EState succ : ps.getAllSuccessors()) + for (EState succ : ps.getSuccessors()) { generateClassNames(succ); } @@ -147,7 +147,7 @@ private void constructClasses(EState curr) throws ScribException return; } this.types.put(className, constructClass(curr)); - for (EState succ : curr.getAllSuccessors()) + for (EState succ : curr.getSuccessors()) { constructClasses(succ); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java index a80333425..431ca279b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java @@ -49,7 +49,7 @@ protected void addBranchMethods() { Role self = this.apigen.getSelf(); //Set as = this.curr.getActions(); - List as = this.curr.getActions(); + List as = this.curr.getDetActions(); // FIXME: factor out with BranchSocketGenerator AbstractMethodBuilder bra = this.ib.newAbstractMethod("branch"); @@ -84,7 +84,7 @@ protected void addBranchEnum() EnumBuilder eb = this.ib.newMemberEnum(getBranchInterfaceEnumName(self, this.curr)); eb.addModifiers(JavaBuilder.PUBLIC); eb.addInterfaces(ScribSockGen.OPENUM_INTERFACE); - this.curr.getActions().stream().forEach((a) -> eb.addValues(SessionApiGenerator.getOpClassName(a.mid))); + this.curr.getDetActions().stream().forEach((a) -> eb.addValues(SessionApiGenerator.getOpClassName(a.mid))); } // Don't add Action Interfaces (added to CaseInterface) @@ -92,7 +92,7 @@ protected void addBranchEnum() protected void addSuccessorParamsAndActionInterfaces() { int i = 1; - for (EAction a : this.curr.getActions().stream().sorted(IOACTION_COMPARATOR).collect(Collectors.toList())) + for (EAction a : this.curr.getDetActions().stream().sorted(IOACTION_COMPARATOR).collect(Collectors.toList())) { this.ib.addParameters("__Succ" + i + " extends " + SuccessorIfaceGen.getSuccessorInterfaceName(a)); i++; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java index d758c0a44..46a5719c1 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java @@ -78,7 +78,7 @@ protected void addCaseReceiveDiscardMethods() { GProtoName gpn = this.apigen.getGProtocolName(); //Set as = this.curr.getActions(); - List as = this.curr.getActions(); + List as = this.curr.getDetActions(); int i = 1; this.ib.addImports(SessionApiGenerator.getOpsPackageName(gpn) + ".*"); @@ -105,7 +105,7 @@ protected void addCaseReceiveDiscardMethods() protected static String getCasesInterfaceName(Role self, EState s) { //return "Case_" + braif.substring("Branch_".length(), braif.length()); - return "Case_" + self + "_" + s.getActions().stream().sorted(IOACTION_COMPARATOR) + return "Case_" + self + "_" + s.getDetActions().stream().sorted(IOACTION_COMPARATOR) .map((a) -> ActionIfaceGen.getActionString(a)).collect(Collectors.joining("__")); } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java index 90fda540f..e84fb1266 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/HandleIfaceGen.java @@ -78,7 +78,7 @@ protected void addSuccessorParamsAndActionInterfaces() int i = 1; //for (IOAction a : getHandleInterfaceIOActionParams(this.curr)) // Branch successor state successors, not the "direct" successors // Duplicated from BranchInterfaceGenerator - for (EAction a : this.curr.getActions().stream().sorted(IOACTION_COMPARATOR).collect(Collectors.toList())) + for (EAction a : this.curr.getDetActions().stream().sorted(IOACTION_COMPARATOR).collect(Collectors.toList())) { this.ib.addParameters("__Succ" + i + " extends " + SuccessorIfaceGen.getSuccessorInterfaceName(a)); this.ib.addInterfaces(this.caseActions.get(a).getName() + "<__Succ" + i + ">"); @@ -119,7 +119,7 @@ protected void addHandleMethods() throws ScribException GProtoName gpn = this.apigen.getGProtocolName(); //Role self = this.apigen.getSelf(); //Set as = this.curr.getActions(); - List as = this.curr.getActions(); + List as = this.curr.getDetActions(); this.ib.addImports(SessionApiGenerator.getOpsPackageName(gpn) + ".*"); int i = 1; @@ -173,7 +173,7 @@ protected static void setHandleMethodSuccessorParam(IOInterfacesGenerator iogen, //Map ount = new HashMap<>(); boolean first = true; - for (EAction a : succ.getActions().stream().sorted(IOStateIfaceGen.IOACTION_COMPARATOR).collect(Collectors.toList())) + for (EAction a : succ.getDetActions().stream().sorted(IOStateIfaceGen.IOACTION_COMPARATOR).collect(Collectors.toList())) { int offset; if (!count.containsKey(a)) @@ -206,7 +206,7 @@ protected static void setHandleMethodSuccessorParam(IOInterfacesGenerator iogen, public static String getHandleInterfaceName(Role self, EState s) { // FIXME: factor out (CaseInterfaceGenerator, IOStateInterfaceGenerator.getIOStateInterfaceName) - String name = "Handle_" + self + "_" + s.getActions().stream().sorted(IOACTION_COMPARATOR) + String name = "Handle_" + self + "_" + s.getDetActions().stream().sorted(IOACTION_COMPARATOR) .map((a) -> ActionIfaceGen.getActionString(a)).collect(Collectors.joining("__")); IOStateIfaceGen.checkIOStateInterfaceNameLength(name); return name; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index 89ac6328a..38b40fa82 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -209,7 +209,7 @@ private void generateActionAndSuccessorInterfacesAndCollectPreActions(Set as = s.getActions(); - List as = s.getActions(); + List as = s.getDetActions(); for (EAction a : as.stream().sorted(IOStateIfaceGen.IOACTION_COMPARATOR).collect(Collectors.toList())) { if (!a.isSend() && !a.isReceive()) // TODO (connect/disconnect) @@ -296,7 +296,7 @@ private void generateIOStateInterfacesFirstPass(Set visited, EState s) t } visited.add(s); - for (EAction a : s.getActions()) + for (EAction a : s.getDetActions()) { generateIOStateInterfacesFirstPass(visited, s.getSuccessor(a)); } @@ -350,7 +350,7 @@ private void generateIOStateInterfacesSecondPass(Set visited, EState s) } visited.add(s); - for (EAction a : s.getActions()) + for (EAction a : s.getDetActions()) { generateIOStateInterfacesSecondPass(visited, s.getSuccessor(a)); } @@ -375,7 +375,7 @@ private void generateHandleInterfaces(Set visited, EState s) throws Scri } visited.add(s); - for (EAction a : s.getActions()) + for (EAction a : s.getDetActions()) { generateHandleInterfaces(visited, s.getSuccessor(a)); } @@ -449,7 +449,7 @@ private void generateHandleInterfacesSecondPass(Set visited, EState s) } visited.add(s); - for (EAction a : s.getActions()) + for (EAction a : s.getDetActions()) { generateHandleInterfacesSecondPass(visited, s.getSuccessor(a)); } @@ -525,7 +525,7 @@ private void addIOStateInterfacesToStateChannels(Set visited, EState s) System.out.println("BBB: " + handle);*/ //for (IOAction a : this.branchSuccs.get(handle)) // FIXME: move back into HandlerInterfaceGenerator - for (EAction a : s.getActions().stream().sorted(IOStateIfaceGen.IOACTION_COMPARATOR).collect(Collectors.toList())) + for (EAction a : s.getDetActions().stream().sorted(IOStateIfaceGen.IOACTION_COMPARATOR).collect(Collectors.toList())) { if (first) { @@ -635,7 +635,7 @@ private void addIOStateInterfacesToStateChannels(Set visited, EState s) } visited.add(s); - for (EAction a : s.getActions()) + for (EAction a : s.getDetActions()) { addIOStateInterfacesToStateChannels(visited, s.getSuccessor(a)); } @@ -932,7 +932,7 @@ private static MethodBuilder addEndSocketToCastMethod(ClassBuilder cb, String re private String getConcreteSuccessorParameters(EState s) { return "<" + - s.getActions().stream().sorted(IOStateIfaceGen.IOACTION_COMPARATOR) + s.getDetActions().stream().sorted(IOStateIfaceGen.IOACTION_COMPARATOR) .map((a) -> this.getSuccName.apply(s.getSuccessor(a))).collect(Collectors.joining(", ")) + ">"; } @@ -985,7 +985,7 @@ private void collectBranchSuccs() String key = HandleIfaceGen.getHandleInterfaceName(self, s); // HandleInterface name List curr1 = new LinkedList<>(); - this.branchPostActions.get(s).forEach((a) -> curr1.addAll(s.getSuccessor(a).getActions())); // TODO: flatmap + this.branchPostActions.get(s).forEach((a) -> curr1.addAll(s.getSuccessor(a).getDetActions())); // TODO: flatmap //List curr2 = curr1.stream().sorted(IOStateInterfaceGenerator.IOACTION_COMPARATOR).collect(Collectors.toList()); List tmp = this.branchSuccs.get(key); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java index e7600d1d1..2ab5a19e9 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java @@ -89,7 +89,7 @@ protected void addCastField() { String ifname = getIOStateInterfaceName(this.apigen.getSelf(), this.curr); //Set as = this.curr.getActions(); - List as = this.curr.getActions(); + List as = this.curr.getDetActions(); FieldBuilder cast = this.ib.newField("cast"); cast.addModifiers(TypeBuilder.PUBLIC, TypeBuilder.STATIC, TypeBuilder.FINAL); @@ -100,7 +100,7 @@ protected void addCastField() protected void addSuccessorParamsAndActionInterfaces() { int i = 1; - for (EAction a : this.curr.getActions().stream().sorted(IOACTION_COMPARATOR).collect(Collectors.toList())) + for (EAction a : this.curr.getDetActions().stream().sorted(IOACTION_COMPARATOR).collect(Collectors.toList())) { if (a.isSend() || a.isReceive()) // HACK FIXME { @@ -137,7 +137,7 @@ public static String getIOStateInterfaceName(Role self, EState s) case TERMINAL: throw new RuntimeScribException("Shouldn't get in here: " + s); default: throw new RuntimeException("(TODO) I/O interface generation: " + s.getStateKind()); } - name = name + "_" + self + "_" + s.getActions().stream().sorted(IOACTION_COMPARATOR) + name = name + "_" + self + "_" + s.getDetActions().stream().sorted(IOACTION_COMPARATOR) .map((a) -> ActionIfaceGen.getActionString(a)).collect(Collectors.joining("__")); checkIOStateInterfaceNameLength(name); return name; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java index e3961aa2b..af57548f9 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java @@ -37,7 +37,7 @@ public ReceiveIfaceGen(StateChannelApiGenerator apigen, Map !a.isReceive())) // TODO (connect/disconnect) + if (this.curr.getActions().stream().anyMatch((a) -> !a.isReceive())) // TODO (connect/disconnect) { //return null; throw new RuntimeException("TODO: " + this.curr); @@ -55,7 +55,7 @@ protected void constructInterface() throws ScribException protected void addAsyncDiscardMethod() { GProtoName gpn = this.apigen.getGProtocolName(); - EAction first = this.curr.getActions().iterator().next(); + EAction first = this.curr.getDetActions().iterator().next(); MethodBuilder mb = this.ib.newAbstractMethod(); ReceiveSockGen.setAsyncDiscardHeaderWithoutReturnType(this.apigen, first, mb, InputFutureGen.getInputFutureName(this.apigen.getSocketClassName(this.curr))); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java index 43803da69..28f9ff2ae 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/SelectIfaceGen.java @@ -31,7 +31,7 @@ public SelectIfaceGen(StateChannelApiGenerator apigen, Map !a.isSend())) // TODO (connect/disconnect) + if (this.curr.getActions().stream().anyMatch((a) -> !a.isSend())) // TODO (connect/disconnect) { //return null; throw new RuntimeException("TODO: " + this.curr); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java index ebe2e071e..a60e2a424 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java @@ -30,7 +30,7 @@ public String build(STStateChanAPIBuilder api, EState s) String out = getPreamble(api, s); out += "\n\n"; - out += this.bb.build(api, s, s.getActions().get(1)); // Getting 1 checks non-unary + out += this.bb.build(api, s, s.getDetActions().get(1)); // Getting 1 checks non-unary return out; } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java index d42906ee7..76de329b9 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java @@ -31,7 +31,7 @@ public String build(STStateChanAPIBuilder api, EState s) { String out = getPreamble(api, s); - for (EAction a : s.getActions()) + for (EAction a : s.getDetActions()) { out += "\n\n"; if (a instanceof ERecv) // FIXME: factor out action kind diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java index b340ac7fe..1f4a62ca2 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java @@ -36,7 +36,7 @@ public String build(STStateChanAPIBuilder api, EState s) + "\n" + "type " + getSTStateName(gpn, role, s) + " struct{}";*/ - for (EAction a : s.getActions()) + for (EAction a : s.getDetActions()) { out += "\n\n"; if (a instanceof ESend) // FIXME: factor out action kind diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java index d70076529..d18309954 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java @@ -32,7 +32,7 @@ public String build(STStateChanAPIBuilder api, EState s) { String out = getPreamble(api, s); - List as = s.getActions(); + List as = s.getDetActions(); if (as.size() > 1) { throw new RuntimeException("Shouldn't get in here: " + as); diff --git a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java index 41c8ff25f..4269e9430 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java @@ -123,8 +123,8 @@ public final String toAut() continue; } seen.add(s.id); - Iterator as = s.getAllActions().iterator(); - Iterator ss = s.getAllSuccessors().iterator(); + Iterator as = s.getActions().iterator(); + Iterator ss = s.getSuccessors().iterator(); for (; as.hasNext(); edges++) { A a = as.next(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/MState.java b/scribble-core/src/main/java/org/scribble/core/model/MState.java index d4eee749c..81bf14676 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MState.java @@ -104,21 +104,20 @@ protected final void removeEdge(A a, S s) throw new RuntimeException("No such transition: " + a + "->" + s); } - // The "deterministic" variant, cf., getAllActions - public final List getActions() + // Variant of getActions with a run-time check on determinism -- currently used by codegen utils (that have that assumption) + public final List getDetActions() { Set as = new HashSet<>(this.actions); if (as.size() != this.actions.size()) { throw new RuntimeScribException("[TODO] Non-deterministic state: " + this.actions + " (Try -minlts if available)"); - // This getter checks for determinism -- affects e.g. API generation + // This getter checks for determinism -- mainly affects API generation } - //return as; - return getAllActions(); + return getActions(); } - public final List getAllActions() + public final List getActions() { return Collections.unmodifiableList(this.actions); } @@ -133,22 +132,10 @@ public S getSuccessor(A a) Set as = new HashSet<>(this.actions); if (as.size() != this.actions.size()) { - throw new RuntimeException("FIXME: " + this.actions); + throw new RuntimeException("[FIXME] : " + this.actions); } return getSuccessors(a).get(0); } - - public final List getSuccessors() - { - Set as = new HashSet<>(this.actions); - if (as.size() != this.actions.size()) - { - throw new RuntimeScribException("[TODO] Non-deterministic state: " - + this.actions + " (Try -minlts if available)"); - // This getter checks for determinism -- affects e.g. API generation - } - return getAllSuccessors(); - } // For non-deterministic actions public final List getSuccessors(A a) @@ -159,7 +146,7 @@ public final List getSuccessors(A a) .collect(Collectors.toList()); } - public final List getAllSuccessors() + public final List getSuccessors() { return Collections.unmodifiableList(this.succs); } @@ -185,7 +172,7 @@ protected Set getReachableStatesAux(S start) Iterator> i = todo.entrySet().iterator(); Entry next = i.next(); i.remove(); - for (S s : next.getValue().getAllSuccessors()) + for (S s : next.getValue().getSuccessors()) { if (!all.containsKey(s.id)) { @@ -212,7 +199,7 @@ public S getTerminal() public Set getReachableActions() { - return getReachableStates().stream().flatMap(x -> x.getAllActions().stream()) + return getReachableStates().stream().flatMap(x -> x.getActions().stream()) .collect(Collectors.toSet()); } @@ -268,6 +255,18 @@ public boolean equals(Object o) /* + public final List getDetSuccessors() + { + Set as = new HashSet<>(this.actions); + if (as.size() != this.actions.size()) + { + throw new RuntimeScribException("[TODO] Non-deterministic state: " + + this.actions + " (Try -minlts if available)"); + // This getter checks for determinism -- affects e.g. API generation + } + return getSuccessors(); + } + // TODO: make protected public static , S extends MState, K extends ProtoKind> S getTerminal(S start) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java index 51fd49d64..9d9c21663 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java @@ -63,7 +63,7 @@ public List fireAll(EAction a) public List getAllFireable() { - return this.curr.getAllActions(); + return this.curr.getActions(); } public boolean hasFireable(EAction a) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index 89a4200e1..83e6b1210 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -417,7 +417,7 @@ public EState getRecursionEntry(RecVar recvar) // Returns List, cf. getAllSucessors/Actions public List getAllPredecessors(EState s) { - return this.states.stream().filter(x -> x.getAllSuccessors().contains(s)) + return this.states.stream().filter(x -> x.getSuccessors().contains(s)) .collect(Collectors.toList()); } @@ -460,8 +460,8 @@ protected void fixContinueEdges(Set seen, Map clones, return; } seen.add(orig); - Iterator as = orig.getAllActions().iterator(); - Iterator ss = orig.getAllSuccessors().iterator(); + Iterator as = orig.getActions().iterator(); + Iterator ss = orig.getSuccessors().iterator(); while (as.hasNext()) { EAction a = as.next(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index 74d0ea9f1..b1f993257 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -64,7 +64,7 @@ protected String toPml(Map seen, Role r) String res = lab + ":\n"; EStateKind kind = getStateKind(); - List as = getActions(); + List as = getDetActions(); if (kind == EStateKind.OUTPUT) { if (as.stream().anyMatch(a -> !a.isSend())) @@ -164,12 +164,12 @@ public EState unfairTransform(ModelFactory ef) } seen.add(curr); - if (curr.getStateKind() == EStateKind.OUTPUT && curr.getAllActions().size() > 1) // >1 is what makes this algorithm terminating + if (curr.getStateKind() == EStateKind.OUTPUT && curr.getActions().size() > 1) // >1 is what makes this algorithm terminating { //if (curr.getAllTakeable().size() > 1) { - Iterator as = curr.getAllActions().iterator(); - Iterator ss = curr.getAllSuccessors().iterator(); + Iterator as = curr.getActions().iterator(); + Iterator ss = curr.getSuccessors().iterator(); //Map clones = new HashMap<>(); List cloneas = new LinkedList<>(); List cloness = new LinkedList<>(); @@ -253,7 +253,7 @@ public EState unfairTransform(ModelFactory ef) } else { - todo.addAll(curr.getAllSuccessors()); + todo.addAll(curr.getSuccessors()); } } @@ -273,8 +273,8 @@ protected EState clone(ModelFactory ef) } for (EState s : all) { - Iterator as = s.getAllActions().iterator(); - Iterator ss = s.getAllSuccessors().iterator(); + Iterator as = s.getActions().iterator(); + Iterator ss = s.getSuccessors().iterator(); EState clone = map.get(s.id); while (as.hasNext()) { @@ -311,8 +311,8 @@ protected EState unfairClone(ModelFactory ef, EState term, EAction a, EState suc } for (EState s : all) { - Iterator as = s.getAllActions().iterator(); - Iterator ss = s.getAllSuccessors().iterator(); + Iterator as = s.getActions().iterator(); + Iterator ss = s.getSuccessors().iterator(); EState clone = map.get(s.id); while (as.hasNext()) { @@ -332,12 +332,12 @@ protected EState unfairClone(ModelFactory ef, EState term, EAction a, EState suc // FIXME: refactor as "isSyncOnly" -- and make an isSync in IOAction public boolean isConnectOrWrapClientOnly() { - return getStateKind() == EStateKind.OUTPUT && getAllActions().stream().allMatch((a) -> a.isRequest() || a.isWrapClient()); + return getStateKind() == EStateKind.OUTPUT && getActions().stream().allMatch((a) -> a.isRequest() || a.isWrapClient()); } public EStateKind getStateKind() { - List as = this.getAllActions(); + List as = this.getActions(); if (as.size() == 0) { return EStateKind.TERMINAL; diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java b/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java index fa5dc35bc..9e0f62cba 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java @@ -258,7 +258,7 @@ public Set acceptable(Role r, EState curr) // Means connection accept return res; } } - List as = curr.getAllActions(); + List as = curr.getActions(); for (EAction a : as) { res.add((EAcc) a); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java index 7e659efda..58fee8df9 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java @@ -118,8 +118,8 @@ private List getTraceAux(List trace, Set seen, } SState curr = this.states.get(currid); - Iterator as = curr.getAllActions().iterator(); - Iterator ss = curr.getAllSuccessors().iterator(); + Iterator as = curr.getActions().iterator(); + Iterator ss = curr.getSuccessors().iterator(); while (as.hasNext()) { SAction a = as.next(); @@ -183,7 +183,7 @@ private Map> getReachabilityAux( for (Integer s1id : idToIndex.keySet()) { - for (SState s2 : this.states.get(s1id).getAllSuccessors()) + for (SState s2 : this.states.get(s1id).getSuccessors()) { reach[idToIndex.get(s1id)][idToIndex.get(s2.id)] = true; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index 9e32554f1..4543fdf1c 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -172,7 +172,7 @@ protected static Set checkRoleProgress(Map states, } else*/ { - for (SAction a : next.getAllActions()) + for (SAction a : next.getActions()) { if (a.containsRole(r)) { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 30a46288d..7d8b378f2 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -103,7 +103,7 @@ public SType visitChoice(Choice n) } EState init = nestedEntry; for (EAction a : (Iterable) - init.getAllActions().stream().distinct()::iterator) + init.getActions().stream().distinct()::iterator) // Enabling actions { for (EState s : init.getSuccessors(a)) @@ -141,7 +141,7 @@ public SType visitContinue(Continue n) EState curr = this.util.getEntry(); for (EState pred : this.util.getAllPredecessors(curr)) // Does getAllSuccessors { - for (EAction a : new LinkedList<>(pred.getAllActions())) + for (EAction a : new LinkedList<>(pred.getActions())) { // Following is because pred.getSuccessor doesn't support non-det edges // FIXME: refactor actions/successor Lists in MState to list of edges? From cd99ff3c022fb921fdb826e7e2bfb4db8269332a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 17:58:39 +0100 Subject: [PATCH 302/539] [AllTest] Continued: refactoring core model classes. --- .../callbackapi/CBEndpointApiGenerator.java | 2 +- .../callbackapi/CBEndpointApiGenerator3.java | 2 +- .../java/statechanapi/AcceptSockGen.java | 2 +- .../java/statechanapi/BranchSockGen.java | 6 +- .../java/statechanapi/CaseSockGen.java | 2 +- .../java/statechanapi/HandlerIfaceGen.java | 4 +- .../java/statechanapi/OutputSockGen.java | 2 +- .../java/statechanapi/ReceiveSockGen.java | 2 +- .../StateChannelApiGenerator.java | 4 +- .../statechanapi/ioifaces/CaseIfaceGen.java | 2 +- .../ioifaces/IOInterfacesGenerator.java | 18 +-- .../ioifaces/ReceiveIfaceGen.java | 2 +- .../org/scribble/core/model/MPrettyState.java | 2 +- .../java/org/scribble/core/model/MState.java | 112 ++++++++++-------- .../scribble/core/model/endpoint/EFSM.java | 2 +- .../model/endpoint/EGraphBuilderUtil.java | 6 +- .../scribble/core/model/endpoint/EState.java | 14 +-- .../scribble/core/model/global/SGraph.java | 4 +- .../core/visit/local/EGraphBuilder.java | 4 +- 19 files changed, 100 insertions(+), 92 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index d53c699d5..402d742c7 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -202,7 +202,7 @@ public Map buildEndpointClass() throws ScribException /*+ ((s.getSuccessor(a).id == s.id) ? "this" : ((s.getSuccessor(a).getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.getSuccessor(a).id) + ".id")*/ - + "\"" + ((s.getSuccessor(a).getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.getSuccessor(a).id) + "\"" + + "\"" + ((s.getDetSuccessor(a).getStateKind() == EStateKind.TERMINAL) ? "End" : this.proto.getSimpleName() + "_" + this.self + "_" + s.getDetSuccessor(a).id) + "\"" + ");\n"; } stateClass += "}\n"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index c51769b10..1a0512f6a 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -539,7 +539,7 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, + ");"); for (EAction a : s.getActions()) { - EState succ = s.getSuccessor(a); + EState succ = s.getDetSuccessor(a); stateCons.addBodyLine("this.succs.put(" + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) // FIXME: factor out + ", \"" /*+ ((succ.getStateKind() == EStateKind.TERMINAL) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AcceptSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AcceptSockGen.java index 1424adffc..b05af6f76 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AcceptSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/AcceptSockGen.java @@ -51,7 +51,7 @@ protected void addMethods() throw new RuntimeException("AcceptSocket generation not yet supported for accept-branches: " + as); } EAction a = as.iterator().next(); - EState succ = curr.getSuccessor(a); + EState succ = curr.getDetSuccessor(a); makeAcceptMethod(a, succ); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java index befe0decd..6c62c24c2 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java @@ -156,7 +156,7 @@ private String addBranchCallbackMethod(final String ROLE_PARAM, Role peer) { handleif += ", "; } - EState succ = this.curr.getSuccessor(a); + EState succ = this.curr.getDetSuccessor(a); if (succ.isTerminal()) { handleif += ScribSockGen.GENERATED_ENDSOCKET_NAME; @@ -262,7 +262,7 @@ private void addHandleMethod(final String ROLE_PARAM, final String MESSAGE_VAR, first = true; for (EAction a : this.curr.getDetActions()) { - EState succ = this.curr.getSuccessor(a); + EState succ = this.curr.getDetSuccessor(a); if (first) { first = false; @@ -349,7 +349,7 @@ private void addCallbackCases(MethodBuilder mb2, final String ROLE_PARAM, first = true; for (EAction a : this.curr.getDetActions()) { - EState succ = this.curr.getSuccessor(a); + EState succ = this.curr.getDetSuccessor(a); if (first) { first = false; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java index 3ec234ab3..331a0f8c3 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java @@ -94,7 +94,7 @@ protected void addMethods() throws ScribException for (EAction a : this.curr.getDetActions()) { - EState succ = this.curr.getSuccessor(a); + EState succ = this.curr.getDetSuccessor(a); addReceiveMethod(this.cb, a, succ); addCaseReceiveMethod(this.cb, a, succ); if (!a.payload.isEmpty() || a.mid.isSigName()) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java index c1285a1bf..2b07a0d71 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java @@ -54,7 +54,7 @@ public InterfaceBuilder generateType() throws ScribException for (EAction a : this.curr.getDetActions()) // Doesn't need to be sorted { - EState succ = this.curr.getSuccessor(a); + EState succ = this.curr.getDetSuccessor(a); String nextClass = this.apigen.getSocketClassName(succ); AbstractMethodBuilder mb3 = ib.newAbstractMethod(); @@ -73,7 +73,7 @@ public InterfaceBuilder generateType() throws ScribException } addHandleMethodOpAndPayloadParams(this.apigen, a, mb3); - if (this.curr.getSuccessor(a).isTerminal()) + if (this.curr.getDetSuccessor(a).isTerminal()) { // FIXME: potentially repeated (but OK) ib.addImports(SessionApiGenerator.getEndpointApiRootPackageName(gpn) + ".*"); // FIXME: factor out with ScribSocketBuilder diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java index 221e98f18..02ce3a9ee 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java @@ -63,7 +63,7 @@ protected void addMethods() throws ScribException boolean hasWrap = false; for (EAction a : curr.getDetActions()) // (Scribble ensures all "a" are input or all are output) { - EState succ = curr.getSuccessor(a); + EState succ = curr.getDetSuccessor(a); MethodBuilder mb = this.cb.newMethod(); if (a.isSend()) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java index 72e300476..64865a863 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java @@ -56,7 +56,7 @@ protected void addMethods() throws ScribException { EAction a = curr.getDetActions().iterator().next(); //String nextClass = this.apigen.getSocketClassName(curr.accept(a)); - EState succ = curr.getSuccessor(a); + EState succ = curr.getDetSuccessor(a); ClassBuilder futureClass = new InputFutureGen(this.apigen, this.cb, a).generateType(); // Wraps all payload elements as fields (set by future completion) // FIXME: problem if package and protocol have the same name -- still? this.apigen.addTypeDecl(futureClass); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 77d965ed9..7b790cc19 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -124,7 +124,7 @@ private void generateClassNames(EState ps) return; } this.classNames.put(ps, newSocketClassName()); - for (EState succ : ps.getSuccessors()) + for (EState succ : ps.getSuccs()) { generateClassNames(succ); } @@ -147,7 +147,7 @@ private void constructClasses(EState curr) throws ScribException return; } this.types.put(className, constructClass(curr)); - for (EState succ : curr.getSuccessors()) + for (EState succ : curr.getSuccs()) { constructClasses(succ); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java index 46a5719c1..4d22aca14 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/CaseIfaceGen.java @@ -86,7 +86,7 @@ protected void addCaseReceiveDiscardMethods() { MethodBuilder mb = this.ib.newAbstractMethod(); CaseSockGen.setCaseReceiveDiscardHeaderWithoutReturnType(this.apigen, a, mb); - EState succ = this.curr.getSuccessor(a); + EState succ = this.curr.getDetSuccessor(a); if (succ.isTerminal()) { ScribSockGen.setNextSocketReturnType(this.apigen, mb, succ); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index 38b40fa82..d848c0f94 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -243,7 +243,7 @@ private void generateActionAndSuccessorInterfacesAndCollectPreActions(Set visited, EState s) t visited.add(s); for (EAction a : s.getDetActions()) { - generateIOStateInterfacesFirstPass(visited, s.getSuccessor(a)); + generateIOStateInterfacesFirstPass(visited, s.getDetSuccessor(a)); } } @@ -352,7 +352,7 @@ private void generateIOStateInterfacesSecondPass(Set visited, EState s) visited.add(s); for (EAction a : s.getDetActions()) { - generateIOStateInterfacesSecondPass(visited, s.getSuccessor(a)); + generateIOStateInterfacesSecondPass(visited, s.getDetSuccessor(a)); } } @@ -377,7 +377,7 @@ private void generateHandleInterfaces(Set visited, EState s) throws Scri visited.add(s); for (EAction a : s.getDetActions()) { - generateHandleInterfaces(visited, s.getSuccessor(a)); + generateHandleInterfaces(visited, s.getDetSuccessor(a)); } } @@ -451,7 +451,7 @@ private void generateHandleInterfacesSecondPass(Set visited, EState s) visited.add(s); for (EAction a : s.getDetActions()) { - generateHandleInterfacesSecondPass(visited, s.getSuccessor(a)); + generateHandleInterfacesSecondPass(visited, s.getDetSuccessor(a)); } } @@ -546,7 +546,7 @@ private void addIOStateInterfacesToStateChannels(Set visited, EState s) { tmp += SuccessorInterfaceGenerator.getSuccessorInterfaceName(a); }*/ - EState succ = s.getSuccessor(a); + EState succ = s.getDetSuccessor(a); if (succ.isTerminal()) { tmp += ScribSockGen.GENERATED_ENDSOCKET_NAME; @@ -637,7 +637,7 @@ private void addIOStateInterfacesToStateChannels(Set visited, EState s) visited.add(s); for (EAction a : s.getDetActions()) { - addIOStateInterfacesToStateChannels(visited, s.getSuccessor(a)); + addIOStateInterfacesToStateChannels(visited, s.getDetSuccessor(a)); } } @@ -933,7 +933,7 @@ private String getConcreteSuccessorParameters(EState s) { return "<" + s.getDetActions().stream().sorted(IOStateIfaceGen.IOACTION_COMPARATOR) - .map((a) -> this.getSuccName.apply(s.getSuccessor(a))).collect(Collectors.joining(", ")) + .map((a) -> this.getSuccName.apply(s.getDetSuccessor(a))).collect(Collectors.joining(", ")) + ">"; } @@ -985,7 +985,7 @@ private void collectBranchSuccs() String key = HandleIfaceGen.getHandleInterfaceName(self, s); // HandleInterface name List curr1 = new LinkedList<>(); - this.branchPostActions.get(s).forEach((a) -> curr1.addAll(s.getSuccessor(a).getDetActions())); // TODO: flatmap + this.branchPostActions.get(s).forEach((a) -> curr1.addAll(s.getDetSuccessor(a).getDetActions())); // TODO: flatmap //List curr2 = curr1.stream().sorted(IOStateInterfaceGenerator.IOACTION_COMPARATOR).collect(Collectors.toList()); List tmp = this.branchSuccs.get(key); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java index af57548f9..c08d16f67 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/ReceiveIfaceGen.java @@ -60,7 +60,7 @@ protected void addAsyncDiscardMethod() MethodBuilder mb = this.ib.newAbstractMethod(); ReceiveSockGen.setAsyncDiscardHeaderWithoutReturnType(this.apigen, first, mb, InputFutureGen.getInputFutureName(this.apigen.getSocketClassName(this.curr))); this.ib.addImports(SessionApiGenerator.getOpsPackageName(gpn) + ".*"); - EState succ = this.curr.getSuccessor(first); + EState succ = this.curr.getDetSuccessor(first); if (succ.isTerminal()) { ScribSockGen.setNextSocketReturnType(this.apigen, mb, succ); diff --git a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java index 4269e9430..4a946314c 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java @@ -124,7 +124,7 @@ public final String toAut() } seen.add(s.id); Iterator as = s.getActions().iterator(); - Iterator ss = s.getSuccessors().iterator(); + Iterator ss = s.getSuccs().iterator(); for (; as.hasNext(); edges++) { A a = as.next(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/MState.java b/scribble-core/src/main/java/org/scribble/core/model/MState.java index 81bf14676..bf50a1c0f 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MState.java @@ -23,7 +23,6 @@ import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; -import java.util.stream.IntStream; import org.scribble.core.type.kind.ProtoKind; import org.scribble.util.RuntimeScribException; @@ -72,9 +71,9 @@ protected void addEdge(A a, S s) Iterator ss = this.succs.iterator(); while (as.hasNext()) // Duplicate edges preemptively pruned here, but could leave to later minimisation { - A tmpa = as.next(); - S tmps = ss.next(); - if (tmpa.equals(a) && tmps.equals(s)) + A na = as.next(); + S ns = ss.next(); + if (na.equals(a) && ns.equals(s)) { return; } @@ -88,34 +87,21 @@ protected void addEdge(A a, S s) protected final void removeEdge(A a, S s) //throws ScribException // CHECKME: used? -- cf., Hack? EFSM building on bad-reachability protocols now done before actual reachability check { - Iterator ia = this.actions.iterator(); - Iterator is = this.succs.iterator(); - while (ia.hasNext()) + Iterator as = this.actions.iterator(); + Iterator ss = this.succs.iterator(); + while (as.hasNext()) { - A tmpa = ia.next(); - S tmps = is.next(); - if (tmpa.equals(a) && tmps.equals(s)) + A na = as.next(); + S ns = ss.next(); + if (na.equals(a) && ns.equals(s)) { - ia.remove(); - is.remove(); + as.remove(); + ss.remove(); return; } } throw new RuntimeException("No such transition: " + a + "->" + s); } - - // Variant of getActions with a run-time check on determinism -- currently used by codegen utils (that have that assumption) - public final List getDetActions() - { - Set as = new HashSet<>(this.actions); - if (as.size() != this.actions.size()) - { - throw new RuntimeScribException("[TODO] Non-deterministic state: " - + this.actions + " (Try -minlts if available)"); - // This getter checks for determinism -- mainly affects API generation - } - return getActions(); - } public final List getActions() { @@ -127,33 +113,68 @@ public final boolean hasAction(A a) return this.actions.contains(a); } - public S getSuccessor(A a) + public final List getSuccs() + { + return Collections.unmodifiableList(this.succs); + } + + public final List getSuccs(A a) + { + Iterator as = this.actions.iterator(); + Iterator ss = this.succs.iterator(); + List res = new LinkedList<>(); + while (as.hasNext()) + { + A na = as.next(); + S ns = ss.next(); + if (na.equals(a)) + { + res.add(ns); + } + } + return res; + } + + // Variant of getActions with implicit run-time check on determinism -- currently used by codegen utils (that have that assumption) + public final List getDetActions() { Set as = new HashSet<>(this.actions); if (as.size() != this.actions.size()) { - throw new RuntimeException("[FIXME] : " + this.actions); + throw new RuntimeScribException("[TODO] Non-deterministic state: " + + this.actions + " (Try -minlts if available)"); + // This getter checks for determinism -- mainly affects API generation } - return getSuccessors(a).get(0); + return getActions(); } - // For non-deterministic actions - public final List getSuccessors(A a) + // Variant with implicit run-time check on determinism + public S getDetSuccessor(A a) { - return IntStream.range(0, this.actions.size()) - .filter(i -> this.actions.get(i).equals(a)) - .mapToObj(i -> this.succs.get(i)) - .collect(Collectors.toList()); + Set as = new HashSet<>(this.actions); + if (as.size() != this.actions.size()) + { + throw new RuntimeException("[FIXME] : " + this.actions); + } + return getSuccs(a).get(0); } - public final List getSuccessors() + public final boolean isTerminal() { - return Collections.unmodifiableList(this.succs); + return this.actions.isEmpty(); } - public final boolean isTerminal() + public S getTerminal() { - return this.actions.isEmpty(); + //getReachableStates().stream().filter(x -> x.isTerminal()).findFirst(); + Set terms = getReachableStates().stream() + .filter(s -> s.isTerminal()).collect(Collectors.toSet()); + if (terms.size() > 1) + { + throw new RuntimeException("Shouldn't get in here: " + terms); + } + return terms.isEmpty() //.isPresent() + ? null : terms.iterator().next(); // CHECKME: return empty Set instead of null? } // CHECKME: add "caching" versions to, e.g., Graphs? @@ -172,7 +193,7 @@ protected Set getReachableStatesAux(S start) Iterator> i = todo.entrySet().iterator(); Entry next = i.next(); i.remove(); - for (S s : next.getValue().getSuccessors()) + for (S s : next.getValue().getSuccs()) { if (!all.containsKey(s.id)) { @@ -184,19 +205,6 @@ protected Set getReachableStatesAux(S start) return new HashSet<>(all.values()); } - public S getTerminal() - { - //getReachableStates().stream().filter(x -> x.isTerminal()).findFirst(); - Set terms = getReachableStates().stream() - .filter(s -> s.isTerminal()).collect(Collectors.toSet()); - if (terms.size() > 1) - { - throw new RuntimeException("Shouldn't get in here: " + terms); - } - return terms.isEmpty() //.isPresent() - ? null : terms.iterator().next(); // CHECKME: return empty Set instead of null? - } - public Set getReachableActions() { return getReachableStates().stream().flatMap(x -> x.getActions().stream()) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java index 9d9c21663..1c12e7864 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java @@ -58,7 +58,7 @@ public EStateKind getStateKind() public List fireAll(EAction a) { - return this.curr.getSuccessors(a).stream().map((s) -> new EFSM(this.graph, s)).collect(Collectors.toList()); + return this.curr.getSuccs(a).stream().map((s) -> new EFSM(this.graph, s)).collect(Collectors.toList()); } public List getAllFireable() diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index 83e6b1210..6631dc405 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -417,7 +417,7 @@ public EState getRecursionEntry(RecVar recvar) // Returns List, cf. getAllSucessors/Actions public List getAllPredecessors(EState s) { - return this.states.stream().filter(x -> x.getSuccessors().contains(s)) + return this.states.stream().filter(x -> x.getSuccs().contains(s)) .collect(Collectors.toList()); } @@ -461,7 +461,7 @@ protected void fixContinueEdges(Set seen, Map clones, } seen.add(orig); Iterator as = orig.getActions().iterator(); - Iterator ss = orig.getSuccessors().iterator(); + Iterator ss = orig.getSuccs().iterator(); while (as.hasNext()) { EAction a = as.next(); @@ -490,7 +490,7 @@ else if (a instanceof IntermediateRecEdge) RecVar rv = new RecVar(ice.mid.toString()); for (EAction e : this.enactingMap.get(origSucc).get(rv)) { - for (EState n : origSucc.getSuccessors(e)) + for (EState n : origSucc.getSuccs(e)) { cloneSucc = getClone(clones, n); addEdgeAux(clone, e, cloneSucc); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index b1f993257..7b0e6b2e8 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -78,7 +78,7 @@ protected String toPml(Map seen, Role r) "::\n" + "skip ->\n" + "s_" + r + "_" + a.peer + "!" + a.mid + ";\n" - + "goto " + getLabel(seen, getSuccessor(a), r) + "\n" + + "goto " + getLabel(seen, getDetSuccessor(a), r) + "\n" ) .collect(Collectors.joining("")) + "fi\n"; @@ -91,7 +91,7 @@ else if (kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) "::\n" + "r_" + a.peer + "_" + r + "?[" + a.mid + "] ->\n" + "r_" + a.peer + "_" + r + "?" + a.mid + ";\n" - + "goto " + getLabel(seen, getSuccessor(a), r) + "\n" + + "goto " + getLabel(seen, getDetSuccessor(a), r) + "\n" ) .collect(Collectors.joining("")) + "fi\n"; @@ -105,7 +105,7 @@ else if (kind == EStateKind.TERMINAL) throw new RuntimeException("TODO: " + kind); } - res += as.stream().map(a -> "\n" + getSuccessor(a).toPml(tmp, r)).collect(Collectors.joining("")); + res += as.stream().map(a -> "\n" + getDetSuccessor(a).toPml(tmp, r)).collect(Collectors.joining("")); return res; } @@ -169,7 +169,7 @@ public EState unfairTransform(ModelFactory ef) //if (curr.getAllTakeable().size() > 1) { Iterator as = curr.getActions().iterator(); - Iterator ss = curr.getSuccessors().iterator(); + Iterator ss = curr.getSuccs().iterator(); //Map clones = new HashMap<>(); List cloneas = new LinkedList<>(); List cloness = new LinkedList<>(); @@ -253,7 +253,7 @@ public EState unfairTransform(ModelFactory ef) } else { - todo.addAll(curr.getSuccessors()); + todo.addAll(curr.getSuccs()); } } @@ -274,7 +274,7 @@ protected EState clone(ModelFactory ef) for (EState s : all) { Iterator as = s.getActions().iterator(); - Iterator ss = s.getSuccessors().iterator(); + Iterator ss = s.getSuccs().iterator(); EState clone = map.get(s.id); while (as.hasNext()) { @@ -312,7 +312,7 @@ protected EState unfairClone(ModelFactory ef, EState term, EAction a, EState suc for (EState s : all) { Iterator as = s.getActions().iterator(); - Iterator ss = s.getSuccessors().iterator(); + Iterator ss = s.getSuccs().iterator(); EState clone = map.get(s.id); while (as.hasNext()) { diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java index 58fee8df9..bfc72aa82 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java @@ -119,7 +119,7 @@ private List getTraceAux(List trace, Set seen, SState curr = this.states.get(currid); Iterator as = curr.getActions().iterator(); - Iterator ss = curr.getSuccessors().iterator(); + Iterator ss = curr.getSuccs().iterator(); while (as.hasNext()) { SAction a = as.next(); @@ -183,7 +183,7 @@ private Map> getReachabilityAux( for (Integer s1id : idToIndex.keySet()) { - for (SState s2 : this.states.get(s1id).getSuccessors()) + for (SState s2 : this.states.get(s1id).getSuccs()) { reach[idToIndex.get(s1id)][idToIndex.get(s2.id)] = true; } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 7d8b378f2..6ccfc1c75 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -106,7 +106,7 @@ public SType visitChoice(Choice n) init.getActions().stream().distinct()::iterator) // Enabling actions { - for (EState s : init.getSuccessors(a)) + for (EState s : init.getSuccs(a)) { util.addEdge(entry, a, s); } @@ -145,7 +145,7 @@ public SType visitContinue(Continue n) { // Following is because pred.getSuccessor doesn't support non-det edges // FIXME: refactor actions/successor Lists in MState to list of edges? - for (EState succ : pred.getSuccessors(a)) + for (EState succ : pred.getSuccs(a)) { if (succ.equals(curr)) { From 4abac8be5ff1f90d9fe53334a132ba73d92f8a94 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 18:09:08 +0100 Subject: [PATCH 303/539] [AllTest] Minor. --- .../java/statechanapi/StateChannelApiGenerator.java | 2 +- .../java/org/scribble/core/model/MPrettyState.java | 2 +- .../src/main/java/org/scribble/core/model/MState.java | 10 ++++++---- .../java/org/scribble/core/model/endpoint/EFSM.java | 3 ++- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 7b790cc19..4cc0faac8 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -188,7 +188,7 @@ private ClassBuilder constructClass(EState curr) throws ScribException // FIXME { throw new RuntimeException( "[TODO] State Channel API generation not supported for: " - + curr.getStateKind() + ", " + curr.toLongString()); + + curr.getStateKind() + ", " + curr.toVerboseString()); } } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java index 4a946314c..360485269 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java @@ -30,7 +30,7 @@ public MPrettyState(Set labs) // Immutable singleton node super(labs); } - public String toLongString() + public String toVerboseString() { String s = "\"" + this.id + "\":["; Iterator ss = this.succs.iterator(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/MState.java b/scribble-core/src/main/java/org/scribble/core/model/MState.java index bf50a1c0f..8814491c7 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MState.java @@ -71,7 +71,7 @@ protected void addEdge(A a, S s) Iterator ss = this.succs.iterator(); while (as.hasNext()) // Duplicate edges preemptively pruned here, but could leave to later minimisation { - A na = as.next(); + A na = as.next(); // N.B. cannot "inline" into below if-condition, due to short circuiting S ns = ss.next(); if (na.equals(a) && ns.equals(s)) { @@ -91,11 +91,11 @@ protected final void removeEdge(A a, S s) Iterator ss = this.succs.iterator(); while (as.hasNext()) { - A na = as.next(); + A na = as.next(); // N.B. cannot "inline" into below if-condition, due to short circuiting S ns = ss.next(); if (na.equals(a) && ns.equals(s)) { - as.remove(); + as.remove(); // Must follow next ss.remove(); return; } @@ -136,6 +136,7 @@ public final List getSuccs(A a) } // Variant of getActions with implicit run-time check on determinism -- currently used by codegen utils (that have that assumption) + // (Pre: actions are deterministic) public final List getDetActions() { Set as = new HashSet<>(this.actions); @@ -149,6 +150,7 @@ public final List getDetActions() } // Variant with implicit run-time check on determinism + // (Pre: actions are deterministic) public S getDetSuccessor(A a) { Set as = new HashSet<>(this.actions); @@ -192,7 +194,7 @@ protected Set getReachableStatesAux(S start) { Iterator> i = todo.entrySet().iterator(); Entry next = i.next(); - i.remove(); + i.remove(); // Must follow next for (S s : next.getValue().getSuccs()) { if (!all.containsKey(s.id)) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java index 1c12e7864..9483f51e4 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java @@ -58,7 +58,8 @@ public EStateKind getStateKind() public List fireAll(EAction a) { - return this.curr.getSuccs(a).stream().map((s) -> new EFSM(this.graph, s)).collect(Collectors.toList()); + return this.curr.getSuccs(a).stream().map(s -> new EFSM(this.graph, s)) + .collect(Collectors.toList()); } public List getAllFireable() From 6da08638feb38a597227b82f95505facb7679bff Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 18:32:36 +0100 Subject: [PATCH 304/539] [AllTest] Continued: refactoring core model classes. --- .../org/scribble/core/model/MPrettyState.java | 77 +++++++++---------- scribble-test/src/test/scrib/tmp/Test.scr | 4 +- 2 files changed, 39 insertions(+), 42 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java index 360485269..084a942f1 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java @@ -34,7 +34,7 @@ public String toVerboseString() { String s = "\"" + this.id + "\":["; Iterator ss = this.succs.iterator(); - s += this.actions.stream().map(a -> a + "=\"" + ss.next().id + "\"").collect(Collectors.joining(", ")); + s += this.actions.stream().map(x -> x + "=\"" + ss.next().id + "\"").collect(Collectors.joining(", ")); return s + "]"; } @@ -42,36 +42,31 @@ public String toVerboseString() @Override public final String toDot() { - String s = "digraph G {\n" // rankdir=LR;\n - + "compound = true;\n"; - s += toDot(new HashSet<>()); - return s + "\n}"; + Set ss = getReachableStates(); + @SuppressWarnings("unchecked") + S cast = (S) this; + ss.add(cast); + StringBuilder b = new StringBuilder(); + b.append("digraph G {\n"); // rankdir=LR;\n + b.append("compound = true;\n"); + ss.forEach(x -> b.append(x.toStateDot() + "\n")); + b.append("}"); + return b.toString(); } - //protected final String toDot(Set seen) - protected final String toDot(Set> seen) + protected final String toStateDot() { - seen.add(this); - String dot = toNodeDot(); - //for (Entry e : this.edges.entrySet()) - for (int i = 0; i < this.actions.size(); i ++) + StringBuilder b = new StringBuilder(); + b.append(toNodeDot()); + Iterator as = getActions().iterator(); + Iterator ss = getSuccs().iterator(); + while (as.hasNext()) { - /*A msg = e.getKey(); - S p = e.getValue();*/ - A a = this.actions.get(i); - S s = this.succs.get(i); - dot += "\n" + toEdgeDot(a, s); - if (!seen.contains(s)) - { - dot += "\n" + s.toDot(seen); - } + A na = as.next(); + S ns = ss.next(); + b.append("\n" + toEdgeDot(na, ns)); } - return dot; - } - - protected final String toEdgeDot(String src, String dest, String lab) - { - return src + " -> " + dest + " [ " + lab + " ];"; + return b.toString(); } // dot node declaration @@ -81,22 +76,24 @@ protected String toNodeDot() return getDotNodeId() + " [ " + getNodeLabel() + " ];"; } - protected String getNodeLabel() + protected String getDotNodeId() { - String labs = this.labs.toString(); - //return "label=\"" + labs.substring(1, labs.length() - 1) + "\""; - return "label=\"" + this.id + ": " + labs.substring(1, labs.length() - 1) + "\""; // FIXME + return "\"" + this.id + "\""; } - protected String getDotNodeId() + protected String getNodeLabel() { - return "\"" + this.id + "\""; + String labs = this.labs.toString(); + return "label=\"" + this.id + ": " + labs.substring(1, labs.length() - 1) + + "\""; + // TODO: revise ? } // Override to change edge drawing from "this" as src protected String toEdgeDot(A msg, S next) { - return toEdgeDot(getDotNodeId(), next.getDotNodeId(), next.getEdgeLabel(msg)); // CHECKME: next.getEdgeLabel or this.? + return toEdgeDot(getDotNodeId(), next.getDotNodeId(), + next.getEdgeLabel(msg)); // CHECKME: next.getEdgeLabel or this.? } // "this" is the dest node of the edge @@ -105,6 +102,11 @@ protected String getEdgeLabel(A msg) { return "label=\"" + msg + "\""; } + + protected String toEdgeDot(String src, String dest, String lab) + { + return src + " -> " + dest + " [ " + lab + " ];"; + } // Move up to MState? @Override @@ -133,7 +135,8 @@ public final String toAut() aut += "\n(" + s.id + ",\"" + msg + "\"," + succ.id + ")"; } } - return "des (" + this.id + "," + edges + "," + all.size() + ")" + aut + "\n"; + return "des (" + this.id + "," + edges + "," + all.size() + ")" + aut + + "\n"; } @Override @@ -157,10 +160,4 @@ public boolean equals(Object o) } return super.equals(o); // Checks canEquals } - - @Override - public String toString() - { - return Integer.toString(this.id); // FIXME -- ? - } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index e12d3f582..49b533285 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -111,12 +111,12 @@ global protocol Proto1(role A, role B) choice at A { 1() from A to B; - //2() from A to B; + 2() from A to B; } or { 1() from A to B; - //3() from A to B; + 3() from A to B; } do Proto1(A, B); } From ae7aac5312b00a7a57c36c3b347977cafb83f2ad Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 18:37:42 +0100 Subject: [PATCH 305/539] [AllTest] Continued: refactoring core model classes. --- .../java/org/scribble/core/model/MPrettyState.java | 10 +++++----- .../src/main/java/org/scribble/core/model/MState.java | 2 +- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java index 084a942f1..988881e16 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java @@ -34,7 +34,8 @@ public String toVerboseString() { String s = "\"" + this.id + "\":["; Iterator ss = this.succs.iterator(); - s += this.actions.stream().map(x -> x + "=\"" + ss.next().id + "\"").collect(Collectors.joining(", ")); + s += this.actions.stream().map(x -> x + "=\"" + ss.next().id + "\"") + .collect(Collectors.joining(", ")); return s + "]"; } @@ -42,13 +43,12 @@ public String toVerboseString() @Override public final String toDot() { - Set ss = getReachableStates(); - @SuppressWarnings("unchecked") - S cast = (S) this; - ss.add(cast); StringBuilder b = new StringBuilder(); b.append("digraph G {\n"); // rankdir=LR;\n b.append("compound = true;\n"); + b.append(toStateDot() + "\n"); + Set ss = getReachableStates(); + ss.remove(this); // Avoids generic cast of alternative, ss.add((S) this) ss.forEach(x -> b.append(x.toStateDot() + "\n")); b.append("}"); return b.toString(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/MState.java b/scribble-core/src/main/java/org/scribble/core/model/MState.java index 8814491c7..47f57267e 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MState.java @@ -204,7 +204,7 @@ protected Set getReachableStatesAux(S start) } } } - return new HashSet<>(all.values()); + return new HashSet<>(all.values()); // Often will want to add this } public Set getReachableActions() diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 49b533285..612ae1ac8 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -118,7 +118,7 @@ global protocol Proto1(role A, role B) 1() from A to B; 3() from A to B; } - do Proto1(A, B); + //do Proto1(A, B); } From 103253f802516bfe766e92d44e308356e79f4f24 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 21:22:04 +0100 Subject: [PATCH 306/539] [AllTest] Continued: refactoring core model classes. --- .../org/scribble/core/model/MPrettyState.java | 18 +- .../java/org/scribble/core/model/MState.java | 2 +- .../scribble/core/model/endpoint/EState.java | 235 +++++++++--------- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 4 files changed, 128 insertions(+), 129 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java index 988881e16..0afe951d5 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MPrettyState.java @@ -48,7 +48,7 @@ public final String toDot() b.append("compound = true;\n"); b.append(toStateDot() + "\n"); Set ss = getReachableStates(); - ss.remove(this); // Avoids generic cast of alternative, ss.add((S) this) + ss.remove(this); // Avoids generic cast of alternative, ss.add((S) this) -- or else do Set> ss.forEach(x -> b.append(x.toStateDot() + "\n")); b.append("}"); return b.toString(); @@ -114,29 +114,23 @@ public final String toAut() { Set> all = new HashSet<>(); all.add(this); - all.addAll(getReachableStates()); + all.addAll(getReachableStates()); // The only way to avoid generic cast? not ideal though String aut = ""; int edges = 0; - Set seen = new HashSet<>(); for (MPrettyState s : all) { - if (seen.contains(s.id)) - { - continue; - } - seen.add(s.id); Iterator as = s.getActions().iterator(); - Iterator ss = s.getSuccs().iterator(); + Iterator succs = s.getSuccs().iterator(); for (; as.hasNext(); edges++) { A a = as.next(); - S succ = ss.next(); + S succ = succs.next(); String msg = a.toStringWithMsgIdHack(); // HACK aut += "\n(" + s.id + ",\"" + msg + "\"," + succ.id + ")"; } } - return "des (" + this.id + "," + edges + "," + all.size() + ")" + aut - + "\n"; + return "des (" + this.id + "," + edges + "," + all.size() + ")" + + aut + "\n"; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/MState.java b/scribble-core/src/main/java/org/scribble/core/model/MState.java index 47f57267e..44814ebdb 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MState.java @@ -176,7 +176,7 @@ public S getTerminal() throw new RuntimeException("Shouldn't get in here: " + terms); } return terms.isEmpty() //.isPresent() - ? null : terms.iterator().next(); // CHECKME: return empty Set instead of null? + ? null : terms.iterator().next(); // CHECKME: return empty Set instead of null? null used by EState.toGraph } // CHECKME: add "caching" versions to, e.g., Graphs? diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index 7b0e6b2e8..7a417dc9d 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import org.scribble.core.model.MPrettyState; @@ -31,7 +32,6 @@ import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; -import org.scribble.util.ScribException; // Label types used to be both RecVar and SubprotocolSigs; now using inlined protocol for FSM building so just RecVar public class EState extends MPrettyState @@ -41,98 +41,41 @@ public EState(Set labs) super(labs); } - public String toPml(Role r) + // To be overridden by subclasses, to obtain the subclass nodes + // CHECKME: remove labs arg, and modify the underlying Set if needed ? + protected EState cloneNode(ModelFactory mf, Set labs) { - Map seen = new HashMap<>(); - return - "active proctype " + r + "() {\n" - + toPml(seen, r) + "\n" - + "}\n"; + //return ef.newEState(this.labs); + return mf.newEState(labs); } - - protected String toPml(Map seen, Role r) - { - if (seen.containsKey(this.id)) - { - //return "goto " + getLabel(seen, this.id, r) + "\n"; - return ""; - } - - String lab = getLabel(seen, this, r); - Map tmp = new HashMap<>(seen); - tmp.put(this.id, lab); - String res = lab + ":\n"; - EStateKind kind = getStateKind(); - List as = getDetActions(); - if (kind == EStateKind.OUTPUT) + // Fully clones the reachable graph (i.e. the "general" graph -- cf., EGraph, the specific Scribble concept of an endpoint protocol graph) + protected EState clone(ModelFactory mf) + { + Set all = getReachableStates(); + all.add(this); + Map clones = new HashMap<>(); // original s.id -> clone + Function getClone = x -> { - if (as.stream().anyMatch(a -> !a.isSend())) + EState clone = clones.get(x.id); // "clones" effectively final + if (clone == null) { - throw new RuntimeException("TODO: " + as); + clone = x.cloneNode(mf, x.labs); + clones.put(x.id, clone); } - - res += //"lab" + this.id + ":\n" - "if\n" - + as.stream().map(a -> - "::\n" - + "skip ->\n" - + "s_" + r + "_" + a.peer + "!" + a.mid + ";\n" - + "goto " + getLabel(seen, getDetSuccessor(a), r) + "\n" - ) - .collect(Collectors.joining("")) - + "fi\n"; - } - else if (kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) - { - res += - "if\n" - + as.stream().map(a -> - "::\n" - + "r_" + a.peer + "_" + r + "?[" + a.mid + "] ->\n" - + "r_" + a.peer + "_" + r + "?" + a.mid + ";\n" - + "goto " + getLabel(seen, getDetSuccessor(a), r) + "\n" - ) - .collect(Collectors.joining("")) - + "fi\n"; - } - else if (kind == EStateKind.TERMINAL) - { - res += "skip\n"; - } - else - { - throw new RuntimeException("TODO: " + kind); - } - - res += as.stream().map(a -> "\n" + getDetSuccessor(a).toPml(tmp, r)).collect(Collectors.joining("")); - - return res; - } - - private static String getLabel(Map seen, EState s, Role r) - { - if (seen.containsKey(s.id)) + return clone; + }; + for (EState s : all) { - return seen.get(s.id); + Iterator as = s.getActions().iterator(); + Iterator succs = s.getSuccs().iterator(); + EState clone = getClone.apply(s); + while (as.hasNext()) + { + clone.addEdge(as.next(), getClone.apply(succs.next())); + } } - String lab = (s.isTerminal() ? "end" : "label") + r + s.id; - seen.put(s.id, lab); - return lab; - } - - // To be overridden by subclasses, to obtain the subclass nodes - // FIXME: remove labs arg, and modify the underlying Set if needed? - protected EState cloneNode(ModelFactory ef, Set labs) - { - //return ef.newEState(this.labs); - return ef.newEState(labs); - } - - // Helper factory method for deriving an EGraph from an arbitary EState (but not the primary way to construct EGraphs; cf., EGraphBuilderUtil) - public EGraph toGraph() - { - return new EGraph(this, getTerminal()); // Throws exception if >1 terminal; null if no terminal + return clones.get(this.id); } /*.. move back to endpointstate @@ -144,9 +87,9 @@ public EGraph toGraph() .. easier to implement as a direct check on the standard global model, rather than model hacking -- i.e. liveness is not just about terminal sets, but about "branching condition", c.f. julien? .. the issue is connect/accept -- makes direct check a bit more complicated, maybe value in doing it by model hacking to rely on standard liveness checking? .. should be fine, check set of roles on each path is equal, except for accept-guarded initial roles*/ - public EState unfairTransform(ModelFactory ef) + public EState unfairTransform(ModelFactory mf) { - EState init = clone(ef); + EState init = clone(mf); EState term = init.getTerminal(); Set seen = new HashSet<>(); @@ -185,7 +128,7 @@ public EState unfairTransform(ModelFactory ef) } else { - EState clone = curr.unfairClone(ef, term, a, s); // s is a succ of curr + EState clone = curr.unfairClone(mf, term, a, s); // s is a succ of curr //try { s.removeEdge(a, tmps); } catch (ScribbleException e) { throw new RuntimeException(e); } //clones.put(a, clone); cloneas.add(a); @@ -259,32 +202,6 @@ public EState unfairTransform(ModelFactory ef) return init; } - - // Fully clones the reachable graph (i.e. the "general" graph -- cf., EGraph, the specific Scribble concept of an endpoint protocol graph) - protected EState clone(ModelFactory ef) - { - Set all = new HashSet<>(); - all.add(this); - all.addAll(this.getReachableStates()); - Map map = new HashMap<>(); // original s.id -> clones - for (EState s : all) - { - map.put(s.id, s.cloneNode(ef, s.labs)); - } - for (EState s : all) - { - Iterator as = s.getActions().iterator(); - Iterator ss = s.getSuccs().iterator(); - EState clone = map.get(s.id); - while (as.hasNext()) - { - EAction a = as.next(); - EState succ = ss.next(); - clone.addEdge(a, map.get(succ.id)); - } - } - return map.get(this.id); - } // Pre: succ is the root of the subgraph, and succ is a successor of "this" (which is inside the subgraph) // i.e., this -a-> succ (maybe non-det) @@ -329,10 +246,92 @@ protected EState unfairClone(ModelFactory ef, EState term, EAction a, EState suc return map.get(succ.id); } + public String toPml(Role r) + { + Map seen = new HashMap<>(); + return + "active proctype " + r + "() {\n" + + toPml(seen, r) + "\n" + + "}\n"; + } + + protected String toPml(Map seen, Role r) + { + if (seen.containsKey(this.id)) + { + //return "goto " + getLabel(seen, this.id, r) + "\n"; + return ""; + } + + String lab = getLabel(seen, this, r); + Map tmp = new HashMap<>(seen); + tmp.put(this.id, lab); + + String res = lab + ":\n"; + EStateKind kind = getStateKind(); + List as = getDetActions(); + if (kind == EStateKind.OUTPUT) + { + if (as.stream().anyMatch(a -> !a.isSend())) + { + throw new RuntimeException("TODO: " + as); + } + + res += //"lab" + this.id + ":\n" + "if\n" + + as.stream().map(a -> + "::\n" + + "skip ->\n" + + "s_" + r + "_" + a.peer + "!" + a.mid + ";\n" + + "goto " + getLabel(seen, getDetSuccessor(a), r) + "\n" + ) + .collect(Collectors.joining("")) + + "fi\n"; + } + else if (kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) + { + res += + "if\n" + + as.stream().map(a -> + "::\n" + + "r_" + a.peer + "_" + r + "?[" + a.mid + "] ->\n" + + "r_" + a.peer + "_" + r + "?" + a.mid + ";\n" + + "goto " + getLabel(seen, getDetSuccessor(a), r) + "\n" + ) + .collect(Collectors.joining("")) + + "fi\n"; + } + else if (kind == EStateKind.TERMINAL) + { + res += "skip\n"; + } + else + { + throw new RuntimeException("TODO: " + kind); + } + + res += as.stream().map(a -> "\n" + getDetSuccessor(a).toPml(tmp, r)).collect(Collectors.joining("")); + + return res; + } + + private static String getLabel(Map seen, EState s, Role r) + { + if (seen.containsKey(s.id)) + { + return seen.get(s.id); + } + String lab = (s.isTerminal() ? "end" : "label") + r + s.id; + seen.put(s.id, lab); + return lab; + } + // FIXME: refactor as "isSyncOnly" -- and make an isSync in IOAction public boolean isConnectOrWrapClientOnly() { - return getStateKind() == EStateKind.OUTPUT && getActions().stream().allMatch((a) -> a.isRequest() || a.isWrapClient()); + return getStateKind() == EStateKind.OUTPUT + && getActions().stream() + .allMatch(x -> x.isRequest() || x.isWrapClient()); } public EStateKind getStateKind() @@ -377,6 +376,12 @@ else if (as.size() == 1 && as.get(0).isWrapServer()) } } } + + // Helper factory method for deriving an EGraph from an arbitary EState (but not the primary way to construct EGraphs; cf., EGraphBuilderUtil) + public EGraph toGraph() + { + return new EGraph(this, getTerminal()); // Throws exception if >1 terminal; null if no terminal + } @Override public Set getReachableStates() diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 612ae1ac8..49b533285 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -118,7 +118,7 @@ global protocol Proto1(role A, role B) 1() from A to B; 3() from A to B; } - //do Proto1(A, B); + do Proto1(A, B); } From 364e1159f72b93afb05799bb44c27bfce6a66a19 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 23:45:13 +0100 Subject: [PATCH 307/539] [AllTest] Continued: refactoring core model classes. --- .../org/scribble/core/job/CoreContext.java | 9 +- .../java/org/scribble/core/model/MState.java | 9 +- .../scribble/core/model/endpoint/EFSM.java | 2 +- .../scribble/core/model/endpoint/EState.java | 211 ++++++++---------- .../core/visit/local/EGraphBuilder.java | 6 +- scribble-test/src/test/scrib/tmp/Test.scr | 22 +- 6 files changed, 133 insertions(+), 126 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index dfdace0a4..b5ef7c6a2 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -215,16 +215,19 @@ protected void addUnfairEGraph(LProtoName fullname, EGraph graph) public EGraph getUnfairEGraph(GProtoName fullname, Role role) throws ScribException { - LProtoName fulllpn = InlinedProjector.getFullProjectionName(fullname, + LProtoName projFullname = InlinedProjector.getFullProjectionName(fullname, role); - EGraph unfair = this.uEGraphs.get(fulllpn); + EGraph unfair = this.uEGraphs.get(projFullname); if (unfair == null) { unfair = getEGraph(fullname, role).init .unfairTransform(this.core.config.mf).toGraph(); - addUnfairEGraph(fulllpn, unfair); + addUnfairEGraph(projFullname, unfair); } + + //System.out.println("\nunfair " + projFullname + ":\n" + unfair.toDot()); // TODO: verbose printing for unfair EGraphs + return unfair; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/MState.java b/scribble-core/src/main/java/org/scribble/core/model/MState.java index 44814ebdb..a589cb3c9 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MState.java @@ -64,9 +64,14 @@ public final Set getLabels() // Mutable (can also overwrite edges) protected void addEdge(A a, S s) { - if (this.equals(s)) // CHECKME: refactor unfair transform to eliminate this special case + /*if (this.equals(s)) { + // CHECKME: refactor unfair transform to eliminate this special case -- or better to have? generalise to all "identical" non-det paths?... + // ...special case was previously for all non-det "this-a->s" for the same "s", but also works when specialised to recursive such cases, i.e., this.equals(s) (because only recursion is relevant to unfair transform) + // // Needed? -- seems so, for the unfair transform (specifically for recursive non-det paths of length 1, see good.efsm.gchoice.Test09) + // Cf. EState.unfairTransform... ? -- if (curr.getStateKind() == EStateKind.OUTPUT && curr.getActions().size() > 1) // >1 is what makes this algorithm terminating + // ...because of unfairClone, na.equals(a) && ns.equals(succ) -- a pair of non-det (a, s) edges will *both* be added in the unfair-clone, instead of pruned down to one output-case, so above >1 termination condition never reached Iterator as = this.actions.iterator(); Iterator ss = this.succs.iterator(); while (as.hasNext()) // Duplicate edges preemptively pruned here, but could leave to later minimisation @@ -78,7 +83,7 @@ protected void addEdge(A a, S s) return; } } - } + }*/ this.actions.add(a); this.succs.add(s); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java index 9483f51e4..fded28585 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java @@ -58,7 +58,7 @@ public EStateKind getStateKind() public List fireAll(EAction a) { - return this.curr.getSuccs(a).stream().map(s -> new EFSM(this.graph, s)) + return this.curr.getSuccs(a).stream().map(x -> new EFSM(this.graph, x)) .collect(Collectors.toList()); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index 7a417dc9d..65a065465 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -78,7 +78,60 @@ protected EState clone(ModelFactory mf) return clones.get(this.id); } - /*.. move back to endpointstate + // Pre: succ is the root of the subgraph, and succ is a successor of *"this"* (which is inside the subgraph) + // i.e., this-a->succ ("a" is possibly non-det) + // Returns the clone of the subgraph rooted at succ, with all non- "this-a->succ" actions pruned from the clone of "this" state + // i.e., we took "a" from "this" to get to succ (the subgraph root); if we enter "this" again (inside the subgraph), then always take "a" again + private EState unfairClone(ModelFactory mf, EState term, EAction a, EState succ) // Need succ param for non-det + { + Set all = succ.getReachableStates(); + all.add(succ); + Map clones = new HashMap<>(); // original s.id -> clones + for (EState s : all) + { + if (term != null && s.id == term.id) + { + clones.put(term.id, term); + // Special case: term not cloned, otherwise a mixture of exapanded (and non-expanded) cases may lead to the term being cloned... + // ...potentially multiple times and potentially while the original still remains + } + else + { + clones.put(s.id, s.cloneNode(mf, Collections.emptySet())); // CHECKME: remove labs arg from cloneNode and just clear the lab set here ? + } + } + for (EState s : all) + { + Iterator as = s.getActions().iterator(); + Iterator succs = s.getSuccs().iterator(); + EState clone = clones.get(s.id); + boolean done = false; + // Used to add *at most* one edge, out of potentially multiple non-det a, from this-a->succ + // i.e., unfair expansion prunes non-det "a" ("determinizes" entry) from "this" into the cloned subgraph + // Cf. MState.addEdge(A, S), previously implicitly pruned all non-det "this-a->s" for the same "s" + while (as.hasNext()) + { + EAction na = as.next(); + EState ns = succs.next(); + if (s.id != this.id) + { + clone.addEdge(na, clones.get(ns.id)); + } + else if (na.equals(a) && ns.equals(succ) && !done) + // Non-det (to different succ) also pruned from clone of this -- but OK? non-det still preserved on original state, so any safety violations due to non-det will still come out?... + // ...this is like non-fairness extended to defeat even non-determinism ? + { + // s.id == this.id, so "clone" is the clone of "this" + clone.addEdge(na, clones.get(ns.id)); + done = true; + } + } + } + return clones.get(succ.id); + } + + + /*.. move back to endpointstate ? .. use getallreachable to get subgraph, make a graph clone method .. for each poly output, clone a (non-det) edge to clone of the reachable subgraph with the clone of the current node pruned to this single choice .. be careful of original non-det edges, need to do each separately @@ -90,7 +143,6 @@ protected EState clone(ModelFactory mf) public EState unfairTransform(ModelFactory mf) { EState init = clone(mf); - EState term = init.getTerminal(); Set seen = new HashSet<>(); Set todo = new LinkedHashSet<>(); @@ -107,92 +159,10 @@ public EState unfairTransform(ModelFactory mf) } seen.add(curr); - if (curr.getStateKind() == EStateKind.OUTPUT && curr.getActions().size() > 1) // >1 is what makes this algorithm terminating + if (curr.getStateKind() == EStateKind.OUTPUT + && curr.getActions().size() > 1) // >1 is what makes this algorithm terminating -- in the expanded subgraph, the clone of curr will have all other edges pruned { - //if (curr.getAllTakeable().size() > 1) - { - Iterator as = curr.getActions().iterator(); - Iterator ss = curr.getSuccs().iterator(); - //Map clones = new HashMap<>(); - List cloneas = new LinkedList<>(); - List cloness = new LinkedList<>(); - //LinkedHashMap cloness = new LinkedHashMap<>(); // clone -> original - Map> toRemove = new HashMap<>(); // List needed for multiple edges to remove to the same state: e.g. mu X . (A->B:1 + A->B:2).X - while (as.hasNext()) - { - EAction a = as.next(); - EState s = ss.next(); - if (!s.canReach(curr)) - { - todo.add(s); - } - else - { - EState clone = curr.unfairClone(mf, term, a, s); // s is a succ of curr - //try { s.removeEdge(a, tmps); } catch (ScribbleException e) { throw new RuntimeException(e); } - //clones.put(a, clone); - cloneas.add(a); - cloness.add(clone); - //cloness.put(clone, s); - - //toRemove.put(s, a); - List tmp = toRemove.get(s); - if (tmp == null) - { - tmp = new LinkedList<>(); - toRemove.put(s, tmp); - } - tmp.add(a); - } - } - //if (!clones.isEmpty()) // Redundant, but more clear - if (!cloneas.isEmpty()) // Redundant, but more clear - { - /*as = new LinkedList<>(curr.getAllTakeable()).iterator(); - //Iterator - ss = new LinkedList<>(curr.getSuccessors()).iterator(); - while (as.hasNext()) - { - IOAction a = as.next(); - EndpointState s = ss.next(); - //if (clones.containsKey(a)) // Still OK for non-det edges? - //if (cloneas.contains(a)) // Still OK for non-det edges? -- no: removing *all* non-det a's for this a, so non-recursive cases are lost - if (cloneas.contains(a) && ...succ == orig...) - { - try { curr.removeEdge(a, s); } catch (ScribbleException e) { throw new RuntimeException(e); } - } - }*/ - for (EState s : toRemove.keySet()) - { - //try - { - //curr.removeEdge(toRemove.get(s), s); - for (EAction tmp : toRemove.get(s)) - { - curr.removeEdge(tmp, s); - } - } - //catch (ScribException e) { throw new RuntimeException(e); } - } - //for (Entry e : clones.entrySet()) - Iterator icloneas = cloneas.iterator(); - Iterator icloness = cloness.iterator(); - //Iterator icloness = cloness.keySet().iterator(); - while (icloneas.hasNext()) - { - EAction a = icloneas.next(); - EState s = icloness.next(); - /*curr.addEdge(e.getKey(), e.getValue()); - todo.add(e.getValue()); - seen.add(e.getValue());*/ - curr.addEdge(a, s); - todo.add(s); // Doesn't work if non-det preserved by the "unfairClone" aux (recursively edges>1) - /*seen.add(s); // Idea is to bypass succ clone (for non-det, edges>1) but in general this will be cloned again before returning to it, so bypass doesn't work -- to solve this more generally probably need to keep a record of all clones to bypass future clones - todo.addAll(s.getSuccessors());*/ - } - //continue; - } - } + expandUnfairCases(mf, term, todo, curr); } else { @@ -202,48 +172,57 @@ public EState unfairTransform(ModelFactory mf) return init; } - - // Pre: succ is the root of the subgraph, and succ is a successor of "this" (which is inside the subgraph) - // i.e., this -a-> succ (maybe non-det) - // Returns the clone of the subgraph rooted at succ, with all non- "this-a->succ" actions pruned from the clone of "this" state - // i.e., we took "a" from "this" to get to succ (the subgraph root); if we enter "this" again (inside the subgraph), then always take "a" again - protected EState unfairClone(ModelFactory ef, EState term, EAction a, EState succ) // Need succ param for non-det + + private void expandUnfairCases(ModelFactory mf, EState term, Set todo, + EState curr) { - //EndpointState succ = take(a); - Set all = new HashSet<>(); - all.add(succ); - all.addAll(succ.getReachableStates()); - Map map = new HashMap<>(); // original s.id -> clones - for (EState s : all) + Iterator as = curr.getActions().iterator(); + Iterator succs = curr.getSuccs().iterator(); + List cloneas = new LinkedList<>(); + List cloness = new LinkedList<>(); + Map> toRemove = new HashMap<>(); // List needed for multiple edges to remove to the same state: e.g. mu X.(A->B:1 + A->B:2).X + + while (as.hasNext()) { - if (term != null && s.id == term.id) + EAction a = as.next(); + EState succ = succs.next(); + if (!succ.canReach(curr)) { - map.put(term.id, term); + todo.add(succ); + continue; } - else + EState clone = curr.unfairClone(mf, term, a, succ); // succ is a successor of curr + cloneas.add(a); + cloness.add(clone); + List tmp = toRemove.get(succ); + if (tmp == null) { - //map.put(s.id, newState(s.labs)); - map.put(s.id, s.cloneNode(ef, Collections.emptySet())); // FIXME: remove labs arg from cloneNode and just clear the lab set here? + tmp = new LinkedList<>(); + toRemove.put(succ, tmp); } + tmp.add(a); } - for (EState s : all) + + if (!cloneas.isEmpty()) // Redundant, but more clear { - Iterator as = s.getActions().iterator(); - Iterator ss = s.getSuccs().iterator(); - EState clone = map.get(s.id); - while (as.hasNext()) + for (EState succ : toRemove.keySet()) { - EAction tmpa = as.next(); - EState tmps = ss.next(); - if (s.id != this.id - || (tmpa.equals(a) && tmps.equals(succ))) // Non-det also pruned from clone of this -- but OK? non-det still preserved on original state, so any safety violations due to non-det will still come out? - // ^ Currently, this is like non-fairness is extended to even defeat non-determinism + for (EAction a1 : toRemove.get(succ)) { - clone.addEdge(tmpa, map.get(tmps.id)); + curr.removeEdge(a1, succ); } } + Iterator icloneas = cloneas.iterator(); + Iterator icloness = cloness.iterator(); + while (icloneas.hasNext()) + { + EAction a = icloneas.next(); + EState s = icloness.next(); // clones of the succs from toRemove above + curr.addEdge(a, s); + todo.add(s); // Doesn't work if non-det preserved by the "unfairClone" aux (recursively edges>1) + // Idea is to bypass succ clone (for non-det, edges>1) but in general this will be cloned again before returning to it, so bypass doesn't work -- to solve this more generally probably need to keep a record of all clones to bypass future clones + } } - return map.get(succ.id); } public String toPml(Role r) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 6ccfc1c75..4b1cc993c 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -167,7 +167,8 @@ public SType visitContinue(Continue n) } @Override - public SType visitDirectedInteraction(DirectedInteraction n) + public SType visitDirectedInteraction( + DirectedInteraction n) { Role peer = ((n instanceof LSend) || (n instanceof LReq)) ? n.dst : ((n instanceof LRecv) || (n instanceof LAcc)) ? n.src @@ -200,7 +201,8 @@ public SType visitDisconnect(DisconnectAction n) } @Override - public final > SType visitDo(Do n) + public final > SType visitDo( + Do n) { throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 49b533285..dbe439fdb 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -111,15 +111,33 @@ global protocol Proto1(role A, role B) choice at A { 1() from A to B; - 2() from A to B; + //2() from A to B; } or { 1() from A to B; - 3() from A to B; + //3() from A to B; + } + //4() from B to A; + do Proto1(A, B); +} + + +/* +global protocol Proto1(role A, role B) +{ + choice at A + { + 1() from A to B; } + or + { + 1() from A to B; + } // CHECKME: gives a non-det global model, correct/intended? + //4() from B to A; do Proto1(A, B); } +//*/ /* From 8ae1b7d11f087ee6f63f68a5828c4a6c1f23c35f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Apr 2019 23:53:53 +0100 Subject: [PATCH 308/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/endpoint/EState.java | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index 65a065465..c7ef554d9 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -52,12 +52,10 @@ protected EState cloneNode(ModelFactory mf, Set labs) // Fully clones the reachable graph (i.e. the "general" graph -- cf., EGraph, the specific Scribble concept of an endpoint protocol graph) protected EState clone(ModelFactory mf) { - Set all = getReachableStates(); - all.add(this); - Map clones = new HashMap<>(); // original s.id -> clone + Map clones = new HashMap<>(); // Original s.id -> clone Function getClone = x -> { - EState clone = clones.get(x.id); // "clones" effectively final + EState clone = clones.get(x.id); // "clones" is effectively final if (clone == null) { clone = x.cloneNode(mf, x.labs); @@ -65,7 +63,9 @@ protected EState clone(ModelFactory mf) } return clone; }; - for (EState s : all) + Set all = getReachableStates(); + all.add(this); + for (EState s : all) // Quadratic after getReachableStates, but simpler code for now { Iterator as = s.getActions().iterator(); Iterator succs = s.getSuccs().iterator(); @@ -84,27 +84,30 @@ protected EState clone(ModelFactory mf) // i.e., we took "a" from "this" to get to succ (the subgraph root); if we enter "this" again (inside the subgraph), then always take "a" again private EState unfairClone(ModelFactory mf, EState term, EAction a, EState succ) // Need succ param for non-det { - Set all = succ.getReachableStates(); - all.add(succ); - Map clones = new HashMap<>(); // original s.id -> clones - for (EState s : all) + Map clones = new HashMap<>(); // Original s.id -> clone + Function getClone = x -> { - if (term != null && s.id == term.id) - { - clones.put(term.id, term); - // Special case: term not cloned, otherwise a mixture of exapanded (and non-expanded) cases may lead to the term being cloned... - // ...potentially multiple times and potentially while the original still remains - } - else + EState clone = clones.get(x.id); // "clones" is effectively final + if (clone == null) { - clones.put(s.id, s.cloneNode(mf, Collections.emptySet())); // CHECKME: remove labs arg from cloneNode and just clear the lab set here ? + clone = (term != null && x.id == term.id) + ? term + // Special case: term not cloned, otherwise a mixture of exapanded (and non-expanded) cases may lead to the term being cloned... + // ...potentially multiple times and potentially while the original still remains + : x.cloneNode(mf, Collections.emptySet()); + // CHECKME: remove labs arg from cloneNode and just clear the lab set here ? + // Cf. clone, keeps x.labs + clones.put(x.id, clone); } - } - for (EState s : all) + return clone; + }; + Set all = succ.getReachableStates(); + all.add(succ); + for (EState s : all) // Quadratic after getReachableStates, but simpler code for now { Iterator as = s.getActions().iterator(); Iterator succs = s.getSuccs().iterator(); - EState clone = clones.get(s.id); + EState clone = getClone.apply(s); boolean done = false; // Used to add *at most* one edge, out of potentially multiple non-det a, from this-a->succ // i.e., unfair expansion prunes non-det "a" ("determinizes" entry) from "this" into the cloned subgraph @@ -115,14 +118,14 @@ private EState unfairClone(ModelFactory mf, EState term, EAction a, EState succ) EState ns = succs.next(); if (s.id != this.id) { - clone.addEdge(na, clones.get(ns.id)); + clone.addEdge(na, getClone.apply(ns)); } else if (na.equals(a) && ns.equals(succ) && !done) // Non-det (to different succ) also pruned from clone of this -- but OK? non-det still preserved on original state, so any safety violations due to non-det will still come out?... // ...this is like non-fairness extended to defeat even non-determinism ? { // s.id == this.id, so "clone" is the clone of "this" - clone.addEdge(na, clones.get(ns.id)); + clone.addEdge(na, getClone.apply(ns)); done = true; } } From d3dcff1036ea67ccd60008661d9750c574b15ca1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 17 Apr 2019 00:05:07 +0100 Subject: [PATCH 309/539] [AllTest] Continued: refactoring core model classes. --- .../callbackapi/CBEndpointApiGenerator.java | 4 +-- .../callbackapi/CBEndpointApiGenerator3.java | 4 +-- .../java/statechanapi/OutputSockGen.java | 4 +-- .../statetype/STStateChanAPIBuilder.java | 2 +- .../java/org/scribble/core/model/MState.java | 6 ++--- .../scribble/core/model/endpoint/EFSM.java | 2 +- .../scribble/core/model/endpoint/EState.java | 27 ++++++++----------- .../core/model/endpoint/EStateKind.java | 10 +++---- .../core/model/endpoint/actions/EAction.java | 4 +-- .../model/endpoint/actions/EClientWrap.java | 2 +- .../model/endpoint/actions/EServerWrap.java | 2 +- .../scribble/core/model/global/SConfig.java | 8 +++--- .../core/model/global/SGraphBuilderUtil.java | 2 +- 13 files changed, 36 insertions(+), 41 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 402d742c7..7eddbf8d3 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -179,7 +179,7 @@ public Map buildEndpointClass() throws ScribException case POLY_INPUT: stateKind = "org.scribble.runtime.handlers.states.ScribInputState"; break; case TERMINAL: stateKind = "org.scribble.runtime.handlers.states.ScribEndState"; break; case ACCEPT: - case WRAP_SERVER: + case SERVER_WRAP: throw new RuntimeException("TODO"); default: throw new RuntimeException("TODO"); @@ -608,7 +608,7 @@ private String generateRegister(GProtoName gpn, Role self, EState s) break; } case ACCEPT: - case WRAP_SERVER: + case SERVER_WRAP: { throw new RuntimeException("[scrib] TODO: " + s); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 1a0512f6a..8fc23347d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -421,7 +421,7 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, icallback.addBodyLine("return this;"); break; } - case WRAP_SERVER: + case SERVER_WRAP: case ACCEPT: { throw new RuntimeException("TODO: " + s.getStateKind()); @@ -513,7 +513,7 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, case POLY_INPUT: stateKind = "org.scribble.runtime.handlers.states.ScribInputState"; break; case TERMINAL: stateKind = "org.scribble.runtime.handlers.states.ScribEndState"; break; case ACCEPT: - case WRAP_SERVER: + case SERVER_WRAP: throw new RuntimeException("TODO"); default: throw new RuntimeException("TODO"); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java index 02ce3a9ee..d8c00d932 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java @@ -79,7 +79,7 @@ else if (a.isDisconnect()) { setDisconnectHeaderWithoutReturnType(apigen, a, mb); } - else if (a.isWrapClient()) + else if (a.isClientWrap()) { hasWrap = true; setWrapClientHeaderWithoutReturnType(apigen, a, mb); @@ -124,7 +124,7 @@ else if (a.isDisconnect()) { mb.addBodyLine(JavaBuilder.SUPER + ".disconnect(" + ROLE_PARAM + ");\n"); } - else if (a.isWrapClient()) + else if (a.isClientWrap()) { mb.addBodyLine(JavaBuilder.SUPER + ".wrapClient(" + ROLE_PARAM + ", wrapper);\n"); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index 78d983a50..14c42bf57 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -85,7 +85,7 @@ public Map build() // filepath -> source //api.put(getFilePath(getStateChanName(s) + "_Cases"), this.cb.build(this, s)); // FIXME: factor out break; } - case WRAP_SERVER: throw new RuntimeException("TODO"); + case SERVER_WRAP: throw new RuntimeException("TODO"); default: throw new RuntimeException("Shouldn't get in here: " + s); } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/MState.java b/scribble-core/src/main/java/org/scribble/core/model/MState.java index a589cb3c9..e7bfa6065 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MState.java @@ -249,9 +249,9 @@ public boolean equals(Object o) { return false; } - return ((MState) o).canEquals(this) - && this.id == ((MState) o).id; - // Good to use id, due to edge mutability + MState them = (MState) o; + return them.canEquals(this) && this.id == them.id; + // Convenient to use id, due to edge mutability } protected abstract boolean canEquals(MState s); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java index fded28585..e25fef9d6 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java @@ -74,7 +74,7 @@ public boolean hasFireable(EAction a) public boolean isConnectOrWrapClientOnly() { - return this.curr.isConnectOrWrapClientOnly(); + return this.curr.isRequestOrClientWrapOnly(); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index c7ef554d9..6ae3d36a7 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -163,7 +163,7 @@ public EState unfairTransform(ModelFactory mf) seen.add(curr); if (curr.getStateKind() == EStateKind.OUTPUT - && curr.getActions().size() > 1) // >1 is what makes this algorithm terminating -- in the expanded subgraph, the clone of curr will have all other edges pruned + && curr.getActions().size() > 1) // >1 makes this algorithm terminating -- in the expanded subgraph, the clone of curr will have all other edges pruned { expandUnfairCases(mf, term, todo, curr); } @@ -292,7 +292,8 @@ else if (kind == EStateKind.TERMINAL) throw new RuntimeException("TODO: " + kind); } - res += as.stream().map(a -> "\n" + getDetSuccessor(a).toPml(tmp, r)).collect(Collectors.joining("")); + res += as.stream().map(x -> "\n" + getDetSuccessor(x).toPml(tmp, r)) + .collect(Collectors.joining("")); return res; } @@ -309,11 +310,11 @@ private static String getLabel(Map seen, EState s, Role r) } // FIXME: refactor as "isSyncOnly" -- and make an isSync in IOAction - public boolean isConnectOrWrapClientOnly() + public boolean isRequestOrClientWrapOnly() { return getStateKind() == EStateKind.OUTPUT && getActions().stream() - .allMatch(x -> x.isRequest() || x.isWrapClient()); + .allMatch(x -> x.isRequest() || x.isClientWrap()); } public EStateKind getStateKind() @@ -325,14 +326,8 @@ public EStateKind getStateKind() } else { - /*EAction a = as.iterator().next(); - return (a.isSend() || a.isConnect() || a.isDisconnect() || a.isWrapClient() ) ? EStateKind.OUTPUT - //: (a.isConnect() || a.isAccept()) ? Kind.CONNECTION // FIXME: states can have mixed connects and sends - //: (a.isConnect()) ? Kind.CONNECT - : (a.isAccept()) ? EStateKind.ACCEPT // Accept is always unary, guaranteed by treating as a unit message id (wrt. branching) // No: not any more, connect-with-message - : (a.isWrapServer()) ? EStateKind.WRAP_SERVER // WrapServer is always unary, guaranteed by treating as a unit message id (wrt. branching) - : (as.size() > 1) ? EStateKind.POLY_INPUT : EStateKind.UNARY_INPUT;*/ - if (as.stream().allMatch(a -> a.isSend() || a.isRequest() || a.isWrapClient())) // wrapClient should be unary? + if (as.stream() + .allMatch(a -> a.isSend() || a.isRequest() || a.isClientWrap())) // ClientWrap should be unary? { return EStateKind.OUTPUT; } @@ -348,9 +343,9 @@ else if (as.size() == 1 && as.get(0).isDisconnect()) { return EStateKind.OUTPUT; } - else if (as.size() == 1 && as.get(0).isWrapServer()) + else if (as.size() == 1 && as.get(0).isServerWrap()) { - return EStateKind.WRAP_SERVER; + return EStateKind.SERVER_WRAP; } else { @@ -366,7 +361,7 @@ public EGraph toGraph() } @Override - public Set getReachableStates() + public Set getReachableStates() // CHECKME: consider a "lazy" version? Maybe as an Iterator or Stream { return getReachableStatesAux(this); } @@ -375,7 +370,7 @@ public Set getReachableStates() public int hashCode() { int hash = 83; - hash = 31 * hash + super.hashCode(); // N.B. uses state ID only + hash = 31 * hash + super.hashCode(); // N.B. ultimately uses state ID only return hash; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EStateKind.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EStateKind.java index 0d5be968c..169e99fe4 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EStateKind.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EStateKind.java @@ -13,13 +13,13 @@ */ package org.scribble.core.model.endpoint; -// FIXME: consider that enums cannot be "extended" +// CHECKME: consider that enums cannot be "extended", for Scribble extensions public enum EStateKind { - OUTPUT, // SEND, CONNECT and WRAP_CLIENT + TERMINAL, + OUTPUT, // SEND, REQUEST and CLIENT_WRAP UNARY_INPUT, POLY_INPUT, - TERMINAL, - ACCEPT, // Unary/multi accept? - WRAP_SERVER, + ACCEPT, // CHECKME: distinguish unary/multi accept? + SERVER_WRAP, } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java index d7eecb1ab..9422fdfd2 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java @@ -62,12 +62,12 @@ public boolean isAccept() return false; } - public boolean isWrapClient() + public boolean isClientWrap() { return false; } - public boolean isWrapServer() + public boolean isServerWrap() { return false; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EClientWrap.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EClientWrap.java index 778bde013..129910a52 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EClientWrap.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EClientWrap.java @@ -49,7 +49,7 @@ public int hashCode() } @Override - public boolean isWrapClient() + public boolean isClientWrap() { return true; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EServerWrap.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EServerWrap.java index 2c8830d85..f2d81cc74 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EServerWrap.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EServerWrap.java @@ -49,7 +49,7 @@ public int hashCode() } @Override - public boolean isWrapServer() + public boolean isServerWrap() { return true; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index fd38256c8..6c216c338 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -173,7 +173,7 @@ public List sync(Role r1, EAction a1, Role r2, EAction a2) { tmp2 = this.buffs.connect(r1, r2); } - else if (((a1.isWrapClient() && a2.isWrapServer()) || (a1.isWrapServer() && a2.isWrapClient()))) + else if (((a1.isClientWrap() && a2.isServerWrap()) || (a1.isServerWrap() && a2.isClientWrap()))) { tmp2 = this.buffs; // OK, immutable? } @@ -582,7 +582,7 @@ else if (a.isDisconnect()) tmp.add(a); } } - else if (a.isWrapClient()) + else if (a.isClientWrap()) { // FIXME: factor out EClientWrap wc = (EClientWrap) a; @@ -733,11 +733,11 @@ else if (a.isWrapClient()) } break; } - case WRAP_SERVER: + case SERVER_WRAP: { for (EAction a : this.buffs.wrapable(r)) { - if (a.isWrapServer()) + if (a.isServerWrap()) { EServerWrap ws = (EServerWrap) a; EFSM speer = this.efsms.get(ws.peer); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index 1d0a06f42..cb8a940b3 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -164,7 +164,7 @@ else if (a.isAccept() || a.isRequest()) curr.sync(r, a, a.peer, d)); } } - else if (a.isWrapClient() || a.isWrapServer()) + else if (a.isClientWrap() || a.isServerWrap()) { List as = fireable.get(a.peer); EAction w = a.toDual(r); From 13936f5bdbfbb68f86506d6892a2ac6ffe08f8ad Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 17 Apr 2019 00:53:56 +0100 Subject: [PATCH 310/539] [AllTest] Continued: refactoring core model classes. --- .../java/org/scribble/core/model/MState.java | 3 +- .../scribble/core/model/endpoint/EState.java | 55 +++++++++++-------- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/MState.java b/scribble-core/src/main/java/org/scribble/core/model/MState.java index e7bfa6065..2e62ceb6d 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MState.java @@ -17,6 +17,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -193,7 +194,7 @@ public S getTerminal() protected Set getReachableStatesAux(S start) { Map all = new HashMap<>(); - Map todo = new HashMap<>(); //LinkedHashMap<>(); -- ? + Map todo = new LinkedHashMap<>(); // Linked unnecessary, but to follow the iteration pattern todo.put(this.id, start); // Suppressed: assumes ModelState subclass correctly instantiates S parameter while (!todo.isEmpty()) { diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index 6ae3d36a7..8c61717f7 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -50,6 +50,7 @@ protected EState cloneNode(ModelFactory mf, Set labs) } // Fully clones the reachable graph (i.e. the "general" graph -- cf., EGraph, the specific Scribble concept of an endpoint protocol graph) + // N.B. cloning means the states, actions are immutable protected EState clone(ModelFactory mf) { Map clones = new HashMap<>(); // Original s.id -> clone @@ -82,7 +83,8 @@ protected EState clone(ModelFactory mf) // i.e., this-a->succ ("a" is possibly non-det) // Returns the clone of the subgraph rooted at succ, with all non- "this-a->succ" actions pruned from the clone of "this" state // i.e., we took "a" from "this" to get to succ (the subgraph root); if we enter "this" again (inside the subgraph), then always take "a" again - private EState unfairClone(ModelFactory mf, EState term, EAction a, EState succ) // Need succ param for non-det + // N.B. cloning means the states, actions are immutable + private EState unfairCloneSubgraph(ModelFactory mf, EState term, EAction a, EState succ) // Need succ param for non-det { Map clones = new HashMap<>(); // Original s.id -> clone Function getClone = x -> @@ -109,7 +111,7 @@ private EState unfairClone(ModelFactory mf, EState term, EAction a, EState succ) Iterator succs = s.getSuccs().iterator(); EState clone = getClone.apply(s); boolean done = false; - // Used to add *at most* one edge, out of potentially multiple non-det a, from this-a->succ + // Restricts adding of *at most* one "this-a->succ" edge out of potentially multiple non-det "a" // i.e., unfair expansion prunes non-det "a" ("determinizes" entry) from "this" into the cloned subgraph // Cf. MState.addEdge(A, S), previously implicitly pruned all non-det "this-a->s" for the same "s" while (as.hasNext()) @@ -145,18 +147,19 @@ else if (na.equals(a) && ns.equals(succ) && !done) .. should be fine, check set of roles on each path is equal, except for accept-guarded initial roles*/ public EState unfairTransform(ModelFactory mf) { - EState init = clone(mf); + EState init = clone(mf); // All state refs from here on are clones EState term = init.getTerminal(); Set seen = new HashSet<>(); - Set todo = new LinkedHashSet<>(); + Set todo = new LinkedHashSet<>(); // Linked unnecessary, but to follow the iteration pattern todo.add(init); while (!todo.isEmpty()) { Iterator i = todo.iterator(); EState curr = i.next(); i.remove(); - - if (seen.contains(curr)) + if (seen.contains(curr)) + // Convenient to check here (even though may get curr multiple times) to avoid doing the check before every todo.add + // N.B. todo is also aliased from expandUnfairCases { continue; } @@ -172,57 +175,61 @@ public EState unfairTransform(ModelFactory mf) todo.addAll(curr.getSuccs()); } } - return init; } + // N.B. todo alias from unfairTransform -- refactor as return? (slower) + // Pre: curr.getStateKind() == EStateKind.OUTPUT && curr.getActions().size() > 1 + // All involved states are already clones private void expandUnfairCases(ModelFactory mf, EState term, Set todo, EState curr) { Iterator as = curr.getActions().iterator(); Iterator succs = curr.getSuccs().iterator(); - List cloneas = new LinkedList<>(); - List cloness = new LinkedList<>(); - Map> toRemove = new HashMap<>(); // List needed for multiple edges to remove to the same state: e.g. mu X.(A->B:1 + A->B:2).X + List aclones = new LinkedList<>(); // Actions involved in clones (not actually cloned themselves, immutable) + List succClones = new LinkedList<>(); + Map> toRemove = new HashMap<>(); // Original succ -> actions "a" where "curr-a->succ" + // List needed to handle removing multiple edges to the same state: e.g. mu X.(A->B:1 + A->B:2).X while (as.hasNext()) { EAction a = as.next(); EState succ = succs.next(); - if (!succ.canReach(curr)) + if (!succ.canReach(curr)) // Do unfairCloneSubgraph for each (potentially) "recursive" action { todo.add(succ); continue; } - EState clone = curr.unfairClone(mf, term, a, succ); // succ is a successor of curr - cloneas.add(a); - cloness.add(clone); + EState succClone = curr.unfairCloneSubgraph(mf, term, a, succ); // succ is a successor of curr + aclones.add(a); + succClones.add(succClone); List tmp = toRemove.get(succ); if (tmp == null) { tmp = new LinkedList<>(); toRemove.put(succ, tmp); } - tmp.add(a); + tmp.add(a); // To replace original edge with new edge into unfair-cloned subgraph } - if (!cloneas.isEmpty()) // Redundant, but more clear + if (!aclones.isEmpty()) // Redundant (toRemove would also be empty), but more clear { for (EState succ : toRemove.keySet()) { for (EAction a1 : toRemove.get(succ)) { - curr.removeEdge(a1, succ); + curr.removeEdge(a1, succ); // First, remove original edge to original succ } } - Iterator icloneas = cloneas.iterator(); - Iterator icloness = cloness.iterator(); - while (icloneas.hasNext()) + Iterator iaclones = aclones.iterator(); + Iterator isuccClones = succClones.iterator(); + while (iaclones.hasNext()) { - EAction a = icloneas.next(); - EState s = icloness.next(); // clones of the succs from toRemove above - curr.addEdge(a, s); - todo.add(s); // Doesn't work if non-det preserved by the "unfairClone" aux (recursively edges>1) + EAction a = iaclones.next(); // Same actions involved in toRemove loop above + EState succClone = isuccClones.next(); // Clones of the succs involved in toRemove loop above + curr.addEdge(a, succClone); // Second, add edge to cloned succ (entry to the unfair-cloned subgraph) + todo.add(succClone); // This will cause unfairTransform to "recursively" visit the nodes of the unfair-cloned subgraph + // Doesn't work if non-det preserved by the "unfairClone" aux (recursively, edges always >1 -- termination condition never met) // Idea is to bypass succ clone (for non-det, edges>1) but in general this will be cloned again before returning to it, so bypass doesn't work -- to solve this more generally probably need to keep a record of all clones to bypass future clones } } From 8d8f4d76414769fa191f9ed1ee92903edf512c63 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 17 Apr 2019 12:53:53 +0100 Subject: [PATCH 311/539] [AllTest] Continued: refactoring core model classes. --- .../main/java/org/scribble/core/job/Core.java | 58 ++++++++++++++----- .../org/scribble/core/job/CoreContext.java | 33 ++++++----- .../scribble/core/lang/global/GProtocol.java | 6 +- .../core/model/endpoint/AutGraphParser.java | 1 + .../scribble/core/model/endpoint/EState.java | 3 +- scribble-test/src/test/scrib/tmp/Test.scr | 19 ++++++ 6 files changed, 86 insertions(+), 34 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index e99dd45ac..e16a97c6c 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -81,11 +81,20 @@ protected CoreContext newCoreContext(//Map modcs, public void runPasses() throws ScribException { - runContextBuildingPasses(); // Includes runProjectionPasses - runValidationPasses(); + runContextBuildingPasses(); // Populates JobContext -- includes runProjectionPasses and runEfsmBuildingPasses + runSyntacticWfPasses(); + runModelCheckingPasses(); } + // Populates JobContext -- although patten is to do on-demand via (first) getter, so (partially) OK to delay population public void runContextBuildingPasses() // No ScribException, no errors expected + { + runInliningAndUnfoldingPasses(); + runProjectionPasses(); // Do before any validation (i.e., including global WF), to promote greater tool feedback + runEfsmBuildingPasses(); + } + + private void runInliningAndUnfoldingPasses() { verbosePrintPass("Inlining subprotocols for all globals..."); for (GProtocol imed : this.context.getIntermediates()) @@ -105,18 +114,6 @@ public void runContextBuildingPasses() // No ScribException, no errors expected verbosePrintPass( "Unfolded all recursions once: " + inlined.fullname + "\n" + unf); } - - runProjectionPasses(); // Do before any validation (i.e., including global WF), to promote greater tool feedback - - verbosePrintPass("Building EFSMs for all projected inlineds..."); - for (Entry e : this.context.getProjectedInlineds() - .entrySet()) - { - LProtocol proj = e.getValue(); - EGraph graph = proj.toEGraph(this); - this.context.addEGraph(proj.fullname, graph); - verbosePrintPass("Built EFSM: " + proj.fullname + ":\n" + graph.toDot()); - } } // Due to Projector not being a subprotocol visitor, so "external" subprotocols may not be visible in ModuleContext building for the projections of the current root Module @@ -150,8 +147,34 @@ protected void runProjectionPasses() // No ScribException, no errors expected } } } + + private void runEfsmBuildingPasses() + { + verbosePrintPass("Building EFSMs for all projected inlineds..."); + for (Entry e : this.context.getProjectedInlineds() + .entrySet()) + { + LProtocol proj = e.getValue(); + EGraph graph = proj.toEGraph(this); // CHECKME: refactor actual construction back to on-demand in Context, and just use getters here? And for other passes? + this.context.addEGraph(proj.fullname, graph); + verbosePrintPass("Built EFSM: " + proj.fullname + ":\n" + graph.toDot()); + } + + /*if (!this.config.args.get(CoreArgs.FAIR)) + { + // Pre: runSyntacticWfPasses -- depends on WF (role enabling, e.g., bad.wfchoice.enabling.threeparty.Test02), for graph building algorithm to work + verbosePrintPass("Building \"unfair\" EFSMs for all projected inlineds..."); + for (Entry e : this.context.getProjectedInlineds() + .entrySet()) + { + LProtocol proj = e.getValue(); // FIXME: don't need actual proj + EGraph graph = this.context.getUnfairEGraph(proj.fullname); // CHECKME: refactor actual construction back to on-demand in Context, and just use getters here? And for other passes? + verbosePrintPass("Built \"unfair\" EFSM: " + proj.fullname + ":\n" + graph.toDot()); + } + }*/ + } - public void runValidationPasses() throws ScribException + public void runSyntacticWfPasses() throws ScribException { verbosePrintPass( "Checking for unused role decls on all inlined globals..."); @@ -195,8 +218,11 @@ public void runValidationPasses() throws ScribException { proj.checkReachability(); } + } - verbosePrintPass("Building and checking models from projected inlineds..."); + public void runModelCheckingPasses() throws ScribException + { + verbosePrintPass("Building and checking models from projected inlineds..."); // Move model building earlier? // CHECKME: refactor more/whole validation into lang.GProtocol ? for (GProtocol iproj : (Iterable) this.context.getInlineds() .stream().filter(x -> !x.isAux())::iterator) diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index b5ef7c6a2..02a4a8c75 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -189,12 +189,15 @@ protected void addEGraph(LProtoName fullname, EGraph graph) // N.B. graphs built from inlined (not unfolded) public EGraph getEGraph(GProtoName fullname, Role role) - throws ScribException { - LProtoName fulllpn = InlinedProjector.getFullProjectionName(fullname, - role); + return getEGraph(InlinedProjector.getFullProjectionName(fullname, + role)); // Moved form LProtocolDecl - EGraph graph = this.fEGraphs.get(fulllpn); + } + + public EGraph getEGraph(LProtoName fullname) + { + EGraph graph = this.fEGraphs.get(fullname); if (graph == null) { /*Module proj = getProjection(fullname, role); // Projected module contains a single protocol @@ -202,7 +205,7 @@ public EGraph getEGraph(GProtoName fullname, Role role) proj.accept(builder); graph = builder.util.finalise(); addEGraph(fulllpn, graph);*/ - throw new RuntimeException("Shouldn't get in here: "); + throw new RuntimeException("Shouldn't get in here: "); // FIXME: restore previous pattern, construct on (first) get } return graph; } @@ -213,21 +216,23 @@ protected void addUnfairEGraph(LProtoName fullname, EGraph graph) } public EGraph getUnfairEGraph(GProtoName fullname, Role role) - throws ScribException { - LProtoName projFullname = InlinedProjector.getFullProjectionName(fullname, - role); + return getUnfairEGraph( + InlinedProjector.getFullProjectionName(fullname, role)); + } - EGraph unfair = this.uEGraphs.get(projFullname); + public EGraph getUnfairEGraph(LProtoName fullname) + { + EGraph unfair = this.uEGraphs.get(fullname); if (unfair == null) { - unfair = getEGraph(fullname, role).init + unfair = getEGraph(fullname).init .unfairTransform(this.core.config.mf).toGraph(); - addUnfairEGraph(projFullname, unfair); + addUnfairEGraph(fullname, unfair); + + //System.out.println("\nUnfair: " + fullname + "\n" + unfair.toDot()); + } - - //System.out.println("\nunfair " + projFullname + ":\n" + unfair.toDot()); // TODO: verbose printing for unfair EGraphs - return unfair; } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 4ddc808b5..a003a3874 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -135,7 +135,7 @@ public GProtocol getInlined(STypeInliner v) { // TODO: factor out with LProtocol List> params = new LinkedList<>(); - // Convert MemberName params to Args -- cf. NonRoleArgList::getParamKindArgs + // Convert MemberName params to Args -- cf. NonRoleArgList::getParamKindArgs -- TODO: factor out for (MemberName n : this.params) { if (n instanceof DataName) @@ -156,8 +156,8 @@ else if (n instanceof SigName) Substitutor subs = new Substitutor<>(this.roles, sig.roles, this.params, sig.args); - /*GSeq body = (GSeq) this.def.visitWithNoEx(subs).visitWithNoEx(v) - .visitWithNoEx(new RecPruner<>());*/ + /*GSeq body = (GSeq) this.def.visitWithNoThrow(subs).visitWithNoThrow(v) + .visitWithNoThrow(new RecPruner<>());*/ GSeq body = new RecPruner() .visitSeq(v.visitSeq(subs.visitSeq(this.def))); RecVar rv = v.getInlinedRecVar(sig); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java index abff6e6c8..53577cbf0 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java @@ -36,6 +36,7 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; +// Relocate to util? public class AutGraphParser { private final Core core; diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index 8c61717f7..24e7729cc 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -84,6 +84,7 @@ protected EState clone(ModelFactory mf) // Returns the clone of the subgraph rooted at succ, with all non- "this-a->succ" actions pruned from the clone of "this" state // i.e., we took "a" from "this" to get to succ (the subgraph root); if we enter "this" again (inside the subgraph), then always take "a" again // N.B. cloning means the states, actions are immutable + // Consider gproto annotations to specify which states to unfair-clone, i.e., choice-specific fairness private EState unfairCloneSubgraph(ModelFactory mf, EState term, EAction a, EState succ) // Need succ param for non-det { Map clones = new HashMap<>(); // Original s.id -> clone @@ -147,7 +148,7 @@ else if (na.equals(a) && ns.equals(succ) && !done) .. should be fine, check set of roles on each path is equal, except for accept-guarded initial roles*/ public EState unfairTransform(ModelFactory mf) { - EState init = clone(mf); // All state refs from here on are clones + EState init = clone(mf); // All state refs from here on are clones, original Graph unmodified EState term = init.getTerminal(); Set seen = new HashSet<>(); Set todo = new LinkedHashSet<>(); // Linked unnecessary, but to follow the iteration pattern diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index dbe439fdb..ddc6d25dc 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -98,6 +98,7 @@ module tmp.Test; // codegen refactoring: + // choice-specific fairness annotations // Test refactoring: // refactor test to use main instead of cli @@ -105,7 +106,24 @@ module tmp.Test; data "..." from "..." as T; +//* +global protocol Proto1(role A, role B, role C) +{ + choice at A + { + 1() from A to C; + do Proto1(A, B, C); + } + or + { + 2() from A to B; + 2() from A to C; + } +} +//*/ + +/* global protocol Proto1(role A, role B) { choice at A @@ -121,6 +139,7 @@ global protocol Proto1(role A, role B) //4() from B to A; do Proto1(A, B); } +//*/ /* From a77895be32ab96b7fc7beda06e87607f9d4810d4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 17 Apr 2019 14:31:37 +0100 Subject: [PATCH 312/539] [AllTest] Continued: refactoring CoreContext getters/setters. --- .../main/java/org/scribble/core/job/Core.java | 13 ++- .../org/scribble/core/job/CoreContext.java | 89 +++++++++++-------- .../core/visit/local/LTypeInliner.java | 2 +- 3 files changed, 63 insertions(+), 41 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index e16a97c6c..ca33317c4 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -21,6 +21,7 @@ import java.util.stream.Collectors; import org.scribble.core.lang.global.GProtocol; +import org.scribble.core.lang.local.LProjection; import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.ModelFactory; import org.scribble.core.model.ModelFactoryImpl; @@ -127,8 +128,10 @@ protected void runProjectionPasses() // No ScribException, no errors expected for (Role self : inlined.roles) { // pruneRecs already done (see runContextBuildingPasses) - LProtocol iproj = inlined.projectInlined(this, self); // CHECKME: projection and inling commutative? - this.context.addProjectedInlined(iproj.fullname, iproj); + /*LProtocol iproj = inlined.projectInlined(this, self); // CHECKME: projection and inling commutative? + this.context.addProjectedInlined(iproj.fullname, iproj);*/ + LProjection iproj = this.context.getProjectedInlined(inlined.fullname, + self); verbosePrintPass("Projected inlined onto " + self + ": " + inlined.fullname + "\n" + iproj); } @@ -140,8 +143,9 @@ protected void runProjectionPasses() // No ScribException, no errors expected { for (Role self : imed.roles) { - LProtocol proj = imed.project(this, self); // Does pruneRecs - this.context.addProjection(proj); + /*LProjection proj = imed.project(this, self); // Does pruneRecs + this.context.addProjection(proj);*/ + LProjection proj = this.context.getProjection(imed.fullname, self); verbosePrintPass("Projected intermediate onto " + self + ": " + imed.fullname + "\n" + proj); } @@ -154,6 +158,7 @@ private void runEfsmBuildingPasses() for (Entry e : this.context.getProjectedInlineds() .entrySet()) { + // Seems to be OK even if runSyntacticWfPasses fails (cf. unfair transform) LProtocol proj = e.getValue(); EGraph graph = proj.toEGraph(this); // CHECKME: refactor actual construction back to on-demand in Context, and just use getters here? And for other passes? this.context.addEGraph(proj.fullname, graph); diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index 02a4a8c75..e53887442 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -22,6 +22,7 @@ import java.util.stream.Collectors; import org.scribble.core.lang.global.GProtocol; +import org.scribble.core.lang.local.LProjection; import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.endpoint.AutGraphParser; import org.scribble.core.model.endpoint.EGraph; @@ -54,12 +55,12 @@ public class CoreContext private final Map inlined = new HashMap<>(); // Projected from inlined; keys are full names - private final Map iprojs = new HashMap<>(); // CHECKME: rename projis? + private final Map iprojs = new HashMap<>(); // CHECKME: rename projis? // Projected from intermediates // LProtocolName is the full local protocol name (module name is the prefix) // LProtocolName key is LProtocol value fullname (i.e., redundant) - private final Map projs = new HashMap<>(); + private final Map projs = new HashMap<>(); // Built from projected inlined private final Map fEGraphs = new HashMap<>(); @@ -129,57 +130,71 @@ public Set getInlineds() } // Projected from inlined - public void addProjectedInlined(LProtoName fullname, LProtocol l) + public LProjection getProjectedInlined(GProtoName fullname, Role self) { - this.iprojs.put(fullname, l); - } - - public LProtocol getProjectedInlined(GProtoName fullname, Role self) - { - LProtoName p = InlinedProjector.getFullProjectionName(fullname, self); - return getProjectedInlined(p); + LProtoName projFullname = InlinedProjector.getFullProjectionName(fullname, self); + LProjection iproj = this.iprojs.get(fullname); + if (iproj == null) + { + iproj = getInlined(fullname).projectInlined(this.core, self); + addProjectedInlined(projFullname, iproj); + } + return iproj; } - public LProtocol getProjectedInlined(LProtoName fullname) + /*public LProjection getProjectedInlined(LProtoName fullname) { - return this.iprojs.get(fullname); - } + LProjection iproj = this.iprojs.get(fullname); + if (iproj == null) + { + // FIXME: need global inlined to build (reverse derive from fullname?) + throw new RuntimeException("[TODO]: " + fullname); + } + return iproj; + }*/ public Map getProjectedInlineds() { return Collections.unmodifiableMap(this.iprojs); } - // Projected from intermediate - public void addProjection(LProtocol p) + protected void addProjectedInlined(LProtoName fullname, LProjection iproj) { - /*LProtocolName lpn = (LProtocolName) mod.getProtoDeclChildren().get(0) - .getFullMemberName(mod); - this.projected.put(lpn, mod);*/ - this.projs.put(p.fullname, p); + this.iprojs.put(fullname, iproj); } - - public //Module - LProtocol getProjection(GProtoName fullname, Role role) - throws ScribException + + // Projected from intermediate + // Core gives LProjection -- projection Modules should be by Job + public LProjection getProjection(GProtoName fullname, Role self) { - return getProjection(InlinedProjector.getFullProjectionName(fullname, role)); + LProtoName projFullname = InlinedProjector.getFullProjectionName(fullname, + self); + LProjection proj = this.projs.get(fullname); + if (proj == null) + { + proj = getInlined(fullname).project(this.core, self); + addProjectedInlined(projFullname, proj); + } + return proj; } - public //Module - LProtocol getProjection(LProtoName fullname) - //throws ScribbleException + public LProjection getProjection(LProtoName fullname) { - /*Module proj = this.projected.get(fullname); - if (proj == null)*/ - /*if (!this.projected.containsKey(fullname)) + LProjection proj = this.projs.get(fullname); + if (proj == null) { - throw new ScribbleException( - "Projection not found: " + fullname); - // E.g. disamb/enabling error before projection passes (e.g. CommandLine -fsm arg) - //CHECKME: should not occur any more? - }*/ - return this.projs.get(fullname); + // FIXME: need global imed to build (reverse derive from fullname?) + throw new RuntimeException("[TODO]: " + fullname); + } + return proj; + } + + protected void addProjection(LProjection proj) + { + /*LProtocolName lpn = (LProtocolName) mod.getProtoDeclChildren().get(0) + .getFullMemberName(mod); + this.projected.put(lpn, mod);*/ + this.projs.put(proj.fullname, proj); } protected void addEGraph(LProtoName fullname, EGraph graph) @@ -215,12 +230,14 @@ protected void addUnfairEGraph(LProtoName fullname, EGraph graph) this.uEGraphs.put(fullname, graph); } + // Pre: Core.runSyntacticWfPasses public EGraph getUnfairEGraph(GProtoName fullname, Role role) { return getUnfairEGraph( InlinedProjector.getFullProjectionName(fullname, role)); } + // Pre: Core.runSyntacticWfPasses public EGraph getUnfairEGraph(LProtoName fullname) { EGraph unfair = this.uEGraphs.get(fullname); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java index ee5ca99f5..20eb3c2e7 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java @@ -49,7 +49,7 @@ public > LType visitDo(Do n) LProtocol p = this.core.getContext().getProjection(fullname); // This line differs from GDo version Substitutor subs = new Substitutor<>(p.roles, n.roles, p.params, n.args); - //LSeq inlined = (LSeq) p.def.visitWithNoEx(subs).visitWithNoEx(this); + //LSeq inlined = (LSeq) p.def.visitWithNoThrow(subs).visitWithNoThrow(this); LSeq inlined = visitSeq(subs.visitSeq(p.def)); // i.e. returning a Seq -- rely on parent Seq to inline popSig(); From ea8ca333b78808b30a45ab098a0e274d5194bb4e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 17 Apr 2019 15:20:25 +0100 Subject: [PATCH 313/539] [AllTest] Continued: refactoring CoreContext. --- .../main/java/org/scribble/core/job/Core.java | 114 ++++++++++-------- .../org/scribble/core/job/CoreContext.java | 81 +++++++------ .../core/visit/ProtoDepsCollector.java | 2 +- 3 files changed, 108 insertions(+), 89 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index ca33317c4..208077676 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -16,7 +16,6 @@ import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; @@ -41,7 +40,6 @@ import org.scribble.core.visit.NonProtoDepsGatherer; import org.scribble.core.visit.ProtoDepsCollector; import org.scribble.core.visit.RoleGatherer; -import org.scribble.core.visit.global.GTypeInliner; import org.scribble.core.visit.global.GTypeUnfolder; import org.scribble.util.ScribException; @@ -98,18 +96,18 @@ public void runContextBuildingPasses() // No ScribException, no errors expected private void runInliningAndUnfoldingPasses() { verbosePrintPass("Inlining subprotocols for all globals..."); - for (GProtocol imed : this.context.getIntermediates()) + for (GProtoName fullname : this.context.getParsedFullnames()) { - GTypeInliner v = new GTypeInliner(this); - GProtocol inlined = imed.getInlined(v); // Protocol.getInlined does pruneRecs + GProtocol inlined = this.context.getInlined(fullname); verbosePrintPass( - "Inlined subprotocols: " + imed.fullname + "\n" + inlined); - this.context.addInlined(imed.fullname, inlined); + "Inlined subprotocols: " + fullname + "\n" + inlined); } verbosePrintPass("Unfolding all recursions once for all inlined globals..."); - for (GProtocol inlined : this.context.getInlineds()) + for (GProtoName fullname : this.context.getParsedFullnames()) { + // TODO: currently, unfolded not actually stored by Context -- unfoldAllOnce repeated manually when needed, e.g., runSyntacticWfPasses + GProtocol inlined = this.context.getInlined(fullname); GTypeUnfolder v = new GTypeUnfolder(); GProtocol unf = (GProtocol) inlined.unfoldAllOnce(v);//.unfoldAllOnce(unf2); // CHECKME: twice unfolding? instead of "unguarded"-unfolding? verbosePrintPass( @@ -123,13 +121,13 @@ private void runInliningAndUnfoldingPasses() protected void runProjectionPasses() // No ScribException, no errors expected { verbosePrintPass("Projecting all inlined globals..."); - for (GProtocol inlined : this.context.getInlineds()) + for (GProtoName fullname : this.context.getParsedFullnames()) { + GProtocol inlined = this.context.getInlined(fullname); for (Role self : inlined.roles) { // pruneRecs already done (see runContextBuildingPasses) - /*LProtocol iproj = inlined.projectInlined(this, self); // CHECKME: projection and inling commutative? - this.context.addProjectedInlined(iproj.fullname, iproj);*/ + // CHECKME: projection and inling commutative? LProjection iproj = this.context.getProjectedInlined(inlined.fullname, self); verbosePrintPass("Projected inlined onto " + self + ": " @@ -139,12 +137,11 @@ protected void runProjectionPasses() // No ScribException, no errors expected // Pre: inlined already projected -- used for Do projection verbosePrintPass("Projecting all intermediate globals..."); - for (GProtocol imed : this.context.getIntermediates()) + for (GProtoName fullname : this.context.getParsedFullnames()) { + GProtocol imed = this.context.getIntermediate(fullname); for (Role self : imed.roles) { - /*LProjection proj = imed.project(this, self); // Does pruneRecs - this.context.addProjection(proj);*/ LProjection proj = this.context.getProjection(imed.fullname, self); verbosePrintPass("Projected intermediate onto " + self + ": " + imed.fullname + "\n" + proj); @@ -155,14 +152,16 @@ protected void runProjectionPasses() // No ScribException, no errors expected private void runEfsmBuildingPasses() { verbosePrintPass("Building EFSMs for all projected inlineds..."); - for (Entry e : this.context.getProjectedInlineds() - .entrySet()) + for (GProtoName fullname : this.context.getParsedFullnames()) { - // Seems to be OK even if runSyntacticWfPasses fails (cf. unfair transform) - LProtocol proj = e.getValue(); - EGraph graph = proj.toEGraph(this); // CHECKME: refactor actual construction back to on-demand in Context, and just use getters here? And for other passes? - this.context.addEGraph(proj.fullname, graph); - verbosePrintPass("Built EFSM: " + proj.fullname + ":\n" + graph.toDot()); + GProtocol imed = this.context.getIntermediate(fullname); + for (Role self : imed.roles) + { + // Seems to be OK even if runSyntacticWfPasses fails (cf. unfair transform) + EGraph graph = this.context.getEGraph(fullname, self); + verbosePrintPass( + "Built EFSM: " + imed.fullname + ":\n" + graph.toDot()); + } } /*if (!this.config.args.get(CoreArgs.FAIR)) @@ -172,9 +171,9 @@ private void runEfsmBuildingPasses() for (Entry e : this.context.getProjectedInlineds() .entrySet()) { - LProtocol proj = e.getValue(); // FIXME: don't need actual proj - EGraph graph = this.context.getUnfairEGraph(proj.fullname); // CHECKME: refactor actual construction back to on-demand in Context, and just use getters here? And for other passes? - verbosePrintPass("Built \"unfair\" EFSM: " + proj.fullname + ":\n" + graph.toDot()); + LProtocol iproj = e.getValue(); // FIXME: don't need actual proj + EGraph graph = this.context.getUnfairEGraph(iproj.fullname); // CHECKME: refactor actual construction back to on-demand in Context, and just use getters here? And for other passes? + verbosePrintPass("Built \"unfair\" EFSM: " + iproj.fullname + ":\n" + graph.toDot()); } }*/ } @@ -183,45 +182,61 @@ public void runSyntacticWfPasses() throws ScribException { verbosePrintPass( "Checking for unused role decls on all inlined globals..."); - for (GProtocol inlined : this.context.getInlineds()) + for (GProtoName fullname : this.context.getParsedFullnames()) { // CHECKME: relegate to "warning" ? -- some downsteam operations may depend on this though (e.g., graph building?) - Set used = inlined.def + Set used = this.context.getInlined(fullname).def .gather(new RoleGatherer()::visit) .collect(Collectors.toSet()); - Set unused = this.context.getIntermediate(inlined.fullname).roles + Set unused = this.context.getIntermediate(fullname).roles // imeds have original role decls (inlined's are pruned) .stream().filter(x -> !used.contains(x)).collect(Collectors.toSet()); if (!unused.isEmpty()) { throw new ScribException( - "Unused roles in " + inlined.fullname + ": " + unused); + "Unused roles in " + fullname + ": " + unused); } } verbosePrintPass("Checking role enabling on all inlined globals..."); - for (GProtocol inlined : (Iterable) this.context.getInlineds() - .stream().filter(x -> !x.isAux())::iterator) + for (GProtoName fullname : this.context.getParsedFullnames()) { + GProtocol inlined = this.context.getInlined(fullname); + if (inlined.isAux()) + { + continue; + } GTypeUnfolder v = new GTypeUnfolder(); //e.g., C->D captured under an A->B choice after unfolding, cf. bad.wfchoice.enabling.twoparty.Test01b; inlined.unfoldAllOnce(v).checkRoleEnabling(); + // TODO: get unfolded from Context } verbosePrintPass( "Checking consistent external choice subjects on all inlined globals..."); - for (GProtocol inlined : (Iterable) this.context.getInlineds() - .stream().filter(x -> !x.isAux())::iterator) + for (GProtoName fullname : this.context.getParsedFullnames()) { + GProtocol inlined = this.context.getInlined(fullname); + if (inlined.isAux()) + { + continue; + } inlined.checkExtChoiceConsistency(); } verbosePrintPass("Checking reachability on all projected inlineds..."); - for (LProtocol proj : (Iterable) this.context - .getProjectedInlineds().values().stream() - .filter(x -> !x.isAux())::iterator) // CHECKME? e.g., bad.reach.globals.gdo.Test01b + for (GProtoName fullname : this.context.getParsedFullnames()) { - proj.checkReachability(); + GProtocol imed = this.context.getIntermediate(fullname); + if (imed.isAux()) // CHECKME: also check for aux? e.g., bad.reach.globals.gdo.Test01b + { + continue; + } + for (Role r : imed.roles) + { + LProjection iproj = this.context.getProjectedInlined(fullname, r); + iproj.checkReachability(); + } } } @@ -229,10 +244,13 @@ public void runModelCheckingPasses() throws ScribException { verbosePrintPass("Building and checking models from projected inlineds..."); // Move model building earlier? // CHECKME: refactor more/whole validation into lang.GProtocol ? - for (GProtocol iproj : (Iterable) this.context.getInlineds() - .stream().filter(x -> !x.isAux())::iterator) + for (GProtoName fullname : this.context.getParsedFullnames()) { - verbosePrintPass("Validating: " + iproj.fullname); + if (this.context.getIntermediate(fullname).isAux()) + { + continue; + } + verbosePrintPass("Validating: " + fullname); if (this.config.args.get(CoreArgs.SPIN)) { if (this.config.args.get(CoreArgs.FAIR)) @@ -240,16 +258,16 @@ public void runModelCheckingPasses() throws ScribException throw new RuntimeException( "[TODO]: -spin currently does not support fair ouput choices."); } - GProtocol.validateBySpin(this, iproj.fullname); + GProtocol.validateBySpin(this, fullname); } else { - GProtocol.validateByScribble(this, iproj.fullname, true); + GProtocol.validateByScribble(this, fullname, true); if (!this.config.args.get(CoreArgs.FAIR)) { verbosePrintPass( - "Validating with \"unfair\" output choices: " + iproj.fullname); - GProtocol.validateByScribble(this, iproj.fullname, false); // TODO: only need to check progress, not full validation + "Validating with \"unfair\" output choices: " + fullname); + GProtocol.validateByScribble(this, fullname, false); // TODO: only need to check progress, not full validation } } } @@ -277,14 +295,14 @@ public Map getProjections(GProtoName fullname, LProtocol proj = this.context.getProjection(fullname, role); - List> ps = proj.def + List> pfullnames = proj.def .gather(new ProtoDepsCollector()::visit) .collect(Collectors.toList()); - for (ProtoName p : ps) + for (ProtoName pfullname : pfullnames) { - System.out.println("\n" + this.context.getProjection((LProtoName) p)); + System.out.println("\n" + this.context.getProjection((LProtoName) pfullname)); } - if (!ps.contains(proj.fullname)) + if (!pfullnames.contains(proj.fullname)) { System.out.println("\n" + proj); } @@ -294,7 +312,7 @@ public Map getProjections(GProtoName fullname, .collect(Collectors.toList()); warningPrintln(""); - warningPrintln("[TODO] Full module projection and imports: " + warningPrintln("[TODO] Full module projection (with imports): " + fullname + "@" + role); return Collections.emptyMap(); diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index e53887442..9bff9286d 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -14,23 +14,20 @@ package org.scribble.core.job; import java.io.File; -import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.lang.local.LProjection; -import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.endpoint.AutGraphParser; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.global.SGraph; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; -import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.Role; +import org.scribble.core.visit.global.GTypeInliner; import org.scribble.core.visit.global.InlinedProjector; import org.scribble.util.ScribException; import org.scribble.util.ScribUtil; @@ -81,53 +78,53 @@ protected CoreContext(Core core, //Map modcs, .collect(Collectors.toMap(x -> x.fullname, x -> x)); } - // Used by Job for pass running, includes projections (e.g. for reachability checking) - // Safer to get module names and require user to re-fetch the module by the getter each time (after replacing), to make sure the latest is used - public Set getFullModuleNames() + // Used by Core for pass running + // Safer to return names and require user to get the target value by name, to make sure the value is created + public Set getParsedFullnames() { - Set modnames = new HashSet<>(); - modnames.addAll(getParsedFullModuleNames()); - modnames.addAll(getProjectedFullModuleNames()); - return modnames; + return this.imeds.keySet().stream().collect(Collectors.toSet()); } - public Set getParsedFullModuleNames() + /*// Pre: getProjectedInlined done for all... -- or directly derive these from the global names? + // N.B. uses this.*i*projs (more "important" than this.projs?) + public Set getProjectedFullnames() { - //return Collections.unmodifiableSet(this.parsed.keySet()); - return this.imeds.keySet().stream().map(x -> x.getPrefix()) - .collect(Collectors.toSet()); - } - - public Set getProjectedFullModuleNames() - { - return this.projs.keySet().stream().map(x -> x.getPrefix()) - .collect(Collectors.toSet()); - } + return this.iprojs.keySet().stream().collect(Collectors.toSet()); + }*/ public GProtocol getIntermediate(GProtoName fullname) { return this.imeds.get(fullname); } + /*// OK for prevoius CoreContext with more basic getters/setters -- now values created on-demand by individual getters, so a collective getter is less suitable public Set getIntermediates() { return this.imeds.values().stream().collect(Collectors.toSet()); - } + }*/ - public void addInlined(GProtoName fullname, GProtocol g) + public GProtocol getInlined(GProtoName fullname) { - this.inlined.put(fullname, g); + GProtocol inlined = this.inlined.get(fullname); + if (inlined == null) + { + GTypeInliner v = new GTypeInliner(this.core); // Factor out? + inlined = this.imeds.get(fullname).getInlined(v); // Protocol.getInlined does pruneRecs + addInlined(fullname, inlined); + } + return inlined; } - public GProtocol getInlined(GProtoName fullname) + protected void addInlined(GProtoName fullname, GProtocol g) { - return this.inlined.get(fullname); + this.inlined.put(fullname, g); } + /*// OK for prevoius CoreContext with more basic getters/setters -- now values created on-demand by individual getters, so a collective getter is less suitable public Set getInlineds() { return this.inlined.values().stream().collect(Collectors.toSet()); - } + }*/ // Projected from inlined public LProjection getProjectedInlined(GProtoName fullname, Role self) @@ -153,10 +150,12 @@ public LProjection getProjectedInlined(GProtoName fullname, Role self) return iproj; }*/ + /*// OK for prevoius CoreContext with more basic getters/setters -- now values created on-demand by individual getters, so a collective getter is less suitable public Map getProjectedInlineds() { return Collections.unmodifiableMap(this.iprojs); } + //*/ protected void addProjectedInlined(LProtoName fullname, LProjection iproj) { @@ -191,23 +190,20 @@ public LProjection getProjection(LProtoName fullname) protected void addProjection(LProjection proj) { - /*LProtocolName lpn = (LProtocolName) mod.getProtoDeclChildren().get(0) - .getFullMemberName(mod); - this.projected.put(lpn, mod);*/ this.projs.put(proj.fullname, proj); } - protected void addEGraph(LProtoName fullname, EGraph graph) - { - this.fEGraphs.put(fullname, graph); - } - // N.B. graphs built from inlined (not unfolded) - public EGraph getEGraph(GProtoName fullname, Role role) + public EGraph getEGraph(GProtoName fullname, Role self) { - return getEGraph(InlinedProjector.getFullProjectionName(fullname, - role)); - // Moved form LProtocolDecl + EGraph graph = this.fEGraphs.get(fullname); + if (graph == null) + { + LProjection inlined = getProjectedInlined(fullname, self); + graph = inlined.toEGraph(this.core); + addEGraph(inlined.fullname, graph); + } + return graph; } public EGraph getEGraph(LProtoName fullname) @@ -225,6 +221,11 @@ public EGraph getEGraph(LProtoName fullname) return graph; } + protected void addEGraph(LProtoName fullname, EGraph graph) + { + this.fEGraphs.put(fullname, graph); + } + protected void addUnfairEGraph(LProtoName fullname, EGraph graph) { this.uEGraphs.put(fullname, graph); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java index e297794fc..605af2bba 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java @@ -43,6 +43,6 @@ public Stream> visitSeq(Seq n) public > Stream> visitDo( Do n) { - return Stream.of(n.proto); + return Stream.of(n.proto); // Should be full names } } From a9bccea67d24e125caa36674faac1d60bec9a955 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 17 Apr 2019 15:52:07 +0100 Subject: [PATCH 314/539] [AllTest] Continued: refactoring CoreContext. --- .../java/org/scribble/cli/CommandLine.java | 27 +++++---- .../main/java/org/scribble/core/job/Core.java | 60 ++++++++++--------- .../org/scribble/core/job/CoreContext.java | 32 +++++----- scribble-test/src/test/scrib/tmp/Test.scr | 23 +++---- 4 files changed, 74 insertions(+), 68 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index f631082fc..99309e068 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -164,33 +164,36 @@ protected void tryNonBarrierTask(Job job, Pair task) case CLFlags.EFSM_FLAG: outputEGraph(job, task.right, true, true, false); break; - case CLFlags.VALIDATION_EFSM_FLAG: - outputEGraph(job, task.right, false, true, false); - break; - case CLFlags.UNFAIR_EFSM_FLAG: - outputEGraph(job, task.right, false, false, false); - break; case CLFlags.EFSM_PNG_FLAG: outputEGraph(job, task.right, true, true, true); break; + case CLFlags.SGRAPH_FLAG: + outputSGraph(job, task.right, true, false); + break; + case CLFlags.SGRAPH_PNG_FLAG: + outputSGraph(job, task.right, true, true); + break; + + // CHECKME: -unfair needs to be barrier-ed on syntactic WF? (unfair-transform graph building may crash, e.g., bad.wfchoice.enabling.threeparty.Test02) + case CLFlags.VALIDATION_EFSM_FLAG: + outputEGraph(job, task.right, false, true, false); + break; case CLFlags.VALIDATION_EFSM_PNG_FLAG: outputEGraph(job, task.right, false, true, true); break; + case CLFlags.UNFAIR_EFSM_FLAG: + outputEGraph(job, task.right, false, false, false); + break; case CLFlags.UNFAIR_EFSM_PNG_FLAG: outputEGraph(job, task.right, false, false, true); break; - case CLFlags.SGRAPH_FLAG: - outputSGraph(job, task.right, true, false); - break; case CLFlags.UNFAIR_SGRAPH_FLAG: outputSGraph(job, task.right, false, false); break; - case CLFlags.SGRAPH_PNG_FLAG: - outputSGraph(job, task.right, true, true); - break; case CLFlags.UNFAIR_SGRAPH_PNG_FLAG: outputSGraph(job, task.right, false, true); break; + default: throw new RuntimeException("Shouldn't get here: " + task.left); // Bad flag should be caught by CLArgParser diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 208077676..ac5c10878 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -80,20 +80,16 @@ protected CoreContext newCoreContext(//Map modcs, public void runPasses() throws ScribException { - runContextBuildingPasses(); // Populates JobContext -- includes runProjectionPasses and runEfsmBuildingPasses + // Passes populate JobContext on-demand by each individual getter + runSyntacticTransformPasses(); runSyntacticWfPasses(); + runProjectionPasses(); // CHECKME: can try before validation (i.e., including syntactic WF), to promote greater tool feedback? (cf. CommandLine output "barrier") + runEfsmBuildingPasses(); // Currently, unfair-transform graph building must come after syntactic WF --- TODO fix graph building to prevent crash ? runModelCheckingPasses(); } // Populates JobContext -- although patten is to do on-demand via (first) getter, so (partially) OK to delay population - public void runContextBuildingPasses() // No ScribException, no errors expected - { - runInliningAndUnfoldingPasses(); - runProjectionPasses(); // Do before any validation (i.e., including global WF), to promote greater tool feedback - runEfsmBuildingPasses(); - } - - private void runInliningAndUnfoldingPasses() + protected void runSyntacticTransformPasses() // No ScribException, no errors expected { verbosePrintPass("Inlining subprotocols for all globals..."); for (GProtoName fullname : this.context.getParsedFullnames()) @@ -149,36 +145,42 @@ protected void runProjectionPasses() // No ScribException, no errors expected } } - private void runEfsmBuildingPasses() + // Builds only the fair EFSMs, unfair EFSM building depends on WF (role enabling, e.g., bad.wfchoice.enabling.threeparty.Test02) for building algorithm to work... + // ...or patch unfair-transform graph building to not crash? + protected void runEfsmBuildingPasses() { verbosePrintPass("Building EFSMs for all projected inlineds..."); for (GProtoName fullname : this.context.getParsedFullnames()) { - GProtocol imed = this.context.getIntermediate(fullname); - for (Role self : imed.roles) + GProtocol inlined = this.context.getInlined(fullname); + for (Role self : inlined.roles) { // Seems to be OK even if runSyntacticWfPasses fails (cf. unfair transform) EGraph graph = this.context.getEGraph(fullname, self); verbosePrintPass( - "Built EFSM: " + imed.fullname + ":\n" + graph.toDot()); + "Built EFSM: " + inlined.fullname + ":\n" + graph.toDot()); } } - /*if (!this.config.args.get(CoreArgs.FAIR)) + if (!this.config.args.get(CoreArgs.FAIR)) { - // Pre: runSyntacticWfPasses -- depends on WF (role enabling, e.g., bad.wfchoice.enabling.threeparty.Test02), for graph building algorithm to work - verbosePrintPass("Building \"unfair\" EFSMs for all projected inlineds..."); - for (Entry e : this.context.getProjectedInlineds() - .entrySet()) + verbosePrintPass( + "Building \"unfair\" EFSMs for all projected inlineds..."); + for (GProtoName fullname : this.context.getParsedFullnames()) { - LProtocol iproj = e.getValue(); // FIXME: don't need actual proj - EGraph graph = this.context.getUnfairEGraph(iproj.fullname); // CHECKME: refactor actual construction back to on-demand in Context, and just use getters here? And for other passes? - verbosePrintPass("Built \"unfair\" EFSM: " + iproj.fullname + ":\n" + graph.toDot()); + GProtocol inlined = this.context.getInlined(fullname); + for (Role self : inlined.roles) + { + // Pre: runSyntacticWfPasses -- e.g., bad.wfchoice.enabling.threeparty.Test02 + EGraph graph = this.context.getUnfairEGraph(inlined.fullname, self); + verbosePrintPass("Built \"unfair\" EFSM: " + inlined.fullname + ":\n" + + graph.toDot()); + } } - }*/ + } } - public void runSyntacticWfPasses() throws ScribException + protected void runSyntacticWfPasses() throws ScribException { verbosePrintPass( "Checking for unused role decls on all inlined globals..."); @@ -209,7 +211,7 @@ public void runSyntacticWfPasses() throws ScribException GTypeUnfolder v = new GTypeUnfolder(); //e.g., C->D captured under an A->B choice after unfolding, cf. bad.wfchoice.enabling.twoparty.Test01b; inlined.unfoldAllOnce(v).checkRoleEnabling(); - // TODO: get unfolded from Context + // TODO: get unfolded from Context } verbosePrintPass( @@ -227,12 +229,12 @@ public void runSyntacticWfPasses() throws ScribException verbosePrintPass("Checking reachability on all projected inlineds..."); for (GProtoName fullname : this.context.getParsedFullnames()) { - GProtocol imed = this.context.getIntermediate(fullname); - if (imed.isAux()) // CHECKME: also check for aux? e.g., bad.reach.globals.gdo.Test01b + GProtocol inlined = this.context.getInlined(fullname); + if (inlined.isAux()) // CHECKME: also check for aux? e.g., bad.reach.globals.gdo.Test01b { continue; } - for (Role r : imed.roles) + for (Role r : inlined.roles) { LProjection iproj = this.context.getProjectedInlined(fullname, r); iproj.checkReachability(); @@ -240,9 +242,9 @@ public void runSyntacticWfPasses() throws ScribException } } - public void runModelCheckingPasses() throws ScribException + protected void runModelCheckingPasses() throws ScribException { - verbosePrintPass("Building and checking models from projected inlineds..."); // Move model building earlier? + verbosePrintPass("Building and checking models from projected inlineds..."); // CHECKME: separate and move model building earlier? // CHECKME: refactor more/whole validation into lang.GProtocol ? for (GProtoName fullname : this.context.getParsedFullnames()) { diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index 9bff9286d..ede787c85 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -44,15 +44,13 @@ public class CoreContext // "Directly" translated global protos, i.e., separate proto decls without any inlining/unfolding/etc // Protos retain original decl role list (and args) - // Keys are full names (though GProtocol already includes full name) - private final Map imeds; + private final Map imeds; // Keys are full names (though GProtocol already includes full name) - // Protos have pruned role decls -- CHECKME: prune args? - // Keys are full names (though GProtocol already includes full name) - private final Map inlined = new HashMap<>(); + // N.B. protos have pruned role decls -- CHECKME: prune args? + private final Map inlined = new HashMap<>(); // Keys are full names (though GProtocol already includes full name) - // Projected from inlined; keys are full names - private final Map iprojs = new HashMap<>(); // CHECKME: rename projis? + // CHECKME: rename projis? + private final Map iprojs = new HashMap<>(); // Projected from inlined; keys are full names // Projected from intermediates // LProtocolName is the full local protocol name (module name is the prefix) @@ -226,11 +224,6 @@ protected void addEGraph(LProtoName fullname, EGraph graph) this.fEGraphs.put(fullname, graph); } - protected void addUnfairEGraph(LProtoName fullname, EGraph graph) - { - this.uEGraphs.put(fullname, graph); - } - // Pre: Core.runSyntacticWfPasses public EGraph getUnfairEGraph(GProtoName fullname, Role role) { @@ -253,10 +246,10 @@ public EGraph getUnfairEGraph(LProtoName fullname) } return unfair; } - - protected void addSGraph(GProtoName fullname, SGraph graph) + + protected void addUnfairEGraph(LProtoName fullname, EGraph graph) { - this.fSGraphs.put(fullname, graph); + this.uEGraphs.put(fullname, graph); } public SGraph getSGraph(GProtoName fullname) throws ScribException @@ -293,9 +286,9 @@ private Map getEGraphsForSGraphBuilding(GProtoName fullname, return egraphs; } - protected void addUnfairSGraph(GProtoName fullname, SGraph graph) + protected void addSGraph(GProtoName fullname, SGraph graph) { - this.uSGraphs.put(fullname, graph); + this.fSGraphs.put(fullname, graph); } public SGraph getUnfairSGraph(GProtoName fullname) throws ScribException @@ -315,6 +308,11 @@ public SGraph getUnfairSGraph(GProtoName fullname) throws ScribException } return graph; } + + protected void addUnfairSGraph(GProtoName fullname, SGraph graph) + { + this.uSGraphs.put(fullname, graph); + } protected void addMinimisedEGraph(LProtoName fullname, EGraph graph) { diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index ddc6d25dc..1cf3c5546 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -99,6 +99,7 @@ module tmp.Test; // codegen refactoring: // choice-specific fairness annotations + // fix codegen when -fair // Test refactoring: // refactor test to use main instead of cli @@ -109,16 +110,18 @@ data "..." from "..." as T; //* global protocol Proto1(role A, role B, role C) { - choice at A - { - 1() from A to C; - do Proto1(A, B, C); - } - or - { - 2() from A to B; - 2() from A to C; - } + 1() from A to B; + 1() from A to C; + /*choice at A + { + 1() from A to C; + do Proto1(A, B, C); + } + or + { + 2() from A to B; + 2() from A to C; + }*/ } //*/ From 4f935379e94c4063c7483dc1e2d3fa3bd58e718e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 17 Apr 2019 15:58:31 +0100 Subject: [PATCH 315/539] [AllTest] Continued: refactoring CoreContext. --- .../src/main/java/org/scribble/cli/CommandLine.java | 1 + scribble-test/src/test/scrib/tmp/Test.scr | 8 +++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 99309e068..5a28464a1 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -175,6 +175,7 @@ protected void tryNonBarrierTask(Job job, Pair task) break; // CHECKME: -unfair needs to be barrier-ed on syntactic WF? (unfair-transform graph building may crash, e.g., bad.wfchoice.enabling.threeparty.Test02) + // Currently, "construction-on-demand" CoreContext getters will still cause these to be attempted even if syntactic WF fails case CLFlags.VALIDATION_EFSM_FLAG: outputEGraph(job, task.right, false, true, false); break; diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 1cf3c5546..5906753d4 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -110,18 +110,16 @@ data "..." from "..." as T; //* global protocol Proto1(role A, role B, role C) { - 1() from A to B; - 1() from A to C; - /*choice at A + choice at A { - 1() from A to C; + 1() from A to C; // FIXME: -project Proto1 B -fair do Proto1(A, B, C); } or { 2() from A to B; 2() from A to C; - }*/ + } } //*/ From f9bb15dbbf8b1d15cd881a47d475ba0e8ca2acc0 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 17 Apr 2019 22:19:30 +0100 Subject: [PATCH 316/539] [AllTest] Continued: refactoring projection and rec/continue/choice pruning. --- .../scribble/core/lang/global/GProtocol.java | 11 +++++------ .../scribble/core/lang/local/LProtocol.java | 18 +++++++++++------- .../core/visit/global/InlinedProjector.java | 8 ++++++++ .../visit/local/SingleContinueChecker.java | 6 ++++-- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 5 files changed, 29 insertions(+), 16 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index a003a3874..8f5ace40d 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -158,17 +158,16 @@ else if (n instanceof SigName) this.params, sig.args); /*GSeq body = (GSeq) this.def.visitWithNoThrow(subs).visitWithNoThrow(v) .visitWithNoThrow(new RecPruner<>());*/ - GSeq body = new RecPruner() - .visitSeq(v.visitSeq(subs.visitSeq(this.def))); + GSeq inlined = v.visitSeq(subs.visitSeq(this.def)); RecVar rv = v.getInlinedRecVar(sig); - GRecursion rec = new GRecursion(null, rv, body); // CHECKME: or protodecl source? - CommonTree source = getSource(); - GSeq def = new GSeq(null, Stream.of(rec).collect(Collectors.toList())); + GRecursion rec = new GRecursion(null, rv, inlined); // CHECKME: or protodecl source? + GSeq seq = new GSeq(null, Stream.of(rec).collect(Collectors.toList())); + GSeq def = new RecPruner().visitSeq(seq); Set used = def.gather(new RoleGatherer()::visit) .collect(Collectors.toSet()); List rs = this.roles.stream().filter(x -> used.contains(x)) // Prune role decls .collect(Collectors.toList()); - return new GProtocol(source, this.mods, this.fullname, rs, + return new GProtocol(getSource(), this.mods, this.fullname, rs, this.params, def); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 50277758d..5ee41767b 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -102,14 +102,18 @@ else if (n instanceof SigName) this.params, sig.args); /*LSeq body = (LSeq) this.def.visitWithNoEx(subs).visitWithNoEx(v) .visitWithNoEx(new RecPruner<>());*/ - LSeq body = new RecPruner() - .visitSeq(v.visitSeq(subs.visitSeq(this.def))); + LSeq inlined = v.visitSeq(subs.visitSeq(this.def)); RecVar rv = v.getInlinedRecVar(sig); - LRecursion rec = new LRecursion(null, rv, body); // CHECKME: or protodecl source? - CommonTree source = getSource(); // CHECKME: or null source? - LSeq def = new LSeq(null, Stream.of(rec).collect(Collectors.toList())); - return new LProtocol(source, this.mods, this.fullname, this.roles, - this.self, this.params, def); + LRecursion rec = new LRecursion(null, rv, inlined); // CHECKME: or protodecl source? + LSeq seq = new LSeq(null, Stream.of(rec).collect(Collectors.toList())); + LSeq def = new RecPruner().visitSeq(seq); + /*//CHECKME: necessary for LProtocol/Projection? cf. global + Set used = def.gather(new RoleGatherer()::visit) + .collect(Collectors.toSet()); + List rs = this.roles.stream().filter(x -> used.contains(x)) // Prune role decls + .collect(Collectors.toList());*/ + return new LProtocol(getSource(), this.mods, this.fullname, this.roles, + this.self, this.params, def); // CHECKME: or null source? } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index ee326ec87..e9313e80e 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -21,6 +21,7 @@ import org.scribble.core.job.Core; import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.ModuleName; @@ -47,7 +48,9 @@ import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; +import org.scribble.core.visit.RecPruner; import org.scribble.core.visit.STypeAggNoThrow; +import org.scribble.core.visit.local.RecPruner1; import org.scribble.core.visit.local.SingleContinueChecker; // Pre: use on inlined (i.e., Do inlined, roles pruned) @@ -147,6 +150,11 @@ public LType visitRecursion(Recursion n) { return LSkip.SKIP; } + /*LSeq pruned = new RecPruner1(this.core, n.recvar).visitSeq(body); + if (pruned.isEmpty()) + { + return LSkip.SKIP; + }*/ return new LRecursion(null, n.recvar, body); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java index 3eed48feb..d42021a0d 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java @@ -26,7 +26,6 @@ import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.local.LSeq; -import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.STypeAggNoThrow; // Return true iff this LType is "equivalent" to a single "continue X", where X is in rvs @@ -79,6 +78,9 @@ public Boolean visitRecursion(Recursion n) public Boolean visitSeq(LSeq n) { return n.elems.size() == 1 - && ((LType) n.elems.get(0)).visitWithNoThrow(this); + && (n.elems.get(0)).visitWithNoThrow(this); // No: doesn't support "empty" choices ahead of single continue ? + //return n.elems.stream().allMatch(x -> x.visitWithNoThrow(this)); + // elems except the last must be "empty" (e.g., empty choice), not actually "single continues", but bad sequenced "single continues" are caught by reachability + // i.e., "single-continue" check on every elem a bit overkill here, but OK } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 5906753d4..c4c20022b 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -112,7 +112,7 @@ global protocol Proto1(role A, role B, role C) { choice at A { - 1() from A to C; // FIXME: -project Proto1 B -fair + 1() from A to C; // FIXME: -project Proto1 B [-fair] do Proto1(A, B, C); } or From 14c3844fea23eeb6c9a25d55c49d0b816afac774 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 17 Apr 2019 22:31:04 +0100 Subject: [PATCH 317/539] [AllTest] Minor. --- .../java/org/scribble/core/lang/global/GProtocol.java | 6 +++--- .../scribble/core/visit/global/InlinedProjector.java | 7 ++----- scribble-test/src/test/scrib/tmp/Test.scr | 11 ++++++++++- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 8f5ace40d..d8cf3b7a0 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -105,11 +105,11 @@ public LProjection projectInlined(Core core, Role self) public LProjection project(Core core, Role self) { - LSeq body = (LSeq) this.def.visitWithNoThrow(new Projector(core, self)) - .visitWithNoThrow(new RecPruner<>()); + LSeq def = new Projector(core, self).visitSeq(this.def); + LSeq pruned = new RecPruner().visitSeq(def); return projectAux(self, core.getContext().getInlined(this.fullname).roles, // Used inlined decls, already pruned - body); + pruned); } private LProjection projectAux(Role self, List decls, LSeq body) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index e9313e80e..672eceec2 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -21,7 +21,6 @@ import org.scribble.core.job.Core; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.ModuleName; @@ -41,16 +40,14 @@ import org.scribble.core.type.session.local.LChoice; import org.scribble.core.type.session.local.LContinue; import org.scribble.core.type.session.local.LDisconnect; -import org.scribble.core.type.session.local.LRecv; import org.scribble.core.type.session.local.LRecursion; +import org.scribble.core.type.session.local.LRecv; import org.scribble.core.type.session.local.LReq; import org.scribble.core.type.session.local.LSend; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; -import org.scribble.core.visit.RecPruner; import org.scribble.core.visit.STypeAggNoThrow; -import org.scribble.core.visit.local.RecPruner1; import org.scribble.core.visit.local.SingleContinueChecker; // Pre: use on inlined (i.e., Do inlined, roles pruned) @@ -140,7 +137,7 @@ public > LType visitDo(Do n) public LType visitRecursion(Recursion n) { LSeq body = visitSeq(n.body); - if (body.isEmpty()) // N.B. projection is doing empty-rec pruning + if (body.isEmpty()) // A simple special case of empty-rec pruning -- leave it to proper rec pruning? { return LSkip.SKIP; } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index c4c20022b..cb547d691 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -107,7 +107,16 @@ module tmp.Test; data "..." from "..." as T; -//* +global protocol Proto1(role A, role B) +{ + 1() from A to B; + rec X + { + continue X; + } +} + +/* global protocol Proto1(role A, role B, role C) { choice at A From 52ff615136ebf1bacbebab56da178354b08d7894 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 17 Apr 2019 22:32:12 +0100 Subject: [PATCH 318/539] [AllTest] Minor. --- .../src/main/java/org/scribble/core/lang/global/GProtocol.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index d8cf3b7a0..eb568dd76 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -98,8 +98,7 @@ public void checkExtChoiceConsistency() throws ScribException // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) public LProjection projectInlined(Core core, Role self) { - LSeq body = (LSeq) this.def - .visitWithNoThrow(new InlinedProjector(core, self)); + LSeq body = new InlinedProjector(core, self).visitSeq(this.def); return projectAux(self, this.roles, body); } From 7946151a46473373ace4d44b31675bedc2bfd32d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 18 Apr 2019 11:43:00 +0100 Subject: [PATCH 319/539] [AllTest] Continued: refactoring projection and rec/continue/choice pruning. --- .../org/scribble/core/visit/RecPruner.java | 3 +- .../core/visit/global/InlinedProjector.java | 69 ++++++++++++++++--- .../grecursion => todo}/Recursion19b.scr | 4 +- scribble-test/src/test/scrib/tmp/Test.scr | 20 ++++++ 4 files changed, 83 insertions(+), 13 deletions(-) rename scribble-test/src/test/resources/bad/{reach/globals/grecursion => todo}/Recursion19b.scr (58%) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java index afeb23ffb..990b13a12 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java @@ -35,8 +35,9 @@ public SType visitRecursion(Recursion n) Set rvs = n.body.gather(new RecVarGatherer()::visit) .collect(Collectors.toSet()); return rvs.contains(n.recvar) - ? n + ? n // FIXME: doesn't do a recursive call -- this is just a wrapper for checking getRecVars ... ? : n.body; // i.e., return a Seq, to be "inlined" by Seq.pruneRecs -- N.B. must handle empty Seq case + // By itself, this can leave an empty choice case (pruned rec under a choice) -- rely on inlining/projection use sites to take care of that } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index 672eceec2..35e1f37cc 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -14,6 +14,7 @@ package org.scribble.core.visit.global; import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -21,6 +22,7 @@ import org.scribble.core.job.Core; import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.ModuleName; @@ -48,11 +50,15 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.STypeAggNoThrow; -import org.scribble.core.visit.local.SingleContinueChecker; // Pre: use on inlined (i.e., Do inlined, roles pruned) public class InlinedProjector extends STypeAggNoThrow { + + //HERE make Map for guarded or not, prune continues as part of projection -- then fix RecPruner to be general (including pruning empty choice blocks), and prune recs after continues pruned + //private Map guarded = new HashMap<>(); + private final Set unguarded; + public final Core core; public final Role self; @@ -60,6 +66,15 @@ public InlinedProjector(Core core, Role self) { this.core = core; this.self = self; + this.unguarded = new HashSet<>(); + } + + // Copy constructor for "nested" Seq visiting + protected InlinedProjector(InlinedProjector v) + { + this.core = v.core; + this.self = v.self; + this.unguarded = new HashSet<>(v.unguarded); } @Override @@ -79,8 +94,10 @@ public LType visitChoice(Choice n) { Role subj = n.subj.equals(self) ? Role.SELF : n.subj; // CHECKME: "self" also explcitily used for Do, but implicitly for MessageTransfer, inconsistent? - List tmp = n.blocks.stream().map(x -> visitSeq(x)) - .filter(x -> !x.isEmpty()).collect(Collectors.toList()); + List tmp = n.blocks.stream() + .map(x -> new InlinedProjector(this).visitSeq(x)) + .filter(x -> !x.isEmpty() && !isUnguardedSingleContinue(x)) + .collect(Collectors.toList()); if (tmp.isEmpty()) { return LSkip.SKIP; // CHECKME: OK, or "empty" choice at subj still important? @@ -88,6 +105,17 @@ public LType visitChoice(Choice n) return new LChoice(null, subj, tmp); } + private boolean isUnguardedSingleContinue(LSeq block) + { + if (block.elems.size() != 1) + { + return false; + } + SType e = block.elems.get(0); + return (e instanceof LContinue) + && this.unguarded.contains(((LContinue) e).recvar); + } + @Override public LType visitContinue(Continue n) { @@ -136,22 +164,29 @@ public > LType visitDo(Do n) @Override public LType visitRecursion(Recursion n) { - LSeq body = visitSeq(n.body); - if (body.isEmpty()) // A simple special case of empty-rec pruning -- leave it to proper rec pruning? + this.unguarded.add(n.recvar); + LSeq body = visitSeq(n.body); // Single "nested" Seq, don't need to copy visitor + if (body.isEmpty()) // A simple special case of empty-rec pruning -- leave it to "official" rec pruning? { return LSkip.SKIP; } Set rvs = new HashSet<>(); rvs.add(n.recvar); - if (body.visitWithNoThrow(new SingleContinueChecker(rvs))) - { - return LSkip.SKIP; + //if (body.visitWithNoThrow(new SingleContinueChecker(rvs))) // "Generalised" single-continue checked now unnecessary, single-continues pruned in choice visiting above + if (body.elems.size() == 1) + { + SType e = body.elems.get(0); + if(e instanceof LContinue && ((LContinue) e).recvar.equals(n.recvar)) + { + return LSkip.SKIP; + } } /*LSeq pruned = new RecPruner1(this.core, n.recvar).visitSeq(body); if (pruned.isEmpty()) { return LSkip.SKIP; }*/ + this.unguarded.remove(n.recvar); return new LRecursion(null, n.recvar, body); } @@ -159,9 +194,21 @@ public LType visitRecursion(Recursion n) @Override public LSeq visitSeq(GSeq n) { - List elems = n.elems.stream().map(x -> x.visitWithNoThrow(this)) - .filter(x -> !x.equals(LSkip.SKIP)).collect(Collectors.toList()); - return new LSeq(null, elems); + /*List elems = n.elems.stream().map(x -> x.visitWithNoThrow(this)) + .filter(x -> !x.equals(LSkip.SKIP)).collect(Collectors.toList());*/ + List elems = new LinkedList<>(); + for (SType e : n.elems) + { + LType e1 = e.visitWithNoThrow(this); + elems.add(e1); + if (!(e1 instanceof LSkip)) + { + this.unguarded.clear(); + } + } + elems = elems.stream().filter(x -> !x.equals(LSkip.SKIP)) + .collect(Collectors.toList()); + return new LSeq(null, elems); // Empty seqs converted to LSkip by GChoice/Recursion projection // And a WF top-level protocol cannot produce empty LSeq // So a projection never contains an empty LSeq -- i.e., "empty choice/rec" pruning unnecessary diff --git a/scribble-test/src/test/resources/bad/reach/globals/grecursion/Recursion19b.scr b/scribble-test/src/test/resources/bad/todo/Recursion19b.scr similarity index 58% rename from scribble-test/src/test/resources/bad/reach/globals/grecursion/Recursion19b.scr rename to scribble-test/src/test/resources/bad/todo/Recursion19b.scr index 8dbdb1055..89f177814 100644 --- a/scribble-test/src/test/resources/bad/reach/globals/grecursion/Recursion19b.scr +++ b/scribble-test/src/test/resources/bad/todo/Recursion19b.scr @@ -7,7 +7,9 @@ global protocol Proto1(role A, role B) { choice at A { - continue X; + continue X; + // CHECKME: was previously considered bad -- but now, projection implicitly removes this continue so the 1() is not a bad continuation any more... + // TODO: check as global WF instead? unguarded continue? (cf. reachability) -- or consider good? } or { diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index cb547d691..855872e1a 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -107,6 +107,7 @@ module tmp.Test; data "..." from "..." as T; +/* global protocol Proto1(role A, role B) { 1() from A to B; @@ -115,9 +116,28 @@ global protocol Proto1(role A, role B) continue X; } } +//*/ /* global protocol Proto1(role A, role B, role C) +{ + choice at A + { + rec X + { + 1() from A to B; + } + } + or + { + 2() from A to B; + 3() from A to C; + } +} +//*/ + +//* +global protocol Proto1(role A, role B, role C) { choice at A { From e948b561b65fa5fc8a99396e97d8797749c3bcc1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 18 Apr 2019 12:06:14 +0100 Subject: [PATCH 320/539] [AllTest] Continued: refactoring projection and rec/continue/choice pruning. --- .../main/java/org/scribble/core/job/Core.java | 3 ++- .../org/scribble/core/job/CoreContext.java | 14 ++++++------- .../scribble/core/lang/global/GProtocol.java | 2 +- .../core/visit/global/InlinedProjector.java | 21 +++++++++++++------ .../scribble/core/visit/global/Projector.java | 8 +++++++ .../gcontinue/choiceunguarded/Test01a.scr | 2 +- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 7 files changed, 35 insertions(+), 17 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index ac5c10878..053353894 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -302,7 +302,8 @@ public Map getProjections(GProtoName fullname, .collect(Collectors.toList()); for (ProtoName pfullname : pfullnames) { - System.out.println("\n" + this.context.getProjection((LProtoName) pfullname)); + System.out + .println("\n" + this.context.getProjection((LProtoName) pfullname)); } if (!pfullnames.contains(proj.fullname)) { diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index ede787c85..0b3583b6a 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -128,11 +128,11 @@ public Set getInlineds() public LProjection getProjectedInlined(GProtoName fullname, Role self) { LProtoName projFullname = InlinedProjector.getFullProjectionName(fullname, self); - LProjection iproj = this.iprojs.get(fullname); + LProjection iproj = this.iprojs.get(projFullname); if (iproj == null) { iproj = getInlined(fullname).projectInlined(this.core, self); - addProjectedInlined(projFullname, iproj); + addProjectedInlined(iproj); } return iproj; } @@ -155,9 +155,9 @@ public Map getProjectedInlineds() } //*/ - protected void addProjectedInlined(LProtoName fullname, LProjection iproj) + protected void addProjectedInlined(LProjection iproj) { - this.iprojs.put(fullname, iproj); + this.iprojs.put(iproj.fullname, iproj); } // Projected from intermediate @@ -166,11 +166,11 @@ public LProjection getProjection(GProtoName fullname, Role self) { LProtoName projFullname = InlinedProjector.getFullProjectionName(fullname, self); - LProjection proj = this.projs.get(fullname); + LProjection proj = this.projs.get(projFullname); if (proj == null) { - proj = getInlined(fullname).project(this.core, self); - addProjectedInlined(projFullname, proj); + proj = getIntermediate(fullname).project(this.core, self); + addProjection(proj); } return proj; } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index eb568dd76..cd9031aee 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -107,7 +107,7 @@ public LProjection project(Core core, Role self) LSeq def = new Projector(core, self).visitSeq(this.def); LSeq pruned = new RecPruner().visitSeq(def); return projectAux(self, - core.getContext().getInlined(this.fullname).roles, // Used inlined decls, already pruned + core.getContext().getInlined(this.fullname).roles, // Use inlined decls, already pruned pruned); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index 35e1f37cc..4fad0fb56 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -56,8 +56,10 @@ public class InlinedProjector extends STypeAggNoThrow { //HERE make Map for guarded or not, prune continues as part of projection -- then fix RecPruner to be general (including pruning empty choice blocks), and prune recs after continues pruned - //private Map guarded = new HashMap<>(); - private final Set unguarded; + protected final Set unguarded; + // Projection "prunes" unguarded continues from choice cases, e.g., mu X.(A->B:1.X + A->B:2.A->C:2) for C, i.e., travel agent + // N.B. projection does not "merge" choice cases in , e.g., rec X { 1() from A; choice at A { continue X; } or { continue X; } }... + // ...that is a non-det branch, same as rec X { choice at A { 1() from A; } or { 1() from A; } } public final Core core; public final Role self; @@ -69,13 +71,13 @@ public InlinedProjector(Core core, Role self) this.unguarded = new HashSet<>(); } - // Copy constructor for "nested" Seq visiting + /*// Copy constructor for "nested" Seq visiting protected InlinedProjector(InlinedProjector v) { this.core = v.core; this.self = v.self; this.unguarded = new HashSet<>(v.unguarded); - } + }*/ @Override protected LType unit(SType n) @@ -88,6 +90,13 @@ protected LType agg(SType n, Stream ts) { throw new RuntimeException("Disregarded for Projector: " + n + " ,, " + ts); } + + protected InlinedProjector dup() + { + InlinedProjector v = new InlinedProjector(this.core, this.self); + v.unguarded.addAll(this.unguarded); + return v; + } @Override public LType visitChoice(Choice n) @@ -95,7 +104,7 @@ public LType visitChoice(Choice n) Role subj = n.subj.equals(self) ? Role.SELF : n.subj; // CHECKME: "self" also explcitily used for Do, but implicitly for MessageTransfer, inconsistent? List tmp = n.blocks.stream() - .map(x -> new InlinedProjector(this).visitSeq(x)) + .map(x -> dup().visitSeq(x)) .filter(x -> !x.isEmpty() && !isUnguardedSingleContinue(x)) .collect(Collectors.toList()); if (tmp.isEmpty()) @@ -158,7 +167,7 @@ public LType visitDisconnect(DisconnectAction n) @Override public > LType visitDo(Do n) { - throw new RuntimeException("Unsupported for Do: " + n); + throw new RuntimeException("Unsupported for Do: " + n + " ,, " + this.getClass()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java index e549847fb..a3b2acafd 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java @@ -39,6 +39,14 @@ public Projector(Core core, Role self) { super(core, self); } + + @Override + protected Projector dup() + { + Projector v = new Projector(this.core, this.self); + v.unguarded.addAll(this.unguarded); + return v; + } @Override public > LType visitDo(Do n) diff --git a/scribble-test/src/test/resources/good/efsm/gcontinue/choiceunguarded/Test01a.scr b/scribble-test/src/test/resources/good/efsm/gcontinue/choiceunguarded/Test01a.scr index 6454e8f24..ba6f3a0eb 100644 --- a/scribble-test/src/test/resources/good/efsm/gcontinue/choiceunguarded/Test01a.scr +++ b/scribble-test/src/test/resources/good/efsm/gcontinue/choiceunguarded/Test01a.scr @@ -9,7 +9,7 @@ global protocol Proto1(role A, role B) 1() from A to B; choice at A { - continue X; // Not "isomorphic" to a single continue X, because non-det not bisim equiv (cf. language equiv) -- so no "syntatic collapse" to single case + continue X; // Not "isomorphic" to a single continue X, because (in general) non-det not bisim equiv (cf. language equiv) -- so no "syntatic collapse" to single case } or { diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 855872e1a..16a0444dd 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -141,7 +141,7 @@ global protocol Proto1(role A, role B, role C) { choice at A { - 1() from A to C; // FIXME: -project Proto1 B [-fair] + 1() from A to B; // TODO: add junit, testing -project C [-fair] -- basically, Travel Agent do Proto1(A, B, C); } or From 45b40e22be2058a1bf7fd20dbf7a23c329d11cc8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 18 Apr 2019 12:59:24 +0100 Subject: [PATCH 321/539] [AllTest] Continued: refactoring projection and rec/continue/choice pruning. --- .../core/visit/global/InlinedProjector.java | 19 +++++++++++++------ .../scribble/core/visit/global/Projector.java | 10 +++++++--- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index 4fad0fb56..2eca3e208 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -54,8 +54,14 @@ // Pre: use on inlined (i.e., Do inlined, roles pruned) public class InlinedProjector extends STypeAggNoThrow { - //HERE make Map for guarded or not, prune continues as part of projection -- then fix RecPruner to be general (including pruning empty choice blocks), and prune recs after continues pruned + /*HERE + -- try clone in seq, rather than choice + -- fix choice context merging w.r.t. unguarded clear + -- fix rec pruning + -- fix projector unguarded inheritance + -- need old style subproto visitor for imed-projection do-pruning*/ + protected final Set unguarded; // Projection "prunes" unguarded continues from choice cases, e.g., mu X.(A->B:1.X + A->B:2.A->C:2) for C, i.e., travel agent // N.B. projection does not "merge" choice cases in , e.g., rec X { 1() from A; choice at A { continue X; } or { continue X; } }... @@ -71,13 +77,13 @@ public InlinedProjector(Core core, Role self) this.unguarded = new HashSet<>(); } - /*// Copy constructor for "nested" Seq visiting + // Copy constructor for dup protected InlinedProjector(InlinedProjector v) { this.core = v.core; this.self = v.self; this.unguarded = new HashSet<>(v.unguarded); - }*/ + } @Override protected LType unit(SType n) @@ -91,11 +97,11 @@ protected LType agg(SType n, Stream ts) throw new RuntimeException("Disregarded for Projector: " + n + " ,, " + ts); } + // N.B. subclasses should override + // To visit a node with a copy of the current context (this.unguarded), e.g., for "nested" context visiting (Choice) protected InlinedProjector dup() { - InlinedProjector v = new InlinedProjector(this.core, this.self); - v.unguarded.addAll(this.unguarded); - return v; + return new InlinedProjector(this); } @Override @@ -111,6 +117,7 @@ public LType visitChoice(Choice n) { return LSkip.SKIP; // CHECKME: OK, or "empty" choice at subj still important? } + this.unguarded.clear(); // At least one block is non-empty, consider continues guarded return new LChoice(null, subj, tmp); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java index a3b2acafd..24daba280 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java @@ -39,13 +39,17 @@ public Projector(Core core, Role self) { super(core, self); } + + // Copy constructor for dup + protected Projector(Projector v) + { + super(v); + } @Override protected Projector dup() { - Projector v = new Projector(this.core, this.self); - v.unguarded.addAll(this.unguarded); - return v; + return new Projector(this); } @Override From 4a3de60ec4952b801afc44147decde248cbb091a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 18 Apr 2019 13:01:02 +0100 Subject: [PATCH 322/539] [AllTest] Minor. --- .../core/visit/global/InlinedProjector.java | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index 2eca3e208..c32bc1037 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -84,6 +84,13 @@ protected InlinedProjector(InlinedProjector v) this.self = v.self; this.unguarded = new HashSet<>(v.unguarded); } + + // Use to visit a node with a copy of the current context (this.unguarded), e.g., for "nested" context visiting (Choice) + // N.B. subclasses should override + protected InlinedProjector dup() + { + return new InlinedProjector(this); + } @Override protected LType unit(SType n) @@ -96,13 +103,6 @@ protected LType agg(SType n, Stream ts) { throw new RuntimeException("Disregarded for Projector: " + n + " ,, " + ts); } - - // N.B. subclasses should override - // To visit a node with a copy of the current context (this.unguarded), e.g., for "nested" context visiting (Choice) - protected InlinedProjector dup() - { - return new InlinedProjector(this); - } @Override public LType visitChoice(Choice n) @@ -188,7 +188,8 @@ public LType visitRecursion(Recursion n) } Set rvs = new HashSet<>(); rvs.add(n.recvar); - //if (body.visitWithNoThrow(new SingleContinueChecker(rvs))) // "Generalised" single-continue checked now unnecessary, single-continues pruned in choice visiting above + //if (body.visitWithNoThrow(new SingleContinueChecker(rvs))) + // "Generalised" single-continue checked now unnecessary, single-continues pruned in choice visiting above if (body.elems.size() == 1) { SType e = body.elems.get(0); @@ -197,11 +198,6 @@ public LType visitRecursion(Recursion n) return LSkip.SKIP; } } - /*LSeq pruned = new RecPruner1(this.core, n.recvar).visitSeq(body); - if (pruned.isEmpty()) - { - return LSkip.SKIP; - }*/ this.unguarded.remove(n.recvar); return new LRecursion(null, n.recvar, body); } @@ -210,8 +206,6 @@ public LType visitRecursion(Recursion n) @Override public LSeq visitSeq(GSeq n) { - /*List elems = n.elems.stream().map(x -> x.visitWithNoThrow(this)) - .filter(x -> !x.equals(LSkip.SKIP)).collect(Collectors.toList());*/ List elems = new LinkedList<>(); for (SType e : n.elems) { From 24842016af7107ccfd13d714aaf67975d8e0180a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 18 Apr 2019 13:20:11 +0100 Subject: [PATCH 323/539] [AllTest] Continued: refactoring projection and rec/continue/choice pruning. --- .../org/scribble/core/job/CoreContext.java | 1 + .../scribble/core/lang/global/GProtocol.java | 12 +++++------ .../core/type/session/local/LSkip.java | 1 + .../org/scribble/core/visit/RecPruner.java | 20 +++++++++++++++---- .../visit/local/SingleContinueChecker.java | 1 + .../test/resources/bad/todo/Recursion19b.scr | 3 ++- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index 0b3583b6a..01263c1bc 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -52,6 +52,7 @@ public class CoreContext // CHECKME: rename projis? private final Map iprojs = new HashMap<>(); // Projected from inlined; keys are full names + // CHECKME: refactor to Job ? // Projected from intermediates // LProtocolName is the full local protocol name (module name is the prefix) // LProtocolName key is LProtocol value fullname (i.e., redundant) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index cd9031aee..077d205dd 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -98,24 +98,24 @@ public void checkExtChoiceConsistency() throws ScribException // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) public LProjection projectInlined(Core core, Role self) { - LSeq body = new InlinedProjector(core, self).visitSeq(this.def); - return projectAux(self, this.roles, body); + LSeq def = new InlinedProjector(core, self).visitSeq(this.def); + return projectAux(self, this.roles, def); } public LProjection project(Core core, Role self) { LSeq def = new Projector(core, self).visitSeq(this.def); - LSeq pruned = new RecPruner().visitSeq(def); return projectAux(self, core.getContext().getInlined(this.fullname).roles, // Use inlined decls, already pruned - pruned); + def); } private LProjection projectAux(Role self, List decls, LSeq body) { + LSeq pruned = new RecPruner().visitSeq(body); LProtoName fullname = InlinedProjector .getFullProjectionName(this.fullname, self); - Set tmp = body.gather(new RoleGatherer()::visit) + Set tmp = pruned.gather(new RoleGatherer()::visit) .collect(Collectors.toSet()); List roles = decls.stream() .filter(x -> x.equals(self) || tmp.contains(x)) // Implicitly filters Role.SELF @@ -123,7 +123,7 @@ private LProjection projectAux(Role self, List decls, LSeq body) List> params = new LinkedList<>(this.params); // CHECKME: filter params by usage? return new LProjection(this.mods, fullname, roles, self, params, - this.fullname, body); + this.fullname, pruned); } // CHECKME: drop from Protocol (after removing Protocol from SType?) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java index 84a48d3f3..ef45b05f0 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSkip.java @@ -23,6 +23,7 @@ import org.scribble.core.visit.STypeAggNoThrow; // Used only *during* projection -- filtered out by GSeq::projection +// CHECKME: can use empty Seq, and do "seq injection" in visitSeq overrides? (cf. RecPruner) public class LSkip extends STypeBase implements LType { public static final LSkip SKIP = new LSkip(); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java index 990b13a12..db9592f36 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java @@ -20,14 +20,27 @@ import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; -// Assumes no shadowing (e.g., use after inlining recvar disamb) +// Assumes no shadowing, e.g., use after inlining recvar disamb (also used after projection) public class RecPruner> extends STypeVisitorNoThrow { + @Override + public SType visitChoice(Choice n) + { + List blocks = n.blocks.stream().map(x -> visitSeq(x)) + .filter(x -> !x.isEmpty()).collect(Collectors.toList()); + if (blocks.isEmpty()) + { + return n.blocks.get(0).reconstruct(null, blocks); // N.B. returning a Seq -- handled by visitSeq (similar to LSkip for locals) + } + return n.reconstruct(n.getSource(), n.subj, blocks); + } + @Override public SType visitRecursion(Recursion n) { @@ -35,9 +48,8 @@ public SType visitRecursion(Recursion n) Set rvs = n.body.gather(new RecVarGatherer()::visit) .collect(Collectors.toSet()); return rvs.contains(n.recvar) - ? n // FIXME: doesn't do a recursive call -- this is just a wrapper for checking getRecVars ... ? + ? n.reconstruct(n.getSource(), n.recvar, visitSeq(n.body)) : n.body; // i.e., return a Seq, to be "inlined" by Seq.pruneRecs -- N.B. must handle empty Seq case - // By itself, this can leave an empty choice case (pruned rec under a choice) -- rely on inlining/projection use sites to take care of that } @Override @@ -47,7 +59,7 @@ public B visitSeq(B n) for (SType e : n.elems) { SType e1 = (SType) e.visitWithNoThrow(this); - if (e1 instanceof Seq) // cf. visitRecursion + if (e1 instanceof Seq) // cf. visitRecursion (also cf. LSkip) { elems.addAll(((Seq) e1).getElements()); // Handles empty Seq case } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java index d42021a0d..e232b943b 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java @@ -30,6 +30,7 @@ // Return true iff this LType is "equivalent" to a single "continue X", where X is in rvs // Would be an "InlinedAgg" +@Deprecated public class SingleContinueChecker extends STypeAggNoThrow { private Set rvs; diff --git a/scribble-test/src/test/resources/bad/todo/Recursion19b.scr b/scribble-test/src/test/resources/bad/todo/Recursion19b.scr index 89f177814..b7568a80b 100644 --- a/scribble-test/src/test/resources/bad/todo/Recursion19b.scr +++ b/scribble-test/src/test/resources/bad/todo/Recursion19b.scr @@ -9,7 +9,8 @@ global protocol Proto1(role A, role B) { continue X; // CHECKME: was previously considered bad -- but now, projection implicitly removes this continue so the 1() is not a bad continuation any more... - // TODO: check as global WF instead? unguarded continue? (cf. reachability) -- or consider good? + // TODO: check as global WF instead? unguarded continue? (cf. reachability) + // Or consider good? maybe consistent with, e.g., rec X { continue X; }, already being discarded } or { From f32d448af282b50132964ea52fee62ae22932b2e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 18 Apr 2019 13:45:14 +0100 Subject: [PATCH 324/539] [AllTest] Minor. --- .../scribble/core/lang/global/GProtocol.java | 8 ++++--- .../core/visit/global/InlinedProjector.java | 9 +------ scribble-test/src/test/scrib/tmp/Test.scr | 24 +++++++++++++++---- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 077d205dd..0090703cd 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -106,7 +106,9 @@ public LProjection project(Core core, Role self) { LSeq def = new Projector(core, self).visitSeq(this.def); return projectAux(self, - core.getContext().getInlined(this.fullname).roles, // Use inlined decls, already pruned + core.getContext().getInlined(this.fullname).roles, + // Using inlined global, global role decls already pruned -- CHECKME: is this still relevant? + // Actual projection role decl pruning done by projectAux def); } @@ -118,7 +120,7 @@ private LProjection projectAux(Role self, List decls, LSeq body) Set tmp = pruned.gather(new RoleGatherer()::visit) .collect(Collectors.toSet()); List roles = decls.stream() - .filter(x -> x.equals(self) || tmp.contains(x)) // Implicitly filters Role.SELF + .filter(x -> x.equals(self) || tmp.contains(x)) .collect(Collectors.toList()); List> params = new LinkedList<>(this.params); // CHECKME: filter params by usage? @@ -164,7 +166,7 @@ else if (n instanceof SigName) GSeq def = new RecPruner().visitSeq(seq); Set used = def.gather(new RoleGatherer()::visit) .collect(Collectors.toSet()); - List rs = this.roles.stream().filter(x -> used.contains(x)) // Prune role decls + List rs = this.roles.stream().filter(x -> used.contains(x)) // Prune role decls -- CHECKME: what is an example? was this from before unused role checking? .collect(Collectors.toList()); return new GProtocol(getSource(), this.mods, this.fullname, rs, this.params, def); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index c32bc1037..85574d7eb 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -54,16 +54,9 @@ // Pre: use on inlined (i.e., Do inlined, roles pruned) public class InlinedProjector extends STypeAggNoThrow { - //HERE make Map for guarded or not, prune continues as part of projection -- then fix RecPruner to be general (including pruning empty choice blocks), and prune recs after continues pruned - /*HERE - -- try clone in seq, rather than choice - -- fix choice context merging w.r.t. unguarded clear - -- fix rec pruning - -- fix projector unguarded inheritance - -- need old style subproto visitor for imed-projection do-pruning*/ - protected final Set unguarded; // Projection "prunes" unguarded continues from choice cases, e.g., mu X.(A->B:1.X + A->B:2.A->C:2) for C, i.e., travel agent + // ...this can be followed by RecPruner to remove recs that are "orphaned" by continue pruning // N.B. projection does not "merge" choice cases in , e.g., rec X { 1() from A; choice at A { continue X; } or { continue X; } }... // ...that is a non-det branch, same as rec X { choice at A { 1() from A; } or { 1() from A; } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 16a0444dd..3f2d77bcb 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -78,6 +78,7 @@ module tmp.Test; // For model build/check refactoring: +// TODO: fix imed-projection choice subjects -- inlined-projection is a single proto with all roles //HERE refactor model states, remove intermedrecedge // Outstanding: @@ -95,12 +96,13 @@ module tmp.Test; // -- otoh, ast errors give source feedback -- maybe implement both // use stypefactory in core -- also make visitorfactorys (both core and ast) - - -// codegen refactoring: +// Job/codegen refactoring: + // old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? + // also do-arg pruning, for role-pruned projection decls // choice-specific fairness annotations // fix codegen when -fair + // Test refactoring: // refactor test to use main instead of cli @@ -136,7 +138,21 @@ global protocol Proto1(role A, role B, role C) } //*/ -//* +global protocol Proto1(role A, role B, role C) +{ + choice at A // TODO: add junit test, testing core inlined projection choice subjects (for C) + { + 1() from A to B; + 1() from B to C; + } + or + { + 2() from A to B; + 2() from B to C; + } +} + +/* global protocol Proto1(role A, role B, role C) { choice at A From 8ad97dcb7c59684ccabdaf76647d6edf36222004 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 19 Apr 2019 13:05:02 +0100 Subject: [PATCH 325/539] [AllTest] Continued: refactoring projection and rec/continue/choice pruning. --- .../main/java/org/scribble/core/job/Core.java | 32 ++-- .../scribble/core/lang/global/GProtocol.java | 2 + .../core/visit/InlinedEnablerInferer.java | 138 +++++++++++++++ .../core/visit/InlinedExtChoiceSubjFixer.java | 157 ++++++++++++++++++ .../core/visit/global/InlinedProjector.java | 22 ++- scribble-test/src/test/scrib/tmp/Test.scr | 20 ++- 6 files changed, 344 insertions(+), 27 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/InlinedEnablerInferer.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/InlinedExtChoiceSubjFixer.java diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 053353894..e0661b31f 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -84,6 +84,23 @@ public void runPasses() throws ScribException runSyntacticTransformPasses(); runSyntacticWfPasses(); runProjectionPasses(); // CHECKME: can try before validation (i.e., including syntactic WF), to promote greater tool feedback? (cf. CommandLine output "barrier") + + // FIXME: move + verbosePrintPass("Checking reachability on all projected inlineds..."); + for (GProtoName fullname : this.context.getParsedFullnames()) + { + GProtocol inlined = this.context.getInlined(fullname); + if (inlined.isAux()) // CHECKME: also check for aux? e.g., bad.reach.globals.gdo.Test01b + { + continue; + } + for (Role r : inlined.roles) + { + LProjection iproj = this.context.getProjectedInlined(fullname, r); + iproj.checkReachability(); + } + } + runEfsmBuildingPasses(); // Currently, unfair-transform graph building must come after syntactic WF --- TODO fix graph building to prevent crash ? runModelCheckingPasses(); } @@ -225,21 +242,6 @@ protected void runSyntacticWfPasses() throws ScribException } inlined.checkExtChoiceConsistency(); } - - verbosePrintPass("Checking reachability on all projected inlineds..."); - for (GProtoName fullname : this.context.getParsedFullnames()) - { - GProtocol inlined = this.context.getInlined(fullname); - if (inlined.isAux()) // CHECKME: also check for aux? e.g., bad.reach.globals.gdo.Test01b - { - continue; - } - for (Role r : inlined.roles) - { - LProjection iproj = this.context.getProjectedInlined(fullname, r); - iproj.checkReachability(); - } - } } protected void runModelCheckingPasses() throws ScribException diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 0090703cd..cc444813e 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -50,6 +50,7 @@ import org.scribble.core.type.session.global.GRecursion; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.visit.InlinedExtChoiceSubjFixer; import org.scribble.core.visit.MessageIdGatherer; import org.scribble.core.visit.RecPruner; import org.scribble.core.visit.RoleGatherer; @@ -99,6 +100,7 @@ public void checkExtChoiceConsistency() throws ScribException public LProjection projectInlined(Core core, Role self) { LSeq def = new InlinedProjector(core, self).visitSeq(this.def); + def = new InlinedExtChoiceSubjFixer().visitSeq(def); return projectAux(self, this.roles, def); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/InlinedEnablerInferer.java b/scribble-core/src/main/java/org/scribble/core/visit/InlinedEnablerInferer.java new file mode 100644 index 000000000..93ccc473b --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/InlinedEnablerInferer.java @@ -0,0 +1,138 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.visit; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.ProtoName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.Continue; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.local.LSeq; + +// Post: Optional return is populated for "well-formed" locals, e.g., projections from WF globals +// Return Optional(null) for "failed" inference (n.b., cf. !isPresent, for an "empty" local) +@Deprecated +public class InlinedEnablerInferer + extends STypeAggNoThrow> +{ + private Map> recs; + + public InlinedEnablerInferer(Map> recs) + { + this.recs = Collections.unmodifiableMap(recs); + } + + @Override + public Optional visitChoice(Choice n) + { + List> enablers = n.blocks.stream().map(x -> visitSeq(x)) + .collect(Collectors.toList()); // Each elem is null, empty or isPresent + if (enablers.stream().anyMatch(x -> x.isPresent() && x.get() == null)) + { + return Optional.of(null); + } + else if (enablers.stream().allMatch(x -> !x.isPresent())) + { + return Optional.empty(); + // CHECKME: can enablers be empty? i.e., choice was "empty" somehow? + // Yes, when not assuming, e.g., empty block filtering by InlinedProject + } + else if (enablers.stream().allMatch(x -> x.isPresent())) + { + Set rs = enablers.stream().map(x -> x.get()) + .collect(Collectors.toSet()); + return (rs.size() > 1) ? Optional.of(null) + : Optional.of(rs.iterator().next()); + } + else + { + return Optional.of(null); + } + } + + @Override + public Optional visitContinue(Continue n) + { + return this.recs.containsKey(n.recvar) + ? this.recs.get(n.recvar) + : Optional.empty(); + // Corner case, e.g., bad sequence after unguarded continue (will be caught be reachability, e.g., bad.reach.globals.gdo.Test04) + // Empty allows (bad) Seq to continue to next element + } + + @Override + public Optional visitDirectedInteraction( + DirectedInteraction n) + { + return Optional.of(n.src); + } + + @Override + public > Optional visitDo( + Do n) + { + throw new RuntimeException("Unsupported for Do: " + n); + } + + public Optional visitRecursion(Recursion n) + { + return visitSeq(n.body); // null, empty or OK + } + + @Override + public Optional visitSeq(LSeq n) + { + for (SType e : n.elems) + { + Optional res = e.visitWithNoThrow(this); + if (res.isPresent()) + { + return res; + } + } + return Optional.empty(); + } + + @Override + protected Optional unit(SType n) + { + return Optional.of(null); // null signifies inference has "failed" (cf. Stream.of()) -- e.g., encountering a disconnect before anything else + } + + // N.B. currently only used by visitRecursion, Choice/Seq manually overridden above + @Override + protected Optional agg(SType n, Stream> ts) + { + throw new RuntimeException("Unsupported: "); + //return ts.findFirst().get(); // FIXME: should be as in Choice + /*List> tmp = ts.collect(Collectors.toList()); + return (tmp.size() > 1) + ? Optional.of(null) // Currently doesn't happen, because Choice handled "manually" above + : tmp.get(0);*/ + // Contents may be null (inference failed) + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/InlinedExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/InlinedExtChoiceSubjFixer.java new file mode 100644 index 000000000..bd43507b9 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/InlinedExtChoiceSubjFixer.java @@ -0,0 +1,157 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.visit; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.ProtoName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.Continue; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.local.LSeq; + +// Post: Optional return is populated for "well-formed" locals, e.g., projections from WF globals +// Return Optional(null) for "failed" inference (n.b., cf. !isPresent, for an "empty" local) +public class InlinedExtChoiceSubjFixer + extends STypeVisitorNoThrow +{ + private Map> recs = new HashMap<>(); + + @Override + public Choice visitChoice(Choice n) + { + InlinedEnablerInferer1 v = new InlinedEnablerInferer1(this.recs); + Optional subj = n.visitWithNoThrow(v); + return n.reconstruct(n.getSource(), subj.get(), n.blocks); + } + + @Override + public > SType visitDo( + Do n) + { + throw new RuntimeException("Unsupported for Do: " + n); + } + + @Override + public Recursion visitRecursion(Recursion n) + { + Optional r = new InlinedEnablerInferer1(this.recs).visitSeq(n.body); // recs unnecessary? + this.recs.put(n.recvar, r); // null, empty or OK + return n.reconstruct(n.getSource(), n.recvar, visitSeq(n.body)); + } +} + +class InlinedEnablerInferer1 + extends STypeAggNoThrow> +{ + private Map> recs; + + public InlinedEnablerInferer1(Map> recs) + { + this.recs = Collections.unmodifiableMap(recs); + } + + @Override + public Optional visitChoice(Choice n) + { + // If inference does not succeed (e.g., any inconsistency) keep the original + // Such cases due to bad WF should be caught somewhere else (e.g., reachability) + // Otherwise, should be "empty" cases, so keep original + List> enablers = n.blocks.stream().map(x -> visitSeq(x)) + .collect(Collectors.toList()); // Each elem is null, empty or isPresent + if (enablers.stream().anyMatch(x -> !x.isPresent())) + { + //return Optional.empty(); + return Optional.of(n.subj); + // CHECKME: can enablers be empty? i.e., choice was "empty" somehow? + // Yes, when not assuming, e.g., empty block filtering by InlinedProject + } + Set rs = enablers.stream().map(x -> x.get()) + .collect(Collectors.toSet()); + return Optional.of(rs.size() > 1 ? n.subj : rs.iterator().next()); + } + + @Override + public Optional visitContinue(Continue n) + { + return this.recs.containsKey(n.recvar) + ? this.recs.get(n.recvar) + : Optional.empty(); + // Empty corner case, e.g., bad sequence after unguarded continue (will be caught be reachability, e.g., bad.reach.globals.gdo.Test04) + // Empty allows (bad) Seq to continue to next element + } + + @Override + public Optional visitDirectedInteraction( + DirectedInteraction n) + { + return Optional.of(n.src); + } + + @Override + public > Optional visitDo( + Do n) + { + throw new RuntimeException("Unsupported for Do: " + n); + } + + @Override + public Optional visitSeq(LSeq n) + { + for (SType e : n.elems) + { + Optional res = e.visitWithNoThrow(this); + if (res.isPresent()) + { + return res; + } + } + return Optional.empty(); + } + + @Override + protected Optional unit(SType n) + { + return Optional.empty(); // Empty signifies inference did not succeed, either outright bad (should be caught by WF somewhere) or an "empty" context + } + + // Currently only used by Recursion, Choice/Seq overrides don't use + @Override + protected Optional agg(SType n, Stream> ts) + { + List> enabs = ts.collect(Collectors.toList()); + if (enabs.stream().anyMatch(x -> !x.isPresent())) + { + return Optional.empty(); + // CHECKME: can enablers be empty? i.e., choice was "empty" somehow? + // Yes, when not assuming, e.g., empty block filtering by InlinedProject + } + Set rs = enabs.stream().map(x -> x.get()) + .collect(Collectors.toSet()); + return rs.size() > 1 ? Optional.empty() : Optional.of(rs.iterator().next()); + } +} \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index 85574d7eb..85fc73959 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -54,6 +54,7 @@ // Pre: use on inlined (i.e., Do inlined, roles pruned) public class InlinedProjector extends STypeAggNoThrow { + //protected final Set unguarded; protected final Set unguarded; // Projection "prunes" unguarded continues from choice cases, e.g., mu X.(A->B:1.X + A->B:2.A->C:2) for C, i.e., travel agent // ...this can be followed by RecPruner to remove recs that are "orphaned" by continue pruning @@ -100,20 +101,25 @@ protected LType agg(SType n, Stream ts) @Override public LType visitChoice(Choice n) { - Role subj = n.subj.equals(self) ? Role.SELF : n.subj; - // CHECKME: "self" also explcitily used for Do, but implicitly for MessageTransfer, inconsistent? - List tmp = n.blocks.stream() + List blocks = n.blocks.stream() .map(x -> dup().visitSeq(x)) .filter(x -> !x.isEmpty() && !isUnguardedSingleContinue(x)) .collect(Collectors.toList()); - if (tmp.isEmpty()) + if (blocks.isEmpty()) { return LSkip.SKIP; // CHECKME: OK, or "empty" choice at subj still important? } - this.unguarded.clear(); // At least one block is non-empty, consider continues guarded - return new LChoice(null, subj, tmp); + //this.unguarded.clear(); // At least one block is non-empty, consider continues guarded -- done in Seq + + //InlinedEnablerInferer v = new InlinedEnablerInferer(this.unguarded); + Role subj = n.subj.equals(this.self) + ? Role.SELF // i.e., internal choice + : n.subj;//v.visitSeq(blocks.get(0)).get(); // CHECKME: consistent ext choice means can infer from any one seq? + // CHECKME: "self" also explcitily used for Do, but implicitly for MessageTransfer, inconsistent? + return new LChoice(null, subj, blocks); } + // N.B. won't prune unguarded continues that have a bad sequence, will be caught later by reachability checking (e.g., bad.reach.globals.gdo.Test04) private boolean isUnguardedSingleContinue(LSeq block) { if (block.elems.size() != 1) @@ -122,7 +128,9 @@ private boolean isUnguardedSingleContinue(LSeq block) } SType e = block.elems.get(0); return (e instanceof LContinue) - && this.unguarded.contains(((LContinue) e).recvar); + && this.unguarded.contains(((LContinue) e).recvar); // Bound recvars already checked + /*&& (!this.unguarded.get(((LContinue) e).recvar).isPresent() + || this.unguarded.get(((LContinue) e).recvar).get() == null);*/ } @Override diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 3f2d77bcb..0fbc59180 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -109,13 +109,21 @@ module tmp.Test; data "..." from "..." as T; -/* -global protocol Proto1(role A, role B) +//* +global protocol Proto1(role A, role B, role C) { - 1() from A to B; rec X { - continue X; + 1() from A to B; + 2() from B to C; + choice at A + { + continue X; // TODO: add junit test, testing inlined choice subj fixing + } + or + { + continue X; + } } } //*/ @@ -138,9 +146,10 @@ global protocol Proto1(role A, role B, role C) } //*/ +/* global protocol Proto1(role A, role B, role C) { - choice at A // TODO: add junit test, testing core inlined projection choice subjects (for C) + choice at A // TODO: add junit test, testing core inlined projection choice subjects (for C) -- already exists? { 1() from A to B; 1() from B to C; @@ -151,6 +160,7 @@ global protocol Proto1(role A, role B, role C) 2() from B to C; } } +//*/ /* global protocol Proto1(role A, role B, role C) From d082d37e6255b402ecd25035decf736b5baab39c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 19 Apr 2019 13:06:38 +0100 Subject: [PATCH 326/539] [AllTest] Continued: refactoring projection and rec/continue/choice pruning. --- .../core/visit/InlinedEnablerInferer.java | 138 ------------------ .../core/visit/InlinedExtChoiceSubjFixer.java | 8 +- .../bad/reach/globals/gdo/Test04a.scr | 16 ++ 3 files changed, 20 insertions(+), 142 deletions(-) delete mode 100644 scribble-core/src/main/java/org/scribble/core/visit/InlinedEnablerInferer.java create mode 100644 scribble-test/src/test/resources/bad/reach/globals/gdo/Test04a.scr diff --git a/scribble-core/src/main/java/org/scribble/core/visit/InlinedEnablerInferer.java b/scribble-core/src/main/java/org/scribble/core/visit/InlinedEnablerInferer.java deleted file mode 100644 index 93ccc473b..000000000 --- a/scribble-core/src/main/java/org/scribble/core/visit/InlinedEnablerInferer.java +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.core.visit; - -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.ProtoName; -import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Choice; -import org.scribble.core.type.session.Continue; -import org.scribble.core.type.session.DirectedInteraction; -import org.scribble.core.type.session.Do; -import org.scribble.core.type.session.Recursion; -import org.scribble.core.type.session.SType; -import org.scribble.core.type.session.local.LSeq; - -// Post: Optional return is populated for "well-formed" locals, e.g., projections from WF globals -// Return Optional(null) for "failed" inference (n.b., cf. !isPresent, for an "empty" local) -@Deprecated -public class InlinedEnablerInferer - extends STypeAggNoThrow> -{ - private Map> recs; - - public InlinedEnablerInferer(Map> recs) - { - this.recs = Collections.unmodifiableMap(recs); - } - - @Override - public Optional visitChoice(Choice n) - { - List> enablers = n.blocks.stream().map(x -> visitSeq(x)) - .collect(Collectors.toList()); // Each elem is null, empty or isPresent - if (enablers.stream().anyMatch(x -> x.isPresent() && x.get() == null)) - { - return Optional.of(null); - } - else if (enablers.stream().allMatch(x -> !x.isPresent())) - { - return Optional.empty(); - // CHECKME: can enablers be empty? i.e., choice was "empty" somehow? - // Yes, when not assuming, e.g., empty block filtering by InlinedProject - } - else if (enablers.stream().allMatch(x -> x.isPresent())) - { - Set rs = enablers.stream().map(x -> x.get()) - .collect(Collectors.toSet()); - return (rs.size() > 1) ? Optional.of(null) - : Optional.of(rs.iterator().next()); - } - else - { - return Optional.of(null); - } - } - - @Override - public Optional visitContinue(Continue n) - { - return this.recs.containsKey(n.recvar) - ? this.recs.get(n.recvar) - : Optional.empty(); - // Corner case, e.g., bad sequence after unguarded continue (will be caught be reachability, e.g., bad.reach.globals.gdo.Test04) - // Empty allows (bad) Seq to continue to next element - } - - @Override - public Optional visitDirectedInteraction( - DirectedInteraction n) - { - return Optional.of(n.src); - } - - @Override - public > Optional visitDo( - Do n) - { - throw new RuntimeException("Unsupported for Do: " + n); - } - - public Optional visitRecursion(Recursion n) - { - return visitSeq(n.body); // null, empty or OK - } - - @Override - public Optional visitSeq(LSeq n) - { - for (SType e : n.elems) - { - Optional res = e.visitWithNoThrow(this); - if (res.isPresent()) - { - return res; - } - } - return Optional.empty(); - } - - @Override - protected Optional unit(SType n) - { - return Optional.of(null); // null signifies inference has "failed" (cf. Stream.of()) -- e.g., encountering a disconnect before anything else - } - - // N.B. currently only used by visitRecursion, Choice/Seq manually overridden above - @Override - protected Optional agg(SType n, Stream> ts) - { - throw new RuntimeException("Unsupported: "); - //return ts.findFirst().get(); // FIXME: should be as in Choice - /*List> tmp = ts.collect(Collectors.toList()); - return (tmp.size() > 1) - ? Optional.of(null) // Currently doesn't happen, because Choice handled "manually" above - : tmp.get(0);*/ - // Contents may be null (inference failed) - } -} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/InlinedExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/InlinedExtChoiceSubjFixer.java index bd43507b9..e575e5a3f 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/InlinedExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/InlinedExtChoiceSubjFixer.java @@ -44,7 +44,7 @@ public class InlinedExtChoiceSubjFixer @Override public Choice visitChoice(Choice n) { - InlinedEnablerInferer1 v = new InlinedEnablerInferer1(this.recs); + InlinedEnablerInferer v = new InlinedEnablerInferer(this.recs); Optional subj = n.visitWithNoThrow(v); return n.reconstruct(n.getSource(), subj.get(), n.blocks); } @@ -59,18 +59,18 @@ public > SType visitDo( @Override public Recursion visitRecursion(Recursion n) { - Optional r = new InlinedEnablerInferer1(this.recs).visitSeq(n.body); // recs unnecessary? + Optional r = new InlinedEnablerInferer(this.recs).visitSeq(n.body); // recs unnecessary? this.recs.put(n.recvar, r); // null, empty or OK return n.reconstruct(n.getSource(), n.recvar, visitSeq(n.body)); } } -class InlinedEnablerInferer1 +class InlinedEnablerInferer extends STypeAggNoThrow> { private Map> recs; - public InlinedEnablerInferer1(Map> recs) + public InlinedEnablerInferer(Map> recs) { this.recs = Collections.unmodifiableMap(recs); } diff --git a/scribble-test/src/test/resources/bad/reach/globals/gdo/Test04a.scr b/scribble-test/src/test/resources/bad/reach/globals/gdo/Test04a.scr new file mode 100644 index 000000000..18e9c0809 --- /dev/null +++ b/scribble-test/src/test/resources/bad/reach/globals/gdo/Test04a.scr @@ -0,0 +1,16 @@ +module bad.reach.globals.gdo.Test04a; + + +global protocol Foo(role A, role B) +{ + choice at A + { + do Foo(A, B); // Unguarded gets unfolded.. + 2() from A to B; // ..becomes unreachable after continue once unfolded + } + or + { + 1() from A to B; + } +} + From ff7a16c7c0157682508351eb7ee5e04ff4239a4a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 19 Apr 2019 13:09:20 +0100 Subject: [PATCH 327/539] [AllTest] Minor. --- scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java index f2f870c01..f7f61d03a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -145,8 +145,7 @@ public final ScribNodeBase del(ScribDel del) } // Non-defensive - // CHECKME: make protected again after refactoring ast to parser ? - public final void setDel(ScribDel del) + protected final void setDel(ScribDel del) { this.del = del; } From 9673ef0418ea45321a30baba0a5a0690c304c0f6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 19 Apr 2019 13:25:00 +0100 Subject: [PATCH 328/539] [AllTest] Minor. --- .../java/org/scribble/core/job/CoreContext.java | 1 + .../scribble/core/lang/global/GProtocol.java | 5 +++-- .../scribble/core/model/endpoint/EGraph.java | 2 +- .../core/visit/InlinedExtChoiceSubjFixer.java | 17 +++++++++-------- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index 01263c1bc..2fd66d390 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -57,6 +57,7 @@ public class CoreContext // LProtocolName is the full local protocol name (module name is the prefix) // LProtocolName key is LProtocol value fullname (i.e., redundant) private final Map projs = new HashMap<>(); + // FIXME: choice-subj fixing, do-pruning -- factor out to Job and do there via AstVisitor? -- make testing compare the two sides // Built from projected inlined private final Map fEGraphs = new HashMap<>(); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index cc444813e..d92384d10 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -100,13 +100,14 @@ public void checkExtChoiceConsistency() throws ScribException public LProjection projectInlined(Core core, Role self) { LSeq def = new InlinedProjector(core, self).visitSeq(this.def); - def = new InlinedExtChoiceSubjFixer().visitSeq(def); - return projectAux(self, this.roles, def); + LSeq fixed = new InlinedExtChoiceSubjFixer().visitSeq(def); + return projectAux(self, this.roles, fixed); } public LProjection project(Core core, Role self) { LSeq def = new Projector(core, self).visitSeq(this.def); + // FIXME: ext choice subj fixing, do pruning -- refactor to Job and use AstVisitor? return projectAux(self, core.getContext().getInlined(this.fullname).roles, // Using inlined global, global role decls already pruned -- CHECKME: is this still relevant? diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java index 86fb56bf3..db6a22aeb 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java @@ -21,7 +21,7 @@ public class EGraph implements MPrettyPrint public final EState init; public final EState term; - //protected EGraph(EState init, EState term) + //protected EGraph(EState init, EState term) // Use factory? public EGraph(EState init, EState term) { this.init = init; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/InlinedExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/InlinedExtChoiceSubjFixer.java index e575e5a3f..8e0972e27 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/InlinedExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/InlinedExtChoiceSubjFixer.java @@ -34,12 +34,12 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.local.LSeq; -// Post: Optional return is populated for "well-formed" locals, e.g., projections from WF globals -// Return Optional(null) for "failed" inference (n.b., cf. !isPresent, for an "empty" local) -public class InlinedExtChoiceSubjFixer - extends STypeVisitorNoThrow +// Easier to separate from InlinedProjector (i.e., finish projection first, then fix) +// (Doing "at the time" during projection requires, e.g., recursion body projections for "inference" on recursion entry, but the body can't really be projected yet without that upfront "inference") +public class InlinedExtChoiceSubjFixer extends STypeVisitorNoThrow { private Map> recs = new HashMap<>(); + // Record on entering rec states, to give to InlinedEnablerInferer on nested choice states (for unguarded continues) @Override public Choice visitChoice(Choice n) @@ -67,6 +67,7 @@ public Recursion visitRecursion(Recursion n) class InlinedEnablerInferer extends STypeAggNoThrow> + // Optional.empty signifies inference did not succeed, either outright bad (should be caught by WF somewhere) or an "empty" context { private Map> recs; @@ -78,9 +79,9 @@ public InlinedEnablerInferer(Map> recs) @Override public Optional visitChoice(Choice n) { - // If inference does not succeed (e.g., any inconsistency) keep the original - // Such cases due to bad WF should be caught somewhere else (e.g., reachability) - // Otherwise, should be "empty" cases, so keep original + // If inference does not succeed, keep the original + // Such bad cases due, e.g., any inconsistency, will be caught as bad WF somewhere else (e.g., reachability) + // Otherwise, should be "empty" cases, so keep original as a default List> enablers = n.blocks.stream().map(x -> visitSeq(x)) .collect(Collectors.toList()); // Each elem is null, empty or isPresent if (enablers.stream().anyMatch(x -> !x.isPresent())) @@ -136,7 +137,7 @@ public Optional visitSeq(LSeq n) @Override protected Optional unit(SType n) { - return Optional.empty(); // Empty signifies inference did not succeed, either outright bad (should be caught by WF somewhere) or an "empty" context + return Optional.empty(); } // Currently only used by Recursion, Choice/Seq overrides don't use From 1c33da7595417d31fcfcb861a879d80450c72d45 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 19 Apr 2019 13:31:06 +0100 Subject: [PATCH 329/539] [AllTest] Minor. --- .../main/java/org/scribble/core/job/Core.java | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index e0661b31f..3f4dbdc9c 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -81,32 +81,16 @@ protected CoreContext newCoreContext(//Map modcs, public void runPasses() throws ScribException { // Passes populate JobContext on-demand by each individual getter - runSyntacticTransformPasses(); - runSyntacticWfPasses(); + runSyntaxTransformPasses(); + runGlobalSyntaxWfPasses(); runProjectionPasses(); // CHECKME: can try before validation (i.e., including syntactic WF), to promote greater tool feedback? (cf. CommandLine output "barrier") - - // FIXME: move - verbosePrintPass("Checking reachability on all projected inlineds..."); - for (GProtoName fullname : this.context.getParsedFullnames()) - { - GProtocol inlined = this.context.getInlined(fullname); - if (inlined.isAux()) // CHECKME: also check for aux? e.g., bad.reach.globals.gdo.Test01b - { - continue; - } - for (Role r : inlined.roles) - { - LProjection iproj = this.context.getProjectedInlined(fullname, r); - iproj.checkReachability(); - } - } - + runProjectionSyntaxWfPasses(); runEfsmBuildingPasses(); // Currently, unfair-transform graph building must come after syntactic WF --- TODO fix graph building to prevent crash ? runModelCheckingPasses(); } // Populates JobContext -- although patten is to do on-demand via (first) getter, so (partially) OK to delay population - protected void runSyntacticTransformPasses() // No ScribException, no errors expected + protected void runSyntaxTransformPasses() // No ScribException, no errors expected { verbosePrintPass("Inlining subprotocols for all globals..."); for (GProtoName fullname : this.context.getParsedFullnames()) @@ -197,7 +181,7 @@ protected void runEfsmBuildingPasses() } } - protected void runSyntacticWfPasses() throws ScribException + protected void runGlobalSyntaxWfPasses() throws ScribException { verbosePrintPass( "Checking for unused role decls on all inlined globals..."); @@ -243,6 +227,25 @@ protected void runSyntacticWfPasses() throws ScribException inlined.checkExtChoiceConsistency(); } } + + // Pre: runGlobalSyntaxWfPasses + protected void runProjectionSyntaxWfPasses() throws ScribException + { + verbosePrintPass("Checking reachability on all projected inlineds..."); + for (GProtoName fullname : this.context.getParsedFullnames()) + { + GProtocol inlined = this.context.getInlined(fullname); + if (inlined.isAux()) // CHECKME: also check for aux? e.g., bad.reach.globals.gdo.Test01b + { + continue; + } + for (Role r : inlined.roles) + { + LProjection iproj = this.context.getProjectedInlined(fullname, r); + iproj.checkReachability(); + } + } + } protected void runModelCheckingPasses() throws ScribException { From 4622b9a8f588bc106f97b8f01016cadf8a85bd68 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 19 Apr 2019 13:41:37 +0100 Subject: [PATCH 330/539] [AllTest] Minor. --- .../main/java/org/scribble/core/lang/global/GProtocol.java | 2 +- .../core/visit/{ => local}/InlinedExtChoiceSubjFixer.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) rename scribble-core/src/main/java/org/scribble/core/visit/{ => local}/InlinedExtChoiceSubjFixer.java (97%) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index d92384d10..4f311f57c 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -50,7 +50,6 @@ import org.scribble.core.type.session.global.GRecursion; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.local.LSeq; -import org.scribble.core.visit.InlinedExtChoiceSubjFixer; import org.scribble.core.visit.MessageIdGatherer; import org.scribble.core.visit.RecPruner; import org.scribble.core.visit.RoleGatherer; @@ -61,6 +60,7 @@ import org.scribble.core.visit.global.InlinedProjector; import org.scribble.core.visit.global.Projector; import org.scribble.core.visit.global.RoleEnablingChecker; +import org.scribble.core.visit.local.InlinedExtChoiceSubjFixer; import org.scribble.util.ScribException; import org.scribble.util.ScribUtil; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/InlinedExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/core/visit/InlinedExtChoiceSubjFixer.java rename to scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java index 8e0972e27..326441079 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/InlinedExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.core.visit; +package org.scribble.core.visit.local; import java.util.Collections; import java.util.HashMap; @@ -33,6 +33,8 @@ import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.visit.STypeAggNoThrow; +import org.scribble.core.visit.STypeVisitorNoThrow; // Easier to separate from InlinedProjector (i.e., finish projection first, then fix) // (Doing "at the time" during projection requires, e.g., recursion body projections for "inference" on recursion entry, but the body can't really be projected yet without that upfront "inference") From 8d31b790383503c80640be13a3fb5a07ce1b70eb Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 19 Apr 2019 13:44:52 +0100 Subject: [PATCH 331/539] [AllTest] Minor. --- .../scribble/core/visit/local/InlinedExtChoiceSubjFixer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java index 326441079..c46f8c478 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java @@ -42,6 +42,7 @@ public class InlinedExtChoiceSubjFixer extends STypeVisitorNoThrow { private Map> recs = new HashMap<>(); // Record on entering rec states, to give to InlinedEnablerInferer on nested choice states (for unguarded continues) + // CHECKME: Optional necessary? InlinedEnablerInferer may not succeed due to empty/bad contexts, but should that be reflected here? @Override public Choice visitChoice(Choice n) @@ -61,7 +62,7 @@ public > SType visitDo( @Override public Recursion visitRecursion(Recursion n) { - Optional r = new InlinedEnablerInferer(this.recs).visitSeq(n.body); // recs unnecessary? + Optional r = new InlinedEnablerInferer(this.recs).visitSeq(n.body); // this.recs necessary? this.recs.put(n.recvar, r); // null, empty or OK return n.reconstruct(n.getSource(), n.recvar, visitSeq(n.body)); } From 85c8132efbee6f3d2d6cf2a6b72b019ea18f316e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 19 Apr 2019 13:48:03 +0100 Subject: [PATCH 332/539] [AllTest] Minor. --- .../core/visit/global/InlinedProjector.java | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index 85fc73959..286d859d7 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -86,18 +86,6 @@ protected InlinedProjector dup() return new InlinedProjector(this); } - @Override - protected LType unit(SType n) - { - throw new RuntimeException("Disregarded for Projector: " + n); - } - - @Override - protected LType agg(SType n, Stream ts) - { - throw new RuntimeException("Disregarded for Projector: " + n + " ,, " + ts); - } - @Override public LType visitChoice(Choice n) { @@ -129,8 +117,6 @@ private boolean isUnguardedSingleContinue(LSeq block) SType e = block.elems.get(0); return (e instanceof LContinue) && this.unguarded.contains(((LContinue) e).recvar); // Bound recvars already checked - /*&& (!this.unguarded.get(((LContinue) e).recvar).isPresent() - || this.unguarded.get(((LContinue) e).recvar).get() == null);*/ } @Override @@ -225,6 +211,7 @@ public LSeq visitSeq(GSeq n) // So a projection never contains an empty LSeq -- i.e., "empty choice/rec" pruning unnecessary } + // CHECKME: relocate? public static LProtoName getSimpledProjectionName(GProtoName simpname, Role role) { @@ -237,7 +224,8 @@ public static LProtoName getFullProjectionName(GProtoName fullname, { LProtoName simplename = InlinedProjector.getSimpledProjectionName( fullname.getSimpleName(), role); - ModuleName modname = getProjectionModuleName(fullname.getPrefix(), simplename); + ModuleName modname = getProjectionModuleName(fullname.getPrefix(), + simplename); return new LProtoName(modname, simplename); } @@ -249,4 +237,17 @@ public static ModuleName getProjectionModuleName(ModuleName fullname, fullname.getSimpleName().toString() + "_" + localname.toString()); return new ModuleName(fullname.getPrefix(), simpname); // Supports unary fullname } + + @Override + protected LType unit(SType n) + { + throw new RuntimeException("Unsupported for InlinedProjector: " + n); + } + + @Override + protected LType agg(SType n, Stream ts) + { + throw new RuntimeException( + "Unsupported for InlinedProjector: " + n + " ,, " + ts); + } } From 6f2803f924edb7b8d3a97e5e7642e171a2a1e0cf Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 19 Apr 2019 21:42:40 +0100 Subject: [PATCH 333/539] [AllTest] Continued: refactoring graph building. --- .../main/java/org/scribble/core/job/Core.java | 8 +- .../scribble/core/model/GraphBuilderUtil.java | 3 +- .../model/endpoint/EGraphBuilderUtil.java | 193 +++--------------- .../core/visit/local/EGraphBuilder.java | 87 ++++---- 4 files changed, 81 insertions(+), 210 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 3f4dbdc9c..ab1970c8c 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -103,7 +103,7 @@ protected void runSyntaxTransformPasses() // No ScribException, no errors expec verbosePrintPass("Unfolding all recursions once for all inlined globals..."); for (GProtoName fullname : this.context.getParsedFullnames()) { - // TODO: currently, unfolded not actually stored by Context -- unfoldAllOnce repeated manually when needed, e.g., runSyntacticWfPasses + // TODO: currently, unfolded not actually stored by Context -- unfoldAllOnce repeated manually when needed, e.g., runSyntaxWfPasses GProtocol inlined = this.context.getInlined(fullname); GTypeUnfolder v = new GTypeUnfolder(); GProtocol unf = (GProtocol) inlined.unfoldAllOnce(v);//.unfoldAllOnce(unf2); // CHECKME: twice unfolding? instead of "unguarded"-unfolding? @@ -146,7 +146,7 @@ protected void runProjectionPasses() // No ScribException, no errors expected } } - // Builds only the fair EFSMs, unfair EFSM building depends on WF (role enabling, e.g., bad.wfchoice.enabling.threeparty.Test02) for building algorithm to work... + // Pre: runGlobalSyntaxWfPasses -- unfair EFSM building depends on WF (role enabling, e.g., bad.wfchoice.enabling.threeparty.Test02) for building algorithm to work... // ...or patch unfair-transform graph building to not crash? protected void runEfsmBuildingPasses() { @@ -156,7 +156,7 @@ protected void runEfsmBuildingPasses() GProtocol inlined = this.context.getInlined(fullname); for (Role self : inlined.roles) { - // Seems to be OK even if runSyntacticWfPasses fails (cf. unfair transform) + // Seems to be OK even if runSyntaxWfPasses does not succeed (cf. unfair transform) EGraph graph = this.context.getEGraph(fullname, self); verbosePrintPass( "Built EFSM: " + inlined.fullname + ":\n" + graph.toDot()); @@ -172,7 +172,7 @@ protected void runEfsmBuildingPasses() GProtocol inlined = this.context.getInlined(fullname); for (Role self : inlined.roles) { - // Pre: runSyntacticWfPasses -- e.g., bad.wfchoice.enabling.threeparty.Test02 + // Pre: runGlobalSyntaxWfPasses -- e.g., bad.wfchoice.enabling.threeparty.Test02 EGraph graph = this.context.getUnfairEGraph(inlined.fullname, self); verbosePrintPass("Built \"unfair\" EFSM: " + inlined.fullname + ":\n" + graph.toDot()); diff --git a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java index 069c7ffaa..38646c6e7 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java @@ -17,6 +17,7 @@ import org.scribble.util.ScribException; // Helper class for EndpointGraphBuilder -- can access the protected setters of S +// GraphBuilderUtil usage contract (1): this.entry on leaving a node is the same as on entering // N.B. must call init before every "new visit", including first public abstract class GraphBuilderUtil , // State type K extends ProtoKind> // Global/local actions/states -- Need to quantify K explicitly { - protected S entry; + protected S entry; // GraphBuilderUtil usage contract: entry on leaving a node is the same as on entering -- cf., EGraphBuilderUtil.visitSeq restores the original entry on leaving protected S exit; // Tracking exit is convenient for merges (otherwise have to generate dummy merge nodes) protected GraphBuilderUtil() diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index 6631dc405..3f945a13d 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -13,7 +13,6 @@ */ package org.scribble.core.model.endpoint; -import java.util.Arrays; import java.util.Collections; import java.util.Deque; import java.util.HashMap; @@ -24,7 +23,6 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import java.util.stream.Stream; import org.scribble.core.model.GraphBuilderUtil; import org.scribble.core.model.ModelFactory; @@ -34,6 +32,7 @@ import org.scribble.util.ScribException; // N.B. init must be called before every "new visit", including first -- no: now init implicit on construction, and finalise also does init +// (E)GraphBuilderUtil usage contract (2): all states must be made via newState // FIXME TODO replace EGraphBuilderUtil // Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) // Tailored to support graph building from syntactic local protocol choice and recursion @@ -42,20 +41,24 @@ public class EGraphBuilderUtil { public final ModelFactory ef; // N.B. new states should be made by this.newState, not this.ef.newEState - private final Map outerRecvars = new HashMap<>(); // FIXME: deprecate private final Map> recvars = new HashMap<>(); // CHECKME: Deque is for shadowing? // First action(s) inside a rec scope ("enacting" means how to enact an unguarded choice-continue) - //private final Map>> enacting = new HashMap<>(); + // These are collected by: + // - On each recursion entry, push a new list for that recvar -- list pushing/popping mainly for handling choices (see below) + // - General idea: via addEdge, record the first action encountered for all "*open*" recvars, i.e., add the action to all current lists that are *still empty* + // - For choice: + // -- On choice entry, first push a new list for *all* recvars for recording the choice cases (all, including "non-open", because inconvenient to distinguish open/non-open from nested contexts) + // -- On block entry, push another new list for *all* recvars for recording the current block + // -- (Record, via addEdge, the first action of the current block for all open recvars) + // -- On block exit, pop the block list into the parent choice list for *all* recvars + // -- On choice exit, pop the choice list into the parent (recursion/choice-block) list for all *open* recvars, i.e., if the parent list is *still empty* + // -- On recursion exit, just pop the list private final Map>> enacting = new HashMap<>(); - // CHECKME: Set sufficient? or List? (consider non-determinism -- does it matter?) //private final Map>> enactingMap = new HashMap<>(); // Record enacting per-recvar, since a state could have multi-recvars private final Map>> enactingMap = new HashMap<>(); - private final Deque> pred = new LinkedList<>(); - private final Deque> prev = new LinkedList<>(); - public EGraphBuilderUtil(ModelFactory ef) { this.ef = ef; @@ -91,12 +94,6 @@ protected void clear() { this.recvars.clear(); this.enacting.clear(); - - this.pred.clear(); - this.pred.push(new LinkedList<>()); - - this.prev.clear(); - this.prev.push(new LinkedList<>()); this.enactingMap.clear(); @@ -106,7 +103,8 @@ protected void clear() private final Set states = new HashSet<>(); // For the util to additionally record states - // CHECKME: make interface less messy w.r.t. this.ef.newEState + // CHECKME: make interface less messy w.r.t. this.ef.newEState + // CHECKME: factor up to super? //@Override public EState newState(Set labs) { @@ -121,14 +119,6 @@ public EState newState(Set labs) public void addEdge(EState s, EAction a, EState succ) { addEdgeAux(s, a, succ); - - //if (!this.pred.isEmpty()) - { - this.pred.pop(); - this.prev.pop(); - } - this.pred.push(new LinkedList<>(Arrays.asList(s))); - this.prev.push(new LinkedList<>(Arrays.asList(a))); //for (Deque> ens : this.enacting.values()) for (Deque> ens : this.enacting.values()) @@ -151,9 +141,6 @@ public void addEdge(EState s, EAction a, EState succ) */ public void enterChoice() { - this.pred.push(new LinkedList<>()); - this.prev.push(new LinkedList<>()); - for (RecVar rv : this.enacting.keySet()) { ////Deque> tmp = this.enacting.get(rv); @@ -166,20 +153,8 @@ public void enterChoice() public void leaveChoice() { - List pred = this.pred.pop(); - List prev = this.prev.pop(); - if (!pred.isEmpty()) - { - this.pred.pop(); - this.prev.pop(); - this.pred.push(pred); - this.prev.push(prev); - } - for (RecVar rv : this.enacting.keySet()) { - /*Set pop = this.enacting.get(rv).pop(); - Set peek = this.enacting.get(rv).peek();*/ List pop = this.enacting.get(rv).pop(); List peek = this.enacting.get(rv).peek(); if (peek.isEmpty()) // Cf. addEdge @@ -191,9 +166,6 @@ public void leaveChoice() public void pushChoiceBlock() { - this.pred.push(null); // Signifies following statement is "unguarded" in this choice block - this.prev.push(null); - for (RecVar rv : this.enacting.keySet()) { //Deque> tmp = this.enacting.get(rv); @@ -205,33 +177,6 @@ public void pushChoiceBlock() public void popChoiceBlock() { - List pred = this.pred.pop(); - List prev = this.prev.pop(); - - if (pred != null) // Unguarded choice-continue? - { - List peek1 = this.pred.peek(); - if (peek1 == null) - { - this.pred.pop(); - peek1 = new LinkedList<>(); - this.pred.push(peek1); - } - peek1.addAll(pred); - } - - if (prev != null) - { - List peek2 = this.prev.peek(); - if (peek2 == null) - { - this.prev.pop(); - peek2 = new LinkedList<>(); - this.prev.push(peek2); - } - peek2.addAll(prev); - } - for (RecVar rv : this.enacting.keySet()) { /*Set pop = this.enacting.get(rv).pop(); @@ -289,12 +234,16 @@ public void popRecursionEntry(RecVar rv) //Set pop = this.enacting.get(recvar).pop(); List pop = this.enacting.get(rv).pop(); - if (this.enacting.get(rv).isEmpty()) // All Sets popped from the stack of this recvar + if (this.enacting.get(rv).isEmpty()) // All Lists popped from the stack of this recvar -- could just clear instead { this.enacting.remove(rv); } + + EState curr = getEntry(); + // Same as getRecursionEntry(rv) + // Because contract for GraphBuilderUtil is entry on leaving a node is the same as on entry, cf., EGraphBuilder.visitSeq restores original entry on leaving + // (And visitRecursion just does visitSeq for the recursion body, with the current entry/exit) - EState curr = getEntry(); //Map> tmp = this.enactingMap.get(curr); Map> tmp = this.enactingMap.get(curr); if (tmp == null) @@ -309,15 +258,7 @@ public void popRecursionEntry(RecVar rv) /* * Edge construction for Continues */ - public boolean isUnguardedInChoice() - //public boolean isUnguardedInChoice(RecVar rv) - { - return - ////!this.entry.equals(this.root) && // Hacky? for protocols that start with unguarded choice-rec, e.g. choice at A { rec X { ... at root - //!this.pred.isEmpty() && // This and above fixed by initialising non-null pred/prev? - this.pred.peek() == null; - } - + // Choice-unguarded continues -- fixed in finalise pass // Now currently used for all continues, cf. LContinue::buildGraph public void addContinueEdge(EState s, RecVar rv) @@ -329,65 +270,11 @@ public void addContinueEdge(EState s, RecVar rv) //addEdge(s, new IntermediateContinueEdge(rv), entry); // **FIXME: broken on purpose for testing } - // Doesn't set predecessor, cf. addEdge (and cf. addEdgeAux) - // Choice-guarded continues (can be done in one pass) - public void addRecursionEdge(EState s, EAction a, EState succ) // Cf. LGraphBuilder.addContinueEdge, for choice-unguarded cases -- addRecursionEdge, for guarded cases, should also be in LGraphBuilder, but here for convenience (private state) - { - addEdgeAux(s, a, succ); - - // Still needed here? - //for (Deque> ens : this.enacting.values()) - for (Deque> ens : this.enacting.values()) - { - if (!ens.isEmpty()) - { - //Set tmp = ens.peek(); - List tmp = ens.peek(); - if (tmp.isEmpty()) - { - tmp.add(a); - } - } - } - } - // Cf. add ContinueEdge public void addRecursionEdge(EState s, EAction a, RecVar rv) { - if (this.recvars.containsKey(rv)) - { - EState entry = getRecursionEntry(rv); - addEdge(s, a, entry); - } - else // FIXME: should now be obsolete - { - addEdgeAux(s, new IntermediateRecEdge(this.ef, a, rv), - newState(Stream.of(rv).collect(Collectors.toSet()))); - } - } - - // succ assumed to be this.getEntry() - public void removeEdgeFromPredecessor(EState s, EAction a) - throws ScribException - // Removing prev edge, to be replaced by addRecursionEdge - { - //s.removeEdge(a, this.getEntry()); - removeEdgeAux(s, a, this.getEntry()); - //this.pred.peek().remove(s); // Need to update both preds and prevs accordingly (consider non-det) - Iterator preds = this.pred.peek().iterator(); - Iterator prevs = this.prev.peek().iterator(); - while (preds.hasNext()) - { - EState nexts = preds.next(); - EAction nexta = prevs.next(); - if (nexts.equals(s) && nexta.equals(a)) - { - preds.remove(); - prevs.remove(); - return; - } - } - throw new RuntimeException("Shouldn't get in here: " + s + ", " + a); + EState entry = getRecursionEntry(rv); + addEdge(s, a, entry); } // CHECKME handle preds/prevs like above (cf. this.addEdge) @@ -396,39 +283,24 @@ public void removeEdge(EState s, EAction a, EState succ) { removeEdgeAux(s, a, succ); } - - public List getPredecessors() - { - //return this.pred.peek(); - return new LinkedList<>(this.pred.peek()); // Cf. removeEdgeFromPredecessor - } - - public List getPreviousActions() - { - //return this.prev.peek(); - return new LinkedList<>(this.prev.peek()); - } public EState getRecursionEntry(RecVar recvar) { return this.recvars.get(recvar).peek(); } - // Returns List, cf. getAllSucessors/Actions - public List getAllPredecessors(EState s) + // Returns List, cf. getSuccessors/Actions (vs. GetDet...) + public List getPredecessors(EState s) { return this.states.stream().filter(x -> x.getSuccs().contains(s)) .collect(Collectors.toList()); } - /* * Finalise graph by treating IntermediateContinueEdges */ public EGraph finalise() { - /*EState res = new EState(this.entry.getLabels()); - EState resTerm = new EState(this.exit.getLabels());*/ EState entry = this.entry.cloneNode(this.ef, this.entry.getLabels()); //this.ef.newEState(this.entry.getLabels()); EState exit = this.exit.cloneNode(this.ef, this.exit.getLabels()); //this.ef.newEState(this.exit.getLabels()); @@ -468,32 +340,23 @@ protected void fixContinueEdges(Set seen, Map clones, EState origSucc = ss.next(); EState cloneSucc = getClone(clones, origSucc); - if (!(a instanceof IntermediateContinueEdge) && !(a instanceof IntermediateRecEdge)) + if (!(a instanceof IntermediateContinueEdge)) { addEdgeAux(clone, a, cloneSucc); fixContinueEdges(seen, clones, origSucc, cloneSucc); } - else if (a instanceof IntermediateRecEdge) - { - // TODO FIXME: won't handle deeper nesting of int-rev-edges -- need to keep int-rec-edge if succ is from futher out than parent level - // So need to record recvars as a stack of Maps - - addEdgeAux(clone, ((IntermediateRecEdge) a).action, - this.outerRecvars.get(origSucc.getLabels().iterator().next())); - // N.B. no recursive call, i.e., don't follow intermediate rec edge successors - } else { - IntermediateContinueEdge ice = (IntermediateContinueEdge) a; + IntermediateContinueEdge ice = (IntermediateContinueEdge) a; // Choice --imed--> recursion entry (origSucc) //for (IOAction e : this.enactingMap.get(succ)) RecVar rv = new RecVar(ice.mid.toString()); for (EAction e : this.enactingMap.get(origSucc).get(rv)) { for (EState n : origSucc.getSuccs(e)) { - cloneSucc = getClone(clones, n); - addEdgeAux(clone, e, cloneSucc); + cloneSucc = getClone(clones, n); // cloneSucc is a successor of origSucc + addEdgeAux(clone, e, cloneSucc); // Choice --enacting--> cloneSucc, i.e., succ(rec-entry, enacting) fixContinueEdges(seen, clones, origSucc, cloneSucc); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 4b1cc993c..4a18cb9d2 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -78,50 +78,17 @@ public SType visitChoice(Choice n) { List elems = block.getElements(); LType first = elems.get(0); - if (first instanceof LRecursion) // CHECKME: do this here? refactor into builderutil? + if (first instanceof LContinue) { - EState entry = util.getEntry(); - EState exit = util.getExit(); - - EState nestedEntry = util.newState(Collections.emptySet()); - util.setEntry(nestedEntry); - if (elems.size() == 1) - { - first.visitWithNoThrow(this); - } - else - { - // Reuse existing b, to directly add continue-edges back to the "outer" graph - EState nestedExit = util.newState(Collections.emptySet()); - util.setExit(nestedExit); - first.visitWithNoThrow(this); - - util.setEntry(nestedExit); // Must be non null - util.setExit(exit); - LSeq tail = new LSeq(null, elems.subList(1, elems.size())); - tail.visitWithNoThrow(this); - } - EState init = nestedEntry; - for (EAction a : (Iterable) - init.getActions().stream().distinct()::iterator) - // Enabling actions - { - for (EState s : init.getSuccs(a)) - { - util.addEdge(entry, a, s); - } - } - - util.setEntry(entry); - util.setExit(exit); - } - else if (first instanceof LContinue) - { - // Cannot treat choice-unguarded-continue in "a single pass" because may not have built all recursion enacting edges yet + // Cannot treat choice-unguarded-continue in "a single pass", because may not have built all recursion enacting edges yet // (Single-pass building would be sensitive to order of choice block visiting) LContinue cont = (LContinue) first; // First and only element util.addContinueEdge(util.getEntry(), cont.recvar); } + else if (first instanceof LRecursion) // CHECKME: do this here? refactor into builderutil? + { + buildUnguardedRecursion(util, elems, first); + } else { util.pushChoiceBlock(); // CHECKME: still needed? LContinue doesn't check isUnguardedInChoice any more @@ -133,13 +100,53 @@ else if (first instanceof LContinue) return n; } + private void buildUnguardedRecursion(EGraphBuilderUtil util, + List elems, LType first) + { + EState entry = util.getEntry(); + EState exit = util.getExit(); + + EState nestedEntry = util.newState(Collections.emptySet()); + util.setEntry(nestedEntry); + if (elems.size() == 1) + { + first.visitWithNoThrow(this); + } + else + { + // Reuse existing b, to directly add continue-edges back to the "outer" graph + EState nestedExit = util.newState(Collections.emptySet()); + util.setExit(nestedExit); + first.visitWithNoThrow(this); + + util.setEntry(nestedExit); // Must be non null + util.setExit(exit); + LSeq tail = new LSeq(null, elems.subList(1, elems.size())); + tail.visitWithNoThrow(this); + } + + EState init = nestedEntry; + for (EAction a : (Iterable) + init.getActions().stream().distinct()::iterator) + // Enabling actions + { + for (EState s : init.getSuccs(a)) + { + util.addEdge(entry, a, s); + } + } + + util.setEntry(entry); + util.setExit(exit); + } + @Override public SType visitContinue(Continue n) { // CHECKME: identical edges, i.e. same pred/prev/succ (e.g. rec X { choice at A { A->B:1 } or { A->B:1 } continue X; }) // Choice-guarded continue -- choice-unguarded continue detected and handled in LChoice EState curr = this.util.getEntry(); - for (EState pred : this.util.getAllPredecessors(curr)) // Does getAllSuccessors + for (EState pred : this.util.getPredecessors(curr)) // Does getAllSuccessors { for (EAction a : new LinkedList<>(pred.getActions())) { From 11a3886bb855b1da3e302f46bd1d12def6737731 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 19 Apr 2019 22:18:42 +0100 Subject: [PATCH 334/539] [AllTest] Continued: refactoring graph building. --- .../model/endpoint/EGraphBuilderUtil.java | 92 +++++++++++-------- 1 file changed, 54 insertions(+), 38 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index 3f945a13d..044da51fd 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -31,7 +31,7 @@ import org.scribble.core.type.name.RecVar; import org.scribble.util.ScribException; - // N.B. init must be called before every "new visit", including first -- no: now init implicit on construction, and finalise also does init +// N.B. init must be called before every "new visit", including first -- no: now init implicit on construction, and finalise also does init // (E)GraphBuilderUtil usage contract (2): all states must be made via newState // FIXME TODO replace EGraphBuilderUtil // Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) @@ -41,7 +41,8 @@ public class EGraphBuilderUtil { public final ModelFactory ef; // N.B. new states should be made by this.newState, not this.ef.newEState - private final Map> recvars = new HashMap<>(); // CHECKME: Deque is for shadowing? + // Entry state for each recursion + private final Map> recEntries = new HashMap<>(); // CHECKME: Deque is for shadowing? // First action(s) inside a rec scope ("enacting" means how to enact an unguarded choice-continue) // These are collected by: @@ -52,12 +53,15 @@ public class EGraphBuilderUtil // -- On block entry, push another new list for *all* recvars for recording the current block // -- (Record, via addEdge, the first action of the current block for all open recvars) // -- On block exit, pop the block list into the parent choice list for *all* recvars - // -- On choice exit, pop the choice list into the parent (recursion/choice-block) list for all *open* recvars, i.e., if the parent list is *still empty* - // -- On recursion exit, just pop the list - private final Map>> enacting = new HashMap<>(); + // - On choice exit, pop the choice list into the parent (recursion/choice-block) list for all *open* recvars, i.e., if the parent list is *still empty* + // - On recursion exit, pop the list into the enacting map for the recEntries state for that recvar (n.b. enacting for a state is the same for its recvars) + private final Map>> working = new HashMap<>(); - //private final Map>> enactingMap = new HashMap<>(); // Record enacting per-recvar, since a state could have multi-recvars - private final Map>> enactingMap = new HashMap<>(); + // Record enacting per-recvar, since a state could have multi-recvars -- CHECKME: caters for shadowing? (cf. recording only per unique recvar) + // CHECKME: for a given state, the enacting list is the same for each recvar? + //private final Map>> enacting + private final Map> enacting + = new HashMap<>(); public EGraphBuilderUtil(ModelFactory ef) { @@ -92,10 +96,10 @@ public void init(EState init) // FIXME: init not used (but inherited from super protected void clear() { - this.recvars.clear(); - this.enacting.clear(); + this.recEntries.clear(); + this.working.clear(); - this.enactingMap.clear(); + this.enacting.clear(); this.states.clear(); } @@ -121,7 +125,7 @@ public void addEdge(EState s, EAction a, EState succ) addEdgeAux(s, a, succ); //for (Deque> ens : this.enacting.values()) - for (Deque> ens : this.enacting.values()) + for (Deque> ens : this.working.values()) { if (!ens.isEmpty()) // Unnecessary? { @@ -141,10 +145,10 @@ public void addEdge(EState s, EAction a, EState succ) */ public void enterChoice() { - for (RecVar rv : this.enacting.keySet()) + for (RecVar rv : this.working.keySet()) { ////Deque> tmp = this.enacting.get(rv); - Deque> tmp = this.enacting.get(rv); + Deque> tmp = this.working.get(rv); ////tmp.push(new HashSet<>(tmp.peek())); //tmp.push(new HashSet<>()); // Initially empty to record nested enablings in choice blocks tmp.push(new LinkedList<>()); // Initially empty to record nested enablings in choice blocks @@ -153,10 +157,10 @@ public void enterChoice() public void leaveChoice() { - for (RecVar rv : this.enacting.keySet()) + for (RecVar rv : this.working.keySet()) { - List pop = this.enacting.get(rv).pop(); - List peek = this.enacting.get(rv).peek(); + List pop = this.working.get(rv).pop(); + List peek = this.working.get(rv).peek(); if (peek.isEmpty()) // Cf. addEdge { peek.addAll(pop); @@ -166,10 +170,10 @@ public void leaveChoice() public void pushChoiceBlock() { - for (RecVar rv : this.enacting.keySet()) + for (RecVar rv : this.working.keySet()) { //Deque> tmp = this.enacting.get(rv); - Deque> tmp = this.enacting.get(rv); + Deque> tmp = this.working.get(rv); //tmp.push(new HashSet<>()); // Must be empty for addEdge to record (nested) enabling tmp.push(new LinkedList<>()); } @@ -177,12 +181,12 @@ public void pushChoiceBlock() public void popChoiceBlock() { - for (RecVar rv : this.enacting.keySet()) + for (RecVar rv : this.working.keySet()) { /*Set pop = this.enacting.get(rv).pop(); Set peek = this.enacting.get(rv).peek();*/ - List pop = this.enacting.get(rv).pop(); - List peek = this.enacting.get(rv).peek(); + List pop = this.working.get(rv).pop(); + List peek = this.working.get(rv).peek(); //if (peek.isEmpty()) { peek.addAll(pop); @@ -201,11 +205,11 @@ public void pushRecursionEntry(RecVar rv, EState entry) this.entry.addLabel(recvar); }*/ //this.recvars.put(recvar, this.entry); - Deque tmp = this.recvars.get(rv); + Deque tmp = this.recEntries.get(rv); if (tmp == null) { tmp = new LinkedList<>(); - this.recvars.put(rv, tmp); + this.recEntries.put(rv, tmp); } /*if (isUnguardedInChoice()) { @@ -218,11 +222,13 @@ public void pushRecursionEntry(RecVar rv, EState entry) tmp.push(entry); //Deque> tmp2 = this.enacting.get(recvar); - Deque> tmp2 = this.enacting.get(rv); + Deque> tmp2 = this.working.get(rv); + // Collecting per recvar: unnecessary as all recvars for a given state are equivalent (i.e., have the same enacting) -- so could just do per rec entry state + // But easier to do per recvar, to avoid distinguishing between recvars in nested contexts if (tmp2 == null) { tmp2 = new LinkedList<>(); // New Stack for this recvar - this.enacting.put(rv, tmp2); + this.working.put(rv, tmp2); } //tmp2.push(new HashSet<>()); // Push new Set element onto stack tmp2.push(new LinkedList<>()); // Push new Set element onto stack @@ -230,13 +236,13 @@ public void pushRecursionEntry(RecVar rv, EState entry) public void popRecursionEntry(RecVar rv) { - this.recvars.get(rv).pop(); // Pop the entry of this rec + this.recEntries.get(rv).pop(); // Pop the entry of this rec //Set pop = this.enacting.get(recvar).pop(); - List pop = this.enacting.get(rv).pop(); - if (this.enacting.get(rv).isEmpty()) // All Lists popped from the stack of this recvar -- could just clear instead + List pop = this.working.get(rv).pop(); + if (this.working.get(rv).isEmpty()) // All Lists popped from the stack of this recvar -- could just clear instead { - this.enacting.remove(rv); + this.working.remove(rv); } EState curr = getEntry(); @@ -244,14 +250,23 @@ public void popRecursionEntry(RecVar rv) // Because contract for GraphBuilderUtil is entry on leaving a node is the same as on entry, cf., EGraphBuilder.visitSeq restores original entry on leaving // (And visitRecursion just does visitSeq for the recursion body, with the current entry/exit) - //Map> tmp = this.enactingMap.get(curr); - Map> tmp = this.enactingMap.get(curr); + /*Map> tmp = this.enacting.get(curr); if (tmp == null) { tmp = new HashMap<>(); - this.enactingMap.put(curr, tmp); + this.enacting.put(curr, tmp); + } + tmp.put(rv, pop);*/ + if (!this.enacting.containsKey(curr)) + // For a given state, the enacting for all associated recvars is the same (the recvars are "equivalent) -- so only need to record per state + { + this.enacting.put(curr, pop); + } + else if (!this.enacting.get(curr).equals(pop)) // TODO: deprecate, temporary testing + { + throw new RuntimeException("Shouldn't get in here: " + curr + " ,, " + + this.enacting.get(curr) + " ,, " + rv + " ,, " + pop); } - tmp.put(rv, pop); } @@ -286,7 +301,7 @@ public void removeEdge(EState s, EAction a, EState succ) public EState getRecursionEntry(RecVar recvar) { - return this.recvars.get(recvar).peek(); + return this.recEntries.get(recvar).peek(); } // Returns List, cf. getSuccessors/Actions (vs. GetDet...) @@ -348,10 +363,11 @@ protected void fixContinueEdges(Set seen, Map clones, } else { - IntermediateContinueEdge ice = (IntermediateContinueEdge) a; // Choice --imed--> recursion entry (origSucc) - //for (IOAction e : this.enactingMap.get(succ)) - RecVar rv = new RecVar(ice.mid.toString()); - for (EAction e : this.enactingMap.get(origSucc).get(rv)) + //IntermediateContinueEdge ice = (IntermediateContinueEdge) a; // Choice --imed--> recursion entry (origSucc) + ////for (IOAction e : this.enactingMap.get(succ)) + //RecVar rv = new RecVar(ice.mid.toString()); + //for (EAction e : this.enacting.get(origSucc).get(rv)) + for (EAction e : this.enacting.get(origSucc)) { for (EState n : origSucc.getSuccs(e)) { From 85a6eae48ba3d2dfe58aadb478019bb125ceb1de Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 19 Apr 2019 22:58:32 +0100 Subject: [PATCH 335/539] [AllTest] Continued: refactoring graph building. --- .../model/endpoint/EGraphBuilderUtil.java | 85 +++++++++++-------- scribble-test/src/test/scrib/tmp/Test.scr | 22 ++++- 2 files changed, 71 insertions(+), 36 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index 044da51fd..8891f1b98 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -55,7 +55,7 @@ public class EGraphBuilderUtil // -- On block exit, pop the block list into the parent choice list for *all* recvars // - On choice exit, pop the choice list into the parent (recursion/choice-block) list for all *open* recvars, i.e., if the parent list is *still empty* // - On recursion exit, pop the list into the enacting map for the recEntries state for that recvar (n.b. enacting for a state is the same for its recvars) - private final Map>> working = new HashMap<>(); + private final Map>> collecting = new HashMap<>(); // Record enacting per-recvar, since a state could have multi-recvars -- CHECKME: caters for shadowing? (cf. recording only per unique recvar) // CHECKME: for a given state, the enacting list is the same for each recvar? @@ -97,7 +97,7 @@ public void init(EState init) // FIXME: init not used (but inherited from super protected void clear() { this.recEntries.clear(); - this.working.clear(); + this.collecting.clear(); this.enacting.clear(); @@ -125,7 +125,7 @@ public void addEdge(EState s, EAction a, EState succ) addEdgeAux(s, a, succ); //for (Deque> ens : this.enacting.values()) - for (Deque> ens : this.working.values()) + for (Deque> ens : this.collecting.values()) { if (!ens.isEmpty()) // Unnecessary? { @@ -145,10 +145,10 @@ public void addEdge(EState s, EAction a, EState succ) */ public void enterChoice() { - for (RecVar rv : this.working.keySet()) + for (EState entry : this.collecting.keySet()) { ////Deque> tmp = this.enacting.get(rv); - Deque> tmp = this.working.get(rv); + Deque> tmp = this.collecting.get(entry); ////tmp.push(new HashSet<>(tmp.peek())); //tmp.push(new HashSet<>()); // Initially empty to record nested enablings in choice blocks tmp.push(new LinkedList<>()); // Initially empty to record nested enablings in choice blocks @@ -157,10 +157,10 @@ public void enterChoice() public void leaveChoice() { - for (RecVar rv : this.working.keySet()) + for (EState entry : this.collecting.keySet()) { - List pop = this.working.get(rv).pop(); - List peek = this.working.get(rv).peek(); + List pop = this.collecting.get(entry).pop(); + List peek = this.collecting.get(entry).peek(); if (peek.isEmpty()) // Cf. addEdge { peek.addAll(pop); @@ -170,10 +170,10 @@ public void leaveChoice() public void pushChoiceBlock() { - for (RecVar rv : this.working.keySet()) + for (EState entry : this.collecting.keySet()) { //Deque> tmp = this.enacting.get(rv); - Deque> tmp = this.working.get(rv); + Deque> tmp = this.collecting.get(entry); //tmp.push(new HashSet<>()); // Must be empty for addEdge to record (nested) enabling tmp.push(new LinkedList<>()); } @@ -181,12 +181,12 @@ public void pushChoiceBlock() public void popChoiceBlock() { - for (RecVar rv : this.working.keySet()) + for (EState entry : this.collecting.keySet()) { /*Set pop = this.enacting.get(rv).pop(); Set peek = this.enacting.get(rv).peek();*/ - List pop = this.working.get(rv).pop(); - List peek = this.working.get(rv).peek(); + List pop = this.collecting.get(entry).pop(); + List peek = this.collecting.get(entry).peek(); //if (peek.isEmpty()) { peek.addAll(pop); @@ -205,7 +205,7 @@ public void pushRecursionEntry(RecVar rv, EState entry) this.entry.addLabel(recvar); }*/ //this.recvars.put(recvar, this.entry); - Deque tmp = this.recEntries.get(rv); + Deque tmp = this.recEntries.get(rv); // Should be same as getEntry() if (tmp == null) { tmp = new LinkedList<>(); @@ -221,34 +221,49 @@ public void pushRecursionEntry(RecVar rv, EState entry) }*/ tmp.push(entry); - //Deque> tmp2 = this.enacting.get(recvar); - Deque> tmp2 = this.working.get(rv); - // Collecting per recvar: unnecessary as all recvars for a given state are equivalent (i.e., have the same enacting) -- so could just do per rec entry state - // But easier to do per recvar, to avoid distinguishing between recvars in nested contexts - if (tmp2 == null) + if (this.collecting.containsKey(entry)) { - tmp2 = new LinkedList<>(); // New Stack for this recvar - this.working.put(rv, tmp2); + return; } + /////Deque> tmp2 = this.enacting.get(recvar); + //Deque> tmp2 = this.collecting.get(entry); + // Collecting per recvar: unnecessary as all recvars for a given state are equivalent (i.e., have the same enacting) -- so could just do per rec entry state + // But easier to do per recvar, to avoid distinguishing between recvars in nested contexts + //if (tmp2 == null) + //{ + Deque> tmp2 = new LinkedList<>(); // New Stack for this recvar + this.collecting.put(entry, tmp2); + //} //tmp2.push(new HashSet<>()); // Push new Set element onto stack tmp2.push(new LinkedList<>()); // Push new Set element onto stack } public void popRecursionEntry(RecVar rv) { - this.recEntries.get(rv).pop(); // Pop the entry of this rec + EState entry = this.recEntries.get(rv).pop(); // Pop the entry of this rec + // Same as getEntry() + // Because contract for GraphBuilderUtil is entry on leaving a node is the same as on entry, cf., EGraphBuilder.visitSeq restores original entry on leaving + // (And visitRecursion just does visitSeq for the recursion body, with the current entry/exit) + if (!getEntry().equals(entry)) // TODO: deprecate, temporary testing + { + throw new RuntimeException("Shouldn't get here: "); + } + + if (!this.collecting.containsKey(entry)) + { + // This state already done -- i.e., already popped another recvar for this same state, e.g., good.efsm.gcontinue.choiceunguarded.Test05b + return; + } //Set pop = this.enacting.get(recvar).pop(); - List pop = this.working.get(rv).pop(); - if (this.working.get(rv).isEmpty()) // All Lists popped from the stack of this recvar -- could just clear instead + List pop = this.collecting.get(entry).pop(); + if (this.collecting.get(entry).isEmpty()) // All Lists popped from the stack of this recvar -- could just clear instead { - this.working.remove(rv); + this.collecting.remove(entry); + // N.B. we pushed on entry of *outermost rec*, but above popped on exit of *innermost* rec (due to checking entry in this.collecting) + // This remove is necessary to prevent above containsKey check also succeeding when leaving the outer rec, e.g., good.efsm.gcontinue.choiceunguarded.Test05b + // Also necessary to prevent continued updating of this.collecting after leaving a rec (because this.collecting still has entry), e.g., good.efsm.gchoice.Test10 } - - EState curr = getEntry(); - // Same as getRecursionEntry(rv) - // Because contract for GraphBuilderUtil is entry on leaving a node is the same as on entry, cf., EGraphBuilder.visitSeq restores original entry on leaving - // (And visitRecursion just does visitSeq for the recursion body, with the current entry/exit) /*Map> tmp = this.enacting.get(curr); if (tmp == null) @@ -257,15 +272,15 @@ public void popRecursionEntry(RecVar rv) this.enacting.put(curr, tmp); } tmp.put(rv, pop);*/ - if (!this.enacting.containsKey(curr)) + if (!this.enacting.containsKey(entry)) // For a given state, the enacting for all associated recvars is the same (the recvars are "equivalent) -- so only need to record per state { - this.enacting.put(curr, pop); + this.enacting.put(entry, pop); } - else if (!this.enacting.get(curr).equals(pop)) // TODO: deprecate, temporary testing + else if (!this.enacting.get(entry).equals(pop)) // TODO: deprecate, temporary testing { - throw new RuntimeException("Shouldn't get in here: " + curr + " ,, " - + this.enacting.get(curr) + " ,, " + rv + " ,, " + pop); + throw new RuntimeException("Shouldn't get in here: " + entry + " ,, " + + this.enacting.get(entry) + " ,, " + rv + " ,, " + pop); } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 0fbc59180..78a21cc95 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -109,7 +109,27 @@ module tmp.Test; data "..." from "..." as T; -//* +global protocol Proto1(role A, role B) +{ + rec X + { + choice at A + { + 1() from A to B; + continue X; + } + or + { + 3() from A to B; + } + } + choice at B + { + 2() from B to A; + } +} + +/* global protocol Proto1(role A, role B, role C) { rec X From 16cc18b2a5bcf57ca7ea7b2efc7ff16741be6a32 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 19 Apr 2019 23:59:42 +0100 Subject: [PATCH 336/539] [AllTest] Continued: refactoring graph building. --- .../main/java/org/scribble/core/job/Core.java | 3 +- .../scribble/core/model/GraphBuilderUtil.java | 13 ++- .../core/model/endpoint/AutGraphParser.java | 4 +- .../model/endpoint/EGraphBuilderUtil.java | 69 +++++++--------- .../model/endpoint/IntermediateRecEdge.java | 81 ------------------- .../core/model/global/SGraphBuilderUtil.java | 13 +-- .../core/visit/local/EGraphBuilder.java | 12 +-- 7 files changed, 55 insertions(+), 140 deletions(-) delete mode 100644 scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateRecEdge.java diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index ab1970c8c..870d5a233 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -49,7 +49,8 @@ public class Core public final CoreConfig config; // Immutable private final CoreContext context; // Mutable (Visitor passes replace modules) - private final SGraphBuilderUtil sgraphb; + + private final SGraphBuilderUtil sgraphb; // FIXME: refactor? public Core(ModuleName mainFullname, Map args, //Map modcs, diff --git a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java index 38646c6e7..4139d02e8 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java @@ -13,6 +13,9 @@ */ package org.scribble.core.model; +import java.util.Collections; +import java.util.Set; + import org.scribble.core.type.kind.ProtoKind; import org.scribble.util.ScribException; @@ -25,21 +28,23 @@ public abstract class GraphBuilderUtil S extends MState, // State type K extends ProtoKind> // Global/local actions/states -- Need to quantify K explicitly { + public final ModelFactory mf; // N.B. new states should be made by this.newState, not this.ef.newEState + protected S entry; // GraphBuilderUtil usage contract: entry on leaving a node is the same as on entering -- cf., EGraphBuilderUtil.visitSeq restores the original entry on leaving protected S exit; // Tracking exit is convenient for merges (otherwise have to generate dummy merge nodes) - protected GraphBuilderUtil() + protected GraphBuilderUtil(ModelFactory mf) { - + this.mf = mf; } - //public abstract S newState(Set labs); + //public abstract S newState(L labs); // Can't factor out with SState, doesn't use L and takes SConfig // N.B. must be called before every "new visit", including first // Separated from constructor in order to use newState public abstract void init(S init); - protected void reset(S entry, S exit) // Should be used by init + protected void reset(S entry, S exit) { this.entry = entry;//newState(Collections.emptySet()); this.exit = exit;//newState(Collections.emptySet()); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java index 53577cbf0..fd3f70032 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java @@ -131,7 +131,7 @@ public EGraph parse(String aut) { if (i != init && i != term) { - map.put(i, util.ef.newEState(Collections.emptySet())); + map.put(i, util.mf.newEState(Collections.emptySet())); } } //for (int i : succs) @@ -139,7 +139,7 @@ public EGraph parse(String aut) { if (!map.containsKey(i) && i != init && i != term) { - map.put(i, util.ef.newEState(Collections.emptySet())); + map.put(i, util.mf.newEState(Collections.emptySet())); } } //for (int i : edges.keySet()) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index 8891f1b98..b92a03ff8 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -33,60 +33,45 @@ // N.B. init must be called before every "new visit", including first -- no: now init implicit on construction, and finalise also does init // (E)GraphBuilderUtil usage contract (2): all states must be made via newState -// FIXME TODO replace EGraphBuilderUtil // Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) // Tailored to support graph building from syntactic local protocol choice and recursion public class EGraphBuilderUtil extends GraphBuilderUtil { - public final ModelFactory ef; // N.B. new states should be made by this.newState, not this.ef.newEState + //public final ModelFactory mf; // N.B. new states should be made by this.newState, not this.ef.newEState // Entry state for each recursion private final Map> recEntries = new HashMap<>(); // CHECKME: Deque is for shadowing? + // Record enacting per-recvar, since a state could have multi-recvars -- CHECKME: caters for shadowing? (cf. recording only per unique recvar) + // CHECKME: for a given state, the enacting list is the same for each recvar? + private final Map> enacting = new HashMap<>(); + + // Temporary storage of enacting while collecting in progress // First action(s) inside a rec scope ("enacting" means how to enact an unguarded choice-continue) // These are collected by: - // - On each recursion entry, push a new list for that recvar -- list pushing/popping mainly for handling choices (see below) - // - General idea: via addEdge, record the first action encountered for all "*open*" recvars, i.e., add the action to all current lists that are *still empty* + // - On each recursion entry, push a new list for its entry state -- list pushing/popping mainly for handling choices (see below) + // - (N.B. only need to do per state, not per rec(var) -- all recvars of a given state equivalently identify that state) + // - General idea: via addEdge, record the first action encountered for all "*open*" rec states, i.e., add the action to all current lists that are *still empty* // - For choice: - // -- On choice entry, first push a new list for *all* recvars for recording the choice cases (all, including "non-open", because inconvenient to distinguish open/non-open from nested contexts) - // -- On block entry, push another new list for *all* recvars for recording the current block - // -- (Record, via addEdge, the first action of the current block for all open recvars) - // -- On block exit, pop the block list into the parent choice list for *all* recvars - // - On choice exit, pop the choice list into the parent (recursion/choice-block) list for all *open* recvars, i.e., if the parent list is *still empty* - // - On recursion exit, pop the list into the enacting map for the recEntries state for that recvar (n.b. enacting for a state is the same for its recvars) + // -- On choice entry, first push a new list for *all* rec states for recording the choice cases (all, including "non-open", because inconvenient to distinguish open/non-open from nested contexts) + // -- On block entry, push another new list for *all* rec states for recording the current block + // -- (Record, via addEdge, the first action of the current block for all open rec states) + // -- On block exit, pop the block list into the parent choice list for *all* rec states + // - On choice exit, pop the choice list into the parent (recursion/choice-block) list for all *open* rec states, i.e., if the parent list is *still empty* + // - On recursion exit, pop the list into the enacting map for the rec entry state private final Map>> collecting = new HashMap<>(); - // Record enacting per-recvar, since a state could have multi-recvars -- CHECKME: caters for shadowing? (cf. recording only per unique recvar) - // CHECKME: for a given state, the enacting list is the same for each recvar? - //private final Map>> enacting - private final Map> enacting - = new HashMap<>(); - - public EGraphBuilderUtil(ModelFactory ef) + public EGraphBuilderUtil(ModelFactory mf) { - this.ef = ef; - ////clear(); - //reset(); + //this.mf = mf; + super(mf); init(null); } - - /*// FIXME: cannot be reused for different protos, because of recvars and clear/reset - // CHECKME: refactor as factory method? (e.g., push?) - public EGraphBuilderUtil2(EGraphBuilderUtil2 b) - { - this.ef = b.ef; - init(null); // FIXME: init param not used - b.outerRecvars.entrySet().forEach(x -> - this.outerRecvars.put(x.getKey(), x.getValue())); - b.recvars.entrySet().forEach(x -> - this.outerRecvars.put(x.getKey(), x.getValue().peek())); - }*/ // N.B. must be called before every "new visit", including first - // FIXME: now cannot be reused for different protos, because of recvars and clear/reset - @Override - public void init(EState init) // FIXME: init not used (but inherited from super) + public void init(EState init) + // FIXME: init not used (but inherited from super) { clear(); /*reset(this.ef.newEState(Collections.emptySet()), @@ -113,7 +98,7 @@ protected void clear() public EState newState(Set labs) { //return new EState(labs); - EState s = this.ef.newEState(labs); + EState s = this.mf.newEState(labs); this.states.add(s); return s; } @@ -248,6 +233,10 @@ public void popRecursionEntry(RecVar rv) { throw new RuntimeException("Shouldn't get here: "); } + if (this.recEntries.get(rv).isEmpty()) + { + this.recEntries.remove(rv); + } if (!this.collecting.containsKey(entry)) { @@ -296,7 +285,7 @@ public void addContinueEdge(EState s, RecVar rv) /*this.contStates.add(s); this.contRecVars.add(rv);*/ EState entry = getRecursionEntry(rv); - addEdgeAux(s, new IntermediateContinueEdge(this.ef, rv), entry); + addEdgeAux(s, new IntermediateContinueEdge(this.mf, rv), entry); //addEdge(s, new IntermediateContinueEdge(rv), entry); // **FIXME: broken on purpose for testing } @@ -331,8 +320,8 @@ public List getPredecessors(EState s) */ public EGraph finalise() { - EState entry = this.entry.cloneNode(this.ef, this.entry.getLabels()); //this.ef.newEState(this.entry.getLabels()); - EState exit = this.exit.cloneNode(this.ef, this.exit.getLabels()); //this.ef.newEState(this.exit.getLabels()); + EState entry = this.entry.cloneNode(this.mf, this.entry.getLabels()); //this.ef.newEState(this.entry.getLabels()); + EState exit = this.exit.cloneNode(this.mf, this.exit.getLabels()); //this.ef.newEState(this.exit.getLabels()); Map map = new HashMap<>(); map.put(this.entry, entry); @@ -406,7 +395,7 @@ private EState getClone(Map clones, EState orig) else { //next = this.ef.newEState(succ.getLabels()); - res = orig.cloneNode(this.ef, orig.getLabels()); + res = orig.cloneNode(this.mf, orig.getLabels()); clones.put(orig, res); } return res; diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateRecEdge.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateRecEdge.java deleted file mode 100644 index dcbd6132d..000000000 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateRecEdge.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.core.model.endpoint; - -import org.scribble.core.model.ModelFactory; -import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.model.global.actions.SAction; -import org.scribble.core.type.name.Op; -import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Payload; - -// FIXME rename better (it's an "external rec" continue edge) -@Deprecated -class IntermediateRecEdge extends EAction -{ - public final EAction action; - - public IntermediateRecEdge(ModelFactory ef, EAction a, RecVar rv) - { - super(ef, Role.EMPTY_ROLE, new Op(rv.toString()), Payload.EMPTY_PAYLOAD); // HACK - this.action = a; - } - - @Override - public EAction toDual(Role self) - { - throw new RuntimeException("Shouldn't get in here: " + this); - } - - @Override - public SAction toGlobal(Role self) - { - throw new RuntimeException("Shouldn't get in here: " + this); - } - - @Override - protected String getCommSymbol() - { - return "&"; - } - - @Override - public int hashCode() - { - int hash = 6037; - hash = 31 * hash + super.hashCode(); - return hash; - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof IntermediateRecEdge)) - { - return false; - } - return ((IntermediateRecEdge) o).canEquals(this) && super.equals(o); - } - - @Override - public boolean canEquals(Object o) - { - return o instanceof IntermediateRecEdge; - } -} diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index cb8a940b3..df86d8483 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -38,13 +38,14 @@ public class SGraphBuilderUtil extends GraphBuilderUtil { - public final ModelFactory sf; + //public final ModelFactory mf; - public SGraphBuilderUtil(ModelFactory sf) + public SGraphBuilderUtil(ModelFactory mf) { - this.sf = sf; + //this.mf = sf; + super(mf); //reset(); - init(sf.newSState(null)); + init(mf.newSState(null)); } // N.B. must be called before every "new visit", including first @@ -52,7 +53,7 @@ public SGraphBuilderUtil(ModelFactory sf) public void init(SState init) { //init(this.sf.newSState(null), this.sf.newSState(null)); // configs - reset(init, this.sf.newSState(null)); + reset(init, this.mf.newSState(null)); } // Do as an initial state rather than config? @@ -61,7 +62,7 @@ protected SConfig createInitialSConfig(ModelFactory ef, Map egraph Map efsms = egraphs.entrySet().stream().collect(Collectors.toMap(Entry::getKey, e -> e.getValue().toFsm())); SBuffers b0 = new SBuffers(ef, efsms.keySet(), !explicit); //return job.sf.newSConfig(efsms, b0); - return this.sf.newSConfig(efsms, b0); + return this.mf.newSConfig(efsms, b0); } // Factory method: not fully integrated with SGraph constructor because of Job arg (debug printing) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 4a18cb9d2..95224e1ab 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -61,7 +61,7 @@ public EGraphBuilder(Core core) { this.core = core; this.util = core.config.mf.newEGraphBuilderUtil(); - this.util.init(null); + //this.util.init(null); } public EGraph finalise() @@ -189,11 +189,11 @@ public SType visitDirectedInteraction( ? ((SigLit) n.msg).payload : Payload.EMPTY_PAYLOAD; // TODO: add toAction method to base Interaction - EAction a = (n instanceof LSend) ? this.util.ef.newESend(peer, mid, pay) - : (n instanceof LRecv) ? this.util.ef.newERecv(peer, mid, pay) - : (n instanceof LReq) ? this.util.ef.newEReq(peer, mid, pay) + EAction a = (n instanceof LSend) ? this.util.mf.newESend(peer, mid, pay) + : (n instanceof LRecv) ? this.util.mf.newERecv(peer, mid, pay) + : (n instanceof LReq) ? this.util.mf.newEReq(peer, mid, pay) : //(n instanceof LAcc) ? - this.util.ef.newEAcc(peer, mid, pay); // Action type already checked above + this.util.mf.newEAcc(peer, mid, pay); // Action type already checked above this.util.addEdge(this.util.getEntry(), a, this.util.getExit()); return n; } @@ -202,7 +202,7 @@ public SType visitDirectedInteraction( public SType visitDisconnect(DisconnectAction n) { Role peer = ((LDisconnect) n).getPeer(); // CHECKME - EAction a = this.util.ef.newEDisconnect(peer); // TODO: add toAction method to base Interaction + EAction a = this.util.mf.newEDisconnect(peer); // TODO: add toAction method to base Interaction this.util.addEdge(this.util.getEntry(), a, this.util.getExit()); return n; } From 53bf6a21fb7205776ce2c22f66b0d837c9655d81 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 Apr 2019 00:20:18 +0100 Subject: [PATCH 337/539] [AllTest] Continued: refactoring graph building. --- .../scribble/core/model/GraphBuilderUtil.java | 40 ++--------- .../java/org/scribble/core/model/MState.java | 3 +- .../model/endpoint/EGraphBuilderUtil.java | 69 +++++++++++-------- .../core/model/global/SGraphBuilderUtil.java | 12 ++-- scribble-test/src/test/scrib/tmp/Test.scr | 8 +-- 5 files changed, 58 insertions(+), 74 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java index 4139d02e8..357b03b34 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java @@ -13,9 +13,6 @@ */ package org.scribble.core.model; -import java.util.Collections; -import java.util.Set; - import org.scribble.core.type.kind.ProtoKind; import org.scribble.util.ScribException; @@ -26,12 +23,9 @@ public abstract class GraphBuilderUtil , // Action type: labels on edges S extends MState, // State type - K extends ProtoKind> // Global/local actions/states -- Need to quantify K explicitly + K extends ProtoKind> // Global/local actions/states -- Need to quantify K explicitly { public final ModelFactory mf; // N.B. new states should be made by this.newState, not this.ef.newEState - - protected S entry; // GraphBuilderUtil usage contract: entry on leaving a node is the same as on entering -- cf., EGraphBuilderUtil.visitSeq restores the original entry on leaving - protected S exit; // Tracking exit is convenient for merges (otherwise have to generate dummy merge nodes) protected GraphBuilderUtil(ModelFactory mf) { @@ -42,17 +36,11 @@ protected GraphBuilderUtil(ModelFactory mf) // N.B. must be called before every "new visit", including first // Separated from constructor in order to use newState - public abstract void init(S init); - - protected void reset(S entry, S exit) - { - this.entry = entry;//newState(Collections.emptySet()); - this.exit = exit;//newState(Collections.emptySet()); - } + //public abstract void init(S init); - public void addEntryLabel(L lab) + public void addEntryLabel(S s, L lab) { - this.entry.addLabel(lab); + s.addLabel(lab); } public void addEdge(S s, A a, S succ) @@ -70,24 +58,4 @@ protected void removeEdgeAux(S s, A a, S succ) throws ScribException // Excepti { s.removeEdge(a, succ); } - - public S getEntry() - { - return this.entry; - } - - public void setEntry(S entry) - { - this.entry = entry; - } - - public S getExit() - { - return this.exit; - } - - public void setExit(S exit) - { - this.exit = exit; - } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/MState.java b/scribble-core/src/main/java/org/scribble/core/model/MState.java index 2e62ceb6d..7cd33f142 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MState.java @@ -40,11 +40,12 @@ public abstract class MState public final int id; + // Labels and edges are mutable (via protected methods) protected final Set labs; // Was RecVar and SubprotocolSigs, now using inlined protocol for FSM building so just RecVar protected final List actions; protected final List succs; - public MState(Set labs) // Immutable singleton node + public MState(Set labs) { this.id = MState.count++; this.labs = new HashSet<>(labs); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index b92a03ff8..cf46601da 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -38,7 +38,8 @@ public class EGraphBuilderUtil extends GraphBuilderUtil { - //public final ModelFactory mf; // N.B. new states should be made by this.newState, not this.ef.newEState + // N.B. new states should be made by this.newState, not this.mf.newEState + private final Set states = new HashSet<>(); // Entry state for each recursion private final Map> recEntries = new HashMap<>(); // CHECKME: Deque is for shadowing? @@ -62,42 +63,34 @@ public class EGraphBuilderUtil // - On recursion exit, pop the list into the enacting map for the rec entry state private final Map>> collecting = new HashMap<>(); + protected EState entry; // GraphBuilderUtil usage contract: entry on leaving a node is the same as on entering -- cf., EGraphBuilderUtil.visitSeq restores the original entry on leaving + protected EState exit; // Tracking exit is convenient for merges (otherwise have to generate dummy merge nodes) + public EGraphBuilderUtil(ModelFactory mf) { - //this.mf = mf; super(mf); - init(null); + reset(); } - // N.B. must be called before every "new visit", including first - public void init(EState init) - // FIXME: init not used (but inherited from super) + // N.B. must be called before every "new visit", including first -- called by constructor and finalise + protected void reset() { clear(); - /*reset(this.ef.newEState(Collections.emptySet()), - this.ef.newEState(Collections.emptySet()));*/ - reset(newState(Collections.emptySet()), newState(Collections.emptySet())); + this.entry = newState(Collections.emptySet()); + this.exit = newState(Collections.emptySet()); } - protected void clear() + protected void clear() // CHECKME: redundant? { + this.states.clear(); this.recEntries.clear(); - this.collecting.clear(); - this.enacting.clear(); - - this.states.clear(); + this.collecting.clear(); } - private final Set states = new HashSet<>(); - - // For the util to additionally record states - // CHECKME: make interface less messy w.r.t. this.ef.newEState - // CHECKME: factor up to super? - //@Override + // For the util to additionally record states -- use this, don't use this.mf.newEState public EState newState(Set labs) { - //return new EState(labs); EState s = this.mf.newEState(labs); this.states.add(s); return s; @@ -107,7 +100,7 @@ public EState newState(Set labs) @Override public void addEdge(EState s, EAction a, EState succ) { - addEdgeAux(s, a, succ); + super.addEdge(s, a, succ); //for (Deque> ens : this.enacting.values()) for (Deque> ens : this.collecting.values()) @@ -123,7 +116,6 @@ public void addEdge(EState s, EAction a, EState succ) } } } - /* * Dealing with Choice contexts @@ -179,7 +171,6 @@ public void popChoiceBlock() } } - /* * Dealing with Recursion contexts */ @@ -273,11 +264,9 @@ else if (!this.enacting.get(entry).equals(pop)) // TODO: deprecate, temporary t } } - /* * Edge construction for Continues */ - // Choice-unguarded continues -- fixed in finalise pass // Now currently used for all continues, cf. LContinue::buildGraph public void addContinueEdge(EState s, RecVar rv) @@ -311,6 +300,7 @@ public EState getRecursionEntry(RecVar recvar) // Returns List, cf. getSuccessors/Actions (vs. GetDet...) public List getPredecessors(EState s) { + // TODO: make more efficient return this.states.stream().filter(x -> x.getSuccs().contains(s)) .collect(Collectors.toList()); } @@ -337,7 +327,7 @@ public EGraph finalise() EndpointState dfa = determinise(all, res, resTerm); System.out.println("111: " + dfa.toDot());*/ - init(null); + reset(); return new EGraph(entry, exit); } @@ -400,6 +390,31 @@ private EState getClone(Map clones, EState orig) } return res; } + + public void addEntryLabel(RecVar lab) + { + addEntryLabel(this.entry, lab); + } + + public EState getEntry() + { + return this.entry; + } + + public void setEntry(EState entry) + { + this.entry = entry; + } + + public EState getExit() + { + return this.exit; + } + + public void setExit(EState exit) + { + this.exit = exit; + } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index df86d8483..bc27ee85b 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -44,17 +44,17 @@ public SGraphBuilderUtil(ModelFactory mf) { //this.mf = sf; super(mf); - //reset(); - init(mf.newSState(null)); + ////reset(); + //init(mf.newSState(null)); } - // N.B. must be called before every "new visit", including first - @Override - public void init(SState init) + /*// N.B. must be called before every "new visit", including first + //@Override + protected void init(SState init) { //init(this.sf.newSState(null), this.sf.newSState(null)); // configs reset(init, this.mf.newSState(null)); - } + }*/ // Do as an initial state rather than config? protected SConfig createInitialSConfig(ModelFactory ef, Map egraphs, boolean explicit) // FIXME: ef diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 78a21cc95..fcf47beb6 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -123,10 +123,10 @@ global protocol Proto1(role A, role B) 3() from A to B; } } - choice at B - { - 2() from B to A; - } + choice at B // Testing this.collections remove in EGraphBuilderUtil + { + 2() from B to A; + } } /* From 00279e29b2c1a850896cdbbe03770c4c2524fb81 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 Apr 2019 00:24:21 +0100 Subject: [PATCH 338/539] [AllTest] Continued: refactoring graph building. --- .../java/org/scribble/core/model/GraphBuilderUtil.java | 8 ++------ .../scribble/core/model/endpoint/EGraphBuilderUtil.java | 8 ++++---- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java index 357b03b34..c1302c903 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java @@ -32,13 +32,9 @@ protected GraphBuilderUtil(ModelFactory mf) this.mf = mf; } - //public abstract S newState(L labs); // Can't factor out with SState, doesn't use L and takes SConfig + //public abstract S newState(L labs); // Doesn't factor out well with SState, doesn't use L and takes an SConfig - // N.B. must be called before every "new visit", including first - // Separated from constructor in order to use newState - //public abstract void init(S init); - - public void addEntryLabel(S s, L lab) + protected void addEntryLabAux(S s, L lab) { s.addLabel(lab); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index cf46601da..e643038d1 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -75,18 +75,18 @@ public EGraphBuilderUtil(ModelFactory mf) // N.B. must be called before every "new visit", including first -- called by constructor and finalise protected void reset() { - clear(); + //clear(); this.entry = newState(Collections.emptySet()); this.exit = newState(Collections.emptySet()); } - protected void clear() // CHECKME: redundant? + /*protected void clear() // CHECKME: redundant? -- ideally builder should be implemented so that it is redundant? { this.states.clear(); this.recEntries.clear(); this.enacting.clear(); this.collecting.clear(); - } + }*/ // For the util to additionally record states -- use this, don't use this.mf.newEState public EState newState(Set labs) @@ -393,7 +393,7 @@ private EState getClone(Map clones, EState orig) public void addEntryLabel(RecVar lab) { - addEntryLabel(this.entry, lab); + addEntryLabAux(this.entry, lab); } public EState getEntry() From 5bfabcdf62b70bed1a7a4766a26d2cb32a9d6e77 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 Apr 2019 00:33:23 +0100 Subject: [PATCH 339/539] [AllTest] Continued: refactoring graph building. --- .../scribble/core/model/GraphBuilderUtil.java | 4 +--- .../model/endpoint/EGraphBuilderUtil.java | 19 +++++++++---------- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java index c1302c903..2aad5a7c4 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java @@ -16,9 +16,7 @@ import org.scribble.core.type.kind.ProtoKind; import org.scribble.util.ScribException; -// Helper class for EndpointGraphBuilder -- can access the protected setters of S -// GraphBuilderUtil usage contract (1): this.entry on leaving a node is the same as on entering -// N.B. must call init before every "new visit", including first +// Helper class for (Endpoint)GraphBuilder -- can access the protected setters of S public abstract class GraphBuilderUtil , // Action type: labels on edges diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index e643038d1..43f48d33d 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -31,13 +31,15 @@ import org.scribble.core.type.name.RecVar; import org.scribble.util.ScribException; -// N.B. init must be called before every "new visit", including first -- no: now init implicit on construction, and finalise also does init -// (E)GraphBuilderUtil usage contract (2): all states must be made via newState -// Helper class for EGraphBuilder -- can access the protected setters of EState (via superclass helper methods) +// EGraphBuilderUtil usage contract (1): this.entry on leaving a node is the same as on entering +// EGraphBuilderUtil usage contract (2): all states must be made via newState // Tailored to support graph building from syntactic local protocol choice and recursion public class EGraphBuilderUtil extends GraphBuilderUtil { + protected EState entry; // GraphBuilderUtil usage contract: entry on leaving a node is the same as on entering -- cf., EGraphBuilderUtil.visitSeq restores the original entry on leaving + protected EState exit; // Tracking exit is convenient for merges (otherwise have to generate dummy merge nodes) + // N.B. new states should be made by this.newState, not this.mf.newEState private final Set states = new HashSet<>(); @@ -63,16 +65,13 @@ public class EGraphBuilderUtil // - On recursion exit, pop the list into the enacting map for the rec entry state private final Map>> collecting = new HashMap<>(); - protected EState entry; // GraphBuilderUtil usage contract: entry on leaving a node is the same as on entering -- cf., EGraphBuilderUtil.visitSeq restores the original entry on leaving - protected EState exit; // Tracking exit is convenient for merges (otherwise have to generate dummy merge nodes) - public EGraphBuilderUtil(ModelFactory mf) { super(mf); reset(); } - // N.B. must be called before every "new visit", including first -- called by constructor and finalise + // N.B. called before every "new visit", including first (so util is reusable) -- called by constructor and finalise protected void reset() { //clear(); @@ -181,7 +180,7 @@ public void pushRecursionEntry(RecVar rv, EState entry) this.entry.addLabel(recvar); }*/ //this.recvars.put(recvar, this.entry); - Deque tmp = this.recEntries.get(rv); // Should be same as getEntry() + Deque tmp = this.recEntries.get(rv); // Should be same as this.entry if (tmp == null) { tmp = new LinkedList<>(); @@ -217,10 +216,10 @@ public void pushRecursionEntry(RecVar rv, EState entry) public void popRecursionEntry(RecVar rv) { EState entry = this.recEntries.get(rv).pop(); // Pop the entry of this rec - // Same as getEntry() + // Same as this.entry // Because contract for GraphBuilderUtil is entry on leaving a node is the same as on entry, cf., EGraphBuilder.visitSeq restores original entry on leaving // (And visitRecursion just does visitSeq for the recursion body, with the current entry/exit) - if (!getEntry().equals(entry)) // TODO: deprecate, temporary testing + if (!this.entry.equals(entry)) // TODO: deprecate, temporary testing { throw new RuntimeException("Shouldn't get here: "); } From b04f602220e91bc5bb1caaa68f3529caec3ebb67 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 Apr 2019 11:06:51 +0100 Subject: [PATCH 340/539] [AllTest] Continued: refactoring graph building. --- .../model/endpoint/EGraphBuilderUtil.java | 112 +++++------------- 1 file changed, 30 insertions(+), 82 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index 43f48d33d..f09bfbde6 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -100,18 +100,12 @@ public EState newState(Set labs) public void addEdge(EState s, EAction a, EState succ) { super.addEdge(s, a, succ); - - //for (Deque> ens : this.enacting.values()) for (Deque> ens : this.collecting.values()) { - if (!ens.isEmpty()) // Unnecessary? + List tmp = ens.peek(); // pushRecursionEntry always adds an initial List to the Deque + if (tmp.isEmpty()) { - //Set tmp = ens.peek(); - List tmp = ens.peek(); - if (tmp.isEmpty()) - { - tmp.add(a); - } + tmp.add(a); } } } @@ -123,11 +117,8 @@ public void enterChoice() { for (EState entry : this.collecting.keySet()) { - ////Deque> tmp = this.enacting.get(rv); - Deque> tmp = this.collecting.get(entry); - ////tmp.push(new HashSet<>(tmp.peek())); - //tmp.push(new HashSet<>()); // Initially empty to record nested enablings in choice blocks - tmp.push(new LinkedList<>()); // Initially empty to record nested enablings in choice blocks + Deque> deq = this.collecting.get(entry); + deq.push(new LinkedList<>()); // Initially empty to record nested enablings in choice blocks } } @@ -148,10 +139,8 @@ public void pushChoiceBlock() { for (EState entry : this.collecting.keySet()) { - //Deque> tmp = this.enacting.get(rv); - Deque> tmp = this.collecting.get(entry); - //tmp.push(new HashSet<>()); // Must be empty for addEdge to record (nested) enabling - tmp.push(new LinkedList<>()); + Deque> deq = this.collecting.get(entry); + deq.push(new LinkedList<>()); } } @@ -159,14 +148,9 @@ public void popChoiceBlock() { for (EState entry : this.collecting.keySet()) { - /*Set pop = this.enacting.get(rv).pop(); - Set peek = this.enacting.get(rv).peek();*/ - List pop = this.collecting.get(entry).pop(); - List peek = this.collecting.get(entry).peek(); - //if (peek.isEmpty()) - { - peek.addAll(pop); - } + List block = this.collecting.get(entry).pop(); + List blocks = this.collecting.get(entry).peek(); // Parent choice List + blocks.addAll(block); } } @@ -175,67 +159,47 @@ public void popChoiceBlock() */ public void pushRecursionEntry(RecVar rv, EState entry) { - /*if (!isUnguardedInChoice()) // Don't record rec entry if it is an unguarded choice-rec - { - this.entry.addLabel(recvar); - }*/ - //this.recvars.put(recvar, this.entry); - Deque tmp = this.recEntries.get(rv); // Should be same as this.entry - if (tmp == null) + // Update this.recEntries + Deque recdeq = this.recEntries.get(rv); + if (recdeq == null) { - tmp = new LinkedList<>(); - this.recEntries.put(rv, tmp); + recdeq = new LinkedList<>(); + this.recEntries.put(rv, recdeq); } - /*if (isUnguardedInChoice()) - { - tmp.push(tmp.peek()); // Works because unguarded recs unfolded (including nested recvar shadowing -- if unguarded choice-rec, it will be unfolded and rec entry recorded for guarded unfolding) - } - else - { - tmp.push(this.entry); - }*/ - tmp.push(entry); + recdeq.push(entry); // Same as this.entry - if (this.collecting.containsKey(entry)) + // Udpate this.collecting, if necessary + if (this.collecting.containsKey(entry) || this.enacting.containsKey(entry)) + // Already doing/done this rec state for another of its recvar + // Does checking this.enacting do anything? { return; } - /////Deque> tmp2 = this.enacting.get(recvar); - //Deque> tmp2 = this.collecting.get(entry); - // Collecting per recvar: unnecessary as all recvars for a given state are equivalent (i.e., have the same enacting) -- so could just do per rec entry state - // But easier to do per recvar, to avoid distinguishing between recvars in nested contexts - //if (tmp2 == null) - //{ - Deque> tmp2 = new LinkedList<>(); // New Stack for this recvar - this.collecting.put(entry, tmp2); - //} - //tmp2.push(new HashSet<>()); // Push new Set element onto stack - tmp2.push(new LinkedList<>()); // Push new Set element onto stack + Deque> coldeq = new LinkedList<>(); // New Deque for this recvar + this.collecting.put(entry, coldeq); // !this.collecting.containsKey(entry), popRecursionEntry does remove -- necessary for addEdge/Choice to correctly add to this.collecting + coldeq.push(new LinkedList<>()); // Push new List onto deq } public void popRecursionEntry(RecVar rv) { + // Update this.recEntries EState entry = this.recEntries.get(rv).pop(); // Pop the entry of this rec // Same as this.entry // Because contract for GraphBuilderUtil is entry on leaving a node is the same as on entry, cf., EGraphBuilder.visitSeq restores original entry on leaving // (And visitRecursion just does visitSeq for the recursion body, with the current entry/exit) - if (!this.entry.equals(entry)) // TODO: deprecate, temporary testing - { - throw new RuntimeException("Shouldn't get here: "); - } if (this.recEntries.get(rv).isEmpty()) { - this.recEntries.remove(rv); + this.recEntries.remove(rv); // To keep util clean, e.g., for reuse } + // Udpate this.collecting, if necessary if (!this.collecting.containsKey(entry)) { // This state already done -- i.e., already popped another recvar for this same state, e.g., good.efsm.gcontinue.choiceunguarded.Test05b + // (For a given state, the enacting for all associated recvars is the same (the recvars are "equivalently" identify the state) -- so only need to record per state) return; } - - //Set pop = this.enacting.get(recvar).pop(); - List pop = this.collecting.get(entry).pop(); + List coll = this.collecting.get(entry).pop(); if (this.collecting.get(entry).isEmpty()) // All Lists popped from the stack of this recvar -- could just clear instead { this.collecting.remove(entry); @@ -243,24 +207,8 @@ public void popRecursionEntry(RecVar rv) // This remove is necessary to prevent above containsKey check also succeeding when leaving the outer rec, e.g., good.efsm.gcontinue.choiceunguarded.Test05b // Also necessary to prevent continued updating of this.collecting after leaving a rec (because this.collecting still has entry), e.g., good.efsm.gchoice.Test10 } - - /*Map> tmp = this.enacting.get(curr); - if (tmp == null) - { - tmp = new HashMap<>(); - this.enacting.put(curr, tmp); - } - tmp.put(rv, pop);*/ - if (!this.enacting.containsKey(entry)) - // For a given state, the enacting for all associated recvars is the same (the recvars are "equivalent) -- so only need to record per state - { - this.enacting.put(entry, pop); - } - else if (!this.enacting.get(entry).equals(pop)) // TODO: deprecate, temporary testing - { - throw new RuntimeException("Shouldn't get in here: " + entry + " ,, " - + this.enacting.get(entry) + " ,, " + rv + " ,, " + pop); - } + this.enacting.put(entry, coll); + // !this.enacting.containsKey(entry) -- if it did contain (remove enacting check from pushRecursionEntry), this.enacting.get(entry).equals(coll) } /* From c6fe8e6881bb48e52a4c2ac593c37b27de56ca87 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 Apr 2019 14:53:02 +0100 Subject: [PATCH 341/539] [AllTest] Continued: refactoring graph building. --- .../scribble/core/model/GraphBuilderUtil.java | 3 +- .../model/endpoint/EGraphBuilderUtil.java | 37 ++++++++----------- .../endpoint/IntermediateContinueEdge.java | 8 ++-- .../core/visit/local/EGraphBuilder.java | 33 ++++++----------- 4 files changed, 32 insertions(+), 49 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java index 2aad5a7c4..a50fb0d70 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java @@ -14,7 +14,6 @@ package org.scribble.core.model; import org.scribble.core.type.kind.ProtoKind; -import org.scribble.util.ScribException; // Helper class for (Endpoint)GraphBuilder -- can access the protected setters of S public abstract class GraphBuilderUtil @@ -48,7 +47,7 @@ protected final void addEdgeAux(S s, A a, S succ) s.addEdge(a, succ); } - protected void removeEdgeAux(S s, A a, S succ) throws ScribException // Exception necessary? + protected void removeEdgeAux(S s, A a, S succ) //throws ScribException // Exception necessary? { s.removeEdge(a, succ); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index f09bfbde6..7b27e0d50 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -29,7 +29,6 @@ import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; -import org.scribble.util.ScribException; // EGraphBuilderUtil usage contract (1): this.entry on leaving a node is the same as on entering // EGraphBuilderUtil usage contract (2): all states must be made via newState @@ -102,7 +101,7 @@ public void addEdge(EState s, EAction a, EState succ) super.addEdge(s, a, succ); for (Deque> ens : this.collecting.values()) { - List tmp = ens.peek(); // pushRecursionEntry always adds an initial List to the Deque + List tmp = ens.peek(); // enterRecursion always adds an initial List to the Deque if (tmp.isEmpty()) { tmp.add(a); @@ -135,7 +134,7 @@ public void leaveChoice() } } - public void pushChoiceBlock() + public void enterChoiceBlock() { for (EState entry : this.collecting.keySet()) { @@ -144,7 +143,7 @@ public void pushChoiceBlock() } } - public void popChoiceBlock() + public void leaveChoiceBlock() { for (EState entry : this.collecting.keySet()) { @@ -157,7 +156,7 @@ public void popChoiceBlock() /* * Dealing with Recursion contexts */ - public void pushRecursionEntry(RecVar rv, EState entry) + public void enterRecursion(RecVar rv, EState entry) { // Update this.recEntries Deque recdeq = this.recEntries.get(rv); @@ -176,11 +175,11 @@ public void pushRecursionEntry(RecVar rv, EState entry) return; } Deque> coldeq = new LinkedList<>(); // New Deque for this recvar - this.collecting.put(entry, coldeq); // !this.collecting.containsKey(entry), popRecursionEntry does remove -- necessary for addEdge/Choice to correctly add to this.collecting + this.collecting.put(entry, coldeq); // !this.collecting.containsKey(entry), leaveRecursion does remove -- necessary for addEdge/Choice to correctly add to this.collecting coldeq.push(new LinkedList<>()); // Push new List onto deq } - public void popRecursionEntry(RecVar rv) + public void leaveRecursion(RecVar rv) { // Update this.recEntries EState entry = this.recEntries.get(rv).pop(); // Pop the entry of this rec @@ -208,36 +207,32 @@ public void popRecursionEntry(RecVar rv) // Also necessary to prevent continued updating of this.collecting after leaving a rec (because this.collecting still has entry), e.g., good.efsm.gchoice.Test10 } this.enacting.put(entry, coll); - // !this.enacting.containsKey(entry) -- if it did contain (remove enacting check from pushRecursionEntry), this.enacting.get(entry).equals(coll) + // !this.enacting.containsKey(entry) -- if it did contain (remove enacting check from enterRecursion), this.enacting.get(entry).equals(coll) } /* * Edge construction for Continues */ - // Choice-unguarded continues -- fixed in finalise pass - // Now currently used for all continues, cf. LContinue::buildGraph - public void addContinueEdge(EState s, RecVar rv) + public void addContinueEdge(EState pred, EAction a, EState curr, RecVar rv) { - /*this.contStates.add(s); - this.contRecVars.add(rv);*/ + removeEdgeAux(pred, a, curr); // N.B. "a" could be an enacting, that's fine (removeEdgeAux doesn't change that) EState entry = getRecursionEntry(rv); - addEdgeAux(s, new IntermediateContinueEdge(this.mf, rv), entry); - //addEdge(s, new IntermediateContinueEdge(rv), entry); // **FIXME: broken on purpose for testing + addEdge(pred, a, entry); } - // Cf. add ContinueEdge - public void addRecursionEdge(EState s, EAction a, RecVar rv) + // Choice-unguarded continues -- fixed in finalise pass + public void addUnguardedContinueEdge(EState s, RecVar rv) // Intermed continue edge makes its own dummy action { EState entry = getRecursionEntry(rv); - addEdge(s, a, entry); + addEdgeAux(s, new IntermediateContinueEdge(this.mf, rv), entry); } - // CHECKME handle preds/prevs like above (cf. this.addEdge) + /*// CHECKME: update enacting? (cf. this.addEdge) public void removeEdge(EState s, EAction a, EState succ) throws ScribException { removeEdgeAux(s, a, succ); - } + }*/ public EState getRecursionEntry(RecVar recvar) { @@ -247,7 +242,7 @@ public EState getRecursionEntry(RecVar recvar) // Returns List, cf. getSuccessors/Actions (vs. GetDet...) public List getPredecessors(EState s) { - // TODO: make more efficient + // TODO: make more efficient -- maybe not: maintaining predecessors complicated by this.collecting, like addEdge ? return this.states.stream().filter(x -> x.getSuccs().contains(s)) .collect(Collectors.toList()); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java index 3387e582a..2d8a40479 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java @@ -23,9 +23,9 @@ class IntermediateContinueEdge extends EAction { - public IntermediateContinueEdge(ModelFactory ef, RecVar rv) + public IntermediateContinueEdge(ModelFactory mf, RecVar rv) { - super(ef, Role.EMPTY_ROLE, new Op(rv.toString()), Payload.EMPTY_PAYLOAD); // HACK + super(mf, Role.EMPTY_ROLE, new Op(rv.toString()), Payload.EMPTY_PAYLOAD); // HACK } @Override @@ -65,7 +65,7 @@ public boolean equals(Object o) { return false; } - return ((IntermediateContinueEdge) o).canEquals(this) && super.equals(o); + return super.equals(o); // Checks canEquals } @Override @@ -73,4 +73,4 @@ public boolean canEquals(Object o) { return o instanceof IntermediateContinueEdge; } -} \ No newline at end of file +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 95224e1ab..a7659f3c7 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -32,21 +32,20 @@ import org.scribble.core.type.session.DirectedInteraction; import org.scribble.core.type.session.DisconnectAction; import org.scribble.core.type.session.Do; -import org.scribble.core.type.session.SigLit; import org.scribble.core.type.session.Payload; import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.SigLit; import org.scribble.core.type.session.local.LAcc; import org.scribble.core.type.session.local.LContinue; import org.scribble.core.type.session.local.LDisconnect; -import org.scribble.core.type.session.local.LRecv; import org.scribble.core.type.session.local.LRecursion; +import org.scribble.core.type.session.local.LRecv; import org.scribble.core.type.session.local.LReq; import org.scribble.core.type.session.local.LSend; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.STypeVisitorNoThrow; -import org.scribble.util.ScribException; // Pre: use on inlined or later (unsupported for Do, also Protocol) // Uses EGraphBuilderUtil2 to build graph "progressively" (working graph is mutable) @@ -83,7 +82,7 @@ public SType visitChoice(Choice n) // Cannot treat choice-unguarded-continue in "a single pass", because may not have built all recursion enacting edges yet // (Single-pass building would be sensitive to order of choice block visiting) LContinue cont = (LContinue) first; // First and only element - util.addContinueEdge(util.getEntry(), cont.recvar); + util.addUnguardedContinueEdge(util.getEntry(), cont.recvar); } else if (first instanceof LRecursion) // CHECKME: do this here? refactor into builderutil? { @@ -91,9 +90,9 @@ else if (first instanceof LRecursion) // CHECKME: do this here? refactor into } else { - util.pushChoiceBlock(); // CHECKME: still needed? LContinue doesn't check isUnguardedInChoice any more + util.enterChoiceBlock(); // CHECKME: still needed? LContinue doesn't check isUnguardedInChoice any more block.visitWithNoThrow(this); - util.popChoiceBlock(); + util.leaveChoiceBlock(); } } util.leaveChoice(); @@ -143,29 +142,19 @@ private void buildUnguardedRecursion(EGraphBuilderUtil util, @Override public SType visitContinue(Continue n) { - // CHECKME: identical edges, i.e. same pred/prev/succ (e.g. rec X { choice at A { A->B:1 } or { A->B:1 } continue X; }) // Choice-guarded continue -- choice-unguarded continue detected and handled in LChoice EState curr = this.util.getEntry(); - for (EState pred : this.util.getPredecessors(curr)) // Does getAllSuccessors + for (EState pred : this.util.getPredecessors(curr)) // Does getSuccs (i.e., gets all), e.g., choice sequenced to continue { + // CHECKME: identical edges? i.e. same pred/prev/succ (e.g. rec X { choice at A { A->B:1 } or { A->B:1 } continue X; }) for (EAction a : new LinkedList<>(pred.getActions())) { - // Following is because pred.getSuccessor doesn't support non-det edges - // FIXME: refactor actions/successor Lists in MState to list of edges? + // Following caters for non-det edges (to different succs) for (EState succ : pred.getSuccs(a)) { if (succ.equals(curr)) { - try - { - this.util.removeEdge(pred, a, curr); //b.removeEdgeFromPredecessor(pred, prev); - //b.addEdge(pred, a, entry); //b.addRecursionEdge(pred, prev, b.getRecursionEntry(this.recvar)); - this.util.addRecursionEdge(pred, a, n.recvar); - } - catch (ScribException e) // CHECKME: necessary for removeEdge to have throws? - { - throw new RuntimeException(e); - } + this.util.addContinueEdge(pred, a, curr, n.recvar); } } } @@ -218,9 +207,9 @@ public final > SType visitDo( public SType visitRecursion(Recursion n) { this.util.addEntryLabel(n.recvar); - this.util.pushRecursionEntry(n.recvar, this.util.getEntry()); + this.util.enterRecursion(n.recvar, this.util.getEntry()); n.body.visitWithNoThrow(this); - this.util.popRecursionEntry(n.recvar); + this.util.leaveRecursion(n.recvar); return n; } From 04116445f7c44dda067a40d083285ae5f058182c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 Apr 2019 16:01:57 +0100 Subject: [PATCH 342/539] [AllTest] Continued: refactoring graph building. --- .../model/endpoint/EGraphBuilderUtil.java | 99 +++++++++---------- ...ueEdge.java => UnguardedContinueEdge.java} | 8 +- .../core/visit/local/EGraphBuilder.java | 4 +- scribble-test/src/test/scrib/tmp/Test.scr | 17 ++++ 4 files changed, 67 insertions(+), 61 deletions(-) rename scribble-core/src/main/java/org/scribble/core/model/endpoint/{IntermediateContinueEdge.java => UnguardedContinueEdge.java} (89%) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index 7b27e0d50..c5295a55b 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -213,7 +213,7 @@ public void leaveRecursion(RecVar rv) /* * Edge construction for Continues */ - public void addContinueEdge(EState pred, EAction a, EState curr, RecVar rv) + public void fixContinueEdge(EState pred, EAction a, EState curr, RecVar rv) { removeEdgeAux(pred, a, curr); // N.B. "a" could be an enacting, that's fine (removeEdgeAux doesn't change that) EState entry = getRecursionEntry(rv); @@ -224,7 +224,7 @@ public void addContinueEdge(EState pred, EAction a, EState curr, RecVar rv) public void addUnguardedContinueEdge(EState s, RecVar rv) // Intermed continue edge makes its own dummy action { EState entry = getRecursionEntry(rv); - addEdgeAux(s, new IntermediateContinueEdge(this.mf, rv), entry); + addEdgeAux(s, new UnguardedContinueEdge(this.mf, rv), entry); } /*// CHECKME: update enacting? (cf. this.addEdge) @@ -239,10 +239,11 @@ public EState getRecursionEntry(RecVar recvar) return this.recEntries.get(recvar).peek(); } - // Returns List, cf. getSuccessors/Actions (vs. GetDet...) - public List getPredecessors(EState s) + // Returns List (not Set), cf. getSuccs/Actions + public List getPreds(EState s) { - // TODO: make more efficient -- maybe not: maintaining predecessors complicated by this.collecting, like addEdge ? + // Easier to recompute than "cache" (this.preds), due to removeEdge(Aux)? Cf. addEdge (Or due to maintaining this.collecting/enacting) + // (Only currently used by visitContinue, so cost OK) return this.states.stream().filter(x -> x.getSuccs().contains(s)) .collect(Collectors.toList()); } @@ -252,65 +253,58 @@ public List getPredecessors(EState s) */ public EGraph finalise() { - EState entry = this.entry.cloneNode(this.mf, this.entry.getLabels()); //this.ef.newEState(this.entry.getLabels()); - EState exit = this.exit.cloneNode(this.mf, this.exit.getLabels()); //this.ef.newEState(this.exit.getLabels()); - - Map map = new HashMap<>(); - map.put(this.entry, entry); - map.put(this.exit, exit); - Set seen = new HashSet<>(); - fixContinueEdges(seen, map, this.entry, entry); - if (!seen.contains(this.exit)) + EState entryClone = this.entry.cloneNode(this.mf, this.entry.getLabels()); + EState exitClone = this.exit.cloneNode(this.mf, this.exit.getLabels()); + Map clones = new HashMap<>(); // Will be mostly populated by fixUnguardedContinueEdges + clones.put(this.entry, entryClone); + clones.put(this.exit, exitClone); + Set seenOrig = new HashSet<>(); + fixUnguardedContinueEdges(seenOrig, clones, this.entry, entryClone); + if (!seenOrig.contains(this.exit)) { - exit = null; + exitClone = null; } - - /*Map all = getAllStates(res); - EndpointState dfa = determinise(all, res, resTerm); - System.out.println("111: " + dfa.toDot());*/ - reset(); - - return new EGraph(entry, exit); + return new EGraph(entryClone, exitClone); } - // FIXME: incomplete -- won't fully correctly handle situations involving, e.g., transitive continue-edge fixing? - protected void fixContinueEdges(Set seen, Map clones, - EState orig, EState clone) + protected void fixUnguardedContinueEdges(Set seenOrig, + Map clones, EState currOrig, EState currClone) { - if (seen.contains(orig)) + if (seenOrig.contains(currOrig)) { return; } - seen.add(orig); - Iterator as = orig.getActions().iterator(); - Iterator ss = orig.getSuccs().iterator(); + seenOrig.add(currOrig); + Iterator as = currOrig.getActions().iterator(); // Actions are immutable (no orig/clone) + Iterator succsOrig = currOrig.getSuccs().iterator(); while (as.hasNext()) { EAction a = as.next(); - EState origSucc = ss.next(); - EState cloneSucc = getClone(clones, origSucc); - - if (!(a instanceof IntermediateContinueEdge)) + EState succOrig = succsOrig.next(); + if (!(a instanceof UnguardedContinueEdge)) { - addEdgeAux(clone, a, cloneSucc); - - fixContinueEdges(seen, clones, origSucc, cloneSucc); + EState succClone = getClone(clones, succOrig); + addEdgeAux(currClone, a, succClone); + fixUnguardedContinueEdges(seenOrig, clones, succOrig, succClone); } - else + else // Choice--unguardedcontedge-->succOrig, i.e., curr is a Choice, succOrig is a rec entry state { - //IntermediateContinueEdge ice = (IntermediateContinueEdge) a; // Choice --imed--> recursion entry (origSucc) - ////for (IOAction e : this.enactingMap.get(succ)) - //RecVar rv = new RecVar(ice.mid.toString()); - //for (EAction e : this.enacting.get(origSucc).get(rv)) - for (EAction e : this.enacting.get(origSucc)) + EState recEntry = succOrig; + for (EAction e : this.enacting.get(recEntry)) // recEntry--enacting-->succEntry { - for (EState n : origSucc.getSuccs(e)) + for (EState succEntry : recEntry.getSuccs(e)) { - cloneSucc = getClone(clones, n); // cloneSucc is a successor of origSucc - addEdgeAux(clone, e, cloneSucc); // Choice --enacting--> cloneSucc, i.e., succ(rec-entry, enacting) - - fixContinueEdges(seen, clones, origSucc, cloneSucc); + EState succEntryClone = getClone(clones, succEntry); // succEntryClone is a (cloned) successor of recEntry + addEdgeAux(currClone, e, succEntryClone); + // Choice--enacting-->succSuccClone, where succSuccClone is succ(rec-entry, enacting) (rec-entry is SuccOrig) + // i.e., skip recEntry + fixUnguardedContinueEdges(seenOrig, clones, recEntry, // Carry on from recEntry, that's where this edge was going "morally" + getClone(clones, recEntry)); + + // CHECKME: "transitive" (nested?) unguarded-continue-edge rewriting possible? supported? + // ...CHECKME: incomplete -- won't fully correctly handle situations involving, e.g., transitive continue-edge fixing? + } } } @@ -319,17 +313,12 @@ protected void fixContinueEdges(Set seen, Map clones, private EState getClone(Map clones, EState orig) { - EState res; if (clones.containsKey(orig)) { - res = clones.get(orig); - } - else - { - //next = this.ef.newEState(succ.getLabels()); - res = orig.cloneNode(this.mf, orig.getLabels()); - clones.put(orig, res); + return clones.get(orig); } + EState res = orig.cloneNode(this.mf, orig.getLabels()); + clones.put(orig, res); return res; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/UnguardedContinueEdge.java similarity index 89% rename from scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/UnguardedContinueEdge.java index 2d8a40479..4244bfdd4 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/IntermediateContinueEdge.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/UnguardedContinueEdge.java @@ -21,9 +21,9 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; -class IntermediateContinueEdge extends EAction +class UnguardedContinueEdge extends EAction { - public IntermediateContinueEdge(ModelFactory mf, RecVar rv) + public UnguardedContinueEdge(ModelFactory mf, RecVar rv) { super(mf, Role.EMPTY_ROLE, new Op(rv.toString()), Payload.EMPTY_PAYLOAD); // HACK } @@ -61,7 +61,7 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof IntermediateContinueEdge)) + if (!(o instanceof UnguardedContinueEdge)) { return false; } @@ -71,6 +71,6 @@ public boolean equals(Object o) @Override public boolean canEquals(Object o) { - return o instanceof IntermediateContinueEdge; + return o instanceof UnguardedContinueEdge; } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index a7659f3c7..58997e8cf 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -144,7 +144,7 @@ public SType visitContinue(Continue n) { // Choice-guarded continue -- choice-unguarded continue detected and handled in LChoice EState curr = this.util.getEntry(); - for (EState pred : this.util.getPredecessors(curr)) // Does getSuccs (i.e., gets all), e.g., choice sequenced to continue + for (EState pred : this.util.getPreds(curr)) // Does getSuccs (i.e., gets all), e.g., choice sequenced to continue { // CHECKME: identical edges? i.e. same pred/prev/succ (e.g. rec X { choice at A { A->B:1 } or { A->B:1 } continue X; }) for (EAction a : new LinkedList<>(pred.getActions())) @@ -154,7 +154,7 @@ public SType visitContinue(Continue n) { if (succ.equals(curr)) { - this.util.addContinueEdge(pred, a, curr, n.recvar); + this.util.fixContinueEdge(pred, a, curr, n.recvar); } } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index fcf47beb6..deb488660 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -109,6 +109,22 @@ module tmp.Test; data "..." from "..." as T; +//* +global protocol Proto1(role A, role B) +{ + 1() from A to B; + choice at A + { + do Proto1(A, B); + } + or + { + 2() from A to B; + } +} +//*/ + +/* global protocol Proto1(role A, role B) { rec X @@ -128,6 +144,7 @@ global protocol Proto1(role A, role B) 2() from B to A; } } +//*/ /* global protocol Proto1(role A, role B, role C) From ad03061343a99c462de0e7b9541311b7a4b911ef Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 Apr 2019 22:46:22 +0100 Subject: [PATCH 343/539] [AllTest] Continued: refactoring graph building. --- .../model/endpoint/EGraphBuilderUtil.java | 4 +-- .../core/visit/local/EGraphBuilder.java | 32 +++++++++---------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index c5295a55b..7b07f366d 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -30,8 +30,8 @@ import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; -// EGraphBuilderUtil usage contract (1): this.entry on leaving a node is the same as on entering -// EGraphBuilderUtil usage contract (2): all states must be made via newState +// EGraphBuilderUtil usage contract (1): all states must be made via newState +// EGraphBuilderUtil usage contract (2): this.entry on leaving a node is the same as on entering // Tailored to support graph building from syntactic local protocol choice and recursion public class EGraphBuilderUtil extends GraphBuilderUtil diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 58997e8cf..c20d3aad5 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -86,11 +86,11 @@ public SType visitChoice(Choice n) } else if (first instanceof LRecursion) // CHECKME: do this here? refactor into builderutil? { - buildUnguardedRecursion(util, elems, first); + buildUnguardedRecursion(util, elems); } else { - util.enterChoiceBlock(); // CHECKME: still needed? LContinue doesn't check isUnguardedInChoice any more + util.enterChoiceBlock(); block.visitWithNoThrow(this); util.leaveChoiceBlock(); } @@ -99,11 +99,12 @@ else if (first instanceof LRecursion) // CHECKME: do this here? refactor into return n; } + // Recursion is first element of choice case private void buildUnguardedRecursion(EGraphBuilderUtil util, - List elems, LType first) + List elems) { + LRecursion first = (LRecursion) elems.get(0); EState entry = util.getEntry(); - EState exit = util.getExit(); EState nestedEntry = util.newState(Collections.emptySet()); util.setEntry(nestedEntry); @@ -113,30 +114,27 @@ private void buildUnguardedRecursion(EGraphBuilderUtil util, } else { - // Reuse existing b, to directly add continue-edges back to the "outer" graph + EState exit = util.getExit(); EState nestedExit = util.newState(Collections.emptySet()); util.setExit(nestedExit); - first.visitWithNoThrow(this); + first.visitWithNoThrow(this); // entry to nestedExit -- reuse existing builder, to directly add continue-edges back to the "outer" graph util.setEntry(nestedExit); // Must be non null util.setExit(exit); LSeq tail = new LSeq(null, elems.subList(1, elems.size())); - tail.visitWithNoThrow(this); + tail.visitWithNoThrow(this); // nestedExit to exit } - EState init = nestedEntry; - for (EAction a : (Iterable) - init.getActions().stream().distinct()::iterator) - // Enabling actions + Iterator as = nestedEntry.getActions().iterator(); // "Enacting" actions + Iterator succs = nestedEntry.getSuccs().iterator(); + while (as.hasNext()) { - for (EState s : init.getSuccs(a)) - { - util.addEdge(entry, a, s); - } + EAction a = as.next(); + EState succ = succs.next(); + util.addEdge(entry, a, succ); // Add edges from original entry into "nested" graph, offset by enacting to nestedEntry succs } - util.setEntry(entry); - util.setExit(exit); + util.setEntry(entry); // EGraphBuilderUtil entry on leaving a node should be the same as on entering } @Override From 27e9e9429d93a81778d195224110924cfc88b05b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 Apr 2019 22:55:43 +0100 Subject: [PATCH 344/539] [AllTest] Continued: refactoring graph building. --- .../core/visit/local/EGraphBuilder.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index c20d3aad5..116242b76 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -108,7 +108,7 @@ private void buildUnguardedRecursion(EGraphBuilderUtil util, EState nestedEntry = util.newState(Collections.emptySet()); util.setEntry(nestedEntry); - if (elems.size() == 1) + if (elems.size() == 1) // Cf. visitSeq last element or not { first.visitWithNoThrow(this); } @@ -134,13 +134,13 @@ private void buildUnguardedRecursion(EGraphBuilderUtil util, util.addEdge(entry, a, succ); // Add edges from original entry into "nested" graph, offset by enacting to nestedEntry succs } - util.setEntry(entry); // EGraphBuilderUtil entry on leaving a node should be the same as on entering + util.setEntry(entry); // EGraphBuilderUtil contract, entry on leaving a node should be the same as on entering } @Override public SType visitContinue(Continue n) { - // Choice-guarded continue -- choice-unguarded continue detected and handled in LChoice + // Choice-guarded continue -- choice-unguarded continue detected and handled above in visitChoice EState curr = this.util.getEntry(); for (EState pred : this.util.getPreds(curr)) // Does getSuccs (i.e., gets all), e.g., choice sequenced to continue { @@ -175,11 +175,11 @@ public SType visitDirectedInteraction( Payload pay = n.msg.isSigLit() // CHECKME: generalise? (e.g., hasPayload) ? ((SigLit) n.msg).payload : Payload.EMPTY_PAYLOAD; - // TODO: add toAction method to base Interaction + // TODO: add toAction method to BasicInteraction (cf. toName methods of NameNodes) EAction a = (n instanceof LSend) ? this.util.mf.newESend(peer, mid, pay) - : (n instanceof LRecv) ? this.util.mf.newERecv(peer, mid, pay) - : (n instanceof LReq) ? this.util.mf.newEReq(peer, mid, pay) - : //(n instanceof LAcc) ? + : (n instanceof LRecv) ? this.util.mf.newERecv(peer, mid, pay) + : (n instanceof LReq) ? this.util.mf.newEReq(peer, mid, pay) + : //(n instanceof LAcc) ? this.util.mf.newEAcc(peer, mid, pay); // Action type already checked above this.util.addEdge(this.util.getEntry(), a, this.util.getExit()); return n; @@ -188,8 +188,8 @@ public SType visitDirectedInteraction( @Override public SType visitDisconnect(DisconnectAction n) { - Role peer = ((LDisconnect) n).getPeer(); // CHECKME - EAction a = this.util.mf.newEDisconnect(peer); // TODO: add toAction method to base Interaction + Role peer = ((LDisconnect) n).getPeer(); // CHECKME -- ? + EAction a = this.util.mf.newEDisconnect(peer); // TODO: add toAction method to BasicInteraction this.util.addEdge(this.util.getEntry(), a, this.util.getExit()); return n; } @@ -239,7 +239,7 @@ public LSeq visitSeq(LSeq n) // CHECKME: exit may not be tmp, entry/exit can be modified, e.g. continue } } - util.setEntry(entry); + util.setEntry(entry); // EGraphBuilderUtil contract, entry on leaving a node should be the same as on entering return n; } } From f44e19049aaf5e80a0ae36c1fc8203b0f011b81a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 Apr 2019 23:31:35 +0100 Subject: [PATCH 345/539] [AllTest] Continued: refactoring graph building. --- .../main/java/org/scribble/core/job/Core.java | 7 +-- .../org/scribble/core/model/ModelFactory.java | 4 +- .../scribble/core/model/ModelFactoryImpl.java | 4 +- .../model/endpoint/{EFSM.java => EFsm.java} | 22 ++++---- .../scribble/core/model/endpoint/EGraph.java | 4 +- .../scribble/core/model/global/SConfig.java | 50 +++++++++---------- .../core/model/global/SGraphBuilderUtil.java | 6 +-- .../scribble/core/model/global/SModel.java | 6 +-- 8 files changed, 50 insertions(+), 53 deletions(-) rename scribble-core/src/main/java/org/scribble/core/model/endpoint/{EFSM.java => EFsm.java} (84%) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 870d5a233..ec4499b86 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -26,7 +26,7 @@ import org.scribble.core.model.ModelFactoryImpl; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.global.SGraph; -import org.scribble.core.model.global.SGraphBuilderUtil; +import org.scribble.core.model.global.SGraphBuilder; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.GProtoName; @@ -50,7 +50,8 @@ public class Core private final CoreContext context; // Mutable (Visitor passes replace modules) - private final SGraphBuilderUtil sgraphb; // FIXME: refactor? + //private final SGraphBuilderUtil sgraphb; // FIXME: refactor? + private final SGraphBuilder sgraphb; // FIXME: refactor? public Core(ModuleName mainFullname, Map args, //Map modcs, @@ -59,7 +60,7 @@ public Core(ModuleName mainFullname, Map args, this.config = newCoreConfig(mainFullname, args); this.context = newCoreContext(//modcs, imeds); // Single instance per Core and should never be shared - this.sgraphb = this.config.mf.newSGraphBuilderUtil(); + this.sgraphb = new SGraphBuilder(this.config.mf);//this.config.mf.newSGraphBuilderUtil(); } // A Scribble extension should override newCoreConfig/Context/etc as appropriate diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java index 53838abb9..7d204602e 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java @@ -16,7 +16,7 @@ import java.util.Map; import java.util.Set; -import org.scribble.core.model.endpoint.EFSM; +import org.scribble.core.model.endpoint.EFsm; import org.scribble.core.model.endpoint.EGraphBuilderUtil; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAcc; @@ -54,7 +54,7 @@ public interface ModelFactory SState newSState(SConfig config); SGraph newSGraph(GProtoName proto, Map states, SState init); - SConfig newSConfig(Map state, SBuffers buffs); + SConfig newSConfig(Map state, SBuffers buffs); SModel newSModel(SGraph g); ESend newESend(Role peer, MsgId mid, Payload pay); diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java index 76c0e8a43..31459b0b8 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java @@ -16,7 +16,7 @@ import java.util.Map; import java.util.Set; -import org.scribble.core.model.endpoint.EFSM; +import org.scribble.core.model.endpoint.EFsm; import org.scribble.core.model.endpoint.EGraphBuilderUtil; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAcc; @@ -164,7 +164,7 @@ public SGraph newSGraph(GProtoName proto, Map states, SState in } @Override - public SConfig newSConfig(Map state, SBuffers buffs) + public SConfig newSConfig(Map state, SBuffers buffs) { return new SConfig(this, state, buffs); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java similarity index 84% rename from scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java rename to scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java index e25fef9d6..b07ec8595 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFSM.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java @@ -19,26 +19,21 @@ import org.scribble.core.model.endpoint.actions.EAction; // Factor out with SModel? -public class EFSM +public class EFsm { public final EGraph graph; public final EState curr; - protected EFSM(EGraph graph) + protected EFsm(EGraph graph) { this(graph, graph.init); } - protected EFSM(EGraph graph, EState curr) + protected EFsm(EGraph graph, EState curr) { - this.graph = graph;//new EGraph(init, term); + this.graph = graph; this.curr = curr; } - - /*public EndpointState getCurrent() - { - return this.curr; - }*/ // CHECKME: check if unfolded initial accept is possible, and if it breaks anything public boolean isInitial() @@ -56,9 +51,10 @@ public EStateKind getStateKind() return this.curr.getStateKind(); } - public List fireAll(EAction a) + // CHECKME: Set? List is for non-det actions, but is that relevant to EFsm's? + public List fireAll(EAction a) { - return this.curr.getSuccs(a).stream().map(x -> new EFSM(this.graph, x)) + return this.curr.getSuccs(a).stream().map(x -> new EFsm(this.graph, x)) .collect(Collectors.toList()); } @@ -93,11 +89,11 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof EFSM)) + if (!(o instanceof EFsm)) { return false; } - EFSM them = (EFSM) o; + EFsm them = (EFsm) o; return this.graph.equals(them.graph) && this.curr.equals(them.curr); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java index db6a22aeb..ef40b9376 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java @@ -28,9 +28,9 @@ public EGraph(EState init, EState term) this.term = term; } - public EFSM toFsm() + public EFsm toFsm() { - return new EFSM(this); + return new EFsm(this); } public String toPml(Role r) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index 6c216c338..3d868ff05 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -25,7 +25,7 @@ import java.util.stream.Collectors; import org.scribble.core.model.ModelFactory; -import org.scribble.core.model.endpoint.EFSM; +import org.scribble.core.model.endpoint.EFsm; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.EStateKind; import org.scribble.core.model.endpoint.actions.EAcc; @@ -40,17 +40,17 @@ public class SConfig { - protected final ModelFactory sf; + protected final ModelFactory mf; //public final Map states; - public final Map efsms; + public final Map efsms; public final SBuffers buffs; //public WFConfig(Map state, Map> buff) //public WFConfig(Map state, WFBuffers buffs) - public SConfig(ModelFactory sf, Map state, SBuffers buffs) + public SConfig(ModelFactory mf, Map state, SBuffers buffs) { - this.sf = sf; + this.mf = mf; this.efsms = Collections.unmodifiableMap(state); //this.buffs = Collections.unmodifiableMap(buff.keySet().stream() .collect(Collectors.toMap((k) -> k, (k) -> Collections.unmodifiableMap(buff.get(k))))); @@ -77,7 +77,7 @@ public boolean isSafeTermination() public boolean canSafelyTerminate(Role r) { //EndpointState s = this.states.get(r); - EFSM s = this.efsms.get(r); + EFsm s = this.efsms.get(r); //return /*boolean cannotSafelyTerminate = // FIXME: check and cleanup (s.isTerminal() && !this.buffs.isEmpty(r)) @@ -113,12 +113,12 @@ public List fire(Role r, EAction a) List res = new LinkedList<>(); //List succs = this.states.get(r).takeAll(a); - List succs = this.efsms.get(r).fireAll(a); + List succs = this.efsms.get(r).fireAll(a); //for (EndpointState succ : succs) - for (EFSM succ : succs) + for (EFsm succ : succs) { //Map tmp1 = new HashMap<>(this.states); - Map tmp1 = new HashMap<>(this.efsms); + Map tmp1 = new HashMap<>(this.efsms); //Map> tmp2 = new HashMap<>(this.buffs); tmp1.put(r, succ); @@ -143,7 +143,7 @@ public List fire(Role r, EAction a) { throw new RuntimeException("Shouldn't get in here: " + a); } - res.add(this.sf.newSConfig(tmp1, tmp2)); + res.add(this.mf.newSConfig(tmp1, tmp2)); } return res; @@ -156,15 +156,15 @@ public List sync(Role r1, EAction a1, Role r2, EAction a2) /*List succs1 = this.states.get(r1).takeAll(a1); List succs2 = this.states.get(r2).takeAll(a2); for (EndpointState succ1 : succs1)*/ - List succs1 = this.efsms.get(r1).fireAll(a1); - List succs2 = this.efsms.get(r2).fireAll(a2); - for (EFSM succ1 : succs1) + List succs1 = this.efsms.get(r1).fireAll(a1); + List succs2 = this.efsms.get(r2).fireAll(a2); + for (EFsm succ1 : succs1) { //for (EndpointState succ2 : succs2) - for (EFSM succ2 : succs2) + for (EFsm succ2 : succs2) { //Map tmp1 = new HashMap<>(this.states); - Map tmp1 = new HashMap<>(this.efsms); + Map tmp1 = new HashMap<>(this.efsms); tmp1.put(r1, succ1); tmp1.put(r2, succ2); SBuffers tmp2; @@ -181,7 +181,7 @@ else if (((a1.isClientWrap() && a2.isServerWrap()) || (a1.isServerWrap() && a2.i { throw new RuntimeException("Shouldn't get in here: " + a1 + ", " + a2); } - res.add(this.sf.newSConfig(tmp1, tmp2)); + res.add(this.mf.newSConfig(tmp1, tmp2)); } } @@ -195,7 +195,7 @@ public Map getStuckMessages() for (Role r : this.efsms.keySet()) { //EndpointState s = this.states.get(r); - EFSM s = this.efsms.get(r); + EFsm s = this.efsms.get(r); EStateKind k = s.getStateKind(); if (k == EStateKind.UNARY_INPUT || k == EStateKind.POLY_INPUT) { @@ -301,7 +301,7 @@ public Set isWaitForChain(Role orig) candidate.add(r); //EndpointState s = this.states.get(r); - EFSM s = this.efsms.get(r); + EFsm s = this.efsms.get(r); if (s == null) { @@ -348,7 +348,7 @@ public Set isWaitForChain(Role orig) private Set isWaitingFor(Role r) { //EndpointState s = this.states.get(r); - EFSM s = this.efsms.get(r); + EFsm s = this.efsms.get(r); EStateKind k = s.getStateKind(); if (k == EStateKind.UNARY_INPUT || k == EStateKind.POLY_INPUT) { @@ -456,7 +456,7 @@ public Map> getOrphanMessages() for (Role r : this.efsms.keySet()) { //EndpointState s = this.states.get(r); - EFSM s = this.efsms.get(r); + EFsm s = this.efsms.get(r); if (s.isTerminated()) // Local termination of r, i.e. not necessarily "full deadlock" { Set orphs = this.buffs.get(r).values().stream().filter((v) -> v != null).collect(Collectors.toSet()); @@ -523,7 +523,7 @@ public Map> getFireable() for (Role r : this.efsms.keySet()) { //EndpointState s = this.states.get(r); - EFSM fsm = this.efsms.get(r); + EFsm fsm = this.efsms.get(r); switch (fsm.getStateKind()) // Choice subject enabling needed for non-mixed states (mixed states would be needed for async. permutations though) { case OUTPUT: @@ -549,7 +549,7 @@ else if (a.isRequest()) // FIXME: factor out EReq c = (EReq) a; //EndpointState speer = this.states.get(c.peer); - EFSM speer = this.efsms.get(c.peer); + EFsm speer = this.efsms.get(c.peer); //if (speer.getStateKind() == Kind.UNARY_INPUT) { List peeras = speer.getAllFireable(); @@ -586,7 +586,7 @@ else if (a.isClientWrap()) { // FIXME: factor out EClientWrap wc = (EClientWrap) a; - EFSM speer = this.efsms.get(wc.peer); + EFsm speer = this.efsms.get(wc.peer); List peeras = speer.getAllFireable(); for (EAction peera : peeras) { @@ -706,7 +706,7 @@ else if (a.isClientWrap()) // FIXME: factor out EAcc c = (EAcc) a; //EndpointState speer = this.states.get(c.peer); - EFSM speer = this.efsms.get(c.peer); + EFsm speer = this.efsms.get(c.peer); //if (speer.getStateKind() == Kind.OUTPUT) { List peeras = speer.getAllFireable(); @@ -740,7 +740,7 @@ else if (a.isClientWrap()) if (a.isServerWrap()) { EServerWrap ws = (EServerWrap) a; - EFSM speer = this.efsms.get(ws.peer); + EFsm speer = this.efsms.get(ws.peer); { List peeras = speer.getAllFireable(); for (EAction peera : peeras) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index bc27ee85b..5d43bf065 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -25,7 +25,7 @@ import org.scribble.core.job.CoreArgs; import org.scribble.core.model.GraphBuilderUtil; import org.scribble.core.model.ModelFactory; -import org.scribble.core.model.endpoint.EFSM; +import org.scribble.core.model.endpoint.EFsm; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.endpoint.EStateKind; import org.scribble.core.model.endpoint.actions.EAction; @@ -59,7 +59,7 @@ protected void init(SState init) // Do as an initial state rather than config? protected SConfig createInitialSConfig(ModelFactory ef, Map egraphs, boolean explicit) // FIXME: ef { - Map efsms = egraphs.entrySet().stream().collect(Collectors.toMap(Entry::getKey, e -> e.getValue().toFsm())); + Map efsms = egraphs.entrySet().stream().collect(Collectors.toMap(Entry::getKey, e -> e.getValue().toFsm())); SBuffers b0 = new SBuffers(ef, efsms.keySet(), !explicit); //return job.sf.newSConfig(efsms, b0); return this.mf.newSConfig(efsms, b0); @@ -112,7 +112,7 @@ public SGraph buildSGraph(Core core, GProtoName fullname, Map egra // Hacky? // FIXME: factor out and make more robust (e.g. for new state kinds) -- e.g. "hasPayload" in IOAction //EndpointState currstate = curr.config.states.get(r); - EFSM currfsm = curr.config.efsms.get(r); + EFsm currfsm = curr.config.efsms.get(r); EStateKind k = currfsm.getStateKind(); if (k == EStateKind.OUTPUT) { diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index 4543fdf1c..ca806c0d8 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -23,7 +23,7 @@ import org.scribble.core.job.Core; import org.scribble.core.job.CoreArgs; -import org.scribble.core.model.endpoint.EFSM; +import org.scribble.core.model.endpoint.EFsm; import org.scribble.core.model.endpoint.actions.ESend; import org.scribble.core.model.global.actions.SAction; import org.scribble.core.type.name.Role; @@ -161,7 +161,7 @@ protected static Set checkRoleProgress(Map states, while (i.hasNext()) { SState next = states.get(i.next()); - Map tmp = next.config.efsms; + Map tmp = next.config.efsms; for (Role r : tmp.keySet()) { if (ss.get(r) != null) @@ -189,7 +189,7 @@ protected static Set checkRoleProgress(Map states, SState foo = ss.get(r); if (foo != null) { - EFSM tmp = foo.config.efsms.get(r); + EFsm tmp = foo.config.efsms.get(r); if (tmp != null) { if (!foo.config.canSafelyTerminate(r)) From e02156176120419a003ffbb4957272f3b93e4508 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 Apr 2019 12:43:35 +0100 Subject: [PATCH 346/539] [AllTest] Continued: refactoring graph building. --- .../main/java/org/scribble/core/job/Core.java | 2 +- .../scribble/core/model/endpoint/EGraph.java | 27 ++++++++++--------- .../scribble/core/model/global/SGraph.java | 1 + .../core/model/global/SGraphBuilderUtil.java | 1 + .../core/visit/local/EGraphBuilder.java | 1 - .../local/InlinedExtChoiceSubjFixer.java | 2 +- 6 files changed, 18 insertions(+), 16 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index ec4499b86..e2839229e 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -60,7 +60,7 @@ public Core(ModuleName mainFullname, Map args, this.config = newCoreConfig(mainFullname, args); this.context = newCoreContext(//modcs, imeds); // Single instance per Core and should never be shared - this.sgraphb = new SGraphBuilder(this.config.mf);//this.config.mf.newSGraphBuilderUtil(); + this.sgraphb = new SGraphBuilder(this);//this.config.mf.newSGraphBuilderUtil(); } // A Scribble extension should override newCoreConfig/Context/etc as appropriate diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java index ef40b9376..d4d785a2d 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java @@ -32,10 +32,11 @@ public EFsm toFsm() { return new EFsm(this); } - - public String toPml(Role r) + + @Override + public String toDot() { - return this.init.toPml(r); + return this.init.toDot(); } @Override @@ -43,18 +44,23 @@ public String toAut() { return this.init.toAut(); } + + public String toPml(Role r) + { + return this.init.toPml(r); + } @Override - public String toDot() + public String toString() { - return this.init.toDot(); + return this.init.toString(); } @Override public final int hashCode() { int hash = 1051; - hash = 31 * hash + this.init.hashCode(); // FIXME: uses (init) state ID only -- although OK since state IDs globall unique + hash = 31 * hash + this.init.hashCode(); // Use init state only, OK since state IDs globally unique return hash; } @@ -70,12 +76,7 @@ public boolean equals(Object o) return false; } EGraph them = (EGraph) o; - return this.init.equals(them.init);// && this.term.equals(them.term); // N.B. EState.equals checks state ID only, but OK because EStates have globally unique IDs -- any need to do a proper graph equality? - } - - @Override - public String toString() - { - return this.init.toString(); + return this.init.equals(them.init); + // && this.term.equals(them.term); // N.B. EState.equals checks state ID only, but OK because EStates have globally unique IDs -- any need to do a proper graph equality? } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java index bfc72aa82..eb496a138 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java @@ -35,6 +35,7 @@ public class SGraph implements MPrettyPrint public final SState init; public Map states; + // CHECKME: reach only used for termsets? find faster way for termsets? check local types? recursion? private Map> reach; // State ID -> reachable states (not reflexive) private Set> termSets; diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index 5d43bf065..bf51f2138 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -35,6 +35,7 @@ import org.scribble.core.type.name.Role; import org.scribble.util.ScribException; +@Deprecated // CHECKME: refactor to use this public class SGraphBuilderUtil extends GraphBuilderUtil { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 116242b76..e1953c73a 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -60,7 +60,6 @@ public EGraphBuilder(Core core) { this.core = core; this.util = core.config.mf.newEGraphBuilderUtil(); - //this.util.init(null); } public EGraph finalise() diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java index c46f8c478..76a530ade 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java @@ -70,7 +70,7 @@ public Recursion visitRecursion(Recursion n) class InlinedEnablerInferer extends STypeAggNoThrow> - // Optional.empty signifies inference did not succeed, either outright bad (should be caught by WF somewhere) or an "empty" context + // Optional.empty signifies "inference" did not succeed, either an outright bad (should be caught by WF somewhere) or an "empty" context { private Map> recs; From e91624b764e2d639db9cf1ffe5ed2872a928a2c9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 Apr 2019 13:12:48 +0100 Subject: [PATCH 347/539] [AllTest] Continued: refactoring graph building. --- .../main/java/org/scribble/core/job/Core.java | 2 +- .../org/scribble/core/model/ModelFactory.java | 4 +- .../core/model/global/SGraphBuilderUtil.java | 224 +----------------- scribble-test/src/test/scrib/tmp/Test.scr | 2 + 4 files changed, 13 insertions(+), 219 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index e2839229e..1491e468e 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -291,7 +291,7 @@ public SGraph buildSGraph(GProtoName fullname, Map egraphs, verbosePrintln("-- EFSM for " + r + ":\n" + egraphs.get(r).init.toDot()); }*/ - return this.sgraphb.buildSGraph(this, fullname, egraphs, explicit); // CHECKME: factor out util -- ? + return this.sgraphb.buildSGraph(fullname, egraphs, explicit); // CHECKME: factor out util -- ? } // Pre: checkWellFormedness diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java index 7d204602e..948fb192f 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java @@ -20,11 +20,11 @@ import org.scribble.core.model.endpoint.EGraphBuilderUtil; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAcc; +import org.scribble.core.model.endpoint.actions.EClientWrap; import org.scribble.core.model.endpoint.actions.EDisconnect; import org.scribble.core.model.endpoint.actions.ERecv; import org.scribble.core.model.endpoint.actions.EReq; import org.scribble.core.model.endpoint.actions.ESend; -import org.scribble.core.model.endpoint.actions.EClientWrap; import org.scribble.core.model.endpoint.actions.EServerWrap; import org.scribble.core.model.global.SBuffers; import org.scribble.core.model.global.SConfig; @@ -33,11 +33,11 @@ import org.scribble.core.model.global.SModel; import org.scribble.core.model.global.SState; import org.scribble.core.model.global.actions.SAcc; +import org.scribble.core.model.global.actions.SClientWrap; import org.scribble.core.model.global.actions.SDisconnect; import org.scribble.core.model.global.actions.SRecv; import org.scribble.core.model.global.actions.SReq; import org.scribble.core.model.global.actions.SSend; -import org.scribble.core.model.global.actions.SClientWrap; import org.scribble.core.model.global.actions.SServerWrap; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.MsgId; diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index bf51f2138..4651e7770 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -13,236 +13,28 @@ */ package org.scribble.core.model.global; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.stream.Collectors; +import java.util.HashSet; +import java.util.Set; -import org.scribble.core.job.Core; -import org.scribble.core.job.CoreArgs; import org.scribble.core.model.GraphBuilderUtil; import org.scribble.core.model.ModelFactory; -import org.scribble.core.model.endpoint.EFsm; -import org.scribble.core.model.endpoint.EGraph; -import org.scribble.core.model.endpoint.EStateKind; -import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.model.global.actions.SAction; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.GProtoName; -import org.scribble.core.type.name.Role; -import org.scribble.util.ScribException; -@Deprecated // CHECKME: refactor to use this public class SGraphBuilderUtil extends GraphBuilderUtil { - //public final ModelFactory mf; - + private Set states = new HashSet<>(); + public SGraphBuilderUtil(ModelFactory mf) { - //this.mf = sf; super(mf); - ////reset(); - //init(mf.newSState(null)); } - /*// N.B. must be called before every "new visit", including first - //@Override - protected void init(SState init) - { - //init(this.sf.newSState(null), this.sf.newSState(null)); // configs - reset(init, this.mf.newSState(null)); - }*/ - - // Do as an initial state rather than config? - protected SConfig createInitialSConfig(ModelFactory ef, Map egraphs, boolean explicit) // FIXME: ef - { - Map efsms = egraphs.entrySet().stream().collect(Collectors.toMap(Entry::getKey, e -> e.getValue().toFsm())); - SBuffers b0 = new SBuffers(ef, efsms.keySet(), !explicit); - //return job.sf.newSConfig(efsms, b0); - return this.mf.newSConfig(efsms, b0); - } - - // Factory method: not fully integrated with SGraph constructor because of Job arg (debug printing) - // Also checks for non-deterministic payloads - // Maybe refactor into an SGraph builder util; cf., EGraphBuilderUtil -- but not Visitor-based building (cf. EndpointGraphBuilder), this isn't an AST algorithm - //public SGraph buildSGraph(Job job, GProtocolName fullname, SConfig c0) throws ScribbleException - public SGraph buildSGraph(Core core, GProtoName fullname, Map egraphs, boolean explicit) throws ScribException - { - /*Map efsms = egraphs.entrySet().stream().collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().toFsm())); - - SBuffers b0 = new SBuffers(job.ef, efsms.keySet(), !explicit);*/ - - //SConfig c0 = job.sf.newSConfig(efsms, b0); - SConfig c0 = createInitialSConfig(core.config.mf, egraphs, explicit); - - SState init = core.config.mf.newSState(c0); - - Map seen = new HashMap<>(); - LinkedHashSet todo = new LinkedHashSet<>(); - todo.add(init); - - // FIXME: factor out model building and integrate with getAllNodes (seen == all) - int count = 0; - while (!todo.isEmpty()) - { - Iterator i = todo.iterator(); - SState curr = i.next(); - i.remove(); - seen.put(curr.id, curr); - - if (core.config.args.get(CoreArgs.VERBOSE)) - { - count++; - if (count % 50 == 0) - { - core.verbosePrintln("(" + fullname + ") Building global states: " + count); - } - } - - Map> fireable = curr.getFireable(); - - //job.debugPrintln("Acceptable at (" + curr.id + "): " + fireable); - - for (Role r : fireable.keySet()) - { - List fireable_r = fireable.get(r); - - // Hacky? // FIXME: factor out and make more robust (e.g. for new state kinds) -- e.g. "hasPayload" in IOAction - //EndpointState currstate = curr.config.states.get(r); - EFsm currfsm = curr.config.efsms.get(r); - EStateKind k = currfsm.getStateKind(); - if (k == EStateKind.OUTPUT) - { - for (EAction a : fireable_r) // Connect implicitly has no payload (also accept, so skip) - { - if (fireable_r.stream().anyMatch((x) -> - !a.equals(x) && a.peer.equals(x.peer) && a.mid.equals(x.mid) && !a.payload.equals(x.payload))) - { - throw new ScribException("Bad non-deterministic action payloads: " + fireable_r); - } - } - } - else if (k == EStateKind.UNARY_INPUT || k == EStateKind.POLY_INPUT || k == EStateKind.ACCEPT) - { - for (EAction a : fireable_r) - { - if (currfsm.getAllFireable().stream().anyMatch((x) -> - !a.equals(x) && a.peer.equals(x.peer) && a.mid.equals(x.mid) && !a.payload.equals(x.payload))) - { - throw new ScribException("Bad non-deterministic action payloads: " + currfsm.getAllFireable()); - } - } - } - } // Need to do all action payload checking before next building step, because doing sync actions will also remove peer's actions from takeable set - - for (Role r : fireable.keySet()) - { - List fireable_r = fireable.get(r); - - for (EAction a : fireable_r) - { - if (a.isSend() || a.isReceive() || a.isDisconnect()) - { - getNextStates(core.config.mf, todo, seen, curr, - a.toGlobal(r), curr.fire(r, a)); - } - else if (a.isAccept() || a.isRequest()) - { - List as = fireable.get(a.peer); - EAction d = a.toDual(r); - if (as != null && as.contains(d)) - { - as.remove(d); // Removes one occurrence - //getNextStates(seen, todo, curr.sync(r, a, a.peer, d)); - SAction g = (a.isRequest()) - ? a.toGlobal(r) - : d.toGlobal(a.peer); - // Edge will be drawn as the connect, but should be read as the sync. of both -- something like "r1, r2: sync" may be more consistent (or take a set of actions as the edge label) - getNextStates(core.config.mf, todo, seen, curr, g, - curr.sync(r, a, a.peer, d)); - } - } - else if (a.isClientWrap() || a.isServerWrap()) - { - List as = fireable.get(a.peer); - EAction w = a.toDual(r); - if (as != null && as.contains(w)) - { - as.remove(w); // Removes one occurrence - SAction g = (a.isRequest()) - ? a.toGlobal(r) - : w.toGlobal(a.peer); - getNextStates(core.config.mf, todo, seen, curr, g, curr.sync(r, a, a.peer, w)); - } - } - else - { - throw new RuntimeException("Shouldn't get in here: " + a); - } - } - } - } - - SGraph graph = core.config.mf.newSGraph(fullname, seen, init); - - core.verbosePrintln( - "(" + fullname + ") Built global model...\n" + graph.init.toDot() + "\n(" - + fullname + ") ..." + graph.states.size() + " states"); - - return graph; - } - - private void getNextStates(ModelFactory sf, LinkedHashSet todo, - Map seen, SState curr, SAction a, List nexts) + public SState newState(SConfig c) { - for (SConfig next : nexts) - { - SState news = sf.newSState(next); - SState succ = null; - //if (seen.contains(succ)) // FIXME: make a SGraph builder - /*if (seen.containsValue(succ)) - { - for (WFState tmp : seen) - { - if (tmp.equals(succ)) - { - succ = tmp; - } - } - }*/ - for (SState tmp : seen.values()) // Key point: checking "semantically" if model state already created - { - if (tmp.equals(news)) - { - succ = tmp; - } - } - if (succ == null) - { - for (SState tmp : todo) // If state created but not "seen" yet, then it will be "todo" - { - if (tmp.equals(news)) - { - succ = tmp; - } - } - } - if (succ == null) - { - succ = news; - todo.add(succ); - } - //curr.addEdge(a.toGlobal(r), succ); - curr.addEdge(a, succ); // FIXME: make a Builder util, cf. EGraphBuilderUtil - //if (!seen.contains(succ) && !todo.contains(succ)) - /*if (!seen.containsKey(succ.id) && !todo.contains(succ)) - { - todo.add(succ); - }*/ - } + SState s = this.mf.newSState(c); + this.states.add(s); + return s; } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index deb488660..fb672154d 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -102,6 +102,8 @@ module tmp.Test; // choice-specific fairness annotations // fix codegen when -fair +// parser/ast refactoring + // check G/LType casts vs. SType (favour latter) // Test refactoring: // refactor test to use main instead of cli From f32a7eb110a33ebc809355fbed3e1dfa19103db3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 Apr 2019 14:44:41 +0100 Subject: [PATCH 348/539] [AllTest] Continued: refactoring graph building. --- .../core/model/global/SGraphBuilderUtil.java | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index 4651e7770..08bc8d5f6 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -13,8 +13,12 @@ */ package org.scribble.core.model.global; -import java.util.HashSet; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import org.scribble.core.model.GraphBuilderUtil; import org.scribble.core.model.ModelFactory; @@ -24,7 +28,7 @@ public class SGraphBuilderUtil extends GraphBuilderUtil { - private Set states = new HashSet<>(); + private Map states = new HashMap<>(); public SGraphBuilderUtil(ModelFactory mf) { @@ -34,7 +38,31 @@ public SGraphBuilderUtil(ModelFactory mf) public SState newState(SConfig c) { SState s = this.mf.newSState(c); - this.states.add(s); + this.states.put(c, s); return s; } + + // Pre: this.states.containsKey(curr.config) + public Set getSuccs(SState curr, SAction a, List succs) + { + Set res = new LinkedHashSet<>(); + for (SConfig c : succs) + { + if (this.states.containsKey(c)) + { + curr.addEdge(a, this.states.get(c)); + continue; + } + SState s = newState(c); + curr.addEdge(a, s); + res.add(s); + } + return res; + } + + public Map getStates() + { + return this.states.values().stream() + .collect(Collectors.toMap(x -> x.id, x -> x)); + } } From e30c4b4fee1007a46423cb1a66853fe1348d501c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 Apr 2019 14:45:03 +0100 Subject: [PATCH 349/539] [AllTest] Added missing file. --- .../core/model/global/SGraphBuilder.java | 222 ++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java new file mode 100644 index 000000000..46f349f33 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -0,0 +1,222 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.model.global; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import org.scribble.core.job.Core; +import org.scribble.core.job.CoreArgs; +import org.scribble.core.model.endpoint.EFsm; +import org.scribble.core.model.endpoint.EGraph; +import org.scribble.core.model.endpoint.EStateKind; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.model.global.actions.SAction; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.Role; +import org.scribble.util.ScribException; + +public class SGraphBuilder +{ + public final Core core; + + private final SGraphBuilderUtil util; + + public SGraphBuilder(Core core) + { + this.core = core; + this.util = this.core.config.mf.newSGraphBuilderUtil(); + } + + // Do as an initial state rather than config? + protected SConfig createInitialSConfig(Map egraphs, + boolean explicit) + { + Map efsms = egraphs.entrySet().stream() + .collect(Collectors.toMap(Entry::getKey, e -> e.getValue().toFsm())); + SBuffers b0 = new SBuffers(this.core.config.mf, efsms.keySet(), !explicit); + //return job.sf.newSConfig(efsms, b0); + return this.core.config.mf.newSConfig(efsms, b0); + } + + // Factory method: not fully integrated with SGraph constructor because of Job arg (debug printing) + // Also checks for non-deterministic payloads + // Maybe refactor into an SGraph builder util; cf., EGraphBuilderUtil -- but not Visitor-based building (cf. EndpointGraphBuilder), this isn't an AST algorithm + //public SGraph buildSGraph(Job job, GProtocolName fullname, SConfig c0) throws ScribbleException + public SGraph buildSGraph(GProtoName fullname, + Map egraphs, boolean explicit) throws ScribException + // FIXME core not needed + { + SConfig c0 = createInitialSConfig(egraphs, explicit); + + SState init = this.util.newState(c0); + + //Map seen = new HashMap<>(); + LinkedHashSet todo = new LinkedHashSet<>(); + todo.add(init); + + // FIXME: factor out model building and integrate with getAllNodes (seen == all) + int count = 0; + while (!todo.isEmpty()) + { + Iterator i = todo.iterator(); + SState curr = i.next(); + i.remove(); + //seen.put(curr.id, curr); + + if (this.core.config.args.get(CoreArgs.VERBOSE)) + { + count++; + if (count % 50 == 0) + { + this.core.verbosePrintln("(" + fullname + ") Building global states: " + count); + } + } + + Map> fireable = curr.getFireable(); + + //job.debugPrintln("Acceptable at (" + curr.id + "): " + fireable); + + for (Role r : fireable.keySet()) + { + List fireable_r = fireable.get(r); + + // Hacky? // FIXME: factor out and make more robust (e.g. for new state kinds) -- e.g. "hasPayload" in IOAction + //EndpointState currstate = curr.config.states.get(r); + EFsm currfsm = curr.config.efsms.get(r); + EStateKind k = currfsm.getStateKind(); + if (k == EStateKind.OUTPUT) + { + for (EAction a : fireable_r) // Connect implicitly has no payload (also accept, so skip) + { + if (fireable_r.stream().anyMatch((x) -> + !a.equals(x) && a.peer.equals(x.peer) && a.mid.equals(x.mid) && !a.payload.equals(x.payload))) + { + throw new ScribException("Bad non-deterministic action payloads: " + fireable_r); + } + } + } + else if (k == EStateKind.UNARY_INPUT || k == EStateKind.POLY_INPUT || k == EStateKind.ACCEPT) + { + for (EAction a : fireable_r) + { + if (currfsm.getAllFireable().stream().anyMatch((x) -> + !a.equals(x) && a.peer.equals(x.peer) && a.mid.equals(x.mid) && !a.payload.equals(x.payload))) + { + throw new ScribException("Bad non-deterministic action payloads: " + currfsm.getAllFireable()); + } + } + } + } // Need to do all action payload checking before next building step, because doing sync actions will also remove peer's actions from takeable set + + for (Role r : fireable.keySet()) + { + List fireable_r = fireable.get(r); + + for (EAction a : fireable_r) + { + if (a.isSend() || a.isReceive() || a.isDisconnect()) + { + //getNextStates(todo, seen, curr, a.toGlobal(r), curr.fire(r, a)); + todo.addAll( + this.util.getSuccs(curr, a.toGlobal(r), curr.fire(r, a))); + } + else if (a.isAccept() || a.isRequest()) + { + List as = fireable.get(a.peer); + EAction d = a.toDual(r); + if (as != null && as.contains(d)) + { + as.remove(d); // Removes one occurrence + //getNextStates(seen, todo, curr.sync(r, a, a.peer, d)); + SAction g = (a.isRequest()) + ? a.toGlobal(r) + : d.toGlobal(a.peer); + // Edge will be drawn as the connect, but should be read as the sync. of both -- something like "r1, r2: sync" may be more consistent (or take a set of actions as the edge label) + //getNextStates(todo, seen, curr, g, curr.sync(r, a, a.peer, d)); + todo.addAll( + this.util.getSuccs(curr, g, curr.sync(r, a, a.peer, d))); + } + } + else if (a.isClientWrap() || a.isServerWrap()) + { + List as = fireable.get(a.peer); + EAction w = a.toDual(r); + if (as != null && as.contains(w)) + { + as.remove(w); // Removes one occurrence + SAction g = (a.isRequest()) + ? a.toGlobal(r) + : w.toGlobal(a.peer); + //getNextStates(todo, seen, curr, g, curr.sync(r, a, a.peer, w)); + todo.addAll( + this.util.getSuccs(curr, g, curr.sync(r, a, a.peer, w))); + } + } + else + { + throw new RuntimeException("Shouldn't get in here: " + a); + } + } + } + } + + SGraph graph = this.core.config.mf.newSGraph(fullname, + this.util.getStates(), init); + + this.core.verbosePrintln( + "(" + fullname + ") Built global model...\n" + graph.init.toDot() + "\n(" + + fullname + ") ..." + graph.states.size() + " states"); + + return graph; + } + + /*private void getNextStates(LinkedHashSet todo, + Map seen, SState curr, SAction a, List nexts) + { + for (SConfig next : nexts) + { + SState news = this.util.newState(next); + SState succ = null; + for (SState tmp : seen.values()) // Key point: checking "semantically" if model state already created + { + if (tmp.equals(news)) + { + succ = tmp; + } + } + if (succ == null) + { + for (SState tmp : todo) // If state created but not "seen" yet, then it will be "todo" + { + if (tmp.equals(news)) + { + succ = tmp; + } + } + } + if (succ == null) + { + succ = news; + todo.add(succ); + } + curr.addEdge(a, succ); // FIXME: make a Builder util, cf. EGraphBuilderUtil + } + }*/ +} From 35f320ecbf73fbc6e7a3b8bdb4faa27229258036 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 Apr 2019 15:14:14 +0100 Subject: [PATCH 350/539] [AllTest] Continued: refactoring graph building. --- .../scribble/core/model/endpoint/EFsm.java | 20 ++++--- .../scribble/core/model/global/SBuffers.java | 14 ++--- .../scribble/core/model/global/SConfig.java | 26 ++++----- .../core/model/global/SGraphBuilder.java | 57 +++---------------- 4 files changed, 39 insertions(+), 78 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java index b07ec8595..bad38ef9a 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java @@ -35,6 +35,15 @@ protected EFsm(EGraph graph, EState curr) this.curr = curr; } + // CHECKME: Set? List is for non-det actions, but is that relevant to EFsm's? + // Pre: this.curr.getAllFireable().contains(a) ? + public List fireAll(EAction a) + { + return this.curr.getSuccs(a).stream().map(x -> new EFsm(this.graph, x)) + .collect(Collectors.toList()); + } + + // Following are a bunch of wrapper methods to curr // CHECKME: check if unfolded initial accept is possible, and if it breaks anything public boolean isInitial() { @@ -51,19 +60,12 @@ public EStateKind getStateKind() return this.curr.getStateKind(); } - // CHECKME: Set? List is for non-det actions, but is that relevant to EFsm's? - public List fireAll(EAction a) - { - return this.curr.getSuccs(a).stream().map(x -> new EFsm(this.graph, x)) - .collect(Collectors.toList()); - } - - public List getAllFireable() + public List getActions() { return this.curr.getActions(); } - public boolean hasFireable(EAction a) + public boolean hasAction(EAction a) { return this.curr.hasAction(a); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java b/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java index 9e0f62cba..ac4e9478e 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java @@ -36,14 +36,14 @@ public class SBuffers { - private final ModelFactory ef; // FIXME: only used by wrapable -- refactor? + private final ModelFactory mf; // FIXME: only used by wrapable -- refactor? private final Map> connected = new HashMap<>(); private final Map> buffs = new HashMap<>(); // dest -> src -> msg - public SBuffers(ModelFactory ef, Set roles, boolean implicit) + public SBuffers(ModelFactory mf, Set roles, boolean implicit) { - this(ef, roles); + this(mf, roles); if (implicit) { @@ -62,9 +62,9 @@ public SBuffers(ModelFactory ef, Set roles, boolean implicit) } } - public SBuffers(ModelFactory ef, Set roles) + public SBuffers(ModelFactory mf, Set roles) { - this.ef = ef; + this.mf = mf; // FIXME: do the same for connected roles.forEach((k) -> @@ -83,7 +83,7 @@ public SBuffers(ModelFactory ef, Set roles) public SBuffers(SBuffers buffs) { - this.ef = buffs.ef; + this.mf = buffs.mf; Set roles = buffs.buffs.keySet(); roles.forEach((k) -> @@ -274,7 +274,7 @@ public Set wrapable(Role r) { this.connected.keySet().stream() .filter(k -> tmp.containsKey(k) && tmp.get(k)) - .forEach(k -> res.add(this.ef.newEServerWrap(k))); + .forEach(k -> res.add(this.mf.newEServerWrap(k))); } return res; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index 3d868ff05..82029cc6f 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -207,12 +207,12 @@ public Map getStuckMessages() { break; }*/ - Role peer = s.getAllFireable().iterator().next().peer; + Role peer = s.getActions().iterator().next().peer; ESend send = this.buffs.get(r).get(peer); if (send != null) { ERecv recv = send.toDual(peer); - if (!s.hasFireable(recv)) + if (!s.hasAction(recv)) //res.put(r, new IOError(peer)); res.put(r, recv); } @@ -352,7 +352,7 @@ private Set isWaitingFor(Role r) EStateKind k = s.getStateKind(); if (k == EStateKind.UNARY_INPUT || k == EStateKind.POLY_INPUT) { - List all = s.getAllFireable(); + List all = s.getActions(); EAction a = all.get(0); // FIXME: assumes single choice subject (OK for current syntax, but should generalise) /*if (a.isAccept()) // Sound? { @@ -395,7 +395,7 @@ else if (k == EStateKind.ACCEPT) // FIXME TODO: if analysing ACCEPTs, check if s is initial (not "deadlock blocked" if initial) -- no: instead, analysing connects if (!s.isInitial()) { - List all = s.getAllFireable(); // Should be singleton -- no: not any more + List all = s.getActions(); // Should be singleton -- no: not any more /*Set rs = all.stream().map((x) -> x.peer).collect(Collectors.toSet()); if (rs.stream().noneMatch((x) -> this.states.get(x).getAllTakeable().contains(new Connect(r)))) // cf. getTakeable //if (peera.equals(c.toDual(r)) && this.buffs.canConnect(r, c)) @@ -405,7 +405,7 @@ else if (k == EStateKind.ACCEPT) Set res = new HashSet(); for (EAction a : all) // Accept // FIXME: WrapServer { - if (this.efsms.get(a.peer).getAllFireable().contains(a.toDual(r))) + if (this.efsms.get(a.peer).getActions().contains(a.toDual(r))) { return null; } @@ -424,7 +424,7 @@ else if (k == EStateKind.OUTPUT //|| k == Kind.ACCEPT ..// FIXME: check connect //List all = s.getAllAcceptable(); if (s.isConnectOrWrapClientOnly()) { - List all = s.getAllFireable(); + List all = s.getActions(); /*Set peers = all.stream().map((x) -> x.peer).collect(Collectors.toSet()); // Should be singleton by enabling conditions if (peers.stream().noneMatch((p) -> this.states.get(p).getAllTakeable().contains(new Accept(r)))) // cf. getTakeable { @@ -433,7 +433,7 @@ else if (k == EStateKind.OUTPUT //|| k == Kind.ACCEPT ..// FIXME: check connect Set res = new HashSet(); for (EAction a : all) // Connect or WrapClient { - if (this.efsms.get(a.peer).getAllFireable().contains(a.toDual(r))) + if (this.efsms.get(a.peer).getActions().contains(a.toDual(r))) { return null; } @@ -528,7 +528,7 @@ public Map> getFireable() { case OUTPUT: { - List as = fsm.getAllFireable(); + List as = fsm.getActions(); for (EAction a : as) { if (a.isSend()) @@ -552,7 +552,7 @@ else if (a.isRequest()) EFsm speer = this.efsms.get(c.peer); //if (speer.getStateKind() == Kind.UNARY_INPUT) { - List peeras = speer.getAllFireable(); + List peeras = speer.getActions(); for (EAction peera : peeras) { if (peera.equals(c.toDual(r)) && this.buffs.canConnect(r, c)) // Cf. isWaitingFor @@ -587,7 +587,7 @@ else if (a.isClientWrap()) // FIXME: factor out EClientWrap wc = (EClientWrap) a; EFsm speer = this.efsms.get(wc.peer); - List peeras = speer.getAllFireable(); + List peeras = speer.getActions(); for (EAction peera : peeras) { if (peera.equals(wc.toDual(r)) && this.buffs.canWrapClient(r, wc)) // Cf. isWaitingFor @@ -616,7 +616,7 @@ else if (a.isClientWrap()) { if (a.isReceive()) { - if (fsm.hasFireable(a)) + if (fsm.hasAction(a)) { List tmp = res.get(r); if (tmp == null) @@ -709,7 +709,7 @@ else if (a.isClientWrap()) EFsm speer = this.efsms.get(c.peer); //if (speer.getStateKind() == Kind.OUTPUT) { - List peeras = speer.getAllFireable(); + List peeras = speer.getActions(); for (EAction peera : peeras) { if (peera.equals(c.toDual(r)) && this.buffs.canAccept(r, c)) @@ -742,7 +742,7 @@ else if (a.isClientWrap()) EServerWrap ws = (EServerWrap) a; EFsm speer = this.efsms.get(ws.peer); { - List peeras = speer.getAllFireable(); + List peeras = speer.getActions(); for (EAction peera : peeras) { if (peera.equals(ws.toDual(r)) && this.buffs.canWrapServer(r, ws)) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index 46f349f33..1b9142a35 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -13,12 +13,12 @@ */ package org.scribble.core.model.global; -import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import java.util.stream.Collectors; import org.scribble.core.job.Core; @@ -51,7 +51,6 @@ protected SConfig createInitialSConfig(Map egraphs, Map efsms = egraphs.entrySet().stream() .collect(Collectors.toMap(Entry::getKey, e -> e.getValue().toFsm())); SBuffers b0 = new SBuffers(this.core.config.mf, efsms.keySet(), !explicit); - //return job.sf.newSConfig(efsms, b0); return this.core.config.mf.newSConfig(efsms, b0); } @@ -61,51 +60,43 @@ protected SConfig createInitialSConfig(Map egraphs, //public SGraph buildSGraph(Job job, GProtocolName fullname, SConfig c0) throws ScribbleException public SGraph buildSGraph(GProtoName fullname, Map egraphs, boolean explicit) throws ScribException - // FIXME core not needed { SConfig c0 = createInitialSConfig(egraphs, explicit); SState init = this.util.newState(c0); - //Map seen = new HashMap<>(); - LinkedHashSet todo = new LinkedHashSet<>(); + Set todo = new LinkedHashSet<>(); todo.add(init); // FIXME: factor out model building and integrate with getAllNodes (seen == all) - int count = 0; + int count = 1; while (!todo.isEmpty()) { Iterator i = todo.iterator(); SState curr = i.next(); i.remove(); - //seen.put(curr.id, curr); if (this.core.config.args.get(CoreArgs.VERBOSE)) { - count++; - if (count % 50 == 0) + if (count++ % 50 == 0) { this.core.verbosePrintln("(" + fullname + ") Building global states: " + count); } } Map> fireable = curr.getFireable(); - - //job.debugPrintln("Acceptable at (" + curr.id + "): " + fireable); - for (Role r : fireable.keySet()) { List fireable_r = fireable.get(r); // Hacky? // FIXME: factor out and make more robust (e.g. for new state kinds) -- e.g. "hasPayload" in IOAction - //EndpointState currstate = curr.config.states.get(r); EFsm currfsm = curr.config.efsms.get(r); EStateKind k = currfsm.getStateKind(); if (k == EStateKind.OUTPUT) { for (EAction a : fireable_r) // Connect implicitly has no payload (also accept, so skip) { - if (fireable_r.stream().anyMatch((x) -> + if (fireable_r.stream().anyMatch(x -> !a.equals(x) && a.peer.equals(x.peer) && a.mid.equals(x.mid) && !a.payload.equals(x.payload))) { throw new ScribException("Bad non-deterministic action payloads: " + fireable_r); @@ -116,10 +107,11 @@ else if (k == EStateKind.UNARY_INPUT || k == EStateKind.POLY_INPUT || k == EStat { for (EAction a : fireable_r) { - if (currfsm.getAllFireable().stream().anyMatch((x) -> + // curr.getFireable vs currfsm.getAllFireable ? + if (currfsm.getActions().stream().anyMatch(x -> !a.equals(x) && a.peer.equals(x.peer) && a.mid.equals(x.mid) && !a.payload.equals(x.payload))) { - throw new ScribException("Bad non-deterministic action payloads: " + currfsm.getAllFireable()); + throw new ScribException("Bad non-deterministic action payloads: " + currfsm.getActions()); } } } @@ -186,37 +178,4 @@ else if (a.isClientWrap() || a.isServerWrap()) return graph; } - - /*private void getNextStates(LinkedHashSet todo, - Map seen, SState curr, SAction a, List nexts) - { - for (SConfig next : nexts) - { - SState news = this.util.newState(next); - SState succ = null; - for (SState tmp : seen.values()) // Key point: checking "semantically" if model state already created - { - if (tmp.equals(news)) - { - succ = tmp; - } - } - if (succ == null) - { - for (SState tmp : todo) // If state created but not "seen" yet, then it will be "todo" - { - if (tmp.equals(news)) - { - succ = tmp; - } - } - } - if (succ == null) - { - succ = news; - todo.add(succ); - } - curr.addEdge(a, succ); // FIXME: make a Builder util, cf. EGraphBuilderUtil - } - }*/ } From a742a923a2f9c8778ef0151aa09d8032619910dd Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 Apr 2019 17:24:21 +0100 Subject: [PATCH 351/539] [AllTest] Continued: refactoring core model classes. --- .../main/java/org/scribble/core/job/Core.java | 28 ++++++- .../org/scribble/core/job/CoreContext.java | 10 +-- .../scribble/core/lang/local/LProtocol.java | 2 +- .../java/org/scribble/core/model/MState.java | 7 +- .../scribble/core/model/endpoint/EState.java | 50 ++++++++++-- .../core/model/global/SGraphBuilder.java | 33 -------- .../core/model/visit/EdgeVisitor.java | 66 ++++++++++++++++ .../core/model/visit/StateVisitor.java | 47 +++++++++++ .../core/model/visit/local/EStateVisitor.java | 56 ++++++++++++++ .../model/visit/local/NonDetPayChecker.java | 77 +++++++++++++++++++ scribble-test/src/test/scrib/tmp/Test.scr | 5 +- 11 files changed, 326 insertions(+), 55 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/model/visit/EdgeVisitor.java create mode 100644 scribble-core/src/main/java/org/scribble/core/model/visit/StateVisitor.java create mode 100644 scribble-core/src/main/java/org/scribble/core/model/visit/local/EStateVisitor.java create mode 100644 scribble-core/src/main/java/org/scribble/core/model/visit/local/NonDetPayChecker.java diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 1491e468e..3b7638ac4 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -25,8 +25,10 @@ import org.scribble.core.model.ModelFactory; import org.scribble.core.model.ModelFactoryImpl; import org.scribble.core.model.endpoint.EGraph; +import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.global.SGraph; import org.scribble.core.model.global.SGraphBuilder; +import org.scribble.core.model.visit.local.NonDetPayChecker; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.GProtoName; @@ -88,7 +90,8 @@ public void runPasses() throws ScribException runProjectionPasses(); // CHECKME: can try before validation (i.e., including syntactic WF), to promote greater tool feedback? (cf. CommandLine output "barrier") runProjectionSyntaxWfPasses(); runEfsmBuildingPasses(); // Currently, unfair-transform graph building must come after syntactic WF --- TODO fix graph building to prevent crash ? - runModelCheckingPasses(); + runLocalModelCheckingPasses(); + runGlobalModelCheckingPasses(); } // Populates JobContext -- although patten is to do on-demand via (first) getter, so (partially) OK to delay population @@ -241,15 +244,32 @@ protected void runProjectionSyntaxWfPasses() throws ScribException { continue; } - for (Role r : inlined.roles) + for (Role self : inlined.roles) { - LProjection iproj = this.context.getProjectedInlined(fullname, r); + LProjection iproj = this.context.getProjectedInlined(fullname, self); iproj.checkReachability(); } } } - protected void runModelCheckingPasses() throws ScribException + protected void runLocalModelCheckingPasses() throws ScribException + { + for (GProtoName fullname : this.context.getParsedFullnames()) + { + GProtocol inlined = this.context.getInlined(fullname); + if (inlined.isAux()) // CHECKME: also check for aux? e.g., bad.reach.globals.gdo.Test01b + { + continue; + } + for (Role self : inlined.roles) + { + EState init = this.context.getEGraph(fullname, self).init; + init.traverse(new NonDetPayChecker()); + } + } + } + + protected void runGlobalModelCheckingPasses() throws ScribException { verbosePrintPass("Building and checking models from projected inlineds..."); // CHECKME: separate and move model building earlier? // CHECKME: refactor more/whole validation into lang.GProtocol ? diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index 2fd66d390..f597e75bf 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -23,12 +23,14 @@ import org.scribble.core.lang.local.LProjection; import org.scribble.core.model.endpoint.AutGraphParser; import org.scribble.core.model.endpoint.EGraph; +import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.global.SGraph; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.visit.global.GTypeInliner; import org.scribble.core.visit.global.InlinedProjector; +import org.scribble.util.Pair; import org.scribble.util.ScribException; import org.scribble.util.ScribUtil; @@ -239,12 +241,10 @@ public EGraph getUnfairEGraph(LProtoName fullname) EGraph unfair = this.uEGraphs.get(fullname); if (unfair == null) { - unfair = getEGraph(fullname).init - .unfairTransform(this.core.config.mf).toGraph(); + Pair p = getEGraph(fullname).init + .unfairTransform(this.core.config.mf);//.toGraph(); + unfair = new EGraph(p.left, p.right); addUnfairEGraph(fullname, unfair); - - //System.out.println("\nUnfair: " + fullname + "\n" + unfair.toDot()); - } return unfair; } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 5ee41767b..24644967d 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -132,7 +132,7 @@ public EGraph toEGraph(Core core) { //EState s = b.getEntry(); EState s = core.config.mf.newEState(Collections.emptySet()); - return new EGraph(s, s); + return new EGraph(s, s); // TODO: refactor constructor inside mf } EGraphBuilder b = new EGraphBuilder(core); this.def.visitWithNoThrow(b); diff --git a/scribble-core/src/main/java/org/scribble/core/model/MState.java b/scribble-core/src/main/java/org/scribble/core/model/MState.java index 7cd33f142..d44d0d3c7 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/MState.java @@ -33,7 +33,7 @@ public abstract class MState L, // Node label type (cosmetic) A extends MAction, // Edge type S extends MState, // State type - K extends ProtoKind // Global/Local + K extends ProtoKind // Global/Local -- CHECKME: useful? > { private static int count = 1; // A shared index counter for every single MState (and subclass) instance @@ -53,6 +53,7 @@ public MState(Set labs) this.succs = new LinkedList<>(); } + // Mutating setter protected final void addLabel(L lab) { this.labs.add(lab); @@ -63,7 +64,7 @@ public final Set getLabels() return Collections.unmodifiableSet(this.labs); } - // Mutable (can also overwrite edges) + // Mutating setter (can also overwrite edges) protected void addEdge(A a, S s) { /*if (this.equals(s)) @@ -90,7 +91,7 @@ protected void addEdge(A a, S s) this.succs.add(s); } - // Pre: (this, a, s) is a current edge + // Pre: (this, a, s) is a current edge -- mutating setter protected final void removeEdge(A a, S s) //throws ScribException // CHECKME: used? -- cf., Hack? EFSM building on bad-reachability protocols now done before actual reachability check { diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index 24e7729cc..0abeeefe7 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -29,9 +29,12 @@ import org.scribble.core.model.MState; import org.scribble.core.model.ModelFactory; import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.model.visit.local.EStateVisitor; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; +import org.scribble.util.Pair; +import org.scribble.util.ScribException; // Label types used to be both RecVar and SubprotocolSigs; now using inlined protocol for FSM building so just RecVar public class EState extends MPrettyState @@ -41,6 +44,39 @@ public EState(Set labs) super(labs); } + // CHECKME: return + public void traverse(EStateVisitor v) throws ScribException + { + visitState(v); // "visitNode" + + // "visitChildren" + for (Iterator succs = this.succs.iterator(); succs.hasNext(); ) + { + EState succ = succs.next(); + if (!v.hasSeen(succ)) + { + succ.traverse(v); + } + } + } + + protected void visitState(EStateVisitor v) throws ScribException + { + // "visitNode" + EStateKind kind = getStateKind(); + switch (kind) + { + case ACCEPT: v.visitAccept(this); break; + case OUTPUT: v.visitOutput(this); break; + case POLY_INPUT: v.visitPolyInput(this); break; + case SERVER_WRAP: v.visitServerWrap(this); break; + case TERMINAL: v.visitTerminal(this); break; + case UNARY_INPUT: v.visitUnaryInput(this); break; + default: throw new RuntimeException("Unknown state kind: " + kind); + } + } + + // To be overridden by subclasses, to obtain the subclass nodes // CHECKME: remove labs arg, and modify the underlying Set if needed ? protected EState cloneNode(ModelFactory mf, Set labs) @@ -137,7 +173,8 @@ else if (na.equals(a) && ns.equals(succ) && !done) } - /*.. move back to endpointstate ? + /* Returns Pair<>(init, term) + * .. use getallreachable to get subgraph, make a graph clone method .. for each poly output, clone a (non-det) edge to clone of the reachable subgraph with the clone of the current node pruned to this single choice .. be careful of original non-det edges, need to do each separately @@ -145,8 +182,9 @@ else if (na.equals(a) && ns.equals(succ) && !done) .. is it equiv to requiring all roles to see every choice path? except initial accepting roles -- yes .. easier to implement as a direct check on the standard global model, rather than model hacking -- i.e. liveness is not just about terminal sets, but about "branching condition", c.f. julien? .. the issue is connect/accept -- makes direct check a bit more complicated, maybe value in doing it by model hacking to rely on standard liveness checking? - .. should be fine, check set of roles on each path is equal, except for accept-guarded initial roles*/ - public EState unfairTransform(ModelFactory mf) + .. should be fine, check set of roles on each path is equal, except for accept-guarded initial roles + */ + public Pair unfairTransform(ModelFactory mf) { EState init = clone(mf); // All state refs from here on are clones, original Graph unmodified EState term = init.getTerminal(); @@ -176,7 +214,7 @@ public EState unfairTransform(ModelFactory mf) todo.addAll(curr.getSuccs()); } } - return init; + return new Pair<>(init, term); } // N.B. todo alias from unfairTransform -- refactor as return? (slower) @@ -362,11 +400,11 @@ else if (as.size() == 1 && as.get(0).isServerWrap()) } } - // Helper factory method for deriving an EGraph from an arbitary EState (but not the primary way to construct EGraphs; cf., EGraphBuilderUtil) + /*// Helper factory method for deriving an EGraph from an arbitary EState (but not the primary way to construct EGraphs; cf., EGraphBuilderUtil) public EGraph toGraph() { return new EGraph(this, getTerminal()); // Throws exception if >1 terminal; null if no terminal - } + }*/ @Override public Set getReachableStates() // CHECKME: consider a "lazy" version? Maybe as an Iterator or Stream diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index 1b9142a35..e0f051a64 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -25,7 +25,6 @@ import org.scribble.core.job.CoreArgs; import org.scribble.core.model.endpoint.EFsm; import org.scribble.core.model.endpoint.EGraph; -import org.scribble.core.model.endpoint.EStateKind; import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.model.global.actions.SAction; import org.scribble.core.type.name.GProtoName; @@ -85,38 +84,6 @@ public SGraph buildSGraph(GProtoName fullname, } Map> fireable = curr.getFireable(); - for (Role r : fireable.keySet()) - { - List fireable_r = fireable.get(r); - - // Hacky? // FIXME: factor out and make more robust (e.g. for new state kinds) -- e.g. "hasPayload" in IOAction - EFsm currfsm = curr.config.efsms.get(r); - EStateKind k = currfsm.getStateKind(); - if (k == EStateKind.OUTPUT) - { - for (EAction a : fireable_r) // Connect implicitly has no payload (also accept, so skip) - { - if (fireable_r.stream().anyMatch(x -> - !a.equals(x) && a.peer.equals(x.peer) && a.mid.equals(x.mid) && !a.payload.equals(x.payload))) - { - throw new ScribException("Bad non-deterministic action payloads: " + fireable_r); - } - } - } - else if (k == EStateKind.UNARY_INPUT || k == EStateKind.POLY_INPUT || k == EStateKind.ACCEPT) - { - for (EAction a : fireable_r) - { - // curr.getFireable vs currfsm.getAllFireable ? - if (currfsm.getActions().stream().anyMatch(x -> - !a.equals(x) && a.peer.equals(x.peer) && a.mid.equals(x.mid) && !a.payload.equals(x.payload))) - { - throw new ScribException("Bad non-deterministic action payloads: " + currfsm.getActions()); - } - } - } - } // Need to do all action payload checking before next building step, because doing sync actions will also remove peer's actions from takeable set - for (Role r : fireable.keySet()) { List fireable_r = fireable.get(r); diff --git a/scribble-core/src/main/java/org/scribble/core/model/visit/EdgeVisitor.java b/scribble-core/src/main/java/org/scribble/core/model/visit/EdgeVisitor.java new file mode 100644 index 000000000..b4f15b910 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/model/visit/EdgeVisitor.java @@ -0,0 +1,66 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.model.visit; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.scribble.core.model.MAction; +import org.scribble.core.model.MState; +import org.scribble.core.type.kind.ProtoKind; + +public abstract class EdgeVisitor +< + L, + A extends MAction, + S extends MState, + K extends ProtoKind +> +{ + // "One-time" traveral (visitor no for reuse) + private final Map>> seen = new HashMap<>(); + + public boolean hasSeen(S s, A a, S succ) + { + if (!this.seen.containsKey(s)) + { + return false; + } + Map> tmp = this.seen.get(s); + return tmp.containsKey(a) && tmp.get(a).contains(succ); + } + + protected void setSeen(S s, A a, S succ) + { + Map> tmp1 = this.seen.get(s); + if (tmp1 == null) + { + tmp1 = new HashMap<>(); + this.seen.put(s, tmp1); + } + Set tmp2 = tmp1.get(a); + if (tmp2 == null) + { + tmp2 = new HashSet<>(); + tmp1.put(a, tmp2); + } + if (!tmp2.contains(succ)) // Worth? Or just do add + { + tmp2.add(succ); + } + } +} + \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/model/visit/StateVisitor.java b/scribble-core/src/main/java/org/scribble/core/model/visit/StateVisitor.java new file mode 100644 index 000000000..8763ba076 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/model/visit/StateVisitor.java @@ -0,0 +1,47 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.model.visit; + +import java.util.HashSet; +import java.util.Set; + +import org.scribble.core.model.MAction; +import org.scribble.core.model.MState; +import org.scribble.core.type.kind.ProtoKind; + +public abstract class StateVisitor +< + L, + A extends MAction, + S extends MState, + K extends ProtoKind +> +{ + // "One-time" traveral (visitor no for reuse) + private final Set seen = new HashSet<>(); + + public boolean hasSeen(S s) + { + return this.seen.contains(s); + } + + protected void setSeen(S s) + { + //if (!this.seen.contains(s)) // Worth? Or just do add + { + this.seen.add(s); + } + } +} + \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/model/visit/local/EStateVisitor.java b/scribble-core/src/main/java/org/scribble/core/model/visit/local/EStateVisitor.java new file mode 100644 index 000000000..edf5ce3bf --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/model/visit/local/EStateVisitor.java @@ -0,0 +1,56 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.model.visit.local; + +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.model.visit.StateVisitor; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.RecVar; +import org.scribble.util.ScribException; + +public abstract class EStateVisitor + extends StateVisitor +{ + public void visitAccept(EState s) throws ScribException + { + setSeen(s); + } + + public void visitOutput(EState s) throws ScribException + { + setSeen(s); + } + + public void visitPolyInput(EState s) throws ScribException + { + setSeen(s); + } + + public void visitServerWrap(EState s) throws ScribException + { + setSeen(s); + } + + public void visitTerminal(EState s) throws ScribException + { + setSeen(s); + } + + public void visitUnaryInput(EState s) throws ScribException + { + setSeen(s); + } +} + \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/model/visit/local/NonDetPayChecker.java b/scribble-core/src/main/java/org/scribble/core/model/visit/local/NonDetPayChecker.java new file mode 100644 index 000000000..cdcad163f --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/model/visit/local/NonDetPayChecker.java @@ -0,0 +1,77 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.model.visit.local; + +import java.util.List; + +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.util.ScribException; + +public class NonDetPayChecker extends EStateVisitor +{ + + protected void checkNonDetPays(EState s) throws ScribException + { + List as = s.getActions(); + if (as.size() <= 1) + { + return; + } + for (EAction a : as) + { + if (as.stream().anyMatch(x -> x.peer.equals(a.peer) && x.mid.equals(a.mid) + && !x.payload.equals(a.payload))) + { + throw new ScribException( + "Bad non-deterministic action payloads: " + as); + } + } + } + + @Override + public void visitAccept(EState s) throws ScribException + { + super.visitOutput(s); // Does setSeen + checkNonDetPays(s); + } + + @Override + public void visitOutput(EState s) throws ScribException + { + super.visitOutput(s); // Does setSeen + checkNonDetPays(s); + } + + @Override + public void visitPolyInput(EState s) throws ScribException + { + super.visitOutput(s); // Does setSeen + checkNonDetPays(s); + } + + @Override + public void visitServerWrap(EState s) throws ScribException + { + super.visitOutput(s); // Does setSeen + checkNonDetPays(s); + } + + @Override + public void visitUnaryInput(EState s) throws ScribException + { + super.visitOutput(s); // Does setSeen + checkNonDetPays(s); + } +} \ No newline at end of file diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index fb672154d..e67ce95ef 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -114,14 +114,13 @@ data "..." from "..." as T; //* global protocol Proto1(role A, role B) { - 1() from A to B; choice at A { - do Proto1(A, B); + 1() from A to B; } or { - 2() from A to B; + 1(T) from A to B; } } //*/ From 67dd60ae014ec252264274c0b081ea723167653a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 Apr 2019 17:42:00 +0100 Subject: [PATCH 352/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/endpoint/EState.java | 65 +++++++++---------- .../core/model/global/SGraphBuilder.java | 61 ++++++----------- .../core/model/global/SGraphBuilderUtil.java | 2 +- .../model/visit/local/NonDetPayChecker.java | 7 -- 4 files changed, 53 insertions(+), 82 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index 0abeeefe7..e57bef461 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -44,39 +44,6 @@ public EState(Set labs) super(labs); } - // CHECKME: return - public void traverse(EStateVisitor v) throws ScribException - { - visitState(v); // "visitNode" - - // "visitChildren" - for (Iterator succs = this.succs.iterator(); succs.hasNext(); ) - { - EState succ = succs.next(); - if (!v.hasSeen(succ)) - { - succ.traverse(v); - } - } - } - - protected void visitState(EStateVisitor v) throws ScribException - { - // "visitNode" - EStateKind kind = getStateKind(); - switch (kind) - { - case ACCEPT: v.visitAccept(this); break; - case OUTPUT: v.visitOutput(this); break; - case POLY_INPUT: v.visitPolyInput(this); break; - case SERVER_WRAP: v.visitServerWrap(this); break; - case TERMINAL: v.visitTerminal(this); break; - case UNARY_INPUT: v.visitUnaryInput(this); break; - default: throw new RuntimeException("Unknown state kind: " + kind); - } - } - - // To be overridden by subclasses, to obtain the subclass nodes // CHECKME: remove labs arg, and modify the underlying Set if needed ? protected EState cloneNode(ModelFactory mf, Set labs) @@ -363,6 +330,38 @@ && getActions().stream() .allMatch(x -> x.isRequest() || x.isClientWrap()); } + // CHECKME: return + public void traverse(EStateVisitor v) throws ScribException + { + visitState(v); // "visitNode" + + // "visitChildren" + for (Iterator succs = this.succs.iterator(); succs.hasNext(); ) + { + EState succ = succs.next(); + if (!v.hasSeen(succ)) + { + succ.traverse(v); + } + } + } + + protected void visitState(EStateVisitor v) throws ScribException + { + // "visitNode" + EStateKind kind = getStateKind(); // CHECKME: explicitly cache kind in EState? this lookup is slow? + switch (kind) + { + case ACCEPT: v.visitAccept(this); break; + case OUTPUT: v.visitOutput(this); break; + case POLY_INPUT: v.visitPolyInput(this); break; + case SERVER_WRAP: v.visitServerWrap(this); break; + case TERMINAL: v.visitTerminal(this); break; + case UNARY_INPUT: v.visitUnaryInput(this); break; + default: throw new RuntimeException("Unknown state kind: " + kind); + } + } + public EStateKind getStateKind() { List as = this.getActions(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index e0f051a64..3e535a216 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -61,76 +61,57 @@ public SGraph buildSGraph(GProtoName fullname, Map egraphs, boolean explicit) throws ScribException { SConfig c0 = createInitialSConfig(egraphs, explicit); - SState init = this.util.newState(c0); - Set todo = new LinkedHashSet<>(); todo.add(init); // FIXME: factor out model building and integrate with getAllNodes (seen == all) - int count = 1; + int debugCount = 1; while (!todo.isEmpty()) { Iterator i = todo.iterator(); SState curr = i.next(); i.remove(); - if (this.core.config.args.get(CoreArgs.VERBOSE)) { - if (count++ % 50 == 0) + if (debugCount++ % 50 == 0) { - this.core.verbosePrintln("(" + fullname + ") Building global states: " + count); + this.core.verbosePrintln( + "(" + fullname + ") Building global states: " + debugCount); } } Map> fireable = curr.getFireable(); for (Role r : fireable.keySet()) { - List fireable_r = fireable.get(r); - - for (EAction a : fireable_r) + for (EAction a : fireable.get(r)) { + // Asynchronous (input/output) actions if (a.isSend() || a.isReceive() || a.isDisconnect()) { - //getNextStates(todo, seen, curr, a.toGlobal(r), curr.fire(r, a)); - todo.addAll( - this.util.getSuccs(curr, a.toGlobal(r), curr.fire(r, a))); + List next = curr.fire(r, a); + todo.addAll(this.util.getSuccs(curr, a.toGlobal(r), next)); } - else if (a.isAccept() || a.isRequest()) + // Synchronous (client/server) actions + else if (a.isAccept() || a.isRequest() || a.isClientWrap() + || a.isServerWrap()) { List as = fireable.get(a.peer); - EAction d = a.toDual(r); - if (as != null && as.contains(d)) + EAction abar = a.toDual(r); + if (as != null && as.contains(abar)) { - as.remove(d); // Removes one occurrence - //getNextStates(seen, todo, curr.sync(r, a, a.peer, d)); - SAction g = (a.isRequest()) + as.remove(abar); // Removes one occurrence + SAction aglobal = (a.isRequest() || a.isClientWrap()) // "client" side action ? a.toGlobal(r) - : d.toGlobal(a.peer); - // Edge will be drawn as the connect, but should be read as the sync. of both -- something like "r1, r2: sync" may be more consistent (or take a set of actions as the edge label) - //getNextStates(todo, seen, curr, g, curr.sync(r, a, a.peer, d)); - todo.addAll( - this.util.getSuccs(curr, g, curr.sync(r, a, a.peer, d))); - } - } - else if (a.isClientWrap() || a.isServerWrap()) - { - List as = fireable.get(a.peer); - EAction w = a.toDual(r); - if (as != null && as.contains(w)) - { - as.remove(w); // Removes one occurrence - SAction g = (a.isRequest()) - ? a.toGlobal(r) - : w.toGlobal(a.peer); - //getNextStates(todo, seen, curr, g, curr.sync(r, a, a.peer, w)); - todo.addAll( - this.util.getSuccs(curr, g, curr.sync(r, a, a.peer, w))); + : abar.toGlobal(a.peer); + // CHECKME: edge will be drawn as the connect, but should be read as the sync. of both -- something like "r1, r2: sync" may be more consistent (or take a set of actions as the edge label?) + List next = curr.sync(r, a, a.peer, abar); + todo.addAll(this.util.getSuccs(curr, aglobal, next)); } } else { - throw new RuntimeException("Shouldn't get in here: " + a); + throw new RuntimeException("Unknown action type: " + a); } } } @@ -138,11 +119,9 @@ else if (a.isClientWrap() || a.isServerWrap()) SGraph graph = this.core.config.mf.newSGraph(fullname, this.util.getStates(), init); - this.core.verbosePrintln( "(" + fullname + ") Built global model...\n" + graph.init.toDot() + "\n(" + fullname + ") ..." + graph.states.size() + " states"); - return graph; } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index 08bc8d5f6..0b21dd68f 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -45,7 +45,7 @@ public SState newState(SConfig c) // Pre: this.states.containsKey(curr.config) public Set getSuccs(SState curr, SAction a, List succs) { - Set res = new LinkedHashSet<>(); + Set res = new LinkedHashSet<>(); // Takes care of duplicates (o/w should also do "|| res.containsKey(c)" below) for (SConfig c : succs) { if (this.states.containsKey(c)) diff --git a/scribble-core/src/main/java/org/scribble/core/model/visit/local/NonDetPayChecker.java b/scribble-core/src/main/java/org/scribble/core/model/visit/local/NonDetPayChecker.java index cdcad163f..bd14040cd 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/visit/local/NonDetPayChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/model/visit/local/NonDetPayChecker.java @@ -67,11 +67,4 @@ public void visitServerWrap(EState s) throws ScribException super.visitOutput(s); // Does setSeen checkNonDetPays(s); } - - @Override - public void visitUnaryInput(EState s) throws ScribException - { - super.visitOutput(s); // Does setSeen - checkNonDetPays(s); - } } \ No newline at end of file From dfd6cafb609a83bc5b4e57ebd46a164b97d753ed Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 Apr 2019 18:02:16 +0100 Subject: [PATCH 353/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/endpoint/EFsm.java | 9 ++-- .../scribble/core/model/global/SConfig.java | 53 ++++++++++--------- .../core/model/global/SGraphBuilder.java | 9 ++-- .../scribble/core/model/global/SState.java | 4 +- 4 files changed, 40 insertions(+), 35 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java index bad38ef9a..d354667c6 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java @@ -43,14 +43,15 @@ public List fireAll(EAction a) .collect(Collectors.toList()); } - // Following are a bunch of wrapper methods to curr // CHECKME: check if unfolded initial accept is possible, and if it breaks anything + + // Following are a bunch of wrapper methods to curr public boolean isInitial() { return this.curr.equals(this.graph.init); } - public boolean isTerminated() + /*public boolean isTerminated() { return this.curr.isTerminal(); } @@ -70,10 +71,10 @@ public boolean hasAction(EAction a) return this.curr.hasAction(a); } - public boolean isConnectOrWrapClientOnly() + public boolean isRequesttOrClientWrapOnly() { return this.curr.isRequestOrClientWrapOnly(); - } + }*/ @Override public final int hashCode() diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index 82029cc6f..7b2b29b84 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -99,8 +99,10 @@ public boolean canSafelyTerminate(Role r) ;*/ //return !cannotSafelyTerminate; boolean canSafelyTerminate = - (s.isTerminated() && this.buffs.isEmpty(r)) - || (s.getStateKind().equals(EStateKind.ACCEPT) && s.isInitial()) // FIXME: should be empty buffs + (s.curr.isTerminal() && this.buffs.isEmpty(r)) + || (s.curr.getStateKind().equals(EStateKind.ACCEPT) + && s.isInitial()) + // FIXME: should be empty buffs // FIXME: incorrectly allows stuck accepts? if inactive not initial, should be clone of initial? //|| (s.getStateKind().equals(Kind.ACCEPT) && this.states.keySet().stream().noneMatch((rr) -> !r.equals(rr) && this.buffs.isConnected(r, rr))) @@ -108,7 +110,7 @@ public boolean canSafelyTerminate(Role r) return canSafelyTerminate; } - public List fire(Role r, EAction a) + public List async(Role r, EAction a) { List res = new LinkedList<>(); @@ -149,6 +151,7 @@ public List fire(Role r, EAction a) return res; } + // "Synchronous version" of fire public List sync(Role r1, EAction a1, Role r2, EAction a2) { List res = new LinkedList<>(); @@ -196,7 +199,7 @@ public Map getStuckMessages() { //EndpointState s = this.states.get(r); EFsm s = this.efsms.get(r); - EStateKind k = s.getStateKind(); + EStateKind k = s.curr.getStateKind(); if (k == EStateKind.UNARY_INPUT || k == EStateKind.POLY_INPUT) { /*Set duals = this.buffs.get(r).entrySet().stream() @@ -207,12 +210,12 @@ public Map getStuckMessages() { break; }*/ - Role peer = s.getActions().iterator().next().peer; + Role peer = s.curr.getActions().iterator().next().peer; ESend send = this.buffs.get(r).get(peer); if (send != null) { ERecv recv = send.toDual(peer); - if (!s.hasAction(recv)) + if (!s.curr.hasAction(recv)) //res.put(r, new IOError(peer)); res.put(r, recv); } @@ -264,7 +267,7 @@ public Set> getWaitForErrors() { Role r = todo.remove(0); //Set cycle = isCycle(new HashSet<>(), new HashSet<>(Arrays.asList(r))); - if (!this.efsms.get(r).isTerminated()) + if (!this.efsms.get(r).curr.isTerminal()) { Set cycle = isWaitForChain(r); //if (!cycle.isEmpty()) @@ -308,12 +311,12 @@ public Set isWaitForChain(Role orig) System.out.println("AAA: " + this.efsms + ", " + r); } - if (s.getStateKind() == EStateKind.OUTPUT && !s.isConnectOrWrapClientOnly()) // FIXME: includes connect, could still be deadlock? -- no: doesn't include connect any more + if (s.curr.getStateKind() == EStateKind.OUTPUT && !s.curr.isRequestOrClientWrapOnly()) // FIXME: includes connect, could still be deadlock? -- no: doesn't include connect any more { // FIXME: move into isWaitingFor return null; } - if (s.isTerminated()) + if (s.curr.isTerminal()) { if (todo.isEmpty()) { @@ -349,10 +352,10 @@ private Set isWaitingFor(Role r) { //EndpointState s = this.states.get(r); EFsm s = this.efsms.get(r); - EStateKind k = s.getStateKind(); + EStateKind k = s.curr.getStateKind(); if (k == EStateKind.UNARY_INPUT || k == EStateKind.POLY_INPUT) { - List all = s.getActions(); + List all = s.curr.getActions(); EAction a = all.get(0); // FIXME: assumes single choice subject (OK for current syntax, but should generalise) /*if (a.isAccept()) // Sound? { @@ -395,7 +398,7 @@ else if (k == EStateKind.ACCEPT) // FIXME TODO: if analysing ACCEPTs, check if s is initial (not "deadlock blocked" if initial) -- no: instead, analysing connects if (!s.isInitial()) { - List all = s.getActions(); // Should be singleton -- no: not any more + List all = s.curr.getActions(); // Should be singleton -- no: not any more /*Set rs = all.stream().map((x) -> x.peer).collect(Collectors.toSet()); if (rs.stream().noneMatch((x) -> this.states.get(x).getAllTakeable().contains(new Connect(r)))) // cf. getTakeable //if (peera.equals(c.toDual(r)) && this.buffs.canConnect(r, c)) @@ -405,7 +408,7 @@ else if (k == EStateKind.ACCEPT) Set res = new HashSet(); for (EAction a : all) // Accept // FIXME: WrapServer { - if (this.efsms.get(a.peer).getActions().contains(a.toDual(r))) + if (this.efsms.get(a.peer).curr.getActions().contains(a.toDual(r))) { return null; } @@ -422,9 +425,9 @@ else if (k == EStateKind.OUTPUT //|| k == Kind.ACCEPT ..// FIXME: check connect ) { //List all = s.getAllAcceptable(); - if (s.isConnectOrWrapClientOnly()) + if (s.curr.isRequestOrClientWrapOnly()) { - List all = s.getActions(); + List all = s.curr.getActions(); /*Set peers = all.stream().map((x) -> x.peer).collect(Collectors.toSet()); // Should be singleton by enabling conditions if (peers.stream().noneMatch((p) -> this.states.get(p).getAllTakeable().contains(new Accept(r)))) // cf. getTakeable { @@ -433,7 +436,7 @@ else if (k == EStateKind.OUTPUT //|| k == Kind.ACCEPT ..// FIXME: check connect Set res = new HashSet(); for (EAction a : all) // Connect or WrapClient { - if (this.efsms.get(a.peer).getActions().contains(a.toDual(r))) + if (this.efsms.get(a.peer).curr.getActions().contains(a.toDual(r))) { return null; } @@ -457,9 +460,9 @@ public Map> getOrphanMessages() { //EndpointState s = this.states.get(r); EFsm s = this.efsms.get(r); - if (s.isTerminated()) // Local termination of r, i.e. not necessarily "full deadlock" + if (s.curr.isTerminal()) // Local termination of r, i.e. not necessarily "full deadlock" { - Set orphs = this.buffs.get(r).values().stream().filter((v) -> v != null).collect(Collectors.toSet()); + Set orphs = this.buffs.get(r).values().stream().filter(v -> v != null).collect(Collectors.toSet()); if (!orphs.isEmpty()) { Set tmp = res.get(r); @@ -524,11 +527,11 @@ public Map> getFireable() { //EndpointState s = this.states.get(r); EFsm fsm = this.efsms.get(r); - switch (fsm.getStateKind()) // Choice subject enabling needed for non-mixed states (mixed states would be needed for async. permutations though) + switch (fsm.curr.getStateKind()) // Choice subject enabling needed for non-mixed states (mixed states would be needed for async. permutations though) { case OUTPUT: { - List as = fsm.getActions(); + List as = fsm.curr.getActions(); for (EAction a : as) { if (a.isSend()) @@ -552,7 +555,7 @@ else if (a.isRequest()) EFsm speer = this.efsms.get(c.peer); //if (speer.getStateKind() == Kind.UNARY_INPUT) { - List peeras = speer.getActions(); + List peeras = speer.curr.getActions(); for (EAction peera : peeras) { if (peera.equals(c.toDual(r)) && this.buffs.canConnect(r, c)) // Cf. isWaitingFor @@ -587,7 +590,7 @@ else if (a.isClientWrap()) // FIXME: factor out EClientWrap wc = (EClientWrap) a; EFsm speer = this.efsms.get(wc.peer); - List peeras = speer.getActions(); + List peeras = speer.curr.getActions(); for (EAction peera : peeras) { if (peera.equals(wc.toDual(r)) && this.buffs.canWrapClient(r, wc)) // Cf. isWaitingFor @@ -616,7 +619,7 @@ else if (a.isClientWrap()) { if (a.isReceive()) { - if (fsm.hasAction(a)) + if (fsm.curr.hasAction(a)) { List tmp = res.get(r); if (tmp == null) @@ -709,7 +712,7 @@ else if (a.isClientWrap()) EFsm speer = this.efsms.get(c.peer); //if (speer.getStateKind() == Kind.OUTPUT) { - List peeras = speer.getActions(); + List peeras = speer.curr.getActions(); for (EAction peera : peeras) { if (peera.equals(c.toDual(r)) && this.buffs.canAccept(r, c)) @@ -742,7 +745,7 @@ else if (a.isClientWrap()) EServerWrap ws = (EServerWrap) a; EFsm speer = this.efsms.get(ws.peer); { - List peeras = speer.getActions(); + List peeras = speer.curr.getActions(); for (EAction peera : peeras) { if (peera.equals(ws.toDual(r)) && this.buffs.canWrapServer(r, ws)) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index 3e535a216..6d3d1c859 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -80,8 +80,9 @@ public SGraph buildSGraph(GProtoName fullname, "(" + fullname + ") Building global states: " + debugCount); } } - - Map> fireable = curr.getFireable(); + + // Based on config semantics, not "static" graph edges (cf., super.getActions) -- used to build global model graph + Map> fireable = curr.config.getFireable(); for (Role r : fireable.keySet()) { for (EAction a : fireable.get(r)) @@ -89,7 +90,7 @@ public SGraph buildSGraph(GProtoName fullname, // Asynchronous (input/output) actions if (a.isSend() || a.isReceive() || a.isDisconnect()) { - List next = curr.fire(r, a); + List next = curr.config.async(r, a); todo.addAll(this.util.getSuccs(curr, a.toGlobal(r), next)); } // Synchronous (client/server) actions @@ -105,7 +106,7 @@ else if (a.isAccept() || a.isRequest() || a.isClientWrap() ? a.toGlobal(r) : abar.toGlobal(a.peer); // CHECKME: edge will be drawn as the connect, but should be read as the sync. of both -- something like "r1, r2: sync" may be more consistent (or take a set of actions as the edge label?) - List next = curr.sync(r, a, a.peer, abar); + List next = curr.config.sync(r, a, a.peer, abar); todo.addAll(this.util.getSuccs(curr, aglobal, next)); } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java index 522f59989..f877e227e 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java @@ -47,7 +47,7 @@ protected void addEdge(SAction a, SState s) // For access from SGraphBuilderUti super.addEdge(a, s); } - // Based on config semantics, not "static" graph edges (cf., super.getAllActions) -- used to build global model graph + /*// Based on config semantics, not "static" graph edges (cf., super.getAllActions) -- used to build global model graph public Map> getFireable() { return this.config.getFireable(); @@ -62,7 +62,7 @@ public List fire(Role r, EAction a) public List sync(Role r1, EAction a1, Role r2, EAction a2) { return this.config.sync(r1, a1, r2, a2); - } + }*/ public SStateErrors getErrors() { From 8cef6e88fb3ff856f190c080fa6b7ff5d2a660db Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 Apr 2019 18:10:06 +0100 Subject: [PATCH 354/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/ModelFactoryImpl.java | 39 +++++------ .../scribble/core/model/endpoint/EFsm.java | 67 ++++++++++++------- .../scribble/core/model/global/SConfig.java | 2 +- .../scribble/core/model/global/SState.java | 57 +++++++++------- 4 files changed, 95 insertions(+), 70 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java index 31459b0b8..6a9e8f9f8 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java @@ -20,11 +20,11 @@ import org.scribble.core.model.endpoint.EGraphBuilderUtil; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAcc; +import org.scribble.core.model.endpoint.actions.EClientWrap; import org.scribble.core.model.endpoint.actions.EDisconnect; import org.scribble.core.model.endpoint.actions.ERecv; import org.scribble.core.model.endpoint.actions.EReq; import org.scribble.core.model.endpoint.actions.ESend; -import org.scribble.core.model.endpoint.actions.EClientWrap; import org.scribble.core.model.endpoint.actions.EServerWrap; import org.scribble.core.model.global.SBuffers; import org.scribble.core.model.global.SConfig; @@ -33,11 +33,11 @@ import org.scribble.core.model.global.SModel; import org.scribble.core.model.global.SState; import org.scribble.core.model.global.actions.SAcc; +import org.scribble.core.model.global.actions.SClientWrap; import org.scribble.core.model.global.actions.SDisconnect; import org.scribble.core.model.global.actions.SRecv; import org.scribble.core.model.global.actions.SReq; import org.scribble.core.model.global.actions.SSend; -import org.scribble.core.model.global.actions.SClientWrap; import org.scribble.core.model.global.actions.SServerWrap; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.MsgId; @@ -56,27 +56,27 @@ public EGraphBuilderUtil newEGraphBuilderUtil() } @Override - public ESend newESend(Role peer, MsgId mid, Payload payload) + public ESend newESend(Role peer, MsgId mid, Payload pay) { - return new ESend(this, peer, mid, payload); + return new ESend(this, peer, mid, pay); } @Override - public ERecv newERecv(Role peer, MsgId mid, Payload payload) + public ERecv newERecv(Role peer, MsgId mid, Payload pay) { - return new ERecv(this, peer, mid, payload); + return new ERecv(this, peer, mid, pay); } @Override - public EReq newEReq(Role peer, MsgId mid, Payload payload) + public EReq newEReq(Role peer, MsgId mid, Payload pay) { - return new EReq(this, peer, mid, payload); + return new EReq(this, peer, mid, pay); } @Override - public EAcc newEAcc(Role peer, MsgId mid, Payload payload) + public EAcc newEAcc(Role peer, MsgId mid, Payload pay) { - return new EAcc(this, peer, mid, payload); + return new EAcc(this, peer, mid, pay); } @Override @@ -110,27 +110,27 @@ public SGraphBuilderUtil newSGraphBuilderUtil() } @Override - public SSend newSSend(Role subj, Role obj, MsgId mid, Payload payload) + public SSend newSSend(Role subj, Role obj, MsgId mid, Payload pay) { - return new SSend(subj, obj, mid, payload); + return new SSend(subj, obj, mid, pay); } @Override - public SRecv newSRecv(Role subj, Role obj, MsgId mid, Payload payload) + public SRecv newSRecv(Role subj, Role obj, MsgId mid, Payload pay) { - return new SRecv(subj, obj, mid, payload); + return new SRecv(subj, obj, mid, pay); } @Override - public SReq newSReq(Role subj, Role obj, MsgId mid, Payload payload) + public SReq newSReq(Role subj, Role obj, MsgId mid, Payload pay) { - return new SReq(subj, obj, mid, payload); + return new SReq(subj, obj, mid, pay); } @Override - public SAcc newSAcc(Role subj, Role obj, MsgId mid, Payload payload) + public SAcc newSAcc(Role subj, Role obj, MsgId mid, Payload pay) { - return new SAcc(subj, obj, mid, payload); + return new SAcc(subj, obj, mid, pay); } @Override @@ -158,7 +158,8 @@ public SState newSState(SConfig config) } @Override - public SGraph newSGraph(GProtoName proto, Map states, SState init) + public SGraph newSGraph(GProtoName proto, Map states, + SState init) { return new SGraph(proto, states, init); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java index d354667c6..11434cf36 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java @@ -35,7 +35,7 @@ protected EFsm(EGraph graph, EState curr) this.curr = curr; } - // CHECKME: Set? List is for non-det actions, but is that relevant to EFsm's? + // CHECKME: Set? List is for non-det actions, but is that relevant to EFsm's? // Pre: this.curr.getAllFireable().contains(a) ? public List fireAll(EAction a) { @@ -50,31 +50,6 @@ public boolean isInitial() { return this.curr.equals(this.graph.init); } - - /*public boolean isTerminated() - { - return this.curr.isTerminal(); - } - - public EStateKind getStateKind() - { - return this.curr.getStateKind(); - } - - public List getActions() - { - return this.curr.getActions(); - } - - public boolean hasAction(EAction a) - { - return this.curr.hasAction(a); - } - - public boolean isRequesttOrClientWrapOnly() - { - return this.curr.isRequestOrClientWrapOnly(); - }*/ @Override public final int hashCode() @@ -106,3 +81,43 @@ public String toString() return Integer.toString(this.curr.id); } } + + + + + + + + + + + + + + + + + /*public boolean isTerminated() + { + return this.curr.isTerminal(); + } + + public EStateKind getStateKind() + { + return this.curr.getStateKind(); + } + + public List getActions() + { + return this.curr.getActions(); + } + + public boolean hasAction(EAction a) + { + return this.curr.hasAction(a); + } + + public boolean isRequesttOrClientWrapOnly() + { + return this.curr.isRequestOrClientWrapOnly(); + }*/ diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index 7b2b29b84..5537f41f8 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -42,7 +42,6 @@ public class SConfig { protected final ModelFactory mf; - //public final Map states; public final Map efsms; public final SBuffers buffs; @@ -520,6 +519,7 @@ public Map getUnfinishedRoles() return res; } + // Based on config semantics, not "static" graph edges (cf., super.getAllActions) -- used to build global model graph public Map> getFireable() { Map> res = new HashMap<>(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java index f877e227e..404d8c237 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java @@ -14,14 +14,12 @@ package org.scribble.core.model.global; import java.util.Collections; -import java.util.List; import java.util.Map; import java.util.Set; import org.scribble.core.model.MPrettyState; import org.scribble.core.model.MState; import org.scribble.core.model.endpoint.EState; -import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.model.endpoint.actions.ERecv; import org.scribble.core.model.endpoint.actions.ESend; import org.scribble.core.model.global.actions.SAction; @@ -41,34 +39,17 @@ public SState(SConfig config) // FIXME: now publically mutable this.config = config; } + // For access from SGraphBuilderUtil @Override - protected void addEdge(SAction a, SState s) // For access from SGraphBuilderUtil + protected void addEdge(SAction a, SState s) { super.addEdge(a, s); } - /*// Based on config semantics, not "static" graph edges (cf., super.getAllActions) -- used to build global model graph - public Map> getFireable() - { - return this.config.getFireable(); - } - - public List fire(Role r, EAction a) - { - return this.config.fire(r, a); - } - - // "Synchronous version" of fire - public List sync(Role r1, EAction a1, Role r2, EAction a2) - { - return this.config.sync(r1, a1, r2, a2); - }*/ - public SStateErrors getErrors() { Map stuck = this.config.getStuckMessages(); Set> waitfor = this.config.getWaitForErrors(); - //Set> waitfor = Collections.emptySet(); Map> orphs = this.config.getOrphanMessages(); Map unfinished = this.config.getUnfinishedRoles(); return new SStateErrors(stuck, waitfor, orphs, unfinished); @@ -87,12 +68,11 @@ public Set getReachableStates() return getReachableStatesAux(this); } - // FIXME? doesn't use super.hashCode (cf., equals) + // N.B. does not use super.hashCode, need "semantic" equality of configs for model construction @Override public int hashCode() { int hash = 79; - //int hash = super.hashCode(); hash = 31 * hash + this.config.hashCode(); return hash; } @@ -111,7 +91,8 @@ public boolean equals(Object o) { return false; } - return ((SState) o).canEquals(this) && this.config.equals(((SState) o).config); + SState them = (SState) o; + return them.canEquals(this) && this.config.equals(them.config); // N.B. does not do super.equals (cf. hashCode) } @Override @@ -126,3 +107,31 @@ public String toString() return this.id + ":" + this.config.toString(); } } + + + + + + + + + + + + + /*// Based on config semantics, not "static" graph edges (cf., super.getAllActions) -- used to build global model graph + public Map> getFireable() + { + return this.config.getFireable(); + } + + public List fire(Role r, EAction a) + { + return this.config.fire(r, a); + } + + // "Synchronous version" of fire + public List sync(Role r1, EAction a1, Role r2, EAction a2) + { + return this.config.sync(r1, a1, r2, a2); + }*/ \ No newline at end of file From f05c6d21f8429f5e078217bbbaf7b394d33479a5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 Apr 2019 19:23:47 +0100 Subject: [PATCH 355/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/global/SConfig.java | 345 +++++++----------- .../core/model/global/SGraphBuilder.java | 2 +- .../scribble/core/model/global/SState.java | 4 +- scribble-test/src/test/scrib/tmp/Test.scr | 23 +- 4 files changed, 145 insertions(+), 229 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index 5537f41f8..efb61b55c 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -525,256 +525,165 @@ public Map> getFireable() Map> res = new HashMap<>(); for (Role r : this.efsms.keySet()) { - //EndpointState s = this.states.get(r); EFsm fsm = this.efsms.get(r); + List as = new LinkedList<>(); switch (fsm.curr.getStateKind()) // Choice subject enabling needed for non-mixed states (mixed states would be needed for async. permutations though) { - case OUTPUT: - { - List as = fsm.curr.getActions(); - for (EAction a : as) - { - if (a.isSend()) - { - if (this.buffs.canSend(r, (ESend) a)) - { - List tmp = res.get(r); // FIXME: factor out - if (tmp == null) - { - tmp = new LinkedList<>(); - res.put(r, tmp); - } - tmp.add(a); - } - } - else if (a.isRequest()) - { - // FIXME: factor out - EReq c = (EReq) a; - //EndpointState speer = this.states.get(c.peer); - EFsm speer = this.efsms.get(c.peer); - //if (speer.getStateKind() == Kind.UNARY_INPUT) - { - List peeras = speer.curr.getActions(); - for (EAction peera : peeras) - { - if (peera.equals(c.toDual(r)) && this.buffs.canConnect(r, c)) // Cf. isWaitingFor - { - List tmp = res.get(r); - if (tmp == null) - { - tmp = new LinkedList<>(); - res.put(r, tmp); - } - tmp.add(a); - } - } - } - } - else if (a.isDisconnect()) - { - // Duplicated from Send - if (this.buffs.canDisconnect(r, (EDisconnect) a)) - { - List tmp = res.get(r); // FIXME: factor out - if (tmp == null) - { - tmp = new LinkedList<>(); - res.put(r, tmp); - } - tmp.add(a); - } - } - else if (a.isClientWrap()) - { - // FIXME: factor out - EClientWrap wc = (EClientWrap) a; - EFsm speer = this.efsms.get(wc.peer); - List peeras = speer.curr.getActions(); - for (EAction peera : peeras) - { - if (peera.equals(wc.toDual(r)) && this.buffs.canWrapClient(r, wc)) // Cf. isWaitingFor - { - List tmp = res.get(r); - if (tmp == null) - { - tmp = new LinkedList<>(); - res.put(r, tmp); - } - tmp.add(a); - } - } - } - else - { - throw new RuntimeException("Shouldn't get in here: " + a); - } - } - break; - } + // Currently not convenient to delegate to states, as state types not distinguished + case TERMINAL: break; + case OUTPUT: as = getOutputFireable(r, fsm); break; case UNARY_INPUT: case POLY_INPUT: - { - for (EAction a : this.buffs.inputable(r)) - { - if (a.isReceive()) - { - if (fsm.curr.hasAction(a)) - { - List tmp = res.get(r); - if (tmp == null) - { - tmp = new LinkedList<>(); - res.put(r, tmp); - } - tmp.add(a); - } - } - /*else if (a.isAccept()) - { - // FIXME: factor out - Accept c = (Accept) a; - EndpointState speer = this.states.get(c.peer); - //if (speer.getStateKind() == Kind.OUTPUT) - { - List peeras = speer.getAllAcceptable(); - for (IOAction peera : peeras) - { - if (peera.equals(c.toDual(r)) && this.buffs.canAccept(r, c)) - { - List tmp = res.get(r); - if (tmp == null) - { - tmp = new LinkedList<>(); - res.put(r, tmp); - } - tmp.add(a); - //break; // Add all of them - } - } - } - }*/ - else - { - throw new RuntimeException("Shouldn't get in here: " + a); - } - } + getInputFireable(res, r, fsm); break; + case ACCEPT: getAcceptFireable(res, r, fsm); break; + case SERVER_WRAP: getServerWrapFireable(res, r); break; + default: throw new RuntimeException("Unknown state kind: " + fsm); + } + if (!as.isEmpty()) // Guards res.put against empty "as", but maybe unnecessary + { + List tmp = res.get(r); + if (tmp == null) + { + res.put(r, as); } - case TERMINAL: + else { - break; + tmp.addAll(as); + } + } + } + return res; + } + + private List getOutputFireable(Role r, EFsm fsm) + { + List res = new LinkedList<>(); + for (EAction a : fsm.curr.getActions()) + { + // Async + if (a.isSend() || a.isDisconnect()) + { + if ((a.isSend() && this.buffs.canSend(r, (ESend) a)) + || (a.isDisconnect() && this.buffs.canDisconnect(r, (EDisconnect) a))) + { + res.add(a); } - /*case CONNECT: + } + // Sync + else if (a.isRequest() || a.isClientWrap()) + { + if ((a.isRequest() && this.buffs.canConnect(r, (EReq) a)) + || (a.isClientWrap() && this.buffs.canWrapClient(r, (EClientWrap) a))) // Cf. isWaitingFor { - List as = s.getAllTakeable(); - for (IOAction a : as) + for (EAction peera : this.efsms.get(a.peer).curr.getActions()) { - if (a.isConnect()) ..// FIXME: could be send actions + if (peera.equals(a.toDual(r))) { - // FIXME: factor out - Connect c = (Connect) a; - EndpointState speer = this.states.get(c.peer); - //if (speer.getStateKind() == Kind.UNARY_INPUT) - { - List peeras = speer.getAllTakeable(); - for (IOAction peera : peeras) - { - if (peera.equals(c.toDual(r)) && this.buffs.canConnect(r, c)) - { - List tmp = res.get(r); - if (tmp == null) - { - tmp = new LinkedList<>(); - res.put(r, tmp); - } - tmp.add(a); - } - } - } + res.add(a); } - else - { - throw new RuntimeException("Shouldn't get in here: " + s); - } } - break; - }*/ - case ACCEPT: + } + } + else + { + throw new RuntimeException("Unknown output action kind: " + a); + } + } + return res; + } + + // Unary or poly input + private void getInputFireable(Map> res, Role r, EFsm fsm) + { + for (EAction a : this.buffs.inputable(r)) + { + if (a.isReceive()) + { + if (fsm.curr.hasAction(a)) + { + List tmp = res.get(r); + if (tmp == null) + { + tmp = new LinkedList<>(); + res.put(r, tmp); + } + tmp.add(a); + } + } + else + { + throw new RuntimeException("Shouldn't get in here: " + a); + } + } + } + + private void getAcceptFireable(Map> res, Role r, EFsm fsm) + { + for (EAction a : this.buffs.acceptable(r, fsm.curr)) + { + if (a.isAccept()) + { + // FIXME: factor out + EAcc c = (EAcc) a; + //EndpointState speer = this.states.get(c.peer); + EFsm speer = this.efsms.get(c.peer); + //if (speer.getStateKind() == Kind.OUTPUT) { - for (EAction a : this.buffs.acceptable(r, fsm.curr)) + List peeras = speer.curr.getActions(); + for (EAction peera : peeras) { - if (a.isAccept()) + if (peera.equals(c.toDual(r)) && this.buffs.canAccept(r, c)) { - // FIXME: factor out - EAcc c = (EAcc) a; - //EndpointState speer = this.states.get(c.peer); - EFsm speer = this.efsms.get(c.peer); - //if (speer.getStateKind() == Kind.OUTPUT) + List tmp = res.get(r); + if (tmp == null) { - List peeras = speer.curr.getActions(); - for (EAction peera : peeras) - { - if (peera.equals(c.toDual(r)) && this.buffs.canAccept(r, c)) - { - List tmp = res.get(r); - if (tmp == null) - { - tmp = new LinkedList<>(); - res.put(r, tmp); - } - tmp.add(a); - //break; // Add all of them - } - } + tmp = new LinkedList<>(); + res.put(r, tmp); } - } - else - { - throw new RuntimeException("Shouldn't get in here: " + a); + tmp.add(a); + //break; // Add all of them } } - break; } - case SERVER_WRAP: + } + else + { + throw new RuntimeException("Shouldn't get in here: " + a); + } + } + } + + private void getServerWrapFireable(Map> res, Role r) + { + for (EAction a : this.buffs.wrapable(r)) + { + if (a.isServerWrap()) + { + EServerWrap ws = (EServerWrap) a; + EFsm speer = this.efsms.get(ws.peer); { - for (EAction a : this.buffs.wrapable(r)) + List peeras = speer.curr.getActions(); + for (EAction peera : peeras) { - if (a.isServerWrap()) + if (peera.equals(ws.toDual(r)) && this.buffs.canWrapServer(r, ws)) { - EServerWrap ws = (EServerWrap) a; - EFsm speer = this.efsms.get(ws.peer); + List tmp = res.get(r); + if (tmp == null) { - List peeras = speer.curr.getActions(); - for (EAction peera : peeras) - { - if (peera.equals(ws.toDual(r)) && this.buffs.canWrapServer(r, ws)) - { - List tmp = res.get(r); - if (tmp == null) - { - tmp = new LinkedList<>(); - res.put(r, tmp); - } - tmp.add(a); - } - } + tmp = new LinkedList<>(); + res.put(r, tmp); } - } - else - { - throw new RuntimeException("Shouldn't get in here: " + a); + tmp.add(a); } } - break; - } - default: - { - throw new RuntimeException("Shouldn't get in here: " + fsm); } } + else + { + throw new RuntimeException("Shouldn't get in here: " + a); + } } - return res; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index 6d3d1c859..f3a189264 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -112,7 +112,7 @@ else if (a.isAccept() || a.isRequest() || a.isClientWrap() } else { - throw new RuntimeException("Unknown action type: " + a); + throw new RuntimeException("Unknown action kind: " + a); } } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java index 404d8c237..4a63dc869 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java @@ -26,8 +26,8 @@ import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.Role; -// FIXME? make a WFModel front-end class? (cf. EGraph) -// Only uses MState.id cosmetically, cf. MState equals/hash -- overrides equals/hash based on this.config (maybe extending MState is a bit misleading) +// CHECKME: make a WFModel front-end class? (cf. EGraph) +// N.B. only uses MState.id cosmetically, cf. MState equals/hashCode -- overrides equals/hashCode based on this.config (maybe extending MState is a bit misleading) public class SState extends MPrettyState { public final SConfig config; diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index e67ce95ef..7f560e219 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -112,15 +112,22 @@ module tmp.Test; data "..." from "..." as T; //* -global protocol Proto1(role A, role B) +explicit global protocol Proto1(role A, role B, role C) { - choice at A - { - 1() from A to B; - } - or - { - 1(T) from A to B; + connect A to B; + rec X + { + choice at A + { + 1() from A to B; + continue X; + } + or + { + 2() from A to B; + connect A to C; + 3() from C to A; + } } } //*/ From 83d02b704b8b242a381c89e2a1a5d7cb4e79cac3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 Apr 2019 19:25:24 +0100 Subject: [PATCH 356/539] [AllTest] Minor. --- .../java/org/scribble/core/model/global/SConfig.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index efb61b55c..e27e6faf9 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -540,17 +540,9 @@ public Map> getFireable() case SERVER_WRAP: getServerWrapFireable(res, r); break; default: throw new RuntimeException("Unknown state kind: " + fsm); } - if (!as.isEmpty()) // Guards res.put against empty "as", but maybe unnecessary + if (!as.isEmpty()) // Guards against res.put for empty "as", but perhaps unnecessary? { - List tmp = res.get(r); - if (tmp == null) - { - res.put(r, as); - } - else - { - tmp.addAll(as); - } + res.put(r, as); } } return res; From 3299d2aeca45ced8ce1722b28da23e045379b7ac Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 Apr 2019 20:06:30 +0100 Subject: [PATCH 357/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/global/SBuffers.java | 18 ++-- .../scribble/core/model/global/SConfig.java | 100 +++++------------- 2 files changed, 36 insertions(+), 82 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java b/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java index ac4e9478e..a8cbcdcaa 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java @@ -156,7 +156,7 @@ public boolean canWrapClient(Role self, EClientWrap wc) return isConnected(self, wc.peer); } - public boolean canWrapServer(Role self, EServerWrap ws) + public boolean canServerWrap(Role self, EServerWrap ws) { return isConnected(self, ws.peer); } @@ -209,14 +209,14 @@ public SBuffers send(Role self, ESend a) }*/ //public Set receivable(Role r) - public Set inputable(Role r) // FIXME: IAction // FIXME: OAction version? + public Set getInputable(Role r) // FIXME: IAction // FIXME: OAction version? { /*Map tmp = this.connected.get(r); if (tmp == null) { return Collections.emptySet(); // Not needed, guarded by state kind }*/ - Set res = this.buffs.get(r).entrySet().stream() + Set res = this.buffs.get(r).entrySet().stream() .filter(e -> e.getValue() != null) .map(e -> e.getValue().toDual(e.getKey())) .collect(Collectors.toSet()); @@ -236,9 +236,9 @@ public Set inputable(Role r) // FIXME: IAction // FIXME: OAction ver //public Set acceptable(Role r) // Means connection accept actions // Pre: curr is Accept state, r is accept peer - public Set acceptable(Role r, EState curr) // Means connection accept actions + public Set getAcceptable(Role r, EState curr) // Means connection accept actions { - Set res = new HashSet<>(); + Set res = new HashSet<>(); Map tmp = this.connected.get(r); /*if (tmp == null) { @@ -252,11 +252,11 @@ public Set acceptable(Role r, EState curr) // Means connection accept }*/ if (tmp != null) { - Boolean b = tmp.get(r); + /*Boolean b = tmp.get(r); // r connected to r ??? if (b != null && b) { return res; - } + }*/ } List as = curr.getActions(); for (EAction a : as) @@ -266,9 +266,9 @@ public Set acceptable(Role r, EState curr) // Means connection accept return res; } - public Set wrapable(Role r) + public Set getWrapable(Role r) { - Set res = new HashSet<>(); + Set res = new HashSet<>(); Map tmp = this.connected.get(r); if (tmp != null) { diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index e27e6faf9..b9a3c7b3d 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -533,11 +533,11 @@ public Map> getFireable() case TERMINAL: break; case OUTPUT: as = getOutputFireable(r, fsm); break; case UNARY_INPUT: - case POLY_INPUT: - getInputFireable(res, r, fsm); + case POLY_INPUT: + as.addAll(getInputFireable(r, fsm)); // addAll for generic typing break; - case ACCEPT: getAcceptFireable(res, r, fsm); break; - case SERVER_WRAP: getServerWrapFireable(res, r); break; + case ACCEPT: as.addAll(getAcceptFireable(r, fsm)); break; + case SERVER_WRAP: as.addAll(getServerWrapFireable(r)); break; default: throw new RuntimeException("Unknown state kind: " + fsm); } if (!as.isEmpty()) // Guards against res.put for empty "as", but perhaps unnecessary? @@ -570,7 +570,7 @@ else if (a.isRequest() || a.isClientWrap()) { for (EAction peera : this.efsms.get(a.peer).curr.getActions()) { - if (peera.equals(a.toDual(r))) + if (a.toDual(r).equals(peera)) { res.add(a); } @@ -585,97 +585,51 @@ else if (a.isRequest() || a.isClientWrap()) return res; } - // Unary or poly input - private void getInputFireable(Map> res, Role r, EFsm fsm) + // Unary or poly receive + private List getInputFireable(Role r, EFsm fsm) { - for (EAction a : this.buffs.inputable(r)) + List res = new LinkedList<>(); + for (ERecv a : this.buffs.getInputable(r)) // Buffered contents as intput actions { - if (a.isReceive()) - { - if (fsm.curr.hasAction(a)) - { - List tmp = res.get(r); - if (tmp == null) - { - tmp = new LinkedList<>(); - res.put(r, tmp); - } - tmp.add(a); - } - } - else + if (fsm.curr.hasAction(a)) { - throw new RuntimeException("Shouldn't get in here: " + a); + res.add(a); } } + return res; } - private void getAcceptFireable(Map> res, Role r, EFsm fsm) + private List getAcceptFireable(Role r, EFsm fsm) { - for (EAction a : this.buffs.acceptable(r, fsm.curr)) + List res = new LinkedList<>(); + for (EAcc a : this.buffs.getAcceptable(r, fsm.curr)) { - if (a.isAccept()) + for (EAction peera : this.efsms.get(a.peer).curr.getActions()) { - // FIXME: factor out - EAcc c = (EAcc) a; - //EndpointState speer = this.states.get(c.peer); - EFsm speer = this.efsms.get(c.peer); - //if (speer.getStateKind() == Kind.OUTPUT) + if (a.toDual(r).equals(peera) && this.buffs.canAccept(r, (EAcc) a)) { - List peeras = speer.curr.getActions(); - for (EAction peera : peeras) - { - if (peera.equals(c.toDual(r)) && this.buffs.canAccept(r, c)) - { - List tmp = res.get(r); - if (tmp == null) - { - tmp = new LinkedList<>(); - res.put(r, tmp); - } - tmp.add(a); - //break; // Add all of them - } - } + res.add(a); } } - else - { - throw new RuntimeException("Shouldn't get in here: " + a); - } } + return res; } - private void getServerWrapFireable(Map> res, Role r) + private List getServerWrapFireable(Role r) { - for (EAction a : this.buffs.wrapable(r)) + List res = new LinkedList<>(); + for (EServerWrap a : this.buffs.getWrapable(r)) { - if (a.isServerWrap()) + for (EAction peera : this.efsms.get(a.peer).curr.getActions()) { - EServerWrap ws = (EServerWrap) a; - EFsm speer = this.efsms.get(ws.peer); + if (a.toDual(r).equals(peera) + && this.buffs.canServerWrap(r, (EServerWrap) a)) { - List peeras = speer.curr.getActions(); - for (EAction peera : peeras) - { - if (peera.equals(ws.toDual(r)) && this.buffs.canWrapServer(r, ws)) - { - List tmp = res.get(r); - if (tmp == null) - { - tmp = new LinkedList<>(); - res.put(r, tmp); - } - tmp.add(a); - } - } + res.add(a); } } - else - { - throw new RuntimeException("Shouldn't get in here: " + a); - } } + return res; } @Override From 60b6448a0bf9471a7718c70e9ff06bc4f2d4da10 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 Apr 2019 20:11:26 +0100 Subject: [PATCH 358/539] [AllTest] Fixed -modelpng/umodelpng bug in CLFlags. --- scribble-cli/src/main/java/org/scribble/cli/CLFlags.java | 8 ++++---- .../java/org/scribble/core/model/global/SBuffers.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java b/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java index 80dd35eba..16132ae94 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java @@ -149,17 +149,17 @@ protected Map getFlags() "Missing protocol/role/file arguments: ")); flags.put(SGRAPH_FLAG, - new CLFlag(SGRAPH_FLAG, 2, false, true, false, + new CLFlag(SGRAPH_FLAG, 1, false, true, false, "Missing protocol argument: ", OLD_WF_FLAG)); flags.put(UNFAIR_SGRAPH_FLAG, - new CLFlag(UNFAIR_SGRAPH_FLAG, 2, false, true, false, + new CLFlag(UNFAIR_SGRAPH_FLAG, 1, false, true, false, "Missing protocol argument: ", OLD_WF_FLAG)); flags.put(SGRAPH_PNG_FLAG, - new CLFlag(SGRAPH_PNG_FLAG, 1, false, true, false, + new CLFlag(SGRAPH_PNG_FLAG, 2, false, true, false, "Missing protocol/file arguments: ", OLD_WF_FLAG)); flags.put(UNFAIR_SGRAPH_PNG_FLAG, - new CLFlag(UNFAIR_SGRAPH_PNG_FLAG, 1, false, true, false, + new CLFlag(UNFAIR_SGRAPH_PNG_FLAG, 2, false, true, false, "Missing protocol/file arguments: ", OLD_WF_FLAG)); // // Non-unique, barrier diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java b/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java index a8cbcdcaa..9052f006f 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java @@ -250,15 +250,15 @@ public Set getAcceptable(Role r, EState curr) // Means connection accept .filter((k) -> !tmp.containsKey(k) || !tmp.get(k)) .forEach((k) -> res.add(new Accept(k))); }*/ + List as = curr.getActions(); if (tmp != null) { - /*Boolean b = tmp.get(r); // r connected to r ??? + Boolean b = tmp.get(as.get(0).peer); // peer is same for all "as" -- CHECKME: should not assume here? if (b != null && b) { return res; - }*/ + } } - List as = curr.getActions(); for (EAction a : as) { res.add((EAcc) a); From d4593bf31ac94cd11245cbce62a2fae7987349a9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 Apr 2019 23:08:32 +0100 Subject: [PATCH 359/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/global/SBuffers.java | 183 +++++------------- .../scribble/core/model/global/SConfig.java | 79 +++----- .../core/model/global/SGraphBuilder.java | 2 +- 3 files changed, 77 insertions(+), 187 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java b/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java index 9052f006f..d9de0ab4d 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java @@ -15,39 +15,31 @@ import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; -import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; -import org.scribble.core.model.ModelFactory; -import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.EAcc; -import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.model.endpoint.actions.EClientWrap; import org.scribble.core.model.endpoint.actions.EDisconnect; import org.scribble.core.model.endpoint.actions.ERecv; import org.scribble.core.model.endpoint.actions.EReq; import org.scribble.core.model.endpoint.actions.ESend; -import org.scribble.core.model.endpoint.actions.EClientWrap; import org.scribble.core.model.endpoint.actions.EServerWrap; import org.scribble.core.type.name.Role; public class SBuffers { - private final ModelFactory mf; // FIXME: only used by wrapable -- refactor? - private final Map> connected = new HashMap<>(); private final Map> buffs = new HashMap<>(); // dest -> src -> msg - public SBuffers(ModelFactory mf, Set roles, boolean implicit) + public SBuffers(Set roles, boolean implicit) { - this(mf, roles); + this(roles); if (implicit) { - roles.forEach((k) -> + roles.forEach(k -> { HashMap tmp = new HashMap<>(); this.connected.put(k, tmp); @@ -62,16 +54,14 @@ public SBuffers(ModelFactory mf, Set roles, boolean implicit) } } - public SBuffers(ModelFactory mf, Set roles) + public SBuffers(Set roles) { - this.mf = mf; - // FIXME: do the same for connected - roles.forEach((k) -> + roles.forEach(k -> { HashMap tmp = new HashMap<>(); this.buffs.put(k, tmp); - roles.forEach((k2) -> + roles.forEach(k2 -> { if (!k.equals(k2)) { @@ -83,8 +73,6 @@ public SBuffers(ModelFactory mf, Set roles) public SBuffers(SBuffers buffs) { - this.mf = buffs.mf; - Set roles = buffs.buffs.keySet(); roles.forEach((k) -> { @@ -94,7 +82,7 @@ public SBuffers(SBuffers buffs) this.connected.put(k, new HashMap<>(tmp)); } }); - roles.forEach((k) -> + roles.forEach(k -> { this.buffs.put(k, new HashMap<>(buffs.buffs.get(k))); }); @@ -112,10 +100,6 @@ public Map get(Role r) return Collections.unmodifiableMap(this.buffs.get(r)); } - /*public boolean isEmpty() - { - return this.buffs.values().stream().flatMap((m) -> m.values().stream()).allMatch((v) -> v == null); - }*/ public boolean isEmpty(Role r) { return this.buffs.get(r).values().stream().allMatch((v) -> v == null); @@ -132,33 +116,53 @@ public boolean isConnected(Role self, Role peer) return b != null && b; } + public boolean canSend(Role self, ESend a) + { + if (!isConnected(self, a.peer)) + { + return false; + } + return isConnected(self, a.peer) + && this.buffs.get(a.peer).get(self) == null; + } + + public boolean canReceive(Role self, ERecv a) + { + if (!isConnected(self, a.peer)) + { + return false; + } + ESend send = this.buffs.get(self).get(a.peer); + return send != null && send.toDual(a.peer).equals(a); + } + public boolean canAccept(Role self, EAcc a) - //public boolean canAccept(Role r1, Role r2) { return !isConnected(self, a.peer); - //return canConnect(r2, r1); } - public boolean canConnect(Role self, EReq c) - //public boolean canConnect(Role r1, Role r2) + // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check canAccept + public boolean canRequest(Role self, EReq c) { return !isConnected(self, c.peer); - //return !isConnected(r1, r2); } + // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check peer canDisconnect public boolean canDisconnect(Role self, EDisconnect d) { return isConnected(self, d.peer); } - public boolean canWrapClient(Role self, EClientWrap wc) + // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check canServerWrap + public boolean canClientWrap(Role self, EClientWrap cw) { - return isConnected(self, wc.peer); + return isConnected(self, cw.peer); } - public boolean canServerWrap(Role self, EServerWrap ws) + // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check canClientWrap + public boolean canServerWrap(Role self, EServerWrap sw) { - return isConnected(self, ws.peer); + return isConnected(self, sw.peer); } //public WFBuffers connect(Role src, Connect c, Role dest) @@ -190,11 +194,6 @@ public SBuffers disconnect(Role self, EDisconnect d) return copy; } - public boolean canSend(Role self, ESend a) - { - return isConnected(self, a.peer) && (this.buffs.get(a.peer).get(self) == null); - } - public SBuffers send(Role self, ESend a) { SBuffers copy = new SBuffers(this); @@ -202,99 +201,6 @@ public SBuffers send(Role self, ESend a) return copy; } - /*public boolean canReceive(Role self, Receive a) - { - Send send = this.buffs.get(self).get(a.peer); - return send != null && send.toDual(a.peer).equals(a); - }*/ - - //public Set receivable(Role r) - public Set getInputable(Role r) // FIXME: IAction // FIXME: OAction version? - { - /*Map tmp = this.connected.get(r); - if (tmp == null) - { - return Collections.emptySet(); // Not needed, guarded by state kind - }*/ - Set res = this.buffs.get(r).entrySet().stream() - .filter(e -> e.getValue() != null) - .map(e -> e.getValue().toDual(e.getKey())) - .collect(Collectors.toSet()); - /*Map tmp = this.connected.get(r); - if (tmp == null) - { - this.buffs.get(r).keySet().forEach((x) -> res.add(new Accept(x))); - } - else - { - this.connected.keySet().stream() - .filter((k) -> !tmp.containsKey(k) || !tmp.get(k)) - .forEach((k) -> res.add(new Accept(k))); - }*/ - return res; - } - - //public Set acceptable(Role r) // Means connection accept actions - // Pre: curr is Accept state, r is accept peer - public Set getAcceptable(Role r, EState curr) // Means connection accept actions - { - Set res = new HashSet<>(); - Map tmp = this.connected.get(r); - /*if (tmp == null) - { - this.buffs.get(r).keySet().forEach((x) -> res.add(new Accept(x))); - } - else - { - this.connected.keySet().stream() - .filter((k) -> !tmp.containsKey(k) || !tmp.get(k)) - .forEach((k) -> res.add(new Accept(k))); - }*/ - List as = curr.getActions(); - if (tmp != null) - { - Boolean b = tmp.get(as.get(0).peer); // peer is same for all "as" -- CHECKME: should not assume here? - if (b != null && b) - { - return res; - } - } - for (EAction a : as) - { - res.add((EAcc) a); - } - return res; - } - - public Set getWrapable(Role r) - { - Set res = new HashSet<>(); - Map tmp = this.connected.get(r); - if (tmp != null) - { - this.connected.keySet().stream() - .filter(k -> tmp.containsKey(k) && tmp.get(k)) - .forEach(k -> res.add(this.mf.newEServerWrap(k))); - } - return res; - } - - /*//public Map receivable() - public Map inputable() - { - //Map tmp = new HashMap<>(); - Map tmp = new HashMap<>(); - for (Role r : this.buffs.keySet()) - { - Map tmp2 = this.buffs.get(r); - for (Role r2: tmp2.keySet()) - { - tmp.put(r, tmp2.get(r2).toDual(r2)); - } - } - return tmp; - }*/ - public SBuffers receive(Role self, ERecv a) { SBuffers copy = new SBuffers(this); @@ -329,14 +235,13 @@ public boolean equals(Object o) @Override public String toString() { - //return this.buffs.toString(); return this.buffs.entrySet().stream() - .filter((e) -> e.getValue().values().stream().anyMatch((v) -> v != null)) - .collect(Collectors.toMap((e) -> e.getKey(), - (e) -> (e.getValue().entrySet().stream() - .filter((f) -> f.getValue() != null) - //.collect(Collectors.toMap((f) -> f.getKey(), (f) -> f.getValue()))) // Inference not working? - .collect(Collectors.toMap((Entry f) -> f.getKey(), (f) -> f.getValue()))) - )).toString(); + .filter(e -> e.getValue().values().stream().anyMatch(v -> v != null)) + .collect(Collectors.toMap( + e -> e.getKey(), + e -> e.getValue().entrySet().stream() + .filter(f -> f.getValue() != null) + .collect(Collectors.toMap(f -> f.getKey(), f -> f.getValue())) + )).toString(); } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index b9a3c7b3d..dfcf6db8e 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -534,10 +534,10 @@ public Map> getFireable() case OUTPUT: as = getOutputFireable(r, fsm); break; case UNARY_INPUT: case POLY_INPUT: - as.addAll(getInputFireable(r, fsm)); // addAll for generic typing + as.addAll(getReceiveFireable(r, fsm)); // addAll for generic typing break; case ACCEPT: as.addAll(getAcceptFireable(r, fsm)); break; - case SERVER_WRAP: as.addAll(getServerWrapFireable(r)); break; + case SERVER_WRAP: as.addAll(getServerWrapFireable(r, fsm)); break; default: throw new RuntimeException("Unknown state kind: " + fsm); } if (!as.isEmpty()) // Guards against res.put for empty "as", but perhaps unnecessary? @@ -548,16 +548,17 @@ public Map> getFireable() return res; } - private List getOutputFireable(Role r, EFsm fsm) + // fsm is self's Efsm + private List getOutputFireable(Role self, EFsm fsm) // "output" and "client" actions { List res = new LinkedList<>(); - for (EAction a : fsm.curr.getActions()) + for (EAction a : fsm.curr.getActions()) // Actions may be a mixture of the following { // Async - if (a.isSend() || a.isDisconnect()) + if (a.isSend() || a.isDisconnect()) // For disconnect, only one "a" { - if ((a.isSend() && this.buffs.canSend(r, (ESend) a)) - || (a.isDisconnect() && this.buffs.canDisconnect(r, (EDisconnect) a))) + if ((a.isSend() && this.buffs.canSend(self, (ESend) a)) + || (a.isDisconnect() && this.buffs.canDisconnect(self, (EDisconnect) a))) { res.add(a); } @@ -565,12 +566,12 @@ private List getOutputFireable(Role r, EFsm fsm) // Sync else if (a.isRequest() || a.isClientWrap()) { - if ((a.isRequest() && this.buffs.canConnect(r, (EReq) a)) - || (a.isClientWrap() && this.buffs.canWrapClient(r, (EClientWrap) a))) // Cf. isWaitingFor + if ((a.isRequest() && this.buffs.canRequest(self, (EReq) a)) + || (a.isClientWrap() && this.buffs.canClientWrap(self, (EClientWrap) a))) // Cf. isWaitingFor { for (EAction peera : this.efsms.get(a.peer).curr.getActions()) { - if (a.toDual(r).equals(peera)) + if (a.toDual(self).equals(peera)) { res.add(a); } @@ -586,50 +587,34 @@ else if (a.isRequest() || a.isClientWrap()) } // Unary or poly receive - private List getInputFireable(Role r, EFsm fsm) + private List getReceiveFireable(Role self, EFsm fsm) { - List res = new LinkedList<>(); - for (ERecv a : this.buffs.getInputable(r)) // Buffered contents as intput actions - { - if (fsm.curr.hasAction(a)) - { - res.add(a); - } - } - return res; + return fsm.curr.getActions().stream().map(x -> (ERecv) x) + .filter(x -> this.buffs.canReceive(self, x)) + .collect(Collectors.toList()); } - private List getAcceptFireable(Role r, EFsm fsm) + private List getAcceptFireable(Role self, EFsm fsm) { - List res = new LinkedList<>(); - for (EAcc a : this.buffs.getAcceptable(r, fsm.curr)) - { - for (EAction peera : this.efsms.get(a.peer).curr.getActions()) - { - if (a.toDual(r).equals(peera) && this.buffs.canAccept(r, (EAcc) a)) - { - res.add(a); - } - } - } - return res; + List as = fsm.curr.getActions(); + Role peer = as.get(0).peer; // All peer's the same + List peeras = this.efsms.get(peer).curr.getActions(); + return fsm.curr.getActions().stream().map(x -> (EAcc) x) + .filter(x -> this.buffs.canAccept(self, x) + && peeras.stream().anyMatch(y -> y.toDual(self).equals(x))) + .collect(Collectors.toList()); } - private List getServerWrapFireable(Role r) + // Duplicated from getAcceptFireable + private List getServerWrapFireable(Role self, EFsm fsm) { - List res = new LinkedList<>(); - for (EServerWrap a : this.buffs.getWrapable(r)) - { - for (EAction peera : this.efsms.get(a.peer).curr.getActions()) - { - if (a.toDual(r).equals(peera) - && this.buffs.canServerWrap(r, (EServerWrap) a)) - { - res.add(a); - } - } - } - return res; + List as = fsm.curr.getActions(); // Actually for ServerWrap, size() == 1 + Role peer = as.get(0).peer; // All peer's the same + List peeras = this.efsms.get(peer).curr.getActions(); + return fsm.curr.getActions().stream().map(x -> (EServerWrap) x) + .filter(x -> this.buffs.canServerWrap(self, x) + && peeras.stream().anyMatch(y -> y.toDual(self).equals(x))) + .collect(Collectors.toList()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index f3a189264..12d861ad9 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -49,7 +49,7 @@ protected SConfig createInitialSConfig(Map egraphs, { Map efsms = egraphs.entrySet().stream() .collect(Collectors.toMap(Entry::getKey, e -> e.getValue().toFsm())); - SBuffers b0 = new SBuffers(this.core.config.mf, efsms.keySet(), !explicit); + SBuffers b0 = new SBuffers(efsms.keySet(), !explicit); return this.core.config.mf.newSConfig(efsms, b0); } From bf63f96c21eed09a772c2151926e4b0ea28fb131 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 Apr 2019 23:33:20 +0100 Subject: [PATCH 360/539] [AllTest] Continued: refactoring core model classes. --- .../org/scribble/core/model/ModelFactory.java | 4 +- .../scribble/core/model/ModelFactoryImpl.java | 4 +- .../scribble/core/model/global/SConfig.java | 88 +++++----- .../core/model/global/SGraphBuilder.java | 2 +- .../scribble/core/model/global/SModel.java | 8 +- .../global/{SBuffers.java => SQueues.java} | 160 +++++++----------- 6 files changed, 110 insertions(+), 156 deletions(-) rename scribble-core/src/main/java/org/scribble/core/model/global/{SBuffers.java => SQueues.java} (57%) diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java index 948fb192f..5abe17d48 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java @@ -26,7 +26,7 @@ import org.scribble.core.model.endpoint.actions.EReq; import org.scribble.core.model.endpoint.actions.ESend; import org.scribble.core.model.endpoint.actions.EServerWrap; -import org.scribble.core.model.global.SBuffers; +import org.scribble.core.model.global.SQueues; import org.scribble.core.model.global.SConfig; import org.scribble.core.model.global.SGraph; import org.scribble.core.model.global.SGraphBuilderUtil; @@ -54,7 +54,7 @@ public interface ModelFactory SState newSState(SConfig config); SGraph newSGraph(GProtoName proto, Map states, SState init); - SConfig newSConfig(Map state, SBuffers buffs); + SConfig newSConfig(Map state, SQueues buffs); SModel newSModel(SGraph g); ESend newESend(Role peer, MsgId mid, Payload pay); diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java index 6a9e8f9f8..98223c910 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java @@ -26,7 +26,7 @@ import org.scribble.core.model.endpoint.actions.EReq; import org.scribble.core.model.endpoint.actions.ESend; import org.scribble.core.model.endpoint.actions.EServerWrap; -import org.scribble.core.model.global.SBuffers; +import org.scribble.core.model.global.SQueues; import org.scribble.core.model.global.SConfig; import org.scribble.core.model.global.SGraph; import org.scribble.core.model.global.SGraphBuilderUtil; @@ -165,7 +165,7 @@ public SGraph newSGraph(GProtoName proto, Map states, } @Override - public SConfig newSConfig(Map state, SBuffers buffs) + public SConfig newSConfig(Map state, SQueues buffs) { return new SConfig(this, state, buffs); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index dfcf6db8e..20a89ef10 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -43,25 +43,25 @@ public class SConfig protected final ModelFactory mf; public final Map efsms; - public final SBuffers buffs; + public final SQueues queues; - //public WFConfig(Map state, Map> buff) - //public WFConfig(Map state, WFBuffers buffs) - public SConfig(ModelFactory mf, Map state, SBuffers buffs) + //public WFConfig(Map state, Map> queue) + //public WFConfig(Map state, WFqueueers queues) + public SConfig(ModelFactory mf, Map state, SQueues queues) { this.mf = mf; this.efsms = Collections.unmodifiableMap(state); - //this.buffs = Collections.unmodifiableMap(buff.keySet().stream() .collect(Collectors.toMap((k) -> k, (k) -> Collections.unmodifiableMap(buff.get(k))))); - //this.buffs = Collections.unmodifiableMap(buff); - this.buffs = buffs; + //this.queues = Collections.unmodifiableMap(queue.keySet().stream() .collect(Collectors.toMap((k) -> k, (k) -> Collections.unmodifiableMap(queue.get(k))))); + //this.queues = Collections.unmodifiableMap(queue); + this.queues = queues; } // FIXME: rename: not just termination, could be unconnected/uninitiated //public boolean isEnd() public boolean isSafeTermination() { - //return this.states.values().stream().allMatch((s) -> s.isTerminal()) && this.buffs.isEmpty(); + //return this.states.values().stream().allMatch((s) -> s.isTerminal()) && this.queues.isEmpty(); for (Role r : this.efsms.keySet()) { if (!canSafelyTerminate(r)) @@ -79,7 +79,7 @@ public boolean canSafelyTerminate(Role r) EFsm s = this.efsms.get(r); //return /*boolean cannotSafelyTerminate = // FIXME: check and cleanup - (s.isTerminal() && !this.buffs.isEmpty(r)) + (s.isTerminal() && !this.queues.isEmpty(r)) || (!s.isTerminal() && //(!(s.getStateKind().equals(Kind.UNARYINPUT) && s.getTakeable().iterator().next().isAccept()) // Accept state now distinguished @@ -87,24 +87,24 @@ public boolean canSafelyTerminate(Role r) !(s.getStateKind().equals(Kind.ACCEPT) && s.isInitial()) // FIXME: check stable // FIXME: needs initial state check -- although if there is an accept, there should a connect, and waitfor-errors checked via connects) -- this should be OK because connect/accept are sync -- but not fully sufficient by itself, see next // So could be blocked on unary accept part way through the protocol -- but also could be unfolded initial accept - ////|| this.states.keySet().stream().anyMatch((rr) -> !r.equals(rr) && this.buffs.isConnected(r, rr)))) - //&& this.states.keySet().stream().anyMatch((rr) -> !r.equals(rr) && this.buffs.isConnected(r, rr)) + ////|| this.states.keySet().stream().anyMatch((rr) -> !r.equals(rr) && this.queues.isConnected(r, rr)))) + //&& this.states.keySet().stream().anyMatch((rr) -> !r.equals(rr) && this.queues.isConnected(r, rr)) // FIXME: isConnected is not symmetric, and could disconnect all part way through protocol -- but can't happen? - // Above assumes initial is not terminal (holds for EFSMs), and doesn't check buffer is empty (i.e. for orphan messages) + // Above assumes initial is not terminal (holds for EFSMs), and doesn't check queueer is empty (i.e. for orphan messages) ) ) || - (!s.isTerminal() && this.states.keySet().stream().anyMatch((rr) -> !r.equals(rr) && this.buffs.isConnected(r, rr))) + (!s.isTerminal() && this.states.keySet().stream().anyMatch((rr) -> !r.equals(rr) && this.queues.isConnected(r, rr))) ;*/ //return !cannotSafelyTerminate; boolean canSafelyTerminate = - (s.curr.isTerminal() && this.buffs.isEmpty(r)) + (s.curr.isTerminal() && this.queues.isEmpty(r)) || (s.curr.getStateKind().equals(EStateKind.ACCEPT) && s.isInitial()) - // FIXME: should be empty buffs + // FIXME: should be empty queues // FIXME: incorrectly allows stuck accepts? if inactive not initial, should be clone of initial? - //|| (s.getStateKind().equals(Kind.ACCEPT) && this.states.keySet().stream().noneMatch((rr) -> !r.equals(rr) && this.buffs.isConnected(r, rr))) + //|| (s.getStateKind().equals(Kind.ACCEPT) && this.states.keySet().stream().noneMatch((rr) -> !r.equals(rr) && this.queues.isConnected(r, rr))) ; return canSafelyTerminate; } @@ -120,7 +120,7 @@ public List async(Role r, EAction a) { //Map tmp1 = new HashMap<>(this.states); Map tmp1 = new HashMap<>(this.efsms); - //Map> tmp2 = new HashMap<>(this.buffs); + //Map> tmp2 = new HashMap<>(this.queues); tmp1.put(r, succ); @@ -135,10 +135,10 @@ public List async(Role r, EAction a) { tmp3.put(r, null); }*/ - SBuffers tmp2 = - a.isSend() ? this.buffs.send(r, (ESend) a) - : a.isReceive() ? this.buffs.receive(r, (ERecv) a) - : a.isDisconnect() ? this.buffs.disconnect(r, (EDisconnect) a) + SQueues tmp2 = + a.isSend() ? this.queues.send(r, (ESend) a) + : a.isReceive() ? this.queues.receive(r, (ERecv) a) + : a.isDisconnect() ? this.queues.disconnect(r, (EDisconnect) a) : null; if (tmp2 == null) { @@ -169,15 +169,15 @@ public List sync(Role r1, EAction a1, Role r2, EAction a2) Map tmp1 = new HashMap<>(this.efsms); tmp1.put(r1, succ1); tmp1.put(r2, succ2); - SBuffers tmp2; + SQueues tmp2; if (((a1.isRequest() && a2.isAccept()) || (a1.isAccept() && a2.isRequest()))) - //&& this.buffs.canConnect(r1, r2)) + //&& this.queues.canConnect(r1, r2)) { - tmp2 = this.buffs.connect(r1, r2); + tmp2 = this.queues.connect(r1, r2); } else if (((a1.isClientWrap() && a2.isServerWrap()) || (a1.isServerWrap() && a2.isClientWrap()))) { - tmp2 = this.buffs; // OK, immutable? + tmp2 = this.queues; // OK, immutable? } else { @@ -201,7 +201,7 @@ public Map getStuckMessages() EStateKind k = s.curr.getStateKind(); if (k == EStateKind.UNARY_INPUT || k == EStateKind.POLY_INPUT) { - /*Set duals = this.buffs.get(r).entrySet().stream() + /*Set duals = this.queues.get(r).entrySet().stream() .filter((e) -> e.getValue() != null) .map((e) -> e.getValue().toDual(e.getKey())) .collect(Collectors.toSet()); @@ -210,7 +210,7 @@ public Map getStuckMessages() break; }*/ Role peer = s.curr.getActions().iterator().next().peer; - ESend send = this.buffs.get(r).get(peer); + ESend send = this.queues.get(r).get(peer); if (send != null) { ERecv recv = send.toDual(peer); @@ -361,14 +361,14 @@ private Set isWaitingFor(Role r) return null; }*/ /*Role peer = a.peer; - if (a.isReceive() && this.buffs.get(r).get(peer) == null) + if (a.isReceive() && this.queues.get(r).get(peer) == null) { //return peer; }*/ if (a.isReceive()) { Set peers = all.stream().map((x) -> x.peer).collect(Collectors.toSet()); - if (peers.stream().noneMatch((p) -> this.buffs.get(r).get(p) != null)) + if (peers.stream().noneMatch((p) -> this.queues.get(r).get(p) != null)) { return peers; } @@ -380,7 +380,7 @@ private Set isWaitingFor(Role r) boolean tmp = true; for (Role p : peers) { - if (this.buffs.get(r).get(p) != null) + if (this.queues.get(r).get(p) != null) { tmp = false; break; @@ -400,7 +400,7 @@ else if (k == EStateKind.ACCEPT) List all = s.curr.getActions(); // Should be singleton -- no: not any more /*Set rs = all.stream().map((x) -> x.peer).collect(Collectors.toSet()); if (rs.stream().noneMatch((x) -> this.states.get(x).getAllTakeable().contains(new Connect(r)))) // cf. getTakeable - //if (peera.equals(c.toDual(r)) && this.buffs.canConnect(r, c)) + //if (peera.equals(c.toDual(r)) && this.queues.canConnect(r, c)) { return rs; }*/ @@ -461,7 +461,7 @@ public Map> getOrphanMessages() EFsm s = this.efsms.get(r); if (s.curr.isTerminal()) // Local termination of r, i.e. not necessarily "full deadlock" { - Set orphs = this.buffs.get(r).values().stream().filter(v -> v != null).collect(Collectors.toSet()); + Set orphs = this.queues.get(r).values().stream().filter(v -> v != null).collect(Collectors.toSet()); if (!orphs.isEmpty()) { Set tmp = res.get(r); @@ -480,9 +480,9 @@ public Map> getOrphanMessages() if (!rr.equals(r)) { // Connection direction doesn't matter? -- wrong: matters because of async. disconnect - if (!this.buffs.isConnected(r, rr)) + if (!this.queues.isConnected(r, rr)) { - ESend send = this.buffs.get(r).get(rr); + ESend send = this.queues.get(r).get(rr); if (send != null) { Set tmp = res.get(r); @@ -557,8 +557,8 @@ private List getOutputFireable(Role self, EFsm fsm) // "output" and "c // Async if (a.isSend() || a.isDisconnect()) // For disconnect, only one "a" { - if ((a.isSend() && this.buffs.canSend(self, (ESend) a)) - || (a.isDisconnect() && this.buffs.canDisconnect(self, (EDisconnect) a))) + if ((a.isSend() && this.queues.canSend(self, (ESend) a)) + || (a.isDisconnect() && this.queues.canDisconnect(self, (EDisconnect) a))) { res.add(a); } @@ -566,8 +566,8 @@ private List getOutputFireable(Role self, EFsm fsm) // "output" and "c // Sync else if (a.isRequest() || a.isClientWrap()) { - if ((a.isRequest() && this.buffs.canRequest(self, (EReq) a)) - || (a.isClientWrap() && this.buffs.canClientWrap(self, (EClientWrap) a))) // Cf. isWaitingFor + if ((a.isRequest() && this.queues.canRequest(self, (EReq) a)) + || (a.isClientWrap() && this.queues.canClientWrap(self, (EClientWrap) a))) // Cf. isWaitingFor { for (EAction peera : this.efsms.get(a.peer).curr.getActions()) { @@ -590,7 +590,7 @@ else if (a.isRequest() || a.isClientWrap()) private List getReceiveFireable(Role self, EFsm fsm) { return fsm.curr.getActions().stream().map(x -> (ERecv) x) - .filter(x -> this.buffs.canReceive(self, x)) + .filter(x -> this.queues.canReceive(self, x)) .collect(Collectors.toList()); } @@ -600,7 +600,7 @@ private List getAcceptFireable(Role self, EFsm fsm) Role peer = as.get(0).peer; // All peer's the same List peeras = this.efsms.get(peer).curr.getActions(); return fsm.curr.getActions().stream().map(x -> (EAcc) x) - .filter(x -> this.buffs.canAccept(self, x) + .filter(x -> this.queues.canAccept(self, x) && peeras.stream().anyMatch(y -> y.toDual(self).equals(x))) .collect(Collectors.toList()); } @@ -612,7 +612,7 @@ private List getServerWrapFireable(Role self, EFsm fsm) Role peer = as.get(0).peer; // All peer's the same List peeras = this.efsms.get(peer).curr.getActions(); return fsm.curr.getActions().stream().map(x -> (EServerWrap) x) - .filter(x -> this.buffs.canServerWrap(self, x) + .filter(x -> this.queues.canServerWrap(self, x) && peeras.stream().anyMatch(y -> y.toDual(self).equals(x))) .collect(Collectors.toList()); } @@ -622,7 +622,7 @@ public int hashCode() { int hash = 71; hash = 31 * hash + this.efsms.hashCode(); - hash = 31 * hash + this.buffs.hashCode(); + hash = 31 * hash + this.queues.hashCode(); return hash; } @@ -638,12 +638,12 @@ public boolean equals(Object o) return false; } SConfig c = (SConfig) o; - return this.efsms.equals(c.efsms) && this.buffs.equals(c.buffs); + return this.efsms.equals(c.efsms) && this.queues.equals(c.queues); } @Override public String toString() { - return "(" + this.efsms + ", " + this.buffs + ")"; + return "(" + this.efsms + ", " + this.queues + ")"; } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index 12d861ad9..42c07b3eb 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -49,7 +49,7 @@ protected SConfig createInitialSConfig(Map egraphs, { Map efsms = egraphs.entrySet().stream() .collect(Collectors.toMap(Entry::getKey, e -> e.getValue().toFsm())); - SBuffers b0 = new SBuffers(efsms.keySet(), !explicit); + SQueues b0 = new SQueues(efsms.keySet(), !explicit); return this.core.config.mf.newSConfig(efsms, b0); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index ca806c0d8..803d9f6d3 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -194,7 +194,7 @@ protected static Set checkRoleProgress(Map states, { if (!foo.config.canSafelyTerminate(r)) { - if (s.config.buffs.get(r).values().stream() + if (s.config.queues.get(r).values().stream() .allMatch((v) -> v == null)) { starved.add(r); @@ -221,12 +221,12 @@ protected static Map> checkEventualReception( .keySet(); Iterator i = termset.iterator(); - Map> b0 = states.get(i.next()).config.buffs - .getBuffers(); + Map> b0 = states.get(i.next()).config.queues + .getQueues(); while (i.hasNext()) { SState s = states.get(i.next()); - SBuffers b = s.config.buffs; + SQueues b = s.config.queues; for (Role r1 : roles) { for (Role r2 : roles) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java b/scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java similarity index 57% rename from scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java rename to scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java index d9de0ab4d..94133a089 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SBuffers.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java @@ -28,81 +28,53 @@ import org.scribble.core.model.endpoint.actions.EServerWrap; import org.scribble.core.type.name.Role; -public class SBuffers +public class SQueues { - private final Map> connected = new HashMap<>(); - private final Map> buffs = new HashMap<>(); // dest -> src -> msg + private final Map> connected = new HashMap<>(); // client -> server -> connected? (symmetric) + private final Map> queues = new HashMap<>(); // dest -> src -> msg - public SBuffers(Set roles, boolean implicit) + public SQueues(Set roles, boolean implicit) { - this(roles); - - if (implicit) + for(Role r1 : roles) { - roles.forEach(k -> + HashMap connected = new HashMap<>(); + HashMap queues = new HashMap<>(); + for (Role r2 : roles) { - HashMap tmp = new HashMap<>(); - this.connected.put(k, tmp); - roles.forEach((k2) -> + if (!r1.equals(r2)) { - if (!k.equals(k2)) - { - tmp.put(k2, true); - } - }); - }); - } - } - - public SBuffers(Set roles) - { - // FIXME: do the same for connected - roles.forEach(k -> - { - HashMap tmp = new HashMap<>(); - this.buffs.put(k, tmp); - roles.forEach(k2 -> - { - if (!k.equals(k2)) - { - tmp.put(k2, null); + connected.put(r2, implicit); + queues.put(r2, null); // null for empty queue } - }); - }); + } + this.connected.put(r1, connected); + this.queues.put(r1, queues); + } } - public SBuffers(SBuffers buffs) + protected SQueues(SQueues queues) { - Set roles = buffs.buffs.keySet(); - roles.forEach((k) -> + for (Role r : queues.queues.keySet()) { - Map tmp = buffs.connected.get(k); - if (tmp != null) - { - this.connected.put(k, new HashMap<>(tmp)); - } - }); - roles.forEach(k -> - { - this.buffs.put(k, new HashMap<>(buffs.buffs.get(k))); - }); + this.connected.put(r, new HashMap<>(queues.connected.get(r))); + this.queues.put(r, new HashMap<>(queues.queues.get(r))); + } } - // FIXME factor out properly with constructor - public Map> getBuffers() + public Map> getQueues() // FIXME factor out properly with constructor { - //return this.buffs; - return new SBuffers(this).buffs; + //return this.queues; + return new SQueues(this).queues; } public Map get(Role r) { - return Collections.unmodifiableMap(this.buffs.get(r)); + return Collections.unmodifiableMap(this.queues.get(r)); } public boolean isEmpty(Role r) { - return this.buffs.get(r).values().stream().allMatch((v) -> v == null); + return this.queues.get(r).values().stream().allMatch((v) -> v == null); } public boolean isConnected(Role self, Role peer) @@ -116,35 +88,29 @@ public boolean isConnected(Role self, Role peer) return b != null && b; } - public boolean canSend(Role self, ESend a) + // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check canAccept + public boolean canAccept(Role self, EAcc a) { - if (!isConnected(self, a.peer)) - { - return false; - } - return isConnected(self, a.peer) - && this.buffs.get(a.peer).get(self) == null; + return !isConnected(self, a.peer); } - public boolean canReceive(Role self, ERecv a) + // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check canAccept + public boolean canRequest(Role self, EReq c) { - if (!isConnected(self, a.peer)) - { - return false; - } - ESend send = this.buffs.get(self).get(a.peer); - return send != null && send.toDual(a.peer).equals(a); + return !isConnected(self, c.peer); } - public boolean canAccept(Role self, EAcc a) + public boolean canSend(Role self, ESend a) { - return !isConnected(self, a.peer); + return isConnected(self, a.peer) + && this.queues.get(a.peer).get(self) == null; } - // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check canAccept - public boolean canRequest(Role self, EReq c) + public boolean canReceive(Role self, ERecv a) { - return !isConnected(self, c.peer); + // N.B. *not* checking isConnected -- can still receive from our side after other side has closed + ESend send = this.queues.get(self).get(a.peer); + return send != null && send.toDual(a.peer).equals(a); } // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check peer canDisconnect @@ -154,57 +120,45 @@ public boolean canDisconnect(Role self, EDisconnect d) } // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check canServerWrap + // N.B. doesn't actually change any state public boolean canClientWrap(Role self, EClientWrap cw) { return isConnected(self, cw.peer); } // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check canClientWrap + // N.B. doesn't actually change any state public boolean canServerWrap(Role self, EServerWrap sw) { return isConnected(self, sw.peer); } - //public WFBuffers connect(Role src, Connect c, Role dest) - public SBuffers connect(Role src, Role dest) + public SQueues connect(Role src, Role dest) { - SBuffers copy = new SBuffers(this); - Map tmp1 = copy.connected.get(src); - if (tmp1 == null) - { - tmp1 = new HashMap<>(); - copy.connected.put(src, tmp1); - } - tmp1.put(dest, true); - Map tmp2 = copy.connected.get(dest); - if (tmp2 == null) - { - tmp2 = new HashMap<>(); - copy.connected.put(dest, tmp2); - } - tmp2.put(src, true); - //copy.buffs.get(c.peer).put(src, new Send(c.peer, c.mid, c.payload)); + SQueues copy = new SQueues(this); + copy.connected.get(src).put(dest, true); + copy.connected.get(dest).put(src, true); return copy; } - public SBuffers disconnect(Role self, EDisconnect d) + public SQueues disconnect(Role self, EDisconnect d) { - SBuffers copy = new SBuffers(this); + SQueues copy = new SQueues(this); copy.connected.get(self).put(d.peer, false); return copy; } - public SBuffers send(Role self, ESend a) + public SQueues send(Role self, ESend a) { - SBuffers copy = new SBuffers(this); - copy.buffs.get(a.peer).put(self, a); + SQueues copy = new SQueues(this); + copy.queues.get(a.peer).put(self, a); return copy; } - public SBuffers receive(Role self, ERecv a) + public SQueues receive(Role self, ERecv a) { - SBuffers copy = new SBuffers(this); - copy.buffs.get(self).put(a.peer, null); + SQueues copy = new SQueues(this); + copy.queues.get(self).put(a.peer, null); return copy; } @@ -212,7 +166,7 @@ public SBuffers receive(Role self, ERecv a) public final int hashCode() { int hash = 131; - hash = 31 * hash + this.buffs.hashCode(); + hash = 31 * hash + this.queues.hashCode(); hash = 31 * hash + this.connected.hashCode(); return hash; } @@ -224,18 +178,18 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof SBuffers)) + if (!(o instanceof SQueues)) { return false; } - SBuffers b = (SBuffers) o; - return this.buffs.equals(b.buffs) && this.connected.equals(b.connected); + SQueues b = (SQueues) o; + return this.queues.equals(b.queues) && this.connected.equals(b.connected); } @Override public String toString() { - return this.buffs.entrySet().stream() + return this.queues.entrySet().stream() .filter(e -> e.getValue().values().stream().anyMatch(v -> v != null)) .collect(Collectors.toMap( e -> e.getKey(), From 4dcea6698d98c6318b88740e8eabfc6dcff27e20 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 Apr 2019 23:45:59 +0100 Subject: [PATCH 361/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/global/SConfig.java | 9 +- .../scribble/core/model/global/SModel.java | 4 +- .../scribble/core/model/global/SQueues.java | 92 +++++++++---------- 3 files changed, 52 insertions(+), 53 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index 20a89ef10..93b88df5e 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -177,6 +177,7 @@ public List sync(Role r1, EAction a1, Role r2, EAction a2) } else if (((a1.isClientWrap() && a2.isServerWrap()) || (a1.isServerWrap() && a2.isClientWrap()))) { + // Doesn't affect queue state tmp2 = this.queues; // OK, immutable? } else @@ -210,7 +211,7 @@ public Map getStuckMessages() break; }*/ Role peer = s.curr.getActions().iterator().next().peer; - ESend send = this.queues.get(r).get(peer); + ESend send = this.queues.getQueue(r).get(peer); if (send != null) { ERecv recv = send.toDual(peer); @@ -368,7 +369,7 @@ private Set isWaitingFor(Role r) if (a.isReceive()) { Set peers = all.stream().map((x) -> x.peer).collect(Collectors.toSet()); - if (peers.stream().noneMatch((p) -> this.queues.get(r).get(p) != null)) + if (peers.stream().noneMatch((p) -> this.queues.getQueue(r).get(p) != null)) { return peers; } @@ -461,7 +462,7 @@ public Map> getOrphanMessages() EFsm s = this.efsms.get(r); if (s.curr.isTerminal()) // Local termination of r, i.e. not necessarily "full deadlock" { - Set orphs = this.queues.get(r).values().stream().filter(v -> v != null).collect(Collectors.toSet()); + Set orphs = this.queues.getQueue(r).values().stream().filter(v -> v != null).collect(Collectors.toSet()); if (!orphs.isEmpty()) { Set tmp = res.get(r); @@ -482,7 +483,7 @@ public Map> getOrphanMessages() // Connection direction doesn't matter? -- wrong: matters because of async. disconnect if (!this.queues.isConnected(r, rr)) { - ESend send = this.queues.get(r).get(rr); + ESend send = this.queues.getQueue(r).get(rr); if (send != null) { Set tmp = res.get(r); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index 803d9f6d3..dd7058b39 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -194,7 +194,7 @@ protected static Set checkRoleProgress(Map states, { if (!foo.config.canSafelyTerminate(r)) { - if (s.config.queues.get(r).values().stream() + if (s.config.queues.getQueue(r).values().stream() .allMatch((v) -> v == null)) { starved.add(r); @@ -234,7 +234,7 @@ protected static Map> checkEventualReception( ESend s0 = b0.get(r1).get(r2); if (s0 != null) { - ESend tmp = b.get(r1).get(r2); + ESend tmp = b.getQueue(r1).get(r2); if (tmp == null) { b0.get(r1).put(r2, null); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java b/scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java index 94133a089..25f82effa 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java @@ -16,6 +16,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; @@ -31,7 +32,7 @@ public class SQueues { private final Map> connected = new HashMap<>(); // client -> server -> connected? (symmetric) - private final Map> queues = new HashMap<>(); // dest -> src -> msg + private final Map> queues = new HashMap<>(); // dest -> src -> msg // null ESend for empty queue public SQueues(Set roles, boolean implicit) { @@ -60,38 +61,18 @@ protected SQueues(SQueues queues) this.queues.put(r, new HashMap<>(queues.queues.get(r))); } } - - public Map> getQueues() // FIXME factor out properly with constructor - { - //return this.queues; - return new SQueues(this).queues; - } - public Map get(Role r) - { - return Collections.unmodifiableMap(this.queues.get(r)); - } - - public boolean isEmpty(Role r) - { - return this.queues.get(r).values().stream().allMatch((v) -> v == null); - } - - public boolean isConnected(Role self, Role peer) + public boolean canSend(Role self, ESend a) { - Map tmp = this.connected.get(self); - if (tmp == null) - { - return false; - } - Boolean b = tmp.get(peer); - return b != null && b; + return isConnected(self, a.peer) + && this.queues.get(a.peer).get(self) == null; } - // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check canAccept - public boolean canAccept(Role self, EAcc a) + public boolean canReceive(Role self, ERecv a) { - return !isConnected(self, a.peer); + // N.B. *not* checking isConnected -- can still receive from our side after other side has closed + ESend send = this.queues.get(self).get(a.peer); + return send != null && send.toDual(a.peer).equals(a); } // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check canAccept @@ -100,17 +81,10 @@ public boolean canRequest(Role self, EReq c) return !isConnected(self, c.peer); } - public boolean canSend(Role self, ESend a) - { - return isConnected(self, a.peer) - && this.queues.get(a.peer).get(self) == null; - } - - public boolean canReceive(Role self, ERecv a) + // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check canAccept + public boolean canAccept(Role self, EAcc a) { - // N.B. *not* checking isConnected -- can still receive from our side after other side has closed - ESend send = this.queues.get(self).get(a.peer); - return send != null && send.toDual(a.peer).equals(a); + return !isConnected(self, a.peer); } // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check peer canDisconnect @@ -127,12 +101,27 @@ public boolean canClientWrap(Role self, EClientWrap cw) } // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check canClientWrap - // N.B. doesn't actually change any state + // N.B. doesn't actually change queues state public boolean canServerWrap(Role self, EServerWrap sw) { return isConnected(self, sw.peer); } + + public SQueues send(Role self, ESend a) + { + SQueues copy = new SQueues(this); + copy.queues.get(a.peer).put(self, a); + return copy; + } + + public SQueues receive(Role self, ERecv a) + { + SQueues copy = new SQueues(this); + copy.queues.get(self).put(a.peer, null); + return copy; + } + // Sync action public SQueues connect(Role src, Role dest) { SQueues copy = new SQueues(this); @@ -148,18 +137,27 @@ public SQueues disconnect(Role self, EDisconnect d) return copy; } - public SQueues send(Role self, ESend a) + public boolean isConnected(Role self, Role peer) { - SQueues copy = new SQueues(this); - copy.queues.get(a.peer).put(self, a); - return copy; + return this.connected.get(self).get(peer); + } + + public boolean isEmpty(Role r) // this.connected doesn't matter + { + return this.queues.get(r).values().stream().allMatch(v -> v == null); + } + + // Return a (deep) copy -- currently, checkEventualReception expects a modifiable return + public Map> getQueues() + { + return this.queues.entrySet().stream().collect(Collectors.toMap( + Entry::getKey, + x -> new HashMap<>(x.getValue()))); } - public SQueues receive(Role self, ERecv a) + public Map getQueue(Role r) { - SQueues copy = new SQueues(this); - copy.queues.get(self).put(a.peer, null); - return copy; + return Collections.unmodifiableMap(this.queues.get(r)); } @Override From 04f8d0600cf566399979a67554831b398aa2c020 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Apr 2019 00:24:36 +0100 Subject: [PATCH 362/539] [AllTest] Minor. --- .../scribble/core/model/endpoint/EGraph.java | 2 +- .../scribble/core/model/global/SConfig.java | 30 +++++++++---------- .../scribble/core/model/global/SQueues.java | 6 ++-- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java index d4d785a2d..cbf9adb15 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java @@ -28,7 +28,7 @@ public EGraph(EState init, EState term) this.term = term; } - public EFsm toFsm() + public EFsm toFsm() // CHECKME: refactor to mf? { return new EFsm(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index 93b88df5e..163334c3a 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -524,26 +524,26 @@ public Map getUnfinishedRoles() public Map> getFireable() { Map> res = new HashMap<>(); - for (Role r : this.efsms.keySet()) + for (Role self : this.efsms.keySet()) { - EFsm fsm = this.efsms.get(r); + EFsm fsm = this.efsms.get(self); List as = new LinkedList<>(); switch (fsm.curr.getStateKind()) // Choice subject enabling needed for non-mixed states (mixed states would be needed for async. permutations though) { // Currently not convenient to delegate to states, as state types not distinguished case TERMINAL: break; - case OUTPUT: as = getOutputFireable(r, fsm); break; + case OUTPUT: as.addAll(getOutputFireable(self, fsm)); break; case UNARY_INPUT: case POLY_INPUT: - as.addAll(getReceiveFireable(r, fsm)); // addAll for generic typing + as.addAll(getReceiveFireable(self, fsm)); // addAll for generic typing break; - case ACCEPT: as.addAll(getAcceptFireable(r, fsm)); break; - case SERVER_WRAP: as.addAll(getServerWrapFireable(r, fsm)); break; + case ACCEPT: as.addAll(getAcceptFireable(self, fsm)); break; + case SERVER_WRAP: as.addAll(getServerWrapFireable(self, fsm)); break; default: throw new RuntimeException("Unknown state kind: " + fsm); } if (!as.isEmpty()) // Guards against res.put for empty "as", but perhaps unnecessary? { - res.put(r, as); + res.put(self, as); } } return res; @@ -559,7 +559,8 @@ private List getOutputFireable(Role self, EFsm fsm) // "output" and "c if (a.isSend() || a.isDisconnect()) // For disconnect, only one "a" { if ((a.isSend() && this.queues.canSend(self, (ESend) a)) - || (a.isDisconnect() && this.queues.canDisconnect(self, (EDisconnect) a))) + || (a.isDisconnect() + && this.queues.canDisconnect(self, (EDisconnect) a))) { res.add(a); } @@ -568,14 +569,13 @@ private List getOutputFireable(Role self, EFsm fsm) // "output" and "c else if (a.isRequest() || a.isClientWrap()) { if ((a.isRequest() && this.queues.canRequest(self, (EReq) a)) - || (a.isClientWrap() && this.queues.canClientWrap(self, (EClientWrap) a))) // Cf. isWaitingFor + || (a.isClientWrap() + && this.queues.canClientWrap(self, (EClientWrap) a))) { - for (EAction peera : this.efsms.get(a.peer).curr.getActions()) + if (this.efsms.get(a.peer).curr.getActions().stream() + .anyMatch(x -> a.toDual(self).equals(x))) // anyMatch (i.e., add "a" at most once), cf. getAcceptable { - if (a.toDual(self).equals(peera)) - { - res.add(a); - } + res.add(a); } } } @@ -588,7 +588,7 @@ else if (a.isRequest() || a.isClientWrap()) } // Unary or poly receive - private List getReceiveFireable(Role self, EFsm fsm) + private List getReceiveFireable(Role self, EFsm fsm) { return fsm.curr.getActions().stream().map(x -> (ERecv) x) .filter(x -> this.queues.canReceive(self, x)) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java b/scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java index 25f82effa..5739115d8 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java @@ -152,7 +152,7 @@ public Map> getQueues() { return this.queues.entrySet().stream().collect(Collectors.toMap( Entry::getKey, - x -> new HashMap<>(x.getValue()))); + x -> new HashMap<>(x.getValue()))); // Collections.unmodifiableMap(x.getValue()) } public Map getQueue(Role r) @@ -164,8 +164,8 @@ public Map getQueue(Role r) public final int hashCode() { int hash = 131; - hash = 31 * hash + this.queues.hashCode(); hash = 31 * hash + this.connected.hashCode(); + hash = 31 * hash + this.queues.hashCode(); return hash; } @@ -181,7 +181,7 @@ public boolean equals(Object o) return false; } SQueues b = (SQueues) o; - return this.queues.equals(b.queues) && this.connected.equals(b.connected); + return this.connected.equals(b.connected) && this.queues.equals(b.queues); } @Override From ee3277ec33664ecdd224532bc03350e538fc05a7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Apr 2019 09:49:08 +0100 Subject: [PATCH 363/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/endpoint/EFsm.java | 4 +- .../core/model/endpoint/actions/EAction.java | 1 + .../scribble/core/model/global/SConfig.java | 57 ++++++------------- .../scribble/core/model/global/SQueues.java | 10 ++-- scribble-test/src/test/scrib/tmp/Test.scr | 3 +- 5 files changed, 26 insertions(+), 49 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java index 11434cf36..adc6d8eac 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java @@ -36,8 +36,8 @@ protected EFsm(EGraph graph, EState curr) } // CHECKME: Set? List is for non-det actions, but is that relevant to EFsm's? - // Pre: this.curr.getAllFireable().contains(a) ? - public List fireAll(EAction a) + // N.B. this just means "follow an edge", it is agnostic to an "actual semantics" (e.g., queues, queue sizes, etc.), cf. "fire" + public List getSuccs(EAction a) { return this.curr.getSuccs(a).stream().map(x -> new EFsm(this.graph, x)) .collect(Collectors.toList()); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java index 9422fdfd2..199f5aafd 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java @@ -34,6 +34,7 @@ protected EAction(ModelFactory mf, Role peer, MsgId mid, Payload pay) this.mf = mf; } + // Self means "current" self public abstract EAction toDual(Role self); public abstract SAction toGlobal(Role self); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index 163334c3a..75a33af5e 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -109,69 +109,45 @@ public boolean canSafelyTerminate(Role r) return canSafelyTerminate; } - public List async(Role r, EAction a) + // Pre: getFireable().get(self).contains(a) + public List async(Role self, EAction a) { List res = new LinkedList<>(); - - //List succs = this.states.get(r).takeAll(a); - List succs = this.efsms.get(r).fireAll(a); - //for (EndpointState succ : succs) + List succs = this.efsms.get(self).getSuccs(a); for (EFsm succ : succs) { - //Map tmp1 = new HashMap<>(this.states); - Map tmp1 = new HashMap<>(this.efsms); - //Map> tmp2 = new HashMap<>(this.queues); - - tmp1.put(r, succ); - - /*Map tmp3 = new HashMap<>(tmp2.get(a.peer)); - tmp2.put(a.peer, tmp3);* / - Map tmp3 = tmp2.get(a.peer); - if (a.isSend()) - { - tmp3.put(r, (Send) a); - } - else - { - tmp3.put(r, null); - }*/ - SQueues tmp2 = - a.isSend() ? this.queues.send(r, (ESend) a) - : a.isReceive() ? this.queues.receive(r, (ERecv) a) - : a.isDisconnect() ? this.queues.disconnect(r, (EDisconnect) a) + Map efsms = new HashMap<>(this.efsms); + efsms.put(self, succ); + SQueues queues = + a.isSend() ? this.queues.send(self, (ESend) a) + : a.isReceive() ? this.queues.receive(self, (ERecv) a) + : a.isDisconnect() ? this.queues.disconnect(self, (EDisconnect) a) : null; - if (tmp2 == null) + if (queues == null) { throw new RuntimeException("Shouldn't get in here: " + a); } - res.add(this.mf.newSConfig(tmp1, tmp2)); + res.add(this.mf.newSConfig(efsms, queues)); } - return res; } // "Synchronous version" of fire + // Pre: getFireable().get(r1).contains(a1) && getFireable().get(r2).contains(a2), where a1 and a2 are a "sync" pair public List sync(Role r1, EAction a1, Role r2, EAction a2) { List res = new LinkedList<>(); - - /*List succs1 = this.states.get(r1).takeAll(a1); - List succs2 = this.states.get(r2).takeAll(a2); - for (EndpointState succ1 : succs1)*/ - List succs1 = this.efsms.get(r1).fireAll(a1); - List succs2 = this.efsms.get(r2).fireAll(a2); + List succs1 = this.efsms.get(r1).getSuccs(a1); + List succs2 = this.efsms.get(r2).getSuccs(a2); for (EFsm succ1 : succs1) { - //for (EndpointState succ2 : succs2) for (EFsm succ2 : succs2) { - //Map tmp1 = new HashMap<>(this.states); Map tmp1 = new HashMap<>(this.efsms); tmp1.put(r1, succ1); tmp1.put(r2, succ2); SQueues tmp2; if (((a1.isRequest() && a2.isAccept()) || (a1.isAccept() && a2.isRequest()))) - //&& this.queues.canConnect(r1, r2)) { tmp2 = this.queues.connect(r1, r2); } @@ -187,7 +163,6 @@ else if (((a1.isClientWrap() && a2.isServerWrap()) || (a1.isServerWrap() && a2.i res.add(this.mf.newSConfig(tmp1, tmp2)); } } - return res; } @@ -602,7 +577,7 @@ private List getAcceptFireable(Role self, EFsm fsm) List peeras = this.efsms.get(peer).curr.getActions(); return fsm.curr.getActions().stream().map(x -> (EAcc) x) .filter(x -> this.queues.canAccept(self, x) - && peeras.stream().anyMatch(y -> y.toDual(self).equals(x))) + && peeras.stream().anyMatch(y -> y.toDual(peer).equals(x))) .collect(Collectors.toList()); } @@ -614,7 +589,7 @@ private List getServerWrapFireable(Role self, EFsm fsm) List peeras = this.efsms.get(peer).curr.getActions(); return fsm.curr.getActions().stream().map(x -> (EServerWrap) x) .filter(x -> this.queues.canServerWrap(self, x) - && peeras.stream().anyMatch(y -> y.toDual(self).equals(x))) + && peeras.stream().anyMatch(y -> y.toDual(peer).equals(x))) .collect(Collectors.toList()); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java b/scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java index 5739115d8..5f273c951 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java @@ -75,32 +75,31 @@ public boolean canReceive(Role self, ERecv a) return send != null && send.toDual(a.peer).equals(a); } - // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check canAccept + // N.B. "sync" action but only considers the self side, i.e., to actually fire, must also explicitly check canAccept public boolean canRequest(Role self, EReq c) { return !isConnected(self, c.peer); } - // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check canAccept + // N.B. "sync" action but only considers the self side, i.e., to actually fire, must also explicitly check canRequest public boolean canAccept(Role self, EAcc a) { return !isConnected(self, a.peer); } - // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check peer canDisconnect public boolean canDisconnect(Role self, EDisconnect d) { return isConnected(self, d.peer); } - // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check canServerWrap + // N.B. "sync" action but only considers the self side, i.e., to actually fire, must also explicitly check canServerWrap // N.B. doesn't actually change any state public boolean canClientWrap(Role self, EClientWrap cw) { return isConnected(self, cw.peer); } - // N.B. only considers the self side, i.e., to actually fire (sync), must also explicitly check canClientWrap + // N.B. "sync" action but only considers the self side, i.e., to actually fire, must also explicitly check canClientWrap // N.B. doesn't actually change queues state public boolean canServerWrap(Role self, EServerWrap sw) { @@ -137,6 +136,7 @@ public SQueues disconnect(Role self, EDisconnect d) return copy; } + // N.B. direction sensitive (viz., after some disconnect) public boolean isConnected(Role self, Role peer) { return this.connected.get(self).get(peer); diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 7f560e219..3a24cbdbc 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -111,6 +111,7 @@ module tmp.Test; data "..." from "..." as T; + //* explicit global protocol Proto1(role A, role B, role C) { @@ -126,7 +127,7 @@ explicit global protocol Proto1(role A, role B, role C) { 2() from A to B; connect A to C; - 3() from C to A; + 3() from A to C; } } } From 70d0ea42385655ca7b4ab9c6dcea8beb8497a93c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Apr 2019 09:52:00 +0100 Subject: [PATCH 364/539] [AllTest] Minor. --- .../java/org/scribble/core/model/endpoint/actions/EAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java index 199f5aafd..19bc2c1ff 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java @@ -34,7 +34,7 @@ protected EAction(ModelFactory mf, Role peer, MsgId mid, Payload pay) this.mf = mf; } - // Self means "current" self + // "self" means self of "this" (self of dual is this.peer) public abstract EAction toDual(Role self); public abstract SAction toGlobal(Role self); From 717c44646528e6b7a84b48a06602d2e6355ecee4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Apr 2019 14:09:03 +0100 Subject: [PATCH 365/539] [AllTest] Minor. --- .../scribble/core/model/global/SConfig.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index 75a33af5e..ee1e49fc5 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -143,24 +143,28 @@ public List sync(Role r1, EAction a1, Role r2, EAction a2) { for (EFsm succ2 : succs2) { - Map tmp1 = new HashMap<>(this.efsms); - tmp1.put(r1, succ1); - tmp1.put(r2, succ2); - SQueues tmp2; - if (((a1.isRequest() && a2.isAccept()) || (a1.isAccept() && a2.isRequest()))) + Map efsms = new HashMap<>(this.efsms); + // a1 and a2 are a "sync" pair, add all combinations of succ1 and succ2 that may arise + efsms.put(r1, succ1); // Overwrite existing r1/r2 entries + efsms.put(r2, succ2); + SQueues queues; + // a1 and a2 definitely "sync", now just determine whether it is a connect or wrap + if (((a1.isRequest() && a2.isAccept()) + || (a1.isAccept() && a2.isRequest()))) { - tmp2 = this.queues.connect(r1, r2); + queues = this.queues.connect(r1, r2); } - else if (((a1.isClientWrap() && a2.isServerWrap()) || (a1.isServerWrap() && a2.isClientWrap()))) + else if (((a1.isClientWrap() && a2.isServerWrap()) + || (a1.isServerWrap() && a2.isClientWrap()))) { // Doesn't affect queue state - tmp2 = this.queues; // OK, immutable? + queues = this.queues; // OK, immutable? } else { throw new RuntimeException("Shouldn't get in here: " + a1 + ", " + a2); } - res.add(this.mf.newSConfig(tmp1, tmp2)); + res.add(this.mf.newSConfig(efsms, queues)); } } return res; From 03b7d7e48394f3484f2e760076bc2bf021e44b4c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Apr 2019 14:44:11 +0100 Subject: [PATCH 366/539] [AllTest] Continued: refactoring core model classes. --- .../main/java/org/scribble/core/job/Core.java | 2 +- .../scribble/core/model/GraphBuilderUtil.java | 3 +++ .../model/endpoint/EGraphBuilderUtil.java | 4 +++- .../core/model/global/SGraphBuilder.java | 10 ++++---- .../core/model/global/SGraphBuilderUtil.java | 7 ++++++ .../core/model/global/actions/SAction.java | 24 ++++++++++++++----- .../model/global/actions/SClientWrap.java | 2 +- .../model/global/actions/SDisconnect.java | 2 +- .../core/model/global/actions/SReq.java | 2 +- .../actions/{SConnect.java => SRequest.java} | 10 ++++---- .../model/global/actions/SServerWrap.java | 2 +- 11 files changed, 47 insertions(+), 21 deletions(-) rename scribble-core/src/main/java/org/scribble/core/model/global/actions/{SConnect.java => SRequest.java} (86%) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 3b7638ac4..328f8295b 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -311,7 +311,7 @@ public SGraph buildSGraph(GProtoName fullname, Map egraphs, verbosePrintln("-- EFSM for " + r + ":\n" + egraphs.get(r).init.toDot()); }*/ - return this.sgraphb.buildSGraph(fullname, egraphs, explicit); // CHECKME: factor out util -- ? + return this.sgraphb.build(fullname, egraphs, explicit); // CHECKME: factor out util -- ? } // Pre: checkWellFormedness diff --git a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java index a50fb0d70..e15128d39 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/GraphBuilderUtil.java @@ -24,11 +24,14 @@ public abstract class GraphBuilderUtil { public final ModelFactory mf; // N.B. new states should be made by this.newState, not this.ef.newEState + // Doesn't call reset protected GraphBuilderUtil(ModelFactory mf) { this.mf = mf; } + protected abstract void reset(); + //public abstract S newState(L labs); // Doesn't factor out well with SState, doesn't use L and takes an SConfig protected void addEntryLabAux(S s, L lab) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index 7b07f366d..e204fd05b 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -71,6 +71,7 @@ public EGraphBuilderUtil(ModelFactory mf) } // N.B. called before every "new visit", including first (so util is reusable) -- called by constructor and finalise + @Override protected void reset() { //clear(); @@ -249,7 +250,8 @@ public List getPreds(EState s) } /* - * Finalise graph by treating IntermediateContinueEdges + * Finalise graph by treating IntermediateContinueEdges. + * Calls reset() on completion. */ public EGraph finalise() { diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index 42c07b3eb..027cec860 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -44,7 +44,7 @@ public SGraphBuilder(Core core) } // Do as an initial state rather than config? - protected SConfig createInitialSConfig(Map egraphs, + protected SConfig createInitConfig(Map egraphs, boolean explicit) { Map efsms = egraphs.entrySet().stream() @@ -57,10 +57,12 @@ protected SConfig createInitialSConfig(Map egraphs, // Also checks for non-deterministic payloads // Maybe refactor into an SGraph builder util; cf., EGraphBuilderUtil -- but not Visitor-based building (cf. EndpointGraphBuilder), this isn't an AST algorithm //public SGraph buildSGraph(Job job, GProtocolName fullname, SConfig c0) throws ScribbleException - public SGraph buildSGraph(GProtoName fullname, - Map egraphs, boolean explicit) throws ScribException + public SGraph build(GProtoName fullname, Map egraphs, + boolean explicit) throws ScribException { - SConfig c0 = createInitialSConfig(egraphs, explicit); + this.util.reset(); + + SConfig c0 = createInitConfig(egraphs, explicit); SState init = this.util.newState(c0); Set todo = new LinkedHashSet<>(); todo.add(init); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index 0b21dd68f..d3b845915 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -33,6 +33,13 @@ public class SGraphBuilderUtil public SGraphBuilderUtil(ModelFactory mf) { super(mf); + reset(); + } + + @Override + protected void reset() + { + this.states.clear(); } public SState newState(SConfig c) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java index c9784d91b..0bceb8fe1 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java @@ -23,6 +23,7 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; +// N.B. these are not exactly global type constructors -- they are "endpoint-oriented" like locals, but record both subj/obj roles (so more like locals with self) public abstract class SAction extends MAction { public final Role subj; @@ -33,12 +34,17 @@ public SAction(Role subj, Role obj, MsgId mid, Payload pay) this.subj = subj; } - public boolean isConnect() + public boolean isSend() { return false; } - public boolean isDisconnect() + public boolean isReceive() + { + return false; + } + + public boolean isRequest() { return false; } @@ -48,12 +54,17 @@ public boolean isAccept() return false; } - public boolean isSend() + public boolean isDisconnect() { return false; } - public boolean isReceive() + public boolean isClientWrap() + { + return false; + } + + public boolean isServerWrap() { return false; } @@ -71,7 +82,8 @@ public boolean containsRole(Role role) @Override public String toString() { - return this.subj + getCommSymbol() + this.obj + ":" + this.mid + this.payload; + return this.subj + getCommSymbol() + this.obj + ":" + this.mid + + this.payload; } @Override @@ -95,7 +107,7 @@ public boolean equals(Object o) return false; } SAction them = (SAction) o; - return super.equals(o) // Does canEquals + return super.equals(o) // Checks canEquals && this.subj.equals(them.subj); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SClientWrap.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SClientWrap.java index 34f0146dd..88d84a880 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SClientWrap.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SClientWrap.java @@ -26,7 +26,7 @@ public SClientWrap(Role subj, Role obj) } @Override - public boolean isConnect() + public boolean isClientWrap() { return true; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SDisconnect.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SDisconnect.java index ae5564bb5..7a41d62d6 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SDisconnect.java @@ -25,7 +25,7 @@ public SDisconnect(Role subj, Role obj) } @Override - public boolean isConnect() + public boolean isRequest() { return true; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SReq.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SReq.java index 4e74c0cc9..06534bb45 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SReq.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SReq.java @@ -25,7 +25,7 @@ public SReq(Role subj, Role obj, MsgId mid, Payload pay) } @Override - public boolean isConnect() + public boolean isRequest() { return true; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SConnect.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SRequest.java similarity index 86% rename from scribble-core/src/main/java/org/scribble/core/model/global/actions/SConnect.java rename to scribble-core/src/main/java/org/scribble/core/model/global/actions/SRequest.java index 98fd210fb..0fdcc6def 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SConnect.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SRequest.java @@ -17,15 +17,15 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Payload; -public class SConnect extends SAction +public class SRequest extends SAction { - public SConnect(Role subj, Role obj, MsgId mid, Payload pay) + public SRequest(Role subj, Role obj, MsgId mid, Payload pay) { super(subj, obj, mid, pay); } @Override - public boolean isConnect() + public boolean isRequest() { return true; } @@ -45,7 +45,7 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof SConnect)) + if (!(o instanceof SRequest)) { return false; } @@ -55,7 +55,7 @@ public boolean equals(Object o) @Override public boolean canEquals(Object o) { - return o instanceof SConnect; + return o instanceof SRequest; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SServerWrap.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SServerWrap.java index b99faba85..02ecbd1ed 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SServerWrap.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SServerWrap.java @@ -26,7 +26,7 @@ public SServerWrap(Role subj, Role obj) } @Override - public boolean isAccept() + public boolean isServerWrap() { return true; } From de74542bceb3a738d5fd8f766e170eab85e4f390 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Apr 2019 14:48:45 +0100 Subject: [PATCH 367/539] [AllTest] Minor. --- .../src/main/antlr3/org/scribble/parser/antlr/Scribble.g | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index adfd8e229..234721043 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -1,4 +1,7 @@ -/* > scribble-java +/** + * N.B. in Eclipse do Package Explorer, right click -> Open With -> Java Editor at least once for .g file association and syntax highlighting to work properly + * + * > scribble-java * $ java -cp scribble-parser/lib/antlr-3.5.2-complete.jar org.antlr.Tool -o scribble-parser/target/generated-sources/antlr3 scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g * * Cygwin/Windows From f2a5d8b5890991289608afe4c1390a7365821c1e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Apr 2019 15:08:11 +0100 Subject: [PATCH 368/539] [AllTest] Continued: refactoring core model classes. --- .../main/java/org/scribble/core/job/Core.java | 18 --------- .../org/scribble/core/job/CoreContext.java | 39 ++++++------------- .../core/model/global/SGraphBuilder.java | 3 ++ 3 files changed, 14 insertions(+), 46 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 328f8295b..dc53e5dc7 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -26,8 +26,6 @@ import org.scribble.core.model.ModelFactoryImpl; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.endpoint.EState; -import org.scribble.core.model.global.SGraph; -import org.scribble.core.model.global.SGraphBuilder; import org.scribble.core.model.visit.local.NonDetPayChecker; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; @@ -51,9 +49,6 @@ public class Core public final CoreConfig config; // Immutable private final CoreContext context; // Mutable (Visitor passes replace modules) - - //private final SGraphBuilderUtil sgraphb; // FIXME: refactor? - private final SGraphBuilder sgraphb; // FIXME: refactor? public Core(ModuleName mainFullname, Map args, //Map modcs, @@ -62,7 +57,6 @@ public Core(ModuleName mainFullname, Map args, this.config = newCoreConfig(mainFullname, args); this.context = newCoreContext(//modcs, imeds); // Single instance per Core and should never be shared - this.sgraphb = new SGraphBuilder(this);//this.config.mf.newSGraphBuilderUtil(); } // A Scribble extension should override newCoreConfig/Context/etc as appropriate @@ -301,18 +295,6 @@ protected void runGlobalModelCheckingPasses() throws ScribException } } } - - public SGraph buildSGraph(GProtoName fullname, Map egraphs, - boolean explicit) throws ScribException - { - /*verbosePrintln("(" + fullname + ") Building global model using:"); - for (Role r : egraphs.keySet()) - { - verbosePrintln("-- EFSM for " - + r + ":\n" + egraphs.get(r).init.toDot()); - }*/ - return this.sgraphb.build(fullname, egraphs, explicit); // CHECKME: factor out util -- ? - } // Pre: checkWellFormedness // Returns: fullname -> Module -- CHECKME TODO: refactor local Module creation to Job? diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index f597e75bf..d5322718f 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -25,6 +25,7 @@ import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.global.SGraph; +import org.scribble.core.model.global.SGraphBuilder; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.Role; @@ -259,26 +260,18 @@ public SGraph getSGraph(GProtoName fullname) throws ScribException SGraph graph = this.fSGraphs.get(fullname); if (graph == null) { - /*GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()) - .getProtocolDeclChild(fullname.getSimpleName());*/ - Map egraphs = - getEGraphsForSGraphBuilding(fullname, //gpd, - true); - boolean explicit = //gpd.isExplicit(); - this.imeds.get(fullname).isExplicit(); - //graph = SGraph.buildSGraph(egraphs, explicit, this.job, fullname); - graph = this.core.buildSGraph(fullname, egraphs, explicit); + Map egraphs = getEGraphsForSGraphBuilding(fullname, true); + boolean explicit = this.imeds.get(fullname).isExplicit(); + graph = new SGraphBuilder(this.core).build(fullname, egraphs, explicit); addSGraph(fullname, graph); } return graph; } private Map getEGraphsForSGraphBuilding(GProtoName fullname, - //GProtocolDecl gpd, boolean fair) throws ScribException { Map egraphs = new HashMap<>(); - //for (Role self : gpd.getHeaderChild().getRoleDeclListChild().getRoles()) for (Role self : this.imeds.get(fullname).roles) { egraphs.put(self, fair @@ -298,14 +291,9 @@ public SGraph getUnfairSGraph(GProtoName fullname) throws ScribException SGraph graph = this.uSGraphs.get(fullname); if (graph == null) { - /*GProtocolDecl gpd = (GProtocolDecl) getModule(fullname.getPrefix()) - .getProtocolDeclChild(fullname.getSimpleName());*/ - Map egraphs = getEGraphsForSGraphBuilding(fullname, //gpd, - false); - boolean explicit = //gpd.isExplicit(); - this.imeds.get(fullname).isExplicit(); - //graph = SGraph.buildSGraph(this.job, fullname, this.job.createInitialSConfig(job, egraphs, explicit)); - graph = this.core.buildSGraph(fullname, egraphs, explicit); + Map egraphs = getEGraphsForSGraphBuilding(fullname, false); + boolean explicit = this.imeds.get(fullname).isExplicit(); + graph = new SGraphBuilder(this.core).build(fullname, egraphs, explicit); addUnfairSGraph(fullname, graph); } return graph; @@ -316,11 +304,6 @@ protected void addUnfairSGraph(GProtoName fullname, SGraph graph) this.uSGraphs.put(fullname, graph); } - protected void addMinimisedEGraph(LProtoName fullname, EGraph graph) - { - this.mEGraphs.put(fullname, graph); - } - public EGraph getMinimisedEGraph(GProtoName fullname, Role role) throws ScribException { @@ -338,13 +321,13 @@ public EGraph getMinimisedEGraph(GProtoName fullname, Role role) return minimised; } - /*public ModuleContext getModuleContext(ModuleName fullname) + protected void addMinimisedEGraph(LProtoName fullname, EGraph graph) { - return this.modcs.get(fullname); - }*/ + this.mEGraphs.put(fullname, graph); + } // TODO: relocate - // Duplicated from CommandLine.runDot + // Duplicated from CommandLine.runDot -- TODO: update to use createTmpFile // Minimises the FSM up to bisimulation // N.B. ltsconvert will typically re-number the states private static String runAut(String fsm, String aut) throws ScribException diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index 027cec860..450e67fe7 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -125,6 +125,9 @@ else if (a.isAccept() || a.isRequest() || a.isClientWrap() this.core.verbosePrintln( "(" + fullname + ") Built global model...\n" + graph.init.toDot() + "\n(" + fullname + ") ..." + graph.states.size() + " states"); + + // FIXME: refactor verbose print to Core + return graph; } } From 6e27a895019cf6c0da07041c232269bf06e63ea8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Apr 2019 15:23:41 +0100 Subject: [PATCH 369/539] [AllTest] Minor. --- .../main/java/org/scribble/core/model/endpoint/EFsm.java | 2 -- .../java/org/scribble/core/model/global/SGraphBuilder.java | 6 ++++-- .../main/java/org/scribble/core/model/global/SModel.java | 2 ++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java index adc6d8eac..0a427d15c 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java @@ -44,8 +44,6 @@ public List getSuccs(EAction a) } // CHECKME: check if unfolded initial accept is possible, and if it breaks anything - - // Following are a bunch of wrapper methods to curr public boolean isInitial() { return this.curr.equals(this.graph.init); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index 450e67fe7..f60d4b537 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -93,7 +93,8 @@ public SGraph build(GProtoName fullname, Map egraphs, if (a.isSend() || a.isReceive() || a.isDisconnect()) { List next = curr.config.async(r, a); - todo.addAll(this.util.getSuccs(curr, a.toGlobal(r), next)); + Set succs = this.util.getSuccs(curr, a.toGlobal(r), next); // util.getSuccs constructs the edges + todo.addAll(succs); } // Synchronous (client/server) actions else if (a.isAccept() || a.isRequest() || a.isClientWrap() @@ -109,7 +110,8 @@ else if (a.isAccept() || a.isRequest() || a.isClientWrap() : abar.toGlobal(a.peer); // CHECKME: edge will be drawn as the connect, but should be read as the sync. of both -- something like "r1, r2: sync" may be more consistent (or take a set of actions as the edge label?) List next = curr.config.sync(r, a, a.peer, abar); - todo.addAll(this.util.getSuccs(curr, aglobal, next)); + Set succs = this.util.getSuccs(curr, aglobal, next); // util.getSuccs constructs the edges + todo.addAll(succs); } } else diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index dd7058b39..c8408ab8c 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -29,6 +29,8 @@ import org.scribble.core.type.name.Role; import org.scribble.util.ScribException; + +// For doing validation operations on an SGraph (cf. EFsm, use Graph as an FSM) public class SModel { public final SGraph graph; From 4e63b55005ccda0eae521a751b7755982eb20cd1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Apr 2019 15:57:50 +0100 Subject: [PATCH 370/539] [AllTest] Continued: refactoring core model classes. --- .../main/java/org/scribble/core/job/Core.java | 22 ++++++++++++---- .../org/scribble/core/job/CoreContext.java | 26 +++++++------------ .../scribble/core/lang/global/GProtocol.java | 11 -------- 3 files changed, 26 insertions(+), 33 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index dc53e5dc7..5720eb1ee 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -26,6 +26,7 @@ import org.scribble.core.model.ModelFactoryImpl; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.global.SGraph; import org.scribble.core.model.visit.local.NonDetPayChecker; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; @@ -248,6 +249,7 @@ protected void runProjectionSyntaxWfPasses() throws ScribException protected void runLocalModelCheckingPasses() throws ScribException { + verbosePrintPass("Checking non-deterministic messaging action payloads..."); for (GProtoName fullname : this.context.getParsedFullnames()) { GProtocol inlined = this.context.getInlined(fullname); @@ -265,7 +267,7 @@ protected void runLocalModelCheckingPasses() throws ScribException protected void runGlobalModelCheckingPasses() throws ScribException { - verbosePrintPass("Building and checking models from projected inlineds..."); // CHECKME: separate and move model building earlier? + verbosePrintPass("Building and checking global models from projected inlineds..."); // CHECKME: separate and move model building earlier? // CHECKME: refactor more/whole validation into lang.GProtocol ? for (GProtoName fullname : this.context.getParsedFullnames()) { @@ -273,7 +275,6 @@ protected void runGlobalModelCheckingPasses() throws ScribException { continue; } - verbosePrintPass("Validating: " + fullname); if (this.config.args.get(CoreArgs.SPIN)) { if (this.config.args.get(CoreArgs.FAIR)) @@ -281,20 +282,31 @@ protected void runGlobalModelCheckingPasses() throws ScribException throw new RuntimeException( "[TODO]: -spin currently does not support fair ouput choices."); } + verbosePrintPass("Validating by Spin: " + fullname); GProtocol.validateBySpin(this, fullname); } else { - GProtocol.validateByScribble(this, fullname, true); + verbosePrintPass("Validating by Scribble: " + fullname); + validateByScribble(fullname, true); if (!this.config.args.get(CoreArgs.FAIR)) { verbosePrintPass( - "Validating with \"unfair\" output choices: " + fullname); - GProtocol.validateByScribble(this, fullname, false); // TODO: only need to check progress, not full validation + "Validating by Scribble with \"unfair\" output choices: " + fullname); + validateByScribble(fullname, false); // TODO: only need to check progress, not full validation } } } } + + protected void validateByScribble(GProtoName fullname, boolean fair) + throws ScribException + { + SGraph graph = fair + ? this.context.getSGraph(fullname) + : this.context.getUnfairSGraph(fullname); + this.config.mf.newSModel(graph).validate(this); + } // Pre: checkWellFormedness // Returns: fullname -> Module -- CHECKME TODO: refactor local Module creation to Job? diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index d5322718f..b4b5703fe 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -208,21 +208,6 @@ public EGraph getEGraph(GProtoName fullname, Role self) } return graph; } - - public EGraph getEGraph(LProtoName fullname) - { - EGraph graph = this.fEGraphs.get(fullname); - if (graph == null) - { - /*Module proj = getProjection(fullname, role); // Projected module contains a single protocol - EGraphBuilder builder = new EGraphBuilder(this.job); // Obtains an EGraphBuilderUtil from Job - proj.accept(builder); - graph = builder.util.finalise(); - addEGraph(fulllpn, graph);*/ - throw new RuntimeException("Shouldn't get in here: "); // FIXME: restore previous pattern, construct on (first) get - } - return graph; - } protected void addEGraph(LProtoName fullname, EGraph graph) { @@ -237,13 +222,20 @@ public EGraph getUnfairEGraph(GProtoName fullname, Role role) } // Pre: Core.runSyntacticWfPasses + // Pre: getEGraph(Global, Role) -- currently (CHECKME: revise ?) public EGraph getUnfairEGraph(LProtoName fullname) { EGraph unfair = this.uEGraphs.get(fullname); if (unfair == null) { - Pair p = getEGraph(fullname).init - .unfairTransform(this.core.config.mf);//.toGraph(); + EGraph fair = this.fEGraphs.get(fullname); // Getting fair EGraph directly by projected fullname (cf. getEGraph(GProtoName, Role)) + if (fair == null) + { + throw new RuntimeException( + "Call getEGraph(Global, Role) before getUnfairEGraph: " + fullname); + // CHECKME: refactor ? + } + Pair p = fair.init.unfairTransform(this.core.config.mf); //.toGraph(); unfair = new EGraph(p.left, p.right); addUnfairEGraph(fullname, unfair); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 4f311f57c..d1808d603 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -221,17 +221,6 @@ public boolean canEquals(Object o) // TODO FIXME: refactor following methods (e.g., make non-static?) - - public static void validateByScribble(Core core, GProtoName fullname, - boolean fair) throws ScribException - { - CoreContext corec = core.getContext(); - SGraph graph = (fair) - ? corec.getSGraph(fullname) - : corec.getUnfairSGraph(fullname); - //graph.toModel().validate(job); - core.config.mf.newSModel(graph).validate(core); - } public static void validateBySpin(Core core, GProtoName fullname) throws ScribException From 531405a0d0ec3fa0373e02d7aa93873f8a32becf Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Apr 2019 16:24:03 +0100 Subject: [PATCH 371/539] [AllTest] Continued: refactoring core model classes. --- .../main/java/org/scribble/core/job/Core.java | 25 ++++++++++++++----- .../core/model/global/SGraphBuilder.java | 10 +------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 5720eb1ee..3391f9482 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -159,7 +159,7 @@ protected void runEfsmBuildingPasses() // Seems to be OK even if runSyntaxWfPasses does not succeed (cf. unfair transform) EGraph graph = this.context.getEGraph(fullname, self); verbosePrintPass( - "Built EFSM: " + inlined.fullname + ":\n" + graph.toDot()); + "Built EFSM: " + inlined.fullname + "\n" + graph.toDot()); } } @@ -282,18 +282,17 @@ protected void runGlobalModelCheckingPasses() throws ScribException throw new RuntimeException( "[TODO]: -spin currently does not support fair ouput choices."); } - verbosePrintPass("Validating by Spin: " + fullname); + //verbosePrintPass("Validating by Spin: " + fullname); GProtocol.validateBySpin(this, fullname); } else { - verbosePrintPass("Validating by Scribble: " + fullname); + //verbosePrintPass("Validating by Scribble: " + fullname); validateByScribble(fullname, true); if (!this.config.args.get(CoreArgs.FAIR)) { - verbosePrintPass( - "Validating by Scribble with \"unfair\" output choices: " + fullname); - validateByScribble(fullname, false); // TODO: only need to check progress, not full validation + //verbosePrintPass("Validating by Scribble with \"unfair\" output choices: " + fullname); + validateByScribble(fullname, false); // TODO: only need to check progress, not "full" validation } } } @@ -305,6 +304,20 @@ protected void validateByScribble(GProtoName fullname, boolean fair) SGraph graph = fair ? this.context.getSGraph(fullname) : this.context.getUnfairSGraph(fullname); + if (this.config.args.containsKey(CoreArgs.VERBOSE)) + { + String dot = graph.init.toDot(); + String[] lines = dot.split("\\R"); + verbosePrintPass( + //"(" + fullname + ") Built global model...\n" + graph.init.toDot() + "\n(" + fullname + ") ..." + graph.states.size() + " states"); + "Built " + (!fair ? "\"unfair\" " : "") + "global model (" + + graph.states.size() + " states): " + fullname + "\n" + + ((lines.length > 50) // CHECKME: factor out constant? + ? "...[snip]... (model text over 50 lines, try -[u]model)" + : dot)); + } + + verbosePrintPass("Checking " + (!fair ? "\"unfair\" " : "") + "global model: " + fullname); this.config.mf.newSModel(graph).validate(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index f60d4b537..a3ba79b71 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -122,14 +122,6 @@ else if (a.isAccept() || a.isRequest() || a.isClientWrap() } } - SGraph graph = this.core.config.mf.newSGraph(fullname, - this.util.getStates(), init); - this.core.verbosePrintln( - "(" + fullname + ") Built global model...\n" + graph.init.toDot() + "\n(" - + fullname + ") ..." + graph.states.size() + " states"); - - // FIXME: refactor verbose print to Core - - return graph; + return this.core.config.mf.newSGraph(fullname, this.util.getStates(), init); } } From 4aa00bea53b15f0932dc6855045e201accf9c4ad Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Apr 2019 16:38:53 +0100 Subject: [PATCH 372/539] [AllTest] Minor. --- .../src/main/java/org/scribble/core/job/Core.java | 3 ++- .../java/org/scribble/core/job/CoreContext.java | 2 +- .../org/scribble/core/lang/global/GProtocol.java | 3 +-- .../org/scribble/core/model/ModelFactory.java | 15 ++++++++------- scribble-test/src/test/scrib/tmp/Test.scr | 3 ++- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 3391f9482..21f71eb94 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -317,7 +317,8 @@ protected void validateByScribble(GProtoName fullname, boolean fair) : dot)); } - verbosePrintPass("Checking " + (!fair ? "\"unfair\" " : "") + "global model: " + fullname); + verbosePrintPass("Checking " + (!fair ? "\"unfair\" " : "") + + "global model: " + fullname); this.config.mf.newSModel(graph).validate(this); } diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index b4b5703fe..d76f763e3 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -319,7 +319,7 @@ protected void addMinimisedEGraph(LProtoName fullname, EGraph graph) } // TODO: relocate - // Duplicated from CommandLine.runDot -- TODO: update to use createTmpFile + // Duplicated from CommandLine.runDot -- TODO: update to use createTmpFile (cf. runDot) // Minimises the FSM up to bisimulation // N.B. ltsconvert will typically re-number the states private static String runAut(String fsm, String aut) throws ScribException diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index d1808d603..37f12402a 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -220,8 +220,7 @@ public boolean canEquals(Object o) - // TODO FIXME: refactor following methods (e.g., make non-static?) - + // TODO FIXME: refactor following methods (e.g., non-static?) public static void validateBySpin(Core core, GProtoName fullname) throws ScribException { diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java index 5abe17d48..e6e6d44d5 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java @@ -50,13 +50,6 @@ public interface ModelFactory EGraphBuilderUtil newEGraphBuilderUtil(); SGraphBuilderUtil newSGraphBuilderUtil(); - EState newEState(Set labs); - - SState newSState(SConfig config); - SGraph newSGraph(GProtoName proto, Map states, SState init); - SConfig newSConfig(Map state, SQueues buffs); - SModel newSModel(SGraph g); - ESend newESend(Role peer, MsgId mid, Payload pay); ERecv newERecv(Role peer, MsgId mid, Payload pay); EReq newEReq(Role peer, MsgId mid, Payload pay); @@ -64,6 +57,9 @@ public interface ModelFactory EDisconnect newEDisconnect(Role peer); EClientWrap newEClientWrap(Role peer); EServerWrap newEServerWrap(Role peer); + + EState newEState(Set labs); + //EFsm new EFsm(...) SSend newSSend(Role subj, Role obj, MsgId mid, Payload pay); SRecv newSRecv(Role subj, Role obj, MsgId mid, Payload pay); @@ -72,4 +68,9 @@ public interface ModelFactory SDisconnect newSDisconnect(Role subj, Role obj); SClientWrap newSClientWrap(Role subj, Role obj); SServerWrap newSServerWrap(Role subj, Role obj); + + SState newSState(SConfig config); + SConfig newSConfig(Map state, SQueues buffs); + SGraph newSGraph(GProtoName proto, Map states, SState init); + SModel newSModel(SGraph g); } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 3a24cbdbc..e54b66f89 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -115,7 +115,7 @@ data "..." from "..." as T; //* explicit global protocol Proto1(role A, role B, role C) { - connect A to B; + connect A to B; // TODO: junit tests for explicit rec X { choice at A @@ -133,6 +133,7 @@ explicit global protocol Proto1(role A, role B, role C) } //*/ + /* global protocol Proto1(role A, role B) { From 867c0459cc7b5703fb92ceb4aa741b9ae401c3ba Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Apr 2019 16:46:20 +0100 Subject: [PATCH 373/539] [AllTest] Minor. --- .../scribble/core/lang/global/GProtocol.java | 1 - .../org/scribble/core/model/ModelFactory.java | 2 +- .../scribble/core/model/ModelFactoryImpl.java | 2 +- .../scribble/core/model/global/SModel.java | 26 +++++++++---------- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 37f12402a..91584fc82 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -34,7 +34,6 @@ import org.scribble.core.lang.local.LProjection; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.endpoint.EState; -import org.scribble.core.model.global.SGraph; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java index e6e6d44d5..be7c939a8 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java @@ -26,11 +26,11 @@ import org.scribble.core.model.endpoint.actions.EReq; import org.scribble.core.model.endpoint.actions.ESend; import org.scribble.core.model.endpoint.actions.EServerWrap; -import org.scribble.core.model.global.SQueues; import org.scribble.core.model.global.SConfig; import org.scribble.core.model.global.SGraph; import org.scribble.core.model.global.SGraphBuilderUtil; import org.scribble.core.model.global.SModel; +import org.scribble.core.model.global.SQueues; import org.scribble.core.model.global.SState; import org.scribble.core.model.global.actions.SAcc; import org.scribble.core.model.global.actions.SClientWrap; diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java index 98223c910..12f5370f6 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java @@ -26,11 +26,11 @@ import org.scribble.core.model.endpoint.actions.EReq; import org.scribble.core.model.endpoint.actions.ESend; import org.scribble.core.model.endpoint.actions.EServerWrap; -import org.scribble.core.model.global.SQueues; import org.scribble.core.model.global.SConfig; import org.scribble.core.model.global.SGraph; import org.scribble.core.model.global.SGraphBuilderUtil; import org.scribble.core.model.global.SModel; +import org.scribble.core.model.global.SQueues; import org.scribble.core.model.global.SState; import org.scribble.core.model.global.actions.SAcc; import org.scribble.core.model.global.actions.SClientWrap; diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index c8408ab8c..e2a3da347 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -39,9 +39,13 @@ public SModel(SGraph graph) { this.graph = graph; } + + private Core core; // FIXME public void validate(Core core) throws ScribException { + this.core = core; + SState init = this.graph.init; Map states = this.graph.states; @@ -87,7 +91,7 @@ public void validate(Core core) throws ScribException Set starved = checkRoleProgress(states, init, termset); Map> ignored = checkEventualReception(states, init, termset); - errorMsg = appendProgressErrorMessages(errorMsg, starved, ignored, core, + errorMsg = appendProgressErrorMessages(errorMsg, starved, ignored, states, termset); } } @@ -123,31 +127,31 @@ protected String appendSafetyErrorMessages(String errorMsg, } protected String appendProgressErrorMessages(String errorMsg, - Set starved, Map> ignored, Core core, + Set starved, Map> ignored, Map states, Set termset) { if (!starved.isEmpty()) { errorMsg += "\nRole progress violation for " + starved + " in session state terminal set:\n " - + termSetToString(core, termset, states); + + termSetToString(termset, states); } if (!ignored.isEmpty()) { errorMsg += "\nEventual reception violation for " + ignored + " in session state terminal set:\n " - + termSetToString(core, termset, states); + + termSetToString(termset, states); } return errorMsg; } - protected String termSetToString(Core core, Set termset, + protected String termSetToString(Set termset, Map all) { - return core.config.args.get(CoreArgs.VERBOSE) - ? termset.stream().map((i) -> all.get(i).toString()) + return this.core.config.args.get(CoreArgs.VERBOSE) + ? termset.stream().map(i -> all.get(i).toString()) .collect(Collectors.joining(",")) - : termset.stream().map((i) -> new Integer(all.get(i).id).toString()) + : termset.stream().map(i -> new Integer(all.get(i).id).toString()) .collect(Collectors.joining(",")); } @@ -266,10 +270,4 @@ protected static Map> checkEventualReception( } return ignored; } - - @Override - public String toString() - { - return this.graph.toString(); - } } From fb2cb776ec0237bff4a71a6671ef667d07595e1c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Apr 2019 22:32:22 +0100 Subject: [PATCH 374/539] [AllTest] Continued: refactoring core model classes. --- .../main/java/org/scribble/core/job/Core.java | 2 +- .../scribble/core/model/global/SGraph.java | 322 +++++++++++++----- .../core/model/global/SGraphBuilder.java | 9 +- .../scribble/core/model/global/SModel.java | 61 ++-- .../bad/efsm/grecursion/unfair/Test01.scr | 2 + .../bad/liveness/messagelive/Test01.scr | 2 + scribble-test/src/test/scrib/tmp/Test.scr | 83 ++--- 7 files changed, 326 insertions(+), 155 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 21f71eb94..699cac8c3 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -313,7 +313,7 @@ protected void validateByScribble(GProtoName fullname, boolean fair) "Built " + (!fair ? "\"unfair\" " : "") + "global model (" + graph.states.size() + " states): " + fullname + "\n" + ((lines.length > 50) // CHECKME: factor out constant? - ? "...[snip]... (model text over 50 lines, try -[u]model)" + ? "...[snip]... (model text over 50 lines, try -[u]model[png])" : dot)); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java index eb496a138..a2e9250df 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java @@ -14,6 +14,7 @@ package org.scribble.core.model.global; import java.util.Collections; +import java.util.Deque; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -21,12 +22,12 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.SortedMap; -import java.util.TreeMap; +import java.util.stream.Collectors; import org.scribble.core.model.MPrettyPrint; import org.scribble.core.model.global.actions.SAction; import org.scribble.core.type.name.GProtoName; +import org.scribble.util.Pair; public class SGraph implements MPrettyPrint { @@ -35,8 +36,6 @@ public class SGraph implements MPrettyPrint public final SState init; public Map states; - // CHECKME: reach only used for termsets? find faster way for termsets? check local types? recursion? - private Map> reach; // State ID -> reachable states (not reflexive) private Set> termSets; // Unlike EState, SGraph is not just a "simple wrapper" for an existing graph of nodes -- it is a computed structure, so no lightweight "toGraph" wrapper method; cf., EState @@ -45,9 +44,177 @@ public SGraph(GProtoName proto, Map states, SState init) this.proto = proto; this.init = init; this.states = Collections.unmodifiableMap(states); - this.reach = getReachabilityMap(); + //this.reach = getReachabilityMap(); + + // TODO: refactor + tarjan(); + Set> termSets = new HashSet<>(); + for (Set scc : this.sscs) + { + if (scc.size() == 1 && scc.iterator().next().isTerminal() + || scc.stream().anyMatch( + y -> y.getSuccs().stream().anyMatch(x -> !scc.contains(x)))) + { + continue; + } + termSets.add(scc.stream().map(x -> x.id).collect(Collectors.toSet())); + } + this.termSets = Collections.unmodifiableSet(termSets); + } + + public Set> getTermSets() + { + return this.termSets; } + // Returns null if end cannot be reached + public List getTraceFromInit(SState end) + { + Map> traces = bfsFromInit(end); + LinkedList trace = new LinkedList<>(); + for (int id = end.id; id != init.id; ) // Skipped if init.id == end.id (e.g., error in init state, such as a bad connect) + { + Pair p = traces.get(id); + trace.push(p.left); + id = p.right; + } + return trace; + } + + // Returns null if end cannot be reached + private Map> bfsFromInit(SState end) // (cf., Dijkstra's with all weights 1) + { + Set seen = new HashSet<>(); + List todo = new LinkedList<>(); + seen.add(this.init.id); + todo.add(this.init.id); + Map> traces = new HashMap<>(); + while (!todo.isEmpty()) + { + Iterator i = todo.iterator(); + Integer currid = i.next(); + i.remove(); + if (currid == end.id) + { + return traces; + } + SState curr = this.states.get(currid); + Iterator as = curr.getActions().iterator(); // CHECKME: how about non-det actions? (cf. below, todo.contains(succ.id)? e.g., bad.liveness.messagelive.Test01) + for (SState succ : curr.getSuccs()) + { + SAction a = as.next(); + if (seen.contains(succ.id) || todo.contains(succ.id)) + { + continue; + } + seen.add(succ.id); + traces.put(succ.id, new Pair<>(a, currid)); + todo.add(succ.id); + } + } + return null; + } + + @Override + public String toDot() + { + return this.init.toDot(); + } + + @Override + public String toAut() + { + return this.init.toAut(); + } + + @Override + public String toString() + { + return this.init.toString(); + } + + // Following are "one-time" usage, on instance construction + private int counter = 0; + private Map indices = new HashMap<>(); // s.id -> index + private Map lowlinks = new HashMap<>(); // s.id -> lowlink + private Deque stack = new LinkedList<>(); + private Set onStack = new HashSet<>(); + private Set> sscs = new HashSet<>(); + + private void tarjan() + { + for (SState v : this.states.values()) + { + if (!indices.containsKey(v.id)) + { + strongConnect(v); + } + } + } + + private void strongConnect(SState v) + { + // Set the depth index for v to the smallest unused index + int index = this.counter++; + this.indices.put(v.id, index); + this.lowlinks.put(v.id, index); + this.stack.push(v); + this.onStack.add(v.id); + + // Consider successors of v + for (SState w : v.getSuccs()) + { + if (!this.indices.containsKey(w.id)) + { + // Successor w has not yet been visited; recurse on it + strongConnect(w); + int vlowlink = this.lowlinks.get(v.id); + int wlowlink = this.lowlinks.get(w.id); + this.lowlinks.put(v.id, (vlowlink <= wlowlink ? vlowlink : wlowlink)); + } + else if (this.onStack.contains(w.id)) + { + // Successor w is in stack S and hence in the current SCC + // If w is not on stack, then (v, w) is a cross-edge in the DFS tree and must be ignored + // Note: The next line may look odd - but is correct. + // It says w.index not w.lowlink; that is deliberate and from the original paper + int vlowlink = this.lowlinks.get(v.id); + int windex = this.indices.get(w.id); + this.lowlinks.put(v.id, (vlowlink <= windex ? vlowlink : windex)); + } + } + + // If v is a root node, pop the stack and generate an SCC + if (this.lowlinks.get(v.id) == this.indices.get(v.id)) + { + Set ssc = new HashSet<>(); + SState w; + do + { + w = this.stack.pop(); + this.onStack.remove(w.id); + ssc.add(w); + } + while (w.id != v.id); + this.sscs.add(ssc); + } + } + + + + + + + + + + + + + + /* + private Map> reach; // State ID -> reachable states (not reflexive) + public Set> getTerminalSets() { if (this.termSets != null) @@ -76,9 +243,9 @@ public Set> getTerminalSets() private boolean isTerminalSetMember(SState s) { - Set rs = this.reach.get(s.id); + Set rs = this.reach.get(s.id); // Pre: rs.contains(s.id) Set tmp = new HashSet<>(rs); - tmp.remove(s.id); + tmp.remove(s.id); // Unnecessary to remove, but this.reach.get(r).equals(rs) check below trivially holds by def for (Integer r : tmp) { if (!this.reach.containsKey(r) || !this.reach.get(r).equals(rs)) @@ -89,71 +256,6 @@ private boolean isTerminalSetMember(SState s) return true; } - // Pre: reach.get(start).contains(end) // FIXME: will return null if initial - // state is error - public List getTrace(SState start, SState end) - { - SortedMap> candidates = new TreeMap<>(); - Set dis0 = new HashSet(); - dis0.add(start.id); - candidates.put(0, dis0); - - Set seen = new HashSet<>(); - seen.add(start.id); - - return getTraceAux(new LinkedList<>(), seen, candidates, end); - } - - // Djikstra's - private List getTraceAux(List trace, Set seen, - SortedMap> candidates, SState end) - { - Integer dis = candidates.keySet().iterator().next(); - Set cs = candidates.get(dis); - Iterator it = cs.iterator(); - Integer currid = it.next(); - it.remove(); - if (cs.isEmpty()) - { - candidates.remove(dis); - } - - SState curr = this.states.get(currid); - Iterator as = curr.getActions().iterator(); - Iterator ss = curr.getSuccs().iterator(); - while (as.hasNext()) - { - SAction a = as.next(); - SState s = ss.next(); - if (s.id == end.id) - { - trace.add(a); - return trace; - } - - if (!seen.contains(s.id) && this.reach.containsKey(s.id) - && this.reach.get(s.id).contains(end.id)) - { - seen.add(s.id); - Set tmp1 = candidates.get(dis + 1); - if (tmp1 == null) - { - tmp1 = new HashSet<>(); - candidates.put(dis + 1, tmp1); - } - tmp1.add(s.id); - List tmp2 = new LinkedList<>(trace); - tmp2.add(a); - List res = getTraceAux(tmp2, seen, candidates, end); - if (res != null) - { - return res; - } - } - } - return null; - } - // Not reflexive public Map> getReachabilityMap() { @@ -190,7 +292,7 @@ private Map> getReachabilityAux( } } - for (boolean again = true; again;) + for (boolean again = true; again; ) { again = false; for (int i = 0; i < size; i++) @@ -233,21 +335,71 @@ private Map> getReachabilityAux( return Collections.unmodifiableMap(res); } - @Override - public String toDot() + public List getTrace(SState start, SState end) { - return this.init.toDot(); - } + SortedMap> candidates = new TreeMap<>(); + Set dis0 = new LinkedHashSet(); + dis0.add(start.id); + candidates.put(0, dis0); - @Override - public String toAut() - { - return this.init.toAut(); + Set seen = new HashSet<>(); + seen.add(start.id); + + return getTraceAux(new LinkedList<>(), seen, candidates, end); } - @Override - public String toString() + // Djikstra's + private List getTraceAux(List trace, Set seen, + SortedMap> candidates, SState end) { - return this.init.toString(); + Integer dis = candidates.keySet().iterator().next(); + Set cs = candidates.get(dis); + Iterator it = cs.iterator(); + Integer currid = it.next(); + it.remove(); + if (cs.isEmpty()) + { + candidates.remove(dis); + } + + SState curr = this.states.get(currid); + Iterator as = curr.getActions().iterator(); + Iterator succs = curr.getSuccs().iterator(); + while (as.hasNext()) + { + SAction a = as.next(); + SState succ = succs.next(); + if (succ.id == end.id) + { + trace.add(a); + return trace; + } + + if (!seen.contains(succ.id)) + //&& this.reach.containsKey(s.id) && this.reach.get(s.id).contains(end.id)) + { + seen.add(succ.id); + if (succ.isTerminal()) // Unnecesary, visiting succ will do "while (as.hasNext())" + { + continue; + } + Set tmp1 = candidates.get(dis+1); + if (tmp1 == null) + { + tmp1 = new HashSet<>(); + candidates.put(dis+1, tmp1); + } + tmp1.add(succ.id); + List tmp2 = new LinkedList<>(trace); + tmp2.add(a); + List res = getTraceAux(tmp2, seen, candidates, end); // FIXME: replace by a loop + if (res != null) + { + return res; + } + } + } + return null; } -} + //*/ +} \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index a3ba79b71..6796f8b03 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -66,22 +66,19 @@ public SGraph build(GProtoName fullname, Map egraphs, SState init = this.util.newState(c0); Set todo = new LinkedHashSet<>(); todo.add(init); - - // FIXME: factor out model building and integrate with getAllNodes (seen == all) - int debugCount = 1; - while (!todo.isEmpty()) + for (int debugCount = 1; !todo.isEmpty(); ) // Compute configs and use util to construct graph, until no more new configs { Iterator i = todo.iterator(); SState curr = i.next(); i.remove(); - if (this.core.config.args.get(CoreArgs.VERBOSE)) + /*if (this.core.config.args.get(CoreArgs.VERBOSE)) { if (debugCount++ % 50 == 0) { this.core.verbosePrintln( "(" + fullname + ") Building global states: " + debugCount); } - } + }*/ // Based on config semantics, not "static" graph edges (cf., super.getActions) -- used to build global model graph Map> fireable = curr.config.getFireable(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index e2a3da347..339a11fe3 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -51,6 +51,25 @@ public void validate(Core core) throws ScribException String errorMsg = ""; + errorMsg = checkSafety(core, init, states, errorMsg); + + if (!core.config.args.get(CoreArgs.NO_PROGRESS)) + { + //job.debugPrintln("(" + this.graph.proto + ") Checking progress: "); // Incompatible with current errorMsg approach*/ + errorMsg = checkProgress(init, states, errorMsg); + } + + if (!errorMsg.equals("")) + { + //throw new ScribbleException("\n" + init.toDot() + errorMsg); + throw new ScribException(errorMsg); + } + //job.debugPrintln("(" + this.graph.proto + ") Progress satisfied."); // Also safety... current errorMsg approach + } + + private String checkSafety(Core core, SState init, + Map states, String errorMsg) + { int count = 0; for (SState s : states.values()) { @@ -68,7 +87,7 @@ public void validate(Core core) throws ScribException if (!errors.isEmpty()) { // FIXME: getTrace can get stuck when local choice subjects are disabled - List trace = this.graph.getTrace(init, s); // FIXME: getTrace broken on non-det self loops? + List trace = this.graph.getTraceFromInit(s); // FIXME: getTrace broken on non-det self loops? //errorMsg += "\nSafety violation(s) at " + s.toString() + ":\n Trace=" + trace; errorMsg += "\nSafety violation(s) at session state " + s.id + ":\n Trace=" + trace; @@ -76,32 +95,26 @@ public void validate(Core core) throws ScribException errorMsg = appendSafetyErrorMessages(errorMsg, errors); } core.verbosePrintln("(" + this.graph.proto + ") Checked all states: " + count); // May include unsafe states - //*/ - - if (!core.config.args.get(CoreArgs.NO_PROGRESS)) - { - //job.debugPrintln("(" + this.graph.proto + ") Checking progress: "); // Incompatible with current errorMsg approach*/ - - Set> termsets = this.graph.getTerminalSets(); - for (Set termset : termsets) - { - /*job.debugPrintln("(" + this.graph.proto + ") Checking terminal set: " - + termset.stream().map((i) -> new Integer(all.get(i).id).toString()).collect(Collectors.joining(","))); // Incompatible with current errorMsg approach*/ - - Set starved = checkRoleProgress(states, init, termset); - Map> ignored = - checkEventualReception(states, init, termset); - errorMsg = appendProgressErrorMessages(errorMsg, starved, ignored, - states, termset); - } - } + // FIXME: progress still to be checked below + return errorMsg; + } - if (!errorMsg.equals("")) + private String checkProgress(SState init, Map states, + String errorMsg) throws ScribException + { + Set> termsets = this.graph.getTermSets(); + for (Set termset : termsets) { - //throw new ScribbleException("\n" + init.toDot() + errorMsg); - throw new ScribException(errorMsg); + /*job.debugPrintln("(" + this.graph.proto + ") Checking terminal set: " + + termset.stream().map((i) -> new Integer(all.get(i).id).toString()).collect(Collectors.joining(","))); // Incompatible with current errorMsg approach*/ + + Set starved = checkRoleProgress(states, init, termset); + Map> ignored = + checkEventualReception(states, init, termset); + errorMsg = appendProgressErrorMessages(errorMsg, starved, ignored, + states, termset); } - //job.debugPrintln("(" + this.graph.proto + ") Progress satisfied."); // Also safety... current errorMsg approach + return errorMsg; } protected String appendSafetyErrorMessages(String errorMsg, diff --git a/scribble-test/src/test/resources/bad/efsm/grecursion/unfair/Test01.scr b/scribble-test/src/test/resources/bad/efsm/grecursion/unfair/Test01.scr index 69428ba26..42fb6de49 100644 --- a/scribble-test/src/test/resources/bad/efsm/grecursion/unfair/Test01.scr +++ b/scribble-test/src/test/resources/bad/efsm/grecursion/unfair/Test01.scr @@ -1,3 +1,5 @@ +//$ bin/scribblec.sh -ip scribble-test/src/test/resources scribble-test/src/test/resources/bad/efsm/grecursion/unfair/Test01.scr + module bad.efsm.grecursion.unfair.Test01; diff --git a/scribble-test/src/test/resources/bad/liveness/messagelive/Test01.scr b/scribble-test/src/test/resources/bad/liveness/messagelive/Test01.scr index d57369c91..7090e7ab0 100644 --- a/scribble-test/src/test/resources/bad/liveness/messagelive/Test01.scr +++ b/scribble-test/src/test/resources/bad/liveness/messagelive/Test01.scr @@ -1,3 +1,5 @@ +//$ bin/scribblec.sh -ip scribble-test/src/test/resources scribble-test/src/test/resources/bad/liveness/messagelive/Test01.scr + module bad.liveness.messagelive.Test01; diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index e54b66f89..9333bdae1 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -112,7 +112,12 @@ module tmp.Test; data "..." from "..." as T; -//* +global protocol Proto1(role A, role B) +{ + connect A to B; +} + +/* explicit global protocol Proto1(role A, role B, role C) { connect A to B; // TODO: junit tests for explicit @@ -685,48 +690,53 @@ global protocol Proto1(role A, role B) + + /* -global protocol SH2(role P, role R, role C) +type "System.UInt32" from "..." as int; + +global protocol SH(role P, role R, role C) { - plane(x1:int, x2:int, x3:int, x4:int) from P to R; - do Loop2(P, R, C); + plane(int, int, int, int) from P to R; + do Loop(P, R, C); } -aux global protocol Loop2(role P, role R, role C) +aux global protocol Loop(role P, role R, role C) { choice at P { - Above(v1:int) from P to R; - Res(b1:int) from R to P; - Above(v2:int) from P to R; - Res(b2:int) from R to P; + Above(int) from P to R; + Res(int) from R to P; + Above(int) from P to R; + Res(int) from R to P; choice at P { BothIn() from P to R; - BothIn(r1:int) from P to C; - do Loop2(P, R, C); + BothIn(int) from P to C; + //do Loop(P, R, C); } or { BothOut() from P to R; BothOut() from P to C; - do Loop2(P, R, C); + //do Loop(P, R, C); } or { Intersect() from P to R; - Res(i:int) from R to P; + Res(int) from R to P; choice at P { - One(r2:int) from P to C; - do Loop2(P, R, C); + One(int) from P to C; + //do Loop(P, R, C); } or { - Two(r3:int, r4:int) from P to C; - do Loop2(P, R, C); + Two(int, int) from P to C; + //do Loop(P, R, C); } } + do Loop(P, R, C); // FIXME: -spin fail if commented } or { @@ -736,54 +746,48 @@ aux global protocol Loop2(role P, role R, role C) } //*/ - - - /* -type "System.UInt32" from "..." as int; - -global protocol SH(role P, role R, role C) +global protocol SH2(role P, role R, role C) { - plane(int, int, int, int) from P to R; - do Loop(P, R, C); + plane(x1:int, x2:int, x3:int, x4:int) from P to R; + do Loop2(P, R, C); } -aux global protocol Loop(role P, role R, role C) +aux global protocol Loop2(role P, role R, role C) { choice at P { - Above(int) from P to R; - Res(int) from R to P; - Above(int) from P to R; - Res(int) from R to P; + Above(v1:int) from P to R; + Res(b1:int) from R to P; + Above(v2:int) from P to R; + Res(b2:int) from R to P; choice at P { BothIn() from P to R; - BothIn(int) from P to C; - //do Loop(P, R, C); + BothIn(r1:int) from P to C; + do Loop2(P, R, C); } or { BothOut() from P to R; BothOut() from P to C; - //do Loop(P, R, C); + do Loop2(P, R, C); } or { Intersect() from P to R; - Res(int) from R to P; + Res(i:int) from R to P; choice at P { - One(int) from P to C; - //do Loop(P, R, C); + One(r2:int) from P to C; + do Loop2(P, R, C); } or { - Two(int, int) from P to C; - //do Loop(P, R, C); + Two(r3:int, r4:int) from P to C; + do Loop2(P, R, C); } } - do Loop(P, R, C); // FIXME: -spin fail if commented } or { @@ -799,6 +803,7 @@ aux global protocol Loop(role P, role R, role C) + /* global protocol Proto1(role A, role B, role C) { From 36dda0583ea84a8c375fcb857a883454f56f666a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Apr 2019 22:47:42 +0100 Subject: [PATCH 375/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/global/SGraph.java | 10 +++--- .../scribble/core/model/global/SModel.java | 34 ++++++++++--------- scribble-test/src/test/scrib/tmp/Test.scr | 6 ++-- 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java index a2e9250df..f09739d80 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; import org.scribble.core.model.MPrettyPrint; import org.scribble.core.model.global.actions.SAction; @@ -36,7 +35,7 @@ public class SGraph implements MPrettyPrint public final SState init; public Map states; - private Set> termSets; + private Set> termSets; // Unlike EState, SGraph is not just a "simple wrapper" for an existing graph of nodes -- it is a computed structure, so no lightweight "toGraph" wrapper method; cf., EState public SGraph(GProtoName proto, Map states, SState init) @@ -48,7 +47,7 @@ public SGraph(GProtoName proto, Map states, SState init) // TODO: refactor tarjan(); - Set> termSets = new HashSet<>(); + Set> termSets = new HashSet<>(); for (Set scc : this.sscs) { if (scc.size() == 1 && scc.iterator().next().isTerminal() @@ -57,12 +56,13 @@ public SGraph(GProtoName proto, Map states, SState init) { continue; } - termSets.add(scc.stream().map(x -> x.id).collect(Collectors.toSet())); + //termSets.add(scc.stream().map(x -> x.id).collect(Collectors.toSet())); + termSets.add(Collections.unmodifiableSet(scc)); } this.termSets = Collections.unmodifiableSet(termSets); } - public Set> getTermSets() + public Set> getTermSets() { return this.termSets; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index 339a11fe3..69c914790 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -102,8 +102,8 @@ private String checkSafety(Core core, SState init, private String checkProgress(SState init, Map states, String errorMsg) throws ScribException { - Set> termsets = this.graph.getTermSets(); - for (Set termset : termsets) + Set> termsets = this.graph.getTermSets(); + for (Set termset : termsets) { /*job.debugPrintln("(" + this.graph.proto + ") Checking terminal set: " + termset.stream().map((i) -> new Integer(all.get(i).id).toString()).collect(Collectors.joining(","))); // Incompatible with current errorMsg approach*/ @@ -141,7 +141,7 @@ protected String appendSafetyErrorMessages(String errorMsg, protected String appendProgressErrorMessages(String errorMsg, Set starved, Map> ignored, - Map states, Set termset) + Map states, Set termset) { if (!starved.isEmpty()) { @@ -158,28 +158,28 @@ protected String appendProgressErrorMessages(String errorMsg, return errorMsg; } - protected String termSetToString(Set termset, + protected String termSetToString(Set termset, Map all) { return this.core.config.args.get(CoreArgs.VERBOSE) - ? termset.stream().map(i -> all.get(i).toString()) + ? termset.stream().map(x -> x.toString()) .collect(Collectors.joining(",")) - : termset.stream().map(i -> new Integer(all.get(i).id).toString()) + : termset.stream().map(x -> Integer.toString(x.id)) .collect(Collectors.joining(",")); } // ** Could subsume terminal state check, if terminal sets included size 1 with reflexive reachability (but not a good approach) protected static Set checkRoleProgress(Map states, - SState init, Set termset) throws ScribException + SState init, Set termset) throws ScribException { Set starved = new HashSet<>(); - Iterator i = termset.iterator(); - SState s = states.get(i.next()); + Iterator i = termset.iterator(); + SState s = i.next();//states.get(i.next()); Map ss = new HashMap<>(); s.config.efsms.keySet().forEach(r -> ss.put(r, s)); while (i.hasNext()) { - SState next = states.get(i.next()); + SState next = i.next();//states.get(i.next()); Map tmp = next.config.efsms; for (Role r : tmp.keySet()) { @@ -233,18 +233,20 @@ protected static Set checkRoleProgress(Map states, // (eventual reception) protected static Map> checkEventualReception( - Map states, SState init, Set termset) + Map states, SState init, Set termset) throws ScribException { - Set roles = states.get(termset.iterator().next()).config.efsms - .keySet(); + Set roles = //states.get(termset.iterator().next()) + termset.iterator().next() + .config.efsms.keySet(); - Iterator i = termset.iterator(); - Map> b0 = states.get(i.next()).config.queues + Iterator i = termset.iterator(); + Map> b0 = i.next()//states.get(i.next()) + .config.queues .getQueues(); while (i.hasNext()) { - SState s = states.get(i.next()); + SState s = i.next();//states.get(i.next()); SQueues b = s.config.queues; for (Role r1 : roles) { diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 9333bdae1..f36ed7801 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -112,10 +112,12 @@ module tmp.Test; data "..." from "..." as T; +/* global protocol Proto1(role A, role B) { - connect A to B; + connect A to B; // Testing SGraph.getTraceFromInit, error in init state (empty trace) } +//*/ /* explicit global protocol Proto1(role A, role B, role C) @@ -692,7 +694,7 @@ global protocol Proto1(role A, role B) -/* +//* type "System.UInt32" from "..." as int; global protocol SH(role P, role R, role C) From 5e0bf5aa38a7469bd11526fe6909bfa7e639d5b1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Apr 2019 22:55:14 +0100 Subject: [PATCH 376/539] [AllTest] Minor. --- .../main/java/org/scribble/core/model/global/SGraph.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java index f09739d80..ca16912de 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java @@ -33,9 +33,9 @@ public class SGraph implements MPrettyPrint public final GProtoName proto; // For debugging only? deprecate? public final SState init; - public Map states; + public final Map states; - private Set> termSets; + private final Set> termSets; // Unlike EState, SGraph is not just a "simple wrapper" for an existing graph of nodes -- it is a computed structure, so no lightweight "toGraph" wrapper method; cf., EState public SGraph(GProtoName proto, Map states, SState init) @@ -64,7 +64,7 @@ public SGraph(GProtoName proto, Map states, SState init) public Set> getTermSets() { - return this.termSets; + return this.termSets; // Already unmodifiable } // Returns null if end cannot be reached From de8d01008556545f7a6211563b61f8c325e6db80 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Apr 2019 22:58:01 +0100 Subject: [PATCH 377/539] [AllTest] Minor. --- .../java/org/scribble/core/model/global/SGraphBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index 6796f8b03..3ebb51deb 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -22,7 +22,6 @@ import java.util.stream.Collectors; import org.scribble.core.job.Core; -import org.scribble.core.job.CoreArgs; import org.scribble.core.model.endpoint.EFsm; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.endpoint.actions.EAction; @@ -66,7 +65,8 @@ public SGraph build(GProtoName fullname, Map egraphs, SState init = this.util.newState(c0); Set todo = new LinkedHashSet<>(); todo.add(init); - for (int debugCount = 1; !todo.isEmpty(); ) // Compute configs and use util to construct graph, until no more new configs + for (//int debugCount = 1 + ; !todo.isEmpty(); ) // Compute configs and use util to construct graph, until no more new configs { Iterator i = todo.iterator(); SState curr = i.next(); From f7eebac46b2972642025d7773c4d5dda7ab96de1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 23 Apr 2019 14:55:16 +0100 Subject: [PATCH 378/539] [AllTest] Continued: refactoring core model classes. --- .../callbackapi/CBEndpointApiGenerator.java | 16 +- .../callbackapi/CBEndpointApiGenerator3.java | 14 +- .../StateChannelApiGenerator.java | 4 +- .../ioifaces/IOInterfacesGenerator.java | 14 +- .../ioifaces/IOStateIfaceGen.java | 4 +- .../statetype/STStateChanAPIBuilder.java | 4 +- .../org/scribble/core/model/ModelFactory.java | 4 +- .../scribble/core/model/ModelFactoryImpl.java | 4 +- .../scribble/core/model/endpoint/EState.java | 13 +- .../core/model/endpoint/EStateKind.java | 4 +- .../scribble/core/model/global/SConfig.java | 232 +++++------------- .../core/model/global/SGraphBuilder.java | 3 +- .../scribble/core/model/global/SModel.java | 19 +- .../scribble/core/model/global/SState.java | 6 +- .../{SQueues.java => SingleBuffers.java} | 63 +++-- scribble-test/src/test/scrib/tmp/Test.scr | 6 +- 16 files changed, 157 insertions(+), 253 deletions(-) rename scribble-core/src/main/java/org/scribble/core/model/global/{SQueues.java => SingleBuffers.java} (72%) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 7eddbf8d3..50fc1d0b6 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -175,8 +175,8 @@ public Map buildEndpointClass() throws ScribException switch (kind) { case OUTPUT: stateKind = "org.scribble.runtime.handlers.states.ScribOutputState"; break; - case UNARY_INPUT: - case POLY_INPUT: stateKind = "org.scribble.runtime.handlers.states.ScribInputState"; break; + case UNARY_RECEIVE: + case POLY_RECIEVE: stateKind = "org.scribble.runtime.handlers.states.ScribInputState"; break; case TERMINAL: stateKind = "org.scribble.runtime.handlers.states.ScribEndState"; break; case ACCEPT: case SERVER_WRAP: @@ -189,12 +189,12 @@ public Map buildEndpointClass() throws ScribException stateClass += "\n"; stateClass += "public final class " + stateId + " extends " + stateKind + " {\n"; stateClass += "public static final " + stateId + " id = new " + stateId + "(" - + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + s.getDetActions().get(0).peer + "." + s.getDetActions().get(0).peer : "") + + ((kind == EStateKind.UNARY_RECEIVE || kind == EStateKind.POLY_RECIEVE) ? SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".roles." + s.getDetActions().get(0).peer + "." + s.getDetActions().get(0).peer : "") + ");\n"; stateClass += "private " + stateId + "(" - + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? "org.scribble.type.name.Role peer" : "") + + ((kind == EStateKind.UNARY_RECEIVE || kind == EStateKind.POLY_RECIEVE) ? "org.scribble.type.name.Role peer" : "") + ") {\n"; - stateClass += ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? "super(\"" + stateId + "\", peer);" : "super(\"" + stateId + "\");") + "\n"; + stateClass += ((kind == EStateKind.UNARY_RECEIVE || kind == EStateKind.POLY_RECIEVE) ? "super(\"" + stateId + "\", peer);" : "super(\"" + stateId + "\");") + "\n"; for (EAction a : s.getActions()) { stateClass += "this.succs.put(" + SessionApiGenerator.getEndpointApiRootPackageName(this.proto) + ".ops." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) @@ -350,7 +350,7 @@ public Map buildEndpointClass() throws ScribException } // branches - if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) + if (s.getStateKind() == EStateKind.UNARY_RECEIVE || s.getStateKind() == EStateKind.POLY_RECIEVE) { String bprefix = SessionApiGenerator .getEndpointApiRootPackageName(this.proto).replace('.', '/') @@ -563,8 +563,8 @@ private String generateRegister(GProtoName gpn, Role self, EState s) res += "\n"; break; } - case UNARY_INPUT: - case POLY_INPUT: + case UNARY_RECEIVE: + case POLY_RECIEVE: { res += "public " + name + " callback(" + prefix + name + "_" + s.id + " sid"; /*for (EAction a : s.getAllActions()) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 8fc23347d..12704bb25 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -225,7 +225,7 @@ public Map buildEndpointClass() throws ScribException JobContext jobc = this.job.getContext(); for (EState s : states) { - if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) + if (s.getStateKind() == EStateKind.UNARY_RECEIVE || s.getStateKind() == EStateKind.POLY_RECIEVE) { String bprefix = getHandlersSelfPackage().replace('.', '/') + "/"; String branchName = this.stateNames.get(s.id) + "_Branch"; @@ -392,8 +392,8 @@ protected void generateRegister(ClassBuilder endpointClass, String endpointName, break; } - case UNARY_INPUT: - case POLY_INPUT: + case UNARY_RECEIVE: + case POLY_RECIEVE: { MethodBuilder callback = endpointClass.newMethod("callback"); callback.addModifiers("public"); @@ -509,8 +509,8 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, switch (kind) { case OUTPUT: stateKind = "org.scribble.runtime.handlers.states.ScribOutputState"; break; - case UNARY_INPUT: - case POLY_INPUT: stateKind = "org.scribble.runtime.handlers.states.ScribInputState"; break; + case UNARY_RECEIVE: + case POLY_RECIEVE: stateKind = "org.scribble.runtime.handlers.states.ScribInputState"; break; case TERMINAL: stateKind = "org.scribble.runtime.handlers.states.ScribEndState"; break; case ACCEPT: case SERVER_WRAP: @@ -533,9 +533,9 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, ? new String[] { "org.scribble.type.name.Role peer" } : new String[0];*/ ConstructorBuilder stateCons = stateClass.newConstructor(); stateCons.addModifiers("private"); - Role peer = (kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? s.getDetActions().iterator().next().peer : null; + Role peer = (kind == EStateKind.UNARY_RECEIVE || kind == EStateKind.POLY_RECIEVE) ? s.getDetActions().iterator().next().peer : null; stateCons.addBodyLine("super(\"" + stateName + "\"" - + ((kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) ? ", " + getRolesPackage() + "." + peer + "." + peer : "") // FIXME: factor out + + ((kind == EStateKind.UNARY_RECEIVE || kind == EStateKind.POLY_RECIEVE) ? ", " + getRolesPackage() + "." + peer + "." + peer : "") // FIXME: factor out + ");"); for (EAction a : s.getActions()) { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 4cc0faac8..0b3b00b1e 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -175,11 +175,11 @@ private ClassBuilder constructClass(EState curr) throws ScribException // FIXME { return new AcceptSockGen(this, curr).generateType(); } - case UNARY_INPUT: + case UNARY_RECEIVE: { return new ReceiveSockGen(this, curr).generateType(); } - case POLY_INPUT: + case POLY_RECIEVE: { // Receive only return new BranchSockGen(this, curr).generateType(); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index d848c0f94..cc66ab683 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -222,7 +222,7 @@ private void generateActionAndSuccessorInterfacesAndCollectPreActions(Set visited, EState s) t case OUTPUT: // Send, connect, disconnect ifgen = new SelectIfaceGen(this.apigen, this.actions, s); break; - case UNARY_INPUT: + case UNARY_RECEIVE: ifgen = new ReceiveIfaceGen(this.apigen, this.actions, s); break; - case POLY_INPUT: + case POLY_RECIEVE: InterfaceBuilder cases = new CaseIfaceGen(this.apigen, this.actions, s).generateType(); this.iostates.put(cases.getName(), cases); ifgen = new BranchIfaceGen(this.apigen, this.actions, s); @@ -363,7 +363,7 @@ private void generateHandleInterfaces(Set visited, EState s) throws Scri return; } - if (s.getStateKind() == EStateKind.POLY_INPUT) + if (s.getStateKind() == EStateKind.POLY_RECIEVE) { //Set succifs = this.preds.get(s); String key = HandleIfaceGen.getHandleInterfaceName(getSelf(), s); @@ -388,7 +388,7 @@ private void generateHandleInterfacesSecondPass(Set visited, EState s) return; } - if (s.getStateKind() == EStateKind.POLY_INPUT) + if (s.getStateKind() == EStateKind.POLY_RECIEVE) { //GProtocolName gpn = this.apigen.getGProtocolName(); Role self = this.apigen.getSelf(); @@ -481,7 +481,7 @@ private void addIOStateInterfacesToStateChannels(Set visited, EState s) iostate.addImports(SessionApiGenerator.getStateChannelPackageName(this.gpn, self) + ".*"); } - if (s.getStateKind() == EStateKind.POLY_INPUT) + if (s.getStateKind() == EStateKind.POLY_RECIEVE) { // Add CaseInterface to each CaseSocket TypeBuilder cases = this.apigen.getType(CaseSockGen.getCaseSocketName(this.apigen.getSocketClassName(s))); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java index 2ab5a19e9..5f48b4e65 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOStateIfaceGen.java @@ -132,8 +132,8 @@ public static String getIOStateInterfaceName(Role self, EState s) switch (s.getStateKind()) { case OUTPUT: name = "Select"; break; - case UNARY_INPUT: name = "Receive"; break; - case POLY_INPUT: name = "Branch"; break; + case UNARY_RECEIVE: name = "Receive"; break; + case POLY_RECIEVE: name = "Branch"; break; case TERMINAL: throw new RuntimeScribException("Shouldn't get in here: " + s); default: throw new RuntimeException("(TODO) I/O interface generation: " + s.getStateKind()); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index 14c42bf57..493429f30 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -72,14 +72,14 @@ public Map build() // filepath -> source { case ACCEPT: throw new RuntimeException("TODO"); case OUTPUT: api.put(getFilePath(getStateChanName(s)), this.ob.build(this, s)); break; - case POLY_INPUT: + case POLY_RECIEVE: { api.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); api.put(getFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); // FIXME: factor out break; } case TERMINAL: api.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket - case UNARY_INPUT: + case UNARY_RECEIVE: { api.put(getFilePath(getStateChanName(s)), this.rb.build(this, s)); //api.put(getFilePath(getStateChanName(s) + "_Cases"), this.cb.build(this, s)); // FIXME: factor out diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java index be7c939a8..dfca245e9 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java @@ -30,7 +30,7 @@ import org.scribble.core.model.global.SGraph; import org.scribble.core.model.global.SGraphBuilderUtil; import org.scribble.core.model.global.SModel; -import org.scribble.core.model.global.SQueues; +import org.scribble.core.model.global.SingleBuffers; import org.scribble.core.model.global.SState; import org.scribble.core.model.global.actions.SAcc; import org.scribble.core.model.global.actions.SClientWrap; @@ -70,7 +70,7 @@ public interface ModelFactory SServerWrap newSServerWrap(Role subj, Role obj); SState newSState(SConfig config); - SConfig newSConfig(Map state, SQueues buffs); + SConfig newSConfig(Map state, SingleBuffers buffs); SGraph newSGraph(GProtoName proto, Map states, SState init); SModel newSModel(SGraph g); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java index 12f5370f6..802170cb1 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java @@ -30,7 +30,7 @@ import org.scribble.core.model.global.SGraph; import org.scribble.core.model.global.SGraphBuilderUtil; import org.scribble.core.model.global.SModel; -import org.scribble.core.model.global.SQueues; +import org.scribble.core.model.global.SingleBuffers; import org.scribble.core.model.global.SState; import org.scribble.core.model.global.actions.SAcc; import org.scribble.core.model.global.actions.SClientWrap; @@ -165,7 +165,7 @@ public SGraph newSGraph(GProtoName proto, Map states, } @Override - public SConfig newSConfig(Map state, SQueues buffs) + public SConfig newSConfig(Map state, SingleBuffers buffs) { return new SConfig(this, state, buffs); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index e57bef461..9e984d89a 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -283,7 +283,7 @@ protected String toPml(Map seen, Role r) .collect(Collectors.joining("")) + "fi\n"; } - else if (kind == EStateKind.UNARY_INPUT || kind == EStateKind.POLY_INPUT) + else if (kind == EStateKind.UNARY_RECEIVE || kind == EStateKind.POLY_RECIEVE) { res += "if\n" @@ -322,8 +322,9 @@ private static String getLabel(Map seen, EState s, Role r) return lab; } - // FIXME: refactor as "isSyncOnly" -- and make an isSync in IOAction - public boolean isRequestOrClientWrapOnly() + // CHECKME: make an isSync in IOAction ? + // This state is a *necessarily* "blocking" output sync-client (request, clientwrap) state + public boolean isSyncClientOnly() { return getStateKind() == EStateKind.OUTPUT && getActions().stream() @@ -354,10 +355,10 @@ protected void visitState(EStateVisitor v) throws ScribException { case ACCEPT: v.visitAccept(this); break; case OUTPUT: v.visitOutput(this); break; - case POLY_INPUT: v.visitPolyInput(this); break; + case POLY_RECIEVE: v.visitPolyInput(this); break; case SERVER_WRAP: v.visitServerWrap(this); break; case TERMINAL: v.visitTerminal(this); break; - case UNARY_INPUT: v.visitUnaryInput(this); break; + case UNARY_RECEIVE: v.visitUnaryInput(this); break; default: throw new RuntimeException("Unknown state kind: " + kind); } } @@ -378,7 +379,7 @@ public EStateKind getStateKind() } else if (as.stream().allMatch(EAction::isReceive)) { - return (as.size() == 1) ? EStateKind.UNARY_INPUT : EStateKind.POLY_INPUT; + return (as.size() == 1) ? EStateKind.UNARY_RECEIVE : EStateKind.POLY_RECIEVE; } else if (as.stream().allMatch(EAction::isAccept)) { diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EStateKind.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EStateKind.java index 169e99fe4..1144bc836 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EStateKind.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EStateKind.java @@ -18,8 +18,8 @@ public enum EStateKind { TERMINAL, OUTPUT, // SEND, REQUEST and CLIENT_WRAP - UNARY_INPUT, - POLY_INPUT, + UNARY_RECEIVE, + POLY_RECIEVE, ACCEPT, // CHECKME: distinguish unary/multi accept? SERVER_WRAP, } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index ee1e49fc5..f526a7faa 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.core.model.ModelFactory; import org.scribble.core.model.endpoint.EFsm; @@ -38,22 +39,18 @@ import org.scribble.core.model.endpoint.actions.EServerWrap; import org.scribble.core.type.name.Role; +// Immutable -- async/sync (i.e, "fire") return updated copies (in the general case, they must return List anyway due to non-det) public class SConfig { protected final ModelFactory mf; public final Map efsms; - public final SQueues queues; + public final SingleBuffers queues; // N.B. currently hardcoded to capacity one - //public WFConfig(Map state, Map> queue) - //public WFConfig(Map state, WFqueueers queues) - public SConfig(ModelFactory mf, Map state, SQueues queues) + public SConfig(ModelFactory mf, Map state, SingleBuffers queues) { this.mf = mf; - this.efsms = Collections.unmodifiableMap(state); - //this.queues = Collections.unmodifiableMap(queue.keySet().stream() .collect(Collectors.toMap((k) -> k, (k) -> Collections.unmodifiableMap(queue.get(k))))); - //this.queues = Collections.unmodifiableMap(queue); this.queues = queues; } @@ -118,7 +115,7 @@ public List async(Role self, EAction a) { Map efsms = new HashMap<>(this.efsms); efsms.put(self, succ); - SQueues queues = + SingleBuffers queues = a.isSend() ? this.queues.send(self, (ESend) a) : a.isReceive() ? this.queues.receive(self, (ERecv) a) : a.isDisconnect() ? this.queues.disconnect(self, (EDisconnect) a) @@ -147,7 +144,7 @@ public List sync(Role r1, EAction a1, Role r2, EAction a2) // a1 and a2 are a "sync" pair, add all combinations of succ1 and succ2 that may arise efsms.put(r1, succ1); // Overwrite existing r1/r2 entries efsms.put(r2, succ2); - SQueues queues; + SingleBuffers queues; // a1 and a2 definitely "sync", now just determine whether it is a connect or wrap if (((a1.isRequest() && a2.isAccept()) || (a1.isAccept() && a2.isRequest()))) @@ -174,34 +171,26 @@ else if (((a1.isClientWrap() && a2.isServerWrap()) public Map getStuckMessages() { Map res = new HashMap<>(); - for (Role r : this.efsms.keySet()) + for (Role self : this.efsms.keySet()) { - //EndpointState s = this.states.get(r); - EFsm s = this.efsms.get(r); + EFsm s = this.efsms.get(self); EStateKind k = s.curr.getStateKind(); - if (k == EStateKind.UNARY_INPUT || k == EStateKind.POLY_INPUT) + if (k == EStateKind.UNARY_RECEIVE || k == EStateKind.POLY_RECIEVE) { - /*Set duals = this.queues.get(r).entrySet().stream() - .filter((e) -> e.getValue() != null) - .map((e) -> e.getValue().toDual(e.getKey())) - .collect(Collectors.toSet()); - if (duals.stream().anyMatch((a) -> s.isAcceptable(a))) - { - break; - }*/ - Role peer = s.curr.getActions().iterator().next().peer; - ESend send = this.queues.getQueue(r).get(peer); + Role peer = s.curr.getActions().get(0).peer; // Pre: consistent ext choice subj + ESend send = this.queues.getQueue(self).get(peer); if (send != null) { ERecv recv = send.toDual(peer); if (!s.curr.hasAction(recv)) - //res.put(r, new IOError(peer)); - res.put(r, recv); + { + res.put(self, recv); + } } } - /*else if (k == Kind.ACCEPT) // FIXME: ..and connect + /*else if (k == Kind.ACCEPT) // CHECKME: ..and request (Client/ServerWrap? -- factor out "blocking"? async. blocking vs. sync? n.b. outputs blocking on queue space) { - // FIXME: issue is, unlike regular input states, blocked connect/accept may become unblocked later, so queued messages may not be stuck + // CHECKME: issue is, unlike regular input states, blocked connect/accept may become unblocked later, so queued messages may not actually be stuck // (if message is queued on the actual blocked connection, it should be orphan message) // so, message is stuck only if connect/accept is genuinely deadlocked, which will be detected as that }*/ @@ -209,47 +198,17 @@ public Map getStuckMessages() return res; } - // Doesn't include locally terminated (single term state does not induce a deadlock cycle) -- i.e. only "bad" deadlocks + // Doesn't include locally terminated (single term state does not induce a deadlock cycle) public Set> getWaitForErrors() { Set> res = new HashSet<>(); List todo = new LinkedList<>(this.efsms.keySet()); - /*while (!todo.isEmpty()) - { - Role r = todo.get(0); - todo.remove(r); - Set seen = new HashSet<>(); - while (true) - { - if (seen.contains(r)) - { - res.add(seen); - break; - } - seen.add(r); - Role rr = isInputBlocked(r); - if (rr == null) - { - break; - } - todo.remove(rr); - if (this.states.get(rr).isTerminal()) - { - seen.add(rr); - res.add(seen); - break; - } - r = rr; - } - }*/ - while (!todo.isEmpty()) // FIXME: maybe better to do directly on states, rather than via roles + while (!todo.isEmpty()) // CHECKME: maybe better to do directly on states, rather than via roles { Role r = todo.remove(0); - //Set cycle = isCycle(new HashSet<>(), new HashSet<>(Arrays.asList(r))); if (!this.efsms.get(r).curr.isTerminal()) { Set cycle = isWaitForChain(r); - //if (!cycle.isEmpty()) if (cycle != null) { todo.removeAll(cycle); @@ -260,37 +219,21 @@ public Set> getWaitForErrors() return res; } - // Includes dependencies from input-blocking, termination and connect-blocking - // FIXME: should also include connect? - // NB: if this.states.get(orig).isTerminal() then orig is returned as "singleton deadlock" - //public Set isCycle(Set candidate, Set todo) - public Set isWaitForChain(Role orig) + // Return: null if no chain + // Includes dependencies from input-blocking, termination and connect-blocking // CHECKME: should also include connect? + // N.B. if this.states.get(init).isTerminal() then orig is returned as "singleton deadlock" -- CHECKME + public Set isWaitForChain(Role init) { - /*if (todo.isEmpty()) - { - return candidate; - }*/ - /*Set tmp = new HashSet(todo); - Role r = tmp.iterator().next(); - tmp.remove(r); - candidate.add(r);*/ Set candidate = new LinkedHashSet<>(); - Set todo = new LinkedHashSet<>(Arrays.asList(orig)); + Set todo = new LinkedHashSet<>(Arrays.asList(init)); while (!todo.isEmpty()) { Role r = todo.iterator().next(); todo.remove(r); candidate.add(r); - //EndpointState s = this.states.get(r); EFsm s = this.efsms.get(r); - - if (s == null) - { - System.out.println("AAA: " + this.efsms + ", " + r); - } - - if (s.curr.getStateKind() == EStateKind.OUTPUT && !s.curr.isRequestOrClientWrapOnly()) // FIXME: includes connect, could still be deadlock? -- no: doesn't include connect any more + if (s.curr.getStateKind() == EStateKind.OUTPUT && !s.curr.isSyncClientOnly()) // FIXME: includes connect, could still be deadlock? -- no: doesn't include connect any more { // FIXME: move into isWaitingFor return null; @@ -304,7 +247,6 @@ public Set isWaitForChain(Role orig) continue; } Set blocked = isWaitingFor(r); - //if (blocked.isEmpty()) if (blocked == null) { return null; @@ -325,110 +267,60 @@ public Set isWaitForChain(Role orig) return null; } - // Generalised to include connect-blocked roles - //private Role isInputBlocked(Role r) + // Return: set of roles that r *must* "wait for" one of them in order to proceed; null if not "r" is not *necessarily* blocked waiting for *another role* + // Generalised to include sync-client (request, clientWrap) roles private Set isWaitingFor(Role r) { - //EndpointState s = this.states.get(r); - EFsm s = this.efsms.get(r); - EStateKind k = s.curr.getStateKind(); - if (k == EStateKind.UNARY_INPUT || k == EStateKind.POLY_INPUT) + EFsm fsm = this.efsms.get(r); + EStateKind k = fsm.curr.getStateKind(); + if (k != EStateKind.TERMINAL) { - List all = s.curr.getActions(); - EAction a = all.get(0); // FIXME: assumes single choice subject (OK for current syntax, but should generalise) - /*if (a.isAccept()) // Sound? + return null; + } + + if (k == EStateKind.UNARY_RECEIVE || k == EStateKind.POLY_RECIEVE) + { + ERecv a = (ERecv) fsm.curr.getActions().get(0); // Pre: consistent ext choice subject -- CHECKME: generalise? + if (this.queues.getQueue(r).get(a.peer) != null) // Here, only looking for any message (not a.toDual, nor dual of any action, cf. stuck error) { return null; - }*/ - /*Role peer = a.peer; - if (a.isReceive() && this.queues.get(r).get(peer) == null) - { - //return peer; - }*/ - if (a.isReceive()) - { - Set peers = all.stream().map((x) -> x.peer).collect(Collectors.toSet()); - if (peers.stream().noneMatch((p) -> this.queues.getQueue(r).get(p) != null)) - { - return peers; - } - /*Set peers = new HashSet<>(); // Debugging AllTest/BadTest bad.efsm.grecursion.unfair.Test01; problem - for (EAction ea : all) - { - peers.add(ea.peer); - } - boolean tmp = true; - for (Role p : peers) - { - if (this.queues.get(r).get(p) != null) - { - tmp = false; - break; - } - } - if (tmp) - { - return peers; - }*/ } + return Stream.of(a.peer).collect(Collectors.toSet()); } else if (k == EStateKind.ACCEPT) { - // FIXME TODO: if analysing ACCEPTs, check if s is initial (not "deadlock blocked" if initial) -- no: instead, analysing connects - if (!s.isInitial()) + if (!fsm.isInitial()) // TODO CHECKME: if analysing ACCEPTs, check if "s" is initial (not "deadlock blocked" if initial) -- no: instead, analysing requests { - List all = s.curr.getActions(); // Should be singleton -- no: not any more - /*Set rs = all.stream().map((x) -> x.peer).collect(Collectors.toSet()); - if (rs.stream().noneMatch((x) -> this.states.get(x).getAllTakeable().contains(new Connect(r)))) // cf. getTakeable - //if (peera.equals(c.toDual(r)) && this.queues.canConnect(r, c)) + List as = fsm.curr.getActions(); // All accept + Role peer = as.get(0).peer; // Pre: consistent ext choice subject -- CHECKME: generalise? + if (this.efsms.get(peer).curr.getActions().stream() + .anyMatch(x -> as.contains(x.toDual(peer)))) { - return rs; - }*/ - Set res = new HashSet(); - for (EAction a : all) // Accept // FIXME: WrapServer - { - if (this.efsms.get(a.peer).curr.getActions().contains(a.toDual(r))) - { - return null; - } - res.add(a.peer); - } - if (!res.isEmpty()) - { - return res; + return null; } + return Stream.of(peer).collect(Collectors.toSet()); } } - //else if (k == Kind.CONNECTION) - else if (k == EStateKind.OUTPUT //|| k == Kind.ACCEPT ..// FIXME: check connects if no available sends - ) + else if (k == EStateKind.OUTPUT) //|| k == Kind.ACCEPT .. // CHECKME: check requests if no available sends -- ? { - //List all = s.getAllAcceptable(); - if (s.curr.isRequestOrClientWrapOnly()) + if (!fsm.curr.isSyncClientOnly()) // Request, ClientWrap { - List all = s.curr.getActions(); - /*Set peers = all.stream().map((x) -> x.peer).collect(Collectors.toSet()); // Should be singleton by enabling conditions - if (peers.stream().noneMatch((p) -> this.states.get(p).getAllTakeable().contains(new Accept(r)))) // cf. getTakeable - { - return peers; - }*/ - Set res = new HashSet(); - for (EAction a : all) // Connect or WrapClient - { - if (this.efsms.get(a.peer).curr.getActions().contains(a.toDual(r))) - { - return null; - } - res.add(a.peer); - } - if (!res.isEmpty()) + return null; + } + List as = fsm.curr.getActions(); + Set res = new HashSet(); + for (EAction a : as) + { + if (this.efsms.get(a.peer).curr.getActions().contains(a.toDual(r))) { - return res; + return null; } + res.add(a.peer); } + return res; // Non-empty, because as.size() > 0 and didn't already return } - return null; - //return Collections.emptySet(); + // TODO FIXME: ServerWrap + throw new RuntimeException("[TODO] " + k); } // Generalised to include "unconnected" messages -- should unconnected messages be treated via stuck instead? @@ -512,8 +404,8 @@ public Map> getFireable() // Currently not convenient to delegate to states, as state types not distinguished case TERMINAL: break; case OUTPUT: as.addAll(getOutputFireable(self, fsm)); break; - case UNARY_INPUT: - case POLY_INPUT: + case UNARY_RECEIVE: + case POLY_RECIEVE: as.addAll(getReceiveFireable(self, fsm)); // addAll for generic typing break; case ACCEPT: as.addAll(getAcceptFireable(self, fsm)); break; @@ -528,6 +420,7 @@ public Map> getFireable() return res; } + // Pre: fsm.curr.getStateKind() == EStateKind.OUTPUT // fsm is self's Efsm private List getOutputFireable(Role self, EFsm fsm) // "output" and "client" actions { @@ -566,6 +459,7 @@ else if (a.isRequest() || a.isClientWrap()) return res; } + // Pre: fsm.curr.getStateKind() == EStateKind.UNARY_RECEIVE or POLY_RECIEVE // Unary or poly receive private List getReceiveFireable(Role self, EFsm fsm) { @@ -574,6 +468,7 @@ private List getReceiveFireable(Role self, EFsm fsm) .collect(Collectors.toList()); } + // Pre: fsm.curr.getStateKind() == EStateKind.ACCEPT private List getAcceptFireable(Role self, EFsm fsm) { List as = fsm.curr.getActions(); @@ -585,6 +480,7 @@ private List getAcceptFireable(Role self, EFsm fsm) .collect(Collectors.toList()); } + // Pre: fsm.curr.getStateKind() == EStateKind.SERVER_WRAP // Duplicated from getAcceptFireable private List getServerWrapFireable(Role self, EFsm fsm) { diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index 3ebb51deb..e790a43d5 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -48,14 +48,13 @@ protected SConfig createInitConfig(Map egraphs, { Map efsms = egraphs.entrySet().stream() .collect(Collectors.toMap(Entry::getKey, e -> e.getValue().toFsm())); - SQueues b0 = new SQueues(efsms.keySet(), !explicit); + SingleBuffers b0 = new SingleBuffers(efsms.keySet(), !explicit); return this.core.config.mf.newSConfig(efsms, b0); } // Factory method: not fully integrated with SGraph constructor because of Job arg (debug printing) // Also checks for non-deterministic payloads // Maybe refactor into an SGraph builder util; cf., EGraphBuilderUtil -- but not Visitor-based building (cf. EndpointGraphBuilder), this isn't an AST algorithm - //public SGraph buildSGraph(Job job, GProtocolName fullname, SConfig c0) throws ScribbleException public SGraph build(GProtoName fullname, Map egraphs, boolean explicit) throws ScribException { diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index 69c914790..69ee971b0 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -34,13 +34,13 @@ public class SModel { public final SGraph graph; + + private Core core; // only used for debug printing // CHECKME: refactor? but avoiding in constructor to keep mf more independent/uniform public SModel(SGraph graph) { this.graph = graph; } - - private Core core; // FIXME public void validate(Core core) throws ScribException { @@ -70,31 +70,30 @@ public void validate(Core core) throws ScribException private String checkSafety(Core core, SState init, Map states, String errorMsg) { - int count = 0; + int debugCount = 1; for (SState s : states.values()) { if (core.config.args.get(CoreArgs.VERBOSE)) { - count++; - if (count % 50 == 0) + if (debugCount++ % 50 == 0) { //job.debugPrintln("(" + this.graph.proto + ") Checking safety: " + count + " states"); core.verbosePrintln( - "(" + this.graph.proto + ") Checking states: " + count); + "(" + this.graph.proto + ") Checking states: " + debugCount); } } + SStateErrors errors = s.getErrors(); if (!errors.isEmpty()) { - // FIXME: getTrace can get stuck when local choice subjects are disabled + // CHECKME: getTrace can get stuck when local choice subjects are disabled ? (has since been rewritten) List trace = this.graph.getTraceFromInit(s); // FIXME: getTrace broken on non-det self loops? - //errorMsg += "\nSafety violation(s) at " + s.toString() + ":\n Trace=" + trace; errorMsg += "\nSafety violation(s) at session state " + s.id + ":\n Trace=" + trace; } errorMsg = appendSafetyErrorMessages(errorMsg, errors); } - core.verbosePrintln("(" + this.graph.proto + ") Checked all states: " + count); // May include unsafe states + core.verbosePrintln("(" + this.graph.proto + ") Checked all states: " + debugCount); // May include unsafe states // FIXME: progress still to be checked below return errorMsg; } @@ -247,7 +246,7 @@ protected static Map> checkEventualReception( while (i.hasNext()) { SState s = i.next();//states.get(i.next()); - SQueues b = s.config.queues; + SingleBuffers b = s.config.queues; for (Role r1 : roles) { for (Role r2 : roles) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java index 4a63dc869..fd912e0d2 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java @@ -32,8 +32,8 @@ public class SState extends MPrettyState { public final SConfig config; - //protected SState(SConfig config) - public SState(SConfig config) // FIXME: now publically mutable + //protected + public SState(SConfig config) // FIXME? now publically mutable (for mf imple), same for EState { super(Collections.emptySet()); this.config = config; @@ -46,7 +46,7 @@ protected void addEdge(SAction a, SState s) super.addEdge(a, s); } - public SStateErrors getErrors() + public SStateErrors getErrors() // Means safety (i.e., individual state) errors { Map stuck = this.config.getStuckMessages(); Set> waitfor = this.config.getWaitForErrors(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java b/scribble-core/src/main/java/org/scribble/core/model/global/SingleBuffers.java similarity index 72% rename from scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java rename to scribble-core/src/main/java/org/scribble/core/model/global/SingleBuffers.java index 5f273c951..e165ada15 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SQueues.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SingleBuffers.java @@ -29,12 +29,15 @@ import org.scribble.core.model.endpoint.actions.EServerWrap; import org.scribble.core.type.name.Role; -public class SQueues +// Immutable -- send/receive/etc return updated copies +public class SingleBuffers { private final Map> connected = new HashMap<>(); // client -> server -> connected? (symmetric) - private final Map> queues = new HashMap<>(); // dest -> src -> msg // null ESend for empty queue + private final Map> buffs = new HashMap<>(); // dest -> src -> msg + // N.B. hardcoded to capacity one -- SQueues would be the generalisation + // null ESend for empty queue - public SQueues(Set roles, boolean implicit) + public SingleBuffers(Set roles, boolean implicit) { for(Role r1 : roles) { @@ -49,29 +52,29 @@ public SQueues(Set roles, boolean implicit) } } this.connected.put(r1, connected); - this.queues.put(r1, queues); + this.buffs.put(r1, queues); } } - protected SQueues(SQueues queues) + protected SingleBuffers(SingleBuffers queues) { - for (Role r : queues.queues.keySet()) + for (Role r : queues.buffs.keySet()) { this.connected.put(r, new HashMap<>(queues.connected.get(r))); - this.queues.put(r, new HashMap<>(queues.queues.get(r))); + this.buffs.put(r, new HashMap<>(queues.buffs.get(r))); } } public boolean canSend(Role self, ESend a) { return isConnected(self, a.peer) - && this.queues.get(a.peer).get(self) == null; + && this.buffs.get(a.peer).get(self) == null; } public boolean canReceive(Role self, ERecv a) { // N.B. *not* checking isConnected -- can still receive from our side after other side has closed - ESend send = this.queues.get(self).get(a.peer); + ESend send = this.buffs.get(self).get(a.peer); return send != null && send.toDual(a.peer).equals(a); } @@ -106,32 +109,36 @@ public boolean canServerWrap(Role self, EServerWrap sw) return isConnected(self, sw.peer); } - public SQueues send(Role self, ESend a) + // Return an updated copy + public SingleBuffers send(Role self, ESend a) { - SQueues copy = new SQueues(this); - copy.queues.get(a.peer).put(self, a); + SingleBuffers copy = new SingleBuffers(this); + copy.buffs.get(a.peer).put(self, a); return copy; } - public SQueues receive(Role self, ERecv a) + // Return an updated copy + public SingleBuffers receive(Role self, ERecv a) { - SQueues copy = new SQueues(this); - copy.queues.get(self).put(a.peer, null); + SingleBuffers copy = new SingleBuffers(this); + copy.buffs.get(self).put(a.peer, null); return copy; } // Sync action - public SQueues connect(Role src, Role dest) + // Return an updated copy + public SingleBuffers connect(Role src, Role dest) { - SQueues copy = new SQueues(this); + SingleBuffers copy = new SingleBuffers(this); copy.connected.get(src).put(dest, true); copy.connected.get(dest).put(src, true); return copy; } - public SQueues disconnect(Role self, EDisconnect d) + // Return an updated copy + public SingleBuffers disconnect(Role self, EDisconnect d) { - SQueues copy = new SQueues(this); + SingleBuffers copy = new SingleBuffers(this); copy.connected.get(self).put(d.peer, false); return copy; } @@ -144,20 +151,22 @@ public boolean isConnected(Role self, Role peer) public boolean isEmpty(Role r) // this.connected doesn't matter { - return this.queues.get(r).values().stream().allMatch(v -> v == null); + return this.buffs.get(r).values().stream().allMatch(v -> v == null); } // Return a (deep) copy -- currently, checkEventualReception expects a modifiable return + // N.B. hardcoded to capacity one public Map> getQueues() { - return this.queues.entrySet().stream().collect(Collectors.toMap( + return this.buffs.entrySet().stream().collect(Collectors.toMap( Entry::getKey, x -> new HashMap<>(x.getValue()))); // Collections.unmodifiableMap(x.getValue()) } + // N.B. hardcoded to capacity one public Map getQueue(Role r) { - return Collections.unmodifiableMap(this.queues.get(r)); + return Collections.unmodifiableMap(this.buffs.get(r)); } @Override @@ -165,7 +174,7 @@ public final int hashCode() { int hash = 131; hash = 31 * hash + this.connected.hashCode(); - hash = 31 * hash + this.queues.hashCode(); + hash = 31 * hash + this.buffs.hashCode(); return hash; } @@ -176,18 +185,18 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof SQueues)) + if (!(o instanceof SingleBuffers)) { return false; } - SQueues b = (SQueues) o; - return this.connected.equals(b.connected) && this.queues.equals(b.queues); + SingleBuffers b = (SingleBuffers) o; + return this.connected.equals(b.connected) && this.buffs.equals(b.buffs); } @Override public String toString() { - return this.queues.entrySet().stream() + return this.buffs.entrySet().stream() .filter(e -> e.getValue().values().stream().anyMatch(v -> v != null)) .collect(Collectors.toMap( e -> e.getKey(), diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index f36ed7801..7a53bec09 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -87,7 +87,7 @@ module tmp.Test; // TODO: rename addChildren1 // CHECKME: duplicate proto mods // ...check ad hoc ScribNode constructions go through af properly - + // ...refactor -spin as an ext // add exp conn checks to model validation // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) @@ -119,7 +119,7 @@ global protocol Proto1(role A, role B) } //*/ -/* +//* explicit global protocol Proto1(role A, role B, role C) { connect A to B; // TODO: junit tests for explicit @@ -694,7 +694,7 @@ global protocol Proto1(role A, role B) -//* +/* type "System.UInt32" from "..." as int; global protocol SH(role P, role R, role C) From 90e03355334fa6fa0e5101740c1d5310553f52e3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 23 Apr 2019 14:59:46 +0100 Subject: [PATCH 379/539] [AllTest] Minor. --- .../main/java/org/scribble/core/model/global/SConfig.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index f526a7faa..3f7ea1a0a 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -267,8 +267,9 @@ public Set isWaitForChain(Role init) return null; } - // Return: set of roles that r *must* "wait for" one of them in order to proceed; null if not "r" is not *necessarily* blocked waiting for *another role* - // Generalised to include sync-client (request, clientWrap) roles + // Return: set of roles that "r" *must* wait for one of them in order to proceed;.. + // ..or null if "r" is not *necessarily* blocked waiting for *another role* + // Wait-for blocking includes sync-client (request, clientWrap) roles private Set isWaitingFor(Role r) { EFsm fsm = this.efsms.get(r); From cf594237fa727e2e2c784b98716589912a30b5dd Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 23 Apr 2019 16:20:36 +0100 Subject: [PATCH 380/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/global/SConfig.java | 41 ++++--------------- .../core/model/global/SGraphBuilder.java | 5 ++- .../core/model/global/SGraphBuilderUtil.java | 5 ++- scribble-test/src/test/scrib/tmp/Test.scr | 18 +++++++- 4 files changed, 31 insertions(+), 38 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index 3f7ea1a0a..74fe555c2 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -107,6 +107,7 @@ public boolean canSafelyTerminate(Role r) } // Pre: getFireable().get(self).contains(a) + // Here, produce a (non-det) List (CHECKME: shouldn't?) -- but actual global model building (SGraphBuilderUtil.getSuccs) will collapse identical configs public List async(Role self, EAction a) { List res = new LinkedList<>(); @@ -220,51 +221,25 @@ public Set> getWaitForErrors() } // Return: null if no chain - // Includes dependencies from input-blocking, termination and connect-blocking // CHECKME: should also include connect? + // Includes connect dependencies -- and includes when peer is terminated (CHECKME: no, and shouldn't?) // N.B. if this.states.get(init).isTerminal() then orig is returned as "singleton deadlock" -- CHECKME public Set isWaitForChain(Role init) { - Set candidate = new LinkedHashSet<>(); + Set chain = new LinkedHashSet<>(); // CHECKME: rename chain ? Set todo = new LinkedHashSet<>(Arrays.asList(init)); while (!todo.isEmpty()) { Role r = todo.iterator().next(); todo.remove(r); - candidate.add(r); - - EFsm s = this.efsms.get(r); - if (s.curr.getStateKind() == EStateKind.OUTPUT && !s.curr.isSyncClientOnly()) // FIXME: includes connect, could still be deadlock? -- no: doesn't include connect any more + chain.add(r); + Set waitingFor = isWaitingFor(r); + if (waitingFor == null) // "r" is not necessarily waiting for anyone { - // FIXME: move into isWaitingFor return null; } - if (s.curr.isTerminal()) - { - if (todo.isEmpty()) - { - return candidate; - } - continue; - } - Set blocked = isWaitingFor(r); - if (blocked == null) - { - return null; - } - if (todo.isEmpty() && candidate.containsAll(blocked)) - { - return candidate; - } - blocked.forEach((x) -> - { - if (!candidate.contains(x)) - { - //candidate.add(x); - todo.add(x); - } - }); + waitingFor.stream().filter(x -> !chain.contains(x)).forEach(x -> todo.add(x)); // todo is a Set, so re-add existing doesn't matter } - return null; + return chain; } // Return: set of roles that "r" *must* wait for one of them in order to proceed;.. diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index e790a43d5..135114a80 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -13,6 +13,7 @@ */ package org.scribble.core.model.global; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; @@ -88,7 +89,7 @@ public SGraph build(GProtoName fullname, Map egraphs, // Asynchronous (input/output) actions if (a.isSend() || a.isReceive() || a.isDisconnect()) { - List next = curr.config.async(r, a); + Set next = new HashSet<>(curr.config.async(r, a)); Set succs = this.util.getSuccs(curr, a.toGlobal(r), next); // util.getSuccs constructs the edges todo.addAll(succs); } @@ -105,7 +106,7 @@ else if (a.isAccept() || a.isRequest() || a.isClientWrap() ? a.toGlobal(r) : abar.toGlobal(a.peer); // CHECKME: edge will be drawn as the connect, but should be read as the sync. of both -- something like "r1, r2: sync" may be more consistent (or take a set of actions as the edge label?) - List next = curr.config.sync(r, a, a.peer, abar); + Set next = new HashSet<>(curr.config.sync(r, a, a.peer, abar)); Set succs = this.util.getSuccs(curr, aglobal, next); // util.getSuccs constructs the edges todo.addAll(succs); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index d3b845915..192ad6345 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -15,7 +15,6 @@ import java.util.HashMap; import java.util.LinkedHashSet; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -50,7 +49,9 @@ public SState newState(SConfig c) } // Pre: this.states.containsKey(curr.config) - public Set getSuccs(SState curr, SAction a, List succs) + public Set getSuccs(SState curr, SAction a, //List succs) + Set succs) + // SConfig.a/sync currently produces a List, but here collapse identical configs for global model (represent non-det "by edges", not "by model states") { Set res = new LinkedHashSet<>(); // Takes care of duplicates (o/w should also do "|| res.containsKey(c)" below) for (SConfig c : succs) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 7a53bec09..68c21d8d1 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -112,6 +112,21 @@ module tmp.Test; data "..." from "..." as T; +global protocol Proto1(role A, role B) +{ + choice at A // FIXME: smodel too many edges + { + 1() from A to B; + //2() from A to B; + } + or + { + 1() from A to B; + //3() from B to A; + } +} + + /* global protocol Proto1(role A, role B) { @@ -119,7 +134,8 @@ global protocol Proto1(role A, role B) } //*/ -//* + +/* explicit global protocol Proto1(role A, role B, role C) { connect A to B; // TODO: junit tests for explicit From 439fe171d196743a64621f8afea8dd0f5cff5664 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 23 Apr 2019 17:11:17 +0100 Subject: [PATCH 381/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/global/SConfig.java | 39 ++++++++++++------- .../core/model/global/SGraphBuilder.java | 7 ++-- .../core/model/global/SGraphBuilderUtil.java | 13 ++++--- .../bad/efsm/grecursion/unfair/Test11b.scr | 2 + scribble-test/src/test/scrib/tmp/Test.scr | 8 ++-- 5 files changed, 42 insertions(+), 27 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index 74fe555c2..607423850 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -107,7 +107,8 @@ public boolean canSafelyTerminate(Role r) } // Pre: getFireable().get(self).contains(a) - // Here, produce a (non-det) List (CHECKME: shouldn't?) -- but actual global model building (SGraphBuilderUtil.getSuccs) will collapse identical configs + // Here, produce a List that distinguishes non-det to identical configs -- CHECKME: shouldn't? (Set would be sufficient for non-det to different configs) + // (Actual global model building (e.g., SGraphBuilderUtil.getSuccs) will collapse identical configs) public List async(Role self, EAction a) { List res = new LinkedList<>(); @@ -116,7 +117,7 @@ public List async(Role self, EAction a) { Map efsms = new HashMap<>(this.efsms); efsms.put(self, succ); - SingleBuffers queues = + SingleBuffers queues = // N.B. queue updates are insensitive to non-det "a" a.isSend() ? this.queues.send(self, (ESend) a) : a.isReceive() ? this.queues.receive(self, (ERecv) a) : a.isDisconnect() ? this.queues.disconnect(self, (EDisconnect) a) @@ -132,6 +133,8 @@ public List async(Role self, EAction a) // "Synchronous version" of fire // Pre: getFireable().get(r1).contains(a1) && getFireable().get(r2).contains(a2), where a1 and a2 are a "sync" pair + // Here, produce a List that distinguishes non-det to identical configs -- CHECKME: shouldn't? (Set would be sufficient for non-det to different configs) + // (Actual global model building (e.g., SGraphBuilderUtil.getSuccs) will collapse identical configs) public List sync(Role r1, EAction a1, Role r2, EAction a2) { List res = new LinkedList<>(); @@ -150,7 +153,7 @@ public List sync(Role r1, EAction a1, Role r2, EAction a2) if (((a1.isRequest() && a2.isAccept()) || (a1.isAccept() && a2.isRequest()))) { - queues = this.queues.connect(r1, r2); + queues = this.queues.connect(r1, r2); // N.B. queue updates are insensitive to non-det "a" } else if (((a1.isClientWrap() && a2.isServerWrap()) || (a1.isServerWrap() && a2.isClientWrap()))) @@ -367,14 +370,16 @@ public Map getUnfinishedRoles() return res; } + // N.B. Set (not List> getFireable() + public Map> getFireable() { - Map> res = new HashMap<>(); + Map> res = new HashMap<>(); for (Role self : this.efsms.keySet()) { EFsm fsm = this.efsms.get(self); - List as = new LinkedList<>(); + Set as = new LinkedHashSet<>(); switch (fsm.curr.getStateKind()) // Choice subject enabling needed for non-mixed states (mixed states would be needed for async. permutations though) { // Currently not convenient to delegate to states, as state types not distinguished @@ -398,10 +403,11 @@ public Map> getFireable() // Pre: fsm.curr.getStateKind() == EStateKind.OUTPUT // fsm is self's Efsm - private List getOutputFireable(Role self, EFsm fsm) // "output" and "client" actions + // (N.B. return Set, not List -- see getFireable) + private Set getOutputFireable(Role self, EFsm fsm) // "output" and "client" actions { - List res = new LinkedList<>(); - for (EAction a : fsm.curr.getActions()) // Actions may be a mixture of the following + Set res = new LinkedHashSet<>(); + for (EAction a : fsm.curr.getActions()) // Actions may be a mixture of the following cases { // Async if (a.isSend() || a.isDisconnect()) // For disconnect, only one "a" @@ -437,15 +443,17 @@ else if (a.isRequest() || a.isClientWrap()) // Pre: fsm.curr.getStateKind() == EStateKind.UNARY_RECEIVE or POLY_RECIEVE // Unary or poly receive - private List getReceiveFireable(Role self, EFsm fsm) + // (N.B. return Set, not List -- see getFireable) + private Set getReceiveFireable(Role self, EFsm fsm) { return fsm.curr.getActions().stream().map(x -> (ERecv) x) .filter(x -> this.queues.canReceive(self, x)) - .collect(Collectors.toList()); + .collect(Collectors.toSet()); } // Pre: fsm.curr.getStateKind() == EStateKind.ACCEPT - private List getAcceptFireable(Role self, EFsm fsm) + // (N.B. return Set, not List -- see getFireable) + private Set getAcceptFireable(Role self, EFsm fsm) { List as = fsm.curr.getActions(); Role peer = as.get(0).peer; // All peer's the same @@ -453,12 +461,13 @@ private List getAcceptFireable(Role self, EFsm fsm) return fsm.curr.getActions().stream().map(x -> (EAcc) x) .filter(x -> this.queues.canAccept(self, x) && peeras.stream().anyMatch(y -> y.toDual(peer).equals(x))) - .collect(Collectors.toList()); + .collect(Collectors.toSet()); } // Pre: fsm.curr.getStateKind() == EStateKind.SERVER_WRAP + // (N.B. return Set, not List -- see getFireable) // Duplicated from getAcceptFireable - private List getServerWrapFireable(Role self, EFsm fsm) + private Set getServerWrapFireable(Role self, EFsm fsm) { List as = fsm.curr.getActions(); // Actually for ServerWrap, size() == 1 Role peer = as.get(0).peer; // All peer's the same @@ -466,7 +475,7 @@ private List getServerWrapFireable(Role self, EFsm fsm) return fsm.curr.getActions().stream().map(x -> (EServerWrap) x) .filter(x -> this.queues.canServerWrap(self, x) && peeras.stream().anyMatch(y -> y.toDual(peer).equals(x))) - .collect(Collectors.toList()); + .collect(Collectors.toSet()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index 135114a80..96aed14a6 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -16,7 +16,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; -import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -81,7 +80,7 @@ public SGraph build(GProtoName fullname, Map egraphs, }*/ // Based on config semantics, not "static" graph edges (cf., super.getActions) -- used to build global model graph - Map> fireable = curr.config.getFireable(); + Map> fireable = curr.config.getFireable(); for (Role r : fireable.keySet()) { for (EAction a : fireable.get(r)) @@ -90,6 +89,7 @@ public SGraph build(GProtoName fullname, Map egraphs, if (a.isSend() || a.isReceive() || a.isDisconnect()) { Set next = new HashSet<>(curr.config.async(r, a)); + // SConfig.a/sync currently produces a List, but here collapse identical configs for global model (represent non-det "by edges", not "by model states") Set succs = this.util.getSuccs(curr, a.toGlobal(r), next); // util.getSuccs constructs the edges todo.addAll(succs); } @@ -97,7 +97,7 @@ public SGraph build(GProtoName fullname, Map egraphs, else if (a.isAccept() || a.isRequest() || a.isClientWrap() || a.isServerWrap()) { - List as = fireable.get(a.peer); + Set as = fireable.get(a.peer); EAction abar = a.toDual(r); if (as != null && as.contains(abar)) { @@ -107,6 +107,7 @@ else if (a.isAccept() || a.isRequest() || a.isClientWrap() : abar.toGlobal(a.peer); // CHECKME: edge will be drawn as the connect, but should be read as the sync. of both -- something like "r1, r2: sync" may be more consistent (or take a set of actions as the edge label?) Set next = new HashSet<>(curr.config.sync(r, a, a.peer, abar)); + // SConfig.a/sync currently produces a List, but here collapse identical configs for global model (represent non-det "by edges", not "by model states") Set succs = this.util.getSuccs(curr, aglobal, next); // util.getSuccs constructs the edges todo.addAll(succs); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index 192ad6345..972e8e80b 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -56,14 +56,15 @@ public Set getSuccs(SState curr, SAction a, //List succs) Set res = new LinkedHashSet<>(); // Takes care of duplicates (o/w should also do "|| res.containsKey(c)" below) for (SConfig c : succs) { - if (this.states.containsKey(c)) + boolean seen = this.states.containsKey(c); + SState next = seen + ? this.states.get(c) + : newState(c); + curr.addEdge(a, next); + if (!seen) // Must use cached test, newState changes adds the key { - curr.addEdge(a, this.states.get(c)); - continue; + res.add(next); } - SState s = newState(c); - curr.addEdge(a, s); - res.add(s); } return res; } diff --git a/scribble-test/src/test/resources/bad/efsm/grecursion/unfair/Test11b.scr b/scribble-test/src/test/resources/bad/efsm/grecursion/unfair/Test11b.scr index f5ee7a5a0..16750ac7d 100644 --- a/scribble-test/src/test/resources/bad/efsm/grecursion/unfair/Test11b.scr +++ b/scribble-test/src/test/resources/bad/efsm/grecursion/unfair/Test11b.scr @@ -1,3 +1,5 @@ +//$ bin/scribblec.sh -ip scribble-test/src/test/resources scribble-test/src/test/resources/bad/efsm/grecursion/unfair/Test11b.scr + module bad.efsm.grecursion.unfair.Test11b; diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 68c21d8d1..3b87533b4 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -112,12 +112,13 @@ module tmp.Test; data "..." from "..." as T; +/* global protocol Proto1(role A, role B) { - choice at A // FIXME: smodel too many edges + choice at A { - 1() from A to B; - //2() from A to B; + 1() from A to B; // Testing global model building, non-det edges (identical configs collapsed) + 2() from A to B; // Un/comment, test combinations } or { @@ -125,6 +126,7 @@ global protocol Proto1(role A, role B) //3() from B to A; } } +//*/ /* From 5c767a87f5b097bc210f43e2dc753ab4cb61b425 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 23 Apr 2019 18:23:56 +0100 Subject: [PATCH 382/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/global/SConfig.java | 191 +++++++++--------- scribble-test/src/test/scrib/tmp/Test.scr | 24 +++ 2 files changed, 116 insertions(+), 99 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index 607423850..9764d498d 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -55,18 +55,9 @@ public SConfig(ModelFactory mf, Map state, SingleBuffers queues) } // FIXME: rename: not just termination, could be unconnected/uninitiated - //public boolean isEnd() public boolean isSafeTermination() { - //return this.states.values().stream().allMatch((s) -> s.isTerminal()) && this.queues.isEmpty(); - for (Role r : this.efsms.keySet()) - { - if (!canSafelyTerminate(r)) - { - return false; - } - } - return true; + return this.efsms.keySet().stream().allMatch(x -> canSafelyTerminate(x)); } // Should work both with and without accept-correlation? @@ -105,73 +96,8 @@ public boolean canSafelyTerminate(Role r) ; return canSafelyTerminate; } - - // Pre: getFireable().get(self).contains(a) - // Here, produce a List that distinguishes non-det to identical configs -- CHECKME: shouldn't? (Set would be sufficient for non-det to different configs) - // (Actual global model building (e.g., SGraphBuilderUtil.getSuccs) will collapse identical configs) - public List async(Role self, EAction a) - { - List res = new LinkedList<>(); - List succs = this.efsms.get(self).getSuccs(a); - for (EFsm succ : succs) - { - Map efsms = new HashMap<>(this.efsms); - efsms.put(self, succ); - SingleBuffers queues = // N.B. queue updates are insensitive to non-det "a" - a.isSend() ? this.queues.send(self, (ESend) a) - : a.isReceive() ? this.queues.receive(self, (ERecv) a) - : a.isDisconnect() ? this.queues.disconnect(self, (EDisconnect) a) - : null; - if (queues == null) - { - throw new RuntimeException("Shouldn't get in here: " + a); - } - res.add(this.mf.newSConfig(efsms, queues)); - } - return res; - } - - // "Synchronous version" of fire - // Pre: getFireable().get(r1).contains(a1) && getFireable().get(r2).contains(a2), where a1 and a2 are a "sync" pair - // Here, produce a List that distinguishes non-det to identical configs -- CHECKME: shouldn't? (Set would be sufficient for non-det to different configs) - // (Actual global model building (e.g., SGraphBuilderUtil.getSuccs) will collapse identical configs) - public List sync(Role r1, EAction a1, Role r2, EAction a2) - { - List res = new LinkedList<>(); - List succs1 = this.efsms.get(r1).getSuccs(a1); - List succs2 = this.efsms.get(r2).getSuccs(a2); - for (EFsm succ1 : succs1) - { - for (EFsm succ2 : succs2) - { - Map efsms = new HashMap<>(this.efsms); - // a1 and a2 are a "sync" pair, add all combinations of succ1 and succ2 that may arise - efsms.put(r1, succ1); // Overwrite existing r1/r2 entries - efsms.put(r2, succ2); - SingleBuffers queues; - // a1 and a2 definitely "sync", now just determine whether it is a connect or wrap - if (((a1.isRequest() && a2.isAccept()) - || (a1.isAccept() && a2.isRequest()))) - { - queues = this.queues.connect(r1, r2); // N.B. queue updates are insensitive to non-det "a" - } - else if (((a1.isClientWrap() && a2.isServerWrap()) - || (a1.isServerWrap() && a2.isClientWrap()))) - { - // Doesn't affect queue state - queues = this.queues; // OK, immutable? - } - else - { - throw new RuntimeException("Shouldn't get in here: " + a1 + ", " + a2); - } - res.add(this.mf.newSConfig(efsms, queues)); - } - } - return res; - } - // Deadlock from non handle-able messages (reception errors) + // Stuck due to non-consumable messages (reception errors) public Map getStuckMessages() { Map res = new HashMap<>(); @@ -207,52 +133,54 @@ public Set> getWaitForErrors() { Set> res = new HashSet<>(); List todo = new LinkedList<>(this.efsms.keySet()); - while (!todo.isEmpty()) // CHECKME: maybe better to do directly on states, rather than via roles + while (!todo.isEmpty()) // CHECKME: maybe better to do directly on states, rather than via roles -- ? { Role r = todo.remove(0); - if (!this.efsms.get(r).curr.isTerminal()) + if (this.efsms.get(r).curr.isTerminal()) { - Set cycle = isWaitForChain(r); - if (cycle != null) - { - todo.removeAll(cycle); - res.add(cycle); - } + continue; + } + Set cycle = isWaitForCycle(r); + if (cycle != null) + { + res.add(cycle); + todo.removeAll(cycle); } } return res; } - // Return: null if no chain - // Includes connect dependencies -- and includes when peer is terminated (CHECKME: no, and shouldn't?) + // Return: null if no cycle -- terminated peer means no cycle (cf. getUnfinishedRoles) + // Includes connect dependencies // N.B. if this.states.get(init).isTerminal() then orig is returned as "singleton deadlock" -- CHECKME - public Set isWaitForChain(Role init) + protected Set isWaitForCycle(Role init) { - Set chain = new LinkedHashSet<>(); // CHECKME: rename chain ? + Set cycle = new LinkedHashSet<>(); Set todo = new LinkedHashSet<>(Arrays.asList(init)); while (!todo.isEmpty()) { Role r = todo.iterator().next(); todo.remove(r); - chain.add(r); - Set waitingFor = isWaitingFor(r); - if (waitingFor == null) // "r" is not necessarily waiting for anyone + cycle.add(r); + Set waitingFor = getWaitingFor(r); + if (waitingFor == null) // "r" is not necessarily waiting for anyone, so report no cycle { return null; } - waitingFor.stream().filter(x -> !chain.contains(x)).forEach(x -> todo.add(x)); // todo is a Set, so re-add existing doesn't matter + waitingFor.stream().filter(x -> !cycle.contains(x)) // Only more than one when client-sync cases + .forEach(x -> todo.add(x)); // todo is a Set, so re-add existing doesn't matter } - return chain; + return cycle; } // Return: set of roles that "r" *must* wait for one of them in order to proceed;.. // ..or null if "r" is not *necessarily* blocked waiting for *another role* // Wait-for blocking includes sync-client (request, clientWrap) roles - private Set isWaitingFor(Role r) + protected Set getWaitingFor(Role r) { EFsm fsm = this.efsms.get(r); EStateKind k = fsm.curr.getStateKind(); - if (k != EStateKind.TERMINAL) + if (k == EStateKind.TERMINAL) { return null; } @@ -369,6 +297,71 @@ public Map getUnfinishedRoles() } return res; } + + // Pre: getFireable().get(self).contains(a) + // Here, produce a List that distinguishes non-det to identical configs -- CHECKME: shouldn't? (Set would be sufficient for non-det to different configs) + // (Actual global model building (e.g., SGraphBuilderUtil.getSuccs) will collapse identical configs) + public List async(Role self, EAction a) + { + List res = new LinkedList<>(); + List succs = this.efsms.get(self).getSuccs(a); + for (EFsm succ : succs) + { + Map efsms = new HashMap<>(this.efsms); + efsms.put(self, succ); + SingleBuffers queues = // N.B. queue updates are insensitive to non-det "a" + a.isSend() ? this.queues.send(self, (ESend) a) + : a.isReceive() ? this.queues.receive(self, (ERecv) a) + : a.isDisconnect() ? this.queues.disconnect(self, (EDisconnect) a) + : null; + if (queues == null) + { + throw new RuntimeException("Shouldn't get in here: " + a); + } + res.add(this.mf.newSConfig(efsms, queues)); + } + return res; + } + + // "Synchronous version" of fire + // Pre: getFireable().get(r1).contains(a1) && getFireable().get(r2).contains(a2), where a1 and a2 are a "sync" pair + // Here, produce a List that distinguishes non-det to identical configs -- CHECKME: shouldn't? (Set would be sufficient for non-det to different configs) + // (Actual global model building (e.g., SGraphBuilderUtil.getSuccs) will collapse identical configs) + public List sync(Role r1, EAction a1, Role r2, EAction a2) + { + List res = new LinkedList<>(); + List succs1 = this.efsms.get(r1).getSuccs(a1); + List succs2 = this.efsms.get(r2).getSuccs(a2); + for (EFsm succ1 : succs1) + { + for (EFsm succ2 : succs2) + { + Map efsms = new HashMap<>(this.efsms); + // a1 and a2 are a "sync" pair, add all combinations of succ1 and succ2 that may arise + efsms.put(r1, succ1); // Overwrite existing r1/r2 entries + efsms.put(r2, succ2); + SingleBuffers queues; + // a1 and a2 definitely "sync", now just determine whether it is a connect or wrap + if (((a1.isRequest() && a2.isAccept()) + || (a1.isAccept() && a2.isRequest()))) + { + queues = this.queues.connect(r1, r2); // N.B. queue updates are insensitive to non-det "a" + } + else if (((a1.isClientWrap() && a2.isServerWrap()) + || (a1.isServerWrap() && a2.isClientWrap()))) + { + // Doesn't affect queue state + queues = this.queues; // OK, immutable? + } + else + { + throw new RuntimeException("Shouldn't get in here: " + a1 + ", " + a2); + } + res.add(this.mf.newSConfig(efsms, queues)); + } + } + return res; + } // N.B. Set (not List> getFireable() // Pre: fsm.curr.getStateKind() == EStateKind.OUTPUT // fsm is self's Efsm // (N.B. return Set, not List -- see getFireable) - private Set getOutputFireable(Role self, EFsm fsm) // "output" and "client" actions + protected Set getOutputFireable(Role self, EFsm fsm) // "output" and "client" actions { Set res = new LinkedHashSet<>(); for (EAction a : fsm.curr.getActions()) // Actions may be a mixture of the following cases @@ -444,7 +437,7 @@ else if (a.isRequest() || a.isClientWrap()) // Pre: fsm.curr.getStateKind() == EStateKind.UNARY_RECEIVE or POLY_RECIEVE // Unary or poly receive // (N.B. return Set, not List -- see getFireable) - private Set getReceiveFireable(Role self, EFsm fsm) + protected Set getReceiveFireable(Role self, EFsm fsm) { return fsm.curr.getActions().stream().map(x -> (ERecv) x) .filter(x -> this.queues.canReceive(self, x)) @@ -453,7 +446,7 @@ private Set getReceiveFireable(Role self, EFsm fsm) // Pre: fsm.curr.getStateKind() == EStateKind.ACCEPT // (N.B. return Set, not List -- see getFireable) - private Set getAcceptFireable(Role self, EFsm fsm) + protected Set getAcceptFireable(Role self, EFsm fsm) { List as = fsm.curr.getActions(); Role peer = as.get(0).peer; // All peer's the same @@ -467,7 +460,7 @@ private Set getAcceptFireable(Role self, EFsm fsm) // Pre: fsm.curr.getStateKind() == EStateKind.SERVER_WRAP // (N.B. return Set, not List -- see getFireable) // Duplicated from getAcceptFireable - private Set getServerWrapFireable(Role self, EFsm fsm) + protected Set getServerWrapFireable(Role self, EFsm fsm) { List as = fsm.curr.getActions(); // Actually for ServerWrap, size() == 1 Role peer = as.get(0).peer; // All peer's the same diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 3b87533b4..61d4e9fc4 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -101,6 +101,7 @@ module tmp.Test; // also do-arg pruning, for role-pruned projection decls // choice-specific fairness annotations // fix codegen when -fair + // CHECKME: accept branching on messages (and safety properties) // parser/ast refactoring // check G/LType casts vs. SType (favour latter) @@ -112,6 +113,29 @@ module tmp.Test; data "..." from "..." as T; +//* +global protocol Proto1(role A, role B, role C, role D) +{ + rec X + { + 5() from C to D; + continue X; + } + + choice at A + { + 1() from A to B; + 2() from A to B; + } + or + { + 1() from A to B; + 3() from B to A; // Testing wait-for cycle detection + } +} +//*/ + + /* global protocol Proto1(role A, role B) { From 0bd1930735f05f4fc4a5ac17bc06129ff886a890 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 23 Apr 2019 20:52:31 +0100 Subject: [PATCH 383/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/endpoint/EFsm.java | 2 +- .../scribble/core/model/global/SConfig.java | 83 +++++++------------ scribble-test/src/test/scrib/tmp/Test.scr | 7 +- 3 files changed, 32 insertions(+), 60 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java index 0a427d15c..288521005 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EFsm.java @@ -46,7 +46,7 @@ public List getSuccs(EAction a) // CHECKME: check if unfolded initial accept is possible, and if it breaks anything public boolean isInitial() { - return this.curr.equals(this.graph.init); + return this.curr.equals(this.graph.init); // i.e., "literally" in the initial state (not "semantically") } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index 9764d498d..aa1b96c3f 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -21,6 +21,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -54,49 +55,6 @@ public SConfig(ModelFactory mf, Map state, SingleBuffers queues) this.queues = queues; } - // FIXME: rename: not just termination, could be unconnected/uninitiated - public boolean isSafeTermination() - { - return this.efsms.keySet().stream().allMatch(x -> canSafelyTerminate(x)); - } - - // Should work both with and without accept-correlation? - public boolean canSafelyTerminate(Role r) - { - //EndpointState s = this.states.get(r); - EFsm s = this.efsms.get(r); - //return - /*boolean cannotSafelyTerminate = // FIXME: check and cleanup - (s.isTerminal() && !this.queues.isEmpty(r)) - || - (!s.isTerminal() && - //(!(s.getStateKind().equals(Kind.UNARYINPUT) && s.getTakeable().iterator().next().isAccept()) // Accept state now distinguished - ( - !(s.getStateKind().equals(Kind.ACCEPT) && s.isInitial()) // FIXME: check stable - // FIXME: needs initial state check -- although if there is an accept, there should a connect, and waitfor-errors checked via connects) -- this should be OK because connect/accept are sync -- but not fully sufficient by itself, see next - // So could be blocked on unary accept part way through the protocol -- but also could be unfolded initial accept - ////|| this.states.keySet().stream().anyMatch((rr) -> !r.equals(rr) && this.queues.isConnected(r, rr)))) - //&& this.states.keySet().stream().anyMatch((rr) -> !r.equals(rr) && this.queues.isConnected(r, rr)) - // FIXME: isConnected is not symmetric, and could disconnect all part way through protocol -- but can't happen? - // Above assumes initial is not terminal (holds for EFSMs), and doesn't check queueer is empty (i.e. for orphan messages) - ) - ) - || - (!s.isTerminal() && this.states.keySet().stream().anyMatch((rr) -> !r.equals(rr) && this.queues.isConnected(r, rr))) - ;*/ - //return !cannotSafelyTerminate; - boolean canSafelyTerminate = - (s.curr.isTerminal() && this.queues.isEmpty(r)) - || (s.curr.getStateKind().equals(EStateKind.ACCEPT) - && s.isInitial()) - // FIXME: should be empty queues - - // FIXME: incorrectly allows stuck accepts? if inactive not initial, should be clone of initial? - //|| (s.getStateKind().equals(Kind.ACCEPT) && this.states.keySet().stream().noneMatch((rr) -> !r.equals(rr) && this.queues.isConnected(r, rr))) - ; - return canSafelyTerminate; - } - // Stuck due to non-consumable messages (reception errors) public Map getStuckMessages() { @@ -230,7 +188,7 @@ else if (k == EStateKind.OUTPUT) //|| k == Kind.ACCEPT .. // CHECKME: check requ throw new RuntimeException("[TODO] " + k); } - // Generalised to include "unconnected" messages -- should unconnected messages be treated via stuck instead? + // Includes "unconnected" messages -- CHECKME: should unconnected messages be considered as "stuck" instead? public Map> getOrphanMessages() { Map> res = new HashMap<>(); @@ -281,21 +239,18 @@ public Map> getOrphanMessages() } // Not just "unfinished", but also "non-initiated" (accept guarded) -- though could be non-initiated after some previous completions - // Maybe not needed -- previously not used (even without accept-correlation check) + // Maybe not needed? previously not used (even without accept-correlation check) public Map getUnfinishedRoles() { - Map res = new HashMap<>(); - if (getFireable().isEmpty() && !isSafeTermination()) + if (!getFireable().isEmpty()) + // Once no fireable, then finished (no further fireable will be produced) + // N.B. must check getFireable -- cf. terminal state kind is only when no actions, does not include when actions are stuck { - for (Role r : this.efsms.keySet()) - { - if (!canSafelyTerminate(r)) - { - res.put(r, this.efsms.get(r).curr); - } - } + return Collections.emptyMap(); } - return res; + return this.efsms.entrySet().stream() + .filter(x -> !canSafelyTerminate(x.getKey())) + .collect(Collectors.toMap(Entry::getKey, x -> x.getValue().curr)); } // Pre: getFireable().get(self).contains(a) @@ -363,6 +318,24 @@ else if (((a1.isClientWrap() && a2.isServerWrap()) return res; } + /*// CHECKME: rename -- not just termination, could be unconnected/uninitiated + public boolean isSafeTermination() + { + return this.efsms.keySet().stream().allMatch(x -> canSafelyTerminate(x)); + }*/ + + // Should work both with and without accept-correlation? + public boolean canSafelyTerminate(Role r) + { + EFsm fsm = this.efsms.get(r); + boolean safe = this.queues.isEmpty(r) && (fsm.curr.isTerminal() || + (fsm.curr.getStateKind().equals(EStateKind.ACCEPT) && fsm.isInitial())); // Specifically the initial state + + // CHECKME: incorrectly allows stuck accepts? if inactive not initial, should be clone of initial? + //|| (s.getStateKind().equals(Kind.ACCEPT) && this.states.keySet().stream().noneMatch((rr) -> !r.equals(rr) && this.queues.isConnected(r, rr))) + return safe; + } + // N.B. Set (not List (favour latter) @@ -113,7 +112,7 @@ module tmp.Test; data "..." from "..." as T; -//* +/* global protocol Proto1(role A, role B, role C, role D) { rec X @@ -736,7 +735,7 @@ global protocol Proto1(role A, role B) -/* +//* type "System.UInt32" from "..." as int; global protocol SH(role P, role R, role C) From 2af34d839ae978be921618609d3053d7e90b5209 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 23 Apr 2019 21:31:13 +0100 Subject: [PATCH 384/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/global/SConfig.java | 48 +++++-------------- .../core/model/global/SingleBuffers.java | 9 ++-- scribble-test/src/test/scrib/tmp/Test.scr | 4 +- 3 files changed, 19 insertions(+), 42 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index aa1b96c3f..24a6861f6 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -194,45 +194,23 @@ public Map> getOrphanMessages() Map> res = new HashMap<>(); for (Role r : this.efsms.keySet()) { - //EndpointState s = this.states.get(r); - EFsm s = this.efsms.get(r); - if (s.curr.isTerminal()) // Local termination of r, i.e. not necessarily "full deadlock" + Set orphs = new HashSet<>(); + EFsm fsm = this.efsms.get(r); + if (fsm.curr.isTerminal()) // Local termination of r, i.e. not necessarily "full deadlock cycle" { - Set orphs = this.queues.getQueue(r).values().stream().filter(v -> v != null).collect(Collectors.toSet()); - if (!orphs.isEmpty()) - { - Set tmp = res.get(r); - if (tmp == null) - { - tmp = new HashSet<>(); - res.put(r, tmp); - } - tmp.addAll(orphs); - } + orphs.addAll(this.queues.getQueue(r).values().stream() + .filter(v -> v != null).collect(Collectors.toSet())); } else { - this.efsms.keySet().forEach((rr) -> - { - if (!rr.equals(r)) - { - // Connection direction doesn't matter? -- wrong: matters because of async. disconnect - if (!this.queues.isConnected(r, rr)) - { - ESend send = this.queues.getQueue(r).get(rr); - if (send != null) - { - Set tmp = res.get(r); - if (tmp == null) - { - tmp = new HashSet<>(); - res.put(r, tmp); - } - tmp.add(send); - } - } - } - }); + this.efsms.keySet().stream() + .filter(x -> !r.equals(x) && !this.queues.isConnected(r, x)) // !isConnected(r, x), means r considers its side closed + .map(x -> this.queues.getQueue(r).get(x)).filter(x -> x != null) // r's side is closed, but remaining message(s) in r's buff + .forEach(x -> orphs.add(x)); + } + if (!orphs.isEmpty()) + { + res.put(r, orphs); } } return res; diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SingleBuffers.java b/scribble-core/src/main/java/org/scribble/core/model/global/SingleBuffers.java index e165ada15..bf2eddb9f 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SingleBuffers.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SingleBuffers.java @@ -32,8 +32,8 @@ // Immutable -- send/receive/etc return updated copies public class SingleBuffers { - private final Map> connected = new HashMap<>(); // client -> server -> connected? (symmetric) - private final Map> buffs = new HashMap<>(); // dest -> src -> msg + private final Map> connected = new HashMap<>(); // local -> peer -> does-local-consider-connected (symmetric) + private final Map> buffs = new HashMap<>(); // dest -> src -> msg -- N.B. connected.get(A).get(B) => can send into buffs.get(B).get(A) ("reversed") // N.B. hardcoded to capacity one -- SQueues would be the generalisation // null ESend for empty queue @@ -67,13 +67,12 @@ protected SingleBuffers(SingleBuffers queues) public boolean canSend(Role self, ESend a) { - return isConnected(self, a.peer) + return isConnected(self, a.peer) //&& isConnected(a.peer, self) // CHECKME: only consider local? && this.buffs.get(a.peer).get(self) == null; } public boolean canReceive(Role self, ERecv a) { - // N.B. *not* checking isConnected -- can still receive from our side after other side has closed ESend send = this.buffs.get(self).get(a.peer); return send != null && send.toDual(a.peer).equals(a); } @@ -139,7 +138,7 @@ public SingleBuffers connect(Role src, Role dest) public SingleBuffers disconnect(Role self, EDisconnect d) { SingleBuffers copy = new SingleBuffers(this); - copy.connected.get(self).put(d.peer, false); + copy.connected.get(self).put(d.peer, false); // Didn't update buffs (cf. SConfig.getOrphanMessages) return copy; } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index ef1b81d91..4464f96db 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -112,7 +112,7 @@ module tmp.Test; data "..." from "..." as T; -/* +//* global protocol Proto1(role A, role B, role C, role D) { rec X @@ -735,7 +735,7 @@ global protocol Proto1(role A, role B) -//* +/* type "System.UInt32" from "..." as int; global protocol SH(role P, role R, role C) From d69e88f3c1b54b2a0d028c3f100fd709feb4ce26 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 23 Apr 2019 21:51:11 +0100 Subject: [PATCH 385/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/global/SConfig.java | 407 +++++++++--------- .../core/model/global/SingleBuffers.java | 15 +- scribble-test/src/test/scrib/tmp/Test.scr | 4 +- 3 files changed, 216 insertions(+), 210 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index 24a6861f6..1b2c210dc 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -55,6 +55,197 @@ public SConfig(ModelFactory mf, Map state, SingleBuffers queues) this.queues = queues; } + // N.B. Set (not List> getFireable() + { + Map> res = new HashMap<>(); + for (Role self : this.efsms.keySet()) + { + EFsm fsm = this.efsms.get(self); + Set as = new LinkedHashSet<>(); + switch (fsm.curr.getStateKind()) // Choice subject enabling needed for non-mixed states (mixed states would be needed for async. permutations though) + { + // Currently not convenient to delegate to states, as state types not distinguished + case TERMINAL: break; + case OUTPUT: as.addAll(getOutputFireable(self, fsm)); break; + case UNARY_RECEIVE: + case POLY_RECIEVE: + as.addAll(getReceiveFireable(self, fsm)); // addAll for generic typing + break; + case ACCEPT: as.addAll(getAcceptFireable(self, fsm)); break; + case SERVER_WRAP: as.addAll(getServerWrapFireable(self, fsm)); break; + default: throw new RuntimeException("Unknown state kind: " + fsm); + } + if (!as.isEmpty()) // Guards against res.put for empty "as", but perhaps unnecessary? + { + res.put(self, as); + } + } + return res; + } + + // Pre: fsm.curr.getStateKind() == EStateKind.OUTPUT + // fsm is self's Efsm + // (N.B. return Set, not List -- see getFireable) + protected Set getOutputFireable(Role self, EFsm fsm) // "output" and "client" actions + { + Set res = new LinkedHashSet<>(); + for (EAction a : fsm.curr.getActions()) // Actions may be a mixture of the following cases + { + // Async + if (a.isSend() || a.isDisconnect()) // For disconnect, only one "a" + { + if ((a.isSend() && this.queues.canSend(self, (ESend) a)) + || (a.isDisconnect() + && this.queues.canDisconnect(self, (EDisconnect) a))) + { + res.add(a); + } + } + // Sync + else if (a.isRequest() || a.isClientWrap()) + { + if ((a.isRequest() && this.queues.canRequest(self, (EReq) a)) + || (a.isClientWrap() + && this.queues.canClientWrap(self, (EClientWrap) a))) + { + if (this.efsms.get(a.peer).curr.getActions().stream() + .anyMatch(x -> a.toDual(self).equals(x))) // anyMatch (i.e., add "a" at most once), cf. getAcceptable + { + res.add(a); + } + } + } + else + { + throw new RuntimeException("Unknown output action kind: " + a); + } + } + return res; + } + + // Pre: fsm.curr.getStateKind() == EStateKind.UNARY_RECEIVE or POLY_RECIEVE + // Unary or poly receive + // (N.B. return Set, not List -- see getFireable) + protected Set getReceiveFireable(Role self, EFsm fsm) + { + return fsm.curr.getActions().stream().map(x -> (ERecv) x) + .filter(x -> this.queues.canReceive(self, x)) + .collect(Collectors.toSet()); + } + + // Pre: fsm.curr.getStateKind() == EStateKind.ACCEPT + // (N.B. return Set, not List -- see getFireable) + protected Set getAcceptFireable(Role self, EFsm fsm) + { + List as = fsm.curr.getActions(); + Role peer = as.get(0).peer; // All peer's the same + List peeras = this.efsms.get(peer).curr.getActions(); + return fsm.curr.getActions().stream().map(x -> (EAcc) x) + .filter(x -> this.queues.canAccept(self, x) + && peeras.stream().anyMatch(y -> y.toDual(peer).equals(x))) + .collect(Collectors.toSet()); + } + + // Pre: fsm.curr.getStateKind() == EStateKind.SERVER_WRAP + // (N.B. return Set, not List -- see getFireable) + // Duplicated from getAcceptFireable + protected Set getServerWrapFireable(Role self, EFsm fsm) + { + List as = fsm.curr.getActions(); // Actually for ServerWrap, size() == 1 + Role peer = as.get(0).peer; // All peer's the same + List peeras = this.efsms.get(peer).curr.getActions(); + return fsm.curr.getActions().stream().map(x -> (EServerWrap) x) + .filter(x -> this.queues.canServerWrap(self, x) + && peeras.stream().anyMatch(y -> y.toDual(peer).equals(x))) + .collect(Collectors.toSet()); + } + + // Pre: getFireable().get(self).contains(a) + // Here, produce a List that distinguishes non-det to identical configs -- CHECKME: shouldn't? (Set would be sufficient for non-det to different configs) + // (Actual global model building (e.g., SGraphBuilderUtil.getSuccs) will collapse identical configs) + public List async(Role self, EAction a) + { + List res = new LinkedList<>(); + List succs = this.efsms.get(self).getSuccs(a); + for (EFsm succ : succs) + { + Map efsms = new HashMap<>(this.efsms); + efsms.put(self, succ); + SingleBuffers queues = // N.B. queue updates are insensitive to non-det "a" + a.isSend() ? this.queues.send(self, (ESend) a) + : a.isReceive() ? this.queues.receive(self, (ERecv) a) + : a.isDisconnect() ? this.queues.disconnect(self, (EDisconnect) a) + : null; + if (queues == null) + { + throw new RuntimeException("Shouldn't get in here: " + a); + } + res.add(this.mf.newSConfig(efsms, queues)); + } + return res; + } + + // "Synchronous version" of fire + // Pre: getFireable().get(r1).contains(a1) && getFireable().get(r2).contains(a2), where a1 and a2 are a "sync" pair (e.g., matching message) + // Here, produce a List that distinguishes non-det to identical configs -- CHECKME: shouldn't? (Set would be sufficient for non-det to different configs) + // (Actual global model building (e.g., SGraphBuilderUtil.getSuccs) will collapse identical configs) + public List sync(Role r1, EAction a1, Role r2, EAction a2) + { + List res = new LinkedList<>(); + List succs1 = this.efsms.get(r1).getSuccs(a1); + List succs2 = this.efsms.get(r2).getSuccs(a2); + for (EFsm succ1 : succs1) + { + for (EFsm succ2 : succs2) + { + Map efsms = new HashMap<>(this.efsms); + // a1 and a2 are a "sync" pair, add all combinations of succ1 and succ2 that may arise + efsms.put(r1, succ1); // Overwrite existing r1/r2 entries + efsms.put(r2, succ2); + SingleBuffers queues; + // a1 and a2 definitely "sync", now just determine whether it is a connect or wrap + if (((a1.isRequest() && a2.isAccept()) + || (a1.isAccept() && a2.isRequest()))) + { + queues = this.queues.connect(r1, r2); // N.B. queue updates are insensitive to non-det "a" + } + else if (((a1.isClientWrap() && a2.isServerWrap()) + || (a1.isServerWrap() && a2.isClientWrap()))) + { + // Doesn't affect queue state + queues = this.queues; // OK, immutable? + } + else + { + throw new RuntimeException("Shouldn't get in here: " + a1 + ", " + a2); + } + res.add(this.mf.newSConfig(efsms, queues)); + } + } + return res; + } + + /*// CHECKME: rename -- not just termination, could be unconnected/uninitiated + public boolean isSafeTermination() + { + return this.efsms.keySet().stream().allMatch(x -> canSafelyTerminate(x)); + }*/ + + // Should work both with and without accept-correlation? + public boolean canSafelyTerminate(Role r) + { + EFsm fsm = this.efsms.get(r); + boolean safe = this.queues.isEmpty(r) && (fsm.curr.isTerminal() || + (fsm.curr.getStateKind().equals(EStateKind.ACCEPT) && fsm.isInitial())); // Specifically the initial state + + // CHECKME: incorrectly allows stuck accepts? if inactive not initial, should be clone of initial? + //|| (s.getStateKind().equals(Kind.ACCEPT) && this.states.keySet().stream().noneMatch((rr) -> !r.equals(rr) && this.queues.isConnected(r, rr))) + return safe; + } + // Stuck due to non-consumable messages (reception errors) public Map getStuckMessages() { @@ -154,17 +345,18 @@ protected Set getWaitingFor(Role r) } else if (k == EStateKind.ACCEPT) { - if (!fsm.isInitial()) // TODO CHECKME: if analysing ACCEPTs, check if "s" is initial (not "deadlock blocked" if initial) -- no: instead, analysing requests + if (fsm.isInitial()) // TODO CHECKME: if analysing ACCEPTs, check if "s" is initial (not "deadlock blocked" if initial) -- no: instead, analysing requests { - List as = fsm.curr.getActions(); // All accept - Role peer = as.get(0).peer; // Pre: consistent ext choice subject -- CHECKME: generalise? - if (this.efsms.get(peer).curr.getActions().stream() - .anyMatch(x -> as.contains(x.toDual(peer)))) - { - return null; - } - return Stream.of(peer).collect(Collectors.toSet()); + return null; + } + List as = fsm.curr.getActions(); // All accept + Role peer = as.get(0).peer; // Pre: consistent ext choice subject -- CHECKME: generalise? + if (this.efsms.get(peer).curr.getActions().stream() + .anyMatch(x -> as.contains(x.toDual(peer)))) + { + return null; } + return Stream.of(peer).collect(Collectors.toSet()); } else if (k == EStateKind.OUTPUT) //|| k == Kind.ACCEPT .. // CHECKME: check requests if no available sends -- ? { @@ -231,195 +423,10 @@ public Map getUnfinishedRoles() .collect(Collectors.toMap(Entry::getKey, x -> x.getValue().curr)); } - // Pre: getFireable().get(self).contains(a) - // Here, produce a List that distinguishes non-det to identical configs -- CHECKME: shouldn't? (Set would be sufficient for non-det to different configs) - // (Actual global model building (e.g., SGraphBuilderUtil.getSuccs) will collapse identical configs) - public List async(Role self, EAction a) - { - List res = new LinkedList<>(); - List succs = this.efsms.get(self).getSuccs(a); - for (EFsm succ : succs) - { - Map efsms = new HashMap<>(this.efsms); - efsms.put(self, succ); - SingleBuffers queues = // N.B. queue updates are insensitive to non-det "a" - a.isSend() ? this.queues.send(self, (ESend) a) - : a.isReceive() ? this.queues.receive(self, (ERecv) a) - : a.isDisconnect() ? this.queues.disconnect(self, (EDisconnect) a) - : null; - if (queues == null) - { - throw new RuntimeException("Shouldn't get in here: " + a); - } - res.add(this.mf.newSConfig(efsms, queues)); - } - return res; - } - - // "Synchronous version" of fire - // Pre: getFireable().get(r1).contains(a1) && getFireable().get(r2).contains(a2), where a1 and a2 are a "sync" pair - // Here, produce a List that distinguishes non-det to identical configs -- CHECKME: shouldn't? (Set would be sufficient for non-det to different configs) - // (Actual global model building (e.g., SGraphBuilderUtil.getSuccs) will collapse identical configs) - public List sync(Role r1, EAction a1, Role r2, EAction a2) - { - List res = new LinkedList<>(); - List succs1 = this.efsms.get(r1).getSuccs(a1); - List succs2 = this.efsms.get(r2).getSuccs(a2); - for (EFsm succ1 : succs1) - { - for (EFsm succ2 : succs2) - { - Map efsms = new HashMap<>(this.efsms); - // a1 and a2 are a "sync" pair, add all combinations of succ1 and succ2 that may arise - efsms.put(r1, succ1); // Overwrite existing r1/r2 entries - efsms.put(r2, succ2); - SingleBuffers queues; - // a1 and a2 definitely "sync", now just determine whether it is a connect or wrap - if (((a1.isRequest() && a2.isAccept()) - || (a1.isAccept() && a2.isRequest()))) - { - queues = this.queues.connect(r1, r2); // N.B. queue updates are insensitive to non-det "a" - } - else if (((a1.isClientWrap() && a2.isServerWrap()) - || (a1.isServerWrap() && a2.isClientWrap()))) - { - // Doesn't affect queue state - queues = this.queues; // OK, immutable? - } - else - { - throw new RuntimeException("Shouldn't get in here: " + a1 + ", " + a2); - } - res.add(this.mf.newSConfig(efsms, queues)); - } - } - return res; - } - - /*// CHECKME: rename -- not just termination, could be unconnected/uninitiated - public boolean isSafeTermination() - { - return this.efsms.keySet().stream().allMatch(x -> canSafelyTerminate(x)); - }*/ - - // Should work both with and without accept-correlation? - public boolean canSafelyTerminate(Role r) - { - EFsm fsm = this.efsms.get(r); - boolean safe = this.queues.isEmpty(r) && (fsm.curr.isTerminal() || - (fsm.curr.getStateKind().equals(EStateKind.ACCEPT) && fsm.isInitial())); // Specifically the initial state - - // CHECKME: incorrectly allows stuck accepts? if inactive not initial, should be clone of initial? - //|| (s.getStateKind().equals(Kind.ACCEPT) && this.states.keySet().stream().noneMatch((rr) -> !r.equals(rr) && this.queues.isConnected(r, rr))) - return safe; - } - - // N.B. Set (not List> getFireable() - { - Map> res = new HashMap<>(); - for (Role self : this.efsms.keySet()) - { - EFsm fsm = this.efsms.get(self); - Set as = new LinkedHashSet<>(); - switch (fsm.curr.getStateKind()) // Choice subject enabling needed for non-mixed states (mixed states would be needed for async. permutations though) - { - // Currently not convenient to delegate to states, as state types not distinguished - case TERMINAL: break; - case OUTPUT: as.addAll(getOutputFireable(self, fsm)); break; - case UNARY_RECEIVE: - case POLY_RECIEVE: - as.addAll(getReceiveFireable(self, fsm)); // addAll for generic typing - break; - case ACCEPT: as.addAll(getAcceptFireable(self, fsm)); break; - case SERVER_WRAP: as.addAll(getServerWrapFireable(self, fsm)); break; - default: throw new RuntimeException("Unknown state kind: " + fsm); - } - if (!as.isEmpty()) // Guards against res.put for empty "as", but perhaps unnecessary? - { - res.put(self, as); - } - } - return res; - } - - // Pre: fsm.curr.getStateKind() == EStateKind.OUTPUT - // fsm is self's Efsm - // (N.B. return Set, not List -- see getFireable) - protected Set getOutputFireable(Role self, EFsm fsm) // "output" and "client" actions - { - Set res = new LinkedHashSet<>(); - for (EAction a : fsm.curr.getActions()) // Actions may be a mixture of the following cases - { - // Async - if (a.isSend() || a.isDisconnect()) // For disconnect, only one "a" - { - if ((a.isSend() && this.queues.canSend(self, (ESend) a)) - || (a.isDisconnect() - && this.queues.canDisconnect(self, (EDisconnect) a))) - { - res.add(a); - } - } - // Sync - else if (a.isRequest() || a.isClientWrap()) - { - if ((a.isRequest() && this.queues.canRequest(self, (EReq) a)) - || (a.isClientWrap() - && this.queues.canClientWrap(self, (EClientWrap) a))) - { - if (this.efsms.get(a.peer).curr.getActions().stream() - .anyMatch(x -> a.toDual(self).equals(x))) // anyMatch (i.e., add "a" at most once), cf. getAcceptable - { - res.add(a); - } - } - } - else - { - throw new RuntimeException("Unknown output action kind: " + a); - } - } - return res; - } - - // Pre: fsm.curr.getStateKind() == EStateKind.UNARY_RECEIVE or POLY_RECIEVE - // Unary or poly receive - // (N.B. return Set, not List -- see getFireable) - protected Set getReceiveFireable(Role self, EFsm fsm) - { - return fsm.curr.getActions().stream().map(x -> (ERecv) x) - .filter(x -> this.queues.canReceive(self, x)) - .collect(Collectors.toSet()); - } - - // Pre: fsm.curr.getStateKind() == EStateKind.ACCEPT - // (N.B. return Set, not List -- see getFireable) - protected Set getAcceptFireable(Role self, EFsm fsm) - { - List as = fsm.curr.getActions(); - Role peer = as.get(0).peer; // All peer's the same - List peeras = this.efsms.get(peer).curr.getActions(); - return fsm.curr.getActions().stream().map(x -> (EAcc) x) - .filter(x -> this.queues.canAccept(self, x) - && peeras.stream().anyMatch(y -> y.toDual(peer).equals(x))) - .collect(Collectors.toSet()); - } - - // Pre: fsm.curr.getStateKind() == EStateKind.SERVER_WRAP - // (N.B. return Set, not List -- see getFireable) - // Duplicated from getAcceptFireable - protected Set getServerWrapFireable(Role self, EFsm fsm) + @Override + public String toString() { - List as = fsm.curr.getActions(); // Actually for ServerWrap, size() == 1 - Role peer = as.get(0).peer; // All peer's the same - List peeras = this.efsms.get(peer).curr.getActions(); - return fsm.curr.getActions().stream().map(x -> (EServerWrap) x) - .filter(x -> this.queues.canServerWrap(self, x) - && peeras.stream().anyMatch(y -> y.toDual(peer).equals(x))) - .collect(Collectors.toSet()); + return "(" + this.efsms + ", " + this.queues + ")"; } @Override @@ -445,10 +452,4 @@ public boolean equals(Object o) SConfig c = (SConfig) o; return this.efsms.equals(c.efsms) && this.queues.equals(c.queues); } - - @Override - public String toString() - { - return "(" + this.efsms + ", " + this.queues + ")"; - } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SingleBuffers.java b/scribble-core/src/main/java/org/scribble/core/model/global/SingleBuffers.java index bf2eddb9f..174a93461 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SingleBuffers.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SingleBuffers.java @@ -67,14 +67,15 @@ protected SingleBuffers(SingleBuffers queues) public boolean canSend(Role self, ESend a) { - return isConnected(self, a.peer) //&& isConnected(a.peer, self) // CHECKME: only consider local? + return isConnected(self, a.peer) //&& isConnected(a.peer, self) // CHECKME: only consider local side? && this.buffs.get(a.peer).get(self) == null; } public boolean canReceive(Role self, ERecv a) { ESend send = this.buffs.get(self).get(a.peer); - return send != null && send.toDual(a.peer).equals(a); + return isConnected(self, a.peer) // Other direction doesn't matter, local can still receive after peer disconnected + && send != null && send.toDual(a.peer).equals(a); } // N.B. "sync" action but only considers the self side, i.e., to actually fire, must also explicitly check canAccept @@ -108,6 +109,7 @@ public boolean canServerWrap(Role self, EServerWrap sw) return isConnected(self, sw.peer); } + // Pre: canSend, e.g., via via SConfig.getFireable // Return an updated copy public SingleBuffers send(Role self, ESend a) { @@ -116,6 +118,7 @@ public SingleBuffers send(Role self, ESend a) return copy; } + // Pre: canReceive, e.g., via SConfig.getFireable // Return an updated copy public SingleBuffers receive(Role self, ERecv a) { @@ -125,15 +128,17 @@ public SingleBuffers receive(Role self, ERecv a) } // Sync action + // Pre: canRequest(r1, [[r2]]) and canAccept(r2, [[r1]]), where [[r]] is a matching action with peer r -- e.g., via via SConfig.getFireable // Return an updated copy - public SingleBuffers connect(Role src, Role dest) + public SingleBuffers connect(Role r1, Role r2) // Role sides and message don't matter { SingleBuffers copy = new SingleBuffers(this); - copy.connected.get(src).put(dest, true); - copy.connected.get(dest).put(src, true); + copy.connected.get(r1).put(r2, true); + copy.connected.get(r2).put(r1, true); return copy; } + // Pre: canDisconnect(self, d), e.g., via SConfig.via getFireable // Return an updated copy public SingleBuffers disconnect(Role self, EDisconnect d) { diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 4464f96db..6d52d2090 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -112,7 +112,7 @@ module tmp.Test; data "..." from "..." as T; -//* +/* global protocol Proto1(role A, role B, role C, role D) { rec X @@ -160,7 +160,7 @@ global protocol Proto1(role A, role B) //*/ -/* +//* explicit global protocol Proto1(role A, role B, role C) { connect A to B; // TODO: junit tests for explicit From 9dd6ae0dec7fdd126305fbee1f3f72ba8a433af6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 23 Apr 2019 21:55:47 +0100 Subject: [PATCH 386/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/global/SModel.java | 42 ++++++++----------- scribble-test/src/test/scrib/tmp/Test.scr | 4 +- 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index 69ee971b0..150dd3479 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -45,18 +45,15 @@ public SModel(SGraph graph) public void validate(Core core) throws ScribException { this.core = core; - - SState init = this.graph.init; - Map states = this.graph.states; String errorMsg = ""; - errorMsg = checkSafety(core, init, states, errorMsg); + errorMsg = checkSafety(errorMsg); if (!core.config.args.get(CoreArgs.NO_PROGRESS)) { //job.debugPrintln("(" + this.graph.proto + ") Checking progress: "); // Incompatible with current errorMsg approach*/ - errorMsg = checkProgress(init, states, errorMsg); + errorMsg = checkProgress(errorMsg); } if (!errorMsg.equals("")) @@ -67,18 +64,17 @@ public void validate(Core core) throws ScribException //job.debugPrintln("(" + this.graph.proto + ") Progress satisfied."); // Also safety... current errorMsg approach } - private String checkSafety(Core core, SState init, - Map states, String errorMsg) + private String checkSafety(String errorMsg) { int debugCount = 1; - for (SState s : states.values()) + for (SState s : this.graph.states.values()) { - if (core.config.args.get(CoreArgs.VERBOSE)) + if (this.core.config.args.get(CoreArgs.VERBOSE)) { if (debugCount++ % 50 == 0) { //job.debugPrintln("(" + this.graph.proto + ") Checking safety: " + count + " states"); - core.verbosePrintln( + this.core.verbosePrintln( "(" + this.graph.proto + ") Checking states: " + debugCount); } } @@ -93,13 +89,12 @@ private String checkSafety(Core core, SState init, } errorMsg = appendSafetyErrorMessages(errorMsg, errors); } - core.verbosePrintln("(" + this.graph.proto + ") Checked all states: " + debugCount); // May include unsafe states + this.core.verbosePrintln("(" + this.graph.proto + ") Checked all states: " + debugCount); // May include unsafe states // FIXME: progress still to be checked below return errorMsg; } - private String checkProgress(SState init, Map states, - String errorMsg) throws ScribException + private String checkProgress(String errorMsg) throws ScribException { Set> termsets = this.graph.getTermSets(); for (Set termset : termsets) @@ -107,11 +102,11 @@ private String checkProgress(SState init, Map states, /*job.debugPrintln("(" + this.graph.proto + ") Checking terminal set: " + termset.stream().map((i) -> new Integer(all.get(i).id).toString()).collect(Collectors.joining(","))); // Incompatible with current errorMsg approach*/ - Set starved = checkRoleProgress(states, init, termset); + Set starved = checkRoleProgress(termset); Map> ignored = - checkEventualReception(states, init, termset); - errorMsg = appendProgressErrorMessages(errorMsg, starved, ignored, - states, termset); + checkEventualReception(termset); + errorMsg = appendProgressErrorMessages(errorMsg, starved, ignored, + termset); } return errorMsg; } @@ -139,20 +134,19 @@ protected String appendSafetyErrorMessages(String errorMsg, } protected String appendProgressErrorMessages(String errorMsg, - Set starved, Map> ignored, - Map states, Set termset) + Set starved, Map> ignored, Set termset) { if (!starved.isEmpty()) { errorMsg += "\nRole progress violation for " + starved + " in session state terminal set:\n " - + termSetToString(termset, states); + + termSetToString(termset, this.graph.states); } if (!ignored.isEmpty()) { errorMsg += "\nEventual reception violation for " + ignored + " in session state terminal set:\n " - + termSetToString(termset, states); + + termSetToString(termset, this.graph.states); } return errorMsg; } @@ -168,8 +162,7 @@ protected String termSetToString(Set termset, } // ** Could subsume terminal state check, if terminal sets included size 1 with reflexive reachability (but not a good approach) - protected static Set checkRoleProgress(Map states, - SState init, Set termset) throws ScribException + protected static Set checkRoleProgress(Set termset) throws ScribException { Set starved = new HashSet<>(); Iterator i = termset.iterator(); @@ -232,8 +225,7 @@ protected static Set checkRoleProgress(Map states, // (eventual reception) protected static Map> checkEventualReception( - Map states, SState init, Set termset) - throws ScribException + Set termset) throws ScribException { Set roles = //states.get(termset.iterator().next()) termset.iterator().next() diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 6d52d2090..ef1b81d91 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -160,7 +160,7 @@ global protocol Proto1(role A, role B) //*/ -//* +/* explicit global protocol Proto1(role A, role B, role C) { connect A to B; // TODO: junit tests for explicit @@ -735,7 +735,7 @@ global protocol Proto1(role A, role B) -/* +//* type "System.UInt32" from "..." as int; global protocol SH(role P, role R, role C) From 30fc441dc50452d92daf0784addf9ea5e84428fa Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 23 Apr 2019 22:26:59 +0100 Subject: [PATCH 387/539] [AllTest] Continued: refactoring core model classes. --- .../org/scribble/core/model/ModelFactory.java | 2 +- .../scribble/core/model/ModelFactoryImpl.java | 1 + .../scribble/core/model/global/SConfig.java | 2 +- .../scribble/core/model/global/SGraph.java | 6 +- .../core/model/global/SGraphBuilder.java | 2 +- .../core/model/global/SGraphBuilderUtil.java | 1 + .../scribble/core/model/global/SModel.java | 37 ++++-------- .../scribble/core/model/global/SState.java | 26 +++------ .../core/model/global/SStateErrors.java | 57 ++++++++++++++++--- scribble-test/src/test/scrib/tmp/Test.scr | 6 +- 10 files changed, 80 insertions(+), 60 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java index dfca245e9..443f49bd1 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java @@ -71,6 +71,6 @@ public interface ModelFactory SState newSState(SConfig config); SConfig newSConfig(Map state, SingleBuffers buffs); - SGraph newSGraph(GProtoName proto, Map states, SState init); + SGraph newSGraph(GProtoName proto, Map states, SState init); // states: s.id -> s SModel newSModel(SGraph g); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java index 802170cb1..c7e806be0 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java @@ -157,6 +157,7 @@ public SState newSState(SConfig config) return new SState(config); } + // states: s.id -> s @Override public SGraph newSGraph(GProtoName proto, Map states, SState init) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index 1b2c210dc..4cdc595bf 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -278,7 +278,7 @@ public Map getStuckMessages() } // Doesn't include locally terminated (single term state does not induce a deadlock cycle) - public Set> getWaitForErrors() + public Set> getWaitForCycles() { Set> res = new HashSet<>(); List todo = new LinkedList<>(this.efsms.keySet()); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java index ca16912de..75a57e37a 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java @@ -33,7 +33,7 @@ public class SGraph implements MPrettyPrint public final GProtoName proto; // For debugging only? deprecate? public final SState init; - public final Map states; + public final Map states; // s.id -> s private final Set> termSets; @@ -42,7 +42,7 @@ public SGraph(GProtoName proto, Map states, SState init) { this.proto = proto; this.init = init; - this.states = Collections.unmodifiableMap(states); + this.states = Collections.unmodifiableMap(states); // s.id -> s //this.reach = getReachabilityMap(); // TODO: refactor @@ -84,6 +84,7 @@ public List getTraceFromInit(SState end) // Returns null if end cannot be reached private Map> bfsFromInit(SState end) // (cf., Dijkstra's with all weights 1) { + // SState.id faster as keys than full SConfig Set seen = new HashSet<>(); List todo = new LinkedList<>(); seen.add(this.init.id); @@ -134,6 +135,7 @@ public String toString() } // Following are "one-time" usage, on instance construction + // SState.id faster as keys than full SConfig private int counter = 0; private Map indices = new HashMap<>(); // s.id -> index private Map lowlinks = new HashMap<>(); // s.id -> lowlink diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index 96aed14a6..da3c9debb 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -62,7 +62,7 @@ public SGraph build(GProtoName fullname, Map egraphs, SConfig c0 = createInitConfig(egraphs, explicit); SState init = this.util.newState(c0); - Set todo = new LinkedHashSet<>(); + Set todo = new LinkedHashSet<>(); // Consider Map, faster than full SConfig hash ? todo.add(init); for (//int debugCount = 1 ; !todo.isEmpty(); ) // Compute configs and use util to construct graph, until no more new configs diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index 972e8e80b..c1e2fc85b 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -69,6 +69,7 @@ public Set getSuccs(SState curr, SAction a, //List succs) return res; } + // s.id -> s public Map getStates() { return this.states.values().stream() diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index 150dd3479..622a54573 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -16,8 +16,8 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; @@ -48,7 +48,9 @@ public void validate(Core core) throws ScribException String errorMsg = ""; - errorMsg = checkSafety(errorMsg); + errorMsg = getSafetyErrors().values().stream() + .map(x -> x.toErrorMessage(this.graph)) + .collect(Collectors.joining("")); if (!core.config.args.get(CoreArgs.NO_PROGRESS)) { @@ -64,9 +66,10 @@ public void validate(Core core) throws ScribException //job.debugPrintln("(" + this.graph.proto + ") Progress satisfied."); // Also safety... current errorMsg approach } - private String checkSafety(String errorMsg) + //private String checkSafety(String errorMsg) + protected Map getSafetyErrors() // s.id key lighter than full SConfig { - int debugCount = 1; + /*//int debugCount = 1; for (SState s : this.graph.states.values()) { if (this.core.config.args.get(CoreArgs.VERBOSE)) @@ -91,7 +94,9 @@ private String checkSafety(String errorMsg) } this.core.verbosePrintln("(" + this.graph.proto + ") Checked all states: " + debugCount); // May include unsafe states // FIXME: progress still to be checked below - return errorMsg; + return errorMsg;*/ + return this.graph.states.entrySet().stream().collect( + Collectors.toMap(Entry::getKey, x -> x.getValue().getErrors())); } private String checkProgress(String errorMsg) throws ScribException @@ -111,28 +116,6 @@ private String checkProgress(String errorMsg) throws ScribException return errorMsg; } - protected String appendSafetyErrorMessages(String errorMsg, - SStateErrors errors) - { - if (!errors.stuck.isEmpty()) - { - errorMsg += "\n Stuck messages: " + errors.stuck; // Deadlock from reception error - } - if (!errors.waitFor.isEmpty()) - { - errorMsg += "\n Wait-for errors: " + errors.waitFor; // Deadlock from input-blocked cycles, terminated dependencies, etc - } - if (!errors.orphans.isEmpty()) - { - errorMsg += "\n Orphan messages: " + errors.orphans; // FIXME: add sender of orphan to error message - } - if (!errors.unfinished.isEmpty()) - { - errorMsg += "\n Unfinished roles: " + errors.unfinished; - } - return errorMsg; - } - protected String appendProgressErrorMessages(String errorMsg, Set starved, Map> ignored, Set termset) { diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java index fd912e0d2..62f37a72e 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java @@ -14,17 +14,12 @@ package org.scribble.core.model.global; import java.util.Collections; -import java.util.Map; import java.util.Set; import org.scribble.core.model.MPrettyState; import org.scribble.core.model.MState; -import org.scribble.core.model.endpoint.EState; -import org.scribble.core.model.endpoint.actions.ERecv; -import org.scribble.core.model.endpoint.actions.ESend; import org.scribble.core.model.global.actions.SAction; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.Role; // CHECKME: make a WFModel front-end class? (cf. EGraph) // N.B. only uses MState.id cosmetically, cf. MState equals/hashCode -- overrides equals/hashCode based on this.config (maybe extending MState is a bit misleading) @@ -48,18 +43,15 @@ protected void addEdge(SAction a, SState s) public SStateErrors getErrors() // Means safety (i.e., individual state) errors { - Map stuck = this.config.getStuckMessages(); - Set> waitfor = this.config.getWaitForErrors(); - Map> orphs = this.config.getOrphanMessages(); - Map unfinished = this.config.getUnfinishedRoles(); - return new SStateErrors(stuck, waitfor, orphs, unfinished); + return new SStateErrors(this); } @Override protected String getNodeLabel() { String labs = this.config.toString(); - return "label=\"" + this.id + ":" + labs.substring(1, labs.length() - 1) + "\""; + return "label=\"" + this.id + ":" + labs.substring(1, labs.length() - 1) + + "\""; } @Override @@ -68,6 +60,12 @@ public Set getReachableStates() return getReachableStatesAux(this); } + @Override + public String toString() + { + return this.id + ":" + this.config.toString(); + } + // N.B. does not use super.hashCode, need "semantic" equality of configs for model construction @Override public int hashCode() @@ -100,12 +98,6 @@ protected boolean canEquals(MState s) { return s instanceof SState; } - - @Override - public String toString() - { - return this.id + ":" + this.config.toString(); - } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java b/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java index 5ef2436e3..038cd53d4 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java @@ -13,35 +13,40 @@ */ package org.scribble.core.model.global; -import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.Set; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.endpoint.actions.ERecv; import org.scribble.core.model.endpoint.actions.ESend; +import org.scribble.core.model.global.actions.SAction; import org.scribble.core.type.name.Role; public class SStateErrors { + public final SState state; + // FIXME: factor out explicit error classes -- for error message formatting // FIXME: could also check for roles stuck on unconnected sends here (probably better, than current syntax check) - public final Map stuck; // Reception errors + public final Map stuck; // Reception errors public final Set> waitFor; // Deadlock cycles public final Map> orphans; // Orphan messages - public Map unfinished; // Unfinished roles + public final Map unfinished; // Unfinished roles - public SStateErrors(Map receptionErrors, Set> deadlocks, Map> orphans, Map unfinished) + public SStateErrors(SState state) { - this.stuck = Collections.unmodifiableMap(receptionErrors); - this.waitFor = Collections.unmodifiableSet(deadlocks); - this.orphans = Collections.unmodifiableMap(orphans); - this.unfinished = Collections.unmodifiableMap(unfinished); + this.state = state; + this.stuck = state.config.getStuckMessages(); + this.waitFor = state.config.getWaitForCycles(); + this.orphans = state.config.getOrphanMessages(); + this.unfinished = state.config.getUnfinishedRoles(); } public boolean isEmpty() { - return this.stuck.isEmpty() && this.waitFor.isEmpty() && this.orphans.isEmpty() && this.unfinished.isEmpty(); + return this.stuck.isEmpty() && this.waitFor.isEmpty() + && this.orphans.isEmpty() && this.unfinished.isEmpty(); } @Override @@ -49,4 +54,38 @@ public String toString() { return "stuck=" + this.stuck + ", watiFor=" + this.waitFor + ", orphans=" + this.orphans + ", unfinished=" + this.unfinished; } + + public String toErrorMessage(SGraph graph) + { + String errorMsg = ""; + if (!isEmpty()) + { + // CHECKME: getTrace can get stuck when local choice subjects are disabled ? (has since been rewritten) + List trace = graph.getTraceFromInit(this.state); // CHECKME: getTrace broken on non-det self loops? + errorMsg += "\nSafety violation(s) at session state " + this.state.id + + ":\n Trace=" + trace; + } + return appendSafetyErrorMessages(errorMsg); + } + + protected String appendSafetyErrorMessages(String errorMsg) + { + if (!this.stuck.isEmpty()) + { + errorMsg += "\n Stuck messages: " + this.stuck; // Deadlock from reception error + } + if (!this.waitFor.isEmpty()) + { + errorMsg += "\n Wait-for this: " + this.waitFor; // Deadlock from input-blocked cycles, terminated dependencies, etc + } + if (!this.orphans.isEmpty()) + { + errorMsg += "\n Orphan messages: " + this.orphans; // FIXME: add sender of orphan to error message + } + if (!this.unfinished.isEmpty()) + { + errorMsg += "\n Unfinished roles: " + this.unfinished; + } + return errorMsg; + } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index ef1b81d91..c6f28a4e5 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -102,8 +102,10 @@ module tmp.Test; // choice-specific fairness annotations // fix codegen when -fair // CHECKME: accept branching on messages (and safety properties) -- connection should not be established if message stuck? (cf. reception error) -- issue is implementation: what is a realistic semantics for sync-connect-branching (i.e., prevent client from async progressing after messaging) -- consider reversing client/server branching side? i.e. client requests, but then receives? (and consider serverside-branching a sugar?) + // parser/ast refactoring // check G/LType casts vs. SType (favour latter) + // refactor Set to Map // Test refactoring: // refactor test to use main instead of cli @@ -112,7 +114,7 @@ module tmp.Test; data "..." from "..." as T; -/* +//* global protocol Proto1(role A, role B, role C, role D) { rec X @@ -735,7 +737,7 @@ global protocol Proto1(role A, role B) -//* +/* type "System.UInt32" from "..." as int; global protocol SH(role P, role R, role C) From f78b7a833fd17ce0b9f7df9e4bd298e670ee4186 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 23 Apr 2019 22:55:33 +0100 Subject: [PATCH 388/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/global/SModel.java | 38 ++++--------------- 1 file changed, 7 insertions(+), 31 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index 622a54573..5bcbb6c0f 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -17,8 +17,9 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; +import java.util.SortedMap; +import java.util.TreeMap; import java.util.stream.Collectors; import org.scribble.core.job.Core; @@ -66,37 +67,12 @@ public void validate(Core core) throws ScribException //job.debugPrintln("(" + this.graph.proto + ") Progress satisfied."); // Also safety... current errorMsg approach } - //private String checkSafety(String errorMsg) - protected Map getSafetyErrors() // s.id key lighter than full SConfig + protected SortedMap getSafetyErrors() // s.id key lighter than full SConfig { - /*//int debugCount = 1; - for (SState s : this.graph.states.values()) - { - if (this.core.config.args.get(CoreArgs.VERBOSE)) - { - if (debugCount++ % 50 == 0) - { - //job.debugPrintln("(" + this.graph.proto + ") Checking safety: " + count + " states"); - this.core.verbosePrintln( - "(" + this.graph.proto + ") Checking states: " + debugCount); - } - } - - SStateErrors errors = s.getErrors(); - if (!errors.isEmpty()) - { - // CHECKME: getTrace can get stuck when local choice subjects are disabled ? (has since been rewritten) - List trace = this.graph.getTraceFromInit(s); // FIXME: getTrace broken on non-det self loops? - errorMsg += "\nSafety violation(s) at session state " + s.id - + ":\n Trace=" + trace; - } - errorMsg = appendSafetyErrorMessages(errorMsg, errors); - } - this.core.verbosePrintln("(" + this.graph.proto + ") Checked all states: " + debugCount); // May include unsafe states - // FIXME: progress still to be checked below - return errorMsg;*/ - return this.graph.states.entrySet().stream().collect( - Collectors.toMap(Entry::getKey, x -> x.getValue().getErrors())); + SortedMap res = new TreeMap<>(); + this.graph.states.entrySet().stream().forEach(x -> + res.put(x.getKey(), x.getValue().getErrors())); + return res; } private String checkProgress(String errorMsg) throws ScribException From 2ae117dbfa14954114cdadf64203f590a235017d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 23 Apr 2019 23:42:10 +0100 Subject: [PATCH 389/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/global/SModel.java | 80 +++++-------------- .../core/model/global/actions/SAction.java | 4 +- .../resources/good/efsm/gchoice/Test09.scr | 2 + 3 files changed, 23 insertions(+), 63 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index 5bcbb6c0f..ffc08f7be 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -24,9 +24,7 @@ import org.scribble.core.job.Core; import org.scribble.core.job.CoreArgs; -import org.scribble.core.model.endpoint.EFsm; import org.scribble.core.model.endpoint.actions.ESend; -import org.scribble.core.model.global.actions.SAction; import org.scribble.core.type.name.Role; import org.scribble.util.ScribException; @@ -120,70 +118,30 @@ protected String termSetToString(Set termset, .collect(Collectors.joining(",")); } - // ** Could subsume terminal state check, if terminal sets included size 1 with reflexive reachability (but not a good approach) - protected static Set checkRoleProgress(Set termset) throws ScribException + // Could subsume terminal state check, if terminal sets included size 1 with reflexive reachability (but not a good approach) + protected Set checkRoleProgress(Set termset) + throws ScribException { - Set starved = new HashSet<>(); - Iterator i = termset.iterator(); - SState s = i.next();//states.get(i.next()); - Map ss = new HashMap<>(); - s.config.efsms.keySet().forEach(r -> ss.put(r, s)); - while (i.hasNext()) + SState s = termset.iterator().next(); // Pick any state to check canSafelyTerminate (later, if needed), if non progressing equivalent for all + Set todo = new HashSet<>(s.config.efsms.keySet()); + for (Iterator i = termset.iterator(); + i.hasNext() && !todo.isEmpty(); ) { - SState next = i.next();//states.get(i.next()); - Map tmp = next.config.efsms; - for (Role r : tmp.keySet()) - { - if (ss.get(r) != null) - { - /*if (!ss.get(r).equals(tmp.get(r))) - { - ss.put(r, null); - } - else*/ - { - for (SAction a : next.getActions()) - { - if (a.containsRole(r)) - { - ss.put(r, null); - break; - } - } - } - } - } + i.next().getActions().stream().map(x -> x.subj).distinct() + .forEach(x -> todo.remove(x)); + // cf. a.containsRole(r) -- implies obj will be subj for the counterpart action somewhere in the termset? } - for (Role r : ss.keySet()) - { - SState foo = ss.get(r); - if (foo != null) - { - EFsm tmp = foo.config.efsms.get(r); - if (tmp != null) - { - if (!foo.config.canSafelyTerminate(r)) - { - if (s.config.queues.getQueue(r).values().stream() - .allMatch((v) -> v == null)) - { - starved.add(r); - } - /* - // Should be redundant given explicit reception error etc checking - else - { - safety.add(r); - }*/ - } - } - } - } - return starved; + + // todo is now all roles that are not the subj of any action in the termset + return todo.stream() + .filter(x -> !s.config.canSafelyTerminate(x) + && s.config.queues.getQueue(x).values().stream() + .allMatch(y -> y == null)) // Check empty queues for starved -- o/w, is a stuck-message + .collect(Collectors.toSet()); } - // (eventual reception) - protected static Map> checkEventualReception( + // cf. eventual stability (could also check within termsets) + protected Map> checkEventualReception( Set termset) throws ScribException { Set roles = //states.get(termset.iterator().next()) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java index 0bceb8fe1..209df9618 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/actions/SAction.java @@ -74,10 +74,10 @@ public Set getRoles() return new HashSet<>(Arrays.asList(this.subj, this.obj)); } - public boolean containsRole(Role role) + /*public boolean containsRole(Role role) { return this.subj.equals(role) || this.obj.equals(role); - } + }*/ @Override public String toString() diff --git a/scribble-test/src/test/resources/good/efsm/gchoice/Test09.scr b/scribble-test/src/test/resources/good/efsm/gchoice/Test09.scr index 2b5b86816..c67f743bb 100644 --- a/scribble-test/src/test/resources/good/efsm/gchoice/Test09.scr +++ b/scribble-test/src/test/resources/good/efsm/gchoice/Test09.scr @@ -1,3 +1,5 @@ +//$ bin/scribblec.sh scribble-test/src/test/resources/good/efsm/gchoice/Test09.scr + module good.efsm.gchoice.Test09; From 1b270501c487be2ffa4cb5add5a7115bea04505a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 24 Apr 2019 01:28:02 +0100 Subject: [PATCH 390/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/global/SModel.java | 156 ++++++++---------- .../core/model/global/SStateErrors.java | 26 +-- scribble-test/src/test/scrib/tmp/Test.scr | 11 +- 3 files changed, 88 insertions(+), 105 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index ffc08f7be..5cff2591a 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -17,6 +17,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; @@ -26,43 +27,48 @@ import org.scribble.core.job.CoreArgs; import org.scribble.core.model.endpoint.actions.ESend; import org.scribble.core.type.name.Role; +import org.scribble.util.Pair; import org.scribble.util.ScribException; // For doing validation operations on an SGraph (cf. EFsm, use Graph as an FSM) public class SModel { + //private Core core; // CHECKME: refactor? but avoiding in constructor to keep mf more independent/uniform + public final SGraph graph; - - private Core core; // only used for debug printing // CHECKME: refactor? but avoiding in constructor to keep mf more independent/uniform public SModel(SGraph graph) { this.graph = graph; } + // FIXME: let Core call check safety/progress directly (to avoid passing core) public void validate(Core core) throws ScribException { - this.core = core; + //this.core = core; String errorMsg = ""; - errorMsg = getSafetyErrors().values().stream() + errorMsg += getSafetyErrors().values().stream() .map(x -> x.toErrorMessage(this.graph)) .collect(Collectors.joining("")); if (!core.config.args.get(CoreArgs.NO_PROGRESS)) { - //job.debugPrintln("(" + this.graph.proto + ") Checking progress: "); // Incompatible with current errorMsg approach*/ - errorMsg = checkProgress(errorMsg); + Map, Pair, Map>>> progErrors + = checkProgress(); + for (Entry, Pair, Map>>> e : + progErrors.entrySet()) + { + errorMsg += getProgressErrorMessages(e.getKey(), e.getValue()); + } } if (!errorMsg.equals("")) { - //throw new ScribbleException("\n" + init.toDot() + errorMsg); throw new ScribException(errorMsg); } - //job.debugPrintln("(" + this.graph.proto + ") Progress satisfied."); // Also safety... current errorMsg approach } protected SortedMap getSafetyErrors() // s.id key lighter than full SConfig @@ -73,54 +79,19 @@ protected SortedMap getSafetyErrors() // s.id key lighte return res; } - private String checkProgress(String errorMsg) throws ScribException - { - Set> termsets = this.graph.getTermSets(); - for (Set termset : termsets) - { - /*job.debugPrintln("(" + this.graph.proto + ") Checking terminal set: " - + termset.stream().map((i) -> new Integer(all.get(i).id).toString()).collect(Collectors.joining(","))); // Incompatible with current errorMsg approach*/ - - Set starved = checkRoleProgress(termset); - Map> ignored = - checkEventualReception(termset); - errorMsg = appendProgressErrorMessages(errorMsg, starved, ignored, - termset); - } - return errorMsg; - } - - protected String appendProgressErrorMessages(String errorMsg, - Set starved, Map> ignored, Set termset) + // These are checked only on termsets (cf. safety checked on all), and "overlap" with safety errors within there + // Could "skip" safety checks for termsets (probably better than coercing "progress" outside of termsets, as it would probably just amount to safety anyway) + // CHECKME: factor out a TermSet class? + protected Map, Pair, Map>>> checkProgress() { - if (!starved.isEmpty()) - { - errorMsg += "\nRole progress violation for " + starved - + " in session state terminal set:\n " - + termSetToString(termset, this.graph.states); - } - if (!ignored.isEmpty()) - { - errorMsg += "\nEventual reception violation for " + ignored - + " in session state terminal set:\n " - + termSetToString(termset, this.graph.states); - } - return errorMsg; - } - - protected String termSetToString(Set termset, - Map all) - { - return this.core.config.args.get(CoreArgs.VERBOSE) - ? termset.stream().map(x -> x.toString()) - .collect(Collectors.joining(",")) - : termset.stream().map(x -> Integer.toString(x.id)) - .collect(Collectors.joining(",")); + return this.graph.getTermSets().stream().collect(Collectors.toMap( + x -> x, + x -> new Pair<>(checkRoleProgress(x), checkEventualReception(x)) + )); } // Could subsume terminal state check, if terminal sets included size 1 with reflexive reachability (but not a good approach) protected Set checkRoleProgress(Set termset) - throws ScribException { SState s = termset.iterator().next(); // Pick any state to check canSafelyTerminate (later, if needed), if non progressing equivalent for all Set todo = new HashSet<>(s.config.efsms.keySet()); @@ -141,56 +112,65 @@ protected Set checkRoleProgress(Set termset) } // cf. eventual stability (could also check within termsets) - protected Map> checkEventualReception( - Set termset) throws ScribException + protected Map> checkEventualReception(Set termset) { - Set roles = //states.get(termset.iterator().next()) - termset.iterator().next() - .config.efsms.keySet(); - - Iterator i = termset.iterator(); - Map> b0 = i.next()//states.get(i.next()) - .config.queues - .getQueues(); - while (i.hasNext()) + SState s0 = termset.iterator().next(); + Set roles = s0.config.efsms.keySet(); + Map> q0 = s0.config.queues.getQueues(); // dest -> src -> msg -- dest.equals(msg.peer), msg is ESend to the dst + for (Role r1 : roles) { - SState s = i.next();//states.get(i.next()); - SingleBuffers b = s.config.queues; - for (Role r1 : roles) + Map q0_r1 = q0.get(r1); + for (Role r2 : roles) { - for (Role r2 : roles) + if (!r1.equals(r2) && q0_r1.get(r2) != null && + termset.stream() + .anyMatch(x -> x.config.queues.getQueue(r1).get(r2) == null)) { - ESend s0 = b0.get(r1).get(r2); - if (s0 != null) - { - ESend tmp = b.getQueue(r1).get(r2); - if (tmp == null) - { - b0.get(r1).put(r2, null); - } - } + q0_r1.put(r2, null); } } } + // q0 now shows which buffers are never null at any state in the termset Map> ignored = new HashMap<>(); - for (Role r1 : roles) + for (Role r : roles) { - for (Role r2 : roles) + Set msgs = q0.values().stream() + .flatMap(x -> x.entrySet().stream()) // For all input buffs at every role... + .filter(x -> x.getKey().equals(r) && x.getValue() != null) // ...s.t. the buff is from "r" and is non-empty + .map(x -> x.getValue()).collect(Collectors.toSet()); + if (!msgs.isEmpty()) { - ESend m = b0.get(r1).get(r2); - if (m != null) - { - Set tmp = ignored.get(r2); - if (tmp == null) - { - tmp = new HashSet<>(); - ignored.put(r2, tmp); - } - tmp.add(m); - } + ignored.put(r, msgs); } } return ignored; } + + // Cf. SStateErrors + protected String getProgressErrorMessages(Set termset, + Pair, Map>> perrors) + { + String msg = ""; + if (!perrors.left.isEmpty()) + { + msg += "\nRole progress violation for " + perrors.left + + " in session state terminal set:\n " + termSetToString(termset); + } + if (!perrors.right.isEmpty()) + { + msg += "\nEventual reception violation for " + perrors.right + + " in session state terminal set:\n " + termSetToString(termset); + } + return msg; + } + + protected String termSetToString(Set termset) + { + return /*this.core.config.args.get(CoreArgs.VERBOSE) + ? termset.stream().map(x -> x.toString()) + .collect(Collectors.joining(",")) + :*/ termset.stream().map(x -> Integer.toString(x.id)) + .collect(Collectors.joining(",")); + } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java b/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java index 038cd53d4..c825f49c5 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java @@ -52,40 +52,44 @@ public boolean isEmpty() @Override public String toString() { - return "stuck=" + this.stuck + ", watiFor=" + this.waitFor + ", orphans=" + this.orphans + ", unfinished=" + this.unfinished; + return "stuck=" + this.stuck + ", watiFor=" + this.waitFor + ", orphans=" + + this.orphans + ", unfinished=" + this.unfinished; } public String toErrorMessage(SGraph graph) { - String errorMsg = ""; + String msg = ""; // Return empty when no error? if (!isEmpty()) { // CHECKME: getTrace can get stuck when local choice subjects are disabled ? (has since been rewritten) List trace = graph.getTraceFromInit(this.state); // CHECKME: getTrace broken on non-det self loops? - errorMsg += "\nSafety violation(s) at session state " + this.state.id - + ":\n Trace=" + trace; + msg += "\nSafety violation(s) at session state " + this.state.id + + ":\n Trace=" + trace + + appendErrors(); // Does leading "\n" } - return appendSafetyErrorMessages(errorMsg); + return msg; } - protected String appendSafetyErrorMessages(String errorMsg) + // TODO: snip if too long? -- maybe not, let user pipe to file + protected String appendErrors() { + String res = ""; if (!this.stuck.isEmpty()) { - errorMsg += "\n Stuck messages: " + this.stuck; // Deadlock from reception error + res += "\n Stuck messages: " + this.stuck; // Deadlock from reception error } if (!this.waitFor.isEmpty()) { - errorMsg += "\n Wait-for this: " + this.waitFor; // Deadlock from input-blocked cycles, terminated dependencies, etc + res += "\n Wait-for this: " + this.waitFor; // Deadlock from input-blocked cycles, terminated dependencies, etc } if (!this.orphans.isEmpty()) { - errorMsg += "\n Orphan messages: " + this.orphans; // FIXME: add sender of orphan to error message + res += "\n Orphan messages: " + this.orphans; // FIXME: add sender of orphan to error message } if (!this.unfinished.isEmpty()) { - errorMsg += "\n Unfinished roles: " + this.unfinished; + res += "\n Unfinished roles: " + this.unfinished; } - return errorMsg; + return res; } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index c6f28a4e5..1d24f2712 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -12,8 +12,8 @@ module tmp.Test; -// replace a lot of FACTORY name calls by clone -// -minlts states IDs don't match validation output +// TODO: replace a lot of FACTORY name calls by clone +// FIXME: -minlts states IDs don't match validation output // CHECKME: playing multiple roles in the same session instance (but what is the concrete notion of "process id"? -- if actually try to use, e.g., ThreadID, then have to track ownership of endpoints) @@ -79,17 +79,16 @@ module tmp.Test; // For model build/check refactoring: // TODO: fix imed-projection choice subjects -- inlined-projection is a single proto with all roles -//HERE refactor model states, remove intermedrecedge // Outstanding: - //...disallow/check for reserved __ -- do in gtype translation? + // ...disallow/check for reserved __ -- do in gtype translation? // FIXME: qualifed sig name as non-role do-arg // TODO: rename addChildren1 // CHECKME: duplicate proto mods // ...check ad hoc ScribNode constructions go through af properly // ...refactor -spin as an ext - // add exp conn checks to model validation + // add exp conn checks to model validation -- maybe just as estatevisitor? (cf. prev syntactic connection checks) // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) // sort out full name expansion between disamb and translation -- fix modulecontextcollector for imported module member fullnames // refactor additional disamb syntactic checks into core? e.g., do-calls, distinct roledecls, protodecls, etc. @@ -131,7 +130,7 @@ global protocol Proto1(role A, role B, role C, role D) or { 1() from A to B; - 3() from B to A; // Testing wait-for cycle detection + 3() from B to A; // Testing wait-for cycle detection // Also tests eventual reception } } //*/ From c39a9f07c59fb0c84786de3e81a4ad6756383605 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 24 Apr 2019 01:46:30 +0100 Subject: [PATCH 391/539] [AllTest] Continued: refactoring core model classes. --- .../scribble/core/model/global/SModel.java | 82 ++++++++++++------- 1 file changed, 52 insertions(+), 30 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index 5cff2591a..8614f28e2 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -13,6 +13,7 @@ */ package org.scribble.core.model.global; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -34,7 +35,7 @@ // For doing validation operations on an SGraph (cf. EFsm, use Graph as an FSM) public class SModel { - //private Core core; // CHECKME: refactor? but avoiding in constructor to keep mf more independent/uniform + private Core core; // CHECKME: refactor? but avoiding in constructor to keep mf more independent/uniform public final SGraph graph; @@ -43,51 +44,72 @@ public SModel(SGraph graph) this.graph = graph; } - // FIXME: let Core call check safety/progress directly (to avoid passing core) + // CHECKME: let Core call check safety/progress directly? (to avoid passing core) public void validate(Core core) throws ScribException { - //this.core = core; + this.core = core; - String errorMsg = ""; - - errorMsg += getSafetyErrors().values().stream() - .map(x -> x.toErrorMessage(this.graph)) - .collect(Collectors.joining("")); - + SortedMap sErrs = getSafetyErrors(); + Map, Pair, Map>>> pErrors + = Collections.emptyMap(); if (!core.config.args.get(CoreArgs.NO_PROGRESS)) { - Map, Pair, Map>>> progErrors - = checkProgress(); - for (Entry, Pair, Map>>> e : - progErrors.entrySet()) - { - errorMsg += getProgressErrorMessages(e.getKey(), e.getValue()); - } + pErrors = getProgressErrors(); } - if (!errorMsg.equals("")) + if (!sErrs.isEmpty() || !pErrors.isEmpty()) { - throw new ScribException(errorMsg); + String msg = ""; + if (!sErrs.isEmpty()) + { + msg += getSafetyErrors().values().stream() + .map(x -> x.toErrorMessage(this.graph)) + .collect(Collectors.joining("")); + } + if (!pErrors.isEmpty()) + { + for (Entry, Pair, Map>>> e : + pErrors.entrySet()) + { + msg += getProgressErrorMessages(e.getKey(), e.getValue()); + } + } + throw new ScribException(msg); } } protected SortedMap getSafetyErrors() // s.id key lighter than full SConfig { SortedMap res = new TreeMap<>(); - this.graph.states.entrySet().stream().forEach(x -> - res.put(x.getKey(), x.getValue().getErrors())); + for (int id : this.graph.states.keySet()) + { + SStateErrors errs = this.graph.states.get(id).getErrors(); + if (!errs.isEmpty()) + { + res.put(id, errs); + } + } return res; } // These are checked only on termsets (cf. safety checked on all), and "overlap" with safety errors within there // Could "skip" safety checks for termsets (probably better than coercing "progress" outside of termsets, as it would probably just amount to safety anyway) // CHECKME: factor out a TermSet class? - protected Map, Pair, Map>>> checkProgress() + protected Map, Pair, Map>>> + getProgressErrors() { - return this.graph.getTermSets().stream().collect(Collectors.toMap( - x -> x, - x -> new Pair<>(checkRoleProgress(x), checkEventualReception(x)) - )); + Map, Pair, Map>>> res + = new HashMap<>(); + for (Set termset: this.graph.getTermSets()) + { + Set starved = checkRoleProgress(termset); + Map> ignored = checkEventualReception(termset); + if (!starved.isEmpty() || !ignored.isEmpty()) + { + res.put(termset, new Pair<>(starved, ignored)); + } + } + return res; } // Could subsume terminal state check, if terminal sets included size 1 with reflexive reachability (but not a good approach) @@ -147,17 +169,17 @@ protected Map> checkEventualReception(Set termset) return ignored; } - // Cf. SStateErrors + // Cf. SStateErrors // TODO: refactor to Core, if not to its own class? protected String getProgressErrorMessages(Set termset, Pair, Map>> perrors) { String msg = ""; - if (!perrors.left.isEmpty()) + if (!perrors.left.isEmpty()) // starved { msg += "\nRole progress violation for " + perrors.left + " in session state terminal set:\n " + termSetToString(termset); } - if (!perrors.right.isEmpty()) + if (!perrors.right.isEmpty()) // ignored { msg += "\nEventual reception violation for " + perrors.right + " in session state terminal set:\n " + termSetToString(termset); @@ -167,10 +189,10 @@ protected String getProgressErrorMessages(Set termset, protected String termSetToString(Set termset) { - return /*this.core.config.args.get(CoreArgs.VERBOSE) + return this.core.config.args.get(CoreArgs.VERBOSE) ? termset.stream().map(x -> x.toString()) .collect(Collectors.joining(",")) - :*/ termset.stream().map(x -> Integer.toString(x.id)) + : termset.stream().map(x -> Integer.toString(x.id)) .collect(Collectors.joining(",")); } } From 82eaa44f66fd4c43d46385766d837e9ad9903b88 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 26 Apr 2019 12:17:57 +0100 Subject: [PATCH 392/539] [AllTest] Continued: refactoring core model classes. --- .../org/scribble/core/model/endpoint/EState.java | 9 ++++++--- .../core/model/global/SingleBuffers.java | 2 ++ .../core/model/visit/local/EStateVisitor.java | 8 ++++++++ scribble-test/src/test/scrib/tmp/Test.scr | 16 +++++++++------- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index 9e984d89a..96f24163b 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -337,12 +337,15 @@ public void traverse(EStateVisitor v) throws ScribException visitState(v); // "visitNode" // "visitChildren" - for (Iterator succs = this.succs.iterator(); succs.hasNext(); ) + Iterator as = this.actions.iterator(); + Iterator succs = this.succs.iterator(); + while (as.hasNext()) { + EAction a = as.next(); EState succ = succs.next(); - if (!v.hasSeen(succ)) + if (!v.hasSeen(succ)) // cf. EdgeVisitor { - succ.traverse(v); + succ.traverse(v.enter(this, a, succ)); } } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SingleBuffers.java b/scribble-core/src/main/java/org/scribble/core/model/global/SingleBuffers.java index 174a93461..17ff20fa8 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SingleBuffers.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SingleBuffers.java @@ -33,6 +33,8 @@ public class SingleBuffers { private final Map> connected = new HashMap<>(); // local -> peer -> does-local-consider-connected (symmetric) + // CHECKME: refactor as Map> ? cf. ConnectionChecker + private final Map> buffs = new HashMap<>(); // dest -> src -> msg -- N.B. connected.get(A).get(B) => can send into buffs.get(B).get(A) ("reversed") // N.B. hardcoded to capacity one -- SQueues would be the generalisation // null ESend for empty queue diff --git a/scribble-core/src/main/java/org/scribble/core/model/visit/local/EStateVisitor.java b/scribble-core/src/main/java/org/scribble/core/model/visit/local/EStateVisitor.java index edf5ce3bf..f07de361b 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/visit/local/EStateVisitor.java +++ b/scribble-core/src/main/java/org/scribble/core/model/visit/local/EStateVisitor.java @@ -23,6 +23,14 @@ public abstract class EStateVisitor extends StateVisitor { + + // Allows to visit branch succs with fresh visitors, but limited usefulness? because pattern doesn't support merge (but could do? e.g., by using EGraph to join visitors) + // CHECKME: take "self" generic param, use as return? or just override + public EStateVisitor enter(EState s, EAction a, EState succ) + { + return this; + } + public void visitAccept(EState s) throws ScribException { setSeen(s); diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 1d24f2712..c3c3ba503 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -89,6 +89,8 @@ module tmp.Test; // ...refactor -spin as an ext // add exp conn checks to model validation -- maybe just as estatevisitor? (cf. prev syntactic connection checks) + //HERE ^^^ + // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) // sort out full name expansion between disamb and translation -- fix modulecontextcollector for imported module member fullnames // refactor additional disamb syntactic checks into core? e.g., do-calls, distinct roledecls, protodecls, etc. @@ -113,7 +115,7 @@ module tmp.Test; data "..." from "..." as T; -//* +/* global protocol Proto1(role A, role B, role C, role D) { rec X @@ -736,7 +738,7 @@ global protocol Proto1(role A, role B) -/* +//* type "System.UInt32" from "..." as int; global protocol SH(role P, role R, role C) @@ -757,13 +759,13 @@ aux global protocol Loop(role P, role R, role C) { BothIn() from P to R; BothIn(int) from P to C; - //do Loop(P, R, C); + do Loop(P, R, C); } or { BothOut() from P to R; BothOut() from P to C; - //do Loop(P, R, C); + do Loop(P, R, C); } or { @@ -772,15 +774,15 @@ aux global protocol Loop(role P, role R, role C) choice at P { One(int) from P to C; - //do Loop(P, R, C); + do Loop(P, R, C); } or { Two(int, int) from P to C; - //do Loop(P, R, C); + do Loop(P, R, C); } } - do Loop(P, R, C); // FIXME: -spin fail if commented + //do Loop(P, R, C); // FIXME: -spin fail if commented } or { From 874c413f2eb770c843f934b5d48c02ede947fbef Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 26 Apr 2019 15:50:37 +0100 Subject: [PATCH 393/539] [AllTest] Continued: refactoring core model classes. --- .../main/java/org/scribble/core/job/Core.java | 12 ++ .../scribble/core/lang/global/GProtocol.java | 8 ++ .../model/visit/local/ConnectionChecker.java | 89 ++++++++++++ .../core/model/visit/local/EStateVisitor.java | 3 +- .../core/type/session/local/LAcc.java | 1 + .../core/type/session/local/LReq.java | 4 +- .../core/visit/global/ConnectionChecker.java | 135 ++++++++++++++++++ scribble-test/src/test/scrib/tmp/Test.scr | 35 ++++- 8 files changed, 283 insertions(+), 4 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/model/visit/local/ConnectionChecker.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/global/ConnectionChecker.java diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 699cac8c3..09b40f54e 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -226,6 +226,18 @@ protected void runGlobalSyntaxWfPasses() throws ScribException } inlined.checkExtChoiceConsistency(); } + + verbosePrintPass( + "Checking connectedness on all inlined globals..."); + for (GProtoName fullname : this.context.getParsedFullnames()) + { + GProtocol inlined = this.context.getInlined(fullname); + if (inlined.isAux()) + { + continue; + } + inlined.checkConnectedness(!inlined.isExplicit()); + } } // Pre: runGlobalSyntaxWfPasses diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 91584fc82..fc1b54200 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -55,6 +55,7 @@ import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.Substitutor; +import org.scribble.core.visit.global.ConnectionChecker; import org.scribble.core.visit.global.ExtChoiceConsistencyChecker; import org.scribble.core.visit.global.InlinedProjector; import org.scribble.core.visit.global.Projector; @@ -94,6 +95,13 @@ public void checkExtChoiceConsistency() throws ScribException ExtChoiceConsistencyChecker v = new ExtChoiceConsistencyChecker(rs); this.def.visitWith(v); } + + public void checkConnectedness(boolean implicit) throws ScribException + { + Set rs = this.roles.stream().collect(Collectors.toSet()); + ConnectionChecker v = new ConnectionChecker(rs, implicit); + this.def.visitWith(v); + } // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) public LProjection projectInlined(Core core, Role self) diff --git a/scribble-core/src/main/java/org/scribble/core/model/visit/local/ConnectionChecker.java b/scribble-core/src/main/java/org/scribble/core/model/visit/local/ConnectionChecker.java new file mode 100644 index 000000000..6146783a9 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/model/visit/local/ConnectionChecker.java @@ -0,0 +1,89 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.model.visit.local; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.scribble.core.model.endpoint.EState; +import org.scribble.core.model.endpoint.actions.EAction; +import org.scribble.core.type.name.Role; +import org.scribble.util.ScribException; + +// Not reusable +@Deprecated +public class ConnectionChecker extends EStateVisitor +{ + private static final int CONNECTED = 1; + private static final int UNCONNECTED = -1; + private static final int AMBIG = 0; + + private final Map conns; + + public ConnectionChecker(Set roles, Role self, boolean implicit) + { + this.conns = roles.stream().collect(Collectors.toMap( + x -> x, + x -> implicit ? CONNECTED : UNCONNECTED + )); + } + + protected ConnectionChecker(ConnectionChecker parent) + { + this.conns = new HashMap<>(parent.conns); + } + + @Override + public void visitAccept(EState s) throws ScribException + { + super.visitOutput(s); // Does setSeen + List as = s.getActions(); + Role peer = as.get(0).peer; // Pre: consistent ext choice subjs + if (this.conns.get(peer) != UNCONNECTED) + { + throw new ScribException(""); + } + } + + @Override + public void visitOutput(EState s) throws ScribException + { + super.visitOutput(s); // Does setSeen + } + + @Override + public void visitPolyInput(EState s) throws ScribException + { + super.visitOutput(s); // Does setSeen + } + + @Override + public void visitServerWrap(EState s) throws ScribException + { + super.visitOutput(s); // Does setSeen + } + + public void visitTerminal(EState s) throws ScribException + { + setSeen(s); + } + + public void visitUnaryInput(EState s) throws ScribException + { + setSeen(s); + } +} \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/model/visit/local/EStateVisitor.java b/scribble-core/src/main/java/org/scribble/core/model/visit/local/EStateVisitor.java index f07de361b..43aa8501d 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/visit/local/EStateVisitor.java +++ b/scribble-core/src/main/java/org/scribble/core/model/visit/local/EStateVisitor.java @@ -24,7 +24,8 @@ public abstract class EStateVisitor extends StateVisitor { - // Allows to visit branch succs with fresh visitors, but limited usefulness? because pattern doesn't support merge (but could do? e.g., by using EGraph to join visitors) + // Allows to visit branch succs with fresh visitors, but limited usefulness? because pattern doesn't support merge... + // (...but could try too? e.g., by using EGraph to join visitors? -- issue is recursion, may need to precompute/integrate traversal paths and join points, e.f., b/dfs) // CHECKME: take "self" generic param, use as return? or just override public EStateVisitor enter(EState s, EAction a, EState succ) { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java index 4e702c33e..40ccafb3e 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java @@ -19,6 +19,7 @@ import org.scribble.core.type.session.ConnectAction; import org.scribble.core.type.session.Msg; +// CHECKME: factor out LConnect? public class LAcc extends ConnectAction implements LType { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java index 116a7056e..fbd8e036f 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java @@ -19,8 +19,8 @@ import org.scribble.core.type.session.ConnectAction; import org.scribble.core.type.session.Msg; -public class LReq extends ConnectAction - implements LType +// CHECKME: factor out LConnect? +public class LReq extends ConnectAction implements LType { // this.src == Role.SELF diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/ConnectionChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/ConnectionChecker.java new file mode 100644 index 000000000..67f4fedc9 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/ConnectionChecker.java @@ -0,0 +1,135 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.visit.global; + +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.name.ProtoName; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.ConnectAction; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.DisconnectAction; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.global.GSeq; +import org.scribble.core.visit.STypeVisitor; +import org.scribble.util.ScribException; + +// Pre: use on inlined or later (unsupported for Do, also Protocol) +// CHECKME: connection check at global vs. local ? +public class ConnectionChecker extends STypeVisitor +{ + protected enum Status { CONN, DIS, AMBIG } + + public final Set roles; + public final boolean implicit; + + protected final Map, Status> conns; + + public ConnectionChecker(Set roles, boolean implicit) + { + this.roles = Collections.unmodifiableSet(roles); + this.implicit = implicit; + this.conns = roles.stream() + .flatMap(x -> roles.stream().filter(y -> !y.equals(x)) + .map(y -> Stream.of(x, y).collect(Collectors.toSet()))) + .distinct() + .collect( + Collectors.toMap(x -> x, x -> implicit ? Status.CONN : Status.DIS)); + } + + protected ConnectionChecker(ConnectionChecker v) + { + this.roles = v.roles; + this.implicit = v.implicit; + this.conns = new HashMap<>(v.conns); + } + + @Override + public SType visitChoice(Choice n) + throws ScribException + { + List, Status>> blocks = new LinkedList<>(); + for (GSeq block : n.blocks) + { + ConnectionChecker nested = new ConnectionChecker(this); + block.visitWith(nested); + blocks.add(nested.conns); + } + blocks.stream() + .reduce((x, y) -> x.keySet().stream() + .collect(Collectors.toMap(k -> k, + k -> x.get(k).equals(y.get(k)) ? x.get(k) : Status.AMBIG))) + .get().entrySet() + .forEach(x -> this.conns.put(x.getKey(), x.getValue())); + return n; // super would do reconstruct + } + + @Override + public SType visitDirectedInteraction( + DirectedInteraction n) throws ScribException + { + Set rs = Stream.of(n.src, n.dst).collect(Collectors.toSet()); + if (n instanceof ConnectAction) + { + switch (this.conns.get(rs)) + { + case AMBIG: throw new ScribException("Roles may already be connected: " + n); + case CONN: throw new ScribException("Roles already connected: " + n); + default: this.conns.put(rs, Status.CONN); + } + } + else + { + switch (this.conns.get(rs)) + { + case AMBIG: throw new ScribException("Roles may be disconnected: " + n); + case DIS: throw new ScribException("Roles disconnected: " + n); + default: + } + } + return super.visitDirectedInteraction(n); + } + + @Override + public SType visitDisconnect(DisconnectAction n) + throws ScribException + { + Set rs = Stream.of(n.left, n.right).collect(Collectors.toSet()); + switch (this.conns.get(rs)) + { + case AMBIG: throw new ScribException("Roles may already be disconnected: " + n); + case DIS: throw new ScribException("Roles already disconnected: " + n); + default: this.conns.put(rs, Status.DIS); + } + return super.visitDisconnect(n); + } + + @Override + public final > SType visitDo( + Do n) throws ScribException + { + throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); + } + +} diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index c3c3ba503..812e598d9 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -163,6 +163,39 @@ global protocol Proto1(role A, role B) //*/ +/* +global protocol Proto1(role A, role B, role C) +{ + choice at A + { + 1() from A to B; + } + or + { + 1() from A to C; // Same message OK + } + do Proto1(A, B, C); +} +/*/ +explicit global protocol Proto1(role A, role B, role C) +{ + choice at A + { + connect A to B; + 1() from A to B; + disconnect A and B; + } + or + { + connect A to C; + 1() from A to C; // Same message OK + disconnect A and C; + } + do Proto1(A, B, C); +} +//*/ + + /* explicit global protocol Proto1(role A, role B, role C) { @@ -738,7 +771,7 @@ global protocol Proto1(role A, role B) -//* +/* type "System.UInt32" from "..." as int; global protocol SH(role P, role R, role C) From aabb03680b09258dece5960a9756ed3b3ce2910e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 26 Apr 2019 16:06:56 +0100 Subject: [PATCH 394/539] [AllTest] Minor. --- scribble-core/src/main/java/org/scribble/core/job/Core.java | 4 +++- .../java/org/scribble/core/model/global/SStateErrors.java | 4 ++-- .../org/scribble/core/visit/global/ConnectionChecker.java | 2 +- scribble-test/src/test/scrib/tmp/Test.scr | 3 ++- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 09b40f54e..1e184400f 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -236,7 +236,9 @@ protected void runGlobalSyntaxWfPasses() throws ScribException { continue; } - inlined.checkConnectedness(!inlined.isExplicit()); + GTypeUnfolder v = new GTypeUnfolder(); // FIXME: record unfoldings in Context (factor out with role enabling) + //e.g., rec X { connect A to B; continue X; } + inlined.unfoldAllOnce(v).checkConnectedness(!inlined.isExplicit()); } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java b/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java index c825f49c5..be0c98456 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SStateErrors.java @@ -80,11 +80,11 @@ protected String appendErrors() } if (!this.waitFor.isEmpty()) { - res += "\n Wait-for this: " + this.waitFor; // Deadlock from input-blocked cycles, terminated dependencies, etc + res += "\n Wait-for cycles: " + this.waitFor; // Deadlock from input-blocked cycles -- not from terminated dependencies, cf. unfinished roles } if (!this.orphans.isEmpty()) { - res += "\n Orphan messages: " + this.orphans; // FIXME: add sender of orphan to error message + res += "\n Orphan messages: " + this.orphans; // TODO: add sender of orphan to error message } if (!this.unfinished.isEmpty()) { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/ConnectionChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/ConnectionChecker.java index 67f4fedc9..58d917d02 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/ConnectionChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/ConnectionChecker.java @@ -36,7 +36,7 @@ import org.scribble.util.ScribException; // Pre: use on inlined or later (unsupported for Do, also Protocol) -// CHECKME: connection check at global vs. local ? +// CHECKME: connection check at global vs. local level? public class ConnectionChecker extends STypeVisitor { protected enum Status { CONN, DIS, AMBIG } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 812e598d9..0a005adb2 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -176,7 +176,8 @@ global protocol Proto1(role A, role B, role C) } do Proto1(A, B, C); } -/*/ +//*/ +/* explicit global protocol Proto1(role A, role B, role C) { choice at A From 52f251c2bf4b08f82a5b419285f6c8a145037bd4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 26 Apr 2019 16:24:15 +0100 Subject: [PATCH 395/539] Removed deprecated state visitor based /ConnectionChecker. --- .../model/visit/local/ConnectionChecker.java | 89 ------------------- 1 file changed, 89 deletions(-) delete mode 100644 scribble-core/src/main/java/org/scribble/core/model/visit/local/ConnectionChecker.java diff --git a/scribble-core/src/main/java/org/scribble/core/model/visit/local/ConnectionChecker.java b/scribble-core/src/main/java/org/scribble/core/model/visit/local/ConnectionChecker.java deleted file mode 100644 index 6146783a9..000000000 --- a/scribble-core/src/main/java/org/scribble/core/model/visit/local/ConnectionChecker.java +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.core.model.visit.local; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import org.scribble.core.model.endpoint.EState; -import org.scribble.core.model.endpoint.actions.EAction; -import org.scribble.core.type.name.Role; -import org.scribble.util.ScribException; - -// Not reusable -@Deprecated -public class ConnectionChecker extends EStateVisitor -{ - private static final int CONNECTED = 1; - private static final int UNCONNECTED = -1; - private static final int AMBIG = 0; - - private final Map conns; - - public ConnectionChecker(Set roles, Role self, boolean implicit) - { - this.conns = roles.stream().collect(Collectors.toMap( - x -> x, - x -> implicit ? CONNECTED : UNCONNECTED - )); - } - - protected ConnectionChecker(ConnectionChecker parent) - { - this.conns = new HashMap<>(parent.conns); - } - - @Override - public void visitAccept(EState s) throws ScribException - { - super.visitOutput(s); // Does setSeen - List as = s.getActions(); - Role peer = as.get(0).peer; // Pre: consistent ext choice subjs - if (this.conns.get(peer) != UNCONNECTED) - { - throw new ScribException(""); - } - } - - @Override - public void visitOutput(EState s) throws ScribException - { - super.visitOutput(s); // Does setSeen - } - - @Override - public void visitPolyInput(EState s) throws ScribException - { - super.visitOutput(s); // Does setSeen - } - - @Override - public void visitServerWrap(EState s) throws ScribException - { - super.visitOutput(s); // Does setSeen - } - - public void visitTerminal(EState s) throws ScribException - { - setSeen(s); - } - - public void visitUnaryInput(EState s) throws ScribException - { - setSeen(s); - } -} \ No newline at end of file From d80b47bae7b8d931a594713331a7e8dc84eaf3a4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 26 Apr 2019 16:28:19 +0100 Subject: [PATCH 396/539] Minor. --- scribble-test/src/test/scrib/tmp/Test.scr | 24 +++++++++++------------ 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 0a005adb2..d3bf50106 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -74,12 +74,11 @@ module tmp.Test; //...remove Token args from af constructors -- removed, and re-added //refactor reconstructs to use af? -- refactored af and reconstruct to use addChildren1 -- FIXME //...fix simp node constructors and af (no IdNode child) --- fix ambignodel to use af -- separate af methods + // add exp conn checks to model validation, maybe just as estatevisitor? (cf. prev syntactic connection checks) -- now done as global syntax visitor // For model build/check refactoring: -// TODO: fix imed-projection choice subjects -- inlined-projection is a single proto with all roles - // Outstanding: // ...disallow/check for reserved __ -- do in gtype translation? // FIXME: qualifed sig name as non-role do-arg @@ -87,15 +86,12 @@ module tmp.Test; // CHECKME: duplicate proto mods // ...check ad hoc ScribNode constructions go through af properly // ...refactor -spin as an ext - - // add exp conn checks to model validation -- maybe just as estatevisitor? (cf. prev syntactic connection checks) - //HERE ^^^ - - // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) - // sort out full name expansion between disamb and translation -- fix modulecontextcollector for imported module member fullnames - // refactor additional disamb syntactic checks into core? e.g., do-calls, distinct roledecls, protodecls, etc. - // -- otoh, ast errors give source feedback -- maybe implement both + // TODO: fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles + +// parser/ast re-refactoring // use stypefactory in core -- also make visitorfactorys (both core and ast) + // check G/LType casts vs. SType (favour latter) + // refactor Set to Map // Job/codegen refactoring: // old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? @@ -104,9 +100,11 @@ module tmp.Test; // fix codegen when -fair // CHECKME: accept branching on messages (and safety properties) -- connection should not be established if message stuck? (cf. reception error) -- issue is implementation: what is a realistic semantics for sync-connect-branching (i.e., prevent client from async progressing after messaging) -- consider reversing client/server branching side? i.e. client requests, but then receives? (and consider serverside-branching a sugar?) -// parser/ast refactoring - // check G/LType casts vs. SType (favour latter) - // refactor Set to Map +// Later: + // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) + // sort out full name expansion between disamb and translation -- fix modulecontextcollector for imported module member fullnames + // refactor additional disamb syntactic checks into core? e.g., do-calls, distinct roledecls, protodecls, etc. + // -- otoh, ast errors give source feedback -- maybe implement both // Test refactoring: // refactor test to use main instead of cli From 63cc9006ab44c2a0a218827306fc4955e8462a9f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 27 Apr 2019 12:27:33 +0100 Subject: [PATCH 397/539] Dropped -spin (from master). --- .../main/java/org/scribble/cli/CLFlags.java | 3 - .../main/java/org/scribble/core/job/Core.java | 224 ++++++++++++++++-- .../scribble/core/lang/global/GProtocol.java | 224 ------------------ scribble-test/src/test/scrib/tmp/Test.scr | 7 +- 4 files changed, 208 insertions(+), 250 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java b/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java index 16132ae94..a9e26c4a6 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java @@ -42,7 +42,6 @@ public class CLFlags public static final String AUT_FLAG = "-aut"; public static final String NO_VALIDATION_FLAG = "-novalid"; public static final String INLINE_MAIN_MOD_FLAG = "-inline"; - public static final String SPIN_FLAG = "-spin"; // Non-unique flags public static final String PROJECT_FLAG = "-project"; @@ -113,8 +112,6 @@ protected Map getFlags() flags.put(NO_VALIDATION_FLAG, new CLFlag(NO_VALIDATION_FLAG, 0, true, false, false, "Duplicate flag: ")); - flags.put(SPIN_FLAG, - new CLFlag(SPIN_FLAG, 0, true, false, false, "Duplicate flag: ")); // These two are mutually exclusive flags.put(DOT_FLAG, diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 1e184400f..ba3ff5c03 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -289,25 +289,11 @@ protected void runGlobalModelCheckingPasses() throws ScribException { continue; } - if (this.config.args.get(CoreArgs.SPIN)) + validateByScribble(fullname, true); + if (!this.config.args.get(CoreArgs.FAIR)) { - if (this.config.args.get(CoreArgs.FAIR)) - { - throw new RuntimeException( - "[TODO]: -spin currently does not support fair ouput choices."); - } - //verbosePrintPass("Validating by Spin: " + fullname); - GProtocol.validateBySpin(this, fullname); - } - else - { - //verbosePrintPass("Validating by Scribble: " + fullname); - validateByScribble(fullname, true); - if (!this.config.args.get(CoreArgs.FAIR)) - { - //verbosePrintPass("Validating by Scribble with \"unfair\" output choices: " + fullname); - validateByScribble(fullname, false); // TODO: only need to check progress, not "full" validation - } + //verbosePrintPass("Validating by Scribble with \"unfair\" output choices: " + fullname); + validateByScribble(fullname, false); // TODO: only need to check progress, not "full" validation } } } @@ -467,4 +453,204 @@ public Map generateStateChannelApi(GProtocolName fullname, Role api.putAll(iogen.generateApi()); } return api; - }*/ \ No newline at end of file + } + //*/ + + /* // TODO FIXME: refactor following methods (e.g., non-static?) + public static void validateBySpin(Core core, GProtoName fullname) + throws ScribException + { + CoreContext corec = core.getContext(); + GProtocol gpd = corec.getInlined(fullname); + + List rs = gpd.roles.stream() + .sorted(Comparator.comparing(Role::toString)) + .collect(Collectors.toList()); + + Set> mids = gpd.def.//getMessageIds(); + gather(new MessageIdGatherer()::visit) + .collect(Collectors.toSet()); + + //..........FIXME: get mids from SType, instead of old AST Collector + + String pml = ""; + pml += "mtype {" + mids.stream().map(mid -> mid.toString()) + .collect(Collectors.joining(", ")) + "};\n"; + + // TODO CHECKME: explicit ? + + pml += "\n"; + List pairs = new LinkedList<>(); + for (Role r1 : rs) + { + for (Role r2 : rs) + { + if (!r1.equals(r2)) + { + pairs.add(new Role[] {r1, r2}); + } + } + } + //for (Role[] p : (Iterable) () -> pairs.stream().sorted().iterator()) + for (Role[] p : pairs) + { + pml += "chan s_" + p[0] + "_" + p[1] + " = [1] of { mtype };\n" + + "chan r_" + p[0] + "_" + p[1] + " = [1] of { mtype };\n" + + "bool empty_" + p[0] + "_" + p[1] + " = true;\n" + + "active proctype chan_" + p[0] + "_" + p[1] + "() {\n" + + "mtype m;\n" + + "end_chan_" + p[0] + "_" + p[1] + ":\n" + + "do\n" + + "::\n" + + "atomic { s_" + p[0] + "_" + p[1] + "?m; empty_" + p[0] + "_" + p[1] + + " = false }\n" + + "atomic { r_" + p[0] + "_" + p[1] + "!m; empty_" + p[0] + "_" + p[1] + + " = true }\n" + + "od\n" + + "}\n"; + } + + for (Role r : rs) + { + pml += "\n\n" + corec.getEGraph(fullname, r).toPml(r); + } + if (core.config.args.get(CoreArgs.VERBOSE)) + { + System.out.println("[-spin]: Promela processes\n" + pml + "\n"); + } + + List clauses = new LinkedList<>(); + for (Role r : rs) + { + Set tmp = new HashSet<>(); + EGraph g = corec.getEGraph(fullname, r); + tmp.add(g.init); + tmp.addAll(g.init.getReachableStates()); + if (g.term != null) + { + tmp.remove(g.term); + } + tmp.forEach( // Throws exception, cannot use flatMap + s -> clauses.add("!<>[]" + r + "@label" + r + s.id) // FIXME: factor out + ); + } + // * / + /*String roleProgress = ""; // This way is not faster + for (Role r : rs) + { + Set tmp = new HashSet<>(); + EGraph g = jc.getEGraph(fullname, r); + tmp.add(g.init); + tmp.addAll(MState.getReachableStates(g.init)); + if (g.term != null) + { + tmp.remove(g.term); + } + roleProgress += (((roleProgress.isEmpty()) ? "" : " || ") + + tmp.stream().map(s -> r + "@label" + r + s.id).collect(Collectors.joining(" || "))); + } + roleProgress = "!<>[](" + roleProgress + ")"; + clauses.add(roleProgress);* / + String eventualStability = ""; + for (Role[] p : pairs) + { + //eventualStability += (((eventualStability.isEmpty()) ? "" : " && ") + "empty_" + p[0] + "_" + p[1]); + eventualStability += (((eventualStability.isEmpty()) ? "" : " && ") + "<>empty_" + p[0] + "_" + p[1]); + } + //eventualStability = "[]<>(" + eventualStability + ")"; + eventualStability = "[](" + eventualStability + ")"; // FIXME: current "eventual reception", not eventual stability + clauses.add(eventualStability); + + //int batchSize = 10; // FIXME: factor out + int batchSize = 6; // FIXME: factor out // FIXME: dynamic batch sizing based on previous batch duration? + for (int i = 0; i < clauses.size(); ) + { + int j = (i+batchSize < clauses.size()) ? i+batchSize : clauses.size(); + String batch = clauses.subList(i, j).stream().collect(Collectors.joining(" && ")); + String ltl = "ltl {\n" + batch + "\n" + "}"; + if (core.config.args.get(CoreArgs.VERBOSE)) + { + System.out.println("[-spin] Batched ltl:\n" + ltl + "\n"); + } + if (!GProtocol.runSpin(fullname.toString(), pml + "\n\n" + ltl)) + { + throw new ScribException("Protocol not valid:\n" + gpd); + } + i += batchSize; + } + } + + public static boolean runSpin(String prefix, String pml) //throws ScribbleException + { + File tmp; + try + { + tmp = File.createTempFile(prefix, ".pml.tmp"); + try + { + String tmpName = tmp.getAbsolutePath(); + ScribUtil.writeToFile(tmpName, pml); + String[] res = ScribUtil.runProcess("spin", "-a", tmpName); + res[0] = res[0].replaceAll("(?m)^ltl.*$", ""); + res[1] = res[1].replace( + "'gcc-4' is not recognized as an internal or external command,\noperable program or batch file.", + ""); + res[1] = res[1].replace( + "'gcc-3' is not recognized as an internal or external command,\noperable program or batch file.", + ""); + res[0] = res[0].trim(); + res[1] = res[1].trim(); + if (!res[0].trim().isEmpty() || !res[1].trim().isEmpty()) + { + //throw new RuntimeException("[scrib] : " + Arrays.toString(res[0].getBytes()) + "\n" + Arrays.toString(res[1].getBytes())); + throw new RuntimeException("[-spin] [spin]: " + res[0] + "\n" + res[1]); + } + int procs = 0; + for (int i = 0; i < pml.length(); procs++) + { + i = pml.indexOf("proctype", i); + if (i == -1) + { + break; + } + i++; + } + int dnfair = (procs <= 6) ? 2 : 3; // FIXME + res = ScribUtil.runProcess("gcc", "-o", "pan", "pan.c", "-DNFAIR=" + dnfair); + res[0] = res[0].trim(); + res[1] = res[1].trim(); + if (!res[0].isEmpty() || !res[1].isEmpty()) + { + throw new RuntimeException("[-spin] [gcc]: " + res[0] + "\n" + res[1]); + } + res = ScribUtil.runProcess("pan", "-a", "-f"); + res[1] = res[1].replace("warning: no accept labels are defined, so option -a has no effect (ignored)", ""); + res[0] = res[0].trim(); + res[1] = res[1].trim(); + if (res[0].contains("error,") || !res[1].isEmpty()) + { + throw new RuntimeException("[-spin] [pan]: " + res[0] + "\n" + res[1]); + } + int err = res[0].indexOf("errors: "); + boolean valid = (res[0].charAt(err + 8) == '0'); + if (!valid) + { + System.err.println("[-spin] [pan] " + res[0] + "\n" + res[1]); + } + return valid; + } + catch (ScribException e) + { + throw new RuntimeException(e); + } + finally + { + tmp.delete(); + } + } + catch (IOException e) + { + throw new RuntimeException(e); + } + } + //*/ \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index fc1b54200..a66cb1efe 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -13,10 +13,6 @@ */ package org.scribble.core.lang.global; -import java.io.File; -import java.io.IOException; -import java.util.Comparator; -import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -26,14 +22,10 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.job.Core; -import org.scribble.core.job.CoreArgs; -import org.scribble.core.job.CoreContext; import org.scribble.core.lang.Protocol; import org.scribble.core.lang.ProtocolMod; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.local.LProjection; -import org.scribble.core.model.endpoint.EGraph; -import org.scribble.core.model.endpoint.EState; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; @@ -41,7 +33,6 @@ import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.SigName; @@ -49,7 +40,6 @@ import org.scribble.core.type.session.global.GRecursion; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.local.LSeq; -import org.scribble.core.visit.MessageIdGatherer; import org.scribble.core.visit.RecPruner; import org.scribble.core.visit.RoleGatherer; import org.scribble.core.visit.STypeInliner; @@ -62,7 +52,6 @@ import org.scribble.core.visit.global.RoleEnablingChecker; import org.scribble.core.visit.local.InlinedExtChoiceSubjFixer; import org.scribble.util.ScribException; -import org.scribble.util.ScribUtil; public class GProtocol extends Protocol implements GNode // Mainly for GDel.translate return (to include GProtocol) @@ -224,217 +213,4 @@ public boolean canEquals(Object o) { return o instanceof GProtocol; } - - - - // TODO FIXME: refactor following methods (e.g., non-static?) - public static void validateBySpin(Core core, GProtoName fullname) - throws ScribException - { - CoreContext corec = core.getContext(); - /*Module mod = jc.getModule(fullname.getPrefix()); - GProtocolDecl gpd = (GProtocolDecl) mod - .getProtocolDeclChild(fullname.getSimpleName());*/ - GProtocol gpd = corec.getInlined(fullname); - - List rs = //gpd.getHeaderChild().getRoleDeclListChild().getRoles() - gpd.roles - .stream().sorted(Comparator.comparing(Role::toString)) - .collect(Collectors.toList()); - - /*MessageIdCollector coll = new MessageIdCollector(job, - ((ModuleDel) mod.del()).getModuleContext()); // TODO: get ModuleContext from Job(Context) - gpd.accept(coll); - Set> mids = coll.getNames();*/ - Set> mids = gpd.def.//getMessageIds(); - gather(new MessageIdGatherer()::visit) - .collect(Collectors.toSet()); - - //..........FIXME: get mids from SType, instead of old AST Collector - - String pml = ""; - pml += "mtype {" + mids.stream().map(mid -> mid.toString()) - .collect(Collectors.joining(", ")) + "};\n"; - - // TODO CHECKME: explicit ? - - pml += "\n"; - List pairs = new LinkedList<>(); - for (Role r1 : rs) - { - for (Role r2 : rs) - { - if (!r1.equals(r2)) - { - pairs.add(new Role[] {r1, r2}); - } - } - } - //for (Role[] p : (Iterable) () -> pairs.stream().sorted().iterator()) - for (Role[] p : pairs) - { - pml += "chan s_" + p[0] + "_" + p[1] + " = [1] of { mtype };\n" - + "chan r_" + p[0] + "_" + p[1] + " = [1] of { mtype };\n" - + "bool empty_" + p[0] + "_" + p[1] + " = true;\n" - + "active proctype chan_" + p[0] + "_" + p[1] + "() {\n" - + "mtype m;\n" - + "end_chan_" + p[0] + "_" + p[1] + ":\n" - + "do\n" - + "::\n" - + "atomic { s_" + p[0] + "_" + p[1] + "?m; empty_" + p[0] + "_" + p[1] - + " = false }\n" - + "atomic { r_" + p[0] + "_" + p[1] + "!m; empty_" + p[0] + "_" + p[1] - + " = true }\n" - + "od\n" - + "}\n"; - } - - for (Role r : rs) - { - pml += "\n\n" + corec.getEGraph(fullname, r).toPml(r); - } - if (core.config.args.get(CoreArgs.VERBOSE)) - { - System.out.println("[-spin]: Promela processes\n" + pml + "\n"); - } - - List clauses = new LinkedList<>(); - for (Role r : rs) - { - Set tmp = new HashSet<>(); - EGraph g = corec.getEGraph(fullname, r); - tmp.add(g.init); - tmp.addAll(g.init.getReachableStates()); - if (g.term != null) - { - tmp.remove(g.term); - } - tmp.forEach( // Throws exception, cannot use flatMap - s -> clauses.add("!<>[]" + r + "@label" + r + s.id) // FIXME: factor out - ); - } - //*/ - /*String roleProgress = ""; // This way is not faster - for (Role r : rs) - { - Set tmp = new HashSet<>(); - EGraph g = jc.getEGraph(fullname, r); - tmp.add(g.init); - tmp.addAll(MState.getReachableStates(g.init)); - if (g.term != null) - { - tmp.remove(g.term); - } - roleProgress += (((roleProgress.isEmpty()) ? "" : " || ") - + tmp.stream().map(s -> r + "@label" + r + s.id).collect(Collectors.joining(" || "))); - } - roleProgress = "!<>[](" + roleProgress + ")"; - clauses.add(roleProgress);*/ - /*for (Role[] p : pairs) - { - clauses.add("[]<>(empty_" + p[0] + "_" + p[1] + ")"); - }*/ - String eventualStability = ""; - for (Role[] p : pairs) - { - //eventualStability += (((eventualStability.isEmpty()) ? "" : " && ") + "empty_" + p[0] + "_" + p[1]); - eventualStability += (((eventualStability.isEmpty()) ? "" : " && ") + "<>empty_" + p[0] + "_" + p[1]); - } - //eventualStability = "[]<>(" + eventualStability + ")"; - eventualStability = "[](" + eventualStability + ")"; // FIXME: current "eventual reception", not eventual stability - clauses.add(eventualStability); - - //int batchSize = 10; // FIXME: factor out - int batchSize = 6; // FIXME: factor out // FIXME: dynamic batch sizing based on previous batch duration? - for (int i = 0; i < clauses.size(); ) - { - int j = (i+batchSize < clauses.size()) ? i+batchSize : clauses.size(); - String batch = clauses.subList(i, j).stream().collect(Collectors.joining(" && ")); - String ltl = "ltl {\n" + batch + "\n" + "}"; - if (core.config.args.get(CoreArgs.VERBOSE)) - { - System.out.println("[-spin] Batched ltl:\n" + ltl + "\n"); - } - if (!GProtocol.runSpin(fullname.toString(), pml + "\n\n" + ltl)) - { - throw new ScribException("Protocol not valid:\n" + gpd); - } - i += batchSize; - } - } - - // FIXME: relocate - public static boolean runSpin(String prefix, String pml) //throws ScribbleException - { - File tmp; - try - { - tmp = File.createTempFile(prefix, ".pml.tmp"); - try - { - String tmpName = tmp.getAbsolutePath(); - ScribUtil.writeToFile(tmpName, pml); - String[] res = ScribUtil.runProcess("spin", "-a", tmpName); - res[0] = res[0].replaceAll("(?m)^ltl.*$", ""); - res[1] = res[1].replace( - "'gcc-4' is not recognized as an internal or external command,\noperable program or batch file.", - ""); - res[1] = res[1].replace( - "'gcc-3' is not recognized as an internal or external command,\noperable program or batch file.", - ""); - res[0] = res[0].trim(); - res[1] = res[1].trim(); - if (!res[0].trim().isEmpty() || !res[1].trim().isEmpty()) - { - //throw new RuntimeException("[scrib] : " + Arrays.toString(res[0].getBytes()) + "\n" + Arrays.toString(res[1].getBytes())); - throw new RuntimeException("[-spin] [spin]: " + res[0] + "\n" + res[1]); - } - int procs = 0; - for (int i = 0; i < pml.length(); procs++) - { - i = pml.indexOf("proctype", i); - if (i == -1) - { - break; - } - i++; - } - int dnfair = (procs <= 6) ? 2 : 3; // FIXME - res = ScribUtil.runProcess("gcc", "-o", "pan", "pan.c", "-DNFAIR=" + dnfair); - res[0] = res[0].trim(); - res[1] = res[1].trim(); - if (!res[0].isEmpty() || !res[1].isEmpty()) - { - throw new RuntimeException("[-spin] [gcc]: " + res[0] + "\n" + res[1]); - } - res = ScribUtil.runProcess("pan", "-a", "-f"); - res[1] = res[1].replace("warning: no accept labels are defined, so option -a has no effect (ignored)", ""); - res[0] = res[0].trim(); - res[1] = res[1].trim(); - if (res[0].contains("error,") || !res[1].isEmpty()) - { - throw new RuntimeException("[-spin] [pan]: " + res[0] + "\n" + res[1]); - } - int err = res[0].indexOf("errors: "); - boolean valid = (res[0].charAt(err + 8) == '0'); - if (!valid) - { - System.err.println("[-spin] [pan] " + res[0] + "\n" + res[1]); - } - return valid; - } - catch (ScribException e) - { - throw new RuntimeException(e); - } - finally - { - tmp.delete(); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index d3bf50106..d5fc68a44 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -74,24 +74,23 @@ module tmp.Test; //...remove Token args from af constructors -- removed, and re-added //refactor reconstructs to use af? -- refactored af and reconstruct to use addChildren1 -- FIXME //...fix simp node constructors and af (no IdNode child) --- fix ambignodel to use af -- separate af methods +// done: For model build/check refactoring: // add exp conn checks to model validation, maybe just as estatevisitor? (cf. prev syntactic connection checks) -- now done as global syntax visitor - -// For model build/check refactoring: - // Outstanding: // ...disallow/check for reserved __ -- do in gtype translation? // FIXME: qualifed sig name as non-role do-arg // TODO: rename addChildren1 // CHECKME: duplicate proto mods // ...check ad hoc ScribNode constructions go through af properly - // ...refactor -spin as an ext + // ...refactor -spin as an ext -- drop -spin from master // TODO: fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles // parser/ast re-refactoring // use stypefactory in core -- also make visitorfactorys (both core and ast) // check G/LType casts vs. SType (favour latter) // refactor Set to Map + // Job Module projection // Job/codegen refactoring: // old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? From 7199e2c752e3c810ad6bd50f34a7e40eae6664ab Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 27 Apr 2019 12:43:44 +0100 Subject: [PATCH 398/539] Minor. --- scribble-ast/src/main/java/org/scribble/job/JobConfig.java | 3 +-- scribble-cli/src/main/java/org/scribble/cli/CommandLine.java | 5 ++--- scribble-core/src/main/java/org/scribble/core/job/Core.java | 1 + 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/job/JobConfig.java b/scribble-ast/src/main/java/org/scribble/job/JobConfig.java index 9f328d483..5e831afa4 100644 --- a/scribble-ast/src/main/java/org/scribble/job/JobConfig.java +++ b/scribble-ast/src/main/java/org/scribble/job/JobConfig.java @@ -26,8 +26,7 @@ public class JobConfig { public final ModuleName main; // Full name - public final Map args; - // CHECKME: verbose/debug printing parameter? + public final Map args; // CHECKME: Set ? public final AstFactory af; public final DelFactory df; diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 5a28464a1..71080865c 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -104,7 +104,7 @@ protected CLArgParser newCLArgParser(CLFlags flags, String[] args) // A Scribble extension should override as appropriate protected Main newMain() throws ScribParserException, ScribException { - Map args = Collections.unmodifiableMap(parseJobArgs()); + Map args = Collections.unmodifiableMap(parseCoreArgs()); if (hasFlag(CLFlags.INLINE_MAIN_MOD_FLAG)) { String inline = getUniqueFlagArgs(CLFlags.INLINE_MAIN_MOD_FLAG)[0]; @@ -124,7 +124,7 @@ protected Main newMain() throws ScribParserException, ScribException } // A Scribble extension should override as appropriate - protected Map parseJobArgs() + protected Map parseCoreArgs() { Map args = new HashMap<>(); args.put(CoreArgs.VERBOSE, hasFlag(CLFlags.VERBOSE_FLAG)); @@ -137,7 +137,6 @@ protected Map parseJobArgs() args.put(CoreArgs.NO_ACC_CORRELATION_CHECK, hasFlag(CLFlags.NO_ACCEPT_CORRELATION_CHECK_FLAG)); args.put(CoreArgs.NO_VALIDATION, hasFlag(CLFlags.NO_VALIDATION_FLAG)); - args.put(CoreArgs.SPIN, hasFlag(CLFlags.SPIN_FLAG)); return args; } diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index ba3ff5c03..5c876c42c 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -580,6 +580,7 @@ public static void validateBySpin(Core core, GProtoName fullname) } } + // TODO:: relocate (also Context.runAut) public static boolean runSpin(String prefix, String pml) //throws ScribbleException { File tmp; From 4e9504e79c7f406935b63c50370c78aaa05d0544 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 27 Apr 2019 13:31:25 +0100 Subject: [PATCH 399/539] Minor. --- scribble-test/src/test/scrib/tmp/Test.scr | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index d5fc68a44..e5032bb76 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -76,6 +76,7 @@ module tmp.Test; //...fix simp node constructors and af (no IdNode child) --- fix ambignodel to use af -- separate af methods // done: For model build/check refactoring: // add exp conn checks to model validation, maybe just as estatevisitor? (cf. prev syntactic connection checks) -- now done as global syntax visitor + // ...refactor -spin as an ext -- dropped -spin from master // Outstanding: // ...disallow/check for reserved __ -- do in gtype translation? @@ -83,17 +84,16 @@ module tmp.Test; // TODO: rename addChildren1 // CHECKME: duplicate proto mods // ...check ad hoc ScribNode constructions go through af properly - // ...refactor -spin as an ext -- drop -spin from master - // TODO: fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles // parser/ast re-refactoring // use stypefactory in core -- also make visitorfactorys (both core and ast) // check G/LType casts vs. SType (favour latter) - // refactor Set to Map + // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) // Job Module projection + // TODO: fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles + // old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? // Job/codegen refactoring: - // old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? // also do-arg pruning, for role-pruned projection decls // choice-specific fairness annotations // fix codegen when -fair From 4ef268abfba2ef926602982bacb40238a5441a94 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 27 Apr 2019 14:04:46 +0100 Subject: [PATCH 400/539] Factored out GTypeFactory. --- .../org/scribble/del/global/GChoiceDel.java | 3 +- .../org/scribble/del/global/GConnectDel.java | 2 +- .../org/scribble/del/global/GContinueDel.java | 2 +- .../scribble/del/global/GDisconnectDel.java | 2 +- .../java/org/scribble/del/global/GDoDel.java | 3 +- .../del/global/GInteractionSeqDel.java | 2 +- .../del/global/GMessageTransferDel.java | 3 +- .../scribble/del/global/GRecursionDel.java | 2 +- .../src/main/java/org/scribble/job/Job.java | 7 +- .../org/scribble/visit/GTypeTranslator.java | 6 +- .../main/java/org/scribble/core/job/Core.java | 12 ++-- .../org/scribble/core/job/CoreConfig.java | 8 ++- .../scribble/core/lang/global/GProtocol.java | 5 +- .../core/type/session/STypeFactory.java | 18 ++--- .../core/type/session/global/GChoice.java | 2 +- .../core/type/session/global/GConnect.java | 2 +- .../core/type/session/global/GContinue.java | 3 +- .../core/type/session/global/GDisconnect.java | 2 +- .../core/type/session/global/GDo.java | 2 +- .../type/session/global/GMessageTransfer.java | 2 +- .../core/type/session/global/GRecursion.java | 3 +- .../core/type/session/global/GSeq.java | 3 +- .../type/session/global/GTypeFactory.java | 36 ++++++++++ .../type/session/global/GTypeFactoryImpl.java | 67 +++++++++++++++++++ .../scribble/core/visit/STypeUnfolder.java | 8 +++ .../core/visit/global/GTypeInliner.java | 6 +- .../core/visit/global/GTypeUnfolder.java | 11 ++- .../core/visit/local/LTypeUnfolder.java | 7 ++ scribble-test/src/test/scrib/tmp/Test.scr | 3 + 29 files changed, 185 insertions(+), 47 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactory.java create mode 100644 scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactoryImpl.java diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java index 6e0b124ca..428441a16 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -39,7 +39,6 @@ public org.scribble.core.type.session.global.GChoice translate(ScribNode n, { blocks.add((GSeq) b.visitWith(t)); } - return new org.scribble.core.type.session.global.GChoice(source, subj, - blocks); + return t.tf.global.GChoice(source, subj, blocks); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java index ef53ccc76..182b201f6 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java @@ -54,6 +54,6 @@ public org.scribble.core.type.session.global.GConnect translate(ScribNode n, } Role dst = ds.get(0).toName(); Msg msg = source.getMessageNodeChild().toMsg(); - return new org.scribble.core.type.session.global.GConnect(source, src, msg, dst); + return t.tf.global.GConnect(source, src, msg, dst); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java index ecc3311b7..09fbe6ad7 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java @@ -30,6 +30,6 @@ public org.scribble.core.type.session.global.GContinue translate(ScribNode n, { GContinue source = (GContinue) n; RecVar recvar = source.getRecVarChild().toName(); - return new org.scribble.core.type.session.global.GContinue(source, recvar); + return t.tf.global.GContinue(source, recvar); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java index b881eec27..3674f7cab 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java @@ -45,6 +45,6 @@ public org.scribble.core.type.session.global.GDisconnect translate(ScribNode n, GDisconnect source = (GDisconnect) n; Role left = source.getLeftChild().toName(); Role right = source.getRightChild().toName(); - return new org.scribble.core.type.session.global.GDisconnect(source, left, right); + return t.tf.global.GDisconnect(source, left, right); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java index 57abc193f..c4df71df8 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java @@ -47,7 +47,6 @@ public org.scribble.core.type.session.global.GDo translate(ScribNode n, List roles = source.getRoleListChild().getRoles(); List> params = source.getNonRoleListChild() .getParamKindArgs(); - return new org.scribble.core.type.session.global.GDo(source, fullname, - roles, params); + return t.tf.global.GDo(source, fullname, roles, params); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java index 9ef40c8b9..f039395f9 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java @@ -38,6 +38,6 @@ public GSeq translate(ScribNode n, GTypeTranslator t) { elems.add((GType) c.visitWith(t)); // throws ScribbleException } - return new GSeq(source, elems); + return t.tf.global.GSeq(source, elems); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java index bc9cba3e6..59aed3582 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -62,7 +62,6 @@ public org.scribble.core.type.session.global.GMessageTransfer translate(ScribNod } Role dst = ds.get(0).toName(); Msg msg = source.getMessageNodeChild().toMsg(); - return new org.scribble.core.type.session.global.GMessageTransfer(source, - src, msg, dst); + return t.tf.global.GMessageTransfer(source, src, msg, dst); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java index 4cd094450..8eb4c008f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java @@ -32,6 +32,6 @@ public org.scribble.core.type.session.global.GRecursion translate(ScribNode n, GRecursion source = (GRecursion) n; RecVar recvar = source.getRecVarChild().toName(); GSeq block = (GSeq) source.getBlockChild().visitWith(t); - return new org.scribble.core.type.session.global.GRecursion(source, recvar, block); + return t.tf.global.GRecursion(source, recvar, block); } } diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 8ea535efc..01f00a045 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -24,6 +24,8 @@ import org.scribble.core.job.CoreArgs; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.session.STypeFactory; +import org.scribble.core.type.session.global.GTypeFactoryImpl; import org.scribble.del.DelFactory; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -66,10 +68,11 @@ protected JobContext newJobContext(Job job, } // A Scribble extension should override newJobConfig/Context/Translator and toJob as appropriate - // CHECKME: STypeTranslator, for future locals + // CHECKME: factor out STypeTranslator, for future local parsing protected GTypeTranslator newGTypeTranslator(ModuleName rootFullname) { - return new GTypeTranslator(this, rootFullname); + STypeFactory tf = new STypeFactory(new GTypeFactoryImpl()); // TODO: factor out factory + return new GTypeTranslator(this, rootFullname, tf); } // A Scribble extension should override newJobConfig/Context/Translator and toJob as appropriate diff --git a/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java index c5559111a..d857ce831 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java @@ -16,6 +16,7 @@ import org.scribble.ast.ScribNode; import org.scribble.core.lang.global.GNode; import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.session.STypeFactory; import org.scribble.del.global.GDel; import org.scribble.job.Job; import org.scribble.util.ScribException; @@ -23,9 +24,12 @@ // CHECKME: move to visit package? public class GTypeTranslator extends SimpleAstVisitor { - public GTypeTranslator(Job job, ModuleName rootFullname) + public final STypeFactory tf; + + public GTypeTranslator(Job job, ModuleName rootFullname, STypeFactory tf) { super(job, rootFullname); + this.tf = tf; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 5c876c42c..a2403622c 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -36,7 +36,9 @@ import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.STypeFactory; import org.scribble.core.type.session.global.GSeq; +import org.scribble.core.type.session.global.GTypeFactoryImpl; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.visit.NonProtoDepsGatherer; import org.scribble.core.visit.ProtoDepsCollector; @@ -64,8 +66,10 @@ public Core(ModuleName mainFullname, Map args, protected CoreConfig newCoreConfig(ModuleName mainFullname, Map args) { + // TODO: factor out factory methods + STypeFactory tf = new STypeFactory(new GTypeFactoryImpl()); ModelFactory mf = new ModelFactoryImpl(); - return new CoreConfig(mainFullname, args, mf); + return new CoreConfig(mainFullname, args, tf, mf); // CHECKME: combine E/SModelFactory? } @@ -105,7 +109,7 @@ protected void runSyntaxTransformPasses() // No ScribException, no errors expec { // TODO: currently, unfolded not actually stored by Context -- unfoldAllOnce repeated manually when needed, e.g., runSyntaxWfPasses GProtocol inlined = this.context.getInlined(fullname); - GTypeUnfolder v = new GTypeUnfolder(); + GTypeUnfolder v = new GTypeUnfolder(this); GProtocol unf = (GProtocol) inlined.unfoldAllOnce(v);//.unfoldAllOnce(unf2); // CHECKME: twice unfolding? instead of "unguarded"-unfolding? verbosePrintPass( "Unfolded all recursions once: " + inlined.fullname + "\n" + unf); @@ -209,7 +213,7 @@ protected void runGlobalSyntaxWfPasses() throws ScribException { continue; } - GTypeUnfolder v = new GTypeUnfolder(); + GTypeUnfolder v = new GTypeUnfolder(this); //e.g., C->D captured under an A->B choice after unfolding, cf. bad.wfchoice.enabling.twoparty.Test01b; inlined.unfoldAllOnce(v).checkRoleEnabling(); // TODO: get unfolded from Context @@ -236,7 +240,7 @@ protected void runGlobalSyntaxWfPasses() throws ScribException { continue; } - GTypeUnfolder v = new GTypeUnfolder(); // FIXME: record unfoldings in Context (factor out with role enabling) + GTypeUnfolder v = new GTypeUnfolder(this); // FIXME: record unfoldings in Context (factor out with role enabling) //e.g., rec X { connect A to B; continue X; } inlined.unfoldAllOnce(v).checkConnectedness(!inlined.isExplicit()); } diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreConfig.java b/scribble-core/src/main/java/org/scribble/core/job/CoreConfig.java index 105560ba3..b69cfb2a6 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreConfig.java @@ -18,20 +18,24 @@ import org.scribble.core.model.ModelFactory; import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.session.STypeFactory; // The "static" (constant) info for Jobs -- cf. JobContext "dynamic" state public class CoreConfig { public final ModuleName main; // Full name public final Map args; // CHECKME: verbose/debug printing parameter ? + + public final STypeFactory tf; public final ModelFactory mf; // N.B. MainContext is in a different non-visible (by Maven) package public CoreConfig(ModuleName main, Map args, - ModelFactory ef) + STypeFactory tf, ModelFactory mf) { this.main = main; this.args = Collections.unmodifiableMap(args); - this.mf = ef; + this.tf = tf; + this.mf = mf; } } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index a66cb1efe..a2849c682 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -160,8 +160,9 @@ else if (n instanceof SigName) .visitWithNoThrow(new RecPruner<>());*/ GSeq inlined = v.visitSeq(subs.visitSeq(this.def)); RecVar rv = v.getInlinedRecVar(sig); - GRecursion rec = new GRecursion(null, rv, inlined); // CHECKME: or protodecl source? - GSeq seq = new GSeq(null, Stream.of(rec).collect(Collectors.toList())); + GRecursion rec = v.core.config.tf.global.GRecursion(null, rv, inlined); // CHECKME: or protodecl source? + GSeq seq = v.core.config.tf.global.GSeq(null, + Stream.of(rec).collect(Collectors.toList())); GSeq def = new RecPruner().visitSeq(seq); Set used = def.gather(new RoleGatherer()::visit) .collect(Collectors.toSet()); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java b/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java index 0e4180dff..863a3e2bc 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java @@ -18,13 +18,20 @@ import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.PackageName; +import org.scribble.core.type.session.global.GTypeFactory; public class STypeFactory { - public STypeFactory() - { + public final GTypeFactory global; + public STypeFactory(GTypeFactory global) + { + this.global = global; } + + + + /*public static ModuleName parseModuleName(String name) { @@ -34,6 +41,7 @@ public STypeFactory() // Currently used by generated Session API // From fullname + @Deprecated public static GProtoName parseGlobalProtocolName(String name) { String[] elems = name.split("\\."); @@ -51,10 +59,4 @@ public static GProtoName parseGlobalProtocolName(String name) GProtoName gpn = new GProtoName(membname); return new GProtoName(modname, gpn); } - - /*public static Scope parseScope(String name) - { - String[] elems = name.split("\\."); - return new Scope(elems); - }*/ } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java index cebce53c8..4a0849002 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GChoice.java @@ -22,7 +22,7 @@ public class GChoice extends Choice implements GType { - public GChoice(CommonTree source, Role subj, + protected GChoice(CommonTree source, Role subj, List blocks) { super(source, subj, blocks); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java index cd706cb5a..d5540ba95 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java @@ -23,7 +23,7 @@ public class GConnect extends ConnectAction implements GType { - public GConnect(CommonTree source, // DirectedInteraction not ideal (imprecise) + protected GConnect(CommonTree source, // DirectedInteraction not ideal (imprecise) Role src, Msg msg, Role dst) { super(source, msg, src, dst); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java index 374782674..4d2a904e4 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GContinue.java @@ -20,8 +20,7 @@ public class GContinue extends Continue implements GType { - public GContinue(//org.scribble.ast.Continue source, - CommonTree source, // Due to inlining, do -> continue + protected GContinue(CommonTree source, // Due to inlining, do -> continue RecVar recvar) { super(source, recvar); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java index fbd242383..3d6ef69f9 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDisconnect.java @@ -22,7 +22,7 @@ public class GDisconnect extends DisconnectAction implements GType { - public GDisconnect(CommonTree source, + protected GDisconnect(CommonTree source, Role left, Role right) { super(source, left, right); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java index 518164099..1b6ea3a23 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java @@ -25,7 +25,7 @@ public class GDo extends Do implements GType { - public GDo(CommonTree source, GProtoName proto, + protected GDo(CommonTree source, GProtoName proto, List roles, List> args) { super(source, proto, roles, args); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java index 6353a4857..a40ff445e 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java @@ -23,7 +23,7 @@ public class GMessageTransfer extends MsgTransfer implements GType { - public GMessageTransfer(CommonTree source, + protected GMessageTransfer(CommonTree source, Role src, Msg msg, Role dst) { super(source, msg, src, dst); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java index 88b1e3a0d..2682a99da 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java @@ -20,8 +20,7 @@ public class GRecursion extends Recursion implements GType { - public GRecursion(//org.scribble.ast.Recursion source, - CommonTree source, // Due to inlining, protocoldecl -> rec + protected GRecursion(CommonTree source, // Due to inlining, protocoldecl -> rec RecVar recvar, GSeq body) { super(source, recvar, body); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java index 1ed4702c9..631cb204f 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java @@ -26,8 +26,7 @@ public class GSeq extends Seq implements GType { - public GSeq(CommonTree source, - List> elems) + protected GSeq(CommonTree source, List> elems) { super(source, elems); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactory.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactory.java new file mode 100644 index 000000000..d95dcfea2 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactory.java @@ -0,0 +1,36 @@ +package org.scribble.core.type.session.global; + +import java.util.List; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Arg; +import org.scribble.core.type.session.Msg; +import org.scribble.core.type.session.SType; + +public interface GTypeFactory +{ + + GChoice GChoice(CommonTree source, Role subj, List blocks); + + GConnect GConnect(CommonTree source, Role src, Msg msg, Role dst); + + GContinue GContinue(CommonTree source, RecVar recvar); + + GDisconnect GDisconnect(CommonTree source, Role left, Role right); + + GDo GDo(CommonTree source, GProtoName proto, List roles, + List> args); + + GMessageTransfer GMessageTransfer(CommonTree source, Role src, Msg msg, + Role dst); + + GRecursion GRecursion(CommonTree source, RecVar recvar, GSeq body); + + GSeq GSeq(CommonTree source, List> elems); + +} diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactoryImpl.java new file mode 100644 index 000000000..578c3b631 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactoryImpl.java @@ -0,0 +1,67 @@ +package org.scribble.core.type.session.global; + +import java.util.List; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Arg; +import org.scribble.core.type.session.Msg; +import org.scribble.core.type.session.SType; + +public class GTypeFactoryImpl implements GTypeFactory +{ + + @Override + public GChoice GChoice(CommonTree source, Role subj, List blocks) + { + return new GChoice(source, subj, blocks); + } + + @Override + public GConnect GConnect(CommonTree source, Role src, Msg msg, Role dst) + { + return new GConnect(source, src, msg, dst); + } + + @Override + public GContinue GContinue(CommonTree source, RecVar recvar) + { + return new GContinue(source, recvar); + } + + @Override + public GDisconnect GDisconnect(CommonTree source, Role left, Role right) + { + return new GDisconnect(source, left, right); + } + + @Override + public GDo GDo(CommonTree source, GProtoName proto, List roles, + List> args) + { + return new GDo(source, proto, roles, args); + } + + @Override + public GMessageTransfer GMessageTransfer(CommonTree source, Role src, Msg msg, + Role dst) + { + return new GMessageTransfer(source, src, msg, dst); + } + + @Override + public GRecursion GRecursion(CommonTree source, RecVar recvar, GSeq body) + { + return new GRecursion(source, recvar, body); + } + + @Override + public GSeq GSeq(CommonTree source, List> elems) + { + return new GSeq(source, elems); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java index 42e459ebf..7b1f33248 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Map; +import org.scribble.core.job.Core; import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; @@ -30,7 +31,14 @@ public abstract class STypeUnfolder> extends STypeVisitorNoThrow { + public final Core core; + private final Map> recs = new HashMap<>(); + + public STypeUnfolder(Core core) + { + this.core = core; + } @Override public final > SType visitDo(Do n) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java index 4b8cfeb29..48ec6f04e 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java @@ -21,8 +21,6 @@ import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Do; -import org.scribble.core.type.session.global.GContinue; -import org.scribble.core.type.session.global.GRecursion; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.global.GType; import org.scribble.core.visit.STypeInliner; @@ -43,7 +41,7 @@ public > GType visitDo(Do n) RecVar rv = getInlinedRecVar(sig); if (hasSig(sig)) { - return new GContinue(n.getSource(), rv); + return this.core.config.tf.global.GContinue(n.getSource(), rv); } pushSig(sig); GProtocol g = this.core.getContext().getIntermediate(fullname); @@ -53,6 +51,6 @@ public > GType visitDo(Do n) GSeq inlined = visitSeq(subs.visitSeq(g.def)); // i.e. returning a GSeq -- rely on parent GSeq to inline popSig(); - return new GRecursion(null, rv, inlined); + return this.core.config.tf.global.GRecursion(null, rv, inlined); } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeUnfolder.java index 40fa83a1b..5a2b3f876 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeUnfolder.java @@ -13,18 +13,25 @@ */ package org.scribble.core.visit.global; +import org.scribble.core.job.Core; import org.scribble.core.type.kind.Global; import org.scribble.core.type.session.Continue; -import org.scribble.core.type.session.global.GRecursion; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.global.GType; import org.scribble.core.visit.STypeUnfolder; public class GTypeUnfolder extends STypeUnfolder { + + public GTypeUnfolder(Core core) + { + super(core); + } + @Override public GType visitContinue(Continue n) { - return new GRecursion(n.getSource(), n.recvar, (GSeq) getRec(n.recvar)); + return this.core.config.tf.global.GRecursion(n.getSource(), n.recvar, + (GSeq) getRec(n.recvar)); } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java index b39c1a966..e2e73f92c 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java @@ -13,6 +13,7 @@ */ package org.scribble.core.visit.local; +import org.scribble.core.job.Core; import org.scribble.core.type.kind.Local; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.local.LRecursion; @@ -22,6 +23,12 @@ public class LTypeUnfolder extends STypeUnfolder { + + public LTypeUnfolder(Core core) + { + super(core); + } + @Override public LType visitContinue(Continue n) { diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index e5032bb76..4c98508ae 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -84,11 +84,14 @@ module tmp.Test; // TODO: rename addChildren1 // CHECKME: duplicate proto mods // ...check ad hoc ScribNode constructions go through af properly + // ...store unfoldings in Context // parser/ast re-refactoring + // split mf to global/local subcomps, make protected constrs // use stypefactory in core -- also make visitorfactorys (both core and ast) // check G/LType casts vs. SType (favour latter) // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) + // factor out all config factory methods more centrally? // Job Module projection // TODO: fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles // old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? From 41399a85cd70a38e2fc915bcb7f90fc1d1730715 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 27 Apr 2019 14:20:29 +0100 Subject: [PATCH 401/539] Factored out LTypeFactory. --- .../src/main/java/org/scribble/job/Job.java | 2 +- .../main/java/org/scribble/core/job/Core.java | 4 +- .../scribble/core/lang/local/LProtocol.java | 5 +- .../core/type/session/STypeFactory.java | 5 +- .../core/type/session/local/LAcc.java | 2 +- .../core/type/session/local/LChoice.java | 2 +- .../core/type/session/local/LContinue.java | 2 +- .../core/type/session/local/LDisconnect.java | 2 +- .../scribble/core/type/session/local/LDo.java | 2 +- .../core/type/session/local/LRecursion.java | 2 +- .../core/type/session/local/LRecv.java | 2 +- .../core/type/session/local/LReq.java | 2 +- .../core/type/session/local/LSend.java | 2 +- .../core/type/session/local/LSeq.java | 2 +- .../core/type/session/local/LTypeFactory.java | 38 +++++++++ .../type/session/local/LTypeFactoryImpl.java | 79 +++++++++++++++++++ .../core/visit/global/InlinedProjector.java | 30 +++---- .../scribble/core/visit/global/Projector.java | 2 +- .../core/visit/local/EGraphBuilder.java | 3 +- .../core/visit/local/LTypeInliner.java | 6 +- .../core/visit/local/LTypeUnfolder.java | 3 +- 21 files changed, 158 insertions(+), 39 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactory.java create mode 100644 scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactoryImpl.java diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 01f00a045..9864294ae 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -71,7 +71,7 @@ protected JobContext newJobContext(Job job, // CHECKME: factor out STypeTranslator, for future local parsing protected GTypeTranslator newGTypeTranslator(ModuleName rootFullname) { - STypeFactory tf = new STypeFactory(new GTypeFactoryImpl()); // TODO: factor out factory + STypeFactory tf = new STypeFactory(new GTypeFactoryImpl(), null); // TODO: factor out factory return new GTypeTranslator(this, rootFullname, tf); } diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index a2403622c..a5a1fed59 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -40,6 +40,7 @@ import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.global.GTypeFactoryImpl; import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.type.session.local.LTypeFactoryImpl; import org.scribble.core.visit.NonProtoDepsGatherer; import org.scribble.core.visit.ProtoDepsCollector; import org.scribble.core.visit.RoleGatherer; @@ -67,7 +68,8 @@ protected CoreConfig newCoreConfig(ModuleName mainFullname, Map args) { // TODO: factor out factory methods - STypeFactory tf = new STypeFactory(new GTypeFactoryImpl()); + STypeFactory tf = new STypeFactory(new GTypeFactoryImpl(), + new LTypeFactoryImpl()); ModelFactory mf = new ModelFactoryImpl(); return new CoreConfig(mainFullname, args, tf, mf); // CHECKME: combine E/SModelFactory? diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 24644967d..3d9d5b6a8 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -104,8 +104,9 @@ else if (n instanceof SigName) .visitWithNoEx(new RecPruner<>());*/ LSeq inlined = v.visitSeq(subs.visitSeq(this.def)); RecVar rv = v.getInlinedRecVar(sig); - LRecursion rec = new LRecursion(null, rv, inlined); // CHECKME: or protodecl source? - LSeq seq = new LSeq(null, Stream.of(rec).collect(Collectors.toList())); + LRecursion rec = v.core.config.tf.local.LRecursion(null, rv, inlined); // CHECKME: or protodecl source? + LSeq seq = v.core.config.tf.local.LSeq(null, + Stream.of(rec).collect(Collectors.toList())); LSeq def = new RecPruner().visitSeq(seq); /*//CHECKME: necessary for LProtocol/Projection? cf. global Set used = def.gather(new RoleGatherer()::visit) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java b/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java index 863a3e2bc..689c12680 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java @@ -19,14 +19,17 @@ import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.PackageName; import org.scribble.core.type.session.global.GTypeFactory; +import org.scribble.core.type.session.local.LTypeFactory; public class STypeFactory { public final GTypeFactory global; + public final LTypeFactory local; - public STypeFactory(GTypeFactory global) + public STypeFactory(GTypeFactory global, LTypeFactory local) { this.global = global; + this.local = local; } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java index 40ccafb3e..e333348af 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LAcc.java @@ -24,7 +24,7 @@ public class LAcc extends ConnectAction implements LType { // this.dst == Role.SELF - public LAcc(CommonTree source, + protected LAcc(CommonTree source, Role src, Msg msg) { super(source, msg, src, Role.SELF); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java index f3e64ab54..88bf055db 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LChoice.java @@ -22,7 +22,7 @@ public class LChoice extends Choice implements LType { - public LChoice(CommonTree source, Role subj, + protected LChoice(CommonTree source, Role subj, List blocks) { super(source, subj, blocks); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java index b8b60dbb0..55bf25282 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LContinue.java @@ -21,7 +21,7 @@ public class LContinue extends Continue implements LType { // N.B. source changes from do to continue after inlining - public LContinue(CommonTree source, RecVar recvar) + protected LContinue(CommonTree source, RecVar recvar) { super(source, recvar); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java index 11f60922f..b07d5bf4d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java @@ -23,7 +23,7 @@ public class LDisconnect extends DisconnectAction { // this.src == Role.SELF - public LDisconnect(CommonTree source, + protected LDisconnect(CommonTree source, Role peer) { super(source, Role.SELF, peer); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java index 11660d41f..09abd7536 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java @@ -25,7 +25,7 @@ public class LDo extends Do implements LType { - public LDo(CommonTree source, LProtoName proto, + protected LDo(CommonTree source, LProtoName proto, List roles, List> args) { super(source, proto, roles, args); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java index 0140d3ff2..d0894788e 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecursion.java @@ -20,7 +20,7 @@ public class LRecursion extends Recursion implements LType { - public LRecursion(//org.scribble.ast.Recursion source, + protected LRecursion(//org.scribble.ast.Recursion source, CommonTree source, // Due to inlining, protocoldecl -> rec RecVar recvar, LSeq body) { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecv.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecv.java index 3dedb36ce..9b9587350 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecv.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LRecv.java @@ -24,7 +24,7 @@ public class LRecv extends MsgTransfer { // this.dst == Role.SELF - public LRecv(CommonTree source, + protected LRecv(CommonTree source, Role src, Msg msg) { super(source, msg, src, Role.SELF); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java index fbd8e036f..9be292488 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LReq.java @@ -24,7 +24,7 @@ public class LReq extends ConnectAction implements LType { // this.src == Role.SELF - public LReq(CommonTree source, + protected LReq(CommonTree source, Msg msg, Role dst) { super(source, msg, Role.SELF, dst); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java index 7c7b9e688..fd2646197 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSend.java @@ -24,7 +24,7 @@ public class LSend extends MsgTransfer { // this.src == Role.SELF - public LSend(CommonTree source, + protected LSend(CommonTree source, Msg msg, Role dst) { super(source, msg, Role.SELF, dst); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java index 3d119d024..632a19f98 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java @@ -27,7 +27,7 @@ public class LSeq extends Seq implements LType { // GInteractionSeq or GBlock better as source? - public LSeq(CommonTree source, List> elems) + protected LSeq(CommonTree source, List> elems) { super(source, elems); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactory.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactory.java new file mode 100644 index 000000000..394d262ea --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactory.java @@ -0,0 +1,38 @@ +package org.scribble.core.type.session.local; + +import java.util.List; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.LProtoName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Arg; +import org.scribble.core.type.session.Msg; +import org.scribble.core.type.session.SType; + +public interface LTypeFactory +{ + + LAcc LAcc(CommonTree source, Role src, Msg msg); + + LChoice LChoice(CommonTree source, Role subj, List blocks); + + LContinue LContinue(CommonTree source, RecVar recvar); + + LDisconnect LDisconnect(CommonTree source, Role peer); + + LDo LDo(CommonTree source, LProtoName proto, List roles, + List> args); + + LRecursion LRecursion(CommonTree source, RecVar recvar, LSeq body); + + LRecv LRecv(CommonTree source, Role src, Msg msg); + + LReq LReq(CommonTree source, Msg msg, Role dst); + + LSend LSend(CommonTree source, Msg msg, Role dst); + + LSeq LSeq(CommonTree source, List> elems); +} diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactoryImpl.java new file mode 100644 index 000000000..8510ac2b3 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactoryImpl.java @@ -0,0 +1,79 @@ +package org.scribble.core.type.session.local; + +import java.util.List; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.LProtoName; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Arg; +import org.scribble.core.type.session.Msg; +import org.scribble.core.type.session.SType; + +public class LTypeFactoryImpl implements LTypeFactory +{ + + @Override + public LAcc LAcc(CommonTree source, Role src, Msg msg) + { + return new LAcc(source, src, msg); + } + + @Override + public LChoice LChoice(CommonTree source, Role subj, List blocks) + { + return new LChoice(source, subj, blocks); + } + + @Override + public LContinue LContinue(CommonTree source, RecVar recvar) + { + return new LContinue(source, recvar); + } + + @Override + public LDisconnect LDisconnect(CommonTree source, Role peer) + { + return new LDisconnect(source, peer); + } + + @Override + public LDo LDo(CommonTree source, LProtoName proto, List roles, + List> args) + { + return new LDo(source, proto, roles, args); + } + + @Override + public LRecursion LRecursion(CommonTree source, RecVar recvar, LSeq body) + { + return new LRecursion(source, recvar, body); + } + + @Override + public LRecv LRecv(CommonTree source, Role src, Msg msg) + { + return new LRecv(source, src, msg); + } + + @Override + public LReq LReq(CommonTree source, Msg msg, Role dst) + { + return new LReq(source, msg, dst); + } + + @Override + public LSend LSend(CommonTree source, Msg msg, + Role dst) + { + return new LSend(source, msg, dst); + } + + @Override + public LSeq LSeq(CommonTree source, List> elems) + { + return new LSeq(source, elems); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index 286d859d7..edfcd2039 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -38,17 +38,11 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.global.GConnect; import org.scribble.core.type.session.global.GSeq; -import org.scribble.core.type.session.local.LAcc; -import org.scribble.core.type.session.local.LChoice; import org.scribble.core.type.session.local.LContinue; -import org.scribble.core.type.session.local.LDisconnect; -import org.scribble.core.type.session.local.LRecursion; -import org.scribble.core.type.session.local.LRecv; -import org.scribble.core.type.session.local.LReq; -import org.scribble.core.type.session.local.LSend; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; +import org.scribble.core.type.session.local.LTypeFactory; import org.scribble.core.visit.STypeAggNoThrow; // Pre: use on inlined (i.e., Do inlined, roles pruned) @@ -104,7 +98,7 @@ public LType visitChoice(Choice n) ? Role.SELF // i.e., internal choice : n.subj;//v.visitSeq(blocks.get(0)).get(); // CHECKME: consistent ext choice means can infer from any one seq? // CHECKME: "self" also explcitily used for Do, but implicitly for MessageTransfer, inconsistent? - return new LChoice(null, subj, blocks); + return this.core.config.tf.local.LChoice(null, subj, blocks); } // N.B. won't prune unguarded continues that have a bad sequence, will be caught later by reachability checking (e.g., bad.reach.globals.gdo.Test04) @@ -122,7 +116,7 @@ private boolean isUnguardedSingleContinue(LSeq block) @Override public LType visitContinue(Continue n) { - return new LContinue(null, n.recvar); + return this.core.config.tf.local.LContinue(null, n.recvar); } @Override @@ -132,16 +126,17 @@ public LType visitDirectedInteraction(DirectedInteraction n) { // CHECKME: already checked? }*/ + LTypeFactory lf = this.core.config.tf.local; if (n instanceof GConnect) // FIXME { - return n.src.equals(self) ? new LReq(null, n.msg, n.dst) - : n.dst.equals(self) ? new LAcc(null, n.src, n.msg) + return n.src.equals(self) ? lf.LReq(null, n.msg, n.dst) + : n.dst.equals(self) ? lf.LAcc(null, n.src, n.msg) : LSkip.SKIP; } else //if (n instanceof GMessageTransfer) { - return n.src.equals(self) ? new LSend(null, n.msg, n.dst) - : n.dst.equals(self) ? new LRecv(null, n.src, n.msg) + return n.src.equals(self) ? lf.LSend(null, n.msg, n.dst) + : n.dst.equals(self) ? lf.LRecv(null, n.src, n.msg) : LSkip.SKIP; } } @@ -153,8 +148,9 @@ public LType visitDisconnect(DisconnectAction n) { // CHECKME: already checked? }*/ - return (n.left.equals(self)) ? new LDisconnect(null, n.right) - : (n.right.equals(self)) ? new LDisconnect(null, n.left) + LTypeFactory lf = this.core.config.tf.local; + return (n.left.equals(self)) ? lf.LDisconnect(null, n.right) + : (n.right.equals(self)) ? lf.LDisconnect(null, n.left) : LSkip.SKIP; } @@ -186,7 +182,7 @@ public LType visitRecursion(Recursion n) } } this.unguarded.remove(n.recvar); - return new LRecursion(null, n.recvar, body); + return this.core.config.tf.local.LRecursion(null, n.recvar, body); } // Param "hardcoded" to B (cf. Seq, or SType return) -- this visitor pattern depends on B for Choice/Recursion/etc reconstruction @@ -205,7 +201,7 @@ public LSeq visitSeq(GSeq n) } elems = elems.stream().filter(x -> !x.equals(LSkip.SKIP)) .collect(Collectors.toList()); - return new LSeq(null, elems); + return this.core.config.tf.local.LSeq(null, elems); // Empty seqs converted to LSkip by GChoice/Recursion projection // And a WF top-level protocol cannot produce empty LSeq // So a projection never contains an empty LSeq -- i.e., "empty choice/rec" pruning unnecessary diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java index 24daba280..f9c939810 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java @@ -81,7 +81,7 @@ public > LType visitDo(Do n) .map(x -> x.equals(this.self) ? Role.SELF : x) // CHECKME: "self" also explcitily used for Choice, but implicitly for MessageTransfer, inconsistent? .collect(Collectors.toList()); - return new LDo(null, fullname, rs, n.args); // TODO CHECKME: prune args? + return this.core.config.tf.local.LDo(null, fullname, rs, n.args); // TODO CHECKME: prune args? } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index e1953c73a..1a48c7ad9 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -120,7 +120,8 @@ private void buildUnguardedRecursion(EGraphBuilderUtil util, util.setEntry(nestedExit); // Must be non null util.setExit(exit); - LSeq tail = new LSeq(null, elems.subList(1, elems.size())); + LSeq tail = this.core.config.tf.local.LSeq(null, + elems.subList(1, elems.size())); tail.visitWithNoThrow(this); // nestedExit to exit } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java index 20eb3c2e7..1c8b0c13b 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java @@ -21,8 +21,6 @@ import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Do; -import org.scribble.core.type.session.local.LContinue; -import org.scribble.core.type.session.local.LRecursion; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.STypeInliner; @@ -43,7 +41,7 @@ public > LType visitDo(Do n) RecVar rv = getInlinedRecVar(sig); if (hasSig(sig)) { - return new LContinue(n.getSource(), rv); + return this.core.config.tf.local.LContinue(n.getSource(), rv); } pushSig(sig); LProtocol p = this.core.getContext().getProjection(fullname); // This line differs from GDo version @@ -53,6 +51,6 @@ public > LType visitDo(Do n) LSeq inlined = visitSeq(subs.visitSeq(p.def)); // i.e. returning a Seq -- rely on parent Seq to inline popSig(); - return new LRecursion(null, rv, inlined); + return this.core.config.tf.local.LRecursion(null, rv, inlined); } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java index e2e73f92c..b06648a29 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java @@ -32,6 +32,7 @@ public LTypeUnfolder(Core core) @Override public LType visitContinue(Continue n) { - return new LRecursion(n.getSource(), n.recvar, (LSeq) getRec(n.recvar)); + return this.core.config.tf.local.LRecursion(n.getSource(), n.recvar, + (LSeq) getRec(n.recvar)); } } From 3f3f1034254ed0d5d4f53aa7d9803d3d9a17c5ca Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 27 Apr 2019 14:53:28 +0100 Subject: [PATCH 402/539] Factoring out E/SModelFactory. --- .../main/java/org/scribble/core/job/Core.java | 8 +- .../scribble/core/lang/local/LProtocol.java | 2 +- .../org/scribble/core/model/ModelFactory.java | 69 ++----- .../scribble/core/model/ModelFactoryImpl.java | 171 ++---------------- .../core/model/endpoint/AutGraphParser.java | 47 +++-- .../model/endpoint/EGraphBuilderUtil.java | 2 +- .../core/model/endpoint/EModelFactory.java | 44 +++++ .../model/endpoint/EModelFactoryImpl.java | 87 +++++++++ .../scribble/core/model/endpoint/EState.java | 2 +- .../core/model/endpoint/actions/EAcc.java | 4 +- .../core/model/endpoint/actions/EAction.java | 2 +- .../model/endpoint/actions/EClientWrap.java | 4 +- .../model/endpoint/actions/EDisconnect.java | 2 +- .../core/model/endpoint/actions/ERecv.java | 4 +- .../core/model/endpoint/actions/EReq.java | 4 +- .../core/model/endpoint/actions/ESend.java | 4 +- .../model/endpoint/actions/EServerWrap.java | 4 +- .../scribble/core/model/global/SConfig.java | 4 +- .../core/model/global/SGraphBuilder.java | 7 +- .../core/model/global/SGraphBuilderUtil.java | 2 +- .../core/model/global/SModelFactory.java | 47 +++++ .../core/model/global/SModelFactoryImpl.java | 108 +++++++++++ .../scribble/core/visit/global/Projector.java | 1 - .../core/visit/local/EGraphBuilder.java | 12 +- .../core/visit/local/LTypeUnfolder.java | 1 - 25 files changed, 375 insertions(+), 267 deletions(-) mode change 100644 => 100755 scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java create mode 100644 scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java create mode 100644 scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java create mode 100644 scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java create mode 100644 scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index a5a1fed59..b3d3e0705 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -23,10 +23,11 @@ import org.scribble.core.lang.local.LProjection; import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.ModelFactory; -import org.scribble.core.model.ModelFactoryImpl; import org.scribble.core.model.endpoint.EGraph; +import org.scribble.core.model.endpoint.EModelFactoryImpl; import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.global.SGraph; +import org.scribble.core.model.global.SModelFactoryImpl; import org.scribble.core.model.visit.local.NonDetPayChecker; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; @@ -70,7 +71,8 @@ protected CoreConfig newCoreConfig(ModuleName mainFullname, // TODO: factor out factory methods STypeFactory tf = new STypeFactory(new GTypeFactoryImpl(), new LTypeFactoryImpl()); - ModelFactory mf = new ModelFactoryImpl(); + ModelFactory mf = new ModelFactory(new EModelFactoryImpl(), + new SModelFactoryImpl()); return new CoreConfig(mainFullname, args, tf, mf); // CHECKME: combine E/SModelFactory? } @@ -325,7 +327,7 @@ protected void validateByScribble(GProtoName fullname, boolean fair) verbosePrintPass("Checking " + (!fair ? "\"unfair\" " : "") + "global model: " + fullname); - this.config.mf.newSModel(graph).validate(this); + this.config.mf.global.newSModel(graph).validate(this); } // Pre: checkWellFormedness diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 3d9d5b6a8..31c02218d 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -132,7 +132,7 @@ public EGraph toEGraph(Core core) if (this.def.isEmpty()) // Empty Seq special case for top-level -- in general, Seq must be non-empty, cf. LSeq::buildGraph entry/exit { //EState s = b.getEntry(); - EState s = core.config.mf.newEState(Collections.emptySet()); + EState s = core.config.mf.local.newEState(Collections.emptySet()); return new EGraph(s, s); // TODO: refactor constructor inside mf } EGraphBuilder b = new EGraphBuilder(core); diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java index 443f49bd1..c0bf9ce61 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java @@ -13,64 +13,19 @@ */ package org.scribble.core.model; -import java.util.Map; -import java.util.Set; +import org.scribble.core.model.endpoint.EModelFactory; +import org.scribble.core.model.global.SModelFactory; -import org.scribble.core.model.endpoint.EFsm; -import org.scribble.core.model.endpoint.EGraphBuilderUtil; -import org.scribble.core.model.endpoint.EState; -import org.scribble.core.model.endpoint.actions.EAcc; -import org.scribble.core.model.endpoint.actions.EClientWrap; -import org.scribble.core.model.endpoint.actions.EDisconnect; -import org.scribble.core.model.endpoint.actions.ERecv; -import org.scribble.core.model.endpoint.actions.EReq; -import org.scribble.core.model.endpoint.actions.ESend; -import org.scribble.core.model.endpoint.actions.EServerWrap; -import org.scribble.core.model.global.SConfig; -import org.scribble.core.model.global.SGraph; -import org.scribble.core.model.global.SGraphBuilderUtil; -import org.scribble.core.model.global.SModel; -import org.scribble.core.model.global.SingleBuffers; -import org.scribble.core.model.global.SState; -import org.scribble.core.model.global.actions.SAcc; -import org.scribble.core.model.global.actions.SClientWrap; -import org.scribble.core.model.global.actions.SDisconnect; -import org.scribble.core.model.global.actions.SRecv; -import org.scribble.core.model.global.actions.SReq; -import org.scribble.core.model.global.actions.SSend; -import org.scribble.core.model.global.actions.SServerWrap; -import org.scribble.core.type.name.GProtoName; -import org.scribble.core.type.name.MsgId; -import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Payload; - -public interface ModelFactory +public class ModelFactory { - EGraphBuilderUtil newEGraphBuilderUtil(); - SGraphBuilderUtil newSGraphBuilderUtil(); - - ESend newESend(Role peer, MsgId mid, Payload pay); - ERecv newERecv(Role peer, MsgId mid, Payload pay); - EReq newEReq(Role peer, MsgId mid, Payload pay); - EAcc newEAcc(Role peer, MsgId mid, Payload pay); - EDisconnect newEDisconnect(Role peer); - EClientWrap newEClientWrap(Role peer); - EServerWrap newEServerWrap(Role peer); - - EState newEState(Set labs); - //EFsm new EFsm(...) + public final EModelFactory local; + public final SModelFactory global; - SSend newSSend(Role subj, Role obj, MsgId mid, Payload pay); - SRecv newSRecv(Role subj, Role obj, MsgId mid, Payload pay); - SReq newSReq(Role subj, Role obj, MsgId mid, Payload pay); - SAcc newSAcc(Role subj, Role obj, MsgId mid, Payload pay); - SDisconnect newSDisconnect(Role subj, Role obj); - SClientWrap newSClientWrap(Role subj, Role obj); - SServerWrap newSServerWrap(Role subj, Role obj); - - SState newSState(SConfig config); - SConfig newSConfig(Map state, SingleBuffers buffs); - SGraph newSGraph(GProtoName proto, Map states, SState init); // states: s.id -> s - SModel newSModel(SGraph g); + public ModelFactory(EModelFactory ef, SModelFactory sf) + { + this.local = ef; + ((ModelFactoryImpl) ef).setParent(this); // Must assign this.local first + this.global = sf; + ((ModelFactoryImpl) sf).setParent(this); // Must assign this.global first + } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java old mode 100644 new mode 100755 index c7e806be0..ce7eb0569 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java @@ -13,167 +13,20 @@ */ package org.scribble.core.model; -import java.util.Map; -import java.util.Set; - -import org.scribble.core.model.endpoint.EFsm; -import org.scribble.core.model.endpoint.EGraphBuilderUtil; -import org.scribble.core.model.endpoint.EState; -import org.scribble.core.model.endpoint.actions.EAcc; -import org.scribble.core.model.endpoint.actions.EClientWrap; -import org.scribble.core.model.endpoint.actions.EDisconnect; -import org.scribble.core.model.endpoint.actions.ERecv; -import org.scribble.core.model.endpoint.actions.EReq; -import org.scribble.core.model.endpoint.actions.ESend; -import org.scribble.core.model.endpoint.actions.EServerWrap; -import org.scribble.core.model.global.SConfig; -import org.scribble.core.model.global.SGraph; -import org.scribble.core.model.global.SGraphBuilderUtil; -import org.scribble.core.model.global.SModel; -import org.scribble.core.model.global.SingleBuffers; -import org.scribble.core.model.global.SState; -import org.scribble.core.model.global.actions.SAcc; -import org.scribble.core.model.global.actions.SClientWrap; -import org.scribble.core.model.global.actions.SDisconnect; -import org.scribble.core.model.global.actions.SRecv; -import org.scribble.core.model.global.actions.SReq; -import org.scribble.core.model.global.actions.SSend; -import org.scribble.core.model.global.actions.SServerWrap; -import org.scribble.core.type.name.GProtoName; -import org.scribble.core.type.name.MsgId; -import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Payload; - -// Separate E/SModelFactories fits protected E/SState constructor pattern -public class ModelFactoryImpl implements ModelFactory +// Base class for all E/SModelFactoryImpl +// N.B. this class does *not* itself implement top-level ModelFactory +public abstract class ModelFactoryImpl { + protected ModelFactory mf = null; - @Override - public EGraphBuilderUtil newEGraphBuilderUtil() - { - return new EGraphBuilderUtil(this); - } - - @Override - public ESend newESend(Role peer, MsgId mid, Payload pay) - { - return new ESend(this, peer, mid, pay); - } - - @Override - public ERecv newERecv(Role peer, MsgId mid, Payload pay) - { - return new ERecv(this, peer, mid, pay); - } - - @Override - public EReq newEReq(Role peer, MsgId mid, Payload pay) - { - return new EReq(this, peer, mid, pay); - } - - @Override - public EAcc newEAcc(Role peer, MsgId mid, Payload pay) - { - return new EAcc(this, peer, mid, pay); - } - - @Override - public EDisconnect newEDisconnect(Role peer) - { - return new EDisconnect(this, peer); - } - - @Override - public EClientWrap newEClientWrap(Role peer) - { - return new EClientWrap(this, peer); - } - - @Override - public EServerWrap newEServerWrap(Role peer) - { - return new EServerWrap(this, peer); - } - - @Override - public EState newEState(Set labs) - { - return new EState(labs); - } - - @Override - public SGraphBuilderUtil newSGraphBuilderUtil() - { - return new SGraphBuilderUtil(this); - } - - @Override - public SSend newSSend(Role subj, Role obj, MsgId mid, Payload pay) - { - return new SSend(subj, obj, mid, pay); - } - - @Override - public SRecv newSRecv(Role subj, Role obj, MsgId mid, Payload pay) - { - return new SRecv(subj, obj, mid, pay); - } - - @Override - public SReq newSReq(Role subj, Role obj, MsgId mid, Payload pay) - { - return new SReq(subj, obj, mid, pay); - } - - @Override - public SAcc newSAcc(Role subj, Role obj, MsgId mid, Payload pay) - { - return new SAcc(subj, obj, mid, pay); - } - - @Override - public SDisconnect newSDisconnect(Role subj, Role obj) - { - return new SDisconnect(subj, obj); - } - - @Override - public SClientWrap newSClientWrap(Role subj, Role obj) - { - return new SClientWrap(subj, obj); - } - - @Override - public SServerWrap newSServerWrap(Role subj, Role obj) - { - return new SServerWrap(subj, obj); - } - - @Override - public SState newSState(SConfig config) - { - return new SState(config); - } - - // states: s.id -> s - @Override - public SGraph newSGraph(GProtoName proto, Map states, - SState init) - { - return new SGraph(proto, states, init); - } - - @Override - public SConfig newSConfig(Map state, SingleBuffers buffs) - { - return new SConfig(this, state, buffs); - } - - @Override - public SModel newSModel(SGraph g) + // Only for use from ModelFactory constructor + // Pre: mf.local/global == this + protected void setParent(ModelFactory mf) { - return new SModel(g); + if (this.mf != null) + { + throw new RuntimeException("Incorrect usage: "); + } + this.mf = mf; } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java index fd3f70032..06d9302a0 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java @@ -117,7 +117,7 @@ public EGraph parse(String aut) } //EGraphBuilderUtil util = new EGraphBuilderUtil(ef); //EGraphBuilderUtil util = this.job2.newEGraphBuilderUtil2(); - EGraphBuilderUtil util = this.core.config.mf.newEGraphBuilderUtil(); + EGraphBuilderUtil util = this.core.config.mf.local.newEGraphBuilderUtil(); //util.init(null); // FIXME: arg is deprecated Map map = new HashMap<>(); map.put(init, util.getEntry()); @@ -131,7 +131,7 @@ public EGraph parse(String aut) { if (i != init && i != term) { - map.put(i, util.mf.newEState(Collections.emptySet())); + map.put(i, util.mf.local.newEState(Collections.emptySet())); } } //for (int i : succs) @@ -139,7 +139,7 @@ public EGraph parse(String aut) { if (!map.containsKey(i) && i != init && i != term) { - map.put(i, util.mf.newEState(Collections.emptySet())); + map.put(i, util.mf.local.newEState(Collections.emptySet())); } } //for (int i : edges.keySet()) @@ -173,7 +173,7 @@ private static EAction parseIOAction(ModelFactory ef, String a) String peer; String action; String msg; // Could be an Op or a MessageSigName (affects API generation) - String[] pay = null; + String[] paySplit = null; /*int i = a.indexOf("!"); i = (i == -1) ? a.indexOf("?") : i; @@ -240,47 +240,60 @@ else if ((i = a.indexOf('/')) != -1) String p = a.substring(k+1, a.length()-1); if (!p.isEmpty()) { - pay = p.split(","); + paySplit = p.split(","); } switch (action) { case "!": { - Payload payload = (pay != null) ? new Payload(Arrays.asList(pay).stream().map((pe) -> new DataName(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; - return ef.newESend(new Role(peer), getMessageIdHack(msg), payload); // FIXME: how about MessageSigNames? -- currently OK, treated as empty payload (cf. ModelAction) + Payload pay = (paySplit != null) + ? new Payload(Arrays.asList(paySplit).stream() + .map((pe) -> new DataName(pe)).collect(Collectors.toList())) + : Payload.EMPTY_PAYLOAD; + return ef.local.newESend(new Role(peer), getMessageIdHack(msg), pay); // FIXME: how about MessageSigNames? -- currently OK, treated as empty payload (cf. ModelAction) } case "?": { - Payload payload = (pay != null) ? new Payload(Arrays.asList(pay).stream().map((pe) -> new DataName(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; - return ef.newERecv(new Role(peer), getMessageIdHack(msg), payload); // FIXME: how about MessageSigNames?) + Payload pay = (paySplit != null) + ? new Payload(Arrays.asList(paySplit).stream() + .map((pe) -> new DataName(pe)).collect(Collectors.toList())) + : Payload.EMPTY_PAYLOAD; + return ef.local.newERecv(new Role(peer), getMessageIdHack(msg), pay); // FIXME: how about MessageSigNames?) } case "!!": { //return new Connect(new Role(peer)); - Payload payload = (pay != null) ? new Payload(Arrays.asList(pay).stream().map((pe) -> new DataName(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; - return ef.newEReq(new Role(peer), getMessageIdHack(msg), payload); + Payload pay = (paySplit != null) + ? new Payload(Arrays.asList(paySplit).stream() + .map((pe) -> new DataName(pe)).collect(Collectors.toList())) + : Payload.EMPTY_PAYLOAD; + return ef.local.newEReq(new Role(peer), getMessageIdHack(msg), pay); } case "??": { //return new Accept(new Role(peer)); - Payload payload = (pay != null) ? new Payload(Arrays.asList(pay).stream().map((pe) -> new DataName(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; - return ef.newEAcc(new Role(peer), getMessageIdHack(msg), payload); + Payload pay = (paySplit != null) + ? new Payload(Arrays.asList(paySplit).stream() + .map((pe) -> new DataName(pe)).collect(Collectors.toList())) + : Payload.EMPTY_PAYLOAD; + return ef.local.newEAcc(new Role(peer), getMessageIdHack(msg), pay); } case "(!!)": { - return ef.newEClientWrap(new Role(peer)); + return ef.local.newEClientWrap(new Role(peer)); } case "(??)": { - return ef.newEServerWrap(new Role(peer)); + return ef.local.newEServerWrap(new Role(peer)); } case "-/-": { - return ef.newEDisconnect(new Role(peer)); + return ef.local.newEDisconnect(new Role(peer)); } default: { - throw new RuntimeException("[TODO] aut parsing not supported for: " + msg); + throw new RuntimeException( + "[TODO] aut parsing not supported for: " + msg); } } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index e204fd05b..d02597843 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -90,7 +90,7 @@ protected void reset() // For the util to additionally record states -- use this, don't use this.mf.newEState public EState newState(Set labs) { - EState s = this.mf.newEState(labs); + EState s = this.mf.local.newEState(labs); this.states.add(s); return s; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java new file mode 100644 index 000000000..3a6cc3505 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java @@ -0,0 +1,44 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.model.endpoint; + +import java.util.Set; + +import org.scribble.core.model.endpoint.actions.EAcc; +import org.scribble.core.model.endpoint.actions.EClientWrap; +import org.scribble.core.model.endpoint.actions.EDisconnect; +import org.scribble.core.model.endpoint.actions.ERecv; +import org.scribble.core.model.endpoint.actions.EReq; +import org.scribble.core.model.endpoint.actions.ESend; +import org.scribble.core.model.endpoint.actions.EServerWrap; +import org.scribble.core.type.name.MsgId; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; + +public interface EModelFactory +{ + EGraphBuilderUtil newEGraphBuilderUtil(); + + EState newEState(Set labs); + //EFsm new EFsm(...) + + ESend newESend(Role peer, MsgId mid, Payload pay); + ERecv newERecv(Role peer, MsgId mid, Payload pay); + EReq newEReq(Role peer, MsgId mid, Payload pay); + EAcc newEAcc(Role peer, MsgId mid, Payload pay); + EDisconnect newEDisconnect(Role peer); + EClientWrap newEClientWrap(Role peer); + EServerWrap newEServerWrap(Role peer); +} diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java new file mode 100644 index 000000000..1caef3290 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java @@ -0,0 +1,87 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.model.endpoint; + +import java.util.Set; + +import org.scribble.core.model.ModelFactoryImpl; +import org.scribble.core.model.endpoint.actions.EAcc; +import org.scribble.core.model.endpoint.actions.EClientWrap; +import org.scribble.core.model.endpoint.actions.EDisconnect; +import org.scribble.core.model.endpoint.actions.ERecv; +import org.scribble.core.model.endpoint.actions.EReq; +import org.scribble.core.model.endpoint.actions.ESend; +import org.scribble.core.model.endpoint.actions.EServerWrap; +import org.scribble.core.type.name.MsgId; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; + +// Separate E/SModelFactories fits protected E/SState constructor pattern +public class EModelFactoryImpl extends ModelFactoryImpl implements EModelFactory +{ + @Override + public EGraphBuilderUtil newEGraphBuilderUtil() + { + return new EGraphBuilderUtil(this.mf); + } + + @Override + public EState newEState(Set labs) + { + return new EState(labs); + } + + @Override + public ESend newESend(Role peer, MsgId mid, Payload pay) + { + return new ESend(this.mf, peer, mid, pay); + } + + @Override + public ERecv newERecv(Role peer, MsgId mid, Payload pay) + { + return new ERecv(this.mf, peer, mid, pay); + } + + @Override + public EReq newEReq(Role peer, MsgId mid, Payload pay) + { + return new EReq(this.mf, peer, mid, pay); + } + + @Override + public EAcc newEAcc(Role peer, MsgId mid, Payload pay) + { + return new EAcc(this.mf, peer, mid, pay); + } + + @Override + public EDisconnect newEDisconnect(Role peer) + { + return new EDisconnect(this.mf, peer); + } + + @Override + public EClientWrap newEClientWrap(Role peer) + { + return new EClientWrap(this.mf, peer); + } + + @Override + public EServerWrap newEServerWrap(Role peer) + { + return new EServerWrap(this.mf, peer); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index 96f24163b..dbef8eec6 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -49,7 +49,7 @@ public EState(Set labs) protected EState cloneNode(ModelFactory mf, Set labs) { //return ef.newEState(this.labs); - return mf.newEState(labs); + return mf.local.newEState(labs); } // Fully clones the reachable graph (i.e. the "general" graph -- cf., EGraph, the specific Scribble concept of an endpoint protocol graph) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAcc.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAcc.java index 6cab40115..763735c57 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAcc.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAcc.java @@ -29,13 +29,13 @@ public EAcc(ModelFactory mf, Role peer, MsgId mid, Payload pay) @Override public EReq toDual(Role self) { - return this.mf.newEReq(self, this.mid, this.payload); + return this.mf.local.newEReq(self, this.mid, this.payload); } @Override public SAcc toGlobal(Role self) { - return this.mf.newSAcc(self, this.peer, this.mid, this.payload); + return this.mf.global.newSAcc(self, this.peer, this.mid, this.payload); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java index 19bc2c1ff..f6fdbaa33 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAction.java @@ -25,7 +25,7 @@ public abstract class EAction extends MAction { public final Role peer; - protected final ModelFactory mf; + protected final ModelFactory mf; // Internalising better ensures all constructions points (in a Scrib extension) consistently use the same ef/sf protected EAction(ModelFactory mf, Role peer, MsgId mid, Payload pay) { diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EClientWrap.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EClientWrap.java index 129910a52..d55db4b7b 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EClientWrap.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EClientWrap.java @@ -31,13 +31,13 @@ public EClientWrap(ModelFactory ef, Role peer) @Override public EServerWrap toDual(Role self) { - return this.mf.newEServerWrap(self); + return this.mf.local.newEServerWrap(self); } @Override public SClientWrap toGlobal(Role self) { - return this.mf.newSClientWrap(self, this.peer); + return this.mf.global.newSClientWrap(self, this.peer); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java index 82c412e1b..4620a5dd5 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java @@ -35,7 +35,7 @@ public EDisconnect toDual(Role self) @Override public SDisconnect toGlobal(Role self) { - return this.mf.newSDisconnect(self, this.peer); + return this.mf.global.newSDisconnect(self, this.peer); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERecv.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERecv.java index 8f6bc9a45..c8cdb097a 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERecv.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERecv.java @@ -30,13 +30,13 @@ public ERecv(ModelFactory ef, Role peer, MsgId mid, Payload pay) @Override public ESend toDual(Role self) { - return this.mf.newESend(self, this.mid, this.payload); + return this.mf.local.newESend(self, this.mid, this.payload); } @Override public SRecv toGlobal(Role self) { - return this.mf.newSRecv(self, this.peer, this.mid, this.payload); + return this.mf.global.newSRecv(self, this.peer, this.mid, this.payload); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReq.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReq.java index 7c6d582d9..3521c7939 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReq.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReq.java @@ -29,13 +29,13 @@ public EReq(ModelFactory ef, Role peer, MsgId mid, Payload pay) @Override public EAcc toDual(Role self) { - return this.mf.newEAcc(self, this.mid, this.payload); + return this.mf.local.newEAcc(self, this.mid, this.payload); } @Override public SReq toGlobal(Role self) { - return this.mf.newSReq(self, this.peer, this.mid, this.payload); + return this.mf.global.newSReq(self, this.peer, this.mid, this.payload); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java index c76509a43..d2094cc63 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java @@ -30,13 +30,13 @@ public ESend(ModelFactory ef, Role peer, MsgId mid, Payload pay) @Override public ERecv toDual(Role self) { - return this.mf.newERecv(self, this.mid, this.payload); + return this.mf.local.newERecv(self, this.mid, this.payload); } @Override public SSend toGlobal(Role self) { - return this.mf.newSSend(self, this.peer, this.mid, this.payload); + return this.mf.global.newSSend(self, this.peer, this.mid, this.payload); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EServerWrap.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EServerWrap.java index f2d81cc74..c50240897 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EServerWrap.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EServerWrap.java @@ -31,13 +31,13 @@ public EServerWrap(ModelFactory ef, Role peer) @Override public EClientWrap toDual(Role self) { - return this.mf.newEClientWrap(self); + return this.mf.local.newEClientWrap(self); } @Override public SServerWrap toGlobal(Role self) { - return this.mf.newSServerWrap(self, this.peer); + return this.mf.global.newSServerWrap(self, this.peer); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index 4cdc595bf..b4234f3fb 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -183,7 +183,7 @@ public List async(Role self, EAction a) { throw new RuntimeException("Shouldn't get in here: " + a); } - res.add(this.mf.newSConfig(efsms, queues)); + res.add(this.mf.global.newSConfig(efsms, queues)); } return res; } @@ -222,7 +222,7 @@ else if (((a1.isClientWrap() && a2.isServerWrap()) { throw new RuntimeException("Shouldn't get in here: " + a1 + ", " + a2); } - res.add(this.mf.newSConfig(efsms, queues)); + res.add(this.mf.global.newSConfig(efsms, queues)); } } return res; diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index da3c9debb..8665a5d1f 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -39,7 +39,7 @@ public class SGraphBuilder public SGraphBuilder(Core core) { this.core = core; - this.util = this.core.config.mf.newSGraphBuilderUtil(); + this.util = this.core.config.mf.global.newSGraphBuilderUtil(); } // Do as an initial state rather than config? @@ -49,7 +49,7 @@ protected SConfig createInitConfig(Map egraphs, Map efsms = egraphs.entrySet().stream() .collect(Collectors.toMap(Entry::getKey, e -> e.getValue().toFsm())); SingleBuffers b0 = new SingleBuffers(efsms.keySet(), !explicit); - return this.core.config.mf.newSConfig(efsms, b0); + return this.core.config.mf.global.newSConfig(efsms, b0); } // Factory method: not fully integrated with SGraph constructor because of Job arg (debug printing) @@ -120,6 +120,7 @@ else if (a.isAccept() || a.isRequest() || a.isClientWrap() } } - return this.core.config.mf.newSGraph(fullname, this.util.getStates(), init); + return this.core.config.mf.global.newSGraph(fullname, this.util.getStates(), + init); } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index c1e2fc85b..3546f5d98 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -43,7 +43,7 @@ protected void reset() public SState newState(SConfig c) { - SState s = this.mf.newSState(c); + SState s = this.mf.global.newSState(c); this.states.put(c, s); return s; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java new file mode 100644 index 000000000..d249afcb9 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java @@ -0,0 +1,47 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.model.global; + +import java.util.Map; + +import org.scribble.core.model.endpoint.EFsm; +import org.scribble.core.model.global.actions.SAcc; +import org.scribble.core.model.global.actions.SClientWrap; +import org.scribble.core.model.global.actions.SDisconnect; +import org.scribble.core.model.global.actions.SRecv; +import org.scribble.core.model.global.actions.SReq; +import org.scribble.core.model.global.actions.SSend; +import org.scribble.core.model.global.actions.SServerWrap; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.MsgId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; + +public interface SModelFactory +{ + SGraphBuilderUtil newSGraphBuilderUtil(); + + SState newSState(SConfig config); + SConfig newSConfig(Map state, SingleBuffers buffs); + SGraph newSGraph(GProtoName proto, Map states, SState init); // states: s.id -> s + SModel newSModel(SGraph g); + + SSend newSSend(Role subj, Role obj, MsgId mid, Payload pay); + SRecv newSRecv(Role subj, Role obj, MsgId mid, Payload pay); + SReq newSReq(Role subj, Role obj, MsgId mid, Payload pay); + SAcc newSAcc(Role subj, Role obj, MsgId mid, Payload pay); + SDisconnect newSDisconnect(Role subj, Role obj); + SClientWrap newSClientWrap(Role subj, Role obj); + SServerWrap newSServerWrap(Role subj, Role obj); +} diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java new file mode 100644 index 000000000..9a075e9f1 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java @@ -0,0 +1,108 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.model.global; + +import java.util.Map; + +import org.scribble.core.model.ModelFactoryImpl; +import org.scribble.core.model.endpoint.EFsm; +import org.scribble.core.model.global.actions.SAcc; +import org.scribble.core.model.global.actions.SClientWrap; +import org.scribble.core.model.global.actions.SDisconnect; +import org.scribble.core.model.global.actions.SRecv; +import org.scribble.core.model.global.actions.SReq; +import org.scribble.core.model.global.actions.SSend; +import org.scribble.core.model.global.actions.SServerWrap; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.MsgId; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Payload; + +// Separate E/SModelFactories fits protected E/SState constructor pattern +public class SModelFactoryImpl extends ModelFactoryImpl implements SModelFactory +{ + @Override + public SGraphBuilderUtil newSGraphBuilderUtil() + { + return new SGraphBuilderUtil(this.mf); + } + + @Override + public SState newSState(SConfig config) + { + return new SState(config); + } + + // states: s.id -> s + @Override + public SGraph newSGraph(GProtoName proto, Map states, + SState init) + { + return new SGraph(proto, states, init); + } + + @Override + public SConfig newSConfig(Map state, SingleBuffers buffs) + { + return new SConfig(this.mf, state, buffs); + } + + @Override + public SModel newSModel(SGraph g) + { + return new SModel(g); + } + + @Override + public SSend newSSend(Role subj, Role obj, MsgId mid, Payload pay) + { + return new SSend(subj, obj, mid, pay); + } + + @Override + public SRecv newSRecv(Role subj, Role obj, MsgId mid, Payload pay) + { + return new SRecv(subj, obj, mid, pay); + } + + @Override + public SReq newSReq(Role subj, Role obj, MsgId mid, Payload pay) + { + return new SReq(subj, obj, mid, pay); + } + + @Override + public SAcc newSAcc(Role subj, Role obj, MsgId mid, Payload pay) + { + return new SAcc(subj, obj, mid, pay); + } + + @Override + public SDisconnect newSDisconnect(Role subj, Role obj) + { + return new SDisconnect(subj, obj); + } + + @Override + public SClientWrap newSClientWrap(Role subj, Role obj) + { + return new SClientWrap(subj, obj); + } + + @Override + public SServerWrap newSServerWrap(Role subj, Role obj) + { + return new SServerWrap(subj, obj); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java index f9c939810..ba9bd276c 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java @@ -28,7 +28,6 @@ import org.scribble.core.type.name.Substitutions; import org.scribble.core.type.session.Do; import org.scribble.core.type.session.global.GSeq; -import org.scribble.core.type.session.local.LDo; import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 1a48c7ad9..9d27002c3 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -59,7 +59,7 @@ public class EGraphBuilder extends STypeVisitorNoThrow public EGraphBuilder(Core core) { this.core = core; - this.util = core.config.mf.newEGraphBuilderUtil(); + this.util = core.config.mf.local.newEGraphBuilderUtil(); } public EGraph finalise() @@ -176,11 +176,11 @@ public SType visitDirectedInteraction( ? ((SigLit) n.msg).payload : Payload.EMPTY_PAYLOAD; // TODO: add toAction method to BasicInteraction (cf. toName methods of NameNodes) - EAction a = (n instanceof LSend) ? this.util.mf.newESend(peer, mid, pay) - : (n instanceof LRecv) ? this.util.mf.newERecv(peer, mid, pay) - : (n instanceof LReq) ? this.util.mf.newEReq(peer, mid, pay) + EAction a = (n instanceof LSend) ? this.util.mf.local.newESend(peer, mid, pay) + : (n instanceof LRecv) ? this.util.mf.local.newERecv(peer, mid, pay) + : (n instanceof LReq) ? this.util.mf.local.newEReq(peer, mid, pay) : //(n instanceof LAcc) ? - this.util.mf.newEAcc(peer, mid, pay); // Action type already checked above + this.util.mf.local.newEAcc(peer, mid, pay); // Action type already checked above this.util.addEdge(this.util.getEntry(), a, this.util.getExit()); return n; } @@ -189,7 +189,7 @@ public SType visitDirectedInteraction( public SType visitDisconnect(DisconnectAction n) { Role peer = ((LDisconnect) n).getPeer(); // CHECKME -- ? - EAction a = this.util.mf.newEDisconnect(peer); // TODO: add toAction method to BasicInteraction + EAction a = this.util.mf.local.newEDisconnect(peer); // TODO: add toAction method to BasicInteraction this.util.addEdge(this.util.getEntry(), a, this.util.getExit()); return n; } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java index b06648a29..7546eb755 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java @@ -16,7 +16,6 @@ import org.scribble.core.job.Core; import org.scribble.core.type.kind.Local; import org.scribble.core.type.session.Continue; -import org.scribble.core.type.session.local.LRecursion; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.STypeUnfolder; From 57a74d9b2277752ab9b921342692aa4a94866b6a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 27 Apr 2019 14:59:53 +0100 Subject: [PATCH 403/539] Continued. --- .../main/java/org/scribble/core/job/Core.java | 2 +- .../scribble/core/lang/local/LProtocol.java | 2 +- .../core/model/endpoint/AutGraphParser.java | 20 +++++++------- .../model/endpoint/EGraphBuilderUtil.java | 4 +-- .../core/model/endpoint/EModelFactory.java | 20 +++++++------- .../model/endpoint/EModelFactoryImpl.java | 18 ++++++------- .../scribble/core/model/endpoint/EState.java | 4 +-- .../core/model/endpoint/actions/EAcc.java | 4 +-- .../model/endpoint/actions/EClientWrap.java | 4 +-- .../model/endpoint/actions/EDisconnect.java | 2 +- .../core/model/endpoint/actions/ERecv.java | 4 +-- .../core/model/endpoint/actions/EReq.java | 4 +-- .../core/model/endpoint/actions/ESend.java | 4 +-- .../model/endpoint/actions/EServerWrap.java | 4 +-- .../scribble/core/model/global/SConfig.java | 6 ++--- .../scribble/core/model/global/SGraph.java | 2 +- .../core/model/global/SGraphBuilder.java | 6 ++--- .../core/model/global/SGraphBuilderUtil.java | 4 +-- .../scribble/core/model/global/SModel.java | 2 +- .../core/model/global/SModelFactory.java | 26 ++++++++++--------- .../core/model/global/SModelFactoryImpl.java | 24 ++++++++--------- .../scribble/core/model/global/SState.java | 3 +-- .../core/visit/local/EGraphBuilder.java | 12 ++++----- 23 files changed, 92 insertions(+), 89 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index b3d3e0705..3575dbb4a 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -327,7 +327,7 @@ protected void validateByScribble(GProtoName fullname, boolean fair) verbosePrintPass("Checking " + (!fair ? "\"unfair\" " : "") + "global model: " + fullname); - this.config.mf.global.newSModel(graph).validate(this); + this.config.mf.global.SModel(graph).validate(this); } // Pre: checkWellFormedness diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 31c02218d..d41fa5f01 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -132,7 +132,7 @@ public EGraph toEGraph(Core core) if (this.def.isEmpty()) // Empty Seq special case for top-level -- in general, Seq must be non-empty, cf. LSeq::buildGraph entry/exit { //EState s = b.getEntry(); - EState s = core.config.mf.local.newEState(Collections.emptySet()); + EState s = core.config.mf.local.EState(Collections.emptySet()); return new EGraph(s, s); // TODO: refactor constructor inside mf } EGraphBuilder b = new EGraphBuilder(core); diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java index 06d9302a0..a840d9ca9 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/AutGraphParser.java @@ -117,7 +117,7 @@ public EGraph parse(String aut) } //EGraphBuilderUtil util = new EGraphBuilderUtil(ef); //EGraphBuilderUtil util = this.job2.newEGraphBuilderUtil2(); - EGraphBuilderUtil util = this.core.config.mf.local.newEGraphBuilderUtil(); + EGraphBuilderUtil util = this.core.config.mf.local.EGraphBuilderUtil(); //util.init(null); // FIXME: arg is deprecated Map map = new HashMap<>(); map.put(init, util.getEntry()); @@ -131,7 +131,7 @@ public EGraph parse(String aut) { if (i != init && i != term) { - map.put(i, util.mf.local.newEState(Collections.emptySet())); + map.put(i, util.mf.local.EState(Collections.emptySet())); } } //for (int i : succs) @@ -139,7 +139,7 @@ public EGraph parse(String aut) { if (!map.containsKey(i) && i != init && i != term) { - map.put(i, util.mf.local.newEState(Collections.emptySet())); + map.put(i, util.mf.local.EState(Collections.emptySet())); } } //for (int i : edges.keySet()) @@ -250,7 +250,7 @@ else if ((i = a.indexOf('/')) != -1) ? new Payload(Arrays.asList(paySplit).stream() .map((pe) -> new DataName(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; - return ef.local.newESend(new Role(peer), getMessageIdHack(msg), pay); // FIXME: how about MessageSigNames? -- currently OK, treated as empty payload (cf. ModelAction) + return ef.local.ESend(new Role(peer), getMessageIdHack(msg), pay); // FIXME: how about MessageSigNames? -- currently OK, treated as empty payload (cf. ModelAction) } case "?": { @@ -258,7 +258,7 @@ else if ((i = a.indexOf('/')) != -1) ? new Payload(Arrays.asList(paySplit).stream() .map((pe) -> new DataName(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; - return ef.local.newERecv(new Role(peer), getMessageIdHack(msg), pay); // FIXME: how about MessageSigNames?) + return ef.local.ERecv(new Role(peer), getMessageIdHack(msg), pay); // FIXME: how about MessageSigNames?) } case "!!": { @@ -267,7 +267,7 @@ else if ((i = a.indexOf('/')) != -1) ? new Payload(Arrays.asList(paySplit).stream() .map((pe) -> new DataName(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; - return ef.local.newEReq(new Role(peer), getMessageIdHack(msg), pay); + return ef.local.EReq(new Role(peer), getMessageIdHack(msg), pay); } case "??": { @@ -276,19 +276,19 @@ else if ((i = a.indexOf('/')) != -1) ? new Payload(Arrays.asList(paySplit).stream() .map((pe) -> new DataName(pe)).collect(Collectors.toList())) : Payload.EMPTY_PAYLOAD; - return ef.local.newEAcc(new Role(peer), getMessageIdHack(msg), pay); + return ef.local.EAcc(new Role(peer), getMessageIdHack(msg), pay); } case "(!!)": { - return ef.local.newEClientWrap(new Role(peer)); + return ef.local.EClientWrap(new Role(peer)); } case "(??)": { - return ef.local.newEServerWrap(new Role(peer)); + return ef.local.EServerWrap(new Role(peer)); } case "-/-": { - return ef.local.newEDisconnect(new Role(peer)); + return ef.local.EDisconnect(new Role(peer)); } default: { diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java index d02597843..a413541a1 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraphBuilderUtil.java @@ -64,7 +64,7 @@ public class EGraphBuilderUtil // - On recursion exit, pop the list into the enacting map for the rec entry state private final Map>> collecting = new HashMap<>(); - public EGraphBuilderUtil(ModelFactory mf) + protected EGraphBuilderUtil(ModelFactory mf) { super(mf); reset(); @@ -90,7 +90,7 @@ protected void reset() // For the util to additionally record states -- use this, don't use this.mf.newEState public EState newState(Set labs) { - EState s = this.mf.local.newEState(labs); + EState s = this.mf.local.EState(labs); this.states.add(s); return s; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java index 3a6cc3505..1bd023d0c 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactory.java @@ -29,16 +29,18 @@ public interface EModelFactory { - EGraphBuilderUtil newEGraphBuilderUtil(); + EGraphBuilderUtil EGraphBuilderUtil(); - EState newEState(Set labs); + // protected constructors (MState mutable) + EState EState(Set labs); //EFsm new EFsm(...) - ESend newESend(Role peer, MsgId mid, Payload pay); - ERecv newERecv(Role peer, MsgId mid, Payload pay); - EReq newEReq(Role peer, MsgId mid, Payload pay); - EAcc newEAcc(Role peer, MsgId mid, Payload pay); - EDisconnect newEDisconnect(Role peer); - EClientWrap newEClientWrap(Role peer); - EServerWrap newEServerWrap(Role peer); + // public constructors (subpackage, immutable) + ESend ESend(Role peer, MsgId mid, Payload pay); + ERecv ERecv(Role peer, MsgId mid, Payload pay); + EReq EReq(Role peer, MsgId mid, Payload pay); + EAcc EAcc(Role peer, MsgId mid, Payload pay); + EDisconnect EDisconnect(Role peer); + EClientWrap EClientWrap(Role peer); + EServerWrap EServerWrap(Role peer); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java index 1caef3290..cf4354de8 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java @@ -32,55 +32,55 @@ public class EModelFactoryImpl extends ModelFactoryImpl implements EModelFactory { @Override - public EGraphBuilderUtil newEGraphBuilderUtil() + public EGraphBuilderUtil EGraphBuilderUtil() { return new EGraphBuilderUtil(this.mf); } @Override - public EState newEState(Set labs) + public EState EState(Set labs) { return new EState(labs); } @Override - public ESend newESend(Role peer, MsgId mid, Payload pay) + public ESend ESend(Role peer, MsgId mid, Payload pay) { return new ESend(this.mf, peer, mid, pay); } @Override - public ERecv newERecv(Role peer, MsgId mid, Payload pay) + public ERecv ERecv(Role peer, MsgId mid, Payload pay) { return new ERecv(this.mf, peer, mid, pay); } @Override - public EReq newEReq(Role peer, MsgId mid, Payload pay) + public EReq EReq(Role peer, MsgId mid, Payload pay) { return new EReq(this.mf, peer, mid, pay); } @Override - public EAcc newEAcc(Role peer, MsgId mid, Payload pay) + public EAcc EAcc(Role peer, MsgId mid, Payload pay) { return new EAcc(this.mf, peer, mid, pay); } @Override - public EDisconnect newEDisconnect(Role peer) + public EDisconnect EDisconnect(Role peer) { return new EDisconnect(this.mf, peer); } @Override - public EClientWrap newEClientWrap(Role peer) + public EClientWrap EClientWrap(Role peer) { return new EClientWrap(this.mf, peer); } @Override - public EServerWrap newEServerWrap(Role peer) + public EServerWrap EServerWrap(Role peer) { return new EServerWrap(this.mf, peer); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index dbef8eec6..f6c6ab8a4 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -39,7 +39,7 @@ // Label types used to be both RecVar and SubprotocolSigs; now using inlined protocol for FSM building so just RecVar public class EState extends MPrettyState { - public EState(Set labs) + protected EState(Set labs) { super(labs); } @@ -49,7 +49,7 @@ public EState(Set labs) protected EState cloneNode(ModelFactory mf, Set labs) { //return ef.newEState(this.labs); - return mf.local.newEState(labs); + return mf.local.EState(labs); } // Fully clones the reachable graph (i.e. the "general" graph -- cf., EGraph, the specific Scribble concept of an endpoint protocol graph) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAcc.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAcc.java index 763735c57..48be5be4d 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAcc.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EAcc.java @@ -29,13 +29,13 @@ public EAcc(ModelFactory mf, Role peer, MsgId mid, Payload pay) @Override public EReq toDual(Role self) { - return this.mf.local.newEReq(self, this.mid, this.payload); + return this.mf.local.EReq(self, this.mid, this.payload); } @Override public SAcc toGlobal(Role self) { - return this.mf.global.newSAcc(self, this.peer, this.mid, this.payload); + return this.mf.global.SAcc(self, this.peer, this.mid, this.payload); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EClientWrap.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EClientWrap.java index d55db4b7b..a72ac7545 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EClientWrap.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EClientWrap.java @@ -31,13 +31,13 @@ public EClientWrap(ModelFactory ef, Role peer) @Override public EServerWrap toDual(Role self) { - return this.mf.local.newEServerWrap(self); + return this.mf.local.EServerWrap(self); } @Override public SClientWrap toGlobal(Role self) { - return this.mf.global.newSClientWrap(self, this.peer); + return this.mf.global.SClientWrap(self, this.peer); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java index 4620a5dd5..e22b334d2 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EDisconnect.java @@ -35,7 +35,7 @@ public EDisconnect toDual(Role self) @Override public SDisconnect toGlobal(Role self) { - return this.mf.global.newSDisconnect(self, this.peer); + return this.mf.global.SDisconnect(self, this.peer); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERecv.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERecv.java index c8cdb097a..48d8311c9 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERecv.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ERecv.java @@ -30,13 +30,13 @@ public ERecv(ModelFactory ef, Role peer, MsgId mid, Payload pay) @Override public ESend toDual(Role self) { - return this.mf.local.newESend(self, this.mid, this.payload); + return this.mf.local.ESend(self, this.mid, this.payload); } @Override public SRecv toGlobal(Role self) { - return this.mf.global.newSRecv(self, this.peer, this.mid, this.payload); + return this.mf.global.SRecv(self, this.peer, this.mid, this.payload); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReq.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReq.java index 3521c7939..65dfe0af9 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReq.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EReq.java @@ -29,13 +29,13 @@ public EReq(ModelFactory ef, Role peer, MsgId mid, Payload pay) @Override public EAcc toDual(Role self) { - return this.mf.local.newEAcc(self, this.mid, this.payload); + return this.mf.local.EAcc(self, this.mid, this.payload); } @Override public SReq toGlobal(Role self) { - return this.mf.global.newSReq(self, this.peer, this.mid, this.payload); + return this.mf.global.SReq(self, this.peer, this.mid, this.payload); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java index d2094cc63..127081efb 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/ESend.java @@ -30,13 +30,13 @@ public ESend(ModelFactory ef, Role peer, MsgId mid, Payload pay) @Override public ERecv toDual(Role self) { - return this.mf.local.newERecv(self, this.mid, this.payload); + return this.mf.local.ERecv(self, this.mid, this.payload); } @Override public SSend toGlobal(Role self) { - return this.mf.global.newSSend(self, this.peer, this.mid, this.payload); + return this.mf.global.SSend(self, this.peer, this.mid, this.payload); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EServerWrap.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EServerWrap.java index c50240897..3d2258042 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EServerWrap.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/actions/EServerWrap.java @@ -31,13 +31,13 @@ public EServerWrap(ModelFactory ef, Role peer) @Override public EClientWrap toDual(Role self) { - return this.mf.local.newEClientWrap(self); + return this.mf.local.EClientWrap(self); } @Override public SServerWrap toGlobal(Role self) { - return this.mf.global.newSServerWrap(self, this.peer); + return this.mf.global.SServerWrap(self, this.peer); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index b4234f3fb..f522d4379 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -48,7 +48,7 @@ public class SConfig public final Map efsms; public final SingleBuffers queues; // N.B. currently hardcoded to capacity one - public SConfig(ModelFactory mf, Map state, SingleBuffers queues) + protected SConfig(ModelFactory mf, Map state, SingleBuffers queues) { this.mf = mf; this.efsms = Collections.unmodifiableMap(state); @@ -183,7 +183,7 @@ public List async(Role self, EAction a) { throw new RuntimeException("Shouldn't get in here: " + a); } - res.add(this.mf.global.newSConfig(efsms, queues)); + res.add(this.mf.global.SConfig(efsms, queues)); } return res; } @@ -222,7 +222,7 @@ else if (((a1.isClientWrap() && a2.isServerWrap()) { throw new RuntimeException("Shouldn't get in here: " + a1 + ", " + a2); } - res.add(this.mf.global.newSConfig(efsms, queues)); + res.add(this.mf.global.SConfig(efsms, queues)); } } return res; diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java index 75a57e37a..837965cd3 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraph.java @@ -38,7 +38,7 @@ public class SGraph implements MPrettyPrint private final Set> termSets; // Unlike EState, SGraph is not just a "simple wrapper" for an existing graph of nodes -- it is a computed structure, so no lightweight "toGraph" wrapper method; cf., EState - public SGraph(GProtoName proto, Map states, SState init) + protected SGraph(GProtoName proto, Map states, SState init) { this.proto = proto; this.init = init; diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index 8665a5d1f..84a8b858d 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -39,7 +39,7 @@ public class SGraphBuilder public SGraphBuilder(Core core) { this.core = core; - this.util = this.core.config.mf.global.newSGraphBuilderUtil(); + this.util = this.core.config.mf.global.SGraphBuilderUtil(); } // Do as an initial state rather than config? @@ -49,7 +49,7 @@ protected SConfig createInitConfig(Map egraphs, Map efsms = egraphs.entrySet().stream() .collect(Collectors.toMap(Entry::getKey, e -> e.getValue().toFsm())); SingleBuffers b0 = new SingleBuffers(efsms.keySet(), !explicit); - return this.core.config.mf.global.newSConfig(efsms, b0); + return this.core.config.mf.global.SConfig(efsms, b0); } // Factory method: not fully integrated with SGraph constructor because of Job arg (debug printing) @@ -120,7 +120,7 @@ else if (a.isAccept() || a.isRequest() || a.isClientWrap() } } - return this.core.config.mf.global.newSGraph(fullname, this.util.getStates(), + return this.core.config.mf.global.SGraph(fullname, this.util.getStates(), init); } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java index 3546f5d98..7a20160df 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilderUtil.java @@ -29,7 +29,7 @@ public class SGraphBuilderUtil { private Map states = new HashMap<>(); - public SGraphBuilderUtil(ModelFactory mf) + protected SGraphBuilderUtil(ModelFactory mf) { super(mf); reset(); @@ -43,7 +43,7 @@ protected void reset() public SState newState(SConfig c) { - SState s = this.mf.global.newSState(c); + SState s = this.mf.global.SState(c); this.states.put(c, s); return s; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index 8614f28e2..0f37dd389 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -39,7 +39,7 @@ public class SModel public final SGraph graph; - public SModel(SGraph graph) + protected SModel(SGraph graph) { this.graph = graph; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java index d249afcb9..70412dcbc 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java @@ -30,18 +30,20 @@ public interface SModelFactory { - SGraphBuilderUtil newSGraphBuilderUtil(); + SGraphBuilderUtil SGraphBuilderUtil(); - SState newSState(SConfig config); - SConfig newSConfig(Map state, SingleBuffers buffs); - SGraph newSGraph(GProtoName proto, Map states, SState init); // states: s.id -> s - SModel newSModel(SGraph g); + // protected constructors (MState mutable) + SState SState(SConfig config); + SConfig SConfig(Map state, SingleBuffers buffs); + SGraph SGraph(GProtoName proto, Map states, SState init); // states: s.id -> s + SModel SModel(SGraph g); - SSend newSSend(Role subj, Role obj, MsgId mid, Payload pay); - SRecv newSRecv(Role subj, Role obj, MsgId mid, Payload pay); - SReq newSReq(Role subj, Role obj, MsgId mid, Payload pay); - SAcc newSAcc(Role subj, Role obj, MsgId mid, Payload pay); - SDisconnect newSDisconnect(Role subj, Role obj); - SClientWrap newSClientWrap(Role subj, Role obj); - SServerWrap newSServerWrap(Role subj, Role obj); + // public constructors (subpackage, immutable) + SSend SSend(Role subj, Role obj, MsgId mid, Payload pay); + SRecv SRecv(Role subj, Role obj, MsgId mid, Payload pay); + SReq SReq(Role subj, Role obj, MsgId mid, Payload pay); + SAcc SAcc(Role subj, Role obj, MsgId mid, Payload pay); + SDisconnect SDisconnect(Role subj, Role obj); + SClientWrap SClientWrap(Role subj, Role obj); + SServerWrap SServerWrap(Role subj, Role obj); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java index 9a075e9f1..c8848d1b0 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java @@ -33,75 +33,75 @@ public class SModelFactoryImpl extends ModelFactoryImpl implements SModelFactory { @Override - public SGraphBuilderUtil newSGraphBuilderUtil() + public SGraphBuilderUtil SGraphBuilderUtil() { return new SGraphBuilderUtil(this.mf); } @Override - public SState newSState(SConfig config) + public SState SState(SConfig config) { return new SState(config); } // states: s.id -> s @Override - public SGraph newSGraph(GProtoName proto, Map states, + public SGraph SGraph(GProtoName proto, Map states, SState init) { return new SGraph(proto, states, init); } @Override - public SConfig newSConfig(Map state, SingleBuffers buffs) + public SConfig SConfig(Map state, SingleBuffers buffs) { return new SConfig(this.mf, state, buffs); } @Override - public SModel newSModel(SGraph g) + public SModel SModel(SGraph g) { return new SModel(g); } @Override - public SSend newSSend(Role subj, Role obj, MsgId mid, Payload pay) + public SSend SSend(Role subj, Role obj, MsgId mid, Payload pay) { return new SSend(subj, obj, mid, pay); } @Override - public SRecv newSRecv(Role subj, Role obj, MsgId mid, Payload pay) + public SRecv SRecv(Role subj, Role obj, MsgId mid, Payload pay) { return new SRecv(subj, obj, mid, pay); } @Override - public SReq newSReq(Role subj, Role obj, MsgId mid, Payload pay) + public SReq SReq(Role subj, Role obj, MsgId mid, Payload pay) { return new SReq(subj, obj, mid, pay); } @Override - public SAcc newSAcc(Role subj, Role obj, MsgId mid, Payload pay) + public SAcc SAcc(Role subj, Role obj, MsgId mid, Payload pay) { return new SAcc(subj, obj, mid, pay); } @Override - public SDisconnect newSDisconnect(Role subj, Role obj) + public SDisconnect SDisconnect(Role subj, Role obj) { return new SDisconnect(subj, obj); } @Override - public SClientWrap newSClientWrap(Role subj, Role obj) + public SClientWrap SClientWrap(Role subj, Role obj) { return new SClientWrap(subj, obj); } @Override - public SServerWrap newSServerWrap(Role subj, Role obj) + public SServerWrap SServerWrap(Role subj, Role obj) { return new SServerWrap(subj, obj); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java index 62f37a72e..45acc2211 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SState.java @@ -27,8 +27,7 @@ public class SState extends MPrettyState { public final SConfig config; - //protected - public SState(SConfig config) // FIXME? now publically mutable (for mf imple), same for EState + protected SState(SConfig config) // CHECKME? now publically mutable (for mf imple), same for EState { super(Collections.emptySet()); this.config = config; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 9d27002c3..8ee796204 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -59,7 +59,7 @@ public class EGraphBuilder extends STypeVisitorNoThrow public EGraphBuilder(Core core) { this.core = core; - this.util = core.config.mf.local.newEGraphBuilderUtil(); + this.util = core.config.mf.local.EGraphBuilderUtil(); } public EGraph finalise() @@ -176,11 +176,11 @@ public SType visitDirectedInteraction( ? ((SigLit) n.msg).payload : Payload.EMPTY_PAYLOAD; // TODO: add toAction method to BasicInteraction (cf. toName methods of NameNodes) - EAction a = (n instanceof LSend) ? this.util.mf.local.newESend(peer, mid, pay) - : (n instanceof LRecv) ? this.util.mf.local.newERecv(peer, mid, pay) - : (n instanceof LReq) ? this.util.mf.local.newEReq(peer, mid, pay) + EAction a = (n instanceof LSend) ? this.util.mf.local.ESend(peer, mid, pay) + : (n instanceof LRecv) ? this.util.mf.local.ERecv(peer, mid, pay) + : (n instanceof LReq) ? this.util.mf.local.EReq(peer, mid, pay) : //(n instanceof LAcc) ? - this.util.mf.local.newEAcc(peer, mid, pay); // Action type already checked above + this.util.mf.local.EAcc(peer, mid, pay); // Action type already checked above this.util.addEdge(this.util.getEntry(), a, this.util.getExit()); return n; } @@ -189,7 +189,7 @@ public SType visitDirectedInteraction( public SType visitDisconnect(DisconnectAction n) { Role peer = ((LDisconnect) n).getPeer(); // CHECKME -- ? - EAction a = this.util.mf.local.newEDisconnect(peer); // TODO: add toAction method to BasicInteraction + EAction a = this.util.mf.local.EDisconnect(peer); // TODO: add toAction method to BasicInteraction this.util.addEdge(this.util.getEntry(), a, this.util.getExit()); return n; } From ff75f1efd24be9878a9cbeb6fb0076d7b55efffc Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 27 Apr 2019 15:15:33 +0100 Subject: [PATCH 404/539] Continued. --- .../src/main/java/org/scribble/core/job/Core.java | 4 ++-- .../java/org/scribble/core/model/ModelFactory.java | 13 ++++++++----- .../org/scribble/core/model/ModelFactoryImpl.java | 8 +------- .../core/model/endpoint/EModelFactoryImpl.java | 7 +++++++ .../core/model/global/SModelFactoryImpl.java | 7 +++++++ 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 3575dbb4a..972193bd6 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -71,8 +71,8 @@ protected CoreConfig newCoreConfig(ModuleName mainFullname, // TODO: factor out factory methods STypeFactory tf = new STypeFactory(new GTypeFactoryImpl(), new LTypeFactoryImpl()); - ModelFactory mf = new ModelFactory(new EModelFactoryImpl(), - new SModelFactoryImpl()); + ModelFactory mf = new ModelFactory(EModelFactoryImpl::new, + SModelFactoryImpl::new); return new CoreConfig(mainFullname, args, tf, mf); // CHECKME: combine E/SModelFactory? } diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java index c0bf9ce61..d39c6ab6a 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactory.java @@ -13,6 +13,8 @@ */ package org.scribble.core.model; +import java.util.function.Function; + import org.scribble.core.model.endpoint.EModelFactory; import org.scribble.core.model.global.SModelFactory; @@ -21,11 +23,12 @@ public class ModelFactory public final EModelFactory local; public final SModelFactory global; - public ModelFactory(EModelFactory ef, SModelFactory sf) + // Args should be constructor refs that that ModelFactory single arg + // (Workaround to set mutually referential ModelFactory and E/SModelFactory final fields) + public ModelFactory(Function ef, + Function sf) { - this.local = ef; - ((ModelFactoryImpl) ef).setParent(this); // Must assign this.local first - this.global = sf; - ((ModelFactoryImpl) sf).setParent(this); // Must assign this.global first + this.local = ef.apply(this); + this.global = sf.apply(this); } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java index ce7eb0569..30e58c43d 100755 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java @@ -19,14 +19,8 @@ public abstract class ModelFactoryImpl { protected ModelFactory mf = null; - // Only for use from ModelFactory constructor - // Pre: mf.local/global == this - protected void setParent(ModelFactory mf) + public ModelFactoryImpl(ModelFactory mf) { - if (this.mf != null) - { - throw new RuntimeException("Incorrect usage: "); - } this.mf = mf; } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java index cf4354de8..e63854bce 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java @@ -15,6 +15,7 @@ import java.util.Set; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.ModelFactoryImpl; import org.scribble.core.model.endpoint.actions.EAcc; import org.scribble.core.model.endpoint.actions.EClientWrap; @@ -31,6 +32,12 @@ // Separate E/SModelFactories fits protected E/SState constructor pattern public class EModelFactoryImpl extends ModelFactoryImpl implements EModelFactory { + + public EModelFactoryImpl(ModelFactory mf) + { + super(mf); + } + @Override public EGraphBuilderUtil EGraphBuilderUtil() { diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java index c8848d1b0..e4846302a 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java @@ -15,6 +15,7 @@ import java.util.Map; +import org.scribble.core.model.ModelFactory; import org.scribble.core.model.ModelFactoryImpl; import org.scribble.core.model.endpoint.EFsm; import org.scribble.core.model.global.actions.SAcc; @@ -32,6 +33,12 @@ // Separate E/SModelFactories fits protected E/SState constructor pattern public class SModelFactoryImpl extends ModelFactoryImpl implements SModelFactory { + + public SModelFactoryImpl(ModelFactory mf) + { + super(mf); + } + @Override public SGraphBuilderUtil SGraphBuilderUtil() { From a73af2244c2f50ffbbcbe2b310c05ee0ca499cfc Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 27 Apr 2019 15:34:55 +0100 Subject: [PATCH 405/539] Continued. --- .../org/scribble/core/type/session/Seq.java | 72 +++++++++---------- .../org/scribble/core/visit/RecPruner.java | 2 +- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java index 2ac92bedf..f34f6125c 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java @@ -37,42 +37,6 @@ public Seq(CommonTree source, List> elems) public abstract B reconstruct(CommonTree source, List> elems); - /*@Override - public T aggregate(STypeAgg v) throws ScribException - { - @SuppressWarnings("unchecked") - B cast = (B) this; - return v.visitSeq(cast); - } - - @Override - public T aggregateNoEx(STypeAggNoEx v) - { - @SuppressWarnings("unchecked") - B cast = (B) this; - return v.visitSeq(cast); - } - - // Override STypeBase.visitWith for B return - // Alternatively: call v.visitSeq directly, bypasses generic cast - @Override - public B visitWith(STypeVisitor v) throws ScribException - { - @SuppressWarnings("unchecked") - B cast = (B) this; // CHECKME: OK as long as G/LSeq specify themselves as B param - return v.visitSeq(cast); - } - - // Override STypeBase.visitWithNoEx for B return - @Override - public B visitWithNoEx(STypeVisitorNoEx v) - { - @SuppressWarnings("unchecked") - B cast = (B) this; - return v.visitSeq(cast); - } - */ - @Override public Stream gather(Function, Stream> f) { @@ -235,4 +199,40 @@ public B pruneRecs() return reconstruct(getSource(), elems); } */ + + /*@Override + public T aggregate(STypeAgg v) throws ScribException + { + @SuppressWarnings("unchecked") + B cast = (B) this; + return v.visitSeq(cast); + } + + @Override + public T aggregateNoEx(STypeAggNoEx v) + { + @SuppressWarnings("unchecked") + B cast = (B) this; + return v.visitSeq(cast); + } + + // Override STypeBase.visitWith for B return + // Alternatively: call v.visitSeq directly, bypasses generic cast + @Override + public B visitWith(STypeVisitor v) throws ScribException + { + @SuppressWarnings("unchecked") + B cast = (B) this; // CHECKME: OK as long as G/LSeq specify themselves as B param + return v.visitSeq(cast); + } + + // Override STypeBase.visitWithNoEx for B return + @Override + public B visitWithNoEx(STypeVisitorNoEx v) + { + @SuppressWarnings("unchecked") + B cast = (B) this; + return v.visitSeq(cast); + } + */ } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java index db9592f36..ff55c69b4 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java @@ -61,7 +61,7 @@ public B visitSeq(B n) SType e1 = (SType) e.visitWithNoThrow(this); if (e1 instanceof Seq) // cf. visitRecursion (also cf. LSkip) { - elems.addAll(((Seq) e1).getElements()); // Handles empty Seq case + elems.addAll(((Seq) e1).elems);//getElements()); // Handles empty Seq case } else { From 7cd4c47732cdbf7a5c145bcd4cabcb3d8c0a8c23 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 27 Apr 2019 15:37:29 +0100 Subject: [PATCH 406/539] Minor. --- .../java/org/scribble/core/visit/global/GTypeInliner.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java index 48ec6f04e..8683653ea 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java @@ -21,8 +21,8 @@ import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.SType; import org.scribble.core.type.session.global.GSeq; -import org.scribble.core.type.session.global.GType; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.Substitutor; @@ -34,7 +34,8 @@ public GTypeInliner(Core core) } @Override - public > GType visitDo(Do n) + public > SType visitDo( + Do n) { GProtoName fullname = (GProtoName) n.proto; SubprotoSig sig = new SubprotoSig(fullname, n.roles, n.args); From 0bdf933dc6f16ce00b89f1d43a28dc0ddbda1510 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 14:29:18 +0100 Subject: [PATCH 407/539] Minor. --- .../src/main/java/org/scribble/core/lang/Protocol.java | 5 +++-- .../src/main/java/org/scribble/core/lang/SNode.java | 3 ++- .../src/main/java/org/scribble/core/lang/global/GNode.java | 3 ++- .../src/main/java/org/scribble/core/lang/local/LNode.java | 3 ++- .../src/main/java/org/scribble/core/type/session/SType.java | 2 +- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java index a53bc8521..2cb0835e2 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java @@ -30,8 +30,9 @@ import org.scribble.core.visit.STypeUnfolder; import org.scribble.util.Constants; -public abstract class Protocol, B extends Seq> - implements SNode +public abstract class Protocol + , B extends Seq> + implements SNode { private final CommonTree source; // CHECKME: factor out with SType(Base) ? diff --git a/scribble-core/src/main/java/org/scribble/core/lang/SNode.java b/scribble-core/src/main/java/org/scribble/core/lang/SNode.java index 04919b8ee..d0c5cfdec 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/SNode.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/SNode.java @@ -14,8 +14,9 @@ package org.scribble.core.lang; import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.type.kind.ProtoKind; -public interface SNode +public interface SNode { boolean hasSource(); // i.e., was parsed CommonTree getSource(); // Pre: hasSource diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GNode.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GNode.java index 80a9a602b..06ff9a5eb 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GNode.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GNode.java @@ -14,9 +14,10 @@ package org.scribble.core.lang.global; import org.scribble.core.lang.SNode; +import org.scribble.core.type.kind.Global; // Mainly for GDel.translate return (to include GProtocol) -public interface GNode extends SNode +public interface GNode extends SNode { } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LNode.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LNode.java index 97e536f95..33164fe2f 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LNode.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LNode.java @@ -14,8 +14,9 @@ package org.scribble.core.lang.local; import org.scribble.core.lang.SNode; +import org.scribble.core.type.kind.Local; -public interface LNode extends SNode +public interface LNode extends SNode { } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index dfc75444d..13280b84f 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -29,7 +29,7 @@ // However, the framework is mainly intended to be extended "horizontally" w.r.t. node types (additional types), and "vertically" (subclasses) for behaviour only via Visitors // In case of "vertical" extension of node types (e.g., additional node fields), still considering extension of Seq necessary less often public interface SType> - extends SNode + extends SNode { // N.B. visitWith should be considered a "top-level" entry point only // i.e., do not assume visitWith is called (or not) again during the recursive traversal From b44f7ef60b554b99bb9dd5d122f193f97d32c76b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 15:38:59 +0100 Subject: [PATCH 408/539] Minor. --- .../main/java/org/scribble/core/job/Core.java | 28 +++---- .../org/scribble/core/job/CoreContext.java | 75 ++++++++++--------- .../core/model/global/SGraphBuilder.java | 4 +- .../core/model/global/SModelFactory.java | 3 +- .../scribble/core/type/name/AbstractName.java | 15 +--- .../scribble/core/type/name/MemberName.java | 1 + .../org/scribble/core/type/name/Name.java | 15 ++-- .../org/scribble/core/type/name/QualName.java | 14 ++-- .../org/scribble/core/type/session/Do.java | 16 ++-- .../org/scribble/core/type/session/SType.java | 6 +- .../core/type/session/global/GDo.java | 17 +++-- .../type/session/global/GTypeFactory.java | 4 +- .../type/session/global/GTypeFactoryImpl.java | 4 +- .../scribble/core/type/session/local/LDo.java | 17 +++-- .../core/type/session/local/LTypeFactory.java | 4 +- .../type/session/local/LTypeFactoryImpl.java | 4 +- .../core/visit/NonProtoDepsGatherer.java | 8 +- .../core/visit/ProtoDepsCollector.java | 3 +- .../org/scribble/core/visit/STypeAgg.java | 4 +- .../scribble/core/visit/STypeAggNoThrow.java | 3 +- .../scribble/core/visit/STypeGatherer.java | 7 +- .../scribble/core/visit/STypeUnfolder.java | 3 +- .../org/scribble/core/visit/Substitutor.java | 5 +- .../core/visit/global/ConnectionChecker.java | 4 +- .../global/ExtChoiceConsistencyChecker.java | 4 +- .../core/visit/global/GTypeInliner.java | 6 +- .../core/visit/global/InlinedProjector.java | 11 ++- .../scribble/core/visit/global/Projector.java | 9 +-- .../visit/global/RoleEnablingChecker.java | 4 +- .../core/visit/local/EGraphBuilder.java | 4 +- .../local/InlinedExtChoiceSubjFixer.java | 7 +- .../core/visit/local/LTypeInliner.java | 5 +- .../core/visit/local/ReachabilityChecker.java | 4 +- .../visit/local/SingleContinueChecker.java | 3 +- 34 files changed, 152 insertions(+), 169 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 972193bd6..276ab080a 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -101,7 +101,7 @@ public void runPasses() throws ScribException protected void runSyntaxTransformPasses() // No ScribException, no errors expected { verbosePrintPass("Inlining subprotocols for all globals..."); - for (GProtoName fullname : this.context.getParsedFullnames()) + for (ProtoName fullname : this.context.getParsedFullnames()) { GProtocol inlined = this.context.getInlined(fullname); verbosePrintPass( @@ -109,7 +109,7 @@ protected void runSyntaxTransformPasses() // No ScribException, no errors expec } verbosePrintPass("Unfolding all recursions once for all inlined globals..."); - for (GProtoName fullname : this.context.getParsedFullnames()) + for (ProtoName fullname : this.context.getParsedFullnames()) { // TODO: currently, unfolded not actually stored by Context -- unfoldAllOnce repeated manually when needed, e.g., runSyntaxWfPasses GProtocol inlined = this.context.getInlined(fullname); @@ -126,7 +126,7 @@ protected void runSyntaxTransformPasses() // No ScribException, no errors expec protected void runProjectionPasses() // No ScribException, no errors expected { verbosePrintPass("Projecting all inlined globals..."); - for (GProtoName fullname : this.context.getParsedFullnames()) + for (ProtoName fullname : this.context.getParsedFullnames()) { GProtocol inlined = this.context.getInlined(fullname); for (Role self : inlined.roles) @@ -142,7 +142,7 @@ protected void runProjectionPasses() // No ScribException, no errors expected // Pre: inlined already projected -- used for Do projection verbosePrintPass("Projecting all intermediate globals..."); - for (GProtoName fullname : this.context.getParsedFullnames()) + for (ProtoName fullname : this.context.getParsedFullnames()) { GProtocol imed = this.context.getIntermediate(fullname); for (Role self : imed.roles) @@ -159,7 +159,7 @@ protected void runProjectionPasses() // No ScribException, no errors expected protected void runEfsmBuildingPasses() { verbosePrintPass("Building EFSMs for all projected inlineds..."); - for (GProtoName fullname : this.context.getParsedFullnames()) + for (ProtoName fullname : this.context.getParsedFullnames()) { GProtocol inlined = this.context.getInlined(fullname); for (Role self : inlined.roles) @@ -175,7 +175,7 @@ protected void runEfsmBuildingPasses() { verbosePrintPass( "Building \"unfair\" EFSMs for all projected inlineds..."); - for (GProtoName fullname : this.context.getParsedFullnames()) + for (ProtoName fullname : this.context.getParsedFullnames()) { GProtocol inlined = this.context.getInlined(fullname); for (Role self : inlined.roles) @@ -193,7 +193,7 @@ protected void runGlobalSyntaxWfPasses() throws ScribException { verbosePrintPass( "Checking for unused role decls on all inlined globals..."); - for (GProtoName fullname : this.context.getParsedFullnames()) + for (ProtoName fullname : this.context.getParsedFullnames()) { // CHECKME: relegate to "warning" ? -- some downsteam operations may depend on this though (e.g., graph building?) Set used = this.context.getInlined(fullname).def @@ -210,7 +210,7 @@ protected void runGlobalSyntaxWfPasses() throws ScribException } verbosePrintPass("Checking role enabling on all inlined globals..."); - for (GProtoName fullname : this.context.getParsedFullnames()) + for (ProtoName fullname : this.context.getParsedFullnames()) { GProtocol inlined = this.context.getInlined(fullname); if (inlined.isAux()) @@ -225,7 +225,7 @@ protected void runGlobalSyntaxWfPasses() throws ScribException verbosePrintPass( "Checking consistent external choice subjects on all inlined globals..."); - for (GProtoName fullname : this.context.getParsedFullnames()) + for (ProtoName fullname : this.context.getParsedFullnames()) { GProtocol inlined = this.context.getInlined(fullname); if (inlined.isAux()) @@ -237,7 +237,7 @@ protected void runGlobalSyntaxWfPasses() throws ScribException verbosePrintPass( "Checking connectedness on all inlined globals..."); - for (GProtoName fullname : this.context.getParsedFullnames()) + for (ProtoName fullname : this.context.getParsedFullnames()) { GProtocol inlined = this.context.getInlined(fullname); if (inlined.isAux()) @@ -254,7 +254,7 @@ protected void runGlobalSyntaxWfPasses() throws ScribException protected void runProjectionSyntaxWfPasses() throws ScribException { verbosePrintPass("Checking reachability on all projected inlineds..."); - for (GProtoName fullname : this.context.getParsedFullnames()) + for (ProtoName fullname : this.context.getParsedFullnames()) { GProtocol inlined = this.context.getInlined(fullname); if (inlined.isAux()) // CHECKME: also check for aux? e.g., bad.reach.globals.gdo.Test01b @@ -272,7 +272,7 @@ protected void runProjectionSyntaxWfPasses() throws ScribException protected void runLocalModelCheckingPasses() throws ScribException { verbosePrintPass("Checking non-deterministic messaging action payloads..."); - for (GProtoName fullname : this.context.getParsedFullnames()) + for (ProtoName fullname : this.context.getParsedFullnames()) { GProtocol inlined = this.context.getInlined(fullname); if (inlined.isAux()) // CHECKME: also check for aux? e.g., bad.reach.globals.gdo.Test01b @@ -291,7 +291,7 @@ protected void runGlobalModelCheckingPasses() throws ScribException { verbosePrintPass("Building and checking global models from projected inlineds..."); // CHECKME: separate and move model building earlier? // CHECKME: refactor more/whole validation into lang.GProtocol ? - for (GProtoName fullname : this.context.getParsedFullnames()) + for (ProtoName fullname : this.context.getParsedFullnames()) { if (this.context.getIntermediate(fullname).isAux()) { @@ -306,7 +306,7 @@ protected void runGlobalModelCheckingPasses() throws ScribException } } - protected void validateByScribble(GProtoName fullname, boolean fair) + protected void validateByScribble(ProtoName fullname, boolean fair) throws ScribException { SGraph graph = fair diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index d76f763e3..e1e77a1eb 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -26,8 +26,11 @@ import org.scribble.core.model.endpoint.EState; import org.scribble.core.model.global.SGraph; import org.scribble.core.model.global.SGraphBuilder; +import org.scribble.core.type.kind.Global; +import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.visit.global.GTypeInliner; import org.scribble.core.visit.global.InlinedProjector; @@ -47,30 +50,30 @@ public class CoreContext // "Directly" translated global protos, i.e., separate proto decls without any inlining/unfolding/etc // Protos retain original decl role list (and args) - private final Map imeds; // Keys are full names (though GProtocol already includes full name) + // Keys are full names (though GProtocol already includes full name) -- parameterised name mainly tracks back to Do.proto not being "specialised" + private final Map, GProtocol> imeds; // N.B. protos have pruned role decls -- CHECKME: prune args? - private final Map inlined = new HashMap<>(); // Keys are full names (though GProtocol already includes full name) + private final Map, GProtocol> inlined = new HashMap<>(); // Keys are full names // CHECKME: rename projis? - private final Map iprojs = new HashMap<>(); // Projected from inlined; keys are full names + private final Map, LProjection> iprojs = new HashMap<>(); // Projected from inlined; keys are full names // CHECKME: refactor to Job ? // Projected from intermediates - // LProtocolName is the full local protocol name (module name is the prefix) - // LProtocolName key is LProtocol value fullname (i.e., redundant) - private final Map projs = new HashMap<>(); + // LProtocolName is the full local protocol name (module name is the prefix) // LProtocolName key is LProtocol value fullname (i.e., redundant) + private final Map, LProjection> projs = new HashMap<>(); // FIXME: choice-subj fixing, do-pruning -- factor out to Job and do there via AstVisitor? -- make testing compare the two sides // Built from projected inlined - private final Map fEGraphs = new HashMap<>(); - private final Map uEGraphs = new HashMap<>(); - private final Map mEGraphs = new HashMap<>(); + private final Map, EGraph> fEGraphs = new HashMap<>(); + private final Map, EGraph> uEGraphs = new HashMap<>(); + private final Map, EGraph> mEGraphs = new HashMap<>(); // Toolchain currently depends on single instance of each graph (state id equality), e.g. cannot re-build or re-minimise, would not be the same graph instance // FIXME: currently only minimising "fair" graph, need to consider minimisation orthogonally to fairness -- NO: minimising (of fair) is for API gen only, unfair-transform does not use minimisation (regardless of user flag) for WF - private final Map fSGraphs = new HashMap<>(); - private final Map uSGraphs = new HashMap<>(); + private final Map, SGraph> fSGraphs = new HashMap<>(); + private final Map, SGraph> uSGraphs = new HashMap<>(); protected CoreContext(Core core, //Map modcs, Set imeds) @@ -83,7 +86,7 @@ protected CoreContext(Core core, //Map modcs, // Used by Core for pass running // Safer to return names and require user to get the target value by name, to make sure the value is created - public Set getParsedFullnames() + public Set> getParsedFullnames() { return this.imeds.keySet().stream().collect(Collectors.toSet()); } @@ -95,7 +98,7 @@ public Set getProjectedFullnames() return this.iprojs.keySet().stream().collect(Collectors.toSet()); }*/ - public GProtocol getIntermediate(GProtoName fullname) + public GProtocol getIntermediate(ProtoName fullname) { return this.imeds.get(fullname); } @@ -106,7 +109,7 @@ public Set getIntermediates() return this.imeds.values().stream().collect(Collectors.toSet()); }*/ - public GProtocol getInlined(GProtoName fullname) + public GProtocol getInlined(ProtoName fullname) { GProtocol inlined = this.inlined.get(fullname); if (inlined == null) @@ -118,7 +121,7 @@ public GProtocol getInlined(GProtoName fullname) return inlined; } - protected void addInlined(GProtoName fullname, GProtocol g) + protected void addInlined(ProtoName fullname, GProtocol g) { this.inlined.put(fullname, g); } @@ -130,9 +133,10 @@ public Set getInlineds() }*/ // Projected from inlined - public LProjection getProjectedInlined(GProtoName fullname, Role self) + public LProjection getProjectedInlined(ProtoName fullname, Role self) { - LProtoName projFullname = InlinedProjector.getFullProjectionName(fullname, self); + LProtoName projFullname = InlinedProjector.getFullProjectionName(fullname, + self); LProjection iproj = this.iprojs.get(projFullname); if (iproj == null) { @@ -180,7 +184,7 @@ public LProjection getProjection(GProtoName fullname, Role self) return proj; } - public LProjection getProjection(LProtoName fullname) + public LProjection getProjection(ProtoName fullname) { LProjection proj = this.projs.get(fullname); if (proj == null) @@ -197,7 +201,7 @@ protected void addProjection(LProjection proj) } // N.B. graphs built from inlined (not unfolded) - public EGraph getEGraph(GProtoName fullname, Role self) + public EGraph getEGraph(ProtoName fullname, Role self) { EGraph graph = this.fEGraphs.get(fullname); if (graph == null) @@ -209,13 +213,13 @@ public EGraph getEGraph(GProtoName fullname, Role self) return graph; } - protected void addEGraph(LProtoName fullname, EGraph graph) + protected void addEGraph(ProtoName fullname, EGraph graph) { this.fEGraphs.put(fullname, graph); } // Pre: Core.runSyntacticWfPasses - public EGraph getUnfairEGraph(GProtoName fullname, Role role) + public EGraph getUnfairEGraph(ProtoName fullname, Role role) { return getUnfairEGraph( InlinedProjector.getFullProjectionName(fullname, role)); @@ -223,7 +227,7 @@ public EGraph getUnfairEGraph(GProtoName fullname, Role role) // Pre: Core.runSyntacticWfPasses // Pre: getEGraph(Global, Role) -- currently (CHECKME: revise ?) - public EGraph getUnfairEGraph(LProtoName fullname) + public EGraph getUnfairEGraph(ProtoName fullname) { EGraph unfair = this.uEGraphs.get(fullname); if (unfair == null) @@ -242,26 +246,27 @@ public EGraph getUnfairEGraph(LProtoName fullname) return unfair; } - protected void addUnfairEGraph(LProtoName fullname, EGraph graph) + protected void addUnfairEGraph(ProtoName fullname, EGraph graph) { this.uEGraphs.put(fullname, graph); } - public SGraph getSGraph(GProtoName fullname) throws ScribException + public SGraph getSGraph(ProtoName fullname) throws ScribException { SGraph graph = this.fSGraphs.get(fullname); if (graph == null) { Map egraphs = getEGraphsForSGraphBuilding(fullname, true); boolean explicit = this.imeds.get(fullname).isExplicit(); - graph = new SGraphBuilder(this.core).build(fullname, egraphs, explicit); + GProtoName cast = (GProtoName) fullname; // Could also reconstruct if really needed + graph = new SGraphBuilder(this.core).build(egraphs, explicit, cast); addSGraph(fullname, graph); } return graph; } - private Map getEGraphsForSGraphBuilding(GProtoName fullname, - boolean fair) throws ScribException + private Map getEGraphsForSGraphBuilding( + ProtoName fullname, boolean fair) throws ScribException { Map egraphs = new HashMap<>(); for (Role self : this.imeds.get(fullname).roles) @@ -273,34 +278,34 @@ private Map getEGraphsForSGraphBuilding(GProtoName fullname, return egraphs; } - protected void addSGraph(GProtoName fullname, SGraph graph) + protected void addSGraph(ProtoName fullname, SGraph graph) { this.fSGraphs.put(fullname, graph); } - public SGraph getUnfairSGraph(GProtoName fullname) throws ScribException + public SGraph getUnfairSGraph(ProtoName fullname) throws ScribException { SGraph graph = this.uSGraphs.get(fullname); if (graph == null) { Map egraphs = getEGraphsForSGraphBuilding(fullname, false); boolean explicit = this.imeds.get(fullname).isExplicit(); - graph = new SGraphBuilder(this.core).build(fullname, egraphs, explicit); + GProtoName cast = (GProtoName) fullname; // Could also reconstruct if really needed + graph = new SGraphBuilder(this.core).build(egraphs, explicit, cast); addUnfairSGraph(fullname, graph); } return graph; } - protected void addUnfairSGraph(GProtoName fullname, SGraph graph) + protected void addUnfairSGraph(ProtoName fullname, SGraph graph) { this.uSGraphs.put(fullname, graph); } - public EGraph getMinimisedEGraph(GProtoName fullname, Role role) + public EGraph getMinimisedEGraph(ProtoName fullname, Role role) throws ScribException { - LProtoName fulllpn = InlinedProjector.getFullProjectionName(fullname, - role); + LProtoName fulllpn = InlinedProjector.getFullProjectionName(fullname, role); EGraph minimised = this.mEGraphs.get(fulllpn); if (minimised == null) @@ -313,7 +318,7 @@ public EGraph getMinimisedEGraph(GProtoName fullname, Role role) return minimised; } - protected void addMinimisedEGraph(LProtoName fullname, EGraph graph) + protected void addMinimisedEGraph(ProtoName fullname, EGraph graph) { this.mEGraphs.put(fullname, graph); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java index 84a8b858d..25f33a7e6 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SGraphBuilder.java @@ -55,8 +55,8 @@ protected SConfig createInitConfig(Map egraphs, // Factory method: not fully integrated with SGraph constructor because of Job arg (debug printing) // Also checks for non-deterministic payloads // Maybe refactor into an SGraph builder util; cf., EGraphBuilderUtil -- but not Visitor-based building (cf. EndpointGraphBuilder), this isn't an AST algorithm - public SGraph build(GProtoName fullname, Map egraphs, - boolean explicit) throws ScribException + public SGraph build(Map egraphs, boolean explicit, + GProtoName fullname) throws ScribException { this.util.reset(); diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java index 70412dcbc..2f81abc90 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactory.java @@ -35,7 +35,8 @@ public interface SModelFactory // protected constructors (MState mutable) SState SState(SConfig config); SConfig SConfig(Map state, SingleBuffers buffs); - SGraph SGraph(GProtoName proto, Map states, SState init); // states: s.id -> s + SGraph SGraph(GProtoName proto, Map states, + SState init); // states: s.id -> s SModel SModel(SGraph g); // public constructors (subpackage, immutable) diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/AbstractName.java b/scribble-core/src/main/java/org/scribble/core/type/name/AbstractName.java index ce446ad99..91964724d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/AbstractName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/AbstractName.java @@ -22,9 +22,9 @@ public abstract class AbstractName implements Name { private static final long serialVersionUID = 1L; - private K kind; // non-final for serialization + protected K kind; // non-final for serialization - private String[] elems; + protected String[] elems; protected AbstractName(K kind, String... elems) { @@ -50,22 +50,11 @@ public boolean isEmpty() return this.elems.length == 0; } - @Override - public boolean isPrefixed() - { - return this.elems.length > 1; - } - @Override public String[] getElements() { return Arrays.copyOf(this.elems, this.elems.length); } - @Override - public String[] getPrefixElements() - { - return Arrays.copyOfRange(this.elems, 0, this.elems.length - 1); - } // Not SimpleName so that e.g. ModuleName can return a simple ModuleName @Override diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/MemberName.java b/scribble-core/src/main/java/org/scribble/core/type/name/MemberName.java index 89a19da6f..4b2c240f9 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/MemberName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/MemberName.java @@ -31,6 +31,7 @@ public MemberName(K kind, String simplename) super(kind, Name.compileElements(ModuleName.EMPTY_MODULENAME.getElements(), simplename)); } + @Override public ModuleName getPrefix() { return new ModuleName(getPrefixElements()); diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/Name.java b/scribble-core/src/main/java/org/scribble/core/type/name/Name.java index b42e1ac49..2c103444a 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/Name.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/Name.java @@ -21,15 +21,14 @@ public interface Name extends Serializable { - public K getKind(); + K getKind(); - public int getElementCount(); - public boolean isEmpty(); - public boolean isPrefixed(); - - public String[] getElements(); - public String[] getPrefixElements(); - public String getLastElement(); + String[] getElements(); + int getElementCount(); + boolean isEmpty(); + String getLastElement(); + //boolean isPrefixed(); + //String[] getPrefixElements(); static String[] compileElements(String[] cn, String n) { diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/QualName.java b/scribble-core/src/main/java/org/scribble/core/type/name/QualName.java index f60c6d56a..e071d7c35 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/QualName.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/QualName.java @@ -13,6 +13,8 @@ */ package org.scribble.core.type.name; +import java.util.Arrays; + import org.scribble.core.type.kind.Kind; @@ -26,16 +28,16 @@ public QualName(K kind, String... elems) super(kind, elems); } - @Override - public boolean isEmpty() + //@Override + public boolean isPrefixed() { - return super.isEmpty(); + return this.elems.length > 1; } - @Override - public boolean isPrefixed() + //@Override + public String[] getPrefixElements() { - return super.isPrefixed(); + return Arrays.copyOfRange(this.elems, 0, this.elems.length - 1); } // Also done by Scope diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java index a8828bb29..7f87793bb 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java @@ -28,16 +28,15 @@ import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.util.ScribException; -public abstract class Do - , N extends ProtoName> +public abstract class Do> extends STypeBase { - public final N proto; // Currently disamb'd to fullname by GTypeTranslator (see GDoDel::translate) + public final ProtoName proto; // Currently disamb'd to fullname by GTypeTranslator (see GDoDel::translate) public final List roles; // Ordered role args; pre: size > 2 public final List> args; // NonRoleParamKind, not NonRoleArgKind, because latter includes AmbigKind due to parsing requirements - public Do(CommonTree source, N proto, + public Do(CommonTree source, ProtoName proto, List roles, List> args) { super(source); @@ -46,8 +45,11 @@ public Do(CommonTree source, N proto, this.args = Collections.unmodifiableList(args); } - public abstract Do reconstruct(CommonTree source, - N proto, List roles, List> args); + /*// Not that useful: calling on Do doesn't give the overridden return + public abstract ProtoName getProto(); // Override with concrete return*/ + + public abstract Do reconstruct(CommonTree source, + ProtoName proto, List roles, List> args); @Override public T visitWith(STypeAgg v) throws ScribException @@ -102,7 +104,7 @@ public boolean equals(Object o) { return false; } - Do them = (Do) o; + Do them = (Do) o; return super.equals(this) // Does canEquals && this.proto.equals(them.proto) && this.roles.equals(them.roles) && this.args.equals(them.args); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index 13280b84f..72ef3f1ad 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -23,11 +23,11 @@ import org.scribble.util.ScribException; -// B needed(?) to factor up several methods from G/L compounds to bases, e.g., getInlined and unfoldAllOnce -// Generic works to "specialise" G/L subclasses (and works with immutable pattern) -- cf. not supported by contravariant method parameter subtyping for getters/setters +// B used (needed?) to factor up several methods from G/L compounds to bases, e.g., getInlined and unfoldAllOnce +// Generic param works to "specialise" G/L subclasses (and works with immutable pattern) -- cf. not supported by contravariant method parameter subtyping for getters/setters // N.B. Taking G/LSeq as the B param "limits" the "cast-freeness" of this hierarchy at this point -- i.e., potential G/LSeq subclasses would be beyond that point // However, the framework is mainly intended to be extended "horizontally" w.r.t. node types (additional types), and "vertically" (subclasses) for behaviour only via Visitors -// In case of "vertical" extension of node types (e.g., additional node fields), still considering extension of Seq necessary less often +// In case of "vertical" extension of node types (e.g., additional node fields), still consider that extension of Seq is less often necessary public interface SType> extends SNode { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java index 1b6ea3a23..ffc178a2c 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java @@ -18,14 +18,14 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Do; -public class GDo extends Do implements GType +public class GDo extends Do implements GType { - protected GDo(CommonTree source, GProtoName proto, + protected GDo(CommonTree source, ProtoName proto, List roles, List> args) { super(source, proto, roles, args); @@ -33,7 +33,7 @@ protected GDo(CommonTree source, GProtoName proto, @Override public GDo reconstruct(CommonTree source, - GProtoName proto, List roles, + ProtoName proto, List roles, List> args) { return new GDo(source, proto, roles, args); @@ -86,7 +86,14 @@ public boolean canEquals(Object o) - /*// CHECKME: factor up to base? + /* + @Override + public GProtoName getProto() + { + return (GProtoName) this.proto; + } + + // CHECKME: factor up to base? @Override public GType getInlined(STypeInliner v) { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactory.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactory.java index d95dcfea2..8a88d3114 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactory.java @@ -5,7 +5,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; @@ -23,7 +23,7 @@ public interface GTypeFactory GDisconnect GDisconnect(CommonTree source, Role left, Role right); - GDo GDo(CommonTree source, GProtoName proto, List roles, + GDo GDo(CommonTree source, ProtoName proto, List roles, List> args); GMessageTransfer GMessageTransfer(CommonTree source, Role src, Msg msg, diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactoryImpl.java index 578c3b631..8197b753d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactoryImpl.java @@ -5,7 +5,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; @@ -40,7 +40,7 @@ public GDisconnect GDisconnect(CommonTree source, Role left, Role right) } @Override - public GDo GDo(CommonTree source, GProtoName proto, List roles, + public GDo GDo(CommonTree source, ProtoName proto, List roles, List> args) { return new GDo(source, proto, roles, args); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java index 09abd7536..da6f86721 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java @@ -18,14 +18,14 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.LProtoName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Do; -public class LDo extends Do implements LType +public class LDo extends Do implements LType { - protected LDo(CommonTree source, LProtoName proto, + protected LDo(CommonTree source, ProtoName proto, List roles, List> args) { super(source, proto, roles, args); @@ -33,7 +33,7 @@ protected LDo(CommonTree source, LProtoName proto, @Override public LDo reconstruct(CommonTree source, - LProtoName proto, List roles, + ProtoName proto, List roles, List> args) { return new LDo(source, proto, roles, args); @@ -77,7 +77,14 @@ public boolean canEquals(Object o) - /*// CHECKME: factor up to base? + /* + @Override + public LProtoName getProto() + { + return (LProtoName) this.proto; + } + + // CHECKME: factor up to base? @Override public LType getInlined(STypeInliner v) { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactory.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactory.java index 394d262ea..292a2e9a5 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactory.java @@ -5,7 +5,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.LProtoName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; @@ -23,7 +23,7 @@ public interface LTypeFactory LDisconnect LDisconnect(CommonTree source, Role peer); - LDo LDo(CommonTree source, LProtoName proto, List roles, + LDo LDo(CommonTree source, ProtoName proto, List roles, List> args); LRecursion LRecursion(CommonTree source, RecVar recvar, LSeq body); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactoryImpl.java index 8510ac2b3..60b355f4b 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactoryImpl.java @@ -5,7 +5,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.LProtoName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; @@ -40,7 +40,7 @@ public LDisconnect LDisconnect(CommonTree source, Role peer) } @Override - public LDo LDo(CommonTree source, LProtoName proto, List roles, + public LDo LDo(CommonTree source, ProtoName proto, List roles, List> args) { return new LDo(source, proto, roles, args); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java index 6160e8d37..03c4c7e4c 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java @@ -21,16 +21,15 @@ import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GDelegType; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.PayElemType; -import org.scribble.core.type.name.ProtoName; +import org.scribble.core.type.name.SigName; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.ConnectAction; import org.scribble.core.type.session.DirectedInteraction; import org.scribble.core.type.session.Do; -import org.scribble.core.type.session.SigLit; import org.scribble.core.type.session.Payload; import org.scribble.core.type.session.Seq; +import org.scribble.core.type.session.SigLit; // Result should not contain duplicates (i.e., due to Choice/Seq) @@ -88,8 +87,7 @@ else if (p.isGDelegationType()) // TODO FIXME: should be projected to local nam } @Override - public > Stream> visitDo( - Do n) + public Stream> visitDo(Do n) { return n.args.stream() .filter(x -> (x instanceof SigLit) || (x instanceof DataName)) // CHECKME: refactor? diff --git a/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java index 605af2bba..1040bde36 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java @@ -40,8 +40,7 @@ public Stream> visitSeq(Seq n) } @Override - public > Stream> visitDo( - Do n) + public Stream> visitDo(Do n) { return Stream.of(n.proto); // Should be full names } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java index e344a670d..27fe1e1bf 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAgg.java @@ -18,7 +18,6 @@ import java.util.stream.Stream; import org.scribble.core.type.kind.ProtoKind; -import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.DirectedInteraction; @@ -66,8 +65,7 @@ public T visitDisconnect(DisconnectAction n) throws ScribException return unit(n); } - public > T visitDo(Do n) - throws ScribException + public T visitDo(Do n) throws ScribException { return unit(n); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java index fb0f49480..81b5a84ba 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java @@ -16,7 +16,6 @@ import java.util.stream.Stream; import org.scribble.core.type.kind.ProtoKind; -import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.DirectedInteraction; @@ -59,7 +58,7 @@ public T visitDisconnect(DisconnectAction n) return unit(n); } - public > T visitDo(Do n) + public T visitDo(Do n) { return unit(n); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java index 917d5ab6e..8e46befd8 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java @@ -17,7 +17,6 @@ import java.util.stream.Stream; import org.scribble.core.type.kind.ProtoKind; -import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.DirectedInteraction; @@ -51,8 +50,8 @@ protected Optional> typeSwitch(SType n) ? Optional.of(visitContinue((Continue) n)) : (n instanceof Recursion) ? Optional.of(visitRecursion((Recursion) n)) - : (n instanceof Do) - ? Optional.of(this.visitDo((Do) n)) // FIXME: since we know K, we should know ? extends ProtocolName ? + : (n instanceof Do) + ? Optional.of(this.visitDo((Do) n)) : Optional.empty(); // Better for extensibility than "manually" throwing Exception (e.g., for overriding) } @@ -79,7 +78,7 @@ public Stream visitDisconnect(DisconnectAction n) return Stream.of(); } - public > Stream visitDo(Do n) + public Stream visitDo(Do n) { return Stream.of(); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java index 7b1f33248..61b0d0742 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java @@ -20,7 +20,6 @@ import org.scribble.core.job.Core; import org.scribble.core.type.kind.ProtoKind; -import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Do; import org.scribble.core.type.session.Recursion; @@ -41,7 +40,7 @@ public STypeUnfolder(Core core) } @Override - public final > SType visitDo(Do n) + public final SType visitDo(Do n) { throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java index 68ef47e12..125b14278 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java @@ -21,9 +21,8 @@ import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.SigName; -import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.Substitutions; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Choice; @@ -78,7 +77,7 @@ public SType visitDisconnect(DisconnectAction n) } @Override - public > SType visitDo(Do n) + public SType visitDo(Do n) { List roles = n.roles.stream().map(x -> this.subs.subsRole(x)) .collect(Collectors.toList()); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/ConnectionChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/ConnectionChecker.java index 58d917d02..6805914fc 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/ConnectionChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/ConnectionChecker.java @@ -23,7 +23,6 @@ import java.util.stream.Stream; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.ConnectAction; @@ -126,8 +125,7 @@ public SType visitDisconnect(DisconnectAction n) } @Override - public final > SType visitDo( - Do n) throws ScribException + public final SType visitDo(Do n) throws ScribException { throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java index 8a7ba136f..58b708569 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java @@ -24,7 +24,6 @@ import java.util.stream.Stream; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.DirectedInteraction; @@ -99,8 +98,7 @@ public SType visitDirectedInteraction( } @Override - public final > SType visitDo( - Do n) throws ScribException + public final SType visitDo(Do n) throws ScribException { throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java index 8683653ea..69480e48e 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java @@ -17,7 +17,6 @@ import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Do; @@ -34,10 +33,9 @@ public GTypeInliner(Core core) } @Override - public > SType visitDo( - Do n) + public SType visitDo(Do n) { - GProtoName fullname = (GProtoName) n.proto; + ProtoName fullname = n.proto; SubprotoSig sig = new SubprotoSig(fullname, n.roles, n.args); RecVar rv = getInlinedRecVar(sig); if (hasSig(sig)) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index edfcd2039..e9f0dc9ea 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -23,7 +23,6 @@ import org.scribble.core.job.Core; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.ProtoName; @@ -155,7 +154,7 @@ public LType visitDisconnect(DisconnectAction n) } @Override - public > LType visitDo(Do n) + public LType visitDo(Do n) { throw new RuntimeException("Unsupported for Do: " + n + " ,, " + this.getClass()); } @@ -208,17 +207,17 @@ public LSeq visitSeq(GSeq n) } // CHECKME: relocate? - public static LProtoName getSimpledProjectionName(GProtoName simpname, + public static LProtoName getSimpledProjectionName(ProtoName simpname, Role role) { return new LProtoName(simpname.toString() + "_" + role.toString()); } // Role is the target subprotocol parameter (not the current projector self -- actually the self just popped) -- ? - public static LProtoName getFullProjectionName(GProtoName fullname, + public static LProtoName getFullProjectionName(ProtoName fullname, Role role) { - LProtoName simplename = InlinedProjector.getSimpledProjectionName( + ProtoName simplename = InlinedProjector.getSimpledProjectionName( fullname.getSimpleName(), role); ModuleName modname = getProjectionModuleName(fullname.getPrefix(), simplename); @@ -227,7 +226,7 @@ public static LProtoName getFullProjectionName(GProtoName fullname, // fullname is the un-projected name; localname is the already projected simple name public static ModuleName getProjectionModuleName(ModuleName fullname, - LProtoName localname) + ProtoName localname) { ModuleName simpname = new ModuleName( fullname.getSimpleName().toString() + "_" + localname.toString()); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java index ba9bd276c..ca703431b 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java @@ -21,7 +21,6 @@ import org.scribble.core.job.CoreContext; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; @@ -52,7 +51,7 @@ protected Projector dup() } @Override - public > LType visitDo(Do n) + public LType visitDo(Do n) { if (!n.roles.contains(this.self)) { @@ -60,11 +59,9 @@ public > LType visitDo(Do n) } CoreContext corec = this.core.getContext(); - GProtoName proto = (GProtoName) n.proto; - GProtocol gpd = corec.getIntermediate(proto); - Role targSelf = gpd.roles.get(n.roles.indexOf(this.self)); - + ProtoName proto = n.proto; GProtocol imed = corec.getIntermediate(proto); + Role targSelf = imed.roles.get(n.roles.indexOf(this.self)); if (!imed.roles.contains(targSelf)) // CHECKME: because roles already pruned for intermed decl? { return LSkip.SKIP; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java index 0083a6ac9..83713d59e 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java @@ -22,7 +22,6 @@ import java.util.stream.Stream; import org.scribble.core.type.kind.Global; -import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.DirectedInteraction; @@ -90,8 +89,7 @@ public SType visitDirectedInteraction( } @Override - public final > SType visitDo( - Do n) throws ScribException + public final SType visitDo(Do n) throws ScribException { throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 8ee796204..fc321608f 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -25,7 +25,6 @@ import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.MsgId; -import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Continue; @@ -195,8 +194,7 @@ public SType visitDisconnect(DisconnectAction n) } @Override - public final > SType visitDo( - Do n) + public final SType visitDo(Do n) { throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java index 76a530ade..7312589e8 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java @@ -23,7 +23,6 @@ import java.util.stream.Stream; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; @@ -53,8 +52,7 @@ public Choice visitChoice(Choice n) } @Override - public > SType visitDo( - Do n) + public SType visitDo(Do n) { throw new RuntimeException("Unsupported for Do: " + n); } @@ -117,8 +115,7 @@ public Optional visitDirectedInteraction( } @Override - public > Optional visitDo( - Do n) + public Optional visitDo(Do n) { throw new RuntimeException("Unsupported for Do: " + n); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java index 1c8b0c13b..c803ce2b7 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java @@ -17,7 +17,6 @@ import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.local.LProtocol; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Do; @@ -34,9 +33,9 @@ public LTypeInliner(Core core) } @Override - public > LType visitDo(Do n) + public LType visitDo(Do n) { - LProtoName fullname = (LProtoName) n.proto; + ProtoName fullname = n.proto; SubprotoSig sig = new SubprotoSig(fullname, n.roles, n.args); RecVar rv = getInlinedRecVar(sig); if (hasSig(sig)) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java index 143f6a749..17e3a3098 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java @@ -22,7 +22,6 @@ import java.util.stream.Collectors; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Continue; @@ -74,8 +73,7 @@ public SType visitContinue(Continue n) throws ScribExc } @Override - public final > SType visitDo( - Do n) throws ScribException + public final SType visitDo(Do n) throws ScribException { throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java index e232b943b..f0063955b 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java @@ -19,7 +19,6 @@ import java.util.stream.Stream; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.Continue; import org.scribble.core.type.session.Do; @@ -59,7 +58,7 @@ public Boolean visitContinue(Continue n) } @Override - public > Boolean visitDo(Do n) + public Boolean visitDo(Do n) { //return (Boolean) InlinedVisitor1.super.visitDo(n); //return (Boolean) super.visitDo(n); // CHECKME: resolves to the extends super, even with a default i/f implementation ? From a416879728d2337e2453c50fed11194b8f3f5038 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 16:04:43 +0100 Subject: [PATCH 409/539] Minor. --- .../org/scribble/core/lang/global/GProtocol.java | 2 +- .../org/scribble/core/type/session/SType.java | 6 +++--- .../java/org/scribble/core/type/session/Seq.java | 2 +- .../core/type/session/global/GConnect.java | 4 +--- .../type/session/global/GMessageTransfer.java | 6 ++---- .../core/type/session/global/GRecursion.java | 3 +-- .../scribble/core/type/session/global/GSeq.java | 14 +++++++++++--- .../core/type/session/global/GTypeFactory.java | 3 +-- .../type/session/global/GTypeFactoryImpl.java | 3 +-- .../scribble/core/type/session/local/LSeq.java | 15 ++++++++++++--- .../core/type/session/local/LTypeFactory.java | 3 +-- .../core/type/session/local/LTypeFactoryImpl.java | 3 +-- 12 files changed, 36 insertions(+), 28 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index a2849c682..5d5ca1023 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -175,7 +175,7 @@ else if (n instanceof SigName) @Override public GProtocol unfoldAllOnce(STypeUnfolder v) { - GSeq unf = (GSeq) this.def.visitWithNoThrow(v); + GSeq unf = v.visitSeq(this.def); return reconstruct(getSource(), this.mods, this.fullname, this.roles, this.params, unf); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java index 72ef3f1ad..54a29ef0d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/SType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/SType.java @@ -31,9 +31,9 @@ public interface SType> extends SNode { - // N.B. visitWith should be considered a "top-level" entry point only - // i.e., do not assume visitWith is called (or not) again during the recursive traversal - // (Typically, visitWith is called enroute to each visitNode, except for Seq, which is "entered directly" via visitSeq due to a generic typing issue) + // N.B. visitWith should be considered a "top-level" entry point only, i.e., do not assume visitWith is called (or not) again during the recursive traversal + // (visitWith may be called enroute to each visitNode, except for Seq, which is "entered directly" via visitSeq due to its generic typing) + // (However, visitWith is used by Seq to visit its elems -- main point of visitWith is to be agnostic to node type) T visitWith(STypeAgg v) throws ScribException; T visitWithNoThrow(STypeAggNoThrow v); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java index f34f6125c..12714f118 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Seq.java @@ -26,7 +26,7 @@ public abstract class Seq> extends STypeBase { // GType or LType -- could make SType subclasses take themself as another param, but not worth it - public final List> elems; + public final List> elems; public Seq(CommonTree source, List> elems) { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java index d5540ba95..eb557751f 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GConnect.java @@ -30,9 +30,7 @@ protected GConnect(CommonTree source, // DirectedInteraction not ideal (impreci } @Override - public GConnect reconstruct( - CommonTree source, Msg msg, Role src, - Role dst) + public GConnect reconstruct(CommonTree source, Msg msg, Role src, Role dst) { return new GConnect(source, src, msg, dst); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java index a40ff445e..d9f3b3d98 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GMessageTransfer.java @@ -23,15 +23,13 @@ public class GMessageTransfer extends MsgTransfer implements GType { - protected GMessageTransfer(CommonTree source, - Role src, Msg msg, Role dst) + protected GMessageTransfer(CommonTree source, Role src, Msg msg, Role dst) { super(source, msg, src, dst); } @Override - public GMessageTransfer reconstruct( - CommonTree source, Msg msg, Role src, + public GMessageTransfer reconstruct(CommonTree source, Msg msg, Role src, Role dst) { return new GMessageTransfer(source, src, msg, dst); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java index 2682a99da..52c151bb5 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GRecursion.java @@ -27,8 +27,7 @@ protected GRecursion(CommonTree source, // Due to inlining, protocoldecl -> rec } @Override - public GRecursion reconstruct(CommonTree source, - RecVar recvar, GSeq block) + public GRecursion reconstruct(CommonTree source, RecVar recvar, GSeq block) { return new GRecursion(source, recvar, block); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java index 631cb204f..22aa131fe 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GSeq.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Global; @@ -26,7 +27,7 @@ public class GSeq extends Seq implements GType { - protected GSeq(CommonTree source, List> elems) + protected GSeq(CommonTree source, List elems) { super(source, elems); } @@ -35,7 +36,14 @@ protected GSeq(CommonTree source, List> elems) public GSeq reconstruct(CommonTree source, List> elems) { - return new GSeq(source, elems); + return new GSeq(source, + castElems(elems.stream()).collect(Collectors.toList())); + } + + protected static Stream castElems( + Stream> elems) + { + return elems.map(x -> (GType) x); } @Override @@ -53,7 +61,7 @@ public T visitWithNoThrow(STypeAggNoThrow v) @Override public List getElements() { - return this.elems.stream().map(x -> (GType) x).collect(Collectors.toList()); + return castElems(this.elems.stream()).collect(Collectors.toList()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactory.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactory.java index 8a88d3114..e9b6d1971 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactory.java @@ -10,7 +10,6 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Msg; -import org.scribble.core.type.session.SType; public interface GTypeFactory { @@ -31,6 +30,6 @@ GMessageTransfer GMessageTransfer(CommonTree source, Role src, Msg msg, GRecursion GRecursion(CommonTree source, RecVar recvar, GSeq body); - GSeq GSeq(CommonTree source, List> elems); + GSeq GSeq(CommonTree source, List elems); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactoryImpl.java index 8197b753d..91ac03ec6 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactoryImpl.java @@ -10,7 +10,6 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Msg; -import org.scribble.core.type.session.SType; public class GTypeFactoryImpl implements GTypeFactory { @@ -60,7 +59,7 @@ public GRecursion GRecursion(CommonTree source, RecVar recvar, GSeq body) } @Override - public GSeq GSeq(CommonTree source, List> elems) + public GSeq GSeq(CommonTree source, List elems) { return new GSeq(source, elems); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java index 632a19f98..1fb2eaf99 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LSeq.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.type.kind.Local; @@ -27,7 +28,8 @@ public class LSeq extends Seq implements LType { // GInteractionSeq or GBlock better as source? - protected LSeq(CommonTree source, List> elems) + //protected LSeq(CommonTree source, List> elems) + protected LSeq(CommonTree source, List elems) { super(source, elems); } @@ -36,7 +38,14 @@ protected LSeq(CommonTree source, List> elems) public LSeq reconstruct(CommonTree source, List> elems) { - return new LSeq(source, elems); + return new LSeq(source, + castElems(elems.stream()).collect(Collectors.toList())); + } + + protected static Stream castElems( + Stream> elems) + { + return elems.map(x -> (LType) x); } @Override @@ -54,7 +63,7 @@ public T visitWithNoThrow(STypeAggNoThrow v) @Override public List getElements() { - return this.elems.stream().map(x -> (LType) x).collect(Collectors.toList()); + return castElems(this.elems.stream()).collect(Collectors.toList()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactory.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactory.java index 292a2e9a5..1ef1aa685 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactory.java @@ -10,7 +10,6 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Msg; -import org.scribble.core.type.session.SType; public interface LTypeFactory { @@ -34,5 +33,5 @@ LDo LDo(CommonTree source, ProtoName proto, List roles, LSend LSend(CommonTree source, Msg msg, Role dst); - LSeq LSeq(CommonTree source, List> elems); + LSeq LSeq(CommonTree source, List elems); } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactoryImpl.java index 60b355f4b..ac6faa08f 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactoryImpl.java @@ -10,7 +10,6 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Msg; -import org.scribble.core.type.session.SType; public class LTypeFactoryImpl implements LTypeFactory { @@ -72,7 +71,7 @@ public LSend LSend(CommonTree source, Msg msg, } @Override - public LSeq LSeq(CommonTree source, List> elems) + public LSeq LSeq(CommonTree source, List elems) { return new LSeq(source, elems); } From 24d1a66420c2c626a9f48dc346192508c69cad5d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 16:42:24 +0100 Subject: [PATCH 410/539] Refactored CoreContext unfoldings. --- .../java/sessionapi/SessionApiGenerator.java | 2 +- .../main/java/org/scribble/core/job/Core.java | 25 ++++++++----------- .../org/scribble/core/job/CoreContext.java | 23 ++++++++++++++++- .../scribble/core/lang/global/GProtocol.java | 2 +- .../core/visit/ProtoDepsCollector.java | 1 + .../org/scribble/core/visit/RecPruner.java | 1 + .../scribble/core/visit/STypeUnfolder.java | 2 +- .../visit/{ => gather}/MessageIdGatherer.java | 2 +- .../{ => gather}/NonProtoDepsGatherer.java | 2 +- .../visit/{ => gather}/RecVarGatherer.java | 2 +- .../core/visit/{ => gather}/RoleGatherer.java | 2 +- .../visit/{ => gather}/STypeGatherer.java | 2 +- scribble-test/src/test/scrib/tmp/Test.scr | 3 ++- 13 files changed, 44 insertions(+), 25 deletions(-) rename scribble-core/src/main/java/org/scribble/core/visit/{ => gather}/MessageIdGatherer.java (96%) rename scribble-core/src/main/java/org/scribble/core/visit/{ => gather}/NonProtoDepsGatherer.java (98%) rename scribble-core/src/main/java/org/scribble/core/visit/{ => gather}/RecVarGatherer.java (96%) rename scribble-core/src/main/java/org/scribble/core/visit/{ => gather}/RoleGatherer.java (97%) rename scribble-core/src/main/java/org/scribble/core/visit/{ => gather}/STypeGatherer.java (98%) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index 77be6d366..d7c912554 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -33,7 +33,7 @@ import org.scribble.core.type.name.MsgId; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.global.GSeq; -import org.scribble.core.visit.MessageIdGatherer; +import org.scribble.core.visit.gather.MessageIdGatherer; import org.scribble.job.Job; import org.scribble.util.ScribException; diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 276ab080a..1ca0e3ecf 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -42,10 +42,9 @@ import org.scribble.core.type.session.global.GTypeFactoryImpl; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LTypeFactoryImpl; -import org.scribble.core.visit.NonProtoDepsGatherer; import org.scribble.core.visit.ProtoDepsCollector; -import org.scribble.core.visit.RoleGatherer; -import org.scribble.core.visit.global.GTypeUnfolder; +import org.scribble.core.visit.gather.NonProtoDepsGatherer; +import org.scribble.core.visit.gather.RoleGatherer; import org.scribble.util.ScribException; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models @@ -112,11 +111,9 @@ protected void runSyntaxTransformPasses() // No ScribException, no errors expec for (ProtoName fullname : this.context.getParsedFullnames()) { // TODO: currently, unfolded not actually stored by Context -- unfoldAllOnce repeated manually when needed, e.g., runSyntaxWfPasses - GProtocol inlined = this.context.getInlined(fullname); - GTypeUnfolder v = new GTypeUnfolder(this); - GProtocol unf = (GProtocol) inlined.unfoldAllOnce(v);//.unfoldAllOnce(unf2); // CHECKME: twice unfolding? instead of "unguarded"-unfolding? + GProtocol unf = this.context.getOnceUnfolded(fullname); // CHECKME: twice unfolding? instead of "unguarded"-unfolding? verbosePrintPass( - "Unfolded all recursions once: " + inlined.fullname + "\n" + unf); + "Unfolded all recursions once: " + unf.fullname + "\n" + unf); } } @@ -212,14 +209,13 @@ protected void runGlobalSyntaxWfPasses() throws ScribException verbosePrintPass("Checking role enabling on all inlined globals..."); for (ProtoName fullname : this.context.getParsedFullnames()) { - GProtocol inlined = this.context.getInlined(fullname); - if (inlined.isAux()) + GProtocol unf = this.context.getOnceUnfolded(fullname); + if (unf.isAux()) { continue; } - GTypeUnfolder v = new GTypeUnfolder(this); + unf.checkRoleEnabling(); //e.g., C->D captured under an A->B choice after unfolding, cf. bad.wfchoice.enabling.twoparty.Test01b; - inlined.unfoldAllOnce(v).checkRoleEnabling(); // TODO: get unfolded from Context } @@ -239,14 +235,13 @@ protected void runGlobalSyntaxWfPasses() throws ScribException "Checking connectedness on all inlined globals..."); for (ProtoName fullname : this.context.getParsedFullnames()) { - GProtocol inlined = this.context.getInlined(fullname); - if (inlined.isAux()) + GProtocol unf = this.context.getOnceUnfolded(fullname); + if (unf.isAux()) { continue; } - GTypeUnfolder v = new GTypeUnfolder(this); // FIXME: record unfoldings in Context (factor out with role enabling) + unf.checkConnectedness(!unf.isExplicit()); //e.g., rec X { connect A to B; continue X; } - inlined.unfoldAllOnce(v).checkConnectedness(!inlined.isExplicit()); } } diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index e1e77a1eb..0e49c61e1 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -33,6 +33,7 @@ import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.visit.global.GTypeInliner; +import org.scribble.core.visit.global.GTypeUnfolder; import org.scribble.core.visit.global.InlinedProjector; import org.scribble.util.Pair; import org.scribble.util.ScribException; @@ -54,7 +55,10 @@ public class CoreContext private final Map, GProtocol> imeds; // N.B. protos have pruned role decls -- CHECKME: prune args? - private final Map, GProtocol> inlined = new HashMap<>(); // Keys are full names + // Mods are preserved + // Keys are full names + private final Map, GProtocol> inlined = new HashMap<>(); + private final Map, GProtocol> unfs = new HashMap<>(); // CHECKME: rename projis? private final Map, LProjection> iprojs = new HashMap<>(); // Projected from inlined; keys are full names @@ -132,6 +136,23 @@ public Set getInlineds() return this.inlined.values().stream().collect(Collectors.toSet()); }*/ + public GProtocol getOnceUnfolded(ProtoName fullname) + { + GProtocol unf = this.unfs.get(fullname); + if (unf == null) + { + GTypeUnfolder v = new GTypeUnfolder(this.core); + unf = this.inlined.get(fullname).unfoldAllOnce(v); // Protocol.getInlined does pruneRecs + addOnceUnfolded(fullname, unf); + } + return unf; + } + + protected void addOnceUnfolded(ProtoName fullname, GProtocol g) + { + this.unfs.put(fullname, g); + } + // Projected from inlined public LProjection getProjectedInlined(ProtoName fullname, Role self) { diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 5d5ca1023..8e6978a23 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -41,10 +41,10 @@ import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.visit.RecPruner; -import org.scribble.core.visit.RoleGatherer; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.Substitutor; +import org.scribble.core.visit.gather.RoleGatherer; import org.scribble.core.visit.global.ConnectionChecker; import org.scribble.core.visit.global.ExtChoiceConsistencyChecker; import org.scribble.core.visit.global.InlinedProjector; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java index 1040bde36..55966a7b0 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java @@ -20,6 +20,7 @@ import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Do; import org.scribble.core.type.session.Seq; +import org.scribble.core.visit.gather.STypeGatherer; // Result should not contain duplicates (i.e., due to Choice/Seq) // Result does not necessarily contain root proto (protodecl is not an SType), but may do so via dependencies diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java index ff55c69b4..35445e37b 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java @@ -24,6 +24,7 @@ import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; +import org.scribble.core.visit.gather.RecVarGatherer; // Assumes no shadowing, e.g., use after inlining recvar disamb (also used after projection) public class RecPruner> diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java index 61b0d0742..58ec79901 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeUnfolder.java @@ -26,7 +26,7 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.Seq; -// Not supported for Do +// Pre: use on inlined -- not supported for Do public abstract class STypeUnfolder> extends STypeVisitorNoThrow { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/gather/MessageIdGatherer.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java rename to scribble-core/src/main/java/org/scribble/core/visit/gather/MessageIdGatherer.java index f58ea3cd9..09639baee 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/MessageIdGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/gather/MessageIdGatherer.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.core.visit; +package org.scribble.core.visit.gather; import java.util.stream.Stream; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/gather/NonProtoDepsGatherer.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java rename to scribble-core/src/main/java/org/scribble/core/visit/gather/NonProtoDepsGatherer.java index 03c4c7e4c..362fe80d5 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/NonProtoDepsGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/gather/NonProtoDepsGatherer.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.core.visit; +package org.scribble.core.visit.gather; import java.util.LinkedList; import java.util.List; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/gather/RecVarGatherer.java similarity index 96% rename from scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java rename to scribble-core/src/main/java/org/scribble/core/visit/gather/RecVarGatherer.java index 7a8fda6bf..644713613 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecVarGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/gather/RecVarGatherer.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.core.visit; +package org.scribble.core.visit.gather; import java.util.stream.Stream; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/gather/RoleGatherer.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java rename to scribble-core/src/main/java/org/scribble/core/visit/gather/RoleGatherer.java index ebdf79c56..8546d562d 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RoleGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/gather/RoleGatherer.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.core.visit; +package org.scribble.core.visit.gather; import java.util.stream.Stream; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/gather/STypeGatherer.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java rename to scribble-core/src/main/java/org/scribble/core/visit/gather/STypeGatherer.java index 8e46befd8..26d12404d 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/gather/STypeGatherer.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.core.visit; +package org.scribble.core.visit.gather; import java.util.Optional; import java.util.stream.Stream; diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 4c98508ae..f42514444 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -88,8 +88,9 @@ module tmp.Test; // parser/ast re-refactoring // split mf to global/local subcomps, make protected constrs - // use stypefactory in core -- also make visitorfactorys (both core and ast) // check G/LType casts vs. SType (favour latter) + + // use stypefactory in core -- also make visitorfactorys (both core and ast) // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) // factor out all config factory methods more centrally? // Job Module projection From de2106083c9c977bb5c38cd65ddfc7cf9cfb9caa Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 17:19:12 +0100 Subject: [PATCH 411/539] Refactored core VisitorFactory. --- .../main/java/org/scribble/core/job/Core.java | 152 +++++++++--------- .../org/scribble/core/job/CoreConfig.java | 5 +- .../org/scribble/core/job/CoreContext.java | 4 +- .../scribble/core/lang/global/GProtocol.java | 27 ++-- .../scribble/core/lang/local/LProtocol.java | 2 +- .../scribble/core/visit/VisitorFactory.java | 54 +++++++ .../core/visit/VisitorFactoryImpl.java | 90 +++++++++++ scribble-test/src/test/scrib/tmp/Test.scr | 8 +- 8 files changed, 247 insertions(+), 95 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/VisitorFactory.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/VisitorFactoryImpl.java diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 1ca0e3ecf..258df4ec6 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -43,6 +43,8 @@ import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LTypeFactoryImpl; import org.scribble.core.visit.ProtoDepsCollector; +import org.scribble.core.visit.VisitorFactory; +import org.scribble.core.visit.VisitorFactoryImpl; import org.scribble.core.visit.gather.NonProtoDepsGatherer; import org.scribble.core.visit.gather.RoleGatherer; import org.scribble.util.ScribException; @@ -70,9 +72,10 @@ protected CoreConfig newCoreConfig(ModuleName mainFullname, // TODO: factor out factory methods STypeFactory tf = new STypeFactory(new GTypeFactoryImpl(), new LTypeFactoryImpl()); + VisitorFactory vf = new VisitorFactoryImpl(); ModelFactory mf = new ModelFactory(EModelFactoryImpl::new, SModelFactoryImpl::new); - return new CoreConfig(mainFullname, args, tf, mf); + return new CoreConfig(mainFullname, args, tf, vf, mf); // CHECKME: combine E/SModelFactory? } @@ -107,7 +110,8 @@ protected void runSyntaxTransformPasses() // No ScribException, no errors expec "Inlined subprotocols: " + fullname + "\n" + inlined); } - verbosePrintPass("Unfolding all recursions once for all inlined globals..."); + verbosePrintPass( + "Unfolding all recursions once for all inlined globals..."); for (ProtoName fullname : this.context.getParsedFullnames()) { // TODO: currently, unfolded not actually stored by Context -- unfoldAllOnce repeated manually when needed, e.g., runSyntaxWfPasses @@ -116,75 +120,6 @@ protected void runSyntaxTransformPasses() // No ScribException, no errors expec "Unfolded all recursions once: " + unf.fullname + "\n" + unf); } } - - // Due to Projector not being a subprotocol visitor, so "external" subprotocols may not be visible in ModuleContext building for the projections of the current root Module - // SubprotocolVisitor it doesn't visit the target Module/ProtocolDecls -- that's why the old Projector maintained its own dependencies and created the projection modules after leaving a Do separately from SubprotocolVisiting - // So Projection should not be an "inlining" SubprotocolVisitor, it would need to be more a "DependencyVisitor" - protected void runProjectionPasses() // No ScribException, no errors expected - { - verbosePrintPass("Projecting all inlined globals..."); - for (ProtoName fullname : this.context.getParsedFullnames()) - { - GProtocol inlined = this.context.getInlined(fullname); - for (Role self : inlined.roles) - { - // pruneRecs already done (see runContextBuildingPasses) - // CHECKME: projection and inling commutative? - LProjection iproj = this.context.getProjectedInlined(inlined.fullname, - self); - verbosePrintPass("Projected inlined onto " + self + ": " - + inlined.fullname + "\n" + iproj); - } - } - - // Pre: inlined already projected -- used for Do projection - verbosePrintPass("Projecting all intermediate globals..."); - for (ProtoName fullname : this.context.getParsedFullnames()) - { - GProtocol imed = this.context.getIntermediate(fullname); - for (Role self : imed.roles) - { - LProjection proj = this.context.getProjection(imed.fullname, self); - verbosePrintPass("Projected intermediate onto " + self + ": " - + imed.fullname + "\n" + proj); - } - } - } - - // Pre: runGlobalSyntaxWfPasses -- unfair EFSM building depends on WF (role enabling, e.g., bad.wfchoice.enabling.threeparty.Test02) for building algorithm to work... - // ...or patch unfair-transform graph building to not crash? - protected void runEfsmBuildingPasses() - { - verbosePrintPass("Building EFSMs for all projected inlineds..."); - for (ProtoName fullname : this.context.getParsedFullnames()) - { - GProtocol inlined = this.context.getInlined(fullname); - for (Role self : inlined.roles) - { - // Seems to be OK even if runSyntaxWfPasses does not succeed (cf. unfair transform) - EGraph graph = this.context.getEGraph(fullname, self); - verbosePrintPass( - "Built EFSM: " + inlined.fullname + "\n" + graph.toDot()); - } - } - - if (!this.config.args.get(CoreArgs.FAIR)) - { - verbosePrintPass( - "Building \"unfair\" EFSMs for all projected inlineds..."); - for (ProtoName fullname : this.context.getParsedFullnames()) - { - GProtocol inlined = this.context.getInlined(fullname); - for (Role self : inlined.roles) - { - // Pre: runGlobalSyntaxWfPasses -- e.g., bad.wfchoice.enabling.threeparty.Test02 - EGraph graph = this.context.getUnfairEGraph(inlined.fullname, self); - verbosePrintPass("Built \"unfair\" EFSM: " + inlined.fullname + ":\n" - + graph.toDot()); - } - } - } - } protected void runGlobalSyntaxWfPasses() throws ScribException { @@ -214,7 +149,7 @@ protected void runGlobalSyntaxWfPasses() throws ScribException { continue; } - unf.checkRoleEnabling(); + unf.checkRoleEnabling(this); //e.g., C->D captured under an A->B choice after unfolding, cf. bad.wfchoice.enabling.twoparty.Test01b; // TODO: get unfolded from Context } @@ -228,7 +163,7 @@ protected void runGlobalSyntaxWfPasses() throws ScribException { continue; } - inlined.checkExtChoiceConsistency(); + inlined.checkExtChoiceConsistency(this); } verbosePrintPass( @@ -240,10 +175,44 @@ protected void runGlobalSyntaxWfPasses() throws ScribException { continue; } - unf.checkConnectedness(!unf.isExplicit()); + unf.checkConnectedness(this, !unf.isExplicit()); //e.g., rec X { connect A to B; continue X; } } } + + // Due to Projector not being a subprotocol visitor, so "external" subprotocols may not be visible in ModuleContext building for the projections of the current root Module + // SubprotocolVisitor it doesn't visit the target Module/ProtocolDecls -- that's why the old Projector maintained its own dependencies and created the projection modules after leaving a Do separately from SubprotocolVisiting + // So Projection should not be an "inlining" SubprotocolVisitor, it would need to be more a "DependencyVisitor" + protected void runProjectionPasses() // No ScribException, no errors expected + { + verbosePrintPass("Projecting all inlined globals..."); + for (ProtoName fullname : this.context.getParsedFullnames()) + { + GProtocol inlined = this.context.getInlined(fullname); + for (Role self : inlined.roles) + { + // pruneRecs already done (see runContextBuildingPasses) + // CHECKME: projection and inling commutative? + LProjection iproj = this.context.getProjectedInlined(inlined.fullname, + self); + verbosePrintPass("Projected inlined onto " + self + ": " + + inlined.fullname + "\n" + iproj); + } + } + + // Pre: inlined already projected -- used for Do projection + verbosePrintPass("Projecting all intermediate globals..."); + for (ProtoName fullname : this.context.getParsedFullnames()) + { + GProtocol imed = this.context.getIntermediate(fullname); + for (Role self : imed.roles) + { + LProjection proj = this.context.getProjection(imed.fullname, self); + verbosePrintPass("Projected intermediate onto " + self + ": " + + imed.fullname + "\n" + proj); + } + } + } // Pre: runGlobalSyntaxWfPasses protected void runProjectionSyntaxWfPasses() throws ScribException @@ -264,6 +233,41 @@ protected void runProjectionSyntaxWfPasses() throws ScribException } } + // Pre: runGlobalSyntaxWfPasses -- unfair EFSM building depends on WF (role enabling, e.g., bad.wfchoice.enabling.threeparty.Test02) for building algorithm to work... + // ...or patch unfair-transform graph building to not crash? + protected void runEfsmBuildingPasses() + { + verbosePrintPass("Building EFSMs for all projected inlineds..."); + for (ProtoName fullname : this.context.getParsedFullnames()) + { + GProtocol inlined = this.context.getInlined(fullname); + for (Role self : inlined.roles) + { + // Seems to be OK even if runSyntaxWfPasses does not succeed (cf. unfair transform) + EGraph graph = this.context.getEGraph(fullname, self); + verbosePrintPass( + "Built EFSM: " + inlined.fullname + "\n" + graph.toDot()); + } + } + + if (!this.config.args.get(CoreArgs.FAIR)) + { + verbosePrintPass( + "Building \"unfair\" EFSMs for all projected inlineds..."); + for (ProtoName fullname : this.context.getParsedFullnames()) + { + GProtocol inlined = this.context.getInlined(fullname); + for (Role self : inlined.roles) + { + // Pre: runGlobalSyntaxWfPasses -- e.g., bad.wfchoice.enabling.threeparty.Test02 + EGraph graph = this.context.getUnfairEGraph(inlined.fullname, self); + verbosePrintPass("Built \"unfair\" EFSM: " + inlined.fullname + ":\n" + + graph.toDot()); + } + } + } + } + protected void runLocalModelCheckingPasses() throws ScribException { verbosePrintPass("Checking non-deterministic messaging action payloads..."); diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreConfig.java b/scribble-core/src/main/java/org/scribble/core/job/CoreConfig.java index b69cfb2a6..b12305f77 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreConfig.java @@ -19,6 +19,7 @@ import org.scribble.core.model.ModelFactory; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.session.STypeFactory; +import org.scribble.core.visit.VisitorFactory; // The "static" (constant) info for Jobs -- cf. JobContext "dynamic" state public class CoreConfig @@ -27,15 +28,17 @@ public class CoreConfig public final Map args; // CHECKME: verbose/debug printing parameter ? public final STypeFactory tf; + public final VisitorFactory vf; public final ModelFactory mf; // N.B. MainContext is in a different non-visible (by Maven) package public CoreConfig(ModuleName main, Map args, - STypeFactory tf, ModelFactory mf) + STypeFactory tf, VisitorFactory vf, ModelFactory mf) { this.main = main; this.args = Collections.unmodifiableMap(args); this.tf = tf; + this.vf = vf; this.mf = mf; } } diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index 0e49c61e1..630a21820 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -118,7 +118,7 @@ public GProtocol getInlined(ProtoName fullname) GProtocol inlined = this.inlined.get(fullname); if (inlined == null) { - GTypeInliner v = new GTypeInliner(this.core); // Factor out? + GTypeInliner v = this.core.config.vf.GTypeInliner(this.core); // Factor out? inlined = this.imeds.get(fullname).getInlined(v); // Protocol.getInlined does pruneRecs addInlined(fullname, inlined); } @@ -141,7 +141,7 @@ public GProtocol getOnceUnfolded(ProtoName fullname) GProtocol unf = this.unfs.get(fullname); if (unf == null) { - GTypeUnfolder v = new GTypeUnfolder(this.core); + GTypeUnfolder v = this.core.config.vf.GTypeUnfolder(this.core); unf = this.inlined.get(fullname).unfoldAllOnce(v); // Protocol.getInlined does pruneRecs addOnceUnfolded(fullname, unf); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 8e6978a23..ba940d0c2 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -48,9 +48,7 @@ import org.scribble.core.visit.global.ConnectionChecker; import org.scribble.core.visit.global.ExtChoiceConsistencyChecker; import org.scribble.core.visit.global.InlinedProjector; -import org.scribble.core.visit.global.Projector; import org.scribble.core.visit.global.RoleEnablingChecker; -import org.scribble.core.visit.local.InlinedExtChoiceSubjFixer; import org.scribble.util.ScribException; public class GProtocol extends Protocol @@ -70,39 +68,42 @@ public GProtocol reconstruct(CommonTree source, return new GProtocol(source, mods, fullname, roles, params, def); } - public void checkRoleEnabling() throws ScribException + // Cf. (e.g.) getInlined, that takes the Visitor (not Core) + public void checkRoleEnabling(Core core) throws ScribException { Set rs = this.roles.stream().collect(Collectors.toSet()); - RoleEnablingChecker v = new RoleEnablingChecker(rs); + RoleEnablingChecker v = core.config.vf.RoleEnablingChecker(rs); this.def.visitWith(v); } - public void checkExtChoiceConsistency() throws ScribException + public void checkExtChoiceConsistency(Core core) throws ScribException { Map rs = this.roles.stream() .collect(Collectors.toMap(x -> x, x -> x)); - ExtChoiceConsistencyChecker v = new ExtChoiceConsistencyChecker(rs); + ExtChoiceConsistencyChecker v = core.config.vf + .ExtChoiceConsistencyChecker(rs); this.def.visitWith(v); } - public void checkConnectedness(boolean implicit) throws ScribException + public void checkConnectedness(Core core, boolean implicit) + throws ScribException { Set rs = this.roles.stream().collect(Collectors.toSet()); - ConnectionChecker v = new ConnectionChecker(rs, implicit); + ConnectionChecker v = core.config.vf.ConnectionChecker(rs, implicit); this.def.visitWith(v); } // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) public LProjection projectInlined(Core core, Role self) { - LSeq def = new InlinedProjector(core, self).visitSeq(this.def); - LSeq fixed = new InlinedExtChoiceSubjFixer().visitSeq(def); + LSeq def = core.config.vf.InlinedProjector(core, self).visitSeq(this.def); + LSeq fixed = core.config.vf.InlinedExtChoiceSubjFixer().visitSeq(def); return projectAux(self, this.roles, fixed); } public LProjection project(Core core, Role self) { - LSeq def = new Projector(core, self).visitSeq(this.def); + LSeq def = core.config.vf.Projector(core, self).visitSeq(this.def); // FIXME: ext choice subj fixing, do pruning -- refactor to Job and use AstVisitor? return projectAux(self, core.getContext().getInlined(this.fullname).roles, @@ -127,9 +128,9 @@ private LProjection projectAux(Role self, List decls, LSeq body) this.fullname, pruned); } + // Cf. (e.g.) checkRoleEnabling, that takes Core // CHECKME: drop from Protocol (after removing Protocol from SType?) - // Pre: stack.peek is the sig for the calling Do (or top-level entry) - // i.e., it gives the roles/args at the call-site + // Pre: stack.peek is the sig for the calling Do (or top-level entry), i.e., it gives the roles/args at the call-site @Override public GProtocol getInlined(STypeInliner v) { diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index d41fa5f01..1729cc1f9 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -120,7 +120,7 @@ else if (n instanceof SigName) @Override public LProtocol unfoldAllOnce(STypeUnfolder v) { - LSeq unf = (LSeq) this.def.visitWithNoThrow(v); + LSeq unf = v.visitSeq(this.def); return reconstruct(getSource(), this.mods, this.fullname, this.roles, this.self, this.params, unf); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/VisitorFactory.java b/scribble-core/src/main/java/org/scribble/core/visit/VisitorFactory.java new file mode 100644 index 000000000..f5f63114d --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/VisitorFactory.java @@ -0,0 +1,54 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.visit; + +import java.util.Map; +import java.util.Set; + +import org.scribble.core.job.Core; +import org.scribble.core.type.name.Role; +import org.scribble.core.visit.global.ConnectionChecker; +import org.scribble.core.visit.global.ExtChoiceConsistencyChecker; +import org.scribble.core.visit.global.GTypeInliner; +import org.scribble.core.visit.global.GTypeUnfolder; +import org.scribble.core.visit.global.InlinedProjector; +import org.scribble.core.visit.global.Projector; +import org.scribble.core.visit.global.RoleEnablingChecker; +import org.scribble.core.visit.local.InlinedExtChoiceSubjFixer; +import org.scribble.core.visit.local.ReachabilityChecker; + +public interface VisitorFactory +{ + + GTypeInliner GTypeInliner(Core core); + + GTypeUnfolder GTypeUnfolder(Core core); + + RoleEnablingChecker RoleEnablingChecker(Set rs); + + ExtChoiceConsistencyChecker ExtChoiceConsistencyChecker( + Map enabled); + + ConnectionChecker ConnectionChecker(Set rs, boolean implicit); + + InlinedProjector InlinedProjector(Core core, Role self); + + InlinedExtChoiceSubjFixer InlinedExtChoiceSubjFixer(); + + ReachabilityChecker ReachabilityChecker(); + + // CHECKME: deprecate? + Projector Projector(Core core, Role self); + +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/VisitorFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/visit/VisitorFactoryImpl.java new file mode 100644 index 000000000..751d42076 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/VisitorFactoryImpl.java @@ -0,0 +1,90 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.visit; + +import java.util.Map; +import java.util.Set; + +import org.scribble.core.job.Core; +import org.scribble.core.type.name.Role; +import org.scribble.core.visit.global.ConnectionChecker; +import org.scribble.core.visit.global.ExtChoiceConsistencyChecker; +import org.scribble.core.visit.global.GTypeInliner; +import org.scribble.core.visit.global.GTypeUnfolder; +import org.scribble.core.visit.global.InlinedProjector; +import org.scribble.core.visit.global.Projector; +import org.scribble.core.visit.global.RoleEnablingChecker; +import org.scribble.core.visit.local.InlinedExtChoiceSubjFixer; +import org.scribble.core.visit.local.ReachabilityChecker; + +public class VisitorFactoryImpl implements VisitorFactory +{ + + @Override + public GTypeInliner GTypeInliner(Core core) + { + return new GTypeInliner(core); + } + + @Override + public GTypeUnfolder GTypeUnfolder(Core core) + { + return new GTypeUnfolder(core); + } + + @Override + public RoleEnablingChecker RoleEnablingChecker(Set rs) + { + return new RoleEnablingChecker(rs); + } + + @Override + public ExtChoiceConsistencyChecker ExtChoiceConsistencyChecker( + Map enabled) + { + return new ExtChoiceConsistencyChecker(enabled); + } + + @Override + public ConnectionChecker ConnectionChecker(Set roles, boolean implicit) + { + return new ConnectionChecker(roles, implicit); + } + + @Override + public InlinedProjector InlinedProjector(Core core, Role self) + { + return new InlinedProjector(core, self); + } + + @Override + public InlinedExtChoiceSubjFixer InlinedExtChoiceSubjFixer() + { + return new InlinedExtChoiceSubjFixer(); + } + + @Override + public ReachabilityChecker ReachabilityChecker() + { + return new ReachabilityChecker(); + } + + // CHECKME: deprecate? + @Override + public Projector Projector(Core core, Role self) + { + return new Projector(core, self); + } + +} diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index f42514444..b7d2bf0e9 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -82,13 +82,13 @@ module tmp.Test; // ...disallow/check for reserved __ -- do in gtype translation? // FIXME: qualifed sig name as non-role do-arg // TODO: rename addChildren1 - // CHECKME: duplicate proto mods + // CHECKME: duplicate proto mods (unit tests) // ...check ad hoc ScribNode constructions go through af properly - // ...store unfoldings in Context // parser/ast re-refactoring - // split mf to global/local subcomps, make protected constrs - // check G/LType casts vs. SType (favour latter) + // split mf to global/local subcomps, make protected constrs -- done + // check G/LType casts vs. SType (favour latter) -- done: simplified Seq elems, removed Do.proto N param + // ...store unfoldings in Context -- done // use stypefactory in core -- also make visitorfactorys (both core and ast) // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) From 227b0c1a5390d08341bb1d95cc380141a7f32557 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 19:05:07 +0100 Subject: [PATCH 412/539] Continued refactoring key factory methods. --- .../src/main/java/org/scribble/job/Job.java | 67 ++++++++++--------- .../main/java/org/scribble/job/JobConfig.java | 8 ++- .../java/org/scribble/visit/DelDecorator.java | 4 +- .../main/java/org/scribble/core/job/Core.java | 27 +++++--- .../src/main/java/org/scribble/main/Main.java | 19 +++--- .../java/org/scribble/ast/AstFactoryImpl.java | 2 +- .../org/scribble/parser/ScribTreeAdaptor.java | 1 + 7 files changed, 75 insertions(+), 53 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 9864294ae..263f5c9d3 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -26,12 +26,13 @@ import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.session.STypeFactory; import org.scribble.core.type.session.global.GTypeFactoryImpl; +import org.scribble.core.type.session.local.LTypeFactoryImpl; import org.scribble.del.DelFactory; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -import org.scribble.visit.DelDecorator; +import org.scribble.visit.AstVisitorFactory; +import org.scribble.visit.AstVisitorFactoryImpl; import org.scribble.visit.GTypeTranslator; -import org.scribble.visit.NameDisambiguator; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models public class Job @@ -42,46 +43,41 @@ public class Job private Core core; - // Just take MainContext as arg? -- would need to fix Maven dependencies - //public Job(boolean jUnit, boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness) public Job(ModuleName mainFullname, Map args, Map parsed, AstFactory af, DelFactory df) throws ScribException { // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource - this.config = newJobConfig(mainFullname, args, af, df); + AstVisitorFactory vf = newAstVisitorFactory(); + STypeFactory tf = newSTypeFactory(); + this.config = newJobConfig(mainFullname, args, af, df, vf, tf); this.context = newJobContext(this, parsed); // Single instance per Job, should not be shared between Jobs } - // A Scribble extension should override newJobConfig/Context/Translator and toJob as appropriate - protected JobConfig newJobConfig(ModuleName mainFullname, - Map args, AstFactory af, DelFactory df) + protected AstVisitorFactory newAstVisitorFactory() { - return new JobConfig(mainFullname, args, af, df); + return new AstVisitorFactoryImpl(); } - - // A Scribble extension should override newJobConfig/Context/Translator and toJob as appropriate - protected JobContext newJobContext(Job job, - Map parsed) throws ScribException + + protected STypeFactory newSTypeFactory() { - return new JobContext(this, parsed); + return new STypeFactory(new GTypeFactoryImpl(), + new LTypeFactoryImpl()); } - // A Scribble extension should override newJobConfig/Context/Translator and toJob as appropriate - // CHECKME: factor out STypeTranslator, for future local parsing - protected GTypeTranslator newGTypeTranslator(ModuleName rootFullname) + // A Scribble extension should override newJobConfig/Context/Core as appropriate + protected JobConfig newJobConfig(ModuleName mainFullname, + Map args, AstFactory af, DelFactory df, + AstVisitorFactory vf, STypeFactory tf) { - STypeFactory tf = new STypeFactory(new GTypeFactoryImpl(), null); // TODO: factor out factory - return new GTypeTranslator(this, rootFullname, tf); + return new JobConfig(mainFullname, args, af, df, vf, tf); } - - // A Scribble extension should override newJobConfig/Context/Translator and toJob as appropriate - protected Core newCore(ModuleName mainFullname, Map args, - //Map modcs, - Set imeds) + + // A Scribble extension should override newJobConfig/Context/Core as appropriate + protected JobContext newJobContext(Job job, + Map parsed) throws ScribException { - return new Core(mainFullname, args, //modcs, - imeds); + return new JobContext(this, parsed); } // "Finalises" this Job -- initialises the Job at this point, and cannot run futher Visitor passes on Job @@ -92,11 +88,13 @@ public final Core getCore() throws ScribException { if (this.core == null) { + STypeFactory tf = newSTypeFactory(); Map parsed = this.context.getParsed(); Set imeds = new HashSet<>(); for (ModuleName fullname : parsed.keySet()) { - GTypeTranslator t = newGTypeTranslator(fullname); + GTypeTranslator t = this.config.vf.GTypeTranslator(this, fullname, tf); + // CHECKME: factor out STypeTranslator, for future local parsing Module m = parsed.get(fullname); for (GProtoDecl ast : m.getGProtoDeclChildren()) { @@ -110,11 +108,20 @@ public final Core getCore() throws ScribException } this.core = newCore(this.config.main, this.config.args, //this.context.getModuleContexts(), - imeds); + imeds, tf); } return this.core; } + // A Scribble extension should override newJobConfig/Context/Core as appropriate + protected Core newCore(ModuleName mainFullname, Map args, + //Map modcs, + Set imeds, STypeFactory tf) + { + return new Core(mainFullname, args, //modcs, + imeds, tf); + } + // First run Visitor passes, then call toJob // Base implementation: ambigname disamb pass only public void runPasses() throws ScribException @@ -128,8 +135,8 @@ public void runPasses() throws ScribException // Disamb is a "leftover" aspect of parsing -- so not in core // N.B. disamb is mainly w.r.t. ambignames -- e.g., doesn't fully qualify names (currently mainly done by imed translation) // CHECKME: disamb also currently does checks like do-arg kind and arity -- refactor into core? -- also does, e.g., distinct roledecls, protodecls, etc. - runVisitorPassOnAllModules(new DelDecorator(this, this.config.df)); // Includes validating names used in subprotocol calls.. - runVisitorPassOnAllModules(new NameDisambiguator(this)); // Includes validating names used in subprotocol calls.. + runVisitorPassOnAllModules(this.config.vf.DelDecorator(this)); // Includes validating names used in subprotocol calls.. + runVisitorPassOnAllModules(this.config.vf.NameDisambiguator(this)); // Includes validating names used in subprotocol calls.. } public void runVisitorPassOnAllModules(AstVisitor v) throws ScribException diff --git a/scribble-ast/src/main/java/org/scribble/job/JobConfig.java b/scribble-ast/src/main/java/org/scribble/job/JobConfig.java index 5e831afa4..d5740b1ad 100644 --- a/scribble-ast/src/main/java/org/scribble/job/JobConfig.java +++ b/scribble-ast/src/main/java/org/scribble/job/JobConfig.java @@ -19,7 +19,9 @@ import org.scribble.ast.AstFactory; import org.scribble.core.job.CoreArgs; import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.session.STypeFactory; import org.scribble.del.DelFactory; +import org.scribble.visit.AstVisitorFactory; // The "static" (constant) info for Lang -- cf. LangContext "dynamic" state public class JobConfig @@ -30,14 +32,18 @@ public class JobConfig public final AstFactory af; public final DelFactory df; + public final AstVisitorFactory vf; + public final STypeFactory tf; // N.B. MainContext is in a different non-visible (by Maven) package public JobConfig(ModuleName mainFullname, Map args, - AstFactory af, DelFactory df) + AstFactory af, DelFactory df, AstVisitorFactory vf, STypeFactory tf) { this.main = mainFullname; this.args = Collections.unmodifiableMap(args); this.af = af; this.df = df; + this.vf = vf; + this.tf = tf; } } diff --git a/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java b/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java index 430828101..e205f496c 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java @@ -28,10 +28,10 @@ public class DelDecorator extends AstVisitor { protected final DelFactory df; - public DelDecorator(Job job, DelFactory df) + public DelDecorator(Job job) { super(job); - this.df = df; + this.df = job.config.df; } // AstVisitor enter/leave typically delegates to dels -- DelDecorator is a "proto-visitor", no del to delegate to (yet) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 258df4ec6..5886dd43b 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -39,9 +39,7 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.STypeFactory; import org.scribble.core.type.session.global.GSeq; -import org.scribble.core.type.session.global.GTypeFactoryImpl; import org.scribble.core.type.session.local.LSeq; -import org.scribble.core.type.session.local.LTypeFactoryImpl; import org.scribble.core.visit.ProtoDepsCollector; import org.scribble.core.visit.VisitorFactory; import org.scribble.core.visit.VisitorFactoryImpl; @@ -58,23 +56,30 @@ public class Core public Core(ModuleName mainFullname, Map args, //Map modcs, - Set imeds) + Set imeds, STypeFactory tf) { - this.config = newCoreConfig(mainFullname, args); + this.config = newCoreConfig(mainFullname, args, tf); this.context = newCoreContext(//modcs, imeds); // Single instance per Core and should never be shared } + + protected VisitorFactory newVisitorFactory() + { + return new VisitorFactoryImpl(); + } + + protected ModelFactory newModelFactory() + { + return new ModelFactory(EModelFactoryImpl::new, + SModelFactoryImpl::new); + } // A Scribble extension should override newCoreConfig/Context/etc as appropriate protected CoreConfig newCoreConfig(ModuleName mainFullname, - Map args) + Map args, STypeFactory tf) { - // TODO: factor out factory methods - STypeFactory tf = new STypeFactory(new GTypeFactoryImpl(), - new LTypeFactoryImpl()); - VisitorFactory vf = new VisitorFactoryImpl(); - ModelFactory mf = new ModelFactory(EModelFactoryImpl::new, - SModelFactoryImpl::new); + VisitorFactory vf = newVisitorFactory(); + ModelFactory mf = newModelFactory(); return new CoreConfig(mainFullname, args, tf, vf, mf); // CHECKME: combine E/SModelFactory? } diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index 4a3c38a09..1a8807a5f 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -121,15 +121,26 @@ protected ScribAntlrWrapper newAntlr() return new ScribAntlrWrapper(); } + // N.B. not used by antlr generated parser itself + // Here (cf. Job) because it takes antlr (and lives in scribble-parser) protected AstFactory newAstFactory(ScribAntlrWrapper antlr, DelFactory df) { return new AstFactoryImpl(antlr, df); } + // Here (cf. Job) because taken by this.af (and lives in scribble-parser) protected DelFactory newDelFactory() { return new DelFactoryImpl(); } + + // For a Scribble extension, override newJob(parsed, args, mainFullname, AstFactory) + public final Job newJob() throws ScribException + { + DelFactory df = newDelFactory(); + AstFactory af = newAstFactory(this.antlr, df); + return newJob(getParsedModules(), this.args, this.main, af, df); + } // A Scribble extension should override newAntlr/Job as appropriate protected Job newJob(Map parsed, @@ -168,14 +179,6 @@ private void loadAllAux(Pair m) } } - // For a Scribble extension, override newJob(parsed, args, mainFullname, AstFactory) - public final Job newJob() throws ScribException - { - DelFactory df = newDelFactory(); - AstFactory af = newAstFactory(this.antlr, df); - return newJob(getParsedModules(), this.args, this.main, af, df); - } - public Map getParsedModules() { return this.parsed.entrySet().stream() diff --git a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index 09e8d234e..0bb65c7b5 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -61,7 +61,7 @@ public class AstFactoryImpl implements AstFactory { - // Purely for the convenience of newToken(Token, type) + // Purely for the convenience of newToken(Token, type), parser instance used to access token int constants protected final ScribbleParser parser; protected final Map tokens; diff --git a/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java index 52d0dc5fe..5237fa4ad 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java @@ -59,6 +59,7 @@ import org.scribble.ast.name.simple.OpNode; import org.scribble.parser.antlr.ScribbleParser; +// CHECKME: do del setting directly here (or use af?), instead of DelDecorator // get/setType don't seem to be really used public class ScribTreeAdaptor extends CommonTreeAdaptor { From 5046f3d8fc8b170f2a325b4397accb86c2df47fc Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 19:51:50 +0100 Subject: [PATCH 413/539] Refactored ScribTreeAdaptor to use DelFactory. --- .../java/org/scribble/ast/AstFactory.java | 6 +- .../main/java/org/scribble/ast/ScribNode.java | 2 +- .../java/org/scribble/ast/ScribNodeBase.java | 4 +- .../scribble/ast/global/GDelegPayElem.java | 2 +- .../java/org/scribble/del/DelFactory.java | 2 +- .../src/main/java/org/scribble/job/Job.java | 2 +- .../java/org/scribble/visit/DelDecorator.java | 4 + .../src/main/java/org/scribble/main/Main.java | 18 +- .../java/org/scribble/ast/AstFactoryImpl.java | 6 +- .../scribble/parser/ScribAntlrWrapper.java | 9 +- .../org/scribble/parser/ScribTreeAdaptor.java | 306 +++++++++++++++--- 11 files changed, 289 insertions(+), 72 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 01915b149..4c4cc14a8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -113,13 +113,13 @@ GMsgTransfer GMsgTransfer(Token t, RoleNode src, MsgNode msg, GDo GDo(Token t, RoleArgList rs, NonRoleArgList args, GProtoNameNode proto); - GChoice GChoice(Token t, RoleNode subj, List blocks); - GRecursion GRecursion(Token t, RecVarNode rv, GProtoBlock block); - RoleArgList RoleArgList(Token t, List rs); RoleArg RoleArg(Token t, RoleNode r); NonRoleArgList NonRoleArgList(Token t, List args); NonRoleArg NonRoleArg(Token t, NonRoleArgNode arg); + + GChoice GChoice(Token t, RoleNode subj, List blocks); + GRecursion GRecursion(Token t, RecVarNode rv, GProtoBlock block); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java index 68260a184..4be8cac73 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java @@ -39,7 +39,7 @@ public interface ScribNode extends Tree ScribNode clone(); ScribDel del(); - ScribNode del(ScribDel del); + //ScribNode del(ScribDel del); ScribNode accept(AstVisitor nv) throws ScribException; // The "top-level" method, e.g., module.accept(v) (cf. Job::runVisitorOnModule) ScribNode visitChildren(AstVisitor nv) throws ScribException; diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java index f7f61d03a..345578b1e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -136,13 +136,13 @@ public final ScribDel del() } // Defensive - @Override + /*@Override public final ScribNodeBase del(ScribDel del) { ScribNodeBase clone = clone(); // Need full clone because parent field prevents immutable construction clone.setDel(del); return clone; - } + }*/ // Non-defensive protected final void setDel(ScribDel del) diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java index 233ef26b7..30220dd34 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java @@ -73,7 +73,7 @@ public GDelegPayElem reconstruct(GProtoNameNode proto, RoleNode role) { GDelegPayElem dup = dupNode(); addChildren1(proto, role); - dup = (GDelegPayElem) dup.del(del()); + dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/del/DelFactory.java b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java index eabefdc4f..df4f39d94 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DelFactory.java +++ b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java @@ -122,7 +122,7 @@ public interface DelFactory void GContinue(GContinue n); void GDo(GDo n); - + void RoleArgList(RoleArgList n); void RoleArg(RoleArg r); void NonRoleArgList(NonRoleArgList n); diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 263f5c9d3..58b8b136e 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -135,7 +135,7 @@ public void runPasses() throws ScribException // Disamb is a "leftover" aspect of parsing -- so not in core // N.B. disamb is mainly w.r.t. ambignames -- e.g., doesn't fully qualify names (currently mainly done by imed translation) // CHECKME: disamb also currently does checks like do-arg kind and arity -- refactor into core? -- also does, e.g., distinct roledecls, protodecls, etc. - runVisitorPassOnAllModules(this.config.vf.DelDecorator(this)); // Includes validating names used in subprotocol calls.. + runVisitorPassOnAllModules(this.config.vf.DelDecorator(this)); // Currently, only the simple name nodes "constructed directly" by parser, e.g., t=ID -> ID<...Node>[$t] runVisitorPassOnAllModules(this.config.vf.NameDisambiguator(this)); // Includes validating names used in subprotocol calls.. } diff --git a/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java b/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java index e205f496c..acc1e0117 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java @@ -45,6 +45,10 @@ protected ScribNode leave(ScribNode child, ScribNode visited) protected void decorate(ScribNode n) { + if (n.del() != null) // Currently, only the simple name nodes "constructed directly" by parser, e.g., t=ID -> ID<...Node>[$t] + { + return; + } try { String cname = n.getClass().getName(); diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index 1a8807a5f..88166b21d 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -118,17 +118,18 @@ private Main(Pair hack, Path mainpath, // A Scribble extension should override newAntlr/Job as appropriate protected ScribAntlrWrapper newAntlr() { - return new ScribAntlrWrapper(); + DelFactory df = newDelFactory(); + return new ScribAntlrWrapper(df); } - // N.B. not used by antlr generated parser itself - // Here (cf. Job) because it takes antlr (and lives in scribble-parser) - protected AstFactory newAstFactory(ScribAntlrWrapper antlr, DelFactory df) + // N.B. not used by antlr generated parser itself (cf. ScribTreeAdaptor, takes source tokens and sets dels manually) + // Here (cf. Job) because it takes antlr for token creation (and lives in scribble-parser) + protected AstFactory newAstFactory(ScribAntlrWrapper antlr) { - return new AstFactoryImpl(antlr, df); + return new AstFactoryImpl(antlr); } - // Here (cf. Job) because taken by this.af (and lives in scribble-parser) + // Here (cf. Job) because used by this.antlr and this.af (and lives in scribble-parser) protected DelFactory newDelFactory() { return new DelFactoryImpl(); @@ -137,9 +138,8 @@ protected DelFactory newDelFactory() // For a Scribble extension, override newJob(parsed, args, mainFullname, AstFactory) public final Job newJob() throws ScribException { - DelFactory df = newDelFactory(); - AstFactory af = newAstFactory(this.antlr, df); - return newJob(getParsedModules(), this.args, this.main, af, df); + AstFactory af = newAstFactory(this.antlr); + return newJob(getParsedModules(), this.args, this.main, af, this.antlr.df); } // A Scribble extension should override newAntlr/Job as appropriate diff --git a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index 0bb65c7b5..50c7b2ccc 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -67,7 +67,7 @@ public class AstFactoryImpl implements AstFactory protected final DelFactory df; - public AstFactoryImpl(ScribAntlrWrapper antlr, DelFactory df) + public AstFactoryImpl(ScribAntlrWrapper antlr) { try { @@ -84,7 +84,7 @@ public AstFactoryImpl(ScribAntlrWrapper antlr, DelFactory df) } } this.tokens = Collections.unmodifiableMap(tokens); - this.df = df; + this.df = antlr.df; } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) @@ -368,7 +368,7 @@ public RoleDecl RoleDecl(Token t, RoleNode r) public NonRoleParamDeclList NonRoleParamDeclList(Token t, List> ds) { - t =newToken(t, ScribbleParser.PARAMDECL_LIST); + t = newToken(t, ScribbleParser.PARAMDECL_LIST); NonRoleParamDeclList n = new NonRoleParamDeclList(t); n.addChildren1(ds); this.df.NonRoleParamDeclList(n); diff --git a/scribble-parser/src/main/java/org/scribble/parser/ScribAntlrWrapper.java b/scribble-parser/src/main/java/org/scribble/parser/ScribAntlrWrapper.java index 7e2a9450f..3ac6bedb4 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/ScribAntlrWrapper.java +++ b/scribble-parser/src/main/java/org/scribble/parser/ScribAntlrWrapper.java @@ -25,6 +25,7 @@ import org.antlr.runtime.tree.CommonErrorNode; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.Module; +import org.scribble.del.DelFactory; import org.scribble.parser.antlr.ScribbleLexer; import org.scribble.parser.antlr.ScribbleParser; import org.scribble.util.ScribParserException; @@ -33,9 +34,11 @@ // Wraps the ScribbleLexer and ScribbleParser generated by ANTLR from Scribble.g public class ScribAntlrWrapper { - public ScribAntlrWrapper() + public final DelFactory df; // Will be shared with af and Job (by Main) + + public ScribAntlrWrapper(DelFactory df) { - + this.df = df; } // Scribble extensions should override newScribbleLexer/Parser as appropriate @@ -75,7 +78,7 @@ protected Module runScribbleParser(CommonTokenStream ts) try { ScribbleParser p = newScribbleParser(ts); - p.setTreeAdaptor(new ScribTreeAdaptor()); + p.setTreeAdaptor(new ScribTreeAdaptor(this.df)); return (Module) p.module().getTree(); // Cast, because no convenient way to expose an interface for all (Scribble)Parsers with top-level "module" method? } diff --git a/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java index 5237fa4ad..d1affd9d8 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java @@ -57,12 +57,20 @@ import org.scribble.ast.name.simple.ExtIdNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.OpNode; +import org.scribble.core.type.kind.PayElemKind; +import org.scribble.del.DelFactory; import org.scribble.parser.antlr.ScribbleParser; // CHECKME: do del setting directly here (or use af?), instead of DelDecorator // get/setType don't seem to be really used public class ScribTreeAdaptor extends CommonTreeAdaptor { + protected final DelFactory df; // N.B. not af -- here, create nodes "manually" (with del setting) to preserve original tokens + + public ScribTreeAdaptor(DelFactory df) + { + this.df = df; + } // Generated parser seems to use nil to create "blank" nodes and then "fill them in" @Override @@ -79,62 +87,264 @@ public ScribNode create(Token t) // Previously: String tname = t.getText(); -- by convention of Scribble.g, type constant name given as node text, e.g., module: ... -> ^(MODULE ...) switch (t.getType()) { - case ScribbleParser.ID: return new IdNode(t); - case ScribbleParser.EXTID: return new ExtIdNode(t); + case ScribbleParser.ID: + { + IdNode n = new IdNode(t); + this.df.IdNode(n); + return n; + } + case ScribbleParser.EXTID: + { + ExtIdNode n = new ExtIdNode(t); + this.df.ExtIdNode(n); + return n; + } - // Simple names "constructed directly" by parser, e.g., t=ID -> ID<...Node>[$t] + // Simple names "constructed directly" by parser, e.g., t=ID -> ID<...Node>[$t] -- N.B. DelDecorator pass needed for them (CHECKME: also do those here instead? to deprecate DelDecorator) - case ScribbleParser.GPROTO_NAME: return new GProtoNameNode(t); - case ScribbleParser.MODULE_NAME: return new ModuleNameNode(t); - case ScribbleParser.DATA_NAME: return new DataNameNode(t); - case ScribbleParser.SIG_NAME: return new SigNameNode(t); + // Compound names + case ScribbleParser.GPROTO_NAME: + { + GProtoNameNode n = new GProtoNameNode(t); + this.df.GProtoNameNode(n); + return n; + } + case ScribbleParser.MODULE_NAME: + { + ModuleNameNode n = new ModuleNameNode(t); + this.df.ModuleNameNode(n); + return n; + } + case ScribbleParser.DATA_NAME: + { + DataNameNode n = new DataNameNode(t); + this.df.DataNameNode(n); + return n; + } + case ScribbleParser.SIG_NAME: + { + SigNameNode n = new SigNameNode(t); + this.df.SigNameNode(n); + return n; + } - case ScribbleParser.MODULE: return new Module(t); - case ScribbleParser.MODULEDECL: return new ModuleDecl(t); - case ScribbleParser.IMPORTMODULE: return new ImportModule(t); + // Non-name (i.e., general) AST nodes + case ScribbleParser.MODULE: + { + Module n = new Module(t); + this.df.Module(n); + return n; + } + case ScribbleParser.MODULEDECL: + { + ModuleDecl n = new ModuleDecl(t); + this.df.ModuleDecl(n); + return n; + } + case ScribbleParser.IMPORTMODULE: + { + ImportModule n = new ImportModule(t); + this.df.ImportModule(n); + return n; + } - case ScribbleParser.DATADECL: return new DataDecl(t); - case ScribbleParser.SIGDECL: return new SigDecl(t); - case ScribbleParser.GPROTODECL: return new GProtoDecl(t); + case ScribbleParser.DATADECL: + { + DataDecl n = new DataDecl(t); + this.df.DataDecl(n); + return n; + } + case ScribbleParser.SIGDECL: + { + SigDecl n = new SigDecl(t); + this.df.SigDecl(n); + return n; + } + case ScribbleParser.GPROTODECL: + { + GProtoDecl n = new GProtoDecl(t); + this.df.GProtoDecl(n); + return n; + } // CHECKME: refactor into header? - case ScribbleParser.PROTOMOD_LIST: return new ProtoModList(t); - case ScribbleParser.AUX_KW: return new AuxMod(t); // FIXME: KW return by parser directly (cf. other tokens are imaginary) - case ScribbleParser.EXPLICIT_KW: return new ExplicitMod(t); - - case ScribbleParser.GPROTOHEADER: return new GProtoHeader(t); - case ScribbleParser.ROLEDECL_LIST: return new RoleDeclList(t); - case ScribbleParser.ROLEDECL: return new RoleDecl(t); - case ScribbleParser.PARAMDECL_LIST: return new NonRoleParamDeclList(t); - case ScribbleParser.DATAPARAMDECL: return new DataParamDecl(t); - case ScribbleParser.SIGPARAMDECL: return new SigParamDecl(t); - - case ScribbleParser.GPROTODEF: return new GProtoDef(t); - case ScribbleParser.GPROTOBLOCK: return new GProtoBlock(t); - case ScribbleParser.GINTERSEQ: return new GInteractionSeq(t); - - case ScribbleParser.SIG_LIT: return new SigLitNode(t); - case ScribbleParser.PAYELEM_LIST: return new PayElemList(t); - case ScribbleParser.UNARY_PAYELEM: return new UnaryPayElem<>(t); - - case ScribbleParser.GCONNECT: return new GConnect(t); - case ScribbleParser.GDCONN: return new GDisconnect(t); - case ScribbleParser.GMSGTRANSFER: return new GMsgTransfer(t); - case ScribbleParser.GWRAP: return new GWrap(t); - - case ScribbleParser.GCONTINUE: return new GContinue(t); - case ScribbleParser.GDO: return new GDo(t); - - case ScribbleParser.ROLEARG_LIST: return new RoleArgList(t); - case ScribbleParser.ROLEARG: return new RoleArg(t); - case ScribbleParser.NONROLEARG_LIST: return new NonRoleArgList(t); - case ScribbleParser.NONROLEARG: return new NonRoleArg(t); - - case ScribbleParser.GCHOICE: return new GChoice(t); - case ScribbleParser.GRECURSION: return new GRecursion(t); + case ScribbleParser.PROTOMOD_LIST: + { + ProtoModList n = new ProtoModList(t); + this.df.ProtoModList(n); + return n; + } + case ScribbleParser.AUX_KW: + { + AuxMod n = new AuxMod(t); // FIXME: KW return by parser directly (cf. other tokens are imaginary) + this.df.AuxMod(n); + return n; + } + case ScribbleParser.EXPLICIT_KW: + { + ExplicitMod n = new ExplicitMod(t); + this.df.ExplicitMod(n); + return n; + } + + case ScribbleParser.GPROTOHEADER: + { + GProtoHeader n = new GProtoHeader(t); + this.df.GProtoHeader(n); + return n; + } + case ScribbleParser.ROLEDECL_LIST: + { + RoleDeclList n = new RoleDeclList(t); + this.df.RoleDeclList(n); + return n; + } + case ScribbleParser.ROLEDECL: + { + RoleDecl n = new RoleDecl(t); + this.df.RoleDecl(n); + return n; + } + case ScribbleParser.PARAMDECL_LIST: + { + NonRoleParamDeclList n = new NonRoleParamDeclList(t); + this.df.NonRoleParamDeclList(n); + return n; + } + case ScribbleParser.DATAPARAMDECL: + { + DataParamDecl n = new DataParamDecl(t); + this.df.DataParamDecl(n); + return n; + } + case ScribbleParser.SIGPARAMDECL: + { + SigParamDecl n = new SigParamDecl(t); + this.df.SigParamDecl(n); + return n; + } + + case ScribbleParser.GPROTODEF: + { + GProtoDef n = new GProtoDef(t); + this.df.GProtoDef(n); + return n; + } + case ScribbleParser.GPROTOBLOCK: + { + GProtoBlock n = new GProtoBlock(t); + this.df.GProtoBlock(n); + return n; + } + case ScribbleParser.GINTERSEQ: + { + GInteractionSeq n = new GInteractionSeq(t); + this.df.GInteractionSeq(n); + return n; + } + + case ScribbleParser.SIG_LIT: + { + SigLitNode n = new SigLitNode(t); + this.df.SigLitNode(n); + return n; + } + case ScribbleParser.PAYELEM_LIST: + { + PayElemList n = new PayElemList(t); + this.df.PayElemList(n); + return n; + } + case ScribbleParser.UNARY_PAYELEM: + { + UnaryPayElem n = new UnaryPayElem<>(t); + this.df.UnaryPayElem(n); + return n; + } + + case ScribbleParser.GCONNECT: + { + GConnect n = new GConnect(t); + this.df.GConnect(n); + return n; + } + case ScribbleParser.GDCONN: + { + GDisconnect n = new GDisconnect(t); + this.df.GDisconnect(n); + return n; + } + case ScribbleParser.GMSGTRANSFER: + { + GMsgTransfer n = new GMsgTransfer(t); + this.df.GMsgTransfer(n); + return n; + } + case ScribbleParser.GWRAP: + { + GWrap n = new GWrap(t); + this.df.GWrap(n); + return n; + } + + case ScribbleParser.GCONTINUE: + { + GContinue n = new GContinue(t); + this.df.GContinue(n); + return n; + } + case ScribbleParser.GDO: + { + GDo n = new GDo(t); + this.df.GDo(n); + return n; + } + + case ScribbleParser.ROLEARG_LIST: + { + RoleArgList n = new RoleArgList(t); + this.df.RoleArgList(n); + return n; + } + case ScribbleParser.ROLEARG: + { + RoleArg n = new RoleArg(t); + this.df.RoleArg(n); + return n; + } + case ScribbleParser.NONROLEARG_LIST: + { + NonRoleArgList n = new NonRoleArgList(t); + this.df.NonRoleArgList(n); + return n; + } + case ScribbleParser.NONROLEARG: + { + NonRoleArg n = new NonRoleArg(t); + this.df.NonRoleArg(n); + return n; + } + + case ScribbleParser.GCHOICE: + { + GChoice n = new GChoice(t); + this.df.GChoice(n); + return n; + } + case ScribbleParser.GRECURSION: + { + GRecursion n = new GRecursion(t); + this.df.GRecursion(n); + return n; + } // Special cases - case ScribbleParser.EMPTY_OP: return new OpNode(t); // From Scribble.g, token (t) text is OpNode.EMPTY_OP_TOKEN_TEXT + case ScribbleParser.EMPTY_OP: + { + OpNode n = new OpNode(t); // From Scribble.g, token (t) text is OpNode.EMPTY_OP_TOKEN_TEXT + this.df.OpNode(n); + return n; + } default: { From 87406f9e372dcae1143ac20d582b7d6a06597606 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 20:23:38 +0100 Subject: [PATCH 414/539] Refactoring ScribTreeAdaptor and del decoration. --- .../main/java/org/scribble/ast/AuxMod.java | 7 + .../main/java/org/scribble/ast/DataDecl.java | 7 + .../java/org/scribble/ast/DataParamDecl.java | 7 + .../java/org/scribble/ast/ExplicitMod.java | 7 + .../java/org/scribble/ast/ImportModule.java | 7 + .../main/java/org/scribble/ast/Module.java | 9 +- .../java/org/scribble/ast/ModuleDecl.java | 7 + .../java/org/scribble/ast/NonRoleArg.java | 7 + .../java/org/scribble/ast/NonRoleArgList.java | 7 + .../scribble/ast/NonRoleParamDeclList.java | 7 + .../java/org/scribble/ast/PayElemList.java | 7 + .../java/org/scribble/ast/ProtoModList.java | 7 + .../main/java/org/scribble/ast/RoleArg.java | 7 + .../java/org/scribble/ast/RoleArgList.java | 7 + .../main/java/org/scribble/ast/RoleDecl.java | 7 + .../java/org/scribble/ast/RoleDeclList.java | 7 + .../main/java/org/scribble/ast/ScribNil.java | 7 + .../java/org/scribble/ast/ScribNodeBase.java | 3 + .../main/java/org/scribble/ast/SigDecl.java | 9 +- .../java/org/scribble/ast/SigLitNode.java | 7 + .../java/org/scribble/ast/SigParamDecl.java | 7 + .../java/org/scribble/ast/UnaryPayElem.java | 7 + .../java/org/scribble/ast/global/GChoice.java | 7 + .../org/scribble/ast/global/GConnect.java | 7 + .../org/scribble/ast/global/GContinue.java | 7 + .../scribble/ast/global/GDelegPayElem.java | 7 + .../org/scribble/ast/global/GDisconnect.java | 7 + .../java/org/scribble/ast/global/GDo.java | 7 + .../scribble/ast/global/GInteractionSeq.java | 7 + .../org/scribble/ast/global/GMsgTransfer.java | 7 + .../org/scribble/ast/global/GProtoBlock.java | 7 + .../org/scribble/ast/global/GProtoDecl.java | 7 + .../org/scribble/ast/global/GProtoDef.java | 7 + .../org/scribble/ast/global/GProtoHeader.java | 7 + .../org/scribble/ast/global/GRecursion.java | 7 + .../java/org/scribble/ast/global/GWrap.java | 7 + .../ast/name/qualified/DataNameNode.java | 7 + .../ast/name/qualified/GProtoNameNode.java | 7 + .../ast/name/qualified/LProtoNameNode.java | 7 + .../ast/name/qualified/ModuleNameNode.java | 7 + .../ast/name/qualified/SigNameNode.java | 7 + .../ast/name/simple/AmbigNameNode.java | 7 + .../ast/name/simple/DataParamNode.java | 7 + .../org/scribble/ast/name/simple/IdNode.java | 7 + .../org/scribble/ast/name/simple/OpNode.java | 7 + .../scribble/ast/name/simple/RecVarNode.java | 7 + .../scribble/ast/name/simple/RoleNode.java | 7 + .../ast/name/simple/SigParamNode.java | 7 + .../java/org/scribble/del/DelFactory.java | 2 +- .../java/org/scribble/visit/DelDecorator.java | 14 +- .../java/org/scribble/del/DelFactoryImpl.java | 2 - .../org/scribble/parser/ScribTreeAdaptor.java | 323 ++++-------------- 52 files changed, 408 insertions(+), 269 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AuxMod.java b/scribble-ast/src/main/java/org/scribble/ast/AuxMod.java index f3218a197..d766b0461 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AuxMod.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AuxMod.java @@ -14,6 +14,7 @@ package org.scribble.ast; import org.antlr.runtime.Token; +import org.scribble.del.DelFactory; public class AuxMod extends ProtoMod { @@ -35,6 +36,12 @@ public AuxMod dupNode() return new AuxMod(this); // return this also OK, since no children } + @Override + public void decorateDel(DelFactory df) + { + df.AuxMod(this); + } + @Override public boolean isAux() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java b/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java index a207df9bf..aa718dd34 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java @@ -18,6 +18,7 @@ import org.scribble.core.type.kind.DataKind; import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.ModuleName; +import org.scribble.del.DelFactory; import org.scribble.util.Constants; public class DataDecl extends NonProtoDecl @@ -47,6 +48,12 @@ public DataDecl dupNode() return new DataDecl(this); } + @Override + public void decorateDel(DelFactory df) + { + df.DataDecl(this); + } + @Override public boolean isDataTypeDecl() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java index f3c68be81..732edec8b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DataParamDecl.java @@ -17,6 +17,7 @@ import org.scribble.ast.name.simple.DataParamNode; import org.scribble.core.type.kind.DataKind; import org.scribble.core.type.name.DataName; +import org.scribble.del.DelFactory; import org.scribble.util.Constants; public class DataParamDecl extends NonRoleParamDecl @@ -44,6 +45,12 @@ public DataParamDecl dupNode() { return new DataParamDecl(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.DataParamDecl(this); + } @Override public DataName getDeclName() diff --git a/scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java b/scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java index eb7011285..2f00731cd 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java @@ -14,6 +14,7 @@ package org.scribble.ast; import org.antlr.runtime.Token; +import org.scribble.del.DelFactory; public class ExplicitMod extends ProtoMod { @@ -41,6 +42,12 @@ public ExplicitMod dupNode() return new ExplicitMod(this); // return this also OK, since no children } + @Override + public void decorateDel(DelFactory df) + { + df.ExplicitMod(this); + } + @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java b/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java index 589e366c9..c2020e007 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java @@ -17,6 +17,7 @@ import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.core.type.kind.ModuleKind; import org.scribble.core.type.name.ModuleName; +import org.scribble.del.DelFactory; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -70,6 +71,12 @@ public ImportModule dupNode() return new ImportModule(this); } + @Override + public void decorateDel(DelFactory df) + { + df.ImportModule(this); + } + // alias == null if no alias public ImportModule reconstruct(ModuleNameNode modname, ModuleNameNode alias) { diff --git a/scribble-ast/src/main/java/org/scribble/ast/Module.java b/scribble-ast/src/main/java/org/scribble/ast/Module.java index 691e98599..7118ca7d2 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Module.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Module.java @@ -26,8 +26,9 @@ import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; -import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.name.SigName; +import org.scribble.del.DelFactory; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -104,6 +105,12 @@ public Module dupNode() return new Module(this); } + @Override + public void decorateDel(DelFactory df) + { + df.Module(this); + } + // Set args as children on a dup of this -- children *not* cloned protected Module reconstruct(ModuleDecl moddecl, List> imports, List> data, List> protos) diff --git a/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java index 6681f6223..fa8cfbb61 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java @@ -17,6 +17,7 @@ import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.core.type.kind.ModuleKind; import org.scribble.core.type.name.ModuleName; +import org.scribble.del.DelFactory; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -54,6 +55,12 @@ public ModuleDecl dupNode() { return new ModuleDecl(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.ModuleDecl(this); + } protected ModuleDecl reconstruct(ModuleNameNode name) { diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArg.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArg.java index d97a1d489..9358573f1 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArg.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArg.java @@ -14,6 +14,7 @@ package org.scribble.ast; import org.antlr.runtime.Token; +import org.scribble.del.DelFactory; public class NonRoleArg extends DoArg { @@ -42,4 +43,10 @@ public NonRoleArg dupNode() { return new NonRoleArg(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.NonRoleArg(this); + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java index d80614e21..bc9b951d7 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleArgList.java @@ -24,6 +24,7 @@ import org.scribble.core.type.name.SigName; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.SigLit; +import org.scribble.del.DelFactory; // Cf. NonRoleParamDeclList public class NonRoleArgList extends DoArgList @@ -98,6 +99,12 @@ public NonRoleArgList dupNode() return new NonRoleArgList(this); } + @Override + public void decorateDel(DelFactory df) + { + df.NonRoleArgList(this); + } + @Override public String toString() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java index 4fa7c0996..37e833246 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java @@ -19,6 +19,7 @@ import org.antlr.runtime.Token; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.MemberName; +import org.scribble.del.DelFactory; // Can contain "mixed" type/sig kinds // Typing a bit awkward that this list has to use NonRoleParamKind as the "concrete" kind, while the NonRoleParamDecl elements use the actual concrete kind @@ -60,6 +61,12 @@ public NonRoleParamDeclList dupNode() { return new NonRoleParamDeclList(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.NonRoleParamDeclList(this); + } @Override public NonRoleParamDeclList reconstruct( diff --git a/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java b/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java index d2bdbcca4..bbf78ef07 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java @@ -19,6 +19,7 @@ import org.antlr.runtime.Token; import org.scribble.core.type.name.PayElemType; import org.scribble.core.type.session.Payload; +import org.scribble.del.DelFactory; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -56,6 +57,12 @@ public PayElemList dupNode() return new PayElemList(this); } + @Override + public void decorateDel(DelFactory df) + { + df.PayElemList(this); + } + protected PayElemList reconstruct(List> elems) { PayElemList dup = dupNode(); diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java index 37b36d628..8528ca316 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java @@ -17,6 +17,7 @@ import java.util.stream.Collectors; import org.antlr.runtime.Token; +import org.scribble.del.DelFactory; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -63,6 +64,12 @@ public ProtoModList dupNode() return new ProtoModList(this); } + @Override + public void decorateDel(DelFactory df) + { + df.ProtoModList(this); + } + @Override public ProtoModList visitChildren(AstVisitor nv) throws ScribException { diff --git a/scribble-ast/src/main/java/org/scribble/ast/RoleArg.java b/scribble-ast/src/main/java/org/scribble/ast/RoleArg.java index 3f67d3688..72445d5a0 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/RoleArg.java +++ b/scribble-ast/src/main/java/org/scribble/ast/RoleArg.java @@ -15,6 +15,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.DelFactory; // CHECKME: can this be simplified to an interface? (also NonRoleArg) public class RoleArg extends DoArg @@ -42,4 +43,10 @@ public RoleArg dupNode() { return new RoleArg(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.RoleArg(this); + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/RoleArgList.java b/scribble-ast/src/main/java/org/scribble/ast/RoleArgList.java index 4c3e85fcd..9c0587e78 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/RoleArgList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/RoleArgList.java @@ -18,6 +18,7 @@ import org.antlr.runtime.Token; import org.scribble.core.type.name.Role; +import org.scribble.del.DelFactory; public class RoleArgList extends DoArgList { @@ -52,6 +53,12 @@ public RoleArgList dupNode() { return new RoleArgList(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.RoleArgList(this); + } @Override public String toString() diff --git a/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java b/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java index b1b2e7f74..5ac6380b7 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/RoleDecl.java @@ -17,6 +17,7 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.RoleKind; import org.scribble.core.type.name.Role; +import org.scribble.del.DelFactory; import org.scribble.util.Constants; public class RoleDecl extends ParamDecl @@ -44,6 +45,12 @@ public RoleDecl dupNode() { return new RoleDecl(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.RoleDecl(this); + } @Override public Role getDeclName() diff --git a/scribble-ast/src/main/java/org/scribble/ast/RoleDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/RoleDeclList.java index aada289fe..d95750e47 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/RoleDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/RoleDeclList.java @@ -19,6 +19,7 @@ import org.antlr.runtime.Token; import org.scribble.core.type.kind.RoleKind; import org.scribble.core.type.name.Role; +import org.scribble.del.DelFactory; public class RoleDeclList extends ParamDeclList { @@ -52,6 +53,12 @@ public RoleDeclList dupNode() { return new RoleDeclList(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.RoleDeclList(this); + } @Override public String toString() diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNil.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNil.java index 4ce98c566..b3a10b3be 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNil.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNil.java @@ -15,6 +15,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; +import org.scribble.del.DelFactory; public class ScribNil extends ScribNodeBase { @@ -35,4 +36,10 @@ public ScribNodeBase dupNode() { return new ScribNil(this); // CHECKME: nil can have children(?), so may need to actually copy } + + @Override + public void decorateDel(DelFactory df) + { + throw new RuntimeException("Shouldn't get in here: "); + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java index 345578b1e..62f9a45e8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -23,6 +23,7 @@ import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.ProtoKind; +import org.scribble.del.DelFactory; import org.scribble.del.ScribDel; import org.scribble.util.RuntimeScribException; import org.scribble.util.ScribException; @@ -135,6 +136,8 @@ public final ScribDel del() return this.del; } + public abstract void decorateDel(DelFactory df); + // Defensive /*@Override public final ScribNodeBase del(ScribDel del) diff --git a/scribble-ast/src/main/java/org/scribble/ast/SigDecl.java b/scribble-ast/src/main/java/org/scribble/ast/SigDecl.java index 103cc4c37..5e06d23f6 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/SigDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SigDecl.java @@ -16,8 +16,9 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.core.type.kind.SigKind; -import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.name.SigName; +import org.scribble.del.DelFactory; import org.scribble.util.Constants; public class SigDecl extends NonProtoDecl @@ -46,6 +47,12 @@ public SigDecl dupNode() { return new SigDecl(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.SigDecl(this); + } @Override public boolean isMessageSigNameDecl() diff --git a/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java b/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java index f3e8b4cbe..6aa692128 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java @@ -16,6 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.name.simple.OpNode; import org.scribble.core.type.session.SigLit; +import org.scribble.del.DelFactory; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -58,6 +59,12 @@ public SigLitNode dupNode() { return new SigLitNode(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.SigLitNode(this); + } public SigLitNode reconstruct(OpNode op, PayElemList pay) { diff --git a/scribble-ast/src/main/java/org/scribble/ast/SigParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/SigParamDecl.java index a8d7169d4..d5c868699 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/SigParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SigParamDecl.java @@ -17,6 +17,7 @@ import org.scribble.ast.name.simple.SigParamNode; import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.SigName; +import org.scribble.del.DelFactory; import org.scribble.util.Constants; public class SigParamDecl extends NonRoleParamDecl @@ -44,6 +45,12 @@ public SigParamDecl dupNode() { return new SigParamDecl(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.SigParamDecl(this); + } @Override //public MemberName getDeclName() diff --git a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java index 0b77745f5..cde1bd280 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java @@ -17,6 +17,7 @@ import org.scribble.ast.name.PayElemNameNode; import org.scribble.core.type.kind.PayElemKind; import org.scribble.core.type.name.PayElemType; +import org.scribble.del.DelFactory; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -68,6 +69,12 @@ public UnaryPayElem dupNode() return new UnaryPayElem<>(this); } + @Override + public void decorateDel(DelFactory df) + { + df.UnaryPayElem(this); + } + public UnaryPayElem reconstruct(PayElemNameNode name) { UnaryPayElem dup = dupNode(); diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java index 972635525..45820dea5 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java @@ -20,6 +20,7 @@ import org.scribble.ast.Choice; import org.scribble.ast.ScribNode; import org.scribble.core.type.kind.Global; +import org.scribble.del.DelFactory; public class GChoice extends Choice implements GCompoundSessionNode { @@ -48,4 +49,10 @@ public GChoice dupNode() { return new GChoice(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.GChoice(this); + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GConnect.java b/scribble-ast/src/main/java/org/scribble/ast/global/GConnect.java index fa76c6918..b43e652bb 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GConnect.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GConnect.java @@ -16,6 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.ConnectAction; import org.scribble.core.type.kind.Global; +import org.scribble.del.DelFactory; import org.scribble.util.Constants; // TODO: make GConnectionAction and factor this class with GWrap (cf. LConnectionAction) @@ -39,6 +40,12 @@ public GConnect dupNode() { return new GConnect(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.GConnect(this); + } @Override public String toString() diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GContinue.java b/scribble-ast/src/main/java/org/scribble/ast/global/GContinue.java index bd8dde9da..6957bde1b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GContinue.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GContinue.java @@ -16,6 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.Continue; import org.scribble.core.type.kind.Global; +import org.scribble.del.DelFactory; public class GContinue extends Continue implements GSimpleSessionNode { @@ -36,4 +37,10 @@ public GContinue dupNode() { return new GContinue(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.GContinue(this); + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java index 30220dd34..3ea714a44 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java @@ -21,6 +21,7 @@ import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.GDelegType; import org.scribble.core.type.name.PayElemType; +import org.scribble.del.DelFactory; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -68,6 +69,12 @@ public GDelegPayElem dupNode() { return new GDelegPayElem(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.GDelegPayElem(this); + } public GDelegPayElem reconstruct(GProtoNameNode proto, RoleNode role) { diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java index 0a3f5595c..a324f4aac 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDisconnect.java @@ -16,6 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.DisconnectAction; import org.scribble.core.type.kind.Global; +import org.scribble.del.DelFactory; public class GDisconnect extends DisconnectAction implements GSimpleSessionNode @@ -32,6 +33,12 @@ public GDisconnect(GDisconnect node) super(node); } + @Override + public void decorateDel(DelFactory df) + { + df.GDisconnect(this); + } + @Override public GDisconnect dupNode() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java index e3ccc8101..9f905c1a1 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java @@ -19,6 +19,7 @@ import org.scribble.core.lang.context.ModuleContext; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtoName; +import org.scribble.del.DelFactory; import org.scribble.job.JobContext; public class GDo extends Do implements GSimpleSessionNode @@ -55,6 +56,12 @@ public GDo dupNode() { return new GDo(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.GDo(this); + } @Override public GProtoName getTargetProtocolDeclFullName(ModuleContext mcontext) diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GInteractionSeq.java b/scribble-ast/src/main/java/org/scribble/ast/global/GInteractionSeq.java index cd04e6a7b..88435a816 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GInteractionSeq.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GInteractionSeq.java @@ -19,6 +19,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.InteractionSeq; import org.scribble.core.type.kind.Global; +import org.scribble.del.DelFactory; public class GInteractionSeq extends InteractionSeq implements GScribNode @@ -47,4 +48,10 @@ public GInteractionSeq dupNode() { return new GInteractionSeq(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.GInteractionSeq(this); + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GMsgTransfer.java b/scribble-ast/src/main/java/org/scribble/ast/global/GMsgTransfer.java index a51928b4a..dfc90632c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GMsgTransfer.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GMsgTransfer.java @@ -18,6 +18,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.MsgTransfer; import org.scribble.core.type.kind.Global; +import org.scribble.del.DelFactory; import org.scribble.util.Constants; public class GMsgTransfer extends MsgTransfer @@ -40,6 +41,12 @@ public GMsgTransfer dupNode() { return new GMsgTransfer(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.GMsgTransfer(this); + } @Override public String toString() diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtoBlock.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoBlock.java index 67519d920..0ff579d50 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtoBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoBlock.java @@ -16,6 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.ProtoBlock; import org.scribble.core.type.kind.Global; +import org.scribble.del.DelFactory; public class GProtoBlock extends ProtoBlock implements GScribNode { @@ -42,4 +43,10 @@ public GProtoBlock dupNode() { return new GProtoBlock(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.GProtoBlock(this); + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDecl.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDecl.java index c63ac5a31..aac0be95c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDecl.java @@ -18,6 +18,7 @@ import org.scribble.ast.ProtoDecl; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtoName; +import org.scribble.del.DelFactory; public class GProtoDecl extends ProtoDecl implements GScribNode { @@ -51,6 +52,12 @@ public GProtoDecl dupNode() { return new GProtoDecl(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.GProtoDecl(this); + } @Override public GProtoName getFullMemberName(Module mod) // TODO: remove mod from meth sig diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDef.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDef.java index ee7e134f0..6f656425f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDef.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoDef.java @@ -16,6 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.ProtoDef; import org.scribble.core.type.kind.Global; +import org.scribble.del.DelFactory; public class GProtoDef extends ProtoDef implements GScribNode { @@ -42,4 +43,10 @@ public GProtoDef dupNode() { return new GProtoDef(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.GProtoDef(this); + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GProtoHeader.java b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoHeader.java index 9061275ba..affbe1ff5 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GProtoHeader.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GProtoHeader.java @@ -18,6 +18,7 @@ import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtoName; +import org.scribble.del.DelFactory; import org.scribble.util.Constants; public class GProtoHeader extends ProtoHeader implements GScribNode @@ -40,6 +41,12 @@ public GProtoHeader dupNode() return new GProtoHeader(this); } + @Override + public void decorateDel(DelFactory df) + { + df.GProtoHeader(this); + } + @Override public GProtoNameNode getNameNodeChild() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java b/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java index 3298a2f15..3f1f76159 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GRecursion.java @@ -16,6 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.Recursion; import org.scribble.core.type.kind.Global; +import org.scribble.del.DelFactory; public class GRecursion extends Recursion @@ -44,4 +45,10 @@ public GRecursion dupNode() { return new GRecursion(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.GRecursion(this); + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java index 45dd32728..4d4c64645 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java @@ -17,6 +17,7 @@ import org.scribble.ast.BasicInteraction; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Global; +import org.scribble.del.DelFactory; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -63,6 +64,12 @@ public GWrap dupNode() { return new GWrap(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.GWrap(this); + } public GWrap reconstruct(RoleNode client, RoleNode server) { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java index 6ed1cf102..667936ddd 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/DataNameNode.java @@ -18,6 +18,7 @@ import org.scribble.core.type.kind.DataKind; import org.scribble.core.type.name.DataName; import org.scribble.core.type.session.Arg; +import org.scribble.del.DelFactory; //public class DataTypeNode extends MemberNameNode implements PayloadElemNameNode public class DataNameNode extends MemberNameNode @@ -41,6 +42,12 @@ public DataNameNode dupNode() return new DataNameNode(this); } + @Override + public void decorateDel(DelFactory df) + { + df.DataNameNode(this); + } + @Override public DataName toName() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtoNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtoNameNode.java index 1f85e6215..dd46e4ee7 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtoNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/GProtoNameNode.java @@ -16,6 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.core.type.kind.Global; import org.scribble.core.type.name.GProtoName; +import org.scribble.del.DelFactory; public class GProtoNameNode extends ProtoNameNode { @@ -37,6 +38,12 @@ public GProtoNameNode dupNode() return new GProtoNameNode(this); } + @Override + public void decorateDel(DelFactory df) + { + df.GProtoNameNode(this); + } + @Override public GProtoName toName() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java index b99c81156..e74077bb8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/LProtoNameNode.java @@ -18,6 +18,7 @@ import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.session.Arg; +import org.scribble.del.DelFactory; public class LProtoNameNode extends ProtoNameNode implements PayElemNameNode @@ -39,6 +40,12 @@ public LProtoNameNode dupNode() { return new LProtoNameNode(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.LProtoNameNode(this); + } @Override public LProtoName toName() diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java index df37bcbf3..2c80a0b81 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/ModuleNameNode.java @@ -17,6 +17,7 @@ import org.scribble.core.type.kind.ModuleKind; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.PackageName; +import org.scribble.del.DelFactory; public class ModuleNameNode extends QualNameNode { @@ -38,6 +39,12 @@ public ModuleNameNode dupNode() return new ModuleNameNode(this); } + @Override + public void decorateDel(DelFactory df) + { + df.ModuleNameNode(this); + } + @Override public ModuleName toName() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java index 069280467..162da080e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/qualified/SigNameNode.java @@ -17,6 +17,7 @@ import org.scribble.ast.MsgNode; import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.SigName; +import org.scribble.del.DelFactory; public class SigNameNode extends MemberNameNode implements MsgNode @@ -38,6 +39,12 @@ public SigNameNode dupNode() { return new SigNameNode(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.SigNameNode(this); + } @Override public SigName toName() diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index 37bd17387..5c525e9ce 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -23,6 +23,7 @@ import org.scribble.core.type.name.PayElemType; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Msg; +import org.scribble.del.DelFactory; // Primitive payload type, MessageSigName or parameter names only: if name is parsed as a CompoundNameNodes, it must be a payload type (not ambiguous in this case) public class AmbigNameNode extends SimpleNameNode @@ -47,6 +48,12 @@ public AmbigNameNode dupNode() return new AmbigNameNode(this); } + @Override + public void decorateDel(DelFactory df) + { + df.AmbigNameNode(this); + } + @Override public Arg toArg() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java index 4052c9824..80741a045 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java @@ -17,6 +17,7 @@ import org.scribble.ast.name.PayElemNameNode; import org.scribble.core.type.kind.DataKind; import org.scribble.core.type.name.DataName; +import org.scribble.del.DelFactory; public class DataParamNode extends NonRoleParamNode implements PayElemNameNode // As a payload, can only be a DataType (so hardcode) @@ -40,6 +41,12 @@ public DataParamNode dupNode() return new DataParamNode(this); } + @Override + public void decorateDel(DelFactory df) + { + df.DataParamNode(this); + } + @Override public DataName toName() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java index b1a40267b..ac6b27332 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java @@ -16,6 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.core.type.kind.IdKind; import org.scribble.core.type.name.Id; +import org.scribble.del.DelFactory; // Kind can be disregarded, the "true" kind (for qualified names) recorded by the parent public class IdNode extends SimpleNameNode @@ -38,6 +39,12 @@ public IdNode dupNode() return new IdNode(this); } + @Override + public void decorateDel(DelFactory df) + { + df.IdNode(this); + } + @Override public String getText() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java index 86eb0efb4..7618f81d7 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/OpNode.java @@ -16,6 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.core.type.kind.OpKind; import org.scribble.core.type.name.Op; +import org.scribble.del.DelFactory; public class OpNode extends SimpleNameNode @@ -47,6 +48,12 @@ public OpNode dupNode() return new OpNode(this); } + @Override + public void decorateDel(DelFactory df) + { + df.OpNode(this); + } + @Override public Op toName() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java index 95263407f..34a1c90d8 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RecVarNode.java @@ -16,6 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.core.type.kind.RecVarKind; import org.scribble.core.type.name.RecVar; +import org.scribble.del.DelFactory; public class RecVarNode extends SimpleNameNode { @@ -37,6 +38,12 @@ public RecVarNode dupNode() { return new RecVarNode(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.RecVarNode(this); + } @Override public RecVar toName() diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java index b46d79734..a2cf5cf2b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java @@ -17,6 +17,7 @@ import org.scribble.ast.DoArgNode; import org.scribble.core.type.kind.RoleKind; import org.scribble.core.type.name.Role; +import org.scribble.del.DelFactory; public class RoleNode extends SimpleNameNode implements DoArgNode { @@ -39,6 +40,12 @@ public RoleNode dupNode() return new RoleNode(this); } + @Override + public void decorateDel(DelFactory df) + { + df.RoleNode(this); + } + @Override public Role toName() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java index e1d097de1..98382842e 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java @@ -17,6 +17,7 @@ import org.scribble.ast.MsgNode; import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.SigName; +import org.scribble.del.DelFactory; public class SigParamNode extends NonRoleParamNode implements MsgNode @@ -39,6 +40,12 @@ public SigParamNode dupNode() { return new SigParamNode(this); } + + @Override + public void decorateDel(DelFactory df) + { + df.SigParamNode(this); + } @Override public SigName toName() diff --git a/scribble-ast/src/main/java/org/scribble/del/DelFactory.java b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java index df4f39d94..d1dd09f09 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DelFactory.java +++ b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java @@ -66,7 +66,7 @@ // (Perhaps could integrate with ScribTreeAdaptor, but easier to do after -- AST construction technically may further create/dup nodes during the ongoing pass) // A dec method for each AST class -- method name must be the same as target class name // Implementations (DelDecoratorImpl) in scribble-parser, can depend on parser implementation -// E.g., DelDecoratorImpl: each method named after the class name -- currently dispatched by reflection +// E.g., DelDecoratorImpl: each method named after the class name public interface DelFactory { // Currently a bit more than plain factory, calls setDel diff --git a/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java b/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java index acc1e0117..f316cb87d 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java @@ -13,10 +13,8 @@ */ package org.scribble.visit; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - import org.scribble.ast.ScribNode; +import org.scribble.ast.ScribNodeBase; import org.scribble.del.DelFactory; import org.scribble.job.Job; import org.scribble.util.ScribException; @@ -49,7 +47,9 @@ protected void decorate(ScribNode n) { return; } - try + ((ScribNodeBase) n).decorateDel(this.df); + + /*try { String cname = n.getClass().getName(); String mname = cname.substring(cname.lastIndexOf('.')+1, cname.length()); @@ -62,7 +62,7 @@ protected void decorate(ScribNode n) | InvocationTargetException e) { throw new RuntimeException(e); - } + }*/ } /*protected void decorateChildren(ScribNode n) @@ -70,3 +70,7 @@ protected void decorate(ScribNode n) n.getChildren().stream().forEach(x -> decorate(x)); }*/ } + + + + diff --git a/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java index 8dd3381cf..e3e09b0db 100644 --- a/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java @@ -83,8 +83,6 @@ import org.scribble.del.name.simple.RoleNodeDel; -//CHECKME: refactor decoration methods into AST interface, to ensure they are implemented and called? -//CHECKME: to what extent are del's still needed? public class DelFactoryImpl implements DelFactory { public DelFactoryImpl() diff --git a/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java index d1affd9d8..a40f5f81f 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java @@ -33,6 +33,7 @@ import org.scribble.ast.RoleDeclList; import org.scribble.ast.ScribNil; import org.scribble.ast.ScribNode; +import org.scribble.ast.ScribNodeBase; import org.scribble.ast.SigDecl; import org.scribble.ast.SigLitNode; import org.scribble.ast.SigParamDecl; @@ -57,7 +58,6 @@ import org.scribble.ast.name.simple.ExtIdNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.OpNode; -import org.scribble.core.type.kind.PayElemKind; import org.scribble.del.DelFactory; import org.scribble.parser.antlr.ScribbleParser; @@ -85,271 +85,76 @@ public ScribNode create(Token t) { // Switching on ScribbleParser int type constants -- generated from Scribble.g tokens // Previously: String tname = t.getText(); -- by convention of Scribble.g, type constant name given as node text, e.g., module: ... -> ^(MODULE ...) + ScribNodeBase n; switch (t.getType()) { - case ScribbleParser.ID: - { - IdNode n = new IdNode(t); - this.df.IdNode(n); - return n; - } - case ScribbleParser.EXTID: - { - ExtIdNode n = new ExtIdNode(t); - this.df.ExtIdNode(n); - return n; - } - - // Simple names "constructed directly" by parser, e.g., t=ID -> ID<...Node>[$t] -- N.B. DelDecorator pass needed for them (CHECKME: also do those here instead? to deprecate DelDecorator) - - // Compound names - case ScribbleParser.GPROTO_NAME: - { - GProtoNameNode n = new GProtoNameNode(t); - this.df.GProtoNameNode(n); - return n; - } - case ScribbleParser.MODULE_NAME: - { - ModuleNameNode n = new ModuleNameNode(t); - this.df.ModuleNameNode(n); - return n; - } - case ScribbleParser.DATA_NAME: - { - DataNameNode n = new DataNameNode(t); - this.df.DataNameNode(n); - return n; - } - case ScribbleParser.SIG_NAME: - { - SigNameNode n = new SigNameNode(t); - this.df.SigNameNode(n); - return n; - } - - // Non-name (i.e., general) AST nodes - case ScribbleParser.MODULE: - { - Module n = new Module(t); - this.df.Module(n); - return n; - } - case ScribbleParser.MODULEDECL: - { - ModuleDecl n = new ModuleDecl(t); - this.df.ModuleDecl(n); - return n; - } - case ScribbleParser.IMPORTMODULE: - { - ImportModule n = new ImportModule(t); - this.df.ImportModule(n); - return n; - } - - case ScribbleParser.DATADECL: - { - DataDecl n = new DataDecl(t); - this.df.DataDecl(n); - return n; - } - case ScribbleParser.SIGDECL: - { - SigDecl n = new SigDecl(t); - this.df.SigDecl(n); - return n; - } - case ScribbleParser.GPROTODECL: - { - GProtoDecl n = new GProtoDecl(t); - this.df.GProtoDecl(n); - return n; - } - - // CHECKME: refactor into header? - case ScribbleParser.PROTOMOD_LIST: - { - ProtoModList n = new ProtoModList(t); - this.df.ProtoModList(n); - return n; - } - case ScribbleParser.AUX_KW: - { - AuxMod n = new AuxMod(t); // FIXME: KW return by parser directly (cf. other tokens are imaginary) - this.df.AuxMod(n); - return n; - } - case ScribbleParser.EXPLICIT_KW: - { - ExplicitMod n = new ExplicitMod(t); - this.df.ExplicitMod(n); - return n; - } - - case ScribbleParser.GPROTOHEADER: - { - GProtoHeader n = new GProtoHeader(t); - this.df.GProtoHeader(n); - return n; - } - case ScribbleParser.ROLEDECL_LIST: - { - RoleDeclList n = new RoleDeclList(t); - this.df.RoleDeclList(n); - return n; - } - case ScribbleParser.ROLEDECL: - { - RoleDecl n = new RoleDecl(t); - this.df.RoleDecl(n); - return n; - } - case ScribbleParser.PARAMDECL_LIST: - { - NonRoleParamDeclList n = new NonRoleParamDeclList(t); - this.df.NonRoleParamDeclList(n); - return n; - } - case ScribbleParser.DATAPARAMDECL: - { - DataParamDecl n = new DataParamDecl(t); - this.df.DataParamDecl(n); - return n; - } - case ScribbleParser.SIGPARAMDECL: - { - SigParamDecl n = new SigParamDecl(t); - this.df.SigParamDecl(n); - return n; - } - - case ScribbleParser.GPROTODEF: - { - GProtoDef n = new GProtoDef(t); - this.df.GProtoDef(n); - return n; - } - case ScribbleParser.GPROTOBLOCK: - { - GProtoBlock n = new GProtoBlock(t); - this.df.GProtoBlock(n); - return n; - } - case ScribbleParser.GINTERSEQ: - { - GInteractionSeq n = new GInteractionSeq(t); - this.df.GInteractionSeq(n); - return n; - } - - case ScribbleParser.SIG_LIT: - { - SigLitNode n = new SigLitNode(t); - this.df.SigLitNode(n); - return n; - } - case ScribbleParser.PAYELEM_LIST: - { - PayElemList n = new PayElemList(t); - this.df.PayElemList(n); - return n; - } - case ScribbleParser.UNARY_PAYELEM: - { - UnaryPayElem n = new UnaryPayElem<>(t); - this.df.UnaryPayElem(n); - return n; - } - - case ScribbleParser.GCONNECT: - { - GConnect n = new GConnect(t); - this.df.GConnect(n); - return n; - } - case ScribbleParser.GDCONN: - { - GDisconnect n = new GDisconnect(t); - this.df.GDisconnect(n); - return n; - } - case ScribbleParser.GMSGTRANSFER: - { - GMsgTransfer n = new GMsgTransfer(t); - this.df.GMsgTransfer(n); - return n; - } - case ScribbleParser.GWRAP: - { - GWrap n = new GWrap(t); - this.df.GWrap(n); - return n; - } - - case ScribbleParser.GCONTINUE: - { - GContinue n = new GContinue(t); - this.df.GContinue(n); - return n; - } - case ScribbleParser.GDO: - { - GDo n = new GDo(t); - this.df.GDo(n); - return n; - } - - case ScribbleParser.ROLEARG_LIST: - { - RoleArgList n = new RoleArgList(t); - this.df.RoleArgList(n); - return n; - } - case ScribbleParser.ROLEARG: - { - RoleArg n = new RoleArg(t); - this.df.RoleArg(n); - return n; - } - case ScribbleParser.NONROLEARG_LIST: - { - NonRoleArgList n = new NonRoleArgList(t); - this.df.NonRoleArgList(n); - return n; - } - case ScribbleParser.NONROLEARG: - { - NonRoleArg n = new NonRoleArg(t); - this.df.NonRoleArg(n); - return n; - } - - case ScribbleParser.GCHOICE: - { - GChoice n = new GChoice(t); - this.df.GChoice(n); - return n; - } - case ScribbleParser.GRECURSION: - { - GRecursion n = new GRecursion(t); - this.df.GRecursion(n); - return n; - } - - // Special cases - case ScribbleParser.EMPTY_OP: - { - OpNode n = new OpNode(t); // From Scribble.g, token (t) text is OpNode.EMPTY_OP_TOKEN_TEXT - this.df.OpNode(n); - return n; - } + case ScribbleParser.ID: n = new IdNode(t); break; + case ScribbleParser.EXTID: n = new ExtIdNode(t); break; + + // Simple names "constructed directly" by parser, e.g., t=ID -> ID<...Node>[$t] -- N.B. DelDecorator pass needed for them (CHECKME: also do those here instead? to deprecate DelDecorator) + + // Compound names + case ScribbleParser.GPROTO_NAME: n = new GProtoNameNode(t); break; + case ScribbleParser.MODULE_NAME: n = new ModuleNameNode(t); break; + case ScribbleParser.DATA_NAME: n = new DataNameNode(t); break; + case ScribbleParser.SIG_NAME: n = new SigNameNode(t); break; + + // Non-name (i.e., general) AST nodes + case ScribbleParser.MODULE: n = new Module(t); break; + case ScribbleParser.MODULEDECL: n = new ModuleDecl(t); break; + case ScribbleParser.IMPORTMODULE: n = new ImportModule(t); break; + + case ScribbleParser.DATADECL: n = new DataDecl(t); break; + case ScribbleParser.SIGDECL: n = new SigDecl(t); break; + case ScribbleParser.GPROTODECL: n = new GProtoDecl(t); break; + + // CHECKME: refactor into header? + case ScribbleParser.PROTOMOD_LIST: n = new ProtoModList(t); break; + case ScribbleParser.AUX_KW: n = new AuxMod(t); break; // FIXME: KW return by parser directly (cf. other tokens are imaginary) + case ScribbleParser.EXPLICIT_KW: n = new ExplicitMod(t); break; + + case ScribbleParser.GPROTOHEADER: n = new GProtoHeader(t); break; + case ScribbleParser.ROLEDECL_LIST: n = new RoleDeclList(t); break; + case ScribbleParser.ROLEDECL: n = new RoleDecl(t); break; + case ScribbleParser.PARAMDECL_LIST: + n = new NonRoleParamDeclList(t); + break; + case ScribbleParser.DATAPARAMDECL: n = new DataParamDecl(t); break; + case ScribbleParser.SIGPARAMDECL: n = new SigParamDecl(t); break; + + case ScribbleParser.GPROTODEF: n = new GProtoDef(t); break; + case ScribbleParser.GPROTOBLOCK: n = new GProtoBlock(t); break; + case ScribbleParser.GINTERSEQ: n = new GInteractionSeq(t); break; + + case ScribbleParser.SIG_LIT: n = new SigLitNode(t); break; + case ScribbleParser.PAYELEM_LIST: n = new PayElemList(t); break; + case ScribbleParser.UNARY_PAYELEM: n = new UnaryPayElem<>(t); break; + + case ScribbleParser.GCONNECT: n = new GConnect(t); break; + case ScribbleParser.GDCONN: n = new GDisconnect(t); break; + case ScribbleParser.GMSGTRANSFER: n = new GMsgTransfer(t); break; + case ScribbleParser.GWRAP: n = new GWrap(t); break; + + case ScribbleParser.GCONTINUE: n = new GContinue(t); break; + case ScribbleParser.GDO: n = new GDo(t); break; + + case ScribbleParser.ROLEARG_LIST: n = new RoleArgList(t); break; + case ScribbleParser.ROLEARG: n = new RoleArg(t); break; + case ScribbleParser.NONROLEARG_LIST: n = new NonRoleArgList(t); break; + case ScribbleParser.NONROLEARG: n = new NonRoleArg(t); break; + + case ScribbleParser.GCHOICE: n = new GChoice(t); break; + case ScribbleParser.GRECURSION: n = new GRecursion(t); break; + + // Special cases + case ScribbleParser.EMPTY_OP: n = new OpNode(t); break; // From Scribble.g, token (t) text is OpNode.EMPTY_OP_TOKEN_TEXT*/ default: { throw new RuntimeException("[TODO] Unknown token type (cf. ScribbleParser): " + t); } } + n.decorateDel(this.df); + return n; } } From bce774b16c2029c737eb54cbb4be545eb20f42eb Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 20:29:18 +0100 Subject: [PATCH 415/539] Refactoring AstFactory and del decoration. --- .../java/org/scribble/ast/ScribNodeBase.java | 1 + .../java/org/scribble/ast/AstFactoryImpl.java | 86 +++++++++---------- 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java index 62f9a45e8..5cc7202fa 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNodeBase.java @@ -136,6 +136,7 @@ public final ScribDel del() return this.del; } + // Decorate with a fresh del (cf. reconstruct: dupNode, setDel) public abstract void decorateDel(DelFactory df); // Defensive diff --git a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index 50c7b2ccc..eba555854 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -126,7 +126,7 @@ protected ScribDel createDefaultDelegate() return new DefaultDel(); } - // public for DelDecoratorImpl + // public for DelDecoratorImpl (used from there; not here directly) // Mutating setter public static void setDel(ScribNodeBase n, ScribDel del) { @@ -145,7 +145,7 @@ public IdNode IdNode(Token t, String text) t = newIdToken(t, text); // (Ext)IdNode is the only token with a "different" text to its node type -- info stored directly as its the text, no children IdNode n = new IdNode(t); - this.df.IdNode(n); + n.decorateDel(this.df); return n; } @@ -155,7 +155,7 @@ public ExtIdNode ExtIdNode(Token t, String text) t = newIdToken(t, text); // (Ext)IdNode is the only token with a "different" text to its node type -- info stored directly as its the text, no children ExtIdNode n = new ExtIdNode(t); - this.df.ExtIdNode(n); + n.decorateDel(this.df); return n; } @@ -166,7 +166,7 @@ public AmbigNameNode AmbigNameNode(Token t, String text) int ttype = ScribbleParser.ID; t = newIdToken(t, text); AmbigNameNode n = new AmbigNameNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] - this.df.AmbigNameNode(n); + n.decorateDel(this.df); return n; } @@ -176,7 +176,7 @@ public DataParamNode DataParamNode(Token t, String text) int ttype = ScribbleParser.ID; // N.B. cf. ScribbleParser.DATA_NAME t = newIdToken(t, text); DataParamNode n = new DataParamNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] - this.df.DataParamNode(n); + n.decorateDel(this.df); return n; } @@ -186,7 +186,7 @@ public OpNode OpNode(Token t, String text) int ttype = ScribbleParser.ID; t = newIdToken(t, text); OpNode n = new OpNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] - this.df.OpNode(n); + n.decorateDel(this.df); return n; } @@ -196,7 +196,7 @@ public RecVarNode RecVarNode(Token t, String text) int ttype = ScribbleParser.ID; t = newIdToken(t, text); RecVarNode n = new RecVarNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] - this.df.RecVarNode(n); + n.decorateDel(this.df); return n; } @@ -206,7 +206,7 @@ public RoleNode RoleNode(Token t, String text) int ttype = ScribbleParser.ID; t = newIdToken(t, text); RoleNode n = new RoleNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] - this.df.RoleNode(n); + n.decorateDel(this.df); return n; } @@ -216,7 +216,7 @@ public SigParamNode SigParamNode(Token t, String text) int ttype = ScribbleParser.ID; // N.B. cf. ScribbleParser.SIG_NAME t = newIdToken(t, text); SigParamNode n = new SigParamNode(ttype, t); // Cf. Scribble.g, ID<...Node>[$ID] - this.df.SigParamNode(n); + n.decorateDel(this.df); return n; } @@ -226,7 +226,7 @@ public DataNameNode DataNameNode(Token t, List elems) t = newToken(t, ScribbleParser.DATA_NAME); DataNameNode n = new DataNameNode(t); n.addChildren(elems); - this.df.DataNameNode(n); + n.decorateDel(this.df); return n; } @@ -236,7 +236,7 @@ public GProtoNameNode GProtoNameNode(Token t, List elems) t = newToken(t, ScribbleParser.GPROTO_NAME); GProtoNameNode n = new GProtoNameNode(t); n.addChildren(elems); - this.df.GProtoNameNode(n); + n.decorateDel(this.df); return n; } @@ -246,7 +246,7 @@ public ModuleNameNode ModuleNameNode(Token t, List elems) t = newToken(t, ScribbleParser.MODULE_NAME); ModuleNameNode n = new ModuleNameNode(t); n.addChildren(elems); - this.df.ModuleNameNode(n); + n.decorateDel(this.df); return n; } @@ -256,7 +256,7 @@ public SigNameNode SigNameNode(Token t, List elems) t = newToken(t, ScribbleParser.SIG_NAME); SigNameNode n = new SigNameNode(t); n.addChildren(elems); - this.df.SigNameNode(n); + n.decorateDel(this.df); return n; } @@ -273,7 +273,7 @@ public Module Module(Token t, ModuleDecl moddecl, List> imports, t = newToken(t, ScribbleParser.MODULE); Module n = new Module(t); n.addChildren1(moddecl, imports, data, protos); - this.df.Module(n); + n.decorateDel(this.df); return n; } @@ -283,7 +283,7 @@ public ModuleDecl ModuleDecl(Token t, ModuleNameNode fullname) t = newToken(t, ScribbleParser.MODULEDECL); ModuleDecl n = new ModuleDecl(t); n.addChildren1(fullname); - this.df.ModuleDecl(n); + n.decorateDel(this.df); return n; } @@ -294,7 +294,7 @@ public ImportModule ImportModule(Token t, ModuleNameNode modname, t = newToken(t, ScribbleParser.IMPORTMODULE); ImportModule n = new ImportModule(t); n.addChildren1(modname, alias); - this.df.ImportModule(n); + n.decorateDel(this.df); return n; } @@ -305,7 +305,7 @@ public DataDecl DataDecl(Token t, IdNode schema, ExtIdNode extName, t = newToken(t, ScribbleParser.DATADECL); DataDecl n = new DataDecl(t); n.addChildren1(alias, schema, extName, extSource); - this.df.DataDecl(n); + n.decorateDel(this.df); return n; } @@ -316,7 +316,7 @@ public SigDecl SigDecl(Token t, IdNode schema, ExtIdNode extName, t = newToken(t, ScribbleParser.SIGDECL); SigDecl n = new SigDecl(t); n.addChildren1(alias, schema, extName, extSource); - this.df.SigDecl(n); + n.decorateDel(this.df); return n; } @@ -327,7 +327,7 @@ public GProtoDecl GProtoDecl(Token t, ProtoModList mods, GProtoHeader header, t = newToken(t, ScribbleParser.GPROTODECL); GProtoDecl n = new GProtoDecl(t); n.addChildren1(mods, header, def); - this.df.GProtoDecl(n); + n.decorateDel(this.df); return n; } @@ -340,7 +340,7 @@ public GProtoHeader GProtocolHeader(Token t, GProtoNameNode name, t = newToken(t, ScribbleParser.GPROTOHEADER); GProtoHeader n = new GProtoHeader(t); n.addChildren1(name, ps, rs); - this.df.GProtoHeader(n); + n.decorateDel(this.df); return n; } @@ -350,7 +350,7 @@ public RoleDeclList RoleDeclList(Token t, List ds) t = newToken(t, ScribbleParser.ROLEDECL_LIST); RoleDeclList n = new RoleDeclList(t); n.addChildren1(ds); - this.df.RoleDeclList(n); + n.decorateDel(this.df); return n; } @@ -360,7 +360,7 @@ public RoleDecl RoleDecl(Token t, RoleNode r) t = newToken(t, ScribbleParser.ROLEDECL); RoleDecl n = new RoleDecl(t); n.addChildren1(r); - this.df.RoleDecl(n); + n.decorateDel(this.df); return n; } @@ -371,7 +371,7 @@ public NonRoleParamDeclList NonRoleParamDeclList(Token t, t = newToken(t, ScribbleParser.PARAMDECL_LIST); NonRoleParamDeclList n = new NonRoleParamDeclList(t); n.addChildren1(ds); - this.df.NonRoleParamDeclList(n); + n.decorateDel(this.df); return n; } @@ -381,7 +381,7 @@ public DataParamDecl DataParamDecl(Token t, DataParamNode p) t = newToken(t, ScribbleParser.DATAPARAMDECL); DataParamDecl n = new DataParamDecl(t); n.addChildren1(p); - this.df.DataParamDecl(n); + n.decorateDel(this.df); return n; } @@ -391,7 +391,7 @@ public SigParamDecl SigParamDecl(Token t, SigParamNode p) t = newToken(t, ScribbleParser.SIGPARAMDECL); SigParamDecl n = new SigParamDecl(t); n.addChildren1(p); - this.df.SigParamDecl(n); + n.decorateDel(this.df); return n; } @@ -410,7 +410,7 @@ public GProtoBlock GProtoBlock(Token t, GInteractionSeq seq) t = newToken(t, ScribbleParser.GPROTOBLOCK); GProtoBlock n = new GProtoBlock(t); n.addChildren1(seq); - this.df.GProtoBlock(n); + n.decorateDel(this.df); return n; } @@ -420,7 +420,7 @@ public GInteractionSeq GInteractionSeq(Token t, List elems) t = newToken(t, ScribbleParser.GINTERSEQ); GInteractionSeq n = new GInteractionSeq(t); n.addChildren1(elems); - this.df.GInteractionSeq(n); + n.decorateDel(this.df); return n; } @@ -430,7 +430,7 @@ public SigLitNode SigLitNode(Token t, OpNode op, PayElemList pay) t = newToken(t, ScribbleParser.SIG_LIT); SigLitNode n = new SigLitNode(t); n.addChildren1(op, pay); - this.df.SigLitNode(n); + n.decorateDel(this.df); return n; } @@ -440,7 +440,7 @@ public PayElemList PayElemList(Token t, List> elems) t = newToken(t, ScribbleParser.PAYELEM_LIST); PayElemList n = new PayElemList(t); n.addChildren1(elems); - this.df.PayElemList(n); + n.decorateDel(this.df); return n; } @@ -451,7 +451,7 @@ public UnaryPayElem UnaryPayElem(Token t, t = newToken(t, ScribbleParser.UNARY_PAYELEM); UnaryPayElem n = new UnaryPayElem<>(t); n.addChildren1(name); - this.df.UnaryPayElem(n); + n.decorateDel(this.df); return n; } @@ -462,7 +462,7 @@ public GDelegPayElem GDelegPayElem(Token t, GProtoNameNode proto, t = newToken(t, ScribbleParser.DELEG_PAYELEM); GDelegPayElem n = new GDelegPayElem(t); n.addChildren1(proto, role); - this.df.GDelegPayElem(n); + n.decorateDel(this.df); return n; } @@ -472,7 +472,7 @@ public GConnect GConnect(Token t, RoleNode src, MsgNode msg, RoleNode dst) t = newToken(t, ScribbleParser.GCONNECT); GConnect n = new GConnect(t); n.addChildren1(msg, src, Stream.of(dst).collect(Collectors.toList())); - this.df.GConnect(n); + n.decorateDel(this.df); return n; } @@ -482,7 +482,7 @@ public GDisconnect GDisconnect(Token t, RoleNode left, RoleNode right) t = newToken(t, ScribbleParser.GDCONN); GDisconnect n = new GDisconnect(t); n.addChildren1(left, right); - this.df.GDisconnect(n); + n.decorateDel(this.df); return n; } @@ -493,7 +493,7 @@ public GMsgTransfer GMsgTransfer(Token t, RoleNode src, MsgNode msg, t = newToken(t, ScribbleParser.GMSGTRANSFER); GMsgTransfer n = new GMsgTransfer(t); n.addChildren1(msg, src, dsts); - this.df.GMsgTransfer(n); + n.decorateDel(this.df); return n; } @@ -503,7 +503,7 @@ public GWrap GWrap(Token t, RoleNode src, RoleNode dst) t = newToken(t, ScribbleParser.GWRAP); GWrap n = new GWrap(t); n.addChildren1(src, dst); - this.df.GWrap(n); + n.decorateDel(this.df); return n; } @@ -513,7 +513,7 @@ public GContinue GContinue(Token t, RecVarNode rv) t = newToken(t, ScribbleParser.GCONTINUE); GContinue n = new GContinue(t); n.addChildren1(rv); - this.df.GContinue(n); + n.decorateDel(this.df); return n; } @@ -524,7 +524,7 @@ public GDo GDo(Token t, RoleArgList rs, NonRoleArgList as, t = newToken(t, ScribbleParser.GDO); GDo n = new GDo(t); n.addChildren1(proto, as, rs); - this.df.GDo(n); + n.decorateDel(this.df); return n; } @@ -534,7 +534,7 @@ public RoleArgList RoleArgList(Token t, List rs) t = newToken(t, ScribbleParser.ROLEARG_LIST); RoleArgList n = new RoleArgList(t); n.addChildren1(rs); - this.df.RoleArgList(n); + n.decorateDel(this.df); return n; } @@ -544,7 +544,7 @@ public RoleArg RoleArg(Token t, RoleNode r) t = newToken(t, ScribbleParser.ROLEARG); RoleArg n = new RoleArg(t); n.addChildren1(r); - this.df.RoleArg(n); + n.decorateDel(this.df); return n; } @@ -554,7 +554,7 @@ public NonRoleArgList NonRoleArgList(Token t, List as) t = newToken(t, ScribbleParser.NONROLEARG_LIST); NonRoleArgList n = new NonRoleArgList(t); n.addChildren1(as); - this.df.NonRoleArgList(n); + n.decorateDel(this.df); return n; } @@ -564,7 +564,7 @@ public NonRoleArg NonRoleArg(Token t, NonRoleArgNode arg) t = newToken(t, ScribbleParser.NONROLEARG); NonRoleArg n = new NonRoleArg(t); n.addChildren1(arg); - this.df.NonRoleArg(n); + n.decorateDel(this.df); return n; } @@ -574,7 +574,7 @@ public GChoice GChoice(Token t, RoleNode subj, List blocks) t = newToken(t, ScribbleParser.GCHOICE); GChoice n = new GChoice(t); n.addChildren1(subj, blocks); - this.df.GChoice(n); + n.decorateDel(this.df); return n; } @@ -584,7 +584,7 @@ public GRecursion GRecursion(Token t, RecVarNode rv, GProtoBlock block) t = newToken(t, ScribbleParser.GRECURSION); GRecursion n = new GRecursion(t); n.addChildren1(rv, block); - this.df.GRecursion(n); + n.decorateDel(this.df); return n; } } From aa64f5191acae535deeaccd112d5c5946be9af01 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 20:33:48 +0100 Subject: [PATCH 416/539] Refactoring AstFactory and del decoration. --- .../main/java/org/scribble/ast/Choice.java | 4 +- .../main/java/org/scribble/ast/Continue.java | 4 +- .../org/scribble/ast/DirectedInteraction.java | 4 +- .../org/scribble/ast/DisconnectAction.java | 4 +- .../src/main/java/org/scribble/ast/Do.java | 4 +- .../src/main/java/org/scribble/ast/DoArg.java | 4 +- .../main/java/org/scribble/ast/DoArgList.java | 4 +- .../java/org/scribble/ast/ImportModule.java | 4 +- .../java/org/scribble/ast/InteractionSeq.java | 4 +- .../main/java/org/scribble/ast/Module.java | 4 +- .../java/org/scribble/ast/ModuleDecl.java | 4 +- .../java/org/scribble/ast/NonProtoDecl.java | 4 +- .../scribble/ast/NonRoleParamDeclList.java | 4 +- .../main/java/org/scribble/ast/ParamDecl.java | 4 +- .../java/org/scribble/ast/ParamDeclList.java | 4 +- .../java/org/scribble/ast/PayElemList.java | 4 +- .../java/org/scribble/ast/ProtoBlock.java | 4 +- .../main/java/org/scribble/ast/ProtoDecl.java | 4 +- .../main/java/org/scribble/ast/ProtoDef.java | 4 +- .../java/org/scribble/ast/ProtoHeader.java | 4 +- .../main/java/org/scribble/ast/Recursion.java | 4 +- .../java/org/scribble/ast/SigLitNode.java | 4 +- .../java/org/scribble/ast/UnaryPayElem.java | 4 +- .../scribble/ast/global/GDelegPayElem.java | 4 +- .../java/org/scribble/ast/global/GWrap.java | 4 +- .../java/org/scribble/ast/AstFactoryImpl.java | 62 +++++++++---------- 26 files changed, 81 insertions(+), 81 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/Choice.java b/scribble-ast/src/main/java/org/scribble/ast/Choice.java index cb9ace0c8..4ebb49e38 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Choice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Choice.java @@ -50,7 +50,7 @@ public RoleNode getSubjectChild() public abstract List> getBlockChildren(); // "add", not "set" - public void addChildren1(RoleNode subj, List> blocks) + public void addScribChildren(RoleNode subj, List> blocks) { // Cf. above getters and Scribble.g children order addChild(subj); @@ -64,7 +64,7 @@ public Choice reconstruct(RoleNode subj, List> blocks) { Choice dup = dupNode(); - dup.addChildren1(subj, blocks); + dup.addScribChildren(subj, blocks); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/Continue.java b/scribble-ast/src/main/java/org/scribble/ast/Continue.java index 424e91101..f64dd6eb6 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Continue.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Continue.java @@ -38,7 +38,7 @@ protected Continue(Continue node) } // "add", not "set" - public void addChildren1(RecVarNode rv) + public void addScribChildren(RecVarNode rv) { // Cf. above getters and Scribble.g children order addChild(rv); @@ -54,7 +54,7 @@ public RecVarNode getRecVarChild() public Continue reconstruct(RecVarNode rv) { Continue dup = dupNode(); - dup.addChildren1(rv); + dup.addScribChildren(rv); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java index b1c0896a3..2b3eeda06 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DirectedInteraction.java @@ -67,7 +67,7 @@ public final List getDestinationRoles() } // "add", not "set" - public void addChildren1(MsgNode msg, RoleNode src, List dsts) + public void addScribChildren(MsgNode msg, RoleNode src, List dsts) { // Cf. above getters and Scribble.g children order addChild(msg); @@ -82,7 +82,7 @@ public DirectedInteraction reconstruct(MsgNode msg, RoleNode src, { DirectedInteraction dup = dupNode(); // Same order as getter indices - dup.addChildren1(msg, src, dsts); + dup.addScribChildren(msg, src, dsts); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java b/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java index 14459bcf8..d80f3c5fb 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java @@ -51,7 +51,7 @@ public RoleNode getRightChild() } // "add", not "set" - public void addChildren1(RoleNode left, RoleNode right) + public void addScribChildren(RoleNode left, RoleNode right) { // Cf. above getters and Scribble.g children order addChild(left); @@ -63,7 +63,7 @@ public void addChildren1(RoleNode left, RoleNode right) public DisconnectAction reconstruct(RoleNode left, RoleNode right) { DisconnectAction dup = dupNode(); - dup.addChildren1(left, right); + dup.addScribChildren(left, right); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/Do.java b/scribble-ast/src/main/java/org/scribble/ast/Do.java index f84bbeea0..d5fd89d7d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Do.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Do.java @@ -59,7 +59,7 @@ public RoleArgList getRoleListChild() } // "add", not "set" - public void addChildren1(ProtoNameNode proto, NonRoleArgList as, + public void addScribChildren(ProtoNameNode proto, NonRoleArgList as, RoleArgList rs) { // Cf. above getters and Scribble.g children order @@ -74,7 +74,7 @@ public Do reconstruct(ProtoNameNode proto, NonRoleArgList as, RoleArgList rs) { Do dup = dupNode(); - dup.addChildren1(proto, as, rs); + dup.addScribChildren(proto, as, rs); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/DoArg.java b/scribble-ast/src/main/java/org/scribble/ast/DoArg.java index 5af2052d3..cd063a8c3 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DoArg.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DoArg.java @@ -38,7 +38,7 @@ public DoArg(DoArg node) public abstract T getArgNodeChild(); // "add", not "set" - public void addChildren1(T arg) + public void addScribChildren(T arg) { // Cf. above getters and Scribble.g children order addChild(arg); @@ -49,7 +49,7 @@ public void addChildren1(T arg) public DoArg reconstruct(T arg) { DoArg dup = dupNode(); - dup.addChildren1(arg); + dup.addScribChildren(arg); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java b/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java index bdb951324..daccb7251 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DoArgList.java @@ -45,7 +45,7 @@ protected List getRawArgChildren() public abstract List getArgChildren(); // "add", not "set" - public void addChildren1(List args) + public void addScribChildren(List args) { // Cf. above getters and Scribble.g children order addChildren(args); @@ -57,7 +57,7 @@ public void addChildren1(List args) public DoArgList reconstruct(List args) { DoArgList dup = dupNode(); - dup.addChildren1(args); + dup.addScribChildren(args); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java b/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java index c2020e007..e81635491 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java @@ -54,7 +54,7 @@ public ModuleNameNode getAliasNameNodeChild() } // "add", not "set" - public void addChildren1(ModuleNameNode modname, ModuleNameNode alias) + public void addScribChildren(ModuleNameNode modname, ModuleNameNode alias) { // Cf. above getters and Scribble.g children order addChild(modname); @@ -81,7 +81,7 @@ public void decorateDel(DelFactory df) public ImportModule reconstruct(ModuleNameNode modname, ModuleNameNode alias) { ImportModule dup = dupNode(); - dup.addChildren1(modname, alias); + dup.addScribChildren(modname, alias); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java b/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java index feb1a4baa..60477d36f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java +++ b/scribble-ast/src/main/java/org/scribble/ast/InteractionSeq.java @@ -40,7 +40,7 @@ public InteractionSeq(InteractionSeq node) public abstract List> getInteractionChildren(); // "add", not "set" - public void addChildren1(List> elems) + public void addScribChildren(List> elems) { // Cf. above getters and Scribble.g children order addChildren(elems); @@ -52,7 +52,7 @@ public void addChildren1(List> elems) public InteractionSeq reconstruct(List> elems) { InteractionSeq dup = dupNode(); - dup.addChildren1(elems); + dup.addScribChildren(elems); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/Module.java b/scribble-ast/src/main/java/org/scribble/ast/Module.java index 7118ca7d2..0edb6a017 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Module.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Module.java @@ -88,7 +88,7 @@ private List getMemberChildren( } // "add", not "set" - public void addChildren1(ModuleDecl moddecl, List> imports, + public void addScribChildren(ModuleDecl moddecl, List> imports, List> data, List> protos) { // Cf. above getters and Scribble.g children order @@ -116,7 +116,7 @@ protected Module reconstruct(ModuleDecl moddecl, List> imports, List> data, List> protos) { Module dup = dupNode(); - dup.addChildren1(moddecl, imports, data, protos); + dup.addScribChildren(moddecl, imports, data, protos); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java index fa8cfbb61..98c24e591 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ModuleDecl.java @@ -43,7 +43,7 @@ public ModuleNameNode getNameNodeChild() } // "add", not "set" - public void addChildren1(ModuleNameNode name) + public void addScribChildren(ModuleNameNode name) { // Cf. above getters and Scribble.g children order addChild(name); @@ -65,7 +65,7 @@ public void decorateDel(DelFactory df) protected ModuleDecl reconstruct(ModuleNameNode name) { ModuleDecl dup = dupNode(); - dup.addChildren1(name); + dup.addScribChildren(name); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java b/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java index 2b0264af5..455747e2c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java @@ -73,7 +73,7 @@ public boolean isMessageSigNameDecl() } // "add", not "set" - public void addChildren1(NameNode name, IdNode schema, + public void addScribChildren(NameNode name, IdNode schema, ExtIdNode extName, ExtIdNode extSource) { // Cf. above getters and Scribble.g children order @@ -90,7 +90,7 @@ public NonProtoDecl reconstruct(NameNode name, IdNode schema, ExtIdNode extName, ExtIdNode extSource) { NonProtoDecl dup = dupNode(); - dup.addChildren1(name, schema, extName, extSource); + dup.addScribChildren(name, schema, extName, extSource); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java index 37e833246..286adc154 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java @@ -50,7 +50,7 @@ public List> getDeclChildren() } // "add", not "set" - public void addChildren1(List> ds) + public void addScribChildren(List> ds) { // Cf. above getters and Scribble.g children order super.addChildren(ds); @@ -73,7 +73,7 @@ public NonRoleParamDeclList reconstruct( List> ds) { NonRoleParamDeclList dup = dupNode(); - dup.addChildren1(ds); + dup.addScribChildren(ds); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ParamDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ParamDecl.java index a0e06220b..026e306a6 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ParamDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ParamDecl.java @@ -42,7 +42,7 @@ public ParamDecl(ParamDecl node) public abstract String getKeyword(); // "add", not "set" - public void addChildren1(NameNode name) + public void addScribChildren(NameNode name) { // Cf. above getters and Scribble.g children order addChild(name); @@ -53,7 +53,7 @@ public void addChildren1(NameNode name) public ParamDecl reconstruct(NameNode name) // Always a "simple" name (e.g., like Role), but Type/Sig names are not SimpleNames { ParamDecl dup = dupNode(); - dup.addChildren1(name); + dup.addScribChildren(name); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ParamDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/ParamDeclList.java index a21a16ab6..a6e9e296b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ParamDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ParamDeclList.java @@ -40,7 +40,7 @@ public ParamDeclList(ParamDeclList node) public abstract List> getDeclChildren(); // "add", not "set" - public void addChildren1(List> ds) + public void addScribChildren(List> ds) { // Cf. above getters and Scribble.g children order super.addChildren(ds); @@ -53,7 +53,7 @@ public ParamDeclList reconstruct( List> ds) { ParamDeclList dup = dupNode(); - dup.addChildren1(ds); + dup.addScribChildren(ds); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java b/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java index bbf78ef07..83320b044 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/PayElemList.java @@ -45,7 +45,7 @@ List> getElementChildren() } // "add", not "set" - public void addChildren1(List> elems) + public void addScribChildren(List> elems) { // Cf. above getters and Scribble.g children order super.addChildren(elems); @@ -66,7 +66,7 @@ public void decorateDel(DelFactory df) protected PayElemList reconstruct(List> elems) { PayElemList dup = dupNode(); - dup.addChildren1(elems); + dup.addScribChildren(elems); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtoBlock.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoBlock.java index bc8ce63be..292392c0d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtoBlock.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoBlock.java @@ -43,7 +43,7 @@ public boolean isEmpty() } // "add", not "set" - public void addChildren1(InteractionSeq seq) + public void addScribChildren(InteractionSeq seq) { // Cf. above getters and Scribble.g children order addChild(seq); @@ -55,7 +55,7 @@ public void addChildren1(InteractionSeq seq) public ProtoBlock reconstruct(InteractionSeq seq) { ProtoBlock dup = dupNode(); - dup.addChildren1(seq); + dup.addScribChildren(seq); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java index a9bee391d..c06ebfa06 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java @@ -61,7 +61,7 @@ public boolean isExplicit() } // "add", not "set" - public void addChildren1(ProtoModList mods, ProtoHeader header, + public void addScribChildren(ProtoModList mods, ProtoHeader header, ProtoDef def) { // Cf. above getters and Scribble.g children order @@ -76,7 +76,7 @@ public ProtoDecl reconstruct(ProtoModList mods, ProtoHeader header, ProtoDef def) { ProtoDecl dup = dupNode(); - dup.addChildren1(mods, header, def); + dup.addScribChildren(mods, header, def); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtoDef.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoDef.java index 1266498bf..85d75c949 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtoDef.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoDef.java @@ -37,7 +37,7 @@ protected ProtoDef(ProtoDef node) public abstract ProtoBlock getBlockChild(); // "add", not "set" - public void addChildren1(ProtoBlock block) + public void addScribChildren(ProtoBlock block) { // Cf. above getters and Scribble.g children order addChild(block); @@ -48,7 +48,7 @@ public void addChildren1(ProtoBlock block) public ProtoDef reconstruct(ProtoBlock block) { ProtoDef dup = dupNode(); - dup.addChildren1(block); + dup.addScribChildren(block); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtoHeader.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoHeader.java index 3751d5e68..980f1a32c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtoHeader.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoHeader.java @@ -56,7 +56,7 @@ public RoleDeclList getRoleDeclListChild() } // "add", not "set" - public void addChildren1(ProtoNameNode name, NonRoleParamDeclList ps, + public void addScribChildren(ProtoNameNode name, NonRoleParamDeclList ps, RoleDeclList rs) { // Cf. above getters and Scribble.g children order @@ -71,7 +71,7 @@ public ProtoHeader reconstruct(ProtoNameNode name, NonRoleParamDeclList ps RoleDeclList rs) { ProtoHeader dup = dupNode(); - dup.addChildren1(name, ps, rs); + dup.addScribChildren(name, ps, rs); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/Recursion.java b/scribble-ast/src/main/java/org/scribble/ast/Recursion.java index a15b46d68..7cc0d6519 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Recursion.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Recursion.java @@ -46,7 +46,7 @@ public RecVarNode getRecVarChild() } // "add", not "set" - public void addChildren1(RecVarNode recvar, ProtoBlock block) + public void addScribChildren(RecVarNode recvar, ProtoBlock block) { // Cf. above getters and Scribble.g children order addChild(recvar); @@ -58,7 +58,7 @@ public void addChildren1(RecVarNode recvar, ProtoBlock block) public Recursion reconstruct(RecVarNode recvar, ProtoBlock block) { Recursion dup = dupNode(); - dup.addChildren1(recvar, block); + dup.addScribChildren(recvar, block); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java b/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java index 6aa692128..b7d31ee32 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SigLitNode.java @@ -48,7 +48,7 @@ public PayElemList getPayloadListChild() } // "add", not "set" - public void addChildren1(OpNode op, PayElemList pay) + public void addScribChildren(OpNode op, PayElemList pay) { addChild(op); addChild(pay); @@ -69,7 +69,7 @@ public void decorateDel(DelFactory df) public SigLitNode reconstruct(OpNode op, PayElemList pay) { SigLitNode dup = dupNode(); - dup.addChildren1(op, pay); + dup.addScribChildren(op, pay); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java index cde1bd280..8066acbfc 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/UnaryPayElem.java @@ -57,7 +57,7 @@ public PayElemNameNode getNameChild() } // "add", not "set" - public void addChildren1(PayElemNameNode name) + public void addScribChildren(PayElemNameNode name) { // Cf. above getters and Scribble.g children order addChild(name); @@ -78,7 +78,7 @@ public void decorateDel(DelFactory df) public UnaryPayElem reconstruct(PayElemNameNode name) { UnaryPayElem dup = dupNode(); - dup.addChildren1(name); + dup.addScribChildren(name); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java index 3ea714a44..ba094b6f1 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java @@ -57,7 +57,7 @@ public RoleNode getRoleChild() } // "add", not "set" - public void addChildren1(GProtoNameNode proto, RoleNode role) + public void addScribChildren(GProtoNameNode proto, RoleNode role) { // Cf. above getters and Scribble.g children order addChild(proto); @@ -79,7 +79,7 @@ public void decorateDel(DelFactory df) public GDelegPayElem reconstruct(GProtoNameNode proto, RoleNode role) { GDelegPayElem dup = dupNode(); - addChildren1(proto, role); + addScribChildren(proto, role); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java index 4d4c64645..3a7933129 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java @@ -52,7 +52,7 @@ public RoleNode getServerChild() } // "add", not "set" - public void addChildren1(RoleNode client, RoleNode server) + public void addScribChildren(RoleNode client, RoleNode server) { // Cf. above getters and Scribble.g children order addChild(client); @@ -74,7 +74,7 @@ public void decorateDel(DelFactory df) public GWrap reconstruct(RoleNode client, RoleNode server) { GWrap n = dupNode(); - n.addChildren1(client, server); + n.addScribChildren(client, server); n.setDel(del()); // No copy return n; } diff --git a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index eba555854..cffdee72e 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -272,7 +272,7 @@ public Module Module(Token t, ModuleDecl moddecl, List> imports, { t = newToken(t, ScribbleParser.MODULE); Module n = new Module(t); - n.addChildren1(moddecl, imports, data, protos); + n.addScribChildren(moddecl, imports, data, protos); n.decorateDel(this.df); return n; } @@ -282,7 +282,7 @@ public ModuleDecl ModuleDecl(Token t, ModuleNameNode fullname) { t = newToken(t, ScribbleParser.MODULEDECL); ModuleDecl n = new ModuleDecl(t); - n.addChildren1(fullname); + n.addScribChildren(fullname); n.decorateDel(this.df); return n; } @@ -293,7 +293,7 @@ public ImportModule ImportModule(Token t, ModuleNameNode modname, { t = newToken(t, ScribbleParser.IMPORTMODULE); ImportModule n = new ImportModule(t); - n.addChildren1(modname, alias); + n.addScribChildren(modname, alias); n.decorateDel(this.df); return n; } @@ -304,7 +304,7 @@ public DataDecl DataDecl(Token t, IdNode schema, ExtIdNode extName, { t = newToken(t, ScribbleParser.DATADECL); DataDecl n = new DataDecl(t); - n.addChildren1(alias, schema, extName, extSource); + n.addScribChildren(alias, schema, extName, extSource); n.decorateDel(this.df); return n; } @@ -315,7 +315,7 @@ public SigDecl SigDecl(Token t, IdNode schema, ExtIdNode extName, { t = newToken(t, ScribbleParser.SIGDECL); SigDecl n = new SigDecl(t); - n.addChildren1(alias, schema, extName, extSource); + n.addScribChildren(alias, schema, extName, extSource); n.decorateDel(this.df); return n; } @@ -326,7 +326,7 @@ public GProtoDecl GProtoDecl(Token t, ProtoModList mods, GProtoHeader header, { t = newToken(t, ScribbleParser.GPROTODECL); GProtoDecl n = new GProtoDecl(t); - n.addChildren1(mods, header, def); + n.addScribChildren(mods, header, def); n.decorateDel(this.df); return n; } @@ -339,7 +339,7 @@ public GProtoHeader GProtocolHeader(Token t, GProtoNameNode name, { t = newToken(t, ScribbleParser.GPROTOHEADER); GProtoHeader n = new GProtoHeader(t); - n.addChildren1(name, ps, rs); + n.addScribChildren(name, ps, rs); n.decorateDel(this.df); return n; } @@ -349,7 +349,7 @@ public RoleDeclList RoleDeclList(Token t, List ds) { t = newToken(t, ScribbleParser.ROLEDECL_LIST); RoleDeclList n = new RoleDeclList(t); - n.addChildren1(ds); + n.addScribChildren(ds); n.decorateDel(this.df); return n; } @@ -359,7 +359,7 @@ public RoleDecl RoleDecl(Token t, RoleNode r) { t = newToken(t, ScribbleParser.ROLEDECL); RoleDecl n = new RoleDecl(t); - n.addChildren1(r); + n.addScribChildren(r); n.decorateDel(this.df); return n; } @@ -370,7 +370,7 @@ public NonRoleParamDeclList NonRoleParamDeclList(Token t, { t = newToken(t, ScribbleParser.PARAMDECL_LIST); NonRoleParamDeclList n = new NonRoleParamDeclList(t); - n.addChildren1(ds); + n.addScribChildren(ds); n.decorateDel(this.df); return n; } @@ -380,7 +380,7 @@ public DataParamDecl DataParamDecl(Token t, DataParamNode p) { t = newToken(t, ScribbleParser.DATAPARAMDECL); DataParamDecl n = new DataParamDecl(t); - n.addChildren1(p); + n.addScribChildren(p); n.decorateDel(this.df); return n; } @@ -390,7 +390,7 @@ public SigParamDecl SigParamDecl(Token t, SigParamNode p) { t = newToken(t, ScribbleParser.SIGPARAMDECL); SigParamDecl n = new SigParamDecl(t); - n.addChildren1(p); + n.addScribChildren(p); n.decorateDel(this.df); return n; } @@ -400,7 +400,7 @@ public GProtoDef GProtoDef(Token t, GProtoBlock block) { t = newToken(t, ScribbleParser.GPROTODEF); GProtoDef n = new GProtoDef(t); - n.addChildren1(block); + n.addScribChildren(block); return n; } @@ -409,7 +409,7 @@ public GProtoBlock GProtoBlock(Token t, GInteractionSeq seq) { t = newToken(t, ScribbleParser.GPROTOBLOCK); GProtoBlock n = new GProtoBlock(t); - n.addChildren1(seq); + n.addScribChildren(seq); n.decorateDel(this.df); return n; } @@ -419,7 +419,7 @@ public GInteractionSeq GInteractionSeq(Token t, List elems) { t = newToken(t, ScribbleParser.GINTERSEQ); GInteractionSeq n = new GInteractionSeq(t); - n.addChildren1(elems); + n.addScribChildren(elems); n.decorateDel(this.df); return n; } @@ -429,7 +429,7 @@ public SigLitNode SigLitNode(Token t, OpNode op, PayElemList pay) { t = newToken(t, ScribbleParser.SIG_LIT); SigLitNode n = new SigLitNode(t); - n.addChildren1(op, pay); + n.addScribChildren(op, pay); n.decorateDel(this.df); return n; } @@ -439,7 +439,7 @@ public PayElemList PayElemList(Token t, List> elems) { t = newToken(t, ScribbleParser.PAYELEM_LIST); PayElemList n = new PayElemList(t); - n.addChildren1(elems); + n.addScribChildren(elems); n.decorateDel(this.df); return n; } @@ -450,7 +450,7 @@ public UnaryPayElem UnaryPayElem(Token t, { t = newToken(t, ScribbleParser.UNARY_PAYELEM); UnaryPayElem n = new UnaryPayElem<>(t); - n.addChildren1(name); + n.addScribChildren(name); n.decorateDel(this.df); return n; } @@ -461,7 +461,7 @@ public GDelegPayElem GDelegPayElem(Token t, GProtoNameNode proto, { t = newToken(t, ScribbleParser.DELEG_PAYELEM); GDelegPayElem n = new GDelegPayElem(t); - n.addChildren1(proto, role); + n.addScribChildren(proto, role); n.decorateDel(this.df); return n; } @@ -471,7 +471,7 @@ public GConnect GConnect(Token t, RoleNode src, MsgNode msg, RoleNode dst) { t = newToken(t, ScribbleParser.GCONNECT); GConnect n = new GConnect(t); - n.addChildren1(msg, src, Stream.of(dst).collect(Collectors.toList())); + n.addScribChildren(msg, src, Stream.of(dst).collect(Collectors.toList())); n.decorateDel(this.df); return n; } @@ -481,7 +481,7 @@ public GDisconnect GDisconnect(Token t, RoleNode left, RoleNode right) { t = newToken(t, ScribbleParser.GDCONN); GDisconnect n = new GDisconnect(t); - n.addChildren1(left, right); + n.addScribChildren(left, right); n.decorateDel(this.df); return n; } @@ -492,7 +492,7 @@ public GMsgTransfer GMsgTransfer(Token t, RoleNode src, MsgNode msg, { t = newToken(t, ScribbleParser.GMSGTRANSFER); GMsgTransfer n = new GMsgTransfer(t); - n.addChildren1(msg, src, dsts); + n.addScribChildren(msg, src, dsts); n.decorateDel(this.df); return n; } @@ -502,7 +502,7 @@ public GWrap GWrap(Token t, RoleNode src, RoleNode dst) { t = newToken(t, ScribbleParser.GWRAP); GWrap n = new GWrap(t); - n.addChildren1(src, dst); + n.addScribChildren(src, dst); n.decorateDel(this.df); return n; } @@ -512,7 +512,7 @@ public GContinue GContinue(Token t, RecVarNode rv) { t = newToken(t, ScribbleParser.GCONTINUE); GContinue n = new GContinue(t); - n.addChildren1(rv); + n.addScribChildren(rv); n.decorateDel(this.df); return n; } @@ -523,7 +523,7 @@ public GDo GDo(Token t, RoleArgList rs, NonRoleArgList as, { t = newToken(t, ScribbleParser.GDO); GDo n = new GDo(t); - n.addChildren1(proto, as, rs); + n.addScribChildren(proto, as, rs); n.decorateDel(this.df); return n; } @@ -533,7 +533,7 @@ public RoleArgList RoleArgList(Token t, List rs) { t = newToken(t, ScribbleParser.ROLEARG_LIST); RoleArgList n = new RoleArgList(t); - n.addChildren1(rs); + n.addScribChildren(rs); n.decorateDel(this.df); return n; } @@ -543,7 +543,7 @@ public RoleArg RoleArg(Token t, RoleNode r) { t = newToken(t, ScribbleParser.ROLEARG); RoleArg n = new RoleArg(t); - n.addChildren1(r); + n.addScribChildren(r); n.decorateDel(this.df); return n; } @@ -553,7 +553,7 @@ public NonRoleArgList NonRoleArgList(Token t, List as) { t = newToken(t, ScribbleParser.NONROLEARG_LIST); NonRoleArgList n = new NonRoleArgList(t); - n.addChildren1(as); + n.addScribChildren(as); n.decorateDel(this.df); return n; } @@ -563,7 +563,7 @@ public NonRoleArg NonRoleArg(Token t, NonRoleArgNode arg) { t = newToken(t, ScribbleParser.NONROLEARG); NonRoleArg n = new NonRoleArg(t); - n.addChildren1(arg); + n.addScribChildren(arg); n.decorateDel(this.df); return n; } @@ -573,7 +573,7 @@ public GChoice GChoice(Token t, RoleNode subj, List blocks) { t = newToken(t, ScribbleParser.GCHOICE); GChoice n = new GChoice(t); - n.addChildren1(subj, blocks); + n.addScribChildren(subj, blocks); n.decorateDel(this.df); return n; } @@ -583,7 +583,7 @@ public GRecursion GRecursion(Token t, RecVarNode rv, GProtoBlock block) { t = newToken(t, ScribbleParser.GRECURSION); GRecursion n = new GRecursion(t); - n.addChildren1(rv, block); + n.addScribChildren(rv, block); n.decorateDel(this.df); return n; } From 1fc83f53c53aa6bba689b42c0ec35563c85ab0b7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 20:47:03 +0100 Subject: [PATCH 417/539] [INSTALL] Fixed Scribble.g block comment prefix typo. --- .../src/main/java/org/scribble/job/Job.java | 4 +++- .../core/type/session/global/GTypeFactory.java | 13 +++++++++++++ .../core/type/session/global/GTypeFactoryImpl.java | 13 +++++++++++++ .../core/type/session/local/LTypeFactory.java | 13 +++++++++++++ .../core/type/session/local/LTypeFactoryImpl.java | 13 +++++++++++++ .../antlr3/org/scribble/parser/antlr/Scribble.g | 3 ++- scribble-test/src/test/scrib/tmp/Test.scr | 4 ++-- 7 files changed, 59 insertions(+), 4 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 58b8b136e..9860dec4a 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -135,7 +135,9 @@ public void runPasses() throws ScribException // Disamb is a "leftover" aspect of parsing -- so not in core // N.B. disamb is mainly w.r.t. ambignames -- e.g., doesn't fully qualify names (currently mainly done by imed translation) // CHECKME: disamb also currently does checks like do-arg kind and arity -- refactor into core? -- also does, e.g., distinct roledecls, protodecls, etc. - runVisitorPassOnAllModules(this.config.vf.DelDecorator(this)); // Currently, only the simple name nodes "constructed directly" by parser, e.g., t=ID -> ID<...Node>[$t] + runVisitorPassOnAllModules(this.config.vf.DelDecorator(this)); + // Currently, only for the simple name nodes "constructed directly" by parser, e.g., t=ID -> ID<...Node>[$t] + // CHECKME: refactor to construct (and set del) all uniformly via ScribTreeAdaptor, to deprecate DelDecorator? runVisitorPassOnAllModules(this.config.vf.NameDisambiguator(this)); // Includes validating names used in subprotocol calls.. } diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactory.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactory.java index e9b6d1971..9065e58b1 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactory.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.type.session.global; import java.util.List; diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactoryImpl.java index 91ac03ec6..de4d309d5 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GTypeFactoryImpl.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.type.session.global; import java.util.List; diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactory.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactory.java index 1ef1aa685..ced6d8ba2 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactory.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.type.session.local; import java.util.List; diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactoryImpl.java index ac6faa08f..2f3e244f0 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LTypeFactoryImpl.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.type.session.local; import java.util.List; diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 234721043..44a8c5970 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -10,7 +10,7 @@ * $ mv scribble-parser/target/generated-sources/antlr3/org/scribble/parser/antlr/Scribble.tokens scribble-parser/target/generated-sources/antlr3/ */ -/** +/* * -- ** not allowed here..... * Pattern: most nodes have "imaginary token types". * Where token attributes are not "inherited" from a concrete token, the default is to use textual name of the token type field as its text * e.g., gprotodecl: ... -> ^(GPROTODECL ...). I.e., each token will be equivalent to, e.g., new CommonToken(ScribbleParser.GPROTODECL, "GPROTODECL"). @@ -198,6 +198,7 @@ tokens } + /**************************************************************************** * Chapter 2 Lexical Structure (Lexer rules) ***************************************************************************/ diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index b7d2bf0e9..bb8a6b290 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -81,7 +81,6 @@ module tmp.Test; // Outstanding: // ...disallow/check for reserved __ -- do in gtype translation? // FIXME: qualifed sig name as non-role do-arg - // TODO: rename addChildren1 // CHECKME: duplicate proto mods (unit tests) // ...check ad hoc ScribNode constructions go through af properly @@ -89,8 +88,9 @@ module tmp.Test; // split mf to global/local subcomps, make protected constrs -- done // check G/LType casts vs. SType (favour latter) -- done: simplified Seq elems, removed Do.proto N param // ...store unfoldings in Context -- done + // use stypefactory in core -- also make visitorfactorys (both core and ast) -- done + // TODO: rename addChildren1 -- done: addScribChildren - // use stypefactory in core -- also make visitorfactorys (both core and ast) // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) // factor out all config factory methods more centrally? // Job Module projection From e3a5d7044a53a7982fee1a4cef3e9eb5ea77eaf5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 20:50:12 +0100 Subject: [PATCH 418/539] [AllTest] Minor. --- scribble-ast/src/main/java/org/scribble/job/Job.java | 6 +++--- scribble-main/src/main/java/org/scribble/main/Main.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 9860dec4a..ef2c2bac1 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -88,12 +88,12 @@ public final Core getCore() throws ScribException { if (this.core == null) { - STypeFactory tf = newSTypeFactory(); Map parsed = this.context.getParsed(); Set imeds = new HashSet<>(); for (ModuleName fullname : parsed.keySet()) { - GTypeTranslator t = this.config.vf.GTypeTranslator(this, fullname, tf); + GTypeTranslator t = this.config.vf.GTypeTranslator(this, fullname, + this.config.tf); // CHECKME: factor out STypeTranslator, for future local parsing Module m = parsed.get(fullname); for (GProtoDecl ast : m.getGProtoDeclChildren()) @@ -108,7 +108,7 @@ public final Core getCore() throws ScribException } this.core = newCore(this.config.main, this.config.args, //this.context.getModuleContexts(), - imeds, tf); + imeds, this.config.tf); } return this.core; } diff --git a/scribble-main/src/main/java/org/scribble/main/Main.java b/scribble-main/src/main/java/org/scribble/main/Main.java index 88166b21d..10e82a04c 100644 --- a/scribble-main/src/main/java/org/scribble/main/Main.java +++ b/scribble-main/src/main/java/org/scribble/main/Main.java @@ -129,7 +129,7 @@ protected AstFactory newAstFactory(ScribAntlrWrapper antlr) return new AstFactoryImpl(antlr); } - // Here (cf. Job) because used by this.antlr and this.af (and lives in scribble-parser) + // Here (cf. Job) because df used by this.antlr and this.af (and lives in scribble-parser) protected DelFactory newDelFactory() { return new DelFactoryImpl(); From e53ce8e1411fc49e227a094d74ded62fb6c6b597 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 20:56:57 +0100 Subject: [PATCH 419/539] [AllTest] Minor. --- scribble-ast/src/main/java/org/scribble/job/Job.java | 1 + scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index ef2c2bac1..a7632c4b2 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -59,6 +59,7 @@ protected AstVisitorFactory newAstVisitorFactory() return new AstVisitorFactoryImpl(); } + // Used by GTypeTranslator (cf. getCore) protected STypeFactory newSTypeFactory() { return new STypeFactory(new GTypeFactoryImpl(), diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index bb8a6b290..aa748f1f1 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -89,10 +89,10 @@ module tmp.Test; // check G/LType casts vs. SType (favour latter) -- done: simplified Seq elems, removed Do.proto N param // ...store unfoldings in Context -- done // use stypefactory in core -- also make visitorfactorys (both core and ast) -- done + // factor out all config factory methods more centrally? -- done a bit: mainly general factory method refactoring above // TODO: rename addChildren1 -- done: addScribChildren // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) - // factor out all config factory methods more centrally? // Job Module projection // TODO: fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles // old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? From fa1e612f055e9416fd393772d0cc73f73de3066f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 21:05:48 +0100 Subject: [PATCH 420/539] [AllTest] Minor. --- .../src/main/java/org/scribble/job/Job.java | 12 +- .../main/java/org/scribble/job/JobConfig.java | 6 +- .../main/java/org/scribble/core/job/Core.java | 12 +- .../org/scribble/core/job/CoreConfig.java | 6 +- .../scribble/core/lang/local/LProtocol.java | 7 +- .../model/visit/local/NonDetPayChecker.java | 1 + ...rFactory.java => STypeVisitorFactory.java} | 2 +- ...Impl.java => STypeVisitorFactoryImpl.java} | 2 +- .../org/scribble/parser/ScribTreeAdaptor.java | 120 +++++++++--------- 9 files changed, 84 insertions(+), 84 deletions(-) rename scribble-core/src/main/java/org/scribble/core/visit/{VisitorFactory.java => STypeVisitorFactory.java} (97%) rename scribble-core/src/main/java/org/scribble/core/visit/{VisitorFactoryImpl.java => STypeVisitorFactoryImpl.java} (97%) diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index a7632c4b2..5ec2737d8 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -30,8 +30,8 @@ import org.scribble.del.DelFactory; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -import org.scribble.visit.AstVisitorFactory; -import org.scribble.visit.AstVisitorFactoryImpl; +import org.scribble.visit.VisitorFactory; +import org.scribble.visit.VisitorFactoryImpl; import org.scribble.visit.GTypeTranslator; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models @@ -48,15 +48,15 @@ public Job(ModuleName mainFullname, Map args, throws ScribException { // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource - AstVisitorFactory vf = newAstVisitorFactory(); + VisitorFactory vf = newAstVisitorFactory(); STypeFactory tf = newSTypeFactory(); this.config = newJobConfig(mainFullname, args, af, df, vf, tf); this.context = newJobContext(this, parsed); // Single instance per Job, should not be shared between Jobs } - protected AstVisitorFactory newAstVisitorFactory() + protected VisitorFactory newAstVisitorFactory() { - return new AstVisitorFactoryImpl(); + return new VisitorFactoryImpl(); } // Used by GTypeTranslator (cf. getCore) @@ -69,7 +69,7 @@ protected STypeFactory newSTypeFactory() // A Scribble extension should override newJobConfig/Context/Core as appropriate protected JobConfig newJobConfig(ModuleName mainFullname, Map args, AstFactory af, DelFactory df, - AstVisitorFactory vf, STypeFactory tf) + VisitorFactory vf, STypeFactory tf) { return new JobConfig(mainFullname, args, af, df, vf, tf); } diff --git a/scribble-ast/src/main/java/org/scribble/job/JobConfig.java b/scribble-ast/src/main/java/org/scribble/job/JobConfig.java index d5740b1ad..373864478 100644 --- a/scribble-ast/src/main/java/org/scribble/job/JobConfig.java +++ b/scribble-ast/src/main/java/org/scribble/job/JobConfig.java @@ -21,7 +21,7 @@ import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.session.STypeFactory; import org.scribble.del.DelFactory; -import org.scribble.visit.AstVisitorFactory; +import org.scribble.visit.VisitorFactory; // The "static" (constant) info for Lang -- cf. LangContext "dynamic" state public class JobConfig @@ -32,12 +32,12 @@ public class JobConfig public final AstFactory af; public final DelFactory df; - public final AstVisitorFactory vf; + public final VisitorFactory vf; public final STypeFactory tf; // N.B. MainContext is in a different non-visible (by Maven) package public JobConfig(ModuleName mainFullname, Map args, - AstFactory af, DelFactory df, AstVisitorFactory vf, STypeFactory tf) + AstFactory af, DelFactory df, VisitorFactory vf, STypeFactory tf) { this.main = mainFullname; this.args = Collections.unmodifiableMap(args); diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 5886dd43b..5a1319414 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -41,8 +41,8 @@ import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.visit.ProtoDepsCollector; -import org.scribble.core.visit.VisitorFactory; -import org.scribble.core.visit.VisitorFactoryImpl; +import org.scribble.core.visit.STypeVisitorFactory; +import org.scribble.core.visit.STypeVisitorFactoryImpl; import org.scribble.core.visit.gather.NonProtoDepsGatherer; import org.scribble.core.visit.gather.RoleGatherer; import org.scribble.util.ScribException; @@ -63,9 +63,9 @@ public Core(ModuleName mainFullname, Map args, imeds); // Single instance per Core and should never be shared } - protected VisitorFactory newVisitorFactory() + protected STypeVisitorFactory newVisitorFactory() { - return new VisitorFactoryImpl(); + return new STypeVisitorFactoryImpl(); } protected ModelFactory newModelFactory() @@ -78,7 +78,7 @@ protected ModelFactory newModelFactory() protected CoreConfig newCoreConfig(ModuleName mainFullname, Map args, STypeFactory tf) { - VisitorFactory vf = newVisitorFactory(); + STypeVisitorFactory vf = newVisitorFactory(); ModelFactory mf = newModelFactory(); return new CoreConfig(mainFullname, args, tf, vf, mf); // CHECKME: combine E/SModelFactory? @@ -233,7 +233,7 @@ protected void runProjectionSyntaxWfPasses() throws ScribException for (Role self : inlined.roles) { LProjection iproj = this.context.getProjectedInlined(fullname, self); - iproj.checkReachability(); + iproj.checkReachability(this); } } } diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreConfig.java b/scribble-core/src/main/java/org/scribble/core/job/CoreConfig.java index b12305f77..4551274cd 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreConfig.java @@ -19,7 +19,7 @@ import org.scribble.core.model.ModelFactory; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.session.STypeFactory; -import org.scribble.core.visit.VisitorFactory; +import org.scribble.core.visit.STypeVisitorFactory; // The "static" (constant) info for Jobs -- cf. JobContext "dynamic" state public class CoreConfig @@ -28,12 +28,12 @@ public class CoreConfig public final Map args; // CHECKME: verbose/debug printing parameter ? public final STypeFactory tf; - public final VisitorFactory vf; + public final STypeVisitorFactory vf; public final ModelFactory mf; // N.B. MainContext is in a different non-visible (by Maven) package public CoreConfig(ModuleName main, Map args, - STypeFactory tf, VisitorFactory vf, ModelFactory mf) + STypeFactory tf, STypeVisitorFactory vf, ModelFactory mf) { this.main = main; this.args = Collections.unmodifiableMap(args); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 1729cc1f9..0115bff54 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -31,9 +31,9 @@ import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.SigName; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.local.LRecursion; import org.scribble.core.type.session.local.LSeq; @@ -42,7 +42,6 @@ import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.Substitutor; import org.scribble.core.visit.local.EGraphBuilder; -import org.scribble.core.visit.local.ReachabilityChecker; import org.scribble.util.Constants; import org.scribble.util.ScribException; @@ -66,9 +65,9 @@ public LProtocol reconstruct(CommonTree source, return new LProtocol(source, mods, fullname, roles, self, params, def); } - public void checkReachability() throws ScribException + public void checkReachability(Core core) throws ScribException { - this.def.visitWith(new ReachabilityChecker()); + this.def.visitWith(core.config.vf.ReachabilityChecker()); } // CHECKME: drop from Protocol (after removing Protocol from SType?) diff --git a/scribble-core/src/main/java/org/scribble/core/model/visit/local/NonDetPayChecker.java b/scribble-core/src/main/java/org/scribble/core/model/visit/local/NonDetPayChecker.java index bd14040cd..dcca36997 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/visit/local/NonDetPayChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/model/visit/local/NonDetPayChecker.java @@ -19,6 +19,7 @@ import org.scribble.core.model.endpoint.actions.EAction; import org.scribble.util.ScribException; +// CHECKME: should make via factory method? cf. VisitorFactory public class NonDetPayChecker extends EStateVisitor { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/VisitorFactory.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/core/visit/VisitorFactory.java rename to scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java index f5f63114d..3c2cd981c 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/VisitorFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java @@ -28,7 +28,7 @@ import org.scribble.core.visit.local.InlinedExtChoiceSubjFixer; import org.scribble.core.visit.local.ReachabilityChecker; -public interface VisitorFactory +public interface STypeVisitorFactory { GTypeInliner GTypeInliner(Core core); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/VisitorFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java similarity index 97% rename from scribble-core/src/main/java/org/scribble/core/visit/VisitorFactoryImpl.java rename to scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java index 751d42076..4764064ea 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/VisitorFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java @@ -28,7 +28,7 @@ import org.scribble.core.visit.local.InlinedExtChoiceSubjFixer; import org.scribble.core.visit.local.ReachabilityChecker; -public class VisitorFactoryImpl implements VisitorFactory +public class STypeVisitorFactoryImpl implements STypeVisitorFactory { @Override diff --git a/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java index a40f5f81f..c0739a646 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java @@ -88,66 +88,66 @@ public ScribNode create(Token t) ScribNodeBase n; switch (t.getType()) { - case ScribbleParser.ID: n = new IdNode(t); break; - case ScribbleParser.EXTID: n = new ExtIdNode(t); break; - - // Simple names "constructed directly" by parser, e.g., t=ID -> ID<...Node>[$t] -- N.B. DelDecorator pass needed for them (CHECKME: also do those here instead? to deprecate DelDecorator) - - // Compound names - case ScribbleParser.GPROTO_NAME: n = new GProtoNameNode(t); break; - case ScribbleParser.MODULE_NAME: n = new ModuleNameNode(t); break; - case ScribbleParser.DATA_NAME: n = new DataNameNode(t); break; - case ScribbleParser.SIG_NAME: n = new SigNameNode(t); break; - - // Non-name (i.e., general) AST nodes - case ScribbleParser.MODULE: n = new Module(t); break; - case ScribbleParser.MODULEDECL: n = new ModuleDecl(t); break; - case ScribbleParser.IMPORTMODULE: n = new ImportModule(t); break; - - case ScribbleParser.DATADECL: n = new DataDecl(t); break; - case ScribbleParser.SIGDECL: n = new SigDecl(t); break; - case ScribbleParser.GPROTODECL: n = new GProtoDecl(t); break; - - // CHECKME: refactor into header? - case ScribbleParser.PROTOMOD_LIST: n = new ProtoModList(t); break; - case ScribbleParser.AUX_KW: n = new AuxMod(t); break; // FIXME: KW return by parser directly (cf. other tokens are imaginary) - case ScribbleParser.EXPLICIT_KW: n = new ExplicitMod(t); break; - - case ScribbleParser.GPROTOHEADER: n = new GProtoHeader(t); break; - case ScribbleParser.ROLEDECL_LIST: n = new RoleDeclList(t); break; - case ScribbleParser.ROLEDECL: n = new RoleDecl(t); break; - case ScribbleParser.PARAMDECL_LIST: - n = new NonRoleParamDeclList(t); - break; - case ScribbleParser.DATAPARAMDECL: n = new DataParamDecl(t); break; - case ScribbleParser.SIGPARAMDECL: n = new SigParamDecl(t); break; - - case ScribbleParser.GPROTODEF: n = new GProtoDef(t); break; - case ScribbleParser.GPROTOBLOCK: n = new GProtoBlock(t); break; - case ScribbleParser.GINTERSEQ: n = new GInteractionSeq(t); break; - - case ScribbleParser.SIG_LIT: n = new SigLitNode(t); break; - case ScribbleParser.PAYELEM_LIST: n = new PayElemList(t); break; - case ScribbleParser.UNARY_PAYELEM: n = new UnaryPayElem<>(t); break; - - case ScribbleParser.GCONNECT: n = new GConnect(t); break; - case ScribbleParser.GDCONN: n = new GDisconnect(t); break; - case ScribbleParser.GMSGTRANSFER: n = new GMsgTransfer(t); break; - case ScribbleParser.GWRAP: n = new GWrap(t); break; - - case ScribbleParser.GCONTINUE: n = new GContinue(t); break; - case ScribbleParser.GDO: n = new GDo(t); break; - - case ScribbleParser.ROLEARG_LIST: n = new RoleArgList(t); break; - case ScribbleParser.ROLEARG: n = new RoleArg(t); break; - case ScribbleParser.NONROLEARG_LIST: n = new NonRoleArgList(t); break; - case ScribbleParser.NONROLEARG: n = new NonRoleArg(t); break; - - case ScribbleParser.GCHOICE: n = new GChoice(t); break; - case ScribbleParser.GRECURSION: n = new GRecursion(t); break; - - // Special cases - case ScribbleParser.EMPTY_OP: n = new OpNode(t); break; // From Scribble.g, token (t) text is OpNode.EMPTY_OP_TOKEN_TEXT*/ + case ScribbleParser.ID: n = new IdNode(t); break; + case ScribbleParser.EXTID: n = new ExtIdNode(t); break; + + // Simple names "constructed directly" by parser, e.g., t=ID -> ID<...Node>[$t] -- N.B. DelDecorator pass needed for them (CHECKME: also do those here instead? to deprecate DelDecorator) + + // Compound names + case ScribbleParser.GPROTO_NAME: n = new GProtoNameNode(t); break; + case ScribbleParser.MODULE_NAME: n = new ModuleNameNode(t); break; + case ScribbleParser.DATA_NAME: n = new DataNameNode(t); break; + case ScribbleParser.SIG_NAME: n = new SigNameNode(t); break; + + // Non-name (i.e., general) AST nodes + case ScribbleParser.MODULE: n = new Module(t); break; + case ScribbleParser.MODULEDECL: n = new ModuleDecl(t); break; + case ScribbleParser.IMPORTMODULE: n = new ImportModule(t); break; + + case ScribbleParser.DATADECL: n = new DataDecl(t); break; + case ScribbleParser.SIGDECL: n = new SigDecl(t); break; + case ScribbleParser.GPROTODECL: n = new GProtoDecl(t); break; + + // CHECKME: refactor into header? + case ScribbleParser.PROTOMOD_LIST: n = new ProtoModList(t); break; + case ScribbleParser.AUX_KW: n = new AuxMod(t); break; // FIXME: KW return by parser directly (cf. other tokens are imaginary) + case ScribbleParser.EXPLICIT_KW: n = new ExplicitMod(t); break; + + case ScribbleParser.GPROTOHEADER: n = new GProtoHeader(t); break; + case ScribbleParser.ROLEDECL_LIST: n = new RoleDeclList(t); break; + case ScribbleParser.ROLEDECL: n = new RoleDecl(t); break; + case ScribbleParser.PARAMDECL_LIST: + n = new NonRoleParamDeclList(t); + break; + case ScribbleParser.DATAPARAMDECL: n = new DataParamDecl(t); break; + case ScribbleParser.SIGPARAMDECL: n = new SigParamDecl(t); break; + + case ScribbleParser.GPROTODEF: n = new GProtoDef(t); break; + case ScribbleParser.GPROTOBLOCK: n = new GProtoBlock(t); break; + case ScribbleParser.GINTERSEQ: n = new GInteractionSeq(t); break; + + case ScribbleParser.SIG_LIT: n = new SigLitNode(t); break; + case ScribbleParser.PAYELEM_LIST: n = new PayElemList(t); break; + case ScribbleParser.UNARY_PAYELEM: n = new UnaryPayElem<>(t); break; + + case ScribbleParser.GCONNECT: n = new GConnect(t); break; + case ScribbleParser.GDCONN: n = new GDisconnect(t); break; + case ScribbleParser.GMSGTRANSFER: n = new GMsgTransfer(t); break; + case ScribbleParser.GWRAP: n = new GWrap(t); break; + + case ScribbleParser.GCONTINUE: n = new GContinue(t); break; + case ScribbleParser.GDO: n = new GDo(t); break; + + case ScribbleParser.ROLEARG_LIST: n = new RoleArgList(t); break; + case ScribbleParser.ROLEARG: n = new RoleArg(t); break; + case ScribbleParser.NONROLEARG_LIST: n = new NonRoleArgList(t); break; + case ScribbleParser.NONROLEARG: n = new NonRoleArg(t); break; + + case ScribbleParser.GCHOICE: n = new GChoice(t); break; + case ScribbleParser.GRECURSION: n = new GRecursion(t); break; + + // Special cases + case ScribbleParser.EMPTY_OP: n = new OpNode(t); break; // From Scribble.g, token (t) text is OpNode.EMPTY_OP_TOKEN_TEXT*/ default: { From 76fd4fce1aa26c1935442d08c0e44f9d057dbeac Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 21:23:34 +0100 Subject: [PATCH 421/539] [AllTest] Refactored RecPruner and Substitutor. --- .../java/org/scribble/visit/DelDecorator.java | 2 +- .../org/scribble/visit/NameDisambiguator.java | 2 +- .../org/scribble/visit/VisitorFactory.java | 31 +++++++++++++ .../scribble/visit/VisitorFactoryImpl.java | 46 +++++++++++++++++++ .../scribble/core/lang/global/GProtocol.java | 14 +++--- .../scribble/core/lang/local/LProtocol.java | 5 +- .../org/scribble/core/visit/RecPruner.java | 5 ++ .../core/visit/STypeVisitorFactory.java | 12 +++++ .../core/visit/STypeVisitorFactoryImpl.java | 21 +++++++++ .../org/scribble/core/visit/Substitutor.java | 2 +- .../core/visit/global/GTypeInliner.java | 4 +- .../core/visit/local/LTypeInliner.java | 4 +- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 13 files changed, 132 insertions(+), 18 deletions(-) create mode 100644 scribble-ast/src/main/java/org/scribble/visit/VisitorFactory.java create mode 100644 scribble-ast/src/main/java/org/scribble/visit/VisitorFactoryImpl.java diff --git a/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java b/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java index f316cb87d..57de4723c 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/DelDecorator.java @@ -26,7 +26,7 @@ public class DelDecorator extends AstVisitor { protected final DelFactory df; - public DelDecorator(Job job) + protected DelDecorator(Job job) { super(job); this.df = job.config.df; diff --git a/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java b/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java index edbcbd544..fc700401f 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/NameDisambiguator.java @@ -44,7 +44,7 @@ public class NameDisambiguator extends ModuleContextVisitor //private ProtocolDecl root; // FIXME: factor out // Now unused (recvar renaming refactored to inlining -- don't want to mangle source AST) - public NameDisambiguator(Job job) + protected NameDisambiguator(Job job) { super(job); } diff --git a/scribble-ast/src/main/java/org/scribble/visit/VisitorFactory.java b/scribble-ast/src/main/java/org/scribble/visit/VisitorFactory.java new file mode 100644 index 000000000..e7030320b --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/visit/VisitorFactory.java @@ -0,0 +1,31 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.visit; + +import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.session.STypeFactory; +import org.scribble.job.Job; + +// Both Ast and SimpleVisitor +public interface VisitorFactory +{ + // SimpleVisitor + GTypeTranslator GTypeTranslator(Job job, ModuleName rootFullname, + STypeFactory tf); + + // AstVisitor + DelDecorator DelDecorator(Job job); + + NameDisambiguator NameDisambiguator(Job job); +} diff --git a/scribble-ast/src/main/java/org/scribble/visit/VisitorFactoryImpl.java b/scribble-ast/src/main/java/org/scribble/visit/VisitorFactoryImpl.java new file mode 100644 index 000000000..b0ce8d460 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/visit/VisitorFactoryImpl.java @@ -0,0 +1,46 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.visit; + +import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.session.STypeFactory; +import org.scribble.job.Job; + +// Both Ast and SimpleVisitor +public class VisitorFactoryImpl implements VisitorFactory +{ + // SimpleVisitors + + @Override + public GTypeTranslator GTypeTranslator(Job job, ModuleName rootFullname, + STypeFactory tf) + { + return new GTypeTranslator(job, rootFullname, tf); + } + + + // AstVisitors + + @Override + public DelDecorator DelDecorator(Job job) + { + return new DelDecorator(job); + } + + @Override + public NameDisambiguator NameDisambiguator(Job job) + { + return new NameDisambiguator(job); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index ba940d0c2..39860e4fb 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -40,7 +40,6 @@ import org.scribble.core.type.session.global.GRecursion; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.local.LSeq; -import org.scribble.core.visit.RecPruner; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.Substitutor; @@ -98,23 +97,24 @@ public LProjection projectInlined(Core core, Role self) { LSeq def = core.config.vf.InlinedProjector(core, self).visitSeq(this.def); LSeq fixed = core.config.vf.InlinedExtChoiceSubjFixer().visitSeq(def); - return projectAux(self, this.roles, fixed); + return projectAux(core, self, this.roles, fixed); } public LProjection project(Core core, Role self) { LSeq def = core.config.vf.Projector(core, self).visitSeq(this.def); // FIXME: ext choice subj fixing, do pruning -- refactor to Job and use AstVisitor? - return projectAux(self, + return projectAux(core, self, core.getContext().getInlined(this.fullname).roles, // Using inlined global, global role decls already pruned -- CHECKME: is this still relevant? // Actual projection role decl pruning done by projectAux def); } - private LProjection projectAux(Role self, List decls, LSeq body) + private LProjection projectAux(Core core, Role self, List decls, + LSeq body) { - LSeq pruned = new RecPruner().visitSeq(body); + LSeq pruned = core.config.vf.RecPruner().visitSeq(body); LProtoName fullname = InlinedProjector .getFullProjectionName(this.fullname, self); Set tmp = pruned.gather(new RoleGatherer()::visit) @@ -155,7 +155,7 @@ else if (n instanceof SigName) SubprotoSig sig = new SubprotoSig(this.fullname, this.roles, params); v.pushSig(sig); - Substitutor subs = new Substitutor<>(this.roles, sig.roles, + Substitutor subs = v.core.config.vf.Substitutor(this.roles, sig.roles, this.params, sig.args); /*GSeq body = (GSeq) this.def.visitWithNoThrow(subs).visitWithNoThrow(v) .visitWithNoThrow(new RecPruner<>());*/ @@ -164,7 +164,7 @@ else if (n instanceof SigName) GRecursion rec = v.core.config.tf.global.GRecursion(null, rv, inlined); // CHECKME: or protodecl source? GSeq seq = v.core.config.tf.global.GSeq(null, Stream.of(rec).collect(Collectors.toList())); - GSeq def = new RecPruner().visitSeq(seq); + GSeq def = v.core.config.vf.RecPruner().visitSeq(seq); Set used = def.gather(new RoleGatherer()::visit) .collect(Collectors.toSet()); List rs = this.roles.stream().filter(x -> used.contains(x)) // Prune role decls -- CHECKME: what is an example? was this from before unused role checking? diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 0115bff54..7f2393921 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -37,7 +37,6 @@ import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.local.LRecursion; import org.scribble.core.type.session.local.LSeq; -import org.scribble.core.visit.RecPruner; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.Substitutor; @@ -97,7 +96,7 @@ else if (n instanceof SigName) SubprotoSig sig = new SubprotoSig(this.fullname, this.roles, params); v.pushSig(sig); - Substitutor subs = new Substitutor<>(this.roles, sig.roles, + Substitutor subs = v.core.config.vf.Substitutor(this.roles, sig.roles, this.params, sig.args); /*LSeq body = (LSeq) this.def.visitWithNoEx(subs).visitWithNoEx(v) .visitWithNoEx(new RecPruner<>());*/ @@ -106,7 +105,7 @@ else if (n instanceof SigName) LRecursion rec = v.core.config.tf.local.LRecursion(null, rv, inlined); // CHECKME: or protodecl source? LSeq seq = v.core.config.tf.local.LSeq(null, Stream.of(rec).collect(Collectors.toList())); - LSeq def = new RecPruner().visitSeq(seq); + LSeq def = v.core.config.vf.RecPruner().visitSeq(seq); /*//CHECKME: necessary for LProtocol/Projection? cf. global Set used = def.gather(new RoleGatherer()::visit) .collect(Collectors.toSet()); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java index 35445e37b..aca2f5352 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/RecPruner.java @@ -30,6 +30,11 @@ public class RecPruner> extends STypeVisitorNoThrow { + protected RecPruner() + { + + } + @Override public SType visitChoice(Choice n) { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java index 3c2cd981c..20539b482 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java @@ -13,11 +13,17 @@ */ package org.scribble.core.visit; +import java.util.List; import java.util.Map; import java.util.Set; import org.scribble.core.job.Core; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.kind.ProtoKind; +import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Arg; +import org.scribble.core.type.session.Seq; import org.scribble.core.visit.global.ConnectionChecker; import org.scribble.core.visit.global.ExtChoiceConsistencyChecker; import org.scribble.core.visit.global.GTypeInliner; @@ -30,8 +36,14 @@ public interface STypeVisitorFactory { + > Substitutor Substitutor( + List rold, List rnew, + List> aold, + List> anew); GTypeInliner GTypeInliner(Core core); + + > RecPruner RecPruner(); GTypeUnfolder GTypeUnfolder(Core core); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java index 4764064ea..57c4c78c3 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java @@ -13,11 +13,17 @@ */ package org.scribble.core.visit; +import java.util.List; import java.util.Map; import java.util.Set; import org.scribble.core.job.Core; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.kind.ProtoKind; +import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Arg; +import org.scribble.core.type.session.Seq; import org.scribble.core.visit.global.ConnectionChecker; import org.scribble.core.visit.global.ExtChoiceConsistencyChecker; import org.scribble.core.visit.global.GTypeInliner; @@ -31,6 +37,15 @@ public class STypeVisitorFactoryImpl implements STypeVisitorFactory { + @Override + public > Substitutor Substitutor( + List rold, List rnew, + List> aold, + List> anew) + { + return new Substitutor<>(rold, rnew, aold, anew); + } + @Override public GTypeInliner GTypeInliner(Core core) { @@ -43,6 +58,12 @@ public GTypeUnfolder GTypeUnfolder(Core core) return new GTypeUnfolder(core); } + @Override + public > RecPruner RecPruner() + { + return new RecPruner<>(); + } + @Override public RoleEnablingChecker RoleEnablingChecker(Set rs) { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java index 125b14278..4b9534415 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java @@ -38,7 +38,7 @@ public class Substitutor> { private Substitutions subs; - public Substitutor(List rold, List rnew, + protected Substitutor(List rold, List rnew, List> aold, List> anew) { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java index 69480e48e..60146ec14 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java @@ -44,8 +44,8 @@ public SType visitDo(Do n) } pushSig(sig); GProtocol g = this.core.getContext().getIntermediate(fullname); - Substitutor subs = new Substitutor<>(g.roles, n.roles, - g.params, n.args); + Substitutor subs = this.core.config.vf.Substitutor(g.roles, + n.roles, g.params, n.args); //GSeq inlined = (GSeq) g.def.visitWithNoEx(subs).visitWithNoEx(this); GSeq inlined = visitSeq(subs.visitSeq(g.def)); // i.e. returning a GSeq -- rely on parent GSeq to inline diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java index c803ce2b7..0695b817d 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java @@ -44,8 +44,8 @@ public LType visitDo(Do n) } pushSig(sig); LProtocol p = this.core.getContext().getProjection(fullname); // This line differs from GDo version - Substitutor subs = - new Substitutor<>(p.roles, n.roles, p.params, n.args); + Substitutor subs = this.core.config.vf.Substitutor(p.roles, + n.roles, p.params, n.args); //LSeq inlined = (LSeq) p.def.visitWithNoThrow(subs).visitWithNoThrow(this); LSeq inlined = visitSeq(subs.visitSeq(p.def)); // i.e. returning a Seq -- rely on parent Seq to inline diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index aa748f1f1..c2ae2634e 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -82,7 +82,6 @@ module tmp.Test; // ...disallow/check for reserved __ -- do in gtype translation? // FIXME: qualifed sig name as non-role do-arg // CHECKME: duplicate proto mods (unit tests) - // ...check ad hoc ScribNode constructions go through af properly // parser/ast re-refactoring // split mf to global/local subcomps, make protected constrs -- done @@ -91,6 +90,7 @@ module tmp.Test; // use stypefactory in core -- also make visitorfactorys (both core and ast) -- done // factor out all config factory methods more centrally? -- done a bit: mainly general factory method refactoring above // TODO: rename addChildren1 -- done: addScribChildren + // ...make ad hoc ScribNode constructions go through af properly -- done // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) // Job Module projection From 2a173cb4e4d6a9e6b3cf990dbaadcfa5802968ea Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 21:37:42 +0100 Subject: [PATCH 422/539] [AllTest] Refactored G/LTypeVisitorFactory. --- .../main/java/org/scribble/core/job/Core.java | 6 +- .../org/scribble/core/job/CoreContext.java | 4 +- .../scribble/core/lang/global/GProtocol.java | 13 +-- .../scribble/core/lang/local/LProtocol.java | 4 +- .../core/visit/STypeVisitorFactory.java | 59 +++++-------- .../core/visit/STypeVisitorFactoryImpl.java | 82 +++---------------- .../core/visit/global/ConnectionChecker.java | 3 +- .../global/ExtChoiceConsistencyChecker.java | 2 +- .../core/visit/global/GTypeInliner.java | 2 +- .../core/visit/global/GTypeUnfolder.java | 2 +- .../visit/global/GTypeVisitorFactory.java | 40 +++++++++ .../visit/global/GTypeVisitorFactoryImpl.java | 69 ++++++++++++++++ .../core/visit/global/InlinedProjector.java | 2 +- .../scribble/core/visit/global/Projector.java | 2 +- .../visit/global/RoleEnablingChecker.java | 2 +- .../core/visit/local/EGraphBuilder.java | 2 +- .../local/InlinedExtChoiceSubjFixer.java | 5 ++ .../core/visit/local/LTypeInliner.java | 2 +- .../core/visit/local/LTypeUnfolder.java | 2 +- .../core/visit/local/LTypeVisitorFactory.java | 26 ++++++ .../visit/local/LTypeVisitorFactoryImpl.java | 38 +++++++++ .../core/visit/local/ReachabilityChecker.java | 2 +- 22 files changed, 238 insertions(+), 131 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/global/GTypeVisitorFactory.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/global/GTypeVisitorFactoryImpl.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 5a1319414..3e6e16985 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -42,9 +42,10 @@ import org.scribble.core.type.session.local.LSeq; import org.scribble.core.visit.ProtoDepsCollector; import org.scribble.core.visit.STypeVisitorFactory; -import org.scribble.core.visit.STypeVisitorFactoryImpl; import org.scribble.core.visit.gather.NonProtoDepsGatherer; import org.scribble.core.visit.gather.RoleGatherer; +import org.scribble.core.visit.global.GTypeVisitorFactoryImpl; +import org.scribble.core.visit.local.LTypeVisitorFactoryImpl; import org.scribble.util.ScribException; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models @@ -65,7 +66,8 @@ public Core(ModuleName mainFullname, Map args, protected STypeVisitorFactory newVisitorFactory() { - return new STypeVisitorFactoryImpl(); + return new STypeVisitorFactory(new GTypeVisitorFactoryImpl(), + new LTypeVisitorFactoryImpl()); } protected ModelFactory newModelFactory() diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index 630a21820..272be1793 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -118,7 +118,7 @@ public GProtocol getInlined(ProtoName fullname) GProtocol inlined = this.inlined.get(fullname); if (inlined == null) { - GTypeInliner v = this.core.config.vf.GTypeInliner(this.core); // Factor out? + GTypeInliner v = this.core.config.vf.global.GTypeInliner(this.core); // Factor out? inlined = this.imeds.get(fullname).getInlined(v); // Protocol.getInlined does pruneRecs addInlined(fullname, inlined); } @@ -141,7 +141,7 @@ public GProtocol getOnceUnfolded(ProtoName fullname) GProtocol unf = this.unfs.get(fullname); if (unf == null) { - GTypeUnfolder v = this.core.config.vf.GTypeUnfolder(this.core); + GTypeUnfolder v = this.core.config.vf.global.GTypeUnfolder(this.core); unf = this.inlined.get(fullname).unfoldAllOnce(v); // Protocol.getInlined does pruneRecs addOnceUnfolded(fullname, unf); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 39860e4fb..9a4b4288e 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -71,7 +71,7 @@ public GProtocol reconstruct(CommonTree source, public void checkRoleEnabling(Core core) throws ScribException { Set rs = this.roles.stream().collect(Collectors.toSet()); - RoleEnablingChecker v = core.config.vf.RoleEnablingChecker(rs); + RoleEnablingChecker v = core.config.vf.global.RoleEnablingChecker(rs); this.def.visitWith(v); } @@ -79,7 +79,7 @@ public void checkExtChoiceConsistency(Core core) throws ScribException { Map rs = this.roles.stream() .collect(Collectors.toMap(x -> x, x -> x)); - ExtChoiceConsistencyChecker v = core.config.vf + ExtChoiceConsistencyChecker v = core.config.vf.global .ExtChoiceConsistencyChecker(rs); this.def.visitWith(v); } @@ -88,21 +88,22 @@ public void checkConnectedness(Core core, boolean implicit) throws ScribException { Set rs = this.roles.stream().collect(Collectors.toSet()); - ConnectionChecker v = core.config.vf.ConnectionChecker(rs, implicit); + ConnectionChecker v = core.config.vf.global.ConnectionChecker(rs, implicit); this.def.visitWith(v); } // Currently assuming inlining (or at least "disjoint" protodecl projection, without role fixing) public LProjection projectInlined(Core core, Role self) { - LSeq def = core.config.vf.InlinedProjector(core, self).visitSeq(this.def); - LSeq fixed = core.config.vf.InlinedExtChoiceSubjFixer().visitSeq(def); + LSeq def = core.config.vf.global.InlinedProjector(core, self) + .visitSeq(this.def); + LSeq fixed = core.config.vf.local.InlinedExtChoiceSubjFixer().visitSeq(def); return projectAux(core, self, this.roles, fixed); } public LProjection project(Core core, Role self) { - LSeq def = core.config.vf.Projector(core, self).visitSeq(this.def); + LSeq def = core.config.vf.global.Projector(core, self).visitSeq(this.def); // FIXME: ext choice subj fixing, do pruning -- refactor to Job and use AstVisitor? return projectAux(core, self, core.getContext().getInlined(this.fullname).roles, diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 7f2393921..c4da3cfa3 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -66,7 +66,7 @@ public LProtocol reconstruct(CommonTree source, public void checkReachability(Core core) throws ScribException { - this.def.visitWith(core.config.vf.ReachabilityChecker()); + this.def.visitWith(core.config.vf.local.ReachabilityChecker()); } // CHECKME: drop from Protocol (after removing Protocol from SType?) @@ -133,7 +133,7 @@ public EGraph toEGraph(Core core) EState s = core.config.mf.local.EState(Collections.emptySet()); return new EGraph(s, s); // TODO: refactor constructor inside mf } - EGraphBuilder b = new EGraphBuilder(core); + EGraphBuilder b = core.config.vf.local.EGraphBuilder(core); this.def.visitWithNoThrow(b); return b.finalise(); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java index 20539b482..cc9e06234 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java @@ -14,53 +14,38 @@ package org.scribble.core.visit; import java.util.List; -import java.util.Map; -import java.util.Set; -import org.scribble.core.job.Core; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Seq; -import org.scribble.core.visit.global.ConnectionChecker; -import org.scribble.core.visit.global.ExtChoiceConsistencyChecker; -import org.scribble.core.visit.global.GTypeInliner; -import org.scribble.core.visit.global.GTypeUnfolder; -import org.scribble.core.visit.global.InlinedProjector; -import org.scribble.core.visit.global.Projector; -import org.scribble.core.visit.global.RoleEnablingChecker; -import org.scribble.core.visit.local.InlinedExtChoiceSubjFixer; -import org.scribble.core.visit.local.ReachabilityChecker; +import org.scribble.core.visit.global.GTypeVisitorFactory; +import org.scribble.core.visit.local.LTypeVisitorFactory; -public interface STypeVisitorFactory +public class STypeVisitorFactory { - > Substitutor Substitutor( - List rold, List rnew, - List> aold, - List> anew); - - GTypeInliner GTypeInliner(Core core); + public GTypeVisitorFactory global; + public LTypeVisitorFactory local; - > RecPruner RecPruner(); - - GTypeUnfolder GTypeUnfolder(Core core); - - RoleEnablingChecker RoleEnablingChecker(Set rs); - - ExtChoiceConsistencyChecker ExtChoiceConsistencyChecker( - Map enabled); + public STypeVisitorFactory(GTypeVisitorFactory global, LTypeVisitorFactory local) + { + this.global = global; + this.local = local; + } - ConnectionChecker ConnectionChecker(Set rs, boolean implicit); - - InlinedProjector InlinedProjector(Core core, Role self); - - InlinedExtChoiceSubjFixer InlinedExtChoiceSubjFixer(); - - ReachabilityChecker ReachabilityChecker(); - - // CHECKME: deprecate? - Projector Projector(Core core, Role self); + public > Substitutor Substitutor( + List rold, List rnew, + List> aold, + List> anew) + { + return new Substitutor<>(rold, rnew, aold, anew); + } + + public > RecPruner RecPruner() + { + return new RecPruner<>(); + } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java index 57c4c78c3..bec46d6bc 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java @@ -14,30 +14,27 @@ package org.scribble.core.visit; import java.util.List; -import java.util.Map; -import java.util.Set; -import org.scribble.core.job.Core; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Seq; -import org.scribble.core.visit.global.ConnectionChecker; -import org.scribble.core.visit.global.ExtChoiceConsistencyChecker; -import org.scribble.core.visit.global.GTypeInliner; -import org.scribble.core.visit.global.GTypeUnfolder; -import org.scribble.core.visit.global.InlinedProjector; -import org.scribble.core.visit.global.Projector; -import org.scribble.core.visit.global.RoleEnablingChecker; -import org.scribble.core.visit.local.InlinedExtChoiceSubjFixer; -import org.scribble.core.visit.local.ReachabilityChecker; +import org.scribble.core.visit.global.GTypeVisitorFactory; +import org.scribble.core.visit.local.LTypeVisitorFactory; -public class STypeVisitorFactoryImpl implements STypeVisitorFactory +public class STypeVisitorFactoryImpl { + public final GTypeVisitorFactory global; + public final LTypeVisitorFactory local; + + public STypeVisitorFactoryImpl(GTypeVisitorFactory global, LTypeVisitorFactory local) + { + this.global = global; + this.local = local; + } - @Override public > Substitutor Substitutor( List rold, List rnew, List> aold, @@ -46,66 +43,9 @@ public > Substitutor Substitutor( return new Substitutor<>(rold, rnew, aold, anew); } - @Override - public GTypeInliner GTypeInliner(Core core) - { - return new GTypeInliner(core); - } - - @Override - public GTypeUnfolder GTypeUnfolder(Core core) - { - return new GTypeUnfolder(core); - } - - @Override public > RecPruner RecPruner() { return new RecPruner<>(); } - @Override - public RoleEnablingChecker RoleEnablingChecker(Set rs) - { - return new RoleEnablingChecker(rs); - } - - @Override - public ExtChoiceConsistencyChecker ExtChoiceConsistencyChecker( - Map enabled) - { - return new ExtChoiceConsistencyChecker(enabled); - } - - @Override - public ConnectionChecker ConnectionChecker(Set roles, boolean implicit) - { - return new ConnectionChecker(roles, implicit); - } - - @Override - public InlinedProjector InlinedProjector(Core core, Role self) - { - return new InlinedProjector(core, self); - } - - @Override - public InlinedExtChoiceSubjFixer InlinedExtChoiceSubjFixer() - { - return new InlinedExtChoiceSubjFixer(); - } - - @Override - public ReachabilityChecker ReachabilityChecker() - { - return new ReachabilityChecker(); - } - - // CHECKME: deprecate? - @Override - public Projector Projector(Core core, Role self) - { - return new Projector(core, self); - } - } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/ConnectionChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/ConnectionChecker.java index 6805914fc..b0776d67b 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/ConnectionChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/ConnectionChecker.java @@ -45,7 +45,7 @@ protected enum Status { CONN, DIS, AMBIG } protected final Map, Status> conns; - public ConnectionChecker(Set roles, boolean implicit) + protected ConnectionChecker(Set roles, boolean implicit) { this.roles = Collections.unmodifiableSet(roles); this.implicit = implicit; @@ -57,6 +57,7 @@ public ConnectionChecker(Set roles, boolean implicit) Collectors.toMap(x -> x, x -> implicit ? Status.CONN : Status.DIS)); } + // Copy constructor protected ConnectionChecker(ConnectionChecker v) { this.roles = v.roles; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java index 58b708569..143f4bf1a 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/ExtChoiceConsistencyChecker.java @@ -38,7 +38,7 @@ public class ExtChoiceConsistencyChecker extends STypeVisitor { private Map enablers; // Invariant: unmodifiable - public ExtChoiceConsistencyChecker(Map enabled) + protected ExtChoiceConsistencyChecker(Map enabled) { setEnablers(enabled); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java index 60146ec14..7085e5df5 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeInliner.java @@ -27,7 +27,7 @@ public class GTypeInliner extends STypeInliner { - public GTypeInliner(Core core) + protected GTypeInliner(Core core) { super(core); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeUnfolder.java index 5a2b3f876..b6a33d057 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeUnfolder.java @@ -23,7 +23,7 @@ public class GTypeUnfolder extends STypeUnfolder { - public GTypeUnfolder(Core core) + protected GTypeUnfolder(Core core) { super(core); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeVisitorFactory.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeVisitorFactory.java new file mode 100644 index 000000000..e2654aed1 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeVisitorFactory.java @@ -0,0 +1,40 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.visit.global; + +import java.util.Map; +import java.util.Set; + +import org.scribble.core.job.Core; +import org.scribble.core.type.name.Role; + +public interface GTypeVisitorFactory +{ + GTypeInliner GTypeInliner(Core core); + + GTypeUnfolder GTypeUnfolder(Core core); + + RoleEnablingChecker RoleEnablingChecker(Set rs); + + ExtChoiceConsistencyChecker ExtChoiceConsistencyChecker( + Map enabled); + + ConnectionChecker ConnectionChecker(Set rs, boolean implicit); + + InlinedProjector InlinedProjector(Core core, Role self); + + // CHECKME: deprecate? + Projector Projector(Core core, Role self); + +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeVisitorFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeVisitorFactoryImpl.java new file mode 100644 index 000000000..74a0a4995 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeVisitorFactoryImpl.java @@ -0,0 +1,69 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.visit.global; + +import java.util.Map; +import java.util.Set; + +import org.scribble.core.job.Core; +import org.scribble.core.type.name.Role; + +public class GTypeVisitorFactoryImpl implements GTypeVisitorFactory +{ + + @Override + public GTypeInliner GTypeInliner(Core core) + { + return new GTypeInliner(core); + } + + @Override + public GTypeUnfolder GTypeUnfolder(Core core) + { + return new GTypeUnfolder(core); + } + + @Override + public RoleEnablingChecker RoleEnablingChecker(Set rs) + { + return new RoleEnablingChecker(rs); + } + + @Override + public ExtChoiceConsistencyChecker ExtChoiceConsistencyChecker( + Map enabled) + { + return new ExtChoiceConsistencyChecker(enabled); + } + + @Override + public ConnectionChecker ConnectionChecker(Set roles, boolean implicit) + { + return new ConnectionChecker(roles, implicit); + } + + @Override + public InlinedProjector InlinedProjector(Core core, Role self) + { + return new InlinedProjector(core, self); + } + + // CHECKME: deprecate? + @Override + public Projector Projector(Core core, Role self) + { + return new Projector(core, self); + } + +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index e9f0dc9ea..d4f301fe7 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -57,7 +57,7 @@ public class InlinedProjector extends STypeAggNoThrow public final Core core; public final Role self; - public InlinedProjector(Core core, Role self) + protected InlinedProjector(Core core, Role self) { this.core = core; this.self = self; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java index ca703431b..549655c4c 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java @@ -33,7 +33,7 @@ // Supports Do -- can use on parsed (intermed) public class Projector extends InlinedProjector // CHECKME: this way, or the other way round? { - public Projector(Core core, Role self) + protected Projector(Core core, Role self) { super(core, self); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java index 83713d59e..b63c2ce97 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/RoleEnablingChecker.java @@ -37,7 +37,7 @@ public class RoleEnablingChecker extends STypeVisitor { private Set enabled; // Invariant: unmodifiable - public RoleEnablingChecker(Set enabled) + protected RoleEnablingChecker(Set enabled) { setEnabled(enabled); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index fc321608f..78b07f02a 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -55,7 +55,7 @@ public class EGraphBuilder extends STypeVisitorNoThrow private EGraphBuilderUtil util; - public EGraphBuilder(Core core) + protected EGraphBuilder(Core core) { this.core = core; this.util = core.config.mf.local.EGraphBuilderUtil(); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java index 7312589e8..671c989d3 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java @@ -43,6 +43,11 @@ public class InlinedExtChoiceSubjFixer extends STypeVisitorNoThrow // Record on entering rec states, to give to InlinedEnablerInferer on nested choice states (for unguarded continues) // CHECKME: Optional necessary? InlinedEnablerInferer may not succeed due to empty/bad contexts, but should that be reflected here? + protected InlinedExtChoiceSubjFixer() + { + + } + @Override public Choice visitChoice(Choice n) { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java index 0695b817d..edc9b5d68 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeInliner.java @@ -27,7 +27,7 @@ public class LTypeInliner extends STypeInliner { - public LTypeInliner(Core core) + protected LTypeInliner(Core core) { super(core); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java index 7546eb755..63fdaa466 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeUnfolder.java @@ -23,7 +23,7 @@ public class LTypeUnfolder extends STypeUnfolder { - public LTypeUnfolder(Core core) + protected LTypeUnfolder(Core core) { super(core); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java new file mode 100644 index 000000000..005bb3f96 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java @@ -0,0 +1,26 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.visit.local; + +import org.scribble.core.job.Core; + +public interface LTypeVisitorFactory +{ + + InlinedExtChoiceSubjFixer InlinedExtChoiceSubjFixer(); + + ReachabilityChecker ReachabilityChecker(); + + EGraphBuilder EGraphBuilder(Core core); +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java new file mode 100644 index 000000000..3d3fb2968 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java @@ -0,0 +1,38 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.visit.local; + +import org.scribble.core.job.Core; + +public class LTypeVisitorFactoryImpl implements LTypeVisitorFactory +{ + + @Override + public InlinedExtChoiceSubjFixer InlinedExtChoiceSubjFixer() + { + return new InlinedExtChoiceSubjFixer(); + } + + @Override + public ReachabilityChecker ReachabilityChecker() + { + return new ReachabilityChecker(); + } + + @Override + public EGraphBuilder EGraphBuilder(Core core) + { + return new EGraphBuilder(core); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java index 17e3a3098..55711faf6 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/ReachabilityChecker.java @@ -38,7 +38,7 @@ public class ReachabilityChecker extends STypeVisitor { private ReachabilityEnv env; // Immutable - public ReachabilityChecker() + protected ReachabilityChecker() { this.env = new ReachabilityEnv(false, Collections.emptySet()); } From 41a6927f6a2386692e4fdf8ea121091b02ae610c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 21:38:04 +0100 Subject: [PATCH 423/539] [AllTest] Minor. --- .../core/visit/STypeVisitorFactoryImpl.java | 51 ------------------- 1 file changed, 51 deletions(-) delete mode 100644 scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java deleted file mode 100644 index bec46d6bc..000000000 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.core.visit; - -import java.util.List; - -import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.kind.ProtoKind; -import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.Arg; -import org.scribble.core.type.session.Seq; -import org.scribble.core.visit.global.GTypeVisitorFactory; -import org.scribble.core.visit.local.LTypeVisitorFactory; - -public class STypeVisitorFactoryImpl -{ - public final GTypeVisitorFactory global; - public final LTypeVisitorFactory local; - - public STypeVisitorFactoryImpl(GTypeVisitorFactory global, LTypeVisitorFactory local) - { - this.global = global; - this.local = local; - } - - public > Substitutor Substitutor( - List rold, List rnew, - List> aold, - List> anew) - { - return new Substitutor<>(rold, rnew, aold, anew); - } - - public > RecPruner RecPruner() - { - return new RecPruner<>(); - } - -} From 151da2c195c925b1515aee778e10ff6c84b342ee Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 28 Apr 2019 21:39:59 +0100 Subject: [PATCH 424/539] [AllTest] Minor. --- scribble-ast/src/main/java/org/scribble/job/Job.java | 4 ++-- scribble-core/src/main/java/org/scribble/core/job/Core.java | 4 ++-- .../java/org/scribble/core/visit/STypeVisitorFactory.java | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 5ec2737d8..cf41556d2 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -48,13 +48,13 @@ public Job(ModuleName mainFullname, Map args, throws ScribException { // CHECKME(?): main modname comes from the inlined mod decl -- check for issues if this clashes with an existing file system resource - VisitorFactory vf = newAstVisitorFactory(); + VisitorFactory vf = newVisitorFactory(); STypeFactory tf = newSTypeFactory(); this.config = newJobConfig(mainFullname, args, af, df, vf, tf); this.context = newJobContext(this, parsed); // Single instance per Job, should not be shared between Jobs } - protected VisitorFactory newAstVisitorFactory() + protected VisitorFactory newVisitorFactory() { return new VisitorFactoryImpl(); } diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 3e6e16985..de2488bb6 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -64,7 +64,7 @@ public Core(ModuleName mainFullname, Map args, imeds); // Single instance per Core and should never be shared } - protected STypeVisitorFactory newVisitorFactory() + protected STypeVisitorFactory newSTypeVisitorFactory() { return new STypeVisitorFactory(new GTypeVisitorFactoryImpl(), new LTypeVisitorFactoryImpl()); @@ -80,7 +80,7 @@ protected ModelFactory newModelFactory() protected CoreConfig newCoreConfig(ModuleName mainFullname, Map args, STypeFactory tf) { - STypeVisitorFactory vf = newVisitorFactory(); + STypeVisitorFactory vf = newSTypeVisitorFactory(); ModelFactory mf = newModelFactory(); return new CoreConfig(mainFullname, args, tf, vf, mf); // CHECKME: combine E/SModelFactory? diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java index cc9e06234..d88e4b091 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java @@ -24,6 +24,7 @@ import org.scribble.core.visit.global.GTypeVisitorFactory; import org.scribble.core.visit.local.LTypeVisitorFactory; +// No interface due to fields -- CHECKME: factor out "neutral" factory field for RecPruner etc. public class STypeVisitorFactory { public GTypeVisitorFactory global; From 3983a963eb12c0015971e94021978e69de51511f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 29 Apr 2019 07:42:42 +0100 Subject: [PATCH 425/539] [AllTest] Minor. --- .../java/org/scribble/core/visit/gather/STypeGatherer.java | 4 +++- scribble-test/src/test/scrib/tmp/Test.scr | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/gather/STypeGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/gather/STypeGatherer.java index 26d12404d..57f90ec37 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/gather/STypeGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/gather/STypeGatherer.java @@ -52,7 +52,9 @@ protected Optional> typeSwitch(SType n) ? Optional.of(visitRecursion((Recursion) n)) : (n instanceof Do) ? Optional.of(this.visitDo((Do) n)) - : Optional.empty(); // Better for extensibility than "manually" throwing Exception (e.g., for overriding) + : Optional.empty(); + // Better for extensibility than "manually" throwing Exception (e.g., for overriding) + // N.B. currently causes exception on get in visit } public Stream visitContinue(Continue n) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index c2ae2634e..48e7ef0ed 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -470,6 +470,7 @@ explicit global protocol Foo(role A, role B, role C) choice at A { 1() from A to B; + //disconnect A and B; do Foo(A, B, C); } or From ae91e4f48b91ab52085e131ccff05d3a55a33006 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 2 May 2019 12:25:11 +0100 Subject: [PATCH 426/539] [WIP] Adding scribble-ast locals and dels. --- .../src/main/java/org/scribble/ast/Do.java | 2 +- .../main/java/org/scribble/ast/Module.java | 24 +++ .../java/org/scribble/ast/global/GChoice.java | 2 +- .../java/org/scribble/ast/global/GDo.java | 12 +- .../java/org/scribble/ast/global/GWrap.java | 3 +- .../java/org/scribble/ast/local/LAcc.java | 53 +++++ .../java/org/scribble/ast/local/LChoice.java | 58 ++++++ .../org/scribble/ast/local/LClientWrap.java | 97 +++++++++ .../local/LCompoundSessionNode.java} | 4 +- .../scribble/ast/local/LConnectAction.java | 35 ++++ .../org/scribble/ast/local/LContinue.java | 46 +++++ .../org/scribble/ast/local/LDelegElem.java | 47 +++++ .../org/scribble/ast/local/LDisconnect.java | 47 +++++ .../main/java/org/scribble/ast/local/LDo.java | 72 +++++++ .../scribble/ast/local/LInteractionSeq.java | 57 ++++++ .../org/scribble/ast/local/LMsgTransfer.java | 34 ++++ .../scribble/ast/local/LProjectionDecl.java | 53 +++++ .../org/scribble/ast/local/LProtoBlock.java | 52 +++++ .../org/scribble/ast/local/LProtoDecl.java | 70 +++++++ .../org/scribble/ast/local/LProtoDef.java | 52 +++++ .../org/scribble/ast/local/LProtoHeader.java | 67 +++++++ .../org/scribble/ast/local/LRecursion.java | 52 +++++ .../java/org/scribble/ast/local/LRecv.java | 57 ++++++ .../java/org/scribble/ast/local/LReq.java | 53 +++++ .../local/LScribNode.java} | 18 +- .../java/org/scribble/ast/local/LSend.java | 57 ++++++ .../org/scribble/ast/local/LServerWrap.java | 97 +++++++++ .../org/scribble/ast/local/LSessionNode.java | 32 +++ .../local/LSimpleSessionNode.java} | 4 +- .../java/org/scribble/del/DelFactory.java | 88 +++++---- ...geTransferDel.java => MsgTransferDel.java} | 4 +- ...otocolBlockDel.java => ProtoBlockDel.java} | 2 +- ...ProtocolDeclDel.java => ProtoDeclDel.java} | 4 +- .../{ProtocolDefDel.java => ProtoDefDel.java} | 2 +- .../del/global/GMessageTransferDel.java | 4 +- .../scribble/del/global/GProtoBlockDel.java | 4 +- .../scribble/del/global/GProtoDeclDel.java | 4 +- .../org/scribble/del/global/GProtoDefDel.java | 4 +- .../org/scribble/del/global/GWrapDel.java | 4 +- .../java/org/scribble/del/local/LAccDel.java | 43 ++++ .../org/scribble/del/local/LChoiceDel.java | 89 +++++++++ .../org/scribble/del/local/LContinueDel.java | 76 ++++++- .../java/org/scribble/del/local/LDel.java | 0 .../scribble/del/local/LDisconnectDel.java | 26 ++- .../java/org/scribble/del/local/LDoDel.java | 82 ++++++++ .../del/local/LInteractionSeqDel.java | 33 +++- ...eTransferDel.java => LMsgTransferDel.java} | 4 +- .../del/local/LProjectionDeclDel.java | 59 +++++- .../{LAcceptDel.java => LProtoBlockDel.java} | 6 +- ...rotocolDeclDel.java => LProtoDeclDel.java} | 6 +- ...rotocolBlockDel.java => LProtoDefDel.java} | 7 +- .../org/scribble/del/local/LRecursionDel.java | 33 ++++ .../java/org/scribble/del/local/LRecvDel.java | 43 ++++ .../java/org/scribble/del/local/LReqDel.java | 28 +++ .../java/org/scribble/del/local/LSendDel.java | 25 ++- .../scribble/del/local/LWrapClientDel.java | 15 +- .../scribble/del/local/LWrapServerDel.java | 30 ++- .../java/org/scribble/util/Constants.java | 2 + .../java/org/scribble/del/DelFactoryImpl.java | 187 +++++------------- 59 files changed, 1935 insertions(+), 236 deletions(-) create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LAcc.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LClientWrap.java rename scribble-ast/src/main/java/org/scribble/{del/local/LRequestDel.java => ast/local/LCompoundSessionNode.java} (86%) create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LConnectAction.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LDelegElem.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LDo.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LInteractionSeq.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LMsgTransfer.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LProtoBlock.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LProtoDecl.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LProtoDef.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LProtoHeader.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LReq.java rename scribble-ast/src/main/java/org/scribble/{del/local/LProtocolDefDel.java => ast/local/LScribNode.java} (67%) create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LSend.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LServerWrap.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java rename scribble-ast/src/main/java/org/scribble/{del/local/LReceiveDel.java => ast/local/LSimpleSessionNode.java} (87%) rename scribble-ast/src/main/java/org/scribble/del/{MessageTransferDel.java => MsgTransferDel.java} (86%) rename scribble-ast/src/main/java/org/scribble/del/{ProtocolBlockDel.java => ProtoBlockDel.java} (93%) rename scribble-ast/src/main/java/org/scribble/del/{ProtocolDeclDel.java => ProtoDeclDel.java} (91%) rename scribble-ast/src/main/java/org/scribble/del/{ProtocolDefDel.java => ProtoDefDel.java} (91%) create mode 100755 scribble-ast/src/main/java/org/scribble/del/local/LAccDel.java mode change 100644 => 100755 scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java mode change 100644 => 100755 scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java mode change 100644 => 100755 scribble-ast/src/main/java/org/scribble/del/local/LDel.java mode change 100644 => 100755 scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java mode change 100644 => 100755 scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java mode change 100644 => 100755 scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java rename scribble-ast/src/main/java/org/scribble/del/local/{LMessageTransferDel.java => LMsgTransferDel.java} (85%) mode change 100644 => 100755 mode change 100644 => 100755 scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java rename scribble-ast/src/main/java/org/scribble/del/local/{LAcceptDel.java => LProtoBlockDel.java} (85%) mode change 100644 => 100755 rename scribble-ast/src/main/java/org/scribble/del/local/{LProtocolDeclDel.java => LProtoDeclDel.java} (82%) mode change 100644 => 100755 rename scribble-ast/src/main/java/org/scribble/del/local/{LProtocolBlockDel.java => LProtoDefDel.java} (84%) mode change 100644 => 100755 mode change 100644 => 100755 scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java create mode 100755 scribble-ast/src/main/java/org/scribble/del/local/LRecvDel.java create mode 100755 scribble-ast/src/main/java/org/scribble/del/local/LReqDel.java mode change 100644 => 100755 scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java mode change 100644 => 100755 scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java mode change 100644 => 100755 scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java diff --git a/scribble-ast/src/main/java/org/scribble/ast/Do.java b/scribble-ast/src/main/java/org/scribble/ast/Do.java index d5fd89d7d..36d60cbbe 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Do.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Do.java @@ -92,7 +92,7 @@ public Do visitChildren(AstVisitor nv) throws ScribException // FIXME: mcontext now redundant because NameDisambiguator converts all targets to full names -- NO: currently disamb doesn't // To get full name from original target name, use mcontext visible names (e.g. in or before name disambiguation pass) // This is still useful for subclass casting to G/LProtocolName - public ProtoName getTargetProtocolDeclFullName(ModuleContext mcontext) + public ProtoName getTargetProtoDeclFullName(ModuleContext mcontext) { //return mcontext.checkProtocolDeclDependencyFullName(this.proto.toName()); return getProtocolNameNode().toName(); // Pre: use after name disambiguation (maybe drop FullName suffix) diff --git a/scribble-ast/src/main/java/org/scribble/ast/Module.java b/scribble-ast/src/main/java/org/scribble/ast/Module.java index 0edb6a017..1d84457a5 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Module.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Module.java @@ -22,10 +22,12 @@ import org.antlr.runtime.Token; import org.scribble.ast.global.GProtoDecl; +import org.scribble.ast.local.LProtoDecl; import org.scribble.core.type.kind.Kind; import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.SigName; import org.scribble.del.DelFactory; @@ -171,6 +173,14 @@ public List getGProtoDeclChildren() // Less efficient, but smaller code } + // TODO: factor out with above + public List getLProtoDeclChildren() + { + return getProtoDeclChildren().stream().filter(x -> x.isLocal()) + .map(x -> (LProtoDecl) x).collect(Collectors.toList()); + // Less efficient, but smaller code + } + // CHECKME: allow global and local protocols with same simpname in same module? -- currently, no? public boolean hasGProtocolDecl(GProtoName simpname) { @@ -192,6 +202,20 @@ public GProtoDecl getGProtocolDeclChild( return res.get(); } + // Pre: hasProtocolDecl(simpname) // TODO: factor out with above + public LProtoDecl getLProtocolDeclChild( + LProtoName simpname) + { + Optional res = getLProtoDeclChildren().stream() + .filter(x -> x.getHeaderChild().getDeclName().equals(simpname)) + .findFirst(); // No duplication check, rely on WF + if (!res.isPresent()) + { + throw new RuntimeException("Proto decl not found: " + simpname); + } + return res.get(); + } + public ModuleName getFullModuleName() { return getModuleDeclChild().getFullModuleName(); diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java index 45820dea5..c0fe600cc 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GChoice.java @@ -40,7 +40,7 @@ protected GChoice(GChoice node) public List getBlockChildren() { List cs = getChildren(); - return cs.subList(GChoice.BLOCK_CHILDREN_START_INDEX, cs.size()).stream() + return cs.subList(Choice.BLOCK_CHILDREN_START_INDEX, cs.size()).stream() .map(x -> (GProtoBlock) x).collect(Collectors.toList()); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java index 9f905c1a1..c00216659 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDo.java @@ -43,11 +43,11 @@ public GProtoNameNode getProtocolNameNode() } @Override - public GProtoDecl getTargetProtocolDecl(JobContext jcontext, - ModuleContext mcontext) + public GProtoDecl getTargetProtocolDecl(JobContext jobc, + ModuleContext modc) { - GProtoName fullname = getTargetProtocolDeclFullName(mcontext); - return jcontext.getModule(fullname.getPrefix()) + GProtoName fullname = getTargetProtoDeclFullName(modc); + return jobc.getModule(fullname.getPrefix()) .getGProtocolDeclChild(fullname.getSimpleName()); } @@ -64,8 +64,8 @@ public void decorateDel(DelFactory df) } @Override - public GProtoName getTargetProtocolDeclFullName(ModuleContext mcontext) + public GProtoName getTargetProtoDeclFullName(ModuleContext modc) { - return (GProtoName) super.getTargetProtocolDeclFullName(mcontext); + return (GProtoName) super.getTargetProtoDeclFullName(modc); } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java index 3a7933129..d4a1d496f 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java @@ -22,10 +22,11 @@ import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -// TODO: factor out base Wrap (cf. Disconnect) +// TODO: factor out base Wrap (cf. Disconnect) -- Wrap is a ConnectionAction? public class GWrap extends BasicInteraction implements GSimpleSessionNode { + // TODO: move to a base Wrap -- N.B. DirectedInteraction has its own children indices public static final int CLIENT_CHILD_INDEX = 0; public static final int SERVER_CHILD_INDEX = 1; diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LAcc.java b/scribble-ast/src/main/java/org/scribble/ast/local/LAcc.java new file mode 100644 index 000000000..698e0da66 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LAcc.java @@ -0,0 +1,53 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.del.DelFactory; +import org.scribble.util.Constants; + +public class LAcc extends LConnectAction implements LSimpleSessionNode +{ + // ScribTreeAdaptor#create constructor + public LAcc(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public LAcc(LAcc node) + { + super(node); + } + + @Override + public LAcc dupNode() + { + return new LAcc(this); + } + + @Override + public void decorateDel(DelFactory df) + { + df.LAcc(this); + } + + @Override + public String toString() + { + return (isUnitMessage() ? "" : getMessageNodeChild() + " ") + + Constants.ACCEPT_KW + " " + Constants.FROM_KW + + " " + getSourceChild() + ";"; + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java b/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java new file mode 100644 index 000000000..b2d04b8cf --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LChoice.java @@ -0,0 +1,58 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import java.util.List; +import java.util.stream.Collectors; + +import org.antlr.runtime.Token; +import org.scribble.ast.Choice; +import org.scribble.ast.ScribNode; +import org.scribble.core.type.kind.Local; +import org.scribble.del.DelFactory; + +public class LChoice extends Choice implements LCompoundSessionNode +{ + // ScribTreeAdaptor#create constructor + public LChoice(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected LChoice(LChoice node) + { + super(node); + } + + @Override + public List getBlockChildren() + { + List cs = getChildren(); + return cs.subList(Choice.BLOCK_CHILDREN_START_INDEX, cs.size()).stream() + .map(x -> (LProtoBlock) x).collect(Collectors.toList()); + } + + @Override + public LChoice dupNode() + { + return new LChoice(this); + } + + @Override + public void decorateDel(DelFactory df) + { + df.LChoice(this); + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LClientWrap.java b/scribble-ast/src/main/java/org/scribble/ast/local/LClientWrap.java new file mode 100644 index 000000000..a2e622c6f --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LClientWrap.java @@ -0,0 +1,97 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.ast.BasicInteraction; +import org.scribble.ast.global.GWrap; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.type.kind.Local; +import org.scribble.del.DelFactory; +import org.scribble.util.Constants; +import org.scribble.util.ScribException; +import org.scribble.visit.AstVisitor; + +// TODO: factor out base Wrap (cf. Disconnect) +public class LClientWrap extends BasicInteraction // Wrap, ConnectionAction? + implements LSimpleSessionNode +{ + // ScribTreeAdaptor#create constructor + public LClientWrap(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public LClientWrap(LClientWrap node) + { + super(node); + } + + // TOOD: factor out a base + public RoleNode getClientChild() + { + return (RoleNode) getChild(GWrap.CLIENT_CHILD_INDEX); // Assuming local will inherit both sides from some base (cf. base ConnectAction) + } + + public RoleNode getServerChild() + { + return (RoleNode) getChild(GWrap.SERVER_CHILD_INDEX); + } + + // "add", not "set" + public void addScribChildren(RoleNode client, RoleNode server) + { + // Cf. above getters and Scribble.g children order + addChild(client); + addChild(server); + } + + @Override + public LClientWrap dupNode() + { + return new LClientWrap(this); + } + + @Override + public void decorateDel(DelFactory df) + { + df.LClientWrap(this); + } + + // TODO: factor out a base + public LClientWrap reconstruct(RoleNode client, RoleNode server) + { + LClientWrap n = dupNode(); + n.addScribChildren(client, server); + n.setDel(del()); // No copy + return n; + } + + // TODO: factor out a base + @Override + public LClientWrap visitChildren(AstVisitor nv) throws ScribException + { + RoleNode src = (RoleNode) visitChild(getClientChild(), nv); + RoleNode dest = (RoleNode) visitChild(getClientChild(), nv); + return reconstruct(src, dest); + } + + @Override + public String toString() + { + return Constants.WRAP_KW + " " + Constants.TO_KW + " " + getClientChild() + + ";"; + } +} diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java b/scribble-ast/src/main/java/org/scribble/ast/local/LCompoundSessionNode.java similarity index 86% rename from scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LCompoundSessionNode.java index cfc5f300b..3072c52ab 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LRequestDel.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LCompoundSessionNode.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.del.local; +package org.scribble.ast.local; -public class LRequestDel extends LConnectionActionDel +public interface LCompoundSessionNode extends LSessionNode { } diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LConnectAction.java b/scribble-ast/src/main/java/org/scribble/ast/local/LConnectAction.java new file mode 100644 index 000000000..84c0be7d0 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LConnectAction.java @@ -0,0 +1,35 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.ast.ConnectAction; +import org.scribble.core.type.kind.Local; + +public abstract class LConnectAction extends ConnectAction + implements LSimpleSessionNode +{ + // ScribTreeAdaptor#create constructor + public LConnectAction(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public LConnectAction(LConnectAction node) + { + super(node); + } + +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java b/scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java new file mode 100644 index 000000000..8b79ddd56 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LContinue.java @@ -0,0 +1,46 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.ast.Continue; +import org.scribble.core.type.kind.Local; +import org.scribble.del.DelFactory; + +public class LContinue extends Continue implements LSimpleSessionNode +{ + // ScribTreeAdaptor#create constructor + public LContinue(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected LContinue(LContinue node) + { + super(node); + } + + @Override + public LContinue dupNode() + { + return new LContinue(this); + } + + @Override + public void decorateDel(DelFactory df) + { + df.LContinue(this); + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LDelegElem.java b/scribble-ast/src/main/java/org/scribble/ast/local/LDelegElem.java new file mode 100644 index 000000000..f78393a1d --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LDelegElem.java @@ -0,0 +1,47 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.ast.UnaryPayElem; +import org.scribble.core.type.kind.Local; +import org.scribble.del.DelFactory; + +// N.B. extends UnaryPayloadElem, not DelegationElem +public class LDelegElem extends UnaryPayElem +{ + // ScribTreeAdaptor#create constructor + public LDelegElem(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public LDelegElem(LDelegElem node) + { + super(node); + } + + @Override + public LDelegElem dupNode() + { + return new LDelegElem(this); + } + + @Override + public void decorateDel(DelFactory df) + { + throw new RuntimeException("TODO: " + this); + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java b/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java new file mode 100644 index 000000000..2f0fcf9eb --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java @@ -0,0 +1,47 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.ast.DisconnectAction; +import org.scribble.core.type.kind.Local; +import org.scribble.del.DelFactory; + +public class LDisconnect extends DisconnectAction + implements LSimpleSessionNode +{ + // ScribTreeAdaptor#create constructor + public LDisconnect(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public LDisconnect(LDisconnect node) + { + super(node); + } + + @Override + public void decorateDel(DelFactory df) + { + df.LDisconnect(this); + } + + @Override + public LDisconnect dupNode() + { + return new LDisconnect(this); + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java b/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java new file mode 100644 index 000000000..14da7ab36 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LDo.java @@ -0,0 +1,72 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.ast.Do; +import org.scribble.ast.name.qualified.LProtoNameNode; +import org.scribble.core.lang.context.ModuleContext; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.LProtoName; +import org.scribble.del.DelFactory; +import org.scribble.job.JobContext; + +public class LDo extends Do implements LSimpleSessionNode +{ + + // ScribTreeAdaptor#create constructor + public LDo(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public LDo(LDo node) + { + super(node); + } + + @Override + public LProtoNameNode getProtocolNameNode() + { + return (LProtoNameNode) getChild(Do.NAME_CHILD_INDEX); + } + + @Override + public LProtoDecl getTargetProtocolDecl(JobContext jobc, + ModuleContext modc) + { + LProtoName fullname = getTargetProtoDeclFullName(modc); + return jobc.getModule(fullname.getPrefix()) + .getLProtocolDeclChild(fullname.getSimpleName()); + } + + @Override + public LDo dupNode() + { + return new LDo(this); + } + + @Override + public void decorateDel(DelFactory df) + { + df.LDo(this); + } + + @Override + public LProtoName getTargetProtoDeclFullName(ModuleContext modc) + { + return (LProtoName) super.getTargetProtoDeclFullName(modc); + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LInteractionSeq.java b/scribble-ast/src/main/java/org/scribble/ast/local/LInteractionSeq.java new file mode 100644 index 000000000..d2be6a0c4 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LInteractionSeq.java @@ -0,0 +1,57 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import java.util.List; +import java.util.stream.Collectors; + +import org.antlr.runtime.Token; +import org.scribble.ast.InteractionSeq; +import org.scribble.core.type.kind.Local; +import org.scribble.del.DelFactory; + +public class LInteractionSeq extends InteractionSeq + implements LSessionNode +{ + // ScribTreeAdaptor#create constructor + public LInteractionSeq(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public LInteractionSeq(LInteractionSeq node) + { + super(node); + } + + @Override + public List getInteractionChildren() + { + return getChildren().stream().map(n -> (LSessionNode) n) + .collect(Collectors.toList()); + } + + @Override + public LInteractionSeq dupNode() + { + return new LInteractionSeq(this); + } + + @Override + public void decorateDel(DelFactory df) + { + df.LInteractionSeq(this); + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LMsgTransfer.java b/scribble-ast/src/main/java/org/scribble/ast/local/LMsgTransfer.java new file mode 100644 index 000000000..d1457b4c3 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LMsgTransfer.java @@ -0,0 +1,34 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.ast.MsgTransfer; +import org.scribble.core.type.kind.Local; + +public abstract class LMsgTransfer extends MsgTransfer + implements LSimpleSessionNode +{ + // ScribTreeAdaptor#create constructor + public LMsgTransfer(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public LMsgTransfer(LMsgTransfer node) + { + super(node); + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java new file mode 100644 index 000000000..56663050d --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java @@ -0,0 +1,53 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.del.DelFactory; + +public class LProjectionDecl extends LProtoDecl +{ + //public final GProtoName parent; // FIXME: additional ast child? + + // ScribTreeAdaptor#create constructor + public LProjectionDecl(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected LProjectionDecl(LProtoDecl node) + { + super(node); + } + + // Cf. CommonTree#dupNode + @Override + public LProtoDecl dupNode() + { + return new LProtoDecl(this); + } + + @Override + public void decorateDel(DelFactory df) + { + throw new RuntimeException("TODO: " + this); + } + + @Override + public String toString() + { + return "TODO"; + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LProtoBlock.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProtoBlock.java new file mode 100644 index 000000000..591ea878a --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LProtoBlock.java @@ -0,0 +1,52 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.ast.ProtoBlock; +import org.scribble.core.type.kind.Local; +import org.scribble.del.DelFactory; + +public class LProtoBlock extends ProtoBlock implements LScribNode +{ + // ScribTreeAdaptor#create constructor + public LProtoBlock(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected LProtoBlock(LProtoBlock node) + { + super(node); + } + + @Override + public LInteractionSeq getInteractSeqChild() + { + return (LInteractionSeq) getChild(ProtoBlock.SEQ_CHILD_INDEX); + } + + @Override + public LProtoBlock dupNode() + { + return new LProtoBlock(this); + } + + @Override + public void decorateDel(DelFactory df) + { + df.LProtoBlock(this); + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LProtoDecl.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProtoDecl.java new file mode 100644 index 000000000..e06ded600 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LProtoDecl.java @@ -0,0 +1,70 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.ast.Module; +import org.scribble.ast.ProtoDecl; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.LProtoName; +import org.scribble.del.DelFactory; + +// Maybe make abstract with concrete parsed (LParsedDecl) and projected (LProjectionDecl) subclasses +public class LProtoDecl extends ProtoDecl implements LSessionNode +{ + // ScribTreeAdaptor#create constructor + public LProtoDecl(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected LProtoDecl(LProtoDecl node) + { + super(node); + } + + @Override + public LProtoHeader getHeaderChild() + { + return (LProtoHeader) getChild(ProtoDecl.HEADER_CHILD); + } + + @Override + public LProtoDef getDefChild() + { + return (LProtoDef) getChild(ProtoDecl.DEF_CHILD); + } + + // Cf. CommonTree#dupNode + @Override + public LProtoDecl dupNode() + { + return new LProtoDecl(this); + } + + @Override + public void decorateDel(DelFactory df) + { + df.LProtoDecl(this); + } + + @Override + public LProtoName getFullMemberName(Module mod) // TODO: remove mod from meth sig + { + Module m = (Module) getParent(); + return new LProtoName(m.getFullModuleName(), + getHeaderChild().getDeclName()); + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LProtoDef.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProtoDef.java new file mode 100644 index 000000000..8e98afdcd --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LProtoDef.java @@ -0,0 +1,52 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.ast.ProtoDef; +import org.scribble.core.type.kind.Local; +import org.scribble.del.DelFactory; + +public class LProtoDef extends ProtoDef implements LSessionNode +{ + // ScribTreeAdaptor#create constructor + public LProtoDef(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected LProtoDef(LProtoDef node) + { + super(node); + } + + @Override + public LProtoBlock getBlockChild() + { + return (LProtoBlock) getChild(ProtoDef.BLOCK_CHILD_INDEX); + } + + @Override + public LProtoDef dupNode() + { + return new LProtoDef(this); + } + + @Override + public void decorateDel(DelFactory df) + { + df.LProtoDef(this); + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LProtoHeader.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProtoHeader.java new file mode 100644 index 000000000..ccb64f5c3 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LProtoHeader.java @@ -0,0 +1,67 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.ast.ProtoHeader; +import org.scribble.ast.name.qualified.LProtoNameNode; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.LProtoName; +import org.scribble.del.DelFactory; +import org.scribble.util.Constants; + +public class LProtoHeader extends ProtoHeader implements LSessionNode +{ + // ScribTreeAdaptor#create constructor + public LProtoHeader(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected LProtoHeader(LProtoHeader node) + { + super(node); + } + + @Override + public LProtoHeader dupNode() + { + return new LProtoHeader(this); + } + + @Override + public void decorateDel(DelFactory df) + { + df.LProtoHeader(this); + } + + @Override + public LProtoNameNode getNameNodeChild() + { + return (LProtoNameNode) getRawNameNodeChild(); + } + + @Override + public LProtoName getDeclName() + { + return (LProtoName) super.getDeclName(); + } + + @Override + public String toString() + { + return Constants.LOCAL_KW + " " + super.toString(); + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java b/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java new file mode 100644 index 000000000..e806db82b --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LRecursion.java @@ -0,0 +1,52 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.ast.Recursion; +import org.scribble.core.type.kind.Local; +import org.scribble.del.DelFactory; + +public class LRecursion extends Recursion implements LCompoundSessionNode +{ + // ScribTreeAdaptor#create constructor + public LRecursion(Token t) + { + super(t); + } + + // Tree#dupNode constructor + protected LRecursion(LRecursion node) + { + super(node); + } + + @Override + public LProtoBlock getBlockChild() + { + return (LProtoBlock) getChild(Recursion.BODY_CHILD_INDEX); + } + + @Override + public LRecursion dupNode() + { + return new LRecursion(this); + } + + @Override + public void decorateDel(DelFactory df) + { + df.LRecursion(this); + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java b/scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java new file mode 100644 index 000000000..c60418808 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java @@ -0,0 +1,57 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import java.util.stream.Collectors; + +import org.antlr.runtime.Token; +import org.scribble.del.DelFactory; +import org.scribble.util.Constants; + +public class LRecv extends LMsgTransfer +{ + // ScribTreeAdaptor#create constructor + public LRecv(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public LRecv(LRecv node) + { + super(node); + } + + @Override + public LRecv dupNode() + { + return new LRecv(this); + } + + @Override + public void decorateDel(DelFactory df) + { + df.LRecv(this); + } + + @Override + public String toString() + { + return getMessageNodeChild() + " " + Constants.FROM_KW + + " " + + getDestinationChildren().stream().map(x -> x.toString()) + .collect(Collectors.joining(", ")) + + ";"; + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LReq.java b/scribble-ast/src/main/java/org/scribble/ast/local/LReq.java new file mode 100644 index 000000000..9292f1a39 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LReq.java @@ -0,0 +1,53 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.del.DelFactory; +import org.scribble.util.Constants; + +public class LReq extends LConnectAction implements LSimpleSessionNode +{ + // ScribTreeAdaptor#create constructor + public LReq(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public LReq(LReq node) + { + super(node); + } + + @Override + public LReq dupNode() + { + return new LReq(this); + } + + @Override + public void decorateDel(DelFactory df) + { + df.LReq(this); + } + + @Override + public String toString() + { + return (isUnitMessage() ? "" : getMessageNodeChild() + " ") + + Constants.REQUEST_KW + " " + Constants.TO_KW + + " " + getDestinationChild() + ";"; + } +} diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java b/scribble-ast/src/main/java/org/scribble/ast/local/LScribNode.java similarity index 67% rename from scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LScribNode.java index 23c95c082..ada5ec403 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDefDel.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LScribNode.java @@ -11,14 +11,22 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.del.local; +package org.scribble.ast.local; -import org.scribble.del.ProtocolDefDel; +import org.scribble.ast.ProtoKindNode; +import org.scribble.core.type.kind.Local; -public class LProtocolDefDel extends ProtocolDefDel +public interface LScribNode extends ProtoKindNode { - public LProtocolDefDel() + @Override + default boolean isLocal() { - + return true; + } + + @Override + default Local getKind() + { + return Local.KIND; } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java new file mode 100644 index 000000000..ed69e3f6c --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java @@ -0,0 +1,57 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import java.util.stream.Collectors; + +import org.antlr.runtime.Token; +import org.scribble.del.DelFactory; +import org.scribble.util.Constants; + +public class LSend extends LMsgTransfer +{ + // ScribTreeAdaptor#create constructor + public LSend(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public LSend(LSend node) + { + super(node); + } + + @Override + public LSend dupNode() + { + return new LSend(this); + } + + @Override + public void decorateDel(DelFactory df) + { + df.LSend(this); + } + + @Override + public String toString() + { + return getMessageNodeChild() + " " + Constants.TO_KW + + " " + + getDestinationChildren().stream().map(x -> x.toString()) + .collect(Collectors.joining(", ")) + + ";"; + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LServerWrap.java b/scribble-ast/src/main/java/org/scribble/ast/local/LServerWrap.java new file mode 100644 index 000000000..17f57b599 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LServerWrap.java @@ -0,0 +1,97 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.ast.BasicInteraction; +import org.scribble.ast.global.GWrap; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.type.kind.Local; +import org.scribble.del.DelFactory; +import org.scribble.util.Constants; +import org.scribble.util.ScribException; +import org.scribble.visit.AstVisitor; + +// TODO: factor out base Wrap (cf. Disconnect) +public class LServerWrap extends BasicInteraction // Wrap, ConnectionAction -- CHECKME? + implements LSimpleSessionNode +{ + + // ScribTreeAdaptor#create constructor + public LServerWrap(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public LServerWrap(LServerWrap node) + { + super(node); + } + + public RoleNode getClientChild() + { + return (RoleNode) getChild(GWrap.CLIENT_CHILD_INDEX); // Assuming local will inherit both sides from some base (cf. base ConnectAction) + } + + // TOOD: factor out a base + public RoleNode getServerChild() + { + return (RoleNode) getChild(GWrap.SERVER_CHILD_INDEX); + } + + // "add", not "set" + public void addScribChildren(RoleNode client, RoleNode server) + { + // Cf. above getters and Scribble.g children order + addChild(client); + addChild(server); + } + + @Override + public LServerWrap dupNode() + { + return new LServerWrap(this); + } + + @Override + public void decorateDel(DelFactory df) + { + df.LServerWrap(this); + } + + // TODO: factor out a base + public LServerWrap reconstruct(RoleNode client, RoleNode server) + { + LServerWrap n = dupNode(); + n.addScribChildren(client, server); + n.setDel(del()); // No copy + return n; + } + + // TODO: factor out a base + @Override + public LServerWrap visitChildren(AstVisitor nv) throws ScribException + { + RoleNode src = (RoleNode) visitChild(getClientChild(), nv); + RoleNode dest = (RoleNode) visitChild(getServerChild(), nv); + return reconstruct(src, dest); + } + + @Override + public String toString() + { + return Constants.WRAP_KW + " " + getClientChild() + ";"; + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java new file mode 100644 index 000000000..c4b1c07bd --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LSessionNode.java @@ -0,0 +1,32 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.scribble.ast.SessionNode; +import org.scribble.core.type.kind.Local; + +public interface LSessionNode extends SessionNode, LScribNode +{ + @Override + default boolean isLocal() + { + return true; + } + + @Override + default Local getKind() + { + return Local.KIND; + } +} diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java similarity index 87% rename from scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java index d25ea8734..88861cd57 100644 --- a/scribble-ast/src/main/java/org/scribble/del/local/LReceiveDel.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LSimpleSessionNode.java @@ -11,9 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.del.local; +package org.scribble.ast.local; -public class LReceiveDel extends LMessageTransferDel +public interface LSimpleSessionNode extends LSessionNode { } diff --git a/scribble-ast/src/main/java/org/scribble/del/DelFactory.java b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java index d1dd09f09..649c2fb5d 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DelFactory.java +++ b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java @@ -47,6 +47,22 @@ import org.scribble.ast.global.GProtoHeader; import org.scribble.ast.global.GRecursion; import org.scribble.ast.global.GWrap; +import org.scribble.ast.local.LAcc; +import org.scribble.ast.local.LChoice; +import org.scribble.ast.local.LClientWrap; +import org.scribble.ast.local.LContinue; +import org.scribble.ast.local.LDisconnect; +import org.scribble.ast.local.LDo; +import org.scribble.ast.local.LInteractionSeq; +import org.scribble.ast.local.LProtoBlock; +import org.scribble.ast.local.LProtoDecl; +import org.scribble.ast.local.LProtoDef; +import org.scribble.ast.local.LProtoHeader; +import org.scribble.ast.local.LRecursion; +import org.scribble.ast.local.LRecv; +import org.scribble.ast.local.LReq; +import org.scribble.ast.local.LSend; +import org.scribble.ast.local.LServerWrap; import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.ast.name.qualified.LProtoNameNode; @@ -62,6 +78,7 @@ import org.scribble.ast.name.simple.SigParamNode; +// A little bit more than a "plain" factory, methods do the decoration via ScribNodeBase.setDel // Use after ANTLR parsing (specifically, ScribTreeAdaptor) -- not needed for AstFactory constructions // (Perhaps could integrate with ScribTreeAdaptor, but easier to do after -- AST construction technically may further create/dup nodes during the ongoing pass) // A dec method for each AST class -- method name must be the same as target class name @@ -69,7 +86,7 @@ // E.g., DelDecoratorImpl: each method named after the class name public interface DelFactory { - // Currently a bit more than plain factory, calls setDel + // Names void IdNode(IdNode n); void ExtIdNode(ExtIdNode n); @@ -86,6 +103,8 @@ public interface DelFactory void ModuleNameNode(ModuleNameNode n); void SigNameNode(SigNameNode n); + + // General and globals void Module(Module m); void ModuleDecl(ModuleDecl n); void ImportModule(ImportModule n); @@ -113,7 +132,6 @@ public interface DelFactory void PayElemList(PayElemList n); void UnaryPayElem(UnaryPayElem n); void GDelegPayElem(GDelegPayElem n); - //void LDelegationElem(CommonTree source, LProtocolNameNode name); void GConnect(GConnect n); void GDisconnect(GDisconnect n); @@ -130,48 +148,32 @@ public interface DelFactory void GChoice(GChoice n); void GRecursion(GRecursion n); -} - - - - - - - - - - - - - - - - - - + + // Locals + void LProtoDecl(LProtoDecl n); + + void LProtoHeader(LProtoHeader n); + void LProtoDef(LProtoDef n); + void LProtoBlock(LProtoBlock n); + void LInteractionSeq(LInteractionSeq n); + + //void LDelegElem(LDelegElem n); + + void LAcc(LAcc n); + void LReq(LReq n); + void LDisconnect(LDisconnect n); + void LSend(LSend n); + void LRecv(LRecv n); + void LClientWrap(LClientWrap n); + void LServerWrap(LServerWrap n); + + void LContinue(LContinue n); + void LDo(LDo n); + + void LChoice(LChoice n); + void LRecursion(LRecursion n); +} - /*DummyProjectionRoleNode DummyProjectionRoleNode(); - - LProtocolDecl LProtocolDecl(CommonTree source, List modifiers, LProtocolHeader header, LProtocolDef def); // Not currently used -- local protos not parsed, only projected - LProjectionDecl LProjectionDecl(CommonTree source, List modifiers, GProtocolName fullname, Role self, LProtocolHeader header, LProtocolDef def); // del extends that of LProtocolDecl - - LProtocolHeader LProtocolHeader(CommonTree source, LProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls); - SelfRoleDecl SelfRoleDecl(CommonTree source, RoleNode namenode); - LProtocolDef LProtocolDef(CommonTree source, LProtocolBlock block); - LProtocolBlock LProtocolBlock(CommonTree source, LInteractionSeq seq); - LInteractionSeq LInteractionSeq(CommonTree source, List actions); - - LSend LSend(CommonTree source, RoleNode src, MessageNode msg, List dests); - LReceive LReceive(CommonTree source, RoleNode src, MessageNode msg, List dests); - LRequest LRequest(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest); - LAccept LAccept(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest); - LDisconnect LDisconnect(CommonTree source, RoleNode self, RoleNode peer); - LWrapClient LWrapClient(CommonTree source, RoleNode self, RoleNode peer); - LWrapServer LWrapServer(CommonTree source, RoleNode self, RoleNode peer); - LChoice LChoice(CommonTree source, RoleNode subj, List blocks); - LRecursion LRecursion(CommonTree source, RecVarNode recvar, LProtocolBlock block); - LContinue LContinue(CommonTree source, RecVarNode recvar); - LDo LDo(CommonTree source, RoleArgList roles, NonRoleArgList args, LProtocolNameNode proto);*/ diff --git a/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/MsgTransferDel.java similarity index 86% rename from scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java rename to scribble-ast/src/main/java/org/scribble/del/MsgTransferDel.java index 60581ef87..8f1351206 100644 --- a/scribble-ast/src/main/java/org/scribble/del/MessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/MsgTransferDel.java @@ -13,9 +13,9 @@ */ package org.scribble.del; -public abstract class MessageTransferDel extends DirectedInteractionDel +public abstract class MsgTransferDel extends DirectedInteractionDel { - public MessageTransferDel() + public MsgTransferDel() { } diff --git a/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtoBlockDel.java similarity index 93% rename from scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java rename to scribble-ast/src/main/java/org/scribble/del/ProtoBlockDel.java index 74d5a3f1e..a2cad9876 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtoBlockDel.java @@ -16,7 +16,7 @@ // Not a CompoundSessionNodeDel -- corresponds to ProtocolBlock, not a CompoundSessionNode // A ProtocolBlock is not a "direct" session type constructor (cf. SessionNode) -public abstract class ProtocolBlockDel extends ScribDelBase +public abstract class ProtoBlockDel extends ScribDelBase { } diff --git a/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtoDeclDel.java similarity index 91% rename from scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java rename to scribble-ast/src/main/java/org/scribble/del/ProtoDeclDel.java index 5733fdb80..a7bf069bf 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtoDeclDel.java @@ -18,10 +18,10 @@ import org.scribble.util.ScribException; import org.scribble.visit.NameDisambiguator; -public abstract class ProtocolDeclDel +public abstract class ProtoDeclDel extends ScribDelBase { - protected ProtocolDeclDel() + protected ProtoDeclDel() { } diff --git a/scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java b/scribble-ast/src/main/java/org/scribble/del/ProtoDefDel.java similarity index 91% rename from scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java rename to scribble-ast/src/main/java/org/scribble/del/ProtoDefDel.java index b3c50d1fe..7990d1628 100644 --- a/scribble-ast/src/main/java/org/scribble/del/ProtocolDefDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/ProtoDefDel.java @@ -13,7 +13,7 @@ */ package org.scribble.del; -public abstract class ProtocolDefDel extends ScribDelBase +public abstract class ProtoDefDel extends ScribDelBase { } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java index 59aed3582..e7d87a6f0 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -20,12 +20,12 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Msg; -import org.scribble.del.MessageTransferDel; +import org.scribble.del.MsgTransferDel; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.NameDisambiguator; -public class GMessageTransferDel extends MessageTransferDel +public class GMessageTransferDel extends MsgTransferDel implements GSimpleSessionNodeDel { public GMessageTransferDel() diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtoBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtoBlockDel.java index 0ccd7fd23..ce5bb712f 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtoBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtoBlockDel.java @@ -16,11 +16,11 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GProtoBlock; import org.scribble.core.type.session.global.GSeq; -import org.scribble.del.ProtocolBlockDel; +import org.scribble.del.ProtoBlockDel; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -public class GProtoBlockDel extends ProtocolBlockDel implements GDel +public class GProtoBlockDel extends ProtoBlockDel implements GDel { @Override public GSeq translate(ScribNode n, GTypeTranslator t) diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java index 89327f53f..a378a16e6 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java @@ -27,11 +27,11 @@ import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.global.GSeq; -import org.scribble.del.ProtocolDeclDel; +import org.scribble.del.ProtoDeclDel; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; -public class GProtoDeclDel extends ProtocolDeclDel implements GDel +public class GProtoDeclDel extends ProtoDeclDel implements GDel { public GProtoDeclDel() { diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtoDefDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtoDefDel.java index 7e6520be6..fe0e0cc3a 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtoDefDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtoDefDel.java @@ -13,9 +13,9 @@ */ package org.scribble.del.global; -import org.scribble.del.ProtocolDefDel; +import org.scribble.del.ProtoDefDel; -public class GProtoDefDel extends ProtocolDefDel +public class GProtoDefDel extends ProtoDefDel { public GProtoDefDel() { diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java index ab7c85fe9..d3d511d7e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java @@ -16,13 +16,13 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GWrap; import org.scribble.core.lang.global.GNode; -import org.scribble.del.ConnectionActionDel; +import org.scribble.del.BasicInteractionDel; import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; import org.scribble.visit.NameDisambiguator; // TODO: make WrapDel (cf., G/LMessageTransferDel) -public class GWrapDel extends ConnectionActionDel +public class GWrapDel extends BasicInteractionDel //ConnectionActionDel implements GSimpleSessionNodeDel { public GWrapDel() diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LAccDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LAccDel.java new file mode 100755 index 000000000..6aaef61c4 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/del/local/LAccDel.java @@ -0,0 +1,43 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.del.local; + +import org.scribble.ast.ScribNode; +import org.scribble.ast.local.LAcc; +import org.scribble.util.ScribException; +import org.scribble.visit.context.ProjectedChoiceSubjectFixer; +import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; +import org.scribble.visit.context.env.UnguardedChoiceDoEnv; + +public class LAccDel extends LConnectionActionDel +{ + @Override + public void enterProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer) + { + fixer.setChoiceSubject(((LAcc) child).src.toName()); + } + + @Override + public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, + ScribNode child, UnguardedChoiceDoProjectionChecker checker) + throws ScribException + { + super.enterUnguardedChoiceDoProjectionCheck(parent, child, checker); + LAcc la = (LAcc) child; + UnguardedChoiceDoEnv env = checker.popEnv(); + env = env.setChoiceSubject(la.getSourceChild().toName()); + checker.pushEnv(env); + } +} diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java old mode 100644 new mode 100755 index f72a40670..72ad20c33 --- a/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java @@ -13,9 +13,98 @@ */ package org.scribble.del.local; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.scribble.ast.Choice; +import org.scribble.ast.ScribNode; +import org.scribble.ast.local.LChoice; +import org.scribble.ast.local.LProtocolBlock; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.type.kind.RoleKind; +import org.scribble.core.type.name.RecVar; +import org.scribble.core.type.name.Role; import org.scribble.del.ChoiceDel; +import org.scribble.util.ScribException; +import org.scribble.visit.context.ProjectedChoiceDoPruner; +import org.scribble.visit.context.ProjectedChoiceSubjectFixer; +import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; +import org.scribble.visit.context.env.UnguardedChoiceDoEnv; public class LChoiceDel extends ChoiceDel implements LCompoundSessionNodeDel { + @Override + public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, + ScribNode child, UnguardedChoiceDoProjectionChecker checker, + ScribNode visited) throws ScribException + { + Choice cho = (Choice) visited; + List benvs = cho.getBlocks().stream() + .map((b) -> (UnguardedChoiceDoEnv) b.del().env()) + .collect(Collectors.toList()); + UnguardedChoiceDoEnv merged = checker.popEnv().mergeContexts(benvs); + checker.pushEnv(merged); + return (Choice) super.leaveUnguardedChoiceDoProjectionCheck(parent, + child, checker, cho); + // Done merge of children here, super does merge into parent + } + + @Override + public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, + ScribNode child, ProjectedChoiceDoPruner pruner, ScribNode visited) + throws ScribException + { + LChoice lc = (LChoice) visited; + List blocks = lc.getBlocks().stream() + .filter(b -> !b.isEmpty()).collect(Collectors.toList()); + if (blocks.isEmpty()) + { + return null; + } + return lc.reconstruct(lc.subj, blocks); + } + @Override + public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer, ScribNode visited) + throws ScribException + { + LChoice lc = (LChoice) visited; + List blocks = lc.getBlocks(); + + Set subjs = blocks.stream() + .map((b) -> b.getInteractionSeq().getInteractions().get(0).inferLocalChoiceSubject(fixer)) + //.filter((r) -> !r.toString().equals(DummyProjectionRoleNode.DUMMY_PROJECTION_ROLE)) + .collect(Collectors.toSet()); + if (subjs.size() == 0) + { + //throw new RuntimeScribException("TODO: unable to infer projection subject: " + parent); + throw new RuntimeException("Shouldn't get in here: " + subjs); // FIXME: should be OK now by model-based WF + } + else + { + subjs = subjs.stream() + .map((r) -> fixer.isRecVarRole(r) + ? fixer.getChoiceSubject(new RecVar(r.toString())) : r) // Never needed? + .collect(Collectors.toSet()); + } + + // HACK? (for non- role-balanced choice cases) + subjs = subjs.stream().filter((s) -> s != null).collect(Collectors.toSet()); + + if (subjs.size() > 1) // Unnecessary: due to WF check in GChoiceDel.leaveInlinedPathCollection -- would be better as a check on locals than in projection anyway + { + String self = fixer.getModuleContext().root.getSimpleName().toString(); // HACK + self = self.substring(self.lastIndexOf('_')+1, self.length()); // FIXME: not sound (if role names include "_") + throw new ScribException(lc.getSource(), "Cannot project onto " + self + " due to inconsistent local choice subjects: " + subjs); // self not recorded -- can derive from LProtocolDecl RoleDeclList + //throw new RuntimeException("Shouldn't get in here: " + subjs); + } + RoleNode subj = (RoleNode) fixer.job.af.SimpleNameNode(null, RoleKind.KIND, // FIXME? null source OK? + //blocks.get(0).getInteractionSeq().getInteractions().get(0).inferLocalChoiceSubject(fixer).toString()); + subjs.iterator().next().toString()); + fixer.setChoiceSubject(subj.toName()); + LChoice projection = fixer.job.af.LChoice(lc.getSource(), subj, blocks); + return projection; + } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java old mode 100644 new mode 100755 index a7511e752..9fc081899 --- a/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java @@ -13,10 +13,82 @@ */ package org.scribble.del.local; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import org.scribble.ast.ScribNode; +import org.scribble.ast.local.LContinue; +import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.ContinueDel; +import org.scribble.main.ScribbleException; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.RecVar; +import org.scribble.visit.ProtocolDefInliner; +import org.scribble.visit.context.EGraphBuilder; +import org.scribble.visit.env.InlineProtocolEnv; +import org.scribble.visit.wf.ReachabilityChecker; +import org.scribble.visit.wf.env.ReachabilityEnv; -public class LContinueDel extends ContinueDel - implements LSimpleSessionNodeDel +public class LContinueDel extends ContinueDel implements LSimpleInteractionNodeDel { + @Override + public LContinue leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + { + LContinue lc = (LContinue) visited; + RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) lc.recvar.del().env()).getTranslation(); + LContinue inlined = inl.job.af.LContinue(lc.getSource(), recvar); + inl.pushEnv(inl.popEnv().setTranslation(inlined)); + return (LContinue) super.leaveProtocolInlining(parent, child, inl, lc); + } + + @Override + public LContinue leaveReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker, ScribNode visited) throws ScribbleException + { + // "Entering" the continue here in leave, where we can merge the new state into the parent Env + // Generally: if side effecting Env state to be merged into the parent (not just popped and discarded), leave must be overridden to do so + LContinue lc = (LContinue) visited; + ReachabilityEnv env = checker.popEnv().addContinueLabel(lc.recvar.toName()); + setEnv(env); // Env recording probably not needed for all LocalInteractionNodes, just the compound ones, like for WF-choice checking + checker.pushEnv(checker.popEnv().mergeContext(env)); + return lc; + } + + @Override + public LContinue leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder graph, ScribNode visited) throws ScribbleException + { + LContinue lr = (LContinue) visited; + RecVar rv = lr.recvar.toName(); + if (graph.util.isUnguardedInChoice()) + { + graph.util.addContinueEdge(graph.util.getEntry(), rv); + } + else + { + // ** "Overwrites" previous edge built by send/receive(s) leading to this continue + Iterator preds = graph.util.getPredecessors().iterator(); + Iterator prevs = graph.util.getPreviousActions().iterator(); + EState entry = graph.util.getEntry(); + Set> removed = new HashSet<>(); + // HACK: for identical edges, i.e. same pred/prev/succ (e.g. rec X { choice at A { A->B:1 } or { A->B:1 } continue X; }) // FIXME: do here, or refactor into GraphBuilder? + // Because duplicate edges preemptively pruned by ModelState.addEdge, but corresponding predecessors not pruned // FIXME: make uniform + while (preds.hasNext()) + { + EState pred = preds.next(); + EAction prev = prevs.next(); + List tmp = Arrays.asList(pred, prev, entry); + if (!removed.contains(tmp)) + { + removed.add(tmp); + graph.util.removeEdgeFromPredecessor(pred, prev); // Assumes pred is a predecessor, and removes pred from current predecessors.. + } + graph.util.addRecursionEdge(pred, prev, graph.util.getRecursionEntry(rv)); // May be repeated for non-det, but OK // Combine with removeEdgeFromPredecessor? + } + } + return (LContinue) super.leaveEGraphBuilding(parent, child, graph, lr); + } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDel.java old mode 100644 new mode 100755 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java old mode 100644 new mode 100755 index 86c2e2133..e3563ff51 --- a/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java @@ -13,10 +13,28 @@ */ package org.scribble.del.local; -import org.scribble.del.DisconnectDel; +import org.scribble.ast.ScribNode; +import org.scribble.ast.local.LDisconnect; +import org.scribble.del.ConnectionActionDel; +import org.scribble.main.ScribbleException; +import org.scribble.type.name.Role; +import org.scribble.visit.context.EGraphBuilder; +import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -public class LDisconnectDel extends DisconnectDel - implements LSimpleSessionNodeDel +public class LDisconnectDel extends ConnectionActionDel implements LSimpleInteractionNodeDel { - + @Override + public LDisconnect leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder builder, ScribNode visited) throws ScribbleException + { + LDisconnect ld = (LDisconnect) visited; + Role peer = ld.peer.toName(); + builder.util.addEdge(builder.util.getEntry(), builder.job.ef.newEDisconnect(peer), builder.util.getExit()); + return (LDisconnect) super.leaveEGraphBuilding(parent, child, builder, ld); + } + + @Override + public void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) + { + fixer.setChoiceSubject(((LDisconnect) child).src.toName()); + } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java old mode 100644 new mode 100755 index d140e6166..a1e434376 --- a/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java @@ -13,9 +13,91 @@ */ package org.scribble.del.local; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.scribble.ast.RoleArg; +import org.scribble.ast.RoleArgList; +import org.scribble.ast.ScribNode; +import org.scribble.ast.global.GProtoDecl; +import org.scribble.ast.local.LDo; +import org.scribble.ast.local.LProtoDecl; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.Role; import org.scribble.del.DoDel; +import org.scribble.job.JobContext; +import org.scribble.util.ScribException; +import org.scribble.visit.context.ProjectedRoleDeclFixer; +import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; public class LDoDel extends DoDel implements LSimpleSessionNodeDel { + // Pre: this pass is only run on projections (LProjectionDeclDel has source global protocol info) + @Override + public ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, + ScribNode child, ProjectedRoleDeclFixer fixer, ScribNode visited) + throws ScribException + { + JobContext jc = fixer.job.getContext(); + LDo ld = (LDo) visited; + LProtoDecl lpd = ld.getTargetProtoDecl(jc, fixer.getModuleContext()); + + // do role args are currently as inherited from the global type -- so need to derive role map against the global protocol header + // Doing it off the global roledecls allows this to be done in one pass, but would probably be easier to split into two (e.g. 1st cache the proposed changes, 2nd write all changes -- the problem with a single pass is e.g. looking up the localdecl info while localdecls are being rewritten during the pass) + // Could possibly factor out rolemap making with SubprotocolVisitor a bit, but there it maps to RoleNode and works off a root map + GProtoName source = ((LProjectionDeclDel) lpd.del()).getSourceProto(); + GProtoDecl gpd = (GProtoDecl) jc.getModule(source.getPrefix()).getProtoDecl(source.getSimpleName()); + Iterator roleargs = ld.roles.getDoArgs().iterator(); + Map rolemap = gpd.header.roledecls.getRoles().stream().collect( + Collectors.toMap(r -> r, r -> roleargs.next().val.toName())); + Set occs = ((LProtoDeclDel) lpd.del()).getProtoDeclContext().getRoleOccurrences().stream().map(r -> + rolemap.get(r)).collect(Collectors.toSet()); + + List ras = ld.roles.getDoArgs().stream().filter(ra -> occs.contains(ra.val.toName())).collect(Collectors.toList()); + RoleArgList roles = ld.roles.reconstruct(ras); + return super.leaveProjectedRoleDeclFixing(parent, child, fixer, ld.reconstruct(roles, ld.args, ld.getProtoNameNode())); + } + + @Override + public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribException + { + /*//if (checker.isCycle()) + if (checker.isRootedCycle()) // ChoiceUnguardedSubprotocolChecker is a (regular) SubprotocolVisitor which pushes a subprotosig on root decl entry (ProjectedSubprotocolPruner.visit) + // Check for "rooted" cycle to ensure it's specifically the cycle from the root proto decl (back) to the target do + // FIXME: but cycle to specific "target do" is not ensured: could be another instance of a do with the same subprotosig... an inherent issue of the current subprotocolvisitor framework + + // FIXME: this algorithm works for some use cases for is still wrong (prunes some that it shouldn't -- e.g. mutually pruneable choice-unguarded do's) + // *** what we really need is to check for 0 inferred choice subjects up to recursion back (if any) to to the parent choice -- problem is current framework doesn't make identifying (e.g. ==) the original choice easy *** + // the issue is arising since WF was relaxed to allow unbalanced choice case roles: with balanced, subject inference is always fine as long as roles are used? (and prev assumed no choice-unguarded do's?) + { + //System.out.println("ABC: " + checker.peekEnv().subjs + ", " + checker.SHOULD_PRUNE); + + //if (checker.peekEnv().shouldPrune()) + if (checker.peekEnv().subjs.isEmpty()) + { + /*ChoiceUnguardedSubprotocolEnv env = checker.popEnv(); + checker.pushEnv(env.disablePrune());* / + //checker.enablePrune(); + } + }*/ + return super.leaveUnguardedChoiceDoProjectionCheck(parent, child, checker, visited); + + // for each do: check shouldPrune condition by following the control flow: if terminates or cycles with no actions then prune + // Let the main pruning visitor be a regular visitor, and use the subprotocol visitor to follow the calls for pruning analysis + + //FIXME: maybe similar to project roledecl fixing? use role occurrences saved in protocoldecl? + // role occurrences collected by RoleCollector which is indeed subprotocol visitor + // problem is RoleCollector currently comes after subject fixing... but maybe it doesn't need to collect subject roles in the end? due to WF enabling checks? + + //..not role collection, that's a "may" usage of roles + //..should be: start from a candidate unguarded-do inside a choice: want to know if this choice case should be removed + //......follow protocol flow through do until either end or return to this choice, looking for actions + // ... but look only on direct path or across all branches? + + //...or else it should be: start from the target protocoldecl and go through to the candidate do (cf grecursion.prune) + } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java old mode 100644 new mode 100755 index 30ad0e5c3..e7726e575 --- a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java @@ -13,9 +13,40 @@ */ package org.scribble.del.local; +import java.util.List; +import java.util.stream.Collectors; + +import org.scribble.ast.ScribNode; +import org.scribble.ast.local.LInteractionSeq; +import org.scribble.ast.local.LSessionNode; import org.scribble.del.InteractionSeqDel; +import org.scribble.util.ScribException; +import org.scribble.visit.context.ProjectedChoiceDoPruner; public class LInteractionSeqDel extends InteractionSeqDel implements LDel { - + @Override + public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, + ScribNode child, ProjectedChoiceDoPruner pruner, ScribNode visited) + throws ScribException + { + LInteractionSeq lc = (LInteractionSeq) visited; + List actions = lc.getInteractionChildren().stream() + .filter(li -> li != null).collect(Collectors.toList()); + return lc.reconstruct(actions); + } + + /*// Duplicated from GInteractionSeq + @Override + public LInteractionSeq leaveRecRemoval(ScribNode parent, ScribNode child, RecRemover rem, ScribNode visited) + throws ScribException + { + LInteractionSeq lis = (LInteractionSeq) visited; + List lins = lis.getInteractions().stream().flatMap((li) -> + (li instanceof LRecursion && rem.toRemove(((LRecursion) li).recvar.toName())) + ? ((LRecursion) li).getBlock().getInteractionSeq().getInteractions().stream() + : Stream.of(li) + ).collect(Collectors.toList()); + return rem.job.af.LInteractionSeq(lis.getSource(), lins); + }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LMsgTransferDel.java old mode 100644 new mode 100755 similarity index 85% rename from scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LMsgTransferDel.java index 9346dd7c7..cc94f4a02 --- a/scribble-ast/src/main/java/org/scribble/del/local/LMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LMsgTransferDel.java @@ -13,9 +13,9 @@ */ package org.scribble.del.local; -import org.scribble.del.MessageTransferDel; +import org.scribble.del.MsgTransferDel; -public abstract class LMessageTransferDel extends MessageTransferDel +public abstract class LMsgTransferDel extends MsgTransferDel implements LSimpleSessionNodeDel { diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java old mode 100644 new mode 100755 index e112851ac..179d19d12 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java @@ -13,7 +13,64 @@ */ package org.scribble.del.local; -public class LProjectionDeclDel extends LProtocolDeclDel +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.scribble.ast.RoleDecl; +import org.scribble.ast.RoleDeclList; +import org.scribble.ast.ScribNode; +import org.scribble.ast.local.LProtocolDecl; +import org.scribble.ast.local.LProtocolHeader; +import org.scribble.main.ScribbleException; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; +import org.scribble.visit.context.ProjectedRoleDeclFixer; + +public class LProjectionDeclDel extends LProtoDeclDel { + // Maybe better to store in context, but more convenient to pass to here via factory (than infer in context building) -- could alternatively store in projected module + protected final GProtocolName fullname; + protected final Role self; // Can be obtained from LProtocolHeader? + + public LProjectionDeclDel(GProtocolName fullname, Role self) + { + this.fullname = fullname; + this.self = self; + } + + @Override + protected LProtoDeclDel copy() + { + return new LProjectionDeclDel(this.fullname, this.self); + } + @Override + public ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, ScribNode child, ProjectedRoleDeclFixer fixer, ScribNode visited) throws ScribbleException + { + LProtocolDecl lpd = (LProtocolDecl) visited; + // FIXME: ensure all role params are used, to avoid empty roledecllist + Set occs = ((LProtoDeclDel) lpd.del()).getProtocolDeclContext().getRoleOccurrences(); + List rds = lpd.header.roledecls.getDecls().stream().filter((rd) -> + occs.contains(rd.getDeclName())).collect(Collectors.toList()); + RoleDeclList rdl = fixer.job.af.RoleDeclList(lpd.header.roledecls.getSource(), rds); + LProtocolHeader tmp = lpd.getHeader(); + LProtocolHeader hdr = tmp.reconstruct(tmp.getNameNode(), rdl, tmp.paramdecls); + LProtocolDecl fixed = lpd.reconstruct(hdr, lpd.def); + + fixer.job.debugPrintln("\n[DEBUG] Projected " + getSourceProtocol() + " for " + getSelfRole() + ":\n" + fixed); + + return super.leaveProjectedRoleDeclFixing(parent, child, fixer, fixed); + } + + public GProtocolName getSourceProtocol() + { + return this.fullname; + } + + // Redundant with SelfRoleDecl in header + public Role getSelfRole() + { + return this.self; + } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtoBlockDel.java old mode 100644 new mode 100755 similarity index 85% rename from scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LProtoBlockDel.java index 4c878b49b..e4481aaaf --- a/scribble-ast/src/main/java/org/scribble/del/local/LAcceptDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtoBlockDel.java @@ -13,7 +13,9 @@ */ package org.scribble.del.local; -public class LAcceptDel extends LConnectionActionDel +import org.scribble.del.ProtoBlockDel; + +public class LProtoBlockDel extends ProtoBlockDel implements LDel { - + } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtoDeclDel.java old mode 100644 new mode 100755 similarity index 82% rename from scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LProtoDeclDel.java index 5f7abfc4f..f6240f0fe --- a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtoDeclDel.java @@ -14,11 +14,11 @@ package org.scribble.del.local; import org.scribble.core.type.kind.Local; -import org.scribble.del.ProtocolDeclDel; +import org.scribble.del.ProtoDeclDel; -public class LProtocolDeclDel extends ProtocolDeclDel implements LDel +public class LProtoDeclDel extends ProtoDeclDel { - public LProtocolDeclDel() + public LProtoDeclDel() { } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtoDefDel.java old mode 100644 new mode 100755 similarity index 84% rename from scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LProtoDefDel.java index 28f64eec8..3fe77f1a2 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProtocolBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProtoDefDel.java @@ -13,9 +13,12 @@ */ package org.scribble.del.local; -import org.scribble.del.ProtocolBlockDel; +import org.scribble.del.ProtoDefDel; -public class LProtocolBlockDel extends ProtocolBlockDel implements LDel +public class LProtoDefDel extends ProtoDefDel { + public LProtoDefDel() + { + } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java old mode 100644 new mode 100755 index 6131886be..9723a0b3a --- a/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java @@ -13,10 +13,43 @@ */ package org.scribble.del.local; +import org.scribble.ast.Recursion; +import org.scribble.ast.ScribNode; +import org.scribble.ast.local.LRecursion; import org.scribble.del.RecursionDel; +import org.scribble.util.ScribException; +import org.scribble.visit.context.ProjectedChoiceSubjectFixer; +import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; +import org.scribble.visit.context.env.UnguardedChoiceDoEnv; public class LRecursionDel extends RecursionDel implements LCompoundSessionNodeDel { + @Override + public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, + ScribNode child, UnguardedChoiceDoProjectionChecker checker, + ScribNode visited) throws ScribException + { + Recursion rec = (Recursion) visited; + UnguardedChoiceDoEnv merged = checker.popEnv() + .mergeContext((UnguardedChoiceDoEnv) rec.getBlockChild().del().env()); + checker.pushEnv(merged); + return (Recursion) super.leaveUnguardedChoiceDoProjectionCheck(parent, + child, checker, rec); + } + @Override + public void enterProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer) + { + fixer.pushRec(((LRecursion) child).getRecVarChild.toName()); + } + + @Override + public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer, ScribNode visited) + { + fixer.popRec(((LRecursion) child).getRecVarChild().toName()); + return visited; + } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LRecvDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LRecvDel.java new file mode 100755 index 000000000..8fef8918e --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/del/local/LRecvDel.java @@ -0,0 +1,43 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.del.local; + +import org.scribble.ast.ScribNode; +import org.scribble.ast.local.LRecv; +import org.scribble.util.ScribException; +import org.scribble.visit.context.ProjectedChoiceSubjectFixer; +import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; +import org.scribble.visit.context.env.UnguardedChoiceDoEnv; + +public class LRecvDel extends LMsgTransferDel +{ + @Override + public void enterProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer) + { + fixer.setChoiceSubject(((LRecv) child).src.toName()); + } + + @Override + public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, + ScribNode child, UnguardedChoiceDoProjectionChecker checker) + throws ScribException + { + super.enterUnguardedChoiceDoProjectionCheck(parent, child, checker); + LRecv lr = (LRecv) child; + UnguardedChoiceDoEnv env = checker.popEnv(); + env = env.setChoiceSubject(lr.getSourceChild().toName()); + checker.pushEnv(env); + } +} diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LReqDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LReqDel.java new file mode 100755 index 000000000..ca4d3c9e0 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/del/local/LReqDel.java @@ -0,0 +1,28 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.del.local; + +import org.scribble.ast.ScribNode; +import org.scribble.ast.local.LReq; +import org.scribble.visit.context.ProjectedChoiceSubjectFixer; + +public class LReqDel extends LConnectionActionDel +{ + @Override + public void enterProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer) + { + fixer.setChoiceSubject(((LReq) child).getSourceChild().toName()); + } +} diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java old mode 100644 new mode 100755 index b09d47c0d..0976a8633 --- a/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java @@ -13,7 +13,30 @@ */ package org.scribble.del.local; -public class LSendDel extends LMessageTransferDel +import org.scribble.ast.ScribNode; +import org.scribble.ast.local.LMsgTransfer; +import org.scribble.ast.local.LSend; +import org.scribble.util.ScribException; +import org.scribble.visit.context.ProjectedChoiceSubjectFixer; +import org.scribble.visit.wf.ExplicitCorrelationChecker; + +public class LSendDel extends LMsgTransferDel { + // Could make a LMsgTransferDel to factor this out with LReceiveDel + @Override + public void enterProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer) + { + fixer.setChoiceSubject(((LSend) child).src.toName()); + } + @Override + public LMsgTransfer leaveExplicitCorrelationCheck(ScribNode parent, + ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) + throws ScribException + { + LMsgTransfer lmt = (LMsgTransfer) visited; + checker.pushEnv(checker.popEnv().disableAccept()); + return lmt; + } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java old mode 100644 new mode 100755 index eaaea2fa7..5038c1355 --- a/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java @@ -13,7 +13,18 @@ */ package org.scribble.del.local; -public class LWrapClientDel extends LConnectionActionDel +import org.scribble.ast.ScribNode; +import org.scribble.ast.local.LClientWrap; +import org.scribble.del.BasicInteractionDel; +import org.scribble.visit.context.ProjectedChoiceSubjectFixer; + +public class LWrapClientDel extends BasicInteractionDel // LWrapDel + implements LSimpleSessionNodeDel { - + @Override + public void enterProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer) + { + fixer.setChoiceSubject(((LClientWrap) child).getClientChild().toName()); + } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java old mode 100644 new mode 100755 index d8ab23a2c..f30d048f0 --- a/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java @@ -13,7 +13,35 @@ */ package org.scribble.del.local; -public class LWrapServerDel extends LConnectionActionDel +import org.scribble.ast.ScribNode; +import org.scribble.ast.local.LServerWrap; +import org.scribble.del.BasicInteractionDel; +import org.scribble.del.ConnectionActionDel; +import org.scribble.util.ScribException; +import org.scribble.visit.context.ProjectedChoiceSubjectFixer; +import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; +import org.scribble.visit.context.env.UnguardedChoiceDoEnv; + +public class LWrapServerDel extends BasicInteractionDel // LWrapDel + implements LSimpleSessionNodeDel { + @Override + public void enterProjectedChoiceSubjectFixing(ScribNode parent, + ScribNode child, ProjectedChoiceSubjectFixer fixer) + { + fixer.setChoiceSubject(((LServerWrap) child).getClientChild().toName()); + } + + @Override + public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, + ScribNode child, UnguardedChoiceDoProjectionChecker checker) + throws ScribException + { + super.enterUnguardedChoiceDoProjectionCheck(parent, child, checker); + LServerWrap la = (LServerWrap) child; + UnguardedChoiceDoEnv env = checker.popEnv(); + env = env.setChoiceSubject(la.getClientChild().toName()); + checker.pushEnv(env); + } } diff --git a/scribble-core/src/main/java/org/scribble/util/Constants.java b/scribble-core/src/main/java/org/scribble/util/Constants.java index a36275e3d..49ade36ac 100644 --- a/scribble-core/src/main/java/org/scribble/util/Constants.java +++ b/scribble-core/src/main/java/org/scribble/util/Constants.java @@ -53,4 +53,6 @@ public class Constants public static final String CATCHES_KW = "catches";*/ public static final String DO_KW = "do"; //public static final String SPAWN_KW = "spawn"; + + public static final String REQUEST_KW = "request"; } diff --git a/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java index e3e09b0db..13c943dc5 100644 --- a/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java @@ -49,6 +49,19 @@ import org.scribble.ast.global.GProtoHeader; import org.scribble.ast.global.GRecursion; import org.scribble.ast.global.GWrap; +import org.scribble.ast.local.LAcc; +import org.scribble.ast.local.LChoice; +import org.scribble.ast.local.LContinue; +import org.scribble.ast.local.LDo; +import org.scribble.ast.local.LInteractionSeq; +import org.scribble.ast.local.LProtoBlock; +import org.scribble.ast.local.LProtoDecl; +import org.scribble.ast.local.LProtoDef; +import org.scribble.ast.local.LProtoHeader; +import org.scribble.ast.local.LRecursion; +import org.scribble.ast.local.LRecv; +import org.scribble.ast.local.LReq; +import org.scribble.ast.local.LSend; import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.ast.name.qualified.LProtoNameNode; @@ -392,202 +405,100 @@ public void GRecursion(GRecursion n) { setDel(n, new GRecursionDel()); } -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - /*@Override - public DummyProjectionRoleNode DummyProjectionRoleNode() - { - DummyProjectionRoleNode dprn = new DummyProjectionRoleNode(); - dprn = (DummyProjectionRoleNode) dprn.del(createDefaultDelegate()); - return dprn; - }*/ - - /*@Override // Called from LProtocolDecl::clone, but currently never used -- local proto decls only projected, not parsed - public LProtocolDecl LProtocolDecl(CommonTree source, List mods, LProtocolHeader header, LProtocolDef def) - { - LProtocolDecl lpd = new LProtocolDecl(source, mods, header, def); - lpd = setDel(lpd, new LProtocolDeclDel()); - return lpd; - } @Override - public LProjectionDecl LProjectionDecl(CommonTree source, List mods, GProtocolName fullname, Role self, LProtocolHeader header, LProtocolDef def) // del extends that of LProtocolDecl + public void LProtoDecl(LProtoDecl n) { - LProjectionDecl lpd = new LProjectionDecl(source, mods, header, def); - lpd = ScribNodeBase.setDel(lpd, new LProjectionDeclDel(fullname, self)); - return lpd; + setDel(n, new LProtoDeclDel()); } @Override - public LProtocolHeader LProtocolHeader(CommonTree source, LProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) + public void LProtoHeader(LProtoHeader n) { - LProtocolHeader lph = new LProtocolHeader(source, name, roledecls, paramdecls); - lph = setDel(lph, createDefaultDelegate()); - return lph; + setDel(n, createDefaultDel()); } @Override - public SelfRoleDecl SelfRoleDecl(CommonTree source, RoleNode namenode) + public void LProtoDef(LProtoDef n) { - SelfRoleDecl rd = new SelfRoleDecl(source, namenode); - rd = setDel(rd, new RoleDeclDel()); - return rd; + setDel(n, new LProtoDefDel()); } @Override - public LProtocolDef LProtocolDef(CommonTree source, LProtocolBlock block) + public void LProtoBlock(LProtoBlock n) { - LProtocolDef lpd = new LProtocolDef(source, block); - lpd = setDel(lpd, new LProtocolDefDel()); - return lpd; + setDel(n, new LProtoBlockDel()); } @Override - public LProtocolBlock LProtocolBlock(CommonTree source, LInteractionSeq seq) + public void LInteractionSeq(LInteractionSeq n) { - LProtocolBlock lpb = new LProtocolBlock(source, seq); - lpb = setDel(lpb, new LProtocolBlockDel()); - return lpb; + setDel(n, new LInteractionSeqDel()); } - @Override - public LInteractionSeq LInteractionSeq(CommonTree source, List actions) + /*@Override + public void LDelegElem(LDelegElem n) { - LInteractionSeq lis = new LInteractionSeq(source, actions); - lis = setDel(lis, new LInteractionSeqDel()); - return lis; - } + setDel(n, new LDelegElemDel()); + }*/ @Override - public LSend LSend(CommonTree source, RoleNode src, MessageNode msg, List dests) + public void LAcc(LAcc n) { - LSend ls = new LSend(source, src, msg, dests); - ls = setDel(ls, new LSendDel()); - return ls; + setDel(n, new LAccDel()); } @Override - public LReceive LReceive(CommonTree source, RoleNode src, MessageNode msg, List dests) + public void LReq(LReq n) { - LReceive ls = new LReceive(source, src, msg, dests); - ls = setDel(ls, new LReceiveDel()); - return ls; - } - - @Override - public LRequest LRequest(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) - //public LConnect LConnect(RoleNode src, RoleNode dest) - { - LRequest lc = new LRequest(source, src, msg, dest); - //LConnect lc = new LConnect(src, dest); - lc = setDel(lc, new LRequestDel()); - return lc; + setDel(n, new LReqDel()); } @Override - public LAccept LAccept(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) - //public LAccept LAccept(RoleNode src, RoleNode dest) + public void LSend(LSend n) { - LAccept la = new LAccept(source, src, msg, dest); - //LAccept la = new LAccept(src, dest); - la = setDel(la, new LAcceptDel()); - return la; + setDel(n, new LSendDel()); } @Override - public LDisconnect LDisconnect(CommonTree source, RoleNode self, RoleNode peer) + public void LRecv(LRecv n) { - LDisconnect lc = new LDisconnect(source, UnitMessageSigNode(), self, peer); - lc = setDel(lc, new LDisconnectDel()); - return lc; + setDel(n, new LRecvDel()); } @Override - public LWrapClient LWrapClient(CommonTree source, RoleNode self, RoleNode peer) + public void LClientWrap(LClientWrapWrap n) { - LWrapClient lwc = new LWrapClient(source, UnitMessageSigNode(), self, peer); - lwc = setDel(lwc, new LWrapClientDel()); - return lwc; + setDel(n, new LClientWrapDel()); } @Override - public LWrapServer LWrapServer(CommonTree source, RoleNode self, RoleNode peer) + public void LServerWrap(LServerWrapWrap n) { - LWrapServer lws = new LWrapServer(source, UnitMessageSigNode(), self, peer); - lws = setDel(lws, new LWrapServerDel()); - return lws; + setDel(n, new LServerWrapDel()); } @Override - public LChoice LChoice(CommonTree source, RoleNode subj, List blocks) + public void LContinue(LContinue n) { - LChoice lc = new LChoice(source, subj, blocks); - lc = setDel(lc, new LChoiceDel()); - return lc; + setDel(n, new LContinueDel()); } @Override - public LRecursion LRecursion(CommonTree source, RecVarNode recvar, LProtocolBlock block) + public void LDo(LDo n) { - LRecursion lr = new LRecursion(source, recvar, block); - lr = setDel(lr, new LRecursionDel()); - return lr; + setDel(n, new LDoDel()); } @Override - public LContinue LContinue(CommonTree source, RecVarNode recvar) + public void LChoice(LChoice n) { - LContinue lc = new LContinue(source, recvar); - lc = setDel(lc, new LContinueDel()); - return lc; + setDel(n, new LChoiceDel()); } @Override - public LDo LDo(CommonTree source, RoleArgList roleinstans, NonRoleArgList arginstans, LProtocolNameNode proto) + public void LRecursion(LRecursion n) { - LDo ld = new LDo(source, roleinstans, arginstans, proto); - ld = setDel(ld, new LDoDel()); - return ld; - }*/ + setDel(n, new LRecursionDel()); + } +} From fcec8dd8a3e734f474052e0cebce3dc5723e340f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 2 May 2019 12:30:40 +0100 Subject: [PATCH 427/539] [WIP] Minor. --- .../java/org/scribble/del/DelFactory.java | 6 +- ...WrapClientDel.java => LClientWrapDel.java} | 2 +- ...WrapServerDel.java => LServerWrapDel.java} | 2 +- .../java/org/scribble/del/DelFactoryImpl.java | 56 +++++++++++++------ .../org/scribble/parser/ScribTreeAdaptor.java | 2 +- 5 files changed, 46 insertions(+), 22 deletions(-) rename scribble-ast/src/main/java/org/scribble/del/local/{LWrapClientDel.java => LClientWrapDel.java} (94%) rename scribble-ast/src/main/java/org/scribble/del/local/{LWrapServerDel.java => LServerWrapDel.java} (96%) diff --git a/scribble-ast/src/main/java/org/scribble/del/DelFactory.java b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java index 649c2fb5d..23c8ac915 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DelFactory.java +++ b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java @@ -133,9 +133,9 @@ public interface DelFactory void UnaryPayElem(UnaryPayElem n); void GDelegPayElem(GDelegPayElem n); + void GMsgTransfer(GMsgTransfer n); void GConnect(GConnect n); void GDisconnect(GDisconnect n); - void GMsgTransfer(GMsgTransfer n); void GWrap(GWrap n); void GContinue(GContinue n); @@ -161,11 +161,11 @@ public interface DelFactory //void LDelegElem(LDelegElem n); + void LSend(LSend n); + void LRecv(LRecv n); void LAcc(LAcc n); void LReq(LReq n); void LDisconnect(LDisconnect n); - void LSend(LSend n); - void LRecv(LRecv n); void LClientWrap(LClientWrap n); void LServerWrap(LServerWrap n); diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LClientWrapDel.java similarity index 94% rename from scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LClientWrapDel.java index 5038c1355..f91724a34 100755 --- a/scribble-ast/src/main/java/org/scribble/del/local/LWrapClientDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LClientWrapDel.java @@ -18,7 +18,7 @@ import org.scribble.del.BasicInteractionDel; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -public class LWrapClientDel extends BasicInteractionDel // LWrapDel +public class LClientWrapDel extends BasicInteractionDel // LWrapDel implements LSimpleSessionNodeDel { @Override diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LServerWrapDel.java similarity index 96% rename from scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java rename to scribble-ast/src/main/java/org/scribble/del/local/LServerWrapDel.java index f30d048f0..df5273e4a 100755 --- a/scribble-ast/src/main/java/org/scribble/del/local/LWrapServerDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LServerWrapDel.java @@ -22,7 +22,7 @@ import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; import org.scribble.visit.context.env.UnguardedChoiceDoEnv; -public class LWrapServerDel extends BasicInteractionDel // LWrapDel +public class LServerWrapDel extends BasicInteractionDel // LWrapDel implements LSimpleSessionNodeDel { diff --git a/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java index 13c943dc5..2911dcc04 100644 --- a/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java @@ -51,7 +51,9 @@ import org.scribble.ast.global.GWrap; import org.scribble.ast.local.LAcc; import org.scribble.ast.local.LChoice; +import org.scribble.ast.local.LClientWrap; import org.scribble.ast.local.LContinue; +import org.scribble.ast.local.LDisconnect; import org.scribble.ast.local.LDo; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProtoBlock; @@ -62,6 +64,7 @@ import org.scribble.ast.local.LRecv; import org.scribble.ast.local.LReq; import org.scribble.ast.local.LSend; +import org.scribble.ast.local.LServerWrap; import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.ast.name.qualified.LProtoNameNode; @@ -88,6 +91,21 @@ import org.scribble.del.global.GProtoDefDel; import org.scribble.del.global.GRecursionDel; import org.scribble.del.global.GWrapDel; +import org.scribble.del.local.LAccDel; +import org.scribble.del.local.LChoiceDel; +import org.scribble.del.local.LClientWrapDel; +import org.scribble.del.local.LContinueDel; +import org.scribble.del.local.LDisconnectDel; +import org.scribble.del.local.LDoDel; +import org.scribble.del.local.LInteractionSeqDel; +import org.scribble.del.local.LProtoBlockDel; +import org.scribble.del.local.LProtoDeclDel; +import org.scribble.del.local.LProtoDefDel; +import org.scribble.del.local.LRecursionDel; +import org.scribble.del.local.LRecvDel; +import org.scribble.del.local.LReqDel; +import org.scribble.del.local.LSendDel; +import org.scribble.del.local.LServerWrapDel; import org.scribble.del.name.qualified.DataNameNodeDel; import org.scribble.del.name.qualified.SigNameNodeDel; import org.scribble.del.name.simple.AmbigNameNodeDel; @@ -335,21 +353,21 @@ public LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode prot }*/ @Override - public void GConnect(GConnect n) + public void GMsgTransfer(GMsgTransfer n) { - setDel(n, new GConnectDel()); + setDel(n, new GMessageTransferDel()); } @Override - public void GDisconnect(GDisconnect n) + public void GConnect(GConnect n) { - setDel(n, new GDisconnectDel()); + setDel(n, new GConnectDel()); } @Override - public void GMsgTransfer(GMsgTransfer n) + public void GDisconnect(GDisconnect n) { - setDel(n, new GMessageTransferDel()); + setDel(n, new GDisconnectDel()); } @Override @@ -443,37 +461,43 @@ public void LDelegElem(LDelegElem n) }*/ @Override - public void LAcc(LAcc n) + public void LSend(LSend n) { - setDel(n, new LAccDel()); + setDel(n, new LSendDel()); } @Override - public void LReq(LReq n) + public void LRecv(LRecv n) { - setDel(n, new LReqDel()); + setDel(n, new LRecvDel()); } @Override - public void LSend(LSend n) + public void LAcc(LAcc n) { - setDel(n, new LSendDel()); + setDel(n, new LAccDel()); } @Override - public void LRecv(LRecv n) + public void LReq(LReq n) { - setDel(n, new LRecvDel()); + setDel(n, new LReqDel()); + } + + @Override + public void LDisconnect(LDisconnect n) + { + setDel(n, new LDisconnectDel()); } @Override - public void LClientWrap(LClientWrapWrap n) + public void LClientWrap(LClientWrap n) { setDel(n, new LClientWrapDel()); } @Override - public void LServerWrap(LServerWrapWrap n) + public void LServerWrap(LServerWrap n) { setDel(n, new LServerWrapDel()); } diff --git a/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java index c0739a646..3f1af637a 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java @@ -130,9 +130,9 @@ public ScribNode create(Token t) case ScribbleParser.PAYELEM_LIST: n = new PayElemList(t); break; case ScribbleParser.UNARY_PAYELEM: n = new UnaryPayElem<>(t); break; + case ScribbleParser.GMSGTRANSFER: n = new GMsgTransfer(t); break; case ScribbleParser.GCONNECT: n = new GConnect(t); break; case ScribbleParser.GDCONN: n = new GDisconnect(t); break; - case ScribbleParser.GMSGTRANSFER: n = new GMsgTransfer(t); break; case ScribbleParser.GWRAP: n = new GWrap(t); break; case ScribbleParser.GCONTINUE: n = new GContinue(t); break; From 9fc4b1350ddda3a9b1504132621172c2efaa2e1a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 3 May 2019 01:52:37 +0100 Subject: [PATCH 428/539] [WIP] Adding LProjectionTranslator. --- .../java/org/scribble/ast/AstFactory.java | 48 ++++ .../main/java/org/scribble/ast/ScribNode.java | 6 + .../org/scribble/del/global/GChoiceDel.java | 3 +- .../org/scribble/del/global/GConnectDel.java | 2 +- .../org/scribble/del/global/GContinueDel.java | 3 +- .../java/org/scribble/del/global/GDel.java | 3 +- .../scribble/del/global/GDisconnectDel.java | 2 +- .../java/org/scribble/del/global/GDoDel.java | 8 +- .../del/global/GInteractionSeqDel.java | 2 - .../del/global/GMessageTransferDel.java | 2 +- .../scribble/del/global/GProtoBlockDel.java | 2 - .../scribble/del/global/GProtoDeclDel.java | 4 +- .../scribble/del/global/GRecursionDel.java | 3 +- .../org/scribble/del/global/GWrapDel.java | 2 +- .../java/org/scribble/del/local/LAccDel.java | 11 +- .../org/scribble/del/local/LChoiceDel.java | 21 +- .../scribble/del/local/LClientWrapDel.java | 7 +- .../org/scribble/del/local/LContinueDel.java | 75 +------ .../scribble/del/local/LDisconnectDel.java | 13 +- .../java/org/scribble/del/local/LDoDel.java | 26 +-- .../del/local/LInteractionSeqDel.java | 12 +- .../del/local/LProjectionDeclDel.java | 71 ++---- .../org/scribble/del/local/LRecursionDel.java | 11 +- .../java/org/scribble/del/local/LRecvDel.java | 11 +- .../java/org/scribble/del/local/LReqDel.java | 8 +- .../java/org/scribble/del/local/LSendDel.java | 11 +- .../scribble/del/local/LServerWrapDel.java | 11 +- .../src/main/java/org/scribble/job/Job.java | 4 +- .../scribble/util/LProjectionTranslator.java | 207 ++++++++++++++++++ .../org/scribble/visit/GTypeTranslator.java | 5 +- .../visit/SimpleAstVisitorNoThrows.java | 29 +++ .../org/scribble/codegen/java/ApiGen.java | 10 +- .../callbackapi/CBEndpointApiGenerator.java | 9 +- .../callbackapi/CBEndpointApiGenerator3.java | 9 +- .../scribble/util/AntlrSourceException.java | 9 +- .../scribble/util/RuntimeScribException.java | 10 + .../org/scribble/util/ScribException.java | 8 +- .../java/org/scribble/ast/AstFactoryImpl.java | 121 +++++++++- 38 files changed, 497 insertions(+), 302 deletions(-) create mode 100644 scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java create mode 100644 scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitorNoThrows.java diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 4c4cc14a8..bbfd2be9c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -31,9 +31,27 @@ import org.scribble.ast.global.GRecursion; import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GWrap; +import org.scribble.ast.local.LAcc; +import org.scribble.ast.local.LChoice; +import org.scribble.ast.local.LClientWrap; +import org.scribble.ast.local.LContinue; +import org.scribble.ast.local.LDisconnect; +import org.scribble.ast.local.LDo; +import org.scribble.ast.local.LInteractionSeq; +import org.scribble.ast.local.LProjectionDecl; +import org.scribble.ast.local.LProtoBlock; +import org.scribble.ast.local.LProtoDef; +import org.scribble.ast.local.LProtoHeader; +import org.scribble.ast.local.LRecursion; +import org.scribble.ast.local.LRecv; +import org.scribble.ast.local.LReq; +import org.scribble.ast.local.LSend; +import org.scribble.ast.local.LServerWrap; +import org.scribble.ast.local.LSessionNode; import org.scribble.ast.name.PayElemNameNode; import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.qualified.GProtoNameNode; +import org.scribble.ast.name.qualified.LProtoNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.simple.AmbigNameNode; @@ -120,6 +138,36 @@ GDo GDo(Token t, RoleArgList rs, NonRoleArgList args, GChoice GChoice(Token t, RoleNode subj, List blocks); GRecursion GRecursion(Token t, RecVarNode rv, GProtoBlock block); + + /*LProtoDecl LProtoDecl(Token t, List mods, + LProtoHeader header, LProtoDef def); // Not currently used -- local protos not parsed, only projected*/ + + LProjectionDecl LProjectionDecl(Token t, List mods, + GProtoNameNode fullname, RoleNode self, LProtoHeader header, + LProtoDef def); + // del extends that of LProtoDecl + + LProtoHeader LProtoHeader(Token t, LProtoNameNode name, RoleDeclList rs, + NonRoleParamDeclList ps); + + LProtoDef LProtoDef(Token t, LProtoBlock block); + LProtoBlock LProtoBlock(Token t, LInteractionSeq seq); + LInteractionSeq LInteractionSeq(Token t, List elems); + + LSend LSend(Token t, RoleNode src, MsgNode msg, RoleNode dst); + LRecv LRecv(Token t, RoleNode src, MsgNode msg, RoleNode dst); + LAcc LAcc(Token t, RoleNode src, MsgNode msg, RoleNode dst); + LReq LReq(Token t, RoleNode src, MsgNode msg, RoleNode dst); + LDisconnect LDisconnect(Token t, RoleNode self, RoleNode peer); + LClientWrap LClientWrap(Token t, RoleNode self, RoleNode peer); + LServerWrap LServerWrap(Token t, RoleNode self, RoleNode peer); + + LContinue LContinue(Token t, RecVarNode recvar); + LDo LDo(Token t, RoleArgList roles, NonRoleArgList args, + LProtoNameNode proto); + + LChoice LChoice(Token t, RoleNode subj, List blocks); + LRecursion LRecursion(Token t, RecVarNode recvar, LProtoBlock block); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java index 4be8cac73..dc8d56e3c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java @@ -21,6 +21,7 @@ import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; import org.scribble.visit.SimpleAstVisitor; +import org.scribble.visit.SimpleAstVisitorNoThrows; /** * This is the generic object from which all Scribble AST objects @@ -49,4 +50,9 @@ default T visitWith(SimpleAstVisitor v) throws ScribException // "Top-le { return v.visit(this); // N.B. ScribNode has getParent } + + default T visitWith(SimpleAstVisitorNoThrows v) // "Top-level" visitor entry method + { + return v.visit(this); // N.B. ScribNode has getParent + } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java index 428441a16..f8376b491 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -22,7 +22,6 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.global.GSeq; import org.scribble.del.ChoiceDel; -import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; public class GChoiceDel extends ChoiceDel implements GCompoundSessionNodeDel @@ -30,7 +29,7 @@ public class GChoiceDel extends ChoiceDel implements GCompoundSessionNodeDel @Override public org.scribble.core.type.session.global.GChoice translate(ScribNode n, - GTypeTranslator t) throws ScribException + GTypeTranslator t) { GChoice source = (GChoice) n; Role subj = source.getSubjectChild().toName(); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java index 182b201f6..ddf77d05c 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GConnectDel.java @@ -43,7 +43,7 @@ public ScribNode leaveDisambiguation(ScribNode child, @Override public org.scribble.core.type.session.global.GConnect translate(ScribNode n, - GTypeTranslator t) throws ScribException + GTypeTranslator t) { GConnect source = (GConnect) n; Role src = source.getSourceChild().toName(); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java index 09fbe6ad7..1f37b1fca 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GContinueDel.java @@ -17,7 +17,6 @@ import org.scribble.ast.global.GContinue; import org.scribble.core.type.name.RecVar; import org.scribble.del.ContinueDel; -import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; public class GContinueDel extends ContinueDel @@ -26,7 +25,7 @@ public class GContinueDel extends ContinueDel @Override public org.scribble.core.type.session.global.GContinue translate(ScribNode n, - GTypeTranslator t) throws ScribException + GTypeTranslator t) { GContinue source = (GContinue) n; RecVar recvar = source.getRecVarChild().toName(); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDel.java index 05672ff5d..8da532de3 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDel.java @@ -16,10 +16,9 @@ import org.scribble.ast.ScribNode; import org.scribble.core.lang.global.GNode; import org.scribble.del.ScribDel; -import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; public interface GDel extends ScribDel { - GNode translate(ScribNode n, GTypeTranslator t) throws ScribException; + GNode translate(ScribNode n, GTypeTranslator t); } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java index 3674f7cab..ed3ad5a36 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDisconnectDel.java @@ -40,7 +40,7 @@ public ScribNode leaveDisambiguation(ScribNode child, @Override public org.scribble.core.type.session.global.GDisconnect translate(ScribNode n, - GTypeTranslator t) throws ScribException + GTypeTranslator t) { GDisconnect source = (GDisconnect) n; Role left = source.getLeftChild().toName(); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java index c4df71df8..804d8185c 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDoDel.java @@ -23,23 +23,23 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Arg; import org.scribble.del.DoDel; -import org.scribble.util.ScribException; +import org.scribble.util.RuntimeScribException; import org.scribble.visit.GTypeTranslator; public class GDoDel extends DoDel implements GSimpleSessionNodeDel { @Override public org.scribble.core.type.session.global.GDo translate(ScribNode n, - GTypeTranslator t) throws ScribException + GTypeTranslator t) { GDo source = (GDo) n; // Resolve full name -- CHECKME: factor out? cf., NameDisambiguator, DoDel::enter/leaveDisambiguation GProtoName proto = source.getProtocolNameNode().toName(); ModuleContext modc = t.getModuleContext(); - if (!modc.isVisibleProtocolDeclName(proto)) + if (!modc.isVisibleProtocolDeclName(proto)) // CHECKME: should be already checked by NameDisamb? { - throw new ScribException(source, + throw new RuntimeScribException(source, "Protocol decl not visible: " + proto); } GProtoName fullname = (GProtoName) modc // FIXME: sort out full name expansion between here and DoDel.leaveDisambiguation diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java index f039395f9..d8357b925 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GInteractionSeqDel.java @@ -22,7 +22,6 @@ import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.global.GType; import org.scribble.del.InteractionSeqDel; -import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; public class GInteractionSeqDel extends InteractionSeqDel implements GDel @@ -30,7 +29,6 @@ public class GInteractionSeqDel extends InteractionSeqDel implements GDel @Override public GSeq translate(ScribNode n, GTypeTranslator t) - throws ScribException { GInteractionSeq source = (GInteractionSeq) n; List elems = new LinkedList<>(); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java index e7d87a6f0..4027352e7 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -51,7 +51,7 @@ public ScribNode leaveDisambiguation(ScribNode child, @Override public org.scribble.core.type.session.global.GMessageTransfer translate(ScribNode n, - GTypeTranslator t) throws ScribException + GTypeTranslator t) { GMsgTransfer source = (GMsgTransfer) n; Role src = source.getSourceChild().toName(); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtoBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtoBlockDel.java index ce5bb712f..2e1e63635 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtoBlockDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtoBlockDel.java @@ -17,14 +17,12 @@ import org.scribble.ast.global.GProtoBlock; import org.scribble.core.type.session.global.GSeq; import org.scribble.del.ProtoBlockDel; -import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; public class GProtoBlockDel extends ProtoBlockDel implements GDel { @Override public GSeq translate(ScribNode n, GTypeTranslator t) - throws ScribException { return (GSeq) ((GProtoBlock) n).getInteractSeqChild().visitWith(t); } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java index a378a16e6..49a2fb4cf 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java @@ -28,7 +28,6 @@ import org.scribble.core.type.name.Role; import org.scribble.core.type.session.global.GSeq; import org.scribble.del.ProtoDeclDel; -import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; public class GProtoDeclDel extends ProtoDeclDel implements GDel @@ -39,8 +38,7 @@ public GProtoDeclDel() } @Override - public GProtocol translate(ScribNode n, GTypeTranslator t) - throws ScribException + public GProtocol translate(ScribNode n, GTypeTranslator t) { GProtoDecl source = (GProtoDecl) n; Module m = (Module) n.getParent(); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java index 8eb4c008f..caf874371 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GRecursionDel.java @@ -18,7 +18,6 @@ import org.scribble.core.type.name.RecVar; import org.scribble.core.type.session.global.GSeq; import org.scribble.del.RecursionDel; -import org.scribble.util.ScribException; import org.scribble.visit.GTypeTranslator; public class GRecursionDel extends RecursionDel @@ -27,7 +26,7 @@ public class GRecursionDel extends RecursionDel @Override public org.scribble.core.type.session.global.GRecursion translate(ScribNode n, - GTypeTranslator t) throws ScribException + GTypeTranslator t) { GRecursion source = (GRecursion) n; RecVar recvar = source.getRecVarChild().toName(); diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java index d3d511d7e..59b541314 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GWrapDel.java @@ -39,7 +39,7 @@ public ScribNode leaveDisambiguation(ScribNode child, } @Override - public GNode translate(ScribNode n, GTypeTranslator t) throws ScribException + public GNode translate(ScribNode n, GTypeTranslator t) { throw new RuntimeException("[TODO] :" + n); } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LAccDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LAccDel.java index 6aaef61c4..898ec5f11 100755 --- a/scribble-ast/src/main/java/org/scribble/del/local/LAccDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LAccDel.java @@ -13,16 +13,9 @@ */ package org.scribble.del.local; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LAcc; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; -import org.scribble.visit.context.env.UnguardedChoiceDoEnv; - public class LAccDel extends LConnectionActionDel { - @Override + /*@Override public void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) { @@ -39,5 +32,5 @@ public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, UnguardedChoiceDoEnv env = checker.popEnv(); env = env.setChoiceSubject(la.getSourceChild().toName()); checker.pushEnv(env); - } + }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java index 72ad20c33..e9649fd4b 100755 --- a/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java @@ -13,28 +13,11 @@ */ package org.scribble.del.local; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import org.scribble.ast.Choice; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LChoice; -import org.scribble.ast.local.LProtocolBlock; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.kind.RoleKind; -import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; import org.scribble.del.ChoiceDel; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceDoPruner; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; -import org.scribble.visit.context.env.UnguardedChoiceDoEnv; public class LChoiceDel extends ChoiceDel implements LCompoundSessionNodeDel { - @Override + /*@Override public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribException @@ -106,5 +89,5 @@ public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, fixer.setChoiceSubject(subj.toName()); LChoice projection = fixer.job.af.LChoice(lc.getSource(), subj, blocks); return projection; - } + }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LClientWrapDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LClientWrapDel.java index f91724a34..2caa1fa05 100755 --- a/scribble-ast/src/main/java/org/scribble/del/local/LClientWrapDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LClientWrapDel.java @@ -13,18 +13,15 @@ */ package org.scribble.del.local; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LClientWrap; import org.scribble.del.BasicInteractionDel; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; public class LClientWrapDel extends BasicInteractionDel // LWrapDel implements LSimpleSessionNodeDel { - @Override + /*@Override public void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) { fixer.setChoiceSubject(((LClientWrap) child).getClientChild().toName()); - } + }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java index 9fc081899..b278e2893 100755 --- a/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java @@ -13,82 +13,9 @@ */ package org.scribble.del.local; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LContinue; -import org.scribble.ast.name.simple.RecVarNode; import org.scribble.del.ContinueDel; -import org.scribble.main.ScribbleException; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.RecVar; -import org.scribble.visit.ProtocolDefInliner; -import org.scribble.visit.context.EGraphBuilder; -import org.scribble.visit.env.InlineProtocolEnv; -import org.scribble.visit.wf.ReachabilityChecker; -import org.scribble.visit.wf.env.ReachabilityEnv; -public class LContinueDel extends ContinueDel implements LSimpleInteractionNodeDel +public class LContinueDel extends ContinueDel implements LSimpleSessionNodeDel { - @Override - public LContinue leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException - { - LContinue lc = (LContinue) visited; - RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) lc.recvar.del().env()).getTranslation(); - LContinue inlined = inl.job.af.LContinue(lc.getSource(), recvar); - inl.pushEnv(inl.popEnv().setTranslation(inlined)); - return (LContinue) super.leaveProtocolInlining(parent, child, inl, lc); - } - - @Override - public LContinue leaveReachabilityCheck(ScribNode parent, ScribNode child, ReachabilityChecker checker, ScribNode visited) throws ScribbleException - { - // "Entering" the continue here in leave, where we can merge the new state into the parent Env - // Generally: if side effecting Env state to be merged into the parent (not just popped and discarded), leave must be overridden to do so - LContinue lc = (LContinue) visited; - ReachabilityEnv env = checker.popEnv().addContinueLabel(lc.recvar.toName()); - setEnv(env); // Env recording probably not needed for all LocalInteractionNodes, just the compound ones, like for WF-choice checking - checker.pushEnv(checker.popEnv().mergeContext(env)); - return lc; - } - - @Override - public LContinue leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder graph, ScribNode visited) throws ScribbleException - { - LContinue lr = (LContinue) visited; - RecVar rv = lr.recvar.toName(); - if (graph.util.isUnguardedInChoice()) - { - graph.util.addContinueEdge(graph.util.getEntry(), rv); - } - else - { - // ** "Overwrites" previous edge built by send/receive(s) leading to this continue - Iterator preds = graph.util.getPredecessors().iterator(); - Iterator prevs = graph.util.getPreviousActions().iterator(); - EState entry = graph.util.getEntry(); - Set> removed = new HashSet<>(); - // HACK: for identical edges, i.e. same pred/prev/succ (e.g. rec X { choice at A { A->B:1 } or { A->B:1 } continue X; }) // FIXME: do here, or refactor into GraphBuilder? - // Because duplicate edges preemptively pruned by ModelState.addEdge, but corresponding predecessors not pruned // FIXME: make uniform - while (preds.hasNext()) - { - EState pred = preds.next(); - EAction prev = prevs.next(); - List tmp = Arrays.asList(pred, prev, entry); - if (!removed.contains(tmp)) - { - removed.add(tmp); - graph.util.removeEdgeFromPredecessor(pred, prev); // Assumes pred is a predecessor, and removes pred from current predecessors.. - } - graph.util.addRecursionEdge(pred, prev, graph.util.getRecursionEntry(rv)); // May be repeated for non-det, but OK // Combine with removeEdgeFromPredecessor? - } - } - return (LContinue) super.leaveEGraphBuilding(parent, child, graph, lr); - } } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java index e3563ff51..1f7236070 100755 --- a/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java @@ -13,17 +13,12 @@ */ package org.scribble.del.local; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LDisconnect; import org.scribble.del.ConnectionActionDel; -import org.scribble.main.ScribbleException; -import org.scribble.type.name.Role; -import org.scribble.visit.context.EGraphBuilder; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -public class LDisconnectDel extends ConnectionActionDel implements LSimpleInteractionNodeDel +public class LDisconnectDel extends ConnectionActionDel + implements LSimpleSessionNodeDel { - @Override + /*@Override public LDisconnect leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder builder, ScribNode visited) throws ScribbleException { LDisconnect ld = (LDisconnect) visited; @@ -36,5 +31,5 @@ public LDisconnect leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraph public void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) { fixer.setChoiceSubject(((LDisconnect) child).src.toName()); - } + }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java index a1e434376..124f30c30 100755 --- a/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java @@ -13,29 +13,11 @@ */ package org.scribble.del.local; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import org.scribble.ast.RoleArg; -import org.scribble.ast.RoleArgList; -import org.scribble.ast.ScribNode; -import org.scribble.ast.global.GProtoDecl; -import org.scribble.ast.local.LDo; -import org.scribble.ast.local.LProtoDecl; -import org.scribble.core.type.name.GProtoName; -import org.scribble.core.type.name.Role; import org.scribble.del.DoDel; -import org.scribble.job.JobContext; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedRoleDeclFixer; -import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; public class LDoDel extends DoDel implements LSimpleSessionNodeDel { - // Pre: this pass is only run on projections (LProjectionDeclDel has source global protocol info) + /*// Pre: this pass is only run on projections (LProjectionDeclDel has source global protocol info) @Override public ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, ScribNode child, ProjectedRoleDeclFixer fixer, ScribNode visited) @@ -64,7 +46,7 @@ public ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, @Override public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribException { - /*//if (checker.isCycle()) + /* //if (checker.isCycle()) if (checker.isRootedCycle()) // ChoiceUnguardedSubprotocolChecker is a (regular) SubprotocolVisitor which pushes a subprotosig on root decl entry (ProjectedSubprotocolPruner.visit) // Check for "rooted" cycle to ensure it's specifically the cycle from the root proto decl (back) to the target do // FIXME: but cycle to specific "target do" is not ensured: could be another instance of a do with the same subprotosig... an inherent issue of the current subprotocolvisitor framework @@ -82,7 +64,7 @@ public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNo checker.pushEnv(env.disablePrune());* / //checker.enablePrune(); } - }*/ + }* / return super.leaveUnguardedChoiceDoProjectionCheck(parent, child, checker, visited); @@ -99,5 +81,5 @@ public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNo // ... but look only on direct path or across all branches? //...or else it should be: start from the target protocoldecl and go through to the candidate do (cf grecursion.prune) - } + }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java index e7726e575..0a63dc5b3 100755 --- a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java @@ -13,19 +13,11 @@ */ package org.scribble.del.local; -import java.util.List; -import java.util.stream.Collectors; - -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LInteractionSeq; -import org.scribble.ast.local.LSessionNode; import org.scribble.del.InteractionSeqDel; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceDoPruner; public class LInteractionSeqDel extends InteractionSeqDel implements LDel { - @Override + /*@Override public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, ScribNode child, ProjectedChoiceDoPruner pruner, ScribNode visited) throws ScribException @@ -34,7 +26,7 @@ public ScribNode leaveProjectedChoiceDoPruning(ScribNode parent, List actions = lc.getInteractionChildren().stream() .filter(li -> li != null).collect(Collectors.toList()); return lc.reconstruct(actions); - } + }*/ /*// Duplicated from GInteractionSeq @Override diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java index 179d19d12..7e7aac52b 100755 --- a/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java @@ -13,64 +13,35 @@ */ package org.scribble.del.local; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import org.scribble.ast.RoleDecl; -import org.scribble.ast.RoleDeclList; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LProtocolDecl; -import org.scribble.ast.local.LProtocolHeader; -import org.scribble.main.ScribbleException; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; -import org.scribble.visit.context.ProjectedRoleDeclFixer; - public class LProjectionDeclDel extends LProtoDeclDel { - // Maybe better to store in context, but more convenient to pass to here via factory (than infer in context building) -- could alternatively store in projected module - protected final GProtocolName fullname; - protected final Role self; // Can be obtained from LProtocolHeader? - - public LProjectionDeclDel(GProtocolName fullname, Role self) + public LProjectionDeclDel() { - this.fullname = fullname; - this.self = self; - } - - @Override - protected LProtoDeclDel copy() - { - return new LProjectionDeclDel(this.fullname, this.self); + } - @Override - public ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, ScribNode child, ProjectedRoleDeclFixer fixer, ScribNode visited) throws ScribbleException + /*@Override + public ScribNode leaveProjectedRoleDeclFixing(ScribNode parent, + ScribNode child, ProjectedRoleDeclFixer fixer, ScribNode visited) + throws ScribException { - LProtocolDecl lpd = (LProtocolDecl) visited; + LProjectionDecl lpd = (LProjectionDecl) visited; + LProtoHeader hdrtmp = lpd.getHeaderChild(); // FIXME: ensure all role params are used, to avoid empty roledecllist - Set occs = ((LProtoDeclDel) lpd.del()).getProtocolDeclContext().getRoleOccurrences(); - List rds = lpd.header.roledecls.getDecls().stream().filter((rd) -> - occs.contains(rd.getDeclName())).collect(Collectors.toList()); - RoleDeclList rdl = fixer.job.af.RoleDeclList(lpd.header.roledecls.getSource(), rds); - LProtocolHeader tmp = lpd.getHeader(); - LProtocolHeader hdr = tmp.reconstruct(tmp.getNameNode(), rdl, tmp.paramdecls); - LProtocolDecl fixed = lpd.reconstruct(hdr, lpd.def); + Set occs = ((LProtoDeclDel) lpd.del()).getProtoDeclContext() + .getRoleOccurrences(); + List rds = hdrtmp.getRoleDeclListChild().getDeclChildren() + .stream().filter(rd -> occs.contains(rd.getDeclName())) + .collect(Collectors.toList()); + RoleDeclList rdl = fixer.job.af + .RoleDeclList(hdrtmp.getRoleDeclListChild().getSource(), rds); + LProtoHeader hdr = (LProtoHeader) hdrtmp.reconstruct(hdrtmp.getNameNodeChild(), + hdrtmp.getParamDeclListChild(), rdl); + LProjectionDecl fixed = (LProjectionDecl) lpd.reconstruct(lpd.getModifierListChild(), hdr, lpd.getDefChild()); - fixer.job.debugPrintln("\n[DEBUG] Projected " + getSourceProtocol() + " for " + getSelfRole() + ":\n" + fixed); + fixer.job.debugPrintln("\n[DEBUG] Projected " + lpd//.getParentChild() + + " for " + lpd.getSelfRole() + ":\n" + fixed); return super.leaveProjectedRoleDeclFixing(parent, child, fixer, fixed); - } - - public GProtocolName getSourceProtocol() - { - return this.fullname; - } - - // Redundant with SelfRoleDecl in header - public Role getSelfRole() - { - return this.self; - } + }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java index 9723a0b3a..0ca64ccd7 100755 --- a/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java @@ -13,19 +13,12 @@ */ package org.scribble.del.local; -import org.scribble.ast.Recursion; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LRecursion; import org.scribble.del.RecursionDel; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; -import org.scribble.visit.context.env.UnguardedChoiceDoEnv; public class LRecursionDel extends RecursionDel implements LCompoundSessionNodeDel { - @Override + /*@Override public ScribNode leaveUnguardedChoiceDoProjectionCheck(ScribNode parent, ScribNode child, UnguardedChoiceDoProjectionChecker checker, ScribNode visited) throws ScribException @@ -51,5 +44,5 @@ public ScribNode leaveProjectedChoiceSubjectFixing(ScribNode parent, { fixer.popRec(((LRecursion) child).getRecVarChild().toName()); return visited; - } + }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LRecvDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LRecvDel.java index 8fef8918e..cd6b6786d 100755 --- a/scribble-ast/src/main/java/org/scribble/del/local/LRecvDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LRecvDel.java @@ -13,16 +13,9 @@ */ package org.scribble.del.local; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LRecv; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; -import org.scribble.visit.context.env.UnguardedChoiceDoEnv; - public class LRecvDel extends LMsgTransferDel { - @Override + /*@Override public void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) { @@ -39,5 +32,5 @@ public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, UnguardedChoiceDoEnv env = checker.popEnv(); env = env.setChoiceSubject(lr.getSourceChild().toName()); checker.pushEnv(env); - } + }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LReqDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LReqDel.java index ca4d3c9e0..6980bf896 100755 --- a/scribble-ast/src/main/java/org/scribble/del/local/LReqDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LReqDel.java @@ -13,16 +13,12 @@ */ package org.scribble.del.local; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LReq; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; - public class LReqDel extends LConnectionActionDel { - @Override + /*@Override public void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) { fixer.setChoiceSubject(((LReq) child).getSourceChild().toName()); - } + }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java index 0976a8633..072411970 100755 --- a/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java @@ -13,16 +13,9 @@ */ package org.scribble.del.local; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LMsgTransfer; -import org.scribble.ast.local.LSend; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -import org.scribble.visit.wf.ExplicitCorrelationChecker; - public class LSendDel extends LMsgTransferDel { - // Could make a LMsgTransferDel to factor this out with LReceiveDel + /*// Could make a LMsgTransferDel to factor this out with LReceiveDel @Override public void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) @@ -38,5 +31,5 @@ public LMsgTransfer leaveExplicitCorrelationCheck(ScribNode parent, LMsgTransfer lmt = (LMsgTransfer) visited; checker.pushEnv(checker.popEnv().disableAccept()); return lmt; - } + }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LServerWrapDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LServerWrapDel.java index df5273e4a..51cd0ca95 100755 --- a/scribble-ast/src/main/java/org/scribble/del/local/LServerWrapDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/local/LServerWrapDel.java @@ -13,20 +13,13 @@ */ package org.scribble.del.local; -import org.scribble.ast.ScribNode; -import org.scribble.ast.local.LServerWrap; import org.scribble.del.BasicInteractionDel; -import org.scribble.del.ConnectionActionDel; -import org.scribble.util.ScribException; -import org.scribble.visit.context.ProjectedChoiceSubjectFixer; -import org.scribble.visit.context.UnguardedChoiceDoProjectionChecker; -import org.scribble.visit.context.env.UnguardedChoiceDoEnv; public class LServerWrapDel extends BasicInteractionDel // LWrapDel implements LSimpleSessionNodeDel { - @Override + /*@Override public void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) { @@ -43,5 +36,5 @@ public void enterUnguardedChoiceDoProjectionCheck(ScribNode parent, UnguardedChoiceDoEnv env = checker.popEnv(); env = env.setChoiceSubject(la.getClientChild().toName()); checker.pushEnv(env); - } + }*/ } diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index cf41556d2..696fcdc28 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -30,9 +30,9 @@ import org.scribble.del.DelFactory; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; +import org.scribble.visit.GTypeTranslator; import org.scribble.visit.VisitorFactory; import org.scribble.visit.VisitorFactoryImpl; -import org.scribble.visit.GTypeTranslator; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models public class Job @@ -85,7 +85,7 @@ protected JobContext newJobContext(Job job, // So, typically, Job passes should be finished before calling this // Core passes may subsequently mutate Core(Context) though // CHECKME: revise this pattern? -- maybe fork Core for a snapshot of current Job(Context) -- and, possibly, convert Core back to Job - public final Core getCore() throws ScribException + public final Core getCore() { if (this.core == null) { diff --git a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java new file mode 100644 index 000000000..ecc44dd50 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java @@ -0,0 +1,207 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.util; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.scribble.ast.AstFactory; +import org.scribble.ast.MsgNode; +import org.scribble.ast.NonRoleParamDeclList; +import org.scribble.ast.RoleDeclList; +import org.scribble.ast.local.LProjectionDecl; +import org.scribble.ast.local.LProtoBlock; +import org.scribble.ast.local.LProtoDef; +import org.scribble.ast.local.LProtoHeader; +import org.scribble.ast.local.LSessionNode; +import org.scribble.ast.name.simple.IdNode; +import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.job.Core; +import org.scribble.core.job.CoreContext; +import org.scribble.core.lang.local.LProjection; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.SigName; +import org.scribble.core.type.session.Msg; +import org.scribble.core.type.session.SigLit; +import org.scribble.core.type.session.local.LAcc; +import org.scribble.core.type.session.local.LChoice; +import org.scribble.core.type.session.local.LContinue; +import org.scribble.core.type.session.local.LDisconnect; +import org.scribble.core.type.session.local.LDo; +import org.scribble.core.type.session.local.LRecursion; +import org.scribble.core.type.session.local.LRecv; +import org.scribble.core.type.session.local.LReq; +import org.scribble.core.type.session.local.LSend; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.type.session.local.LType; +import org.scribble.job.Job; + +// CHECKME: move to visit package? +public class LProjectionTranslator +{ + public final Job job; + protected final AstFactory af; + + public LProjectionTranslator(Job job) + { + this.job = job; + this.af = job.config.af; + } + + public LProjectionDecl translate(GProtoName fullname, Role self) + { + Core core = this.job.getCore(); + CoreContext jobc = core.getContext(); + LProjection ltype = jobc.getProjection(fullname, self); + RoleDeclList rs = this.af.RoleDeclList(null, + ltype.roles.stream().map( + x -> this.af.RoleDecl(null, this.af.RoleNode(null, x.toString()))) + .collect(Collectors.toList())); + NonRoleParamDeclList ps = this.af.NonRoleParamDeclList(null, + ltype.roles.stream().map(x -> null) + .collect(Collectors.toList())); + List elems = Arrays.asList(fullname.getElements()).stream() + .map(x -> this.af.IdNode(null, x)).collect(Collectors.toList()); + LProtoHeader hdr = this.af.LProtoHeader(null, + this.af.LProtoNameNode(null, elems), rs, ps); + LProtoDef def = this.af.LProtoDef(null, translate(ltype.def)); + return this.af.LProjectionDecl(null, ltype.mods, fullname, self, header, def); + } + + protected MsgNode translate(Msg msg) + { + if (msg.isSigLit()) + { + SigLit cast = (SigLit) msg; + return this.af.SigLitNode(null, this.af.OpNode(null, cast.op.toString()), + cast.payload); + } + else + { + SigName cast = (SigName) msg; + List elems = Arrays.asList(cast.getElements()).stream() + .map(x -> this.af.IdNode(null, x)).collect(Collectors.toList()); + return this.af.SigNameNode(null, elems); + } + } + + protected org.scribble.ast.local.LAcc translate(LAcc t) + { + RoleNode src = this.af.RoleNode(null, t.src.toString()); + RoleNode dst = this.af.RoleNode(null, t.dst.toString()); + MsgNode msg = translate(t.msg); + return this.af.LAcc(null, src, msg, dst); + } + + protected org.scribble.ast.local.LReq translate(LReq t) + { + RoleNode src = this.af.RoleNode(null, t.src.toString()); + RoleNode dst = this.af.RoleNode(null, t.dst.toString()); + MsgNode msg = translate(t.msg); + return this.af.LReq(null, src, msg, dst); + } + + protected org.scribble.ast.local.LSend translate(LSend t) + { + RoleNode src = this.af.RoleNode(null, t.src.toString()); + RoleNode dst = this.af.RoleNode(null, t.dst.toString()); + MsgNode msg = translate(t.msg); + return this.af.LSend(null, src, msg, dst); + } + + protected org.scribble.ast.local.LRecv translate(LRecv t) + { + RoleNode src = this.af.RoleNode(null, t.src.toString()); + RoleNode dst = this.af.RoleNode(null, t.dst.toString()); + MsgNode msg = translate(t.msg); + return this.af.LRecv(null, src, msg, dst); + } + + protected org.scribble.ast.local.LDisconnect translate(LDisconnect t) + { + RoleNode self = this.af.RoleNode(null, t.left.toString()); + RoleNode peer = this.af.RoleNode(null, t.right.toString()); + return this.af.LDisconnect(null, self, peer); + } + + protected org.scribble.ast.local.LChoice translate(LChoice t) + { + RoleNode subj = this.af.RoleNode(null, t.subj.toString()); // CHECKME: subj's already always fixed? + List blocks = t.blocks.stream().map(x -> translate(x)) + .collect(Collectors.toList()); + return this.af.LChoice(null, subj, blocks); + } + + protected org.scribble.ast.local.LRecursion translate(LRecursion t) + { + RecVarNode rv = this.af.RecVarNode(null, t.recvar.toString()); + return this.af.LRecursion(null, rv, translate(t.body)); + } + + protected org.scribble.ast.local.LProtoBlock translate(LSeq t) + { + List elems = t.getElements().stream().map(x -> translate(x)) + .collect(Collectors.toList()); + return this.af.LProtoBlock(null, this.af.LInteractionSeq(null, elems)); + } + + // Cannot refactor into LType hierarchy, due to Maven module dependencies (scribble-core cannot see outside) + // Only LSeq not done, return is not an LSessionNode + protected LSessionNode translate(LType t) + { + if (t instanceof LAcc) + { + return translate((LAcc) t); + } + else if (t instanceof LChoice) + { + return translate((LChoice) t); + } + else if (t instanceof LContinue) + { + return translate((LContinue) t); + } + else if (t instanceof LDisconnect) + { + return translate((LDisconnect) t); + } + else if (t instanceof LDo) + { + return translate((LDo) t); + } + else if (t instanceof LRecursion) + { + return translate((LRecursion) t); + } + else if (t instanceof LRecv) + { + return translate((LRecv) t); + } + else if (t instanceof LReq) + { + return translate((LReq) t); + } + else if (t instanceof LSend) + { + return translate((LSend) t); + } + else + { + throw new RuntimeException("[TODO] Unknown LType: " + t.getClass() + "\n" + t); + } + } +} diff --git a/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java index d857ce831..f66305e38 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java @@ -19,10 +19,9 @@ import org.scribble.core.type.session.STypeFactory; import org.scribble.del.global.GDel; import org.scribble.job.Job; -import org.scribble.util.ScribException; // CHECKME: move to visit package? -public class GTypeTranslator extends SimpleAstVisitor +public class GTypeTranslator extends SimpleAstVisitorNoThrows { public final STypeFactory tf; @@ -33,7 +32,7 @@ public GTypeTranslator(Job job, ModuleName rootFullname, STypeFactory tf) } @Override - public GNode visit(ScribNode n) throws ScribException + public GNode visit(ScribNode n) { return ((GDel) n.del()).translate(n, this); } diff --git a/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitorNoThrows.java b/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitorNoThrows.java new file mode 100644 index 000000000..ed03cb814 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/visit/SimpleAstVisitorNoThrows.java @@ -0,0 +1,29 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.visit; + +import org.scribble.ast.ScribNode; +import org.scribble.core.type.name.ModuleName; +import org.scribble.job.Job; + +public abstract class SimpleAstVisitorNoThrows extends SimpleAstVisitor +{ + public SimpleAstVisitorNoThrows(Job job, ModuleName rootFullname) + { + super(job, rootFullname); + } + + @Override + public abstract T visit(ScribNode n); +} diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java index 76cbd3cc0..08c02557f 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/ApiGen.java @@ -18,7 +18,6 @@ import org.scribble.core.job.Core; import org.scribble.core.type.name.GProtoName; import org.scribble.job.Job; -import org.scribble.util.ScribException; // Basic pattern: use TypeGenerators to create all necessary TypeBuilders and cache them, and generateApi should call build on all as a final step public abstract class ApiGen @@ -30,14 +29,7 @@ public abstract class ApiGen public ApiGen(Job job, GProtoName fullname) { this.job = job; - try - { - this.core = job.getCore(); - } - catch (ScribException e) // TODO: refactor - { - throw new RuntimeException(e); - } + this.core = job.getCore(); this.gpn = fullname; } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index 50fc1d0b6..d1035000d 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -54,14 +54,7 @@ public class CBEndpointApiGenerator public CBEndpointApiGenerator(Job job, GProtoName fullname, Role self, boolean subtypes) { this.job = job; - try - { - this.core = job.getCore(); - } - catch (ScribException e) // TODO: refactor - { - throw new RuntimeException(e); - } + this.core = job.getCore(); this.proto = fullname; this.self = self; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 12704bb25..a3d03aa7f 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -66,14 +66,7 @@ public CBEndpointApiGenerator3(Job job, GProtoName fullname, Role self, boolean subtypes) { this.job = job; - try - { - this.core = job.getCore(); - } - catch (ScribException e) // TODO: refactor - { - throw new RuntimeException(e); - } + this.core = job.getCore(); this.proto = fullname; this.self = self; diff --git a/scribble-core/src/main/java/org/scribble/util/AntlrSourceException.java b/scribble-core/src/main/java/org/scribble/util/AntlrSourceException.java index fa5b092d8..4ab03191b 100644 --- a/scribble-core/src/main/java/org/scribble/util/AntlrSourceException.java +++ b/scribble-core/src/main/java/org/scribble/util/AntlrSourceException.java @@ -34,12 +34,13 @@ public AntlrSourceException(CommonTree blame, String arg0) { // char position indexes are obscure because only certain (child) nodes/tokens are actually recorded, e.g., name nodes (the keyword nodes, e.g., global, have been discarded) // ...although even taking the above into account, indexes still seem off? -- may be due to tabs (counted as single chars) - super(getRootModuleName(blame) + "(line " + blame.getLine() + ":" + (blame.getCharPositionInLine()) + "): " + arg0); + super(getRootModuleName(blame) + "(line " + blame.getLine() + ":" + + (blame.getCharPositionInLine()) + "): " + arg0); // Cf., getTokenStartIndex/getTokenStopIndex ? blame.token.getCharPositionInLine()? } // Cf., AntlrModule/AntlrModuleDecl -- but can't access parser classes from core (Maven dependencies) - private static String getRootModuleName(CommonTree blame) // Means root of this CommonTree (not the Scribble job root, i.e. main) + protected static String getRootModuleName(CommonTree blame) // Means root of this CommonTree (not the Scribble job root, i.e. main) { CommonTree root = blame; while (root.parent != null) @@ -48,7 +49,9 @@ private static String getRootModuleName(CommonTree blame) // Means root of this } CommonTree moddecl = (CommonTree) root.getChild(0).getChild(0); int count = moddecl.getChildCount(); - return IntStream.range(0, count).mapToObj(i -> moddecl.getChild(i).getText()).collect(Collectors.joining(".")); + return IntStream.range(0, count) + .mapToObj(i -> moddecl.getChild(i).getText()) + .collect(Collectors.joining(".")); } public AntlrSourceException(String arg0) diff --git a/scribble-core/src/main/java/org/scribble/util/RuntimeScribException.java b/scribble-core/src/main/java/org/scribble/util/RuntimeScribException.java index 988659d6f..a67e31bda 100644 --- a/scribble-core/src/main/java/org/scribble/util/RuntimeScribException.java +++ b/scribble-core/src/main/java/org/scribble/util/RuntimeScribException.java @@ -13,6 +13,8 @@ */ package org.scribble.util; +import org.antlr.runtime.tree.CommonTree; + public class RuntimeScribException extends RuntimeException { /** @@ -20,6 +22,14 @@ public class RuntimeScribException extends RuntimeException */ private static final long serialVersionUID = 1L; + public RuntimeScribException(CommonTree blame, String arg0) + { + // Duplicated from AntlrSourceException + super(AntlrSourceException.getRootModuleName(blame) + "(line " + + blame.getLine() + ":" + (blame.getCharPositionInLine()) + "): " + + arg0); + } + public RuntimeScribException() { // TODO Auto-generated constructor stub diff --git a/scribble-core/src/main/java/org/scribble/util/ScribException.java b/scribble-core/src/main/java/org/scribble/util/ScribException.java index 59204a9dd..4ff805c57 100644 --- a/scribble-core/src/main/java/org/scribble/util/ScribException.java +++ b/scribble-core/src/main/java/org/scribble/util/ScribException.java @@ -22,14 +22,14 @@ public class ScribException extends AntlrSourceException */ private static final long serialVersionUID = 1L; - public ScribException() + public ScribException(CommonTree blame, String arg0) { - // TODO Auto-generated constructor stub + super(blame, arg0); } - public ScribException(CommonTree blame, String arg0) + public ScribException() { - super(blame, arg0); + // TODO Auto-generated constructor stub } public ScribException(String arg0) diff --git a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index cffdee72e..bce43e18b 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -37,9 +37,27 @@ import org.scribble.ast.global.GRecursion; import org.scribble.ast.global.GSessionNode; import org.scribble.ast.global.GWrap; +import org.scribble.ast.local.LAcc; +import org.scribble.ast.local.LChoice; +import org.scribble.ast.local.LClientWrap; +import org.scribble.ast.local.LContinue; +import org.scribble.ast.local.LDisconnect; +import org.scribble.ast.local.LDo; +import org.scribble.ast.local.LInteractionSeq; +import org.scribble.ast.local.LProjectionDecl; +import org.scribble.ast.local.LProtoBlock; +import org.scribble.ast.local.LProtoDef; +import org.scribble.ast.local.LProtoHeader; +import org.scribble.ast.local.LRecursion; +import org.scribble.ast.local.LRecv; +import org.scribble.ast.local.LReq; +import org.scribble.ast.local.LSend; +import org.scribble.ast.local.LServerWrap; +import org.scribble.ast.local.LSessionNode; import org.scribble.ast.name.PayElemNameNode; import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.qualified.GProtoNameNode; +import org.scribble.ast.name.qualified.LProtoNameNode; import org.scribble.ast.name.qualified.ModuleNameNode; import org.scribble.ast.name.qualified.SigNameNode; import org.scribble.ast.name.simple.AmbigNameNode; @@ -115,7 +133,7 @@ protected CommonToken newIdToken(Token old, String text) { return new CommonToken(ScribbleParser.ID, text); } - CommonToken t = new CommonToken(old); + CommonToken t = new CommonToken(old); // Type and text set below, but "inherit" some other additional info t.setType(ScribbleParser.ID); t.setText(text); return t; @@ -587,8 +605,107 @@ public GRecursion GRecursion(Token t, RecVarNode rv, GProtoBlock block) n.decorateDel(this.df); return n; } -} + @Override + public LProjectionDecl LProjectionDecl(Token t, List mods, + GProtoNameNode fullname, RoleNode self, LProtoHeader header, LProtoDef def) // del extends that of LProtoDecl + { + + } + + @Override + public LProtoHeader LProtoHeader(Token t, LProtoNameNode name, RoleDeclList rs, + NonRoleParamDeclList ps) + { + + } + + @Override + public LProtoDef LProtoDef(Token t, LProtoBlock block) + { + + } + + @Override + public LProtoBlock LProtoBlock(Token t, LInteractionSeq seq) + { + + } + + @Override + public LInteractionSeq LInteractionSeq(Token t, List elems) + { + + } + + @Override + public LSend LSend(Token t, RoleNode src, MsgNode msg, RoleNode dst) + { + + } + + @Override + public LRecv LRecv(Token t, RoleNode src, MsgNode msg, RoleNode dst) + { + + + } + + @Override + public LAcc LAcc(Token t, RoleNode src, MsgNode msg, RoleNode dst) + { + + } + + @Override + public LReq LReq(Token t, RoleNode src, MsgNode msg, RoleNode dst) + { + + } + + @Override + public LDisconnect LDisconnect(Token t, RoleNode self, RoleNode peer) + { + + } + + @Override + public LClientWrap LClientWrap(Token t, RoleNode self, RoleNode peer) + { + + } + + @Override + public LServerWrap LServerWrap(Token t, RoleNode self, RoleNode peer) + { + + } + + @Override + public LContinue LContinue(Token t, RecVarNode recvar) + { + + } + + @Override + public LDo LDo(Token t, RoleArgList roles, NonRoleArgList args, + LProtoNameNode proto) + { + + } + + @Override + public LChoice LChoice(Token t, RoleNode subj, List blocks) + { + + } + @Override + public LRecursion LRecursion(Token t, RecVarNode recvar, LProtoBlock block) + + { + + } +} From 8578044bab781967af4f281b016eb7f255149d5b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 09:37:12 +0100 Subject: [PATCH 429/539] [WIP] Continued adding LProjectionTranslator. --- .../java/org/scribble/ast/AstFactory.java | 8 ++- .../main/java/org/scribble/ast/Choice.java | 3 +- .../scribble/ast/NonRoleParamDeclList.java | 6 +- .../java/org/scribble/ast/ParamDeclList.java | 2 +- .../main/java/org/scribble/ast/ProtoMod.java | 12 ++++ .../java/org/scribble/ast/ProtoModList.java | 16 ++++- .../ast/name/simple/DataParamNode.java | 1 + .../org/scribble/ast/name/simple/IdNode.java | 12 ++++ .../ast/name/simple/SigParamNode.java | 3 +- .../scribble/del/global/GProtoDeclDel.java | 2 +- .../scribble/util/LProjectionTranslator.java | 59 ++++++++++++++++--- .../org/scribble/visit/GTypeTranslator.java | 1 - .../java/org/scribble/core/lang/Protocol.java | 2 +- .../org/scribble/core/lang/ProtocolMod.java | 21 +++++-- .../java/org/scribble/ast/AstFactoryImpl.java | 42 ++++++++++++- 15 files changed, 161 insertions(+), 29 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index bbfd2be9c..b30295452 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -84,6 +84,7 @@ public interface AstFactory DataNameNode DataNameNode(Token t, List elems); GProtoNameNode GProtoNameNode(Token t, List elems); + LProtoNameNode LProtoNameNode(Token t, List elems); ModuleNameNode ModuleNameNode(Token t, List elems); SigNameNode SigNameNode(Token t, List elems); @@ -100,14 +101,17 @@ SigDecl SigDecl(Token t, IdNode schema, ExtIdNode extName, GProtoDecl GProtoDecl(Token t, ProtoModList mods, GProtoHeader header, GProtoDef def); - // TODO: add ProtoModList, etc. + // TODO: refactor to use ProtoModList, etc. + ProtoModList ProtoModList(Token t, List mods); + AuxMod AuxMod(Token t); + ExplicitMod ExplicitMod(Token t); GProtoHeader GProtocolHeader(Token t, GProtoNameNode name, RoleDeclList rs, NonRoleParamDeclList ps); RoleDeclList RoleDeclList(Token t, List ds); RoleDecl RoleDecl(Token t, RoleNode r); NonRoleParamDeclList NonRoleParamDeclList(Token t, - List> ds); + List> ds); DataParamDecl DataParamDecl(Token t, DataParamNode p); SigParamDecl SigParamDecl(Token t, SigParamNode p); diff --git a/scribble-ast/src/main/java/org/scribble/ast/Choice.java b/scribble-ast/src/main/java/org/scribble/ast/Choice.java index 4ebb49e38..1823047fb 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Choice.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Choice.java @@ -50,7 +50,8 @@ public RoleNode getSubjectChild() public abstract List> getBlockChildren(); // "add", not "set" - public void addScribChildren(RoleNode subj, List> blocks) + public void addScribChildren(RoleNode subj, + List> blocks) { // Cf. above getters and Scribble.g children order addChild(subj); diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java index 286adc154..deecc8b45 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonRoleParamDeclList.java @@ -49,12 +49,12 @@ public List> getDeclChildren() return cast; } - // "add", not "set" - public void addScribChildren(List> ds) + /*// "add", not "set" + public void addScribChildren(List> ds) { // Cf. above getters and Scribble.g children order super.addChildren(ds); - } + }*/ @Override public NonRoleParamDeclList dupNode() diff --git a/scribble-ast/src/main/java/org/scribble/ast/ParamDeclList.java b/scribble-ast/src/main/java/org/scribble/ast/ParamDeclList.java index a6e9e296b..0637fa0d4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ParamDeclList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ParamDeclList.java @@ -40,7 +40,7 @@ public ParamDeclList(ParamDeclList node) public abstract List> getDeclChildren(); // "add", not "set" - public void addScribChildren(List> ds) + public void addScribChildren(List> ds) { // Cf. above getters and Scribble.g children order super.addChildren(ds); diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtoMod.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoMod.java index 2a9971e1f..be54519d4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtoMod.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoMod.java @@ -14,6 +14,7 @@ package org.scribble.ast; import org.antlr.runtime.Token; +import org.scribble.core.lang.ProtocolMod; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; @@ -46,4 +47,15 @@ public ProtoMod visitChildren(AstVisitor nv) throws ScribException { return this; } + + // cf. toName + public ProtocolMod toProtocolMod() // TODO: rename + { + switch (toString()) // Directly from + { + case "aux": return ProtocolMod.AUX; + case "explicit": return ProtocolMod.EXPLICIT; + default: throw new RuntimeException("Unknown modifier: " + this); + } + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java index 8528ca316..9921eb2c0 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java @@ -35,12 +35,24 @@ protected ProtoModList(ProtoModList node) { super(node); } + + public List getModChildren() + { + return ((List) getChildren()).stream().map(x -> (ProtoMod) x) + .collect(Collectors.toList()); + } + + // "add", not "set" + public void addScribChildren(List mods) + { + addChildren(mods); + } + // CHECKME: deprecate? cf. getModChildren // Cf., NameNode::getSimpleNameList public List getModList() { - return ((List) getChildren()).stream().map(x -> (ProtoMod) x) - .collect(Collectors.toList()); + return getModChildren(); } public boolean hasAux() diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java index 80741a045..34c9e018a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/DataParamNode.java @@ -47,6 +47,7 @@ public void decorateDel(DelFactory df) df.DataParamNode(this); } + // N.B. no "DataParamName" @Override public DataName toName() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java index ac6b27332..d3122e40a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/IdNode.java @@ -13,7 +13,12 @@ */ package org.scribble.ast.name.simple; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import org.antlr.runtime.Token; +import org.scribble.ast.AstFactory; import org.scribble.core.type.kind.IdKind; import org.scribble.core.type.name.Id; import org.scribble.del.DelFactory; @@ -33,6 +38,13 @@ protected IdNode(IdNode node) super(node); } + // CHECKME: move to af? + public static List from(AstFactory af, String[] elems) + { + return Stream.of(elems).map(x -> af.IdNode(null, x)) + .collect(Collectors.toList()); + } + @Override public IdNode dupNode() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java index 98382842e..a23afb405 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SigParamNode.java @@ -46,7 +46,8 @@ public void decorateDel(DelFactory df) { df.SigParamNode(this); } - + + // N.B. no "SigParamName" @Override public SigName toName() { diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java index 49a2fb4cf..d817d0b2e 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java @@ -43,7 +43,7 @@ public GProtocol translate(ScribNode n, GTypeTranslator t) GProtoDecl source = (GProtoDecl) n; Module m = (Module) n.getParent(); List mods = source.getModifierListChild().getModList().stream() - .map(x -> ProtocolMod.fromAst(x)).collect(Collectors.toList()); + .map(x -> x.toProtocolMod()).collect(Collectors.toList()); GProtoName fullname = new GProtoName(m.getFullModuleName(), source.getHeaderChild().getDeclName()); List rs = source.getRoles(); diff --git a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java index ecc44dd50..4b29d95ce 100644 --- a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java @@ -14,25 +14,35 @@ package org.scribble.util; import java.util.Arrays; +import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; import org.scribble.ast.AstFactory; import org.scribble.ast.MsgNode; +import org.scribble.ast.NonRoleParamDecl; import org.scribble.ast.NonRoleParamDeclList; +import org.scribble.ast.ProtoMod; import org.scribble.ast.RoleDeclList; import org.scribble.ast.local.LProjectionDecl; import org.scribble.ast.local.LProtoBlock; import org.scribble.ast.local.LProtoDef; import org.scribble.ast.local.LProtoHeader; import org.scribble.ast.local.LSessionNode; +import org.scribble.ast.name.qualified.GProtoNameNode; +import org.scribble.ast.name.simple.DataParamNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ast.name.simple.SigParamNode; import org.scribble.core.job.Core; import org.scribble.core.job.CoreContext; +import org.scribble.core.lang.ProtocolMod; import org.scribble.core.lang.local.LProjection; +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.SigName; import org.scribble.core.type.session.Msg; @@ -50,7 +60,6 @@ import org.scribble.core.type.session.local.LType; import org.scribble.job.Job; -// CHECKME: move to visit package? public class LProjectionTranslator { public final Job job; @@ -71,15 +80,49 @@ public LProjectionDecl translate(GProtoName fullname, Role self) ltype.roles.stream().map( x -> this.af.RoleDecl(null, this.af.RoleNode(null, x.toString()))) .collect(Collectors.toList())); - NonRoleParamDeclList ps = this.af.NonRoleParamDeclList(null, - ltype.roles.stream().map(x -> null) - .collect(Collectors.toList())); - List elems = Arrays.asList(fullname.getElements()).stream() - .map(x -> this.af.IdNode(null, x)).collect(Collectors.toList()); - LProtoHeader hdr = this.af.LProtoHeader(null, + List> pds = new LinkedList<>(); + for (MemberName p : ltype.params) + { + if (p instanceof SigName) + { + SigParamNode n = this.af.SigParamNode(null, p.toString()); + pds.add(this.af.SigParamDecl(null, n)); + } + else if (p instanceof DataName) + { + DataParamNode n = this.af.DataParamNode(null, p.toString()); + pds.add(this.af.DataParamDecl(null, n)); + } + else + { + throw new RuntimeException( + "[TODO] Unsupported kind: " + p.getClass() + "\n\t" + p); + } + } + NonRoleParamDeclList ps = this.af.NonRoleParamDeclList(null, pds); + + List mods = ltype.mods.stream() + .map(x -> translate(x)).collect(Collectors.toList()); + GProtoNameNode parent = this.af.GProtoNameNode(null, + IdNode.from(this.af, fullname.getElements())); + RoleNode self1 = this.af.RoleNode(null, self.toString()); + List elems = IdNode.from(this.af, fullname.getElements()); + LProtoHeader header = this.af.LProtoHeader(null, this.af.LProtoNameNode(null, elems), rs, ps); LProtoDef def = this.af.LProtoDef(null, translate(ltype.def)); - return this.af.LProjectionDecl(null, ltype.mods, fullname, self, header, def); + return this.af.LProjectionDecl(null, mods, parent, self1, header, + def); + } + + // Cf. IdNode.from + protected ProtoMod translate(ProtocolMod mod) + { + switch (mod) + { + case AUX: return af.AuxMod(null); + case EXPLICIT: return af.ExplicitMod(null); + default: throw new RuntimeException("Unknown modifier: " + mod); + } } protected MsgNode translate(Msg msg) diff --git a/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java index f66305e38..d2f50e7b8 100644 --- a/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/visit/GTypeTranslator.java @@ -20,7 +20,6 @@ import org.scribble.del.global.GDel; import org.scribble.job.Job; -// CHECKME: move to visit package? public class GTypeTranslator extends SimpleAstVisitorNoThrows { public final STypeFactory tf; diff --git a/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java index 2cb0835e2..cfc26fd3b 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java @@ -39,7 +39,7 @@ public abstract class Protocol public final List mods; public final N fullname; public final List roles; // Ordered role params; pre: size >= 2 - public final List> params; + public final List> params; // N.B. there is no Data/SigParamName // CHECKME: always simple names? // NonRoleParamKind, not NonRoleArgKind, because latter includes AmbigKind due to parsing requirements // CHECKME: make a ParamName? or at least SimpleName? public final B def; diff --git a/scribble-core/src/main/java/org/scribble/core/lang/ProtocolMod.java b/scribble-core/src/main/java/org/scribble/core/lang/ProtocolMod.java index 053984e17..949f67a2c 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/ProtocolMod.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/ProtocolMod.java @@ -13,8 +13,6 @@ */ package org.scribble.core.lang; -import org.antlr.runtime.tree.CommonTree; - public enum ProtocolMod { AUX, @@ -30,8 +28,22 @@ public String toString() default: throw new RuntimeException("Unknown modifier: " + this); } } +} + + + + + + + + + + + + + - // TODO: refactor to scrib-lang -- param should be ProtocolMod, not CommonTree + /*// TODO: refactor to scrib-lang -- param should be ProtocolMod, not CommonTree public static ProtocolMod fromAst(CommonTree ast)//org.scribble.ast.ProtocolMod ast) { switch (ast.toString()) @@ -40,5 +52,4 @@ public static ProtocolMod fromAst(CommonTree ast)//org.scribble.ast.ProtocolMod case "explicit": return EXPLICIT; default: throw new RuntimeException("Unknown modifier: " + ast); } - } -} + }*/ \ No newline at end of file diff --git a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index bce43e18b..37854b874 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -257,6 +257,16 @@ public GProtoNameNode GProtoNameNode(Token t, List elems) n.decorateDel(this.df); return n; } + + @Override + public LProtoNameNode LProtoNameNode(Token t, List elems) + { + t = newToken(t, ScribbleParser.LPROTO_NAME); + LProtoNameNode n = new LProtoNameNode(t); + n.addChildren(elems); + n.decorateDel(this.df); + return n; + } @Override public ModuleNameNode ModuleNameNode(Token t, List elems) @@ -349,7 +359,33 @@ public GProtoDecl GProtoDecl(Token t, ProtoModList mods, GProtoHeader header, return n; } - // TODO: ProtoModList, etc. + @Override + public ProtoModList ProtoModList(Token t, List mods) + { + t = newToken(t, ScribbleParser.PROTOMOD_LIST); + ProtoModList n = new ProtoModList(t); + n.addScribChildren(mods); + n.decorateDel(this.df); + return n; + } + + @Override + public AuxMod AuxMod(Token t) + { + t = newToken(t, ScribbleParser.AUX_KW); // N.B. directly using KW + AuxMod n = new AuxMod(t); + n.decorateDel(this.df); + return n; + } + + @Override + public ExplicitMod ExplicitMod(Token t) + { + t = newToken(t, ScribbleParser.EXPLICIT_KW); // N.B. directly using KW + ExplicitMod n = new ExplicitMod(t); + n.decorateDel(this.df); + return n; + } @Override public GProtoHeader GProtocolHeader(Token t, GProtoNameNode name, @@ -383,8 +419,8 @@ public RoleDecl RoleDecl(Token t, RoleNode r) } @Override - public NonRoleParamDeclList NonRoleParamDeclList(Token t, - List> ds) + public NonRoleParamDeclList NonRoleParamDeclList(Token t, + List> ds) { t = newToken(t, ScribbleParser.PARAMDECL_LIST); NonRoleParamDeclList n = new NonRoleParamDeclList(t); From 187e9c2b9b2a3ee0ccb6cf6535660115908d0e2d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 09:52:30 +0100 Subject: [PATCH 430/539] [WIP] Adding LProjectionTranslator. --- .../scribble/util/LProjectionTranslator.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java index 4b29d95ce..6718e7fd4 100644 --- a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java @@ -22,6 +22,8 @@ import org.scribble.ast.MsgNode; import org.scribble.ast.NonRoleParamDecl; import org.scribble.ast.NonRoleParamDeclList; +import org.scribble.ast.PayElem; +import org.scribble.ast.PayElemList; import org.scribble.ast.ProtoMod; import org.scribble.ast.RoleDeclList; import org.scribble.ast.local.LProjectionDecl; @@ -29,6 +31,7 @@ import org.scribble.ast.local.LProtoDef; import org.scribble.ast.local.LProtoHeader; import org.scribble.ast.local.LSessionNode; +import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.qualified.GProtoNameNode; import org.scribble.ast.name.simple.DataParamNode; import org.scribble.ast.name.simple.IdNode; @@ -43,6 +46,7 @@ import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.PayElemType; import org.scribble.core.type.name.Role; import org.scribble.core.type.name.SigName; import org.scribble.core.type.session.Msg; @@ -130,8 +134,10 @@ protected MsgNode translate(Msg msg) if (msg.isSigLit()) { SigLit cast = (SigLit) msg; + PayElemList pay = this.af.PayElemList(null, cast.payload.elems.stream() + .map(x -> translate(x)).collect(Collectors.toList())); return this.af.SigLitNode(null, this.af.OpNode(null, cast.op.toString()), - cast.payload); + pay); } else { @@ -141,6 +147,21 @@ protected MsgNode translate(Msg msg) return this.af.SigNameNode(null, elems); } } + + protected PayElem translate(PayElemType e) + { + if (e instanceof DataName) + { + DataNameNode res = this.af.DataNameNode(null, + IdNode.from(af, ((DataName) e).getElements())); + return (PayElem) res; + } + else + { + throw new RuntimeException( + "[TODO] Unsupported PayElemType: " + e.getClass() + "\n\t" + e); + } + } protected org.scribble.ast.local.LAcc translate(LAcc t) { From 6a179d743a7c5e9362ea6377edcb00e2f0799400 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 10:41:05 +0100 Subject: [PATCH 431/539] [AllTest] Continued: refactoring projection and rec/continue/choice pruning. --- .../java/org/scribble/ast/AstFactory.java | 28 ++-- .../main/java/org/scribble/ast/ProtoDecl.java | 20 +-- .../scribble/ast/local/LProjectionDecl.java | 38 ++++- .../java/org/scribble/del/DelFactory.java | 2 + .../scribble/util/LProjectionTranslator.java | 8 +- .../org/scribble/parser/antlr/Scribble.g | 29 +++- .../java/org/scribble/ast/AstFactoryImpl.java | 142 +++++++++++++----- .../java/org/scribble/del/DelFactoryImpl.java | 8 + 8 files changed, 204 insertions(+), 71 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index b30295452..820cb1e08 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -125,11 +125,11 @@ UnaryPayElem UnaryPayElem(Token t, PayElemNameNode name); GDelegPayElem GDelegPayElem(Token t, GProtoNameNode name, RoleNode r); - GConnect GConnect(Token t, RoleNode src, MsgNode msg, RoleNode dst); - GDisconnect GDisconnect(Token t, RoleNode src, RoleNode dst); GMsgTransfer GMsgTransfer(Token t, RoleNode src, MsgNode msg, List dsts); - GWrap GWrap(Token t, RoleNode src, RoleNode dst); + GConnect GConnect(Token t, RoleNode src, MsgNode msg, RoleNode dst); + GDisconnect GDisconnect(Token t, RoleNode left, RoleNode right); + GWrap GWrap(Token t, RoleNode client, RoleNode server); GContinue GContinue(Token t, RecVarNode rv); GDo GDo(Token t, RoleArgList rs, NonRoleArgList args, @@ -143,12 +143,12 @@ GDo GDo(Token t, RoleArgList rs, NonRoleArgList args, GChoice GChoice(Token t, RoleNode subj, List blocks); GRecursion GRecursion(Token t, RecVarNode rv, GProtoBlock block); - /*LProtoDecl LProtoDecl(Token t, List mods, + /*LProtoDecl LProtoDecl(Token t, ProtoModList mods, LProtoHeader header, LProtoDef def); // Not currently used -- local protos not parsed, only projected*/ - LProjectionDecl LProjectionDecl(Token t, List mods, - GProtoNameNode fullname, RoleNode self, LProtoHeader header, - LProtoDef def); + LProjectionDecl LProjectionDecl(Token t, ProtoModList mods, + LProtoHeader header, LProtoDef def, GProtoNameNode fullname, + RoleNode self); // del extends that of LProtoDecl LProtoHeader LProtoHeader(Token t, LProtoNameNode name, RoleDeclList rs, @@ -158,20 +158,20 @@ LProtoHeader LProtoHeader(Token t, LProtoNameNode name, RoleDeclList rs, LProtoBlock LProtoBlock(Token t, LInteractionSeq seq); LInteractionSeq LInteractionSeq(Token t, List elems); + // CHECKME: refactor with self arg? -- cf. core local types LSend LSend(Token t, RoleNode src, MsgNode msg, RoleNode dst); LRecv LRecv(Token t, RoleNode src, MsgNode msg, RoleNode dst); LAcc LAcc(Token t, RoleNode src, MsgNode msg, RoleNode dst); LReq LReq(Token t, RoleNode src, MsgNode msg, RoleNode dst); - LDisconnect LDisconnect(Token t, RoleNode self, RoleNode peer); - LClientWrap LClientWrap(Token t, RoleNode self, RoleNode peer); - LServerWrap LServerWrap(Token t, RoleNode self, RoleNode peer); + LDisconnect LDisconnect(Token t, RoleNode left, RoleNode right); + LClientWrap LClientWrap(Token t, RoleNode client, RoleNode server); + LServerWrap LServerWrap(Token t, RoleNode client, RoleNode server); - LContinue LContinue(Token t, RecVarNode recvar); - LDo LDo(Token t, RoleArgList roles, NonRoleArgList args, - LProtoNameNode proto); + LContinue LContinue(Token t, RecVarNode rv); + LDo LDo(Token t, RoleArgList rs, NonRoleArgList as, LProtoNameNode proto); LChoice LChoice(Token t, RoleNode subj, List blocks); - LRecursion LRecursion(Token t, RecVarNode recvar, LProtoBlock block); + LRecursion LRecursion(Token t, RecVarNode rv, LProtoBlock block); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java index c06ebfa06..a5c0dbc6a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoDecl.java @@ -50,16 +50,6 @@ public ProtoModList getModifierListChild() public abstract ProtoHeader getHeaderChild(); public abstract ProtoDef getDefChild(); - public boolean isAux() - { - return getModifierListChild().hasAux(); - } - - public boolean isExplicit() - { - return getModifierListChild().hasExplicit(); - } - // "add", not "set" public void addScribChildren(ProtoModList mods, ProtoHeader header, ProtoDef def) @@ -69,6 +59,16 @@ public void addScribChildren(ProtoModList mods, ProtoHeader header, addChild(header); addChild(def); } + + public boolean isAux() + { + return getModifierListChild().hasAux(); + } + + public boolean isExplicit() + { + return getModifierListChild().hasExplicit(); + } public abstract ProtoDecl dupNode(); diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java index 56663050d..964a45c70 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java @@ -14,10 +14,20 @@ package org.scribble.ast.local; import org.antlr.runtime.Token; +import org.scribble.ast.ProtoDef; +import org.scribble.ast.ProtoHeader; +import org.scribble.ast.ProtoModList; +import org.scribble.ast.name.qualified.GProtoNameNode; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.type.kind.Local; import org.scribble.del.DelFactory; public class LProjectionDecl extends LProtoDecl { + // Continues on from ProtoDecl, cf. ProtoDecl.DEF_CHILD + public static final int GLOBAL_CHILD = 3; // Cf. "parent", confusing with Antlr + public static final int SELF_CHILD = 4; + //public final GProtoName parent; // FIXME: additional ast child? // ScribTreeAdaptor#create constructor @@ -32,6 +42,26 @@ protected LProjectionDecl(LProtoDecl node) super(node); } + public GProtoNameNode getGlobalChild() + { + return (GProtoNameNode) getChild(GLOBAL_CHILD); + } + + public RoleNode getSelfChild() + { + return (RoleNode) getChild(SELF_CHILD); + } + + // "add", not "set" + public void addScribChildren(ProtoModList mods, ProtoHeader header, + ProtoDef def, GProtoNameNode global, RoleNode self) + { + // Cf. above getters and Scribble.g children order + super.addScribChildren(mods, header, def); + addChild(global); + addChild(self); + } + // Cf. CommonTree#dupNode @Override public LProtoDecl dupNode() @@ -42,12 +72,16 @@ public LProtoDecl dupNode() @Override public void decorateDel(DelFactory df) { - throw new RuntimeException("TODO: " + this); + df.LProjectionDecl(this); } @Override public String toString() { - return "TODO"; + // Duplicated from ProtoDecl + ProtoModList mods = getModifierListChild(); + return (mods.isEmpty() ? "" : mods + " ") + getHeaderChild() + " " + + "projects " + getGlobalChild() + " " // Cf. core.lang.local.LProjection + + getDefChild(); } } diff --git a/scribble-ast/src/main/java/org/scribble/del/DelFactory.java b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java index 23c8ac915..851a3cd9a 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DelFactory.java +++ b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java @@ -54,6 +54,7 @@ import org.scribble.ast.local.LDisconnect; import org.scribble.ast.local.LDo; import org.scribble.ast.local.LInteractionSeq; +import org.scribble.ast.local.LProjectionDecl; import org.scribble.ast.local.LProtoBlock; import org.scribble.ast.local.LProtoDecl; import org.scribble.ast.local.LProtoDef; @@ -152,6 +153,7 @@ public interface DelFactory // Locals void LProtoDecl(LProtoDecl n); + void LProjectionDecl(LProjectionDecl n); void LProtoHeader(LProtoHeader n); diff --git a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java index 6718e7fd4..e7b28f252 100644 --- a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java @@ -25,6 +25,7 @@ import org.scribble.ast.PayElem; import org.scribble.ast.PayElemList; import org.scribble.ast.ProtoMod; +import org.scribble.ast.ProtoModList; import org.scribble.ast.RoleDeclList; import org.scribble.ast.local.LProjectionDecl; import org.scribble.ast.local.LProtoBlock; @@ -105,8 +106,8 @@ else if (p instanceof DataName) } NonRoleParamDeclList ps = this.af.NonRoleParamDeclList(null, pds); - List mods = ltype.mods.stream() - .map(x -> translate(x)).collect(Collectors.toList()); + ProtoModList mods = this.af.ProtoModList(null, ltype.mods.stream() + .map(x -> translate(x)).collect(Collectors.toList())); GProtoNameNode parent = this.af.GProtoNameNode(null, IdNode.from(this.af, fullname.getElements())); RoleNode self1 = this.af.RoleNode(null, self.toString()); @@ -114,8 +115,7 @@ else if (p instanceof DataName) LProtoHeader header = this.af.LProtoHeader(null, this.af.LProtoNameNode(null, elems), rs, ps); LProtoDef def = this.af.LProtoDef(null, translate(ltype.def)); - return this.af.LProjectionDecl(null, mods, parent, self1, header, - def); + return this.af.LProjectionDecl(null, mods, header, def, parent, self1); } // Cf. IdNode.from diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 44a8c5970..90b543a70 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -86,6 +86,7 @@ tokens // Compound names GPROTO_NAME = 'GPROTO_NAME'; // Parse specifically as GProto, for ScribTreeAdaptor.create + LPROTO_NAME = 'LPROTO_NAME'; MODULE_NAME = 'MODULE_NAME'; DATA_NAME = 'DATA_NAME'; // N.B. distinct from DATAPARAM_NAME SIG_NAME = 'SIG_NAME'; // N.B. distinct from SIGPARAM_NAME @@ -119,9 +120,9 @@ tokens // Scribble "session nodes" -- cf. org.scribble.core.type.session vs. org.scribble.core.lang GINTERSEQ = 'GINTERSEQ'; - GCONNECT = 'GCONNECT'; - GDCONN = 'GDCONN'; GMSGTRANSFER = 'GMSGTRANSFER'; + GCONNECT = 'GCONNECT'; + GDCONN = 'GDCONN'; // TODO: rename GDISCONN GWRAP = 'GWRAP'; GCONTINUE = 'GCONTINUE'; @@ -134,6 +135,30 @@ tokens GCHOICE = 'GCHOICE'; GRECURSION = 'GRECURSION'; + + // Locals: currently not directly parsed, but needed for, e.g., projection + LPROTODECL = 'LPROTODECL'; + + LPROTOHEADER = 'LPROTOHEADER'; + + LPROTODEF = 'LPROTODEF'; + LPROTOBLOCK = 'LPROTOBLOCK'; + + LINTERSEQ = 'LINTERSEQ'; + + LSEND = 'LSEND'; + LRECV = 'LRECV'; + LACC = 'LACC'; + LREQ = 'LREQ'; + LDCONN = 'LDCONN'; + LCLIENTWRAP = 'LCLIENTWRAP'; + LSERVERWRAP = 'LSERVERWRAP'; + + LCONTINUE = 'LCONTINUE'; + LDO = 'LDO'; + + LCHOICE = 'LCHOICE'; + LRECURSION = 'LRECURSION'; } diff --git a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index 37854b874..d9373d7ee 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -13,6 +13,7 @@ */ package org.scribble.ast; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -520,6 +521,17 @@ public GDelegPayElem GDelegPayElem(Token t, GProtoNameNode proto, return n; } + @Override + public GMsgTransfer GMsgTransfer(Token t, RoleNode src, MsgNode msg, + List dsts) + { + t = newToken(t, ScribbleParser.GMSGTRANSFER); + GMsgTransfer n = new GMsgTransfer(t); + n.addScribChildren(msg, src, dsts); + n.decorateDel(this.df); + return n; + } + @Override public GConnect GConnect(Token t, RoleNode src, MsgNode msg, RoleNode dst) { @@ -541,22 +553,11 @@ public GDisconnect GDisconnect(Token t, RoleNode left, RoleNode right) } @Override - public GMsgTransfer GMsgTransfer(Token t, RoleNode src, MsgNode msg, - List dsts) - { - t = newToken(t, ScribbleParser.GMSGTRANSFER); - GMsgTransfer n = new GMsgTransfer(t); - n.addScribChildren(msg, src, dsts); - n.decorateDel(this.df); - return n; - } - - @Override - public GWrap GWrap(Token t, RoleNode src, RoleNode dst) + public GWrap GWrap(Token t, RoleNode client, RoleNode server) { t = newToken(t, ScribbleParser.GWRAP); GWrap n = new GWrap(t); - n.addScribChildren(src, dst); + n.addScribChildren(client, server); n.decorateDel(this.df); return n; } @@ -643,103 +644,166 @@ public GRecursion GRecursion(Token t, RecVarNode rv, GProtoBlock block) } @Override - public LProjectionDecl LProjectionDecl(Token t, List mods, - GProtoNameNode fullname, RoleNode self, LProtoHeader header, LProtoDef def) // del extends that of LProtoDecl + public LProjectionDecl LProjectionDecl(Token t, ProtoModList mods, + LProtoHeader header, LProtoDef def, GProtoNameNode fullname, + RoleNode self) // del extends that of LProtoDecl { - + t = newToken(t, ScribbleParser.LPROTODECL); + LProjectionDecl n = new LProjectionDecl(t); + n.addScribChildren(mods, header, def, fullname, self); + n.decorateDel(this.df); + return n; } @Override public LProtoHeader LProtoHeader(Token t, LProtoNameNode name, RoleDeclList rs, NonRoleParamDeclList ps) { - + t = newToken(t, ScribbleParser.LPROTOHEADER); + LProtoHeader n = new LProtoHeader(t); + n.addScribChildren(name, ps, rs); + n.decorateDel(this.df); + return n; } @Override public LProtoDef LProtoDef(Token t, LProtoBlock block) { - + t = newToken(t, ScribbleParser.LPROTODEF); + LProtoDef n = new LProtoDef(t); + n.addScribChildren(block); + return n; } @Override public LProtoBlock LProtoBlock(Token t, LInteractionSeq seq) { - + t = newToken(t, ScribbleParser.LPROTOBLOCK); + LProtoBlock n = new LProtoBlock(t); + n.addScribChildren(seq); + n.decorateDel(this.df); + return n; } @Override public LInteractionSeq LInteractionSeq(Token t, List elems) { - + t = newToken(t, ScribbleParser.LINTERSEQ); + LInteractionSeq n = new LInteractionSeq(t); + n.addScribChildren(elems); + n.decorateDel(this.df); + return n; } @Override public LSend LSend(Token t, RoleNode src, MsgNode msg, RoleNode dst) { - + t = newToken(t, ScribbleParser.LSEND); + LSend n = new LSend(t); + n.addScribChildren(msg, src, Arrays.asList(dst)); + n.decorateDel(this.df); + return n; } @Override public LRecv LRecv(Token t, RoleNode src, MsgNode msg, RoleNode dst) { - - + t = newToken(t, ScribbleParser.LRECV); + LRecv n = new LRecv(t); + n.addScribChildren(msg, src, Arrays.asList(dst)); + n.decorateDel(this.df); + return n; } @Override public LAcc LAcc(Token t, RoleNode src, MsgNode msg, RoleNode dst) { - + t = newToken(t, ScribbleParser.LACC); + LAcc n = new LAcc(t); + n.addScribChildren(msg, src, Arrays.asList(dst)); + n.decorateDel(this.df); + return n; } @Override public LReq LReq(Token t, RoleNode src, MsgNode msg, RoleNode dst) { - + t = newToken(t, ScribbleParser.LREQ); + LReq n = new LReq(t); + n.addScribChildren(msg, src, Arrays.asList(dst)); + n.decorateDel(this.df); + return n; } @Override - public LDisconnect LDisconnect(Token t, RoleNode self, RoleNode peer) + public LDisconnect LDisconnect(Token t, RoleNode left, RoleNode right) { - + t = newToken(t, ScribbleParser.LDCONN); + LDisconnect n = new LDisconnect(t); + n.addScribChildren(left, right); + n.decorateDel(this.df); + return n; } @Override - public LClientWrap LClientWrap(Token t, RoleNode self, RoleNode peer) + public LClientWrap LClientWrap(Token t, RoleNode client, RoleNode server) { - + t = newToken(t, ScribbleParser.LCLIENTWRAP); + LClientWrap n = new LClientWrap(t); + n.addScribChildren(client, server); + n.decorateDel(this.df); + return n; } @Override - public LServerWrap LServerWrap(Token t, RoleNode self, RoleNode peer) + public LServerWrap LServerWrap(Token t, RoleNode client, RoleNode server) { - + t = newToken(t, ScribbleParser.LSERVERWRAP); + LServerWrap n = new LServerWrap(t); + n.addScribChildren(client, server); + n.decorateDel(this.df); + return n; } @Override - public LContinue LContinue(Token t, RecVarNode recvar) + public LContinue LContinue(Token t, RecVarNode rv) { - + t = newToken(t, ScribbleParser.LCONTINUE); + LContinue n = new LContinue(t); + n.addScribChildren(rv); + n.decorateDel(this.df); + return n; } @Override - public LDo LDo(Token t, RoleArgList roles, NonRoleArgList args, + public LDo LDo(Token t, RoleArgList rs, NonRoleArgList as, LProtoNameNode proto) { - + t = newToken(t, ScribbleParser.LDO); + LDo n = new LDo(t); + n.addScribChildren(proto, as, rs); + n.decorateDel(this.df); + return n; } @Override public LChoice LChoice(Token t, RoleNode subj, List blocks) { - + t = newToken(t, ScribbleParser.LCHOICE); + LChoice n = new LChoice(t); + n.addScribChildren(subj, blocks); + n.decorateDel(this.df); + return n; } - @Override - public LRecursion LRecursion(Token t, RecVarNode recvar, LProtoBlock block) + @Override + public LRecursion LRecursion(Token t, RecVarNode rv, LProtoBlock block) { - + t = newToken(t, ScribbleParser.LRECURSION); + LRecursion n = new LRecursion(t); + n.addScribChildren(rv, block); + n.decorateDel(this.df); + return n; } } diff --git a/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java index 2911dcc04..8837c2528 100644 --- a/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java @@ -56,6 +56,7 @@ import org.scribble.ast.local.LDisconnect; import org.scribble.ast.local.LDo; import org.scribble.ast.local.LInteractionSeq; +import org.scribble.ast.local.LProjectionDecl; import org.scribble.ast.local.LProtoBlock; import org.scribble.ast.local.LProtoDecl; import org.scribble.ast.local.LProtoDef; @@ -98,6 +99,7 @@ import org.scribble.del.local.LDisconnectDel; import org.scribble.del.local.LDoDel; import org.scribble.del.local.LInteractionSeqDel; +import org.scribble.del.local.LProjectionDeclDel; import org.scribble.del.local.LProtoBlockDel; import org.scribble.del.local.LProtoDeclDel; import org.scribble.del.local.LProtoDefDel; @@ -430,6 +432,12 @@ public void LProtoDecl(LProtoDecl n) setDel(n, new LProtoDeclDel()); } + @Override + public void LProjectionDecl(LProjectionDecl n) + { + setDel(n, new LProjectionDeclDel()); + } + @Override public void LProtoHeader(LProtoHeader n) { From aa192a73324a86e00ff87d9d8e8d5be69f4f6aff Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 10:42:11 +0100 Subject: [PATCH 432/539] [AllTest] Minor. --- .../main/java/org/scribble/util/LProjectionTranslator.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java index e7b28f252..22f13e6bc 100644 --- a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java @@ -65,10 +65,11 @@ import org.scribble.core.type.session.local.LType; import org.scribble.job.Job; +// Cannot refactor into LType hierarchy, due to Maven module dependencies (scribble-core cannot see scribble-ast) public class LProjectionTranslator { public final Job job; - protected final AstFactory af; + private final AstFactory af; public LProjectionTranslator(Job job) { @@ -223,7 +224,7 @@ protected org.scribble.ast.local.LProtoBlock translate(LSeq t) return this.af.LProtoBlock(null, this.af.LInteractionSeq(null, elems)); } - // Cannot refactor into LType hierarchy, due to Maven module dependencies (scribble-core cannot see outside) + // Cannot refactor into LType hierarchy, due to Maven module dependencies (scribble-core cannot see scribble-ast) // Only LSeq not done, return is not an LSessionNode protected LSessionNode translate(LType t) { From a1d59057c81b257baf7cfd84d75a4b42c6b19774 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 10:54:09 +0100 Subject: [PATCH 433/539] [AllTest] Minor. --- .../org/scribble/ast/name/simple/SimpleNameNode.java | 5 ++--- .../org/scribble/util/LProjectionTranslator.java | 12 +++++++----- .../org/scribble/core/lang/global/GProtocol.java | 5 ++--- .../java/org/scribble/core/lang/local/LProtocol.java | 5 ++--- .../main/java/org/scribble/ast/AstFactoryImpl.java | 4 +--- 5 files changed, 14 insertions(+), 17 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java index 82a9b6759..9495c8e02 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/SimpleNameNode.java @@ -13,9 +13,8 @@ */ package org.scribble.ast.name.simple; +import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.antlr.runtime.Token; import org.scribble.ast.name.NameNode; @@ -47,6 +46,6 @@ public String getText() @Override public List getElements() { - return Stream.of(getText()).collect(Collectors.toList()); + return Arrays.asList(getText()); } } diff --git a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java index 22f13e6bc..a343ef7a1 100644 --- a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java @@ -34,6 +34,7 @@ import org.scribble.ast.local.LSessionNode; import org.scribble.ast.name.qualified.DataNameNode; import org.scribble.ast.name.qualified.GProtoNameNode; +import org.scribble.ast.name.qualified.LProtoNameNode; import org.scribble.ast.name.simple.DataParamNode; import org.scribble.ast.name.simple.IdNode; import org.scribble.ast.name.simple.RecVarNode; @@ -82,6 +83,7 @@ public LProjectionDecl translate(GProtoName fullname, Role self) Core core = this.job.getCore(); CoreContext jobc = core.getContext(); LProjection ltype = jobc.getProjection(fullname, self); + RoleDeclList rs = this.af.RoleDeclList(null, ltype.roles.stream().map( x -> this.af.RoleDecl(null, this.af.RoleNode(null, x.toString()))) @@ -109,14 +111,14 @@ else if (p instanceof DataName) ProtoModList mods = this.af.ProtoModList(null, ltype.mods.stream() .map(x -> translate(x)).collect(Collectors.toList())); - GProtoNameNode parent = this.af.GProtoNameNode(null, + GProtoNameNode global = this.af.GProtoNameNode(null, IdNode.from(this.af, fullname.getElements())); RoleNode self1 = this.af.RoleNode(null, self.toString()); - List elems = IdNode.from(this.af, fullname.getElements()); - LProtoHeader header = this.af.LProtoHeader(null, - this.af.LProtoNameNode(null, elems), rs, ps); + LProtoNameNode projFullname = this.af.LProtoNameNode(null, + IdNode.from(this.af, fullname.getElements())); + LProtoHeader header = this.af.LProtoHeader(null, projFullname, rs, ps); LProtoDef def = this.af.LProtoDef(null, translate(ltype.def)); - return this.af.LProjectionDecl(null, mods, header, def, parent, self1); + return this.af.LProjectionDecl(null, mods, header, def, global, self1); } // Cf. IdNode.from diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 9a4b4288e..daf6d047c 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -13,12 +13,12 @@ */ package org.scribble.core.lang.global; +import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.job.Core; @@ -163,8 +163,7 @@ else if (n instanceof SigName) GSeq inlined = v.visitSeq(subs.visitSeq(this.def)); RecVar rv = v.getInlinedRecVar(sig); GRecursion rec = v.core.config.tf.global.GRecursion(null, rv, inlined); // CHECKME: or protodecl source? - GSeq seq = v.core.config.tf.global.GSeq(null, - Stream.of(rec).collect(Collectors.toList())); + GSeq seq = v.core.config.tf.global.GSeq(null, Arrays.asList(rec)); GSeq def = v.core.config.vf.RecPruner().visitSeq(seq); Set used = def.gather(new RoleGatherer()::visit) .collect(Collectors.toSet()); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index c4da3cfa3..4352d1fa7 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -13,11 +13,11 @@ */ package org.scribble.core.lang.local; +import java.util.Arrays; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; -import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; import org.scribble.core.job.Core; @@ -103,8 +103,7 @@ else if (n instanceof SigName) LSeq inlined = v.visitSeq(subs.visitSeq(this.def)); RecVar rv = v.getInlinedRecVar(sig); LRecursion rec = v.core.config.tf.local.LRecursion(null, rv, inlined); // CHECKME: or protodecl source? - LSeq seq = v.core.config.tf.local.LSeq(null, - Stream.of(rec).collect(Collectors.toList())); + LSeq seq = v.core.config.tf.local.LSeq(null, Arrays.asList(rec)); LSeq def = v.core.config.vf.RecPruner().visitSeq(seq); /*//CHECKME: necessary for LProtocol/Projection? cf. global Set used = def.gather(new RoleGatherer()::visit) diff --git a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index d9373d7ee..fda7a67f0 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -18,8 +18,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.antlr.runtime.CommonToken; import org.antlr.runtime.Token; @@ -537,7 +535,7 @@ public GConnect GConnect(Token t, RoleNode src, MsgNode msg, RoleNode dst) { t = newToken(t, ScribbleParser.GCONNECT); GConnect n = new GConnect(t); - n.addScribChildren(msg, src, Stream.of(dst).collect(Collectors.toList())); + n.addScribChildren(msg, src, Arrays.asList(dst)); n.decorateDel(this.df); return n; } From cf0c0804b1f69f31065cfabbd2beafe2b0512322 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 11:32:17 +0100 Subject: [PATCH 434/539] [INSTALL] Refactoring Job projections. --- .../src/main/java/org/scribble/job/Job.java | 44 +++++++++++++++++++ .../scribble/util/LProjectionTranslator.java | 23 ++++------ .../java/org/scribble/cli/CommandLine.java | 5 +-- .../main/java/org/scribble/core/job/Core.java | 43 +++++++----------- .../org/scribble/core/job/CoreContext.java | 3 +- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 6 files changed, 74 insertions(+), 46 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 696fcdc28..ba3349036 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -13,21 +13,32 @@ */ package org.scribble.job; +import java.util.Collections; import java.util.HashSet; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; +import java.util.stream.Collectors; import org.scribble.ast.AstFactory; import org.scribble.ast.Module; import org.scribble.ast.global.GProtoDecl; +import org.scribble.ast.local.LProjectionDecl; import org.scribble.core.job.Core; import org.scribble.core.job.CoreArgs; import org.scribble.core.lang.global.GProtocol; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.GProtoName; +import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.name.ProtoName; +import org.scribble.core.type.name.Role; import org.scribble.core.type.session.STypeFactory; import org.scribble.core.type.session.global.GTypeFactoryImpl; import org.scribble.core.type.session.local.LTypeFactoryImpl; +import org.scribble.core.visit.global.InlinedProjector; import org.scribble.del.DelFactory; +import org.scribble.util.LProjectionTranslator; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; import org.scribble.visit.GTypeTranslator; @@ -122,6 +133,39 @@ protected Core newCore(ModuleName mainFullname, Map args, return new Core(mainFullname, args, //modcs, imeds, tf); } + + // Returns: fullname -> Module -- CHECKME TODO: refactor local Module creation to Job? + // CHECKME: generate projection Modules for an *inline* main? + public Map getProjections(GProtoName fullname, + Role self) throws ScribException + { + LProjectionTranslator t = new LProjectionTranslator(this); + Map, LProjectionDecl> projs = getCore() + .getProjections(fullname, self).entrySet().stream() + .collect(Collectors.toMap(Entry::getKey, x -> t.translate(x.getValue()))); + + LProjectionDecl root = projs + .get(InlinedProjector.getFullProjectionName(fullname, self)); + + System.out.println( + "Projection modules for " + fullname + "@" + self + ":\n" + root); + for (ProtoName pfullname : projs.keySet()) + { + // CHECKME: projection decl name is currently *compound* full name (not simple name), OK? + if (!root.getHeaderChild().getDeclName().equals(pfullname)) + { + System.out.println("\n" + projs.get(pfullname)); + } + } + + System.out.println(""); + warningPrintln("[TODO] Full module projection (with imports): " + + fullname + "@" + self); + + return Collections.emptyMap(); + //FIXME: build output Modules + //FIXME: (interleaved) ordering between proto and nonproto (Module) imports -- order by original Global import order? + } // First run Visitor passes, then call toJob // Base implementation: ambigname disamb pass only diff --git a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java index a343ef7a1..d8e2665c4 100644 --- a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java @@ -40,16 +40,12 @@ import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; -import org.scribble.core.job.Core; -import org.scribble.core.job.CoreContext; import org.scribble.core.lang.ProtocolMod; import org.scribble.core.lang.local.LProjection; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.DataName; -import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.PayElemType; -import org.scribble.core.type.name.Role; import org.scribble.core.type.name.SigName; import org.scribble.core.type.session.Msg; import org.scribble.core.type.session.SigLit; @@ -67,6 +63,7 @@ import org.scribble.job.Job; // Cannot refactor into LType hierarchy, due to Maven module dependencies (scribble-core cannot see scribble-ast) +// Actually, this is a quite general LScribNode translator public class LProjectionTranslator { public final Job job; @@ -78,15 +75,11 @@ public LProjectionTranslator(Job job) this.af = job.config.af; } - public LProjectionDecl translate(GProtoName fullname, Role self) + public LProjectionDecl translate(LProjection ltype) { - Core core = this.job.getCore(); - CoreContext jobc = core.getContext(); - LProjection ltype = jobc.getProjection(fullname, self); - RoleDeclList rs = this.af.RoleDeclList(null, ltype.roles.stream().map( - x -> this.af.RoleDecl(null, this.af.RoleNode(null, x.toString()))) + x -> this.af.RoleDecl(null, this.af.RoleNode(null, x.toString()))) // CHECKME: special "self" node? .collect(Collectors.toList())); List> pds = new LinkedList<>(); for (MemberName p : ltype.params) @@ -112,10 +105,10 @@ else if (p instanceof DataName) ProtoModList mods = this.af.ProtoModList(null, ltype.mods.stream() .map(x -> translate(x)).collect(Collectors.toList())); GProtoNameNode global = this.af.GProtoNameNode(null, - IdNode.from(this.af, fullname.getElements())); - RoleNode self1 = this.af.RoleNode(null, self.toString()); + IdNode.from(this.af, ltype.parent.getElements())); + RoleNode self1 = this.af.RoleNode(null, ltype.self.toString()); // CHECKME: special "self" node? LProtoNameNode projFullname = this.af.LProtoNameNode(null, - IdNode.from(this.af, fullname.getElements())); + IdNode.from(this.af, ltype.fullname.getElements())); LProtoHeader header = this.af.LProtoHeader(null, projFullname, rs, ps); LProtoDef def = this.af.LProtoDef(null, translate(ltype.def)); return this.af.LProjectionDecl(null, mods, header, def, global, self1); @@ -165,7 +158,9 @@ protected PayElem translate(PayElemType e) "[TODO] Unsupported PayElemType: " + e.getClass() + "\n\t" + e); } } - + + // CHECKME: in following, special "self" nodes? + protected org.scribble.ast.local.LAcc translate(LAcc t) { RoleNode src = this.af.RoleNode(null, t.src.toString()); diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 71080865c..a6f1e2731 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -30,10 +30,8 @@ import org.scribble.ast.global.GProtoDecl; import org.scribble.codegen.java.JEndpointApiGenerator; import org.scribble.codegen.java.callbackapi.CBEndpointApiGenerator3; -import org.scribble.core.job.Core; import org.scribble.core.job.CoreArgs; import org.scribble.core.job.CoreContext; -import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.global.SGraph; import org.scribble.core.type.name.GProtoName; @@ -305,12 +303,11 @@ private void printProjection(Job job, String[] args) throws CommandLineException, ScribException { JobContext jobc = job.getContext(); - Core core = job.getCore(); for (int i = 0; i < args.length; i += 2) { GProtoName fullname = checkGlobalProtocolArg(jobc, args[i]); Role role = checkRoleArg(jobc, fullname, args[i+1]); - Map projections = core.getProjections(fullname, + Map projections = job.getProjections(fullname, role); // FIXME: generate and output Module container -- should be done via Lang? System.out.println("\n" + projections.values().stream() .map(p -> p.toString()).collect(Collectors.joining("\n\n"))); diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index de2488bb6..d72c6ac27 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -13,7 +13,7 @@ */ package org.scribble.core.job; -import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -21,7 +21,6 @@ import org.scribble.core.lang.global.GProtocol; import org.scribble.core.lang.local.LProjection; -import org.scribble.core.lang.local.LProtocol; import org.scribble.core.model.ModelFactory; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.endpoint.EModelFactoryImpl; @@ -31,8 +30,6 @@ import org.scribble.core.model.visit.local.NonDetPayChecker; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.GProtoName; -import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.ProtoName; @@ -337,39 +334,33 @@ protected void validateByScribble(ProtoName fullname, boolean fair) } // Pre: checkWellFormedness - // Returns: fullname -> Module -- CHECKME TODO: refactor local Module creation to Job? - // CHECKME: generate projection Modules for an inline main? -- no: TODO refactor to Job - public Map getProjections(GProtoName fullname, - Role role) throws ScribException + // TODO: refactor projection, choice-subj fixing, do-pruning, do-arg fixing, etc. fully to Job (and drop this.projs from here) + public Map, LProjection> getProjections( + ProtoName fullname, Role self) throws ScribException { - //Module root = - LProtocol proj = - this.context.getProjection(fullname, role); + Map, LProjection> res = new HashMap<>(); + + LProjection proj = this.context.getProjection(fullname, self); + res.put(proj.fullname, proj); - List> pfullnames = proj.def + List> pdeps = proj.def .gather(new ProtoDepsCollector()::visit) .collect(Collectors.toList()); - for (ProtoName pfullname : pfullnames) - { - System.out - .println("\n" + this.context.getProjection((LProtoName) pfullname)); - } - if (!pfullnames.contains(proj.fullname)) + for (ProtoName pfullname : pdeps) { - System.out.println("\n" + proj); + res.put(pfullname, this.context.getProjection(pfullname)); } List> ns = proj.def .gather(new NonProtoDepsGatherer()::visit) .collect(Collectors.toList()); - - warningPrintln(""); - warningPrintln("[TODO] Full module projection (with imports): " - + fullname + "@" + role); + if (!ns.isEmpty()) + { + throw new RuntimeException( + "[TODO] Non-proto dependencies: " + ns + "\n\t" + proj); + } - return Collections.emptyMap(); - //FIXME: build output Modules - //FIXME: (interleaved) ordering between proto and nonproto (Module) imports -- order by original Global import order? + return res; } public CoreContext getContext() diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index 272be1793..60d50c969 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -68,6 +68,7 @@ public class CoreContext // LProtocolName is the full local protocol name (module name is the prefix) // LProtocolName key is LProtocol value fullname (i.e., redundant) private final Map, LProjection> projs = new HashMap<>(); // FIXME: choice-subj fixing, do-pruning -- factor out to Job and do there via AstVisitor? -- make testing compare the two sides + // TODO: refactor projection, choice-subj fixing, do-pruning, do-arg fixing, etc. fully to Job (and drop this.projs from here) // Built from projected inlined private final Map, EGraph> fEGraphs = new HashMap<>(); @@ -192,7 +193,7 @@ protected void addProjectedInlined(LProjection iproj) // Projected from intermediate // Core gives LProjection -- projection Modules should be by Job - public LProjection getProjection(GProtoName fullname, Role self) + public LProjection getProjection(ProtoName fullname, Role self) { LProtoName projFullname = InlinedProjector.getFullProjectionName(fullname, self); diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 48e7ef0ed..ee7b1fb65 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -116,7 +116,7 @@ module tmp.Test; data "..." from "..." as T; -/* +//* global protocol Proto1(role A, role B, role C, role D) { rec X From b44bf964fa6b5f2c2152a59fcd9093672a49ac63 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 12:37:20 +0100 Subject: [PATCH 435/539] [AllTest] Minor. --- .../src/main/java/org/scribble/job/Job.java | 38 ++++++++++++++----- .../scribble/util/LProjectionTranslator.java | 2 +- .../scribble/core/lang/local/LProjection.java | 12 +++--- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index ba3349036..987ebca65 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -13,20 +13,24 @@ */ package org.scribble.job; +import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; -import java.util.stream.Collectors; import org.scribble.ast.AstFactory; import org.scribble.ast.Module; +import org.scribble.ast.ModuleDecl; import org.scribble.ast.global.GProtoDecl; import org.scribble.ast.local.LProjectionDecl; +import org.scribble.ast.name.qualified.ModuleNameNode; +import org.scribble.ast.name.simple.IdNode; import org.scribble.core.job.Core; import org.scribble.core.job.CoreArgs; import org.scribble.core.lang.global.GProtocol; +import org.scribble.core.lang.local.LProjection; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; @@ -140,21 +144,37 @@ public Map getProjections(GProtoName fullname, Role self) throws ScribException { LProjectionTranslator t = new LProjectionTranslator(this); - Map, LProjectionDecl> projs = getCore() + + Map, LProjection> projs = getCore() + .getProjections(fullname, self); + /*Map, LProjectionDecl> projs = getCore() .getProjections(fullname, self).entrySet().stream() - .collect(Collectors.toMap(Entry::getKey, x -> t.translate(x.getValue()))); + .collect(Collectors.toMap(Entry::getKey, x -> t.translate(x.getValue())));*/ + + Map, Module> projmods = new HashMap<>(); + for (ProtoName pfullname : projs.keySet()) + { + ModuleNameNode modn = this.config.af.ModuleNameNode(null, + IdNode.from(this.config.af, pfullname.getPrefix().getElements())); + ModuleDecl modd = this.config.af.ModuleDecl(null, modn); + projmods.put(pfullname, + this.config.af.Module(null, modd, Collections.emptyList(), + Collections.emptyList(), + Arrays.asList(t.translate(projs.get(pfullname))))); + } - LProjectionDecl root = projs + LProjection root = projs .get(InlinedProjector.getFullProjectionName(fullname, self)); System.out.println( - "Projection modules for " + fullname + "@" + self + ":\n" + root); - for (ProtoName pfullname : projs.keySet()) + "\nProjection modules for " + fullname + "@" + self + ":\n\n" + + projmods.get(root.fullname)); + for (ProtoName pfullname : projmods.keySet()) { // CHECKME: projection decl name is currently *compound* full name (not simple name), OK? - if (!root.getHeaderChild().getDeclName().equals(pfullname)) + if (!root.fullname.equals(pfullname)) { - System.out.println("\n" + projs.get(pfullname)); + System.out.println("\n" + projmods.get(pfullname)); } } diff --git a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java index d8e2665c4..34e5bf4fe 100644 --- a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java @@ -105,7 +105,7 @@ else if (p instanceof DataName) ProtoModList mods = this.af.ProtoModList(null, ltype.mods.stream() .map(x -> translate(x)).collect(Collectors.toList())); GProtoNameNode global = this.af.GProtoNameNode(null, - IdNode.from(this.af, ltype.parent.getElements())); + IdNode.from(this.af, ltype.global.getElements())); RoleNode self1 = this.af.RoleNode(null, ltype.self.toString()); // CHECKME: special "self" node? LProtoNameNode projFullname = this.af.LProtoNameNode(null, IdNode.from(this.af, ltype.fullname.getElements())); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java index f8e8e0e21..2911f4a4d 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java @@ -29,15 +29,15 @@ public class LProjection extends LProtocol { - public final GProtoName parent; + public final GProtoName global; public LProjection(List mods, LProtoName fullname, List roles, Role self, - List> params, GProtoName parent, + List> params, GProtoName global, LSeq body) { super(null, mods, fullname, roles, self, params, body); - this.parent = parent; + this.global = global; } @Override @@ -46,7 +46,7 @@ public LProjection reconstruct(CommonTree source, Role self, List> params, LSeq body) { return new LProjection(mods, fullname, roles, this.self, params, - this.parent, body); + this.global, body); } /*@Override @@ -80,7 +80,7 @@ public String toString() + "local protocol " + this.fullname.getSimpleName() + paramsToString() + rolesToString() - + " projects " + this.parent + + " projects " + this.global + " {\n" + this.def + "\n}"; } @@ -89,7 +89,7 @@ public int hashCode() { int hash = 3167; hash = 31 * hash + super.hashCode(); - hash = 31 * hash + this.parent.hashCode(); + hash = 31 * hash + this.global.hashCode(); return hash; } From 0d50a92f0528002d81204a220fdc949ea34af67a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 12:41:43 +0100 Subject: [PATCH 436/539] [AllTest] Minor. --- .../src/main/java/org/scribble/ast/AstFactory.java | 9 ++++++--- scribble-ast/src/main/java/org/scribble/ast/Module.java | 5 +++-- scribble-ast/src/main/java/org/scribble/job/Job.java | 9 +++++---- .../src/main/java/org/scribble/ast/AstFactoryImpl.java | 4 ++-- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 820cb1e08..aeb462b51 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -88,8 +88,11 @@ public interface AstFactory ModuleNameNode ModuleNameNode(Token t, List elems); SigNameNode SigNameNode(Token t, List elems); - Module Module(Token t, ModuleDecl mdecl, List> imports, - List> data, List> protos); + Module Module(Token t, ModuleDecl mdecl, + List> imports, + List> data, + List> protos); + ModuleDecl ModuleDecl(Token t, ModuleNameNode fullname); ImportModule ImportModule(Token t, ModuleNameNode modname, ModuleNameNode alias); @@ -117,7 +120,7 @@ NonRoleParamDeclList NonRoleParamDeclList(Token t, GProtoDef GProtoDef(Token t, GProtoBlock block); GProtoBlock GProtoBlock(Token t, GInteractionSeq seq); - GInteractionSeq GInteractionSeq(Token t, List elems); + GInteractionSeq GInteractionSeq(Token t, List elems); // CHECKME: ? extends GSessionNode ? -- and similar others? SigLitNode SigLitNode(Token t, OpNode op, PayElemList pay); PayElemList PayElemList(Token t, List> elems); diff --git a/scribble-ast/src/main/java/org/scribble/ast/Module.java b/scribble-ast/src/main/java/org/scribble/ast/Module.java index 1d84457a5..8e9be3e58 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Module.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Module.java @@ -90,8 +90,9 @@ private List getMemberChildren( } // "add", not "set" - public void addScribChildren(ModuleDecl moddecl, List> imports, - List> data, List> protos) + public void addScribChildren(ModuleDecl moddecl, + List> imports, + List> data, List> protos) { // Cf. above getters and Scribble.g children order addChild(moddecl); diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 987ebca65..5f621b3cc 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -17,6 +17,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; @@ -157,10 +158,10 @@ public Map getProjections(GProtoName fullname, ModuleNameNode modn = this.config.af.ModuleNameNode(null, IdNode.from(this.config.af, pfullname.getPrefix().getElements())); ModuleDecl modd = this.config.af.ModuleDecl(null, modn); - projmods.put(pfullname, - this.config.af.Module(null, modd, Collections.emptyList(), - Collections.emptyList(), - Arrays.asList(t.translate(projs.get(pfullname))))); + List protos = Arrays.asList(t.translate(projs.get(pfullname))); + Module mod = this.config.af.Module(null, modd, Collections.emptyList(), + Collections.emptyList(), protos); + projmods.put(pfullname, mod); } LProjection root = projs diff --git a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index fda7a67f0..dccd5fe03 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -294,8 +294,8 @@ public SigNameNode SigNameNode(Token t, List elems) */ @Override - public Module Module(Token t, ModuleDecl moddecl, List> imports, - List> data, List> protos) + public Module Module(Token t, ModuleDecl moddecl, List> imports, + List> data, List> protos) { t = newToken(t, ScribbleParser.MODULE); Module n = new Module(t); From 25e3ef53e0cdd01a42746e3beeb3c4aaad5990be Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 12:45:58 +0100 Subject: [PATCH 437/539] [AllTest] Minor. --- .../src/main/java/org/scribble/ast/AstFactory.java | 2 +- scribble-ast/src/main/java/org/scribble/job/Job.java | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index aeb462b51..e758d7055 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -90,7 +90,7 @@ public interface AstFactory Module Module(Token t, ModuleDecl mdecl, List> imports, - List> data, + List> nonprotos, List> protos); ModuleDecl ModuleDecl(Token t, ModuleNameNode fullname); diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 5f621b3cc..aec7bcfa5 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -22,8 +22,10 @@ import java.util.Set; import org.scribble.ast.AstFactory; +import org.scribble.ast.ImportDecl; import org.scribble.ast.Module; import org.scribble.ast.ModuleDecl; +import org.scribble.ast.NonProtoDecl; import org.scribble.ast.global.GProtoDecl; import org.scribble.ast.local.LProjectionDecl; import org.scribble.ast.name.qualified.ModuleNameNode; @@ -158,22 +160,22 @@ public Map getProjections(GProtoName fullname, ModuleNameNode modn = this.config.af.ModuleNameNode(null, IdNode.from(this.config.af, pfullname.getPrefix().getElements())); ModuleDecl modd = this.config.af.ModuleDecl(null, modn); + List> imports = Collections.emptyList(); // FIXME TODO + List> nonprotos = Collections.emptyList(); // FIXME TODO List protos = Arrays.asList(t.translate(projs.get(pfullname))); - Module mod = this.config.af.Module(null, modd, Collections.emptyList(), - Collections.emptyList(), protos); + Module mod = this.config.af.Module(null, modd, imports, nonprotos, protos); projmods.put(pfullname, mod); } LProjection root = projs .get(InlinedProjector.getFullProjectionName(fullname, self)); - System.out.println( "\nProjection modules for " + fullname + "@" + self + ":\n\n" - + projmods.get(root.fullname)); + + projmods.get(root.fullname)); // FIXME TODO refactor printing into CommandLine for (ProtoName pfullname : projmods.keySet()) { // CHECKME: projection decl name is currently *compound* full name (not simple name), OK? - if (!root.fullname.equals(pfullname)) + if (!pfullname.equals(root.fullname)) { System.out.println("\n" + projmods.get(pfullname)); } From 043efe5e3cdd00c1194ea7e28943d9dc33bdbc27 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 13:40:47 +0100 Subject: [PATCH 438/539] [AllTest] Continued: refactoring Job projections. --- .../java/org/scribble/ast/AstFactory.java | 7 +- .../org/scribble/ast/DisconnectAction.java | 2 +- .../java/org/scribble/ast/local/LAcc.java | 5 +- .../org/scribble/ast/local/LClientWrap.java | 3 +- .../org/scribble/ast/local/LDisconnect.java | 7 ++ .../java/org/scribble/ast/local/LRecv.java | 9 +- .../java/org/scribble/ast/local/LReq.java | 5 +- .../org/scribble/ast/local/LServerWrap.java | 2 +- .../src/main/java/org/scribble/job/Job.java | 8 +- .../scribble/util/LProjectionTranslator.java | 84 ++++++++++++++++++- .../java/org/scribble/cli/CommandLine.java | 3 +- .../java/org/scribble/util/Constants.java | 2 + .../java/org/scribble/ast/AstFactoryImpl.java | 8 +- scribble-test/src/test/scrib/tmp/Test.scr | 8 +- 14 files changed, 113 insertions(+), 40 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index e758d7055..678a1979b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -135,8 +135,7 @@ GMsgTransfer GMsgTransfer(Token t, RoleNode src, MsgNode msg, GWrap GWrap(Token t, RoleNode client, RoleNode server); GContinue GContinue(Token t, RecVarNode rv); - GDo GDo(Token t, RoleArgList rs, NonRoleArgList args, - GProtoNameNode proto); + GDo GDo(Token t, GProtoNameNode proto, NonRoleArgList args, RoleArgList rs); RoleArgList RoleArgList(Token t, List rs); RoleArg RoleArg(Token t, RoleNode r); @@ -161,7 +160,7 @@ LProtoHeader LProtoHeader(Token t, LProtoNameNode name, RoleDeclList rs, LProtoBlock LProtoBlock(Token t, LInteractionSeq seq); LInteractionSeq LInteractionSeq(Token t, List elems); - // CHECKME: refactor with self arg? -- cf. core local types + // CHECKME: refactor with self arg? -- cf. core local types -- yes: FIXME LSend LSend(Token t, RoleNode src, MsgNode msg, RoleNode dst); LRecv LRecv(Token t, RoleNode src, MsgNode msg, RoleNode dst); LAcc LAcc(Token t, RoleNode src, MsgNode msg, RoleNode dst); @@ -171,7 +170,7 @@ LProtoHeader LProtoHeader(Token t, LProtoNameNode name, RoleDeclList rs, LServerWrap LServerWrap(Token t, RoleNode client, RoleNode server); LContinue LContinue(Token t, RecVarNode rv); - LDo LDo(Token t, RoleArgList rs, NonRoleArgList as, LProtoNameNode proto); + LDo LDo(Token t, LProtoNameNode proto, NonRoleArgList as, RoleArgList rs); LChoice LChoice(Token t, RoleNode subj, List blocks); LRecursion LRecursion(Token t, RecVarNode rv, LProtoBlock block); diff --git a/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java b/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java index d80f3c5fb..2d4befc1d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DisconnectAction.java @@ -81,6 +81,6 @@ public DisconnectAction visitChildren(AstVisitor nv) public String toString() { return Constants.DISCONNECT_KW + " " + getLeftChild() - + " " + Constants.TO_KW + " " + getRightChild() + ";"; + + " " + Constants.AND_KW + " " + getRightChild() + ";"; } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LAcc.java b/scribble-ast/src/main/java/org/scribble/ast/local/LAcc.java index 698e0da66..72b7f38d1 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LAcc.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LAcc.java @@ -46,8 +46,7 @@ public void decorateDel(DelFactory df) @Override public String toString() { - return (isUnitMessage() ? "" : getMessageNodeChild() + " ") - + Constants.ACCEPT_KW + " " + Constants.FROM_KW - + " " + getSourceChild() + ";"; + return (isUnitMessage() ? "" : getMessageNodeChild() + " ") // TODO: deprecate ommitted "()" special case + + Constants.ACCEPT_KW + " " + getSourceChild() + ";"; } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LClientWrap.java b/scribble-ast/src/main/java/org/scribble/ast/local/LClientWrap.java index a2e622c6f..117d9f688 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LClientWrap.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LClientWrap.java @@ -91,7 +91,6 @@ public LClientWrap visitChildren(AstVisitor nv) throws ScribException @Override public String toString() { - return Constants.WRAP_KW + " " + Constants.TO_KW + " " + getClientChild() - + ";"; + return Constants.CLIENTWRAP_KW + getServerChild() + ";"; } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java b/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java index 2f0fcf9eb..ddd7d1b22 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java @@ -17,6 +17,7 @@ import org.scribble.ast.DisconnectAction; import org.scribble.core.type.kind.Local; import org.scribble.del.DelFactory; +import org.scribble.util.Constants; public class LDisconnect extends DisconnectAction implements LSimpleSessionNode @@ -44,4 +45,10 @@ public LDisconnect dupNode() { return new LDisconnect(this); } + + @Override + public String toString() + { + return Constants.DISCONNECT_KW + " " + getRightChild() + ";"; // FIXME: make explicit, using right as peer (cf. core.type) + } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java b/scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java index c60418808..d5b016b43 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java @@ -13,8 +13,6 @@ */ package org.scribble.ast.local; -import java.util.stream.Collectors; - import org.antlr.runtime.Token; import org.scribble.del.DelFactory; import org.scribble.util.Constants; @@ -48,10 +46,7 @@ public void decorateDel(DelFactory df) @Override public String toString() { - return getMessageNodeChild() + " " + Constants.FROM_KW - + " " - + getDestinationChildren().stream().map(x -> x.toString()) - .collect(Collectors.joining(", ")) - + ";"; + return getMessageNodeChild() + " " + Constants.FROM_KW + " " + + getSourceChild() + ";"; } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LReq.java b/scribble-ast/src/main/java/org/scribble/ast/local/LReq.java index 9292f1a39..6bed36e84 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LReq.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LReq.java @@ -46,8 +46,7 @@ public void decorateDel(DelFactory df) @Override public String toString() { - return (isUnitMessage() ? "" : getMessageNodeChild() + " ") - + Constants.REQUEST_KW + " " + Constants.TO_KW - + " " + getDestinationChild() + ";"; + return (isUnitMessage() ? "" : getMessageNodeChild() + " ") // TODO: deprecate ommitted "()" special case + + Constants.REQUEST_KW + " " + getDestinationChild() + ";"; } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LServerWrap.java b/scribble-ast/src/main/java/org/scribble/ast/local/LServerWrap.java index 17f57b599..32dc8ae06 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LServerWrap.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LServerWrap.java @@ -92,6 +92,6 @@ public LServerWrap visitChildren(AstVisitor nv) throws ScribException @Override public String toString() { - return Constants.WRAP_KW + " " + getClientChild() + ";"; + return Constants.SERVERWRAP_KW + " " + getClientChild() + ";"; } } diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index aec7bcfa5..a918ec63b 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -150,19 +150,17 @@ public Map getProjections(GProtoName fullname, Map, LProjection> projs = getCore() .getProjections(fullname, self); - /*Map, LProjectionDecl> projs = getCore() - .getProjections(fullname, self).entrySet().stream() - .collect(Collectors.toMap(Entry::getKey, x -> t.translate(x.getValue())));*/ - Map, Module> projmods = new HashMap<>(); for (ProtoName pfullname : projs.keySet()) { + LProjection proj = projs.get(pfullname); + ModuleNameNode modn = this.config.af.ModuleNameNode(null, IdNode.from(this.config.af, pfullname.getPrefix().getElements())); ModuleDecl modd = this.config.af.ModuleDecl(null, modn); List> imports = Collections.emptyList(); // FIXME TODO List> nonprotos = Collections.emptyList(); // FIXME TODO - List protos = Arrays.asList(t.translate(projs.get(pfullname))); + List protos = Arrays.asList(t.translate(proj)); Module mod = this.config.af.Module(null, modd, imports, nonprotos, protos); projmods.put(pfullname, mod); } diff --git a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java index 34e5bf4fe..072efb353 100644 --- a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java @@ -20,12 +20,16 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MsgNode; +import org.scribble.ast.NonRoleArg; +import org.scribble.ast.NonRoleArgList; +import org.scribble.ast.NonRoleArgNode; import org.scribble.ast.NonRoleParamDecl; import org.scribble.ast.NonRoleParamDeclList; import org.scribble.ast.PayElem; import org.scribble.ast.PayElemList; import org.scribble.ast.ProtoMod; import org.scribble.ast.ProtoModList; +import org.scribble.ast.RoleArgList; import org.scribble.ast.RoleDeclList; import org.scribble.ast.local.LProjectionDecl; import org.scribble.ast.local.LProtoBlock; @@ -37,16 +41,21 @@ import org.scribble.ast.name.qualified.LProtoNameNode; import org.scribble.ast.name.simple.DataParamNode; import org.scribble.ast.name.simple.IdNode; +import org.scribble.ast.name.simple.OpNode; import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; import org.scribble.core.lang.ProtocolMod; import org.scribble.core.lang.local.LProjection; +import org.scribble.core.type.kind.DataKind; +import org.scribble.core.type.kind.NonRoleArgKind; import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.PayElemType; import org.scribble.core.type.name.SigName; +import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Msg; import org.scribble.core.type.session.SigLit; import org.scribble.core.type.session.local.LAcc; @@ -130,10 +139,10 @@ protected MsgNode translate(Msg msg) if (msg.isSigLit()) { SigLit cast = (SigLit) msg; + OpNode op = this.af.OpNode(null, cast.op.toString()); PayElemList pay = this.af.PayElemList(null, cast.payload.elems.stream() .map(x -> translate(x)).collect(Collectors.toList())); - return this.af.SigLitNode(null, this.af.OpNode(null, cast.op.toString()), - pay); + return this.af.SigLitNode(null, op, pay); } else { @@ -195,11 +204,78 @@ protected org.scribble.ast.local.LRecv translate(LRecv t) protected org.scribble.ast.local.LDisconnect translate(LDisconnect t) { - RoleNode self = this.af.RoleNode(null, t.left.toString()); - RoleNode peer = this.af.RoleNode(null, t.right.toString()); + RoleNode self = this.af.RoleNode(null, t.left.toString()); // FIXME: remove explicit self parsing from all I/O actions + RoleNode peer = this.af.RoleNode(null, t.getPeer().toString()); return this.af.LDisconnect(null, self, peer); } + protected org.scribble.ast.local.LContinue translate(LContinue t) + { + RecVarNode rv = this.af.RecVarNode(null, t.recvar.toString()); + return this.af.LContinue(null, rv); + } + + protected org.scribble.ast.local.LDo translate(LDo t) + { + List args = new LinkedList<>(); + for (Arg p : t.args) + { + NonRoleArgKind k = p.getKind(); + NonRoleArgNode a; + if (k.equals(SigKind.KIND)) + { + if (p instanceof SigLit) + { + SigLit cast = (SigLit) p; + OpNode op = this.af.OpNode(null, cast.op.toString()); + PayElemList pay = this.af.PayElemList(null, cast.payload.elems + .stream().map(x -> translate(x)).collect(Collectors.toList())); + a = this.af.SigLitNode(null, op, pay); // FIXME: could need to be SigParamNode + } + else if (p instanceof SigName) + { + a = this.af.SigNameNode(null, + IdNode.from(this.af, ((SigName) p).getElements())); + // FIXME: could need to be SigParamNode + } + else + { + throw new RuntimeException( + "Shouldn't get in here: " + p.getClass() + "\n\t" + p); + } + } + else if (k.equals(DataKind.KIND)) + { + if (p instanceof DataName) + { + a = this.af.DataNameNode(null, + IdNode.from(this.af, ((SigName) p).getElements())); + // FIXME: could need to be DataParamNode + } + else + { + throw new RuntimeException( + "[TODO] : " + p.getClass() + "\n\t" + p); + } + } + else + { + throw new RuntimeException( + "[TODO] Unsupported kind: " + p.getClass() + "\n\t" + p); + } + args.add(this.af.NonRoleArg(null, a)); + } + NonRoleArgList as = this.af.NonRoleArgList(null, args); + + LProtoNameNode proto = this.af.LProtoNameNode(null, + IdNode.from(this.af, t.proto.getElements())); + RoleArgList rs = this.af.RoleArgList(null, // Cf. translate(LProjectionDecl) + t.roles.stream().map( + x -> this.af.RoleArg(null, this.af.RoleNode(null, x.toString()))) // CHECKME: special "self" node? + .collect(Collectors.toList())); + return this.af.LDo(null, proto, as, rs); + } + protected org.scribble.ast.local.LChoice translate(LChoice t) { RoleNode subj = this.af.RoleNode(null, t.subj.toString()); // CHECKME: subj's already always fixed? diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index a6f1e2731..7cee9cbdd 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -307,8 +307,7 @@ private void printProjection(Job job, String[] args) { GProtoName fullname = checkGlobalProtocolArg(jobc, args[i]); Role role = checkRoleArg(jobc, fullname, args[i+1]); - Map projections = job.getProjections(fullname, - role); // FIXME: generate and output Module container -- should be done via Lang? + Map projections = job.getProjections(fullname, role); // FIXME: generate and output Module container -- should be done via Job? System.out.println("\n" + projections.values().stream() .map(p -> p.toString()).collect(Collectors.joining("\n\n"))); } diff --git a/scribble-core/src/main/java/org/scribble/util/Constants.java b/scribble-core/src/main/java/org/scribble/util/Constants.java index 49ade36ac..2187afc7e 100644 --- a/scribble-core/src/main/java/org/scribble/util/Constants.java +++ b/scribble-core/src/main/java/org/scribble/util/Constants.java @@ -55,4 +55,6 @@ public class Constants //public static final String SPAWN_KW = "spawn"; public static final String REQUEST_KW = "request"; + public static final String CLIENTWRAP_KW = "cwrap"; + public static final String SERVERWRAP_KW = "swrap"; } diff --git a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index dccd5fe03..95bf3a6fa 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -571,8 +571,8 @@ public GContinue GContinue(Token t, RecVarNode rv) } @Override - public GDo GDo(Token t, RoleArgList rs, NonRoleArgList as, - GProtoNameNode proto) + public GDo GDo(Token t, GProtoNameNode proto, NonRoleArgList as, + RoleArgList rs) { t = newToken(t, ScribbleParser.GDO); GDo n = new GDo(t); @@ -774,8 +774,8 @@ public LContinue LContinue(Token t, RecVarNode rv) } @Override - public LDo LDo(Token t, RoleArgList rs, NonRoleArgList as, - LProtoNameNode proto) + public LDo LDo(Token t, LProtoNameNode proto, NonRoleArgList as, + RoleArgList rs) { t = newToken(t, ScribbleParser.LDO); LDo n = new LDo(t); diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index ee7b1fb65..46049ba23 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -116,7 +116,7 @@ module tmp.Test; data "..." from "..." as T; -//* +/* global protocol Proto1(role A, role B, role C, role D) { rec X @@ -279,10 +279,10 @@ global protocol Proto1(role A, role B, role C) } //*/ -/* +//* global protocol Proto1(role A, role B, role C) { - choice at A // TODO: add junit test, testing core inlined projection choice subjects (for C) -- already exists? + choice at A // TODO: add junit test, testing core inlined projection choice subjects (for C) -- test already exists? { 1() from A to B; 1() from B to C; @@ -452,7 +452,7 @@ explicit global protocol Foo(role A, role B) /* global protocol Foo(role A, role B, role C) { - 1() from A to B; + 1() from A to B; // Testing LProjectionTranslator, onto B do Bar(A, C); } From ef04dd0c7251026e9d808318d9b2118a21477361 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 13:42:56 +0100 Subject: [PATCH 439/539] [AllTest] Minor. --- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 46049ba23..c41ce3fc6 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -282,7 +282,7 @@ global protocol Proto1(role A, role B, role C) //* global protocol Proto1(role A, role B, role C) { - choice at A // TODO: add junit test, testing core inlined projection choice subjects (for C) -- test already exists? + choice at A // TODO: add junit test, testing core inlined projection choice subjects (for C) -- test already exists? // Also testing imed projections { 1() from A to B; 1() from B to C; From cd65da11a3e60badacedba65b0e56a4012ef0594 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 14:56:28 +0100 Subject: [PATCH 440/539] [AllTest] Adding projected subproto choice-subj fixing. --- .../java/org/scribble/core/lang/Protocol.java | 12 +-- .../scribble/core/lang/global/GProtocol.java | 4 +- .../scribble/core/lang/local/LProtocol.java | 12 ++- .../visit/global/GTypeVisitorFactory.java | 2 +- .../visit/global/GTypeVisitorFactoryImpl.java | 4 +- ...{Projector.java => SubprotoProjector.java} | 10 +-- .../local/InlinedExtChoiceSubjFixer.java | 30 ++++--- .../local/SubprotoExtChoiceSubjFixer.java | 83 +++++++++++++++++++ 8 files changed, 130 insertions(+), 27 deletions(-) rename scribble-core/src/main/java/org/scribble/core/visit/global/{Projector.java => SubprotoProjector.java} (90%) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java diff --git a/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java index cfc26fd3b..8533dea67 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java @@ -22,9 +22,9 @@ import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.MemberName; -import org.scribble.core.type.name.SigName; import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.SigName; import org.scribble.core.type.session.Seq; import org.scribble.core.visit.STypeInliner; import org.scribble.core.visit.STypeUnfolder; @@ -45,7 +45,8 @@ public abstract class Protocol public final B def; public Protocol(CommonTree source, List mods, N fullname, - List roles, List> params, B def) + List roles, List> params, + B def) { this.source = source; // CHECKME: factor out with SType(Base) ? this.mods = Collections.unmodifiableList(mods); @@ -55,9 +56,10 @@ public Protocol(CommonTree source, List mods, N fullname, this.def = def; } - /*public abstract Protocol reconstruct(ProtocolDecl source, + // N.B. LProtocol has an additional "self" field, reconstruct pattern not perfect + public abstract Protocol reconstruct(CommonTree source, List mods, N fullname, List roles, - List> params, B def);*/ + List> params, B def); public boolean isAux() { @@ -69,8 +71,6 @@ public boolean isExplicit() return this.mods.contains(ProtocolMod.EXPLICIT); } - //public abstract Protocol getInlined(STypeInliner v); - //public abstract Protocol unfoldAllOnce(STypeUnfolder u); public abstract Protocol getInlined(STypeInliner v); public abstract Protocol unfoldAllOnce(STypeUnfolder v); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index daf6d047c..99e76d8f1 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -60,6 +60,7 @@ public GProtocol(CommonTree source, List mods, super(source, mods, fullname, roles, params, def); } + @Override public GProtocol reconstruct(CommonTree source, List mods, GProtoName fullname, List roles, List> params, GSeq def) @@ -169,7 +170,8 @@ else if (n instanceof SigName) .collect(Collectors.toSet()); List rs = this.roles.stream().filter(x -> used.contains(x)) // Prune role decls -- CHECKME: what is an example? was this from before unused role checking? .collect(Collectors.toList()); - return new GProtocol(getSource(), this.mods, this.fullname, rs, + return //new GProtocol + reconstruct(getSource(), this.mods, this.fullname, rs, this.params, def); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 4352d1fa7..547b1e3c7 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -57,6 +57,15 @@ public LProtocol(CommonTree source, List mods, this.self = self; } + @Override + public LProtocol reconstruct(CommonTree source, + List mods, LProtoName fullname, List roles, + //Role self, // CHECKME: reconstruct pattern not working here? + List> params, LSeq def) + { + return reconstruct(source, mods, fullname, roles, this.self, params, def); // N.B. this.self + } + public LProtocol reconstruct(CommonTree source, List mods, LProtoName fullname, List roles, Role self, List> params, LSeq def) @@ -110,7 +119,8 @@ else if (n instanceof SigName) .collect(Collectors.toSet()); List rs = this.roles.stream().filter(x -> used.contains(x)) // Prune role decls .collect(Collectors.toList());*/ - return new LProtocol(getSource(), this.mods, this.fullname, this.roles, + return //new LProtocol + reconstruct(getSource(), this.mods, this.fullname, this.roles, this.self, this.params, def); // CHECKME: or null source? } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeVisitorFactory.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeVisitorFactory.java index e2654aed1..585539d7b 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeVisitorFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeVisitorFactory.java @@ -35,6 +35,6 @@ ExtChoiceConsistencyChecker ExtChoiceConsistencyChecker( InlinedProjector InlinedProjector(Core core, Role self); // CHECKME: deprecate? - Projector Projector(Core core, Role self); + SubprotoProjector Projector(Core core, Role self); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeVisitorFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeVisitorFactoryImpl.java index 74a0a4995..5d481ab5e 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeVisitorFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/GTypeVisitorFactoryImpl.java @@ -61,9 +61,9 @@ public InlinedProjector InlinedProjector(Core core, Role self) // CHECKME: deprecate? @Override - public Projector Projector(Core core, Role self) + public SubprotoProjector Projector(Core core, Role self) { - return new Projector(core, self); + return new SubprotoProjector(core, self); } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java similarity index 90% rename from scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java rename to scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java index 549655c4c..8d20ef262 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/Projector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java @@ -31,23 +31,23 @@ import org.scribble.core.type.session.local.LType; // Supports Do -- can use on parsed (intermed) -public class Projector extends InlinedProjector // CHECKME: this way, or the other way round? +public class SubprotoProjector extends InlinedProjector // CHECKME: this way, or the other way round? { - protected Projector(Core core, Role self) + protected SubprotoProjector(Core core, Role self) { super(core, self); } // Copy constructor for dup - protected Projector(Projector v) + protected SubprotoProjector(SubprotoProjector v) { super(v); } @Override - protected Projector dup() + protected SubprotoProjector dup() { - return new Projector(this); + return new SubprotoProjector(this); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java index 671c989d3..c10144549 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java @@ -39,7 +39,7 @@ // (Doing "at the time" during projection requires, e.g., recursion body projections for "inference" on recursion entry, but the body can't really be projected yet without that upfront "inference") public class InlinedExtChoiceSubjFixer extends STypeVisitorNoThrow { - private Map> recs = new HashMap<>(); + protected Map> recs = new HashMap<>(); // Record on entering rec states, to give to InlinedEnablerInferer on nested choice states (for unguarded continues) // CHECKME: Optional necessary? InlinedEnablerInferer may not succeed due to empty/bad contexts, but should that be reflected here? @@ -47,13 +47,20 @@ protected InlinedExtChoiceSubjFixer() { } + + // To override for handling subproto + // Takes "this" (cf. this.recs), better pattern for extensibility + protected InlinedEnablerInferer getInferer(InlinedExtChoiceSubjFixer v)//Map> recs) + { + return new InlinedEnablerInferer(this); + } @Override public Choice visitChoice(Choice n) { - InlinedEnablerInferer v = new InlinedEnablerInferer(this.recs); - Optional subj = n.visitWithNoThrow(v); - return n.reconstruct(n.getSource(), subj.get(), n.blocks); + InlinedEnablerInferer v = getInferer(this); + Role subj = n.visitWithNoThrow(v).get(); // WF ensures result + return n.reconstruct(n.getSource(), subj, n.blocks); } @Override @@ -65,21 +72,22 @@ public SType visitDo(Do n) @Override public Recursion visitRecursion(Recursion n) { - Optional r = new InlinedEnablerInferer(this.recs).visitSeq(n.body); // this.recs necessary? - this.recs.put(n.recvar, r); // null, empty or OK - return n.reconstruct(n.getSource(), n.recvar, visitSeq(n.body)); + InlinedEnablerInferer v = getInferer(this); // Pattern: Inferer to access (and copy) this.recs directly + Optional res = v.visitSeq(n.body); // Can be empty or OK + this.recs.put(n.recvar, res); + LSeq body = visitSeq(n.body); + return n.reconstruct(n.getSource(), n.recvar, body); } } -class InlinedEnablerInferer - extends STypeAggNoThrow> +class InlinedEnablerInferer extends STypeAggNoThrow> // Optional.empty signifies "inference" did not succeed, either an outright bad (should be caught by WF somewhere) or an "empty" context { private Map> recs; - public InlinedEnablerInferer(Map> recs) + public InlinedEnablerInferer(InlinedExtChoiceSubjFixer v)//Map> recs) { - this.recs = Collections.unmodifiableMap(recs); + this.recs = Collections.unmodifiableMap(v.recs); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java new file mode 100644 index 000000000..742503902 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java @@ -0,0 +1,83 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.visit.local; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +import org.scribble.core.lang.Protocol; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.LProtoName; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.local.LSeq; + +// super takes care of rec/continue, here just additionally handle "do" +public class SubprotoExtChoiceSubjFixer extends InlinedExtChoiceSubjFixer +{ + protected Map> protos = new HashMap<>(); + + protected SubprotoExtChoiceSubjFixer() + { + + } + + // To visit top-level proto, reconstruct for fixed subjs -- nested visting (by Inferer) only does passive inference (no reconstruct) + protected Protocol visitProtocol( + Protocol n) + { + // Cf. InlinedExtChoiceSubjFixer.visitRecursion + InlinedEnablerInferer v = getInferer(this); + Optional res = v.visitSeq(n.def); + this.protos.put(n.fullname, res); + LSeq def = visitSeq(n.def); + return n.reconstruct(n.getSource(), n.mods, n.fullname, n.roles, n.params, + def); + // N.B. this reconstruct implicitly retains n.self + } + + @Override + protected SubprotoEnablerInferer getInferer(InlinedExtChoiceSubjFixer v) + { + return new SubprotoEnablerInferer(v); + } + + @Override + public SType visitDo(Do n) + { + return unit(n); // From STypeAggNoThrow + } +} + +class SubprotoEnablerInferer extends InlinedEnablerInferer // super takes care of rec/continue +{ + private Map> protos = new HashMap<>(); + + public SubprotoEnablerInferer(InlinedExtChoiceSubjFixer v) + { + super(v); + } + + @Override + public Optional visitDo(Do n) + { + if (this.protos.containsKey(n.proto)) + { + return this.protos.get(n.proto); + } + throw new RuntimeException("[TODO] : " + n); + } +} From 4d86c59dc9c866937eebb7dc4548a516301ab081 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 15:19:02 +0100 Subject: [PATCH 441/539] [AllTest] Continued: projected subproto choice-subj fixing. --- .../scribble/util/LProjectionTranslator.java | 8 ++-- .../scribble/core/lang/global/GProtocol.java | 10 ++++- .../core/visit/local/LTypeVisitorFactory.java | 2 + .../visit/local/LTypeVisitorFactoryImpl.java | 6 +++ .../local/SubprotoExtChoiceSubjFixer.java | 8 +++- scribble-test/src/test/scrib/tmp/Test.scr | 43 ++++++++++++++++++- 6 files changed, 68 insertions(+), 9 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java index 072efb353..1fdae423a 100644 --- a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java @@ -88,7 +88,7 @@ public LProjectionDecl translate(LProjection ltype) { RoleDeclList rs = this.af.RoleDeclList(null, ltype.roles.stream().map( - x -> this.af.RoleDecl(null, this.af.RoleNode(null, x.toString()))) // CHECKME: special "self" node? + x -> this.af.RoleDecl(null, this.af.RoleNode(null, x.toString()))) // FIXME: special "self" node? .collect(Collectors.toList())); List> pds = new LinkedList<>(); for (MemberName p : ltype.params) @@ -115,7 +115,7 @@ else if (p instanceof DataName) .map(x -> translate(x)).collect(Collectors.toList())); GProtoNameNode global = this.af.GProtoNameNode(null, IdNode.from(this.af, ltype.global.getElements())); - RoleNode self1 = this.af.RoleNode(null, ltype.self.toString()); // CHECKME: special "self" node? + RoleNode self1 = this.af.RoleNode(null, ltype.self.toString()); // FIXME: special "self" node? LProtoNameNode projFullname = this.af.LProtoNameNode(null, IdNode.from(this.af, ltype.fullname.getElements())); LProtoHeader header = this.af.LProtoHeader(null, projFullname, rs, ps); @@ -168,7 +168,7 @@ protected PayElem translate(PayElemType e) } } - // CHECKME: in following, special "self" nodes? + // FIXME: in following, special "self" nodes? protected org.scribble.ast.local.LAcc translate(LAcc t) { @@ -271,7 +271,7 @@ else if (k.equals(DataKind.KIND)) IdNode.from(this.af, t.proto.getElements())); RoleArgList rs = this.af.RoleArgList(null, // Cf. translate(LProjectionDecl) t.roles.stream().map( - x -> this.af.RoleArg(null, this.af.RoleNode(null, x.toString()))) // CHECKME: special "self" node? + x -> this.af.RoleArg(null, this.af.RoleNode(null, x.toString()))) // FIXME: special "self" node? .collect(Collectors.toList())); return this.af.LDo(null, proto, as, rs); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 99e76d8f1..94d715e77 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -105,12 +105,18 @@ public LProjection projectInlined(Core core, Role self) public LProjection project(Core core, Role self) { LSeq def = core.config.vf.global.Projector(core, self).visitSeq(this.def); - // FIXME: ext choice subj fixing, do pruning -- refactor to Job and use AstVisitor? - return projectAux(core, self, + LProjection proj = projectAux(core, self, core.getContext().getInlined(this.fullname).roles, // Using inlined global, global role decls already pruned -- CHECKME: is this still relevant? // Actual projection role decl pruning done by projectAux def); + + // FIXME: ext choice subj fixing, do pruning -- refactor to Job and use AstVisitor? + + // N.B. must do top-level entry on projection, cf. projectInlined + LProjection fixed = (LProjection) core.config.vf.local + .SubprotoExtChoiceSubjFixer().visitProtocol(proj); + return fixed; } private LProjection projectAux(Core core, Role self, List decls, diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java index 005bb3f96..6d15737e4 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java @@ -23,4 +23,6 @@ public interface LTypeVisitorFactory ReachabilityChecker ReachabilityChecker(); EGraphBuilder EGraphBuilder(Core core); + + SubprotoExtChoiceSubjFixer SubprotoExtChoiceSubjFixer(); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java index 3d3fb2968..c026c9fed 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java @@ -35,4 +35,10 @@ public EGraphBuilder EGraphBuilder(Core core) { return new EGraphBuilder(core); } + + @Override + public SubprotoExtChoiceSubjFixer SubprotoExtChoiceSubjFixer() + { + return new SubprotoExtChoiceSubjFixer(); + } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java index 742503902..7cbf23ee5 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java @@ -13,6 +13,7 @@ */ package org.scribble.core.visit.local; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -36,7 +37,8 @@ protected SubprotoExtChoiceSubjFixer() } // To visit top-level proto, reconstruct for fixed subjs -- nested visting (by Inferer) only does passive inference (no reconstruct) - protected Protocol visitProtocol( + // Must enter here, for initial this.protos entry + public Protocol visitProtocol( Protocol n) { // Cf. InlinedExtChoiceSubjFixer.visitRecursion @@ -69,6 +71,8 @@ class SubprotoEnablerInferer extends InlinedEnablerInferer // super takes care public SubprotoEnablerInferer(InlinedExtChoiceSubjFixer v) { super(v); + this.protos = Collections + .unmodifiableMap(((SubprotoExtChoiceSubjFixer) v).protos); } @Override @@ -78,6 +82,6 @@ public Optional visitDo(Do n) { return this.protos.get(n.proto); } - throw new RuntimeException("[TODO] : " + n); + throw new RuntimeException("[TODO] : " + n.proto + " ,, " + this.protos); } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index c41ce3fc6..7ce9cb7a1 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -116,6 +116,47 @@ module tmp.Test; data "..." from "..." as T; +/* +global protocol Proto1(role A, role B, role C) +{ + choice at A + { + 1() from A to B; + 1() from B to C; + } + or + { + 2() from A to B; + 2() from B to C; + do Proto1(A, B, C); // Testing SubprotoExtChoiceSubjFixer, "reverse" do-ref + } +} + +aux global protocol Proto1Aux(role B, role C) +{ + 2() from B to C; +} +//*/ + + +//* +global protocol Proto1(role A, role B, role C) +{ + 1() from A to B; + 1() from B to C; + choice at A + { + 2() from A to B; + 2() from B to C; + } + or + { + do Proto1(A, B, C); // Testing SubprotoExtChoiceSubjFixer, "reverse" do-ref + } +} +//*/ + + /* global protocol Proto1(role A, role B, role C, role D) { @@ -279,7 +320,7 @@ global protocol Proto1(role A, role B, role C) } //*/ -//* +/* global protocol Proto1(role A, role B, role C) { choice at A // TODO: add junit test, testing core inlined projection choice subjects (for C) -- test already exists? // Also testing imed projections From 75c684d84b3bb0b7f5eaceef0946f09ff73afe29 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 16:31:36 +0100 Subject: [PATCH 442/539] [WIP] Continued: projected subproto choice-subj fixing. --- .../main/java/org/scribble/core/job/Core.java | 21 +++++++- .../org/scribble/core/job/CoreContext.java | 8 +++ .../scribble/core/lang/global/GProtocol.java | 6 +-- .../local/InlinedExtChoiceSubjFixer.java | 4 +- .../core/visit/local/LTypeVisitorFactory.java | 2 +- .../visit/local/LTypeVisitorFactoryImpl.java | 4 +- .../local/SubprotoExtChoiceSubjFixer.java | 24 ++++++--- scribble-test/src/test/scrib/tmp/Test.scr | 51 +++++++++++++++++-- 8 files changed, 100 insertions(+), 20 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index d72c6ac27..614da60c2 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -43,6 +43,7 @@ import org.scribble.core.visit.gather.RoleGatherer; import org.scribble.core.visit.global.GTypeVisitorFactoryImpl; import org.scribble.core.visit.local.LTypeVisitorFactoryImpl; +import org.scribble.core.visit.local.SubprotoExtChoiceSubjFixer; import org.scribble.util.ScribException; // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models @@ -205,17 +206,35 @@ protected void runProjectionPasses() // No ScribException, no errors expected } // Pre: inlined already projected -- used for Do projection + // N.B. no "fixing" passes done within here -- need breadth-first passes to be sequentialised for subproto visiting (see below) verbosePrintPass("Projecting all intermediate globals..."); for (ProtoName fullname : this.context.getParsedFullnames()) { GProtocol imed = this.context.getIntermediate(fullname); for (Role self : imed.roles) { - LProjection proj = this.context.getProjection(imed.fullname, self); + LProjection proj = this.context.getProjection(fullname, self); verbosePrintPass("Projected intermediate onto " + self + ": " + imed.fullname + "\n" + proj); } } + + verbosePrintPass("\"Fixing\" all projected intermediates..."); + SubprotoExtChoiceSubjFixer v = this.config.vf.local + .SubprotoExtChoiceSubjFixer(this); // Reusable (via top-level visitProtocol) + for (ProtoName fullname : this.context.getParsedFullnames()) + { + GProtocol imed = this.context.getIntermediate(fullname); + for (Role self : imed.roles) + { + LProjection proj = this.context.getProjection(fullname, self); + LProjection fixed = (LProjection) v.visitProtocol(proj); + this.context.setProjection(fixed); // N.B. replaces existing projection + verbosePrintPass( + "Fixed external choice subjects for projected intermediate: " + + fixed.fullname + ":\n" + fixed); + } + } } // Pre: runGlobalSyntaxWfPasses diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index 60d50c969..de7bda945 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -206,6 +206,7 @@ public LProjection getProjection(ProtoName fullname, Role self) return proj; } + // Pre: addProjectedInlined (i.e., getProjection(ProtoName, Role)) public LProjection getProjection(ProtoName fullname) { LProjection proj = this.projs.get(fullname); @@ -222,6 +223,13 @@ protected void addProjection(LProjection proj) this.projs.put(proj.fullname, proj); } + // N.B. mutates this.projected -- used by "fixing" passes + // TODO refactor (overall, into Job) + public void setProjection(LProjection proj) + { + this.projs.put(proj.fullname, proj); + } + // N.B. graphs built from inlined (not unfolded) public EGraph getEGraph(ProtoName fullname, Role self) { diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 94d715e77..374bd3eda 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -102,6 +102,7 @@ public LProjection projectInlined(Core core, Role self) return projectAux(core, self, this.roles, fixed); } + // N.B. no "fixing" passes done here -- need breadth-first passes to be sequentialised for subproto visiting public LProjection project(Core core, Role self) { LSeq def = core.config.vf.global.Projector(core, self).visitSeq(this.def); @@ -114,9 +115,8 @@ public LProjection project(Core core, Role self) // FIXME: ext choice subj fixing, do pruning -- refactor to Job and use AstVisitor? // N.B. must do top-level entry on projection, cf. projectInlined - LProjection fixed = (LProjection) core.config.vf.local - .SubprotoExtChoiceSubjFixer().visitProtocol(proj); - return fixed; + //LProjection fixed = (LProjection) core.config.vf.local.SubprotoExtChoiceSubjFixer(core).visitProtocol(proj); + return proj; } private LProjection projectAux(Core core, Role self, List decls, diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java index c10144549..ac476256e 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/InlinedExtChoiceSubjFixer.java @@ -39,7 +39,7 @@ // (Doing "at the time" during projection requires, e.g., recursion body projections for "inference" on recursion entry, but the body can't really be projected yet without that upfront "inference") public class InlinedExtChoiceSubjFixer extends STypeVisitorNoThrow { - protected Map> recs = new HashMap<>(); + protected final Map> recs = new HashMap<>(); // Record on entering rec states, to give to InlinedEnablerInferer on nested choice states (for unguarded continues) // CHECKME: Optional necessary? InlinedEnablerInferer may not succeed due to empty/bad contexts, but should that be reflected here? @@ -83,7 +83,7 @@ public Recursion visitRecursion(Recursion n) class InlinedEnablerInferer extends STypeAggNoThrow> // Optional.empty signifies "inference" did not succeed, either an outright bad (should be caught by WF somewhere) or an "empty" context { - private Map> recs; + private final Map> recs; public InlinedEnablerInferer(InlinedExtChoiceSubjFixer v)//Map> recs) { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java index 6d15737e4..dece03cab 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java @@ -24,5 +24,5 @@ public interface LTypeVisitorFactory EGraphBuilder EGraphBuilder(Core core); - SubprotoExtChoiceSubjFixer SubprotoExtChoiceSubjFixer(); + SubprotoExtChoiceSubjFixer SubprotoExtChoiceSubjFixer(Core core); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java index c026c9fed..da89c31d1 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java @@ -37,8 +37,8 @@ public EGraphBuilder EGraphBuilder(Core core) } @Override - public SubprotoExtChoiceSubjFixer SubprotoExtChoiceSubjFixer() + public SubprotoExtChoiceSubjFixer SubprotoExtChoiceSubjFixer(Core core) { - return new SubprotoExtChoiceSubjFixer(); + return new SubprotoExtChoiceSubjFixer(core); } } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java index 7cbf23ee5..458e8f9cf 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java @@ -18,7 +18,9 @@ import java.util.Map; import java.util.Optional; +import org.scribble.core.job.Core; import org.scribble.core.lang.Protocol; +import org.scribble.core.lang.local.LProjection; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.Role; @@ -29,11 +31,13 @@ // super takes care of rec/continue, here just additionally handle "do" public class SubprotoExtChoiceSubjFixer extends InlinedExtChoiceSubjFixer { - protected Map> protos = new HashMap<>(); + protected final Core core; + + protected final Map> protos = new HashMap<>(); - protected SubprotoExtChoiceSubjFixer() + protected SubprotoExtChoiceSubjFixer(Core core) { - + this.core = core; } // To visit top-level proto, reconstruct for fixed subjs -- nested visting (by Inferer) only does passive inference (no reconstruct) @@ -41,6 +45,8 @@ protected SubprotoExtChoiceSubjFixer() public Protocol visitProtocol( Protocol n) { + this.protos.clear(); // Reusable + // Cf. InlinedExtChoiceSubjFixer.visitRecursion InlinedEnablerInferer v = getInferer(this); Optional res = v.visitSeq(n.def); @@ -66,13 +72,16 @@ public SType visitDo(Do n) class SubprotoEnablerInferer extends InlinedEnablerInferer // super takes care of rec/continue { - private Map> protos = new HashMap<>(); + private final Core core; + + private final Map> protos; public SubprotoEnablerInferer(InlinedExtChoiceSubjFixer v) { super(v); - this.protos = Collections - .unmodifiableMap(((SubprotoExtChoiceSubjFixer) v).protos); + SubprotoExtChoiceSubjFixer cast = (SubprotoExtChoiceSubjFixer) v; + this.core = cast.core; + this.protos = Collections.unmodifiableMap(cast.protos); } @Override @@ -82,6 +91,7 @@ public Optional visitDo(Do n) { return this.protos.get(n.proto); } - throw new RuntimeException("[TODO] : " + n.proto + " ,, " + this.protos); + LProjection imed = core.getContext().getProjection(n.proto); + return imed.def.visitWithNoThrow(this); // CHECKME: how about looking up subj from inlined? } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 7ce9cb7a1..06e00e0a2 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -116,6 +116,29 @@ module tmp.Test; data "..." from "..." as T; +/* +global protocol Proto1(role A, role B, role C) +{ + 1() from A to B; + 1() from B to C; + choice at A + { + 2() from A to B; + 2() from B to C; + } + or + { + do Proto1Aux(A, B, C); // Testing SubprotoExtChoiceSubjFixer, both "forwards" and "reverse" do-refs + } +} + +aux global protocol Proto1Aux(role A, role B, role C) +{ + do Proto1(A, B, C); +} +//*/ + + /* global protocol Proto1(role A, role B, role C) { @@ -126,14 +149,18 @@ global protocol Proto1(role A, role B, role C) } or { - 2() from A to B; - 2() from B to C; - do Proto1(A, B, C); // Testing SubprotoExtChoiceSubjFixer, "reverse" do-ref + do Proto1Aux(A, B, C); // Testing SubprotoExtChoiceSubjFixer, "forward" do-ref } } -aux global protocol Proto1Aux(role B, role C) +aux global protocol Proto1Aux(role A, role B, role C) +{ + do Proto1Aux1(A, B, C); +} + +aux global protocol Proto1Aux1(role A, role B, role C) { + 2() from A to B; 2() from B to C; } //*/ @@ -141,6 +168,22 @@ aux global protocol Proto1Aux(role B, role C) //* global protocol Proto1(role A, role B, role C) +{ + choice at A + { + 1() from A to B; + 1() from B to C; + } + or + { + do Proto1(A, B, C); // Testing SubprotoExtChoiceSubjFixer, need do-pruning as pre-req + } +} +//*/ + + +/* +global protocol Proto1(role A, role B, role C) { 1() from A to B; 1() from B to C; From 1d0eee9068db9ace94d9ff486d024c7976d12ca3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 22:26:39 +0100 Subject: [PATCH 443/539] [WIP] Adding projection subproto do-arg and do pruning. --- .../main/java/org/scribble/core/job/Core.java | 46 ++++++- .../org/scribble/core/lang/SubprotoSig.java | 3 +- .../scribble/core/lang/global/GProtocol.java | 5 +- .../core/type/name/Substitutions.java | 4 +- .../org/scribble/core/type/session/Do.java | 4 + .../core/type/session/global/GDo.java | 8 ++ .../scribble/core/type/session/local/LDo.java | 8 ++ .../scribble/core/visit/STypeAggNoThrow.java | 1 - .../core/visit/gather/RoleGatherer.java | 1 + .../core/visit/global/SubprotoProjector.java | 2 +- .../core/visit/local/LDoArgPruner.java | 115 ++++++++++++++++++ .../scribble/core/visit/local/LDoPruner.java | 103 ++++++++++++++++ .../core/visit/local/LTypeVisitorFactory.java | 4 + .../visit/local/LTypeVisitorFactoryImpl.java | 12 ++ .../local/SubprotoExtChoiceSubjFixer.java | 1 + .../visit/local/SubprotoRoleCollector.java | 87 +++++++++++++ 16 files changed, 394 insertions(+), 10 deletions(-) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoRoleCollector.java diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 614da60c2..f4bd1bc5c 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -14,6 +14,7 @@ package org.scribble.core.job; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -42,6 +43,8 @@ import org.scribble.core.visit.gather.NonProtoDepsGatherer; import org.scribble.core.visit.gather.RoleGatherer; import org.scribble.core.visit.global.GTypeVisitorFactoryImpl; +import org.scribble.core.visit.local.LDoArgPruner; +import org.scribble.core.visit.local.LDoPruner; import org.scribble.core.visit.local.LTypeVisitorFactoryImpl; import org.scribble.core.visit.local.SubprotoExtChoiceSubjFixer; import org.scribble.util.ScribException; @@ -219,8 +222,47 @@ protected void runProjectionPasses() // No ScribException, no errors expected } } + verbosePrintPass("Pruning do-args on all projected intermediates..."); + LDoArgPruner v1 = this.config.vf.local.LDoArgPruner(this); // Reusable + List pruned = new LinkedList<>(); + for (ProtoName fullname : this.context.getParsedFullnames()) + { + GProtocol imed = this.context.getIntermediate(fullname); + for (Role self : imed.roles) + { + LProjection proj = this.context.getProjection(fullname, self); + /*LSeq def = v1.visitSeq(proj.def); + LProjection fixed = proj.reconstruct(proj.getSource(), proj.mods, + proj.fullname, proj.roles, proj.self, proj.params, def);*/ + LProjection fixed = (LProjection) v1.visitProjection(proj); // TODO: refactor as LProjection/LProto meth, cf. GProto + pruned.add(fixed); // N.B. replaces existing projection + verbosePrintPass( + "Pruned do-args on projected intermediate: " + + fixed.fullname + ":\n" + fixed); + } + } + pruned.forEach(x -> this.getContext().setProjection(x)); + // Update after all visited, to prevent visiting an already pruned projdecl from breaking the pruning of a subsequent one (e.g., mutually recursive proto refs) + + verbosePrintPass("Do-pruning all projected intermediates..."); + LDoPruner v2 = this.config.vf.local.LDoPruner(this); // Reusable + for (ProtoName fullname : this.context.getParsedFullnames()) + { + GProtocol imed = this.context.getIntermediate(fullname); + for (Role self : imed.roles) + { + LProjection proj = this.context.getProjection(fullname, self); + //LSeq def = v2.visitSeq(proj.def); + LProjection fixed = proj;//proj.reconstruct(proj.getSource(), proj.mods, proj.fullname, proj.roles, proj.self, proj.params, def); + this.context.setProjection(fixed); // N.B. replaces existing projection + verbosePrintPass( + "Do-pruned projected intermediate: " + + fixed.fullname + ":\n" + fixed); + } + } + verbosePrintPass("\"Fixing\" all projected intermediates..."); - SubprotoExtChoiceSubjFixer v = this.config.vf.local + SubprotoExtChoiceSubjFixer v3 = this.config.vf.local .SubprotoExtChoiceSubjFixer(this); // Reusable (via top-level visitProtocol) for (ProtoName fullname : this.context.getParsedFullnames()) { @@ -228,7 +270,7 @@ protected void runProjectionPasses() // No ScribException, no errors expected for (Role self : imed.roles) { LProjection proj = this.context.getProjection(fullname, self); - LProjection fixed = (LProjection) v.visitProtocol(proj); + LProjection fixed = (LProjection) v3.visitProtocol(proj); this.context.setProjection(fixed); // N.B. replaces existing projection verbosePrintPass( "Fixed external choice subjects for projected intermediate: " diff --git a/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java index 51091457e..fb159d204 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java @@ -33,8 +33,7 @@ public class SubprotoSig // NonRoleParamKind, not NonRoleArgKind, because latter includes AmbigKind due to parsing requirements // Arg, not MemberName, because need to include MessageSigs (sig literals) - // public SubprotocolSignature(ProtocolName fmn, Scope scope, List - // roles, List> args) + // public SubprotocolSignature(ProtocolName fmn, Scope scope, List roles, List> args) public SubprotoSig(ProtoName fullname, List roles, List> args) { diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 374bd3eda..8a40ec1ad 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -119,16 +119,17 @@ public LProjection project(Core core, Role self) return proj; } + // Does rec and role pruning private LProjection projectAux(Core core, Role self, List decls, LSeq body) { LSeq pruned = core.config.vf.RecPruner().visitSeq(body); LProtoName fullname = InlinedProjector .getFullProjectionName(this.fullname, self); - Set tmp = pruned.gather(new RoleGatherer()::visit) + Set used = pruned.gather(new RoleGatherer()::visit) .collect(Collectors.toSet()); List roles = decls.stream() - .filter(x -> x.equals(self) || tmp.contains(x)) + .filter(x -> x.equals(self) || used.contains(x)) .collect(Collectors.toList()); List> params = new LinkedList<>(this.params); // CHECKME: filter params by usage? diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/Substitutions.java b/scribble-core/src/main/java/org/scribble/core/type/name/Substitutions.java index 246e32798..971af0bae 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/Substitutions.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/Substitutions.java @@ -40,12 +40,12 @@ public Substitutions(List rold, List rnew, if (rold.size() != rnew.size()) { throw new RuntimeException( - "Role lists don't match: " + rold + " ; " + rnew); + "Role list arity mismatch: " + rold + " ; " + rnew); } if (aold.size() != anew.size()) { throw new RuntimeException( - "Arg lists don't match: " + aold + " ; " + anew); + "Arg list arity mismatch: " + aold + " ; " + anew); } Iterator i = rnew.iterator(); rold.forEach(x -> this.rsubs.put(x, i.next())); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java index 7f87793bb..839cde50c 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/Do.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/Do.java @@ -20,6 +20,8 @@ import java.util.stream.Stream; import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.job.Core; +import org.scribble.core.lang.Protocol; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.kind.ProtoKind; import org.scribble.core.type.name.ProtoName; @@ -47,6 +49,8 @@ public Do(CommonTree source, ProtoName proto, /*// Not that useful: calling on Do doesn't give the overridden return public abstract ProtoName getProto(); // Override with concrete return*/ + + public abstract Protocol getTarget(Core core); // CHECKME: "?" public abstract Do reconstruct(CommonTree source, ProtoName proto, List roles, List> args); diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java index ffc178a2c..0b6dbf1a1 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/global/GDo.java @@ -16,6 +16,8 @@ import java.util.List; import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.job.Core; +import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.ProtoName; @@ -30,6 +32,12 @@ protected GDo(CommonTree source, ProtoName proto, { super(source, proto, roles, args); } + + @Override + public GProtocol getTarget(Core core) + { + return core.getContext().getIntermediate(this.proto); // Subproto visiting hardcoded to intermediate (i.e., parsed) + } @Override public GDo reconstruct(CommonTree source, diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java index da6f86721..5a2e61782 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDo.java @@ -16,6 +16,8 @@ import java.util.List; import org.antlr.runtime.tree.CommonTree; +import org.scribble.core.job.Core; +import org.scribble.core.lang.local.LProtocol; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.ProtoName; @@ -30,6 +32,12 @@ protected LDo(CommonTree source, ProtoName proto, { super(source, proto, roles, args); } + + @Override + public LProtocol getTarget(Core core) + { + return core.getContext().getProjection(this.proto); // CHECKME: hardcoded to projections -- factor out "getLocal" (parsed or projected) + } @Override public LDo reconstruct(CommonTree source, diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java index 81b5a84ba..2b3ab1216 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeAggNoThrow.java @@ -37,7 +37,6 @@ public abstract class STypeAggNoThrow, // Pre: agg(Stream.of(unit())) = unit() protected abstract T agg(SType n, Stream ts); // Cf. generic varargs, heap pollution issue - // SType return for extensibility/flexibility public T visitContinue(Continue n) { return unit(n); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/gather/RoleGatherer.java b/scribble-core/src/main/java/org/scribble/core/visit/gather/RoleGatherer.java index 8546d562d..bd84ecb58 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/gather/RoleGatherer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/gather/RoleGatherer.java @@ -22,6 +22,7 @@ import org.scribble.core.type.session.DisconnectAction; import org.scribble.core.type.session.Seq; +// N.B. does *not* gather do-args, nor follow subprotos public class RoleGatherer> extends STypeGatherer { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java index 8d20ef262..7338018d2 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java @@ -71,7 +71,7 @@ public LType visitDo(Do n) targSelf); Substitutions subs = new Substitutions(imed.roles, n.roles, Collections.emptyList(), Collections.emptyList()); - List used = corec.getInlined(proto).roles.stream() + List used = corec.getInlined(proto).roles.stream() // N.B. global (inlined) roles -- still need to prune roles w.r.t. localised projection .map(x -> subs.subsRole(x)).collect(Collectors.toList()); List rs = n.roles.stream().filter(x -> used.contains(x)) .map(x -> x.equals(this.self) ? Role.SELF : x) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java new file mode 100644 index 000000000..8721b09a1 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java @@ -0,0 +1,115 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.visit.local; + +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.scribble.core.job.Core; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.lang.global.GProtocol; +import org.scribble.core.lang.local.LProjection; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.visit.STypeVisitorNoThrow; +import org.scribble.core.visit.Substitutor; + +// Cf. SubprotoRoleCollector +public class LDoArgPruner extends STypeVisitorNoThrow +{ + private final Core core; + + public LDoArgPruner(Core core) + { + this.core = core; + } + + // TODO: refactor into LProjection/LProtocol -- cf. GProtocol + public LProjection visitProjection( + LProjection n) + { + Set used = n.def.visitWithNoThrow(newPreRoleCollector()); // CHECKME: vf? + List rs = n.roles.stream() + .filter(x -> used.contains(x) || x.equals(n.self)) // FIXME: self roledecl not actually being a self role is a mess + .collect(Collectors.toList()); + LSeq pruned = visitSeq(n.def); + return n.reconstruct(n.getSource(), n.mods, n.fullname, rs, n.self, + n.params, pruned); + // CHECKME: prune params? + } + + // CHECKME: vf? + protected PreSubprotoRoleCollector newPreRoleCollector() // N.B. "Pre" role collector + { + return new PreSubprotoRoleCollector(this.core); + } + + public Do visitDo(Do n) + { + LProjection target = (LProjection) n.getTarget(this.core); + GProtocol inlined = this.core.getContext().getInlined(target.global); + // n.roles arity currently matches inlined.roles (cf. InlinedProjector.visitDo) + /*Iterator curr = n.roles.iterator();*/ + List pruned = new LinkedList<>(); + /*for (Role r : inlined.roles) + { + Role next = curr.next(); + if (target.roles.contains(r)) + { + pruned.add(next); + } + }*/ + Set rs = n.visitWithNoThrow(newPreRoleCollector()); // N.B. does subproto visiting, unlike RoleGather + pruned = inlined.roles.stream() + .filter(x -> rs.contains(x) || x.equals(target.self)) + .map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess + .collect(Collectors.toList()); + return n.reconstruct(n.getSource(), n.proto, pruned, n.args); // CHECKME: prune args? + } +} + +// Role collector for pre do-arg pruning: do-arg arity doesn't yet match target +class PreSubprotoRoleCollector extends SubprotoRoleCollector +{ + + public PreSubprotoRoleCollector(Core core) + { + super(core); + } + + @Override + public Set visitDo(Do n) + { + SubprotoSig sig = new SubprotoSig(n.proto, n.roles, n.args); + if (this.stack.contains(sig)) + { + return unit(n); // empty set + } + this.stack.push(sig); + LProjection target = (LProjection) n.getTarget(this.core); + List tmp = this.core.getContext().getInlined(target.global).roles + // Currently, do-args arity matches that of inlined, i.e., not necessarily the arity of the actual local target (cf. InlinedProjector.visitDo) + .stream().map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess + .collect(Collectors.toList()); + Substitutor subs = this.core.config.vf + .Substitutor(tmp, n.roles, target.params, n.args); // CHECKME: prune args? + Set res = target.def.visitWithNoThrow(subs).visitWithNoThrow(this); + this.stack.pop(); + return res; + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java new file mode 100644 index 000000000..6305efc35 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java @@ -0,0 +1,103 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.visit.local; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.scribble.core.job.Core; +import org.scribble.core.lang.Protocol; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Choice; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.Recursion; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.Seq; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.visit.STypeVisitorNoThrow; + +// Cf. RecPruner +public class LDoPruner //extends DoPruner + extends STypeVisitorNoThrow +{ + protected final Core core; + + protected LDoPruner(Core core) + { + this.core = core; + } + + @Override + public SType visitDo(Do n) + { + Protocol target = n.getTarget(this.core); + Set rs = target.def.visitWithNoThrow(newRoleCollector()); // N.B. does subproto visiting, unlike RoleGather + + System.out.println("aaa: " + rs); + + if (rs.isEmpty()) + { + return this.core.config.tf.local.LSeq(null, Collections.emptyList()); // Cf. LSkip (currently, no GSkip -- CHECKME: make one?) + } + return n; // Cf. unit(n) + } + + // CHECKME: vf? + protected SubprotoRoleCollector newRoleCollector() + { + return new SubprotoRoleCollector(this.core); + } + + @Override + public SType visitChoice(Choice n) + { + List blocks = n.blocks.stream().map(x -> visitSeq(x)) + .filter(x -> !x.isEmpty()).collect(Collectors.toList()); + if (blocks.isEmpty()) + { + return n.blocks.get(0).reconstruct(null, blocks); // N.B. returning a Seq -- handled by visitSeq (similar to LSkip for locals) + } + return n.reconstruct(n.getSource(), n.subj, blocks); + } + + @Override + public SType visitRecursion(Recursion n) + { + LSeq body = visitSeq(n.body); + return body.isEmpty() ? body : n.reconstruct(n.getSource(), n.recvar, body); + } + + @Override + public LSeq visitSeq(LSeq n) + { + List> elems = new LinkedList<>(); + for (SType e : n.elems) + { + SType e1 = (SType) e.visitWithNoThrow(this); + if (e1 instanceof Seq) // cf. visitDo, empty (also cf. LSkip) + { + elems.addAll(((Seq) e1).elems); // Handles empty Seq case (actually, the only nested Seq case) + } + else + { + elems.add(e1); + } + } + return n.reconstruct(n.getSource(), elems); + } +} \ No newline at end of file diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java index dece03cab..73ed66fea 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java @@ -24,5 +24,9 @@ public interface LTypeVisitorFactory EGraphBuilder EGraphBuilder(Core core); + LDoArgPruner LDoArgPruner(Core core); + + LDoPruner LDoPruner(Core core); + SubprotoExtChoiceSubjFixer SubprotoExtChoiceSubjFixer(Core core); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java index da89c31d1..c2b212787 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java @@ -36,6 +36,18 @@ public EGraphBuilder EGraphBuilder(Core core) return new EGraphBuilder(core); } + @Override + public LDoArgPruner LDoArgPruner(Core core) + { + return new LDoArgPruner(core); + } + + @Override + public LDoPruner LDoPruner(Core core) + { + return new LDoPruner(core); + } + @Override public SubprotoExtChoiceSubjFixer SubprotoExtChoiceSubjFixer(Core core) { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java index 458e8f9cf..76c4fa5ea 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java @@ -42,6 +42,7 @@ protected SubprotoExtChoiceSubjFixer(Core core) // To visit top-level proto, reconstruct for fixed subjs -- nested visting (by Inferer) only does passive inference (no reconstruct) // Must enter here, for initial this.protos entry + // TODO: refactor into LProjection/LProtocol -- cf. GProtocol public Protocol visitProtocol( Protocol n) { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoRoleCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoRoleCollector.java new file mode 100644 index 000000000..5b094f5d3 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoRoleCollector.java @@ -0,0 +1,87 @@ +package org.scribble.core.visit.local; + +import java.util.Collections; +import java.util.Deque; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.core.job.Core; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.lang.local.LProjection; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.DisconnectAction; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.SType; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.visit.STypeAggNoThrow; +import org.scribble.core.visit.Substitutor; + +// Cf. InlinedEnablerInferer (InlinedExtChoiceSubjFixer) +// Results for locals will contain "self" +class SubprotoRoleCollector extends STypeAggNoThrow> +{ + protected final Core core; + + protected Deque stack = new LinkedList<>(); + + public SubprotoRoleCollector(Core core) + { + this.core = core; + } + + @Override + public Set visitDirectedInteraction(DirectedInteraction n) + { + return Stream.of(n.src, n.dst).collect(Collectors.toSet()); + } + + public Set visitDisconnect(DisconnectAction n) + { + return Stream.of(n.left, n.right).collect(Collectors.toSet()); + } + + public Set visitDo(Do n) + { + SubprotoSig sig = new SubprotoSig(n.proto, n.roles, n.args); + if (this.stack.contains(sig)) + { + return unit(n); // empty set + } + this.stack.push(sig); + LProjection target = (LProjection) n.getTarget(this.core); + List foo = target.roles.stream() // + .map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess + .collect(Collectors.toList()); + + + System.out.println("bbbb: " + foo + " ,, " + n.roles); + + Substitutor subs = this.core.config.vf + .Substitutor(foo, n.roles, target.params, n.args); // CHECKME: prune args? + + + Set res = target.def.visitWithNoThrow(subs).visitWithNoThrow(this); + + + this.stack.pop(); + return res; + } + + @Override + protected Set unit(SType n) + { + return Collections.emptySet(); + } + + // Currently only used by Recursion, Choice/Seq overrides don't use + @Override + protected Set agg(SType n, Stream> ts) + { + return ts.flatMap(x -> x.stream()).collect(Collectors.toSet()); + } +} \ No newline at end of file From d426308c2d82500426914c8962e0629ec37f54ba Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 22:36:49 +0100 Subject: [PATCH 444/539] [WIP] Minor. --- .../src/main/java/org/scribble/core/job/Core.java | 5 +++-- .../org/scribble/core/lang/local/LProtocol.java | 6 +++--- .../core/visit/local/SubprotoRoleCollector.java | 13 ++----------- scribble-test/src/test/scrib/tmp/Test.scr | 4 +++- 4 files changed, 11 insertions(+), 17 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index f4bd1bc5c..16d9d265d 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -252,8 +252,9 @@ protected void runProjectionPasses() // No ScribException, no errors expected for (Role self : imed.roles) { LProjection proj = this.context.getProjection(fullname, self); - //LSeq def = v2.visitSeq(proj.def); - LProjection fixed = proj;//proj.reconstruct(proj.getSource(), proj.mods, proj.fullname, proj.roles, proj.self, proj.params, def); + LSeq def = v2.visitSeq(proj.def); + LProjection fixed = proj.reconstruct(proj.getSource(), proj.mods, + proj.fullname, proj.roles, proj.self, proj.params, def); this.context.setProjection(fixed); // N.B. replaces existing projection verbosePrintPass( "Do-pruned projected intermediate: " diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 547b1e3c7..09d44ca94 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -159,9 +159,9 @@ protected String rolesToString() { return "(" + this.roles.stream() - .map(x -> x.equals(this.self) - ? Constants.SELF_KW + " " + this.self - : Constants.ROLE_KW + " " + x) + .map(x -> (x.equals(this.self) + ? Constants.SELF_KW + : Constants.ROLE_KW) + " " + x) .collect(Collectors.joining(", ")) + ")"; } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoRoleCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoRoleCollector.java index 5b094f5d3..22f44e827 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoRoleCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoRoleCollector.java @@ -54,20 +54,12 @@ public Set visitDo(Do n) } this.stack.push(sig); LProjection target = (LProjection) n.getTarget(this.core); - List foo = target.roles.stream() // + List tmp = target.roles.stream() .map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess .collect(Collectors.toList()); - - - System.out.println("bbbb: " + foo + " ,, " + n.roles); - Substitutor subs = this.core.config.vf - .Substitutor(foo, n.roles, target.params, n.args); // CHECKME: prune args? - - + .Substitutor(tmp, n.roles, target.params, n.args); // CHECKME: prune args? Set res = target.def.visitWithNoThrow(subs).visitWithNoThrow(this); - - this.stack.pop(); return res; } @@ -78,7 +70,6 @@ protected Set unit(SType n) return Collections.emptySet(); } - // Currently only used by Recursion, Choice/Seq overrides don't use @Override protected Set agg(SType n, Stream> ts) { diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 06e00e0a2..58f262820 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -92,10 +92,12 @@ module tmp.Test; // TODO: rename addChildren1 -- done: addScribChildren // ...make ad hoc ScribNode constructions go through af properly -- done + // rename ProtoMod, ProtocolMod -- rename core Protocol? // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) // Job Module projection // TODO: fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles // old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? + // FIXME: explicit self roles/decls (core and ast) -- currently, self decls in protocols (in core) are purely cosmetic in toString // Job/codegen refactoring: // also do-arg pruning, for role-pruned projection decls @@ -176,7 +178,7 @@ global protocol Proto1(role A, role B, role C) } or { - do Proto1(A, B, C); // Testing SubprotoExtChoiceSubjFixer, need do-pruning as pre-req + do Proto1(A, B, C); // Testing SubprotoExtChoiceSubjFixer, need do-pruning as pre-req -- TODO: add unit test (cf. bad.liveness.roleprog.unfair.Test06) } } //*/ From 2834b6eeb04c57717497255de6e599141d2d8e38 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 22:45:19 +0100 Subject: [PATCH 445/539] [WIP] Minor. --- .../main/java/org/scribble/core/job/Core.java | 3 ++- .../scribble/core/visit/local/LDoArgPruner.java | 16 ++++++++-------- .../org/scribble/core/visit/local/LDoPruner.java | 13 +++++++------ scribble-test/src/test/scrib/tmp/Test.scr | 1 + 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 16d9d265d..5db33d456 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -262,7 +262,8 @@ protected void runProjectionPasses() // No ScribException, no errors expected } } - verbosePrintPass("\"Fixing\" all projected intermediates..."); + verbosePrintPass( + "Fixing external choice subjects for all projected intermediates..."); SubprotoExtChoiceSubjFixer v3 = this.config.vf.local .SubprotoExtChoiceSubjFixer(this); // Reusable (via top-level visitProtocol) for (ProtoName fullname : this.context.getParsedFullnames()) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java index 8721b09a1..6e0a5b152 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java @@ -29,7 +29,6 @@ import org.scribble.core.visit.STypeVisitorNoThrow; import org.scribble.core.visit.Substitutor; -// Cf. SubprotoRoleCollector public class LDoArgPruner extends STypeVisitorNoThrow { private final Core core; @@ -39,6 +38,13 @@ public LDoArgPruner(Core core) this.core = core; } + // CHECKME: vf? + protected PreSubprotoRoleCollector newPreRoleCollector() // N.B. "Pre" role collector + { + return new PreSubprotoRoleCollector(this.core); + } + + // TODO: rename class? also fixes projection role decls // TODO: refactor into LProjection/LProtocol -- cf. GProtocol public LProjection visitProjection( LProjection n) @@ -52,12 +58,6 @@ public LProjection visitProjection( n.params, pruned); // CHECKME: prune params? } - - // CHECKME: vf? - protected PreSubprotoRoleCollector newPreRoleCollector() // N.B. "Pre" role collector - { - return new PreSubprotoRoleCollector(this.core); - } public Do visitDo(Do n) { @@ -83,10 +83,10 @@ public Do visitDo(Do n) } } + // Role collector for pre do-arg pruning: do-arg arity doesn't yet match target class PreSubprotoRoleCollector extends SubprotoRoleCollector { - public PreSubprotoRoleCollector(Core core) { super(core); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java index 6305efc35..b1381de40 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java @@ -41,6 +41,12 @@ protected LDoPruner(Core core) { this.core = core; } + + // CHECKME: vf? + protected SubprotoRoleCollector newRoleCollector() + { + return new SubprotoRoleCollector(this.core); + } @Override public SType visitDo(Do n) @@ -54,14 +60,9 @@ public SType visitDo(Do n) { return this.core.config.tf.local.LSeq(null, Collections.emptyList()); // Cf. LSkip (currently, no GSkip -- CHECKME: make one?) } + return n; // Cf. unit(n) } - - // CHECKME: vf? - protected SubprotoRoleCollector newRoleCollector() - { - return new SubprotoRoleCollector(this.core); - } @Override public SType visitChoice(Choice n) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 58f262820..c781da5a3 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -98,6 +98,7 @@ module tmp.Test; // TODO: fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles // old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? // FIXME: explicit self roles/decls (core and ast) -- currently, self decls in protocols (in core) are purely cosmetic in toString + // refactor role pruning? currently done once for globals, which is done for locals once and then pruning done again for do-args -- TODO: arg pruning? // Job/codegen refactoring: // also do-arg pruning, for role-pruned projection decls From 14e43aca7f0737c26541732fb09390ff21c738e7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 23:08:38 +0100 Subject: [PATCH 446/539] [WIP] Continued: projected subproto do-pruning. --- .../java/org/scribble/core/lang/Protocol.java | 3 +- .../org/scribble/core/lang/SubprotoSig.java | 33 ++++++++++++++++++- .../scribble/core/lang/global/GProtocol.java | 23 +------------ .../scribble/core/lang/local/LProtocol.java | 24 +------------- .../scribble/core/visit/local/LDoPruner.java | 11 +++++++ 5 files changed, 47 insertions(+), 47 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java index 8533dea67..e1663cad4 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java @@ -39,7 +39,8 @@ public abstract class Protocol public final List mods; public final N fullname; public final List roles; // Ordered role params; pre: size >= 2 - public final List> params; // N.B. there is no Data/SigParamName // CHECKME: always simple names? + public final List> params; + // N.B. there is no Data/SigParamName // CHECKME: always simple names? // NonRoleParamKind, not NonRoleArgKind, because latter includes AmbigKind due to parsing requirements // CHECKME: make a ParamName? or at least SimpleName? public final B def; diff --git a/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java index fb159d204..da3aca3ff 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java @@ -14,12 +14,16 @@ package org.scribble.core.lang; import java.util.Collections; +import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.name.DataName; +import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.SigName; import org.scribble.core.type.session.Arg; // CHECKME: relocate? @@ -33,7 +37,6 @@ public class SubprotoSig // NonRoleParamKind, not NonRoleArgKind, because latter includes AmbigKind due to parsing requirements // Arg, not MemberName, because need to include MessageSigs (sig literals) - // public SubprotocolSignature(ProtocolName fmn, Scope scope, List roles, List> args) public SubprotoSig(ProtoName fullname, List roles, List> args) { @@ -43,6 +46,34 @@ public SubprotoSig(ProtoName fullname, this.args = Collections.unmodifiableList(args); } + public SubprotoSig(Protocol n) + { + this(n.fullname, n.roles, paramsToArgs(n.params)); + } + + private static List> paramsToArgs( + List> params) + { + List> args = new LinkedList<>(); + // Convert MemberName params to Args -- cf. NonRoleArgList::getParamKindArgs + for (MemberName n : params) + { + if (n instanceof DataName) + { + args.add((DataName) n); + } + else if (n instanceof SigName) + { + args.add((SigName) n); + } + else + { + throw new RuntimeException("[TODO] : " + n.getClass() + "\n\t" + n); + } + } + return args; + } + @Override public int hashCode() { diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 8a40ec1ad..c422c24a5 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -29,14 +29,11 @@ import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; -import org.scribble.core.type.name.SigName; -import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.global.GRecursion; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.local.LSeq; @@ -143,25 +140,7 @@ private LProjection projectAux(Core core, Role self, List decls, @Override public GProtocol getInlined(STypeInliner v) { - // TODO: factor out with LProtocol - List> params = new LinkedList<>(); - // Convert MemberName params to Args -- cf. NonRoleArgList::getParamKindArgs -- TODO: factor out - for (MemberName n : this.params) - { - if (n instanceof DataName) - { - params.add((DataName) n); - } - else if (n instanceof SigName) - { - params.add((SigName) n); - } - else - { - throw new RuntimeException("TODO: " + n); - } - } - SubprotoSig sig = new SubprotoSig(this.fullname, this.roles, params); + SubprotoSig sig = new SubprotoSig(this); v.pushSig(sig); Substitutor subs = v.core.config.vf.Substitutor(this.roles, sig.roles, diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 09d44ca94..7f4139929 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -15,7 +15,6 @@ import java.util.Arrays; import java.util.Collections; -import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; @@ -28,13 +27,10 @@ import org.scribble.core.model.endpoint.EState; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; -import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.RecVar; import org.scribble.core.type.name.Role; -import org.scribble.core.type.name.SigName; -import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.local.LRecursion; import org.scribble.core.type.session.local.LSeq; import org.scribble.core.visit.STypeInliner; @@ -84,25 +80,7 @@ public void checkReachability(Core core) throws ScribException @Override public LProtocol getInlined(STypeInliner v) { - // TODO: factor out with GProtocol - List> params = new LinkedList<>(); - // Convert MemberName params to Args -- cf. NonRoleArgList::getParamKindArgs - for (MemberName n : this.params) - { - if (n instanceof DataName) - { - params.add((DataName) n); - } - else if (n instanceof SigName) - { - params.add((SigName) n); - } - else - { - throw new RuntimeException("TODO: " + n); - } - } - SubprotoSig sig = new SubprotoSig(this.fullname, this.roles, params); + SubprotoSig sig = new SubprotoSig(this); v.pushSig(sig); Substitutor subs = v.core.config.vf.Substitutor(this.roles, sig.roles, diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java index b1381de40..dbd66bd1d 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java @@ -14,6 +14,7 @@ package org.scribble.core.visit.local; import java.util.Collections; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; @@ -21,6 +22,8 @@ import org.scribble.core.job.Core; import org.scribble.core.lang.Protocol; +import org.scribble.core.lang.SubprotoSig; +import org.scribble.core.lang.local.LProjection; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; @@ -37,9 +40,17 @@ public class LDoPruner //extends DoPruner { protected final Core core; + protected final Set unguarded; // Cf. InlinedProjector (unguarded-continue pruning) + protected LDoPruner(Core core) { this.core = core; + this.unguarded = new HashSet<>(); + } + + public LProjection visitProjection(LProjection n) + { + SubprotoSig sig = new SubprotoSig(n.fullname, n.roles, n.params); } // CHECKME: vf? From 43bbb244d09c8c46f38446e67380464a3542f5f6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 4 May 2019 23:44:32 +0100 Subject: [PATCH 447/539] [WIP] Continued: projected subproto do-pruning. --- .../main/java/org/scribble/core/job/Core.java | 4 +- .../org/scribble/core/lang/SubprotoSig.java | 8 ++ .../core/visit/global/InlinedProjector.java | 6 +- .../scribble/core/visit/local/LDoPruner.java | 87 ++++++++++++------- .../bad/efsm/grecursion/unfair/Test06.scr | 2 + scribble-test/src/test/scrib/tmp/Test.scr | 1 + 6 files changed, 69 insertions(+), 39 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 5db33d456..119554cc2 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -252,9 +252,7 @@ protected void runProjectionPasses() // No ScribException, no errors expected for (Role self : imed.roles) { LProjection proj = this.context.getProjection(fullname, self); - LSeq def = v2.visitSeq(proj.def); - LProjection fixed = proj.reconstruct(proj.getSource(), proj.mods, - proj.fullname, proj.roles, proj.self, proj.params, def); + LProjection fixed = v2.visitProjection(proj); this.context.setProjection(fixed); // N.B. replaces existing projection verbosePrintPass( "Do-pruned projected intermediate: " diff --git a/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java index da3aca3ff..e07fca022 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.stream.Collectors; +import org.scribble.core.lang.local.LProjection; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.MemberName; @@ -37,6 +38,7 @@ public class SubprotoSig // NonRoleParamKind, not NonRoleArgKind, because latter includes AmbigKind due to parsing requirements // Arg, not MemberName, because need to include MessageSigs (sig literals) + // CHECKME: refactor as factory methods on Protocol/Do ? public SubprotoSig(ProtoName fullname, List roles, List> args) { @@ -51,6 +53,12 @@ public SubprotoSig(Protocol n) this(n.fullname, n.roles, paramsToArgs(n.params)); } + public SubprotoSig(LProjection n) + { + this(n.fullname, n.roles.stream().map(x -> x.equals(n.self) ? Role.SELF : x) // FIXME: (implicit) self role mess + .collect(Collectors.toList()), paramsToArgs(n.params)); + } + private static List> paramsToArgs( List> params) { diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index d4f301fe7..467c762f8 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -90,7 +90,7 @@ public LType visitChoice(Choice n) { return LSkip.SKIP; // CHECKME: OK, or "empty" choice at subj still important? } - //this.unguarded.clear(); // At least one block is non-empty, consider continues guarded -- done in Seq + this.unguarded.clear(); // At least one block is non-empty, consider continues guarded (must do here, blocks visited using dup's) //InlinedEnablerInferer v = new InlinedEnablerInferer(this.unguarded); Role subj = n.subj.equals(this.self) @@ -192,14 +192,12 @@ public LSeq visitSeq(GSeq n) for (SType e : n.elems) { LType e1 = e.visitWithNoThrow(this); - elems.add(e1); if (!(e1 instanceof LSkip)) { + elems.add(e1); this.unguarded.clear(); } } - elems = elems.stream().filter(x -> !x.equals(LSkip.SKIP)) - .collect(Collectors.toList()); return this.core.config.tf.local.LSeq(null, elems); // Empty seqs converted to LSkip by GChoice/Recursion projection // And a WF top-level protocol cannot produce empty LSeq diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java index dbd66bd1d..ee2f31344 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java @@ -13,7 +13,7 @@ */ package org.scribble.core.visit.local; -import java.util.Collections; +import java.util.Deque; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -25,13 +25,13 @@ import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.local.LProjection; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Do; import org.scribble.core.type.session.Recursion; import org.scribble.core.type.session.SType; -import org.scribble.core.type.session.Seq; import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.type.session.local.LSkip; +import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.STypeVisitorNoThrow; // Cf. RecPruner @@ -39,18 +39,23 @@ public class LDoPruner //extends DoPruner extends STypeVisitorNoThrow { protected final Core core; + + protected final Deque stack; protected final Set unguarded; // Cf. InlinedProjector (unguarded-continue pruning) protected LDoPruner(Core core) { this.core = core; + this.stack = new LinkedList<>(); this.unguarded = new HashSet<>(); } - - public LProjection visitProjection(LProjection n) + + protected LDoPruner(LDoPruner v) { - SubprotoSig sig = new SubprotoSig(n.fullname, n.roles, n.params); + this.core = v.core; + this.stack = new LinkedList<>(v.stack); + this.unguarded = new HashSet<>(v.unguarded); } // CHECKME: vf? @@ -58,58 +63,76 @@ protected SubprotoRoleCollector newRoleCollector() { return new SubprotoRoleCollector(this.core); } - - @Override - public SType visitDo(Do n) + + // TODO: refactor to LProjection -- cf. GProtocol (e.g., getInlined, etc) + public LProjection visitProjection(LProjection n) { - Protocol target = n.getTarget(this.core); - Set rs = target.def.visitWithNoThrow(newRoleCollector()); // N.B. does subproto visiting, unlike RoleGather - - System.out.println("aaa: " + rs); - - if (rs.isEmpty()) - { - return this.core.config.tf.local.LSeq(null, Collections.emptyList()); // Cf. LSkip (currently, no GSkip -- CHECKME: make one?) - } + this.stack.clear(); + this.unguarded.clear(); - return n; // Cf. unit(n) + SubprotoSig sig = new SubprotoSig(n); + this.stack.push(sig); + this.unguarded.add(sig); + LSeq def = visitSeq(n.def); + return n.reconstruct(n.getSource(), n.mods, n.fullname, n.roles, n.self, + n.params, def); } @Override public SType visitChoice(Choice n) { - List blocks = n.blocks.stream().map(x -> visitSeq(x)) - .filter(x -> !x.isEmpty()).collect(Collectors.toList()); + // Duplicated from InlinedProjector.visitChoice + List blocks = n.blocks.stream() + .map(x -> new LDoPruner(this).visitSeq(x)).filter(x -> !x.isEmpty()) + .collect(Collectors.toList()); if (blocks.isEmpty()) { - return n.blocks.get(0).reconstruct(null, blocks); // N.B. returning a Seq -- handled by visitSeq (similar to LSkip for locals) + return LSkip.SKIP; // N.B. returning a Seq -- handled by visitSeq (similar to LSkip for locals) } + this.unguarded.remove(this.stack.peek()); return n.reconstruct(n.getSource(), n.subj, blocks); } + @Override + public SType visitDo(Do n) + { + SubprotoSig sig = new SubprotoSig(n.proto, n.roles, n.args); + System.out.println("111: " + sig + " ,, " + this.stack + " ,, " + this.unguarded); + if (this.stack.contains(sig)) + { + System.out.println("222: " + this.unguarded.contains(sig)); + return this.unguarded.contains(sig) ? LSkip.SKIP : n; + } + this.stack.push(sig); + Protocol target = n.getTarget(this.core); + visitSeq(target.def); // Discard changes -- "nested" entries only do "info collection", actual AST modifications only recoded for the top-level Projection (cf. visitProjection) + this.stack.pop(); + return n; // Cf. unit(n) + } + @Override public SType visitRecursion(Recursion n) { LSeq body = visitSeq(n.body); - return body.isEmpty() ? body : n.reconstruct(n.getSource(), n.recvar, body); + return body.isEmpty() + ? LSkip.SKIP + : n.reconstruct(n.getSource(), n.recvar, body); } @Override public LSeq visitSeq(LSeq n) { - List> elems = new LinkedList<>(); - for (SType e : n.elems) + // Duplicated from InlinedProjector.visitSeq + List elems = new LinkedList<>(); + for (LType e : n.getElements()) { - SType e1 = (SType) e.visitWithNoThrow(this); - if (e1 instanceof Seq) // cf. visitDo, empty (also cf. LSkip) - { - elems.addAll(((Seq) e1).elems); // Handles empty Seq case (actually, the only nested Seq case) - } - else + LType e1 = (LType) e.visitWithNoThrow(this); + if (!(e1 instanceof LSkip)) { elems.add(e1); + this.unguarded.clear(); } } - return n.reconstruct(n.getSource(), elems); + return this.core.config.tf.local.LSeq(null, elems); } } \ No newline at end of file diff --git a/scribble-test/src/test/resources/bad/efsm/grecursion/unfair/Test06.scr b/scribble-test/src/test/resources/bad/efsm/grecursion/unfair/Test06.scr index bcd9a2308..f2669e6b1 100644 --- a/scribble-test/src/test/resources/bad/efsm/grecursion/unfair/Test06.scr +++ b/scribble-test/src/test/resources/bad/efsm/grecursion/unfair/Test06.scr @@ -1,3 +1,5 @@ +//$ bin/scribblec.sh scribble-test/src/test/resources/bad/efsm/grecursion/unfair/Test06.scr + module bad.efsm.grecursion.unfair.Test06; diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index c781da5a3..2c807e590 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -98,6 +98,7 @@ module tmp.Test; // TODO: fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles // old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? // FIXME: explicit self roles/decls (core and ast) -- currently, self decls in protocols (in core) are purely cosmetic in toString + // And fix self in ast locals, and astfactory // refactor role pruning? currently done once for globals, which is done for locals once and then pruning done again for do-args -- TODO: arg pruning? // Job/codegen refactoring: From 5d6079a0d31ffb69429595797a115af3796a5911 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 00:48:56 +0100 Subject: [PATCH 448/539] [AllTest] Continued: projected subproto do-pruning. --- .../src/main/java/org/scribble/job/Job.java | 5 +- .../main/java/org/scribble/core/job/Core.java | 11 ++- .../scribble/core/lang/global/GProtocol.java | 38 ++++---- .../scribble/core/visit/local/LDoPruner.java | 7 +- .../visit/local/SingleContinueChecker.java | 86 ------------------- scribble-test/src/test/scrib/tmp/Test.scr | 23 ++++- 6 files changed, 54 insertions(+), 116 deletions(-) delete mode 100644 scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index a918ec63b..5e4eea49d 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -180,8 +180,9 @@ public Map getProjections(GProtoName fullname, } System.out.println(""); - warningPrintln("[TODO] Full module projection (with imports): " - + fullname + "@" + self); + warningPrintln( + "[TODO] Module projection incomplete, missing imports and non-proto decls: " + + fullname + "@" + self); return Collections.emptyMap(); //FIXME: build output Modules diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 119554cc2..9aab87f4b 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -224,7 +224,7 @@ protected void runProjectionPasses() // No ScribException, no errors expected verbosePrintPass("Pruning do-args on all projected intermediates..."); LDoArgPruner v1 = this.config.vf.local.LDoArgPruner(this); // Reusable - List pruned = new LinkedList<>(); + List pruned1 = new LinkedList<>(); for (ProtoName fullname : this.context.getParsedFullnames()) { GProtocol imed = this.context.getIntermediate(fullname); @@ -235,17 +235,18 @@ protected void runProjectionPasses() // No ScribException, no errors expected LProjection fixed = proj.reconstruct(proj.getSource(), proj.mods, proj.fullname, proj.roles, proj.self, proj.params, def);*/ LProjection fixed = (LProjection) v1.visitProjection(proj); // TODO: refactor as LProjection/LProto meth, cf. GProto - pruned.add(fixed); // N.B. replaces existing projection + pruned1.add(fixed); // N.B. replaces existing projection verbosePrintPass( "Pruned do-args on projected intermediate: " + fixed.fullname + ":\n" + fixed); } } - pruned.forEach(x -> this.getContext().setProjection(x)); + pruned1.forEach(x -> this.getContext().setProjection(x)); // Update after all visited, to prevent visiting an already pruned projdecl from breaking the pruning of a subsequent one (e.g., mutually recursive proto refs) verbosePrintPass("Do-pruning all projected intermediates..."); LDoPruner v2 = this.config.vf.local.LDoPruner(this); // Reusable + List pruned2 = new LinkedList<>(); for (ProtoName fullname : this.context.getParsedFullnames()) { GProtocol imed = this.context.getIntermediate(fullname); @@ -253,12 +254,14 @@ protected void runProjectionPasses() // No ScribException, no errors expected { LProjection proj = this.context.getProjection(fullname, self); LProjection fixed = v2.visitProjection(proj); - this.context.setProjection(fixed); // N.B. replaces existing projection + pruned2.add(fixed); // N.B. replaces existing projection verbosePrintPass( "Do-pruned projected intermediate: " + fixed.fullname + ":\n" + fixed); } } + pruned2.forEach(x -> this.getContext().setProjection(x)); + // Update after all visited, to prevent visiting an already pruned projdecl from breaking the pruning of a subsequent one (e.g., mutually recursive proto refs) verbosePrintPass( "Fixing external choice subjects for all projected intermediates..."); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index c422c24a5..c122a9a8d 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -98,29 +98,12 @@ public LProjection projectInlined(Core core, Role self) LSeq fixed = core.config.vf.local.InlinedExtChoiceSubjFixer().visitSeq(def); return projectAux(core, self, this.roles, fixed); } - - // N.B. no "fixing" passes done here -- need breadth-first passes to be sequentialised for subproto visiting - public LProjection project(Core core, Role self) - { - LSeq def = core.config.vf.global.Projector(core, self).visitSeq(this.def); - LProjection proj = projectAux(core, self, - core.getContext().getInlined(this.fullname).roles, - // Using inlined global, global role decls already pruned -- CHECKME: is this still relevant? - // Actual projection role decl pruning done by projectAux - def); - - // FIXME: ext choice subj fixing, do pruning -- refactor to Job and use AstVisitor? - - // N.B. must do top-level entry on projection, cf. projectInlined - //LProjection fixed = (LProjection) core.config.vf.local.SubprotoExtChoiceSubjFixer(core).visitProtocol(proj); - return proj; - } // Does rec and role pruning private LProjection projectAux(Core core, Role self, List decls, - LSeq body) + LSeq def) { - LSeq pruned = core.config.vf.RecPruner().visitSeq(body); + LSeq pruned = core.config.vf.RecPruner().visitSeq(def); LProtoName fullname = InlinedProjector .getFullProjectionName(this.fullname, self); Set used = pruned.gather(new RoleGatherer()::visit) @@ -131,7 +114,24 @@ private LProjection projectAux(Core core, Role self, List decls, List> params = new LinkedList<>(this.params); // CHECKME: filter params by usage? return new LProjection(this.mods, fullname, roles, self, params, + this.fullname, pruned); // CHECKME: add/do via tf? + } + + // N.B. no "fixing" passes done here -- need breadth-first passes to be sequentialised for subproto visiting + public LProjection project(Core core, Role self) + { + LSeq def = core.config.vf.global.Projector(core, self).visitSeq(this.def); + // N.B. not using projectAux, because don't want to prune role decls using RoleGatherer: it doesn't follow subprotos, so can over-prune roledecls (e.g., bad.efsm.grecursion.unfair.Test06, C) + // Instead, retain full global role decls for now -- and prune later, via LDoArgPruner + LSeq pruned = core.config.vf.RecPruner().visitSeq(def); + LProtoName fullname = InlinedProjector + .getFullProjectionName(this.fullname, self); + List> params = + new LinkedList<>(this.params); // CHECKME: filter params by usage? + LProjection proj = new LProjection(this.mods, fullname, this.roles, self, params, this.fullname, pruned); + // TODO: fully refactor ext choice subj fixing, do pruning, etc to Job and use AstVisitor? + return proj; } // Cf. (e.g.) checkRoleEnabling, that takes Core diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java index ee2f31344..90a92c2ee 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java @@ -97,17 +97,16 @@ public SType visitChoice(Choice n) public SType visitDo(Do n) { SubprotoSig sig = new SubprotoSig(n.proto, n.roles, n.args); - System.out.println("111: " + sig + " ,, " + this.stack + " ,, " + this.unguarded); if (this.stack.contains(sig)) { - System.out.println("222: " + this.unguarded.contains(sig)); return this.unguarded.contains(sig) ? LSkip.SKIP : n; } this.stack.push(sig); Protocol target = n.getTarget(this.core); - visitSeq(target.def); // Discard changes -- "nested" entries only do "info collection", actual AST modifications only recoded for the top-level Projection (cf. visitProjection) + LSeq def = visitSeq(target.def); + // Changes ultimately discarded: "nested" entries only do "info collection", actual AST modifications only recoded for the top-level Projection (cf. visitProjection) this.stack.pop(); - return n; // Cf. unit(n) + return (def.isEmpty()) ? LSkip.SKIP : n; // Cf. unit(n) } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java deleted file mode 100644 index f0063955b..000000000 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SingleContinueChecker.java +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.core.visit.local; - -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; -import java.util.stream.Stream; - -import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.session.Continue; -import org.scribble.core.type.session.Do; -import org.scribble.core.type.session.Recursion; -import org.scribble.core.type.session.SType; -import org.scribble.core.type.session.local.LSeq; -import org.scribble.core.visit.STypeAggNoThrow; - -// Return true iff this LType is "equivalent" to a single "continue X", where X is in rvs -// Would be an "InlinedAgg" -@Deprecated -public class SingleContinueChecker extends STypeAggNoThrow -{ - private Set rvs; - - public SingleContinueChecker(Set rvs) - { - this.rvs = Collections.unmodifiableSet(rvs); - } - - @Override - public Boolean unit(SType n) - { - return false; - } - - @Override - public Boolean agg(SType n, Stream bs) - { - return bs.allMatch(x -> x); - } - - @Override - public Boolean visitContinue(Continue n) - { - return rvs.contains(n.recvar); // Single continue for an "outer" recvar caught later on - } - - @Override - public Boolean visitDo(Do n) - { - //return (Boolean) InlinedVisitor1.super.visitDo(n); - //return (Boolean) super.visitDo(n); // CHECKME: resolves to the extends super, even with a default i/f implementation ? - throw new RuntimeException(this.getClass() + " unsupported for Do: " + n); - } - - @Override - public Boolean visitRecursion(Recursion n) - { - Set tmp = new HashSet<>(this.rvs); - tmp.add(n.recvar); - //return n.body.visitWithNoThrow(new SingleContinueChecker(tmp)); - return new SingleContinueChecker(tmp).visitSeq(n.body); - } - - @Override - public Boolean visitSeq(LSeq n) - { - return n.elems.size() == 1 - && (n.elems.get(0)).visitWithNoThrow(this); // No: doesn't support "empty" choices ahead of single continue ? - //return n.elems.stream().allMatch(x -> x.visitWithNoThrow(this)); - // elems except the last must be "empty" (e.g., empty choice), not actually "single continues", but bad sequenced "single continues" are caught by reachability - // i.e., "single-continue" check on every elem a bit overkill here, but OK - } -} diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 2c807e590..14d4640f3 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -96,6 +96,7 @@ module tmp.Test; // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) // Job Module projection // TODO: fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles + // TODO: projected imports/nonprotodecls // old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? // FIXME: explicit self roles/decls (core and ast) -- currently, self decls in protocols (in core) are purely cosmetic in toString // And fix self in ast locals, and astfactory @@ -120,6 +121,26 @@ module tmp.Test; data "..." from "..." as T; +/* +global protocol Proto1(role A, role B, role C) +{ + choice at A + { + do Proto1Aux(A, B); + } + or + { + 2() from A to B; + } + 4() from A to C; +} + +aux global protocol Proto1Aux(role A, role B) +{ + 3() from A to B; +} + + /* global protocol Proto1(role A, role B, role C) { @@ -170,7 +191,7 @@ aux global protocol Proto1Aux1(role A, role B, role C) //*/ -//* +/* global protocol Proto1(role A, role B, role C) { choice at A From f318d64cffcaa4d319f86f72bedb3b35509cae6e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 00:56:01 +0100 Subject: [PATCH 449/539] [install] Continued. --- .../src/main/java/org/scribble/core/job/Core.java | 5 +---- .../java/org/scribble/core/job/CoreContext.java | 1 + .../core/visit/global/InlinedProjector.java | 2 +- .../org/scribble/core/visit/local/LDoArgPruner.java | 10 ---------- .../core/visit/local/SubprotoRoleCollector.java | 13 +++++++++++++ 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 9aab87f4b..36112b986 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -231,9 +231,6 @@ protected void runProjectionPasses() // No ScribException, no errors expected for (Role self : imed.roles) { LProjection proj = this.context.getProjection(fullname, self); - /*LSeq def = v1.visitSeq(proj.def); - LProjection fixed = proj.reconstruct(proj.getSource(), proj.mods, - proj.fullname, proj.roles, proj.self, proj.params, def);*/ LProjection fixed = (LProjection) v1.visitProjection(proj); // TODO: refactor as LProjection/LProto meth, cf. GProto pruned1.add(fixed); // N.B. replaces existing projection verbosePrintPass( @@ -253,7 +250,7 @@ protected void runProjectionPasses() // No ScribException, no errors expected for (Role self : imed.roles) { LProjection proj = this.context.getProjection(fullname, self); - LProjection fixed = v2.visitProjection(proj); + LProjection fixed = v2.visitProjection(proj); // TODO: refactor as LProjection/LProto meth, cf. GProto pruned2.add(fixed); // N.B. replaces existing projection verbosePrintPass( "Do-pruned projected intermediate: " diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index de7bda945..77bb2888a 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -65,6 +65,7 @@ public class CoreContext // CHECKME: refactor to Job ? // Projected from intermediates + // N.B. unlike iprojs, initial projections not pruned/fixed at all -- do-arg pruning, do-pruning, ext-choice-subj fixing all done incrementally // LProtocolName is the full local protocol name (module name is the prefix) // LProtocolName key is LProtocol value fullname (i.e., redundant) private final Map, LProjection> projs = new HashMap<>(); // FIXME: choice-subj fixing, do-pruning -- factor out to Job and do there via AstVisitor? -- make testing compare the two sides diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index 467c762f8..703fbcdcb 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -90,7 +90,7 @@ public LType visitChoice(Choice n) { return LSkip.SKIP; // CHECKME: OK, or "empty" choice at subj still important? } - this.unguarded.clear(); // At least one block is non-empty, consider continues guarded (must do here, blocks visited using dup's) + this.unguarded.clear(); // At least one block is non-empty, consider continues guarded -- must clear here, blocks visited using dup's //InlinedEnablerInferer v = new InlinedEnablerInferer(this.unguarded); Role subj = n.subj.equals(this.self) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java index 6e0a5b152..e57aef8f7 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java @@ -63,17 +63,7 @@ public Do visitDo(Do n) { LProjection target = (LProjection) n.getTarget(this.core); GProtocol inlined = this.core.getContext().getInlined(target.global); - // n.roles arity currently matches inlined.roles (cf. InlinedProjector.visitDo) - /*Iterator curr = n.roles.iterator();*/ List pruned = new LinkedList<>(); - /*for (Role r : inlined.roles) - { - Role next = curr.next(); - if (target.roles.contains(r)) - { - pruned.add(next); - } - }*/ Set rs = n.visitWithNoThrow(newPreRoleCollector()); // N.B. does subproto visiting, unlike RoleGather pruned = inlined.roles.stream() .filter(x -> rs.contains(x) || x.equals(target.self)) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoRoleCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoRoleCollector.java index 22f44e827..fc4e57c40 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoRoleCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoRoleCollector.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit.local; import java.util.Collections; From 89873e79e9fab35278de3e1e2df964a7e3aa42ad Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 00:59:58 +0100 Subject: [PATCH 450/539] [AllTest] Minor. --- scribble-test/src/test/scrib/tmp/Test.scr | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 14d4640f3..3a32b42ba 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -93,14 +93,15 @@ module tmp.Test; // ...make ad hoc ScribNode constructions go through af properly -- done // rename ProtoMod, ProtocolMod -- rename core Protocol? + // TODO: refactor doarg pruning, do pruning and extchoicesubj fixing vistor passes + // FIXME: explicit self roles/decls (core and ast) -- currently, self decls in protocols (in core) are purely cosmetic in toString + // And fix self in ast locals, and astfactory // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) // Job Module projection // TODO: fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles // TODO: projected imports/nonprotodecls // old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? - // FIXME: explicit self roles/decls (core and ast) -- currently, self decls in protocols (in core) are purely cosmetic in toString - // And fix self in ast locals, and astfactory - // refactor role pruning? currently done once for globals, which is done for locals once and then pruning done again for do-args -- TODO: arg pruning? + // refactor role pruning? currently done once for globals, which is done for locals once and then pruning done again for do-args -- TODO: param-arg pruning? // Job/codegen refactoring: // also do-arg pruning, for role-pruned projection decls From a2085cadcf9c8b11631fdf3fb95f31a13a676434 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 01:14:29 +0100 Subject: [PATCH 451/539] [AllTest] Minor. --- .../src/main/java/org/scribble/core/job/Core.java | 1 + scribble-test/src/test/scrib/tmp/Test.scr | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 36112b986..261c123bd 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -49,6 +49,7 @@ import org.scribble.core.visit.local.SubprotoExtChoiceSubjFixer; import org.scribble.util.ScribException; + // A "compiler job" front-end that supports operations comprising visitor passes over the AST and/or local/global models public class Core { diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 3a32b42ba..09153bacf 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -96,12 +96,15 @@ module tmp.Test; // TODO: refactor doarg pruning, do pruning and extchoicesubj fixing vistor passes // FIXME: explicit self roles/decls (core and ast) -- currently, self decls in protocols (in core) are purely cosmetic in toString // And fix self in ast locals, and astfactory - // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) // Job Module projection - // TODO: fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles + // TODO: fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles -- done in core (and needs tidying) // TODO: projected imports/nonprotodecls - // old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? - // refactor role pruning? currently done once for globals, which is done for locals once and then pruning done again for do-args -- TODO: param-arg pruning? + + // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) + // fully refactor imed/module projection to Job: old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? + // refactor imed projection role pruning? currently done once for globals, which is done for locals once and then pruning done again for do-args + // no? now only pruned? + // CHECKME TODO: param-arg pruning? // Job/codegen refactoring: // also do-arg pruning, for role-pruned projection decls @@ -114,6 +117,7 @@ module tmp.Test; // sort out full name expansion between disamb and translation -- fix modulecontextcollector for imported module member fullnames // refactor additional disamb syntactic checks into core? e.g., do-calls, distinct roledecls, protodecls, etc. // -- otoh, ast errors give source feedback -- maybe implement both + // Refactor PayElemNameNode // Test refactoring: // refactor test to use main instead of cli From c6ce1a2410cbb792bfc843510c01aff58612ffda Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 10:11:54 +0100 Subject: [PATCH 452/539] [AllTest] Minor. --- .../src/main/antlr3/org/scribble/parser/antlr/Scribble.g | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 90b543a70..963be02a4 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -300,7 +300,7 @@ fragment UNDERSCORE: * Chapter 3 Syntax (Parser rules) ***************************************************************************/ -/* // Double star here not accepted by ANTLR... +/* * // Double star here not accepted by ANTLR... * Section 3.1 Primitive Names */ //simplename: id=ID -> { checkId($id.tree) } ; // How to integrate with ID[$t] ? @@ -323,10 +323,9 @@ sigparamname: t=ID -> ID[$t]; gprotoname: t=ID ('.' ID)* -> ^(GPROTO_NAME[$t] ID+) ; modulename: t=ID ('.' ID)* -> ^(MODULE_NAME[$t] ID+) ; -// Compound only +// Compound only (cf., e.g., gprotoname; cf. simpledataname) qualifieddataname: t=ID '.' ID ('.' ID)* -> ^(DATA_NAME[$t] ID+) ; - // Cf. primitive names, above simpledataname: t=ID -> ^(DATA_NAME[$t] ID) ; simplegprotoname: t=ID -> ^(GPROTO_NAME[$t] ID) ; From 04ae7f14defb47c5344a69d1b487a135fd37b975 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 10:12:34 +0100 Subject: [PATCH 453/539] [AllTest] Minor. --- .../main/antlr3/org/scribble/parser/antlr/Scribble.g | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index 963be02a4..be0bcfeec 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -308,12 +308,12 @@ fragment UNDERSCORE: // "The TreeAdaptor is not called; instead [the] constructors are invoked directly." // "Note that parameters are not allowed on token references to the left of ->:" // "Use imaginary nodes as you normally would, but with the addition of the node type:" // But currently, ID token itself unchanged and ttype int ends up discarded -ambigname: t=ID -> ID[$t]; -dataparamname: t=ID -> ID[$t]; +ambigname: t=ID -> ID[$t] ; +dataparamname: t=ID -> ID[$t] ; opname: -> ^(EMPTY_OP) | t=ID -> ID[$t] ; -recvarname: t=ID -> ID[$t]; -rolename: t=ID -> ID[$t]; -sigparamname: t=ID -> ID[$t]; +recvarname: t=ID -> ID[$t] ; +rolename: t=ID -> ID[$t] ; +sigparamname: t=ID -> ID[$t] ; /** From 70f3abe58e13e276d09d04cf5fddbffce702cd21 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 10:15:23 +0100 Subject: [PATCH 454/539] [AllTest] Minor. --- scribble-test/src/test/scrib/tmp/Test.scr | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 09153bacf..d63ca1975 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -121,6 +121,8 @@ module tmp.Test; // Test refactoring: // refactor test to use main instead of cli + // add checking between projected-inlined against inlined-projected-imeds, graph building, etc. + // add finer-grained result verification data "..." from "..." as T; From f91baedd95eb0ea2761da84d0a4bfe81cfe2af80 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 10:16:45 +0100 Subject: [PATCH 455/539] [AllTest] Minor. --- scribble-test/src/test/scrib/tmp/Test.scr | 1 + 1 file changed, 1 insertion(+) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index d63ca1975..021991416 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -111,6 +111,7 @@ module tmp.Test; // choice-specific fairness annotations // fix codegen when -fair // CHECKME: accept branching on messages (and safety properties) -- connection should not be established if message stuck? (cf. reception error) -- issue is implementation: what is a realistic semantics for sync-connect-branching (i.e., prevent client from async progressing after messaging) -- consider reversing client/server branching side? i.e. client requests, but then receives? (and consider serverside-branching a sugar?) + // fix state numbering? also numbering mismatch between outputs, e.g., minlts // Later: // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) From 2a9aad634e3e8b4acf700c2c1392be970046e1f6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 10:48:49 +0100 Subject: [PATCH 456/539] [AllTest] Minor. --- .../core/type/name/Substitutions.java | 8 ++ .../core/visit/local/LDoArgPruner.java | 63 +++++++++++++ .../scribble/core/visit/local/LDoPruner.java | 8 +- .../visit/local/SubprotoRoleCollector.java | 91 ------------------- scribble-test/src/test/scrib/tmp/Test.scr | 4 +- 5 files changed, 74 insertions(+), 100 deletions(-) delete mode 100644 scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoRoleCollector.java diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/Substitutions.java b/scribble-core/src/main/java/org/scribble/core/type/name/Substitutions.java index 971af0bae..aea72db4e 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/Substitutions.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/Substitutions.java @@ -60,6 +60,10 @@ public Substitutions(List rold, List rnew, public Role subsRole(Role old) { + if (!this.rsubs.containsKey(old)) + { + throw new RuntimeException("Unknown role: " + old); + } return this.rsubs.get(old); } @@ -67,6 +71,10 @@ public Role subsRole(Role old) Arg subsArg(MemberName old) // ? param more convenient for accepting DataType/MessageSigName params { + if (!this.asubs.containsKey(old)) + { + throw new RuntimeException("Unknown param/arg: " + old); + } return this.asubs.get(old); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java index e57aef8f7..2622602ab 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java @@ -13,10 +13,13 @@ */ package org.scribble.core.visit.local; +import java.util.Collections; +import java.util.Deque; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.core.job.Core; import org.scribble.core.lang.SubprotoSig; @@ -24,8 +27,12 @@ import org.scribble.core.lang.local.LProjection; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.DirectedInteraction; +import org.scribble.core.type.session.DisconnectAction; import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.SType; import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.visit.STypeAggNoThrow; import org.scribble.core.visit.STypeVisitorNoThrow; import org.scribble.core.visit.Substitutor; @@ -103,3 +110,59 @@ public Set visitDo(Do n) return res; } } + + +// CHECKME: simply integrate into one with PreSubprotoRoleCollector? Or maybe still separately useful? +class SubprotoRoleCollector extends STypeAggNoThrow> +{ + protected final Core core; + + protected Deque stack = new LinkedList<>(); + + public SubprotoRoleCollector(Core core) + { + this.core = core; + } + + @Override + public Set visitDirectedInteraction(DirectedInteraction n) + { + return Stream.of(n.src, n.dst).collect(Collectors.toSet()); + } + + public Set visitDisconnect(DisconnectAction n) + { + return Stream.of(n.left, n.right).collect(Collectors.toSet()); + } + + public Set visitDo(Do n) + { + SubprotoSig sig = new SubprotoSig(n.proto, n.roles, n.args); + if (this.stack.contains(sig)) + { + return unit(n); // empty set + } + this.stack.push(sig); + LProjection target = (LProjection) n.getTarget(this.core); + List tmp = target.roles.stream() + .map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess + .collect(Collectors.toList()); + Substitutor subs = this.core.config.vf + .Substitutor(tmp, n.roles, target.params, n.args); // CHECKME: prune args? + Set res = target.def.visitWithNoThrow(subs).visitWithNoThrow(this); + this.stack.pop(); + return res; + } + + @Override + protected Set unit(SType n) + { + return Collections.emptySet(); + } + + @Override + protected Set agg(SType n, Stream> ts) + { + return ts.flatMap(x -> x.stream()).collect(Collectors.toSet()); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java index 90a92c2ee..1030f3c79 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java @@ -58,12 +58,6 @@ protected LDoPruner(LDoPruner v) this.unguarded = new HashSet<>(v.unguarded); } - // CHECKME: vf? - protected SubprotoRoleCollector newRoleCollector() - { - return new SubprotoRoleCollector(this.core); - } - // TODO: refactor to LProjection -- cf. GProtocol (e.g., getInlined, etc) public LProjection visitProjection(LProjection n) { @@ -106,7 +100,7 @@ public SType visitDo(Do n) LSeq def = visitSeq(target.def); // Changes ultimately discarded: "nested" entries only do "info collection", actual AST modifications only recoded for the top-level Projection (cf. visitProjection) this.stack.pop(); - return (def.isEmpty()) ? LSkip.SKIP : n; // Cf. unit(n) + return def.isEmpty() ? LSkip.SKIP : n; // Cf. unit(n) } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoRoleCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoRoleCollector.java deleted file mode 100644 index fc4e57c40..000000000 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoRoleCollector.java +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.core.visit.local; - -import java.util.Collections; -import java.util.Deque; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import org.scribble.core.job.Core; -import org.scribble.core.lang.SubprotoSig; -import org.scribble.core.lang.local.LProjection; -import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.Role; -import org.scribble.core.type.session.DirectedInteraction; -import org.scribble.core.type.session.DisconnectAction; -import org.scribble.core.type.session.Do; -import org.scribble.core.type.session.SType; -import org.scribble.core.type.session.local.LSeq; -import org.scribble.core.visit.STypeAggNoThrow; -import org.scribble.core.visit.Substitutor; - -// Cf. InlinedEnablerInferer (InlinedExtChoiceSubjFixer) -// Results for locals will contain "self" -class SubprotoRoleCollector extends STypeAggNoThrow> -{ - protected final Core core; - - protected Deque stack = new LinkedList<>(); - - public SubprotoRoleCollector(Core core) - { - this.core = core; - } - - @Override - public Set visitDirectedInteraction(DirectedInteraction n) - { - return Stream.of(n.src, n.dst).collect(Collectors.toSet()); - } - - public Set visitDisconnect(DisconnectAction n) - { - return Stream.of(n.left, n.right).collect(Collectors.toSet()); - } - - public Set visitDo(Do n) - { - SubprotoSig sig = new SubprotoSig(n.proto, n.roles, n.args); - if (this.stack.contains(sig)) - { - return unit(n); // empty set - } - this.stack.push(sig); - LProjection target = (LProjection) n.getTarget(this.core); - List tmp = target.roles.stream() - .map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess - .collect(Collectors.toList()); - Substitutor subs = this.core.config.vf - .Substitutor(tmp, n.roles, target.params, n.args); // CHECKME: prune args? - Set res = target.def.visitWithNoThrow(subs).visitWithNoThrow(this); - this.stack.pop(); - return res; - } - - @Override - protected Set unit(SType n) - { - return Collections.emptySet(); - } - - @Override - protected Set agg(SType n, Stream> ts) - { - return ts.flatMap(x -> x.stream()).collect(Collectors.toSet()); - } -} \ No newline at end of file diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 021991416..f033c1d24 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -79,7 +79,7 @@ module tmp.Test; // ...refactor -spin as an ext -- dropped -spin from master // Outstanding: - // ...disallow/check for reserved __ -- do in gtype translation? + // ...disallow/check for reserved __ -- do in gtype translation? is mainly for codegen though? maybe also inlining? // FIXME: qualifed sig name as non-role do-arg // CHECKME: duplicate proto mods (unit tests) @@ -97,7 +97,7 @@ module tmp.Test; // FIXME: explicit self roles/decls (core and ast) -- currently, self decls in protocols (in core) are purely cosmetic in toString // And fix self in ast locals, and astfactory // Job Module projection - // TODO: fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles -- done in core (and needs tidying) + // TODO: fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles -- done in core for now (and needs tidying) // TODO: projected imports/nonprotodecls // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) From dd37d48a1c4ba17f0c7de4a67c8d68f6daa33922 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 10:58:49 +0100 Subject: [PATCH 457/539] [AllTest] Minor refactoring of some visitors/factories. --- .../main/java/org/scribble/core/job/Core.java | 3 +- ...FactoryImpl.java => ModelFactoryBase.java} | 8 +++--- .../model/endpoint/EModelFactoryImpl.java | 4 +-- .../core/model/global/SModelFactoryImpl.java | 4 +-- .../core/visit/STypeVisitorFactory.java | 28 ++++++++----------- .../core/visit/local/LDoArgPruner.java | 8 +++--- 6 files changed, 26 insertions(+), 29 deletions(-) rename scribble-core/src/main/java/org/scribble/core/model/{ModelFactoryImpl.java => ModelFactoryBase.java} (75%) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 261c123bd..422f745d9 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -40,6 +40,7 @@ import org.scribble.core.type.session.local.LSeq; import org.scribble.core.visit.ProtoDepsCollector; import org.scribble.core.visit.STypeVisitorFactory; +import org.scribble.core.visit.STypeVisitorFactoryImpl; import org.scribble.core.visit.gather.NonProtoDepsGatherer; import org.scribble.core.visit.gather.RoleGatherer; import org.scribble.core.visit.global.GTypeVisitorFactoryImpl; @@ -68,7 +69,7 @@ public Core(ModuleName mainFullname, Map args, protected STypeVisitorFactory newSTypeVisitorFactory() { - return new STypeVisitorFactory(new GTypeVisitorFactoryImpl(), + return new STypeVisitorFactoryImpl(new GTypeVisitorFactoryImpl(), new LTypeVisitorFactoryImpl()); } diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryBase.java similarity index 75% rename from scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java rename to scribble-core/src/main/java/org/scribble/core/model/ModelFactoryBase.java index 30e58c43d..ee8adf6dd 100755 --- a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryBase.java @@ -13,13 +13,13 @@ */ package org.scribble.core.model; -// Base class for all E/SModelFactoryImpl -// N.B. this class does *not* itself implement top-level ModelFactory -public abstract class ModelFactoryImpl +// Base class for all *E/SModelFactoryImpl* +// N.B. this class does *not* itself implement the top-level ModelFactory wrapper (nor vice versa) +public abstract class ModelFactoryBase { protected ModelFactory mf = null; - public ModelFactoryImpl(ModelFactory mf) + public ModelFactoryBase(ModelFactory mf) { this.mf = mf; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java index e63854bce..552b5facd 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EModelFactoryImpl.java @@ -16,7 +16,7 @@ import java.util.Set; import org.scribble.core.model.ModelFactory; -import org.scribble.core.model.ModelFactoryImpl; +import org.scribble.core.model.ModelFactoryBase; import org.scribble.core.model.endpoint.actions.EAcc; import org.scribble.core.model.endpoint.actions.EClientWrap; import org.scribble.core.model.endpoint.actions.EDisconnect; @@ -30,7 +30,7 @@ import org.scribble.core.type.session.Payload; // Separate E/SModelFactories fits protected E/SState constructor pattern -public class EModelFactoryImpl extends ModelFactoryImpl implements EModelFactory +public class EModelFactoryImpl extends ModelFactoryBase implements EModelFactory { public EModelFactoryImpl(ModelFactory mf) diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java index e4846302a..135da4586 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModelFactoryImpl.java @@ -16,7 +16,7 @@ import java.util.Map; import org.scribble.core.model.ModelFactory; -import org.scribble.core.model.ModelFactoryImpl; +import org.scribble.core.model.ModelFactoryBase; import org.scribble.core.model.endpoint.EFsm; import org.scribble.core.model.global.actions.SAcc; import org.scribble.core.model.global.actions.SClientWrap; @@ -31,7 +31,7 @@ import org.scribble.core.type.session.Payload; // Separate E/SModelFactories fits protected E/SState constructor pattern -public class SModelFactoryImpl extends ModelFactoryImpl implements SModelFactory +public class SModelFactoryImpl extends ModelFactoryBase implements SModelFactory { public SModelFactoryImpl(ModelFactory mf) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java index d88e4b091..3700b49ce 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java @@ -24,29 +24,25 @@ import org.scribble.core.visit.global.GTypeVisitorFactory; import org.scribble.core.visit.local.LTypeVisitorFactory; -// No interface due to fields -- CHECKME: factor out "neutral" factory field for RecPruner etc. -public class STypeVisitorFactory +// Not an interface due to fields +public abstract class STypeVisitorFactory { - public GTypeVisitorFactory global; - public LTypeVisitorFactory local; + public final GTypeVisitorFactory global; + public final LTypeVisitorFactory local; - public STypeVisitorFactory(GTypeVisitorFactory global, LTypeVisitorFactory local) + public STypeVisitorFactory(GTypeVisitorFactory global, + LTypeVisitorFactory local) { this.global = global; this.local = local; } - public > Substitutor Substitutor( - List rold, List rnew, - List> aold, - List> anew) - { - return new Substitutor<>(rold, rnew, aold, anew); - } + public abstract > Substitutor + Substitutor(List rold, List rnew, + List> aold, + List> anew); - public > RecPruner RecPruner() - { - return new RecPruner<>(); - } + public abstract > RecPruner + RecPruner(); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java index 2622602ab..5d9d55408 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java @@ -40,13 +40,13 @@ public class LDoArgPruner extends STypeVisitorNoThrow { private final Core core; - public LDoArgPruner(Core core) + protected LDoArgPruner(Core core) { this.core = core; } // CHECKME: vf? - protected PreSubprotoRoleCollector newPreRoleCollector() // N.B. "Pre" role collector + protected PreSubprotoRoleCollector newRoleCollector() // N.B. "Pre" role collector { return new PreSubprotoRoleCollector(this.core); } @@ -56,7 +56,7 @@ protected PreSubprotoRoleCollector newPreRoleCollector() // N.B. "Pre" role col public LProjection visitProjection( LProjection n) { - Set used = n.def.visitWithNoThrow(newPreRoleCollector()); // CHECKME: vf? + Set used = n.def.visitWithNoThrow(newRoleCollector()); // CHECKME: vf? List rs = n.roles.stream() .filter(x -> used.contains(x) || x.equals(n.self)) // FIXME: self roledecl not actually being a self role is a mess .collect(Collectors.toList()); @@ -71,7 +71,7 @@ public Do visitDo(Do n) LProjection target = (LProjection) n.getTarget(this.core); GProtocol inlined = this.core.getContext().getInlined(target.global); List pruned = new LinkedList<>(); - Set rs = n.visitWithNoThrow(newPreRoleCollector()); // N.B. does subproto visiting, unlike RoleGather + Set rs = n.visitWithNoThrow(newRoleCollector()); // N.B. does subproto visiting, unlike RoleGather pruned = inlined.roles.stream() .filter(x -> rs.contains(x) || x.equals(target.self)) .map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess From c5dd6fc82356cfa4f4c55a9dec8aec529fc7d818 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 10:59:26 +0100 Subject: [PATCH 458/539] [AllTest] Added missing file. --- .../core/visit/STypeVisitorFactoryImpl.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java new file mode 100644 index 000000000..00e9f373c --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java @@ -0,0 +1,51 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.core.visit; + +import java.util.List; + +import org.scribble.core.type.kind.NonRoleParamKind; +import org.scribble.core.type.kind.ProtoKind; +import org.scribble.core.type.name.MemberName; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Arg; +import org.scribble.core.type.session.Seq; +import org.scribble.core.visit.global.GTypeVisitorFactory; +import org.scribble.core.visit.local.LTypeVisitorFactory; + +// No interface due to fields -- CHECKME: factor out "neutral" factory field for RecPruner etc. +public class STypeVisitorFactoryImpl extends STypeVisitorFactory +{ + public STypeVisitorFactoryImpl(GTypeVisitorFactory global, + LTypeVisitorFactory local) + { + super(global, local); + } + + @Override + public > Substitutor + Substitutor(List rold, List rnew, + List> aold, + List> anew) + { + return new Substitutor<>(rold, rnew, aold, anew); + } + + @Override + public > RecPruner + RecPruner() + { + return new RecPruner<>(); + } +} From 73a425ed0872926bc20af3b410b7d2420a2a67b3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 11:04:19 +0100 Subject: [PATCH 459/539] [AllTest] Minor. --- .../src/main/java/org/scribble/ast/ScribNode.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java index dc8d56e3c..32115ef0b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ScribNode.java @@ -29,7 +29,9 @@ */ public interface ScribNode extends Tree { - CommonTree getSource(); // TODO: deprecate + CommonTree getSource(); + // Can explicitly track an "original" source, cf. always using the "current" node as its own source + // Can be better for some error messages, e.g., during/after some AST transfomations @Override ScribNode getParent(); @@ -45,13 +47,13 @@ public interface ScribNode extends Tree ScribNode accept(AstVisitor nv) throws ScribException; // The "top-level" method, e.g., module.accept(v) (cf. Job::runVisitorOnModule) ScribNode visitChildren(AstVisitor nv) throws ScribException; - // "Simpler" version than above + // For "simpler" visiting patterns than above default T visitWith(SimpleAstVisitor v) throws ScribException // "Top-level" visitor entry method { return v.visit(this); // N.B. ScribNode has getParent } - default T visitWith(SimpleAstVisitorNoThrows v) // "Top-level" visitor entry method + default T visitWith(SimpleAstVisitorNoThrows v) // "Top-level" visitor entry method, c.f. STypeAggNoThrow { return v.visit(this); // N.B. ScribNode has getParent } From 6cee2ca64c0ab8be9a27f4b1fbeda88203b5c729 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 11:14:43 +0100 Subject: [PATCH 460/539] [AllTest] Misc refactoring. --- scribble-core/src/main/java/org/scribble/core/job/Core.java | 2 +- .../scribble/core/visit/{ => gather}/ProtoDepsCollector.java | 3 +-- .../main/java/org/scribble/core/visit/local/LDoPruner.java | 3 +++ .../core/visit/local/SubprotoExtChoiceSubjFixer.java | 5 +++++ scribble-core/src/main/java/org/scribble/util/Constants.java | 2 +- scribble-test/src/test/scrib/tmp/Test.scr | 1 + 6 files changed, 12 insertions(+), 4 deletions(-) rename scribble-core/src/main/java/org/scribble/core/visit/{ => gather}/ProtoDepsCollector.java (94%) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 422f745d9..ba1cbcd70 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -38,10 +38,10 @@ import org.scribble.core.type.session.STypeFactory; import org.scribble.core.type.session.global.GSeq; import org.scribble.core.type.session.local.LSeq; -import org.scribble.core.visit.ProtoDepsCollector; import org.scribble.core.visit.STypeVisitorFactory; import org.scribble.core.visit.STypeVisitorFactoryImpl; import org.scribble.core.visit.gather.NonProtoDepsGatherer; +import org.scribble.core.visit.gather.ProtoDepsCollector; import org.scribble.core.visit.gather.RoleGatherer; import org.scribble.core.visit.global.GTypeVisitorFactoryImpl; import org.scribble.core.visit.local.LDoArgPruner; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java b/scribble-core/src/main/java/org/scribble/core/visit/gather/ProtoDepsCollector.java similarity index 94% rename from scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java rename to scribble-core/src/main/java/org/scribble/core/visit/gather/ProtoDepsCollector.java index 55966a7b0..cf5fcc334 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/ProtoDepsCollector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/gather/ProtoDepsCollector.java @@ -11,7 +11,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.scribble.core.visit; +package org.scribble.core.visit.gather; import java.util.stream.Stream; @@ -20,7 +20,6 @@ import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Do; import org.scribble.core.type.session.Seq; -import org.scribble.core.visit.gather.STypeGatherer; // Result should not contain duplicates (i.e., due to Choice/Seq) // Result does not necessarily contain root proto (protodecl is not an SType), but may do so via dependencies diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java index 1030f3c79..204d5c1f6 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java @@ -34,6 +34,9 @@ import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.STypeVisitorNoThrow; + + +// Pre: LDoArgPruner (for basic subproto visiting pattern) // Cf. RecPruner public class LDoPruner //extends DoPruner extends STypeVisitorNoThrow diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java index 76c4fa5ea..477485d87 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java @@ -28,7 +28,9 @@ import org.scribble.core.type.session.SType; import org.scribble.core.type.session.local.LSeq; +// Pre: LDoArgPruner (for basic subproto visiting pattern), LDoPruner (to avoid infinite looping when "stackless" subproto visiting) // super takes care of rec/continue, here just additionally handle "do" +// A "stackless" subproto visitor, c.f. LDoPruner public class SubprotoExtChoiceSubjFixer extends InlinedExtChoiceSubjFixer { protected final Core core; @@ -93,6 +95,9 @@ public Optional visitDo(Do n) return this.protos.get(n.proto); } LProjection imed = core.getContext().getProjection(n.proto); + + // FIXME: subs + return imed.def.visitWithNoThrow(this); // CHECKME: how about looking up subj from inlined? } } diff --git a/scribble-core/src/main/java/org/scribble/util/Constants.java b/scribble-core/src/main/java/org/scribble/util/Constants.java index 2187afc7e..610243763 100644 --- a/scribble-core/src/main/java/org/scribble/util/Constants.java +++ b/scribble-core/src/main/java/org/scribble/util/Constants.java @@ -14,7 +14,7 @@ package org.scribble.util; -// FIXME: cannot use AntlrConstants from org.scribble.parser due to Maven dependency restrictions +// FIXME: cannot use Antlr constants from org.scribble.parser (e.g., ScribbleParser) due to Maven dependency restrictions public class Constants { public static final String SCRIBBLE_FILE_EXTENSION = "scr"; // Used within core to obtain path from ModuleName for imports diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index f033c1d24..37a3a7725 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -112,6 +112,7 @@ module tmp.Test; // fix codegen when -fair // CHECKME: accept branching on messages (and safety properties) -- connection should not be established if message stuck? (cf. reception error) -- issue is implementation: what is a realistic semantics for sync-connect-branching (i.e., prevent client from async progressing after messaging) -- consider reversing client/server branching side? i.e. client requests, but then receives? (and consider serverside-branching a sugar?) // fix state numbering? also numbering mismatch between outputs, e.g., minlts + // wrap API gen (and refactor wrap AST hierarchy, e.g., base classes) // Later: // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) From 4f39cdc244913a7307c2becf806b2784b594adb3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 11:43:28 +0100 Subject: [PATCH 461/539] [WIP] Revising: projected subproto do-arg pruning and do-pruning. --- .../org/scribble/core/lang/SubprotoSig.java | 33 ++++++++++--------- .../core/type/name/Substitutions.java | 25 ++++++++++++-- .../core/visit/STypeVisitorFactory.java | 10 +++++- .../core/visit/STypeVisitorFactoryImpl.java | 4 +-- .../org/scribble/core/visit/Substitutor.java | 26 +++++++++------ .../scribble/core/visit/local/LDoPruner.java | 19 +++++++++-- 6 files changed, 82 insertions(+), 35 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java index e07fca022..b70a71a09 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java @@ -14,7 +14,6 @@ package org.scribble.core.lang; import java.util.Collections; -import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; @@ -62,24 +61,26 @@ public SubprotoSig(LProjection n) private static List> paramsToArgs( List> params) { - List> args = new LinkedList<>(); // Convert MemberName params to Args -- cf. NonRoleArgList::getParamKindArgs - for (MemberName n : params) + return params.stream().map(x -> paramToArg(x)).collect(Collectors.toList()); + } + + // TODO: refactor, into params? + public static Arg paramToArg( + MemberName n) // Omit " extends NonRoleParamKind" for param, more flexible without harm + { + if (n instanceof DataName) + { + return (DataName) n; + } + else if (n instanceof SigName) + { + return (SigName) n; + } + else { - if (n instanceof DataName) - { - args.add((DataName) n); - } - else if (n instanceof SigName) - { - args.add((SigName) n); - } - else - { - throw new RuntimeException("[TODO] : " + n.getClass() + "\n\t" + n); - } + throw new RuntimeException("[TODO] : " + n.getClass() + "\n\t" + n); } - return args; } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/Substitutions.java b/scribble-core/src/main/java/org/scribble/core/type/name/Substitutions.java index aea72db4e..b04baf91b 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/Substitutions.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/Substitutions.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Map; +import org.scribble.core.lang.SubprotoSig; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.session.Arg; @@ -59,21 +60,39 @@ public Substitutions(List rold, List rnew, }*/ public Role subsRole(Role old) + { + return subsRole(old, false); + } + + public Role subsRole(Role old, boolean passive) { if (!this.rsubs.containsKey(old)) { - throw new RuntimeException("Unknown role: " + old); + if (!passive) + { + throw new RuntimeException("Unknown role: " + old); + } + return old; } return this.rsubs.get(old); } + public Arg subsArg(MemberName old) + { + return subsArg(old, false); + } + public // - Arg subsArg(MemberName old) + Arg subsArg(MemberName old, boolean passive) // ? param more convenient for accepting DataType/MessageSigName params { if (!this.asubs.containsKey(old)) { - throw new RuntimeException("Unknown param/arg: " + old); + if (!passive) + { + throw new RuntimeException("Unknown param/arg: " + old); + } + return SubprotoSig.paramToArg(old); } return this.asubs.get(old); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java index 3700b49ce..34d78b1c8 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactory.java @@ -37,10 +37,18 @@ public STypeVisitorFactory(GTypeVisitorFactory global, this.local = local; } + public > Substitutor + Substitutor(List rold, List rnew, + List> aold, + List> anew) + { + return Substitutor(rold, rnew, aold, anew, false); + } + public abstract > Substitutor Substitutor(List rold, List rnew, List> aold, - List> anew); + List> anew, boolean passive); public abstract > RecPruner RecPruner(); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java index 00e9f373c..691719c32 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/STypeVisitorFactoryImpl.java @@ -37,9 +37,9 @@ public STypeVisitorFactoryImpl(GTypeVisitorFactory global, public > Substitutor Substitutor(List rold, List rnew, List> aold, - List> anew) + List> anew, boolean passive) { - return new Substitutor<>(rold, rnew, aold, anew); + return new Substitutor<>(rold, rnew, aold, anew, passive); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java index 4b9534415..b5259d7b4 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/Substitutor.java @@ -37,12 +37,14 @@ public class Substitutor> extends STypeVisitorNoThrow { private Substitutions subs; + private boolean passive; protected Substitutor(List rold, List rnew, List> aold, - List> anew) + List> anew, boolean passive) { this.subs = new Substitutions(rold, rnew, aold, anew); + this.passive = passive; } @Override @@ -50,7 +52,8 @@ public SType visitChoice(Choice n) { List blocks = n.blocks.stream().map(x -> visitSeq(x)) .collect(Collectors.toList()); - return n.reconstruct(n.getSource(), this.subs.subsRole(n.subj), blocks); + return n.reconstruct(n.getSource(), + this.subs.subsRole(n.subj, this.passive), blocks); } @Override @@ -62,24 +65,27 @@ public SType visitDirectedInteraction(DirectedInteraction n) MemberName name = (MemberName) msg; if (this.subs.hasArg(name)) { - msg = (Msg) this.subs.subsArg(name); + msg = (Msg) this.subs.subsArg(name, this.passive); } } - return n.reconstruct(n.getSource(), msg, this.subs.subsRole(n.src), - this.subs.subsRole(n.dst)); + return n.reconstruct(n.getSource(), msg, + this.subs.subsRole(n.src, this.passive), + this.subs.subsRole(n.dst, this.passive)); } @Override public SType visitDisconnect(DisconnectAction n) { - return n.reconstruct(n.getSource(), this.subs.subsRole(n.left), - this.subs.subsRole(n.right)); + return n.reconstruct(n.getSource(), + this.subs.subsRole(n.left, this.passive), + this.subs.subsRole(n.right, this.passive)); } @Override public SType visitDo(Do n) { - List roles = n.roles.stream().map(x -> this.subs.subsRole(x)) + List roles = n.roles.stream() + .map(x -> this.subs.subsRole(x, this.passive)) .collect(Collectors.toList()); List> args = new LinkedList<>(); for (Arg a : n.args) @@ -88,11 +94,11 @@ public SType visitDo(Do n) { if (a instanceof DataName) { - a = this.subs.subsArg((DataName) a); + a = this.subs.subsArg((DataName) a, this.passive); } else if (a instanceof SigName) { - a = this.subs.subsArg((SigName) a); + a = this.subs.subsArg((SigName) a, this.passive); } } args.add(a); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java index 204d5c1f6..7eaa59755 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java @@ -21,10 +21,10 @@ import java.util.stream.Collectors; import org.scribble.core.job.Core; -import org.scribble.core.lang.Protocol; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.local.LProjection; import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; import org.scribble.core.type.session.Do; import org.scribble.core.type.session.Recursion; @@ -33,6 +33,7 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.STypeVisitorNoThrow; +import org.scribble.core.visit.Substitutor; @@ -99,8 +100,20 @@ public SType visitDo(Do n) return this.unguarded.contains(sig) ? LSkip.SKIP : n; } this.stack.push(sig); - Protocol target = n.getTarget(this.core); - LSeq def = visitSeq(target.def); + LProjection target = (LProjection) n.getTarget(this.core); // cf. visitProjection (i.e., for projections) + + // FIXME: subs? + // Duplicated from SubprotoRoleCollector +List tmp = target.roles.stream() + .map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess + .collect(Collectors.toList()); + + System.out.println("aaa: " + target.fullname + " ,, " + target.roles + " ,, " + target.self + " ,, " + tmp + " ,, " + n.roles + "\n\t" + n); + +Substitutor subs = this.core.config.vf + .Substitutor(tmp, n.roles, target.params, n.args, true); + + LSeq def = visitSeq(subs.visitSeq(target.def)); // Changes ultimately discarded: "nested" entries only do "info collection", actual AST modifications only recoded for the top-level Projection (cf. visitProjection) this.stack.pop(); return def.isEmpty() ? LSkip.SKIP : n; // Cf. unit(n) From c71feada1bc2d2aeeb0b2b7f5dbc50ac3484af7c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 13:06:09 +0100 Subject: [PATCH 462/539] [AllTest] Continued: projected subproto do-arg pruning and do-pruning. --- .../core/visit/global/SubprotoProjector.java | 5 ++- .../core/visit/local/LDoArgPruner.java | 38 ++++++++++++++----- .../scribble/core/visit/local/LDoPruner.java | 12 ++++-- scribble-test/src/test/scrib/tmp/Test.scr | 27 +++++++++++++ 4 files changed, 67 insertions(+), 15 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java index 7338018d2..72ab4cb33 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java @@ -74,8 +74,9 @@ public LType visitDo(Do n) List used = corec.getInlined(proto).roles.stream() // N.B. global (inlined) roles -- still need to prune roles w.r.t. localised projection .map(x -> subs.subsRole(x)).collect(Collectors.toList()); List rs = n.roles.stream().filter(x -> used.contains(x)) - .map(x -> x.equals(this.self) ? Role.SELF : x) - // CHECKME: "self" also explcitily used for Choice, but implicitly for MessageTransfer, inconsistent? + //.map(x -> x.equals(this.self) ? Role.SELF : x) + // CHECKME: now leaving self fully to LDoArgPruner -- easier to do role subs for do-visiting + // CHECKME: syntax: "self" explictly used for Choice subject, but implicitly for MessageTransfer, inconsistent? .collect(Collectors.toList()); return this.core.config.tf.local.LDo(null, fullname, rs, n.args); // TODO CHECKME: prune args? } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java index 5d9d55408..9c27a1532 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java @@ -23,7 +23,6 @@ import org.scribble.core.job.Core; import org.scribble.core.lang.SubprotoSig; -import org.scribble.core.lang.global.GProtocol; import org.scribble.core.lang.local.LProjection; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; @@ -39,6 +38,8 @@ public class LDoArgPruner extends STypeVisitorNoThrow { private final Core core; + + private Role self; protected LDoArgPruner(Core core) { @@ -56,6 +57,7 @@ protected PreSubprotoRoleCollector newRoleCollector() // N.B. "Pre" role collec public LProjection visitProjection( LProjection n) { + this.self = n.self; Set used = n.def.visitWithNoThrow(newRoleCollector()); // CHECKME: vf? List rs = n.roles.stream() .filter(x -> used.contains(x) || x.equals(n.self)) // FIXME: self roledecl not actually being a self role is a mess @@ -68,14 +70,20 @@ public LProjection visitProjection( public Do visitDo(Do n) { - LProjection target = (LProjection) n.getTarget(this.core); - GProtocol inlined = this.core.getContext().getInlined(target.global); + /*LProjection target = (LProjection) n.getTarget(this.core); + GProtocol inlined = this.core.getContext().getInlined(target.global);*/ List pruned = new LinkedList<>(); + + //System.out.println("0000: " + target.self + " ,, " + inlined.roles +" ,, " + n); + Set rs = n.visitWithNoThrow(newRoleCollector()); // N.B. does subproto visiting, unlike RoleGather - pruned = inlined.roles.stream() - .filter(x -> rs.contains(x) || x.equals(target.self)) - .map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess + pruned = n.roles.stream() + .filter(x -> rs.contains(x) || x.equals(this.self)) + .map(x -> x.equals(this.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess .collect(Collectors.toList()); + + //System.out.println("1111: " + " ,, " + rs + " ,, " + pruned); + return n.reconstruct(n.getSource(), n.proto, pruned, n.args); // CHECKME: prune args? } } @@ -101,11 +109,23 @@ public Set visitDo(Do n) LProjection target = (LProjection) n.getTarget(this.core); List tmp = this.core.getContext().getInlined(target.global).roles // Currently, do-args arity matches that of inlined, i.e., not necessarily the arity of the actual local target (cf. InlinedProjector.visitDo) - .stream().map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess + .stream()//.map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess .collect(Collectors.toList()); Substitutor subs = this.core.config.vf - .Substitutor(tmp, n.roles, target.params, n.args); // CHECKME: prune args? + .Substitutor(tmp, n.roles, target.params, n.args, true); // true (passive) to ignore "self" // CHECKME: prune args? + + //System.out.println("2222:\n" + tmp + " ,," + n.roles); + //System.out.println("\n" + target.def); + //System.out.println("\n" + target.def.visitWithNoThrow(subs)); + if (2 > 1) + { + //System.exit(1); + } + + Set res = target.def.visitWithNoThrow(subs).visitWithNoThrow(this); + + //System.out.println(res + " \n"); this.stack.pop(); return res; } @@ -145,7 +165,7 @@ public Set visitDo(Do n) this.stack.push(sig); LProjection target = (LProjection) n.getTarget(this.core); List tmp = target.roles.stream() - .map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess + //.map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess .collect(Collectors.toList()); Substitutor subs = this.core.config.vf .Substitutor(tmp, n.roles, target.params, n.args); // CHECKME: prune args? diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java index 7eaa59755..1f6d1b5b7 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java @@ -43,6 +43,8 @@ public class LDoPruner //extends DoPruner extends STypeVisitorNoThrow { protected final Core core; + + private Role self; protected final Deque stack; @@ -58,6 +60,7 @@ protected LDoPruner(Core core) protected LDoPruner(LDoPruner v) { this.core = v.core; + this.self = v.self; this.stack = new LinkedList<>(v.stack); this.unguarded = new HashSet<>(v.unguarded); } @@ -65,6 +68,7 @@ protected LDoPruner(LDoPruner v) // TODO: refactor to LProjection -- cf. GProtocol (e.g., getInlined, etc) public LProjection visitProjection(LProjection n) { + this.self = n.self; this.stack.clear(); this.unguarded.clear(); @@ -104,14 +108,14 @@ public SType visitDo(Do n) // FIXME: subs? // Duplicated from SubprotoRoleCollector -List tmp = target.roles.stream() + List tmp = target.roles.stream() .map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess .collect(Collectors.toList()); - System.out.println("aaa: " + target.fullname + " ,, " + target.roles + " ,, " + target.self + " ,, " + tmp + " ,, " + n.roles + "\n\t" + n); + //System.out.println("aaa: " + this.self + " ,, " + target.fullname + " ,, " + target.roles + " ,, " + target.self + " ,, " + tmp + " ,, " + n.roles + "\n\t" + n); -Substitutor subs = this.core.config.vf - .Substitutor(tmp, n.roles, target.params, n.args, true); + Substitutor subs = this.core.config.vf.Substitutor(tmp, + n.roles, target.params, n.args, true); // true (passive) to ignore non-fixed ext-choice subjs (e.g., good.efsm.gdo.Test11) LSeq def = visitSeq(subs.visitSeq(target.def)); // Changes ultimately discarded: "nested" entries only do "info collection", actual AST modifications only recoded for the top-level Projection (cf. visitProjection) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 37a3a7725..2a57a616f 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -130,6 +130,33 @@ module tmp.Test; data "..." from "..." as T; +/* +global protocol Proto1(role A, role B) +{ + do Proto1Aux(A, B); +} + +aux global protocol Proto1Aux(role C, role D) +{ + 2() from C to D; + //do Proto1(B, A); // Testing LDoArgPruner, do role pruning +} +//*/ + +//* +global protocol Proto1(role A, role B) +{ + 1() from A to B; + do Proto1Aux(B, A); +} + +aux global protocol Proto1Aux(role A, role B) +{ + 2() from A to B; + do Proto1(B, A); // Testing LDoArgPruner, this.self vs. target.self +} +//*/ + /* global protocol Proto1(role A, role B, role C) { From ed91994df04d5a68350911133cb5ad2061fd6929 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 13:19:17 +0100 Subject: [PATCH 463/539] [AllTest] Continued: projected subproto do-arg pruning and do-pruning. --- .../scribble/ast/local/LProjectionDecl.java | 2 +- .../scribble/core/visit/local/LDoPruner.java | 1 + .../local/SubprotoExtChoiceSubjFixer.java | 20 +++++++++++++++++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java b/scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java index 964a45c70..0baa89b71 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LProjectionDecl.java @@ -80,7 +80,7 @@ public String toString() { // Duplicated from ProtoDecl ProtoModList mods = getModifierListChild(); - return (mods.isEmpty() ? "" : mods + " ") + getHeaderChild() + " " + return (mods.isEmpty() ? "" : mods + " ") + getHeaderChild() + " " // FIXME: self role decl (cf. LProtocol.rolesToString) + "projects " + getGlobalChild() + " " // Cf. core.lang.local.LProjection + getDefChild(); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java index 1f6d1b5b7..1f9f5e388 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java @@ -108,6 +108,7 @@ public SType visitDo(Do n) // FIXME: subs? // Duplicated from SubprotoRoleCollector + // FIXME: factor out with, e.g., SubprotoExtChoiceSubjFixer List tmp = target.roles.stream() .map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess .collect(Collectors.toList()); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java index 477485d87..753717dea 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java @@ -15,8 +15,10 @@ import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; import org.scribble.core.job.Core; import org.scribble.core.lang.Protocol; @@ -27,6 +29,7 @@ import org.scribble.core.type.session.Do; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.visit.Substitutor; // Pre: LDoArgPruner (for basic subproto visiting pattern), LDoPruner (to avoid infinite looping when "stackless" subproto visiting) // super takes care of rec/continue, here just additionally handle "do" @@ -94,10 +97,23 @@ public Optional visitDo(Do n) { return this.protos.get(n.proto); } - LProjection imed = core.getContext().getProjection(n.proto); + //LProjection imed = core.getContext().getProjection(n.proto); + // Cf. LDoPruner.visitDo + LProjection imed = (LProjection) n.getTarget(this.core); // FIXME: subs + // FIXME: factor out with LDoPruner + List tmp = imed.roles.stream() + .map(x -> x.equals(imed.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess + .collect(Collectors.toList()); - return imed.def.visitWithNoThrow(this); // CHECKME: how about looking up subj from inlined? + //System.out.println("aaa: " + this.self + " ,, " + target.fullname + " ,, " + target.roles + " ,, " + target.self + " ,, " + tmp + " ,, " + n.roles + "\n\t" + n); + + Substitutor subs = this.core.config.vf.Substitutor(tmp, + n.roles, imed.params, n.args, true); // true (passive) for fixing ext-choice subjs (e.g., bad.liveness.roleprog.unfair.Test06) + + return visitSeq(subs.visitSeq(imed.def)); + + //return imed.def.visitWithNoThrow(this); // CHECKME: how about looking up subj from inlined? } } From d97f3382d070c92ec18e844a4bb1300e3483fed7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 13:22:45 +0100 Subject: [PATCH 464/539] [AllTest] Continued: projected subproto do-arg pruning and do-pruning. --- scribble-test/src/test/scrib/tmp/Test.scr | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 2a57a616f..bcb2925c1 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -130,7 +130,7 @@ module tmp.Test; data "..." from "..." as T; -/* +//* global protocol Proto1(role A, role B) { do Proto1Aux(A, B); @@ -138,12 +138,13 @@ global protocol Proto1(role A, role B) aux global protocol Proto1Aux(role C, role D) { - 2() from C to D; - //do Proto1(B, A); // Testing LDoArgPruner, do role pruning + 2() from C to D; // Testing LDoArgPruner, do role pruning + do Proto1(D, C); // Testing -project output, proto deps + // FIXME: protodeps } //*/ -//* +/* global protocol Proto1(role A, role B) { 1() from A to B; From e43ea9c4b978fba29cf08d5f9496a091c098dccc Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 14:44:36 +0100 Subject: [PATCH 465/539] [AllTest] Fixed Core proto deps gathering. --- .../src/main/java/org/scribble/job/Job.java | 1 + .../main/java/org/scribble/core/job/Core.java | 31 ++++++++++--------- scribble-test/src/test/scrib/tmp/Test.scr | 11 ++++--- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 5e4eea49d..04d40911f 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -183,6 +183,7 @@ public Map getProjections(GProtoName fullname, warningPrintln( "[TODO] Module projection incomplete, missing imports and non-proto decls: " + fullname + "@" + self); + // CHECKME: nonprotos should refer to source global module? i.e., projection modules should import globals? maybe consistent with "projects" clause return Collections.emptyMap(); //FIXME: build output Modules diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index ba1cbcd70..48a22710d 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -14,6 +14,7 @@ package org.scribble.core.job; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -402,27 +403,29 @@ public Map, LProjection> getProjections( ProtoName fullname, Role self) throws ScribException { Map, LProjection> res = new HashMap<>(); + Set> nonprotos = new LinkedHashSet<>(); + LProjection root = this.context.getProjection(fullname, self); - LProjection proj = this.context.getProjection(fullname, self); - res.put(proj.fullname, proj); - - List> pdeps = proj.def - .gather(new ProtoDepsCollector()::visit) - .collect(Collectors.toList()); - for (ProtoName pfullname : pdeps) + List> todo = new LinkedList<>(); + todo.add(root.fullname); + while (!todo.isEmpty()) { - res.put(pfullname, this.context.getProjection(pfullname)); + ProtoName pfullname = todo.remove(0); + LProjection proj = this.context.getProjection(pfullname); + res.put(pfullname, proj); + proj.def.gather(new ProtoDepsCollector()::visit) + .filter(x -> !res.containsKey(x)).forEachOrdered(x -> todo.add(x)); + proj.def.gather(new NonProtoDepsGatherer()::visit) + .forEachOrdered(x -> nonprotos.add(x)); } - List> ns = proj.def - .gather(new NonProtoDepsGatherer()::visit) - .collect(Collectors.toList()); - if (!ns.isEmpty()) + if (!nonprotos.isEmpty()) + // CHECKME: best way to handle mixtured of proto and nonproto dependencies? + // nonprotos should refer to source global module? i.e., projection modules should import globals? maybe consistent with "projects" clause { throw new RuntimeException( - "[TODO] Non-proto dependencies: " + ns + "\n\t" + proj); + "[TODO] Non-proto dependencies: " + nonprotos + "\n\t" + root); } - return res; } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index bcb2925c1..438575001 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -130,7 +130,7 @@ module tmp.Test; data "..." from "..." as T; -//* +/* global protocol Proto1(role A, role B) { do Proto1Aux(A, B); @@ -139,12 +139,13 @@ global protocol Proto1(role A, role B) aux global protocol Proto1Aux(role C, role D) { 2() from C to D; // Testing LDoArgPruner, do role pruning - do Proto1(D, C); // Testing -project output, proto deps - // FIXME: protodeps + //do Proto1(C, D); + //do Proto1(D, C); // Testing -project output, proto deps } //*/ -/* + +//* global protocol Proto1(role A, role B) { 1() from A to B; @@ -155,9 +156,11 @@ aux global protocol Proto1Aux(role A, role B) { 2() from A to B; do Proto1(B, A); // Testing LDoArgPruner, this.self vs. target.self + //do Proto1(A, B); } //*/ + /* global protocol Proto1(role A, role B, role C) { From bfcd60d3db4ceca0fc6ba021c9c15c5b9c925b64 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 14:53:15 +0100 Subject: [PATCH 466/539] [AllTest] Minor. --- .../main/java/org/scribble/cli/CommandLine.java | 2 +- .../java/callbackapi/CBEndpointApiGenerator3.java | 5 +++-- .../java/sessionapi/SessionApiGenerator.java | 7 ++++--- .../codegen/java/statechanapi/BranchSockGen.java | 3 ++- .../java/statechanapi/ioifaces/BranchIfaceGen.java | 3 ++- .../ioifaces/IOInterfacesGenerator.java | 14 +++++++++----- .../org/scribble/core/model/global/SConfig.java | 4 ++-- .../org/scribble/core/model/global/SModel.java | 2 +- .../scribble/runtime/session/SessionEndpoint.java | 2 +- 9 files changed, 25 insertions(+), 17 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 7cee9cbdd..3743c6326 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -468,7 +468,7 @@ protected void outputClasses(Map classes) { f = path -> { System.out.println(path + ":\n" + classes.get(path)); }; } - classes.keySet().stream().forEach(f); + classes.keySet().forEach(f); } protected static void runDot(String dot, String png) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index a3d03aa7f..c12358dc3 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -557,13 +557,14 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, .map(a -> "__" + this.getCallbackSuffix.apply(a)).collect(Collectors.joining()); // FIXME: factor out messageIf.addInterfaces(iface); } - s.getActions().stream().map(a -> a.peer).distinct().forEach(r -> + s.getActions().stream().map(a -> a.peer).distinct().forEachOrdered(r -> { ClassBuilder roleClass = stateClass.newMemberClass(r.toString()); roleClass.addModifiers("public", "static"); ConstructorBuilder roleCons = roleClass.newConstructor(); roleCons.addModifiers("private"); - s.getActions().stream().filter(a -> a.peer.equals(r)).forEach(a -> + s.getActions().stream().filter(a -> a.peer.equals(r)) + .forEachOrdered(a -> { String opName = SessionApiGenerator.getOpClassName(a.mid); ClassBuilder opClass = roleClass.newMemberClass(opName); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index d7c912554..6407c429c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -75,7 +75,8 @@ public Map generateApi() Map map = new HashMap<>(); map.put(path, sb.toString()); - this.classes.keySet().stream().forEach(n -> map.put(n, this.classes.get(n).build())); + this.classes.keySet().stream() + .forEachOrdered(n -> map.put(n, this.classes.get(n).build())); return map; } @@ -124,8 +125,8 @@ private void constructSessionClass() fb3.setExpression(SessionApiGenerator.SESSIONTYPEFACTORY_CLASS + ".parseGlobalProtocolName(\"" + gpn + "\")"); - this.roles.stream().forEach((r) -> addRoleField(this.cb, r)); - this.mids.stream().forEach((mid) -> addOpField(this.cb, mid)); + this.roles.forEach(r -> addRoleField(this.cb, r)); + this.mids.forEach(mid -> addOpField(this.cb, mid)); ConstructorBuilder ctor = this.cb.newConstructor(); ctor.addModifiers(JavaBuilder.PUBLIC); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java index 6c62c24c2..68b0e04c4 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java @@ -85,7 +85,8 @@ protected void addMethods() throws ScribException EnumBuilder eb = cb.newMemberEnum(enumClass); eb.addModifiers(JavaBuilder.PUBLIC); eb.addInterfaces(OPENUM_INTERFACE); - this.curr.getDetActions().stream().forEach((a) -> eb.addValues(SessionApiGenerator.getOpClassName(a.mid))); + this.curr.getDetActions().forEach( + a -> eb.addValues(SessionApiGenerator.getOpClassName(a.mid))); addDirectBranchCallbackMethod(ROLE_PARAM, MESSAGE_VAR, OP, main, peer); // Hack: callback apigen while i/o i/f's not supported for connect/accept/etc } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java index 431ca279b..90c0f47c9 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/BranchIfaceGen.java @@ -84,7 +84,8 @@ protected void addBranchEnum() EnumBuilder eb = this.ib.newMemberEnum(getBranchInterfaceEnumName(self, this.curr)); eb.addModifiers(JavaBuilder.PUBLIC); eb.addInterfaces(ScribSockGen.OPENUM_INTERFACE); - this.curr.getDetActions().stream().forEach((a) -> eb.addValues(SessionApiGenerator.getOpClassName(a.mid))); + this.curr.getDetActions() + .forEach(a -> eb.addValues(SessionApiGenerator.getOpClassName(a.mid))); } // Don't add Action Interfaces (added to CaseInterface) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index cc66ab683..caf8bfce4 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -190,11 +190,15 @@ public Map generateApi() { Map output = new HashMap<>(); String prefix = getIOInterfacePackageName(this.gpn, getSelf()).replace('.', '/') + "/"; - this.actions.values().stream().forEach((ib) -> output.put(prefix + ib.getName() + ".java", ib.build())); - this.succs.values().stream().forEach((ib) -> output.put(prefix + ib.getName() + ".java", ib.build())); - this.iostates.values().stream().forEach((tb) -> output.put(prefix + tb.getName() + ".java", tb.build())); + this.actions.values() + .forEach(ib -> output.put(prefix + ib.getName() + ".java", ib.build())); + this.succs.values() + .forEach(ib -> output.put(prefix + ib.getName() + ".java", ib.build())); + this.iostates.values() + .forEach(tb -> output.put(prefix + tb.getName() + ".java", tb.build())); - this.caseActions.values().stream().forEach((ib) -> output.put(prefix + ib.getName() + ".java", ib.build())); + this.caseActions.values() + .forEach(ib -> output.put(prefix + ib.getName() + ".java", ib.build())); return output; } @@ -680,7 +684,7 @@ private void addSupertypeInterfaces() } res.putAll(tmp);*/ } - res.values().forEach((r) -> subtypeifs.put(r.getName(), r)); + res.values().forEach(r -> subtypeifs.put(r.getName(), r)); } } } diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java index f522d4379..3391b5d4e 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SConfig.java @@ -317,7 +317,7 @@ protected Set isWaitForCycle(Role init) return null; } waitingFor.stream().filter(x -> !cycle.contains(x)) // Only more than one when client-sync cases - .forEach(x -> todo.add(x)); // todo is a Set, so re-add existing doesn't matter + .forEachOrdered(x -> todo.add(x)); // todo is a Set, so re-add existing doesn't matter } return cycle; } @@ -398,7 +398,7 @@ public Map> getOrphanMessages() this.efsms.keySet().stream() .filter(x -> !r.equals(x) && !this.queues.isConnected(r, x)) // !isConnected(r, x), means r considers its side closed .map(x -> this.queues.getQueue(r).get(x)).filter(x -> x != null) // r's side is closed, but remaining message(s) in r's buff - .forEach(x -> orphs.add(x)); + .forEachOrdered(x -> orphs.add(x)); } if (!orphs.isEmpty()) { diff --git a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java index 0f37dd389..0cee2dd2c 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java +++ b/scribble-core/src/main/java/org/scribble/core/model/global/SModel.java @@ -121,7 +121,7 @@ protected Set checkRoleProgress(Set termset) i.hasNext() && !todo.isEmpty(); ) { i.next().getActions().stream().map(x -> x.subj).distinct() - .forEach(x -> todo.remove(x)); + .forEachOrdered(x -> todo.remove(x)); // cf. a.containsRole(r) -- implies obj will be subj for the counterpart action somewhere in the termset? } diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java index 065d1bd79..51f677d65 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java @@ -174,7 +174,7 @@ public synchronized void close() throws ScribbleRuntimeException { this.closed = true; this.sel.close(); - this.servs.values().stream().forEach((ss) -> ss.unbind()); + this.servs.values().forEach(ss -> ss.unbind()); } finally { From d6c1ce8cec846f737dfad70da94f5004a9ad1621 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 14:57:34 +0100 Subject: [PATCH 467/539] [AllTest] Minor. --- .../core/visit/local/LDoArgPruner.java | 21 +------------------ .../scribble/core/visit/local/LDoPruner.java | 5 ----- .../local/SubprotoExtChoiceSubjFixer.java | 10 +-------- scribble-test/src/test/scrib/tmp/Test.scr | 4 ++-- 4 files changed, 4 insertions(+), 36 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java index 9c27a1532..33b89bf42 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java @@ -70,20 +70,12 @@ public LProjection visitProjection( public Do visitDo(Do n) { - /*LProjection target = (LProjection) n.getTarget(this.core); - GProtocol inlined = this.core.getContext().getInlined(target.global);*/ List pruned = new LinkedList<>(); - - //System.out.println("0000: " + target.self + " ,, " + inlined.roles +" ,, " + n); - Set rs = n.visitWithNoThrow(newRoleCollector()); // N.B. does subproto visiting, unlike RoleGather pruned = n.roles.stream() .filter(x -> rs.contains(x) || x.equals(this.self)) .map(x -> x.equals(this.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess .collect(Collectors.toList()); - - //System.out.println("1111: " + " ,, " + rs + " ,, " + pruned); - return n.reconstruct(n.getSource(), n.proto, pruned, n.args); // CHECKME: prune args? } } @@ -105,6 +97,7 @@ public Set visitDo(Do n) { return unit(n); // empty set } + this.stack.push(sig); LProjection target = (LProjection) n.getTarget(this.core); List tmp = this.core.getContext().getInlined(target.global).roles @@ -113,19 +106,7 @@ public Set visitDo(Do n) .collect(Collectors.toList()); Substitutor subs = this.core.config.vf .Substitutor(tmp, n.roles, target.params, n.args, true); // true (passive) to ignore "self" // CHECKME: prune args? - - //System.out.println("2222:\n" + tmp + " ,," + n.roles); - //System.out.println("\n" + target.def); - //System.out.println("\n" + target.def.visitWithNoThrow(subs)); - if (2 > 1) - { - //System.exit(1); - } - - Set res = target.def.visitWithNoThrow(subs).visitWithNoThrow(this); - - //System.out.println(res + " \n"); this.stack.pop(); return res; } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java index 1f9f5e388..f156147c1 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java @@ -106,18 +106,13 @@ public SType visitDo(Do n) this.stack.push(sig); LProjection target = (LProjection) n.getTarget(this.core); // cf. visitProjection (i.e., for projections) - // FIXME: subs? // Duplicated from SubprotoRoleCollector // FIXME: factor out with, e.g., SubprotoExtChoiceSubjFixer List tmp = target.roles.stream() .map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess .collect(Collectors.toList()); - - //System.out.println("aaa: " + this.self + " ,, " + target.fullname + " ,, " + target.roles + " ,, " + target.self + " ,, " + tmp + " ,, " + n.roles + "\n\t" + n); - Substitutor subs = this.core.config.vf.Substitutor(tmp, n.roles, target.params, n.args, true); // true (passive) to ignore non-fixed ext-choice subjs (e.g., good.efsm.gdo.Test11) - LSeq def = visitSeq(subs.visitSeq(target.def)); // Changes ultimately discarded: "nested" entries only do "info collection", actual AST modifications only recoded for the top-level Projection (cf. visitProjection) this.stack.pop(); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java index 753717dea..024f36b30 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java @@ -97,23 +97,15 @@ public Optional visitDo(Do n) { return this.protos.get(n.proto); } - //LProjection imed = core.getContext().getProjection(n.proto); - + // Cf. LDoPruner.visitDo LProjection imed = (LProjection) n.getTarget(this.core); - // FIXME: subs // FIXME: factor out with LDoPruner List tmp = imed.roles.stream() .map(x -> x.equals(imed.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess .collect(Collectors.toList()); - - //System.out.println("aaa: " + this.self + " ,, " + target.fullname + " ,, " + target.roles + " ,, " + target.self + " ,, " + tmp + " ,, " + n.roles + "\n\t" + n); - Substitutor subs = this.core.config.vf.Substitutor(tmp, n.roles, imed.params, n.args, true); // true (passive) for fixing ext-choice subjs (e.g., bad.liveness.roleprog.unfair.Test06) - return visitSeq(subs.visitSeq(imed.def)); - - //return imed.def.visitWithNoThrow(this); // CHECKME: how about looking up subj from inlined? } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 438575001..1d74154b4 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -93,12 +93,12 @@ module tmp.Test; // ...make ad hoc ScribNode constructions go through af properly -- done // rename ProtoMod, ProtocolMod -- rename core Protocol? - // TODO: refactor doarg pruning, do pruning and extchoicesubj fixing vistor passes + // TODO: refactor doarg pruning, do pruning and extchoicesubj-fixing vistor passes (cf., entry methods into LProjection) // FIXME: explicit self roles/decls (core and ast) -- currently, self decls in protocols (in core) are purely cosmetic in toString // And fix self in ast locals, and astfactory // Job Module projection // TODO: fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles -- done in core for now (and needs tidying) - // TODO: projected imports/nonprotodecls + // TODO: projected imports/nonprotodecls -- locals import globals for nonprotos? // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) // fully refactor imed/module projection to Job: old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? From 3d54e59b0e9ba7415566b9c0e8119bf217e25ff5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 15:37:01 +0100 Subject: [PATCH 468/539] [AllTest] Refactored LSubprotoVisitorNoThrow. --- .../main/java/org/scribble/core/job/Core.java | 16 ++++---- .../core/visit/global/SubprotoProjector.java | 2 +- .../scribble/core/visit/local/LDoPruner.java | 19 +++------ ...runer.java => LRoleDeclAndDoArgFixer.java} | 39 ++++++++++--------- .../visit/local/LSubprotoVisitorNoThrow.java | 34 ++++++++++++++++ .../core/visit/local/LTypeVisitorFactory.java | 2 +- .../visit/local/LTypeVisitorFactoryImpl.java | 4 +- .../local/SubprotoExtChoiceSubjFixer.java | 17 ++------ scribble-test/src/test/scrib/tmp/Test.scr | 6 +-- 9 files changed, 79 insertions(+), 60 deletions(-) rename scribble-core/src/main/java/org/scribble/core/visit/local/{LDoArgPruner.java => LRoleDeclAndDoArgFixer.java} (80%) create mode 100644 scribble-core/src/main/java/org/scribble/core/visit/local/LSubprotoVisitorNoThrow.java diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 48a22710d..61839119e 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -45,7 +45,7 @@ import org.scribble.core.visit.gather.ProtoDepsCollector; import org.scribble.core.visit.gather.RoleGatherer; import org.scribble.core.visit.global.GTypeVisitorFactoryImpl; -import org.scribble.core.visit.local.LDoArgPruner; +import org.scribble.core.visit.local.LRoleDeclAndDoArgFixer; import org.scribble.core.visit.local.LDoPruner; import org.scribble.core.visit.local.LTypeVisitorFactoryImpl; import org.scribble.core.visit.local.SubprotoExtChoiceSubjFixer; @@ -226,8 +226,8 @@ protected void runProjectionPasses() // No ScribException, no errors expected } verbosePrintPass("Pruning do-args on all projected intermediates..."); - LDoArgPruner v1 = this.config.vf.local.LDoArgPruner(this); // Reusable - List pruned1 = new LinkedList<>(); + LRoleDeclAndDoArgFixer v1 = this.config.vf.local.LDoArgPruner(this); // Reusable + List done1 = new LinkedList<>(); for (ProtoName fullname : this.context.getParsedFullnames()) { GProtocol imed = this.context.getIntermediate(fullname); @@ -235,18 +235,18 @@ protected void runProjectionPasses() // No ScribException, no errors expected { LProjection proj = this.context.getProjection(fullname, self); LProjection fixed = (LProjection) v1.visitProjection(proj); // TODO: refactor as LProjection/LProto meth, cf. GProto - pruned1.add(fixed); // N.B. replaces existing projection + done1.add(fixed); // N.B. replaces existing projection verbosePrintPass( "Pruned do-args on projected intermediate: " + fixed.fullname + ":\n" + fixed); } } - pruned1.forEach(x -> this.getContext().setProjection(x)); + done1.forEach(x -> this.getContext().setProjection(x)); // Update after all visited, to prevent visiting an already pruned projdecl from breaking the pruning of a subsequent one (e.g., mutually recursive proto refs) verbosePrintPass("Do-pruning all projected intermediates..."); LDoPruner v2 = this.config.vf.local.LDoPruner(this); // Reusable - List pruned2 = new LinkedList<>(); + List done2 = new LinkedList<>(); for (ProtoName fullname : this.context.getParsedFullnames()) { GProtocol imed = this.context.getIntermediate(fullname); @@ -254,13 +254,13 @@ protected void runProjectionPasses() // No ScribException, no errors expected { LProjection proj = this.context.getProjection(fullname, self); LProjection fixed = v2.visitProjection(proj); // TODO: refactor as LProjection/LProto meth, cf. GProto - pruned2.add(fixed); // N.B. replaces existing projection + done2.add(fixed); // N.B. replaces existing projection verbosePrintPass( "Do-pruned projected intermediate: " + fixed.fullname + ":\n" + fixed); } } - pruned2.forEach(x -> this.getContext().setProjection(x)); + done2.forEach(x -> this.getContext().setProjection(x)); // Update after all visited, to prevent visiting an already pruned projdecl from breaking the pruning of a subsequent one (e.g., mutually recursive proto refs) verbosePrintPass( diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java index 72ab4cb33..bd89fc9d8 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java @@ -75,7 +75,7 @@ public LType visitDo(Do n) .map(x -> subs.subsRole(x)).collect(Collectors.toList()); List rs = n.roles.stream().filter(x -> used.contains(x)) //.map(x -> x.equals(this.self) ? Role.SELF : x) - // CHECKME: now leaving self fully to LDoArgPruner -- easier to do role subs for do-visiting + // CHECKME: now leaving "self" in do-arg to LDoArgPruner -- easier to do role subs for do-visiting (though a bit inconsistent with "self" in, e.g., interactions) // CHECKME: syntax: "self" explictly used for Choice subject, but implicitly for MessageTransfer, inconsistent? .collect(Collectors.toList()); return this.core.config.tf.local.LDo(null, fullname, rs, n.args); // TODO CHECKME: prune args? diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java index f156147c1..c923e7b0d 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java @@ -33,14 +33,13 @@ import org.scribble.core.type.session.local.LSkip; import org.scribble.core.type.session.local.LType; import org.scribble.core.visit.STypeVisitorNoThrow; -import org.scribble.core.visit.Substitutor; -// Pre: LDoArgPruner (for basic subproto visiting pattern) +// Pre: LRoleDeclAndDoArgFixer (for LSubprotoVisitorNoThrow visiting pattern) // Cf. RecPruner public class LDoPruner //extends DoPruner - extends STypeVisitorNoThrow + extends STypeVisitorNoThrow implements LSubprotoVisitorNoThrow { protected final Core core; @@ -103,17 +102,11 @@ public SType visitDo(Do n) { return this.unguarded.contains(sig) ? LSkip.SKIP : n; } - this.stack.push(sig); - LProjection target = (LProjection) n.getTarget(this.core); // cf. visitProjection (i.e., for projections) - + // Duplicated from SubprotoRoleCollector - // FIXME: factor out with, e.g., SubprotoExtChoiceSubjFixer - List tmp = target.roles.stream() - .map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess - .collect(Collectors.toList()); - Substitutor subs = this.core.config.vf.Substitutor(tmp, - n.roles, target.params, n.args, true); // true (passive) to ignore non-fixed ext-choice subjs (e.g., good.efsm.gdo.Test11) - LSeq def = visitSeq(subs.visitSeq(target.def)); + this.stack.push(sig); + LSeq def = visitSeq(prepareSubprotoForVisit(this.core, n, true)); + // true (passive) to ignore non-fixed ext-choice subjs (e.g., good.efsm.gdo.Test11) // Changes ultimately discarded: "nested" entries only do "info collection", actual AST modifications only recoded for the top-level Projection (cf. visitProjection) this.stack.pop(); return def.isEmpty() ? LSkip.SKIP : n; // Cf. unit(n) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgFixer.java similarity index 80% rename from scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java rename to scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgFixer.java index 33b89bf42..76bea09e8 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoArgPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgFixer.java @@ -35,13 +35,15 @@ import org.scribble.core.visit.STypeVisitorNoThrow; import org.scribble.core.visit.Substitutor; -public class LDoArgPruner extends STypeVisitorNoThrow +// Pre: SubprotoProjector -- "self" fixed for interactions and choice-subjs, but not for do role-args +// Prunes LProto/Proj role decls, and fixes/prunes do role-args (including "self" fixing) +public class LRoleDeclAndDoArgFixer extends STypeVisitorNoThrow { private final Core core; private Role self; - protected LDoArgPruner(Core core) + protected LRoleDeclAndDoArgFixer(Core core) { this.core = core; } @@ -52,7 +54,6 @@ protected PreSubprotoRoleCollector newRoleCollector() // N.B. "Pre" role collec return new PreSubprotoRoleCollector(this.core); } - // TODO: rename class? also fixes projection role decls // TODO: refactor into LProjection/LProtocol -- cf. GProtocol public LProjection visitProjection( LProjection n) @@ -64,24 +65,24 @@ public LProjection visitProjection( .collect(Collectors.toList()); LSeq pruned = visitSeq(n.def); return n.reconstruct(n.getSource(), n.mods, n.fullname, rs, n.self, - n.params, pruned); - // CHECKME: prune params? + n.params, pruned); // CHECKME: prune params? } public Do visitDo(Do n) { - List pruned = new LinkedList<>(); - Set rs = n.visitWithNoThrow(newRoleCollector()); // N.B. does subproto visiting, unlike RoleGather - pruned = n.roles.stream() + List fixed = new LinkedList<>(); + Set rs = n.visitWithNoThrow(newRoleCollector()); // N.B. does subproto visiting, unlike RoleGatherer + fixed = n.roles.stream() .filter(x -> rs.contains(x) || x.equals(this.self)) .map(x -> x.equals(this.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess .collect(Collectors.toList()); - return n.reconstruct(n.getSource(), n.proto, pruned, n.args); // CHECKME: prune args? + return n.reconstruct(n.getSource(), n.proto, fixed, n.args); // CHECKME: prune args? } } -// Role collector for pre do-arg pruning: do-arg arity doesn't yet match target +// Role collector for pre do-arg pruning (i.e., only for use by LDoArgPruner): +// do-arg arity doesn't yet match target, and "self" not done in do-args (see InlinedProjector.visitDo) class PreSubprotoRoleCollector extends SubprotoRoleCollector { public PreSubprotoRoleCollector(Core core) @@ -102,7 +103,9 @@ public Set visitDo(Do n) LProjection target = (LProjection) n.getTarget(this.core); List tmp = this.core.getContext().getInlined(target.global).roles // Currently, do-args arity matches that of inlined, i.e., not necessarily the arity of the actual local target (cf. InlinedProjector.visitDo) - .stream()//.map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess + .stream()//.map(x -> x.equals(target.self) ? Role.SELF : x) + // "self" for do-args not done yet (cf., SubprotoProjector.visitDo), now being fixed by LDoArgPruner + // Cf., LSubprotoVisitorNoThrow.prepareSubprotoForVisit .collect(Collectors.toList()); Substitutor subs = this.core.config.vf .Substitutor(tmp, n.roles, target.params, n.args, true); // true (passive) to ignore "self" // CHECKME: prune args? @@ -114,7 +117,8 @@ public Set visitDo(Do n) // CHECKME: simply integrate into one with PreSubprotoRoleCollector? Or maybe still separately useful? -class SubprotoRoleCollector extends STypeAggNoThrow> +class SubprotoRoleCollector extends STypeAggNoThrow> + implements LSubprotoVisitorNoThrow { protected final Core core; @@ -143,14 +147,11 @@ public Set visitDo(Do n) { return unit(n); // empty set } + + // Cf. LDoPruner.visitDo this.stack.push(sig); - LProjection target = (LProjection) n.getTarget(this.core); - List tmp = target.roles.stream() - //.map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess - .collect(Collectors.toList()); - Substitutor subs = this.core.config.vf - .Substitutor(tmp, n.roles, target.params, n.args); // CHECKME: prune args? - Set res = target.def.visitWithNoThrow(subs).visitWithNoThrow(this); + Set res = prepareSubprotoForVisit(this.core, n) // Non-passive, cf. PreSubprotoRoleCollector + .visitWithNoThrow(this); this.stack.pop(); return res; } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LSubprotoVisitorNoThrow.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LSubprotoVisitorNoThrow.java new file mode 100644 index 000000000..40983bb77 --- /dev/null +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LSubprotoVisitorNoThrow.java @@ -0,0 +1,34 @@ +package org.scribble.core.visit.local; + +import java.util.List; +import java.util.stream.Collectors; + +import org.scribble.core.job.Core; +import org.scribble.core.lang.local.LProtocol; +import org.scribble.core.type.kind.Local; +import org.scribble.core.type.name.Role; +import org.scribble.core.type.session.Do; +import org.scribble.core.type.session.local.LSeq; +import org.scribble.core.visit.Substitutor; + + +// Pre: LRoleDeclAndDoArgFixer (for imed LProjections) +public interface LSubprotoVisitorNoThrow +{ + default LSeq prepareSubprotoForVisit(Core core, Do n) + { + return prepareSubprotoForVisit(core, n, false); + } + + default LSeq prepareSubprotoForVisit(Core core, Do n, + boolean passive) + { + LProtocol target = (LProtocol) n.getTarget(core); + List tmp = target.roles.stream() + .map(x -> x.equals(target.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess + .collect(Collectors.toList()); + Substitutor subs = core.config.vf + .Substitutor(tmp, n.roles, target.params, n.args, passive); + return subs.visitSeq(target.def); + } +} diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java index 73ed66fea..7b02d3b51 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java @@ -24,7 +24,7 @@ public interface LTypeVisitorFactory EGraphBuilder EGraphBuilder(Core core); - LDoArgPruner LDoArgPruner(Core core); + LRoleDeclAndDoArgFixer LDoArgPruner(Core core); LDoPruner LDoPruner(Core core); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java index c2b212787..bacbafb48 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java @@ -37,9 +37,9 @@ public EGraphBuilder EGraphBuilder(Core core) } @Override - public LDoArgPruner LDoArgPruner(Core core) + public LRoleDeclAndDoArgFixer LDoArgPruner(Core core) { - return new LDoArgPruner(core); + return new LRoleDeclAndDoArgFixer(core); } @Override diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java index 024f36b30..cf04fae0f 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java @@ -15,23 +15,19 @@ import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.stream.Collectors; import org.scribble.core.job.Core; import org.scribble.core.lang.Protocol; -import org.scribble.core.lang.local.LProjection; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Do; import org.scribble.core.type.session.SType; import org.scribble.core.type.session.local.LSeq; -import org.scribble.core.visit.Substitutor; -// Pre: LDoArgPruner (for basic subproto visiting pattern), LDoPruner (to avoid infinite looping when "stackless" subproto visiting) +// Pre: LRoleDeclAndDoArgFixer (for LSubprotoVisitorNoThrow visiting pattern), LDoPruner (to avoid infinite looping when "stackless" subproto visiting) // super takes care of rec/continue, here just additionally handle "do" // A "stackless" subproto visitor, c.f. LDoPruner public class SubprotoExtChoiceSubjFixer extends InlinedExtChoiceSubjFixer @@ -77,6 +73,7 @@ public SType visitDo(Do n) } class SubprotoEnablerInferer extends InlinedEnablerInferer // super takes care of rec/continue + implements LSubprotoVisitorNoThrow { private final Core core; @@ -99,13 +96,7 @@ public Optional visitDo(Do n) } // Cf. LDoPruner.visitDo - LProjection imed = (LProjection) n.getTarget(this.core); - // FIXME: factor out with LDoPruner - List tmp = imed.roles.stream() - .map(x -> x.equals(imed.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess - .collect(Collectors.toList()); - Substitutor subs = this.core.config.vf.Substitutor(tmp, - n.roles, imed.params, n.args, true); // true (passive) for fixing ext-choice subjs (e.g., bad.liveness.roleprog.unfair.Test06) - return visitSeq(subs.visitSeq(imed.def)); + return visitSeq(prepareSubprotoForVisit(this.core, n, true)); + // true (passive) for fixing ext-choice subjs (e.g., bad.liveness.roleprog.unfair.Test06) } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 1d74154b4..10ed386b0 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -130,7 +130,7 @@ module tmp.Test; data "..." from "..." as T; -/* +//* global protocol Proto1(role A, role B) { do Proto1Aux(A, B); @@ -140,12 +140,12 @@ aux global protocol Proto1Aux(role C, role D) { 2() from C to D; // Testing LDoArgPruner, do role pruning //do Proto1(C, D); - //do Proto1(D, C); // Testing -project output, proto deps + do Proto1(D, C); // Testing -project output, proto deps } //*/ -//* +/* global protocol Proto1(role A, role B) { 1() from A to B; From 1cce4d47066ae4b3cd0344d56d69764fafd47824 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 15:52:16 +0100 Subject: [PATCH 469/539] [AllTest] Added ast LSelfRoleDecl. --- .../java/org/scribble/ast/AstFactory.java | 2 + .../org/scribble/ast/local/LSelfRoleDecl.java | 52 +++++++++++++++++++ .../java/org/scribble/del/DelFactory.java | 3 ++ .../scribble/util/LProjectionTranslator.java | 25 +++++---- .../org/scribble/parser/antlr/Scribble.g | 1 + .../java/org/scribble/ast/AstFactoryImpl.java | 11 ++++ .../java/org/scribble/del/DelFactoryImpl.java | 7 +++ 7 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LSelfRoleDecl.java diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 678a1979b..23efbdf7a 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -45,6 +45,7 @@ import org.scribble.ast.local.LRecursion; import org.scribble.ast.local.LRecv; import org.scribble.ast.local.LReq; +import org.scribble.ast.local.LSelfRoleDecl; import org.scribble.ast.local.LSend; import org.scribble.ast.local.LServerWrap; import org.scribble.ast.local.LSessionNode; @@ -155,6 +156,7 @@ LProjectionDecl LProjectionDecl(Token t, ProtoModList mods, LProtoHeader LProtoHeader(Token t, LProtoNameNode name, RoleDeclList rs, NonRoleParamDeclList ps); + LSelfRoleDecl LSelfRoleDecl(Token t, RoleNode r); LProtoDef LProtoDef(Token t, LProtoBlock block); LProtoBlock LProtoBlock(Token t, LInteractionSeq seq); diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LSelfRoleDecl.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSelfRoleDecl.java new file mode 100644 index 000000000..1217ad81a --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LSelfRoleDecl.java @@ -0,0 +1,52 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.ast.RoleDecl; +import org.scribble.del.DelFactory; +import org.scribble.util.Constants; + +public class LSelfRoleDecl extends RoleDecl +{ + // ScribTreeAdaptor#create constructor + public LSelfRoleDecl(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public LSelfRoleDecl(LSelfRoleDecl node) + { + super(node); + } + + @Override + public LSelfRoleDecl dupNode() + { + return new LSelfRoleDecl(this); + } + + @Override + public void decorateDel(DelFactory df) + { + df.LSelfRoleDecl(this); + } + + @Override + public String getKeyword() + { + return Constants.SELF_KW; + } +} diff --git a/scribble-ast/src/main/java/org/scribble/del/DelFactory.java b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java index 851a3cd9a..a4317f145 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DelFactory.java +++ b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java @@ -62,6 +62,7 @@ import org.scribble.ast.local.LRecursion; import org.scribble.ast.local.LRecv; import org.scribble.ast.local.LReq; +import org.scribble.ast.local.LSelfRoleDecl; import org.scribble.ast.local.LSend; import org.scribble.ast.local.LServerWrap; import org.scribble.ast.name.qualified.DataNameNode; @@ -157,6 +158,8 @@ public interface DelFactory void LProtoHeader(LProtoHeader n); + void LSelfRoleDecl(LSelfRoleDecl n); + void LProtoDef(LProtoDef n); void LProtoBlock(LProtoBlock n); void LInteractionSeq(LInteractionSeq n); diff --git a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java index 1fdae423a..c0c0fde43 100644 --- a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java @@ -84,14 +84,17 @@ public LProjectionTranslator(Job job) this.af = job.config.af; } - public LProjectionDecl translate(LProjection ltype) + public LProjectionDecl translate(LProjection proj) { - RoleDeclList rs = this.af.RoleDeclList(null, - ltype.roles.stream().map( - x -> this.af.RoleDecl(null, this.af.RoleNode(null, x.toString()))) // FIXME: special "self" node? - .collect(Collectors.toList())); + RoleDeclList rs = this.af.RoleDeclList(null, proj.roles.stream().map(x -> + { + RoleNode r = this.af.RoleNode(null, x.toString()); + return x.equals(proj.self) + ? this.af.LSelfRoleDecl(null, r) + : this.af.RoleDecl(null, r); + }).collect(Collectors.toList())); List> pds = new LinkedList<>(); - for (MemberName p : ltype.params) + for (MemberName p : proj.params) { if (p instanceof SigName) { @@ -111,15 +114,15 @@ else if (p instanceof DataName) } NonRoleParamDeclList ps = this.af.NonRoleParamDeclList(null, pds); - ProtoModList mods = this.af.ProtoModList(null, ltype.mods.stream() + ProtoModList mods = this.af.ProtoModList(null, proj.mods.stream() .map(x -> translate(x)).collect(Collectors.toList())); GProtoNameNode global = this.af.GProtoNameNode(null, - IdNode.from(this.af, ltype.global.getElements())); - RoleNode self1 = this.af.RoleNode(null, ltype.self.toString()); // FIXME: special "self" node? + IdNode.from(this.af, proj.global.getElements())); + RoleNode self1 = this.af.RoleNode(null, proj.self.toString()); // FIXME: special "self" node? LProtoNameNode projFullname = this.af.LProtoNameNode(null, - IdNode.from(this.af, ltype.fullname.getElements())); + IdNode.from(this.af, proj.fullname.getElements())); LProtoHeader header = this.af.LProtoHeader(null, projFullname, rs, ps); - LProtoDef def = this.af.LProtoDef(null, translate(ltype.def)); + LProtoDef def = this.af.LProtoDef(null, translate(proj.def)); return this.af.LProjectionDecl(null, mods, header, def, global, self1); } diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index be0bcfeec..ed33f64d3 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -140,6 +140,7 @@ tokens LPROTODECL = 'LPROTODECL'; LPROTOHEADER = 'LPROTOHEADER'; + LSELFROLEDECL = 'LSELFROLEDECL'; LPROTODEF = 'LPROTODEF'; LPROTOBLOCK = 'LPROTOBLOCK'; diff --git a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index 95bf3a6fa..44b290ebd 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -50,6 +50,7 @@ import org.scribble.ast.local.LRecursion; import org.scribble.ast.local.LRecv; import org.scribble.ast.local.LReq; +import org.scribble.ast.local.LSelfRoleDecl; import org.scribble.ast.local.LSend; import org.scribble.ast.local.LServerWrap; import org.scribble.ast.local.LSessionNode; @@ -664,6 +665,16 @@ public LProtoHeader LProtoHeader(Token t, LProtoNameNode name, RoleDeclList rs, return n; } + @Override + public LSelfRoleDecl LSelfRoleDecl(Token t, RoleNode r) + { + t = newToken(t, ScribbleParser.LSELFROLEDECL); + LSelfRoleDecl n = new LSelfRoleDecl(t); + n.addScribChildren(r); + n.decorateDel(this.df); + return n; + } + @Override public LProtoDef LProtoDef(Token t, LProtoBlock block) { diff --git a/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java index 8837c2528..7d8f888cb 100644 --- a/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java @@ -64,6 +64,7 @@ import org.scribble.ast.local.LRecursion; import org.scribble.ast.local.LRecv; import org.scribble.ast.local.LReq; +import org.scribble.ast.local.LSelfRoleDecl; import org.scribble.ast.local.LSend; import org.scribble.ast.local.LServerWrap; import org.scribble.ast.name.qualified.DataNameNode; @@ -444,6 +445,12 @@ public void LProtoHeader(LProtoHeader n) setDel(n, createDefaultDel()); } + @Override + public void LSelfRoleDecl(LSelfRoleDecl n) + { + setDel(n, new RoleDeclDel()); + } + @Override public void LProtoDef(LProtoDef n) { From 652b08d6b4aedb3708179c877ba90abc3705e185 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 16:08:41 +0100 Subject: [PATCH 470/539] [install] Misc refactoring. --- .../main/java/org/scribble/ast/AstFactory.java | 2 +- .../src/main/java/org/scribble/ast/AuxMod.java | 2 +- .../java/org/scribble/ast/ExplicitMod.java | 2 +- .../java/org/scribble/ast/ProtoModList.java | 8 ++++---- .../ast/{ProtoMod.java => ProtoModNode.java} | 18 +++++++++--------- .../org/scribble/ast/local/LSelfRoleDecl.java | 2 +- .../org/scribble/del/global/GProtoDeclDel.java | 6 +++--- .../scribble/util/LProjectionTranslator.java | 6 +++--- .../lang/{ProtocolMod.java => ProtoMod.java} | 2 +- .../java/org/scribble/core/lang/Protocol.java | 10 +++++----- .../org/scribble/core/lang/SubprotoSig.java | 9 +++------ .../scribble/core/lang/global/GProtocol.java | 6 +++--- .../scribble/core/lang/local/LProjection.java | 6 +++--- .../scribble/core/lang/local/LProtocol.java | 8 ++++---- .../visit/local/LSubprotoVisitorNoThrow.java | 13 +++++++++++++ .../java/org/scribble/ast/AstFactoryImpl.java | 2 +- scribble-test/src/test/scrib/tmp/Test.scr | 1 + 17 files changed, 57 insertions(+), 46 deletions(-) rename scribble-ast/src/main/java/org/scribble/ast/{ProtoMod.java => ProtoModNode.java} (71%) rename scribble-core/src/main/java/org/scribble/core/lang/{ProtocolMod.java => ProtoMod.java} (98%) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 23efbdf7a..c2877b34c 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -106,7 +106,7 @@ GProtoDecl GProtoDecl(Token t, ProtoModList mods, GProtoHeader header, GProtoDef def); // TODO: refactor to use ProtoModList, etc. - ProtoModList ProtoModList(Token t, List mods); + ProtoModList ProtoModList(Token t, List mods); AuxMod AuxMod(Token t); ExplicitMod ExplicitMod(Token t); diff --git a/scribble-ast/src/main/java/org/scribble/ast/AuxMod.java b/scribble-ast/src/main/java/org/scribble/ast/AuxMod.java index d766b0461..53fac4bb5 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AuxMod.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AuxMod.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.del.DelFactory; -public class AuxMod extends ProtoMod +public class AuxMod extends ProtoModNode { // ScribTreeAdaptor#create constructor public AuxMod(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java b/scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java index 2f00731cd..82cdb2470 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ExplicitMod.java @@ -16,7 +16,7 @@ import org.antlr.runtime.Token; import org.scribble.del.DelFactory; -public class ExplicitMod extends ProtoMod +public class ExplicitMod extends ProtoModNode { // ScribTreeAdaptor#create constructor public ExplicitMod(Token t) diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java index 9921eb2c0..d19fc5ab7 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoModList.java @@ -36,21 +36,21 @@ protected ProtoModList(ProtoModList node) super(node); } - public List getModChildren() + public List getModChildren() { - return ((List) getChildren()).stream().map(x -> (ProtoMod) x) + return ((List) getChildren()).stream().map(x -> (ProtoModNode) x) .collect(Collectors.toList()); } // "add", not "set" - public void addScribChildren(List mods) + public void addScribChildren(List mods) { addChildren(mods); } // CHECKME: deprecate? cf. getModChildren // Cf., NameNode::getSimpleNameList - public List getModList() + public List getModList() { return getModChildren(); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/ProtoMod.java b/scribble-ast/src/main/java/org/scribble/ast/ProtoModNode.java similarity index 71% rename from scribble-ast/src/main/java/org/scribble/ast/ProtoMod.java rename to scribble-ast/src/main/java/org/scribble/ast/ProtoModNode.java index be54519d4..6e8cf88ff 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ProtoMod.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ProtoModNode.java @@ -14,20 +14,20 @@ package org.scribble.ast; import org.antlr.runtime.Token; -import org.scribble.core.lang.ProtocolMod; +import org.scribble.core.lang.ProtoMod; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -public abstract class ProtoMod extends ScribNodeBase +public abstract class ProtoModNode extends ScribNodeBase { // ScribTreeAdaptor#create constructor - public ProtoMod(Token t) + public ProtoModNode(Token t) { super(t); } // Tree#dupNode constructor - protected ProtoMod(ProtoMod node) + protected ProtoModNode(ProtoModNode node) { super(node); } @@ -43,18 +43,18 @@ public boolean isExplicit() } @Override - public ProtoMod visitChildren(AstVisitor nv) throws ScribException + public ProtoModNode visitChildren(AstVisitor nv) throws ScribException { return this; } // cf. toName - public ProtocolMod toProtocolMod() // TODO: rename + public ProtoMod toProtoMod() // TODO: rename { - switch (toString()) // Directly from + switch (toString()) // Directly from Scribble.g KW { - case "aux": return ProtocolMod.AUX; - case "explicit": return ProtocolMod.EXPLICIT; + case "aux": return ProtoMod.AUX; + case "explicit": return ProtoMod.EXPLICIT; default: throw new RuntimeException("Unknown modifier: " + this); } } diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LSelfRoleDecl.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSelfRoleDecl.java index 1217ad81a..cf6331287 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LSelfRoleDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LSelfRoleDecl.java @@ -47,6 +47,6 @@ public void decorateDel(DelFactory df) @Override public String getKeyword() { - return Constants.SELF_KW; + return Constants.SELF_KW; // Main reason for this subclass; overriding various toStrings awkward } } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java index d817d0b2e..9f49389b3 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GProtoDeclDel.java @@ -19,7 +19,7 @@ import org.scribble.ast.Module; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GProtoDecl; -import org.scribble.core.lang.ProtocolMod; +import org.scribble.core.lang.ProtoMod; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.NonRoleParamKind; @@ -42,8 +42,8 @@ public GProtocol translate(ScribNode n, GTypeTranslator t) { GProtoDecl source = (GProtoDecl) n; Module m = (Module) n.getParent(); - List mods = source.getModifierListChild().getModList().stream() - .map(x -> x.toProtocolMod()).collect(Collectors.toList()); + List mods = source.getModifierListChild().getModList().stream() + .map(x -> x.toProtoMod()).collect(Collectors.toList()); GProtoName fullname = new GProtoName(m.getFullModuleName(), source.getHeaderChild().getDeclName()); List rs = source.getRoles(); diff --git a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java index c0c0fde43..385d87934 100644 --- a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java @@ -27,7 +27,7 @@ import org.scribble.ast.NonRoleParamDeclList; import org.scribble.ast.PayElem; import org.scribble.ast.PayElemList; -import org.scribble.ast.ProtoMod; +import org.scribble.ast.ProtoModNode; import org.scribble.ast.ProtoModList; import org.scribble.ast.RoleArgList; import org.scribble.ast.RoleDeclList; @@ -45,7 +45,7 @@ import org.scribble.ast.name.simple.RecVarNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SigParamNode; -import org.scribble.core.lang.ProtocolMod; +import org.scribble.core.lang.ProtoMod; import org.scribble.core.lang.local.LProjection; import org.scribble.core.type.kind.DataKind; import org.scribble.core.type.kind.NonRoleArgKind; @@ -127,7 +127,7 @@ else if (p instanceof DataName) } // Cf. IdNode.from - protected ProtoMod translate(ProtocolMod mod) + protected ProtoModNode translate(ProtoMod mod) { switch (mod) { diff --git a/scribble-core/src/main/java/org/scribble/core/lang/ProtocolMod.java b/scribble-core/src/main/java/org/scribble/core/lang/ProtoMod.java similarity index 98% rename from scribble-core/src/main/java/org/scribble/core/lang/ProtocolMod.java rename to scribble-core/src/main/java/org/scribble/core/lang/ProtoMod.java index 949f67a2c..ac251d7fe 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/ProtocolMod.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/ProtoMod.java @@ -13,7 +13,7 @@ */ package org.scribble.core.lang; -public enum ProtocolMod +public enum ProtoMod { AUX, EXPLICIT; diff --git a/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java index e1663cad4..a35db0824 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/Protocol.java @@ -36,7 +36,7 @@ public abstract class Protocol { private final CommonTree source; // CHECKME: factor out with SType(Base) ? - public final List mods; + public final List mods; public final N fullname; public final List roles; // Ordered role params; pre: size >= 2 public final List> params; @@ -45,7 +45,7 @@ public abstract class Protocol // CHECKME: make a ParamName? or at least SimpleName? public final B def; - public Protocol(CommonTree source, List mods, N fullname, + public Protocol(CommonTree source, List mods, N fullname, List roles, List> params, B def) { @@ -59,17 +59,17 @@ public Protocol(CommonTree source, List mods, N fullname, // N.B. LProtocol has an additional "self" field, reconstruct pattern not perfect public abstract Protocol reconstruct(CommonTree source, - List mods, N fullname, List roles, + List mods, N fullname, List roles, List> params, B def); public boolean isAux() { - return this.mods.contains(ProtocolMod.AUX); + return this.mods.contains(ProtoMod.AUX); } public boolean isExplicit() { - return this.mods.contains(ProtocolMod.EXPLICIT); + return this.mods.contains(ProtoMod.EXPLICIT); } public abstract Protocol getInlined(STypeInliner v); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java index b70a71a09..df8db2ec6 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java @@ -31,7 +31,6 @@ public class SubprotoSig { public final ProtoName fullname; - // public Scope scope; public final List roles; // i.e., roles (and args) are ordered public final List> args; // NonRoleParamKind, not NonRoleArgKind, because latter includes AmbigKind due to parsing requirements @@ -42,7 +41,6 @@ public SubprotoSig(ProtoName fullname, List roles, List> args) { this.fullname = fullname; - // this.scope = scope; this.roles = Collections.unmodifiableList(roles); this.args = Collections.unmodifiableList(args); } @@ -67,7 +65,7 @@ private static List> paramsToArgs( // TODO: refactor, into params? public static Arg paramToArg( - MemberName n) // Omit " extends NonRoleParamKind" for param, more flexible without harm + MemberName n) // Omit " extends NonRoleParamKind" on param, more flexible without major harm { if (n instanceof DataName) { @@ -88,7 +86,6 @@ public int hashCode() { int hash = 1093; hash = 31 * hash + this.fullname.hashCode(); - // hash = 31 * hash + this.scope.hashCode(); hash = 31 * hash + this.roles.hashCode(); hash = 31 * hash + this.args.hashCode(); return hash; @@ -106,14 +103,14 @@ public boolean equals(Object o) return false; } SubprotoSig subsig = (SubprotoSig) o; - return this.fullname.equals(subsig.fullname) // && this.scope.equals(subsig.scope) + return this.fullname.equals(subsig.fullname) && this.roles.equals(subsig.roles) && this.args.equals(subsig.args); } @Override public String toString() { - return // this.scope + ":" + + return this.fullname + "<" + this.args.stream().map(x -> x.toString()) diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index c122a9a8d..258455806 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -23,7 +23,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.job.Core; import org.scribble.core.lang.Protocol; -import org.scribble.core.lang.ProtocolMod; +import org.scribble.core.lang.ProtoMod; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.local.LProjection; import org.scribble.core.type.kind.Global; @@ -50,7 +50,7 @@ public class GProtocol extends Protocol implements GNode // Mainly for GDel.translate return (to include GProtocol) { - public GProtocol(CommonTree source, List mods, + public GProtocol(CommonTree source, List mods, GProtoName fullname, List roles, List> params, GSeq def) { @@ -59,7 +59,7 @@ public GProtocol(CommonTree source, List mods, @Override public GProtocol reconstruct(CommonTree source, - List mods, GProtoName fullname, List roles, + List mods, GProtoName fullname, List roles, List> params, GSeq def) { return new GProtocol(source, mods, fullname, roles, params, def); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java index 2911f4a4d..18c5c5122 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProjection.java @@ -17,7 +17,7 @@ import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; -import org.scribble.core.lang.ProtocolMod; +import org.scribble.core.lang.ProtoMod; import org.scribble.core.type.kind.Local; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.GProtoName; @@ -31,7 +31,7 @@ public class LProjection extends LProtocol { public final GProtoName global; - public LProjection(List mods, LProtoName fullname, + public LProjection(List mods, LProtoName fullname, List roles, Role self, List> params, GProtoName global, LSeq body) @@ -42,7 +42,7 @@ public LProjection(List mods, LProtoName fullname, @Override public LProjection reconstruct(CommonTree source, - List mods, LProtoName fullname, List roles, + List mods, LProtoName fullname, List roles, Role self, List> params, LSeq body) { return new LProjection(mods, fullname, roles, this.self, params, diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index 7f4139929..ccb89e7b3 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -21,7 +21,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.core.job.Core; import org.scribble.core.lang.Protocol; -import org.scribble.core.lang.ProtocolMod; +import org.scribble.core.lang.ProtoMod; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.endpoint.EState; @@ -45,7 +45,7 @@ public class LProtocol extends Protocol { public final Role self; - public LProtocol(CommonTree source, List mods, + public LProtocol(CommonTree source, List mods, LProtoName fullname, List roles, Role self, List> params, LSeq def) { @@ -55,7 +55,7 @@ public LProtocol(CommonTree source, List mods, @Override public LProtocol reconstruct(CommonTree source, - List mods, LProtoName fullname, List roles, + List mods, LProtoName fullname, List roles, //Role self, // CHECKME: reconstruct pattern not working here? List> params, LSeq def) { @@ -63,7 +63,7 @@ public LProtocol reconstruct(CommonTree source, } public LProtocol reconstruct(CommonTree source, - List mods, LProtoName fullname, List roles, + List mods, LProtoName fullname, List roles, Role self, List> params, LSeq def) { return new LProtocol(source, mods, fullname, roles, self, params, def); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LSubprotoVisitorNoThrow.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LSubprotoVisitorNoThrow.java index 40983bb77..d9631c7a5 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LSubprotoVisitorNoThrow.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LSubprotoVisitorNoThrow.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.core.visit.local; import java.util.List; diff --git a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index 44b290ebd..b42c60bba 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -360,7 +360,7 @@ public GProtoDecl GProtoDecl(Token t, ProtoModList mods, GProtoHeader header, } @Override - public ProtoModList ProtoModList(Token t, List mods) + public ProtoModList ProtoModList(Token t, List mods) { t = newToken(t, ScribbleParser.PROTOMOD_LIST); ProtoModList n = new ProtoModList(t); diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 10ed386b0..4b174b1a6 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -107,6 +107,7 @@ module tmp.Test; // CHECKME TODO: param-arg pruning? // Job/codegen refactoring: + // Check Maven deps // also do-arg pruning, for role-pruned projection decls // choice-specific fairness annotations // fix codegen when -fair From 1e2355849538690ef98f4f79d3a1726c95bdb8c8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 17:36:52 +0100 Subject: [PATCH 471/539] [install] Misc refactoring. --- .../main/java/org/scribble/ast/AstFactory.java | 4 ++-- .../local/{LSelfRoleDecl.java => LSelfDecl.java} | 12 ++++++------ .../main/java/org/scribble/del/DelFactory.java | 4 ++-- .../org/scribble/util/LProjectionTranslator.java | 2 +- .../org/scribble/core/visit/local/LDoPruner.java | 3 ++- .../core/visit/local/LRoleDeclAndDoArgFixer.java | 7 ++++--- .../visit/local/LSubprotoVisitorNoThrow.java | 6 +++++- .../visit/local/SubprotoExtChoiceSubjFixer.java | 2 +- .../java/org/scribble/ast/AstFactoryImpl.java | 6 +++--- .../java/org/scribble/del/DelFactoryImpl.java | 4 ++-- scribble-test/src/test/scrib/tmp/Test.scr | 16 +++++++--------- 11 files changed, 35 insertions(+), 31 deletions(-) rename scribble-ast/src/main/java/org/scribble/ast/local/{LSelfRoleDecl.java => LSelfDecl.java} (84%) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index c2877b34c..6d63d35b7 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -45,7 +45,7 @@ import org.scribble.ast.local.LRecursion; import org.scribble.ast.local.LRecv; import org.scribble.ast.local.LReq; -import org.scribble.ast.local.LSelfRoleDecl; +import org.scribble.ast.local.LSelfDecl; import org.scribble.ast.local.LSend; import org.scribble.ast.local.LServerWrap; import org.scribble.ast.local.LSessionNode; @@ -156,7 +156,7 @@ LProjectionDecl LProjectionDecl(Token t, ProtoModList mods, LProtoHeader LProtoHeader(Token t, LProtoNameNode name, RoleDeclList rs, NonRoleParamDeclList ps); - LSelfRoleDecl LSelfRoleDecl(Token t, RoleNode r); + LSelfDecl LSelfDecl(Token t, RoleNode r); LProtoDef LProtoDef(Token t, LProtoBlock block); LProtoBlock LProtoBlock(Token t, LInteractionSeq seq); diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LSelfRoleDecl.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSelfDecl.java similarity index 84% rename from scribble-ast/src/main/java/org/scribble/ast/local/LSelfRoleDecl.java rename to scribble-ast/src/main/java/org/scribble/ast/local/LSelfDecl.java index cf6331287..4782a36a4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LSelfRoleDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LSelfDecl.java @@ -18,30 +18,30 @@ import org.scribble.del.DelFactory; import org.scribble.util.Constants; -public class LSelfRoleDecl extends RoleDecl +public class LSelfDecl extends RoleDecl { // ScribTreeAdaptor#create constructor - public LSelfRoleDecl(Token t) + public LSelfDecl(Token t) { super(t); } // Tree#dupNode constructor - public LSelfRoleDecl(LSelfRoleDecl node) + public LSelfDecl(LSelfDecl node) { super(node); } @Override - public LSelfRoleDecl dupNode() + public LSelfDecl dupNode() { - return new LSelfRoleDecl(this); + return new LSelfDecl(this); } @Override public void decorateDel(DelFactory df) { - df.LSelfRoleDecl(this); + df.LSelfDecl(this); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/del/DelFactory.java b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java index a4317f145..e4d48ed79 100644 --- a/scribble-ast/src/main/java/org/scribble/del/DelFactory.java +++ b/scribble-ast/src/main/java/org/scribble/del/DelFactory.java @@ -62,7 +62,7 @@ import org.scribble.ast.local.LRecursion; import org.scribble.ast.local.LRecv; import org.scribble.ast.local.LReq; -import org.scribble.ast.local.LSelfRoleDecl; +import org.scribble.ast.local.LSelfDecl; import org.scribble.ast.local.LSend; import org.scribble.ast.local.LServerWrap; import org.scribble.ast.name.qualified.DataNameNode; @@ -158,7 +158,7 @@ public interface DelFactory void LProtoHeader(LProtoHeader n); - void LSelfRoleDecl(LSelfRoleDecl n); + void LSelfDecl(LSelfDecl n); void LProtoDef(LProtoDef n); void LProtoBlock(LProtoBlock n); diff --git a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java index 385d87934..c81a3d1ac 100644 --- a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java @@ -90,7 +90,7 @@ public LProjectionDecl translate(LProjection proj) { RoleNode r = this.af.RoleNode(null, x.toString()); return x.equals(proj.self) - ? this.af.LSelfRoleDecl(null, r) + ? this.af.LSelfDecl(null, r) : this.af.RoleDecl(null, r); }).collect(Collectors.toList())); List> pds = new LinkedList<>(); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java index c923e7b0d..3cea9fcaf 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java @@ -39,7 +39,8 @@ // Pre: LRoleDeclAndDoArgFixer (for LSubprotoVisitorNoThrow visiting pattern) // Cf. RecPruner public class LDoPruner //extends DoPruner - extends STypeVisitorNoThrow implements LSubprotoVisitorNoThrow + extends STypeVisitorNoThrow + implements LSubprotoVisitorNoThrow> { protected final Core core; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgFixer.java index 76bea09e8..b15fc8fe1 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgFixer.java @@ -55,8 +55,7 @@ protected PreSubprotoRoleCollector newRoleCollector() // N.B. "Pre" role collec } // TODO: refactor into LProjection/LProtocol -- cf. GProtocol - public LProjection visitProjection( - LProjection n) + public LProjection visitProjection(LProjection n) { this.self = n.self; Set used = n.def.visitWithNoThrow(newRoleCollector()); // CHECKME: vf? @@ -118,7 +117,7 @@ public Set visitDo(Do n) // CHECKME: simply integrate into one with PreSubprotoRoleCollector? Or maybe still separately useful? class SubprotoRoleCollector extends STypeAggNoThrow> - implements LSubprotoVisitorNoThrow + implements LSubprotoVisitorNoThrow> { protected final Core core; @@ -135,11 +134,13 @@ public Set visitDirectedInteraction(DirectedInteraction n) return Stream.of(n.src, n.dst).collect(Collectors.toSet()); } + @Override public Set visitDisconnect(DisconnectAction n) { return Stream.of(n.left, n.right).collect(Collectors.toSet()); } + @Override public Set visitDo(Do n) { SubprotoSig sig = new SubprotoSig(n.proto, n.roles, n.args); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LSubprotoVisitorNoThrow.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LSubprotoVisitorNoThrow.java index d9631c7a5..f0ea92a1e 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LSubprotoVisitorNoThrow.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LSubprotoVisitorNoThrow.java @@ -26,8 +26,12 @@ // Pre: LRoleDeclAndDoArgFixer (for imed LProjections) -public interface LSubprotoVisitorNoThrow +public interface LSubprotoVisitorNoThrow // T should be SType for STypeVisitor { + + // Subclasses of "Inlined" visitors should re-override using prepareSubprotoForVisit -- cf. LSubprotoVisitorNoThrow.super.visitDo(n) + T visitDo(Do n); + default LSeq prepareSubprotoForVisit(Core core, Do n) { return prepareSubprotoForVisit(core, n, false); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java index cf04fae0f..ac3054ec3 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java @@ -73,7 +73,7 @@ public SType visitDo(Do n) } class SubprotoEnablerInferer extends InlinedEnablerInferer // super takes care of rec/continue - implements LSubprotoVisitorNoThrow + implements LSubprotoVisitorNoThrow> { private final Core core; diff --git a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index b42c60bba..8e75a6222 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -50,7 +50,7 @@ import org.scribble.ast.local.LRecursion; import org.scribble.ast.local.LRecv; import org.scribble.ast.local.LReq; -import org.scribble.ast.local.LSelfRoleDecl; +import org.scribble.ast.local.LSelfDecl; import org.scribble.ast.local.LSend; import org.scribble.ast.local.LServerWrap; import org.scribble.ast.local.LSessionNode; @@ -666,10 +666,10 @@ public LProtoHeader LProtoHeader(Token t, LProtoNameNode name, RoleDeclList rs, } @Override - public LSelfRoleDecl LSelfRoleDecl(Token t, RoleNode r) + public LSelfDecl LSelfDecl(Token t, RoleNode r) { t = newToken(t, ScribbleParser.LSELFROLEDECL); - LSelfRoleDecl n = new LSelfRoleDecl(t); + LSelfDecl n = new LSelfDecl(t); n.addScribChildren(r); n.decorateDel(this.df); return n; diff --git a/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java index 7d8f888cb..88c607567 100644 --- a/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/del/DelFactoryImpl.java @@ -64,7 +64,7 @@ import org.scribble.ast.local.LRecursion; import org.scribble.ast.local.LRecv; import org.scribble.ast.local.LReq; -import org.scribble.ast.local.LSelfRoleDecl; +import org.scribble.ast.local.LSelfDecl; import org.scribble.ast.local.LSend; import org.scribble.ast.local.LServerWrap; import org.scribble.ast.name.qualified.DataNameNode; @@ -446,7 +446,7 @@ public void LProtoHeader(LProtoHeader n) } @Override - public void LSelfRoleDecl(LSelfRoleDecl n) + public void LSelfDecl(LSelfDecl n) { setDel(n, new RoleDeclDel()); } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 4b174b1a6..7eff843c5 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -89,26 +89,24 @@ module tmp.Test; // ...store unfoldings in Context -- done // use stypefactory in core -- also make visitorfactorys (both core and ast) -- done // factor out all config factory methods more centrally? -- done a bit: mainly general factory method refactoring above - // TODO: rename addChildren1 -- done: addScribChildren + // rename addChildren1 -- done: addScribChildren // ...make ad hoc ScribNode constructions go through af properly -- done + // rename ProtoMod, ProtocolMod -- rename core Protocol? -- done: ast renamed ProtoModNode + // explicit self roles/decls (core and ast) -- currently, self decls in protocols (in core) are purely cosmetic in toString -- done: just lselfdecl, basically for printing + // fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles -- done in core for now (and needs tidying) - // rename ProtoMod, ProtocolMod -- rename core Protocol? // TODO: refactor doarg pruning, do pruning and extchoicesubj-fixing vistor passes (cf., entry methods into LProjection) - // FIXME: explicit self roles/decls (core and ast) -- currently, self decls in protocols (in core) are purely cosmetic in toString - // And fix self in ast locals, and astfactory - // Job Module projection - // TODO: fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles -- done in core for now (and needs tidying) - // TODO: projected imports/nonprotodecls -- locals import globals for nonprotos? + // fix self in ast locals, astfactory + // Job Module projection, projected imports/nonprotodecls -- locals import globals for nonprotos? // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) // fully refactor imed/module projection to Job: old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? // refactor imed projection role pruning? currently done once for globals, which is done for locals once and then pruning done again for do-args // no? now only pruned? - // CHECKME TODO: param-arg pruning? + // CHECKME: TODO: proto-param and do-nonrole-arg pruning? // Job/codegen refactoring: // Check Maven deps - // also do-arg pruning, for role-pruned projection decls // choice-specific fairness annotations // fix codegen when -fair // CHECKME: accept branching on messages (and safety properties) -- connection should not be established if message stuck? (cf. reception error) -- issue is implementation: what is a realistic semantics for sync-connect-branching (i.e., prevent client from async progressing after messaging) -- consider reversing client/server branching side? i.e. client requests, but then receives? (and consider serverside-branching a sugar?) From d129f44116c0904d956da75591bcbfe0d49681d5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 17:55:35 +0100 Subject: [PATCH 472/539] [AllTest] Edited old scribble-parser syntax examples. --- .../test/resources/scribble/examples/GDo.scr | 21 ++++++++++++------- .../scribble/examples/GInterruptible.scr | 10 --------- .../resources/scribble/examples/GMessage.scr | 20 ++++++++++-------- .../resources/scribble/examples/GParallel.scr | 12 ----------- .../resources/scribble/examples/GProtocol.scr | 12 ++++++----- .../scribble/examples/GRecursion.scr | 2 +- .../resources/scribble/examples/Imports.scr | 7 ++++--- .../resources/scribble/examples/LChoice.scr | 4 ++-- .../test/resources/scribble/examples/LDo.scr | 12 +++++------ .../scribble/examples/LInterruptible.scr | 12 ----------- .../resources/scribble/examples/LParallel.scr | 12 ----------- .../resources/scribble/examples/LProtocol.scr | 9 ++++---- .../scribble/examples/LReceive_Seller.scr | 6 ++---- .../scribble/examples/LRecursion.scr | 2 +- .../scribble/examples/LSend_Buyer.scr | 6 ++---- .../resources/scribble/examples/Types.scr | 3 ++- .../resources/scribble/examples/GMessage.scr | 10 ++++----- .../resources/scribble/examples/Imports.scr | 3 ++- 18 files changed, 62 insertions(+), 101 deletions(-) delete mode 100644 scribble-parser/src/test/resources/scribble/examples/GInterruptible.scr delete mode 100644 scribble-parser/src/test/resources/scribble/examples/GParallel.scr delete mode 100644 scribble-parser/src/test/resources/scribble/examples/LInterruptible.scr delete mode 100644 scribble-parser/src/test/resources/scribble/examples/LParallel.scr diff --git a/scribble-parser/src/test/resources/scribble/examples/GDo.scr b/scribble-parser/src/test/resources/scribble/examples/GDo.scr index 64e2e7ee3..8b8e171ec 100644 --- a/scribble-parser/src/test/resources/scribble/examples/GDo.scr +++ b/scribble-parser/src/test/resources/scribble/examples/GDo.scr @@ -3,11 +3,18 @@ module scribble.examples.GDo; type "{http://www.acme.com/financial}Order" from "http://www.acme.com/schemas/Order.xsd" as Order; type "{http://www.acme.com/financial}Receipt" from "http://www.acme.com/schemas/Receipt.xsd" as Receipt; -global protocol GDoTest(role Buyer,role Seller) { - do OtherProtocol(Buyer as OtherBuyer,Seller as OtherSeller); - do myscope: OtherProtocol(Buyer as OtherBuyer,Seller as OtherSeller); - do a.b.c.OtherProtocol(Buyer as OtherBuyer,Seller as OtherSeller); - do OtherProtocol(Buyer as OtherBuyer,Seller as OtherSeller); - do a.b.c.OtherProtocol(Buyer as OtherBuyer,Seller as OtherSeller); - do myscope: a.b.c.OtherProtocol(Buyer as OtherBuyer,Seller as OtherSeller); +global protocol GDoTest(role Buyer, role Seller) { + do OtherProtocol(Buyer, Seller); + do a.b.c.OtherProtocol(Buyer, Seller); + do AnotherProtocol(Buyer, Seller); + do a.b.c.AnotherProtocol(Buyer, Seller); +} + +aux global protocol OtherProtocol(role OtherBuyer, role OtherSeller) { + dummy() from OtherBuyer to OtherSeller; +} + +aux global protocol AnotherProtocol(role OtherBuyer, role OtherSeller) { + Buy from OtherBuyer to OtherSeller; + Confirm from OtherSeller to OtherBuyer; } diff --git a/scribble-parser/src/test/resources/scribble/examples/GInterruptible.scr b/scribble-parser/src/test/resources/scribble/examples/GInterruptible.scr deleted file mode 100644 index b55e4eca1..000000000 --- a/scribble-parser/src/test/resources/scribble/examples/GInterruptible.scr +++ /dev/null @@ -1,10 +0,0 @@ -module scribble.examples.GInterruptible; - -global protocol GInterruptibleTest(role Buyer,role Seller) { - interruptible MyLabel: { - buy(Order) from Buyer to Seller; - } with { - sell(Order),MesgParam by Seller; - cancel(Order) by Seller; - } -} diff --git a/scribble-parser/src/test/resources/scribble/examples/GMessage.scr b/scribble-parser/src/test/resources/scribble/examples/GMessage.scr index 7b0507312..ad361a2ba 100644 --- a/scribble-parser/src/test/resources/scribble/examples/GMessage.scr +++ b/scribble-parser/src/test/resources/scribble/examples/GMessage.scr @@ -3,16 +3,18 @@ module scribble.examples.GMessage; type "{http://www.acme.com/financial}Order" from "http://www.acme.com/schemas/Order.xsd" as Order; type "{http://www.acme.com/financial}Customer" from "http://www.acme.com/schemas/Customer.xsd" as Customer; -global protocol GMessageTest(role Buyer,role SellerA,role SellerB) { - buy(Order,Customer) from Buyer to SellerA; - buy(Order,Customer) from Buyer to SellerA,SellerB; - buy(o:Order,c:Customer) from Buyer to SellerA; - buy(Order) from Buyer to SellerA,SellerB; - buy(ord:Order) from Buyer to SellerA; +global protocol GMessageTest(role Buyer, role SellerA, role SellerB) { + buy(Order, Customer) from Buyer to SellerA; + //buy(Order, Customer) from Buyer to SellerA, SellerB; + buy(Order, Customer) from Buyer to SellerA; + //buy(Order) from Buyer to SellerA, SellerB; + buy(Order) from Buyer to SellerA; } -global protocol PlaceOrder(role Buyer,role Seller) { +aux global protocol PlaceOrder(role Buyer, role Seller) { + } -global protocol Receipt(role Buyer,role Seller) { -} \ No newline at end of file +aux global protocol Receipt(role Buyer, role Seller) { + +} diff --git a/scribble-parser/src/test/resources/scribble/examples/GParallel.scr b/scribble-parser/src/test/resources/scribble/examples/GParallel.scr deleted file mode 100644 index 2ffee9e3f..000000000 --- a/scribble-parser/src/test/resources/scribble/examples/GParallel.scr +++ /dev/null @@ -1,12 +0,0 @@ -module scribble.examples.GParallel; - -type "{http://www.acme.com/financial}Order" from "http://www.acme.com/schemas/Order.xsd" as Order; -type "{http://www.acme.com/financial}QuoteRequest" from "http://www.acme.com/schemas/QuoteRequest.xsd" as QuoteRequest; - -global protocol GParallelTest(role Buyer,role Seller) { - par { - buy(Order) from Buyer to Seller; - } and { - buy(QuoteRequest) from Buyer to Seller; - } -} diff --git a/scribble-parser/src/test/resources/scribble/examples/GProtocol.scr b/scribble-parser/src/test/resources/scribble/examples/GProtocol.scr index 07c1d04a0..8065d0916 100644 --- a/scribble-parser/src/test/resources/scribble/examples/GProtocol.scr +++ b/scribble-parser/src/test/resources/scribble/examples/GProtocol.scr @@ -1,14 +1,16 @@ module scribble.examples.GProtocol; -global protocol GMessageTest(role Buyer,role SellerA,role SellerB) { +global protocol GMessageTest(role Buyer, role SellerA, role SellerB) { + } -global protocol Order(role Buyer,role Seller) { +global protocol Order(role Buyer, role Seller) { + } -global protocol Receipt(role Buyer as B,role Seller as S) { +global protocol Receipt(role Buyer, role Seller) { + } -global protocol GMessageTest2(role Buyer,role SellerA,role SellerB) instantiates GMessageTest(Buyer,SellerA,SellerB); +//global protocol GMessageTest2(role Buyer,role SellerA,role SellerB) instantiates GMessageTest(Buyer,SellerA,SellerB); -global protocol Order2(role Buyer,role Seller) instantiates Order(Buyer,Seller); diff --git a/scribble-parser/src/test/resources/scribble/examples/GRecursion.scr b/scribble-parser/src/test/resources/scribble/examples/GRecursion.scr index b8f1da021..a4bef2011 100644 --- a/scribble-parser/src/test/resources/scribble/examples/GRecursion.scr +++ b/scribble-parser/src/test/resources/scribble/examples/GRecursion.scr @@ -2,7 +2,7 @@ module scribble.examples.GRecursion; type "{http://www.acme.com/financial}Order" from "http://www.acme.com/schemas/Order.xsd" as Order; -global protocol GRecursionTest(role Buyer,role Seller) { +global protocol GRecursionTest(role Buyer, role Seller) { rec MyLabel { buy(Order) from Buyer to Seller; continue MyLabel; diff --git a/scribble-parser/src/test/resources/scribble/examples/Imports.scr b/scribble-parser/src/test/resources/scribble/examples/Imports.scr index 12d3e843e..2e7f71069 100644 --- a/scribble-parser/src/test/resources/scribble/examples/Imports.scr +++ b/scribble-parser/src/test/resources/scribble/examples/Imports.scr @@ -1,8 +1,9 @@ module scribble.examples.Imports; import scribble.examples.GMessage; -from scribble.examples.GMessage import PlaceOrder; -from scribble.examples.GMessage import Receipt as OrderReceipt; +//from scribble.examples.GMessage import PlaceOrder; +//from scribble.examples.GMessage import Receipt as OrderReceipt; + +global protocol ImportsTest(role Buyer, role Seller) { -global protocol ImportsTest(role Buyer,role Seller as MySeller) { } diff --git a/scribble-parser/src/test/resources/scribble/examples/LChoice.scr b/scribble-parser/src/test/resources/scribble/examples/LChoice.scr index f7904b561..8cce478d9 100644 --- a/scribble-parser/src/test/resources/scribble/examples/LChoice.scr +++ b/scribble-parser/src/test/resources/scribble/examples/LChoice.scr @@ -3,8 +3,8 @@ module scribble.examples.LChoice; type "{http://www.acme.com/financial}Order" from "http://www.acme.com/schemas/Order.xsd" as Order; type "{http://www.acme.com/financial}QuoteRequest" from "http://www.acme.com/schemas/QuoteRequest.xsd" as QuoteRequest; -local protocol LChoiceTest at Buyer(role Buyer,role Seller) { - choice at Buyer { +local protocol LChoiceTest(self Buyer, role Seller) { + choice at self { buy(Order) to Seller; } or { buy(QuoteRequest) to Seller; diff --git a/scribble-parser/src/test/resources/scribble/examples/LDo.scr b/scribble-parser/src/test/resources/scribble/examples/LDo.scr index f8ab8e0da..e34624fa6 100644 --- a/scribble-parser/src/test/resources/scribble/examples/LDo.scr +++ b/scribble-parser/src/test/resources/scribble/examples/LDo.scr @@ -1,10 +1,8 @@ module scribble.examples.LDo; -local protocol LDoTest at Buyer(role Seller) { - do OtherProtocol(Buyer as OtherBuyer,Seller as OtherSeller); - do myscope: OtherProtocol(Buyer as OtherBuyer,Seller as OtherSeller); - do a.b.c.OtherProtocol(Buyer as OtherBuyer,Seller as OtherSeller); - do OtherProtocol(Buyer as OtherBuyer,Seller as OtherSeller); - do a.b.c.OtherProtocol(Buyer as OtherBuyer,Seller as OtherSeller); - do myscope: a.b.c.OtherProtocol(Buyer as OtherBuyer,Seller as OtherSeller); +local protocol LDoTest(self Buyer, role Seller) { + do OtherProtocol(self, Seller); + do a.b.c.OtherProtocol(self, Seller); + do OtherProtocol(self, Seller); + do a.b.c.OtherProtocol(self, Seller); } diff --git a/scribble-parser/src/test/resources/scribble/examples/LInterruptible.scr b/scribble-parser/src/test/resources/scribble/examples/LInterruptible.scr deleted file mode 100644 index 6b8f0e910..000000000 --- a/scribble-parser/src/test/resources/scribble/examples/LInterruptible.scr +++ /dev/null @@ -1,12 +0,0 @@ -module scribble.examples.LInterruptible; - -type "{http://www.acme.com/financial}Order" from "http://www.acme.com/schemas/Order.xsd" as Order; - -local protocol LInterruptibleTest at Buyer(role Buyer,role Seller) { - interruptible MyLabel: { - buy(Order) from Buyer; - } with { - throws sell(Order) to Seller; - catches cancel(Order) from Seller; - } -} diff --git a/scribble-parser/src/test/resources/scribble/examples/LParallel.scr b/scribble-parser/src/test/resources/scribble/examples/LParallel.scr deleted file mode 100644 index b9fecb681..000000000 --- a/scribble-parser/src/test/resources/scribble/examples/LParallel.scr +++ /dev/null @@ -1,12 +0,0 @@ -module scribble.examples.LParallel; - -type "{http://www.acme.com/financial}Order" from "http://www.acme.com/schemas/Order.xsd" as Order; -type "{http://www.acme.com/financial}QuoteRequest" from "http://www.acme.com/schemas/QuoteRequest.xsd" as QuoteRequest; - -local protocol LParallelTest at Buyer(role Buyer,role Seller) { - par { - buy(Order) to Seller; - } and { - buy(QuoteRequest) to Seller; - } -} diff --git a/scribble-parser/src/test/resources/scribble/examples/LProtocol.scr b/scribble-parser/src/test/resources/scribble/examples/LProtocol.scr index 45bd80e89..6bf92ed38 100644 --- a/scribble-parser/src/test/resources/scribble/examples/LProtocol.scr +++ b/scribble-parser/src/test/resources/scribble/examples/LProtocol.scr @@ -1,14 +1,13 @@ module scribble.examples.LProtocol; -local protocol GMessageTest at SellerB(role Buyer,role SellerA,role SellerB) { +local protocol GMessageTest(role Buyer, role SellerA, role SellerB) { } -local protocol Order at Seller(role Buyer,role Seller) { +local protocol Order(role Buyer, self Seller) { } -local protocol Receipt at Seller(role Buyer as B,role Seller as S) { +local protocol Receipt(self Buyer, role Seller) { } -local protocol GMessageTest2 at SellerB(role Buyer,role SellerA,role SellerB) instantiates GMessageTest(Buyer,SellerA,SellerB); +//local protocol GMessageTest2 at SellerB(role Buyer,role SellerA,role SellerB) instantiates GMessageTest(Buyer,SellerA,SellerB); -local protocol Order2 at Seller2(role Buyer2,role Seller2) instantiates Order(Buyer2 as Buyer,Seller2 as Seller); diff --git a/scribble-parser/src/test/resources/scribble/examples/LReceive_Seller.scr b/scribble-parser/src/test/resources/scribble/examples/LReceive_Seller.scr index 80c4e00c7..5c5533db6 100644 --- a/scribble-parser/src/test/resources/scribble/examples/LReceive_Seller.scr +++ b/scribble-parser/src/test/resources/scribble/examples/LReceive_Seller.scr @@ -3,9 +3,7 @@ module scribble.examples.LReceive_Seller; type "{http://www.acme.com/financial}Order" from "http://www.acme.com/schemas/Order.xsd" as Order; type "{http://www.acme.com/financial}Customer" from "http://www.acme.com/schemas/Customer.xsd" as Customer; -local protocol LReceiveTest at Seller(role Buyer,role Seller) { - buy(Order,Customer) from Buyer; - buy(o:Order,c:Customer) from Buyer; +local protocol LReceiveTest(role Buyer, self Seller) { + buy(Order, Customer) from Buyer; buy(Order) from Buyer; - buy(ord:Order) from Buyer; } diff --git a/scribble-parser/src/test/resources/scribble/examples/LRecursion.scr b/scribble-parser/src/test/resources/scribble/examples/LRecursion.scr index 423e3da10..dc15df9fa 100644 --- a/scribble-parser/src/test/resources/scribble/examples/LRecursion.scr +++ b/scribble-parser/src/test/resources/scribble/examples/LRecursion.scr @@ -2,7 +2,7 @@ module scribble.examples.LRecursion; type "{http://www.acme.com/financial}Order" from "http://www.acme.com/schemas/Order.xsd" as Order; -local protocol LRecursionTest at Buyer(role Buyer,role Seller) { +local protocol LRecursionTest(self Buyer, role Seller) { rec MyLabel { buy(Order) to Seller; continue MyLabel; diff --git a/scribble-parser/src/test/resources/scribble/examples/LSend_Buyer.scr b/scribble-parser/src/test/resources/scribble/examples/LSend_Buyer.scr index fc507b84e..72fa7539d 100644 --- a/scribble-parser/src/test/resources/scribble/examples/LSend_Buyer.scr +++ b/scribble-parser/src/test/resources/scribble/examples/LSend_Buyer.scr @@ -3,9 +3,7 @@ module scribble.examples.LSend_Buyer; type "{http://www.acme.com/financial}Order" from "http://www.acme.com/schemas/Order.xsd" as Order; type "{http://www.acme.com/financial}Customer" from "http://www.acme.com/schemas/Customer.xsd" as Customer; -local protocol LSendTest at Buyer(role Buyer,role Seller) { - buy(Order,Customer) to Seller; - buy(o:Order,c:Customer) to Seller; +local protocol LSendTest(self Buyer, role Seller) { + buy(Order, Customer) to Seller; buy(Order) to Seller; - buy(ord:Order) to Seller; } diff --git a/scribble-parser/src/test/resources/scribble/examples/Types.scr b/scribble-parser/src/test/resources/scribble/examples/Types.scr index 2724a82f1..84284f42e 100644 --- a/scribble-parser/src/test/resources/scribble/examples/Types.scr +++ b/scribble-parser/src/test/resources/scribble/examples/Types.scr @@ -2,5 +2,6 @@ module scribble.examples.Types; type "{http://www.acme.com/financial}Trade" from "http://www.acme.com/schemas/Trade.xsd" as Trade; -global protocol TestTypes(role Buyer,role Seller as MySeller) { +global protocol TestTypes(role Buyer, role Seller) { + } diff --git a/scribble-test/src/test/resources/scribble/examples/GMessage.scr b/scribble-test/src/test/resources/scribble/examples/GMessage.scr index 9296dc6cd..c2644017f 100644 --- a/scribble-test/src/test/resources/scribble/examples/GMessage.scr +++ b/scribble-test/src/test/resources/scribble/examples/GMessage.scr @@ -1,9 +1,9 @@ module scribble.examples.GMessage; -global protocol GMessageProtocol(role Buyer,role Seller) { - buy(Order,Customer) from Buyer to Seller; - buy(Order,Customer) from Buyer to Seller; - buy(o:Order,c:Customer) from Buyer to Seller; +type "{http://www.acme.com/financial}Order" from "http://www.acme.com/schemas/Order.xsd" as Order; +type "{http://www.acme.com/financial}Customer" from "http://www.acme.com/schemas/Customer.xsd" as Customer; + +global protocol GMessageProtocol(role Buyer, role Seller) { + buy(Order, Customer) from Buyer to Seller; buy(Order) from Buyer to Seller; - buy(ord:Order) from Buyer to Seller; } diff --git a/scribble-test/src/test/resources/scribble/examples/Imports.scr b/scribble-test/src/test/resources/scribble/examples/Imports.scr index 5e23ce411..ec23f7934 100644 --- a/scribble-test/src/test/resources/scribble/examples/Imports.scr +++ b/scribble-test/src/test/resources/scribble/examples/Imports.scr @@ -2,5 +2,6 @@ module scribble.examples.Imports; import scribble.examples.GMessage; -global protocol ImportsProtocol(role Buyer,role Seller) { +global protocol ImportsProtocol(role Buyer, role Seller) { + do GMessage.GMessageProtocol(Buyer, Seller); } From 3a68b07d04bfef4e213357c3cafc3a3f7df9209b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 5 May 2019 17:59:40 +0100 Subject: [PATCH 473/539] [AllTest] Minor. --- scribble-test/src/test/scrib/tmp/Test.scr | 1 + 1 file changed, 1 insertion(+) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 7eff843c5..88bb584e2 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -97,6 +97,7 @@ module tmp.Test; // TODO: refactor doarg pruning, do pruning and extchoicesubj-fixing vistor passes (cf., entry methods into LProjection) // fix self in ast locals, astfactory + // wrap base class, more global base classes (maybe in del's) // Job Module projection, projected imports/nonprotodecls -- locals import globals for nonprotos? // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) From 19e67890df86f186b67d0e449003314744bebf12 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 7 May 2019 08:24:20 +0100 Subject: [PATCH 474/539] [AllTest] Moved do role-arg self fixing back into SubprotoProjector. --- .../main/java/org/scribble/core/job/Core.java | 10 +++++----- .../core/visit/global/SubprotoProjector.java | 3 +-- ...rgFixer.java => LRoleDeclAndDoArgPruner.java} | 16 +++++++--------- .../core/visit/local/LTypeVisitorFactory.java | 2 +- .../visit/local/LTypeVisitorFactoryImpl.java | 4 ++-- 5 files changed, 16 insertions(+), 19 deletions(-) rename scribble-core/src/main/java/org/scribble/core/visit/local/{LRoleDeclAndDoArgFixer.java => LRoleDeclAndDoArgPruner.java} (92%) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 61839119e..e79746783 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -45,7 +45,7 @@ import org.scribble.core.visit.gather.ProtoDepsCollector; import org.scribble.core.visit.gather.RoleGatherer; import org.scribble.core.visit.global.GTypeVisitorFactoryImpl; -import org.scribble.core.visit.local.LRoleDeclAndDoArgFixer; +import org.scribble.core.visit.local.LRoleDeclAndDoArgPruner; import org.scribble.core.visit.local.LDoPruner; import org.scribble.core.visit.local.LTypeVisitorFactoryImpl; import org.scribble.core.visit.local.SubprotoExtChoiceSubjFixer; @@ -226,7 +226,7 @@ protected void runProjectionPasses() // No ScribException, no errors expected } verbosePrintPass("Pruning do-args on all projected intermediates..."); - LRoleDeclAndDoArgFixer v1 = this.config.vf.local.LDoArgPruner(this); // Reusable + LRoleDeclAndDoArgPruner v1 = this.config.vf.local.LDoArgPruner(this); // Reusable List done1 = new LinkedList<>(); for (ProtoName fullname : this.context.getParsedFullnames()) { @@ -234,11 +234,11 @@ protected void runProjectionPasses() // No ScribException, no errors expected for (Role self : imed.roles) { LProjection proj = this.context.getProjection(fullname, self); - LProjection fixed = (LProjection) v1.visitProjection(proj); // TODO: refactor as LProjection/LProto meth, cf. GProto - done1.add(fixed); // N.B. replaces existing projection + LProjection pruned = (LProjection) v1.visitProjection(proj); // TODO: refactor as LProjection/LProto meth, cf. GProto + done1.add(pruned); // N.B. replaces existing projection verbosePrintPass( "Pruned do-args on projected intermediate: " - + fixed.fullname + ":\n" + fixed); + + pruned.fullname + ":\n" + pruned); } } done1.forEach(x -> this.getContext().setProjection(x)); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java index bd89fc9d8..fcbf06e4f 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/SubprotoProjector.java @@ -74,8 +74,7 @@ public LType visitDo(Do n) List used = corec.getInlined(proto).roles.stream() // N.B. global (inlined) roles -- still need to prune roles w.r.t. localised projection .map(x -> subs.subsRole(x)).collect(Collectors.toList()); List rs = n.roles.stream().filter(x -> used.contains(x)) - //.map(x -> x.equals(this.self) ? Role.SELF : x) - // CHECKME: now leaving "self" in do-arg to LDoArgPruner -- easier to do role subs for do-visiting (though a bit inconsistent with "self" in, e.g., interactions) + .map(x -> x.equals(this.self) ? Role.SELF : x) // CHECKME: syntax: "self" explictly used for Choice subject, but implicitly for MessageTransfer, inconsistent? .collect(Collectors.toList()); return this.core.config.tf.local.LDo(null, fullname, rs, n.args); // TODO CHECKME: prune args? diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgPruner.java similarity index 92% rename from scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgFixer.java rename to scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgPruner.java index b15fc8fe1..ba9a86a39 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgPruner.java @@ -35,15 +35,13 @@ import org.scribble.core.visit.STypeVisitorNoThrow; import org.scribble.core.visit.Substitutor; -// Pre: SubprotoProjector -- "self" fixed for interactions and choice-subjs, but not for do role-args -// Prunes LProto/Proj role decls, and fixes/prunes do role-args (including "self" fixing) -public class LRoleDeclAndDoArgFixer extends STypeVisitorNoThrow +// Pre: SubprotoProjector -- "self" fixed for interactions, choice-subjs and do role-args +// Prunes LProto/Proj role decls and do role-args +public class LRoleDeclAndDoArgPruner extends STypeVisitorNoThrow { private final Core core; - - private Role self; - protected LRoleDeclAndDoArgFixer(Core core) + protected LRoleDeclAndDoArgPruner(Core core) { this.core = core; } @@ -57,7 +55,6 @@ protected PreSubprotoRoleCollector newRoleCollector() // N.B. "Pre" role collec // TODO: refactor into LProjection/LProtocol -- cf. GProtocol public LProjection visitProjection(LProjection n) { - this.self = n.self; Set used = n.def.visitWithNoThrow(newRoleCollector()); // CHECKME: vf? List rs = n.roles.stream() .filter(x -> used.contains(x) || x.equals(n.self)) // FIXME: self roledecl not actually being a self role is a mess @@ -72,8 +69,9 @@ public Do visitDo(Do n) List fixed = new LinkedList<>(); Set rs = n.visitWithNoThrow(newRoleCollector()); // N.B. does subproto visiting, unlike RoleGatherer fixed = n.roles.stream() - .filter(x -> rs.contains(x) || x.equals(this.self)) - .map(x -> x.equals(this.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess + /*.filter(x -> rs.contains(x) || x.equals(this.self)) + .map(x -> x.equals(this.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess*/ + .filter(x -> rs.contains(x) || x.equals(Role.SELF)) .collect(Collectors.toList()); return n.reconstruct(n.getSource(), n.proto, fixed, n.args); // CHECKME: prune args? } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java index 7b02d3b51..c525340b6 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactory.java @@ -24,7 +24,7 @@ public interface LTypeVisitorFactory EGraphBuilder EGraphBuilder(Core core); - LRoleDeclAndDoArgFixer LDoArgPruner(Core core); + LRoleDeclAndDoArgPruner LDoArgPruner(Core core); LDoPruner LDoPruner(Core core); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java index bacbafb48..c39307d12 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LTypeVisitorFactoryImpl.java @@ -37,9 +37,9 @@ public EGraphBuilder EGraphBuilder(Core core) } @Override - public LRoleDeclAndDoArgFixer LDoArgPruner(Core core) + public LRoleDeclAndDoArgPruner LDoArgPruner(Core core) { - return new LRoleDeclAndDoArgFixer(core); + return new LRoleDeclAndDoArgPruner(core); } @Override From 4cf809f7c79b2a74a3c55eb995a8dd64e0c8419f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 7 May 2019 10:18:04 +0100 Subject: [PATCH 475/539] [AllTest] Made imed projection pruning/fixing visitor passes more uniform in Core. --- .../main/java/org/scribble/core/job/Core.java | 10 ++--- .../org/scribble/core/lang/SubprotoSig.java | 10 +++-- .../scribble/core/lang/local/LProtocol.java | 38 +++++++++++++------ .../scribble/core/visit/local/LDoPruner.java | 8 ++-- .../visit/local/LRoleDeclAndDoArgPruner.java | 4 +- .../local/SubprotoExtChoiceSubjFixer.java | 1 - 6 files changed, 43 insertions(+), 28 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index e79746783..baa61286f 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -234,11 +234,11 @@ protected void runProjectionPasses() // No ScribException, no errors expected for (Role self : imed.roles) { LProjection proj = this.context.getProjection(fullname, self); - LProjection pruned = (LProjection) v1.visitProjection(proj); // TODO: refactor as LProjection/LProto meth, cf. GProto - done1.add(pruned); // N.B. replaces existing projection + LProjection fixed = (LProjection) proj.pruneRoleDeclsAndDoArgs(v1); // TODO: refactor as LProjection/LProto meth, cf. GProto + done1.add(fixed); // N.B. replaces existing projection verbosePrintPass( "Pruned do-args on projected intermediate: " - + pruned.fullname + ":\n" + pruned); + + fixed.fullname + ":\n" + fixed); } } done1.forEach(x -> this.getContext().setProjection(x)); @@ -253,7 +253,7 @@ protected void runProjectionPasses() // No ScribException, no errors expected for (Role self : imed.roles) { LProjection proj = this.context.getProjection(fullname, self); - LProjection fixed = v2.visitProjection(proj); // TODO: refactor as LProjection/LProto meth, cf. GProto + LProjection fixed = (LProjection) proj.pruneDos(v2); // TODO: refactor as LProjection/LProto meth, cf. GProto done2.add(fixed); // N.B. replaces existing projection verbosePrintPass( "Do-pruned projected intermediate: " @@ -273,7 +273,7 @@ protected void runProjectionPasses() // No ScribException, no errors expected for (Role self : imed.roles) { LProjection proj = this.context.getProjection(fullname, self); - LProjection fixed = (LProjection) v3.visitProtocol(proj); + LProjection fixed = (LProjection) proj.fixExtChoiceSubjs(v3); this.context.setProjection(fixed); // N.B. replaces existing projection verbosePrintPass( "Fixed external choice subjects for projected intermediate: " diff --git a/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java index df8db2ec6..e6239aa05 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java @@ -17,7 +17,8 @@ import java.util.List; import java.util.stream.Collectors; -import org.scribble.core.lang.local.LProjection; +import org.scribble.core.lang.global.GProtocol; +import org.scribble.core.lang.local.LProtocol; import org.scribble.core.type.kind.NonRoleParamKind; import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.MemberName; @@ -45,14 +46,15 @@ public SubprotoSig(ProtoName fullname, this.args = Collections.unmodifiableList(args); } - public SubprotoSig(Protocol n) + public SubprotoSig(GProtocol n) { this(n.fullname, n.roles, paramsToArgs(n.params)); } - public SubprotoSig(LProjection n) + public SubprotoSig(LProtocol n) { - this(n.fullname, n.roles.stream().map(x -> x.equals(n.self) ? Role.SELF : x) // FIXME: (implicit) self role mess + this(n.fullname, n.roles.stream().map(x -> x.equals(n.self) ? Role.SELF : x) + // FIXME: (implicit) self role mess .collect(Collectors.toList()), paramsToArgs(n.params)); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java index ccb89e7b3..d0c0d2872 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/local/LProtocol.java @@ -37,6 +37,9 @@ import org.scribble.core.visit.STypeUnfolder; import org.scribble.core.visit.Substitutor; import org.scribble.core.visit.local.EGraphBuilder; +import org.scribble.core.visit.local.LDoPruner; +import org.scribble.core.visit.local.LRoleDeclAndDoArgPruner; +import org.scribble.core.visit.local.SubprotoExtChoiceSubjFixer; import org.scribble.util.Constants; import org.scribble.util.ScribException; @@ -68,11 +71,6 @@ public LProtocol reconstruct(CommonTree source, { return new LProtocol(source, mods, fullname, roles, self, params, def); } - - public void checkReachability(Core core) throws ScribException - { - this.def.visitWith(core.config.vf.local.ReachabilityChecker()); - } // CHECKME: drop from Protocol (after removing Protocol from SType?) // Pre: stack.peek is the sig for the calling Do (or top-level entry) @@ -85,8 +83,6 @@ public LProtocol getInlined(STypeInliner v) Substitutor subs = v.core.config.vf.Substitutor(this.roles, sig.roles, this.params, sig.args); - /*LSeq body = (LSeq) this.def.visitWithNoEx(subs).visitWithNoEx(v) - .visitWithNoEx(new RecPruner<>());*/ LSeq inlined = v.visitSeq(subs.visitSeq(this.def)); RecVar rv = v.getInlinedRecVar(sig); LRecursion rec = v.core.config.tf.local.LRecursion(null, rv, inlined); // CHECKME: or protodecl source? @@ -97,8 +93,7 @@ public LProtocol getInlined(STypeInliner v) .collect(Collectors.toSet()); List rs = this.roles.stream().filter(x -> used.contains(x)) // Prune role decls .collect(Collectors.toList());*/ - return //new LProtocol - reconstruct(getSource(), this.mods, this.fullname, this.roles, + return reconstruct(getSource(), this.mods, this.fullname, this.roles, this.self, this.params, def); // CHECKME: or null source? } @@ -110,13 +105,32 @@ public LProtocol unfoldAllOnce(STypeUnfolder v) this.self, this.params, unf); } + public void checkReachability(Core core) throws ScribException + { + this.def.visitWith(core.config.vf.local.ReachabilityChecker()); + } + + // Implicitly means Subproto visitor + public LProtocol pruneRoleDeclsAndDoArgs(LRoleDeclAndDoArgPruner v) + { + return v.visitLProtocol(this); + } + + // Implicitly means Subproto visitor + public LProtocol pruneDos(LDoPruner v) + { + return v.visitLProtocol(this); + } + + public LProtocol fixExtChoiceSubjs(SubprotoExtChoiceSubjFixer v) + { + return (LProtocol) v.visitProtocol(this); + } + public EGraph toEGraph(Core core) { - //EGraphBuilderUtil2 b = job.newEGraphBuilderUtil(); - ////b.init(null); // FIXME: init param not used if (this.def.isEmpty()) // Empty Seq special case for top-level -- in general, Seq must be non-empty, cf. LSeq::buildGraph entry/exit { - //EState s = b.getEntry(); EState s = core.config.mf.local.EState(Collections.emptySet()); return new EGraph(s, s); // TODO: refactor constructor inside mf } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java index 3cea9fcaf..ebc1f717a 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LDoPruner.java @@ -22,7 +22,7 @@ import org.scribble.core.job.Core; import org.scribble.core.lang.SubprotoSig; -import org.scribble.core.lang.local.LProjection; +import org.scribble.core.lang.local.LProtocol; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.Choice; @@ -65,14 +65,14 @@ protected LDoPruner(LDoPruner v) this.unguarded = new HashSet<>(v.unguarded); } - // TODO: refactor to LProjection -- cf. GProtocol (e.g., getInlined, etc) - public LProjection visitProjection(LProjection n) + // Top-level entry, different to the other visit methods + public LProtocol visitLProtocol(LProtocol n) { this.self = n.self; this.stack.clear(); this.unguarded.clear(); - SubprotoSig sig = new SubprotoSig(n); + SubprotoSig sig = new SubprotoSig(n); // N.B. overloaded constructor, param type important this.stack.push(sig); this.unguarded.add(sig); LSeq def = visitSeq(n.def); diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgPruner.java index ba9a86a39..746ee1984 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgPruner.java @@ -24,6 +24,7 @@ import org.scribble.core.job.Core; import org.scribble.core.lang.SubprotoSig; import org.scribble.core.lang.local.LProjection; +import org.scribble.core.lang.local.LProtocol; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.Role; import org.scribble.core.type.session.DirectedInteraction; @@ -52,8 +53,7 @@ protected PreSubprotoRoleCollector newRoleCollector() // N.B. "Pre" role collec return new PreSubprotoRoleCollector(this.core); } - // TODO: refactor into LProjection/LProtocol -- cf. GProtocol - public LProjection visitProjection(LProjection n) + public LProtocol visitLProtocol(LProtocol n) { Set used = n.def.visitWithNoThrow(newRoleCollector()); // CHECKME: vf? List rs = n.roles.stream() diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java index ac3054ec3..70f546172 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/SubprotoExtChoiceSubjFixer.java @@ -43,7 +43,6 @@ protected SubprotoExtChoiceSubjFixer(Core core) // To visit top-level proto, reconstruct for fixed subjs -- nested visting (by Inferer) only does passive inference (no reconstruct) // Must enter here, for initial this.protos entry - // TODO: refactor into LProjection/LProtocol -- cf. GProtocol public Protocol visitProtocol( Protocol n) { From f70b1dc33bbebf2b9ee36373c46660a788b1d2a0 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 7 May 2019 11:45:59 +0100 Subject: [PATCH 476/539] [AllTest] Refactored self in local ast nodes/factory. --- .../java/org/scribble/ast/AstFactory.java | 17 ++--- .../java/org/scribble/ast/local/LAcc.java | 21 ++++++ .../scribble/ast/local/LConnectAction.java | 4 + .../org/scribble/ast/local/LDisconnect.java | 12 +++ .../org/scribble/ast/local/LMsgTransfer.java | 5 ++ .../java/org/scribble/ast/local/LRecv.java | 20 +++++ .../java/org/scribble/ast/local/LReq.java | 21 ++++++ .../java/org/scribble/ast/local/LSend.java | 19 +++++ .../scribble/ast/name/simple/RoleNode.java | 2 + .../scribble/util/LProjectionTranslator.java | 33 ++++----- .../org/scribble/core/lang/SubprotoSig.java | 1 + .../scribble/core/lang/global/GProtocol.java | 73 +++++++++---------- .../core/type/session/local/LDisconnect.java | 5 ++ .../visit/local/LRoleDeclAndDoArgPruner.java | 8 +- .../java/org/scribble/ast/AstFactoryImpl.java | 20 ++--- scribble-test/src/test/scrib/tmp/Test.scr | 7 +- 16 files changed, 189 insertions(+), 79 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index 6d63d35b7..cbce124ec 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -147,12 +147,11 @@ GMsgTransfer GMsgTransfer(Token t, RoleNode src, MsgNode msg, GRecursion GRecursion(Token t, RecVarNode rv, GProtoBlock block); /*LProtoDecl LProtoDecl(Token t, ProtoModList mods, - LProtoHeader header, LProtoDef def); // Not currently used -- local protos not parsed, only projected*/ + LProtoHeader header, LProtoDef def); // Not currently used -- local protos not yet parsed, only projected*/ LProjectionDecl LProjectionDecl(Token t, ProtoModList mods, LProtoHeader header, LProtoDef def, GProtoNameNode fullname, - RoleNode self); - // del extends that of LProtoDecl + RoleNode self); // del extends that of LProtoDecl LProtoHeader LProtoHeader(Token t, LProtoNameNode name, RoleDeclList rs, NonRoleParamDeclList ps); @@ -162,12 +161,12 @@ LProtoHeader LProtoHeader(Token t, LProtoNameNode name, RoleDeclList rs, LProtoBlock LProtoBlock(Token t, LInteractionSeq seq); LInteractionSeq LInteractionSeq(Token t, List elems); - // CHECKME: refactor with self arg? -- cf. core local types -- yes: FIXME - LSend LSend(Token t, RoleNode src, MsgNode msg, RoleNode dst); - LRecv LRecv(Token t, RoleNode src, MsgNode msg, RoleNode dst); - LAcc LAcc(Token t, RoleNode src, MsgNode msg, RoleNode dst); - LReq LReq(Token t, RoleNode src, MsgNode msg, RoleNode dst); - LDisconnect LDisconnect(Token t, RoleNode left, RoleNode right); + // Following take "self" param in case of parsed Token (not actually supported yet) + LSend LSend(Token t, RoleNode self, MsgNode msg, RoleNode dst); + LRecv LRecv(Token t, RoleNode src, MsgNode msg, RoleNode self); + LAcc LAcc(Token t, RoleNode src, MsgNode msg, RoleNode self); + LReq LReq(Token t, RoleNode self, MsgNode msg, RoleNode dst); + LDisconnect LDisconnect(Token t, RoleNode self, RoleNode peer); LClientWrap LClientWrap(Token t, RoleNode client, RoleNode server); LServerWrap LServerWrap(Token t, RoleNode client, RoleNode server); diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LAcc.java b/scribble-ast/src/main/java/org/scribble/ast/local/LAcc.java index 72b7f38d1..5297bd7d3 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LAcc.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LAcc.java @@ -13,7 +13,10 @@ */ package org.scribble.ast.local; +import java.util.List; + import org.antlr.runtime.Token; +import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.DelFactory; import org.scribble.util.Constants; @@ -30,6 +33,24 @@ public LAcc(LAcc node) { super(node); } + + // CHECKME: factor out implementations with LRecv as default methods + @Override + public RoleNode getSelfChild() + { + List dsts = getDestinationChildren(); + if (dsts.size() > 1) + { + throw new RuntimeException("Shouldn't get in here: " + this); // CHECKME: don't use common src/dst pattern between global/local? + } + return dsts.get(0); + } + + @Override + public RoleNode getPeerChild() + { + return getSourceChild(); + } @Override public LAcc dupNode() diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LConnectAction.java b/scribble-ast/src/main/java/org/scribble/ast/local/LConnectAction.java index 84c0be7d0..7c7348f88 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LConnectAction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LConnectAction.java @@ -15,6 +15,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.ConnectAction; +import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Local; public abstract class LConnectAction extends ConnectAction @@ -32,4 +33,7 @@ public LConnectAction(LConnectAction node) super(node); } + // CHECKME: make an LDirectedAction interface? cf. LMsgTransfer -- CHECKME: factor out implementations as default methods with Send/Recv? + public abstract RoleNode getSelfChild(); // Post: "self" RoleNode + public abstract RoleNode getPeerChild(); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java b/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java index ddd7d1b22..cc529195d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LDisconnect.java @@ -15,6 +15,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.DisconnectAction; +import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Local; import org.scribble.del.DelFactory; import org.scribble.util.Constants; @@ -33,6 +34,17 @@ public LDisconnect(LDisconnect node) { super(node); } + + // Cf. core LDisconnect + public RoleNode getSelfChild() + { + return getLeftChild(); + } + + public RoleNode getPeerChild() + { + return getRightChild(); + } @Override public void decorateDel(DelFactory df) diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LMsgTransfer.java b/scribble-ast/src/main/java/org/scribble/ast/local/LMsgTransfer.java index d1457b4c3..20bfd4dd2 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LMsgTransfer.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LMsgTransfer.java @@ -15,6 +15,7 @@ import org.antlr.runtime.Token; import org.scribble.ast.MsgTransfer; +import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Local; public abstract class LMsgTransfer extends MsgTransfer @@ -31,4 +32,8 @@ public LMsgTransfer(LMsgTransfer node) { super(node); } + + // CHECKME: make an LDirectedAction interface? cf. LConnectAction -- CHECKME: factor out implementations as default methods with Acc/Req? + public abstract RoleNode getSelfChild(); // Post: "self" RoleNode + public abstract RoleNode getPeerChild(); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java b/scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java index d5b016b43..74efffc98 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LRecv.java @@ -13,7 +13,10 @@ */ package org.scribble.ast.local; +import java.util.List; + import org.antlr.runtime.Token; +import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.DelFactory; import org.scribble.util.Constants; @@ -30,6 +33,23 @@ public LRecv(LRecv node) { super(node); } + + @Override + public RoleNode getSelfChild() + { + List dsts = getDestinationChildren(); + if (dsts.size() > 1) + { + throw new RuntimeException("Shouldn't get in here: " + this); // CHECKME: don't use common src/dst pattern between global/local? + } + return dsts.get(0); + } + + @Override + public RoleNode getPeerChild() + { + return getSourceChild(); + } @Override public LRecv dupNode() diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LReq.java b/scribble-ast/src/main/java/org/scribble/ast/local/LReq.java index 6bed36e84..4fb58ef52 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LReq.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LReq.java @@ -13,7 +13,10 @@ */ package org.scribble.ast.local; +import java.util.List; + import org.antlr.runtime.Token; +import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.DelFactory; import org.scribble.util.Constants; @@ -30,6 +33,24 @@ public LReq(LReq node) { super(node); } + + // CHECKME: factor out implementations with LSend as default methods + @Override + public RoleNode getSelfChild() + { + return getSourceChild(); + } + + @Override + public RoleNode getPeerChild() + { + List dsts = getDestinationChildren(); + if (dsts.size() > 1) + { + throw new RuntimeException("Shouldn't get in here: " + this); // Multi-connect/req not supported + } + return dsts.get(0); + } @Override public LReq dupNode() diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java b/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java index ed69e3f6c..eb8c8a254 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LSend.java @@ -13,9 +13,11 @@ */ package org.scribble.ast.local; +import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.Token; +import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.DelFactory; import org.scribble.util.Constants; @@ -32,6 +34,23 @@ public LSend(LSend node) { super(node); } + + @Override + public RoleNode getSelfChild() + { + return getSourceChild(); + } + + @Override + public RoleNode getPeerChild() + { + List dsts = getDestinationChildren(); + if (dsts.size() > 1) + { + throw new RuntimeException("[TODO] Multi-send: " + this); + } + return dsts.get(0); + } @Override public LSend dupNode() diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java index a2cf5cf2b..da32135cf 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/RoleNode.java @@ -21,6 +21,8 @@ public class RoleNode extends SimpleNameNode implements DoArgNode { + //public static final RoleNode SELF = ...; // No: no token info + // Scribble.g, IDENTIFIER<...Node>[$IDENTIFIER] // N.B. ttype (an "imaginary node" type) is discarded, t is a ScribbleParser.ID token type public RoleNode(int ttype, Token t) diff --git a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java index c81a3d1ac..37418a90e 100644 --- a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java @@ -54,6 +54,7 @@ import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.PayElemType; +import org.scribble.core.type.name.Role; import org.scribble.core.type.name.SigName; import org.scribble.core.type.session.Arg; import org.scribble.core.type.session.Msg; @@ -77,11 +78,14 @@ public class LProjectionTranslator { public final Job job; private final AstFactory af; + + private final RoleNode SELF_NODE; // translate LChoice/LDo currently make their own self RoleNodes public LProjectionTranslator(Job job) { this.job = job; this.af = job.config.af; + SELF_NODE = this.af.RoleNode(null, Role.SELF.toString()); } public LProjectionDecl translate(LProjection proj) @@ -171,45 +175,40 @@ protected PayElem translate(PayElemType e) } } - // FIXME: in following, special "self" nodes? + // N.B. in the following, "self" are just regular Role names, and translated to regular RoleNode (cf. LSelfDecl) - protected org.scribble.ast.local.LAcc translate(LAcc t) + protected org.scribble.ast.local.LSend translate(LSend t) { - RoleNode src = this.af.RoleNode(null, t.src.toString()); RoleNode dst = this.af.RoleNode(null, t.dst.toString()); MsgNode msg = translate(t.msg); - return this.af.LAcc(null, src, msg, dst); + return this.af.LSend(null, SELF_NODE, msg, dst); // Ignoring t.src, but it's "self" } - protected org.scribble.ast.local.LReq translate(LReq t) + protected org.scribble.ast.local.LRecv translate(LRecv t) { RoleNode src = this.af.RoleNode(null, t.src.toString()); - RoleNode dst = this.af.RoleNode(null, t.dst.toString()); MsgNode msg = translate(t.msg); - return this.af.LReq(null, src, msg, dst); + return this.af.LRecv(null, src, msg, SELF_NODE); // Ignoring t.src, but it's "self" } - protected org.scribble.ast.local.LSend translate(LSend t) + protected org.scribble.ast.local.LAcc translate(LAcc t) { RoleNode src = this.af.RoleNode(null, t.src.toString()); - RoleNode dst = this.af.RoleNode(null, t.dst.toString()); MsgNode msg = translate(t.msg); - return this.af.LSend(null, src, msg, dst); + return this.af.LAcc(null, src, msg, SELF_NODE); // Ignoring t.src, but it's "self" } - protected org.scribble.ast.local.LRecv translate(LRecv t) + protected org.scribble.ast.local.LReq translate(LReq t) { - RoleNode src = this.af.RoleNode(null, t.src.toString()); RoleNode dst = this.af.RoleNode(null, t.dst.toString()); MsgNode msg = translate(t.msg); - return this.af.LRecv(null, src, msg, dst); + return this.af.LReq(null, SELF_NODE, msg, dst); // Ignoring t.src, but it's "self" } protected org.scribble.ast.local.LDisconnect translate(LDisconnect t) { - RoleNode self = this.af.RoleNode(null, t.left.toString()); // FIXME: remove explicit self parsing from all I/O actions RoleNode peer = this.af.RoleNode(null, t.getPeer().toString()); - return this.af.LDisconnect(null, self, peer); + return this.af.LDisconnect(null, SELF_NODE, peer); // Ignoring t.src, but it's "self" } protected org.scribble.ast.local.LContinue translate(LContinue t) @@ -274,14 +273,14 @@ else if (k.equals(DataKind.KIND)) IdNode.from(this.af, t.proto.getElements())); RoleArgList rs = this.af.RoleArgList(null, // Cf. translate(LProjectionDecl) t.roles.stream().map( - x -> this.af.RoleArg(null, this.af.RoleNode(null, x.toString()))) // FIXME: special "self" node? + x -> this.af.RoleArg(null, this.af.RoleNode(null, x.toString()))) // Includes "self" .collect(Collectors.toList())); return this.af.LDo(null, proto, as, rs); } protected org.scribble.ast.local.LChoice translate(LChoice t) { - RoleNode subj = this.af.RoleNode(null, t.subj.toString()); // CHECKME: subj's already always fixed? + RoleNode subj = this.af.RoleNode(null, t.subj.toString()); // Includes "self" List blocks = t.blocks.stream().map(x -> translate(x)) .collect(Collectors.toList()); return this.af.LChoice(null, subj, blocks); diff --git a/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java index e6239aa05..742920bc0 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/SubprotoSig.java @@ -54,6 +54,7 @@ public SubprotoSig(GProtocol n) public SubprotoSig(LProtocol n) { this(n.fullname, n.roles.stream().map(x -> x.equals(n.self) ? Role.SELF : x) + // N.B. role decls (cf. do-args) don't feature self (cf. LSelfDecl), even after pruning/fixing // FIXME: (implicit) self role mess .collect(Collectors.toList()), paramsToArgs(n.params)); } diff --git a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java index 258455806..38ba23faf 100644 --- a/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java +++ b/scribble-core/src/main/java/org/scribble/core/lang/global/GProtocol.java @@ -64,6 +64,39 @@ public GProtocol reconstruct(CommonTree source, { return new GProtocol(source, mods, fullname, roles, params, def); } + + // Cf. (e.g.) checkRoleEnabling, that takes Core + // CHECKME: drop from Protocol (after removing Protocol from SType?) + // Pre: stack.peek is the sig for the calling Do (or top-level entry), i.e., it gives the roles/args at the call-site + @Override + public GProtocol getInlined(STypeInliner v) + { + SubprotoSig sig = new SubprotoSig(this); + v.pushSig(sig); + + Substitutor subs = v.core.config.vf.Substitutor(this.roles, sig.roles, + this.params, sig.args); + GSeq inlined = v.visitSeq(subs.visitSeq(this.def)); + RecVar rv = v.getInlinedRecVar(sig); + GRecursion rec = v.core.config.tf.global.GRecursion(null, rv, inlined); // CHECKME: or protodecl source? + GSeq seq = v.core.config.tf.global.GSeq(null, Arrays.asList(rec)); + GSeq def = v.core.config.vf.RecPruner().visitSeq(seq); + Set used = def.gather(new RoleGatherer()::visit) + .collect(Collectors.toSet()); + List rs = this.roles.stream().filter(x -> used.contains(x)) // Prune role decls -- CHECKME: what is an example? was this from before unused role checking? + .collect(Collectors.toList()); + return //new GProtocol + reconstruct(getSource(), this.mods, this.fullname, rs, + this.params, def); + } + + @Override + public GProtocol unfoldAllOnce(STypeUnfolder v) + { + GSeq unf = v.visitSeq(this.def); + return reconstruct(getSource(), this.mods, this.fullname, this.roles, + this.params, unf); + } // Cf. (e.g.) getInlined, that takes the Visitor (not Core) public void checkRoleEnabling(Core core) throws ScribException @@ -128,47 +161,13 @@ public LProjection project(Core core, Role self) .getFullProjectionName(this.fullname, self); List> params = new LinkedList<>(this.params); // CHECKME: filter params by usage? - LProjection proj = new LProjection(this.mods, fullname, this.roles, self, params, - this.fullname, pruned); + // N.B. also not using PreRoleCollector here for role decl pruning (cf. LRoleDeclAndDoArgPruner), "initial" projection pass not complete yet, so cannot traverse all needed subprotos + LProjection proj = new LProjection(this.mods, fullname, this.roles, self, + params, this.fullname, pruned); // TODO: fully refactor ext choice subj fixing, do pruning, etc to Job and use AstVisitor? return proj; } - // Cf. (e.g.) checkRoleEnabling, that takes Core - // CHECKME: drop from Protocol (after removing Protocol from SType?) - // Pre: stack.peek is the sig for the calling Do (or top-level entry), i.e., it gives the roles/args at the call-site - @Override - public GProtocol getInlined(STypeInliner v) - { - SubprotoSig sig = new SubprotoSig(this); - v.pushSig(sig); - - Substitutor subs = v.core.config.vf.Substitutor(this.roles, sig.roles, - this.params, sig.args); - /*GSeq body = (GSeq) this.def.visitWithNoThrow(subs).visitWithNoThrow(v) - .visitWithNoThrow(new RecPruner<>());*/ - GSeq inlined = v.visitSeq(subs.visitSeq(this.def)); - RecVar rv = v.getInlinedRecVar(sig); - GRecursion rec = v.core.config.tf.global.GRecursion(null, rv, inlined); // CHECKME: or protodecl source? - GSeq seq = v.core.config.tf.global.GSeq(null, Arrays.asList(rec)); - GSeq def = v.core.config.vf.RecPruner().visitSeq(seq); - Set used = def.gather(new RoleGatherer()::visit) - .collect(Collectors.toSet()); - List rs = this.roles.stream().filter(x -> used.contains(x)) // Prune role decls -- CHECKME: what is an example? was this from before unused role checking? - .collect(Collectors.toList()); - return //new GProtocol - reconstruct(getSource(), this.mods, this.fullname, rs, - this.params, def); - } - - @Override - public GProtocol unfoldAllOnce(STypeUnfolder v) - { - GSeq unf = v.visitSeq(this.def); - return reconstruct(getSource(), this.mods, this.fullname, this.roles, - this.params, unf); - } - @Override public String toString() { diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java index b07d5bf4d..9f7a75eb4 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LDisconnect.java @@ -29,6 +29,11 @@ protected LDisconnect(CommonTree source, super(source, Role.SELF, peer); } + public Role getSelf() + { + return this.left; + } + public Role getPeer() { return this.right; diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgPruner.java b/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgPruner.java index 746ee1984..5dd2a9fd2 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgPruner.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/LRoleDeclAndDoArgPruner.java @@ -48,17 +48,19 @@ protected LRoleDeclAndDoArgPruner(Core core) } // CHECKME: vf? - protected PreSubprotoRoleCollector newRoleCollector() // N.B. "Pre" role collector + protected PreSubprotoRoleCollector newPreRoleCollector() // N.B. "Pre" role collector { return new PreSubprotoRoleCollector(this.core); } public LProtocol visitLProtocol(LProtocol n) { - Set used = n.def.visitWithNoThrow(newRoleCollector()); // CHECKME: vf? + // N.B. must use PreRoleCollector (on orig), standard subproto traversal not possible yet because target proto role decls not yet fixed (being done now) + Set used = n.def.visitWithNoThrow(newPreRoleCollector()); // CHECKME: vf? List rs = n.roles.stream() .filter(x -> used.contains(x) || x.equals(n.self)) // FIXME: self roledecl not actually being a self role is a mess .collect(Collectors.toList()); + // N.B. *role decls* (cf. do-args) don't feature "self" (cf. LSelfDecl) LSeq pruned = visitSeq(n.def); return n.reconstruct(n.getSource(), n.mods, n.fullname, rs, n.self, n.params, pruned); // CHECKME: prune params? @@ -67,7 +69,7 @@ public LProtocol visitLProtocol(LProtocol n) public Do visitDo(Do n) { List fixed = new LinkedList<>(); - Set rs = n.visitWithNoThrow(newRoleCollector()); // N.B. does subproto visiting, unlike RoleGatherer + Set rs = n.visitWithNoThrow(newPreRoleCollector()); // N.B. does subproto visiting, unlike RoleGatherer fixed = n.roles.stream() /*.filter(x -> rs.contains(x) || x.equals(this.self)) .map(x -> x.equals(this.self) ? Role.SELF : x) // FIXME: self roledecl not actually being a self role is a mess*/ diff --git a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index 8e75a6222..1a288ab80 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -705,51 +705,51 @@ public LInteractionSeq LInteractionSeq(Token t, List elems) } @Override - public LSend LSend(Token t, RoleNode src, MsgNode msg, RoleNode dst) + public LSend LSend(Token t, RoleNode self, MsgNode msg, RoleNode dst) { t = newToken(t, ScribbleParser.LSEND); LSend n = new LSend(t); - n.addScribChildren(msg, src, Arrays.asList(dst)); + n.addScribChildren(msg, self, Arrays.asList(dst)); n.decorateDel(this.df); return n; } @Override - public LRecv LRecv(Token t, RoleNode src, MsgNode msg, RoleNode dst) + public LRecv LRecv(Token t, RoleNode src, MsgNode msg, RoleNode self) { t = newToken(t, ScribbleParser.LRECV); LRecv n = new LRecv(t); - n.addScribChildren(msg, src, Arrays.asList(dst)); + n.addScribChildren(msg, src, Arrays.asList(self)); n.decorateDel(this.df); return n; } @Override - public LAcc LAcc(Token t, RoleNode src, MsgNode msg, RoleNode dst) + public LAcc LAcc(Token t, RoleNode src, MsgNode msg, RoleNode self) { t = newToken(t, ScribbleParser.LACC); LAcc n = new LAcc(t); - n.addScribChildren(msg, src, Arrays.asList(dst)); + n.addScribChildren(msg, src, Arrays.asList(self)); n.decorateDel(this.df); return n; } @Override - public LReq LReq(Token t, RoleNode src, MsgNode msg, RoleNode dst) + public LReq LReq(Token t, RoleNode self, MsgNode msg, RoleNode dst) { t = newToken(t, ScribbleParser.LREQ); LReq n = new LReq(t); - n.addScribChildren(msg, src, Arrays.asList(dst)); + n.addScribChildren(msg, self, Arrays.asList(dst)); n.decorateDel(this.df); return n; } @Override - public LDisconnect LDisconnect(Token t, RoleNode left, RoleNode right) + public LDisconnect LDisconnect(Token t, RoleNode self, RoleNode peer) { t = newToken(t, ScribbleParser.LDCONN); LDisconnect n = new LDisconnect(t); - n.addScribChildren(left, right); + n.addScribChildren(self, peer); n.decorateDel(this.df); return n; } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 88bb584e2..cef1bdd1b 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -94,8 +94,8 @@ module tmp.Test; // rename ProtoMod, ProtocolMod -- rename core Protocol? -- done: ast renamed ProtoModNode // explicit self roles/decls (core and ast) -- currently, self decls in protocols (in core) are purely cosmetic in toString -- done: just lselfdecl, basically for printing // fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles -- done in core for now (and needs tidying) + // refactor doarg pruning, do pruning and extchoicesubj-fixing vistor passes (cf., entry methods into LProjection) -- done: for current uniformity, but actually should do the opposite - // TODO: refactor doarg pruning, do pruning and extchoicesubj-fixing vistor passes (cf., entry methods into LProjection) // fix self in ast locals, astfactory // wrap base class, more global base classes (maybe in del's) // Job Module projection, projected imports/nonprotodecls -- locals import globals for nonprotos? @@ -104,10 +104,11 @@ module tmp.Test; // fully refactor imed/module projection to Job: old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? // refactor imed projection role pruning? currently done once for globals, which is done for locals once and then pruning done again for do-args // no? now only pruned? - // CHECKME: TODO: proto-param and do-nonrole-arg pruning? + // CHECKME: TODO: proto-param and do-nonrole-arg pruning? // Job/codegen refactoring: - // Check Maven deps + // refactor G/LProtocol visitor entry methods back into visitors + // Check (minimise) Maven deps // choice-specific fairness annotations // fix codegen when -fair // CHECKME: accept branching on messages (and safety properties) -- connection should not be established if message stuck? (cf. reception error) -- issue is implementation: what is a realistic semantics for sync-connect-branching (i.e., prevent client from async progressing after messaging) -- consider reversing client/server branching side? i.e. client requests, but then receives? (and consider serverside-branching a sugar?) From 150abb9cee63a1de8c46cd9ff72d38356a211278 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 7 May 2019 16:13:44 +0100 Subject: [PATCH 477/539] [AllTest] Minor. --- .../src/main/java/org/scribble/util/LProjectionTranslator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java index 37418a90e..2051a741d 100644 --- a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java @@ -79,7 +79,7 @@ public class LProjectionTranslator public final Job job; private final AstFactory af; - private final RoleNode SELF_NODE; // translate LChoice/LDo currently make their own self RoleNodes + private final RoleNode SELF_NODE; // translate LChoice/LDo currently make their own self RoleNodes (convenience) public LProjectionTranslator(Job job) { From e802c4c0f0ed0d8f05094cd5081c4ed9be68494a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 7 May 2019 17:07:48 +0100 Subject: [PATCH 478/539] [AllTest] Refactored base Wrap/LWrap ast classes. --- .../java/org/scribble/ast/ConnectAction.java | 3 +- .../java/org/scribble/ast/WrapAction.java | 73 +++++++++++++++++++ .../java/org/scribble/ast/global/GWrap.java | 26 +------ .../java/org/scribble/ast/local/LAcc.java | 9 +-- .../org/scribble/ast/local/LClientWrap.java | 26 ++----- .../java/org/scribble/ast/local/LReq.java | 9 +-- .../org/scribble/ast/local/LServerWrap.java | 26 ++----- .../org/scribble/ast/local/LWrapAction.java | 38 ++++++++++ .../scribble/util/LProjectionTranslator.java | 2 +- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 10 files changed, 135 insertions(+), 79 deletions(-) create mode 100644 scribble-ast/src/main/java/org/scribble/ast/WrapAction.java create mode 100644 scribble-ast/src/main/java/org/scribble/ast/local/LWrapAction.java diff --git a/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java b/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java index 429648825..37c64dcfc 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ConnectAction.java @@ -41,7 +41,8 @@ public RoleNode getDestinationChild() List dests = getDestinationChildren(); if (dests.size() != 1) { - throw new RuntimeException("Shouldn't get in here: " + this); + throw new RuntimeException("Shouldn't get in here: " + this); + // CHECKME: don't use common src/dst pattern between global/local? } return dests.get(0); } diff --git a/scribble-ast/src/main/java/org/scribble/ast/WrapAction.java b/scribble-ast/src/main/java/org/scribble/ast/WrapAction.java new file mode 100644 index 000000000..60b2b4eef --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/WrapAction.java @@ -0,0 +1,73 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast; + +import java.util.List; + +import org.antlr.runtime.Token; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.type.kind.ProtoKind; + +public abstract class WrapAction + extends DirectedInteraction +{ + // ScribTreeAdaptor#create constructor + public WrapAction(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public WrapAction(WrapAction node) + { + super(node); + } + + public RoleNode getClientChild() + { + return (RoleNode) getSourceChild(); + } + + public RoleNode getServerChild() + { + return getDestinationChild(); + } + + // Cf. ConnectAction + public RoleNode getDestinationChild() + { + List dests = getDestinationChildren(); + if (dests.size() != 1) + { + throw new RuntimeException("Shouldn't get in here: " + this); + // CHECKME: don't use common src/dst pattern between global/local? + } + return dests.get(0); + } + + @Override + public void addScribChildren(MsgNode msg, RoleNode src, List dsts) + { + throw new RuntimeException("Unsupported for LWrapAction: " + msg); + } + + // "add", not "set" + // "Overrides" DirectedInteraction::addScribChildren + public void addScribChildren(RoleNode client, RoleNode server) + { + // Cf. above getters and Scribble.g children order + addChild(client); + addChild(server); + } +} diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java index d4a1d496f..162afc363 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GWrap.java @@ -14,7 +14,7 @@ package org.scribble.ast.global; import org.antlr.runtime.Token; -import org.scribble.ast.BasicInteraction; +import org.scribble.ast.WrapAction; import org.scribble.ast.name.simple.RoleNode; import org.scribble.core.type.kind.Global; import org.scribble.del.DelFactory; @@ -23,13 +23,9 @@ import org.scribble.visit.AstVisitor; // TODO: factor out base Wrap (cf. Disconnect) -- Wrap is a ConnectionAction? -public class GWrap extends BasicInteraction +public class GWrap extends WrapAction implements GSimpleSessionNode { - // TODO: move to a base Wrap -- N.B. DirectedInteraction has its own children indices - public static final int CLIENT_CHILD_INDEX = 0; - public static final int SERVER_CHILD_INDEX = 1; - // ScribTreeAdaptor#create constructor public GWrap(Token t) { @@ -42,24 +38,6 @@ public GWrap(GWrap node) super(node); } - public RoleNode getClientChild() - { - return (RoleNode) getChild(CLIENT_CHILD_INDEX); - } - - public RoleNode getServerChild() - { - return (RoleNode) getChild(SERVER_CHILD_INDEX); - } - - // "add", not "set" - public void addScribChildren(RoleNode client, RoleNode server) - { - // Cf. above getters and Scribble.g children order - addChild(client); - addChild(server); - } - @Override public GWrap dupNode() { diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LAcc.java b/scribble-ast/src/main/java/org/scribble/ast/local/LAcc.java index 5297bd7d3..2a9874041 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LAcc.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LAcc.java @@ -13,8 +13,6 @@ */ package org.scribble.ast.local; -import java.util.List; - import org.antlr.runtime.Token; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.DelFactory; @@ -38,12 +36,7 @@ public LAcc(LAcc node) @Override public RoleNode getSelfChild() { - List dsts = getDestinationChildren(); - if (dsts.size() > 1) - { - throw new RuntimeException("Shouldn't get in here: " + this); // CHECKME: don't use common src/dst pattern between global/local? - } - return dsts.get(0); + return getDestinationChild(); // CHECKME: don't use common src/dst pattern between global/local? } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LClientWrap.java b/scribble-ast/src/main/java/org/scribble/ast/local/LClientWrap.java index 117d9f688..d80e4617b 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LClientWrap.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LClientWrap.java @@ -14,17 +14,13 @@ package org.scribble.ast.local; import org.antlr.runtime.Token; -import org.scribble.ast.BasicInteraction; -import org.scribble.ast.global.GWrap; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.kind.Local; import org.scribble.del.DelFactory; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; -// TODO: factor out base Wrap (cf. Disconnect) -public class LClientWrap extends BasicInteraction // Wrap, ConnectionAction? +public class LClientWrap extends LWrapAction implements LSimpleSessionNode { // ScribTreeAdaptor#create constructor @@ -38,24 +34,18 @@ public LClientWrap(LClientWrap node) { super(node); } - - // TOOD: factor out a base - public RoleNode getClientChild() - { - return (RoleNode) getChild(GWrap.CLIENT_CHILD_INDEX); // Assuming local will inherit both sides from some base (cf. base ConnectAction) - } - public RoleNode getServerChild() + // CHECKME: factor out implementations with LSend as default methods + @Override + public RoleNode getSelfChild() { - return (RoleNode) getChild(GWrap.SERVER_CHILD_INDEX); + return getSourceChild(); } - // "add", not "set" - public void addScribChildren(RoleNode client, RoleNode server) + @Override + public RoleNode getPeerChild() { - // Cf. above getters and Scribble.g children order - addChild(client); - addChild(server); + return getDestinationChild(); // Multi-connect/req not supported } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LReq.java b/scribble-ast/src/main/java/org/scribble/ast/local/LReq.java index 4fb58ef52..5ec85e2d3 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LReq.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LReq.java @@ -13,8 +13,6 @@ */ package org.scribble.ast.local; -import java.util.List; - import org.antlr.runtime.Token; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.DelFactory; @@ -44,12 +42,7 @@ public RoleNode getSelfChild() @Override public RoleNode getPeerChild() { - List dsts = getDestinationChildren(); - if (dsts.size() > 1) - { - throw new RuntimeException("Shouldn't get in here: " + this); // Multi-connect/req not supported - } - return dsts.get(0); + return getDestinationChild(); // Multi-connect/req not supported } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LServerWrap.java b/scribble-ast/src/main/java/org/scribble/ast/local/LServerWrap.java index 32dc8ae06..2656bd785 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/local/LServerWrap.java +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LServerWrap.java @@ -14,20 +14,16 @@ package org.scribble.ast.local; import org.antlr.runtime.Token; -import org.scribble.ast.BasicInteraction; -import org.scribble.ast.global.GWrap; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.core.type.kind.Local; import org.scribble.del.DelFactory; import org.scribble.util.Constants; import org.scribble.util.ScribException; import org.scribble.visit.AstVisitor; // TODO: factor out base Wrap (cf. Disconnect) -public class LServerWrap extends BasicInteraction // Wrap, ConnectionAction -- CHECKME? +public class LServerWrap extends LWrapAction implements LSimpleSessionNode { - // ScribTreeAdaptor#create constructor public LServerWrap(Token t) { @@ -39,24 +35,18 @@ public LServerWrap(LServerWrap node) { super(node); } - - public RoleNode getClientChild() - { - return (RoleNode) getChild(GWrap.CLIENT_CHILD_INDEX); // Assuming local will inherit both sides from some base (cf. base ConnectAction) - } - // TOOD: factor out a base - public RoleNode getServerChild() + // CHECKME: factor out implementations with LRecv as default methods + @Override + public RoleNode getSelfChild() { - return (RoleNode) getChild(GWrap.SERVER_CHILD_INDEX); + return getDestinationChild(); // CHECKME: don't use common src/dst pattern between global/local? } - // "add", not "set" - public void addScribChildren(RoleNode client, RoleNode server) + @Override + public RoleNode getPeerChild() { - // Cf. above getters and Scribble.g children order - addChild(client); - addChild(server); + return getSourceChild(); } @Override diff --git a/scribble-ast/src/main/java/org/scribble/ast/local/LWrapAction.java b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapAction.java new file mode 100644 index 000000000..b233e5a84 --- /dev/null +++ b/scribble-ast/src/main/java/org/scribble/ast/local/LWrapAction.java @@ -0,0 +1,38 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ast.local; + +import org.antlr.runtime.Token; +import org.scribble.ast.WrapAction; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.core.type.kind.Local; + +public abstract class LWrapAction extends WrapAction +{ + // ScribTreeAdaptor#create constructor + public LWrapAction(Token t) + { + super(t); + } + + // Tree#dupNode constructor + public LWrapAction(LWrapAction node) + { + super(node); + } + + // CHECKME: make an LDirectedAction interface? cf. LMsgTransfer -- CHECKME: factor out implementations as default methods with Send/Recv? + public abstract RoleNode getSelfChild(); // Post: "self" RoleNode + public abstract RoleNode getPeerChild(); +} diff --git a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java index 2051a741d..cd9deb6bc 100644 --- a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java @@ -341,7 +341,7 @@ else if (t instanceof LSend) } else { - throw new RuntimeException("[TODO] Unknown LType: " + t.getClass() + "\n" + t); + throw new RuntimeException("[TODO] Unhandled LType: " + t.getClass() + "\n" + t); } } } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index cef1bdd1b..50e340b6a 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -131,7 +131,7 @@ module tmp.Test; data "..." from "..." as T; -//* +/* global protocol Proto1(role A, role B) { do Proto1Aux(A, B); From 86a180fb82a688330f276b544ff82886f4ff503b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 7 May 2019 17:30:15 +0100 Subject: [PATCH 479/539] [AllTest] Minor. --- .../java/org/scribble/core/type/session/local/LType.java | 2 +- .../java/org/scribble/core/visit/local/EGraphBuilder.java | 2 +- scribble-test/src/test/scrib/tmp/Test.scr | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java b/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java index a74d6c852..534a6f4c6 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/local/LType.java @@ -19,7 +19,7 @@ public interface LType extends SType, LNode { - //Role getSelf(); // CHECKME: useful? + //Role getSelf(); // CHECKME: useful? maybe only specifically for interactions //void buildGraph(EGraphBuilderUtil2 b); } diff --git a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java index 78b07f02a..416fb2cf5 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/local/EGraphBuilder.java @@ -163,7 +163,7 @@ public SType visitContinue(Continue n) public SType visitDirectedInteraction( DirectedInteraction n) { - Role peer = ((n instanceof LSend) || (n instanceof LReq)) ? n.dst + Role peer = ((n instanceof LSend) || (n instanceof LReq)) ? n.dst // CHECKME: refactor LType getSelf/Peer? cf. ast : ((n instanceof LRecv) || (n instanceof LAcc)) ? n.src : null; if (peer == null) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 50e340b6a..b8437928e 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -94,10 +94,10 @@ module tmp.Test; // rename ProtoMod, ProtocolMod -- rename core Protocol? -- done: ast renamed ProtoModNode // explicit self roles/decls (core and ast) -- currently, self decls in protocols (in core) are purely cosmetic in toString -- done: just lselfdecl, basically for printing // fix *imed*-projection (Job) choice subjects -- inlined-projection is a single proto with all roles -- done in core for now (and needs tidying) - // refactor doarg pruning, do pruning and extchoicesubj-fixing vistor passes (cf., entry methods into LProjection) -- done: for current uniformity, but actually should do the opposite + // refactor doarg pruning, do pruning and extchoicesubj-fixing vistor passes (cf., entry methods into LProjection) -- done: for current uniformity, but TODO: actually should do the opposite + // fix self in ast locals, astfactory -- done: "self" rolenode is just a constant instance, only LSelfDecl is a special subclass + // wrap base class, more global base classes (maybe in del's) -- done: just wrap base classes -- TODO: further factoring, e.g., LDirectedInteraction getSelf/Peer - // fix self in ast locals, astfactory - // wrap base class, more global base classes (maybe in del's) // Job Module projection, projected imports/nonprotodecls -- locals import globals for nonprotos? // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) From e0c7543abd4780924512d8d8d91e7832b1104b77 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 7 May 2019 18:19:52 +0100 Subject: [PATCH 480/539] [AllTest] Refactoring -project output imports/nonprotos. --- .../main/java/org/scribble/ast/DataDecl.java | 2 +- .../main/java/org/scribble/ast/Module.java | 65 ++++++++----------- .../java/org/scribble/ast/NonProtoDecl.java | 4 +- .../main/java/org/scribble/ast/SigDecl.java | 2 +- .../src/main/java/org/scribble/job/Job.java | 44 +++++++++++-- .../scribble/job/ModuleContextBuilder.java | 4 +- .../callbackapi/CBEndpointApiGenerator.java | 6 +- .../callbackapi/CBEndpointApiGenerator3.java | 8 +-- .../java/statechanapi/BranchSockGen.java | 8 +-- .../java/statechanapi/CaseSockGen.java | 8 +-- .../java/statechanapi/HandlerIfaceGen.java | 2 +- .../java/statechanapi/InputFutureGen.java | 4 +- .../java/statechanapi/OutputSockGen.java | 4 +- .../java/statechanapi/ReceiveSockGen.java | 8 +-- .../main/java/org/scribble/core/job/Core.java | 10 +-- scribble-test/src/test/scrib/tmp/Test.scr | 11 ++++ 16 files changed, 113 insertions(+), 77 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java b/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java index aa718dd34..56f5f59e0 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/DataDecl.java @@ -55,7 +55,7 @@ public void decorateDel(DelFactory df) } @Override - public boolean isDataTypeDecl() + public boolean isDataDecl() { return true; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/Module.java b/scribble-ast/src/main/java/org/scribble/ast/Module.java index 8e9be3e58..0435622af 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Module.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Module.java @@ -28,7 +28,9 @@ import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; +import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.ModuleName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.SigName; import org.scribble.del.DelFactory; import org.scribble.util.ScribException; @@ -137,44 +139,37 @@ public Module visitChildren(AstVisitor nv) throws ScribException .visitChildListWithClassEqualityCheck(this, getProtoDeclChildren(), nv); return reconstruct(moddecl, imports, data, protos); } - - public DataDecl getDataTypeDeclChild(DataName simpname) // Simple name (as for getProtocolDecl) + + public DataDecl getTypeDeclChild(DataName simpname) { - Optional res = getNonProtoDeclChildren().stream() - .filter(x -> (x instanceof DataDecl) - && x.getDeclName().equals(simpname)) - .map(x -> (DataDecl) x).findFirst(); // No duplication check, rely on WF - if (!res.isPresent()) - { - throw new RuntimeException("Type decl not found: " + simpname); - } - return res.get(); + return (DataDecl) getNonProtoDeclChild(simpname, NonProtoDecl::isDataDecl); } - // CHECKME: allow sig and type decls with same decl name in same module? - public SigDecl getMessageSigDeclChild(SigName simpname) + public SigDecl getSigDeclChild(SigName simpname) { - Optional res = getNonProtoDeclChildren().stream() - .filter(x -> (x instanceof SigDecl) - && x.getDeclName().equals(simpname)) - .map(x -> (SigDecl) x).findFirst(); // No duplication check, rely on WF + return (SigDecl) getNonProtoDeclChild(simpname, NonProtoDecl::isSigDecl); + } + + private NonProtoDecl getNonProtoDeclChild(MemberName simpname, + Predicate> f) + { + Optional> res = getNonProtoDeclChildren().stream() + .filter(x -> f.test(x) && x.getDeclName().equals(simpname)) + .findFirst(); // No duplication check, rely on WF if (!res.isPresent()) { - throw new RuntimeException("Sig decl not found: " + simpname); + throw new RuntimeException("Data decl not found: " + simpname); } return res.get(); } public List getGProtoDeclChildren() { - /*return getChildren().stream().filter(IS_GPROTOCOLDECL).map(TO_GPROTOCOLDECL) - .collect(Collectors.toList());*/ return getProtoDeclChildren().stream().filter(x -> x.isGlobal()) .map(x -> (GProtoDecl) x).collect(Collectors.toList()); // Less efficient, but smaller code } - // TODO: factor out with above public List getLProtoDeclChildren() { return getProtoDeclChildren().stream().filter(x -> x.isLocal()) @@ -189,26 +184,22 @@ public boolean hasGProtocolDecl(GProtoName simpname) .anyMatch(x -> x.getHeaderChild().getDeclName().equals(simpname)); } - // Pre: hasProtocolDecl(simpname) - public GProtoDecl getGProtocolDeclChild( - GProtoName simpname) + // Pre: hasGProtocolDecl(simpname) + public GProtoDecl getGProtocolDeclChild(GProtoName simpname) { - Optional res = getGProtoDeclChildren().stream() - .filter(x -> x.getHeaderChild().getDeclName().equals(simpname)) - .findFirst(); // No duplication check, rely on WF - if (!res.isPresent()) - { - throw new RuntimeException("Proto decl not found: " + simpname); - } - return res.get(); + return (GProtoDecl) getProtocolDeclChild(simpname, ProtoDecl::isGlobal); + } + + public LProtoDecl getLProtocolDeclChild(LProtoName simpname) + { + return (LProtoDecl) getProtocolDeclChild(simpname, ProtoDecl::isLocal); } - // Pre: hasProtocolDecl(simpname) // TODO: factor out with above - public LProtoDecl getLProtocolDeclChild( - LProtoName simpname) + private ProtoDecl getProtocolDeclChild( + ProtoName simpname, Predicate> f) { - Optional res = getLProtoDeclChildren().stream() - .filter(x -> x.getHeaderChild().getDeclName().equals(simpname)) + Optional> res = getProtoDeclChildren().stream() + .filter(x -> f.test(x) && x.getHeaderChild().getDeclName().equals(simpname)) .findFirst(); // No duplication check, rely on WF if (!res.isPresent()) { diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java b/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java index 455747e2c..620625110 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java @@ -62,12 +62,12 @@ public ExtIdNode getExtSourceChild() } // CHECKME: maybe move to ModuleMember - public boolean isDataTypeDecl() + public boolean isDataDecl() { return false; } - public boolean isMessageSigNameDecl() + public boolean isSigDecl() { return false; } diff --git a/scribble-ast/src/main/java/org/scribble/ast/SigDecl.java b/scribble-ast/src/main/java/org/scribble/ast/SigDecl.java index 5e06d23f6..692a3cbb6 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/SigDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/SigDecl.java @@ -55,7 +55,7 @@ public void decorateDel(DelFactory df) } @Override - public boolean isMessageSigNameDecl() + public boolean isSigDecl() { return true; } diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 04d40911f..7d2e64c3f 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -17,6 +17,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -34,15 +35,23 @@ import org.scribble.core.job.CoreArgs; import org.scribble.core.lang.global.GProtocol; import org.scribble.core.lang.local.LProjection; +import org.scribble.core.type.kind.DataKind; +import org.scribble.core.type.kind.Kind; import org.scribble.core.type.kind.Local; +import org.scribble.core.type.kind.SigKind; +import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; +import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; +import org.scribble.core.type.name.SigName; import org.scribble.core.type.session.STypeFactory; import org.scribble.core.type.session.global.GTypeFactoryImpl; +import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LTypeFactoryImpl; +import org.scribble.core.visit.gather.NonProtoDepsGatherer; import org.scribble.core.visit.global.InlinedProjector; import org.scribble.del.DelFactory; import org.scribble.util.LProjectionTranslator; @@ -146,6 +155,7 @@ protected Core newCore(ModuleName mainFullname, Map args, public Map getProjections(GProtoName fullname, Role self) throws ScribException { + AstFactory af = this.config.af; LProjectionTranslator t = new LProjectionTranslator(this); Map, LProjection> projs = getCore() @@ -155,13 +165,37 @@ public Map getProjections(GProtoName fullname, { LProjection proj = projs.get(pfullname); - ModuleNameNode modn = this.config.af.ModuleNameNode(null, - IdNode.from(this.config.af, pfullname.getPrefix().getElements())); - ModuleDecl modd = this.config.af.ModuleDecl(null, modn); + LinkedHashSet> nonpros = new LinkedHashSet<>(); + proj.def.gather(new NonProtoDepsGatherer()::visit) + .forEachOrdered(x -> nonpros.add(x)); // setify while preserving order + + ModuleNameNode modn = af.ModuleNameNode(null, + IdNode.from(af, pfullname.getPrefix().getElements())); + ModuleDecl modd = af.ModuleDecl(null, modn); List> imports = Collections.emptyList(); // FIXME TODO - List> nonprotos = Collections.emptyList(); // FIXME TODO + List> nonprods = Collections.emptyList(); // FIXME TODO + + //GProtoDecl global = this.context.getParsed(fullname); + Module m = this.context.getModule(fullname.getPrefix()); + for (MemberName nonpro : nonpros) + { + Kind kind = nonpro.getKind(); + if (kind.equals(DataKind.KIND)) + { + nonprods.add(m.getTypeDeclChild(((DataName) nonpro).getSimpleName())); + } + else if (kind.equals(SigKind.KIND)) + { + nonprods.add(m.getSigDeclChild(((SigName) nonpro).getSimpleName())); + } + else + { + throw new RuntimeException("Unhandled: " + kind + "\n\t" + nonpro); + } + } + List protos = Arrays.asList(t.translate(proj)); - Module mod = this.config.af.Module(null, modd, imports, nonprotos, protos); + Module mod = af.Module(null, modd, imports, nonprods, protos); projmods.put(pfullname, mod); } diff --git a/scribble-ast/src/main/java/org/scribble/job/ModuleContextBuilder.java b/scribble-ast/src/main/java/org/scribble/job/ModuleContextBuilder.java index 2df32997b..ec76818f8 100644 --- a/scribble-ast/src/main/java/org/scribble/job/ModuleContextBuilder.java +++ b/scribble-ast/src/main/java/org/scribble/job/ModuleContextBuilder.java @@ -87,7 +87,7 @@ private static void addModule(ScribNames names, Module mod, names.modules.put(modname, mod.getFullModuleName()); for (NonProtoDecl npd : mod.getNonProtoDeclChildren()) { - if (npd.isDataTypeDecl()) + if (npd.isDataDecl()) { DataDecl dtd = (DataDecl) npd; DataName qualif = new DataName(modname, dtd.getDeclName()); @@ -170,7 +170,7 @@ private void addVisible(Map parsed, Module root) for (NonProtoDecl npd : root.getNonProtoDeclChildren()) { - if (npd.isDataTypeDecl()) + if (npd.isDataDecl()) { DataDecl dtd = (DataDecl) npd; DataName visname = new DataName(dtd.getDeclName().toString()); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java index d1035000d..539b534d2 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator.java @@ -292,7 +292,7 @@ public Map buildEndpointClass() throws ScribException int i = 1; for (PayElemType pet : a.payload.elems) { - DataDecl dtd = main.getDataTypeDeclChild((DataName) pet); + DataDecl dtd = main.getTypeDeclChild((DataName) pet); messageClass += ", " + dtd.getExtName() + " arg" + i++; } } @@ -436,7 +436,7 @@ public Map buildEndpointClass() throws ScribException int i = 1; for (PayElemType pet : a.payload.elems) { - DataDecl dtd = main.getDataTypeDeclChild((DataName) pet); + DataDecl dtd = main.getTypeDeclChild((DataName) pet); receiveInterface += ", " + dtd.getExtName() + " arg" + i++; } @@ -473,7 +473,7 @@ public Map buildEndpointClass() throws ScribException int i = 0; for (PayElemType pet : a.payload.elems) { - DataDecl dtd = main.getDataTypeDeclChild((DataName) pet); + DataDecl dtd = main.getTypeDeclChild((DataName) pet); branchAbstract += ", (" + dtd.getExtName() + ") m.payload[" + i++ + "]"; } branchAbstract += "); break;\n"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index c12358dc3..02366318c 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -603,7 +603,7 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, else { opCons = opClass.newConstructor(a.payload.elems.stream().map(e -> - main.getDataTypeDeclChild((DataName) e).getExtName() + " arg" + i[0]++ + main.getTypeDeclChild((DataName) e).getExtName() + " arg" + i[0]++ ).collect(Collectors.joining(", "))); } opCons.addModifiers("public"); @@ -711,7 +711,7 @@ protected String generateBranch(String bprefix, JobContext jc, EState s, String int i = 0; for (PayElemType pet : a.payload.elems) { - DataDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataName) pet); + DataDecl dtd = jc.getMainModule().getTypeDeclChild((DataName) pet); branchAbstract += ", (" + dtd.getExtName() + ") m.payload[" + i++ + "]"; } branchAbstract += "); break;\n"; @@ -749,7 +749,7 @@ protected String generateReceiveInterface(boolean isSig, int i = 1; for (PayElemType pet : a.payload.elems) { - DataDecl dtd = jc.getMainModule().getDataTypeDeclChild((DataName) pet); + DataDecl dtd = jc.getMainModule().getTypeDeclChild((DataName) pet); receiveInterface += ", " + dtd.getExtName() + " arg" + i++; } } @@ -1002,7 +1002,7 @@ protected SigDecl getMessageSigNameDecl(SigName mid) //protected final Function, String> getExtName = e -> protected String getExtName(PayElemType e) { - String extName = this.job.getContext().getMainModule().getDataTypeDeclChild((DataName) e).getExtName(); + String extName = this.job.getContext().getMainModule().getTypeDeclChild((DataName) e).getExtName(); return (extName.indexOf(".") != -1) ? extName.substring(extName.lastIndexOf(".")+1, extName.length()) : extName; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java index 68b0e04c4..e5f5aa47b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/BranchSockGen.java @@ -294,14 +294,14 @@ private void addHandleMethod(final String ROLE_PARAM, final String MESSAGE_VAR, int i = 0; for (PayElemType pt : a.payload.elems) { - DataDecl dtd = main.getDataTypeDeclChild((DataName) pt); // TODO: if not DataType + DataDecl dtd = main.getTypeDeclChild((DataName) pt); // TODO: if not DataType ln += ", " + buffSuper + "(" + dtd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + i++ + "])"; } } } else { - SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module ln += ", " + JavaBuilder.NEW + " " + BUF_CLASS + "<>((" + msd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM //+ "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[0]" // CHECKME: betty16.lec2.smtp.SmtpC4 + ")"; @@ -381,14 +381,14 @@ private void addCallbackCases(MethodBuilder mb2, final String ROLE_PARAM, int i = 0; for (PayElemType pt : a.payload.elems) { - DataDecl dtd = main.getDataTypeDeclChild((DataName) pt); // TODO: if not DataType + DataDecl dtd = main.getTypeDeclChild((DataName) pt); // TODO: if not DataType ln += ", " + buffSuper + "(" + dtd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + i++ + "])"; } } } else { - SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module ln += ", " + JavaBuilder.NEW + " " + BUF_CLASS + "<>((" + msd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM //+ "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[0]" // CHECKME: betty16.lec2.smtp.SmtpC4 + ")"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java index 331a0f8c3..e64c90412 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/CaseSockGen.java @@ -138,7 +138,7 @@ private void addReceiveMethod(ClassBuilder cb, EAction a, EState succ) throws Sc } else //if (a.mid.isMessageSigName()) { - SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module mb.addBodyLine(JavaBuilder.SUPER + ".use();"); addBranchCheck(getSessionApiOpConstant(a.mid), mb, CASE_MESSAGE_FIELD); mb.addBodyLine(CASE_ARG_PREFIX + "." + BUFF_VAL_FIELD + " = (" + msd.getExtName() + ") " + CASE_MESSAGE_FIELD + ";"); @@ -193,11 +193,11 @@ private void addCaseReceiveDiscardMethod(ClassBuilder cb, EAction a, EState succ if (a.mid.isOp()) { ln += a.payload.elems.stream() - .map((pt) -> getGarbageBuf(main.getDataTypeDeclChild(((DataName) pt)).getExtName())).collect(Collectors.joining(", ")) + ");"; + .map((pt) -> getGarbageBuf(main.getTypeDeclChild(((DataName) pt)).getExtName())).collect(Collectors.joining(", ")) + ");"; } else { - SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // Factor out? (send/receive/branchreceive/...) + SigDecl msd = main.getSigDeclChild(((SigName) a.mid).getSimpleName()); // Factor out? (send/receive/branchreceive/...) ln += getGarbageBuf(msd.getExtName()) + ");"; } mb.addBodyLine(ln); @@ -228,7 +228,7 @@ public static void setCaseReceiveHeaderWithoutReturnType(StateChannelApiGenerato } else //if (a.mid.isMessageSigName()) { - SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module ReceiveSockGen.addReceiveMessageSigNameParams(mb, msd, true); } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java index 2b07a0d71..6407e0702 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/HandlerIfaceGen.java @@ -106,7 +106,7 @@ public static void addHandleMethodOpAndPayloadParams(StateChannelApiGenerator ap } else //if (a.mid.isMessageSigName()) { - SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module ReceiveSockGen.addReceiveMessageSigNameParams(mb, msd, false); } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java index 27f56937c..222729a0b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/InputFutureGen.java @@ -80,7 +80,7 @@ public ClassBuilder generateType() throws ScribException { throw new ScribException("[TODO] API generation not supported for non- data type payloads: " + pt); } - DataDecl dtd = main.getDataTypeDeclChild((DataName) pt); + DataDecl dtd = main.getTypeDeclChild((DataName) pt); ScribSockGen.checkJavaDataTypeDecl(dtd); String type = dtd.getExtName(); types.add(type); @@ -92,7 +92,7 @@ public ClassBuilder generateType() throws ScribException } else { - SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); + SigDecl msd = main.getSigDeclChild(((SigName) a.mid).getSimpleName()); ScribSockGen.checkMessageSigNameDecl(msd); String type = msd.getExtName(); types.add(type); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java index d8c00d932..fff4b48db 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java @@ -170,7 +170,7 @@ public static void setSendHeaderWithoutReturnType(StateChannelApiGenerator apige } else //if (a.mid.isMessageSigName()) { - SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module addSendMessageSigNameParams(mb, msd); } } @@ -222,7 +222,7 @@ protected static void addSendOpParams(StateChannelApiGenerator apigen, MethodBui { throw new ScribException("[TODO] API generation not supported for non- data type payloads: " + pt); } - DataDecl dtd = main.getDataTypeDeclChild((DataName) pt); // FIXME: might not belong to main module // TODO: if not DataType + DataDecl dtd = main.getTypeDeclChild((DataName) pt); // FIXME: might not belong to main module // TODO: if not DataType ScribSockGen.checkJavaDataTypeDecl(dtd); mb.addParameters(dtd.getExtName() + " " + as.next()); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java index 64865a863..19273b0ac 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ReceiveSockGen.java @@ -84,7 +84,7 @@ private void makeReceiveMethod(EAction a, EState succ) throws ScribException } else //if (a.mid.isMessageSigName()) { - SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module //addReceiveMessageSigNameParams(mb, a, msd);*/ mb.addBodyLine(StateChannelApiGenerator.SCRIBMESSAGE_CLASS + " " + RECEIVE_MESSAGE_PARAM + " = " + JavaBuilder.SUPER + ".readScribMessage(" + getSessionApiRoleConstant(a.obj) + ");"); @@ -168,7 +168,7 @@ public static void setReceiveHeaderWithoutReturnType(StateChannelApiGenerator ap } else //if (a.mid.isMessageSigName()) { - SigDecl msd = main.getMessageSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module + SigDecl msd = main.getSigDeclChild(((SigName) a.mid).getSimpleName()); // FIXME: might not belong to main module addReceiveMessageSigNameParams(mb, msd, true); } } @@ -186,7 +186,7 @@ protected static void addReceiveOpParams(MethodBuilder mb, Module main, EAction { throw new ScribException("[TODO] API generation not supported for non- data type payloads: " + pt); } - DataDecl dtd = main.getDataTypeDeclChild((DataName) pt); // TODO: if not DataType + DataDecl dtd = main.getTypeDeclChild((DataName) pt); // TODO: if not DataType ScribSockGen.checkJavaDataTypeDecl(dtd); mb.addParameters(buffSuper + dtd.getExtName() + "> " + RECEIVE_ARG_PREFIX + i++); } @@ -200,7 +200,7 @@ protected static void addPayloadBuffSetters(Module main, EAction a, MethodBuilde int i = 1; for (PayElemType pt : a.payload.elems) // Could factor out this loop (arg names) with addReceiveOpParams (as for send) { - DataDecl dtd = main.getDataTypeDeclChild((DataName) pt); // TODO: if not DataType + DataDecl dtd = main.getTypeDeclChild((DataName) pt); // TODO: if not DataType mb.addBodyLine(RECEIVE_ARG_PREFIX + i + "." + BUFF_VAL_FIELD + " = (" + dtd.getExtName() + ") " + RECEIVE_MESSAGE_PARAM + "." + SCRIBMESSAGE_PAYLOAD_FIELD + "[" + (i++ - 1) +"];"); } diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index baa61286f..c260823f6 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -403,7 +403,7 @@ public Map, LProjection> getProjections( ProtoName fullname, Role self) throws ScribException { Map, LProjection> res = new HashMap<>(); - Set> nonprotos = new LinkedHashSet<>(); + //Set> nonprotos = new LinkedHashSet<>(); LProjection root = this.context.getProjection(fullname, self); List> todo = new LinkedList<>(); @@ -415,17 +415,17 @@ public Map, LProjection> getProjections( res.put(pfullname, proj); proj.def.gather(new ProtoDepsCollector()::visit) .filter(x -> !res.containsKey(x)).forEachOrdered(x -> todo.add(x)); - proj.def.gather(new NonProtoDepsGatherer()::visit) - .forEachOrdered(x -> nonprotos.add(x)); + /*proj.def.gather(new NonProtoDepsGatherer()::visit) + .forEachOrdered(x -> nonprotos.add(x));*/ } - if (!nonprotos.isEmpty()) + /*if (!nonprotos.isEmpty()) // CHECKME: best way to handle mixtured of proto and nonproto dependencies? // nonprotos should refer to source global module? i.e., projection modules should import globals? maybe consistent with "projects" clause { throw new RuntimeException( "[TODO] Non-proto dependencies: " + nonprotos + "\n\t" + root); - } + }*/ return res; } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index b8437928e..be8ec99b7 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -131,6 +131,14 @@ module tmp.Test; data "..." from "..." as T; +//* +global protocol Proto1(role A, role B) +{ + T from A to B; +} +//*/ + + /* global protocol Proto1(role A, role B) { @@ -180,6 +188,7 @@ aux global protocol Proto1Aux(role A, role B) { 3() from A to B; } +//*/ /* @@ -328,6 +337,8 @@ global protocol Proto1(role A, role B, role C) do Proto1(A, B, C); } //*/ + + /* explicit global protocol Proto1(role A, role B, role C) { From b0be415a55956957fb04ce0bb958675a3ebb0804 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 7 May 2019 18:24:23 +0100 Subject: [PATCH 481/539] [AllTest] Minor. --- .../main/java/org/scribble/ast/Module.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/Module.java b/scribble-ast/src/main/java/org/scribble/ast/Module.java index 0435622af..2902e5ae6 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/Module.java +++ b/scribble-ast/src/main/java/org/scribble/ast/Module.java @@ -180,32 +180,38 @@ public List getLProtoDeclChildren() // CHECKME: allow global and local protocols with same simpname in same module? -- currently, no? public boolean hasGProtocolDecl(GProtoName simpname) { - return getGProtoDeclChildren().stream() - .anyMatch(x -> x.getHeaderChild().getDeclName().equals(simpname)); + return hasProtocolDeclChild(simpname, ProtoDecl::isGlobal).isPresent(); } // Pre: hasGProtocolDecl(simpname) public GProtoDecl getGProtocolDeclChild(GProtoName simpname) { - return (GProtoDecl) getProtocolDeclChild(simpname, ProtoDecl::isGlobal); + Optional> res = hasProtocolDeclChild(simpname, + ProtoDecl::isGlobal); + if (!res.isPresent()) + { + throw new RuntimeException("Global proto decl not found: " + simpname); + } + return (GProtoDecl) res.get(); } public LProtoDecl getLProtocolDeclChild(LProtoName simpname) { - return (LProtoDecl) getProtocolDeclChild(simpname, ProtoDecl::isLocal); + Optional> res = hasProtocolDeclChild(simpname, + ProtoDecl::isLocal); + if (!res.isPresent()) + { + throw new RuntimeException("Local proto decl not found: " + simpname); + } + return (LProtoDecl) res.get(); } - private ProtoDecl getProtocolDeclChild( + private Optional> hasProtocolDeclChild( ProtoName simpname, Predicate> f) { - Optional> res = getProtoDeclChildren().stream() + return getProtoDeclChildren().stream() .filter(x -> f.test(x) && x.getHeaderChild().getDeclName().equals(simpname)) .findFirst(); // No duplication check, rely on WF - if (!res.isPresent()) - { - throw new RuntimeException("Proto decl not found: " + simpname); - } - return res.get(); } public ModuleName getFullModuleName() From 141a6a2fc73a1a6fb05291cfe45f859cbe7830d3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 7 May 2019 18:48:43 +0100 Subject: [PATCH 482/539] [install] First version of -project module output with imports/nonprotos done. --- .../java/org/scribble/ast/AstFactory.java | 2 +- .../java/org/scribble/ast/ImportModule.java | 2 +- .../del/name/simple/AmbigNameNodeDel.java | 2 +- .../src/main/java/org/scribble/job/Job.java | 40 +++++++++++++------ .../scribble/util/LProjectionTranslator.java | 2 +- .../main/java/org/scribble/core/job/Core.java | 10 ++--- .../resources/good/misc/imports/Import01.scr | 2 + .../resources/good/misc/imports/Import08.scr | 2 + scribble-test/src/test/scrib/tmp/Test.scr | 5 +-- 9 files changed, 41 insertions(+), 26 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java index cbce124ec..9507be715 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java +++ b/scribble-ast/src/main/java/org/scribble/ast/AstFactory.java @@ -96,7 +96,7 @@ Module Module(Token t, ModuleDecl mdecl, ModuleDecl ModuleDecl(Token t, ModuleNameNode fullname); ImportModule ImportModule(Token t, ModuleNameNode modname, - ModuleNameNode alias); + ModuleNameNode alias); // alias == null for no alias (child not added) DataDecl DataDecl(Token t, IdNode schema, ExtIdNode extName, ExtIdNode extSource, DataNameNode name); diff --git a/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java b/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java index e81635491..b7af51c3d 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java +++ b/scribble-ast/src/main/java/org/scribble/ast/ImportModule.java @@ -47,7 +47,7 @@ public ModuleNameNode getModuleNameNodeChild() // Pre: hasAlias -- no alias means no child // Simple name - // No child (null) if no alias + // No child if no alias (cf. hasAlias) -- cf. addScribChildren, alias == null public ModuleNameNode getAliasNameNodeChild() { return (ModuleNameNode) getChild(ALIAS_CHILD); diff --git a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java index 796c4b41c..180ac5bc4 100644 --- a/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/name/simple/AmbigNameNodeDel.java @@ -53,7 +53,7 @@ public ScribNode leaveDisambiguation(ScribNode child, if (parent instanceof MsgTransfer) { throw new ScribException(a.getSource(), - "Invalid occurrence of data type: " + parent); + "Invalid occurrence of data name: " + parent); } List elems = a.getElements().stream() .map(x -> disamb.job.config.af.IdNode(null, x)) diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 7d2e64c3f..51a784fb5 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -18,9 +18,11 @@ import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import org.scribble.ast.AstFactory; import org.scribble.ast.ImportDecl; @@ -52,6 +54,7 @@ import org.scribble.core.type.session.local.LSeq; import org.scribble.core.type.session.local.LTypeFactoryImpl; import org.scribble.core.visit.gather.NonProtoDepsGatherer; +import org.scribble.core.visit.gather.ProtoDepsCollector; import org.scribble.core.visit.global.InlinedProjector; import org.scribble.del.DelFactory; import org.scribble.util.LProjectionTranslator; @@ -165,21 +168,29 @@ public Map getProjections(GProtoName fullname, { LProjection proj = projs.get(pfullname); - LinkedHashSet> nonpros = new LinkedHashSet<>(); - proj.def.gather(new NonProtoDepsGatherer()::visit) - .forEachOrdered(x -> nonpros.add(x)); // setify while preserving order + List> imports = new LinkedList<>(); + List> pdeps = proj.def + .gather(new ProtoDepsCollector()::visit).distinct() + .collect(Collectors.toList()); // Gathering only from this proto decl (no subproto visiting) // Overlaps with Core::getProjections + pdeps.remove(pfullname); + for (ProtoName imp : pdeps) + { + ModuleNameNode modnn = af.ModuleNameNode(null, + IdNode.from(af, imp.getElements())); + imports.add(af.ImportModule(null, modnn, null)); + } - ModuleNameNode modn = af.ModuleNameNode(null, - IdNode.from(af, pfullname.getPrefix().getElements())); - ModuleDecl modd = af.ModuleDecl(null, modn); - List> imports = Collections.emptyList(); // FIXME TODO - List> nonprods = Collections.emptyList(); // FIXME TODO - - //GProtoDecl global = this.context.getParsed(fullname); - Module m = this.context.getModule(fullname.getPrefix()); - for (MemberName nonpro : nonpros) + LinkedHashSet> npdeps = new LinkedHashSet<>(); + proj.def.gather(new NonProtoDepsGatherer()::visit) // Gathering only from this proto decl (no subproto visiting) + .forEachOrdered(x -> npdeps.add(x)); // setify while preserving order + List> nonprods = new LinkedList<>(); + for (MemberName nonpro : npdeps) { Kind kind = nonpro.getKind(); + ModuleName pref = nonpro.getPrefix(); + Module m = this.context + .getModule(pref.isEmpty() ? fullname.getPrefix() : pref); + // CHECKME: currently just "copying" decl from source (global) Module, how about importing the Module instead? (and re-qualifying names as needed) if (kind.equals(DataKind.KIND)) { nonprods.add(m.getTypeDeclChild(((DataName) nonpro).getSimpleName())); @@ -193,7 +204,10 @@ else if (kind.equals(SigKind.KIND)) throw new RuntimeException("Unhandled: " + kind + "\n\t" + nonpro); } } - + + ModuleNameNode modn = af.ModuleNameNode(null, + IdNode.from(af, pfullname.getPrefix().getElements())); + ModuleDecl modd = af.ModuleDecl(null, modn); List protos = Arrays.asList(t.translate(proj)); Module mod = af.Module(null, modd, imports, nonprods, protos); projmods.put(pfullname, mod); diff --git a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java index cd9deb6bc..99c3e2a21 100644 --- a/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java +++ b/scribble-ast/src/main/java/org/scribble/util/LProjectionTranslator.java @@ -166,7 +166,7 @@ protected PayElem translate(PayElemType e) { DataNameNode res = this.af.DataNameNode(null, IdNode.from(af, ((DataName) e).getElements())); - return (PayElem) res; + return this.af.UnaryPayElem(null, res); } else { diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index c260823f6..1ad6d9f41 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -14,7 +14,6 @@ package org.scribble.core.job; import java.util.HashMap; -import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -32,7 +31,6 @@ import org.scribble.core.model.visit.local.NonDetPayChecker; import org.scribble.core.type.kind.Global; import org.scribble.core.type.kind.Local; -import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; @@ -41,12 +39,11 @@ import org.scribble.core.type.session.local.LSeq; import org.scribble.core.visit.STypeVisitorFactory; import org.scribble.core.visit.STypeVisitorFactoryImpl; -import org.scribble.core.visit.gather.NonProtoDepsGatherer; import org.scribble.core.visit.gather.ProtoDepsCollector; import org.scribble.core.visit.gather.RoleGatherer; import org.scribble.core.visit.global.GTypeVisitorFactoryImpl; -import org.scribble.core.visit.local.LRoleDeclAndDoArgPruner; import org.scribble.core.visit.local.LDoPruner; +import org.scribble.core.visit.local.LRoleDeclAndDoArgPruner; import org.scribble.core.visit.local.LTypeVisitorFactoryImpl; import org.scribble.core.visit.local.SubprotoExtChoiceSubjFixer; import org.scribble.util.ScribException; @@ -413,8 +410,9 @@ public Map, LProjection> getProjections( ProtoName pfullname = todo.remove(0); LProjection proj = this.context.getProjection(pfullname); res.put(pfullname, proj); - proj.def.gather(new ProtoDepsCollector()::visit) - .filter(x -> !res.containsKey(x)).forEachOrdered(x -> todo.add(x)); + proj.def.gather(new ProtoDepsCollector()::visit).distinct() + .filter(x -> !res.containsKey(x) && !todo.contains(x)) + .forEachOrdered(x -> todo.add(x)); /*proj.def.gather(new NonProtoDepsGatherer()::visit) .forEachOrdered(x -> nonprotos.add(x));*/ } diff --git a/scribble-test/src/test/resources/good/misc/imports/Import01.scr b/scribble-test/src/test/resources/good/misc/imports/Import01.scr index 59236bf3b..6a483c7d4 100644 --- a/scribble-test/src/test/resources/good/misc/imports/Import01.scr +++ b/scribble-test/src/test/resources/good/misc/imports/Import01.scr @@ -1,6 +1,8 @@ //Raymond@HZHL2 ~/code/python/scribble-tools //$ PYTHONPATH='lib/:bin/' python src/scribble/Main.py -ip test/ test/base/impourt/Import1.scr +//$ bin/scribblec.sh -ip scribble-test/src/test/resources scribble-test/src/test/resources/good/misc/imports/Import01.scr + module good.misc.imports.Import01; diff --git a/scribble-test/src/test/resources/good/misc/imports/Import08.scr b/scribble-test/src/test/resources/good/misc/imports/Import08.scr index a99c2153f..18c60d80d 100644 --- a/scribble-test/src/test/resources/good/misc/imports/Import08.scr +++ b/scribble-test/src/test/resources/good/misc/imports/Import08.scr @@ -1,6 +1,8 @@ //Raymond@HZHL2 ~/code/python/scribble-tools //$ PYTHONPATH='lib/:bin/' python src/scribble/Main.py -ip test/ test/base/impourt/Import8.scr +//$ bin/scribblec.sh -ip scribble-test/src/test/resources scribble-test/src/test/resources/good/misc/imports/Import08.scr + module good.misc.imports.Import08; import good.misc.imports.pack1.Pack08; diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index be8ec99b7..bf93371bf 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -97,8 +97,7 @@ module tmp.Test; // refactor doarg pruning, do pruning and extchoicesubj-fixing vistor passes (cf., entry methods into LProjection) -- done: for current uniformity, but TODO: actually should do the opposite // fix self in ast locals, astfactory -- done: "self" rolenode is just a constant instance, only LSelfDecl is a special subclass // wrap base class, more global base classes (maybe in del's) -- done: just wrap base classes -- TODO: further factoring, e.g., LDirectedInteraction getSelf/Peer - - // Job Module projection, projected imports/nonprotodecls -- locals import globals for nonprotos? + // Job Module projection, projected imports/nonprotodecls -- locals import globals for nonprotos? (better for "projects" clause?) -- done: basic, but nonprotos "copied" from globals -- TODO: import global? // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) // fully refactor imed/module projection to Job: old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? @@ -134,7 +133,7 @@ data "..." from "..." as T; //* global protocol Proto1(role A, role B) { - T from A to B; + 1(T) from A to B; } //*/ From ca8af568c83c8c219d39136ed5c9df2700279870 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 7 May 2019 18:56:53 +0100 Subject: [PATCH 483/539] [AllTest] Continued: refactored -project output back into CommandLine. --- .../src/main/java/org/scribble/job/Job.java | 37 ++++--------------- .../java/org/scribble/cli/CommandLine.java | 22 +++++++++-- 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index 51a784fb5..c0957b970 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -14,7 +14,6 @@ package org.scribble.job; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; @@ -43,7 +42,6 @@ import org.scribble.core.type.kind.SigKind; import org.scribble.core.type.name.DataName; import org.scribble.core.type.name.GProtoName; -import org.scribble.core.type.name.LProtoName; import org.scribble.core.type.name.MemberName; import org.scribble.core.type.name.ModuleName; import org.scribble.core.type.name.ProtoName; @@ -55,7 +53,6 @@ import org.scribble.core.type.session.local.LTypeFactoryImpl; import org.scribble.core.visit.gather.NonProtoDepsGatherer; import org.scribble.core.visit.gather.ProtoDepsCollector; -import org.scribble.core.visit.global.InlinedProjector; import org.scribble.del.DelFactory; import org.scribble.util.LProjectionTranslator; import org.scribble.util.ScribException; @@ -155,15 +152,15 @@ protected Core newCore(ModuleName mainFullname, Map args, // Returns: fullname -> Module -- CHECKME TODO: refactor local Module creation to Job? // CHECKME: generate projection Modules for an *inline* main? - public Map getProjections(GProtoName fullname, + public Map, Module> getProjections(GProtoName fullname, Role self) throws ScribException { AstFactory af = this.config.af; LProjectionTranslator t = new LProjectionTranslator(this); + Map, Module> res = new HashMap<>(); Map, LProjection> projs = getCore() .getProjections(fullname, self); - Map, Module> projmods = new HashMap<>(); for (ProtoName pfullname : projs.keySet()) { LProjection proj = projs.get(pfullname); @@ -182,7 +179,7 @@ public Map getProjections(GProtoName fullname, LinkedHashSet> npdeps = new LinkedHashSet<>(); proj.def.gather(new NonProtoDepsGatherer()::visit) // Gathering only from this proto decl (no subproto visiting) - .forEachOrdered(x -> npdeps.add(x)); // setify while preserving order + .forEachOrdered(x -> npdeps.add(x)); // set-ify while preserving order List> nonprods = new LinkedList<>(); for (MemberName nonpro : npdeps) { @@ -210,32 +207,12 @@ else if (kind.equals(SigKind.KIND)) ModuleDecl modd = af.ModuleDecl(null, modn); List protos = Arrays.asList(t.translate(proj)); Module mod = af.Module(null, modd, imports, nonprods, protos); - projmods.put(pfullname, mod); + res.put(pfullname, mod); } - LProjection root = projs - .get(InlinedProjector.getFullProjectionName(fullname, self)); - System.out.println( - "\nProjection modules for " + fullname + "@" + self + ":\n\n" - + projmods.get(root.fullname)); // FIXME TODO refactor printing into CommandLine - for (ProtoName pfullname : projmods.keySet()) - { - // CHECKME: projection decl name is currently *compound* full name (not simple name), OK? - if (!pfullname.equals(root.fullname)) - { - System.out.println("\n" + projmods.get(pfullname)); - } - } - - System.out.println(""); - warningPrintln( - "[TODO] Module projection incomplete, missing imports and non-proto decls: " - + fullname + "@" + self); - // CHECKME: nonprotos should refer to source global module? i.e., projection modules should import globals? maybe consistent with "projects" clause - - return Collections.emptyMap(); - //FIXME: build output Modules - //FIXME: (interleaved) ordering between proto and nonproto (Module) imports -- order by original Global import order? + // CHECKME: nonprotos should refer to source global module? i.e., projection modules should import globals? maybe consistent with "projects" clause + return res; + // CHECKME: (interleaved) ordering between proto and nonproto (Module) imports -- order by original Global import order? } // First run Visitor passes, then call toJob diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 3743c6326..2c3f63af6 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -34,9 +34,12 @@ import org.scribble.core.job.CoreContext; import org.scribble.core.model.endpoint.EGraph; import org.scribble.core.model.global.SGraph; +import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.LProtoName; +import org.scribble.core.type.name.ProtoName; import org.scribble.core.type.name.Role; +import org.scribble.core.visit.global.InlinedProjector; import org.scribble.job.Job; import org.scribble.job.JobContext; import org.scribble.main.Main; @@ -306,10 +309,21 @@ private void printProjection(Job job, String[] args) for (int i = 0; i < args.length; i += 2) { GProtoName fullname = checkGlobalProtocolArg(jobc, args[i]); - Role role = checkRoleArg(jobc, fullname, args[i+1]); - Map projections = job.getProjections(fullname, role); // FIXME: generate and output Module container -- should be done via Job? - System.out.println("\n" + projections.values().stream() - .map(p -> p.toString()).collect(Collectors.joining("\n\n"))); + Role self = checkRoleArg(jobc, fullname, args[i+1]); + Map, Module> projs = job.getProjections(fullname, self); + LProtoName rootFullname = InlinedProjector.getFullProjectionName(fullname, + self); + Module root = projs.get(rootFullname); + System.out.println( + "\nProjection modules for " + fullname + "@" + self + ":\n\n" + root); + for (ProtoName pfullname : projs.keySet()) + { + // CHECKME: projection decl name is currently *compound* full name (not simple name), OK? + if (!pfullname.equals(rootFullname)) + { + System.out.println("\n" + projs.get(pfullname)); + } + } } } From fd58266508ebe94b05524f86b5ef49d101a2f43a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 8 May 2019 17:45:36 +0100 Subject: [PATCH 484/539] [AllTest] Fixed CoreContext getEGraph bug. --- .../src/main/java/org/scribble/job/Job.java | 10 ++--- .../java/sessionapi/SessionApiGenerator.java | 10 ++--- .../StateChannelApiGenerator.java | 2 +- .../ioifaces/IOInterfacesGenerator.java | 6 +-- .../main/java/org/scribble/core/job/Core.java | 8 ++-- .../org/scribble/core/job/CoreContext.java | 5 ++- .../scribble/core/model/endpoint/EGraph.java | 5 --- .../core/type/session/STypeFactory.java | 25 +++++++------ ...eption.java => ScribRuntimeException.java} | 6 +-- .../runtime/net/ScribServerSocket.java | 6 +-- .../scribble/runtime/session/CBEndpoint.java | 6 +-- .../runtime/session/ExplicitEndpoint.java | 8 ++-- .../runtime/session/MPSTEndpoint.java | 26 ++++++------- .../org/scribble/runtime/session/Session.java | 8 ++-- .../runtime/session/SessionEndpoint.java | 12 +++--- .../runtime/statechans/AcceptSocket.java | 4 +- .../runtime/statechans/ConnectSocket.java | 4 +- .../runtime/statechans/EndSocket.java | 4 +- .../runtime/statechans/InitSocket.java | 18 ++++----- .../runtime/statechans/LinearSocket.java | 12 +++--- .../runtime/statechans/OutputSocket.java | 10 ++--- .../runtime/statechans/ReceiveSocket.java | 6 +-- .../src/test/scrib/test/test1/MyC.java | 13 ++++--- .../src/test/scrib/test/test1/MyS.java | 37 ++++++++++++------- .../src/test/scrib/test/test1/Test1.scr | 2 +- 25 files changed, 130 insertions(+), 123 deletions(-) rename scribble-runtime/src/main/java/org/scribble/main/{ScribbleRuntimeException.java => ScribRuntimeException.java} (83%) diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index c0957b970..a29dbd36c 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -262,6 +262,11 @@ private void runVisitorOnModule(ModuleName modname, AstVisitor v) this.context.replaceModule(visited); } + public JobContext getContext() + { + return this.context; + } + public boolean isVerbose() { return this.config.args.get(CoreArgs.VERBOSE); @@ -284,9 +289,4 @@ public void warningPrintln(String s) { System.err.println("[Warning] " + s); } - - public JobContext getContext() - { - return this.context; - } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java index 6407c429c..3969e14d4 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/sessionapi/SessionApiGenerator.java @@ -39,11 +39,11 @@ public class SessionApiGenerator extends ApiGen { - public static final String GPROTOCOLNAME_CLASS = "org.scribble.type.name.GProtocolName"; - public static final String OP_CLASS = "org.scribble.type.name.Op"; - public static final String ROLE_CLASS = "org.scribble.type.name.Role"; + public static final String GPROTOCOLNAME_CLASS = "org.scribble.core.type.name.GProtoName"; + public static final String OP_CLASS = "org.scribble.core.type.name.Op"; + public static final String ROLE_CLASS = "org.scribble.core.type.name.Role"; public static final String SESSION_CLASS = "org.scribble.runtime.session.Session"; - public static final String SESSIONTYPEFACTORY_CLASS = "org.scribble.type.SessionTypeFactory"; + public static final String SESSIONTYPEFACTORY_CLASS = "org.scribble.core.type.session.STypeFactory"; private static final String IMPATH_FIELD = "IMPATH"; private static final String SOURCE_FIELD = "SOURCE"; @@ -100,7 +100,7 @@ private void constructSessionClass() this.cb.setPackage(packname); this.cb.addImports(/*"java.io.IOException", */"java.util.Arrays", "java.util.Collections", "java.util.LinkedList", "java.util.List"); //this.cb.addImports("org.scribble.main.ScribbleRuntimeException", "org.scribble.net.session.SessionEndpoint", "org.scribble.net.ScribMessageFormatter"); - this.cb.addImports("org.scribble.type.name.Role"); + this.cb.addImports(ROLE_CLASS); this.cb.addImports(getRolesPackageName(this.gpn) + ".*"); if (!this.mids.isEmpty()) { diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 0b3b00b1e..3ac6367e1 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -41,7 +41,7 @@ public class StateChannelApiGenerator extends ApiGen { public static final String SCRIBMESSAGE_CLASS = "org.scribble.runtime.message.ScribMessage"; - public static final String SCRIBBLERUNTIMEEXCEPTION_CLASS = "org.scribble.main.ScribbleRuntimeException"; + public static final String SCRIBBLERUNTIMEEXCEPTION_CLASS = "org.scribble.main.ScribRuntimeException"; public static final String RECEIVE_OP_PARAM = "op"; public static final String SCRIBMESSAGE_OP_FIELD = "op"; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index caf8bfce4..70a457500 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -71,7 +71,8 @@ public class IOInterfacesGenerator extends ApiGen //private final Map> branchSuccs = new HashMap<>(); private final Map> branchSuccs = new HashMap<>(); // key: HandleInterface name // Sorted when collected - public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) throws RuntimeScribException, ScribException + public IOInterfacesGenerator(StateChannelApiGenerator apigen, + boolean subtypes) throws RuntimeScribException, ScribException { super(apigen.getJob(), apigen.getGProtocolName()); this.apigen = apigen; @@ -84,12 +85,11 @@ public IOInterfacesGenerator(StateChannelApiGenerator apigen, boolean subtypes) EState init = this.job.config.args.get(CoreArgs.MIN_EFSM) ? corec.getMinimisedEGraph(fullname, self).init : corec.getEGraph(fullname, self).init; - //if (IOInterfacesGenerator.skipIOInterfacesGeneration(init)) { // FIXME: factor out with skipIOInterfacesGeneration Set as = init.getReachableActions(); - if (as.stream().anyMatch((a) -> !a.isSend() && !a.isReceive())) // HACK FIXME (connect/disconnect) + if (as.stream().anyMatch(a -> !a.isSend() && !a.isReceive())) // HACK FIXME (connect/disconnect) { throw new RuntimeScribException( "[TODO] I/O Interface generation not supported for: " diff --git a/scribble-core/src/main/java/org/scribble/core/job/Core.java b/scribble-core/src/main/java/org/scribble/core/job/Core.java index 1ad6d9f41..33e3493ac 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/Core.java +++ b/scribble-core/src/main/java/org/scribble/core/job/Core.java @@ -310,8 +310,8 @@ protected void runEfsmBuildingPasses() { // Seems to be OK even if runSyntaxWfPasses does not succeed (cf. unfair transform) EGraph graph = this.context.getEGraph(fullname, self); - verbosePrintPass( - "Built EFSM: " + inlined.fullname + "\n" + graph.toDot()); + verbosePrintPass("Built EFSM: " + inlined.fullname + "@" + self + + "\n" + graph.toDot()); } } @@ -326,8 +326,8 @@ protected void runEfsmBuildingPasses() { // Pre: runGlobalSyntaxWfPasses -- e.g., bad.wfchoice.enabling.threeparty.Test02 EGraph graph = this.context.getUnfairEGraph(inlined.fullname, self); - verbosePrintPass("Built \"unfair\" EFSM: " + inlined.fullname + ":\n" - + graph.toDot()); + verbosePrintPass("Built \"unfair\" EFSM: " + inlined.fullname + + "@" + self + ":\n" + graph.toDot()); } } } diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java index 77bb2888a..596b32af4 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreContext.java @@ -234,12 +234,13 @@ public void setProjection(LProjection proj) // N.B. graphs built from inlined (not unfolded) public EGraph getEGraph(ProtoName fullname, Role self) { - EGraph graph = this.fEGraphs.get(fullname); + LProtoName projFullname = InlinedProjector.getFullProjectionName(fullname, self); + EGraph graph = this.fEGraphs.get(projFullname); if (graph == null) { LProjection inlined = getProjectedInlined(fullname, self); graph = inlined.toEGraph(this.core); - addEGraph(inlined.fullname, graph); + addEGraph(inlined.fullname, graph); // inlined.fullname.equals(projFullname) } return graph; } diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java index cbf9adb15..f34027c30 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java @@ -44,11 +44,6 @@ public String toAut() { return this.init.toAut(); } - - public String toPml(Role r) - { - return this.init.toPml(r); - } @Override public String toString() diff --git a/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java b/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java index 689c12680..c1d88c90d 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java +++ b/scribble-core/src/main/java/org/scribble/core/type/session/STypeFactory.java @@ -32,19 +32,8 @@ public STypeFactory(GTypeFactory global, LTypeFactory local) this.local = local; } - - - - - /*public static ModuleName parseModuleName(String name) - { - String[] elems = name.split("\\."); - return new ModuleName(elems); - }*/ - - // Currently used by generated Session API + // N.B. targetted by generated Session API // From fullname - @Deprecated public static GProtoName parseGlobalProtocolName(String name) { String[] elems = name.split("\\."); @@ -62,4 +51,16 @@ public static GProtoName parseGlobalProtocolName(String name) GProtoName gpn = new GProtoName(membname); return new GProtoName(modname, gpn); } + + + + + + + + /*public static ModuleName parseModuleName(String name) + { + String[] elems = name.split("\\."); + return new ModuleName(elems); + }*/ } diff --git a/scribble-runtime/src/main/java/org/scribble/main/ScribbleRuntimeException.java b/scribble-runtime/src/main/java/org/scribble/main/ScribRuntimeException.java similarity index 83% rename from scribble-runtime/src/main/java/org/scribble/main/ScribbleRuntimeException.java rename to scribble-runtime/src/main/java/org/scribble/main/ScribRuntimeException.java index 505b53659..45ada76ce 100644 --- a/scribble-runtime/src/main/java/org/scribble/main/ScribbleRuntimeException.java +++ b/scribble-runtime/src/main/java/org/scribble/main/ScribRuntimeException.java @@ -14,16 +14,16 @@ package org.scribble.main; // Note: not a runtime ScribbleException -public class ScribbleRuntimeException extends Exception +public class ScribRuntimeException extends Exception { private static final long serialVersionUID = 1L; - public ScribbleRuntimeException(String s) + public ScribRuntimeException(String s) { super(s); } - public ScribbleRuntimeException(Throwable t) + public ScribRuntimeException(Throwable t) { super(t); } diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribServerSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribServerSocket.java index e1328ca48..1cf3879f5 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribServerSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/net/ScribServerSocket.java @@ -15,7 +15,7 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; +import org.scribble.main.ScribRuntimeException; import org.scribble.runtime.session.SessionEndpoint; public abstract class ScribServerSocket implements AutoCloseable @@ -32,11 +32,11 @@ public ScribServerSocket(int port) throws IOException //public abstract BinaryChannelEndpoint accept(MPSTEndpoint se) throws IOException; // synchronize public abstract BinaryChannelEndpoint accept(SessionEndpoint se) throws IOException; // synchronize - public synchronized void bind() throws ScribbleRuntimeException + public synchronized void bind() throws ScribRuntimeException { if (this.reg) { - throw new ScribbleRuntimeException("Server socket already registered."); + throw new ScribRuntimeException("Server socket already registered."); } this.reg = true; } diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java index 4ced461d3..fab986022 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/CBEndpoint.java @@ -23,7 +23,7 @@ import java.util.function.Function; import org.scribble.core.type.name.Role; -import org.scribble.main.ScribbleRuntimeException; +import org.scribble.main.ScribRuntimeException; import org.scribble.runtime.handlers.ScribBranch; import org.scribble.runtime.handlers.ScribOutputEvent; import org.scribble.runtime.handlers.ScribSigMessage; @@ -44,14 +44,14 @@ public class CBEndpoint extends MPSTEndpoi protected final Map states = new HashMap<>(); // Bypass problem of mutual references and static field initialisation (class loading) - public CBEndpoint(S sess, R self, ScribMessageFormatter smf, ScribState init, D data) throws IOException, ScribbleRuntimeException + public CBEndpoint(S sess, R self, ScribMessageFormatter smf, ScribState init, D data) throws IOException, ScribRuntimeException { super(sess, self, smf); this.init = init; this.data = data; } - public Future run() throws ScribbleRuntimeException + public Future run() throws ScribRuntimeException { Object[] res = new Object[1]; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/ExplicitEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/ExplicitEndpoint.java index ef3c1e481..ba353a2b3 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/ExplicitEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/ExplicitEndpoint.java @@ -16,23 +16,23 @@ import java.io.IOException; import org.scribble.core.type.name.Role; -import org.scribble.main.ScribbleRuntimeException; +import org.scribble.main.ScribRuntimeException; import org.scribble.runtime.message.ScribMessageFormatter; public class ExplicitEndpoint extends SessionEndpoint { - public ExplicitEndpoint(S sess, R self, ScribMessageFormatter smf) throws IOException, ScribbleRuntimeException + public ExplicitEndpoint(S sess, R self, ScribMessageFormatter smf) throws IOException, ScribRuntimeException { super(sess, self, smf); } // FIXME HACK: "init" really only for MPSTEndpoint? Then refactor into there only @Override - public void init() throws ScribbleRuntimeException + public void init() throws ScribRuntimeException { if (this.init) { - throw new ScribbleRuntimeException("Session endpoint already initialised."); + throw new ScribRuntimeException("Session endpoint already initialised."); } } } diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/MPSTEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/MPSTEndpoint.java index 1c6708aa5..709e51813 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/MPSTEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/MPSTEndpoint.java @@ -18,7 +18,7 @@ import java.util.concurrent.Callable; import org.scribble.core.type.name.Role; -import org.scribble.main.ScribbleRuntimeException; +import org.scribble.main.ScribRuntimeException; import org.scribble.runtime.message.ScribMessageFormatter; import org.scribble.runtime.net.BinaryChannelEndpoint; import org.scribble.runtime.net.ScribServerSocket; @@ -27,30 +27,30 @@ //.. initiator and joiner endpoints public class MPSTEndpoint extends SessionEndpoint { - public MPSTEndpoint(S sess, R self, ScribMessageFormatter smf) throws IOException, ScribbleRuntimeException + public MPSTEndpoint(S sess, R self, ScribMessageFormatter smf) throws IOException, ScribRuntimeException { super(sess, self, smf); } - public void request(Role role, Callable cons, String host, int port) throws ScribbleRuntimeException, UnknownHostException, IOException + public void request(Role role, Callable cons, String host, int port) throws ScribRuntimeException, UnknownHostException, IOException { MPSTEndpoint.request(this, role, cons, host, port); } // HACK FIXME: refactor (location, protected, etc) - public static void request(SessionEndpoint se, Role role, Callable cons, String host, int port) throws ScribbleRuntimeException, UnknownHostException, IOException + public static void request(SessionEndpoint se, Role role, Callable cons, String host, int port) throws ScribRuntimeException, UnknownHostException, IOException { // Can connect unlimited, as long as not already used via init //if (this.init) if (se.init) { //throw new ScribbleRuntimeException("Socket already initialised: " + this.getClass()); - throw new ScribbleRuntimeException("Socket already initialised: " + se.getClass()); + throw new ScribRuntimeException("Socket already initialised: " + se.getClass()); } //if (this.chans.containsKey(role)) if (se.chans.containsKey(role)) { - throw new ScribbleRuntimeException("Already connected to: " + role); + throw new ScribRuntimeException("Already connected to: " + role); } try { @@ -70,40 +70,40 @@ public static void request(SessionEndpoint se, Role role, Callable se, ScribServerSocket ss, Role role) throws IOException, ScribbleRuntimeException - public static void accept(SessionEndpoint se, ScribServerSocket ss, Role role) throws IOException, ScribbleRuntimeException + public static void accept(SessionEndpoint se, ScribServerSocket ss, Role role) throws IOException, ScribRuntimeException { //if (this.init) if (se.init) { //throw new ScribbleRuntimeException("Socket already initialised: " + this.getClass()); - throw new ScribbleRuntimeException("Socket already initialised: " + se.getClass()); + throw new ScribRuntimeException("Socket already initialised: " + se.getClass()); } //if (this.chans.containsKey(role)) if (se.chans.containsKey(role)) { - throw new ScribbleRuntimeException("Already connected to: " + role); + throw new ScribRuntimeException("Already connected to: " + role); } //register(role, ss.accept(this)); // FIXME: serv map in SessionEndpoint not currently used se.register(role, ss.accept(se)); // FIXME: serv map in SessionEndpoint not currently used } - public void disconnect(Role role) throws IOException, ScribbleRuntimeException + public void disconnect(Role role) throws IOException, ScribRuntimeException { MPSTEndpoint.disconnect(this, role); } - public static void disconnect(SessionEndpoint se, Role role) throws IOException, ScribbleRuntimeException + public static void disconnect(SessionEndpoint se, Role role) throws IOException, ScribRuntimeException { //if (!this.chans.containsKey(role)) if (!se.chans.containsKey(role)) { - throw new ScribbleRuntimeException("Not connected to: " + role); + throw new ScribRuntimeException("Not connected to: " + role); } //deregister(role); se.deregister(role); diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java index d1c655e71..53f21f628 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/Session.java @@ -21,7 +21,7 @@ import org.scribble.core.type.name.GProtoName; import org.scribble.core.type.name.Role; -import org.scribble.main.ScribbleRuntimeException; +import org.scribble.main.ScribRuntimeException; import org.scribble.util.ScribException; public abstract class Session @@ -73,15 +73,15 @@ public SessionEndpoint project(R role, ScribMessageFormatter }*/ //protected

SessionEndpoint project(R role, ScribMessageFormatter smf) throws ScribbleRuntimeException, IOException //protected void project(MPSTEndpoint se) throws ScribbleRuntimeException, IOException - protected void project(SessionEndpoint se) throws ScribbleRuntimeException, IOException + protected void project(SessionEndpoint se) throws ScribRuntimeException, IOException { if (!getRoles().contains(se.self)) { - throw new ScribbleRuntimeException("Invalid role: " + se.self); + throw new ScribRuntimeException("Invalid role: " + se.self); } if (this.endpoints.containsKey(se.self)) { - throw new ScribbleRuntimeException("Session endpoint already created for: " + se.self); + throw new ScribRuntimeException("Session endpoint already created for: " + se.self); } //SessionEndpoint ep = new SessionEndpoint<>(this, role, smf); this.endpoints.put(se.self, se); diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java b/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java index 51f677d65..c26225fb4 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/session/SessionEndpoint.java @@ -21,7 +21,7 @@ import java.util.Set; import org.scribble.core.type.name.Role; -import org.scribble.main.ScribbleRuntimeException; +import org.scribble.main.ScribRuntimeException; import org.scribble.runtime.message.ScribMessageFormatter; import org.scribble.runtime.net.BinaryChannelEndpoint; import org.scribble.runtime.net.BinaryChannelWrapper; @@ -51,7 +51,7 @@ public abstract class SessionEndpoint impleme private final ScribInputSelector sel; private final Map keys = new HashMap<>(); - public SessionEndpoint(S sess, R self, ScribMessageFormatter smf) throws IOException, ScribbleRuntimeException + public SessionEndpoint(S sess, R self, ScribMessageFormatter smf) throws IOException, ScribRuntimeException { this.sess = sess; this.self = self; @@ -166,7 +166,7 @@ public boolean isCompleted() } @Override - public synchronized void close() throws ScribbleRuntimeException + public synchronized void close() throws ScribRuntimeException { if (!this.closed) { @@ -180,7 +180,7 @@ public synchronized void close() throws ScribbleRuntimeException { if (!isCompleted()) // Subsumes use -- must be used for sess to be completed { - throw new ScribbleRuntimeException("Session not completed: " + this.self); + throw new ScribRuntimeException("Session not completed: " + this.self); } } } @@ -262,7 +262,7 @@ public void disconnect(Role role) throws IOException, ScribbleRuntimeException }*/ //public void bind() throws ScribbleRuntimeException - public void init() throws ScribbleRuntimeException + public void init() throws ScribRuntimeException { /*if (this.bound) { @@ -271,7 +271,7 @@ public void init() throws ScribbleRuntimeException //if (!this.initialised) if (this.init) { - throw new ScribbleRuntimeException("Session endpoint already initialised."); + throw new ScribRuntimeException("Session endpoint already initialised."); } //this.bound = true; this.init = true; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/AcceptSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/AcceptSocket.java index 5fa32b9e8..1415ae8e6 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/AcceptSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/AcceptSocket.java @@ -16,7 +16,7 @@ import java.io.IOException; import org.scribble.core.type.name.Role; -import org.scribble.main.ScribbleRuntimeException; +import org.scribble.main.ScribRuntimeException; import org.scribble.runtime.net.ScribServerSocket; import org.scribble.runtime.session.MPSTEndpoint; import org.scribble.runtime.session.Session; @@ -36,7 +36,7 @@ protected AcceptSocket(SessionEndpoint ep) this.ep.register(role, ss.accept()); }*/ - protected void accept(ScribServerSocket ss, Role role) throws IOException, ScribbleRuntimeException + protected void accept(ScribServerSocket ss, Role role) throws IOException, ScribRuntimeException { use(); //this.se.accept(ss, role); // FIXME: csat diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ConnectSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ConnectSocket.java index 29a04e073..26a5a8434 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ConnectSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ConnectSocket.java @@ -18,7 +18,7 @@ import java.util.concurrent.Callable; import org.scribble.core.type.name.Role; -import org.scribble.main.ScribbleRuntimeException; +import org.scribble.main.ScribRuntimeException; import org.scribble.runtime.net.BinaryChannelEndpoint; import org.scribble.runtime.session.MPSTEndpoint; import org.scribble.runtime.session.Session; @@ -38,7 +38,7 @@ protected ConnectSocket(MPSTEndpoint ep) this.ep.register(role, new SocketWrapper(s)); }*/ - protected void connect(Role role, Callable cons, String host, int port) throws ScribbleRuntimeException, UnknownHostException, IOException + protected void connect(Role role, Callable cons, String host, int port) throws ScribRuntimeException, UnknownHostException, IOException { use(); //this.se.connect(role, cons, host, port); diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/EndSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/EndSocket.java index 3af9f60af..8ca386cd0 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/EndSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/EndSocket.java @@ -14,7 +14,7 @@ package org.scribble.runtime.statechans; import org.scribble.core.type.name.Role; -import org.scribble.main.ScribbleRuntimeException; +import org.scribble.main.ScribRuntimeException; import org.scribble.runtime.session.Session; import org.scribble.runtime.session.SessionEndpoint; @@ -27,7 +27,7 @@ protected EndSocket(SessionEndpoint se) super(se); } - public void end() throws ScribbleRuntimeException + public void end() throws ScribRuntimeException { /*super.use(); this.se.setCompleted();*/ diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/InitSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/InitSocket.java index aabf52ef6..8dc8f3c0f 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/InitSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/InitSocket.java @@ -18,7 +18,7 @@ import java.util.concurrent.Callable; import org.scribble.core.type.name.Role; -import org.scribble.main.ScribbleRuntimeException; +import org.scribble.main.ScribRuntimeException; import org.scribble.runtime.net.BinaryChannelEndpoint; import org.scribble.runtime.net.ScribServerSocket; import org.scribble.runtime.session.MPSTEndpoint; @@ -33,12 +33,12 @@ protected InitSocket(MPSTEndpoint se) super(se); } - public void connect(Callable cons, Role role, String host, int port) throws ScribbleRuntimeException, UnknownHostException, IOException + public void connect(Callable cons, Role role, String host, int port) throws ScribRuntimeException, UnknownHostException, IOException { // Can connect unlimited, as long as not already used via init if (isUsed()) { - throw new ScribbleRuntimeException("Socket already initialised: " + this.getClass()); + throw new ScribRuntimeException("Socket already initialised: " + this.getClass()); } try { @@ -56,28 +56,28 @@ public void connect(Callable cons, Role role, S } } - public void accept(ScribServerSocket ss, Role role) throws IOException, ScribbleRuntimeException + public void accept(ScribServerSocket ss, Role role) throws IOException, ScribRuntimeException { //accept(null, role); if (isUsed()) { - throw new ScribbleRuntimeException("Socket already initialised: " + this.getClass()); + throw new ScribRuntimeException("Socket already initialised: " + this.getClass()); } this.se.register(role, ss.accept(this.se)); // FIXME: serv map in SessionEndpoint not currently used } @Deprecated - public void accept(Role role) throws IOException, ScribbleRuntimeException + public void accept(Role role) throws IOException, ScribRuntimeException { if (isUsed()) { - throw new ScribbleRuntimeException("Socket already initialised: " + this.getClass()); + throw new ScribRuntimeException("Socket already initialised: " + this.getClass()); } this.se.register(role, this.se.getSelfServerSocket().accept(this.se)); } @Override - public void close() throws ScribbleRuntimeException + public void close() throws ScribRuntimeException { try { @@ -87,7 +87,7 @@ public void close() throws ScribbleRuntimeException { if (!this.se.isCompleted()) // Subsumes use -- must be used for sess to be completed { - throw new ScribbleRuntimeException("Session not completed: " + this.se.self); + throw new ScribRuntimeException("Session not completed: " + this.se.self); } } } diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/LinearSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/LinearSocket.java index 04efc5fc8..7244c2491 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/LinearSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/LinearSocket.java @@ -17,7 +17,7 @@ import java.util.concurrent.Callable; import org.scribble.core.type.name.Role; -import org.scribble.main.ScribbleRuntimeException; +import org.scribble.main.ScribRuntimeException; import org.scribble.runtime.net.BinaryChannelWrapper; import org.scribble.runtime.session.Session; import org.scribble.runtime.session.SessionEndpoint; @@ -39,22 +39,22 @@ protected boolean isUsed() } //protected synchronized void use() throws ScribbleRuntimeException - protected void use() throws ScribbleRuntimeException + protected void use() throws ScribRuntimeException { if (this.used) { - throw new ScribbleRuntimeException("Linear socket resource already used: " + this.getClass()); + throw new ScribRuntimeException("Linear socket resource already used: " + this.getClass()); } this.used = true; } //protected // FIXME: generate API operation - public void wrapClient(Role peer, Callable cons) throws IOException, ScribbleRuntimeException + public void wrapClient(Role peer, Callable cons) throws IOException, ScribRuntimeException { //use(); // FIXME: should be use for proper API operation if (this.used) { - throw new ScribbleRuntimeException("Linear socket resource already used: " + this.getClass()); + throw new ScribRuntimeException("Linear socket resource already used: " + this.getClass()); } try { @@ -72,7 +72,7 @@ public void wrapClient(Role peer, Callable cons) // FIXME: refactor // FIXME: State supertype of T - public static T wrapClient(T s, Role peer, Callable cons) throws IOException, ScribbleRuntimeException + public static T wrapClient(T s, Role peer, Callable cons) throws IOException, ScribRuntimeException { ((LinearSocket) s).wrapClient(peer, cons); return s; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/OutputSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/OutputSocket.java index 4eccc9e55..fb03f76c5 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/OutputSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/OutputSocket.java @@ -19,7 +19,7 @@ import org.scribble.core.type.name.Op; import org.scribble.core.type.name.Role; -import org.scribble.main.ScribbleRuntimeException; +import org.scribble.main.ScribRuntimeException; import org.scribble.runtime.message.ScribMessage; import org.scribble.runtime.net.BinaryChannelEndpoint; import org.scribble.runtime.session.MPSTEndpoint; @@ -34,12 +34,12 @@ protected OutputSocket(SessionEndpoint ep) super(ep); } - protected void writeScribMessage(Role peer, Op op, Object... payload) throws IOException, ScribbleRuntimeException + protected void writeScribMessage(Role peer, Op op, Object... payload) throws IOException, ScribRuntimeException { writeScribMessage(peer, new ScribMessage(op, payload)); } - protected void writeScribMessage(Role peer, ScribMessage msg) throws IOException, ScribbleRuntimeException + protected void writeScribMessage(Role peer, ScribMessage msg) throws IOException, ScribRuntimeException { use(); /*SocketEndpoint se = this.ep.getSocketEndpoint(peer); @@ -48,7 +48,7 @@ protected void writeScribMessage(Role peer, ScribMessage msg) throws IOException } // FIXME: check if MPST/ExplicitEndpoint - protected void connect(Role role, Callable cons, String host, int port) throws ScribbleRuntimeException, UnknownHostException, IOException + protected void connect(Role role, Callable cons, String host, int port) throws ScribRuntimeException, UnknownHostException, IOException { use(); //this.se.connect(role, cons, host, port); @@ -56,7 +56,7 @@ protected void connect(Role role, Callable cons } // FIXME: check if MPST/ExplicitEndpoint - protected void disconnect(Role role) throws ScribbleRuntimeException, UnknownHostException, IOException + protected void disconnect(Role role) throws ScribRuntimeException, UnknownHostException, IOException { use(); //this.se.disconnect(role); diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ReceiveSocket.java b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ReceiveSocket.java index 760b98b2e..f9919c99a 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ReceiveSocket.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/statechans/ReceiveSocket.java @@ -18,7 +18,7 @@ import java.util.concurrent.ExecutionException; import org.scribble.core.type.name.Role; -import org.scribble.main.ScribbleRuntimeException; +import org.scribble.main.ScribRuntimeException; import org.scribble.runtime.message.ScribMessage; import org.scribble.runtime.session.Session; import org.scribble.runtime.session.SessionEndpoint; @@ -32,7 +32,7 @@ protected ReceiveSocket(SessionEndpoint se) super(se); } - protected ScribMessage readScribMessage(Role peer) throws ClassNotFoundException, IOException, ScribbleRuntimeException + protected ScribMessage readScribMessage(Role peer) throws ClassNotFoundException, IOException, ScribRuntimeException { try { @@ -60,7 +60,7 @@ protected boolean isDone(Role peer) return (this.fut == null) || (this.fut.isDone()); } - protected CompletableFuture getFuture(Role peer) throws ScribbleRuntimeException + protected CompletableFuture getFuture(Role peer) throws ScribRuntimeException { use(); //this.fut = this.ep.getInputQueues().getFuture(peer); diff --git a/scribble-test/src/test/scrib/test/test1/MyC.java b/scribble-test/src/test/scrib/test/test1/MyC.java index 5f13c743a..759afd4f7 100644 --- a/scribble-test/src/test/scrib/test/test1/MyC.java +++ b/scribble-test/src/test/scrib/test/test1/MyC.java @@ -16,10 +16,10 @@ package test.test1; -import org.scribble.net.Buf; -import org.scribble.net.ObjectStreamFormatter; -import org.scribble.net.session.MPSTEndpoint; -import org.scribble.net.session.SocketChannelEndpoint; +import org.scribble.runtime.util.Buf; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; import test.test1.Test1.Proto1.Proto1; import test.test1.Test1.Proto1.channels.C.Proto1_C_1; @@ -31,9 +31,10 @@ public class MyC public static void main(String[] args) throws Exception { Proto1 adder = new Proto1(); - try (MPSTEndpoint se = new MPSTEndpoint<>(adder, Proto1.C, new ObjectStreamFormatter())) + try (MPSTEndpoint se = new MPSTEndpoint<>(adder, Proto1.C, + new ObjectStreamFormatter())) { - se.connect(Proto1.S, SocketChannelEndpoint::new, "localhost", 8888); + se.request(Proto1.S, SocketChannelEndpoint::new, "localhost", 8888); Proto1_C_2 s2 = new Proto1_C_1(se).send(Proto1.S, Proto1._1); for (int i = 0; i < 3; i++) diff --git a/scribble-test/src/test/scrib/test/test1/MyS.java b/scribble-test/src/test/scrib/test/test1/MyS.java index 42331acf0..89c28b38d 100644 --- a/scribble-test/src/test/scrib/test/test1/MyS.java +++ b/scribble-test/src/test/scrib/test/test1/MyS.java @@ -15,12 +15,12 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.net.Buf; -import org.scribble.net.ObjectStreamFormatter; -import org.scribble.net.scribsock.ScribServerSocket; -import org.scribble.net.scribsock.SocketChannelServer; -import org.scribble.net.session.MPSTEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.util.Buf; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; import test.test1.Test1.Proto1.Proto1; import test.test1.Test1.Proto1.channels.S.EndSocket; @@ -39,7 +39,8 @@ public class MyS { - public static void main(String[] args) throws IOException, ScribbleRuntimeException + public static void main(String[] args) + throws IOException, ScribRuntimeException { try (ScribServerSocket ss = new SocketChannelServer(8888)) { @@ -50,7 +51,8 @@ public static void main(String[] args) throws IOException, ScribbleRuntimeExcept { Proto1 foo = new Proto1(); //SessionEndpoint se = foo.project(Proto1.S, new ObjectStreamFormatter(), ss); - try (MPSTEndpoint se = new MPSTEndpoint<>(foo, Proto1.S, new ObjectStreamFormatter())) + try (MPSTEndpoint se = new MPSTEndpoint<>(foo, Proto1.S, + new ObjectStreamFormatter())) { se.accept(ss, Proto1.C); @@ -70,19 +72,22 @@ public static void main(String[] args) throws IOException, ScribbleRuntimeExcept class Handler implements Proto1_S_2_Handler { @Override - public void receive(EndSocket schan, _4 op) throws ScribbleRuntimeException, IOException + public void receive(EndSocket schan, _4 op) + throws ScribRuntimeException, IOException { System.out.println("Done"); schan.end(); } @Override - public void receive(Proto1_S_3 schan, _2 op, Buf b) throws ScribbleRuntimeException, IOException + public void receive(Proto1_S_3 schan, _2 op, Buf b) + throws ScribRuntimeException, IOException { System.out.println("Redo: " + b.val); try { - schan.send(Proto1.C, Proto1._3, 456).async(Proto1.C, Proto1._1).branch(Proto1.C, this); + schan.send(Proto1.C, Proto1._3, 456).async(Proto1.C, Proto1._1) + .branch(Proto1.C, this); } catch (ClassNotFoundException e) { @@ -91,10 +96,13 @@ public void receive(Proto1_S_3 schan, _2 op, Buf b) throws Scri } } -class Handler2 implements Handle_S_C_2_Integer__C_4 +class Handler2 + implements Handle_S_C_2_Integer__C_4 { @Override - public void receive(Succ_In_C_2_Integer schan, _2 op, Buf arg1) throws ScribbleRuntimeException, IOException, ClassNotFoundException + public void receive(Succ_In_C_2_Integer schan, _2 op, + Buf arg1) + throws ScribRuntimeException, IOException, ClassNotFoundException { System.out.println("Redo: " + arg1.val); schan @@ -104,7 +112,8 @@ public void receive(Succ_In_C_2_Integer schan, _2 op, Buf arg1) } @Override - public void receive(Succ_In_C_4 schan, _4 op) throws ScribbleRuntimeException, IOException, ClassNotFoundException + public void receive(Succ_In_C_4 schan, _4 op) + throws ScribRuntimeException, IOException, ClassNotFoundException { schan.to(EndSocket.cast).end(); System.out.println("Done"); diff --git a/scribble-test/src/test/scrib/test/test1/Test1.scr b/scribble-test/src/test/scrib/test/test1/Test1.scr index ea763f915..3c11f8f03 100644 --- a/scribble-test/src/test/scrib/test/test1/Test1.scr +++ b/scribble-test/src/test/scrib/test/test1/Test1.scr @@ -1,6 +1,6 @@ //http://sandbox.kidstrythisathome.com/erdos/ -//$ bin/scribblec.sh modules/core/src/test/scrib/test/test1/Test1.scr -ip modules/core/src/test/scrib/ -d modules/core/src/test/scrib/ -session Proto1 -api Proto1 C -V +//$ bin/scribblec.sh scribble-test/src/test/scrib/test/test1/Test1.scr -ip scribble-test/src/test/scrib/ -d scribble-test/src/test/scrib/ -api Proto1 C -V //$ javadoc -cp modules/cli/target/classes/';'modules/core/target/classes';'modules/trace/target/classes';'modules/parser/target/classes';c:\Users\Raymond\.m2\repository\org\antlr\antlr-runtime\3.2\antlr-runtime-3.2.jar;'modules/validation/target/classes/';'modules/projection/target/classes/';C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.9.9\jackson-mapper-asl-1.9.9.jar;C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-core-asl\1.9.9\jackson-core-asl-1.9.9.jar;'modules/core/src/test/scrib modules/core/src/test/scrib/test/test1/Proto1*.java -d test/doc/test1 module test.test1.Test1; From 28efc8c416f101e6af1bf9fce18c348f271f28f3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 8 May 2019 17:57:00 +0100 Subject: [PATCH 485/539] [AllTest] Fixed non proto decl name/source child bug. --- .../java/org/scribble/ast/NonProtoDecl.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java b/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java index 620625110..2a87b1de6 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java +++ b/scribble-ast/src/main/java/org/scribble/ast/NonProtoDecl.java @@ -53,24 +53,13 @@ public IdNode getSchemaChild() public ExtIdNode getExtNameChild() { - return (ExtIdNode) getChild(EXTSOURCE_NODE_CHILD_INDEX); + return (ExtIdNode) getChild(EXTNAME_NODE_CHILD_INDEX); } public ExtIdNode getExtSourceChild() { return (ExtIdNode) getChild(EXTSOURCE_NODE_CHILD_INDEX); } - - // CHECKME: maybe move to ModuleMember - public boolean isDataDecl() - { - return false; - } - - public boolean isSigDecl() - { - return false; - } // "add", not "set" public void addScribChildren(NameNode name, IdNode schema, @@ -83,6 +72,17 @@ public void addScribChildren(NameNode name, IdNode schema, addChild(extSource); } + // CHECKME: maybe move to ModuleMember + public boolean isDataDecl() + { + return false; + } + + public boolean isSigDecl() + { + return false; + } + @Override public abstract NonProtoDecl dupNode(); @@ -103,7 +103,7 @@ public NonProtoDecl visitChildren(AstVisitor nv) getNameNodeChild(), nv); IdNode schema = getSchemaChild(); ExtIdNode extName = getExtNameChild(); - ExtIdNode extSource = getExtNameChild(); + ExtIdNode extSource = getExtSourceChild(); return reconstruct(name, schema, extName, extSource); } From b53da15c6804ca14366fc835e893cbd31f0839d3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 8 May 2019 18:09:47 +0100 Subject: [PATCH 486/539] [AllTest] Fixed ext-id parsing quotes bug. --- .../scribble/ast/name/simple/ExtIdNode.java | 1 + .../org/scribble/parser/ScribTreeAdaptor.java | 8 +++++- .../src/test/scrib/test/test1/MyC.java | 6 ++-- .../src/test/scrib/test/test1/MyS.java | 28 +++++++++---------- 4 files changed, 25 insertions(+), 18 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/name/simple/ExtIdNode.java b/scribble-ast/src/main/java/org/scribble/ast/name/simple/ExtIdNode.java index cd5b5013a..eea5bddf4 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/name/simple/ExtIdNode.java +++ b/scribble-ast/src/main/java/org/scribble/ast/name/simple/ExtIdNode.java @@ -15,6 +15,7 @@ import org.antlr.runtime.Token; +// N.B. without surrounding quotes "..." -- cf. ScribTreeAdaptor.create // N.B. no del attached, so not currently visited public class ExtIdNode extends IdNode // CHECKME: e.g., toName gives Id { diff --git a/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java index 3f1af637a..7c7c5c3d2 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java @@ -13,6 +13,7 @@ */ package org.scribble.parser; +import org.antlr.runtime.CommonToken; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTreeAdaptor; import org.scribble.ast.AuxMod; @@ -89,7 +90,12 @@ public ScribNode create(Token t) switch (t.getType()) { case ScribbleParser.ID: n = new IdNode(t); break; - case ScribbleParser.EXTID: n = new ExtIdNode(t); break; + case ScribbleParser.EXTID: + t = new CommonToken(t); + String text = t.getText(); + t.setText(text.substring(1, text.length()-1)); // N.B. remove surrounding quotes "..." + n = new ExtIdNode(t); + break; // Simple names "constructed directly" by parser, e.g., t=ID -> ID<...Node>[$t] -- N.B. DelDecorator pass needed for them (CHECKME: also do those here instead? to deprecate DelDecorator) diff --git a/scribble-test/src/test/scrib/test/test1/MyC.java b/scribble-test/src/test/scrib/test/test1/MyC.java index 759afd4f7..094129aa5 100644 --- a/scribble-test/src/test/scrib/test/test1/MyC.java +++ b/scribble-test/src/test/scrib/test/test1/MyC.java @@ -16,15 +16,15 @@ package test.test1; -import org.scribble.runtime.util.Buf; import org.scribble.runtime.message.ObjectStreamFormatter; import org.scribble.runtime.net.SocketChannelEndpoint; import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import test.test1.Test1.Proto1.Proto1; -import test.test1.Test1.Proto1.channels.C.Proto1_C_1; -import test.test1.Test1.Proto1.channels.C.Proto1_C_2; import test.test1.Test1.Proto1.roles.C; +import test.test1.Test1.Proto1.statechans.C.Proto1_C_1; +import test.test1.Test1.Proto1.statechans.C.Proto1_C_2; public class MyC { diff --git a/scribble-test/src/test/scrib/test/test1/MyS.java b/scribble-test/src/test/scrib/test/test1/MyS.java index 89c28b38d..a88b7daf6 100644 --- a/scribble-test/src/test/scrib/test/test1/MyS.java +++ b/scribble-test/src/test/scrib/test/test1/MyS.java @@ -16,26 +16,26 @@ import java.io.IOException; import org.scribble.main.ScribRuntimeException; -import org.scribble.runtime.util.Buf; import org.scribble.runtime.message.ObjectStreamFormatter; import org.scribble.runtime.net.ScribServerSocket; import org.scribble.runtime.net.SocketChannelServer; import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import test.test1.Test1.Proto1.Proto1; -import test.test1.Test1.Proto1.channels.S.EndSocket; -import test.test1.Test1.Proto1.channels.S.Proto1_S_1; -import test.test1.Test1.Proto1.channels.S.Proto1_S_2_Handler; -import test.test1.Test1.Proto1.channels.S.Proto1_S_3; -import test.test1.Test1.Proto1.channels.S.ioifaces.Branch_S_C_2_Integer__C_4; -import test.test1.Test1.Proto1.channels.S.ioifaces.Handle_S_C_2_Integer__C_4; -import test.test1.Test1.Proto1.channels.S.ioifaces.Receive_S_C_1; -import test.test1.Test1.Proto1.channels.S.ioifaces.Select_S_C_3_Integer; -import test.test1.Test1.Proto1.channels.S.ioifaces.Succ_In_C_2_Integer; -import test.test1.Test1.Proto1.channels.S.ioifaces.Succ_In_C_4; import test.test1.Test1.Proto1.ops._2; import test.test1.Test1.Proto1.ops._4; import test.test1.Test1.Proto1.roles.S; +import test.test1.Test1.Proto1.statechans.S.EndSocket; +import test.test1.Test1.Proto1.statechans.S.Proto1_S_1; +import test.test1.Test1.Proto1.statechans.S.Proto1_S_2_Handler; +import test.test1.Test1.Proto1.statechans.S.Proto1_S_3; +import test.test1.Test1.Proto1.statechans.S.ioifaces.Branch_S_C_2_Integer__C_4; +import test.test1.Test1.Proto1.statechans.S.ioifaces.Handle_S_C_2_Integer__C_4; +import test.test1.Test1.Proto1.statechans.S.ioifaces.Receive_S_C_1; +import test.test1.Test1.Proto1.statechans.S.ioifaces.Select_S_C_3_Integer; +import test.test1.Test1.Proto1.statechans.S.ioifaces.Succ_In_C_2_Integer; +import test.test1.Test1.Proto1.statechans.S.ioifaces.Succ_In_C_4; public class MyS { @@ -80,7 +80,7 @@ public void receive(EndSocket schan, _4 op) } @Override - public void receive(Proto1_S_3 schan, _2 op, Buf b) + public void receive(Proto1_S_3 schan, _2 op, Buf b) throws ScribRuntimeException, IOException { System.out.println("Redo: " + b.val); @@ -101,10 +101,10 @@ class Handler2 { @Override public void receive(Succ_In_C_2_Integer schan, _2 op, - Buf arg1) + Buf b) throws ScribRuntimeException, IOException, ClassNotFoundException { - System.out.println("Redo: " + arg1.val); + System.out.println("Redo: " + b.val); schan .to(Select_S_C_3_Integer.cast).send(Proto1.C, Proto1._3, 123) .to(Receive_S_C_1.cast).async(Proto1.C, Proto1._1) From 3e052e2021b583ddd79be462d8dce9f5fd3de810 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 8 May 2019 18:41:53 +0100 Subject: [PATCH 487/539] [AllTest] Minor updates to codegen. --- .../callbackapi/CBEndpointApiGenerator3.java | 10 +++++----- .../ioifaces/IOInterfacesGenerator.java | 8 ++++---- .../scrib/smtp/src/smtp/SimpleSmtpC.java | 10 +++++----- scribble-demos/scrib/smtp/src/smtp/SmtpC.java | 16 ++++++++-------- .../scrib/smtp/src/smtp/message/SmtpMessage.java | 2 +- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java index 02366318c..cbb17e586 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/callbackapi/CBEndpointApiGenerator3.java @@ -270,7 +270,7 @@ protected String generateEndpointClass(String rootPack, String endpointName, Str endpointClass.setSuperClass("org.scribble.runtime.session.CBEndpoint<" + sessClassName + ", " + getRolesPackage() + "." + this.self + ", D>"); ConstructorBuilder cb = endpointClass.newConstructor(sessClassName + " sess", getRolesPackage() + "." + this.self + " self", "org.scribble.runtime.message.ScribMessageFormatter smf", "D data"); cb.addModifiers("public"); - cb.addExceptions("java.io.IOException", "org.scribble.main.ScribbleRuntimeException"); + cb.addExceptions("java.io.IOException", "org.scribble.main.ScribRuntimeException"); cb.addBodyLine("super(sess, self, smf, " + initStateName + ".id, data);"); for (EState s : states) { @@ -281,7 +281,7 @@ protected String generateEndpointClass(String rootPack, String endpointName, Str MethodBuilder mb = endpointClass.newMethod("run"); mb.addModifiers("public"); mb.setReturn("java.util.concurrent.Future"); - mb.addExceptions("org.scribble.main.ScribbleRuntimeException"); + mb.addExceptions("org.scribble.main.ScribRuntimeException"); mb.addAnnotations("@Override"); mb.addBodyLine("java.util.Set states = java.util.stream.Stream.of(" + states.stream().filter(s -> s.getStateKind() != EStateKind.TERMINAL) @@ -292,7 +292,7 @@ protected String generateEndpointClass(String rootPack, String endpointName, Str mb.addBodyLine("regd.addAll(this.outputs.keySet());"); mb.addBodyLine("if (!states.equals(regd)) {"); mb.addBodyLine("states.removeAll(regd);"); - mb.addBodyLine("throw new org.scribble.main.ScribbleRuntimeException(\"Missing state registrations: \" + states);"); + mb.addBodyLine("throw new org.scribble.main.ScribRuntimeException(\"Missing state registrations: \" + states);"); mb.addBodyLine("}"); mb.addBodyLine("return super.run();"); for (EState s : states) @@ -622,12 +622,12 @@ protected String generateStateClass(EState s, String rootPack, EStateKind kind, MethodBuilder getPeer = opClass.newMethod("getPeer"); getPeer.addModifiers("public"); getPeer.addAnnotations("@Override"); - getPeer.setReturn("org.scribble.type.name.Role"); + getPeer.setReturn("org.scribble.core.type.name.Role"); getPeer.addBodyLine("return " + getRolesPackage() + "." + a.peer + "." + a.peer + ";"); MethodBuilder getOp = opClass.newMethod("getOp"); getOp.addModifiers("public"); getOp.addAnnotations("@Override"); - getOp.setReturn("org.scribble.type.name.Op"); + getOp.setReturn("org.scribble.core.type.name.Op"); getOp.addBodyLine("return " + getOpsPackage() + "." + SessionApiGenerator.getOpClassName(a.mid) + "." + SessionApiGenerator.getOpClassName(a.mid) + ";"); MethodBuilder getPayload = opClass.newMethod("getPayload"); getPayload.addModifiers("public"); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index 70a457500..65b753419 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -149,13 +149,13 @@ public IOInterfacesGenerator(StateChannelApiGenerator apigen, // Overriding every Successor I/f to methods in the I/O State I/f, even if unnecessary if (!cast.getReturn().equals("EndSocket")) { - MethodBuilder mb = addEndSocketToCastMethod(endsock, cast.getReturn(), "throw new RuntimeScribbleException(\"Invalid cast of EndSocket: \" + cast);"); + MethodBuilder mb = addEndSocketToCastMethod(endsock, cast.getReturn(), "throw new RuntimeScribException(\"Invalid cast of EndSocket: \" + cast);"); if (mb != null) { mb.addModifiers(JavaBuilder.PUBLIC); mb.addAnnotations("@Override"); - endsock.addImports("org.scribble.main.RuntimeScribbleException"); + endsock.addImports("org.scribble.util.RuntimeScribException"); } } } @@ -904,8 +904,8 @@ private static MethodBuilder addToCastMethod(InterfaceBuilder ib, String ret) } else { - ib.addImports("org.scribble.main.RuntimeScribbleException"); - mb.addBodyLine("throw new RuntimeScribbleException(\"Invalid cast to EndSocket: \" + cast);"); + ib.addImports("org.scribble.util.RuntimeScribException"); + mb.addBodyLine("throw new RuntimeScribException(\"Invalid cast to EndSocket: \" + cast);"); } return mb; } diff --git a/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java b/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java index 115bbcdc3..8fb895f42 100644 --- a/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java +++ b/scribble-demos/scrib/smtp/src/smtp/SimpleSmtpC.java @@ -12,7 +12,7 @@ * the License. */ -//$ java -cp scribble-runtime/target/classes/';'scribble-core/target/classes';'scribble-demos/target/classes smtp.SimpleSmtpC +//$ java -cp scribble-runtime/target/classes/:scribble-core/target/classes:scribble-demos/target/classes smtp.SimpleSmtpC package smtp; @@ -78,8 +78,8 @@ public void run() throws Exception int port = 25; String ehlo = "user.testing.com"; - String mail = "rhu@doc.ic.ac.uk"; // Sender - String rcpt = mail; + String mailFrom = "rhu@doc.ic.ac.uk"; // Sender + String rcptTo = mailFrom; String subj = "test"; String body = "body"; @@ -95,14 +95,14 @@ public void run() throws Exception doEhlo(new Smtp_C_1(se).async(S, _220), ehlo) ) , ehlo)) - .send(S, new Mail(mail)) + .send(S, new Mail(mailFrom)) .branch(S); switch (cases.getOp()) { case _250: { cases.receive(_250) - .send(S, new Rcpt(rcpt)).async(S, _250) + .send(S, new Rcpt(rcptTo)).async(S, _250) .send(S, new Data()).async(S, _354) .send(S, new Subject(subj)) .send(S, new DataLine(body)) diff --git a/scribble-demos/scrib/smtp/src/smtp/SmtpC.java b/scribble-demos/scrib/smtp/src/smtp/SmtpC.java index a5426c677..ff4b1c098 100644 --- a/scribble-demos/scrib/smtp/src/smtp/SmtpC.java +++ b/scribble-demos/scrib/smtp/src/smtp/SmtpC.java @@ -12,7 +12,7 @@ * the License. */ -//$ java -cp scribble-core/target/classes:scribble-runtime/target/classes:scribble-demos/target/classes smtp.SmtpC smtp.cc.ic.ac.uk recipient@foo.com sender@bar.com subj body +//$ java -cp scribble-core/target/classes:scribble-runtime/target/classes:scribble-demos/target/classes smtp.SmtpC smtp.cc.ic.ac.uk sender@bar.com recipient@foo.com subj body package smtp; @@ -71,16 +71,16 @@ public class SmtpC private static final int PORT = 25; private final String server; // e.g., smtp.cc.ic.ac.uk; - private final String mailTo; // recipient@foo.com - private final String rcptFrom; // sender@bar.com + private final String mailFrom; // sender@bar.com + private final String rcptTo; // recipient@foo.com private final String subj; private final String body; - public SmtpC(String server, String mailTo, String rcptFrom, String subj, String body) throws Exception + public SmtpC(String server, String mailFrom, String rcptTo, String subj, String body) throws Exception { this.server = server; - this.mailTo = mailTo; - this.rcptFrom = rcptFrom; + this.mailFrom = mailFrom; + this.rcptTo = rcptTo; this.subj = subj; this.body = body; @@ -111,7 +111,7 @@ public void run() throws Exception ))); Smtp_C_11_Cases s11cases = - s10.send(S, new Mail(this.mailTo)) + s10.send(S, new Mail(this.mailFrom)) .branch(S); switch (s11cases.op) { @@ -216,7 +216,7 @@ private Smtp_C_10 doAuth(Smtp_C_8 s8) throws Exception private EndSocket sendMail(Smtp_C_12 s12) throws Exception { return - s12.send(S, new Rcpt(this.rcptFrom)) + s12.send(S, new Rcpt(this.rcptTo)) .async(S, _250) .send(S, new Data()) .async(S, _354) diff --git a/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessage.java b/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessage.java index 4992c9714..e3860c471 100644 --- a/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessage.java +++ b/scribble-demos/scrib/smtp/src/smtp/message/SmtpMessage.java @@ -14,7 +14,7 @@ package smtp.message; import org.scribble.runtime.message.ScribMessage; -import org.scribble.type.name.Op; +import org.scribble.core.type.name.Op; import org.scribble.util.Caller; import smtp.Smtp.Smtp.Smtp; From eb894093d4e8a8f7d5daafdb1f29aead1318d992 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 8 May 2019 22:24:59 +0100 Subject: [PATCH 488/539] [AllTest] Pass on some scribble-demo. --- .../src/betty16/lec1/httplong/HttpLongC.java | 59 ++++++------- .../src/betty16/lec1/httplong/HttpLongS.java | 38 +++++--- .../lec1/httplong/message/HeaderField.java | 2 +- .../httplong/message/HttpLongMessage.java | 8 +- .../message/HttpLongMessageFormatter.java | 4 +- .../lec1/httplong/message/StartLine.java | 2 +- .../httplong/message/server/StatusCode.java | 2 +- .../src/betty16/lec1/httpshort/HttpShort.scr | 2 +- .../betty16/lec1/httpshort/HttpShortC.java | 88 ++++--------------- .../betty16/lec1/httpshort/HttpShortS.java | 22 ++--- .../httpshort/message/HttpShortMessage.java | 4 +- .../message/HttpShortMessageFormatter.java | 32 ++++--- .../src/betty16/lec1/misc/LocatedChoice2.scr | 1 + .../src/betty16/lec1/misc/Messaging.scr | 4 +- .../src/betty16/lec1/nego/Negotiate.scr | 2 +- .../betty16/src/betty16/lec2/adder/Adder.scr | 3 - .../src/betty16/lec2/adder/AdderC1.java | 15 ++-- .../src/betty16/lec2/adder/AdderC2.java | 15 ++-- .../src/betty16/lec2/adder/AdderS1.java | 21 ++--- .../src/betty16/lec2/adder/AdderS2.java | 32 ++++--- .../betty16/src/betty16/lec2/adder/FibC1.java | 20 +++-- .../src/betty16/lec2/adder/MyAdderC.java | 15 ++-- .../src/betty16/lec2/adder/MyAdderS.java | 21 ++--- .../src/betty16/lec2/adder/MyFibC.java | 14 +-- .../src/betty16/lec2/smtp/MySmtpC.java | 25 +++--- .../betty16/src/betty16/lec2/smtp/SmtpC1.java | 35 ++++---- .../betty16/src/betty16/lec2/smtp/SmtpC2.java | 35 ++++---- .../betty16/src/betty16/lec2/smtp/SmtpC3.java | 31 +++---- .../betty16/src/betty16/lec2/smtp/SmtpC4.java | 39 ++++---- .../lec2/smtp/message/SmtpMessage.java | 4 +- .../smtp/message/SmtpMessageFormatter.java | 4 +- .../src/bettybook/http/longv/HttpLongC.java | 38 ++++---- .../src/bettybook/http/longv/HttpLongS.java | 24 ++--- .../http/longv/message/HeaderField.java | 2 +- .../http/longv/message/HttpLongMessage.java | 4 +- .../message/HttpLongMessageFormatter.java | 4 +- .../http/longv/message/StartLine.java | 2 +- .../http/longv/message/server/StatusCode.java | 2 +- .../src/bettybook/http/shortv/HttpShortC.java | 32 ++++--- .../src/bettybook/http/shortv/HttpShortS.java | 32 ++++--- .../http/shortv/message/HttpShortMessage.java | 4 +- .../message/HttpShortMessageFormatter.java | 4 +- .../src/bettybook/math/scrib/MathC.java | 20 ++--- .../src/bettybook/math/scrib/MathS1.java | 20 ++--- .../src/bettybook/math/scrib/MathS2.java | 38 ++++---- .../http/src/http/longvers/HttpLongC.java | 23 +++-- .../http/longvers/message/HeaderField.java | 2 +- .../longvers/message/HttpLongMessage.java | 2 +- .../src/http/longvers/message/StartLine.java | 2 +- .../longvers/message/server/StatusCode.java | 2 +- .../http/src/http/shortvers/HttpShortC.java | 7 +- .../http/src/http/shortvers/HttpShortS.java | 11 +-- .../shortvers/message/HttpShortMessage.java | 2 +- 53 files changed, 442 insertions(+), 434 deletions(-) diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongC.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongC.java index c309aa88b..872d4dd66 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongC.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongC.java @@ -30,57 +30,50 @@ import static betty16.lec1.httplong.HttpLong.Http.Http._200; import static betty16.lec1.httplong.HttpLong.Http.Http._404; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import betty16.lec1.httplong.HttpLong.Http.Http; -import betty16.lec1.httplong.HttpLong.Http.channels.C.EndSocket; -import betty16.lec1.httplong.HttpLong.Http.channels.C.Http_C_1; -import betty16.lec1.httplong.HttpLong.Http.channels.C.Http_C_3; -import betty16.lec1.httplong.HttpLong.Http.channels.C.Http_C_4_Cases; -import betty16.lec1.httplong.HttpLong.Http.channels.C.Http_C_5; -import betty16.lec1.httplong.HttpLong.Http.channels.C.Http_C_5_Cases; import betty16.lec1.httplong.HttpLong.Http.roles.C; +import betty16.lec1.httplong.HttpLong.Http.statechans.C.EndSocket; +import betty16.lec1.httplong.HttpLong.Http.statechans.C.Http_C_1; +import betty16.lec1.httplong.HttpLong.Http.statechans.C.Http_C_3; +import betty16.lec1.httplong.HttpLong.Http.statechans.C.Http_C_4_Cases; +import betty16.lec1.httplong.HttpLong.Http.statechans.C.Http_C_5; +import betty16.lec1.httplong.HttpLong.Http.statechans.C.Http_C_5_Cases; import betty16.lec1.httplong.message.Body; import betty16.lec1.httplong.message.HttpLongMessageFormatter; import betty16.lec1.httplong.message.client.Host; import betty16.lec1.httplong.message.client.RequestLine; + +/** TODO + * Cannot parse header field: Cache-Control: max-age=604800 + * at betty16.lec1.httplong.message.HttpLongMessageFormatter.fromBytes(HttpLongMessageFormatter.java:197) + */ + public class HttpLongC { public static void main(String[] args) throws Exception { Http http = new Http(); - try (MPSTEndpoint client = new MPSTEndpoint<>(http, C, new HttpLongMessageFormatter())) { - String host = "www.doc.ic.ac.uk"; int port = 80; - //String host = "localhost"; int port = 8080; + try (MPSTEndpoint client = new MPSTEndpoint<>(http, C, + new HttpLongMessageFormatter())) { + String host = "www.doc.ic.ac.uk"; int port = 80; String file = "/~rhu/"; + //String host = "example.com"; int port = 80; String file = "/"; + //String host = "localhost"; int port = 8080; String file = "/"; - client.connect(S, SocketChannelEndpoint::new, host, port); - new HttpLongC().run(new Http_C_1(client), host); + client.request(S, SocketChannelEndpoint::new, host, port); + new HttpLongC().run(new Http_C_1(client), host, file); } } - - - - - - - - - - - - - - - - public EndSocket run(Http_C_1 c, String host) throws Exception { - return doResponse(doRequest(c, host)); + public EndSocket run(Http_C_1 c, String host, String file) throws Exception { + return doResponse(doRequest(c, host, file)); } - private Http_C_3 doRequest(Http_C_1 c1, String host) throws Exception { - return c1.send(S, new RequestLine("/~rhu/", "1.1")) + private Http_C_3 doRequest(Http_C_1 c1, String host, String file) throws Exception { + return c1.send(S, new RequestLine(file, "1.1")) .send(S, new Host(host)) .send(S, new Body("")); } diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongS.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongS.java index 7cc4ad264..c0e3f31b7 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongS.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongS.java @@ -19,34 +19,43 @@ import static betty16.lec1.httplong.HttpLong.Http.Http.BODY; import static betty16.lec1.httplong.HttpLong.Http.Http.C; import static betty16.lec1.httplong.HttpLong.Http.Http.CONNECTION; +import static betty16.lec1.httplong.HttpLong.Http.Http.COOKIE; import static betty16.lec1.httplong.HttpLong.Http.Http.DNT; import static betty16.lec1.httplong.HttpLong.Http.Http.HOST; import static betty16.lec1.httplong.HttpLong.Http.Http.REQUESTL; import static betty16.lec1.httplong.HttpLong.Http.Http.S; import static betty16.lec1.httplong.HttpLong.Http.Http.UPGRADEIR; -import static betty16.lec1.httplong.HttpLong.Http.Http.COOKIE; import static betty16.lec1.httplong.HttpLong.Http.Http.USERA; import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import betty16.lec1.httplong.HttpLong.Http.Http; -import betty16.lec1.httplong.HttpLong.Http.channels.S.EndSocket; -import betty16.lec1.httplong.HttpLong.Http.channels.S.Http_S_1; -import betty16.lec1.httplong.HttpLong.Http.channels.S.Http_S_2; -import betty16.lec1.httplong.HttpLong.Http.channels.S.Http_S_2_Cases; import betty16.lec1.httplong.HttpLong.Http.roles.S; +import betty16.lec1.httplong.HttpLong.Http.statechans.S.EndSocket; +import betty16.lec1.httplong.HttpLong.Http.statechans.S.Http_S_1; +import betty16.lec1.httplong.HttpLong.Http.statechans.S.Http_S_2; +import betty16.lec1.httplong.HttpLong.Http.statechans.S.Http_S_2_Cases; import betty16.lec1.httplong.message.Body; import betty16.lec1.httplong.message.HttpLongMessageFormatter; import betty16.lec1.httplong.message.server.ContentLength; import betty16.lec1.httplong.message.server.HttpVersion; import betty16.lec1.httplong.message.server._200; + +/** TODO: + * Cannot parse header field: Pragma: no-cache + * at betty16.lec1.httplong.message.HttpLongMessageFormatter.fromBytes(HttpLongMessageFormatter.java:197) + * + * java.lang.RuntimeException: Cannot parse header field: Cache-Control: max-age=0 + * at betty16.lec1.httplong.message.HttpLongMessageFormatter.fromBytes(HttpLongMessageFormatter.java:197) + */ + public class HttpLongS { public static void main(String[] args) throws Exception @@ -54,12 +63,14 @@ public static void main(String[] args) throws Exception try (ScribServerSocket ss = new SocketChannelServer(8080)) { while (true) { Http http = new Http(); - try (MPSTEndpoint server = new MPSTEndpoint<>(http, S, new HttpLongMessageFormatter())) { + try (MPSTEndpoint server = new MPSTEndpoint<>(http, S, + new HttpLongMessageFormatter())) { server.accept(ss, C); run(new Http_S_1(server)); } - catch (IOException | ClassNotFoundException | ScribbleRuntimeException e) + catch (IOException | ClassNotFoundException + | ScribRuntimeException e) { e.printStackTrace(); } @@ -67,7 +78,8 @@ public static void main(String[] args) throws Exception } } - private static EndSocket run(Http_S_1 s1) throws ClassNotFoundException, ScribbleRuntimeException, IOException { + private static EndSocket run(Http_S_1 s1) + throws ClassNotFoundException, ScribRuntimeException, IOException { Buf buf = new Buf<>(); Http_S_2 s2 = s1.receive(C, REQUESTL, buf); diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HeaderField.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HeaderField.java index 0ca331213..f8869fc91 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HeaderField.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HeaderField.java @@ -13,7 +13,7 @@ */ package betty16.lec1.httplong.message; -import org.scribble.type.name.Op; +import org.scribble.core.type.name.Op; public abstract class HeaderField extends HttpLongMessage { diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HttpLongMessage.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HttpLongMessage.java index c6f9fcb6d..b4662801b 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HttpLongMessage.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HttpLongMessage.java @@ -13,8 +13,8 @@ */ package betty16.lec1.httplong.message; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.type.name.Op; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.core.type.name.Op; import betty16.lec1.httplong.HttpLong.Http.Http; @@ -69,7 +69,9 @@ public String getBody() public byte[] toBytes() { - return (getOpString(this.op) + getBody() + HttpLongMessage.CRLF).getBytes(HttpLongMessageFormatter.cs); // Can give "utf-8" as arg directly + return (getOpString(this.op) + getBody() + HttpLongMessage.CRLF) + .getBytes(HttpLongMessageFormatter.cs); + // Can give "utf-8" as arg directly } @Override diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HttpLongMessageFormatter.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HttpLongMessageFormatter.java index 3f6412b66..11a6302d4 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HttpLongMessageFormatter.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HttpLongMessageFormatter.java @@ -19,8 +19,8 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.runtime.net.ScribMessageFormatter; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.runtime.message.ScribMessageFormatter; import betty16.lec1.httplong.message.client.Accept; import betty16.lec1.httplong.message.client.AcceptEncoding; diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/StartLine.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/StartLine.java index 96bbc325e..d7eba14ef 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/StartLine.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/StartLine.java @@ -13,7 +13,7 @@ */ package betty16.lec1.httplong.message; -import org.scribble.type.name.Op; +import org.scribble.core.type.name.Op; public abstract class StartLine extends HttpLongMessage { diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/server/StatusCode.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/server/StatusCode.java index 90c18d9c8..376d0bf23 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/server/StatusCode.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/server/StatusCode.java @@ -13,7 +13,7 @@ */ package betty16.lec1.httplong.message.server; -import org.scribble.type.name.Op; +import org.scribble.core.type.name.Op; import betty16.lec1.httplong.message.HttpLongMessage; diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShort.scr b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShort.scr index f7d230c9a..fbda13229 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShort.scr +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShort.scr @@ -3,7 +3,7 @@ * * ./scribblec.sh -d scribble-demos/scrib/betty16/src scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShort.scr -api Http C * - * $ javadoc -cp scribble-core/target/classes';'scribble-runtime/target/classes';'scribble-demos/scrib/betty16/src -subpackages betty16.lec1.httpshort.HttpShort.Http -d scribble-demos/scrib/betty16/javadoc/httpshort + * $ javadoc -cp scribble-core/target/classes:scribble-runtime/target/classes:scribble-demos/scrib/betty16/src -subpackages betty16.lec1.httpshort.HttpShort.Http -d scribble-demos/scrib/betty16/javadoc/httpshort * */ diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShortC.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShortC.java index 8ddf10b9e..8c5de2dd2 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShortC.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShortC.java @@ -13,16 +13,18 @@ */ package betty16.lec1.httpshort; -import static betty16.lec1.httpshort.HttpShort.Http.Http.*; +import static betty16.lec1.httpshort.HttpShort.Http.Http.C; +import static betty16.lec1.httpshort.HttpShort.Http.Http.Response; +import static betty16.lec1.httpshort.HttpShort.Http.Http.S; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import betty16.lec1.httpshort.HttpShort.Http.Http; -import betty16.lec1.httpshort.HttpShort.Http.channels.C.EndSocket; -import betty16.lec1.httpshort.HttpShort.Http.channels.C.Http_C_1; import betty16.lec1.httpshort.HttpShort.Http.roles.C; +import betty16.lec1.httpshort.HttpShort.Http.statechans.C.EndSocket; +import betty16.lec1.httpshort.HttpShort.Http.statechans.C.Http_C_1; import betty16.lec1.httpshort.message.HttpShortMessageFormatter; import betty16.lec1.httpshort.message.client.Request; import betty16.lec1.httpshort.message.server.Response; @@ -31,80 +33,26 @@ public class HttpShortC { public static void main(String[] args) throws Exception { Http http = new Http(); - try (MPSTEndpoint client = new MPSTEndpoint<>(http, C, new HttpShortMessageFormatter())) { - String host = "www.doc.ic.ac.uk"; int port = 80; - //String host = "summerschool2016.behavioural-types.eu"; int port = 80; - //String host = "localhost"; int port = 8080; - - client.connect(S, SocketChannelEndpoint::new, host, port); - new HttpShortC().run(new Http_C_1(client)); + try (MPSTEndpoint client = new MPSTEndpoint<>(http, C, + new HttpShortMessageFormatter())) { + //String host = "www.doc.ic.ac.uk"; int port = 80; String file = "/~rhu/"; + String host = "example.com"; int port = 80; String file = "/"; + //String host = "localhost"; int port = 8080; String file = "/"; + + client.request(S, SocketChannelEndpoint::new, host, port); + new HttpShortC().run(new Http_C_1(client), host, file); } } - - - - - - - - - - - - - private EndSocket run(Http_C_1 c) throws Exception { - Buf buf = new Buf<>(); - - EndSocket end = null; - /*c.send(S, new Response("", "")) - .receive(S, Response, buf);*/ - - System.out.println("Response:\n" + buf.val); - - return end; - } - - - - - - - - - - - - - - - - - //c.send(S, new Request("/~rhu/", "1.1", "www.doc.ic.ac.uk")).receive(S, Response, buf); - - - - - - - - - - /* - private EndSocket run2(Http_C_1 c1, String host) throws Exception { + private EndSocket run(Http_C_1 c1, String host, String file) throws Exception { Buf buf = new Buf<>(); EndSocket end = - c.send(S, new Request("/~rhu/", "1.1", host)) - //.send(S, new Request("/~rhu/", "1.1", host)) + c1.send(S, new Request(file, "1.1", host)) .receive(S, Response, buf); System.out.println("Response:\n" + buf.val); return end; } - //*/ - //.send(S, new Response("1.1", "..body..")) - //.send(S, new Request("/~rhu/", "1.1", host)) - //.receive(S, RESPONSE, new Buf<>()); } diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShortS.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShortS.java index b1a0a8da3..bbb62f6de 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShortS.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShortS.java @@ -19,16 +19,16 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import betty16.lec1.httpshort.HttpShort.Http.Http; -import betty16.lec1.httpshort.HttpShort.Http.channels.S.Http_S_1; -import betty16.lec1.httpshort.HttpShort.Http.channels.S.Http_S_2; import betty16.lec1.httpshort.HttpShort.Http.roles.S; +import betty16.lec1.httpshort.HttpShort.Http.statechans.S.Http_S_1; +import betty16.lec1.httpshort.HttpShort.Http.statechans.S.Http_S_2; import betty16.lec1.httpshort.message.HttpShortMessageFormatter; import betty16.lec1.httpshort.message.client.Request; import betty16.lec1.httpshort.message.server.Response; @@ -39,12 +39,13 @@ public static void main(String[] args) throws IOException { try (ScribServerSocket ss = new SocketChannelServer(8080)) { while (true) { Http http = new Http(); - try (MPSTEndpoint server = new MPSTEndpoint<>(http, S, new HttpShortMessageFormatter())) { + try (MPSTEndpoint server = new MPSTEndpoint<>(http, S, + new HttpShortMessageFormatter())) { server.accept(ss, C); run(new Http_S_1(server)); } - catch (IOException | ClassNotFoundException | ScribbleRuntimeException e) + catch (IOException | ClassNotFoundException | ScribRuntimeException e) { e.printStackTrace(); } @@ -52,7 +53,8 @@ public static void main(String[] args) throws IOException { } } - private static void run(Http_S_1 s1) throws ClassNotFoundException, ScribbleRuntimeException, IOException { + private static void run(Http_S_1 s1) + throws ClassNotFoundException, ScribRuntimeException, IOException { Buf buf = new Buf<>(); Http_S_2 s2 = s1.receive(C, Request, buf); diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/HttpShortMessage.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/HttpShortMessage.java index e2386de26..424e90e63 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/HttpShortMessage.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/HttpShortMessage.java @@ -13,8 +13,8 @@ */ package betty16.lec1.httpshort.message; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.type.name.Op; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.core.type.name.Op; import betty16.lec1.httpshort.HttpShort.Http.Http; diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/HttpShortMessageFormatter.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/HttpShortMessageFormatter.java index 4a24f2615..df0f14609 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/HttpShortMessageFormatter.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/HttpShortMessageFormatter.java @@ -20,8 +20,8 @@ import java.nio.charset.Charset; import java.util.Arrays; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.runtime.net.ScribMessageFormatter; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.runtime.message.ScribMessageFormatter; import betty16.lec1.httpshort.message.client.Request; import betty16.lec1.httpshort.message.server.Response; @@ -43,7 +43,8 @@ public byte[] toBytes(ScribMessage m) throws IOException } @Override - public ScribMessage fromBytes(ByteBuffer bb) throws IOException, ClassNotFoundException + public ScribMessage fromBytes(ByteBuffer bb) + throws IOException, ClassNotFoundException { bb.flip(); int rem = bb.remaining(); @@ -53,7 +54,8 @@ public ScribMessage fromBytes(ByteBuffer bb) throws IOException, ClassNotFoundEx return null; } - String curr = new String(Arrays.copyOf(bb.array(), bb.remaining()), HttpShortMessageFormatter.cs); + String curr = new String(Arrays.copyOf(bb.array(), bb.remaining()), + HttpShortMessageFormatter.cs); String endOfHeaders = HttpShortMessage.CRLF + HttpShortMessage.CRLF; if (!curr.contains(endOfHeaders)) { @@ -69,8 +71,11 @@ public ScribMessage fromBytes(ByteBuffer bb) throws IOException, ClassNotFoundEx bb.compact(); return null; } - String contentLenSplit = curr.substring(curr.indexOf(Response.CONTENT_LENGTH)); - int len = Integer.parseInt(contentLenSplit.substring(Response.CONTENT_LENGTH.length()+2, contentLenSplit.indexOf('\r')).trim()); + String contentLenSplit = curr + .substring(curr.indexOf(Response.CONTENT_LENGTH)); + int len = Integer.parseInt( + contentLenSplit.substring(Response.CONTENT_LENGTH.length() + 2, + contentLenSplit.indexOf('\r')).trim()); if (curr.length() < eoh+4) { bb.compact(); @@ -160,7 +165,8 @@ private static HttpShortMessage parseRequest(String msg) { throw new RuntimeException("Shouldn't get in here: " + msg); } - return new Request(get, http, host, userA, accept, acceptL, acceptE, dnt, connection, upgradeIR, cookie); + return new Request(get, http, host, userA, accept, acceptL, acceptE, dnt, + connection, upgradeIR, cookie); } private static HttpShortMessage parseResponse(String msg) @@ -231,18 +237,24 @@ private static HttpShortMessage parseResponse(String msg) case Response.VIA: via = msg.substring(i+1, j).trim(); break; default: //throw new RuntimeException("Cannot parse header field: " + msg.substring(0, msg.indexOf('\r'))); - System.err.println("[Warning] Attempting to skip over response field: " + header + "\n" + msg.substring(i+1, j).trim()); + System.err + .println("[Warning] Attempting to skip over response field: " + + header + "\n" + msg.substring(i + 1, j).trim()); } msg = msg.substring(j+2); } } body = msg; - return new Response(httpv, ack, date, server, strictTS, lastMod, eTag, acceptR, contentL, vary, contentT, via, body); + return new Response(httpv, ack, date, server, strictTS, lastMod, eTag, + acceptR, contentL, vary, contentT, via, body); } - // FIXME: delete + + + + // TODO: delete @Deprecated @Override public void writeMessage(DataOutputStream dos, ScribMessage m) throws IOException { diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/misc/LocatedChoice2.scr b/scribble-demos/scrib/betty16/src/betty16/lec1/misc/LocatedChoice2.scr index 456c29098..3978d0892 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/misc/LocatedChoice2.scr +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/misc/LocatedChoice2.scr @@ -1,5 +1,6 @@ module betty16.lec1.misc.LocatedChoice2; +data "java.lang.Integer" from "rt.jar" as Int; global protocol Proto1(role A, role B, role C) { choice at A { diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/misc/Messaging.scr b/scribble-demos/scrib/betty16/src/betty16/lec1/misc/Messaging.scr index b6f80e7d0..0c30b83fb 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/misc/Messaging.scr +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/misc/Messaging.scr @@ -1,8 +1,8 @@ module betty16.lec1.misc.Messaging; -type "java.lang.Integer" from "rt.jar" as Int; -type "java.lang.String" from "rt.jar" as String; +data "java.lang.Integer" from "rt.jar" as Int; +data "java.lang.String" from "rt.jar" as String; global protocol Proto1(role A, role B) { diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/nego/Negotiate.scr b/scribble-demos/scrib/betty16/src/betty16/lec1/nego/Negotiate.scr index 5157b1ecf..adbf5e88a 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/nego/Negotiate.scr +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/nego/Negotiate.scr @@ -8,7 +8,7 @@ module betty16.lec1.nego.Negotiate; -type "test.nego.SAP" from "test/nego/SAP.java" as SAP; +data "test.nego.SAP" from "test/nego/SAP.java" as SAP; // C = Consumer, P = Producer diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/Adder.scr b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/Adder.scr index f6e4d66d8..4eb6c7089 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/Adder.scr +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/Adder.scr @@ -7,9 +7,6 @@ * (2) Build Endpoint FSM for C: * $ ./scribblec.sh scribble-demos/scrib/betty16/src/betty16/lec2/adder/Adder.scr -fsm Adder C * - * (3) Generate "Session API" for Adder: - * $ ./scribblec.sh -d scribble-demos/scrib/betty16/src/ scribble-demos/scrib/betty16/src/betty16/lec2/adder/Adder.scr -session Adder - * * (3) Generate Endpoint API ("Session API" and "State Channel API") for C: * $ ./scribblec.sh -d scribble-demos/scrib/betty16/src/ scribble-demos/scrib/betty16/src/betty16/lec2/adder/Adder.scr -api Adder C * diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/AdderC1.java b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/AdderC1.java index 7a8900846..57a379759 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/AdderC1.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/AdderC1.java @@ -19,21 +19,22 @@ import static betty16.lec2.adder.Adder.Adder.Adder.Res; import static betty16.lec2.adder.Adder.Adder.Adder.S; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import betty16.lec2.adder.Adder.Adder.Adder; -import betty16.lec2.adder.Adder.Adder.channels.C.Adder_C_1; import betty16.lec2.adder.Adder.Adder.roles.C; +import betty16.lec2.adder.Adder.Adder.statechans.C.Adder_C_1; public class AdderC1 { public static void main(String[] args) throws Exception { Adder adder = new Adder(); - try (MPSTEndpoint client = new MPSTEndpoint<>(adder, C, new ObjectStreamFormatter())) { - client.connect(S, SocketChannelEndpoint::new, "localhost", 8888); + try (MPSTEndpoint client = new MPSTEndpoint<>(adder, C, + new ObjectStreamFormatter())) { + client.request(S, SocketChannelEndpoint::new, "localhost", 8888); System.out.println("C: " + new AdderC1().run(client)); } } diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/AdderC2.java b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/AdderC2.java index 49839750b..e9d9968e2 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/AdderC2.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/AdderC2.java @@ -19,21 +19,22 @@ import static betty16.lec2.adder.Adder.Adder.Adder.Res; import static betty16.lec2.adder.Adder.Adder.Adder.S; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import betty16.lec2.adder.Adder.Adder.Adder; -import betty16.lec2.adder.Adder.Adder.channels.C.Adder_C_1; import betty16.lec2.adder.Adder.Adder.roles.C; +import betty16.lec2.adder.Adder.Adder.statechans.C.Adder_C_1; public class AdderC2 { public static void main(String[] args) throws Exception { Adder adder = new Adder(); - try (MPSTEndpoint client = new MPSTEndpoint<>(adder, C, new ObjectStreamFormatter())) { - client.connect(S, SocketChannelEndpoint::new, "localhost", 8888); + try (MPSTEndpoint client = new MPSTEndpoint<>(adder, C, + new ObjectStreamFormatter())) { + client.request(S, SocketChannelEndpoint::new, "localhost", 8888); System.out.println("C: " + new AdderC2().run(client)); } } diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/AdderS1.java b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/AdderS1.java index 6bd44aad5..e7c7e8f86 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/AdderS1.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/AdderS1.java @@ -21,17 +21,17 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import betty16.lec2.adder.Adder.Adder.Adder; -import betty16.lec2.adder.Adder.Adder.channels.S.Adder_S_1; -import betty16.lec2.adder.Adder.Adder.channels.S.Adder_S_1_Cases; import betty16.lec2.adder.Adder.Adder.roles.S; +import betty16.lec2.adder.Adder.Adder.statechans.S.Adder_S_1; +import betty16.lec2.adder.Adder.Adder.statechans.S.Adder_S_1_Cases; public class AdderS1 { @@ -39,10 +39,11 @@ public static void main(String[] args) throws Exception { try (ScribServerSocket ss = new SocketChannelServer(8888)) { while (true) { Adder adder = new Adder(); - try (MPSTEndpoint server = new MPSTEndpoint<>(adder, S, new ObjectStreamFormatter())) { + try (MPSTEndpoint server = new MPSTEndpoint<>(adder, S, + new ObjectStreamFormatter())) { server.accept(ss, C); new AdderS1().run(new Adder_S_1(server)); - } catch (ScribbleRuntimeException | IOException | ClassNotFoundException e) { + } catch (ScribRuntimeException | IOException | ClassNotFoundException e) { e.printStackTrace(); } } diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/AdderS2.java b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/AdderS2.java index d5e9d1e43..bd64eaade 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/AdderS2.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/AdderS2.java @@ -20,21 +20,21 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import betty16.lec2.adder.Adder.Adder.Adder; -import betty16.lec2.adder.Adder.Adder.channels.S.Adder_S_1; -import betty16.lec2.adder.Adder.Adder.channels.S.Adder_S_1_Handler; -import betty16.lec2.adder.Adder.Adder.channels.S.Adder_S_2; -import betty16.lec2.adder.Adder.Adder.channels.S.Adder_S_3; import betty16.lec2.adder.Adder.Adder.ops.Add; import betty16.lec2.adder.Adder.Adder.ops.Bye; import betty16.lec2.adder.Adder.Adder.roles.S; +import betty16.lec2.adder.Adder.Adder.statechans.S.Adder_S_1; +import betty16.lec2.adder.Adder.Adder.statechans.S.Adder_S_1_Handler; +import betty16.lec2.adder.Adder.Adder.statechans.S.Adder_S_2; +import betty16.lec2.adder.Adder.Adder.statechans.S.Adder_S_3; public class AdderS2 implements Adder_S_1_Handler { @@ -42,11 +42,12 @@ public static void main(String[] args) throws Exception { try (ScribServerSocket ss = new SocketChannelServer(8888)) { while (true) { Adder adder = new Adder(); - try (MPSTEndpoint server = new MPSTEndpoint<>(adder, S, new ObjectStreamFormatter())) { + try (MPSTEndpoint server = new MPSTEndpoint<>(adder, S, + new ObjectStreamFormatter())) { server.accept(ss, C); new Adder_S_1(server).branch(C, new AdderS2()); - } catch (ScribbleRuntimeException | IOException | ClassNotFoundException e) { + } catch (ScribRuntimeException | IOException | ClassNotFoundException e) { e.printStackTrace(); } } @@ -54,12 +55,15 @@ public static void main(String[] args) throws Exception { } @Override - public void receive(Adder_S_2 s2, Add op, Buf arg1, Buf arg2) throws ScribbleRuntimeException, IOException, ClassNotFoundException { + public void receive(Adder_S_2 s2, Add op, Buf arg1, + Buf arg2) + throws ScribRuntimeException, IOException, ClassNotFoundException + { s2.send(C, Res, arg1.val + arg2.val).branch(C, this); } @Override - public void receive(Adder_S_3 s3, Bye op) throws ScribbleRuntimeException, IOException { + public void receive(Adder_S_3 s3, Bye op) throws ScribRuntimeException, IOException { s3.send(C, Bye); } } diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/FibC1.java b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/FibC1.java index f88d3aacd..32dec9fc4 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/FibC1.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/FibC1.java @@ -19,22 +19,23 @@ import static betty16.lec2.adder.Adder.Adder.Adder.Res; import static betty16.lec2.adder.Adder.Adder.Adder.S; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import betty16.lec2.adder.Adder.Adder.Adder; -import betty16.lec2.adder.Adder.Adder.channels.C.Adder_C_1; -import betty16.lec2.adder.Adder.Adder.channels.C.EndSocket; import betty16.lec2.adder.Adder.Adder.roles.C; +import betty16.lec2.adder.Adder.Adder.statechans.C.Adder_C_1; +import betty16.lec2.adder.Adder.Adder.statechans.C.EndSocket; public class FibC1 { public static void main(String[] args) throws Exception { Adder adder = new Adder(); - try (MPSTEndpoint client = new MPSTEndpoint<>(adder, C, new ObjectStreamFormatter())) { - client.connect(S, SocketChannelEndpoint::new, "localhost", 8888); + try (MPSTEndpoint client = new MPSTEndpoint<>(adder, C, + new ObjectStreamFormatter())) { + client.request(S, SocketChannelEndpoint::new, "localhost", 8888); Buf i1 = new Buf<>(0); Buf i2 = new Buf<>(1); @@ -45,7 +46,8 @@ public static void main(String[] args) throws Exception { } // Post: i1.val is the i-th Fibonacci number - private EndSocket fibo(Adder_C_1 c1, Buf i1, Buf i2, int i) throws Exception { + private EndSocket fibo(Adder_C_1 c1, Buf i1, Buf i2, int i) + throws Exception { return (i > 0) ? fibo(c1.send(S, Add, i1.val, i1.val=i2.val).receive(S, Res, i2), i1, i2, i-1) : c1.send(S, Bye).receive(S, Bye); diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/MyAdderC.java b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/MyAdderC.java index a7bb10a28..05371bf54 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/MyAdderC.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/MyAdderC.java @@ -16,21 +16,22 @@ import static betty16.lec2.adder.Adder.Adder.Adder.C; import static betty16.lec2.adder.Adder.Adder.Adder.S; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import betty16.lec2.adder.Adder.Adder.Adder; -import betty16.lec2.adder.Adder.Adder.channels.C.Adder_C_1; import betty16.lec2.adder.Adder.Adder.roles.C; +import betty16.lec2.adder.Adder.Adder.statechans.C.Adder_C_1; public class MyAdderC { public static void main(String[] args) throws Exception { Adder adder = new Adder(); - try (MPSTEndpoint client = new MPSTEndpoint<>(adder, C, new ObjectStreamFormatter())) { - client.connect(S, SocketChannelEndpoint::new, "localhost", 8888); + try (MPSTEndpoint client = new MPSTEndpoint<>(adder, C, + new ObjectStreamFormatter())) { + client.request(S, SocketChannelEndpoint::new, "localhost", 8888); System.out.println("C: " + new MyAdderC().run(client)); } } diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/MyAdderS.java b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/MyAdderS.java index ec9b00e08..2abeacb50 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/MyAdderS.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/MyAdderS.java @@ -21,17 +21,17 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import betty16.lec2.adder.Adder.Adder.Adder; -import betty16.lec2.adder.Adder.Adder.channels.S.Adder_S_1; -import betty16.lec2.adder.Adder.Adder.channels.S.Adder_S_1_Cases; import betty16.lec2.adder.Adder.Adder.roles.S; +import betty16.lec2.adder.Adder.Adder.statechans.S.Adder_S_1; +import betty16.lec2.adder.Adder.Adder.statechans.S.Adder_S_1_Cases; public class MyAdderS { @@ -39,10 +39,11 @@ public static void main(String[] args) throws Exception { try (ScribServerSocket ss = new SocketChannelServer(8888)) { while (true) { Adder adder = new Adder(); - try (MPSTEndpoint server = new MPSTEndpoint<>(adder, S, new ObjectStreamFormatter())) { + try (MPSTEndpoint server = new MPSTEndpoint<>(adder, S, + new ObjectStreamFormatter())) { server.accept(ss, C); new MyAdderS().run(new Adder_S_1(server)); - } catch (ScribbleRuntimeException | IOException | ClassNotFoundException e) { + } catch (ScribRuntimeException | IOException | ClassNotFoundException e) { e.printStackTrace(); } } diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/MyFibC.java b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/MyFibC.java index beae8888a..6129bc53c 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/MyFibC.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/MyFibC.java @@ -16,22 +16,22 @@ import static betty16.lec2.adder.Adder.Adder.Adder.C; import static betty16.lec2.adder.Adder.Adder.Adder.S; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import betty16.lec2.adder.Adder.Adder.Adder; -import betty16.lec2.adder.Adder.Adder.channels.C.Adder_C_1; -import betty16.lec2.adder.Adder.Adder.channels.C.EndSocket; import betty16.lec2.adder.Adder.Adder.roles.C; +import betty16.lec2.adder.Adder.Adder.statechans.C.Adder_C_1; +import betty16.lec2.adder.Adder.Adder.statechans.C.EndSocket; public class MyFibC { public static void main(String[] args) throws Exception { Adder adder = new Adder(); try (MPSTEndpoint client = new MPSTEndpoint<>(adder, C, new ObjectStreamFormatter())) { - client.connect(S, SocketChannelEndpoint::new, "localhost", 8888); + client.request(S, SocketChannelEndpoint::new, "localhost", 8888); Buf i1 = new Buf<>(0); Buf i2 = new Buf<>(1); diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/MySmtpC.java b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/MySmtpC.java index 1ce810ead..3f2f3bb51 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/MySmtpC.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/MySmtpC.java @@ -17,19 +17,19 @@ import static betty16.lec2.smtp.Smtp.Smtp.Smtp.S; import static betty16.lec2.smtp.Smtp.Smtp.Smtp._220; -import org.scribble.runtime.net.scribsock.LinearSocket; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SSLSocketChannelWrapper; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.net.SSLSocketChannelWrapper; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.statechans.LinearSocket; import betty16.lec2.smtp.Smtp.Smtp.Smtp; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.EndSocket; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_1; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_4; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_6; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.ioifaces.Select_C_S_Ehlo; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.ioifaces.Succ_In_S_250; import betty16.lec2.smtp.Smtp.Smtp.roles.C; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.EndSocket; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_1; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_4; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_6; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.ioifaces.Select_C_S_Ehlo; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.ioifaces.Succ_In_S_250; import betty16.lec2.smtp.message.SmtpMessageFormatter; import betty16.lec2.smtp.message.client.StartTls; @@ -40,8 +40,9 @@ public static void main(String[] args) throws Exception { int port = 25; Smtp smtp = new Smtp(); - try (MPSTEndpoint client = new MPSTEndpoint<>(smtp, C, new SmtpMessageFormatter())) { - client.connect(S, SocketChannelEndpoint::new, host, port); + try (MPSTEndpoint client = new MPSTEndpoint<>(smtp, C, + new SmtpMessageFormatter())) { + client.request(S, SocketChannelEndpoint::new, host, port); new MySmtpC().run(new Smtp_C_1(client)); } } diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC1.java b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC1.java index 21ea4a711..a698c4cd9 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC1.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC1.java @@ -19,24 +19,24 @@ import static betty16.lec2.smtp.Smtp.Smtp.Smtp._250; import static betty16.lec2.smtp.Smtp.Smtp.Smtp._250d; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.scribsock.LinearSocket; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SSLSocketChannelWrapper; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.net.SSLSocketChannelWrapper; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.statechans.LinearSocket; +import org.scribble.runtime.util.Buf; import betty16.lec2.smtp.Smtp.Smtp.Smtp; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.EndSocket; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_1; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_2; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_3; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_3_Cases; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_4; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_6; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_7; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_7_Cases; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_8; import betty16.lec2.smtp.Smtp.Smtp.roles.C; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.EndSocket; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_1; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_2; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_3; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_3_Cases; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_4; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_6; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_7; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_7_Cases; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_8; import betty16.lec2.smtp.message.SmtpMessageFormatter; import betty16.lec2.smtp.message.client.Ehlo; import betty16.lec2.smtp.message.client.Quit; @@ -49,8 +49,9 @@ public static void main(String[] args) throws Exception { int port = 25; Smtp smtp = new Smtp(); - try (MPSTEndpoint client = new MPSTEndpoint<>(smtp, C, new SmtpMessageFormatter())) { - client.connect(S, SocketChannelEndpoint::new, host, port); + try (MPSTEndpoint client = new MPSTEndpoint<>(smtp, C, + new SmtpMessageFormatter())) { + client.request(S, SocketChannelEndpoint::new, host, port); new SmtpC1().run(new Smtp_C_1(client)); } } diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC2.java b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC2.java index 16fd1637e..3805ad29c 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC2.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC2.java @@ -19,24 +19,24 @@ import static betty16.lec2.smtp.Smtp.Smtp.Smtp._250; import static betty16.lec2.smtp.Smtp.Smtp.Smtp._250d; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.scribsock.LinearSocket; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SSLSocketChannelWrapper; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.net.SSLSocketChannelWrapper; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.statechans.LinearSocket; +import org.scribble.runtime.util.Buf; import betty16.lec2.smtp.Smtp.Smtp.Smtp; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.EndSocket; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_1; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.ioifaces.Branch_C_S_250__S_250d; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.ioifaces.Case_C_S_250__S_250d; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.ioifaces.Receive_C_S_220; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.ioifaces.Select_C_S_Ehlo; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.ioifaces.Select_C_S_Quit; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.ioifaces.Select_C_S_StartTls; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.ioifaces.Succ_In_S_220; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.ioifaces.Succ_In_S_250; import betty16.lec2.smtp.Smtp.Smtp.roles.C; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.EndSocket; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_1; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.ioifaces.Branch_C_S_250__S_250d; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.ioifaces.Case_C_S_250__S_250d; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.ioifaces.Receive_C_S_220; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.ioifaces.Select_C_S_Ehlo; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.ioifaces.Select_C_S_Quit; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.ioifaces.Select_C_S_StartTls; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.ioifaces.Succ_In_S_220; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.ioifaces.Succ_In_S_250; import betty16.lec2.smtp.message.SmtpMessageFormatter; import betty16.lec2.smtp.message.client.Ehlo; import betty16.lec2.smtp.message.client.Quit; @@ -49,8 +49,9 @@ public static void main(String[] args) throws Exception { int port = 25; Smtp smtp = new Smtp(); - try (MPSTEndpoint client = new MPSTEndpoint<>(smtp, C, new SmtpMessageFormatter())) { - client.connect(S, SocketChannelEndpoint::new, host, port); + try (MPSTEndpoint client = new MPSTEndpoint<>(smtp, C, + new SmtpMessageFormatter())) { + client.request(S, SocketChannelEndpoint::new, host, port); new SmtpC2().run(new Smtp_C_1(client)); } } diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC3.java b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC3.java index 3e4b6c825..419f977bb 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC3.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC3.java @@ -19,22 +19,22 @@ import static betty16.lec2.smtp.Smtp.Smtp.Smtp._250; import static betty16.lec2.smtp.Smtp.Smtp.Smtp._250d; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.scribsock.LinearSocket; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SSLSocketChannelWrapper; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.net.SSLSocketChannelWrapper; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.statechans.LinearSocket; +import org.scribble.runtime.util.Buf; import betty16.lec2.smtp.Smtp.Smtp.Smtp; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.EndSocket; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_1; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_4; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_6; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.ioifaces.Branch_C_S_250__S_250d; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.ioifaces.Case_C_S_250__S_250d; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.ioifaces.Select_C_S_Ehlo; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.ioifaces.Succ_In_S_250; import betty16.lec2.smtp.Smtp.Smtp.roles.C; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.EndSocket; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_1; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_4; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_6; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.ioifaces.Branch_C_S_250__S_250d; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.ioifaces.Case_C_S_250__S_250d; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.ioifaces.Select_C_S_Ehlo; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.ioifaces.Succ_In_S_250; import betty16.lec2.smtp.message.SmtpMessageFormatter; import betty16.lec2.smtp.message.client.Ehlo; import betty16.lec2.smtp.message.client.Quit; @@ -47,8 +47,9 @@ public static void main(String[] args) throws Exception { int port = 25; Smtp smtp = new Smtp(); - try (MPSTEndpoint client = new MPSTEndpoint<>(smtp, C, new SmtpMessageFormatter())) { - client.connect(S, SocketChannelEndpoint::new, host, port); + try (MPSTEndpoint client = new MPSTEndpoint<>(smtp, C, + new SmtpMessageFormatter())) { + client.request(S, SocketChannelEndpoint::new, host, port); new SmtpC3().run(new Smtp_C_1(client)); } } diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC4.java b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC4.java index 239400b09..b9268d0f6 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC4.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC4.java @@ -18,22 +18,22 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.scribsock.LinearSocket; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SSLSocketChannelWrapper; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.net.SSLSocketChannelWrapper; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.statechans.LinearSocket; +import org.scribble.runtime.util.Buf; import betty16.lec2.smtp.Smtp.Smtp.Smtp; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_1; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_3; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_3_Handler; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_4; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_7; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_7_Handler; -import betty16.lec2.smtp.Smtp.Smtp.channels.C.Smtp_C_8; import betty16.lec2.smtp.Smtp.Smtp.roles.C; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_1; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_3; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_3_Handler; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_4; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_7; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_7_Handler; +import betty16.lec2.smtp.Smtp.Smtp.statechans.C.Smtp_C_8; import betty16.lec2.smtp.message.SmtpMessageFormatter; import betty16.lec2.smtp.message.client.Ehlo; import betty16.lec2.smtp.message.client.Quit; @@ -49,9 +49,10 @@ public static void main(String[] args) throws Exception int port = 25; Smtp smtp = new Smtp(); - try (MPSTEndpoint client = new MPSTEndpoint<>(smtp, Smtp.C, new SmtpMessageFormatter())) + try (MPSTEndpoint client = new MPSTEndpoint<>(smtp, Smtp.C, + new SmtpMessageFormatter())) { - client.connect(S, SocketChannelEndpoint::new, host, port); + client.request(S, SocketChannelEndpoint::new, host, port); new SmtpC4().run(new Smtp_C_1(client)); } } @@ -67,7 +68,7 @@ private void run(Smtp_C_1 c1) throws Exception { class MySmtp_C_3Handler implements Smtp_C_3_Handler { @Override - public void receive(Smtp_C_3 s3, betty16.lec2.smtp.Smtp.Smtp.ops._250d op, Buf<_250d> arg) throws ScribbleRuntimeException, IOException, ClassNotFoundException + public void receive(Smtp_C_3 s3, betty16.lec2.smtp.Smtp.Smtp.ops._250d op, Buf<_250d> arg) throws ScribRuntimeException, IOException, ClassNotFoundException { System.out.println("250-: " + arg.val.getBody()); @@ -75,7 +76,7 @@ public void receive(Smtp_C_3 s3, betty16.lec2.smtp.Smtp.Smtp.ops._250d op, Buf<_ } @Override - public void receive(Smtp_C_4 s4, betty16.lec2.smtp.Smtp.Smtp.ops._250 op, Buf<_250> arg) throws ScribbleRuntimeException, IOException, ClassNotFoundException + public void receive(Smtp_C_4 s4, betty16.lec2.smtp.Smtp.Smtp.ops._250 op, Buf<_250> arg) throws ScribRuntimeException, IOException, ClassNotFoundException { System.out.println("250: " + arg.val.getBody()); @@ -89,7 +90,7 @@ public void receive(Smtp_C_4 s4, betty16.lec2.smtp.Smtp.Smtp.ops._250 op, Buf<_2 class MySmtp_C_8Handler implements Smtp_C_7_Handler { @Override - public void receive(Smtp_C_7 s7, betty16.lec2.smtp.Smtp.Smtp.ops._250d op, Buf<_250d> arg) throws ScribbleRuntimeException, IOException, ClassNotFoundException + public void receive(Smtp_C_7 s7, betty16.lec2.smtp.Smtp.Smtp.ops._250d op, Buf<_250d> arg) throws ScribRuntimeException, IOException, ClassNotFoundException { System.out.println("(TLS) 250-: " + arg.val.getBody()); @@ -97,7 +98,7 @@ public void receive(Smtp_C_7 s7, betty16.lec2.smtp.Smtp.Smtp.ops._250d op, Buf<_ } @Override - public void receive(Smtp_C_8 s8, betty16.lec2.smtp.Smtp.Smtp.ops._250 op, Buf<_250> arg) throws ScribbleRuntimeException, IOException, ClassNotFoundException + public void receive(Smtp_C_8 s8, betty16.lec2.smtp.Smtp.Smtp.ops._250 op, Buf<_250> arg) throws ScribRuntimeException, IOException, ClassNotFoundException { System.out.println("(TLS) 250: " + arg.val.getBody()); diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/message/SmtpMessage.java b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/message/SmtpMessage.java index c45a3873c..b2c5f5b81 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/message/SmtpMessage.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/message/SmtpMessage.java @@ -13,8 +13,8 @@ */ package betty16.lec2.smtp.message; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.type.name.Op; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.core.type.name.Op; import org.scribble.util.Caller; import betty16.lec2.smtp.Smtp.Smtp.Smtp; diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/message/SmtpMessageFormatter.java b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/message/SmtpMessageFormatter.java index 83edfb65f..9540ae25e 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/message/SmtpMessageFormatter.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/message/SmtpMessageFormatter.java @@ -19,8 +19,8 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.runtime.net.ScribMessageFormatter; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.runtime.message.ScribMessageFormatter; import betty16.lec2.smtp.message.server._220; import betty16.lec2.smtp.message.server._250; diff --git a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/HttpLongC.java b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/HttpLongC.java index 06b76dce3..5f73c988c 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/HttpLongC.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/HttpLongC.java @@ -30,18 +30,18 @@ import static bettybook.http.longv.HttpLong.Http.Http._200; import static bettybook.http.longv.HttpLong.Http.Http._404; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import bettybook.http.longv.HttpLong.Http.Http; -import bettybook.http.longv.HttpLong.Http.channels.C.EndSocket; -import bettybook.http.longv.HttpLong.Http.channels.C.Http_C_1; -import bettybook.http.longv.HttpLong.Http.channels.C.Http_C_3; -import bettybook.http.longv.HttpLong.Http.channels.C.Http_C_4_Cases; -import bettybook.http.longv.HttpLong.Http.channels.C.Http_C_5; -import bettybook.http.longv.HttpLong.Http.channels.C.Http_C_5_Cases; import bettybook.http.longv.HttpLong.Http.roles.C; +import bettybook.http.longv.HttpLong.Http.statechans.C.EndSocket; +import bettybook.http.longv.HttpLong.Http.statechans.C.Http_C_1; +import bettybook.http.longv.HttpLong.Http.statechans.C.Http_C_3; +import bettybook.http.longv.HttpLong.Http.statechans.C.Http_C_4_Cases; +import bettybook.http.longv.HttpLong.Http.statechans.C.Http_C_5; +import bettybook.http.longv.HttpLong.Http.statechans.C.Http_C_5_Cases; import bettybook.http.longv.message.Body; import bettybook.http.longv.message.HttpLongMessageFormatter; import bettybook.http.longv.message.client.Host; @@ -51,21 +51,23 @@ public class HttpLongC { public static void main(String[] args) throws Exception { Http http = new Http(); - try (MPSTEndpoint client = new MPSTEndpoint<>(http, C, new HttpLongMessageFormatter())) { - String host = "www.doc.ic.ac.uk"; int port = 80; - //String host = "localhost"; int port = 8080; + try (MPSTEndpoint client = new MPSTEndpoint<>(http, C, + new HttpLongMessageFormatter())) { + String host = "www.doc.ic.ac.uk"; int port = 80; String file = "/~rhu/"; + //String host = "example.com"; int port = 80; String file = "/"; + //String host = "localhost"; int port = 8080; String file = "/"; - client.connect(S, SocketChannelEndpoint::new, host, port); - new HttpLongC().run(new Http_C_1(client), host); + client.request(S, SocketChannelEndpoint::new, host, port); + new HttpLongC().run(new Http_C_1(client), host, file); } } - public void run(Http_C_1 s1, String host) throws Exception { - doResponse(doRequest(s1, host)); + public void run(Http_C_1 s1, String host, String file) throws Exception { + doResponse(doRequest(s1, host, file)); } - private Http_C_3 doRequest(Http_C_1 s1, String host) throws Exception { - return s1.send(S, new RequestLine("/~rhu/", "1.1")) + private Http_C_3 doRequest(Http_C_1 s1, String host, String file) throws Exception { + return s1.send(S, new RequestLine(file, "1.1")) .send(S, new Host(host)) .send(S, new Body("")); } diff --git a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/HttpLongS.java b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/HttpLongS.java index bad1e886f..5fd4ceefa 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/HttpLongS.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/HttpLongS.java @@ -28,17 +28,17 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import bettybook.http.longv.HttpLong.Http.Http; -import bettybook.http.longv.HttpLong.Http.channels.S.Http_S_1; -import bettybook.http.longv.HttpLong.Http.channels.S.Http_S_2; -import bettybook.http.longv.HttpLong.Http.channels.S.Http_S_2_Cases; import bettybook.http.longv.HttpLong.Http.roles.S; +import bettybook.http.longv.HttpLong.Http.statechans.S.Http_S_1; +import bettybook.http.longv.HttpLong.Http.statechans.S.Http_S_2; +import bettybook.http.longv.HttpLong.Http.statechans.S.Http_S_2_Cases; import bettybook.http.longv.message.Body; import bettybook.http.longv.message.HttpLongMessageFormatter; import bettybook.http.longv.message.server.ContentLength; @@ -52,12 +52,13 @@ public static void main(String[] args) throws Exception try (ScribServerSocket ss = new SocketChannelServer(8080)) { while (true) { Http http = new Http(); - try (MPSTEndpoint server = new MPSTEndpoint<>(http, S, new HttpLongMessageFormatter())) { + try (MPSTEndpoint server = new MPSTEndpoint<>(http, S, + new HttpLongMessageFormatter())) { server.accept(ss, C); run(new Http_S_1(server)); } - catch (IOException | ClassNotFoundException | ScribbleRuntimeException e) + catch (IOException | ClassNotFoundException | ScribRuntimeException e) { e.printStackTrace(); } @@ -65,7 +66,8 @@ public static void main(String[] args) throws Exception } } - private static void run(Http_S_1 s1) throws ClassNotFoundException, ScribbleRuntimeException, IOException { + private static void run(Http_S_1 s1) + throws ClassNotFoundException, ScribRuntimeException, IOException { Buf buf = new Buf<>(); Http_S_2 s2 = s1.receive(C, RequestL, buf); diff --git a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/HeaderField.java b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/HeaderField.java index f16fdd3a7..9ea724145 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/HeaderField.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/HeaderField.java @@ -13,7 +13,7 @@ */ package bettybook.http.longv.message; -import org.scribble.sesstype.name.Op; +import org.scribble.core.type.name.Op; public abstract class HeaderField extends HttpLongMessage { diff --git a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/HttpLongMessage.java b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/HttpLongMessage.java index ce00a3b3c..7b4cce573 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/HttpLongMessage.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/HttpLongMessage.java @@ -13,8 +13,8 @@ */ package bettybook.http.longv.message; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.sesstype.name.Op; +import org.scribble.core.type.name.Op; +import org.scribble.runtime.message.ScribMessage; import bettybook.http.longv.HttpLong.Http.Http; diff --git a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/HttpLongMessageFormatter.java b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/HttpLongMessageFormatter.java index 300bc30be..a01fb92b3 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/HttpLongMessageFormatter.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/HttpLongMessageFormatter.java @@ -19,8 +19,8 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.runtime.net.ScribMessageFormatter; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.runtime.message.ScribMessageFormatter; import bettybook.http.longv.message.client.Accept; import bettybook.http.longv.message.client.AcceptEncoding; diff --git a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/StartLine.java b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/StartLine.java index 976806fd5..ac7122583 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/StartLine.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/StartLine.java @@ -13,7 +13,7 @@ */ package bettybook.http.longv.message; -import org.scribble.sesstype.name.Op; +import org.scribble.core.type.name.Op; public abstract class StartLine extends HttpLongMessage { diff --git a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/server/StatusCode.java b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/server/StatusCode.java index ca6c1d29a..f2216df9e 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/server/StatusCode.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/server/StatusCode.java @@ -13,7 +13,7 @@ */ package bettybook.http.longv.message.server; -import org.scribble.sesstype.name.Op; +import org.scribble.core.type.name.Op; import bettybook.http.longv.message.HttpLongMessage; diff --git a/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShortC.java b/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShortC.java index 81154027b..6f4f8d44b 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShortC.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShortC.java @@ -17,37 +17,41 @@ import static bettybook.http.shortv.HttpShort.Http.Http.Resp; import static bettybook.http.shortv.HttpShort.Http.Http.S; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import bettybook.http.shortv.HttpShort.Http.Http; -import bettybook.http.shortv.HttpShort.Http.channels.C.Http_C_1; import bettybook.http.shortv.HttpShort.Http.roles.C; +import bettybook.http.shortv.HttpShort.Http.statechans.C.Http_C_1; import bettybook.http.shortv.message.HttpShortMessageFormatter; import bettybook.http.shortv.message.client.Req; import bettybook.http.shortv.message.server.Resp; public class HttpShortC { - public static void main(String[] args) throws Exception { + public static void main(String[] args) throws Exception + { Http http = new Http(); - try (MPSTEndpoint client = new MPSTEndpoint<>(http, C, new HttpShortMessageFormatter())) { - String host = "www.doc.ic.ac.uk"; int port = 80; - //String host = "summerschool2016.behavioural-types.eu"; int port = 80; - //String host = "localhost"; int port = 8080; - - client.connect(S, SocketChannelEndpoint::new, host, port); - new HttpShortC().run(client, host); + try (MPSTEndpoint client = new MPSTEndpoint<>(http, C, + new HttpShortMessageFormatter())) + { + String host = "www.doc.ic.ac.uk"; int port = 80; String file = "/~rhu/"; + //String host = "example.com"; int port = 80; String file = "/"; + //String host = "localhost"; int port = 8080; String file = "/"; + + client.request(S, SocketChannelEndpoint::new, host, port); + new HttpShortC().run(client, host, file); } } - private void run(MPSTEndpoint client, String host) throws Exception { + private void run(MPSTEndpoint client, String host, String file) throws Exception + { Buf buf = new Buf<>(); Http_C_1 c = new Http_C_1(client); - c.send(S, new Req("/~rhu/", "1.1", host)) + c.send(S, new Req(file, "1.1", host)) .receive(S, Resp, buf); diff --git a/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShortS.java b/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShortS.java index 16b46384d..0ff18c669 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShortS.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShortS.java @@ -19,32 +19,36 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import bettybook.http.shortv.HttpShort.Http.Http; -import bettybook.http.shortv.HttpShort.Http.channels.S.Http_S_1; -import bettybook.http.shortv.HttpShort.Http.channels.S.Http_S_2; import bettybook.http.shortv.HttpShort.Http.roles.S; +import bettybook.http.shortv.HttpShort.Http.statechans.S.Http_S_1; +import bettybook.http.shortv.HttpShort.Http.statechans.S.Http_S_2; import bettybook.http.shortv.message.HttpShortMessageFormatter; import bettybook.http.shortv.message.client.Req; import bettybook.http.shortv.message.server.Resp; public class HttpShortS { - public static void main(String[] args) throws IOException { - try (ScribServerSocket ss = new SocketChannelServer(8080)) { - while (true) { + public static void main(String[] args) throws IOException + { + try (ScribServerSocket ss = new SocketChannelServer(8080)) + { + while (true) + { Http http = new Http(); - try (MPSTEndpoint server = new MPSTEndpoint<>(http, S, new HttpShortMessageFormatter())) { + try (MPSTEndpoint server = new MPSTEndpoint<>(http, S, + new HttpShortMessageFormatter())) { server.accept(ss, C); run(new Http_S_1(server)); } - catch (IOException | ClassNotFoundException | ScribbleRuntimeException e) + catch (IOException | ClassNotFoundException | ScribRuntimeException e) { e.printStackTrace(); } @@ -52,7 +56,9 @@ public static void main(String[] args) throws IOException { } } - private static void run(Http_S_1 s1) throws ClassNotFoundException, ScribbleRuntimeException, IOException { + private static void run(Http_S_1 s1) + throws ClassNotFoundException, ScribRuntimeException, IOException + { Buf buf = new Buf<>(); Http_S_2 s2 = s1.receive(C, Req, buf); diff --git a/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/message/HttpShortMessage.java b/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/message/HttpShortMessage.java index 23a17ad6e..e31d5e111 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/message/HttpShortMessage.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/message/HttpShortMessage.java @@ -13,8 +13,8 @@ */ package bettybook.http.shortv.message; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.sesstype.name.Op; +import org.scribble.core.type.name.Op; +import org.scribble.runtime.message.ScribMessage; import bettybook.http.shortv.HttpShort.Http.Http; diff --git a/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/message/HttpShortMessageFormatter.java b/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/message/HttpShortMessageFormatter.java index 7cb02a27e..28f83dabb 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/message/HttpShortMessageFormatter.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/message/HttpShortMessageFormatter.java @@ -20,8 +20,8 @@ import java.nio.charset.Charset; import java.util.Arrays; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.runtime.net.ScribMessageFormatter; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.runtime.message.ScribMessageFormatter; import bettybook.http.shortv.message.client.Req; import bettybook.http.shortv.message.server.Resp; diff --git a/scribble-demos/scrib/bettybook/src/bettybook/math/scrib/MathC.java b/scribble-demos/scrib/bettybook/src/bettybook/math/scrib/MathC.java index 9c009052d..872078e5e 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/math/scrib/MathC.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/math/scrib/MathC.java @@ -22,15 +22,15 @@ import static bettybook.math.scrib.Math.MathService.MathService.Sum; import static bettybook.math.scrib.Math.MathService.MathService.Val; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import bettybook.math.scrib.Math.MathService.MathService; -import bettybook.math.scrib.Math.MathService.channels.C.EndSocket; -import bettybook.math.scrib.Math.MathService.channels.C.MathService_C_1; import bettybook.math.scrib.Math.MathService.roles.C; +import bettybook.math.scrib.Math.MathService.statechans.C.EndSocket; +import bettybook.math.scrib.Math.MathService.statechans.C.MathService_C_1; public class MathC { @@ -44,9 +44,9 @@ private int facto(int n) throws Exception { Buf i = new Buf<>(n), res = new Buf<>(i.val); MathService sess = new MathService(); - try (MPSTEndpoint se = new MPSTEndpoint<>(sess, C, new ObjectStreamFormatter())) - { - se.connect(S, SocketChannelEndpoint::new, "localhost", 8888); + try (MPSTEndpoint se = new MPSTEndpoint<>(sess, C, + new ObjectStreamFormatter())) { + se.request(S, SocketChannelEndpoint::new, "localhost", 8888); MathService_C_1 s1 = new MathService_C_1(se); @@ -86,7 +86,7 @@ private int fibo(int i) throws Exception MathService sess = new MathService(); try (MPSTEndpoint se = new MPSTEndpoint<>(sess, C, new ObjectStreamFormatter())) { - se.connect(S, SocketChannelEndpoint::new, "localhost", 8888); + se.request(S, SocketChannelEndpoint::new, "localhost", 8888); fibo(new MathService_C_1(se), i1, i2, new Buf<>(i)); diff --git a/scribble-demos/scrib/bettybook/src/bettybook/math/scrib/MathS1.java b/scribble-demos/scrib/bettybook/src/bettybook/math/scrib/MathS1.java index 04ca384ac..eabcd55b8 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/math/scrib/MathS1.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/math/scrib/MathS1.java @@ -22,17 +22,17 @@ import static bettybook.math.scrib.Math.MathService.MathService.Sum; import static bettybook.math.scrib.Math.MathService.MathService.Val; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import bettybook.math.scrib.Math.MathService.MathService; -import bettybook.math.scrib.Math.MathService.channels.S.MathService_S_1; -import bettybook.math.scrib.Math.MathService.channels.S.MathService_S_1_Cases; -import bettybook.math.scrib.Math.MathService.channels.S.MathService_S_2_Cases; import bettybook.math.scrib.Math.MathService.roles.S; +import bettybook.math.scrib.Math.MathService.statechans.S.MathService_S_1; +import bettybook.math.scrib.Math.MathService.statechans.S.MathService_S_1_Cases; +import bettybook.math.scrib.Math.MathService.statechans.S.MathService_S_2_Cases; public class MathS1 { @@ -48,8 +48,8 @@ private void run() throws Exception while (true) { MathService sess = new MathService(); - try (MPSTEndpoint se = new MPSTEndpoint<>(sess, S, new ObjectStreamFormatter())) - { + try (MPSTEndpoint se = new MPSTEndpoint<>(sess, S, + new ObjectStreamFormatter())) { se.accept(ss, C); Buf b1 = new Buf<>(); Buf b2 = new Buf<>(); diff --git a/scribble-demos/scrib/bettybook/src/bettybook/math/scrib/MathS2.java b/scribble-demos/scrib/bettybook/src/bettybook/math/scrib/MathS2.java index 896c7efba..f670c01e1 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/math/scrib/MathS2.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/math/scrib/MathS2.java @@ -20,26 +20,26 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import bettybook.math.scrib.Math.MathService.MathService; -import bettybook.math.scrib.Math.MathService.channels.S.EndSocket; -import bettybook.math.scrib.Math.MathService.channels.S.MathService_S_1; -import bettybook.math.scrib.Math.MathService.channels.S.MathService_S_1_Handler; -import bettybook.math.scrib.Math.MathService.channels.S.MathService_S_2; -import bettybook.math.scrib.Math.MathService.channels.S.MathService_S_2_Handler; -import bettybook.math.scrib.Math.MathService.channels.S.MathService_S_3; -import bettybook.math.scrib.Math.MathService.channels.S.MathService_S_4; import bettybook.math.scrib.Math.MathService.ops.Add; import bettybook.math.scrib.Math.MathService.ops.Bye; import bettybook.math.scrib.Math.MathService.ops.Mult; import bettybook.math.scrib.Math.MathService.ops.Val; import bettybook.math.scrib.Math.MathService.roles.S; +import bettybook.math.scrib.Math.MathService.statechans.S.EndSocket; +import bettybook.math.scrib.Math.MathService.statechans.S.MathService_S_1; +import bettybook.math.scrib.Math.MathService.statechans.S.MathService_S_1_Handler; +import bettybook.math.scrib.Math.MathService.statechans.S.MathService_S_2; +import bettybook.math.scrib.Math.MathService.statechans.S.MathService_S_2_Handler; +import bettybook.math.scrib.Math.MathService.statechans.S.MathService_S_3; +import bettybook.math.scrib.Math.MathService.statechans.S.MathService_S_4; public class MathS2 { @@ -50,8 +50,8 @@ public static void main(String[] args) throws Exception while (true) { MathService sess = new MathService(); - try (MPSTEndpoint se = new MPSTEndpoint<>(sess, S, new ObjectStreamFormatter())) - { + try (MPSTEndpoint se = new MPSTEndpoint<>(sess, S, + new ObjectStreamFormatter())) { se.accept(ss, C); MathService_S_1 s1 = new MathService_S_1(se); @@ -69,14 +69,14 @@ class MathSHandler implements MathService_S_1_Handler, MathService_S_2_Handler @Override public void receive(MathService_S_2 s2, Val op, Buf b1) - throws ScribbleRuntimeException, IOException, ClassNotFoundException + throws ScribRuntimeException, IOException, ClassNotFoundException { this.b1 = b1; s2.branch(C, this); } @Override - public void receive(EndSocket end, Bye op) throws ScribbleRuntimeException, + public void receive(EndSocket end, Bye op) throws ScribRuntimeException, IOException, ClassNotFoundException { @@ -84,14 +84,14 @@ public void receive(EndSocket end, Bye op) throws ScribbleRuntimeException, @Override public void receive(MathService_S_3 s3, Add op, Buf b2) - throws ScribbleRuntimeException, IOException, ClassNotFoundException + throws ScribRuntimeException, IOException, ClassNotFoundException { s3.send(C, Sum, this.b1.val + b2.val).branch(C, this); } @Override public void receive(MathService_S_4 s4, Mult op, Buf b2) - throws ScribbleRuntimeException, IOException, ClassNotFoundException + throws ScribRuntimeException, IOException, ClassNotFoundException { s4.send(C, Prod, this.b1.val * b2.val).branch(C, this); } diff --git a/scribble-demos/scrib/http/src/http/longvers/HttpLongC.java b/scribble-demos/scrib/http/src/http/longvers/HttpLongC.java index f015d0a0f..f38391cf0 100644 --- a/scribble-demos/scrib/http/src/http/longvers/HttpLongC.java +++ b/scribble-demos/scrib/http/src/http/longvers/HttpLongC.java @@ -52,6 +52,13 @@ import http.longvers.message.server.HttpVersion; import http.longvers.message.server.Server; + +/** TODO + * + * Cannot parse header field: Cache-Control: max-age=604800 + * at http.longvers.message.HttpLongMessageFormatter.fromBytes(HttpLongMessageFormatter.java:198) + */ + public class HttpLongC { public HttpLongC() throws Exception @@ -67,22 +74,24 @@ public static void main(String[] args) throws Exception public void run() throws Exception { Http http = new Http(); - try (MPSTEndpoint client = new MPSTEndpoint<>(http, C, new HttpLongMessageFormatter())) - { - String host = "www.doc.ic.ac.uk"; int port = 80; - //String host = "localhost"; int port = 8080; + try (MPSTEndpoint client = new MPSTEndpoint<>(http, C, + new HttpLongMessageFormatter())) { + + String host = "www.doc.ic.ac.uk"; int port = 80; String file = "/~rhu/"; + //String host = "example.com"; int port = 80; String file = "/~rhu/"; + //String host = "localhost"; int port = 8080; String file = "/"; client.request(S, SocketChannelEndpoint::new, host, port); doResponse( - doRequest(new Http_C_1(client), host) + doRequest(new Http_C_1(client), host, file) ); } } - private Http_C_3 doRequest(Http_C_1 s1, String host) throws Exception + private Http_C_3 doRequest(Http_C_1 s1, String host, String file) throws Exception { - return s1.send(S, new RequestLine("/~rhu/", "1.1")) + return s1.send(S, new RequestLine(file, "1.1")) .send(S, new Host(host)) .send(S, new Body("")); } diff --git a/scribble-demos/scrib/http/src/http/longvers/message/HeaderField.java b/scribble-demos/scrib/http/src/http/longvers/message/HeaderField.java index f3b3e856c..0c6774462 100644 --- a/scribble-demos/scrib/http/src/http/longvers/message/HeaderField.java +++ b/scribble-demos/scrib/http/src/http/longvers/message/HeaderField.java @@ -13,7 +13,7 @@ */ package http.longvers.message; -import org.scribble.type.name.Op; +import org.scribble.core.type.name.Op; public abstract class HeaderField extends HttpLongMessage { diff --git a/scribble-demos/scrib/http/src/http/longvers/message/HttpLongMessage.java b/scribble-demos/scrib/http/src/http/longvers/message/HttpLongMessage.java index 661e6926a..2dea67fc9 100644 --- a/scribble-demos/scrib/http/src/http/longvers/message/HttpLongMessage.java +++ b/scribble-demos/scrib/http/src/http/longvers/message/HttpLongMessage.java @@ -14,7 +14,7 @@ package http.longvers.message; import org.scribble.runtime.message.ScribMessage; -import org.scribble.type.name.Op; +import org.scribble.core.type.name.Op; import http.longvers.HttpLong.Http.Http; diff --git a/scribble-demos/scrib/http/src/http/longvers/message/StartLine.java b/scribble-demos/scrib/http/src/http/longvers/message/StartLine.java index 99e62c280..54d86be69 100644 --- a/scribble-demos/scrib/http/src/http/longvers/message/StartLine.java +++ b/scribble-demos/scrib/http/src/http/longvers/message/StartLine.java @@ -13,7 +13,7 @@ */ package http.longvers.message; -import org.scribble.type.name.Op; +import org.scribble.core.type.name.Op; public abstract class StartLine extends HttpLongMessage { diff --git a/scribble-demos/scrib/http/src/http/longvers/message/server/StatusCode.java b/scribble-demos/scrib/http/src/http/longvers/message/server/StatusCode.java index 82f04a166..730d707cf 100644 --- a/scribble-demos/scrib/http/src/http/longvers/message/server/StatusCode.java +++ b/scribble-demos/scrib/http/src/http/longvers/message/server/StatusCode.java @@ -13,7 +13,7 @@ */ package http.longvers.message.server; -import org.scribble.type.name.Op; +import org.scribble.core.type.name.Op; import http.longvers.message.HttpLongMessage; diff --git a/scribble-demos/scrib/http/src/http/shortvers/HttpShortC.java b/scribble-demos/scrib/http/src/http/shortvers/HttpShortC.java index 5ed8838e6..9a36d352c 100644 --- a/scribble-demos/scrib/http/src/http/shortvers/HttpShortC.java +++ b/scribble-demos/scrib/http/src/http/shortvers/HttpShortC.java @@ -45,14 +45,15 @@ public void run() throws Exception Http http = new Http(); try (MPSTEndpoint client = new MPSTEndpoint<>(http, C, new HttpShortMessageFormatter())) { - String host = "www.doc.ic.ac.uk"; int port = 80; - //String host = "localhost"; int port = 8080; + //String host = "www.doc.ic.ac.uk"; int port = 80; String file = "/~rhu/"; + //String host = "example.com"; int port = 80; String file = "/"; + String host = "localhost"; int port = 8080; String file = "/"; client.request(S, SocketChannelEndpoint::new, host, port); Buf buf = new Buf<>(); new Http_C_1(client) - .send(S, new Request("/~rhu/", "1.1", host)) + .send(S, new Request(file, "1.1", host)) .receive(S, RESPONSE, buf); System.out.println("Response:\n" + buf.val); diff --git a/scribble-demos/scrib/http/src/http/shortvers/HttpShortS.java b/scribble-demos/scrib/http/src/http/shortvers/HttpShortS.java index 014df49d8..433c761eb 100644 --- a/scribble-demos/scrib/http/src/http/shortvers/HttpShortS.java +++ b/scribble-demos/scrib/http/src/http/shortvers/HttpShortS.java @@ -19,16 +19,16 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.util.Buf; +import org.scribble.main.ScribRuntimeException; import org.scribble.runtime.net.ScribServerSocket; import org.scribble.runtime.net.SocketChannelServer; import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import http.shortvers.HttpShort.Http.Http; +import http.shortvers.HttpShort.Http.roles.S; import http.shortvers.HttpShort.Http.statechans.S.Http_S_1; import http.shortvers.HttpShort.Http.statechans.S.Http_S_2; -import http.shortvers.HttpShort.Http.roles.S; import http.shortvers.message.HttpShortMessageFormatter; import http.shortvers.message.client.Request; import http.shortvers.message.server.Response; @@ -48,7 +48,8 @@ public static void main(String[] args) throws IOException while (true) { Http http = new Http(); - try (MPSTEndpoint se = new MPSTEndpoint<>(http, S, new HttpShortMessageFormatter())) + try (MPSTEndpoint se = new MPSTEndpoint<>(http, S, + new HttpShortMessageFormatter())) { se.accept(ss, C); @@ -59,7 +60,7 @@ public static void main(String[] args) throws IOException s2.send(C, new Response("1.1", "Hello")); } - catch (IOException | ClassNotFoundException | ScribbleRuntimeException e) + catch (IOException | ClassNotFoundException | ScribRuntimeException e) { e.printStackTrace(); } diff --git a/scribble-demos/scrib/http/src/http/shortvers/message/HttpShortMessage.java b/scribble-demos/scrib/http/src/http/shortvers/message/HttpShortMessage.java index b1fc73f39..7c452ff0f 100644 --- a/scribble-demos/scrib/http/src/http/shortvers/message/HttpShortMessage.java +++ b/scribble-demos/scrib/http/src/http/shortvers/message/HttpShortMessage.java @@ -14,7 +14,7 @@ package http.shortvers.message; import org.scribble.runtime.message.ScribMessage; -import org.scribble.type.name.Op; +import org.scribble.core.type.name.Op; import http.shortvers.HttpShort.Http.Http; From 2f3953ec56b98a298cca095d44def6c649b764ef Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 8 May 2019 22:39:52 +0100 Subject: [PATCH 489/539] [AllTest] Continued: pass on some scribble-demo. --- .../scrib/coco/src/coco/fibo/FiboA.java | 27 ++++++----- .../scrib/coco/src/coco/fibo/FiboB.java | 19 ++++---- .../coco/src/coco/fibo/FiboBHandler.java | 29 +++++++----- .../scrib/coco/src/coco/smtp/MySmtpC.java | 30 ++++++------ .../scrib/coco/src/coco/smtp/SmtpC1.java | 34 +++++++------- .../scrib/coco/src/coco/smtp/SmtpC2.java | 34 +++++++------- .../scrib/coco/src/coco/smtp/SmtpC3.java | 24 +++++----- .../src/coco/smtp/message/SmtpMessage.java | 4 +- .../smtp/message/SmtpMessageFormatter.java | 4 +- .../scrib/fase16/src/fase16/adder/AdderC.java | 20 ++++---- .../scrib/fase16/src/fase16/adder/AdderS.java | 24 +++++----- .../fase16/src/fase16/adder/MyAdderC.java | 28 ++++++----- .../scrib/fase16/src/fase16/smtp/SmtpC.java | 47 ++++++++++--------- .../src/fase16/smtp/message/SmtpMessage.java | 4 +- .../smtp/message/SmtpMessageFormatter.java | 7 +-- .../scrib/fib/src/fib/AdderClient.java | 35 +++++++------- .../scrib/fib/src/fib/AdderServer.java | 30 +++++++----- .../scrib/fib/src/fib/FibClient.java | 29 +++++++----- scribble-demos/scrib/fib/src/fib/Fibo.java | 44 +++++++++-------- .../scrib/fib/src/fib/MyAdderC.java | 13 ++--- 20 files changed, 260 insertions(+), 226 deletions(-) diff --git a/scribble-demos/scrib/coco/src/coco/fibo/FiboA.java b/scribble-demos/scrib/coco/src/coco/fibo/FiboA.java index 693710fef..27fd0338c 100644 --- a/scribble-demos/scrib/coco/src/coco/fibo/FiboA.java +++ b/scribble-demos/scrib/coco/src/coco/fibo/FiboA.java @@ -18,20 +18,20 @@ import static coco.fibo.Fibo.Fibonacci.Fibonacci.fibonacci; import static coco.fibo.Fibo.Fibonacci.Fibonacci.stop; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import coco.fibo.Fibo.Fibonacci.Fibonacci; -import coco.fibo.Fibo.Fibonacci.channels.A.EndSocket; -import coco.fibo.Fibo.Fibonacci.channels.A.Fibonacci_A_1; -import coco.fibo.Fibo.Fibonacci.channels.A.ioifaces.In_B_fibonacci_Long; -import coco.fibo.Fibo.Fibonacci.channels.A.ioifaces.Out_B_fibonacci_Long; -import coco.fibo.Fibo.Fibonacci.channels.A.ioifaces.Out_B_stop; -import coco.fibo.Fibo.Fibonacci.channels.A.ioifaces.Succ_In_B_fibonacci_Long; -import coco.fibo.Fibo.Fibonacci.channels.A.ioifaces.Succ_Out_B_fibonacci_Long; import coco.fibo.Fibo.Fibonacci.roles.A; +import coco.fibo.Fibo.Fibonacci.statechans.A.EndSocket; +import coco.fibo.Fibo.Fibonacci.statechans.A.Fibonacci_A_1; +import coco.fibo.Fibo.Fibonacci.statechans.A.ioifaces.In_B_fibonacci_Long; +import coco.fibo.Fibo.Fibonacci.statechans.A.ioifaces.Out_B_fibonacci_Long; +import coco.fibo.Fibo.Fibonacci.statechans.A.ioifaces.Out_B_stop; +import coco.fibo.Fibo.Fibonacci.statechans.A.ioifaces.Succ_In_B_fibonacci_Long; +import coco.fibo.Fibo.Fibonacci.statechans.A.ioifaces.Succ_Out_B_fibonacci_Long; public class FiboA extends Thread { @@ -47,9 +47,10 @@ public FiboA(Fibonacci fib) public void run() { int n = 19; - try (MPSTEndpoint se = new MPSTEndpoint<>(this.fib, A, new ObjectStreamFormatter())) + try (MPSTEndpoint se = new MPSTEndpoint<>(this.fib, A, + new ObjectStreamFormatter())) { - se.connect(B, SocketChannelEndpoint::new, "localhost", 8888); + se.request(B, SocketChannelEndpoint::new, "localhost", 8888); run(new Fibonacci_A_1(se), n); // 4184 System.out.println("A #" + n + ": " + this.b.val); } diff --git a/scribble-demos/scrib/coco/src/coco/fibo/FiboB.java b/scribble-demos/scrib/coco/src/coco/fibo/FiboB.java index 7d46ae065..139d9b216 100644 --- a/scribble-demos/scrib/coco/src/coco/fibo/FiboB.java +++ b/scribble-demos/scrib/coco/src/coco/fibo/FiboB.java @@ -18,17 +18,17 @@ import static coco.fibo.Fibo.Fibonacci.Fibonacci.fibonacci; import static coco.fibo.Fibo.Fibonacci.Fibonacci.stop; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import coco.fibo.Fibo.Fibonacci.Fibonacci; -import coco.fibo.Fibo.Fibonacci.channels.B.EndSocket; -import coco.fibo.Fibo.Fibonacci.channels.B.Fibonacci_B_1; -import coco.fibo.Fibo.Fibonacci.channels.B.Fibonacci_B_1_Cases; import coco.fibo.Fibo.Fibonacci.roles.B; +import coco.fibo.Fibo.Fibonacci.statechans.B.EndSocket; +import coco.fibo.Fibo.Fibonacci.statechans.B.Fibonacci_B_1; +import coco.fibo.Fibo.Fibonacci.statechans.B.Fibonacci_B_1_Cases; public class FiboB extends Thread { @@ -45,7 +45,8 @@ public void run() { try ( ScribServerSocket ss = new SocketChannelServer(8888); - MPSTEndpoint se = new MPSTEndpoint<>(this.fib, B, new ObjectStreamFormatter())) + MPSTEndpoint se = new MPSTEndpoint<>(this.fib, B, + new ObjectStreamFormatter())) { se.accept(ss, A); run(new Fibonacci_B_1(se)); diff --git a/scribble-demos/scrib/coco/src/coco/fibo/FiboBHandler.java b/scribble-demos/scrib/coco/src/coco/fibo/FiboBHandler.java index 242a65222..c46a00027 100644 --- a/scribble-demos/scrib/coco/src/coco/fibo/FiboBHandler.java +++ b/scribble-demos/scrib/coco/src/coco/fibo/FiboBHandler.java @@ -19,21 +19,21 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import coco.fibo.Fibo.Fibonacci.Fibonacci; -import coco.fibo.Fibo.Fibonacci.channels.B.EndSocket; -import coco.fibo.Fibo.Fibonacci.channels.B.Fibonacci_B_1; -import coco.fibo.Fibo.Fibonacci.channels.B.Fibonacci_B_1_Handler; -import coco.fibo.Fibo.Fibonacci.channels.B.Fibonacci_B_2; import coco.fibo.Fibo.Fibonacci.ops.fibonacci; import coco.fibo.Fibo.Fibonacci.ops.stop; import coco.fibo.Fibo.Fibonacci.roles.B; +import coco.fibo.Fibo.Fibonacci.statechans.B.EndSocket; +import coco.fibo.Fibo.Fibonacci.statechans.B.Fibonacci_B_1; +import coco.fibo.Fibo.Fibonacci.statechans.B.Fibonacci_B_1_Handler; +import coco.fibo.Fibo.Fibonacci.statechans.B.Fibonacci_B_2; public class FiboBHandler extends Thread implements Fibonacci_B_1_Handler { @@ -50,7 +50,8 @@ public void run() { try ( ScribServerSocket ss = new SocketChannelServer(8888); - MPSTEndpoint se = new MPSTEndpoint<>(this.fib, B, new ObjectStreamFormatter())) + MPSTEndpoint se = new MPSTEndpoint<>(this.fib, B, + new ObjectStreamFormatter())) { se.accept(ss, A); new Fibonacci_B_1(se).branch(A, this); @@ -64,13 +65,15 @@ public void run() } /*/ @Override - public void receive(Fibonacci_B_2 s2, fibonacci op, Buf arg1) throws ScribbleRuntimeException, IOException, ClassNotFoundException + public void receive(Fibonacci_B_2 s2, fibonacci op, Buf arg1) + throws ScribRuntimeException, IOException, ClassNotFoundException { s2.send(A, fibonacci, (this.x += arg1.val)).branch(A, this); } @Override - public void receive(EndSocket end, stop op) throws ScribbleRuntimeException, IOException, ClassNotFoundException + public void receive(EndSocket end, stop op) + throws ScribRuntimeException, IOException, ClassNotFoundException { //System.out.println("B done: " + this.x); } diff --git a/scribble-demos/scrib/coco/src/coco/smtp/MySmtpC.java b/scribble-demos/scrib/coco/src/coco/smtp/MySmtpC.java index 9462f1d53..8039da897 100644 --- a/scribble-demos/scrib/coco/src/coco/smtp/MySmtpC.java +++ b/scribble-demos/scrib/coco/src/coco/smtp/MySmtpC.java @@ -19,21 +19,21 @@ import static coco.smtp.Smtp.Smtp.Smtp.S; import static coco.smtp.Smtp.Smtp.Smtp._220; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.scribsock.LinearSocket; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SSLSocketChannelWrapper; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.net.SSLSocketChannelWrapper; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.statechans.LinearSocket; +import org.scribble.runtime.util.Buf; import coco.smtp.Smtp.Smtp.Smtp; -import coco.smtp.Smtp.Smtp.channels.C.Smtp_C_1; -import coco.smtp.Smtp.Smtp.channels.C.ioifaces.Out_S_Ehlo; -import coco.smtp.Smtp.Smtp.channels.C.ioifaces.Receive_C_S_220; -import coco.smtp.Smtp.Smtp.channels.C.ioifaces.Select_C_S_Ehlo; -import coco.smtp.Smtp.Smtp.channels.C.ioifaces.Select_C_S_Quit; -import coco.smtp.Smtp.Smtp.channels.C.ioifaces.Select_C_S_StartTls; -import coco.smtp.Smtp.Smtp.channels.C.ioifaces.Succ_In_S_250; import coco.smtp.Smtp.Smtp.roles.C; +import coco.smtp.Smtp.Smtp.statechans.C.Smtp_C_1; +import coco.smtp.Smtp.Smtp.statechans.C.ioifaces.Out_S_Ehlo; +import coco.smtp.Smtp.Smtp.statechans.C.ioifaces.Receive_C_S_220; +import coco.smtp.Smtp.Smtp.statechans.C.ioifaces.Select_C_S_Ehlo; +import coco.smtp.Smtp.Smtp.statechans.C.ioifaces.Select_C_S_Quit; +import coco.smtp.Smtp.Smtp.statechans.C.ioifaces.Select_C_S_StartTls; +import coco.smtp.Smtp.Smtp.statechans.C.ioifaces.Succ_In_S_250; import coco.smtp.message.SmtpMessageFormatter; import coco.smtp.message.client.Quit; import coco.smtp.message.client.StartTls; @@ -56,9 +56,9 @@ public void run() throws Exception int port = 25; Smtp smtp = new Smtp(); - try (MPSTEndpoint se = new MPSTEndpoint<>(smtp, C, new SmtpMessageFormatter())) - { - se.connect(S, SocketChannelEndpoint::new, host, port); + try (MPSTEndpoint se = new MPSTEndpoint<>(smtp, C, + new SmtpMessageFormatter())) { + se.request(S, SocketChannelEndpoint::new, host, port); Smtp_C_1 s1 = new Smtp_C_1(se); doInit( diff --git a/scribble-demos/scrib/coco/src/coco/smtp/SmtpC1.java b/scribble-demos/scrib/coco/src/coco/smtp/SmtpC1.java index c416dccf4..60a02e823 100644 --- a/scribble-demos/scrib/coco/src/coco/smtp/SmtpC1.java +++ b/scribble-demos/scrib/coco/src/coco/smtp/SmtpC1.java @@ -22,23 +22,23 @@ import static coco.smtp.Smtp.Smtp.Smtp._250; import static coco.smtp.Smtp.Smtp.Smtp._250d; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.scribsock.LinearSocket; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SSLSocketChannelWrapper; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.net.SSLSocketChannelWrapper; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.statechans.LinearSocket; +import org.scribble.runtime.util.Buf; import coco.smtp.Smtp.Smtp.Smtp; -import coco.smtp.Smtp.Smtp.channels.C.Smtp_C_1; -import coco.smtp.Smtp.Smtp.channels.C.Smtp_C_2; -import coco.smtp.Smtp.Smtp.channels.C.Smtp_C_3; -import coco.smtp.Smtp.Smtp.channels.C.Smtp_C_3_Cases; -import coco.smtp.Smtp.Smtp.channels.C.Smtp_C_4; -import coco.smtp.Smtp.Smtp.channels.C.Smtp_C_6; -import coco.smtp.Smtp.Smtp.channels.C.Smtp_C_7; -import coco.smtp.Smtp.Smtp.channels.C.Smtp_C_7_Cases; -import coco.smtp.Smtp.Smtp.channels.C.Smtp_C_8; import coco.smtp.Smtp.Smtp.roles.C; +import coco.smtp.Smtp.Smtp.statechans.C.Smtp_C_1; +import coco.smtp.Smtp.Smtp.statechans.C.Smtp_C_2; +import coco.smtp.Smtp.Smtp.statechans.C.Smtp_C_3; +import coco.smtp.Smtp.Smtp.statechans.C.Smtp_C_3_Cases; +import coco.smtp.Smtp.Smtp.statechans.C.Smtp_C_4; +import coco.smtp.Smtp.Smtp.statechans.C.Smtp_C_6; +import coco.smtp.Smtp.Smtp.statechans.C.Smtp_C_7; +import coco.smtp.Smtp.Smtp.statechans.C.Smtp_C_7_Cases; +import coco.smtp.Smtp.Smtp.statechans.C.Smtp_C_8; import coco.smtp.message.SmtpMessageFormatter; import coco.smtp.message.client.Ehlo; import coco.smtp.message.client.Quit; @@ -64,9 +64,9 @@ public void run() throws Exception int port = 25; Smtp smtp = new Smtp(); - try (MPSTEndpoint se = new MPSTEndpoint<>(smtp, C, new SmtpMessageFormatter())) - { - se.connect(S, SocketChannelEndpoint::new, host, port); + try (MPSTEndpoint se = new MPSTEndpoint<>(smtp, C, + new SmtpMessageFormatter())) { + se.request(S, SocketChannelEndpoint::new, host, port); Smtp_C_1 s1 = new Smtp_C_1(se); doInit( diff --git a/scribble-demos/scrib/coco/src/coco/smtp/SmtpC2.java b/scribble-demos/scrib/coco/src/coco/smtp/SmtpC2.java index 250b8c2c8..50428ed53 100644 --- a/scribble-demos/scrib/coco/src/coco/smtp/SmtpC2.java +++ b/scribble-demos/scrib/coco/src/coco/smtp/SmtpC2.java @@ -21,23 +21,23 @@ import static coco.smtp.Smtp.Smtp.Smtp._250; import static coco.smtp.Smtp.Smtp.Smtp._250d; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.scribsock.LinearSocket; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SSLSocketChannelWrapper; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.net.SSLSocketChannelWrapper; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.statechans.LinearSocket; +import org.scribble.runtime.util.Buf; import coco.smtp.Smtp.Smtp.Smtp; -import coco.smtp.Smtp.Smtp.channels.C.Smtp_C_1; -import coco.smtp.Smtp.Smtp.channels.C.Smtp_C_1_Future; -import coco.smtp.Smtp.Smtp.channels.C.ioifaces.Branch_C_S_250__S_250d; -import coco.smtp.Smtp.Smtp.channels.C.ioifaces.Case_C_S_250__S_250d; -import coco.smtp.Smtp.Smtp.channels.C.ioifaces.Receive_C_S_220; -import coco.smtp.Smtp.Smtp.channels.C.ioifaces.Select_C_S_Ehlo; -import coco.smtp.Smtp.Smtp.channels.C.ioifaces.Select_C_S_Quit; -import coco.smtp.Smtp.Smtp.channels.C.ioifaces.Select_C_S_StartTls; -import coco.smtp.Smtp.Smtp.channels.C.ioifaces.Succ_In_S_250; import coco.smtp.Smtp.Smtp.roles.C; +import coco.smtp.Smtp.Smtp.statechans.C.Smtp_C_1; +import coco.smtp.Smtp.Smtp.statechans.C.Smtp_C_1_Future; +import coco.smtp.Smtp.Smtp.statechans.C.ioifaces.Branch_C_S_250__S_250d; +import coco.smtp.Smtp.Smtp.statechans.C.ioifaces.Case_C_S_250__S_250d; +import coco.smtp.Smtp.Smtp.statechans.C.ioifaces.Receive_C_S_220; +import coco.smtp.Smtp.Smtp.statechans.C.ioifaces.Select_C_S_Ehlo; +import coco.smtp.Smtp.Smtp.statechans.C.ioifaces.Select_C_S_Quit; +import coco.smtp.Smtp.Smtp.statechans.C.ioifaces.Select_C_S_StartTls; +import coco.smtp.Smtp.Smtp.statechans.C.ioifaces.Succ_In_S_250; import coco.smtp.message.SmtpMessageFormatter; import coco.smtp.message.client.Ehlo; import coco.smtp.message.client.Quit; @@ -63,9 +63,9 @@ public void run() throws Exception int port = 25; Smtp smtp = new Smtp(); - try (MPSTEndpoint se = new MPSTEndpoint<>(smtp, Smtp.C, new SmtpMessageFormatter())) - { - se.connect(Smtp.S, SocketChannelEndpoint::new, host, port); + try (MPSTEndpoint se = new MPSTEndpoint<>(smtp, Smtp.C, + new SmtpMessageFormatter())) { + se.request(Smtp.S, SocketChannelEndpoint::new, host, port); Buf b1 = new Buf<>(); Smtp_C_1 s1 = new Smtp_C_1(se); diff --git a/scribble-demos/scrib/coco/src/coco/smtp/SmtpC3.java b/scribble-demos/scrib/coco/src/coco/smtp/SmtpC3.java index d30a08724..e3b9d93d8 100644 --- a/scribble-demos/scrib/coco/src/coco/smtp/SmtpC3.java +++ b/scribble-demos/scrib/coco/src/coco/smtp/SmtpC3.java @@ -22,20 +22,20 @@ import static coco.smtp.Smtp.Smtp.Smtp._250; import static coco.smtp.Smtp.Smtp.Smtp._250d; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.scribsock.LinearSocket; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SSLSocketChannelWrapper; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.net.SSLSocketChannelWrapper; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.statechans.LinearSocket; +import org.scribble.runtime.util.Buf; import coco.smtp.Smtp.Smtp.Smtp; -import coco.smtp.Smtp.Smtp.channels.C.Smtp_C_1; -import coco.smtp.Smtp.Smtp.channels.C.Smtp_C_1_Future; -import coco.smtp.Smtp.Smtp.channels.C.ioifaces.Branch_C_S_250__S_250d; -import coco.smtp.Smtp.Smtp.channels.C.ioifaces.Case_C_S_250__S_250d; -import coco.smtp.Smtp.Smtp.channels.C.ioifaces.Select_C_S_Ehlo; -import coco.smtp.Smtp.Smtp.channels.C.ioifaces.Succ_In_S_250; import coco.smtp.Smtp.Smtp.roles.C; +import coco.smtp.Smtp.Smtp.statechans.C.Smtp_C_1; +import coco.smtp.Smtp.Smtp.statechans.C.Smtp_C_1_Future; +import coco.smtp.Smtp.Smtp.statechans.C.ioifaces.Branch_C_S_250__S_250d; +import coco.smtp.Smtp.Smtp.statechans.C.ioifaces.Case_C_S_250__S_250d; +import coco.smtp.Smtp.Smtp.statechans.C.ioifaces.Select_C_S_Ehlo; +import coco.smtp.Smtp.Smtp.statechans.C.ioifaces.Succ_In_S_250; import coco.smtp.message.SmtpMessageFormatter; import coco.smtp.message.client.Ehlo; import coco.smtp.message.client.Quit; @@ -64,7 +64,7 @@ public void run() throws Exception Smtp smtp = new Smtp(); try (MPSTEndpoint se = new MPSTEndpoint<>(smtp, C, new SmtpMessageFormatter())) { - se.connect(S, SocketChannelEndpoint::new, host, port); + se.request(S, SocketChannelEndpoint::new, host, port); Smtp_C_1 s1 = new Smtp_C_1(se); Buf b = new Buf<>(); diff --git a/scribble-demos/scrib/coco/src/coco/smtp/message/SmtpMessage.java b/scribble-demos/scrib/coco/src/coco/smtp/message/SmtpMessage.java index ea5c7dc74..ff7499bd9 100644 --- a/scribble-demos/scrib/coco/src/coco/smtp/message/SmtpMessage.java +++ b/scribble-demos/scrib/coco/src/coco/smtp/message/SmtpMessage.java @@ -13,8 +13,8 @@ */ package coco.smtp.message; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.sesstype.name.Op; +import org.scribble.core.type.name.Op; +import org.scribble.runtime.message.ScribMessage; import org.scribble.util.Caller; import coco.smtp.Smtp.Smtp.Smtp; diff --git a/scribble-demos/scrib/coco/src/coco/smtp/message/SmtpMessageFormatter.java b/scribble-demos/scrib/coco/src/coco/smtp/message/SmtpMessageFormatter.java index fb2fb7045..cd010038f 100644 --- a/scribble-demos/scrib/coco/src/coco/smtp/message/SmtpMessageFormatter.java +++ b/scribble-demos/scrib/coco/src/coco/smtp/message/SmtpMessageFormatter.java @@ -19,8 +19,8 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.runtime.net.ScribMessageFormatter; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.runtime.message.ScribMessageFormatter; import coco.smtp.message.server._220; import coco.smtp.message.server._250; diff --git a/scribble-demos/scrib/fase16/src/fase16/adder/AdderC.java b/scribble-demos/scrib/fase16/src/fase16/adder/AdderC.java index 8d09c8f7a..7bf12f0d1 100644 --- a/scribble-demos/scrib/fase16/src/fase16/adder/AdderC.java +++ b/scribble-demos/scrib/fase16/src/fase16/adder/AdderC.java @@ -19,15 +19,15 @@ import static fase16.adder.Adder.Adder.Adder.Res; import static fase16.adder.Adder.Adder.Adder.S; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import fase16.adder.Adder.Adder.Adder; -import fase16.adder.Adder.Adder.channels.C.Adder_C_1; -import fase16.adder.Adder.Adder.channels.C.Adder_C_3; import fase16.adder.Adder.Adder.roles.C; +import fase16.adder.Adder.Adder.statechans.C.Adder_C_1; +import fase16.adder.Adder.Adder.statechans.C.Adder_C_3; public class AdderC { @@ -42,9 +42,9 @@ public static void main(String[] args) throws Exception private static void adder() throws Exception { Adder adder = new Adder(); - try (MPSTEndpoint se = new MPSTEndpoint<>(adder, C, new ObjectStreamFormatter())) - { - se.connect(S, SocketChannelEndpoint::new, "localhost", 8888); + try (MPSTEndpoint se = new MPSTEndpoint<>(adder, C, + new ObjectStreamFormatter())) { + se.request(S, SocketChannelEndpoint::new, "localhost", 8888); Adder_C_1 s1 = new Adder_C_1(se); @@ -79,7 +79,7 @@ private static void fib() throws Exception Adder adder = new Adder(); try (MPSTEndpoint se = new MPSTEndpoint<>(adder, C, new ObjectStreamFormatter())) { - se.connect(S, SocketChannelEndpoint::new, "localhost", 8888); + se.request(S, SocketChannelEndpoint::new, "localhost", 8888); Adder_C_1 s1 = new Adder_C_1(se); Buf i = new Buf<>(0); diff --git a/scribble-demos/scrib/fase16/src/fase16/adder/AdderS.java b/scribble-demos/scrib/fase16/src/fase16/adder/AdderS.java index 0267090d9..5ba75ebb3 100644 --- a/scribble-demos/scrib/fase16/src/fase16/adder/AdderS.java +++ b/scribble-demos/scrib/fase16/src/fase16/adder/AdderS.java @@ -21,18 +21,18 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import fase16.adder.Adder.Adder.Adder; -import fase16.adder.Adder.Adder.channels.S.Adder_S_1; -import fase16.adder.Adder.Adder.channels.S.Adder_S_1_Cases; -import fase16.adder.Adder.Adder.channels.S.Adder_S_3; import fase16.adder.Adder.Adder.roles.S; +import fase16.adder.Adder.Adder.statechans.S.Adder_S_1; +import fase16.adder.Adder.Adder.statechans.S.Adder_S_1_Cases; +import fase16.adder.Adder.Adder.statechans.S.Adder_S_3; public class AdderS @@ -47,13 +47,13 @@ public static void main(String[] args) throws Exception while (true) { Adder adder = new Adder(); - try (MPSTEndpoint se = new MPSTEndpoint<>(adder, S, new ObjectStreamFormatter())) - { + try (MPSTEndpoint se = new MPSTEndpoint<>(adder, S, + new ObjectStreamFormatter())) { se.accept(ss, C); add(new Adder_S_1(se), i1, i2).send(C, Bye); } - catch (ScribbleRuntimeException | IOException | ClassNotFoundException e) + catch (ScribRuntimeException | IOException | ClassNotFoundException e) { e.printStackTrace(); } diff --git a/scribble-demos/scrib/fase16/src/fase16/adder/MyAdderC.java b/scribble-demos/scrib/fase16/src/fase16/adder/MyAdderC.java index da117410b..2e413a086 100644 --- a/scribble-demos/scrib/fase16/src/fase16/adder/MyAdderC.java +++ b/scribble-demos/scrib/fase16/src/fase16/adder/MyAdderC.java @@ -13,26 +13,31 @@ */ package fase16.adder; -import static fase16.adder.Adder.Adder.Adder.*; +import static fase16.adder.Adder.Adder.Adder.Add; +import static fase16.adder.Adder.Adder.Adder.Bye; +import static fase16.adder.Adder.Adder.Adder.C; +import static fase16.adder.Adder.Adder.Adder.Res; +import static fase16.adder.Adder.Adder.Adder.S; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import fase16.adder.Adder.Adder.Adder; -import fase16.adder.Adder.Adder.channels.C.Adder_C_1; -import fase16.adder.Adder.Adder.channels.C.Adder_C_2; -import fase16.adder.Adder.Adder.channels.C.Adder_C_3; import fase16.adder.Adder.Adder.roles.C; +import fase16.adder.Adder.Adder.statechans.C.Adder_C_1; +import fase16.adder.Adder.Adder.statechans.C.Adder_C_3; public class MyAdderC { public static void main(String[] args) throws Exception { Adder adder = new Adder(); - try (MPSTEndpoint se = new MPSTEndpoint<>(adder, C, new ObjectStreamFormatter())) { - se.connect(S, SocketChannelEndpoint::new, "localhost", 8888); + try (MPSTEndpoint se = new MPSTEndpoint<>(adder, C, + new ObjectStreamFormatter())) + { + se.request(S, SocketChannelEndpoint::new, "localhost", 8888); Buf i = new Buf<>(); @@ -50,7 +55,8 @@ public static void main(String[] args) throws Exception private static final int N = 10; - private static Adder_C_3 fib(Adder_C_1 s1, Buf i1, Buf i2, int i) throws Exception + private static Adder_C_3 fib(Adder_C_1 s1, Buf i1, Buf i2, + int i) throws Exception { return null; } diff --git a/scribble-demos/scrib/fase16/src/fase16/smtp/SmtpC.java b/scribble-demos/scrib/fase16/src/fase16/smtp/SmtpC.java index b0b190d02..49b1ecbf9 100644 --- a/scribble-demos/scrib/fase16/src/fase16/smtp/SmtpC.java +++ b/scribble-demos/scrib/fase16/src/fase16/smtp/SmtpC.java @@ -25,24 +25,24 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.scribsock.LinearSocket; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SSLSocketChannelWrapper; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.net.SSLSocketChannelWrapper; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.statechans.LinearSocket; +import org.scribble.runtime.util.Buf; import fase16.smtp.Smtp.Smtp.Smtp; -import fase16.smtp.Smtp.Smtp.channels.C.Smtp_C_1; -import fase16.smtp.Smtp.Smtp.channels.C.Smtp_C_1_Future; -import fase16.smtp.Smtp.Smtp.channels.C.Smtp_C_3; -import fase16.smtp.Smtp.Smtp.channels.C.Smtp_C_3_Handler; -import fase16.smtp.Smtp.Smtp.channels.C.Smtp_C_4; -import fase16.smtp.Smtp.Smtp.channels.C.ioifaces.Branch_C_S_250__S_250d; -import fase16.smtp.Smtp.Smtp.channels.C.ioifaces.Case_C_S_250__S_250d; -import fase16.smtp.Smtp.Smtp.channels.C.ioifaces.Select_C_S_Ehlo; -import fase16.smtp.Smtp.Smtp.channels.C.ioifaces.Succ_In_S_250; import fase16.smtp.Smtp.Smtp.roles.C; +import fase16.smtp.Smtp.Smtp.statechans.C.Smtp_C_1; +import fase16.smtp.Smtp.Smtp.statechans.C.Smtp_C_1_Future; +import fase16.smtp.Smtp.Smtp.statechans.C.Smtp_C_3; +import fase16.smtp.Smtp.Smtp.statechans.C.Smtp_C_3_Handler; +import fase16.smtp.Smtp.Smtp.statechans.C.Smtp_C_4; +import fase16.smtp.Smtp.Smtp.statechans.C.ioifaces.Branch_C_S_250__S_250d; +import fase16.smtp.Smtp.Smtp.statechans.C.ioifaces.Case_C_S_250__S_250d; +import fase16.smtp.Smtp.Smtp.statechans.C.ioifaces.Select_C_S_Ehlo; +import fase16.smtp.Smtp.Smtp.statechans.C.ioifaces.Succ_In_S_250; import fase16.smtp.message.SmtpMessageFormatter; import fase16.smtp.message.client.Ehlo; import fase16.smtp.message.client.Quit; @@ -68,9 +68,10 @@ public void run() throws Exception int port = 25; Smtp smtp = new Smtp(); - try (MPSTEndpoint se = new MPSTEndpoint<>(smtp, Smtp.C, new SmtpMessageFormatter())) + try (MPSTEndpoint se = new MPSTEndpoint<>(smtp, Smtp.C, + new SmtpMessageFormatter())) { - se.connect(Smtp.S, SocketChannelEndpoint::new, host, port); + se.request(Smtp.S, SocketChannelEndpoint::new, host, port); Buf f1 = new Buf<>(); Smtp_C_1 s1 = new Smtp_C_1(se); @@ -157,13 +158,17 @@ public static > S printlnBuf(S s, B b) class MySmtpC3Handler implements Smtp_C_3_Handler { @Override - public void receive(Smtp_C_3 s3, fase16.smtp.Smtp.Smtp.ops._250d op, Buf<_250d> arg) throws ScribbleRuntimeException, IOException, ClassNotFoundException + public void receive(Smtp_C_3 s3, fase16.smtp.Smtp.Smtp.ops._250d op, + Buf<_250d> arg) + throws ScribRuntimeException, IOException, ClassNotFoundException { s3.branch(S, this); } @Override - public void receive(Smtp_C_4 s4, fase16.smtp.Smtp.Smtp.ops._250 op, Buf<_250> arg) throws ScribbleRuntimeException, IOException, ClassNotFoundException + public void receive(Smtp_C_4 s4, fase16.smtp.Smtp.Smtp.ops._250 op, + Buf<_250> arg) + throws ScribRuntimeException, IOException, ClassNotFoundException { try { @@ -175,13 +180,13 @@ public void receive(Smtp_C_4 s4, fase16.smtp.Smtp.Smtp.ops._250 op, Buf<_250> ar ) .send(S, new Quit()); } - catch (ScribbleRuntimeException | IOException | ClassNotFoundException x) + catch (ScribRuntimeException | IOException | ClassNotFoundException x) { throw x; } catch (Exception x) { - throw new ScribbleRuntimeException(x); + throw new ScribRuntimeException(x); } } } diff --git a/scribble-demos/scrib/fase16/src/fase16/smtp/message/SmtpMessage.java b/scribble-demos/scrib/fase16/src/fase16/smtp/message/SmtpMessage.java index d48c9cb8f..621094a83 100644 --- a/scribble-demos/scrib/fase16/src/fase16/smtp/message/SmtpMessage.java +++ b/scribble-demos/scrib/fase16/src/fase16/smtp/message/SmtpMessage.java @@ -13,8 +13,8 @@ */ package fase16.smtp.message; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.sesstype.name.Op; +import org.scribble.core.type.name.Op; +import org.scribble.runtime.message.ScribMessage; import org.scribble.util.Caller; import fase16.smtp.Smtp.Smtp.Smtp; diff --git a/scribble-demos/scrib/fase16/src/fase16/smtp/message/SmtpMessageFormatter.java b/scribble-demos/scrib/fase16/src/fase16/smtp/message/SmtpMessageFormatter.java index 731f1780f..fcb8f4771 100644 --- a/scribble-demos/scrib/fase16/src/fase16/smtp/message/SmtpMessageFormatter.java +++ b/scribble-demos/scrib/fase16/src/fase16/smtp/message/SmtpMessageFormatter.java @@ -19,8 +19,8 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; -import org.scribble.runtime.net.ScribMessage; -import org.scribble.runtime.net.ScribMessageFormatter; +import org.scribble.runtime.message.ScribMessage; +import org.scribble.runtime.message.ScribMessageFormatter; import fase16.smtp.message.server._220; import fase16.smtp.message.server._250; @@ -48,7 +48,8 @@ public byte[] toBytes(ScribMessage m) throws IOException } @Override - public ScribMessage fromBytes(ByteBuffer bb) throws IOException, ClassNotFoundException + public ScribMessage fromBytes(ByteBuffer bb) + throws IOException, ClassNotFoundException { bb.flip(); //byte[] bs = new byte[2]; diff --git a/scribble-demos/scrib/fib/src/fib/AdderClient.java b/scribble-demos/scrib/fib/src/fib/AdderClient.java index 568c62d56..5350e50e5 100644 --- a/scribble-demos/scrib/fib/src/fib/AdderClient.java +++ b/scribble-demos/scrib/fib/src/fib/AdderClient.java @@ -20,32 +20,35 @@ import java.net.UnknownHostException; import java.util.concurrent.ExecutionException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import fib.Fib.Adder.Adder; -import fib.Fib.Adder.channels.C.Adder_C_1; -import fib.Fib.Adder.channels.C.ioifaces.Receive_C_S_BYE; -import fib.Fib.Adder.channels.C.ioifaces.Receive_C_S_RES_Int; -import fib.Fib.Adder.channels.C.ioifaces.Select_C_S_ADD_Int_Int__S_BYE; -import fib.Fib.Adder.channels.C.ioifaces.Succ_Out_S_BYE; import fib.Fib.Adder.roles.C; +import fib.Fib.Adder.statechans.C.Adder_C_1; +import fib.Fib.Adder.statechans.C.ioifaces.Receive_C_S_BYE; +import fib.Fib.Adder.statechans.C.ioifaces.Receive_C_S_RES_Int; +import fib.Fib.Adder.statechans.C.ioifaces.Select_C_S_ADD_Int_Int__S_BYE; +import fib.Fib.Adder.statechans.C.ioifaces.Succ_Out_S_BYE; public class AdderClient { - public static void main(String[] args) throws UnknownHostException, ScribbleRuntimeException, IOException, ClassNotFoundException, ExecutionException, InterruptedException + public static void main(String[] args) + throws UnknownHostException, ScribRuntimeException, IOException, + ClassNotFoundException, ExecutionException, InterruptedException { Buf i1 = new Buf<>(1); //Buf i2 = new Buf<>(2); Adder adder = new Adder(); - try (MPSTEndpoint se = new MPSTEndpoint<>(adder, Adder.C, new ObjectStreamFormatter())) + try (MPSTEndpoint se = new MPSTEndpoint<>(adder, Adder.C, + new ObjectStreamFormatter())) { - se.connect(Adder.S, SocketChannelEndpoint::new, "localhost", 8888); + se.request(Adder.S, SocketChannelEndpoint::new, "localhost", 8888); Adder_C_1 s1 = new Adder_C_1(se); @@ -72,8 +75,8 @@ public static void main(String[] args) throws UnknownHostException, ScribbleRunt } } - private static Succ_Out_S_BYE foo(Select_C_S_ADD_Int_Int__S_BYE s, Buf i) throws ClassNotFoundException, ScribbleRuntimeException, IOException - //private static EndSocket foo(Select_C_S_ADD_Integer_Integer__S_BYE s, Buf i) throws ClassNotFoundException, ScribbleRuntimeException, IOException + private static Succ_Out_S_BYE foo(Select_C_S_ADD_Int_Int__S_BYE s, Buf i) throws ClassNotFoundException, ScribRuntimeException, IOException + //private static EndSocket foo(Select_C_S_ADD_Integer_Integer__S_BYE s, Buf i) throws ClassNotFoundException, ScribRuntimeException, IOException { return (i.val < 100) ? foo( @@ -85,7 +88,7 @@ private static Succ_Out_S_BYE foo(Select_C_S_ADD_Int_Int__S_BYE s, Buf fib(Buf i1, Buf i2, Adder_C_1 s1) throws ScribbleRuntimeException, IOException, ClassNotFoundException, ExecutionException, InterruptedException + /*private static EndSocket fib(Buf i1, Buf i2, Adder_C_1 s1) throws ScribRuntimeException, IOException, ClassNotFoundException, ExecutionException, InterruptedException { return (i1.val < 100) ? fib(i1, i2, diff --git a/scribble-demos/scrib/fib/src/fib/AdderServer.java b/scribble-demos/scrib/fib/src/fib/AdderServer.java index 98af66c80..5465ae60a 100644 --- a/scribble-demos/scrib/fib/src/fib/AdderServer.java +++ b/scribble-demos/scrib/fib/src/fib/AdderServer.java @@ -16,22 +16,23 @@ import java.io.IOException; import java.util.concurrent.ExecutionException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import fib.Fib.Adder.Adder; -import fib.Fib.Adder.channels.S.Adder_S_1; -import fib.Fib.Adder.channels.S.Adder_S_1_Cases; -import fib.Fib.Adder.channels.S.Adder_S_3; import fib.Fib.Adder.roles.S; +import fib.Fib.Adder.statechans.S.Adder_S_1; +import fib.Fib.Adder.statechans.S.Adder_S_1_Cases; +import fib.Fib.Adder.statechans.S.Adder_S_3; public class AdderServer { - public static void main(String[] args) throws IOException, ScribbleRuntimeException, ExecutionException, InterruptedException + public static void main(String[] args) throws IOException, + ScribRuntimeException, ExecutionException, InterruptedException { try (ScribServerSocket ss = new SocketChannelServer(8888)) { @@ -41,13 +42,14 @@ public static void main(String[] args) throws IOException, ScribbleRuntimeExcept while (true) { Adder foo = new Adder(); - try (MPSTEndpoint se = new MPSTEndpoint<>(foo, Adder.S, new ObjectStreamFormatter())) + try (MPSTEndpoint se = new MPSTEndpoint<>(foo, Adder.S, + new ObjectStreamFormatter())) { se.accept(ss, Adder.C); X(new Adder_S_1(se), i1, i2).send(Adder.C, Adder.BYE); } - catch (ScribbleRuntimeException | IOException | ClassNotFoundException e) + catch (ScribRuntimeException | IOException | ClassNotFoundException e) { e.printStackTrace(); } @@ -55,7 +57,9 @@ public static void main(String[] args) throws IOException, ScribbleRuntimeExcept } } - private static Adder_S_3 X(Adder_S_1 s1, Buf i1, Buf i2) throws ClassNotFoundException, ScribbleRuntimeException, IOException, ExecutionException, InterruptedException + private static Adder_S_3 X(Adder_S_1 s1, Buf i1, Buf i2) + throws ClassNotFoundException, ScribRuntimeException, IOException, + ExecutionException, InterruptedException { Adder_S_1_Cases cases = s1.branch(Adder.C); switch (cases.op) diff --git a/scribble-demos/scrib/fib/src/fib/FibClient.java b/scribble-demos/scrib/fib/src/fib/FibClient.java index 1cca32012..69c929601 100644 --- a/scribble-demos/scrib/fib/src/fib/FibClient.java +++ b/scribble-demos/scrib/fib/src/fib/FibClient.java @@ -17,29 +17,32 @@ import java.net.UnknownHostException; import java.util.concurrent.ExecutionException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import fib.Fib.Adder.Adder; -import fib.Fib.Adder.channels.C.Adder_C_1; -import fib.Fib.Adder.channels.C.Adder_C_2; -import fib.Fib.Adder.channels.C.Adder_C_3; import fib.Fib.Adder.roles.C; +import fib.Fib.Adder.statechans.C.Adder_C_1; +import fib.Fib.Adder.statechans.C.Adder_C_2; +import fib.Fib.Adder.statechans.C.Adder_C_3; public class FibClient { - public static void main(String[] args) throws UnknownHostException, ScribbleRuntimeException, IOException, ClassNotFoundException, ExecutionException, InterruptedException + public static void main(String[] args) + throws UnknownHostException, ScribRuntimeException, IOException, + ClassNotFoundException, ExecutionException, InterruptedException { Buf i1 = new Buf<>(0); Buf i2 = new Buf<>(1); Adder adder = new Adder(); - try (MPSTEndpoint se = new MPSTEndpoint<>(adder, Adder.C, new ObjectStreamFormatter())) + try (MPSTEndpoint se = new MPSTEndpoint<>(adder, Adder.C, + new ObjectStreamFormatter())) { - se.connect(Adder.S, SocketChannelEndpoint::new, "localhost", 8888); + se.request(Adder.S, SocketChannelEndpoint::new, "localhost", 8888); Adder_C_1 s1 = new Adder_C_1(se); @@ -47,7 +50,9 @@ public static void main(String[] args) throws UnknownHostException, ScribbleRunt } } - private static Adder_C_3 fib(Adder_C_1 s1, Buf i1, Buf i2, int i) throws ClassNotFoundException, ScribbleRuntimeException, IOException, ExecutionException, InterruptedException + private static Adder_C_3 fib(Adder_C_1 s1, Buf i1, Buf i2, + int i) throws ClassNotFoundException, ScribRuntimeException, IOException, + ExecutionException, InterruptedException { return (i < 20) //? fib(side(s1.send(Adder.S, Adder.ADD, i1.val, i2.val), i1, i2).receive(Adder.RES, i2), i1, i2, i + 1) diff --git a/scribble-demos/scrib/fib/src/fib/Fibo.java b/scribble-demos/scrib/fib/src/fib/Fibo.java index ef65b5870..acf74a8b2 100644 --- a/scribble-demos/scrib/fib/src/fib/Fibo.java +++ b/scribble-demos/scrib/fib/src/fib/Fibo.java @@ -17,24 +17,24 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import fib.Fib.Fibonacci.Fibonacci; -import fib.Fib.Fibonacci.channels.A.Fibonacci_A_1; -import fib.Fib.Fibonacci.channels.B.EndSocket; -import fib.Fib.Fibonacci.channels.B.Fibonacci_B_1; -import fib.Fib.Fibonacci.channels.B.Fibonacci_B_1_Handler; -import fib.Fib.Fibonacci.channels.B.Fibonacci_B_2; import fib.Fib.Fibonacci.ops.end; import fib.Fib.Fibonacci.ops.fibonacci; import fib.Fib.Fibonacci.roles.A; import fib.Fib.Fibonacci.roles.B; +import fib.Fib.Fibonacci.statechans.A.Fibonacci_A_1; +import fib.Fib.Fibonacci.statechans.B.EndSocket; +import fib.Fib.Fibonacci.statechans.B.Fibonacci_B_1; +import fib.Fib.Fibonacci.statechans.B.Fibonacci_B_1_Handler; +import fib.Fib.Fibonacci.statechans.B.Fibonacci_B_2; public class Fibo { @@ -59,9 +59,9 @@ public MyB(Fibonacci fib) @Override public void run() { - try ( - ScribServerSocket ss = new SocketChannelServer(8888); - MPSTEndpoint se = new MPSTEndpoint<>(this.fib, Fibonacci.B, new ObjectStreamFormatter())) + try (ScribServerSocket ss = new SocketChannelServer(8888); + MPSTEndpoint se = new MPSTEndpoint<>(this.fib, + Fibonacci.B, new ObjectStreamFormatter())) { se.accept(ss, Fibonacci.A); new Fibonacci_B_1(se).branch(Fibonacci.A, this); @@ -73,13 +73,15 @@ public void run() } @Override - public void receive(Fibonacci_B_2 s, fibonacci op, Buf arg1) throws ScribbleRuntimeException, IOException, ClassNotFoundException + public void receive(Fibonacci_B_2 s, fibonacci op, Buf arg1) + throws ScribRuntimeException, IOException, ClassNotFoundException { s.send(Fibonacci.A, Fibonacci.fibonacci, (this.x += arg1.val)).branch(Fibonacci.A, this); } @Override - public void receive(EndSocket schan, end op) throws ScribbleRuntimeException, IOException, ClassNotFoundException + public void receive(EndSocket schan, end op) + throws ScribRuntimeException, IOException, ClassNotFoundException { //System.out.println("B done: " + this.x); } @@ -98,9 +100,10 @@ public MyA(Fibonacci fib) @Override public void run() { - try (MPSTEndpoint se = new MPSTEndpoint<>(this.fib, Fibonacci.A, new ObjectStreamFormatter())) + try (MPSTEndpoint se = new MPSTEndpoint<>(this.fib, + Fibonacci.A, new ObjectStreamFormatter())) { - se.connect(Fibonacci.B, SocketChannelEndpoint::new, "localhost", 8888); + se.request(Fibonacci.B, SocketChannelEndpoint::new, "localhost", 8888); run(new Fibonacci_A_1(se), 19); // 4184 System.out.println("A done: " + this.b.val); } @@ -110,7 +113,8 @@ public void run() } } - private fib.Fib.Fibonacci.channels.A.EndSocket run(Fibonacci_A_1 s, int todo) throws Exception + private fib.Fib.Fibonacci.statechans.A.EndSocket run(Fibonacci_A_1 s, int todo) + throws Exception { return (todo > 0) ? run( diff --git a/scribble-demos/scrib/fib/src/fib/MyAdderC.java b/scribble-demos/scrib/fib/src/fib/MyAdderC.java index 1e3943e10..2755ae8ea 100644 --- a/scribble-demos/scrib/fib/src/fib/MyAdderC.java +++ b/scribble-demos/scrib/fib/src/fib/MyAdderC.java @@ -13,22 +13,23 @@ */ package fib; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; import fib.Fib.Adder.Adder; -import fib.Fib.Adder.channels.C.Adder_C_1; import fib.Fib.Adder.roles.C; +import fib.Fib.Adder.statechans.C.Adder_C_1; public class MyAdderC { public static void main(String[] args) throws Exception { Adder adder = new Adder(); - try (MPSTEndpoint se = new MPSTEndpoint<>(adder, Adder.C, new ObjectStreamFormatter())) + try (MPSTEndpoint se = new MPSTEndpoint<>(adder, Adder.C, + new ObjectStreamFormatter())) { - se.connect(Adder.S, SocketChannelEndpoint::new, "localhost", 8888); + se.request(Adder.S, SocketChannelEndpoint::new, "localhost", 8888); Adder_C_1 s1 = new Adder_C_1(se); From f2e8e10ed25462dc0605d6e5d752a843271e9b5d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 8 May 2019 22:59:51 +0100 Subject: [PATCH 490/539] [AllTest] Continued: pass on some scribble-demo. --- .../scrib/loan/src/loan/LoanApplicant.java | 14 ++++---- .../scrib/loan/src/loan/LoanApplication.scr | 2 +- .../loan/src/loan/LoanApplicationPortal.java | 32 ++++++++++--------- .../scrib/loan/src/loan/LoanFinanceDept.java | 14 ++++---- .../loan/src/loan/LoanProcessingDept.java | 20 ++++++------ .../scrib/travel/src/travel/BookingA.java | 26 ++++++++------- .../scrib/travel/src/travel/BookingC.java | 23 +++++++------ .../scrib/travel/src/travel/BookingS.java | 22 +++++++------ .../tutorial/src/tutorial/adder/AdderC.java | 14 ++++---- .../tutorial/src/tutorial/adder/AdderS.java | 18 +++++------ 10 files changed, 98 insertions(+), 87 deletions(-) diff --git a/scribble-demos/scrib/loan/src/loan/LoanApplicant.java b/scribble-demos/scrib/loan/src/loan/LoanApplicant.java index 449298442..39d3b0df9 100644 --- a/scribble-demos/scrib/loan/src/loan/LoanApplicant.java +++ b/scribble-demos/scrib/loan/src/loan/LoanApplicant.java @@ -19,15 +19,15 @@ import static loan.LoanApplication.BuyerBrokerSupplier.BuyerBrokerSupplier.reject; import static loan.LoanApplication.BuyerBrokerSupplier.BuyerBrokerSupplier.requestConfirmation; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import loan.LoanApplication.BuyerBrokerSupplier.BuyerBrokerSupplier; -import loan.LoanApplication.BuyerBrokerSupplier.channels.Applicant.BuyerBrokerSupplier_Applicant_1; -import loan.LoanApplication.BuyerBrokerSupplier.channels.Applicant.BuyerBrokerSupplier_Applicant_2_Cases; import loan.LoanApplication.BuyerBrokerSupplier.roles.Applicant; +import loan.LoanApplication.BuyerBrokerSupplier.statechans.Applicant.BuyerBrokerSupplier_Applicant_1; +import loan.LoanApplication.BuyerBrokerSupplier.statechans.Applicant.BuyerBrokerSupplier_Applicant_2_Cases; public class LoanApplicant { @@ -37,7 +37,7 @@ public static void main(String[] args) throws Exception try (MPSTEndpoint se = new MPSTEndpoint<>(sess, Applicant, new ObjectStreamFormatter())) { - se.connect(ApplicationPortal, SocketChannelEndpoint::new, "localhost", 8888); + se.request(ApplicationPortal, SocketChannelEndpoint::new, "localhost", 8888); BuyerBrokerSupplier_Applicant_2_Cases branch = new BuyerBrokerSupplier_Applicant_1(se) diff --git a/scribble-demos/scrib/loan/src/loan/LoanApplication.scr b/scribble-demos/scrib/loan/src/loan/LoanApplication.scr index 4cbcb5360..ec3230a03 100644 --- a/scribble-demos/scrib/loan/src/loan/LoanApplication.scr +++ b/scribble-demos/scrib/loan/src/loan/LoanApplication.scr @@ -1,4 +1,4 @@ -//$ bin/scribblec.sh -ip scribble-demos/scrib/loan/src -d scribble-demos/scrib/loan/src scribble-demos/scrib/loan/src/loan/LoanApplication.scr -api BuyerBrokerSupplier Applicant +//$ ./scribblec.sh -ip scribble-demos/scrib/loan/src -d scribble-demos/scrib/loan/src scribble-demos/scrib/loan/src/loan/LoanApplication.scr -api BuyerBrokerSupplier Applicant //$ javadoc -cp scribble-core/target/classes:scribble-runtime/target/classes:scribble-demos/scrib/loan/src scribble-demos/scrib/loan/src/loan/*.java -subpackages loan.LoanApplication.BuyerBrokerSupplier -d scribble-demos/scrib/loan/javadoc module loan.LoanApplication; diff --git a/scribble-demos/scrib/loan/src/loan/LoanApplicationPortal.java b/scribble-demos/scrib/loan/src/loan/LoanApplicationPortal.java index 863c96a03..0091a12bc 100644 --- a/scribble-demos/scrib/loan/src/loan/LoanApplicationPortal.java +++ b/scribble-demos/scrib/loan/src/loan/LoanApplicationPortal.java @@ -25,17 +25,17 @@ import static loan.LoanApplication.BuyerBrokerSupplier.BuyerBrokerSupplier.respond; import static loan.LoanApplication.BuyerBrokerSupplier.BuyerBrokerSupplier.sendLoanAmount; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import loan.LoanApplication.BuyerBrokerSupplier.BuyerBrokerSupplier; -import loan.LoanApplication.BuyerBrokerSupplier.channels.ApplicationPortal.BuyerBrokerSupplier_ApplicationPortal_1; -import loan.LoanApplication.BuyerBrokerSupplier.channels.ApplicationPortal.BuyerBrokerSupplier_ApplicationPortal_4; import loan.LoanApplication.BuyerBrokerSupplier.roles.ApplicationPortal; +import loan.LoanApplication.BuyerBrokerSupplier.statechans.ApplicationPortal.BuyerBrokerSupplier_ApplicationPortal_1; +import loan.LoanApplication.BuyerBrokerSupplier.statechans.ApplicationPortal.BuyerBrokerSupplier_ApplicationPortal_4; public class LoanApplicationPortal { @@ -45,11 +45,12 @@ public static void main(String[] args) throws Exception try ( ScribServerSocket ss = new SocketChannelServer(8888); MPSTEndpoint se - = new MPSTEndpoint<>(sess, ApplicationPortal, new ObjectStreamFormatter())) + = new MPSTEndpoint<>(sess, ApplicationPortal, + new ObjectStreamFormatter())) { se.accept(ss, Applicant); - se.connect(ProcessingDept, SocketChannelEndpoint::new, "localhost", 7777); - se.connect(FinanceDept, SocketChannelEndpoint::new, "localhost", 9999); + se.request(ProcessingDept, SocketChannelEndpoint::new, "localhost", 7777); + se.request(FinanceDept, SocketChannelEndpoint::new, "localhost", 9999); Buf customerName = new Buf<>(); Buf dateOfBirth = new Buf<>(); @@ -58,10 +59,11 @@ public static void main(String[] args) throws Exception Buf response = new Buf<>(); BuyerBrokerSupplier_ApplicationPortal_4 s4 = new BuyerBrokerSupplier_ApplicationPortal_1(se) - .receive(Applicant, applyForLoan, customerName, dateOfBirth, annualSalary, creditRating) - .send(ProcessingDept, checkEligibility, customerName.val, dateOfBirth.val, annualSalary.val, creditRating.val) - .receive(ProcessingDept - , respond, response); + .receive(Applicant, applyForLoan, customerName, dateOfBirth, + annualSalary, creditRating) + .send(ProcessingDept, checkEligibility, customerName.val, + dateOfBirth.val, annualSalary.val, creditRating.val) + .receive(ProcessingDept, respond, response); if (response.val) { Buf loan = new Buf<>(); diff --git a/scribble-demos/scrib/loan/src/loan/LoanFinanceDept.java b/scribble-demos/scrib/loan/src/loan/LoanFinanceDept.java index e3f7a0807..ef5aae496 100644 --- a/scribble-demos/scrib/loan/src/loan/LoanFinanceDept.java +++ b/scribble-demos/scrib/loan/src/loan/LoanFinanceDept.java @@ -19,16 +19,16 @@ import static loan.LoanApplication.BuyerBrokerSupplier.BuyerBrokerSupplier.reject; import static loan.LoanApplication.BuyerBrokerSupplier.BuyerBrokerSupplier.sendLoanAmount; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import loan.LoanApplication.BuyerBrokerSupplier.BuyerBrokerSupplier; -import loan.LoanApplication.BuyerBrokerSupplier.channels.FinanceDept.BuyerBrokerSupplier_FinanceDept_1; -import loan.LoanApplication.BuyerBrokerSupplier.channels.FinanceDept.BuyerBrokerSupplier_FinanceDept_1_Cases; import loan.LoanApplication.BuyerBrokerSupplier.roles.FinanceDept; +import loan.LoanApplication.BuyerBrokerSupplier.statechans.FinanceDept.BuyerBrokerSupplier_FinanceDept_1; +import loan.LoanApplication.BuyerBrokerSupplier.statechans.FinanceDept.BuyerBrokerSupplier_FinanceDept_1_Cases; public class LoanFinanceDept { diff --git a/scribble-demos/scrib/loan/src/loan/LoanProcessingDept.java b/scribble-demos/scrib/loan/src/loan/LoanProcessingDept.java index 2455f8eb1..800b613cc 100644 --- a/scribble-demos/scrib/loan/src/loan/LoanProcessingDept.java +++ b/scribble-demos/scrib/loan/src/loan/LoanProcessingDept.java @@ -18,15 +18,15 @@ import static loan.LoanApplication.BuyerBrokerSupplier.BuyerBrokerSupplier.checkEligibility; import static loan.LoanApplication.BuyerBrokerSupplier.BuyerBrokerSupplier.respond; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import loan.LoanApplication.BuyerBrokerSupplier.BuyerBrokerSupplier; -import loan.LoanApplication.BuyerBrokerSupplier.channels.ProcessingDept.BuyerBrokerSupplier_ProcessingDept_1; import loan.LoanApplication.BuyerBrokerSupplier.roles.ProcessingDept; +import loan.LoanApplication.BuyerBrokerSupplier.statechans.ProcessingDept.BuyerBrokerSupplier_ProcessingDept_1; public class LoanProcessingDept { @@ -36,7 +36,8 @@ public static void main(String[] args) throws Exception try ( ScribServerSocket ss = new SocketChannelServer(7777); MPSTEndpoint se - = new MPSTEndpoint<>(sess, ProcessingDept, new ObjectStreamFormatter())) + = new MPSTEndpoint<>(sess, ProcessingDept, + new ObjectStreamFormatter())) { se.accept(ss, ApplicationPortal); @@ -45,8 +46,9 @@ public static void main(String[] args) throws Exception Buf annualSalary = new Buf<>(); Buf creditRating = new Buf<>(); new BuyerBrokerSupplier_ProcessingDept_1(se) - .receive(ApplicationPortal, checkEligibility, customerName, dateOfBirth, annualSalary, creditRating) - .send(ApplicationPortal, respond, true); + .receive(ApplicationPortal, checkEligibility, customerName, + dateOfBirth, annualSalary, creditRating) + .send(ApplicationPortal, respond, true); } } } diff --git a/scribble-demos/scrib/travel/src/travel/BookingA.java b/scribble-demos/scrib/travel/src/travel/BookingA.java index 0dc3a931d..26391c76b 100644 --- a/scribble-demos/scrib/travel/src/travel/BookingA.java +++ b/scribble-demos/scrib/travel/src/travel/BookingA.java @@ -16,21 +16,22 @@ import java.io.IOException; import java.util.concurrent.ExecutionException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; import travel.Travel.Booking.Booking; -import travel.Travel.Booking.channels.A.Booking_A_1; -import travel.Travel.Booking.channels.A.Booking_A_1_Cases; import travel.Travel.Booking.roles.A; +import travel.Travel.Booking.statechans.A.Booking_A_1; +import travel.Travel.Booking.statechans.A.Booking_A_1_Cases; public class BookingA { - public static void main(String[] args) throws IOException, ScribbleRuntimeException, ExecutionException, InterruptedException + public static void main(String[] args) throws IOException, + ScribRuntimeException, ExecutionException, InterruptedException { try (ScribServerSocket ss_C = new SocketChannelServer(7777)) { @@ -39,13 +40,14 @@ public static void main(String[] args) throws IOException, ScribbleRuntimeExcept int quote = 1000; Booking booking = new Booking(); - try (MPSTEndpoint se = new MPSTEndpoint<>(booking, Booking.A, new ObjectStreamFormatter())) + try (MPSTEndpoint se = new MPSTEndpoint<>(booking, + Booking.A, new ObjectStreamFormatter())) { se.accept(ss_C, Booking.C); - //Thread.sleep(1000); // FIXME: ensure S is ready + //Thread.sleep(1000); // CHECKME: ensure S is ready - se.connect(Booking.S, SocketChannelEndpoint::new, "localhost", 9999); + se.request(Booking.S, SocketChannelEndpoint::new, "localhost", 9999); Booking_A_1 s1 = new Booking_A_1(se); Booking_A_1_Cases s1cases; diff --git a/scribble-demos/scrib/travel/src/travel/BookingC.java b/scribble-demos/scrib/travel/src/travel/BookingC.java index 3c4e09d76..b9574c376 100644 --- a/scribble-demos/scrib/travel/src/travel/BookingC.java +++ b/scribble-demos/scrib/travel/src/travel/BookingC.java @@ -17,29 +17,32 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import travel.Travel.Booking.Booking; -import travel.Travel.Booking.channels.C.Booking_C_1; -import travel.Travel.Booking.channels.C.Booking_C_5; import travel.Travel.Booking.roles.C; +import travel.Travel.Booking.statechans.C.Booking_C_1; +import travel.Travel.Booking.statechans.C.Booking_C_5; public class BookingC { static int MAX = 500; - static List QUERIES = IntStream.range(97, 122).mapToObj((i) -> new Character((char) i).toString()).collect(Collectors.toList()); + static List QUERIES = IntStream.range(97, 122) + .mapToObj(i -> new Character((char) i).toString()) + .collect(Collectors.toList()); public static void main(String[] args) throws Exception { Booking booking = new Booking(); - try (MPSTEndpoint se = new MPSTEndpoint<>(booking, Booking.C, new ObjectStreamFormatter())) + try (MPSTEndpoint se = new MPSTEndpoint<>(booking, Booking.C, + new ObjectStreamFormatter())) { - se.connect(Booking.A, SocketChannelEndpoint::new, "localhost", 7777); - se.connect(Booking.S, SocketChannelEndpoint::new, "localhost", 8888); + se.request(Booking.A, SocketChannelEndpoint::new, "localhost", 7777); + se.request(Booking.S, SocketChannelEndpoint::new, "localhost", 8888); Booking_C_1 s1 = new Booking_C_1(se); Buf quote = new Buf<>(); diff --git a/scribble-demos/scrib/travel/src/travel/BookingS.java b/scribble-demos/scrib/travel/src/travel/BookingS.java index 2606a1dc6..6d59298fa 100644 --- a/scribble-demos/scrib/travel/src/travel/BookingS.java +++ b/scribble-demos/scrib/travel/src/travel/BookingS.java @@ -16,21 +16,22 @@ import java.io.IOException; import java.util.concurrent.ExecutionException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import travel.Travel.Booking.Booking; -import travel.Travel.Booking.channels.S.Booking_S_1; -import travel.Travel.Booking.channels.S.Booking_S_1_Cases; import travel.Travel.Booking.roles.S; +import travel.Travel.Booking.statechans.S.Booking_S_1; +import travel.Travel.Booking.statechans.S.Booking_S_1_Cases; public class BookingS { - public static void main(String[] args) throws IOException, ScribbleRuntimeException, ExecutionException, InterruptedException + public static void main(String[] args) throws IOException, + ScribRuntimeException, ExecutionException, InterruptedException { try (ScribServerSocket ss_C = new SocketChannelServer(8888); ScribServerSocket ss_A = new SocketChannelServer(9999)) @@ -38,7 +39,8 @@ public static void main(String[] args) throws IOException, ScribbleRuntimeExcept while (true) { Booking booking = new Booking(); - try (MPSTEndpoint se = new MPSTEndpoint<>(booking, Booking.S, new ObjectStreamFormatter())) + try (MPSTEndpoint se = new MPSTEndpoint<>(booking, + Booking.S, new ObjectStreamFormatter())) { //S.register(Booking.A, ss_A); diff --git a/scribble-demos/scrib/tutorial/src/tutorial/adder/AdderC.java b/scribble-demos/scrib/tutorial/src/tutorial/adder/AdderC.java index 28bb6c659..2c2c1c3a4 100644 --- a/scribble-demos/scrib/tutorial/src/tutorial/adder/AdderC.java +++ b/scribble-demos/scrib/tutorial/src/tutorial/adder/AdderC.java @@ -19,15 +19,15 @@ import static tutorial.adder.Adder.Adder.Adder.Res; import static tutorial.adder.Adder.Adder.Adder.S; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.session.MPSTEndpoint; -import org.scribble.runtime.net.session.SocketChannelEndpoint; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import tutorial.adder.Adder.Adder.Adder; -import tutorial.adder.Adder.Adder.channels.C.Adder_C_1; -import tutorial.adder.Adder.Adder.channels.C.Adder_C_2; import tutorial.adder.Adder.Adder.roles.C; +import tutorial.adder.Adder.Adder.statechans.C.Adder_C_1; +import tutorial.adder.Adder.Adder.statechans.C.Adder_C_2; public class AdderC { @@ -35,7 +35,7 @@ public static void main(String[] args) throws Exception { Adder adder = new Adder(); try (MPSTEndpoint client = new MPSTEndpoint<>(adder, C, new ObjectStreamFormatter())) { - client.connect(S, SocketChannelEndpoint::new, "localhost", 8888); + client.request(S, SocketChannelEndpoint::new, "localhost", 8888); int n = 10; System.out.println(n + "th Fibonacci number: " + fibo(new Adder_C_1(client), n)); diff --git a/scribble-demos/scrib/tutorial/src/tutorial/adder/AdderS.java b/scribble-demos/scrib/tutorial/src/tutorial/adder/AdderS.java index a17c474d6..be7359d94 100644 --- a/scribble-demos/scrib/tutorial/src/tutorial/adder/AdderS.java +++ b/scribble-demos/scrib/tutorial/src/tutorial/adder/AdderS.java @@ -21,17 +21,17 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.MPSTEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; import tutorial.adder.Adder.Adder.Adder; -import tutorial.adder.Adder.Adder.channels.S.Adder_S_1; -import tutorial.adder.Adder.Adder.channels.S.Adder_S_1_Cases; import tutorial.adder.Adder.Adder.roles.S; +import tutorial.adder.Adder.Adder.statechans.S.Adder_S_1; +import tutorial.adder.Adder.Adder.statechans.S.Adder_S_1_Cases; public class AdderS { @@ -43,7 +43,7 @@ public static void main(String[] args) throws Exception { = new MPSTEndpoint<>(adder, S, new ObjectStreamFormatter())) { server.accept(ss, C); new AdderS().run(new Adder_S_1(server)); - } catch (ScribbleRuntimeException | IOException | ClassNotFoundException e) { + } catch (ScribRuntimeException | IOException | ClassNotFoundException e) { e.printStackTrace(); } } From f04f3c907ad53580ccbea11150ef6699b1f30e63 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 8 May 2019 23:26:43 +0100 Subject: [PATCH 491/539] [install] Fixed GDelegPayelem. --- .../scribble/ast/global/GDelegPayElem.java | 2 +- .../del/global/GDelegationElemDel.java | 3 ++ .../src/main/java/org/scribble/job/Job.java | 39 ++++++++++--------- .../scribble/core/type/name/GDelegType.java | 7 ++++ .../org/scribble/parser/antlr/Scribble.g | 4 +- .../java/org/scribble/ast/AstFactoryImpl.java | 2 +- .../org/scribble/parser/ScribTreeAdaptor.java | 3 ++ 7 files changed, 37 insertions(+), 23 deletions(-) diff --git a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java index ba094b6f1..4ad4614aa 100644 --- a/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java +++ b/scribble-ast/src/main/java/org/scribble/ast/global/GDelegPayElem.java @@ -79,7 +79,7 @@ public void decorateDel(DelFactory df) public GDelegPayElem reconstruct(GProtoNameNode proto, RoleNode role) { GDelegPayElem dup = dupNode(); - addScribChildren(proto, role); + dup.addScribChildren(proto, role); dup.setDel(del()); // No copy return dup; } diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java index e9a36b49b..6a1f26e3c 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -46,6 +46,9 @@ public void enterDisambiguation(ScribNode child, ModuleContext mc = disamb.getModuleContext(); GDelegPayElem de = (GDelegPayElem) child; GProtoNameNode proto = de.getProtocolChild(); + + System.out.println("aaa: " + proto); + GProtoName gpn = proto.toName(); if (!mc.isVisibleProtocolDeclName(gpn)) { diff --git a/scribble-ast/src/main/java/org/scribble/job/Job.java b/scribble-ast/src/main/java/org/scribble/job/Job.java index a29dbd36c..153b7fbcc 100644 --- a/scribble-ast/src/main/java/org/scribble/job/Job.java +++ b/scribble-ast/src/main/java/org/scribble/job/Job.java @@ -108,6 +108,26 @@ protected JobContext newJobContext(Job job, return new JobContext(this, parsed); } + // First run Visitor passes, then call toJob + // Base implementation: ambigname disamb pass only + public void runPasses() throws ScribException + { + verbosePrintPass("Starting Job passes on:"); + for (ModuleName fullname : this.context.getFullModuleNames()) + { + verbosePrintln(this.context.getModule(fullname).toString()); + } + + // Disamb is a "leftover" aspect of parsing -- so not in core + // N.B. disamb is mainly w.r.t. ambignames -- e.g., doesn't fully qualify names (currently mainly done by imed translation) + // CHECKME: disamb also currently does checks like do-arg kind and arity -- refactor into core? -- also does, e.g., distinct roledecls, protodecls, etc. + runVisitorPassOnAllModules(this.config.vf.DelDecorator(this)); + // Currently, only for the simple name nodes "constructed directly" by parser, e.g., t=ID -> ID<...Node>[$t] + // CHECKME: refactor to construct (and set del) all uniformly via ScribTreeAdaptor, to deprecate DelDecorator? + + runVisitorPassOnAllModules(this.config.vf.NameDisambiguator(this)); // Includes validating names used in subprotocol calls.. + } + // "Finalises" this Job -- initialises the Job at this point, and cannot run futher Visitor passes on Job // So, typically, Job passes should be finished before calling this // Core passes may subsequently mutate Core(Context) though @@ -214,25 +234,6 @@ else if (kind.equals(SigKind.KIND)) return res; // CHECKME: (interleaved) ordering between proto and nonproto (Module) imports -- order by original Global import order? } - - // First run Visitor passes, then call toJob - // Base implementation: ambigname disamb pass only - public void runPasses() throws ScribException - { - verbosePrintPass("Starting Job passes on:"); - for (ModuleName fullname : this.context.getFullModuleNames()) - { - verbosePrintln(this.context.getModule(fullname).toString()); - } - - // Disamb is a "leftover" aspect of parsing -- so not in core - // N.B. disamb is mainly w.r.t. ambignames -- e.g., doesn't fully qualify names (currently mainly done by imed translation) - // CHECKME: disamb also currently does checks like do-arg kind and arity -- refactor into core? -- also does, e.g., distinct roledecls, protodecls, etc. - runVisitorPassOnAllModules(this.config.vf.DelDecorator(this)); - // Currently, only for the simple name nodes "constructed directly" by parser, e.g., t=ID -> ID<...Node>[$t] - // CHECKME: refactor to construct (and set del) all uniformly via ScribTreeAdaptor, to deprecate DelDecorator? - runVisitorPassOnAllModules(this.config.vf.NameDisambiguator(this)); // Includes validating names used in subprotocol calls.. - } public void runVisitorPassOnAllModules(AstVisitor v) throws ScribException { diff --git a/scribble-core/src/main/java/org/scribble/core/type/name/GDelegType.java b/scribble-core/src/main/java/org/scribble/core/type/name/GDelegType.java index f63a165ba..d8881dab3 100644 --- a/scribble-core/src/main/java/org/scribble/core/type/name/GDelegType.java +++ b/scribble-core/src/main/java/org/scribble/core/type/name/GDelegType.java @@ -53,6 +53,13 @@ public Local getKind() { return Local.KIND; } + + @Override + public String toString() + { + return this.proto + "@" + this.role; + } + @Override public boolean equals(Object o) diff --git a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g index ed33f64d3..303606541 100644 --- a/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g +++ b/scribble-parser/src/main/antlr3/org/scribble/parser/antlr/Scribble.g @@ -95,7 +95,7 @@ tokens SIG_LIT = 'SIG_LIT'; PAYELEM_LIST = 'PAYELEM_LIST'; UNARY_PAYELEM = 'UNARY_PAYELEM'; - DELEG_PAYELEM = 'DELEG_PAYELEM'; + GDELEG_PAYELEM = 'GDELEG_PAYELEM'; // Scribble "language" nodes, i.e., the nodes that are not "session nodes" (see below) MODULE = 'MODULE'; @@ -409,7 +409,7 @@ payelem: // Payload element must be a data kind, cannot be a sig name // Qualified name must be a data type name // Also subsumes simple names, could be a data *param* - gprotoname '@' rolename -> ^(DELEG_PAYELEM rolename gprotoname) + gprotoname '@' rolename -> ^(GDELEG_PAYELEM gprotoname rolename) | ambigname -> ^(UNARY_PAYELEM ambigname) | diff --git a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java index 1a288ab80..b11dc9840 100644 --- a/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-parser/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -513,7 +513,7 @@ public UnaryPayElem UnaryPayElem(Token t, public GDelegPayElem GDelegPayElem(Token t, GProtoNameNode proto, RoleNode role) { - t = newToken(t, ScribbleParser.DELEG_PAYELEM); + t = newToken(t, ScribbleParser.GDELEG_PAYELEM); GDelegPayElem n = new GDelegPayElem(t); n.addScribChildren(proto, role); n.decorateDel(this.df); diff --git a/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java b/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java index 7c7c5c3d2..10b18fdff 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java +++ b/scribble-parser/src/main/java/org/scribble/parser/ScribTreeAdaptor.java @@ -42,6 +42,7 @@ import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GConnect; import org.scribble.ast.global.GContinue; +import org.scribble.ast.global.GDelegPayElem; import org.scribble.ast.global.GDisconnect; import org.scribble.ast.global.GDo; import org.scribble.ast.global.GInteractionSeq; @@ -135,6 +136,7 @@ public ScribNode create(Token t) case ScribbleParser.SIG_LIT: n = new SigLitNode(t); break; case ScribbleParser.PAYELEM_LIST: n = new PayElemList(t); break; case ScribbleParser.UNARY_PAYELEM: n = new UnaryPayElem<>(t); break; + case ScribbleParser.GDELEG_PAYELEM: n = new GDelegPayElem(t); break; case ScribbleParser.GMSGTRANSFER: n = new GMsgTransfer(t); break; case ScribbleParser.GCONNECT: n = new GConnect(t); break; @@ -161,6 +163,7 @@ public ScribNode create(Token t) } } n.decorateDel(this.df); + return n; } } From c353548f9b0a2507da1bb7bd8ba3ece93709e826 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 9 May 2019 11:21:29 +0100 Subject: [PATCH 492/539] [AllTest] Minor. --- scribble-test/src/test/scrib/tmp/Test.scr | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index bf93371bf..fc161e9e3 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -78,11 +78,6 @@ module tmp.Test; // add exp conn checks to model validation, maybe just as estatevisitor? (cf. prev syntactic connection checks) -- now done as global syntax visitor // ...refactor -spin as an ext -- dropped -spin from master - // Outstanding: - // ...disallow/check for reserved __ -- do in gtype translation? is mainly for codegen though? maybe also inlining? - // FIXME: qualifed sig name as non-role do-arg - // CHECKME: duplicate proto mods (unit tests) - // parser/ast re-refactoring // split mf to global/local subcomps, make protected constrs -- done // check G/LType casts vs. SType (favour latter) -- done: simplified Seq elems, removed Do.proto N param @@ -99,6 +94,13 @@ module tmp.Test; // wrap base class, more global base classes (maybe in del's) -- done: just wrap base classes -- TODO: further factoring, e.g., LDirectedInteraction getSelf/Peer // Job Module projection, projected imports/nonprotodecls -- locals import globals for nonprotos? (better for "projects" clause?) -- done: basic, but nonprotos "copied" from globals -- TODO: import global? + // Outstanding: + // refactor Core pass printing on pass entry + // test self comm + // ...disallow/check for reserved __ -- do in gtype translation? is mainly for codegen though? maybe also inlining? + // FIXME: qualifed sig name as non-role do-arg + // CHECKME: duplicate proto mods (unit tests) + // refactor Set to Map -- Map to Set (HashSet is just a HashMap anyway) // fully refactor imed/module projection to Job: old style subproto visitor for imed-projection do-pruning -- move imed-projs from Core to Job ? // refactor imed projection role pruning? currently done once for globals, which is done for locals once and then pruning done again for do-args @@ -130,7 +132,7 @@ module tmp.Test; data "..." from "..." as T; -//* +/* global protocol Proto1(role A, role B) { 1(T) from A to B; From 1d8bfd7ed4eaf8cd675f7dbbfa36bbe6a4a33347 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 9 May 2019 11:30:28 +0100 Subject: [PATCH 493/539] [AllTest] Minor. --- .../scribble/core/model/endpoint/EState.java | 81 ------------------- scribble-test/src/test/scrib/tmp/Test.scr | 2 +- 2 files changed, 1 insertion(+), 82 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index f6c6ab8a4..796a2b92c 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -241,87 +241,6 @@ private void expandUnfairCases(ModelFactory mf, EState term, Set todo, } } - public String toPml(Role r) - { - Map seen = new HashMap<>(); - return - "active proctype " + r + "() {\n" - + toPml(seen, r) + "\n" - + "}\n"; - } - - protected String toPml(Map seen, Role r) - { - if (seen.containsKey(this.id)) - { - //return "goto " + getLabel(seen, this.id, r) + "\n"; - return ""; - } - - String lab = getLabel(seen, this, r); - Map tmp = new HashMap<>(seen); - tmp.put(this.id, lab); - - String res = lab + ":\n"; - EStateKind kind = getStateKind(); - List as = getDetActions(); - if (kind == EStateKind.OUTPUT) - { - if (as.stream().anyMatch(a -> !a.isSend())) - { - throw new RuntimeException("TODO: " + as); - } - - res += //"lab" + this.id + ":\n" - "if\n" - + as.stream().map(a -> - "::\n" - + "skip ->\n" - + "s_" + r + "_" + a.peer + "!" + a.mid + ";\n" - + "goto " + getLabel(seen, getDetSuccessor(a), r) + "\n" - ) - .collect(Collectors.joining("")) - + "fi\n"; - } - else if (kind == EStateKind.UNARY_RECEIVE || kind == EStateKind.POLY_RECIEVE) - { - res += - "if\n" - + as.stream().map(a -> - "::\n" - + "r_" + a.peer + "_" + r + "?[" + a.mid + "] ->\n" - + "r_" + a.peer + "_" + r + "?" + a.mid + ";\n" - + "goto " + getLabel(seen, getDetSuccessor(a), r) + "\n" - ) - .collect(Collectors.joining("")) - + "fi\n"; - } - else if (kind == EStateKind.TERMINAL) - { - res += "skip\n"; - } - else - { - throw new RuntimeException("TODO: " + kind); - } - - res += as.stream().map(x -> "\n" + getDetSuccessor(x).toPml(tmp, r)) - .collect(Collectors.joining("")); - - return res; - } - - private static String getLabel(Map seen, EState s, Role r) - { - if (seen.containsKey(s.id)) - { - return seen.get(s.id); - } - String lab = (s.isTerminal() ? "end" : "label") + r + s.id; - seen.put(s.id, lab); - return lab; - } - // CHECKME: make an isSync in IOAction ? // This state is a *necessarily* "blocking" output sync-client (request, clientwrap) state public boolean isSyncClientOnly() diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index fc161e9e3..7c8fdf06c 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -132,7 +132,7 @@ module tmp.Test; data "..." from "..." as T; -/* +//* global protocol Proto1(role A, role B) { 1(T) from A to B; From f123c8001fecd3b450fd8f368c6dbdfa50555b6e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 9 May 2019 11:30:35 +0100 Subject: [PATCH 494/539] [AllTest] Minor. --- .../src/main/java/org/scribble/core/model/endpoint/EState.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java index 796a2b92c..e08a3162c 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EState.java @@ -23,7 +23,6 @@ import java.util.Map; import java.util.Set; import java.util.function.Function; -import java.util.stream.Collectors; import org.scribble.core.model.MPrettyState; import org.scribble.core.model.MState; @@ -32,7 +31,6 @@ import org.scribble.core.model.visit.local.EStateVisitor; import org.scribble.core.type.kind.Local; import org.scribble.core.type.name.RecVar; -import org.scribble.core.type.name.Role; import org.scribble.util.Pair; import org.scribble.util.ScribException; From b789a270eb2851c193ce8105c975e7d998aca611 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 9 May 2019 11:31:34 +0100 Subject: [PATCH 495/539] [AllTest] Minor. --- .../src/main/java/org/scribble/core/model/endpoint/EGraph.java | 1 - 1 file changed, 1 deletion(-) diff --git a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java index f34027c30..0aacf17a6 100644 --- a/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java +++ b/scribble-core/src/main/java/org/scribble/core/model/endpoint/EGraph.java @@ -14,7 +14,6 @@ package org.scribble.core.model.endpoint; import org.scribble.core.model.MPrettyPrint; -import org.scribble.core.type.name.Role; public class EGraph implements MPrettyPrint { From 02dbf9abd9993b17c809aa610311452ec4c763bc Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 9 May 2019 11:52:29 +0100 Subject: [PATCH 496/539] [AllTest] Minor. --- .../core/visit/global/InlinedProjector.java | 6 +++--- .../betty16/src/betty16/lec2/adder/Adder.scr | 2 +- .../src/bettybook/math/scrib/Math.scr | 2 +- .../scrib/coco/src/coco/fibo/Fibo.scr | 2 +- .../scrib/fase16/src/fase16/adder/Adder.scr | 2 +- scribble-demos/scrib/fib/src/fib/Fib.scr | 2 +- .../scrib/loan/src/loan/LoanApplication.scr | 18 +++++++++--------- scribble-demos/scrib/nego/src/nego/Nego1.scr | 2 +- scribble-demos/scrib/nego/src/nego/Nego2.scr | 2 +- scribble-demos/scrib/nego/src/nego/Nego3.scr | 2 +- .../threebuyer/src/threebuyer/ThreeBuyer.scr | 6 +++--- .../threebuyer/src/threebuyer/ThreeBuyer2.scr | 6 +++--- .../scrib/travel/src/travel/Travel.scr | 4 ++-- .../tutorial/src/tutorial/adder/Adder.scr | 2 +- .../scrib/twobuyer/src/twobuyer/TwoBuyer.scr | 8 ++++---- .../demo/supplierinfo/SupplierInfoExplicit.scr | 1 + .../demo/supplierinfo/SupplierInfoNoFair.scr | 16 ++++++++-------- .../supplierinfo/{ => old}/SupplierInfo.scr | 0 .../{ => old}/SupplierInfoBasic.scr | 0 .../{ => old}/SupplierInfoDemo.scr | 0 .../{ => old}/SupplierInfoExper.scr | 0 .../{ => old}/SupplierInfoNoFairBeta.scr | 0 .../{ => old}/SupplierInfoOrig.scr | 0 .../{ => old}/SupplierInfoSubprot.scr | 0 24 files changed, 42 insertions(+), 41 deletions(-) rename scribble-test/src/test/scrib/demo/supplierinfo/{ => old}/SupplierInfo.scr (100%) rename scribble-test/src/test/scrib/demo/supplierinfo/{ => old}/SupplierInfoBasic.scr (100%) rename scribble-test/src/test/scrib/demo/supplierinfo/{ => old}/SupplierInfoDemo.scr (100%) rename scribble-test/src/test/scrib/demo/supplierinfo/{ => old}/SupplierInfoExper.scr (100%) rename scribble-test/src/test/scrib/demo/supplierinfo/{ => old}/SupplierInfoNoFairBeta.scr (100%) rename scribble-test/src/test/scrib/demo/supplierinfo/{ => old}/SupplierInfoOrig.scr (100%) rename scribble-test/src/test/scrib/demo/supplierinfo/{ => old}/SupplierInfoSubprot.scr (100%) diff --git a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java index 703fbcdcb..51a82d531 100644 --- a/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java +++ b/scribble-core/src/main/java/org/scribble/core/visit/global/InlinedProjector.java @@ -44,7 +44,7 @@ import org.scribble.core.type.session.local.LTypeFactory; import org.scribble.core.visit.STypeAggNoThrow; -// Pre: use on inlined (i.e., Do inlined, roles pruned) +// Pre: use on inlined (i.e., "do" inlined, roles pruned) public class InlinedProjector extends STypeAggNoThrow { //protected final Set unguarded; @@ -148,8 +148,8 @@ public LType visitDisconnect(DisconnectAction n) // CHECKME: already checked? }*/ LTypeFactory lf = this.core.config.tf.local; - return (n.left.equals(self)) ? lf.LDisconnect(null, n.right) - : (n.right.equals(self)) ? lf.LDisconnect(null, n.left) + return n.left.equals(self) ? lf.LDisconnect(null, n.right) + : n.right.equals(self) ? lf.LDisconnect(null, n.left) : LSkip.SKIP; } diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/Adder.scr b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/Adder.scr index 4eb6c7089..9216608b8 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/adder/Adder.scr +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/adder/Adder.scr @@ -19,7 +19,7 @@ module betty16.lec2.adder.Adder; -type "java.lang.Integer" from "rt.jar" as Integer; +data "java.lang.Integer" from "rt.jar" as Integer; global protocol Adder(role C, role S) { diff --git a/scribble-demos/scrib/bettybook/src/bettybook/math/scrib/Math.scr b/scribble-demos/scrib/bettybook/src/bettybook/math/scrib/Math.scr index c45966aff..f63c2a817 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/math/scrib/Math.scr +++ b/scribble-demos/scrib/bettybook/src/bettybook/math/scrib/Math.scr @@ -4,7 +4,7 @@ module bettybook.math.scrib.Math; -type "java.lang.Integer" from "rt.jar" as Int; +data "java.lang.Integer" from "rt.jar" as Int; // N.B. calling this Math will clash with java.lang.Math diff --git a/scribble-demos/scrib/coco/src/coco/fibo/Fibo.scr b/scribble-demos/scrib/coco/src/coco/fibo/Fibo.scr index 28a35f3a0..9786773ee 100644 --- a/scribble-demos/scrib/coco/src/coco/fibo/Fibo.scr +++ b/scribble-demos/scrib/coco/src/coco/fibo/Fibo.scr @@ -4,7 +4,7 @@ module coco.fibo.Fibo; -type "java.lang.Long" from "rt.jar" as Long; +data "java.lang.Long" from "rt.jar" as Long; global protocol Fibonacci(role A, role B) diff --git a/scribble-demos/scrib/fase16/src/fase16/adder/Adder.scr b/scribble-demos/scrib/fase16/src/fase16/adder/Adder.scr index ef521fdeb..2abbcbe52 100644 --- a/scribble-demos/scrib/fase16/src/fase16/adder/Adder.scr +++ b/scribble-demos/scrib/fase16/src/fase16/adder/Adder.scr @@ -5,7 +5,7 @@ module fase16.adder.Adder; -type "java.lang.Integer" from "rt.jar" as Integer; +data "java.lang.Integer" from "rt.jar" as Integer; global protocol Adder(role C, role S) diff --git a/scribble-demos/scrib/fib/src/fib/Fib.scr b/scribble-demos/scrib/fib/src/fib/Fib.scr index ff927b38f..3a2be9408 100644 --- a/scribble-demos/scrib/fib/src/fib/Fib.scr +++ b/scribble-demos/scrib/fib/src/fib/Fib.scr @@ -4,7 +4,7 @@ module fib.Fib; -type "java.lang.Integer" from "rt.jar" as Int; +data "java.lang.Integer" from "rt.jar" as Int; global protocol Adder(role C, role S) diff --git a/scribble-demos/scrib/loan/src/loan/LoanApplication.scr b/scribble-demos/scrib/loan/src/loan/LoanApplication.scr index ec3230a03..b6beab53c 100644 --- a/scribble-demos/scrib/loan/src/loan/LoanApplication.scr +++ b/scribble-demos/scrib/loan/src/loan/LoanApplication.scr @@ -3,16 +3,16 @@ module loan.LoanApplication; -/*type "CustomerName" from "CustomerName.xsd" as CustomerName; -type "DateOfBirth" from "DateOfBirth.xsd" as DateOfBirth; -type "AnnualSalary" from "AnnualSalary.xsd" as AnnualSalary; -type "CreditRating" from "CreditRating.xsd" as CreditRating; -type "LoanAmount" from "LoanAmount.xsd" as LoanAmount; -type "Approval" from "Approval.xsd" as Approval;*/ +/*data "CustomerName" from "CustomerName.xsd" as CustomerName; +data "DateOfBirth" from "DateOfBirth.xsd" as DateOfBirth; +data "AnnualSalary" from "AnnualSalary.xsd" as AnnualSalary; +data "CreditRating" from "CreditRating.xsd" as CreditRating; +data "LoanAmount" from "LoanAmount.xsd" as LoanAmount; +data "Approval" from "Approval.xsd" as Approval;*/ -type "java.lang.Integer" from "rt.jar" as Int; -type "java.lang.String" from "rt.jar" as String; -type "java.lang.Boolean" from "rt.jar" as Bool; +data "java.lang.Integer" from "rt.jar" as Int; +data "java.lang.String" from "rt.jar" as String; +data "java.lang.Boolean" from "rt.jar" as Bool; global protocol BuyerBrokerSupplier(role Applicant, role ApplicationPortal, role ProcessingDept, role FinanceDept) { diff --git a/scribble-demos/scrib/nego/src/nego/Nego1.scr b/scribble-demos/scrib/nego/src/nego/Nego1.scr index 847cd3631..081ac337c 100644 --- a/scribble-demos/scrib/nego/src/nego/Nego1.scr +++ b/scribble-demos/scrib/nego/src/nego/Nego1.scr @@ -2,7 +2,7 @@ module nego.Nego1; -type "test.nego.SAP" from "test/nego/SAP.java" as SAP; +data "test.nego.SAP" from "test/nego/SAP.java" as SAP; // C = Consumer, P = Producer global protocol Negotiate(role C, role P) diff --git a/scribble-demos/scrib/nego/src/nego/Nego2.scr b/scribble-demos/scrib/nego/src/nego/Nego2.scr index 17231c7de..132f1c3a8 100644 --- a/scribble-demos/scrib/nego/src/nego/Nego2.scr +++ b/scribble-demos/scrib/nego/src/nego/Nego2.scr @@ -2,7 +2,7 @@ module demo.nego.Nego2; -type "test.nego.SAP" from "test/nego/SAP.java" as SAP; +data "test.nego.SAP" from "test/nego/SAP.java" as SAP; // C = Consumer, P = Producer global protocol Negotiate(role C, role P) diff --git a/scribble-demos/scrib/nego/src/nego/Nego3.scr b/scribble-demos/scrib/nego/src/nego/Nego3.scr index 6a3f5d705..83e3e65d8 100644 --- a/scribble-demos/scrib/nego/src/nego/Nego3.scr +++ b/scribble-demos/scrib/nego/src/nego/Nego3.scr @@ -2,7 +2,7 @@ module demo.nego.Nego3; -type "test.nego.SAP" from "test/nego/SAP.java" as SAP; +data "test.nego.SAP" from "test/nego/SAP.java" as SAP; // C = Consumer, P = Producer global protocol Negotiate(role C, role P) diff --git a/scribble-demos/scrib/threebuyer/src/threebuyer/ThreeBuyer.scr b/scribble-demos/scrib/threebuyer/src/threebuyer/ThreeBuyer.scr index d3ce0b25c..6e691d748 100644 --- a/scribble-demos/scrib/threebuyer/src/threebuyer/ThreeBuyer.scr +++ b/scribble-demos/scrib/threebuyer/src/threebuyer/ThreeBuyer.scr @@ -5,9 +5,9 @@ module threebuyer.ThreeBuyer; -type "java.lang.Integer" from "rt.jar" as Int; -type "java.lang.String" from "rt.jar" as String; -type "test.twobuyer.Date" from "test/twobuyer/Date.java" as Date; +data "java.lang.Integer" from "rt.jar" as Int; +data "java.lang.String" from "rt.jar" as String; +data "test.twobuyer.Date" from "test/twobuyer/Date.java" as Date; // 1 = B, 2 = A, 3 = S diff --git a/scribble-demos/scrib/threebuyer/src/threebuyer/ThreeBuyer2.scr b/scribble-demos/scrib/threebuyer/src/threebuyer/ThreeBuyer2.scr index e70dc5284..ab1eef33f 100644 --- a/scribble-demos/scrib/threebuyer/src/threebuyer/ThreeBuyer2.scr +++ b/scribble-demos/scrib/threebuyer/src/threebuyer/ThreeBuyer2.scr @@ -1,9 +1,9 @@ module threebuyer.ThreeBuyer2; -type "java.lang.Integer" from "rt.jar" as Int; -type "java.lang.String" from "rt.jar" as String; -type "test.twobuyer.Date" from "test/twobuyer/Date.java" as Date; +data "java.lang.Integer" from "rt.jar" as Int; +data "java.lang.String" from "rt.jar" as String; +data "test.twobuyer.Date" from "test/twobuyer/Date.java" as Date; // 1 = B, 2 = A, 3 = S diff --git a/scribble-demos/scrib/travel/src/travel/Travel.scr b/scribble-demos/scrib/travel/src/travel/Travel.scr index f2f0d9941..ee67824fe 100644 --- a/scribble-demos/scrib/travel/src/travel/Travel.scr +++ b/scribble-demos/scrib/travel/src/travel/Travel.scr @@ -3,8 +3,8 @@ module travel.Travel; -type "java.lang.Integer" from "rt.jar" as Int; -type "java.lang.String" from "rt.jar" as String; +data "java.lang.Integer" from "rt.jar" as Int; +data "java.lang.String" from "rt.jar" as String; //* diff --git a/scribble-demos/scrib/tutorial/src/tutorial/adder/Adder.scr b/scribble-demos/scrib/tutorial/src/tutorial/adder/Adder.scr index 9add83e44..15359f537 100644 --- a/scribble-demos/scrib/tutorial/src/tutorial/adder/Adder.scr +++ b/scribble-demos/scrib/tutorial/src/tutorial/adder/Adder.scr @@ -16,7 +16,7 @@ module tutorial.adder.Adder; -type "java.lang.Integer" from "rt.jar" as Int; +data "java.lang.Integer" from "rt.jar" as Int; global protocol Adder(role C, role S) { diff --git a/scribble-demos/scrib/twobuyer/src/twobuyer/TwoBuyer.scr b/scribble-demos/scrib/twobuyer/src/twobuyer/TwoBuyer.scr index 69c61841c..c9565fc2b 100644 --- a/scribble-demos/scrib/twobuyer/src/twobuyer/TwoBuyer.scr +++ b/scribble-demos/scrib/twobuyer/src/twobuyer/TwoBuyer.scr @@ -1,10 +1,10 @@ module twobuyer.TwoBuyer; -type "java.lang.Integer" from "rt.jar" as int; -type "java.lang.String" from "rt.jar" as String; -type "test.twobuyer.Address" from "test/twobuyer/Address.java" as Address; -type "test.twobuyer.Date" from "test/twobuyer/Date.java" as Date; +data "java.lang.Integer" from "rt.jar" as int; +data "java.lang.String" from "rt.jar" as String; +data "test.twobuyer.Address" from "test/twobuyer/Address.java" as Address; +data "test.twobuyer.Date" from "test/twobuyer/Date.java" as Date; global protocol TwoBuyer(role A, role B, role S) diff --git a/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoExplicit.scr b/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoExplicit.scr index 1f34b8e37..f431eb65f 100644 --- a/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoExplicit.scr +++ b/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoExplicit.scr @@ -14,6 +14,7 @@ type "..." from "...xsd" as usercontext; type "..." from "...xsd" as filters; +// Needs -fair -- cf. SupplierInfoNoFair explicit global protocol InfoAuth ( role Client, diff --git a/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr b/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr index 8a70da527..ea093745d 100644 --- a/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr +++ b/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr @@ -4,14 +4,14 @@ module src.SupplierInfoNoFair; -type "UserName" from "AUTH.xsd" as username; -type "Password" from "AUTH.xsd" as password; -type "UUID" from "AUTH.xsd" as uuid; -type "/retailhub/supplierdetails" from "Retailer.xsd" as supplierdetails; -type "/retailhub/contractdetails" from "Retailer.xsd" as contractdetails; +data "UserName" from "AUTH.xsd" as username; +data "Password" from "AUTH.xsd" as password; +data "UUID" from "AUTH.xsd" as uuid; +data "/retailhub/supplierdetails" from "Retailer.xsd" as supplierdetails; +data "/retailhub/contractdetails" from "Retailer.xsd" as contractdetails; -type "..." from "...xsd" as usercontext; -type "..." from "...xsd" as filters; +data "..." from "...xsd" as usercontext; +data "..." from "...xsd" as filters; explicit global protocol InfoAuth @@ -29,7 +29,7 @@ explicit global protocol InfoAuth choice at LoginSvc { loginfailure() from LoginSvc to Client; - //disconnect Client and LoginSvc; + //disconnect Client and LoginSvc; // Increases state space somewhat } or { diff --git a/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfo.scr b/scribble-test/src/test/scrib/demo/supplierinfo/old/SupplierInfo.scr similarity index 100% rename from scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfo.scr rename to scribble-test/src/test/scrib/demo/supplierinfo/old/SupplierInfo.scr diff --git a/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoBasic.scr b/scribble-test/src/test/scrib/demo/supplierinfo/old/SupplierInfoBasic.scr similarity index 100% rename from scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoBasic.scr rename to scribble-test/src/test/scrib/demo/supplierinfo/old/SupplierInfoBasic.scr diff --git a/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoDemo.scr b/scribble-test/src/test/scrib/demo/supplierinfo/old/SupplierInfoDemo.scr similarity index 100% rename from scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoDemo.scr rename to scribble-test/src/test/scrib/demo/supplierinfo/old/SupplierInfoDemo.scr diff --git a/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoExper.scr b/scribble-test/src/test/scrib/demo/supplierinfo/old/SupplierInfoExper.scr similarity index 100% rename from scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoExper.scr rename to scribble-test/src/test/scrib/demo/supplierinfo/old/SupplierInfoExper.scr diff --git a/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoNoFairBeta.scr b/scribble-test/src/test/scrib/demo/supplierinfo/old/SupplierInfoNoFairBeta.scr similarity index 100% rename from scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoNoFairBeta.scr rename to scribble-test/src/test/scrib/demo/supplierinfo/old/SupplierInfoNoFairBeta.scr diff --git a/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoOrig.scr b/scribble-test/src/test/scrib/demo/supplierinfo/old/SupplierInfoOrig.scr similarity index 100% rename from scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoOrig.scr rename to scribble-test/src/test/scrib/demo/supplierinfo/old/SupplierInfoOrig.scr diff --git a/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoSubprot.scr b/scribble-test/src/test/scrib/demo/supplierinfo/old/SupplierInfoSubprot.scr similarity index 100% rename from scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoSubprot.scr rename to scribble-test/src/test/scrib/demo/supplierinfo/old/SupplierInfoSubprot.scr From a8433ee62e04beb1769fbef825981cefd73d3e9d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 9 May 2019 14:00:15 +0100 Subject: [PATCH 497/539] Minor edits to README.md --- README.md | 32 +++++++++++-------- .../java/org/scribble/cli/CommandLine.java | 2 +- .../java/org/scribble/core/job/CoreArgs.java | 2 +- scribble-dist/src/main/resources/scribblec.sh | 3 -- .../scribble/main/ScribRuntimeException.java | 3 +- 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 7ee299c2b..408b44a3a 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,19 @@ # Java Tooling for Scribble -This project provides Java tooling/libraries for the Scribble multi-party protocol definition language. +This project provides Java tooling/libraries for the Scribble multi-party +protocol definition language. ## Building from source -First step is to clone this git repository locally. Once available, run the following maven command to build -the project: +First step is to clone this git repository locally. Once available, run the +following maven command to build the project: mvn [clean] install -The distribution will be available from the folder _scribble-dist/target_. The contents of the zip is: +The distribution will be available from the folder _scribble-dist/target_. The +contents of the zip is: - lib jars needed to run the scribble-java tool - scribblec.sh script for running the command line tool @@ -20,21 +22,20 @@ The distribution will be available from the folder _scribble-dist/target_. The c ## Command line usage: +Assuming scribblec.sh has been extracted from the above zip: + > List command line options. ./scribblec.sh --help +Assuming a Scribble module file Test.scr in the same directory: -> Check well-formedness of global protocols in, e.g., Test.scr. +> Check well-formedness of global protocols in module Test.scr. ./scribblec.sh Test.scr -Notes: -- Use the -oldwf command line flag to use the simpler syntactic protocol - well-formedness from the previous version of Scribble. -- Use the -V command line flag to obtain full traces for errors according - to the new protocol validation (and other details). - +Note: try the -V command line flag to obtain full traces for errors (and other + details). > Project local protocol for role "C" of protocol "Proto" in Test.scr @@ -52,6 +53,8 @@ Notes: ./scribblec.sh -d . Test.scr -api Proto C +Note: omitting the -d argument will print the output to stdout. + ## Examples: @@ -64,8 +67,8 @@ Further examples can be found in: https://github.com/scribble/scribble-java/tree/master/scribble-demos/scrib -The distribution zip does not include these examples. They can be obtained -as part of the source repository, or separately via the above link. +The distribution zip does not include these examples. They can be obtained as +part of the source repository, or separately via the above link. > E.g. To generate the Java Endpoint API for role "C" in the "Adder" protocol from the Scribble-Java tutorial (http://www.scribble.org/docs/scribble-java.html#QUICK) @@ -93,7 +96,7 @@ Or try (from Nick Ng): Bugs and issues can be reported via the github Issues facility. -Or email rhu1234 [at] doc.ic.ac.uk excluding the 1234. +Or email r.z.h.hu1234 [at] herts.ac.uk excluding the 1234. [ci-img]: https://travis-ci.org/scribble/scribble-java.svg?branch=master @@ -102,3 +105,4 @@ Or email rhu1234 [at] doc.ic.ac.uk excluding the 1234. [cov]: https://coveralls.io/github/scribble/scribble-java?branch=master [maven-img]: https://img.shields.io/maven-central/v/org.scribble/scribble-core.svg?maxAge=2592000 [maven]: http://search.maven.org/#search%7Cga%7C1%7Cscribble-core + diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 2c3f63af6..6b1d78698 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -174,7 +174,7 @@ protected void tryNonBarrierTask(Job job, Pair task) outputSGraph(job, task.right, true, true); break; - // CHECKME: -unfair needs to be barrier-ed on syntactic WF? (unfair-transform graph building may crash, e.g., bad.wfchoice.enabling.threeparty.Test02) + // CHECKME: -unfair needs to be barrier-ed on syntactic WF? (o/w unfair-transform graph building may crash, e.g., bad.wfchoice.enabling.threeparty.Test02) // Currently, "construction-on-demand" CoreContext getters will still cause these to be attempted even if syntactic WF fails case CLFlags.VALIDATION_EFSM_FLAG: outputEGraph(job, task.right, false, true, false); diff --git a/scribble-core/src/main/java/org/scribble/core/job/CoreArgs.java b/scribble-core/src/main/java/org/scribble/core/job/CoreArgs.java index 1028573cf..562ab28cb 100644 --- a/scribble-core/src/main/java/org/scribble/core/job/CoreArgs.java +++ b/scribble-core/src/main/java/org/scribble/core/job/CoreArgs.java @@ -22,7 +22,7 @@ public enum CoreArgs NO_PROGRESS, // TODO: deprecate MIN_EFSM, // Currently only affects EFSM output (i.e. -fsm, -dot) and API gen -- doesn't affect model checking - OLD_WF, + OLD_WF, // TODO: deprecate NO_LCHOICE_SUBJ_CHECK, // For debugging only? NO_ACC_CORRELATION_CHECK, // Currently unused ; diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index c7a33686e..1691e92fe 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -52,9 +52,6 @@ Options: -ip Scribble module import path$ - -oldwf Use the simpler syntactic protocol well-formedness - - -project Project protocol -fsm Generate default Endpoint FSM diff --git a/scribble-runtime/src/main/java/org/scribble/main/ScribRuntimeException.java b/scribble-runtime/src/main/java/org/scribble/main/ScribRuntimeException.java index 45ada76ce..6f7b1e75a 100644 --- a/scribble-runtime/src/main/java/org/scribble/main/ScribRuntimeException.java +++ b/scribble-runtime/src/main/java/org/scribble/main/ScribRuntimeException.java @@ -13,7 +13,8 @@ */ package org.scribble.main; -// Note: not a runtime ScribbleException +// Note: not a run-time ScribbleException +// CHECKME: relocate? public class ScribRuntimeException extends Exception { private static final long serialVersionUID = 1L; From bc1c911d3edf006f64f2bd17425ca695ecb3b5be Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 12 May 2019 20:37:06 +0100 Subject: [PATCH 498/539] [AllTest] Fixed scribblec.sh, lang renamed to ast. --- scribble-dist/src/main/resources/scribblec.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index 1691e92fe..45528e818 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -98,22 +98,22 @@ fixpath() { ARGS= -CLASSPATH=$DIR'/scribble-cli/target/classes/' -CLASSPATH=$CLASSPATH':'$DIR'/scribble-core/target/classes' -CLASSPATH=$CLASSPATH':'$DIR'/scribble-lang/target/classes' -CLASSPATH=$CLASSPATH':'$DIR'/scribble-parser/target/classes' +CLASSPATH=$DIR'/scribble-ast/target/classes' +CLASSPATH=$CLASSPATH':'$DIR'/scribble-cli/target/classes' CLASSPATH=$CLASSPATH':'$DIR'/scribble-codegen/target/classes' +CLASSPATH=$CLASSPATH':'$DIR'/scribble-core/target/classes' CLASSPATH=$CLASSPATH':'$DIR'/scribble-main/target/classes' +CLASSPATH=$CLASSPATH':'$DIR'/scribble-parser/target/classes' CLASSPATH=$CLASSPATH':'$ANTLR CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/antlr.jar' CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/antlr-runtime.jar' CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/commons-io.jar' -CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-core.jar' -CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-lang.jar' -CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-parser.jar' +CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-ast.jar' +CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-cli.jar' CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-codegen.jar' +CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-core.jar' CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-main.jar' -CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-cli.jar' +CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-parser.jar' CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/stringtemplate.jar' CLASSPATH="'"`fixpath "$CLASSPATH"`"'" From 9c828308e8aa015a8c6f4eb246a5e2130b493905 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Tue, 30 Jul 2019 19:42:40 +0100 Subject: [PATCH 499/539] Minor. --- mvnw | 0 .../src/main/java/org/scribble/del/local/LAccDel.java | 0 .../src/main/java/org/scribble/del/local/LChoiceDel.java | 0 .../main/java/org/scribble/del/local/LClientWrapDel.java | 0 .../main/java/org/scribble/del/local/LContinueDel.java | 0 .../src/main/java/org/scribble/del/local/LDel.java | 0 .../main/java/org/scribble/del/local/LDisconnectDel.java | 0 .../src/main/java/org/scribble/del/local/LDoDel.java | 0 .../java/org/scribble/del/local/LInteractionSeqDel.java | 0 .../main/java/org/scribble/del/local/LMsgTransferDel.java | 0 .../java/org/scribble/del/local/LProjectionDeclDel.java | 0 .../main/java/org/scribble/del/local/LProtoBlockDel.java | 0 .../main/java/org/scribble/del/local/LProtoDeclDel.java | 0 .../main/java/org/scribble/del/local/LProtoDefDel.java | 0 .../main/java/org/scribble/del/local/LRecursionDel.java | 0 .../src/main/java/org/scribble/del/local/LRecvDel.java | 0 .../src/main/java/org/scribble/del/local/LReqDel.java | 0 .../src/main/java/org/scribble/del/local/LSendDel.java | 0 .../main/java/org/scribble/del/local/LServerWrapDel.java | 0 .../java/org/scribble/core/model/ModelFactoryBase.java | 0 .../main/java/org/scribble/core/visit/STypeInliner.java | 0 scribble-test/src/test/scrib/test/test3/MyA.java | 8 ++++---- scribble-test/src/test/scrib/test/test3/MyC.java | 8 ++++---- scribble-test/src/test/scrib/test/test3/Test3.scr | 2 +- scribble-test/src/test/scrib/tmp/Test.scr | 6 ++++++ travis/publish.sh | 0 26 files changed, 15 insertions(+), 9 deletions(-) mode change 100755 => 100644 mvnw mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LAccDel.java mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LClientWrapDel.java mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LDel.java mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LMsgTransferDel.java mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LProtoBlockDel.java mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LProtoDeclDel.java mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LProtoDefDel.java mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LRecvDel.java mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LReqDel.java mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java mode change 100755 => 100644 scribble-ast/src/main/java/org/scribble/del/local/LServerWrapDel.java mode change 100755 => 100644 scribble-core/src/main/java/org/scribble/core/model/ModelFactoryBase.java mode change 100755 => 100644 scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java mode change 100755 => 100644 travis/publish.sh diff --git a/mvnw b/mvnw old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LAccDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LAccDel.java old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LChoiceDel.java old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LClientWrapDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LClientWrapDel.java old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LContinueDel.java old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDel.java old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDisconnectDel.java old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LDoDel.java old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LInteractionSeqDel.java old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LMsgTransferDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LMsgTransferDel.java old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProjectionDeclDel.java old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtoBlockDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtoBlockDel.java old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtoDeclDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtoDeclDel.java old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LProtoDefDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LProtoDefDel.java old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LRecursionDel.java old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LRecvDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LRecvDel.java old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LReqDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LReqDel.java old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LSendDel.java old mode 100755 new mode 100644 diff --git a/scribble-ast/src/main/java/org/scribble/del/local/LServerWrapDel.java b/scribble-ast/src/main/java/org/scribble/del/local/LServerWrapDel.java old mode 100755 new mode 100644 diff --git a/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryBase.java b/scribble-core/src/main/java/org/scribble/core/model/ModelFactoryBase.java old mode 100755 new mode 100644 diff --git a/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java b/scribble-core/src/main/java/org/scribble/core/visit/STypeInliner.java old mode 100755 new mode 100644 diff --git a/scribble-test/src/test/scrib/test/test3/MyA.java b/scribble-test/src/test/scrib/test/test3/MyA.java index 86ab5e89e..e13d1b4f1 100644 --- a/scribble-test/src/test/scrib/test/test3/MyA.java +++ b/scribble-test/src/test/scrib/test/test3/MyA.java @@ -31,18 +31,18 @@ public class MyA public static void main(String[] args) throws IOException { Proto1 P1 = new Proto1(); - try (Proto1_A a + try (Proto1_A aep = new Proto1_A<>(P1, A, new ObjectStreamFormatter(), new int[1])) { - a.request(B, SocketChannelEndpoint::new, "localhost", 8888); + aep.request(B, SocketChannelEndpoint::new, "localhost", 8888); - a.icallback(Proto1_A_1.id, + aep.icallback(Proto1_A_1.id, x -> (x[0]++ < 3) ? new Proto1_A_1.B._1(123) : new Proto1_A_1.B._3("abc") ); - Future f = a.run(); + Future f = aep.run(); f.get(); System.out.println("(A) end"); diff --git a/scribble-test/src/test/scrib/test/test3/MyC.java b/scribble-test/src/test/scrib/test/test3/MyC.java index 8d4ca1a8e..2ccd7339d 100644 --- a/scribble-test/src/test/scrib/test/test3/MyC.java +++ b/scribble-test/src/test/scrib/test/test3/MyC.java @@ -55,13 +55,13 @@ public void receive(Void data, B peer, _4 op, String x) while (true) { Proto1 P1 = new Proto1(); - try (Proto1_C b = new Proto1_C<>(P1, C, new ObjectStreamFormatter(), null)) + try (Proto1_C cep = new Proto1_C<>(P1, C, new ObjectStreamFormatter(), null)) { - b.accept(ss, B); + cep.accept(ss, B); - b.icallback(Proto1_C_1.id, new MyHandler()); + cep.icallback(Proto1_C_1.id, new MyHandler()); - Future f = b.run(); + Future f = cep.run(); f.get(); System.out.println("(C) end"); diff --git a/scribble-test/src/test/scrib/test/test3/Test3.scr b/scribble-test/src/test/scrib/test/test3/Test3.scr index 9e9115639..ad9e614cb 100644 --- a/scribble-test/src/test/scrib/test/test3/Test3.scr +++ b/scribble-test/src/test/scrib/test/test3/Test3.scr @@ -10,7 +10,7 @@ global protocol Proto1(role A, role B, role C) { choice at A { - 1(Int) from A to B; //@ statename="mystatename" + 1(Int) from A to B; 2(Int) from B to C; do Proto1(A, B, C); } diff --git a/scribble-test/src/test/scrib/tmp/Test.scr b/scribble-test/src/test/scrib/tmp/Test.scr index 7c8fdf06c..667109c1a 100644 --- a/scribble-test/src/test/scrib/tmp/Test.scr +++ b/scribble-test/src/test/scrib/tmp/Test.scr @@ -115,6 +115,7 @@ module tmp.Test; // CHECKME: accept branching on messages (and safety properties) -- connection should not be established if message stuck? (cf. reception error) -- issue is implementation: what is a realistic semantics for sync-connect-branching (i.e., prevent client from async progressing after messaging) -- consider reversing client/server branching side? i.e. client requests, but then receives? (and consider serverside-branching a sugar?) // fix state numbering? also numbering mismatch between outputs, e.g., minlts // wrap API gen (and refactor wrap AST hierarchy, e.g., base classes) + // CHECKME: req/accept API with message -- accept branch API? // Later: // re-check disamb pass -- e.g., do-target disamb done by translation (CHECKME: DoDel disamb -- should use af?) -- check, e.g., message transfer message disamb (signames, payloads) @@ -128,6 +129,11 @@ module tmp.Test; // add checking between projected-inlined against inlined-projected-imeds, graph building, etc. // add finer-grained result verification +// Multisend -- inference of multisend -- per-choice projection? + + + + data "..." from "..." as T; diff --git a/travis/publish.sh b/travis/publish.sh old mode 100755 new mode 100644 From d5513ebb1e9c4aceb2fce484bff8ac94df5923ce Mon Sep 17 00:00:00 2001 From: rhu1 Date: Fri, 12 Feb 2021 17:55:46 +0000 Subject: [PATCH 500/539] Update version to 0.4.4 --- .gitignore | 1 + pom.xml | 23 ++++++++++----------- scribble-ast/pom.xml | 27 ++++++++++++------------ scribble-cli/pom.xml | 5 ++--- scribble-codegen/pom.xml | 15 +++++++------- scribble-core/pom.xml | 9 ++------ scribble-demos/pom.xml | 7 ++++--- scribble-dist/pom.xml | 16 +++++++-------- scribble-main/pom.xml | 44 +++++++++++++++++++++------------------- scribble-parser/pom.xml | 5 ++--- scribble-runtime/pom.xml | 15 +++++++------- scribble-test/pom.xml | 22 ++++++++++---------- 12 files changed, 92 insertions(+), 97 deletions(-) diff --git a/.gitignore b/.gitignore index 182296daf..ce403a264 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ tools/eclipse/plugins/org.scribble.*/bin/ *~ *.swp *.bak +*.versionsBackup javadoc diff --git a/pom.xml b/pom.xml index 5e9de030d..bf5d50cbc 100644 --- a/pom.xml +++ b/pom.xml @@ -1,9 +1,10 @@ - + + 4.0.0 org.scribble parent - 0.4.4-SNAPSHOT + 0.4.4 pom scribble-java http://www.scribble.org @@ -11,7 +12,6 @@ Scribble - https://github.com/scribble/scribble-java scm:git:https://github.com/scribble/scribble-java.git @@ -72,15 +72,15 @@ scribble-core scribble-runtime - scribble-ast + scribble-ast scribble-parser scribble-codegen - scribble-main + scribble-main scribble-cli scribble-test scribble-dist scribble-demos - + @@ -161,12 +161,10 @@ - + - + org.apache.maven.plugins maven-jar-plugin @@ -286,12 +284,13 @@ mvnw.cmd travis/publish.sh .mvn/wrapper/maven-wrapper.properties + **/*.versionsBackup **/Scribble-0.3.original - **/IGNORE bin/*.sh scribblec.sh **/*.swp scribble-test/**/*.* + **/IGNORE scribble-f17/**/* @@ -388,4 +387,4 @@ - \ No newline at end of file + diff --git a/scribble-ast/pom.xml b/scribble-ast/pom.xml index 0e3ef28d4..a23ee880c 100644 --- a/scribble-ast/pom.xml +++ b/scribble-ast/pom.xml @@ -1,27 +1,26 @@ - - 4.0.0 + + 4.0.0 scribble-ast jar scribble-ast + http://maven.apache.org - - org.scribble - parent - 0.4.4-SNAPSHOT - + + org.scribble + parent + 0.4.4 + - http://maven.apache.org - - UTF-8 - + + UTF-8 + - + org.scribble scribble-core - + diff --git a/scribble-cli/pom.xml b/scribble-cli/pom.xml index 10ef121ae..2525fd8e6 100644 --- a/scribble-cli/pom.xml +++ b/scribble-cli/pom.xml @@ -1,5 +1,4 @@ - + 4.0.0 scribble-cli jar @@ -8,7 +7,7 @@ org.scribble parent - 0.4.4-SNAPSHOT + 0.4.4 ../pom.xml diff --git a/scribble-codegen/pom.xml b/scribble-codegen/pom.xml index 5c844d7f9..0994663e9 100644 --- a/scribble-codegen/pom.xml +++ b/scribble-codegen/pom.xml @@ -1,16 +1,17 @@ - + 4.0.0 + scribble-codegen + scribble-codegen + http://maven.apache.org + org.scribble parent - 0.4.4-SNAPSHOT + 0.4.4 + ../pom.xml - scribble-codegen - scribble-codegen - http://maven.apache.org + UTF-8 diff --git a/scribble-core/pom.xml b/scribble-core/pom.xml index fd1965708..de733f2da 100644 --- a/scribble-core/pom.xml +++ b/scribble-core/pom.xml @@ -1,5 +1,4 @@ - + 4.0.0 scribble-core jar @@ -8,7 +7,7 @@ org.scribble parent - 0.4.4-SNAPSHOT + 0.4.4 ../pom.xml @@ -17,9 +16,5 @@ org.antlr antlr-runtime - diff --git a/scribble-demos/pom.xml b/scribble-demos/pom.xml index 1cd93548a..771eb1a31 100644 --- a/scribble-demos/pom.xml +++ b/scribble-demos/pom.xml @@ -1,6 +1,5 @@ - + 4.0.0 scribble-demos jar @@ -9,7 +8,7 @@ org.scribble parent - 0.4.4-SNAPSHOT + 0.4.4 ../pom.xml @@ -30,6 +29,7 @@ + com.mycila license-maven-plugin @@ -43,6 +43,7 @@ **/stylesheet.css **/script.js **/package-list + **/*.versionsBackup diff --git a/scribble-dist/pom.xml b/scribble-dist/pom.xml index 169eaac9f..55c9d8367 100644 --- a/scribble-dist/pom.xml +++ b/scribble-dist/pom.xml @@ -7,21 +7,19 @@ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> - - 4.0.0 + 4.0.0 + scribble-dist + pom + scribble-dist + Scribble distribution. org.scribble parent - 0.4.4-SNAPSHOT + 0.4.4 + ../pom.xml - scribble-dist - pom - scribble-dist - Scribble distribution. - org.scribble diff --git a/scribble-main/pom.xml b/scribble-main/pom.xml index 94adb86de..c155ed026 100644 --- a/scribble-main/pom.xml +++ b/scribble-main/pom.xml @@ -1,21 +1,22 @@ - - http://maven.apache.org - 4.0.0 - scribble-main - scribble-main + + 4.0.0 + scribble-main + scribble-main + http://maven.apache.org - - org.scribble - parent - 0.4.4-SNAPSHOT - + + org.scribble + parent + 0.4.4 + ../pom.xml + - - UTF-8 - - + + UTF-8 + + + org.scribble scribble-core @@ -28,10 +29,11 @@ org.scribble scribble-ast - - junit - junit - test - - + + + junit + junit + test + + diff --git a/scribble-parser/pom.xml b/scribble-parser/pom.xml index 926914e15..b3eb4aad8 100644 --- a/scribble-parser/pom.xml +++ b/scribble-parser/pom.xml @@ -1,5 +1,4 @@ - + 4.0.0 scribble-parser jar @@ -8,7 +7,7 @@ org.scribble parent - 0.4.4-SNAPSHOT + 0.4.4 ../pom.xml diff --git a/scribble-runtime/pom.xml b/scribble-runtime/pom.xml index d94a6b467..812fb8e9c 100644 --- a/scribble-runtime/pom.xml +++ b/scribble-runtime/pom.xml @@ -1,16 +1,17 @@ - + 4.0.0 + scribble-runtime + scribble-runtime + http://maven.apache.org + org.scribble parent - 0.4.4-SNAPSHOT + 0.4.4 + ../pom.xml - scribble-runtime - scribble-runtime - http://maven.apache.org + UTF-8 diff --git a/scribble-test/pom.xml b/scribble-test/pom.xml index 86fb26dbd..acbde8db3 100644 --- a/scribble-test/pom.xml +++ b/scribble-test/pom.xml @@ -1,18 +1,17 @@ - + 4.0.0 + scribble-test + scribble-test + http://maven.apache.org + org.scribble parent - 0.4.4-SNAPSHOT + 0.4.4 ../pom.xml - scribble-test - scribble-test - http://maven.apache.org UTF-8 @@ -26,10 +25,10 @@ org.scribble scribble-parser - + org.scribble scribble-cli @@ -46,8 +45,7 @@ - + @@ -65,6 +63,7 @@ + com.mycila @@ -80,6 +79,7 @@ **/script.js **/package-list **/IGNORE + **/*.versionsBackup From 71bf8db627502e016ffdbcef0d6dd4e089ebc5b6 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Fri, 12 Feb 2021 18:41:25 +0000 Subject: [PATCH 501/539] Bump version to 0.5.0-SNAPSHOT --- pom.xml | 5 +++-- scribble-ast/pom.xml | 2 +- scribble-cli/pom.xml | 2 +- scribble-codegen/pom.xml | 2 +- scribble-core/pom.xml | 2 +- scribble-demos/pom.xml | 2 +- scribble-dist/pom.xml | 2 +- scribble-main/pom.xml | 2 +- scribble-parser/pom.xml | 2 +- scribble-runtime/pom.xml | 2 +- scribble-test/pom.xml | 2 +- 11 files changed, 13 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index bf5d50cbc..cec57991a 100644 --- a/pom.xml +++ b/pom.xml @@ -1,10 +1,10 @@ - + 4.0.0 org.scribble parent - 0.4.4 + 0.5.0-SNAPSHOT pom scribble-java http://www.scribble.org @@ -204,6 +204,7 @@ + diff --git a/scribble-ast/pom.xml b/scribble-ast/pom.xml index a23ee880c..6e6fdfd91 100644 --- a/scribble-ast/pom.xml +++ b/scribble-ast/pom.xml @@ -9,7 +9,7 @@ org.scribble parent - 0.4.4 + 0.5.0-SNAPSHOT diff --git a/scribble-cli/pom.xml b/scribble-cli/pom.xml index 2525fd8e6..a7b00f26e 100644 --- a/scribble-cli/pom.xml +++ b/scribble-cli/pom.xml @@ -7,7 +7,7 @@ org.scribble parent - 0.4.4 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/scribble-codegen/pom.xml b/scribble-codegen/pom.xml index 0994663e9..e79e95427 100644 --- a/scribble-codegen/pom.xml +++ b/scribble-codegen/pom.xml @@ -8,7 +8,7 @@ org.scribble parent - 0.4.4 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/scribble-core/pom.xml b/scribble-core/pom.xml index de733f2da..6a73a53a0 100644 --- a/scribble-core/pom.xml +++ b/scribble-core/pom.xml @@ -7,7 +7,7 @@ org.scribble parent - 0.4.4 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/scribble-demos/pom.xml b/scribble-demos/pom.xml index 771eb1a31..d62734b49 100644 --- a/scribble-demos/pom.xml +++ b/scribble-demos/pom.xml @@ -8,7 +8,7 @@ org.scribble parent - 0.4.4 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/scribble-dist/pom.xml b/scribble-dist/pom.xml index 55c9d8367..3395eb3c4 100644 --- a/scribble-dist/pom.xml +++ b/scribble-dist/pom.xml @@ -16,7 +16,7 @@ org.scribble parent - 0.4.4 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/scribble-main/pom.xml b/scribble-main/pom.xml index c155ed026..3188e8daa 100644 --- a/scribble-main/pom.xml +++ b/scribble-main/pom.xml @@ -8,7 +8,7 @@ org.scribble parent - 0.4.4 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/scribble-parser/pom.xml b/scribble-parser/pom.xml index b3eb4aad8..c746eea99 100644 --- a/scribble-parser/pom.xml +++ b/scribble-parser/pom.xml @@ -7,7 +7,7 @@ org.scribble parent - 0.4.4 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/scribble-runtime/pom.xml b/scribble-runtime/pom.xml index 812fb8e9c..13f26fe8f 100644 --- a/scribble-runtime/pom.xml +++ b/scribble-runtime/pom.xml @@ -8,7 +8,7 @@ org.scribble parent - 0.4.4 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/scribble-test/pom.xml b/scribble-test/pom.xml index acbde8db3..28f5461a0 100644 --- a/scribble-test/pom.xml +++ b/scribble-test/pom.xml @@ -8,7 +8,7 @@ org.scribble parent - 0.4.4 + 0.5.0-SNAPSHOT ../pom.xml From ff292ea3775a0eba7d4d1f66d5558d470df51ae2 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Fri, 12 Feb 2021 19:07:21 +0000 Subject: [PATCH 502/539] Minor pom.xml tidying --- pom.xml | 166 +++++++++++++++++++++------------------ scribble-ast/pom.xml | 22 +++--- scribble-cli/pom.xml | 23 +++--- scribble-codegen/pom.xml | 31 +++++--- scribble-core/pom.xml | 22 ++++-- scribble-demos/pom.xml | 25 +++--- scribble-dist/pom.xml | 28 ++++--- scribble-main/pom.xml | 31 +++++--- scribble-parser/pom.xml | 10 ++- scribble-runtime/pom.xml | 22 +++--- scribble-test/pom.xml | 31 +++++--- 11 files changed, 240 insertions(+), 171 deletions(-) diff --git a/pom.xml b/pom.xml index cec57991a..804dc1919 100644 --- a/pom.xml +++ b/pom.xml @@ -1,86 +1,14 @@ - + 4.0.0 + + org.scribble parent 0.5.0-SNAPSHOT pom - scribble-java - http://www.scribble.org - - Scribble - - - - https://github.com/scribble/scribble-java - scm:git:https://github.com/scribble/scribble-java.git - scm:git:https://github.com/scribble/scribble-java.git - HEAD - - - - - Apache 2 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - Apache License V2 - - - - - - Gary Brown - objectiser - gary.pi4tech@gmail.com - Scribble.org - - Developer - - +0 - - - - 2008 - - - Scribble - http://www.scribble.org - - - - 3.4 - 1.2.14 - 1.9.9 - 4.11 - - 2.4 - - - 1.8 - 1.8 - true - - 2.8.2 - 2.5.3 - 3.0.1 - 2.10.4 - 0.3.4 - 0.1.0 - - - - scribble-core - scribble-runtime - scribble-ast - scribble-parser - scribble-codegen - scribble-main - scribble-cli - scribble-test - scribble-dist - scribble-demos - @@ -160,6 +88,84 @@ + + scribble-core + scribble-runtime + scribble-ast + scribble-parser + scribble-codegen + scribble-main + scribble-cli + scribble-test + scribble-dist + scribble-demos + + + + 3.4 + 1.2.14 + 1.9.9 + 4.11 + + 2.4 + + + 1.8 + 1.8 + true + + 2.8.2 + 2.5.3 + 3.0.1 + 2.10.4 + 0.3.4 + 0.1.0 + + + + scribble-java + Scribble + http://www.scribble.org + 2008 + + + + Apache 2 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + Apache License V2 + + + + + Scribble + http://www.scribble.org + + + + + Gary Brown + objectiser + gary.pi4tech@gmail.com + Scribble.org + + Developer + + +0 + + + Raymond Hu + rhu1 + r.z.h.hu@herts.ac.uk + University of Hertfordshire + + Developer + + +0 + + + + @@ -337,6 +343,14 @@ + + + https://github.com/scribble/scribble-java + scm:git:https://github.com/scribble/scribble-java.git + scm:git:https://github.com/scribble/scribble-java.git + HEAD + + bintray diff --git a/scribble-ast/pom.xml b/scribble-ast/pom.xml index 6e6fdfd91..180124100 100644 --- a/scribble-ast/pom.xml +++ b/scribble-ast/pom.xml @@ -1,10 +1,18 @@ - + 4.0.0 + + scribble-ast jar - scribble-ast - http://maven.apache.org + + + + org.scribble + scribble-core + + org.scribble @@ -16,11 +24,7 @@ UTF-8 - - - org.scribble - scribble-core - - + + scribble-ast diff --git a/scribble-cli/pom.xml b/scribble-cli/pom.xml index a7b00f26e..4d0bd3eb5 100644 --- a/scribble-cli/pom.xml +++ b/scribble-cli/pom.xml @@ -1,15 +1,10 @@ - + 4.0.0 + + scribble-cli jar - scribble-cli - - - org.scribble - parent - 0.5.0-SNAPSHOT - ../pom.xml - @@ -39,4 +34,14 @@ + + org.scribble + parent + 0.5.0-SNAPSHOT + ../pom.xml + + + + scribble-cli + diff --git a/scribble-codegen/pom.xml b/scribble-codegen/pom.xml index e79e95427..d98100c4a 100644 --- a/scribble-codegen/pom.xml +++ b/scribble-codegen/pom.xml @@ -1,20 +1,10 @@ - + 4.0.0 - scribble-codegen - scribble-codegen - http://maven.apache.org - - org.scribble - parent - 0.5.0-SNAPSHOT - ../pom.xml - - - UTF-8 - + scribble-codegen @@ -26,4 +16,19 @@ scribble-ast + + + org.scribble + parent + 0.5.0-SNAPSHOT + ../pom.xml + + + + UTF-8 + + + + scribble-codegen + diff --git a/scribble-core/pom.xml b/scribble-core/pom.xml index 6a73a53a0..2b984cef9 100644 --- a/scribble-core/pom.xml +++ b/scribble-core/pom.xml @@ -1,8 +1,17 @@ - + 4.0.0 + + scribble-core jar - scribble-core + + + + org.antlr + antlr-runtime + + org.scribble @@ -11,10 +20,7 @@ ../pom.xml - - - org.antlr - antlr-runtime - - + + scribble-core + diff --git a/scribble-demos/pom.xml b/scribble-demos/pom.xml index d62734b49..1bb6e901c 100644 --- a/scribble-demos/pom.xml +++ b/scribble-demos/pom.xml @@ -1,16 +1,11 @@ - + 4.0.0 + + scribble-demos jar - scribble-demos - - - org.scribble - parent - 0.5.0-SNAPSHOT - ../pom.xml - @@ -27,6 +22,14 @@ + + org.scribble + parent + 0.5.0-SNAPSHOT + ../pom.xml + + + @@ -49,4 +52,8 @@ + + + scribble-demos + diff --git a/scribble-dist/pom.xml b/scribble-dist/pom.xml index 3395eb3c4..f71485b16 100644 --- a/scribble-dist/pom.xml +++ b/scribble-dist/pom.xml @@ -7,18 +7,13 @@ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> - 4.0.0 + + 4.0.0 + + scribble-dist pom - scribble-dist - Scribble distribution. - - - org.scribble - parent - 0.5.0-SNAPSHOT - ../pom.xml - @@ -48,6 +43,14 @@ + + org.scribble + parent + 0.5.0-SNAPSHOT + ../pom.xml + + + @@ -70,4 +73,9 @@ + + + scribble-dist + Scribble distribution. + diff --git a/scribble-main/pom.xml b/scribble-main/pom.xml index 3188e8daa..4952fc80b 100644 --- a/scribble-main/pom.xml +++ b/scribble-main/pom.xml @@ -1,20 +1,10 @@ - + 4.0.0 - scribble-main - scribble-main - http://maven.apache.org - - org.scribble - parent - 0.5.0-SNAPSHOT - ../pom.xml - - - UTF-8 - + scribble-main @@ -36,4 +26,19 @@ test + + + org.scribble + parent + 0.5.0-SNAPSHOT + ../pom.xml + + + + UTF-8 + + + + scribble-main + diff --git a/scribble-parser/pom.xml b/scribble-parser/pom.xml index c746eea99..38eab7550 100644 --- a/scribble-parser/pom.xml +++ b/scribble-parser/pom.xml @@ -1,8 +1,10 @@ - + 4.0.0 + + scribble-parser jar - scribble-parser org.scribble @@ -28,6 +30,7 @@ + @@ -45,4 +48,7 @@ + + scribble-parser + diff --git a/scribble-runtime/pom.xml b/scribble-runtime/pom.xml index 13f26fe8f..84c9e0fbe 100644 --- a/scribble-runtime/pom.xml +++ b/scribble-runtime/pom.xml @@ -1,9 +1,17 @@ - + 4.0.0 + + scribble-runtime - scribble-runtime - http://maven.apache.org + + + + org.scribble + scribble-core + + org.scribble @@ -16,11 +24,7 @@ UTF-8 - - - org.scribble - scribble-core - - + + scribble-runtime diff --git a/scribble-test/pom.xml b/scribble-test/pom.xml index 28f5461a0..c84498aaa 100644 --- a/scribble-test/pom.xml +++ b/scribble-test/pom.xml @@ -1,20 +1,10 @@ - + 4.0.0 - scribble-test - scribble-test - http://maven.apache.org - - org.scribble - parent - 0.5.0-SNAPSHOT - ../pom.xml - - - UTF-8 - + scribble-test @@ -44,6 +34,18 @@ + + org.scribble + parent + 0.5.0-SNAPSHOT + ../pom.xml + + + + UTF-8 + + + @@ -86,4 +88,7 @@ + + scribble-test + From d507f7a9d57c97415434e58978fb92f945e09cda Mon Sep 17 00:00:00 2001 From: rhu1 Date: Fri, 12 Feb 2021 19:15:31 +0000 Subject: [PATCH 503/539] Removed redundant mvn dependencies. --- pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 804dc1919..fbcaef59c 100644 --- a/pom.xml +++ b/pom.xml @@ -70,7 +70,7 @@ commons-io ${version.commons-io} - + @@ -103,9 +103,9 @@ 3.4 - 1.2.14 - 1.9.9 - 4.11 + + + 4.13.1 2.4 From f83ac9cbf422f3fbae66ea4c9b1c0bb3da03abc1 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Fri, 12 Feb 2021 19:51:08 +0000 Subject: [PATCH 504/539] Edit to scribblec.sh --- scribble-dist/src/main/resources/scribblec.sh | 160 +++++++----------- 1 file changed, 60 insertions(+), 100 deletions(-) diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index bd0981533..588b4cde5 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -17,34 +17,38 @@ ## # Config notes: # -# - ANTLR: -# Set $ANTLR (below) to the location of the ANTLR 3 runtime jar, -# or add the jar to $DIR/$LIB assuming $DIR is the scribble-java root directory. -# (This script looks for ANTLR in those locations.) +# - SCRIBBLE_HOME: +# Set this to the `scribble-java` root directory. +# i.e., the directory of the `parent` mvn module (that contains the +# `scribble-ast`, etc. mvn submodules), +# or the directory that contains the `lib` directory containing the generated +# distribution jars. # +# - $ANTLR_RUNTIME_JAR: +# Set this to the location of the ANTLR 3 runtime jar, +# or place the jar in: $SCRIBHOME/lib +# (This script looks for the ANTLR jar in those locations.) +## +if [ -z "${SCRIBBLE_HOME}" ]; then + SCRIBHOME=`dirname "$0"` +else + SCRIBHOME=${SCRIBBLE_HOME} +fi -# ANTLR 3 runtime location (if no lib jar) -ANTLR='scribble-parser/lib/antlr-3.5.2-complete.jar' +# ANTLR 3 runtime jar location (if unavailable, will look in $SCRIBHOME/lib instead) +ANTLR_RUNTIME_JAR=$SCRIBHOME:'scribble-parser/lib/antlr-3.5.2-complete.jar' # e.g., '~/.m2/repository/org/antlr/antlr-runtime/3.4/antlr-runtime-3.4.jar' - # or '/cygdrive/c/Users/[User]/.m2/repository/org/antlr/antlr-runtime/3.4/antlr-runtime-3.4.jar' - # (i.e., the Maven install location) - -DIR=`dirname "$0"` # Default (script is in scribble-java rootdir) -#DIR=`dirname "$0"`/.. # (E.g., script is in rootdir/bin) - -#PRG=`basename "$0"` - -# Directory containing Scribble jars -LIB=lib + # or '/cygdrive/c/Users/[User]/.m2/repository/org/antlr/antlr-runtime/3.4/antlr-runtime-3.4.jar' + # (i.e., the Maven install location) usage() { echo Usage: 'scribblec.sh [option]... [option]...' cat < Source Scribble module (.scr file) - + + Source Scribble module (.scr file) + Options: -h, --help Show this info and exit$ -V Scribble debug info$ @@ -81,68 +85,52 @@ Options: EOF } + fixpath() { - windows=0 - - if [ `uname | grep -c CYGWIN` -ne 0 ]; then - windows=1 - fi - - cp="$1" - if [ "$windows" = 1 ]; then - cygpath -pw "$cp" - else - echo "$cp" - fi + windows=0 + + if [ `uname | grep -c CYGWIN` -ne 0 ]; then + windows=1 + fi + + cp="$1" + if [ "$windows" = 1 ]; then + cygpath -pw "$cp" + else + echo "$cp" + fi } -ARGS= - -CLASSPATH=$DIR'/scribble-ast/target/classes' -CLASSPATH=$CLASSPATH':'$DIR'/scribble-cli/target/classes' -CLASSPATH=$CLASSPATH':'$DIR'/scribble-codegen/target/classes' -CLASSPATH=$CLASSPATH':'$DIR'/scribble-core/target/classes' -CLASSPATH=$CLASSPATH':'$DIR'/scribble-main/target/classes' -CLASSPATH=$CLASSPATH':'$DIR'/scribble-parser/target/classes' -CLASSPATH=$CLASSPATH':'$ANTLR -CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/antlr.jar' -CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/antlr-runtime.jar' -CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/commons-io.jar' -CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-ast.jar' -CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-cli.jar' -CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-codegen.jar' -CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-core.jar' -CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-main.jar' -CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/scribble-parser.jar' -CLASSPATH=$CLASSPATH':'$DIR'/'$LIB'/stringtemplate.jar' +CLASSPATH=$SCRIBHOME'/scribble-ast/target/classes' +CLASSPATH=$CLASSPATH':'$SCRIBHOME'/scribble-cli/target/classes' +CLASSPATH=$CLASSPATH':'$SCRIBHOME'/scribble-codegen/target/classes' +CLASSPATH=$CLASSPATH':'$SCRIBHOME'/scribble-core/target/classes' +CLASSPATH=$CLASSPATH':'$SCRIBHOME'/scribble-main/target/classes' +CLASSPATH=$CLASSPATH':'$SCRIBHOME'/scribble-parser/target/classes' +if test -f "$ANTLR_RUNTIME_JAR"; then + CLASSPATH=$CLASSPATH':'$ANTLR_RUNTIME_JAR +fi +CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/antlr.jar' +CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/antlr-runtime.jar' +CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/commons-io.jar' +CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-ast.jar' +CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-cli.jar' +CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-codegen.jar' +CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-core.jar' +CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-main.jar' +CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-parser.jar' +#CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/stringtemplate.jar' CLASSPATH="'"`fixpath "$CLASSPATH"`"'" usage=0 verbose=0 -dot=0 -nondot=0 +ARGS= while true; do case "$1" in "") break ;; - #-dot) - # # Should not be used in conjunction with other flags.. - # # ..that output to stdout - # ARGS="$ARGS '-fsm'" - # shift - # ARGS="$ARGS '$1'" - # shift - # ARGS="$ARGS '$1'" - # shift - # dot=$1 - # if [ "$dot" == '' ]; then - # echo '-dot missing output file name argument' - # exit 1 - # fi - # shift - # ;; -h) usage=1 break @@ -155,23 +143,6 @@ while true; do verbose=1 shift ;; - #-ip) - # ARGS="$ARGS '$1'" - # shift - # ;; - #-d) - # ARGS="$ARGS '$1'" - # shift - # ;; - #-subtypes) - # ARGS="$ARGS '$1'" - # shift - # ;; - #-*) - # nondot=1 - # ARGS="$ARGS '$1'" - # shift - # ;; *) ARGS="$ARGS '$1'" shift @@ -179,31 +150,20 @@ while true; do esac done -#if [ "$dot" != 0 ]; then -# if [ $nondot == 1 ]; then -# echo '-dot cannot be used in conjunction with other flags that output to stdout: ' $ARGS -# exit 1 -# fi -# ARGS="$ARGS |" -# ARGS="$ARGS dot" -# ARGS="$ARGS '-Tpng'" -# ARGS="$ARGS '-o'" -# ARGS="$ARGS '$dot'" -#fi if [ "$usage" = 1 ]; then - usage - exit 0 + usage + exit 0 fi CMD='java -cp '$CLASSPATH' org.scribble.cli.CommandLine' scribblec() { - eval $CMD "$@" + eval $CMD "$@" } if [ "$verbose" = 1 ]; then - echo $CMD "$ARGS" + echo $CMD "$ARGS" fi scribblec "$ARGS" From 7a817d75e779b10ba301dc40803c5b9d524eb53a Mon Sep 17 00:00:00 2001 From: rhu1 Date: Fri, 12 Feb 2021 20:02:15 +0000 Subject: [PATCH 505/539] Fix mvnw and mvnw.cmd executable permission --- mvnw | 0 mvnw.cmd | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 mvnw mode change 100644 => 100755 mvnw.cmd diff --git a/mvnw b/mvnw old mode 100644 new mode 100755 diff --git a/mvnw.cmd b/mvnw.cmd old mode 100644 new mode 100755 From c40aa7c0c795d1a2170ef672335276992cba4164 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Fri, 12 Feb 2021 20:11:08 +0000 Subject: [PATCH 506/539] Fix typo in scribblec.sh --- scribble-dist/src/main/resources/scribblec.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index 588b4cde5..d3f94d0d7 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -37,7 +37,7 @@ else fi # ANTLR 3 runtime jar location (if unavailable, will look in $SCRIBHOME/lib instead) -ANTLR_RUNTIME_JAR=$SCRIBHOME:'scribble-parser/lib/antlr-3.5.2-complete.jar' +ANTLR_RUNTIME_JAR=$SCRIBHOME'/scribble-parser/lib/antlr-3.5.2-complete.jar' # e.g., '~/.m2/repository/org/antlr/antlr-runtime/3.4/antlr-runtime-3.4.jar' # or '/cygdrive/c/Users/[User]/.m2/repository/org/antlr/antlr-runtime/3.4/antlr-runtime-3.4.jar' # (i.e., the Maven install location) From 85e46aacaad6a16f1148535473d6def6d5e1a742 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Fri, 12 Feb 2021 20:39:06 +0000 Subject: [PATCH 507/539] Fix travis/publish.sh executable permission. --- travis/publish.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 travis/publish.sh diff --git a/travis/publish.sh b/travis/publish.sh old mode 100644 new mode 100755 From ce4f0ee569bf2177c435164fcd9ec59cde66e1a8 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Fri, 12 Feb 2021 21:30:47 +0000 Subject: [PATCH 508/539] Minor edit to scribblec.sh --- scribble-dist/src/main/resources/scribblec.sh | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index d3f94d0d7..afcd9327f 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -15,19 +15,14 @@ ## -# Config notes: +# Config: # -# - SCRIBBLE_HOME: +# $SCRIBBLE_HOME # Set this to the `scribble-java` root directory. # i.e., the directory of the `parent` mvn module (that contains the -# `scribble-ast`, etc. mvn submodules), +# `scribble-ast`, `scribble-cli`, etc. mvn submodules), # or the directory that contains the `lib` directory containing the generated # distribution jars. -# -# - $ANTLR_RUNTIME_JAR: -# Set this to the location of the ANTLR 3 runtime jar, -# or place the jar in: $SCRIBHOME/lib -# (This script looks for the ANTLR jar in those locations.) ## if [ -z "${SCRIBBLE_HOME}" ]; then @@ -36,7 +31,9 @@ else SCRIBHOME=${SCRIBBLE_HOME} fi -# ANTLR 3 runtime jar location (if unavailable, will look in $SCRIBHOME/lib instead) +# ANTLR 3 runtime jar location. +# Set this to the location of the ANTLR 3 runtime jar, or place the jar in: +# `$SCRIBHOME/lib`. (This script looks for the ANTLR jar in those locations.) ANTLR_RUNTIME_JAR=$SCRIBHOME'/scribble-parser/lib/antlr-3.5.2-complete.jar' # e.g., '~/.m2/repository/org/antlr/antlr-runtime/3.4/antlr-runtime-3.4.jar' # or '/cygdrive/c/Users/[User]/.m2/repository/org/antlr/antlr-runtime/3.4/antlr-runtime-3.4.jar' From 866d2ae1c26fa43a0070a6d1d856bfb2c808d32d Mon Sep 17 00:00:00 2001 From: rhu1 Date: Fri, 12 Feb 2021 22:24:08 +0000 Subject: [PATCH 509/539] Remove mvnw.cmd executable permission. --- mvnw.cmd | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 mvnw.cmd diff --git a/mvnw.cmd b/mvnw.cmd old mode 100755 new mode 100644 From c9c2ba50f53d5786577327abf119447d327df116 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Sat, 13 Feb 2021 15:40:46 +0000 Subject: [PATCH 510/539] Manual bump version to 0.5.1-SNAPSHOT --- pom.xml | 2 +- scribble-ast/pom.xml | 2 +- scribble-cli/pom.xml | 2 +- scribble-codegen/pom.xml | 2 +- scribble-core/pom.xml | 2 +- scribble-demos/pom.xml | 2 +- scribble-dist/pom.xml | 2 +- scribble-main/pom.xml | 2 +- scribble-parser/pom.xml | 2 +- scribble-runtime/pom.xml | 2 +- scribble-test/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index fbcaef59c..110659c09 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ org.scribble parent - 0.5.0-SNAPSHOT + 0.5.1-SNAPSHOT pom diff --git a/scribble-ast/pom.xml b/scribble-ast/pom.xml index 180124100..0a697e4c6 100644 --- a/scribble-ast/pom.xml +++ b/scribble-ast/pom.xml @@ -17,7 +17,7 @@ org.scribble parent - 0.5.0-SNAPSHOT + 0.5.1-SNAPSHOT diff --git a/scribble-cli/pom.xml b/scribble-cli/pom.xml index 4d0bd3eb5..a8b6028f1 100644 --- a/scribble-cli/pom.xml +++ b/scribble-cli/pom.xml @@ -37,7 +37,7 @@ org.scribble parent - 0.5.0-SNAPSHOT + 0.5.1-SNAPSHOT ../pom.xml diff --git a/scribble-codegen/pom.xml b/scribble-codegen/pom.xml index d98100c4a..cecb09596 100644 --- a/scribble-codegen/pom.xml +++ b/scribble-codegen/pom.xml @@ -20,7 +20,7 @@ org.scribble parent - 0.5.0-SNAPSHOT + 0.5.1-SNAPSHOT ../pom.xml diff --git a/scribble-core/pom.xml b/scribble-core/pom.xml index 2b984cef9..8ca744096 100644 --- a/scribble-core/pom.xml +++ b/scribble-core/pom.xml @@ -16,7 +16,7 @@ org.scribble parent - 0.5.0-SNAPSHOT + 0.5.1-SNAPSHOT ../pom.xml diff --git a/scribble-demos/pom.xml b/scribble-demos/pom.xml index 1bb6e901c..1bede49a5 100644 --- a/scribble-demos/pom.xml +++ b/scribble-demos/pom.xml @@ -25,7 +25,7 @@ org.scribble parent - 0.5.0-SNAPSHOT + 0.5.1-SNAPSHOT ../pom.xml diff --git a/scribble-dist/pom.xml b/scribble-dist/pom.xml index f71485b16..87a484261 100644 --- a/scribble-dist/pom.xml +++ b/scribble-dist/pom.xml @@ -46,7 +46,7 @@ org.scribble parent - 0.5.0-SNAPSHOT + 0.5.1-SNAPSHOT ../pom.xml diff --git a/scribble-main/pom.xml b/scribble-main/pom.xml index 4952fc80b..35b516325 100644 --- a/scribble-main/pom.xml +++ b/scribble-main/pom.xml @@ -30,7 +30,7 @@ org.scribble parent - 0.5.0-SNAPSHOT + 0.5.1-SNAPSHOT ../pom.xml diff --git a/scribble-parser/pom.xml b/scribble-parser/pom.xml index 38eab7550..3f0617c98 100644 --- a/scribble-parser/pom.xml +++ b/scribble-parser/pom.xml @@ -9,7 +9,7 @@ org.scribble parent - 0.5.0-SNAPSHOT + 0.5.1-SNAPSHOT ../pom.xml diff --git a/scribble-runtime/pom.xml b/scribble-runtime/pom.xml index 84c9e0fbe..76da154df 100644 --- a/scribble-runtime/pom.xml +++ b/scribble-runtime/pom.xml @@ -16,7 +16,7 @@ org.scribble parent - 0.5.0-SNAPSHOT + 0.5.1-SNAPSHOT ../pom.xml diff --git a/scribble-test/pom.xml b/scribble-test/pom.xml index c84498aaa..38008e072 100644 --- a/scribble-test/pom.xml +++ b/scribble-test/pom.xml @@ -37,7 +37,7 @@ org.scribble parent - 0.5.0-SNAPSHOT + 0.5.1-SNAPSHOT ../pom.xml From c97da61d77bee32b3e439eb772492b3696c524e9 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Tue, 16 Feb 2021 14:24:52 +0000 Subject: [PATCH 511/539] Add --batch-mode to travis mvnw --- pom.xml | 2 +- travis/publish.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 110659c09..5c9c3ec7e 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,5 @@ - + 4.0.0 diff --git a/travis/publish.sh b/travis/publish.sh index 43c60b44e..d34a10717 100755 --- a/travis/publish.sh +++ b/travis/publish.sh @@ -94,7 +94,7 @@ if ! is_pull_request && build_started_by_tag; then check_release_tag fi -./mvnw install -nsu +./mvnw --batch-mode install -nsu # If we are on a pull request, our only job is to run tests, which happened above via ./mvnw install if is_pull_request; then From 08c2df88701580b46faa6dfd1aac7718b9baff3f Mon Sep 17 00:00:00 2001 From: rhu1 Date: Tue, 16 Feb 2021 14:54:47 +0000 Subject: [PATCH 512/539] Add IntelliJ files to .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index ce403a264..2aacc2267 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,9 @@ tools/eclipse/plugins/org.scribble.*/bin/ *.bak *.versionsBackup +.idea +**/*.iml + javadoc #scribble-demos/scrib From 1314705b14f1c930fc20355ebc54cafa210c1171 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Tue, 16 Feb 2021 20:34:15 +0000 Subject: [PATCH 513/539] Edits to mvn setup. --- pom.xml | 22 +++++++++++-------- scribble-ast/pom.xml | 4 ---- scribble-codegen/pom.xml | 4 ---- scribble-dist/src/main/resources/scribblec.sh | 6 ++--- scribble-main/pom.xml | 4 ---- scribble-runtime/pom.xml | 4 ---- scribble-test/pom.xml | 10 +++------ .../src/main/java/org/scribble/Dummy.java | 5 +++++ 8 files changed, 24 insertions(+), 35 deletions(-) create mode 100644 scribble-test/src/main/java/org/scribble/Dummy.java diff --git a/pom.xml b/pom.xml index 5c9c3ec7e..9516eff01 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,5 @@ - + 4.0.0 @@ -98,15 +98,14 @@ scribble-cli scribble-test scribble-dist - scribble-demos + 3.4 + 4.13.1 - 4.13.1 - 2.4 @@ -116,10 +115,13 @@ 2.8.2 2.5.3 - 3.0.1 - 2.10.4 + 3.2.1 + + 2.9 0.3.4 0.1.0 + + UTF-8 @@ -179,7 +181,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.9 + ${version.maven-javadoc-plugin} org.apache.maven.plugins @@ -222,6 +224,7 @@ org.apache.maven.plugins maven-source-plugin + ${version.maven-source-plugin} attach-sources @@ -246,7 +249,7 @@ - + com.mycila license-maven-plugin diff --git a/scribble-ast/pom.xml b/scribble-ast/pom.xml index 0a697e4c6..30b214f24 100644 --- a/scribble-ast/pom.xml +++ b/scribble-ast/pom.xml @@ -20,10 +20,6 @@ 0.5.1-SNAPSHOT - - UTF-8 - - scribble-ast diff --git a/scribble-codegen/pom.xml b/scribble-codegen/pom.xml index cecb09596..058edd750 100644 --- a/scribble-codegen/pom.xml +++ b/scribble-codegen/pom.xml @@ -24,10 +24,6 @@ ../pom.xml - - UTF-8 - - scribble-codegen diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index afcd9327f..489bd4422 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -86,7 +86,7 @@ EOF fixpath() { windows=0 - if [ `uname | grep -c CYGWIN` -ne 0 ]; then + if [ $(uname | grep -c CYGWIN) -ne 0 ]; then windows=1 fi @@ -156,11 +156,11 @@ fi CMD='java -cp '$CLASSPATH' org.scribble.cli.CommandLine' scribblec() { - eval $CMD "$@" + eval "$CMD" "$@" } if [ "$verbose" = 1 ]; then - echo $CMD "$ARGS" + echo "$CMD" "$ARGS" fi scribblec "$ARGS" diff --git a/scribble-main/pom.xml b/scribble-main/pom.xml index 35b516325..f4ef86985 100644 --- a/scribble-main/pom.xml +++ b/scribble-main/pom.xml @@ -34,10 +34,6 @@ ../pom.xml - - UTF-8 - - scribble-main diff --git a/scribble-runtime/pom.xml b/scribble-runtime/pom.xml index 76da154df..c30f9cec7 100644 --- a/scribble-runtime/pom.xml +++ b/scribble-runtime/pom.xml @@ -20,10 +20,6 @@ ../pom.xml - - UTF-8 - - scribble-runtime diff --git a/scribble-test/pom.xml b/scribble-test/pom.xml index 38008e072..49d617a80 100644 --- a/scribble-test/pom.xml +++ b/scribble-test/pom.xml @@ -41,16 +41,12 @@ ../pom.xml - - UTF-8 - - - + + org.apache.maven.plugins maven-jar-plugin @@ -64,7 +60,7 @@ - + --> diff --git a/scribble-test/src/main/java/org/scribble/Dummy.java b/scribble-test/src/main/java/org/scribble/Dummy.java new file mode 100644 index 000000000..3e336c4cf --- /dev/null +++ b/scribble-test/src/main/java/org/scribble/Dummy.java @@ -0,0 +1,5 @@ +package org.scribble; + +// HACK: Dummy file to avoid mvn "empty scribble-test jar" warning +public class Dummy { +} From 79e71210035423eff12154c6e6b3953f73b48966 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Tue, 16 Feb 2021 21:17:29 +0000 Subject: [PATCH 514/539] Fix maven-surefire-report-plugin version --- pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9516eff01..a1055f123 100644 --- a/pom.xml +++ b/pom.xml @@ -98,7 +98,7 @@ scribble-cli scribble-test scribble-dist - + scribble-demos @@ -343,6 +343,7 @@ org.apache.maven.plugins maven-surefire-report-plugin + 3.0.0-M5 From 550a8879e2d57a70c8aa9e17241755f7579d1172 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Tue, 16 Feb 2021 22:05:08 +0000 Subject: [PATCH 515/539] Fix scribblec.sh and change -V CL flag to -v --- scribble-cli/src/main/java/org/scribble/cli/CLFlags.java | 2 +- scribble-dist/src/main/resources/scribblec.sh | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java b/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java index a9e26c4a6..f44ca67ad 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLFlags.java @@ -30,7 +30,7 @@ public class CLFlags public static final String JUNIT_FLAG = "-junit"; // For internal use (JUnit test harness) public static final String IMPORT_PATH_FLAG = "-ip"; public static final String API_OUTPUT_DIR_FLAG = "-d"; - public static final String VERBOSE_FLAG = "-V"; + public static final String VERBOSE_FLAG = "-v"; public static final String STATECHAN_SUBTYPES_FLAG = "-subtypes"; public static final String OLD_WF_FLAG = "-oldwf"; public static final String NO_PROGRESS_FLAG = "-noprogress"; diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index 489bd4422..a92d12ba6 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -26,7 +26,7 @@ ## if [ -z "${SCRIBBLE_HOME}" ]; then - SCRIBHOME=`dirname "$0"` + SCRIBHOME=$(dirname "$0") else SCRIBHOME=${SCRIBBLE_HOME} fi @@ -86,7 +86,7 @@ EOF fixpath() { windows=0 - if [ $(uname | grep -c CYGWIN) -ne 0 ]; then + if [ "$(uname | grep -c CYGWIN)" -ne 0 ]; then windows=1 fi @@ -117,7 +117,7 @@ CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-core.jar' CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-main.jar' CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-parser.jar' #CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/stringtemplate.jar' -CLASSPATH="'"`fixpath "$CLASSPATH"`"'" +CLASSPATH="$(fixpath "$CLASSPATH")" usage=0 verbose=0 From 145d8466186aa1b446c0498c1fb114d94ec2338c Mon Sep 17 00:00:00 2001 From: rhu1 Date: Tue, 16 Feb 2021 22:17:26 +0000 Subject: [PATCH 516/539] Fix quote escapes in scribblec.sh --- scribble-dist/src/main/resources/scribblec.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index a92d12ba6..c00bc0222 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -117,7 +117,7 @@ CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-core.jar' CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-main.jar' CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-parser.jar' #CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/stringtemplate.jar' -CLASSPATH="$(fixpath "$CLASSPATH")" +CLASSPATH=\'"$(fixpath "$CLASSPATH")"\' usage=0 verbose=0 From eb707e9fe744ac9862bb0a0f62eab5b2ba69cddd Mon Sep 17 00:00:00 2001 From: rhu1 Date: Tue, 16 Feb 2021 22:55:47 +0000 Subject: [PATCH 517/539] Fix help typo in scribblec.sh --- scribble-dist/src/main/resources/scribblec.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index c00bc0222..fa9537a60 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -48,7 +48,7 @@ usage() { Options: -h, --help Show this info and exit$ - -V Scribble debug info$ + -v Scribble debug info$ --verbose Echo the java command$ -ip Scribble module import path$ From 0b913b7a0c57e69775b8262e1d3c1c2ba3afea47 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Tue, 16 Feb 2021 22:57:08 +0000 Subject: [PATCH 518/539] Fix more help typos in scribblec.sh --- scribble-dist/src/main/resources/scribblec.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index fa9537a60..e1eb627bc 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -47,11 +47,11 @@ usage() { Source Scribble module (.scr file) Options: - -h, --help Show this info and exit$ - -v Scribble debug info$ - --verbose Echo the java command$ + -h, --help Show this info and exit + -v Scribble debug info + --verbose Echo the java command - -ip Scribble module import path$ + -ip Scribble module import path -project Project protocol From 861ece68d354638377fec0e0451c35870f149bb7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Apr 2021 18:31:05 +0000 Subject: [PATCH 519/539] Bump commons-io from 2.4 to 2.7 Bumps commons-io from 2.4 to 2.7. Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a1055f123..28789c19b 100644 --- a/pom.xml +++ b/pom.xml @@ -106,7 +106,7 @@ 4.13.1 - 2.4 + 2.7 1.8 From 0a4851d3aa0a01410b8f6815c9f23df51c1f8c7d Mon Sep 17 00:00:00 2001 From: rhu1 Date: Thu, 29 Apr 2021 11:53:26 +0100 Subject: [PATCH 520/539] Fixed API gen bug for explicit connections --- .../org/scribble/codegen/java/statechanapi/OutputSockGen.java | 4 ++-- .../codegen/java/statechanapi/StateChannelApiGenerator.java | 1 + .../java/statechanapi/ioifaces/IOInterfacesGenerator.java | 2 +- scribble-dist/src/main/resources/scribblec.sh | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java index fff4b48db..ccd3af9cc 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/OutputSockGen.java @@ -139,12 +139,12 @@ else if (a.isClientWrap()) if (hasConnect) { this.cb.addImports("java.util.concurrent.Callable"); - this.cb.addImports("org.scribble.runtime.net.session.BinaryChannelEndpoint"); + this.cb.addImports("org.scribble.runtime.net.BinaryChannelEndpoint"); } if (hasWrap) { this.cb.addImports("java.util.concurrent.Callable"); - this.cb.addImports("org.scribble.runtime.net.session.BinaryChannelWrapper"); + this.cb.addImports("org.scribble.runtime.net.BinaryChannelWrapper"); } } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java index 3ac6367e1..abd041396 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/StateChannelApiGenerator.java @@ -89,6 +89,7 @@ public StateChannelApiGenerator(Job job, GProtoName fullname, Role self) private static boolean skipIOInterfacesGeneration(EState init) { Set as = init.getReachableActions(); + as.addAll(init.getActions()); if (as.stream().anyMatch(a -> !a.isSend() && !a.isReceive())) // HACK FIXME (connect/disconnect) { return true; diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java index 65b753419..2aec10116 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/java/statechanapi/ioifaces/IOInterfacesGenerator.java @@ -218,7 +218,7 @@ private void generateActionAndSuccessorInterfacesAndCollectPreActions(Set Date: Thu, 29 Apr 2021 21:23:31 +0100 Subject: [PATCH 521/539] Update scribblec.sh Update scribblec.sh Update scribblec.sh Typo fix in scribblec.sh --- scribble-dist/src/main/resources/scribblec.sh | 93 ++++++++++++------- 1 file changed, 60 insertions(+), 33 deletions(-) diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index 69b11919c..e4200240c 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -23,8 +23,6 @@ # `scribble-ast`, `scribble-cli`, etc. mvn submodules), # or the directory that contains the `lib` directory containing the generated # distribution jars. -## - if [ -z "${SCRIBBLE_HOME}" ]; then SCRIBHOME=$(dirname "$0") else @@ -39,6 +37,17 @@ ANTLR_RUNTIME_JAR=$SCRIBHOME'/scribble-parser/lib/antlr-3.5.2-complete.jar' # or '/cygdrive/c/Users/[User]/.m2/repository/org/antlr/antlr-runtime/3.4/antlr-runtime-3.4.jar' # (i.e., the Maven install location) +# Local env. +JAVA='java' # Java executable +WSL=0 # Set to 1 for ';' classpath separator and wslpath formatting +CYGWIN=0 # Set to 1 for ';' classpath separator and cygpath formatting + +#if [ "$(uname | grep -c CYGWIN)" -ne 0 ]; then +# CYGWIN=1 +#fi +# +## + usage() { echo Usage: 'scribblec.sh [option]... [option]...' @@ -83,41 +92,59 @@ EOF } -fixpath() { - windows=0 - - if [ "$(uname | grep -c CYGWIN)" -ne 0 ]; then - windows=1 - fi +SEP=':' # Classpath separator +if [ "$WSL" = 1 ] || [ "$CYGWIN" = 1 ]; then + SEP=';' +fi - cp="$1" - if [ "$windows" = 1 ]; then - cygpath -pw "$cp" - else - echo "$cp" +fixpath() { + p="$1" + if [ "$WSL" = 1 ]; then + p=$(wslpath -w "$p" | sed 's/\\/\\\\/g') + elif [ "$CYGWIN" = 1 ]; then + p=$(cygpath -pw "$p") fi + printf "%s" "$p" } -CLASSPATH=$SCRIBHOME'/scribble-ast/target/classes' -CLASSPATH=$CLASSPATH':'$SCRIBHOME'/scribble-cli/target/classes' -CLASSPATH=$CLASSPATH':'$SCRIBHOME'/scribble-codegen/target/classes' -CLASSPATH=$CLASSPATH':'$SCRIBHOME'/scribble-core/target/classes' -CLASSPATH=$CLASSPATH':'$SCRIBHOME'/scribble-main/target/classes' -CLASSPATH=$CLASSPATH':'$SCRIBHOME'/scribble-parser/target/classes' -if test -f "$ANTLR_RUNTIME_JAR"; then - CLASSPATH=$CLASSPATH':'$ANTLR_RUNTIME_JAR +CLASSPATH= +# If first module dir present, assume all are... +if [ -d "$SCRIBHOME"'/scribble-ast/target/classes' ]; then + CLASSPATH=$(fixpath $SCRIBHOME'/scribble-ast/target/classes') + CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/scribble-cli/target/classes') + CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/scribble-codegen/target/classes') + CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/scribble-core/target/classes') + CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/scribble-main/target/classes') + CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/scribble-parser/target/classes') +fi +# If first module jar present, assume all are... +if [ -f $SCRIBHOME'/lib/scribble-ast.jar' ]; then + if [ ! -z "$CLASSPATH" ]; then + CLASSPATH="$CLASSPATH"$SEP + fi + CLASSPATH=$CLASSPATH$(fixpath $SCRIBHOME'/lib/scribble-ast.jar') + CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/lib/scribble-cli.jar') + CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/lib/scribble-codegen.jar') + CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/lib/scribble-core.jar') + CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/lib/scribble-main.jar') + CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/lib/scribble-parser.jar') +fi +# Below assumes CLASSPATH non-empty +if [ -f "$ANTLR_RUNTIME_JAR" ]; then + CLASSPATH=$CLASSPATH$SEP$(fixpath $ANTLR_RUNTIME_JAR) +fi +if [ -f $SCRIBHOME'/lib/antlr.jar' ]; then + CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/lib/antlr.jar') fi -CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/antlr.jar' -CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/antlr-runtime.jar' -CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/commons-io.jar' -CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-ast.jar' -CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-cli.jar' -CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-codegen.jar' -CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-core.jar' -CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-main.jar' -CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/scribble-parser.jar' +if [ -f $SCRIBHOME'/lib/antlr-runtime.jar' ]; then + CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/lib/antlr-runtime.jar') +fi +#if [ -f '/lib/commons-io.jar' ]; then +# CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/lib/commons-io.jar') +#fi #CLASSPATH=$CLASSPATH':'$SCRIBHOME'/lib/stringtemplate.jar' -CLASSPATH=\'"$(fixpath "$CLASSPATH")"\' +##CLASSPATH=\'"$(fixpath "$CLASSPATH")"\' + usage=0 verbose=0 @@ -147,13 +174,13 @@ while true; do esac done - if [ "$usage" = 1 ]; then usage exit 0 fi -CMD='java -cp '$CLASSPATH' org.scribble.cli.CommandLine' + +CMD="$JAVA"' -cp '\'$CLASSPATH\'' org.scribble.cli.CommandLine' scribblec() { eval "$CMD" "$@" From c34350fc461cb2eac9da1b39375b477c9a5b6dc2 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Thu, 29 Apr 2021 21:49:50 +0100 Subject: [PATCH 522/539] Tidy scribblec.sh --- scribble-dist/src/main/resources/scribblec.sh | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index e4200240c..e46f063fc 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -38,9 +38,9 @@ ANTLR_RUNTIME_JAR=$SCRIBHOME'/scribble-parser/lib/antlr-3.5.2-complete.jar' # (i.e., the Maven install location) # Local env. -JAVA='java' # Java executable -WSL=0 # Set to 1 for ';' classpath separator and wslpath formatting -CYGWIN=0 # Set to 1 for ';' classpath separator and cygpath formatting +JAVA='java' # Java executable +WSL=0 # Set to 1 for ';' classpath separator and wslpath formatting +CYGWIN=0 # Set to 1 for ';' classpath separator and cygpath formatting #if [ "$(uname | grep -c CYGWIN)" -ne 0 ]; then # CYGWIN=1 @@ -110,34 +110,34 @@ fixpath() { CLASSPATH= # If first module dir present, assume all are... if [ -d "$SCRIBHOME"'/scribble-ast/target/classes' ]; then - CLASSPATH=$(fixpath $SCRIBHOME'/scribble-ast/target/classes') - CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/scribble-cli/target/classes') - CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/scribble-codegen/target/classes') - CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/scribble-core/target/classes') - CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/scribble-main/target/classes') - CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/scribble-parser/target/classes') + CLASSPATH=$(fixpath "$SCRIBHOME"'/scribble-ast/target/classes') + CLASSPATH="$CLASSPATH$SEP"$(fixpath "$SCRIBHOME"'/scribble-cli/target/classes') + CLASSPATH="$CLASSPATH$SEP"$(fixpath "$SCRIBHOME"'/scribble-codegen/target/classes') + CLASSPATH="$CLASSPATH$SEP"$(fixpath "$SCRIBHOME"'/scribble-core/target/classes') + CLASSPATH="$CLASSPATH$SEP"$(fixpath "$SCRIBHOME"'/scribble-main/target/classes') + CLASSPATH="$CLASSPATH$SEP"$(fixpath "$SCRIBHOME"'/scribble-parser/target/classes') fi # If first module jar present, assume all are... -if [ -f $SCRIBHOME'/lib/scribble-ast.jar' ]; then +if [ -f "$SCRIBHOME"'/lib/scribble-ast.jar' ]; then if [ ! -z "$CLASSPATH" ]; then - CLASSPATH="$CLASSPATH"$SEP + CLASSPATH="$CLASSPATH$SEP" fi - CLASSPATH=$CLASSPATH$(fixpath $SCRIBHOME'/lib/scribble-ast.jar') - CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/lib/scribble-cli.jar') - CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/lib/scribble-codegen.jar') - CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/lib/scribble-core.jar') - CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/lib/scribble-main.jar') - CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/lib/scribble-parser.jar') + CLASSPATH="$CLASSPATH"$(fixpath "$SCRIBHOME"'/lib/scribble-ast.jar') + CLASSPATH="$CLASSPATH$SEP"$(fixpath "$SCRIBHOME"'/lib/scribble-cli.jar') + CLASSPATH="$CLASSPATH$SEP"$(fixpath "$SCRIBHOME"'/lib/scribble-codegen.jar') + CLASSPATH="$CLASSPATH$SEP"$(fixpath "$SCRIBHOME"'/lib/scribble-core.jar') + CLASSPATH="$CLASSPATH$SEP"$(fixpath "$SCRIBHOME"'/lib/scribble-main.jar') + CLASSPATH="$CLASSPATH$SEP"$(fixpath "$SCRIBHOME"'/lib/scribble-parser.jar') fi # Below assumes CLASSPATH non-empty if [ -f "$ANTLR_RUNTIME_JAR" ]; then - CLASSPATH=$CLASSPATH$SEP$(fixpath $ANTLR_RUNTIME_JAR) + CLASSPATH="$CLASSPATH$SEP"$(fixpath "$ANTLR_RUNTIME_JAR") fi -if [ -f $SCRIBHOME'/lib/antlr.jar' ]; then - CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/lib/antlr.jar') +if [ -f "$SCRIBHOME"'/lib/antlr.jar' ]; then + CLASSPATH="$CLASSPATH$SEP"$(fixpath "$SCRIBHOME"'/lib/antlr.jar') fi -if [ -f $SCRIBHOME'/lib/antlr-runtime.jar' ]; then - CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/lib/antlr-runtime.jar') +if [ -f "$SCRIBHOME"'/lib/antlr-runtime.jar' ]; then + CLASSPATH="$CLASSPATH$SEP"$(fixpath "$SCRIBHOME"'/lib/antlr-runtime.jar') fi #if [ -f '/lib/commons-io.jar' ]; then # CLASSPATH=$CLASSPATH$SEP$(fixpath $SCRIBHOME'/lib/commons-io.jar') @@ -180,7 +180,7 @@ if [ "$usage" = 1 ]; then fi -CMD="$JAVA"' -cp '\'$CLASSPATH\'' org.scribble.cli.CommandLine' +CMD="$JAVA"' -cp '\'"$CLASSPATH"\'' org.scribble.cli.CommandLine' scribblec() { eval "$CMD" "$@" From 67da28774cf55edf67c096bae167e0e540708c07 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Fri, 30 Apr 2021 13:47:24 +0100 Subject: [PATCH 523/539] Update demos. Update betty16.lec1 demos Update betty16.lec2 demos Update bettybook.http demos Update coco and fase16 demos Update other demos Update test demos --- .../src/betty16/lec1/httplong/HttpLong.scr | 27 +++++++++-- .../src/betty16/lec1/httplong/HttpLongC.java | 8 +--- .../src/betty16/lec1/httplong/HttpLongS.java | 20 +++++--- .../httplong/message/HttpLongMessage.java | 3 ++ .../message/HttpLongMessageFormatter.java | 47 ++++++++----------- .../httplong/message/client/CacheControl.java | 29 ++++++++++++ .../httplong/message/client/Connection.java | 2 +- .../lec1/httplong/message/client/Pragma.java | 27 +++++++++++ .../betty16/lec1/httpshort/HttpShortC.java | 1 - .../message/HttpShortMessageFormatter.java | 7 ++- .../httpshort/message/client/Request.java | 3 ++ .../httpshort/message/server/Response.java | 1 + .../betty16/src/betty16/lec2/smtp/SmtpC1.java | 2 +- .../betty16/src/betty16/lec2/smtp/SmtpC2.java | 2 +- .../betty16/src/betty16/lec2/smtp/SmtpC3.java | 2 +- .../betty16/src/betty16/lec2/smtp/SmtpC4.java | 2 +- .../src/bettybook/http/longv/HttpLongC.java | 3 +- .../message/HttpLongMessageFormatter.java | 6 ++- .../src/bettybook/http/shortv/HttpShort.scr | 2 +- .../src/bettybook/http/shortv/HttpShortC.java | 3 +- .../message/HttpShortMessageFormatter.java | 5 +- .../src/bettybook/math/rmi/RMIMathC.java | 9 ++-- .../src/bettybook/math/rmi/RMIMathS.java | 9 ++-- .../scrib/coco/src/coco/smtp/SmtpC1.java | 2 +- .../scrib/coco/src/coco/smtp/SmtpC2.java | 2 +- .../scrib/coco/src/coco/smtp/SmtpC3.java | 2 +- .../http/src/http/longvers/HttpLongC.java | 3 +- .../message/HttpLongMessageFormatter.java | 6 ++- .../http/src/http/shortvers/HttpShort.scr | 2 +- .../http/src/http/shortvers/HttpShortC.java | 7 ++- .../http/src/http/shortvers/HttpShortS.java | 1 - .../message/HttpShortMessageFormatter.java | 5 +- .../scrib/travel/src/travel/Travel.scr | 2 +- .../message/ObjectStreamFormatter.java | 3 +- .../scrib/demo/fase17/travel/TravelA.java | 21 +++++---- .../scrib/demo/fase17/travel/TravelAgent.scr | 4 +- .../scrib/demo/fase17/travel/TravelC.java | 20 ++++---- .../scrib/demo/fase17/travel/TravelS.java | 18 +++---- .../scrib/demo/fase17/travel2/Travel2A.java | 25 +++++----- .../scrib/demo/fase17/travel2/Travel2C.java | 20 ++++---- .../scrib/demo/fase17/travel2/Travel2S.java | 19 ++++---- .../demo/fase17/travel2/TravelAgent2.scr | 4 +- 42 files changed, 243 insertions(+), 143 deletions(-) create mode 100644 scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/client/CacheControl.java create mode 100644 scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/client/Pragma.java diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLong.scr b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLong.scr index 24407f071..a1fc9349d 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLong.scr +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLong.scr @@ -2,6 +2,9 @@ * Assuming scribblec.sh in scribble-java root directory: * * ./scribblec.sh -d scribble-demos/scrib/betty16/src scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLong.scr -api Http C + * + * $ javadoc -cp scribble-core/target/classes:scribble-runtime/target/classes:scribble-demos/scrib/betty16/src -subpackages betty16.lec1.httplong.HttpLong.Http -d scribble-demos/scrib/betty16/javadoc/httplong + * */ @@ -42,7 +45,7 @@ sig "betty16.lec1.httplong.message.client.DoNotTrack" sig "betty16.lec1.httplong.message.client.Connection" from "betty16/lec1/httplong/message/Connection.java" - as CONNECTION; // Connection: keep-alive + as CONN; // Connection: keep-alive sig "betty16.lec1.httplong.message.client.UpgradeInsecureRequests" from "betty16/lec1/httplong/message/UpgradeInsecureRequests.java" @@ -51,7 +54,15 @@ sig "betty16.lec1.httplong.message.client.UpgradeInsecureRequests" sig "betty16.lec1.httplong.message.client.Cookie" from "betty16/lec1/httplong/message/Cookie.java" as COOKIE; // Cookie: __utma=111872281.1372348290.1498163262.1498163262.1498163262.1; __utmz=111872281.1498163262.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none) - + +sig "betty16.lec1.httplong.message.client.Pragma" + from "betty16/lec1/httplong/message/Pragma.java" + as PRAGMA; // Pragma: no-cache + +/*sig "betty16.lec1.httplong.message.client.CacheControl" + from "betty16/lec1/httplong/message/CacheControl.java" + as CACHEC; // Cache-Control: max-age=0*/ + sig "betty16.lec1.httplong.message.server.HttpVersion" from "betty16/lec1/httplong/message/HttpVersion.java" @@ -103,7 +114,7 @@ sig "betty16.lec1.httplong.message.server.ContentType" sig "betty16.lec1.httplong.message.server.Via" from "betty16/lec1/httplong/message/Via.java" - as VIA; // Via: 1.1 www.doc.ic.ac.uk + as VIA; // Via: 1.1 www.doc.ic.ac.uk global protocol Http(role C, role S) { @@ -134,7 +145,7 @@ aux global protocol Request(role C, role S) { DNT from C to S; // DNT: 1 continue X; } or { - CONNECTION from C to S; // Connection: keep-alive + CONN from C to S; // Connection: keep-alive continue X; } or { UPGRADEIR from C to S; // Upgrade-Insecure-Requests: 1 @@ -142,7 +153,13 @@ aux global protocol Request(role C, role S) { } or { COOKIE from C to S; // Cookie: __utma=111872281.1372348290.1498163262.1498163262.1498163262.1; __utmz=111872281.1498163262.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none) continue X; - } or { + } or { + PRAGMA from C to S; // Pragma: no-cache + continue X; + /*} or { + CACHEC from C to S; // Cache-Control: max-age=0 + continue X; + */} or { BODY from C to S; } } diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongC.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongC.java index 872d4dd66..787219c6e 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongC.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongC.java @@ -48,19 +48,13 @@ import betty16.lec1.httplong.message.client.RequestLine; -/** TODO - * Cannot parse header field: Cache-Control: max-age=604800 - * at betty16.lec1.httplong.message.HttpLongMessageFormatter.fromBytes(HttpLongMessageFormatter.java:197) - */ - public class HttpLongC { public static void main(String[] args) throws Exception { Http http = new Http(); try (MPSTEndpoint client = new MPSTEndpoint<>(http, C, new HttpLongMessageFormatter())) { - String host = "www.doc.ic.ac.uk"; int port = 80; String file = "/~rhu/"; - //String host = "example.com"; int port = 80; String file = "/"; + String host = "example.com"; int port = 80; String file = "/"; //String host = "localhost"; int port = 8080; String file = "/"; client.request(S, SocketChannelEndpoint::new, host, port); diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongS.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongS.java index c0e3f31b7..5ded2a793 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongS.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongS.java @@ -18,7 +18,7 @@ import static betty16.lec1.httplong.HttpLong.Http.Http.ACCEPTL; import static betty16.lec1.httplong.HttpLong.Http.Http.BODY; import static betty16.lec1.httplong.HttpLong.Http.Http.C; -import static betty16.lec1.httplong.HttpLong.Http.Http.CONNECTION; +import static betty16.lec1.httplong.HttpLong.Http.Http.CONN; import static betty16.lec1.httplong.HttpLong.Http.Http.COOKIE; import static betty16.lec1.httplong.HttpLong.Http.Http.DNT; import static betty16.lec1.httplong.HttpLong.Http.Http.HOST; @@ -26,9 +26,12 @@ import static betty16.lec1.httplong.HttpLong.Http.Http.S; import static betty16.lec1.httplong.HttpLong.Http.Http.UPGRADEIR; import static betty16.lec1.httplong.HttpLong.Http.Http.USERA; +import static betty16.lec1.httplong.HttpLong.Http.Http.PRAGMA; +//import static betty16.lec1.httplong.HttpLong.Http.Http.CACHEC; import java.io.IOException; +import betty16.lec1.httplong.HttpLong.Http.ops.CACHEC; import org.scribble.main.ScribRuntimeException; import org.scribble.runtime.net.ScribServerSocket; import org.scribble.runtime.net.SocketChannelServer; @@ -101,12 +104,15 @@ private static EndSocket run(Http_S_1 s1) .send(C, new ContentLength(body.length())) .send(C, new Body(body)); } - case CONNECTION: s2 = cases.receive(CONNECTION, buf); break; - case DNT: s2 = cases.receive(DNT, buf); break; - case UPGRADEIR: s2 = cases.receive(UPGRADEIR, buf); break; - case COOKIE: s2 = cases.receive(COOKIE, buf); break; - case HOST: s2 = cases.receive(HOST, buf); break; - case USERA: s2 = cases.receive(USERA, buf); break; + case CONN: s2 = cases.receive(CONN, buf); break; + case DNT: s2 = cases.receive(DNT, buf); break; + case UPGRADEIR: s2 = cases.receive(UPGRADEIR, buf); break; + case COOKIE: s2 = cases.receive(COOKIE, buf); break; + case HOST: s2 = cases.receive(HOST, buf); break; + case USERA: s2 = cases.receive(USERA, buf); break; + case PRAGMA: s2 = cases.receive(PRAGMA, buf); break; + //case CACHEC: s2 = cases.receive(CACHEC, buf); break; + default: throw new RuntimeException("Missing field case: " + cases.op); } } } diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HttpLongMessage.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HttpLongMessage.java index b4662801b..ea02f8a8f 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HttpLongMessage.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HttpLongMessage.java @@ -23,6 +23,7 @@ public abstract class HttpLongMessage extends ScribMessage { private static final long serialVersionUID = 1L; + // TODO: make case-insensitive // " " after ops done by HeaderField public static final String GET = "GET"; public static final String HTTP = "HTTP"; @@ -36,6 +37,8 @@ public abstract class HttpLongMessage extends ScribMessage public static final String CONNECTION = "Connection"; public static final String UPGRADE_INSECURE_REQUESTS = "Upgrade-Insecure-Requests"; public static final String COOKIE = "Cookie"; + public static final String PRAGMA = "Pragma"; + //public static final String CACHE_CONTROL = "Cache-Control"; public static final String DATE = "Date"; public static final String CONTENT_TYPE = "Content-Type"; diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HttpLongMessageFormatter.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HttpLongMessageFormatter.java index 11a6302d4..8a46665ac 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HttpLongMessageFormatter.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/HttpLongMessageFormatter.java @@ -19,33 +19,11 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; +import betty16.lec1.httplong.message.client.*; +import betty16.lec1.httplong.message.server.*; import org.scribble.runtime.message.ScribMessage; import org.scribble.runtime.message.ScribMessageFormatter; -import betty16.lec1.httplong.message.client.Accept; -import betty16.lec1.httplong.message.client.AcceptEncoding; -import betty16.lec1.httplong.message.client.AcceptLanguage; -import betty16.lec1.httplong.message.client.Connection; -import betty16.lec1.httplong.message.client.DoNotTrack; -import betty16.lec1.httplong.message.client.Host; -import betty16.lec1.httplong.message.client.RequestLine; -import betty16.lec1.httplong.message.client.UpgradeInsecureRequests; -import betty16.lec1.httplong.message.client.Cookie; -import betty16.lec1.httplong.message.client.UserAgent; -import betty16.lec1.httplong.message.server.AcceptRanges; -import betty16.lec1.httplong.message.server.ContentLength; -import betty16.lec1.httplong.message.server.ContentType; -import betty16.lec1.httplong.message.server.Date; -import betty16.lec1.httplong.message.server.ETag; -import betty16.lec1.httplong.message.server.HttpVersion; -import betty16.lec1.httplong.message.server.LastModified; -import betty16.lec1.httplong.message.server.Server; -import betty16.lec1.httplong.message.server.StrictTransportSecurity; -import betty16.lec1.httplong.message.server.Vary; -import betty16.lec1.httplong.message.server.Via; -import betty16.lec1.httplong.message.server._200; -import betty16.lec1.httplong.message.server._404; - public class HttpLongMessageFormatter implements ScribMessageFormatter { public static final Charset cs = Charset.forName("UTF8"); @@ -91,7 +69,7 @@ public ScribMessage fromBytes(ByteBuffer bb) throws IOException, ClassNotFoundEx //String body = readLine(dis) + HttpMessage.CRLF; // HACK: assumes at least 1 CRLF StringBuffer sb = new StringBuffer(); //for (int i = body.length(); i < this.len; i++) - for (int i = 0; i < this.len; i++) + for (int i = 0; i < this.len; i++) // CHECKME: Client-side len out by 1? e.g., example.com { sb.append((char) bb.get()); } @@ -170,7 +148,7 @@ else if (front.equals(HttpLongMessage.HTTP)) String value = line.substring(colon + 1).trim(); // Whitespace already built into the message classes switch (name) { - case HttpLongMessage.HOST: return new Host("value"); + case HttpLongMessage.HOST: return new Host(value); case HttpLongMessage.USER_AGENT: return new UserAgent(value); case HttpLongMessage.ACCEPT: return new Accept(value); case HttpLongMessage.ACCEPT_LANGUAGE: return new AcceptLanguage(value); @@ -179,7 +157,9 @@ else if (front.equals(HttpLongMessage.HTTP)) case HttpLongMessage.CONNECTION: return new Connection(value); case HttpLongMessage.UPGRADE_INSECURE_REQUESTS: return new UpgradeInsecureRequests(Integer.parseInt(value)); case HttpLongMessage.COOKIE: return new Cookie(value); - + case HttpLongMessage.PRAGMA: return new Pragma(value); + //case HttpLongMessage.CACHE_CONTROL: return new CacheControl(value); + case HttpLongMessage.DATE: return new Date(value); case HttpLongMessage.SERVER: return new Server(value); case HttpLongMessage.STRICT_TRANSPORT_SECURITY: return new StrictTransportSecurity(value); @@ -194,7 +174,11 @@ else if (front.equals(HttpLongMessage.HTTP)) case HttpLongMessage.VARY: return new Vary(value); case HttpLongMessage.CONTENT_TYPE: return new ContentType(value); case HttpLongMessage.VIA: return new Via(value); - default: throw new RuntimeException("Cannot parse header field: " + line); + default: { + //throw new RuntimeException("Cannot parse header field: " + line); + System.err.println("Cannot parse header field, attempting to skip: " + line); + return fromBytes(bb); + } } } else @@ -274,6 +258,13 @@ private int isStatusCode(String front) + + + + + + + // FIXME: delete @Deprecated @Override public void writeMessage(DataOutputStream dos, ScribMessage m) throws IOException diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/client/CacheControl.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/client/CacheControl.java new file mode 100644 index 000000000..986af0286 --- /dev/null +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/client/CacheControl.java @@ -0,0 +1,29 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package betty16.lec1.httplong.message.client; + +import betty16.lec1.httplong.HttpLong.Http.Http; +import betty16.lec1.httplong.message.HeaderField; + +public class CacheControl extends HeaderField +{ + private static final long serialVersionUID = 1L; + + public CacheControl(String text) + { + //super(Http.CACHEC, text); + super(Http.PRAGMA, text); // FIXME + throw new RuntimeException("TODO"); + } +} diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/client/Connection.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/client/Connection.java index 1ed237ee7..6fe6f347c 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/client/Connection.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/client/Connection.java @@ -22,6 +22,6 @@ public class Connection extends HeaderField public Connection(String text) { - super(Http.CONNECTION, text); + super(Http.CONN, text); } } diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/client/Pragma.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/client/Pragma.java new file mode 100644 index 000000000..703a0ed6a --- /dev/null +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/message/client/Pragma.java @@ -0,0 +1,27 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package betty16.lec1.httplong.message.client; + +import betty16.lec1.httplong.HttpLong.Http.Http; +import betty16.lec1.httplong.message.HeaderField; + +public class Pragma extends HeaderField +{ + private static final long serialVersionUID = 1L; + + public Pragma(String text) + { + super(Http.PRAGMA, text); + } +} diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShortC.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShortC.java index 8c5de2dd2..789a31ac0 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShortC.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShortC.java @@ -35,7 +35,6 @@ public static void main(String[] args) throws Exception { Http http = new Http(); try (MPSTEndpoint client = new MPSTEndpoint<>(http, C, new HttpShortMessageFormatter())) { - //String host = "www.doc.ic.ac.uk"; int port = 80; String file = "/~rhu/"; String host = "example.com"; int port = 80; String file = "/"; //String host = "localhost"; int port = 8080; String file = "/"; diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/HttpShortMessageFormatter.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/HttpShortMessageFormatter.java index df0f14609..6e3f45924 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/HttpShortMessageFormatter.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/HttpShortMessageFormatter.java @@ -156,7 +156,12 @@ private static HttpShortMessage parseRequest(String msg) case Request.CONNECTION: connection = msg.substring(i+1, j).trim(); break; case Request.UPGRADE_INSECURE_REQUESTS: upgradeIR = msg.substring(i+1, j).trim(); break; case Request.COOKIE: cookie = msg.substring(i+1, j).trim(); break; - default: throw new RuntimeException("Cannot parse header field: " + msg.substring(0, j)); + //case Request.REFERER: referer = msg.substring(i+1, j).trim(); break; + //case Request.CACHECONTROL: cacheC = msg.substring(i+1, j).trim(); break; + default: { + //throw new RuntimeException("Cannot parse header field: " + msg.substring(0, j)); + System.err.println("Cannot parse header field, attempting to skip: " + msg.substring(0, j)); + } } msg = msg.substring(j+2); } diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/client/Request.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/client/Request.java index e9df2a159..b8fef7cdb 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/client/Request.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/client/Request.java @@ -20,6 +20,7 @@ public class Request extends HttpShortMessage { private static final long serialVersionUID = 1L; + // TODO: make case-insensitive public static final String HOST = "Host"; public static final String USER_AGENT = "User-Agent"; public static final String ACCEPT = "Accept"; @@ -29,6 +30,8 @@ public class Request extends HttpShortMessage { public static final String CONNECTION = "Connection"; public static final String UPGRADE_INSECURE_REQUESTS = "Upgrade-Insecure-Requests"; public static final String COOKIE = "Cookie"; + public static final String REFERER = "Referer"; + public static final String CACHECONTROL = "Cache-Control"; public Request(String get, String http, String host, String userA, String accept, String acceptL, String acceptE, String dnt, String connection, String upgradeIR, String cookie) { super(Http.Request, getHeadersAndBody(get, http, host, userA, accept, acceptL, acceptE, dnt, connection, upgradeIR, cookie)); diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/server/Response.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/server/Response.java index 3616531c5..aa1cd2468 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/server/Response.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/message/server/Response.java @@ -20,6 +20,7 @@ public class Response extends HttpShortMessage { private static final long serialVersionUID = 1L; + // TODO: make case-insensitive public static final String DATE = "Date"; public static final String CONTENT_TYPE = "Content-Type"; public static final String _404 = "404"; diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC1.java b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC1.java index a698c4cd9..95b941dbb 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC1.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC1.java @@ -45,7 +45,7 @@ public class SmtpC1 { public static void main(String[] args) throws Exception { - String host = "smtp.cc.ic.ac.uk"; + String host = "...smtp server..."; int port = 25; Smtp smtp = new Smtp(); diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC2.java b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC2.java index 3805ad29c..349a4c652 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC2.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC2.java @@ -45,7 +45,7 @@ public class SmtpC2 { public static void main(String[] args) throws Exception { - String host = "smtp.cc.ic.ac.uk"; + String host = "...smtp server..."; int port = 25; Smtp smtp = new Smtp(); diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC3.java b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC3.java index 419f977bb..2d2e31285 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC3.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC3.java @@ -43,7 +43,7 @@ public class SmtpC3 { public static void main(String[] args) throws Exception { - String host = "smtp.cc.ic.ac.uk"; + String host = "...smtp server..."; int port = 25; Smtp smtp = new Smtp(); diff --git a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC4.java b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC4.java index b9268d0f6..617cfa93d 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC4.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec2/smtp/SmtpC4.java @@ -45,7 +45,7 @@ public class SmtpC4 { public static void main(String[] args) throws Exception { - String host = "smtp.cc.ic.ac.uk"; + String host = "...smtp server..."; int port = 25; Smtp smtp = new Smtp(); diff --git a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/HttpLongC.java b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/HttpLongC.java index 5f73c988c..33b06b8e5 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/HttpLongC.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/HttpLongC.java @@ -53,8 +53,7 @@ public static void main(String[] args) throws Exception { Http http = new Http(); try (MPSTEndpoint client = new MPSTEndpoint<>(http, C, new HttpLongMessageFormatter())) { - String host = "www.doc.ic.ac.uk"; int port = 80; String file = "/~rhu/"; - //String host = "example.com"; int port = 80; String file = "/"; + String host = "example.com"; int port = 80; String file = "/"; //String host = "localhost"; int port = 8080; String file = "/"; client.request(S, SocketChannelEndpoint::new, host, port); diff --git a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/HttpLongMessageFormatter.java b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/HttpLongMessageFormatter.java index a01fb92b3..2ff68850c 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/HttpLongMessageFormatter.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/http/longv/message/HttpLongMessageFormatter.java @@ -192,7 +192,11 @@ else if (front.equals(HttpLongMessage.HTTP)) case HttpLongMessage.VARY: return new Vary(value); case HttpLongMessage.CONTENT_TYPE: return new ContentType(value); case HttpLongMessage.VIA: return new Via(value); - default: throw new RuntimeException("Cannot parse header field: " + line); + default: { + //throw new RuntimeException("Cannot parse header field: " + line); + System.err.println("Cannot parse header field, attempting to skip: " + line); + return fromBytes(bb); + } } } else diff --git a/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShort.scr b/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShort.scr index 2a9d856b6..e8baa5d33 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShort.scr +++ b/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShort.scr @@ -1,7 +1,7 @@ /** * Assuming scribblec.sh in scribble-java root directory: * - * ./scribblec.sh -d scribble-demos/scrib/bettybook/src scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShort.scr -api Http C + * bin/scribblec.sh -d scribble-demos/scrib/bettybook/src scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShort.scr -api Http C */ diff --git a/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShortC.java b/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShortC.java index 6f4f8d44b..c0c12b183 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShortC.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/HttpShortC.java @@ -36,8 +36,7 @@ public static void main(String[] args) throws Exception try (MPSTEndpoint client = new MPSTEndpoint<>(http, C, new HttpShortMessageFormatter())) { - String host = "www.doc.ic.ac.uk"; int port = 80; String file = "/~rhu/"; - //String host = "example.com"; int port = 80; String file = "/"; + String host = "example.com"; int port = 80; String file = "/"; //String host = "localhost"; int port = 8080; String file = "/"; client.request(S, SocketChannelEndpoint::new, host, port); diff --git a/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/message/HttpShortMessageFormatter.java b/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/message/HttpShortMessageFormatter.java index 28f83dabb..4964fe91f 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/message/HttpShortMessageFormatter.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/http/shortv/message/HttpShortMessageFormatter.java @@ -149,7 +149,10 @@ private static HttpShortMessage parseRequest(String msg) case Req.DO_NOT_TRACK: dnt = msg.substring(i+1, j).trim(); break; case Req.CONNECTION: connection = msg.substring(i+1, j).trim(); break; case Req.UPGRADE_INSECURE_REQUESTS: upgradeIR = msg.substring(i+1, j).trim(); break; - default: throw new RuntimeException("Cannot parse header field: " + msg.substring(0, j)); + default: { + //throw new RuntimeException("Cannot parse header field: " + msg.substring(0, j)); + System.err.println("Cannot parse header field, attempting to skip: " + msg.substring(0, j)); + } } msg = msg.substring(j+2); } diff --git a/scribble-demos/scrib/bettybook/src/bettybook/math/rmi/RMIMathC.java b/scribble-demos/scrib/bettybook/src/bettybook/math/rmi/RMIMathC.java index 91f2e4f7f..bc3e50dac 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/math/rmi/RMIMathC.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/math/rmi/RMIMathC.java @@ -11,10 +11,14 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -//$ java -cp modules/core/target/classes/ -Djava.security.policy=file:/C:/cygwin/home/Raymond/code/scribble/github-rhu1/scribble-java/modules/demos/scrib/bettybook/src/bettybook/math/rmi/server.policy bettybook.math.rmi.RMIMathC + +//$ java -cp scribble-demos/target/test-classes/ -Djava.security.policy=file:/C:/Users/..FIXME../github.com/scribble/scribble-java/scribble-demos/scrib/bettybook/src/bettybook/math/rmi/server.policy bettybook.math.rmi.RMIMathC + package bettybook.math.rmi; +import bettybook.math.rmi.RMIMath; + import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; @@ -22,9 +26,6 @@ public class RMIMathC { public static void main(String[] args) throws Exception { - //System.setProperty("java.security.policy", "file:/C:/cygwin/home/Raymond/code/scribble/github-rhu1/scribble-java/modules/demos/scrib/bettybook/src/bettybook/math/rmi/server.policy"); - //if (System.getSecurityManager() == null) { System.setSecurityManager(new SecurityManager()); } - Registry registry = LocateRegistry.getRegistry(8888); RMIMath mathS = (RMIMath) registry.lookup("MathService"); diff --git a/scribble-demos/scrib/bettybook/src/bettybook/math/rmi/RMIMathS.java b/scribble-demos/scrib/bettybook/src/bettybook/math/rmi/RMIMathS.java index 3b4b59b4b..0c674cd2c 100644 --- a/scribble-demos/scrib/bettybook/src/bettybook/math/rmi/RMIMathS.java +++ b/scribble-demos/scrib/bettybook/src/bettybook/math/rmi/RMIMathS.java @@ -11,8 +11,9 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -//$ java -cp modules/core/target/classes/ -Djava.security.policy=file:/C:/cygwin/home/Raymond/code/scribble/github-rhu1/scribble-java/modules/demos/scrib/bettybook/src/bettybook/math/rmi/server.policy bettybook.math.rmi.RMIMathS -//$ java -cp modules/core/target/classes/ -Djava.rmi.server.codebase=file:/C:/cygwin/home/Raymond/code/scribble/github-rhu1/scribble-java/modules/demos/scrib/bettybook/target/classes/ -Djava.security.policy=file:/C:/cygwin/home/Raymond/code/scribble/github-rhu1/scribble-java/modules/core/src/test/scrib/demo/bettybook/math/rmi/server.policy bettybook.math.rmi.RMIMathS -- codebase arg not working + +//$ java -cp scribble-demos/target/test-classes -Djava.security.policy=file:/C:/Users/..FIXME../github.com/scribble/scribble-java/scribble-demos/scrib/bettybook/src/bettybook/math/rmi/server.policy bettybook.math.rmi.RMIMathS +//$ java -cp scribble-demos/target/test-classes -Djava.rmi.server.codebase=file:/C:/cygwin/home/..FIXME../scribble-java/modules/demos/scrib/bettybook/target/classes/ -Djava.security.policy=file:/C:/cygwin/home/Raymond/code/scribble/github-rhu1/scribble-java/modules/core/src/test/scrib/demo/bettybook/math/rmi/server.policy bettybook.math.rmi.RMIMathS -- FIXME: codebase arg not working package bettybook.math.rmi; @@ -60,8 +61,8 @@ public static void main(String[] args) throws Exception - //System.setProperty("java.security.policy","file:/C:/cygwin64/home/rhu/code/eclipse/scribble/github.com/rhu1/scribble-java/scribble-demos/scrib/bettybook/src/bettybook/math/rmi/server.policy"); + //System.setProperty("java.security.policy","file:/C:/cygwin64/home/.../scribble-java/scribble-demos/scrib/bettybook/src/bettybook/math/rmi/server.policy"); //if (System.getSecurityManager() == null) { System.setSecurityManager(new SecurityManager()); } - /*-Djava.rmi.server.codebase=file:/C:\cygwin64\home\rhu\code\eclipse\scribble\github.com\rhu1\scribble-java\scribble-demos\bettybook\target\classes/ + /*-Djava.security.policy=file:/C:/Users/..../github.com/scribble/scribble-java/scribble-demos/scrib/bettybook/src/bettybook/math/rmi/server.policy Registry registry = LocateRegistry.getRegistry(8888);*/ diff --git a/scribble-demos/scrib/coco/src/coco/smtp/SmtpC1.java b/scribble-demos/scrib/coco/src/coco/smtp/SmtpC1.java index 60a02e823..6ef39d541 100644 --- a/scribble-demos/scrib/coco/src/coco/smtp/SmtpC1.java +++ b/scribble-demos/scrib/coco/src/coco/smtp/SmtpC1.java @@ -60,7 +60,7 @@ public static void main(String[] args) throws Exception public void run() throws Exception { - String host = "smtp.cc.ic.ac.uk"; + String host = "...smtp server..."; int port = 25; Smtp smtp = new Smtp(); diff --git a/scribble-demos/scrib/coco/src/coco/smtp/SmtpC2.java b/scribble-demos/scrib/coco/src/coco/smtp/SmtpC2.java index 50428ed53..ceb0727e0 100644 --- a/scribble-demos/scrib/coco/src/coco/smtp/SmtpC2.java +++ b/scribble-demos/scrib/coco/src/coco/smtp/SmtpC2.java @@ -59,7 +59,7 @@ public static void main(String[] args) throws Exception public void run() throws Exception { - String host = "smtp.cc.ic.ac.uk"; + String host = "...smtp server..."; int port = 25; Smtp smtp = new Smtp(); diff --git a/scribble-demos/scrib/coco/src/coco/smtp/SmtpC3.java b/scribble-demos/scrib/coco/src/coco/smtp/SmtpC3.java index e3b9d93d8..5fb4d44ce 100644 --- a/scribble-demos/scrib/coco/src/coco/smtp/SmtpC3.java +++ b/scribble-demos/scrib/coco/src/coco/smtp/SmtpC3.java @@ -58,7 +58,7 @@ public static void main(String[] args) throws Exception public void run() throws Exception { - String host = "smtp.cc.ic.ac.uk"; + String host = "...smtp server..."; int port = 25; Smtp smtp = new Smtp(); diff --git a/scribble-demos/scrib/http/src/http/longvers/HttpLongC.java b/scribble-demos/scrib/http/src/http/longvers/HttpLongC.java index f38391cf0..683ad2d54 100644 --- a/scribble-demos/scrib/http/src/http/longvers/HttpLongC.java +++ b/scribble-demos/scrib/http/src/http/longvers/HttpLongC.java @@ -77,8 +77,7 @@ public void run() throws Exception try (MPSTEndpoint client = new MPSTEndpoint<>(http, C, new HttpLongMessageFormatter())) { - String host = "www.doc.ic.ac.uk"; int port = 80; String file = "/~rhu/"; - //String host = "example.com"; int port = 80; String file = "/~rhu/"; + String host = "example.com"; int port = 80; String file = "/~rhu/"; //String host = "localhost"; int port = 8080; String file = "/"; client.request(S, SocketChannelEndpoint::new, host, port); diff --git a/scribble-demos/scrib/http/src/http/longvers/message/HttpLongMessageFormatter.java b/scribble-demos/scrib/http/src/http/longvers/message/HttpLongMessageFormatter.java index 450227d54..6c4ecdb98 100644 --- a/scribble-demos/scrib/http/src/http/longvers/message/HttpLongMessageFormatter.java +++ b/scribble-demos/scrib/http/src/http/longvers/message/HttpLongMessageFormatter.java @@ -195,7 +195,11 @@ else if (front.equals(HttpLongMessage.HTTP)) case HttpLongMessage.VARY: return new Vary(value); case HttpLongMessage.CONTENT_TYPE: return new ContentType(value); case HttpLongMessage.VIA: return new Via(value); - default: throw new RuntimeException("Cannot parse header field: " + line); + default: { + //throw new RuntimeException("Cannot parse header field: " + line); + System.err.println("Cannot parse header field, attempting to skip: " + line); + return fromBytes(bb); + } } } else diff --git a/scribble-demos/scrib/http/src/http/shortvers/HttpShort.scr b/scribble-demos/scrib/http/src/http/shortvers/HttpShort.scr index e3c186862..42de41bc9 100644 --- a/scribble-demos/scrib/http/src/http/shortvers/HttpShort.scr +++ b/scribble-demos/scrib/http/src/http/shortvers/HttpShort.scr @@ -1,5 +1,5 @@ //$ ./scribblec.sh -ip scribble-demos/scrib/http/src -d scribble-demos/scrib/http/src scribble-demos/scrib/http/src/http/shortvers/HttpShort.scr -api Http C -//$ javadoc -cp scribble-core/target/classes:scribble-runtime/target/classes:scribble-demos/scrib/http/src/ scribble-demos/scrib/http/src/http/shortvers/*.java -subpackages http.longvers.HttpShort.Http -d scribble-demos/scrib/http/javadoc/shortvers +//$ javadoc -cp scribble-core/target/classes:scribble-runtime/target/classes:scribble-demos/scrib/http/src/ scribble-demos/scrib/http/src/http/shortvers/*.java -subpackages http.shortvers.HttpShort.Http -d scribble-demos/scrib/http/javadoc/shortvers module http.shortvers.HttpShort; diff --git a/scribble-demos/scrib/http/src/http/shortvers/HttpShortC.java b/scribble-demos/scrib/http/src/http/shortvers/HttpShortC.java index 9a36d352c..d863860e1 100644 --- a/scribble-demos/scrib/http/src/http/shortvers/HttpShortC.java +++ b/scribble-demos/scrib/http/src/http/shortvers/HttpShortC.java @@ -45,10 +45,9 @@ public void run() throws Exception Http http = new Http(); try (MPSTEndpoint client = new MPSTEndpoint<>(http, C, new HttpShortMessageFormatter())) { - //String host = "www.doc.ic.ac.uk"; int port = 80; String file = "/~rhu/"; - //String host = "example.com"; int port = 80; String file = "/"; - String host = "localhost"; int port = 8080; String file = "/"; - + String host = "example.com"; int port = 80; String file = "/"; + //String host = "localhost"; int port = 8080; String file = "/"; + client.request(S, SocketChannelEndpoint::new, host, port); Buf buf = new Buf<>(); diff --git a/scribble-demos/scrib/http/src/http/shortvers/HttpShortS.java b/scribble-demos/scrib/http/src/http/shortvers/HttpShortS.java index 433c761eb..03161daf1 100644 --- a/scribble-demos/scrib/http/src/http/shortvers/HttpShortS.java +++ b/scribble-demos/scrib/http/src/http/shortvers/HttpShortS.java @@ -33,7 +33,6 @@ import http.shortvers.message.client.Request; import http.shortvers.message.server.Response; -// FIXME: (Firefox) Cannot parse header field: Cookie: __utma=111872281.1372348290.1498163262.1498163262.1498163262.1; __utmz=111872281.1498163262.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none) public class HttpShortS { public HttpShortS() diff --git a/scribble-demos/scrib/http/src/http/shortvers/message/HttpShortMessageFormatter.java b/scribble-demos/scrib/http/src/http/shortvers/message/HttpShortMessageFormatter.java index 87ed0623c..fe1898a5c 100644 --- a/scribble-demos/scrib/http/src/http/shortvers/message/HttpShortMessageFormatter.java +++ b/scribble-demos/scrib/http/src/http/shortvers/message/HttpShortMessageFormatter.java @@ -151,7 +151,10 @@ private static HttpShortMessage parseRequest(String msg) case Request.CONNECTION: connection = msg.substring(i+1, j).trim(); break; case Request.UPGRADE_INSECURE_REQUESTS: upgradeIR = msg.substring(i+1, j).trim(); break; case Request.COOKIE: cookie = msg.substring(i+1, j).trim(); break; - default: throw new RuntimeException("Cannot parse header field: " + msg.substring(0, j)); + default: { + //throw new RuntimeException("Cannot parse header field: " + msg.substring(0, j)); + System.err.println("Cannot parse header field, attempting to skip: " + msg.substring(0, j)); + } } msg = msg.substring(j+2); } diff --git a/scribble-demos/scrib/travel/src/travel/Travel.scr b/scribble-demos/scrib/travel/src/travel/Travel.scr index ee67824fe..e7444b514 100644 --- a/scribble-demos/scrib/travel/src/travel/Travel.scr +++ b/scribble-demos/scrib/travel/src/travel/Travel.scr @@ -1,5 +1,5 @@ //$ ./scribblec.sh -ip scribble-demos/scrib/travel/src -d scribble-demos/scrib/travel/src scribble-demos/scrib/travel/src/travel/Travel.scr -api Booking C -//$ javadoc -cp scribble-core/target/classes:scribble-runtime/target/classes:scribble-demos/scrib/travel/src scribble-demos/scrib/travel/src/travel/*.java -subpackages travel.Travel.Booking -d scribble-demos/scrib/travel/javadoc +//$ javadoc -cp scribble-core/target/classes:scribble-runtime/target/classes:scribble-demos/scrib/travel/src -subpackages travel.Travel.Booking -d scribble-demos/scrib/travel/javadoc module travel.Travel; diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/message/ObjectStreamFormatter.java b/scribble-runtime/src/main/java/org/scribble/runtime/message/ObjectStreamFormatter.java index 745fcd2dc..4d9d95a80 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/message/ObjectStreamFormatter.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/message/ObjectStreamFormatter.java @@ -22,6 +22,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutput; import java.io.ObjectOutputStream; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.util.Arrays; @@ -75,7 +76,7 @@ public byte[] toBytes(ScribMessage m) throws IOException public ScribMessage fromBytes(ByteBuffer bb) throws IOException, ClassNotFoundException { // Pre: bb:put - bb.flip(); + ((Buffer) bb).flip(); // Cast -- cf. https://stackoverflow.com/questions/61267495/exception-in-thread-main-java-lang-nosuchmethoderror-java-nio-bytebuffer-flip if (bb.remaining() <= 4) { bb.compact(); diff --git a/scribble-test/src/test/scrib/demo/fase17/travel/TravelA.java b/scribble-test/src/test/scrib/demo/fase17/travel/TravelA.java index e6bdc43c8..ce758b1da 100644 --- a/scribble-test/src/test/scrib/demo/fase17/travel/TravelA.java +++ b/scribble-test/src/test/scrib/demo/fase17/travel/TravelA.java @@ -22,17 +22,18 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.runtime.net.Buf; -import org.scribble.runtime.net.ObjectStreamFormatter; -import org.scribble.runtime.net.scribsock.ScribServerSocket; -import org.scribble.runtime.net.scribsock.SocketChannelServer; -import org.scribble.runtime.net.session.ExplicitEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.util.Buf; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.ExplicitEndpoint; import demo.fase17.travel.TravelAgent.TravelAgent.TravelAgent; -import demo.fase17.travel.TravelAgent.TravelAgent.channels.A.EndSocket; -import demo.fase17.travel.TravelAgent.TravelAgent.channels.A.TravelAgent_A_1; -import demo.fase17.travel.TravelAgent.TravelAgent.channels.A.TravelAgent_A_2_Cases; +import demo.fase17.travel.TravelAgent.TravelAgent.statechans.A.EndSocket; +import demo.fase17.travel.TravelAgent.TravelAgent.statechans.A.TravelAgent_A_1; +import demo.fase17.travel.TravelAgent.TravelAgent.statechans.A.TravelAgent_A_2_Cases; import demo.fase17.travel.TravelAgent.TravelAgent.roles.A; public class TravelA @@ -51,7 +52,7 @@ public void run() throws Exception .accept(C, ss) .branch(C)); } - catch (ScribbleRuntimeException | IOException | ClassNotFoundException e) + catch (ScribRuntimeException | IOException | ClassNotFoundException e) { e.printStackTrace(); } diff --git a/scribble-test/src/test/scrib/demo/fase17/travel/TravelAgent.scr b/scribble-test/src/test/scrib/demo/fase17/travel/TravelAgent.scr index 88cc4eeae..042e563e7 100644 --- a/scribble-test/src/test/scrib/demo/fase17/travel/TravelAgent.scr +++ b/scribble-test/src/test/scrib/demo/fase17/travel/TravelAgent.scr @@ -1,5 +1,5 @@ -//$ bin/scribblec.sh scribble-core/src/test/scrib/demo/fase17/travel/TravelAgent.scr -ip scribble-core/src/test/scrib/ -d scribble-core/src/test/scrib -api TravelAgent C -V -//$ javadoc -cp scribble-cli/target/classes/';'scribble-core/target/classes';'scribble-parser/target/classes';c:\Users\Raymond\.m2\repository\org\antlr\antlr-runtime\3.2\antlr-runtime-3.2.jar;'modules/validation/target/classes/';'modules/projection/target/classes/';C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.9.9\jackson-mapper-asl-1.9.9.jar;C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-core-asl\1.9.9\jackson-core-asl-1.9.9.jar;'scribble-core/src/test/scrib -subpackages demo.fase17.travel.TravelAgent.TravelAgent -d test/doc/fase17/travel +//$ bin/scribblec.sh scribble-test/src/test/scrib/demo/fase17/travel/TravelAgent.scr -ip scribble-test/src/test/scrib/ -d scribble-test/src/test/scrib -api TravelAgent C -v +//$ javadoc -cp scribble-core/target/classes:scribble-runtime/target/classes:scribble-test/src/test/scrib -subpackages demo.fase17.travel.TravelAgent.TravelAgent -d scribble-test/javadoc/fase17/travel module demo.fase17.travel.TravelAgent; diff --git a/scribble-test/src/test/scrib/demo/fase17/travel/TravelC.java b/scribble-test/src/test/scrib/demo/fase17/travel/TravelC.java index b3372da2d..bd6d62444 100644 --- a/scribble-test/src/test/scrib/demo/fase17/travel/TravelC.java +++ b/scribble-test/src/test/scrib/demo/fase17/travel/TravelC.java @@ -22,14 +22,18 @@ import static demo.fase17.travel.TravelAgent.TravelAgent.TravelAgent.quote; import static demo.fase17.travel.TravelAgent.TravelAgent.TravelAgent.accpt; -import org.scribble.net.Buf; -import org.scribble.net.ObjectStreamFormatter; -import org.scribble.net.session.ExplicitEndpoint; -import org.scribble.net.session.SocketChannelEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.util.Buf; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.ExplicitEndpoint; import demo.fase17.travel.TravelAgent.TravelAgent.TravelAgent; -import demo.fase17.travel.TravelAgent.TravelAgent.channels.C.TravelAgent_C_1; -import demo.fase17.travel.TravelAgent.TravelAgent.channels.C.TravelAgent_C_2; +import demo.fase17.travel.TravelAgent.TravelAgent.statechans.C.TravelAgent_C_1; +import demo.fase17.travel.TravelAgent.TravelAgent.statechans.C.TravelAgent_C_2; import demo.fase17.travel.TravelAgent.TravelAgent.roles.C; public class TravelC @@ -43,7 +47,7 @@ public void run() throws Exception { Buf b = new Buf<>(); TravelAgent_C_2 C2 = new TravelAgent_C_1(se) - .connect(A, SocketChannelEndpoint::new, "localhost", 8888); + .request(A, SocketChannelEndpoint::new, "localhost", 8888); //Stream.of(queries).forEach((q) -> C2.send(A, query, q).receive(A, quote, b)); // C2 not reassigned; exceptions not handled for (int i = 0; i < queries.length; i++) @@ -51,7 +55,7 @@ public void run() throws Exception C2 = C2.send(A, query, queries[i]).receive(A, quote, b); } - C2.connect(S, SocketChannelEndpoint::new, "localhost", 9999) + C2.request(S, SocketChannelEndpoint::new, "localhost", 9999) .send(S, payment, "efgh") .receive(S, confirm, b) .send(A, accpt, b.val); // Forward payment ref number diff --git a/scribble-test/src/test/scrib/demo/fase17/travel/TravelS.java b/scribble-test/src/test/scrib/demo/fase17/travel/TravelS.java index eaba014c5..3bcf5d94a 100644 --- a/scribble-test/src/test/scrib/demo/fase17/travel/TravelS.java +++ b/scribble-test/src/test/scrib/demo/fase17/travel/TravelS.java @@ -20,16 +20,18 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.net.Buf; -import org.scribble.net.ObjectStreamFormatter; -import org.scribble.net.scribsock.ScribServerSocket; -import org.scribble.net.scribsock.SocketChannelServer; -import org.scribble.net.session.ExplicitEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.util.Buf; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.ExplicitEndpoint; import demo.fase17.travel.TravelAgent.TravelAgent.TravelAgent; -import demo.fase17.travel.TravelAgent.TravelAgent.channels.S.TravelAgent_S_1; +import demo.fase17.travel.TravelAgent.TravelAgent.statechans.S.TravelAgent_S_1; import demo.fase17.travel.TravelAgent.TravelAgent.roles.S; +import org.scribble.runtime.util.Buf; public class TravelS { @@ -51,7 +53,7 @@ public void run() throws Exception System.out.println("(S) payment: " + b.val); } - catch (ScribbleRuntimeException | IOException | ClassNotFoundException e) + catch (ScribRuntimeException | IOException | ClassNotFoundException e) { e.printStackTrace(); } diff --git a/scribble-test/src/test/scrib/demo/fase17/travel2/Travel2A.java b/scribble-test/src/test/scrib/demo/fase17/travel2/Travel2A.java index faeee60a5..65a28fb63 100644 --- a/scribble-test/src/test/scrib/demo/fase17/travel2/Travel2A.java +++ b/scribble-test/src/test/scrib/demo/fase17/travel2/Travel2A.java @@ -24,18 +24,19 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.net.Buf; -import org.scribble.net.ObjectStreamFormatter; -import org.scribble.net.scribsock.ScribServerSocket; -import org.scribble.net.scribsock.SocketChannelServer; -import org.scribble.net.session.ExplicitEndpoint; -import org.scribble.net.session.SocketChannelEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.util.Buf; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.ExplicitEndpoint; import demo.fase17.travel2.TravelAgent2.TravelAgent2.TravelAgent2; -import demo.fase17.travel2.TravelAgent2.TravelAgent2.channels.A.EndSocket; -import demo.fase17.travel2.TravelAgent2.TravelAgent2.channels.A.TravelAgent2_A_1; -import demo.fase17.travel2.TravelAgent2.TravelAgent2.channels.A.TravelAgent2_A_2_Cases; +import demo.fase17.travel2.TravelAgent2.TravelAgent2.statechans.A.EndSocket; +import demo.fase17.travel2.TravelAgent2.TravelAgent2.statechans.A.TravelAgent2_A_1; +import demo.fase17.travel2.TravelAgent2.TravelAgent2.statechans.A.TravelAgent2_A_2_Cases; import demo.fase17.travel2.TravelAgent2.TravelAgent2.roles.A; public class Travel2A @@ -54,7 +55,7 @@ public void run() throws Exception .accept(C, ss) .branch(C)); } - catch (ScribbleRuntimeException | IOException | ClassNotFoundException e) + catch (ScribRuntimeException | IOException | ClassNotFoundException e) { e.printStackTrace(); } @@ -70,7 +71,7 @@ private EndSocket run(TravelAgent2_A_2_Cases A2) throws Exception case query: A2 = A2.receive(query, b).send(C, quote, 1234).branch(C); System.out.println("(A) query: " + b.val); return run(A2); case accpt: //EndSocket end = A2.receive(accpt, b); System.out.println("(A) yes: " + b.val); return end; - return A2.receive(accpt).connect(S, SocketChannelEndpoint::new, "localhost", 9999) + return A2.receive(accpt).request(S, SocketChannelEndpoint::new, "localhost", 9999) .receive(S, port, b).send(C, port, (Integer) b.val); case reject: return A2.receive(reject); default: throw new RuntimeException("Shouldn't get in here: " + A2.op); diff --git a/scribble-test/src/test/scrib/demo/fase17/travel2/Travel2C.java b/scribble-test/src/test/scrib/demo/fase17/travel2/Travel2C.java index 4f3ccbf68..90ad27439 100644 --- a/scribble-test/src/test/scrib/demo/fase17/travel2/Travel2C.java +++ b/scribble-test/src/test/scrib/demo/fase17/travel2/Travel2C.java @@ -22,14 +22,18 @@ import static demo.fase17.travel2.TravelAgent2.TravelAgent2.TravelAgent2.accpt; import static demo.fase17.travel2.TravelAgent2.TravelAgent2.TravelAgent2.port; -import org.scribble.net.Buf; -import org.scribble.net.ObjectStreamFormatter; -import org.scribble.net.session.ExplicitEndpoint; -import org.scribble.net.session.SocketChannelEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.util.Buf; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.ExplicitEndpoint; import demo.fase17.travel2.TravelAgent2.TravelAgent2.TravelAgent2; -import demo.fase17.travel2.TravelAgent2.TravelAgent2.channels.C.TravelAgent2_C_1; -import demo.fase17.travel2.TravelAgent2.TravelAgent2.channels.C.TravelAgent2_C_2; +import demo.fase17.travel2.TravelAgent2.TravelAgent2.statechans.C.TravelAgent2_C_1; +import demo.fase17.travel2.TravelAgent2.TravelAgent2.statechans.C.TravelAgent2_C_2; import demo.fase17.travel2.TravelAgent2.TravelAgent2.roles.C; public class Travel2C @@ -43,7 +47,7 @@ public void run() throws Exception { Buf b = new Buf<>(); TravelAgent2_C_2 C2 = new TravelAgent2_C_1(se) - .connect(A, SocketChannelEndpoint::new, "localhost", 8888); + .request(A, SocketChannelEndpoint::new, "localhost", 8888); for (int i = 0; i < queries.length; i++) { @@ -52,7 +56,7 @@ public void run() throws Exception C2.send(A, accpt) .receive(A, port, b) - .connect(S, SocketChannelEndpoint::new, "localhost", (Integer) b.val) // FIXME: connect message + .request(S, SocketChannelEndpoint::new, "localhost", (Integer) b.val) // FIXME: connect message .receive(S, confirm, b); System.out.println("(C) confirm: " + b.val); diff --git a/scribble-test/src/test/scrib/demo/fase17/travel2/Travel2S.java b/scribble-test/src/test/scrib/demo/fase17/travel2/Travel2S.java index 2f6f57c43..6b684cd74 100644 --- a/scribble-test/src/test/scrib/demo/fase17/travel2/Travel2S.java +++ b/scribble-test/src/test/scrib/demo/fase17/travel2/Travel2S.java @@ -21,15 +21,16 @@ import java.io.IOException; -import org.scribble.main.ScribbleRuntimeException; -import org.scribble.net.Buf; -import org.scribble.net.ObjectStreamFormatter; -import org.scribble.net.scribsock.ScribServerSocket; -import org.scribble.net.scribsock.SocketChannelServer; -import org.scribble.net.session.ExplicitEndpoint; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.util.Buf; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.ExplicitEndpoint; import demo.fase17.travel2.TravelAgent2.TravelAgent2.TravelAgent2; -import demo.fase17.travel2.TravelAgent2.TravelAgent2.channels.S.TravelAgent2_S_1; +import demo.fase17.travel2.TravelAgent2.TravelAgent2.statechans.S.TravelAgent2_S_1; import demo.fase17.travel2.TravelAgent2.TravelAgent2.roles.S; public class Travel2S @@ -49,12 +50,12 @@ public void run() throws Exception new TravelAgent2_S_1(se) .accept(A, ss) .send(A, port, 7777) - .accept(C, ss2) // FIXME: accept message + .accept(C, ss2) // TODO: API gen accept message/payload ("payment") .send(C, confirm, 4567); System.out.println("(S) payment: " + b.val); } - catch (ScribbleRuntimeException | IOException e) + catch (ScribRuntimeException | IOException e) { e.printStackTrace(); } diff --git a/scribble-test/src/test/scrib/demo/fase17/travel2/TravelAgent2.scr b/scribble-test/src/test/scrib/demo/fase17/travel2/TravelAgent2.scr index 3d6162652..11803dcd5 100644 --- a/scribble-test/src/test/scrib/demo/fase17/travel2/TravelAgent2.scr +++ b/scribble-test/src/test/scrib/demo/fase17/travel2/TravelAgent2.scr @@ -1,5 +1,5 @@ -//$ bin/scribblec.sh modules/core/src/test/scrib/demo/fase17/travel2/TravelAgent2.scr -ip modules/core/src/test/scrib/ -d modules/core/src/test/scrib -nocorrelation -//$ javadoc -cp modules/cli/target/classes/';'modules/core/target/classes';'modules/trace/target/classes';'modules/parser/target/classes';c:\Users\Raymond\.m2\repository\org\antlr\antlr-runtime\3.2\antlr-runtime-3.2.jar;'modules/validation/target/classes/';'modules/projection/target/classes/';C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.9.9\jackson-mapper-asl-1.9.9.jar;C:\Users\Raymond\.m2\repository\org\codehaus\jackson\jackson-core-asl\1.9.9\jackson-core-asl-1.9.9.jar;'modules/core/src/test/scrib -subpackages demo.fase17.travel2.TravelAgent2.TravelAgent2 -d test/doc/fase17/travel2 +//$ bin/scribblec.sh scribble-test/src/test/scrib/demo/fase17/travel2/TravelAgent2.scr -ip scribble-test/src/test/scrib/ -d scribble-test/src/test/scrib -nocorrelation +//$ javadoc -cp scribble-core/target/classes:scribble-runtime/target/classes:scribble-test/src/test/scrib -subpackages demo.fase17.travel2.TravelAgent2.TravelAgent2 -d scribble-test/javadoc/fase17/travel2 module demo.fase17.travel2.TravelAgent2; From b9a418eff3b904bb8466b6f5e053e7508f0cba4e Mon Sep 17 00:00:00 2001 From: rhu1 Date: Fri, 30 Apr 2021 17:11:27 +0100 Subject: [PATCH 524/539] Update .gitignore --- .gitignore | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 2aacc2267..3497f8c4b 100644 --- a/.gitignore +++ b/.gitignore @@ -39,24 +39,24 @@ scribble-demos/scrib/tutorial/src/tutorial/adder/Adder/ #scribble-core/src/test/scrib -scribble-core/src/test/scrib/exercise/calculator/EProtocol/ -scribble-core/src/test/scrib/exercise/voting/EProtocol/ +scribble-test/src/test/scrib/exercise/calculator/EProtocol/ +scribble-test/src/test/scrib/exercise/voting/EProtocol/ -scribble-core/src/test/scrib/demo/fase17/travel/TravelAgent/ -scribble-core/src/test/scrib/demo/fase17/travel2/TravelAgent2/ +scribble-test/src/test/scrib/demo/fase17/travel/TravelAgent/ +scribble-test/src/test/scrib/demo/fase17/travel2/TravelAgent2/ -scribble-core/src/test/scrib/scratch/scratch1/ -scribble-core/src/test/scrib/scratch/scratch2/ -scribble-core/src/test/scrib/test/foo/Foo/ -scribble-core/src/test/scrib/test/test1/ -scribble-core/src/test/scrib/test/test2/ -scribble-core/src/test/scrib/test/test3/ -scribble-core/src/test/scrib/test/test4/ -scribble-core/src/test/scrib/test/test5/ -scribble-core/src/test/scrib/test/test6/ -scribble-core/src/test/scrib/test/test7/ -scribble-core/src/test/scrib/test/test8/ -scribble-core/src/test/scrib/test/test9/ +scribble-test/src/test/scrib/scratch/scratch1/ +scribble-test/src/test/scrib/scratch/scratch2/ +scribble-test/src/test/scrib/test/foo/Foo/ +scribble-test/src/test/scrib/test/test1/ +scribble-test/src/test/scrib/test/test2/ +scribble-test/src/test/scrib/test/test3/ +scribble-test/src/test/scrib/test/test4/ +scribble-test/src/test/scrib/test/test5/ +scribble-test/src/test/scrib/test/test6/ +scribble-test/src/test/scrib/test/test7/ +scribble-test/src/test/scrib/test/test8/ +scribble-test/src/test/scrib/test/test9/ scribble-test/src/test/scrib/test/test2/Test2/ scribble-test/src/test/scrib/test/test3/Test3/ From b180355816952c8a32ee0aa4241ad2538d5ab0a4 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Fri, 30 Apr 2021 21:04:00 +0100 Subject: [PATCH 525/539] Add scribble-demos Makefile Adding scribble-demos Makefile Continued on scribble-demos Makefile Continued on scribble-demos Makefile Continued on scribble-demos Makefile Continued on scribble-demos Makefile Continued on scribble-demos Makefile Continued on scribble-demos Makefile Continued on scribble-demos Makefile Continued on scribble-demos Makefile Continued on scribble-demos Makefile --- .../del/global/GDelegationElemDel.java | 3 - scribble-demos/scrib/Makefile | 264 ++++++++++++++++++ .../src/betty16/lec1/httplong/HttpLongS.java | 1 - 3 files changed, 264 insertions(+), 4 deletions(-) create mode 100644 scribble-demos/scrib/Makefile diff --git a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java index 6a1f26e3c..e9a36b49b 100644 --- a/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-ast/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -46,9 +46,6 @@ public void enterDisambiguation(ScribNode child, ModuleContext mc = disamb.getModuleContext(); GDelegPayElem de = (GDelegPayElem) child; GProtoNameNode proto = de.getProtocolChild(); - - System.out.println("aaa: " + proto); - GProtoName gpn = proto.toName(); if (!mc.isVisibleProtocolDeclName(gpn)) { diff --git a/scribble-demos/scrib/Makefile b/scribble-demos/scrib/Makefile new file mode 100644 index 000000000..008b88ce5 --- /dev/null +++ b/scribble-demos/scrib/Makefile @@ -0,0 +1,264 @@ + +SCRIBHOME ?= ../.. +SCRIBC ?= $(SCRIBHOME)/bin/scribblec.sh + +.PHONY: help +help: + @echo "Set SCRIBC to scribblec.sh" + @echo "Example usages" + @echo " make tutorial" + @echo " make clean-tutorial" + @echo " make all" + @echo " make clean-all" + +.PHONY: all +all: betty16 bettybook coco fase16 fib game http loan nego rpc smtp threebuyer travel tutorial twobuyer fase17 supplierinfo + +.PHONY: clean-all +clean-all: clean-betty16 clean-bettybook clean-coco clean-fase16 clean-fib clean-http clean-loan clean-smtp clean-travel clean-tutorial clean-fase17 + +.PHONY: betty16 +betty16: + @$(call scribc_apigen2,betty16/src,betty16/lec1/httplong/HttpLong.scr,Http,C,S) + @$(call javac,betty16/src,betty16/lec1/httplong/HttpLongC.java) + @$(call javac,betty16/src,betty16/lec1/httplong/HttpLongS.java) + @$(call scribc_apigen2,betty16/src,betty16/lec1/httpshort/HttpShort.scr,Http,C,S) + @$(call javac,betty16/src,betty16/lec1/httpshort/HttpShortC.java) + @$(call javac,betty16/src,betty16/lec1/httpshort/HttpShortS.java) + @$(call scribc_ko,betty16/src/betty16/lec1/misc/Choice1.scr) + @$(call scribc_ok,betty16/src/betty16/lec1/misc/Choice2.scr) + @$(call scribc_ko,betty16/src/betty16/lec1/misc/Choice3.scr) + @$(call scribc_ko,betty16/src/betty16/lec1/misc/Choice4.scr) + @$(call scribc_ok,betty16/src/betty16/lec1/misc/LocatedChoice.scr) + @$(call scribc_ok,betty16/src/betty16/lec1/misc/LocatedChoice2.scr) + @$(call scribc_ok,betty16/src/betty16/lec1/misc/Messaging.scr) + @$(call scribc_ok,betty16/src/betty16/lec1/misc/Protocol1a.scr) + @$(call scribc_ko,betty16/src/betty16/lec1/misc/Protocol1b.scr) + @$(call scribc_ko,betty16/src/betty16/lec1/misc/Protocol1c.scr) + @$(call scribc_ko,betty16/src/betty16/lec1/misc/Protocol2.scr) + @$(call scribc_ko,betty16/src/betty16/lec1/misc/Recursion1.scr) + @$(call scribc_ko,betty16/src/betty16/lec1/misc/Recursion2.scr) + @$(call scribc_ok,betty16/src/betty16/lec1/misc/Recursion3.scr) + @$(call scribc_ko,betty16/src/betty16/lec1/misc/RoleEnabling.scr) + @$(call scribc_ok,betty16/src/betty16/lec1/nego/Negotiate.scr) + +.PHONY: clean-betty16 +clean-betty16: + $(call rm_apigen,betty16/src,betty16/lec1/httplong/HttpLong,Http) + $(call rm_apigen,betty16/src,betty16/lec1/httpshort/HttpShort,Http) + +.PHONY: bettybook +bettybook: + @$(call scribc_apigen2,bettybook/src,bettybook/http/longv/HttpLong.scr,Http,C,S) + @$(call javac,bettybook/src,bettybook/http/longv/HttpLongC.java) + @$(call javac,bettybook/src,bettybook/http/longv/HttpLongS.java) + @$(call scribc_apigen2,bettybook/src,bettybook/http/shortv/HttpShort.scr,Http,C,S) + @$(call javac,bettybook/src,bettybook/http/shortv/HttpShortC.java) + @$(call javac,bettybook/src,bettybook/http/shortv/HttpShortS.java) + @$(call scribc_apigen2,bettybook/src,bettybook/math/scrib/Math.scr,MathService,C,S) + @$(call javac,bettybook/src,bettybook/math/scrib/MathC.java) + @$(call javac,bettybook/src,bettybook/math/scrib/MathS1.java) + @$(call javac,bettybook/src,bettybook/math/scrib/MathS2.java) + +.PHONY: clean-bettybook +clean-bettybook: + $(call rm_apigen,bettybook/src,bettybook/http/longv/HttpLong,Http) + $(call rm_apigen,bettybook/src,bettybook/http/shortv/HttpShort,Http) + $(call rm_apigen,bettybook/src,bettybook/math/scrib/Math,MathService) + +.PHONY: coco +coco: + @$(call scribc_apigen2,coco/src,coco/fibo/Fibo.scr,Fibonacci,A,B) + @$(call javac,coco/src,coco/fibo/FiboMain.java) + @$(call scribc_apigen2,coco/src,coco/smtp/Smtp.scr,Smtp,C,S) + @$(call javac,coco/src,coco/smtp/SmtpC1.java) + @$(call javac,coco/src,coco/smtp/SmtpC2.java) + @$(call javac,coco/src,coco/smtp/SmtpC3.java) + +.PHONY: clean-coco +clean-coco: + $(call rm_apigen,coco/src,coco/fibo/Fibo,Fibonacci) + $(call rm_apigen,coco/src,coco/smtp/Smtp,Smtp) + +.PHONY: fase16 +fase16: + @$(call scribc_apigen2,fase16/src,fase16/adder/Adder.scr,Adder,C,S) + @$(call javac,fase16/src,fase16/adder/AdderC.java) + @$(call javac,fase16/src,fase16/adder/AdderS.java) + @$(call scribc_apigen2,fase16/src,fase16/smtp/Smtp.scr,Smtp,C,S) + @$(call javac,fase16/src,fase16/smtp/SmtpC.java) + +.PHONY: clean-fase16 +clean-fase16: + $(call rm_apigen,fase16/src,fase16/adder/Adder,Adder) + $(call rm_apigen,fase16/src,fase16/smtp/Smtp,Smtp) + +.PHONY: fib +fib: + @$(call scribc_apigen2,fib/src,fib/Fib.scr,Adder,C,S) + @$(call javac,fib/src,fib/AdderClient.java) + @$(call javac,fib/src,fib/AdderServer.java) + @$(call javac,fib/src,fib/FibClient.java) + @$(call scribc_apigen2,fib/src,fib/Fib.scr,Fibonacci,A,B) + @$(call javac,fib/src,fib/Fibo.java) + +.PHONY: clean-fib +clean-fib: +#$(call rm_apigen,fib/src,fib/Fib,Adder) + rm -rf fib/src/fib/Fib/Adder # HACK + $(call rm_apigen,fib/src,fib/Fib,Fibonacci) + +.PHONY: game +game: + @$(call scribc_ok,game/src/game/Game1.scr) + @$(call scribc_ok,game/src/game/Game2.scr) + +.PHONY: http +http: + @$(call scribc_apigen2,http/src,http/longvers/HttpLong.scr,Http,C,S) + @$(call javac,http/src,http/longvers/HttpLongC.java) + @$(call javac,http/src,http/longvers/HttpLongS.java) + @$(call scribc_apigen2,http/src,http/shortvers/HttpShort.scr,Http,C,S) + @$(call javac,http/src,http/shortvers/HttpShortC.java) + @$(call javac,http/src,http/shortvers/HttpShortS.java) + +.PHONY: clean-http +clean-http: + $(call rm_apigen,http/src,http/longvers/HttpLong,Http) + $(call rm_apigen,http/src,http/shortvers/HttpShort,Http) + +.PHONY: loan +loan: + @$(call scribc_apigen4,loan/src,loan/LoanApplication.scr,BuyerBrokerSupplier,Applicant,ApplicationPortal,ProcessingDept,FinanceDept) + @$(call javac,loan/src,loan/LoanApplicant.java) + @$(call javac,loan/src,loan/LoanApplicationPortal.java) + @$(call javac,loan/src,loan/LoanFinanceDept.java) + @$(call javac,loan/src,loan/LoanProcessingDept.java) + +.PHONY: clean-loan +clean-loan: + $(call rm_apigen,loan/src,loan/LoanApplication,BuyerBrokerSupplier) + +.PHONY: nego +nego: + @$(call scribc_ok,nego/src/nego/Nego1.scr) + @$(call scribc_ok,nego/src/nego/Nego2.scr) + @$(call scribc_ok,nego/src/nego/Nego3.scr) + +.PHONY: rpc +rpc: + @$(call scribc_ok,rpc/src/rpc/RPC.scr) + +.PHONY: smtp +smtp: + @$(call scribc_apigen2,smtp/src,smtp/Smtp.scr,Smtp,C,S,-subtypes) + @$(call javac,smtp/src,smtp/SimpleSmtpC.java) + @$(call javac,smtp/src,smtp/SmtpC.java) + +.PHONY: clean-smtp +clean-smtp: + $(call rm_apigen,smtp/src,smtp/Smtp,Smtp) + +.PHONY: threebuyer +threebuyer: + @$(call scribc_ok,threebuyer/src/threebuyer/ThreeBuyer.scr) + @$(call scribc_ok,threebuyer/src/threebuyer/ThreeBuyer2.scr) + +.PHONY: travel +travel: + @$(call scribc_apigen3,travel/src,travel/Travel.scr,Booking,A,C,S) + @$(call javac,travel/src,travel/BookingA.java) + @$(call javac,travel/src,travel/BookingC.java) + @$(call javac,travel/src,travel/BookingS.java) + +.PHONY: clean-travel +clean-travel: + $(call rm_apigen,travel/src,travel/Travel,Booking) + +.PHONY: tutorial +tutorial: + @$(call scribc_apigen2,tutorial/src,tutorial/adder/Adder.scr,Adder,C,S) + @$(call javac,tutorial/src,tutorial/adder/AdderC.java) + @$(call javac,tutorial/src,tutorial/adder/AdderS.java) + +.PHONY: clean-tutorial +clean-tutorial: + $(call rm_apigen,tutorial/src,tutorial/adder/Adder,Adder) + +.PHONY: twobuyer +twobuyer: + @$(call scribc_ok,twobuyer/src/twobuyer/TwoBuyer.scr) + +.PHONY: fase17 +fase17: + @$(call scribc_ko,$(SCRIBHOME)/scribble-test/src/test/scrib/demo/fase17/intro/FirstL.scr) + @$(call scribc_ok,$(SCRIBHOME)/scribble-test/src/test/scrib/demo/fase17/intro/FirstL.scr,-fair) + @$(call scribc_ko,$(SCRIBHOME)/scribble-test/src/test/scrib/demo/fase17/overview/P1.scr) + @$(call scribc_apigen3,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel/TravelAgent.scr,TravelAgent,A,C,S) + @$(call javac,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel/TravelA.java) + @$(call javac,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel/TravelC.java) + @$(call javac,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel/TravelS.java) + @$(call scribc_apigen3,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel2/TravelAgent2.scr,TravelAgent2,A,C,S) + @$(call javac,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel2/Travel2A.java) + @$(call javac,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel2/Travel2C.java) + @$(call javac,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel2/Travel2S.java) + +.PHONY: clean-fase17 +clean-fase17: + $(call rm_apigen,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel/TravelAgent,TravelAgent) + $(call rm_apigen,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel2/TravelAgent2,TravelAgent2) + +.PHONY: supplierinfo +supplierinfo: + @$(call scribc_ok,$(SCRIBHOME)/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoExplicit.scr,-fair) + @$(call scribc_ok,$(SCRIBHOME)/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr) + + +# filename, extra +define scribc_ok + echo "Validate OK: "$(1); \ + $(SCRIBC) $(1) $(2) +endef + +# filename +define scribc_ko + echo "Validate KO: "$(1); \ + $(SCRIBC) $(1) 2> /dev/null; \ + EXIT=$$?; if [ $$EXIT -eq 0 ]; then \ + echo "Expected protocol validation error, but none occurred."; \ + exit 1; \ + fi; +endef + +# dir, filename, proto, role1, role2, extra +define scribc_apigen2 + echo "API gen: "$(1)"/"$(2)", "$(3)" @ "$(4)", "$(5); \ + $(SCRIBC) -d $(1) $(1)/$(2) -api $(3) $(4) -api $(3) $(5) $(6) +endef + +# dir, filename, proto, role1, role2, role3 +define scribc_apigen3 + echo "API gen: "$(1)"/"$(2)", "$(3)" @ "$(4)", "$(5)", "$(6); \ + $(SCRIBC) -d $(1) $(1)/$(2) -api $(3) $(4) -api $(3) $(5) -api $(3) $(6) +endef + +# dir, filename, proto, role1, role2, role3, role4 +define scribc_apigen4 + echo "API gen: "$(1)"/"$(2)", "$(3)" @ "$(4)", "$(5)", "$(6)", "$(7); \ + $(SCRIBC) -d $(1) $(1)/$(2) -api $(3) $(4) -api $(3) $(5) -api $(3) $(6) -api $(3) $(7) +endef + +# dir, dir, proto +define rm_apigen + echo "Deleting: "$(1)/$(2)/$(3); \ + rm -rf $(1)/$(2)/$(3); \ + rm -fd $(1)/$(2) +endef + +# dir, filename +define javac + echo "Compiling: "$(1)/$(2); \ + javac -cp $(SCRIBHOME)/scribble-ast/target/classes:$(SCRIBHOME)/scribble-cli/target/classes:$(SCRIBHOME)/scribble-codegen/target/classes:$(SCRIBHOME)/scribble-core/target/classes:$(SCRIBHOME)/scribble-main/target/classes:$(SCRIBHOME)/scribble-parser/target/classes:$(SCRIBHOME)/scribble-parser/lib/antlr-3.5.2-complete.jar:$(SCRIBHOME)/scribble-runtime/target/classes:$(1) \ + $(1)/$(2) -d $(SCRIBHOME)/scribble-demos/target/test-classes +endef + diff --git a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongS.java b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongS.java index 5ded2a793..5b2f03b9b 100644 --- a/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongS.java +++ b/scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLongS.java @@ -31,7 +31,6 @@ import java.io.IOException; -import betty16.lec1.httplong.HttpLong.Http.ops.CACHEC; import org.scribble.main.ScribRuntimeException; import org.scribble.runtime.net.ScribServerSocket; import org.scribble.runtime.net.SocketChannelServer; From 58b0cf58aa24167548be849075d38ea80835594c Mon Sep 17 00:00:00 2001 From: rhu1 Date: Fri, 30 Apr 2021 23:58:07 +0100 Subject: [PATCH 526/539] Rename Makefile template --- scribble-demos/scrib/{Makefile => Makefile.copyme} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename scribble-demos/scrib/{Makefile => Makefile.copyme} (100%) diff --git a/scribble-demos/scrib/Makefile b/scribble-demos/scrib/Makefile.copyme similarity index 100% rename from scribble-demos/scrib/Makefile rename to scribble-demos/scrib/Makefile.copyme From 5d3cadde19e52c03f4735f92ea9837df27400a66 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Fri, 30 Apr 2021 23:58:39 +0100 Subject: [PATCH 527/539] Minor --- scribble-demos/scrib/Makefile.copyme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-demos/scrib/Makefile.copyme b/scribble-demos/scrib/Makefile.copyme index 008b88ce5..a032000d1 100644 --- a/scribble-demos/scrib/Makefile.copyme +++ b/scribble-demos/scrib/Makefile.copyme @@ -1,6 +1,6 @@ SCRIBHOME ?= ../.. -SCRIBC ?= $(SCRIBHOME)/bin/scribblec.sh +SCRIBC ?= $(SCRIBHOME)/scribblec.sh .PHONY: help help: From 035eb2ead9032fa13dbde23b530ad38c5dc26ddc Mon Sep 17 00:00:00 2001 From: rhu1 Date: Sat, 1 May 2021 00:05:18 +0100 Subject: [PATCH 528/539] Typo fixes in demos Makefile --- scribble-demos/scrib/Makefile.copyme | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/scribble-demos/scrib/Makefile.copyme b/scribble-demos/scrib/Makefile.copyme index a032000d1..82f7b12f6 100644 --- a/scribble-demos/scrib/Makefile.copyme +++ b/scribble-demos/scrib/Makefile.copyme @@ -194,19 +194,19 @@ fase17: @$(call scribc_ko,$(SCRIBHOME)/scribble-test/src/test/scrib/demo/fase17/intro/FirstL.scr) @$(call scribc_ok,$(SCRIBHOME)/scribble-test/src/test/scrib/demo/fase17/intro/FirstL.scr,-fair) @$(call scribc_ko,$(SCRIBHOME)/scribble-test/src/test/scrib/demo/fase17/overview/P1.scr) - @$(call scribc_apigen3,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel/TravelAgent.scr,TravelAgent,A,C,S) - @$(call javac,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel/TravelA.java) - @$(call javac,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel/TravelC.java) - @$(call javac,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel/TravelS.java) - @$(call scribc_apigen3,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel2/TravelAgent2.scr,TravelAgent2,A,C,S) - @$(call javac,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel2/Travel2A.java) - @$(call javac,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel2/Travel2C.java) - @$(call javac,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel2/Travel2S.java) + @$(call scribc_apigen3,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel/TravelAgent.scr,TravelAgent,A,C,S) + @$(call javac,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel/TravelA.java) + @$(call javac,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel/TravelC.java) + @$(call javac,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel/TravelS.java) + @$(call scribc_apigen3,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel2/TravelAgent2.scr,TravelAgent2,A,C,S) + @$(call javac,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel2/Travel2A.java) + @$(call javac,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel2/Travel2C.java) + @$(call javac,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel2/Travel2S.java) .PHONY: clean-fase17 clean-fase17: - $(call rm_apigen,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel/TravelAgent,TravelAgent) - $(call rm_apigen,$(SCRIBHOME)/scribble-test/src,test/scrib/demo/fase17/travel2/TravelAgent2,TravelAgent2) + $(call rm_apigen,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel/TravelAgent,TravelAgent) + $(call rm_apigen,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel2/TravelAgent2,TravelAgent2) .PHONY: supplierinfo supplierinfo: From 413d6b2f11eb85e818948632a77e9ed9b1c721f0 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Sat, 1 May 2021 00:06:38 +0100 Subject: [PATCH 529/539] Minor --- scribble-demos/scrib/Makefile.copyme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-demos/scrib/Makefile.copyme b/scribble-demos/scrib/Makefile.copyme index 82f7b12f6..45639d86b 100644 --- a/scribble-demos/scrib/Makefile.copyme +++ b/scribble-demos/scrib/Makefile.copyme @@ -5,7 +5,7 @@ SCRIBC ?= $(SCRIBHOME)/scribblec.sh .PHONY: help help: @echo "Set SCRIBC to scribblec.sh" - @echo "Example usages" + @echo "Example usages:" @echo " make tutorial" @echo " make clean-tutorial" @echo " make all" From 284658d4e1b3304ea7816a862293af3f260d2d5c Mon Sep 17 00:00:00 2001 From: rhu1 Date: Sat, 1 May 2021 00:19:50 +0100 Subject: [PATCH 530/539] Add license check exclusion for demos Makefile --- .gitignore | 8 +++++++- scribble-demos/pom.xml | 2 ++ scribble-demos/scrib/Makefile.copyme | 13 +++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3497f8c4b..a40089b75 100644 --- a/.gitignore +++ b/.gitignore @@ -16,8 +16,12 @@ tools/eclipse/plugins/org.scribble.*/bin/ javadoc + +## #scribble-demos/scrib +scribble-demos/scrib/Makefile +scribble-demos/scrib/tutorial/src/tutorial/adder/Adder/ scribble-demos/scrib/betty16/src/betty16/lec1/httplong/HttpLong/ scribble-demos/scrib/betty16/src/betty16/lec1/httpshort/HttpShort/ scribble-demos/scrib/betty16/src/betty16/lec2/adder/Adder/ @@ -37,7 +41,9 @@ scribble-demos/scrib/smtp/src/smtp/Smtp/ scribble-demos/scrib/travel/src/travel/Travel/ scribble-demos/scrib/tutorial/src/tutorial/adder/Adder/ -#scribble-core/src/test/scrib + +## +#scribble-test/src/test/scrib scribble-test/src/test/scrib/exercise/calculator/EProtocol/ scribble-test/src/test/scrib/exercise/voting/EProtocol/ diff --git a/scribble-demos/pom.xml b/scribble-demos/pom.xml index 1bede49a5..7e15c327b 100644 --- a/scribble-demos/pom.xml +++ b/scribble-demos/pom.xml @@ -47,6 +47,8 @@ **/script.js **/package-list **/*.versionsBackup + **/Makefile.copyme + **/Makefile diff --git a/scribble-demos/scrib/Makefile.copyme b/scribble-demos/scrib/Makefile.copyme index 45639d86b..5febc8aa3 100644 --- a/scribble-demos/scrib/Makefile.copyme +++ b/scribble-demos/scrib/Makefile.copyme @@ -1,3 +1,16 @@ +# +# Copyright 2008 The Scribble Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except +# in compliance with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License +# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express +# or implied. See the License for the specific language governing permissions and limitations under +# the License. +# SCRIBHOME ?= ../.. SCRIBC ?= $(SCRIBHOME)/scribblec.sh From 776444caaf2b4ceff248111f4d1d930dc3f0f641 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Sun, 16 May 2021 14:21:27 +0100 Subject: [PATCH 531/539] Minor edits to scribblec.sh and demos Makefile --- scribble-demos/scrib/Makefile.copyme | 86 ++++++++++--------- scribble-dist/src/main/resources/scribblec.sh | 9 +- 2 files changed, 51 insertions(+), 44 deletions(-) diff --git a/scribble-demos/scrib/Makefile.copyme b/scribble-demos/scrib/Makefile.copyme index 5febc8aa3..bd8f8bbab 100644 --- a/scribble-demos/scrib/Makefile.copyme +++ b/scribble-demos/scrib/Makefile.copyme @@ -12,12 +12,13 @@ # the License. # -SCRIBHOME ?= ../.. -SCRIBC ?= $(SCRIBHOME)/scribblec.sh +SCRIBBLE_HOME ?= ../.. +SCRIBBLEC ?= $(SCRIBBLE_HOME)/scribblec.sh +JAVAC = javac .PHONY: help help: - @echo "Set SCRIBC to scribblec.sh" + @echo "Set \$$SCRIBBLE_HOME (as for scribblec.sh), and \$$SCRIBBLEC to scribblec.sh." @echo "Example usages:" @echo " make tutorial" @echo " make clean-tutorial" @@ -57,8 +58,8 @@ betty16: .PHONY: clean-betty16 clean-betty16: - $(call rm_apigen,betty16/src,betty16/lec1/httplong/HttpLong,Http) - $(call rm_apigen,betty16/src,betty16/lec1/httpshort/HttpShort,Http) + @$(call rm_apigen,betty16/src,betty16/lec1/httplong/HttpLong,Http) + @$(call rm_apigen,betty16/src,betty16/lec1/httpshort/HttpShort,Http) .PHONY: bettybook bettybook: @@ -75,9 +76,9 @@ bettybook: .PHONY: clean-bettybook clean-bettybook: - $(call rm_apigen,bettybook/src,bettybook/http/longv/HttpLong,Http) - $(call rm_apigen,bettybook/src,bettybook/http/shortv/HttpShort,Http) - $(call rm_apigen,bettybook/src,bettybook/math/scrib/Math,MathService) + @$(call rm_apigen,bettybook/src,bettybook/http/longv/HttpLong,Http) + @$(call rm_apigen,bettybook/src,bettybook/http/shortv/HttpShort,Http) + @$(call rm_apigen,bettybook/src,bettybook/math/scrib/Math,MathService) .PHONY: coco coco: @@ -90,8 +91,8 @@ coco: .PHONY: clean-coco clean-coco: - $(call rm_apigen,coco/src,coco/fibo/Fibo,Fibonacci) - $(call rm_apigen,coco/src,coco/smtp/Smtp,Smtp) + @$(call rm_apigen,coco/src,coco/fibo/Fibo,Fibonacci) + @$(call rm_apigen,coco/src,coco/smtp/Smtp,Smtp) .PHONY: fase16 fase16: @@ -103,8 +104,8 @@ fase16: .PHONY: clean-fase16 clean-fase16: - $(call rm_apigen,fase16/src,fase16/adder/Adder,Adder) - $(call rm_apigen,fase16/src,fase16/smtp/Smtp,Smtp) + @$(call rm_apigen,fase16/src,fase16/adder/Adder,Adder) + @$(call rm_apigen,fase16/src,fase16/smtp/Smtp,Smtp) .PHONY: fib fib: @@ -118,8 +119,8 @@ fib: .PHONY: clean-fib clean-fib: #$(call rm_apigen,fib/src,fib/Fib,Adder) - rm -rf fib/src/fib/Fib/Adder # HACK - $(call rm_apigen,fib/src,fib/Fib,Fibonacci) + @rm -rf fib/src/fib/Fib/Adder # HACK + @$(call rm_apigen,fib/src,fib/Fib,Fibonacci) .PHONY: game game: @@ -137,8 +138,8 @@ http: .PHONY: clean-http clean-http: - $(call rm_apigen,http/src,http/longvers/HttpLong,Http) - $(call rm_apigen,http/src,http/shortvers/HttpShort,Http) + @$(call rm_apigen,http/src,http/longvers/HttpLong,Http) + @$(call rm_apigen,http/src,http/shortvers/HttpShort,Http) .PHONY: loan loan: @@ -150,7 +151,7 @@ loan: .PHONY: clean-loan clean-loan: - $(call rm_apigen,loan/src,loan/LoanApplication,BuyerBrokerSupplier) + @$(call rm_apigen,loan/src,loan/LoanApplication,BuyerBrokerSupplier) .PHONY: nego nego: @@ -170,7 +171,7 @@ smtp: .PHONY: clean-smtp clean-smtp: - $(call rm_apigen,smtp/src,smtp/Smtp,Smtp) + @$(call rm_apigen,smtp/src,smtp/Smtp,Smtp) .PHONY: threebuyer threebuyer: @@ -186,7 +187,7 @@ travel: .PHONY: clean-travel clean-travel: - $(call rm_apigen,travel/src,travel/Travel,Booking) + @$(call rm_apigen,travel/src,travel/Travel,Booking) .PHONY: tutorial tutorial: @@ -196,7 +197,7 @@ tutorial: .PHONY: clean-tutorial clean-tutorial: - $(call rm_apigen,tutorial/src,tutorial/adder/Adder,Adder) + @$(call rm_apigen,tutorial/src,tutorial/adder/Adder,Adder) .PHONY: twobuyer twobuyer: @@ -204,39 +205,39 @@ twobuyer: .PHONY: fase17 fase17: - @$(call scribc_ko,$(SCRIBHOME)/scribble-test/src/test/scrib/demo/fase17/intro/FirstL.scr) - @$(call scribc_ok,$(SCRIBHOME)/scribble-test/src/test/scrib/demo/fase17/intro/FirstL.scr,-fair) - @$(call scribc_ko,$(SCRIBHOME)/scribble-test/src/test/scrib/demo/fase17/overview/P1.scr) - @$(call scribc_apigen3,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel/TravelAgent.scr,TravelAgent,A,C,S) - @$(call javac,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel/TravelA.java) - @$(call javac,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel/TravelC.java) - @$(call javac,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel/TravelS.java) - @$(call scribc_apigen3,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel2/TravelAgent2.scr,TravelAgent2,A,C,S) - @$(call javac,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel2/Travel2A.java) - @$(call javac,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel2/Travel2C.java) - @$(call javac,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel2/Travel2S.java) + @$(call scribc_ko,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib/demo/fase17/intro/FirstL.scr) + @$(call scribc_ok,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib/demo/fase17/intro/FirstL.scr,-fair) + @$(call scribc_ko,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib/demo/fase17/overview/P1.scr) + @$(call scribc_apigen3,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib,demo/fase17/travel/TravelAgent.scr,TravelAgent,A,C,S) + @$(call javac,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib,demo/fase17/travel/TravelA.java) + @$(call javac,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib,demo/fase17/travel/TravelC.java) + @$(call javac,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib,demo/fase17/travel/TravelS.java) + @$(call scribc_apigen3,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib,demo/fase17/travel2/TravelAgent2.scr,TravelAgent2,A,C,S) + @$(call javac,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib,demo/fase17/travel2/Travel2A.java) + @$(call javac,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib,demo/fase17/travel2/Travel2C.java) + @$(call javac,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib,demo/fase17/travel2/Travel2S.java) .PHONY: clean-fase17 clean-fase17: - $(call rm_apigen,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel/TravelAgent,TravelAgent) - $(call rm_apigen,$(SCRIBHOME)/scribble-test/src/test/scrib,demo/fase17/travel2/TravelAgent2,TravelAgent2) + @$(call rm_apigen,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib,demo/fase17/travel/TravelAgent,TravelAgent) + @$(call rm_apigen,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib,demo/fase17/travel2/TravelAgent2,TravelAgent2) .PHONY: supplierinfo supplierinfo: - @$(call scribc_ok,$(SCRIBHOME)/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoExplicit.scr,-fair) - @$(call scribc_ok,$(SCRIBHOME)/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr) + @$(call scribc_ok,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoExplicit.scr,-fair) + @$(call scribc_ok,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr) # filename, extra define scribc_ok echo "Validate OK: "$(1); \ - $(SCRIBC) $(1) $(2) + $(SCRIBBLEC) $(1) $(2) endef # filename define scribc_ko echo "Validate KO: "$(1); \ - $(SCRIBC) $(1) 2> /dev/null; \ + $(SCRIBBLEC) $(1) 2> /dev/null; \ EXIT=$$?; if [ $$EXIT -eq 0 ]; then \ echo "Expected protocol validation error, but none occurred."; \ exit 1; \ @@ -246,19 +247,19 @@ endef # dir, filename, proto, role1, role2, extra define scribc_apigen2 echo "API gen: "$(1)"/"$(2)", "$(3)" @ "$(4)", "$(5); \ - $(SCRIBC) -d $(1) $(1)/$(2) -api $(3) $(4) -api $(3) $(5) $(6) + $(SCRIBBLEC) -d $(1) $(1)/$(2) -api $(3) $(4) -api $(3) $(5) $(6) endef # dir, filename, proto, role1, role2, role3 define scribc_apigen3 echo "API gen: "$(1)"/"$(2)", "$(3)" @ "$(4)", "$(5)", "$(6); \ - $(SCRIBC) -d $(1) $(1)/$(2) -api $(3) $(4) -api $(3) $(5) -api $(3) $(6) + $(SCRIBBLEC) -d $(1) $(1)/$(2) -api $(3) $(4) -api $(3) $(5) -api $(3) $(6) endef # dir, filename, proto, role1, role2, role3, role4 define scribc_apigen4 echo "API gen: "$(1)"/"$(2)", "$(3)" @ "$(4)", "$(5)", "$(6)", "$(7); \ - $(SCRIBC) -d $(1) $(1)/$(2) -api $(3) $(4) -api $(3) $(5) -api $(3) $(6) -api $(3) $(7) + $(SCRIBBLEC) -d $(1) $(1)/$(2) -api $(3) $(4) -api $(3) $(5) -api $(3) $(6) -api $(3) $(7) endef # dir, dir, proto @@ -271,7 +272,8 @@ endef # dir, filename define javac echo "Compiling: "$(1)/$(2); \ - javac -cp $(SCRIBHOME)/scribble-ast/target/classes:$(SCRIBHOME)/scribble-cli/target/classes:$(SCRIBHOME)/scribble-codegen/target/classes:$(SCRIBHOME)/scribble-core/target/classes:$(SCRIBHOME)/scribble-main/target/classes:$(SCRIBHOME)/scribble-parser/target/classes:$(SCRIBHOME)/scribble-parser/lib/antlr-3.5.2-complete.jar:$(SCRIBHOME)/scribble-runtime/target/classes:$(1) \ - $(1)/$(2) -d $(SCRIBHOME)/scribble-demos/target/test-classes + mkdir -p $(SCRIBBLE_HOME)/scribble-demos/target/test-classes; \ + javac -cp $(SCRIBBLE_HOME)/scribble-ast/target/classes:$(SCRIBBLE_HOME)/scribble-cli/target/classes:$(SCRIBBLE_HOME)/scribble-codegen/target/classes:$(SCRIBBLE_HOME)/scribble-core/target/classes:$(SCRIBBLE_HOME)/scribble-main/target/classes:$(SCRIBBLE_HOME)/scribble-parser/target/classes:$(SCRIBBLE_HOME)/scribble-parser/lib/antlr-3.5.2-complete.jar:$(SCRIBBLE_HOME)/scribble-runtime/target/classes:$(1) \ + $(1)/$(2) -d $(SCRIBBLE_HOME)/scribble-demos/target/test-classes endef diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index e46f063fc..d6047fb8d 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -50,8 +50,12 @@ CYGWIN=0 # Set to 1 for ';' classpath separator and cygpath formatting usage() { - echo Usage: 'scribblec.sh [option]... [option]...' + echo 'Set $SCRIBBLE_HOME to the Scribble base directory (default: current directory).' cat < [option]...' Source Scribble module (.scr file) @@ -174,7 +178,8 @@ while true; do esac done -if [ "$usage" = 1 ]; then +if [ "$usage" = 1 ] || [ -z "$ARGS" ]; then + usage exit 0 fi From 795137a0b15e1ff9475eded59feb2a6cb8be593c Mon Sep 17 00:00:00 2001 From: rhu1 Date: Sun, 16 May 2021 23:01:41 +0100 Subject: [PATCH 532/539] Minor --- scribble-dist/src/main/resources/scribblec.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index d6047fb8d..6de535a89 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -50,9 +50,9 @@ CYGWIN=0 # Set to 1 for ';' classpath separator and cygpath formatting usage() { - echo 'Set $SCRIBBLE_HOME to the Scribble base directory (default: current directory).' + echo 'Set $SCRIBBLE_HOME to the scribble-java root directory (default: current dir).' cat < [option]...' From 6f1897ca688307408b044d3ae0c011be998fb118 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Thu, 20 May 2021 10:59:02 +0100 Subject: [PATCH 533/539] Disable maven-deploy --- pom.xml | 770 +++++++++--------- .../message/ObjectStreamFormatter.java | 136 ++-- 2 files changed, 451 insertions(+), 455 deletions(-) diff --git a/pom.xml b/pom.xml index 28789c19b..30ccc5107 100644 --- a/pom.xml +++ b/pom.xml @@ -1,410 +1,418 @@ - - 4.0.0 + + 4.0.0 - org.scribble - parent - 0.5.1-SNAPSHOT - pom + org.scribble + parent + 0.5.1-SNAPSHOT + pom - - - - org.scribble - scribble-core - ${project.version} - - - org.scribble - scribble-parser - ${project.version} - - - org.scribble - scribble-ast - ${project.version} - - - org.scribble - scribble-cli - ${project.version} - - - org.scribble - scribble-runtime - ${project.version} - - - org.scribble - scribble-codegen - ${project.version} - - - org.scribble - scribble-main - ${project.version} - - - - org.scribble - scribble-test - ${project.version} - + + + + org.scribble + scribble-core + ${project.version} + + + org.scribble + scribble-parser + ${project.version} + + + org.scribble + scribble-ast + ${project.version} + + + org.scribble + scribble-cli + ${project.version} + + + org.scribble + scribble-runtime + ${project.version} + + + org.scribble + scribble-codegen + ${project.version} + + + org.scribble + scribble-main + ${project.version} + + + + org.scribble + scribble-test + ${project.version} + - - org.antlr - antlr-runtime - ${antlr.version} - - - junit - junit - ${junit.version} - + + org.antlr + antlr-runtime + ${antlr.version} + + + junit + junit + ${junit.version} + - - commons-io - commons-io - ${version.commons-io} - - - - + + commons-io + commons-io + ${version.commons-io} + + + + - - scribble-core - scribble-runtime - scribble-ast - scribble-parser - scribble-codegen - scribble-main - scribble-cli - scribble-test - scribble-dist - scribble-demos - + + scribble-core + scribble-runtime + scribble-ast + scribble-parser + scribble-codegen + scribble-main + scribble-cli + scribble-test + scribble-dist + scribble-demos + - - 3.4 - 4.13.1 - - - 2.7 + + 3.4 + 4.13.1 + + + 2.7 - - 1.8 - 1.8 - true + + 1.8 + 1.8 + true - 2.8.2 - 2.5.3 - 3.2.1 - - 2.9 - 0.3.4 - 0.1.0 + + 2.5.3 + 3.2.1 + + 2.9 + 0.3.4 + 0.1.0 + - UTF-8 - + UTF-8 + - scribble-java - Scribble - http://www.scribble.org - 2008 + scribble-java + Scribble + http://www.scribble.org + 2008 - - - Apache 2 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - Apache License V2 - - + + + Apache 2 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + Apache License V2 + + - - Scribble - http://www.scribble.org - + + Scribble + http://www.scribble.org + - - - Gary Brown - objectiser - gary.pi4tech@gmail.com - Scribble.org - - Developer - - +0 - - - Raymond Hu - rhu1 - r.z.h.hu@herts.ac.uk - University of Hertfordshire - - Developer - - +0 - - + + + Gary Brown + objectiser + gary.pi4tech@gmail.com + Scribble.org + + Developer + + +0 + + + Raymond Hu + rhu1 + r.z.h.hu@herts.ac.uk + University of Hertfordshire + + Developer + + +0 + + - - - - - - - org.apache.maven.plugins - maven-jar-plugin - 2.2 - - - org.apache.maven.plugins - maven-javadoc-plugin - ${version.maven-javadoc-plugin} - - - org.apache.maven.plugins - maven-antrun-plugin - 1.7 - - - org.apache.maven.plugins - maven-assembly-plugin - 2.4 - - - org.jboss.maven.plugins - maven-jdocbook-plugin - 2.3.8 - - - com.mycila - license-maven-plugin - 3.0 - + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + org.apache.maven.plugins + maven-javadoc-plugin + ${version.maven-javadoc-plugin} + + + org.apache.maven.plugins + maven-antrun-plugin + 1.7 + + + org.apache.maven.plugins + maven-assembly-plugin + 2.4 + + + org.jboss.maven.plugins + maven-jdocbook-plugin + 2.3.8 + + + com.mycila + license-maven-plugin + 3.0 + - - - io.takari - maven - ${version.io.takari-maven} - - - + + + io.takari + maven + ${version.io.takari-maven} + + + - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.2 - - - - org.apache.maven.plugins - maven-source-plugin - ${version.maven-source-plugin} - - - attach-sources - verify - - jar - - - - - - maven-surefire-plugin - 2.5 - - - **/*TestCase.java - **/*Test.java - - - **/ScribAllTest.java - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.2 + + + + org.apache.maven.plugins + maven-source-plugin + ${version.maven-source-plugin} + + + attach-sources + verify + + jar + + + + + + maven-surefire-plugin + 2.5 + + + **/*TestCase.java + **/*Test.java + + + **/ScribAllTest.java + + + - - - com.mycila - license-maven-plugin - -
header.txt
- true - true - - **/*.xml - **/*.g - **/*.scr - **/*.policy - **/*.txt - mvnw - mvnw.cmd - travis/publish.sh - .mvn/wrapper/maven-wrapper.properties - **/*.versionsBackup - **/Scribble-0.3.original - bin/*.sh - scribblec.sh - **/*.swp - scribble-test/**/*.* - **/IGNORE - - scribble-f17/**/* - -
- - - - check - - compile - - -
- - maven-release-plugin - ${version.maven-release-plugin} - - false - release - true - @{project.version} - - - - io.zipkin.centralsync-maven-plugin - centralsync-maven-plugin - ${version.io.zikin.centralsync-maven-plugin} - - scribble - maven - scribble-java - - -
-
+ + + com.mycila + license-maven-plugin + +
header.txt
+ true + true + + **/*.xml + **/*.g + **/*.scr + **/*.policy + **/*.txt + mvnw + mvnw.cmd + travis/publish.sh + .mvn/wrapper/maven-wrapper.properties + **/*.versionsBackup + **/Scribble-0.3.original + bin/*.sh + scribblec.sh + **/*.swp + scribble-test/**/*.* + + **/IGNORE + + scribble-f17/**/* + +
+ + + + check + + compile + + +
+ + maven-release-plugin + ${version.maven-release-plugin} + + false + release + true + @{project.version} + + + + io.zipkin.centralsync-maven-plugin + centralsync-maven-plugin + ${version.io.zikin.centralsync-maven-plugin} + + scribble + maven + scribble-java + + + + - - - - org.apache.maven.plugins - maven-surefire-report-plugin - 3.0.0-M5 - - - + + + + org.apache.maven.plugins + maven-surefire-report-plugin + 3.0.0-M5 + + + - - https://github.com/scribble/scribble-java - scm:git:https://github.com/scribble/scribble-java.git - scm:git:https://github.com/scribble/scribble-java.git - HEAD - + + https://github.com/scribble/scribble-java + scm:git:https://github.com/scribble/scribble-java.git + + + scm:git:https://github.com/scribble/scribble-java.git + + HEAD + - - - bintray - https://api.bintray.com/maven/scribble/maven/scribble-java/;publish=1 - - - jfrog-snapshots - http://oss.jfrog.org/artifactory/oss-snapshot-local - - + - - - release - - - - - maven-source-plugin - ${version.maven-source-plugin} - - - attach-sources - - jar - - - - - - - maven-javadoc-plugin - ${version.maven-javadoc-plugin} - - false - - - - attach-javadocs - - jar - - package - - - - - - - + + + release + + + + + maven-source-plugin + ${version.maven-source-plugin} + + + attach-sources + + jar + + + + + + + maven-javadoc-plugin + ${version.maven-javadoc-plugin} + + false + + + + attach-javadocs + + jar + + package + + + + + + +
diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/message/ObjectStreamFormatter.java b/scribble-runtime/src/main/java/org/scribble/runtime/message/ObjectStreamFormatter.java index 4d9d95a80..44cbb40d4 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/message/ObjectStreamFormatter.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/message/ObjectStreamFormatter.java @@ -1,11 +1,11 @@ /** * Copyright 2008 The Scribble Authors - * + *

* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at - * + *

* http://www.apache.org/licenses/LICENSE-2.0 - * + *

* Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under @@ -26,28 +26,24 @@ import java.nio.ByteBuffer; import java.util.Arrays; -public class ObjectStreamFormatter implements ScribMessageFormatter -{ - public ObjectStreamFormatter() - { +public class ObjectStreamFormatter implements ScribMessageFormatter { + public ObjectStreamFormatter() { - } + } - @Override - //public byte[] toBytes(ScribMessage m) throws IOException - public void writeMessage(DataOutputStream dos, ScribMessage m) throws IOException - { - throw new RuntimeException("Deprecated"); + @Override + //public byte[] toBytes(ScribMessage m) throws IOException + public void writeMessage(DataOutputStream dos, ScribMessage m) throws IOException { + throw new RuntimeException("Deprecated"); /*byte[] bs = serialize(m); dos.writeInt(bs.length); dos.write(bs); dos.flush();*/ - } + } - @Override - public ScribMessage readMessage(DataInputStream dis) throws IOException - { - throw new RuntimeException("Deprecated"); + @Override + public ScribMessage readMessage(DataInputStream dis) throws IOException { + throw new RuntimeException("Deprecated"); /*try { int len = dis.readInt(); @@ -59,64 +55,56 @@ public ScribMessage readMessage(DataInputStream dis) throws IOException { throw new IOException(cnfe); }*/ - } + } - @Override - public byte[] toBytes(ScribMessage m) throws IOException - { - byte[] body = serialize(m); - byte[] header = ByteBuffer.allocate(4).putInt(body.length).array(); // FIXME: buffer alloc - byte[] bs = new byte[header.length + body.length]; - System.arraycopy(header, 0, bs, 0, header.length); - System.arraycopy(body, 0, bs, 4, body.length); - return bs; - } + @Override + public byte[] toBytes(ScribMessage m) throws IOException { + byte[] body = serialize(m); + byte[] header = ByteBuffer.allocate(4).putInt(body.length).array(); // FIXME: buffer alloc + byte[] bs = new byte[header.length + body.length]; + System.arraycopy(header, 0, bs, 0, header.length); + System.arraycopy(body, 0, bs, 4, body.length); + return bs; + } - @Override - public ScribMessage fromBytes(ByteBuffer bb) throws IOException, ClassNotFoundException - { - // Pre: bb:put - ((Buffer) bb).flip(); // Cast -- cf. https://stackoverflow.com/questions/61267495/exception-in-thread-main-java-lang-nosuchmethoderror-java-nio-bytebuffer-flip - if (bb.remaining() <= 4) - { - bb.compact(); - return null; - } - byte[] header = Arrays.copyOf(bb.array(), 4); - int size = ByteBuffer.wrap(header).getInt(); - if (bb.remaining() < (4 + size)) - { - bb.compact(); - return null; - } - bb.position(bb.position() + 4); // position is always 0 here? - byte[] bs = new byte[size]; - bb.get(bs); - ScribMessage m = deserialize(bs); - bb.compact(); // Post: bb:put - return m; - } + @Override + public ScribMessage fromBytes(ByteBuffer bb) throws IOException, ClassNotFoundException { + // Pre: bb:put + ((Buffer) bb).flip(); // Cast HACK -- cf. https://stackoverflow.com/questions/61267495/exception-in-thread-main-java-lang-nosuchmethoderror-java-nio-bytebuffer-flip + if (bb.remaining() <= 4) { + bb.compact(); + return null; + } + byte[] header = Arrays.copyOf(bb.array(), 4); + int size = ByteBuffer.wrap(header).getInt(); + if (bb.remaining() < (4 + size)) { + bb.compact(); + return null; + } + // Cast HACK -- cf. https://stackoverflow.com/questions/61267495/exception-in-thread-main-java-lang-nosuchmethoderror-java-nio-bytebuffer-flip + bb.position(bb.position() + 4); // position is always 0 here? + //((Buffer) bb).position(((Buffer) bb).position() + 4); // position is always 0 here? + byte[] bs = new byte[size]; + bb.get(bs); + ScribMessage m = deserialize(bs); + bb.compact(); // Post: bb:put + return m; + } - private static byte[] serialize(Object o) throws IOException - { - try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) - { - try (ObjectOutput out = new ObjectOutputStream(bos)) - { - out.writeObject(o); - return bos.toByteArray(); - } - } - } + private static byte[] serialize(Object o) throws IOException { + try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) { + try (ObjectOutput out = new ObjectOutputStream(bos)) { + out.writeObject(o); + return bos.toByteArray(); + } + } + } - private static ScribMessage deserialize(byte[] bs) throws IOException, ClassNotFoundException - { - try (ByteArrayInputStream bis = new ByteArrayInputStream(bs)) - { - try (ObjectInput in = new ObjectInputStream(bis)) - { - return (ScribMessage) in.readObject(); - } - } - } + private static ScribMessage deserialize(byte[] bs) throws IOException, ClassNotFoundException { + try (ByteArrayInputStream bis = new ByteArrayInputStream(bs)) { + try (ObjectInput in = new ObjectInputStream(bis)) { + return (ScribMessage) in.readObject(); + } + } + } } From d050f42d4db524565f5e3b449dfe8ae0393f30a0 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Thu, 20 May 2021 11:14:29 +0100 Subject: [PATCH 534/539] Fix header typos --- .../org/scribble/runtime/message/ObjectStreamFormatter.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scribble-runtime/src/main/java/org/scribble/runtime/message/ObjectStreamFormatter.java b/scribble-runtime/src/main/java/org/scribble/runtime/message/ObjectStreamFormatter.java index 44cbb40d4..a5d661a60 100644 --- a/scribble-runtime/src/main/java/org/scribble/runtime/message/ObjectStreamFormatter.java +++ b/scribble-runtime/src/main/java/org/scribble/runtime/message/ObjectStreamFormatter.java @@ -1,11 +1,11 @@ /** * Copyright 2008 The Scribble Authors - *

+ * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at - *

+ * * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under From 31f628faba89a4ae2d6391bd255ee35dd55e0a5b Mon Sep 17 00:00:00 2001 From: rhu1 Date: Thu, 20 May 2021 14:10:37 +0100 Subject: [PATCH 535/539] Add CB API test --- .../src/test/scrib/demo/highlow/HighLow.scr | 34 ++++++ .../src/test/scrib/demo/highlow/HighLowA.java | 67 +++++++++++ .../src/test/scrib/demo/highlow/HighLowB.java | 76 ++++++++++++ .../src/test/scrib/demo/highlow/HighLowC.java | 72 ++++++++++++ .../src/test/scrib/demo/highlow/cb/MyA.java | 78 +++++++++++++ .../src/test/scrib/demo/highlow/cb/MyB.java | 110 ++++++++++++++++++ .../src/test/scrib/demo/highlow/cb/MyC.java | 85 ++++++++++++++ travis/publish.sh | 13 ++- 8 files changed, 529 insertions(+), 6 deletions(-) create mode 100644 scribble-test/src/test/scrib/demo/highlow/HighLow.scr create mode 100644 scribble-test/src/test/scrib/demo/highlow/HighLowA.java create mode 100644 scribble-test/src/test/scrib/demo/highlow/HighLowB.java create mode 100644 scribble-test/src/test/scrib/demo/highlow/HighLowC.java create mode 100644 scribble-test/src/test/scrib/demo/highlow/cb/MyA.java create mode 100644 scribble-test/src/test/scrib/demo/highlow/cb/MyB.java create mode 100644 scribble-test/src/test/scrib/demo/highlow/cb/MyC.java diff --git a/scribble-test/src/test/scrib/demo/highlow/HighLow.scr b/scribble-test/src/test/scrib/demo/highlow/HighLow.scr new file mode 100644 index 000000000..b756b22ac --- /dev/null +++ b/scribble-test/src/test/scrib/demo/highlow/HighLow.scr @@ -0,0 +1,34 @@ +//$ bin/scribblec.sh scribble-test/src/test/scrib/demo/highlow/HighLow.scr -d scribble-test/src/test/scrib/demo -api HighLow A + +module highlow.HighLow; + +type "java.lang.Integer" from "runtime.jar" as int; + +global protocol HighLow(role A, role B, role C) { + start(int) from A to B; //@'0<=n0 && n0<100' + limit(int) from A to B; //@'0x && t>1' + higher() from B to A; + do Aux(A, B, C); //@'B[n, t-1]' + } or { + lower() from B to C; //@'n1' + lower() from B to A; + do Aux(A, B, C); //@'B[n, t-1]' + } or { + lose() from B to C; //@'(!(n1=x)) && t1=1' // FIXME: !-precedence, and !-dot-output + //@'((nx) && t=1)' + win() from B to A; + } +} + diff --git a/scribble-test/src/test/scrib/demo/highlow/HighLowA.java b/scribble-test/src/test/scrib/demo/highlow/HighLowA.java new file mode 100644 index 000000000..977bdbbfd --- /dev/null +++ b/scribble-test/src/test/scrib/demo/highlow/HighLowA.java @@ -0,0 +1,67 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package highlow; + +import highlow.HighLow.HighLow.HighLow; +import highlow.HighLow.HighLow.roles.A; +import highlow.HighLow.HighLow.statechans.A.EndSocket; +import highlow.HighLow.HighLow.statechans.A.HighLow_A_1; +import highlow.HighLow.HighLow.statechans.A.HighLow_A_3; +import highlow.HighLow.HighLow.statechans.A.HighLow_A_3_Cases; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; + +import java.io.IOException; + +import static highlow.HighLow.HighLow.HighLow.*; + +public class HighLowA { + public void run() throws Exception { + HighLow proto = new HighLow(); + try (MPSTEndpoint se + = new MPSTEndpoint<>(proto, A, new ObjectStreamFormatter())) { + se.request(B, SocketChannelEndpoint::new, "localhost", 8888); + highLow(new HighLow_A_1(se)); + } catch (ScribRuntimeException | IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + } + + private EndSocket highLow(HighLow_A_1 a1) throws Exception { + return aux(a1.send(B, start, 42).send(B, limit, 5)); + } + + private EndSocket aux(HighLow_A_3 a3) throws Exception { + HighLow_A_3_Cases a3Cases = a3.branch(B); + switch (a3Cases.op) { + case higher: + return aux(a3Cases.receive(higher)); + case lose: + return a3Cases.receive(lose); + case lower: + return aux(a3Cases.receive(lower)); + case win: + return a3Cases.receive(win); + default: + throw new RuntimeException("Won't get in here: " + a3Cases.op); + } + } + + public static void main(String[] args) throws Exception { + new HighLowA().run(); + } +} diff --git a/scribble-test/src/test/scrib/demo/highlow/HighLowB.java b/scribble-test/src/test/scrib/demo/highlow/HighLowB.java new file mode 100644 index 000000000..bd464ec99 --- /dev/null +++ b/scribble-test/src/test/scrib/demo/highlow/HighLowB.java @@ -0,0 +1,76 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package highlow; + +import highlow.HighLow.HighLow.HighLow; +import highlow.HighLow.HighLow.roles.B; +import highlow.HighLow.HighLow.statechans.B.EndSocket; +import highlow.HighLow.HighLow.statechans.B.HighLow_B_1; +import highlow.HighLow.HighLow.statechans.B.HighLow_B_3; +import highlow.HighLow.HighLow.statechans.B.HighLow_B_4; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; +import org.scribble.runtime.session.MPSTEndpoint; +import org.scribble.runtime.util.Buf; + +import java.io.IOException; + +import static highlow.HighLow.HighLow.HighLow.*; + +public class HighLowB { + public void run() throws Exception { + try (ScribServerSocket ssA = new SocketChannelServer(8888); + ScribServerSocket ssC = new SocketChannelServer(9999); + ) { + while (true) { + HighLow proto = new HighLow(); + try (MPSTEndpoint se + = new MPSTEndpoint<>(proto, B, new ObjectStreamFormatter())) { + se.accept(ssA, A); + se.accept(ssC, C); + highLow(new HighLow_B_1(se)); + } catch (ScribRuntimeException | IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + } + } + } + + private EndSocket highLow(HighLow_B_1 b1) throws Exception { + Buf s = new Buf<>(); + Buf l = new Buf<>(); + return aux(b1.receive(A, start, s).receive(A, limit, l), s.val, l.val); + } + + private EndSocket aux(HighLow_B_3 b3, int secret, int tries) throws Exception { + Buf g = new Buf<>(); + HighLow_B_4 b4 = b3.receive(C, guess, g); + if (g.val == secret) { + return b4.send(C, win).send(A, lose); + } else if (tries <= 1) { + return b4.send(C, lose).send(A, win); + } else if (g.val < secret) { + return aux(b4.send(C, higher).send(A, higher), secret, tries - 1); + } else { + return aux(b4.send(C, lower).send(A, lower), secret, tries - 1); + } + } + + public static void main(String[] args) throws Exception { + new HighLowB().run(); + } +} diff --git a/scribble-test/src/test/scrib/demo/highlow/HighLowC.java b/scribble-test/src/test/scrib/demo/highlow/HighLowC.java new file mode 100644 index 000000000..046e5b379 --- /dev/null +++ b/scribble-test/src/test/scrib/demo/highlow/HighLowC.java @@ -0,0 +1,72 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package highlow; + +import highlow.HighLow.HighLow.HighLow; +import highlow.HighLow.HighLow.roles.C; +import highlow.HighLow.HighLow.statechans.C.EndSocket; +import highlow.HighLow.HighLow.statechans.C.HighLow_C_1; +import highlow.HighLow.HighLow.statechans.C.HighLow_C_2_Cases; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; +import org.scribble.runtime.session.MPSTEndpoint; + +import java.io.IOException; + +import static highlow.HighLow.HighLow.HighLow.*; + +public class HighLowC { + public void run() throws Exception { + HighLow proto = new HighLow(); + + try (MPSTEndpoint se + = new MPSTEndpoint<>(proto, C, new ObjectStreamFormatter())) { + se.request(B, SocketChannelEndpoint::new, "localhost", 9999); + + + highLow(new HighLow_C_1(se)); + } catch (ScribRuntimeException | IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + } + + private EndSocket highLow(HighLow_C_1 c1) throws Exception { + return aux(c1, 50); + } + + private EndSocket aux(HighLow_C_1 c1, int g) throws Exception { + System.out.println("Guessing " + g); + HighLow_C_2_Cases c2Cases = c1.send(B, guess, g).branch(B); + switch (c2Cases.op) { + case higher: + return aux(c2Cases.receive(B, higher), g + 1); + case win: + System.out.println("We win!"); + return c2Cases.receive(B, win); + case lower: + return aux(c2Cases.receive(B, lower), g - 1); + case lose: + System.out.println("We lose..."); + return c2Cases.receive(B, lose); + default: + throw new RuntimeException("Won't get in here: " + c2Cases.op); + } + } + + public static void main(String[] args) throws Exception { + new HighLowC().run(); + } +} diff --git a/scribble-test/src/test/scrib/demo/highlow/cb/MyA.java b/scribble-test/src/test/scrib/demo/highlow/cb/MyA.java new file mode 100644 index 000000000..7282889ca --- /dev/null +++ b/scribble-test/src/test/scrib/demo/highlow/cb/MyA.java @@ -0,0 +1,78 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package highlow.cb; + +import highlow.HighLow.HighLow.HighLow; +import highlow.HighLow.HighLow.callbacks.A.HighLow_A; +import highlow.HighLow.HighLow.callbacks.A.HighLow_A_3_Branch; +import highlow.HighLow.HighLow.callbacks.A.states.HighLow_A_1; +import highlow.HighLow.HighLow.callbacks.A.states.HighLow_A_2; +import highlow.HighLow.HighLow.callbacks.A.states.HighLow_A_3; +import highlow.HighLow.HighLow.ops.higher; +import highlow.HighLow.HighLow.ops.lose; +import highlow.HighLow.HighLow.ops.lower; +import highlow.HighLow.HighLow.ops.win; +import highlow.HighLow.HighLow.roles.B; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; + +import java.io.IOException; +import java.util.concurrent.Future; + +import static highlow.HighLow.HighLow.HighLow.A; +import static highlow.HighLow.HighLow.HighLow.B; + +public class MyA { + public void run() throws Exception { + HighLow proto = new HighLow(); + + try (HighLow_A c = new HighLow_A<>(proto, A, new ObjectStreamFormatter(), null)) { + c.icallback(HighLow_A_1.id, (data) -> new HighLow_A_1.B.start(42)); + c.icallback(HighLow_A_2.id, (data) -> new HighLow_A_2.B.limit(5)); + c.icallback(HighLow_A_3.id, new MyHandlerA()); + + c.request(B, SocketChannelEndpoint::new, "localhost", 8888); + Future f = c.run(); + f.get(); + } catch (ScribRuntimeException | IOException e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) throws Exception { + new MyA().run(); + } +} + +class MyHandlerA extends HighLow_A_3_Branch { + @Override + public void receive(Void data, highlow.HighLow.HighLow.roles.B peer, higher op) { + } + + @Override + public void receive(Void data, B peer, lose op) { + System.out.println("We lose..."); + } + + @Override + public void receive(Void data, B peer, lower op) { + } + + @Override + public void receive(Void data, B peer, win op) { + System.out.println("We win!"); + } +} diff --git a/scribble-test/src/test/scrib/demo/highlow/cb/MyB.java b/scribble-test/src/test/scrib/demo/highlow/cb/MyB.java new file mode 100644 index 000000000..86b9e6783 --- /dev/null +++ b/scribble-test/src/test/scrib/demo/highlow/cb/MyB.java @@ -0,0 +1,110 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package highlow.cb; + +import highlow.HighLow.HighLow.HighLow; +import highlow.HighLow.HighLow.callbacks.B.HighLow_B; +import highlow.HighLow.HighLow.callbacks.B.HighLow_B_1_Branch; +import highlow.HighLow.HighLow.callbacks.B.HighLow_B_2_Branch; +import highlow.HighLow.HighLow.callbacks.B.HighLow_B_3_Branch; +import highlow.HighLow.HighLow.callbacks.B.states.*; +import highlow.HighLow.HighLow.ops.guess; +import highlow.HighLow.HighLow.ops.limit; +import highlow.HighLow.HighLow.ops.start; +import highlow.HighLow.HighLow.roles.A; +import highlow.HighLow.HighLow.roles.C; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.ScribServerSocket; +import org.scribble.runtime.net.SocketChannelServer; + +import java.io.IOException; +import java.util.concurrent.Future; + +import static highlow.HighLow.HighLow.HighLow.A; +import static highlow.HighLow.HighLow.HighLow.B; +import static highlow.HighLow.HighLow.HighLow.C; + +public class MyB { + public void run() throws Exception { + + try (ScribServerSocket ssA = new SocketChannelServer(8888); + ScribServerSocket ssC = new SocketChannelServer(9999) + ) { + while (true) { + HighLow proto = new HighLow(); + try (HighLow_B b = new HighLow_B<>(proto, B, new ObjectStreamFormatter(), new MyStateB())) { + b.icallback(HighLow_B_1.id, new MyHandlerB1()); + b.icallback(HighLow_B_2.id, new MyHandlerB2()); + b.icallback(HighLow_B_3.id, new MyHandlerB3()); + b.icallback(HighLow_B_4.id, (data) -> { + if (data.secret == data.guess) { + return new HighLow_B_4.C.win(); + } else if (data.tries == 0) { + return new HighLow_B_4.C.lose(); + } else { + data.tries--; + return (data.secret > data.guess) + ? new HighLow_B_4.C.higher() + : new HighLow_B_4.C.lower(); + } + }); + b.icallback(HighLow_B_5.id, (data) -> new HighLow_B_5.A.lose()); + b.icallback(HighLow_B_6.id, (data) -> new HighLow_B_6.A.higher()); + b.icallback(HighLow_B_7.id, (data) -> new HighLow_B_7.A.lower()); + b.icallback(HighLow_B_8.id, (data) -> new HighLow_B_8.A.win()); + + b.accept(ssA, A); + b.accept(ssC, C); + Future f = b.run(); + f.get(); + } catch (ScribRuntimeException | IOException e) { + e.printStackTrace(); + } + } + } + } + + public static void main(String[] args) throws Exception { + new MyB().run(); + } +} + +class MyStateB { + public int secret; + public int tries; + public int guess; +} + +class MyHandlerB1 extends HighLow_B_1_Branch { + @Override + public void receive(MyStateB data, A peer, start op, Integer arg1) { + data.secret = arg1; + } +} + +class MyHandlerB2 extends HighLow_B_2_Branch { + @Override + public void receive(MyStateB data, A peer, limit op, Integer arg1) { + data.tries = arg1; + } +} + +class MyHandlerB3 extends HighLow_B_3_Branch { + @Override + public void receive(MyStateB data, C peer, guess op, Integer arg1) { + data.guess = arg1; + } +} diff --git a/scribble-test/src/test/scrib/demo/highlow/cb/MyC.java b/scribble-test/src/test/scrib/demo/highlow/cb/MyC.java new file mode 100644 index 000000000..ac412ff17 --- /dev/null +++ b/scribble-test/src/test/scrib/demo/highlow/cb/MyC.java @@ -0,0 +1,85 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package highlow.cb; + +import highlow.HighLow.HighLow.HighLow; +import highlow.HighLow.HighLow.callbacks.C.HighLow_C; +import highlow.HighLow.HighLow.callbacks.C.HighLow_C_2_Branch; +import highlow.HighLow.HighLow.callbacks.C.states.HighLow_C_1; +import highlow.HighLow.HighLow.callbacks.C.states.HighLow_C_2; +import highlow.HighLow.HighLow.ops.higher; +import highlow.HighLow.HighLow.ops.lose; +import highlow.HighLow.HighLow.ops.lower; +import highlow.HighLow.HighLow.ops.win; +import highlow.HighLow.HighLow.roles.B; +import org.scribble.main.ScribRuntimeException; +import org.scribble.runtime.message.ObjectStreamFormatter; +import org.scribble.runtime.net.SocketChannelEndpoint; + +import java.io.IOException; +import java.util.concurrent.Future; + +import static highlow.HighLow.HighLow.HighLow.B; +import static highlow.HighLow.HighLow.HighLow.C; + +public class MyC { + public void run() throws Exception { + HighLow proto = new HighLow(); + + try (HighLow_C c = new HighLow_C<>(proto, C, new ObjectStreamFormatter(), new MyStateC())) { + c.icallback(HighLow_C_1.id, (data) -> { + System.out.println("Guessing " + data.guess); + return new HighLow_C_1.B.guess(data.guess); + }); + c.icallback(HighLow_C_2.id, new MyHandlerC()); + + c.request(B, SocketChannelEndpoint::new, "localhost", 9999); + Future f = c.run(); + f.get(); + } catch (ScribRuntimeException | IOException e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) throws Exception { + new MyC().run(); + } +} + +class MyStateC { + public int guess = 50; +} + +class MyHandlerC extends HighLow_C_2_Branch { + @Override + public void receive(MyStateC data, B peer, higher op) { + data.guess++; + } + + @Override + public void receive(MyStateC data, B peer, lose op) { + System.out.println("We lose..."); + } + + @Override + public void receive(MyStateC data, B peer, lower op) { + data.guess--; + } + + @Override + public void receive(MyStateC data, B peer, win op) { + System.out.println("We win!"); + } +} diff --git a/travis/publish.sh b/travis/publish.sh index d34a10717..5b1fb4422 100755 --- a/travis/publish.sh +++ b/travis/publish.sh @@ -102,12 +102,13 @@ if is_pull_request; then # If we are on master, we will deploy the latest snapshot or release version # - If a release commit fails to deploy for a transient reason, delete the broken version from bintray and click rebuild elif is_travis_branch_master; then - ./mvnw --batch-mode -s ./.settings.xml -Prelease -nsu -DskipTests deploy - - # If the deployment succeeded, sync it to Maven Central. Note: this needs to be done once per project, not module, hence -N - if is_release_commit; then - ./mvnw --batch-mode -s ./.settings.xml -nsu -N io.zipkin.centralsync-maven-plugin:centralsync-maven-plugin:sync - fi + #./mvnw --batch-mode -s ./.settings.xml -Prelease -nsu -DskipTests deploy + # + ## If the deployment succeeded, sync it to Maven Central. Note: this needs to be done once per project, not module, hence -N + #if is_release_commit; then + # ./mvnw --batch-mode -s ./.settings.xml -nsu -N io.zipkin.centralsync-maven-plugin:centralsync-maven-plugin:sync + #fi + true # If we are on a release tag, the following will update any version references and push a version tag for deployment. elif build_started_by_tag; then From 1e0eb060726085f336623f0488d110d898d5bcb0 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Thu, 20 May 2021 14:25:56 +0100 Subject: [PATCH 536/539] Minor --- pom.xml | 14 +++++++------- .../src/test/scrib/demo/highlow/HighLow.scr | 15 +++++++-------- .../src/test/scrib/demo/highlow/HighLowA.java | 3 ++- .../src/test/scrib/demo/highlow/cb/MyA.java | 4 ++-- .../src/test/scrib/demo/highlow/cb/MyB.java | 8 ++++---- travis/publish.sh | 14 +++++++------- 6 files changed, 29 insertions(+), 29 deletions(-) diff --git a/pom.xml b/pom.xml index 30ccc5107..d86ec505c 100644 --- a/pom.xml +++ b/pom.xml @@ -114,7 +114,7 @@ 1.8 true - + 2.8.2 2.5.3 3.2.1 @@ -362,18 +362,18 @@ HEAD - - --> diff --git a/scribble-test/src/test/scrib/demo/highlow/HighLow.scr b/scribble-test/src/test/scrib/demo/highlow/HighLow.scr index b756b22ac..8c4aa3b47 100644 --- a/scribble-test/src/test/scrib/demo/highlow/HighLow.scr +++ b/scribble-test/src/test/scrib/demo/highlow/HighLow.scr @@ -1,18 +1,18 @@ -//$ bin/scribblec.sh scribble-test/src/test/scrib/demo/highlow/HighLow.scr -d scribble-test/src/test/scrib/demo -api HighLow A +//$ bin/scribblec.sh scribble-test/src/test/scrib/demo/highlow/HighLow.scr -d scribble-test/src/test/scrib/demo -cbapi HighLow A module highlow.HighLow; type "java.lang.Integer" from "runtime.jar" as int; global protocol HighLow(role A, role B, role C) { - start(int) from A to B; //@'0<=n0 && n0<100' - limit(int) from A to B; //@'0x) && t=1)' + lose() from B to C; //@'!(n1=x) && t1=1' win() from B to A; } } diff --git a/scribble-test/src/test/scrib/demo/highlow/HighLowA.java b/scribble-test/src/test/scrib/demo/highlow/HighLowA.java index 977bdbbfd..32c7f23e5 100644 --- a/scribble-test/src/test/scrib/demo/highlow/HighLowA.java +++ b/scribble-test/src/test/scrib/demo/highlow/HighLowA.java @@ -15,6 +15,7 @@ package highlow; import highlow.HighLow.HighLow.HighLow; +import highlow.HighLow.HighLow.ops.secret; import highlow.HighLow.HighLow.roles.A; import highlow.HighLow.HighLow.statechans.A.EndSocket; import highlow.HighLow.HighLow.statechans.A.HighLow_A_1; @@ -42,7 +43,7 @@ public void run() throws Exception { } private EndSocket highLow(HighLow_A_1 a1) throws Exception { - return aux(a1.send(B, start, 42).send(B, limit, 5)); + return aux(a1.send(B, secret, 42).send(B, tries, 5)); } private EndSocket aux(HighLow_A_3 a3) throws Exception { diff --git a/scribble-test/src/test/scrib/demo/highlow/cb/MyA.java b/scribble-test/src/test/scrib/demo/highlow/cb/MyA.java index 7282889ca..9dd323dfc 100644 --- a/scribble-test/src/test/scrib/demo/highlow/cb/MyA.java +++ b/scribble-test/src/test/scrib/demo/highlow/cb/MyA.java @@ -40,8 +40,8 @@ public void run() throws Exception { HighLow proto = new HighLow(); try (HighLow_A c = new HighLow_A<>(proto, A, new ObjectStreamFormatter(), null)) { - c.icallback(HighLow_A_1.id, (data) -> new HighLow_A_1.B.start(42)); - c.icallback(HighLow_A_2.id, (data) -> new HighLow_A_2.B.limit(5)); + c.icallback(HighLow_A_1.id, (data) -> new HighLow_A_1.B.secret(42)); + c.icallback(HighLow_A_2.id, (data) -> new HighLow_A_2.B.tries(5)); c.icallback(HighLow_A_3.id, new MyHandlerA()); c.request(B, SocketChannelEndpoint::new, "localhost", 8888); diff --git a/scribble-test/src/test/scrib/demo/highlow/cb/MyB.java b/scribble-test/src/test/scrib/demo/highlow/cb/MyB.java index 86b9e6783..61d469e24 100644 --- a/scribble-test/src/test/scrib/demo/highlow/cb/MyB.java +++ b/scribble-test/src/test/scrib/demo/highlow/cb/MyB.java @@ -21,8 +21,8 @@ import highlow.HighLow.HighLow.callbacks.B.HighLow_B_3_Branch; import highlow.HighLow.HighLow.callbacks.B.states.*; import highlow.HighLow.HighLow.ops.guess; -import highlow.HighLow.HighLow.ops.limit; -import highlow.HighLow.HighLow.ops.start; +import highlow.HighLow.HighLow.ops.secret; +import highlow.HighLow.HighLow.ops.tries; import highlow.HighLow.HighLow.roles.A; import highlow.HighLow.HighLow.roles.C; import org.scribble.main.ScribRuntimeException; @@ -90,14 +90,14 @@ class MyStateB { class MyHandlerB1 extends HighLow_B_1_Branch { @Override - public void receive(MyStateB data, A peer, start op, Integer arg1) { + public void receive(MyStateB data, A peer, secret op, Integer arg1) { data.secret = arg1; } } class MyHandlerB2 extends HighLow_B_2_Branch { @Override - public void receive(MyStateB data, A peer, limit op, Integer arg1) { + public void receive(MyStateB data, A peer, tries op, Integer arg1) { data.tries = arg1; } } diff --git a/travis/publish.sh b/travis/publish.sh index 5b1fb4422..3301fafeb 100755 --- a/travis/publish.sh +++ b/travis/publish.sh @@ -102,13 +102,13 @@ if is_pull_request; then # If we are on master, we will deploy the latest snapshot or release version # - If a release commit fails to deploy for a transient reason, delete the broken version from bintray and click rebuild elif is_travis_branch_master; then - #./mvnw --batch-mode -s ./.settings.xml -Prelease -nsu -DskipTests deploy - # - ## If the deployment succeeded, sync it to Maven Central. Note: this needs to be done once per project, not module, hence -N - #if is_release_commit; then - # ./mvnw --batch-mode -s ./.settings.xml -nsu -N io.zipkin.centralsync-maven-plugin:centralsync-maven-plugin:sync - #fi - true + ./mvnw --batch-mode -s ./.settings.xml -Prelease -nsu -DskipTests deploy + + # If the deployment succeeded, sync it to Maven Central. Note: this needs to be done once per project, not module, hence -N + if is_release_commit; then + ./mvnw --batch-mode -s ./.settings.xml -nsu -N io.zipkin.centralsync-maven-plugin:centralsync-maven-plugin:sync + fi + #true # If we are on a release tag, the following will update any version references and push a version tag for deployment. elif build_started_by_tag; then From 97a1fb2686ed2946fde273f6e351a6e592dc99df Mon Sep 17 00:00:00 2001 From: rhu1 Date: Thu, 20 May 2021 14:33:20 +0100 Subject: [PATCH 537/539] Disable maven-deploy (again) --- pom.xml | 22 +++++------ .../src/test/scrib/demo/highlow/HighLow.scr | 1 + travis/publish.sh | 39 +++++++++---------- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/pom.xml b/pom.xml index d86ec505c..188655f30 100644 --- a/pom.xml +++ b/pom.xml @@ -114,7 +114,7 @@ 1.8 true - 2.8.2 + 2.5.3 3.2.1 @@ -362,18 +362,18 @@ HEAD + + + bintray + https://api.bintray.com/maven/scribble/maven/scribble-java/;publish=1 + + + jfrog-snapshots + http://oss.jfrog.org/artifactory/oss-snapshot-local + + --> diff --git a/scribble-test/src/test/scrib/demo/highlow/HighLow.scr b/scribble-test/src/test/scrib/demo/highlow/HighLow.scr index 8c4aa3b47..c9f9ced1d 100644 --- a/scribble-test/src/test/scrib/demo/highlow/HighLow.scr +++ b/scribble-test/src/test/scrib/demo/highlow/HighLow.scr @@ -1,3 +1,4 @@ +//$ bin/scribblec.sh scribble-test/src/test/scrib/demo/highlow/HighLow.scr -d scribble-test/src/test/scrib/demo -api HighLow A //$ bin/scribblec.sh scribble-test/src/test/scrib/demo/highlow/HighLow.scr -d scribble-test/src/test/scrib/demo -cbapi HighLow A module highlow.HighLow; diff --git a/travis/publish.sh b/travis/publish.sh index 3301fafeb..c4f841d1f 100755 --- a/travis/publish.sh +++ b/travis/publish.sh @@ -45,20 +45,20 @@ check_travis_branch_equals_travis_tag() { } check_release_tag() { - tag="${TRAVIS_TAG}" - if [[ "$tag" =~ ^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+$ ]]; then - echo "Build started by version tag $tag. During the release process tags like this" - echo "are created by the 'release' Maven plugin. Nothing to do here." - exit 0 - elif [[ ! "$tag" =~ ^release-[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+$ ]]; then - echo "You must specify a tag of the format 'release-0.0.0' to release this project." - echo "The provided tag ${tag} doesn't match that. Aborting." - exit 1 - fi + tag="${TRAVIS_TAG}" + if [[ "$tag" =~ ^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+$ ]]; then + echo "Build started by version tag $tag. During the release process tags like this" + echo "are created by the 'release' Maven plugin. Nothing to do here." + exit 0 + elif [[ ! "$tag" =~ ^release-[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+$ ]]; then + echo "You must specify a tag of the format 'release-0.0.0' to release this project." + echo "The provided tag ${tag} doesn't match that. Aborting." + exit 1 + fi } is_release_commit() { - project_version=$(./mvnw help:evaluate -N -Dexpression=project.version|grep -v '\[') + project_version=$(./mvnw help:evaluate -N -Dexpression=project.version | grep -v '\[') if [[ "$project_version" =~ ^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+$ ]]; then echo "Build started by release commit $project_version. Will synchronize to maven central." return 0 @@ -68,7 +68,7 @@ is_release_commit() { } release_version() { - echo "${TRAVIS_TAG}" | sed 's/^release-//' + echo "${TRAVIS_TAG}" | sed 's/^release-//' } safe_checkout_master() { @@ -102,17 +102,16 @@ if is_pull_request; then # If we are on master, we will deploy the latest snapshot or release version # - If a release commit fails to deploy for a transient reason, delete the broken version from bintray and click rebuild elif is_travis_branch_master; then - ./mvnw --batch-mode -s ./.settings.xml -Prelease -nsu -DskipTests deploy - - # If the deployment succeeded, sync it to Maven Central. Note: this needs to be done once per project, not module, hence -N - if is_release_commit; then - ./mvnw --batch-mode -s ./.settings.xml -nsu -N io.zipkin.centralsync-maven-plugin:centralsync-maven-plugin:sync - fi - #true + #./mvnw --batch-mode -s ./.settings.xml -Prelease -nsu -DskipTests deploy + # + ## If the deployment succeeded, sync it to Maven Central. Note: this needs to be done once per project, not module, hence -N + #if is_release_commit; then + # ./mvnw --batch-mode -s ./.settings.xml -nsu -N io.zipkin.centralsync-maven-plugin:centralsync-maven-plugin:sync + #fi + true # If we are on a release tag, the following will update any version references and push a version tag for deployment. elif build_started_by_tag; then safe_checkout_master ./mvnw --batch-mode -s ./.settings.xml -Prelease -nsu -DreleaseVersion="$(release_version)" -Darguments="-DskipTests" release:prepare fi - From f11ac7835dc66fc909c104cd7749b19ab82f7104 Mon Sep 17 00:00:00 2001 From: rhu1 Date: Fri, 21 May 2021 11:34:17 +0100 Subject: [PATCH 538/539] Minor --- scribble-test/src/test/scrib/demo/highlow/HighLow.scr | 1 + 1 file changed, 1 insertion(+) diff --git a/scribble-test/src/test/scrib/demo/highlow/HighLow.scr b/scribble-test/src/test/scrib/demo/highlow/HighLow.scr index c9f9ced1d..3cab42cda 100644 --- a/scribble-test/src/test/scrib/demo/highlow/HighLow.scr +++ b/scribble-test/src/test/scrib/demo/highlow/HighLow.scr @@ -1,5 +1,6 @@ //$ bin/scribblec.sh scribble-test/src/test/scrib/demo/highlow/HighLow.scr -d scribble-test/src/test/scrib/demo -api HighLow A //$ bin/scribblec.sh scribble-test/src/test/scrib/demo/highlow/HighLow.scr -d scribble-test/src/test/scrib/demo -cbapi HighLow A +//$ javadoc -cp scribble-core/target/classes:scribble-runtime/target/classes:scribble-test/src/test/scrib/demo -subpackages highlow.HighLow.HighLow -d scribble-test/javadoc/highlow module highlow.HighLow; From ccb0e48d69c6e3088e746138099c3183ca1ac79b Mon Sep 17 00:00:00 2001 From: rhu1 Date: Fri, 21 May 2021 13:59:43 +0100 Subject: [PATCH 539/539] Fixed typos in highlow and Makefile --- .gitignore | 2 +- scribble-demos/scrib/Makefile.copyme | 25 +++++++++++++++++-- .../src/test/scrib/demo/highlow/HighLowB.java | 2 +- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index a40089b75..e24fe0bbb 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,7 @@ scribble-test/src/test/scrib/exercise/voting/EProtocol/ scribble-test/src/test/scrib/demo/fase17/travel/TravelAgent/ scribble-test/src/test/scrib/demo/fase17/travel2/TravelAgent2/ +scribble-test/src/test/scrib/demo/highlow/HighLow/ scribble-test/src/test/scrib/scratch/scratch1/ scribble-test/src/test/scrib/scratch/scratch2/ @@ -72,7 +73,6 @@ scribble-test/src/test/scrib/test/test6/Test6/ scribble-test/src/test/scrib/test/test7/Test7/ - bin/scribblec.sh permissions-fix.sh diff --git a/scribble-demos/scrib/Makefile.copyme b/scribble-demos/scrib/Makefile.copyme index bd8f8bbab..a2dd28a38 100644 --- a/scribble-demos/scrib/Makefile.copyme +++ b/scribble-demos/scrib/Makefile.copyme @@ -26,10 +26,10 @@ help: @echo " make clean-all" .PHONY: all -all: betty16 bettybook coco fase16 fib game http loan nego rpc smtp threebuyer travel tutorial twobuyer fase17 supplierinfo +all: betty16 bettybook coco fase16 fib game http loan nego rpc smtp threebuyer travel tutorial twobuyer fase17 supplierinfo highlow .PHONY: clean-all -clean-all: clean-betty16 clean-bettybook clean-coco clean-fase16 clean-fib clean-http clean-loan clean-smtp clean-travel clean-tutorial clean-fase17 +clean-all: clean-betty16 clean-bettybook clean-coco clean-fase16 clean-fib clean-http clean-loan clean-smtp clean-travel clean-tutorial clean-fase17 clean-highlow .PHONY: betty16 betty16: @@ -227,6 +227,21 @@ supplierinfo: @$(call scribc_ok,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoExplicit.scr,-fair) @$(call scribc_ok,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr) +.PHONY: highlow +highlow: + @$(call scribc_apigen3,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib/demo/,highlow/HighLow.scr,HighLow,A,B,C) + @$(call scribc_cbapigen3,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib/demo/,highlow/HighLow.scr,HighLow,A,B,C) + @$(call javac,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib/demo,highlow/HighLowA.java) + @$(call javac,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib/demo,highlow/HighLowB.java) + @$(call javac,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib/demo,highlow/HighLowC.java) + @$(call javac,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib/demo,highlow/cb/MyA.java) + @$(call javac,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib/demo,highlow/cb/MyB.java) + @$(call javac,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib/demo,highlow/cb/MyC.java) + +.PHONY: clean-highlow +clean-highlow: + @$(call rm_apigen,$(SCRIBBLE_HOME)/scribble-test/src/test/scrib/demo/,highlow/HighLow,HighLow) + # filename, extra define scribc_ok @@ -256,6 +271,12 @@ define scribc_apigen3 $(SCRIBBLEC) -d $(1) $(1)/$(2) -api $(3) $(4) -api $(3) $(5) -api $(3) $(6) endef +# dir, filename, proto, role1, role2, role3 +define scribc_cbapigen3 +echo "CB API gen: "$(1)"/"$(2)", "$(3)" @ "$(4)", "$(5)", "$(6); \ + $(SCRIBBLEC) -d $(1) $(1)/$(2) -cbapi $(3) $(4) -cbapi $(3) $(5) -cbapi $(3) $(6) +endef + # dir, filename, proto, role1, role2, role3, role4 define scribc_apigen4 echo "API gen: "$(1)"/"$(2)", "$(3)" @ "$(4)", "$(5)", "$(6)", "$(7); \ diff --git a/scribble-test/src/test/scrib/demo/highlow/HighLowB.java b/scribble-test/src/test/scrib/demo/highlow/HighLowB.java index bd464ec99..8580a6551 100644 --- a/scribble-test/src/test/scrib/demo/highlow/HighLowB.java +++ b/scribble-test/src/test/scrib/demo/highlow/HighLowB.java @@ -53,7 +53,7 @@ public void run() throws Exception { private EndSocket highLow(HighLow_B_1 b1) throws Exception { Buf s = new Buf<>(); Buf l = new Buf<>(); - return aux(b1.receive(A, start, s).receive(A, limit, l), s.val, l.val); + return aux(b1.receive(A, secret, s).receive(A, tries, l), s.val, l.val); } private EndSocket aux(HighLow_B_3 b3, int secret, int tries) throws Exception {